diff --git a/go.mod b/go.mod
index 9f2386da42..40282ab490 100644
--- a/go.mod
+++ b/go.mod
@@ -5,143 +5,123 @@ go 1.19
require (
github.com/blang/semver/v4 v4.0.0
github.com/go-bindata/go-bindata/v3 v3.1.3
- github.com/go-logr/logr v1.2.3
+ github.com/go-logr/logr v1.2.4
github.com/golang/mock v1.6.0
github.com/googleapis/gnostic v0.5.5
github.com/grpc-ecosystem/grpc-health-probe v0.4.11
github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37
- github.com/onsi/ginkgo/v2 v2.1.6
+ github.com/onsi/ginkgo/v2 v2.9.5
github.com/openshift/api v3.9.0+incompatible
- github.com/operator-framework/api v0.17.3
+ github.com/operator-framework/api v0.17.6
github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000
github.com/operator-framework/operator-registry v1.17.5
- github.com/sirupsen/logrus v1.8.1
- github.com/spf13/cobra v1.4.0
- github.com/stretchr/testify v1.8.0
+ github.com/sirupsen/logrus v1.9.2
+ github.com/spf13/cobra v1.7.0
+ github.com/stretchr/testify v1.8.3
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0
- google.golang.org/protobuf v1.28.0
+ google.golang.org/protobuf v1.30.0
gopkg.in/yaml.v2 v2.4.0
- helm.sh/helm/v3 v3.9.0
- k8s.io/api v0.25.3
- k8s.io/apimachinery v0.25.3
- k8s.io/client-go v0.25.3
- k8s.io/code-generator v0.25.3
- k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1
- k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
- sigs.k8s.io/controller-runtime v0.13.0
+ helm.sh/helm/v3 v3.11.1
+ k8s.io/api v0.27.2
+ k8s.io/apimachinery v0.27.2
+ k8s.io/client-go v0.27.2
+ k8s.io/code-generator v0.27.2
+ k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f
+ k8s.io/utils v0.0.0-20230209194617-a36077c30491
+ sigs.k8s.io/controller-runtime v0.15.0
sigs.k8s.io/controller-tools v0.8.0
)
replace google.golang.org/grpc => google.golang.org/grpc v1.40.0
-replace (
- go.opentelemetry.io/contrib => go.opentelemetry.io/contrib v0.20.0
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp => go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0
- go.opentelemetry.io/otel/exporters/otlp => go.opentelemetry.io/otel/exporters/otlp v0.20.0
- go.opentelemetry.io/otel/metric => go.opentelemetry.io/otel/metric v0.20.0
- go.opentelemetry.io/otel/oteltest => go.opentelemetry.io/otel/oteltest v0.20.0
- go.opentelemetry.io/otel/sdk/export/metric => go.opentelemetry.io/otel/sdk/export/metric v0.20.0
- go.opentelemetry.io/otel/sdk/metric => go.opentelemetry.io/otel/sdk/metric v0.20.0
- go.opentelemetry.io/otel/trace => go.opentelemetry.io/otel/trace v0.20.0
- go.opentelemetry.io/proto/otlp => go.opentelemetry.io/proto/otlp v0.7.0
-)
-
require (
- cloud.google.com/go v0.99.0 // indirect
- github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
- github.com/Azure/go-autorest v14.2.0+incompatible // indirect
- github.com/Azure/go-autorest/autorest v0.11.27 // indirect
- github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect
- github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
- github.com/Azure/go-autorest/logger v0.2.1 // indirect
- github.com/Azure/go-autorest/tracing v0.6.0 // indirect
- github.com/BurntSushi/toml v1.0.0 // indirect
- github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect
+ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
+ github.com/BurntSushi/toml v1.2.1 // indirect
+ github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
- github.com/Masterminds/semver/v3 v3.1.1 // indirect
- github.com/Masterminds/sprig/v3 v3.2.2 // indirect
- github.com/Masterminds/squirrel v1.5.2 // indirect
+ github.com/Masterminds/semver/v3 v3.2.0 // indirect
+ github.com/Masterminds/sprig/v3 v3.2.3 // indirect
+ github.com/Masterminds/squirrel v1.5.3 // indirect
github.com/Masterminds/vcs v1.13.3 // indirect
- github.com/Microsoft/go-winio v0.5.1 // indirect
- github.com/Microsoft/hcsshim v0.9.2 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
+ github.com/Microsoft/hcsshim v0.9.6 // indirect
github.com/NYTimes/gziphandler v1.1.1 // indirect
- github.com/PuerkitoBio/purell v1.1.1 // indirect
- github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/adrg/xdg v0.4.0 // indirect
- github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed // indirect
+ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/blang/semver v3.5.1+incompatible // indirect
- github.com/cespare/xxhash/v2 v2.1.2 // indirect
- github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
- github.com/containerd/cgroups v1.0.3 // indirect
- github.com/containerd/containerd v1.6.3 // indirect
- github.com/containerd/continuity v0.2.2 // indirect
+ github.com/cenkalti/backoff/v4 v4.2.0 // indirect
+ github.com/cespare/xxhash/v2 v2.2.0 // indirect
+ github.com/chai2010/gettext-go v1.0.2 // indirect
+ github.com/containerd/cgroups v1.0.4 // indirect
+ github.com/containerd/containerd v1.6.18 // indirect
+ github.com/containerd/continuity v0.3.0 // indirect
github.com/containerd/ttrpc v1.1.0 // indirect
github.com/coreos/go-semver v0.3.0 // indirect
- github.com/coreos/go-systemd/v22 v22.3.2 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
+ github.com/coreos/go-systemd/v22 v22.4.0 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/distribution/distribution v2.7.1+incompatible // indirect
- github.com/docker/cli v20.10.12+incompatible // indirect
- github.com/docker/distribution v2.8.1+incompatible // indirect
- github.com/docker/docker v20.10.14+incompatible // indirect
- github.com/docker/docker-credential-helpers v0.6.4 // indirect
+ github.com/docker/cli v20.10.21+incompatible // indirect
+ github.com/docker/distribution v2.8.2+incompatible // indirect
+ github.com/docker/docker v20.10.24+incompatible // indirect
+ github.com/docker/docker-credential-helpers v0.7.0 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
- github.com/docker/go-units v0.4.0 // indirect
- github.com/emicklei/go-restful/v3 v3.8.0 // indirect
- github.com/evanphx/json-patch v4.12.0+incompatible // indirect
+ github.com/docker/go-units v0.5.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+ github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/fatih/color v1.13.0 // indirect
- github.com/felixge/httpsnoop v1.0.1 // indirect
- github.com/fsnotify/fsnotify v1.5.4 // indirect
+ github.com/felixge/httpsnoop v1.0.3 // indirect
+ github.com/fsnotify/fsnotify v1.6.0 // indirect
+ github.com/fvbommel/sortorder v1.0.1 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-air/gini v1.0.4 // indirect
- github.com/go-errors/errors v1.0.1 // indirect
+ github.com/go-errors/errors v1.4.2 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.1.0 // indirect
github.com/go-git/go-git/v5 v5.3.0 // indirect
github.com/go-gorp/gorp/v3 v3.0.2 // indirect
- github.com/go-logr/zapr v1.2.3 // indirect
- github.com/go-openapi/jsonpointer v0.19.5 // indirect
- github.com/go-openapi/jsonreference v0.19.5 // indirect
- github.com/go-openapi/swag v0.19.14 // indirect
- github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-logr/zapr v1.2.4 // indirect
+ github.com/go-openapi/jsonpointer v0.19.6 // indirect
+ github.com/go-openapi/jsonreference v0.20.1 // indirect
+ github.com/go-openapi/swag v0.22.3 // indirect
+ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/gobuffalo/flect v0.2.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/goccy/go-yaml v1.8.1 // indirect
github.com/gofrs/flock v0.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang-jwt/jwt/v4 v4.2.0 // indirect
- github.com/golang-migrate/migrate/v4 v4.6.2 // indirect
+ github.com/golang-migrate/migrate/v4 v4.16.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/protobuf v1.5.2 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
github.com/google/btree v1.0.1 // indirect
- github.com/google/cel-go v0.12.5 // indirect
+ github.com/google/cel-go v0.15.3 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
- github.com/google/go-cmp v0.5.8 // indirect
+ github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
- github.com/google/uuid v1.2.0 // indirect
+ github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
github.com/h2non/filetype v1.1.1 // indirect
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect
- github.com/huandu/xstrings v1.3.2 // indirect
+ github.com/huandu/xstrings v1.3.3 // indirect
github.com/imdario/mergo v0.3.12 // indirect
- github.com/inconshreveable/mousetrap v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 // indirect
github.com/itchyny/gojq v0.11.0 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
- github.com/jmoiron/sqlx v1.3.4 // indirect
+ github.com/jmoiron/sqlx v1.3.5 // indirect
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -151,14 +131,14 @@ require (
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/lestrrat-go/strftime v1.0.1 // indirect
- github.com/lib/pq v1.10.4 // indirect
+ github.com/lib/pq v1.10.7 // indirect
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
- github.com/mailru/easyjson v0.7.6 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
- github.com/mattn/go-sqlite3 v1.14.10 // indirect
- github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+ github.com/mattn/go-sqlite3 v1.14.16 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/hashstructure v1.0.0 // indirect
@@ -167,27 +147,26 @@ require (
github.com/moby/locker v1.0.1 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/moby/sys/mountinfo v0.5.0 // indirect
- github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
+ github.com/moby/term v0.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/onsi/gomega v1.20.1 // indirect
+ github.com/onsi/gomega v1.27.7 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
+ github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a // indirect
github.com/otiai10/copy v1.2.0 // indirect
github.com/pbnjay/strptime v0.0.0-20140226051138-5c05b0d668c9 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/client_golang v1.12.2 // indirect
- github.com/prometheus/client_model v0.2.0 // indirect
- github.com/prometheus/common v0.32.1 // indirect
- github.com/prometheus/procfs v0.7.3 // indirect
- github.com/rubenv/sql-migrate v1.1.1 // indirect
- github.com/russross/blackfriday v1.5.2 // indirect
+ github.com/prometheus/client_golang v1.15.1 // indirect
+ github.com/prometheus/client_model v0.4.0 // indirect
+ github.com/prometheus/common v0.42.0 // indirect
+ github.com/prometheus/procfs v0.9.0 // indirect
+ github.com/rubenv/sql-migrate v1.2.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
github.com/spf13/cast v1.4.1 // indirect
@@ -197,64 +176,65 @@ require (
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
- github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
+ github.com/xlab/treeprint v1.1.0 // indirect
github.com/zeebo/errs v1.3.0 // indirect
go.etcd.io/bbolt v1.3.6 // indirect
- go.etcd.io/etcd/api/v3 v3.5.4 // indirect
- go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect
- go.etcd.io/etcd/client/v3 v3.5.4 // indirect
- go.opencensus.io v0.23.0 // indirect
- go.opentelemetry.io/contrib v1.3.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 // indirect
- go.opentelemetry.io/otel v1.3.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp v0.20.0 // indirect
- go.opentelemetry.io/otel/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk v1.3.0 // indirect
- go.opentelemetry.io/otel/sdk/export/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/trace v1.3.0 // indirect
- go.opentelemetry.io/proto/otlp v0.12.0 // indirect
+ go.etcd.io/etcd/api/v3 v3.5.7 // indirect
+ go.etcd.io/etcd/client/pkg/v3 v3.5.7 // indirect
+ go.etcd.io/etcd/client/v3 v3.5.7 // indirect
+ go.opencensus.io v0.24.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect
+ go.opentelemetry.io/otel v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0 // indirect
+ go.opentelemetry.io/otel/metric v0.31.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.12.0 // indirect
+ go.opentelemetry.io/otel/trace v1.12.0 // indirect
+ go.opentelemetry.io/proto/otlp v0.19.0 // indirect
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
- go.uber.org/zap v1.21.0 // indirect
- golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect
+ go.uber.org/zap v1.24.0 // indirect
+ golang.org/x/crypto v0.7.0 // indirect
+ golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
- golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
- golang.org/x/net v0.4.0 // indirect
- golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
- golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
- golang.org/x/sys v0.3.0 // indirect
- golang.org/x/term v0.3.0 // indirect
- golang.org/x/text v0.5.0 // indirect
- golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
- golang.org/x/tools v0.1.12 // indirect
- golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
- gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
+ golang.org/x/mod v0.10.0 // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/oauth2 v0.5.0 // indirect
+ golang.org/x/sync v0.2.0 // indirect
+ golang.org/x/sys v0.8.0 // indirect
+ golang.org/x/term v0.8.0 // indirect
+ golang.org/x/text v0.9.0 // indirect
+ golang.org/x/time v0.3.0 // indirect
+ golang.org/x/tools v0.9.1 // indirect
+ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
+ gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect
- google.golang.org/grpc v1.47.0 // indirect
+ google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6 // indirect
+ google.golang.org/grpc v1.54.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/apiextensions-apiserver v0.25.3 // indirect
- k8s.io/apiserver v0.25.3 // indirect
- k8s.io/cli-runtime v0.24.0 // indirect
- k8s.io/component-base v0.25.3 // indirect
- k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect
+ k8s.io/apiextensions-apiserver v0.27.2 // indirect
+ k8s.io/apiserver v0.27.2 // indirect
+ k8s.io/cli-runtime v0.27.1 // indirect
+ k8s.io/component-base v0.27.2 // indirect
+ k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect
k8s.io/klog v1.0.0 // indirect
- k8s.io/klog/v2 v2.80.1 // indirect
+ k8s.io/klog/v2 v2.90.1 // indirect
+ k8s.io/kms v0.27.2 // indirect
k8s.io/kube-aggregator v0.25.3 // indirect
- k8s.io/kubectl v0.24.0 // indirect
- oras.land/oras-go v1.1.0 // indirect
- sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33 // indirect
- sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
- sigs.k8s.io/kustomize/api v0.11.4 // indirect
- sigs.k8s.io/kustomize/kyaml v0.13.6 // indirect
+ k8s.io/kubectl v0.27.1 // indirect
+ oras.land/oras-go v1.2.2 // indirect
+ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 // indirect
+ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+ sigs.k8s.io/kustomize/api v0.13.2 // indirect
+ sigs.k8s.io/kustomize/kyaml v0.14.1 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
@@ -263,9 +243,6 @@ replace (
// latest tag resolves to a very old version. this is only used for spinning up local test registries
github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d
- // pin to ginkgo v1 version of gomega (v1.18+ relies on ginkgo v2)
- github.com/onsi/gomega => github.com/onsi/gomega v1.17.0
-
// controller runtime
github.com/openshift/api => github.com/openshift/api v0.0.0-20210517065120-b325f58df679
github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 // release-4.5
@@ -275,9 +252,6 @@ replace (
github.com/operator-framework/operator-lifecycle-manager => ./staging/operator-lifecycle-manager
github.com/operator-framework/operator-registry => ./staging/operator-registry
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc => go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0
- go.opentelemetry.io/otel => go.opentelemetry.io/otel v0.20.0
- go.opentelemetry.io/otel/sdk => go.opentelemetry.io/otel/sdk v0.20.0
// this should be removeable once https://issues.redhat.com/browse/CLOUDBLD-11068 is resolved
k8s.io/pod-security-admission => k8s.io/pod-security-admission v0.25.0
diff --git a/go.sum b/go.sum
index 335654b5f6..0e81ee8b3e 100644
--- a/go.sum
+++ b/go.sum
@@ -1,7 +1,5 @@
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
-bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
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=
@@ -20,21 +18,15 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
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 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
+cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys=
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/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ=
+cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
@@ -50,57 +42,43 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
-github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
-github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=
-github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
-github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
-github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg=
-github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
-github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
-github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
-github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
-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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
-github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
-github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
-github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
+github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
+github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
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.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
-github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
-github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE=
-github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
+github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=
+github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
+github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI=
+github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
+github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
+github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc=
+github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
github.com/Masterminds/vcs v1.13.3 h1:IIA2aBdXvfbIM+yl/eTnL4hb1XwdpvuQLglAix1gweE=
github.com/Masterminds/vcs v1.13.3/go.mod h1:TiE7xuEjl1N4j016moRd6vezp6e6Lz23gypeXfzXeW8=
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
@@ -111,8 +89,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
-github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
-github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
+github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
+github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
@@ -121,25 +99,20 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
-github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY=
-github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
+github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY=
+github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
-github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
@@ -147,13 +120,11 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
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/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
+github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
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=
@@ -164,8 +135,6 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0S6Vi7/lbWECcX0j45yZReDZ56BQsrVBOEEY=
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
-github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -174,12 +143,10 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
-github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
@@ -193,13 +160,15 @@ github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0Bsq
github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA=
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
+github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
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/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8=
-github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
+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/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
+github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -212,8 +181,6 @@ github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJ
github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
@@ -229,14 +196,13 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S
github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
-github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
-github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
+github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
+github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
-github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
@@ -251,8 +217,8 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
-github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg=
-github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig=
+github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns=
+github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
@@ -260,8 +226,8 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE
github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y=
github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ=
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
-github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA=
-github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk=
+github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
+github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
@@ -321,64 +287,48 @@ github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
-github.com/coreos/go-systemd/v22 v22.3.2 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.4.0 h1:y9YHcjnjynCd/DVbg5j9L/33jQM3MxJlbj/zWskzfGU=
+github.com/coreos/go-systemd/v22 v22.4.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
-github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
-github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
-github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
-github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg=
-github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
-github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4=
-github.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A=
-github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
-github.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE=
-github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
-github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
-github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8=
github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
-github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=
-github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU=
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
github.com/distribution/distribution v2.7.1+incompatible h1:aGFx4EvJWKEh//lHPLwFhFgwFHKH06TzNVPamrMn04M=
github.com/distribution/distribution v2.7.1+incompatible/go.mod h1:EgLm2NgWtdKgzF9NpMzUKgzmR7AMmb0VQi2B+ZzDRjc=
-github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY=
+github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc=
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
-github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA=
-github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU=
+github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v0.0.0-20191216044856-a8371794149d h1:jC8tT/S0OGx2cswpeUTn4gOIea8P08lD3VFQT0cOZ50=
github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
-github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/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 v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w=
-github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
+github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
-github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o=
-github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c=
+github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A=
+github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
@@ -387,9 +337,9 @@ github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6Uezg
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
-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/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
@@ -397,53 +347,42 @@ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3
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/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 v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
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.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw=
-github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-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.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
-github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
+github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d h1:105gxyaGwCFad8crR9dcMQWvV9Hvulu6hwUh4tWPJnM=
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU=
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw=
-github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
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.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-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.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
+github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
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 h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c=
-github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
-github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
-github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
+github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE=
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
-github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -452,8 +391,8 @@ github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s=
github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs=
github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI=
github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I=
-github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
-github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
+github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
+github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
@@ -470,7 +409,6 @@ github.com/go-gorp/gorp/v3 v3.0.2/go.mod h1:BJ3q1ejpV8cVALtcXvXaXyTOlMmJhWDxTmnc
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
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=
@@ -479,37 +417,39 @@ github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTg
github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.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/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
-github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=
-github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+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 v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo=
+github.com/go-logr/zapr v1.2.4/go.mod h1:FyHWQIzQORZ0QVE1BtVHv3cKtNLuXsbNLtpuhNapBOA=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
-github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
-github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
-github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
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-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
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-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/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY=
github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
github.com/gobuffalo/logger v1.0.6 h1:nnZNpxYo0zx+Aj9RfMPBm+x9zAU2OayFh/xrAWi34HU=
@@ -522,7 +462,6 @@ 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/goccy/go-yaml v1.8.1 h1:JuZRFlqLM5cWF6A+waL8AKVuCcqvKOuhJtUQI+L3ez0=
github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y=
-github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
@@ -535,20 +474,19 @@ github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6
github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
-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-migrate/migrate/v4 v4.6.2 h1:LDDOHo/q1W5UDj6PbkxdCv7lv9yunyZHXvxuwDkGo3k=
-github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0=
+github.com/golang-jwt/jwt/v4 v4.4.2 h1:rcc4lwaZgFMCZ5jxF9ABolDcIHdBytAFgqFPbSJQAYs=
+github.com/golang-migrate/migrate/v4 v4.16.1 h1:O+0C55RbMN66pWm5MjO6mw0px6usGpY0+bkSGW9zCo0=
+github.com/golang-migrate/migrate/v4 v4.16.1/go.mod h1:qXiwa/3Zeqaltm1MxOCZDYysW/F6folYiBgBG03l9hc=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -582,20 +520,16 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
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/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-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=
-github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
+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/gomodule/redigo v1.8.2 h1:H5XSIre1MB5NbPYFp+i1NBbb5qN1W8Y8YAQoAYbkm8k=
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 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8=
-github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw=
+github.com/google/cel-go v0.15.3 h1:W1wIeGuEs81+lBVU+cQRg1hkRT58Q6bNxvM5yn008S8=
+github.com/google/cel-go v0.15.3/go.mod h1:YzWEoI07MC/a/wj9in8GeVatqfypkldgBlwXh9bCwqY=
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -610,11 +544,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.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-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
@@ -622,7 +554,6 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
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/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=
@@ -634,8 +565,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/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 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
@@ -644,25 +573,20 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3
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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
github.com/google/uuid v1.2.0/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/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/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.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
-github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
@@ -684,22 +608,25 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-health-probe v0.4.11 h1:eKVQDIIJhRkfJHjQzTmu+RangfB8/MyrthCCnsvne/s=
github.com/grpc-ecosystem/grpc-health-probe v0.4.11/go.mod h1:Ew6du240dK067iM38yVbni1pLpWUFnuyc0PefrB81Uc=
github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4=
github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc=
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE=
-github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
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/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
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=
@@ -708,6 +635,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
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/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=
@@ -716,8 +644,9 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
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 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
+github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
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.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
@@ -726,16 +655,15 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/inconshreveable/mousetrap v1.0.0 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/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 h1:3gyXljUyTWWTv/NMFPvwgxJSdE9Mamg2r3x8HMBl+Uo=
github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645/go.mod h1:296z3W7Xsrp2mlIY88ruDKscuvrkL6zXCNRtaYVshzw=
github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA=
github.com/itchyny/gojq v0.11.0 h1:z7HnaKZ6erVzxPo3BkhJBG7jHmzKdAW8Hcse5N6YAic=
github.com/itchyny/gojq v0.11.0/go.mod h1:my6D2qN2Sm6qa+/5GsPDUZlCWGR+U8Qsa9he76sudv0=
github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
-github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4=
@@ -744,18 +672,15 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
-github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
+github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
+github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
-github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-github.com/jpillora/backoff v1.0.0/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=
@@ -767,9 +692,7 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
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/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
-github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/karrick/godirwalk v1.16.1 h1:DynhcF+bztK8gooS0+NDJFrdNZjJ3gzVzC545UNA9iw=
github.com/karrick/godirwalk v1.16.1/go.mod h1:j4mkqPuvaLI8mp1DroR3P6ad7cyYd4c1qeJ3RV7ULlk=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
@@ -790,14 +713,13 @@ 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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=
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/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
@@ -809,23 +731,21 @@ github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2t
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
github.com/lestrrat-go/strftime v1.0.1 h1:o7qz5pmLzPDLyGW4lG6JvTKPUfTFXwe+vOamIYWtnVU=
github.com/lestrrat-go/strftime v1.0.1/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
-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=
github.com/lib/pq v1.10.0/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.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
-github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
-github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/markbates/errx v1.1.0 h1:QDFeR+UP95dO12JgW+tgi2UVfo0V8YBHiUIOaeBPiEI=
github.com/markbates/errx v1.1.0/go.mod h1:PLa46Oex9KNbVDZhKel8v1OT7hD5JZ2eI7AHhA0wswc=
github.com/markbates/oncer v1.0.0 h1:E83IaVAHygyndzPimgUYJjbshhDTALZyXxvk9FOlQRY=
@@ -850,20 +770,20 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.11.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.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk=
-github.com/mattn/go-sqlite3 v1.14.10/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 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
+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 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
+github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1 h1:hZD/8vBuw7x1WqRXD/WGjVjipbbo/HcDBgySYYbrUSk=
github.com/maxbrunsfeld/counterfeiter/v6 v6.4.1/go.mod h1:DK1Cjkc0E49ShgRVs5jy5ASrM15svSnem3K/hiSGD8o=
@@ -873,7 +793,7 @@ github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2Bm
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE=
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
+github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
@@ -904,8 +824,8 @@ github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
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=
@@ -915,7 +835,6 @@ 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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0=
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
-github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
@@ -923,34 +842,36 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m
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=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-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=
github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
-github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
-github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=
-github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
-github.com/onsi/gomega v1.17.0 h1:9Luw4uT5HTjHTN8+aNcSThgH1vdXnmdJ8xIfZ4wyTRE=
-github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
+github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
+github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
+github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
+github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
+github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg=
+github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
+github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4=
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -959,8 +880,8 @@ github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
-github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
+github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ=
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
@@ -983,7 +904,6 @@ github.com/openshift/api v0.0.0-20210517065120-b325f58df679/go.mod h1:dZ4kytOo3s
github.com/openshift/build-machinery-go v0.0.0-20210209125900-0da259a2c359/go.mod h1:b1BuldmJlbA/xYtdZvKi+7j5YGB44qJUJDZ9zwiNCfE=
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 h1:kMiuiZXH1GdfbiMwsuAQOqGaMxlo9NCUk0wT4XAdfNM=
github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0/go.mod h1:uUQ4LClRO+fg5MF/P6QxjMCb1C9f7Oh4RKepftDnEJE=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
@@ -999,8 +919,7 @@ github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrap
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
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-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -1016,36 +935,29 @@ github.com/poy/onpar v0.0.0-20190519213022-ee068f8ea4d1/go.mod h1:nSbFQvMj97ZyhF
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_golang v1.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.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
+github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
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.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-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-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.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
@@ -1055,18 +967,16 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
-github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
+github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
-github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY=
-github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ=
-github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rubenv/sql-migrate v1.2.0 h1:fOXMPLMd41sK7Tg75SXDec15k3zg5WNV6SjuDRiNfcU=
+github.com/rubenv/sql-migrate v1.2.0/go.mod h1:Z5uVnq7vrIrPmHbVFfR4YLHRZquxeHpckCnRq0P/K9Y=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -1080,7 +990,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg
github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
@@ -1091,8 +1000,9 @@ 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/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.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
@@ -1101,7 +1011,6 @@ github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -1111,8 +1020,8 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
-github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
-github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
+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/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=
@@ -1132,8 +1041,9 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 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/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -1143,8 +1053,10 @@ 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.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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -1152,11 +1064,9 @@ github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG
github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto=
github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ=
-github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
-github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
@@ -1170,10 +1080,7 @@ github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17
github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
-github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
-github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c=
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
@@ -1183,8 +1090,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI=
-github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
+github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=
+github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1192,7 +1099,7 @@ 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.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/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U=
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
@@ -1204,7 +1111,6 @@ github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
-gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
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=
@@ -1213,71 +1119,64 @@ go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/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.7 h1:sbcmosSVesNrWOJ58ZQFitHMdncusIifYcrBfwrlJSY=
+go.etcd.io/etcd/api/v3 v3.5.7/go.mod h1:9qew1gCdDDLu+VwmeG+iFpL+QlpHTo7iubavdVDgCAA=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/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.7 h1:y3kf5Gbp4e4q7egZdn5T7W9TSHUvkClN6u+Rq9mEOmg=
+go.etcd.io/etcd/client/pkg/v3 v3.5.7/go.mod h1:o0Abi1MK86iad3YrWhgUsbGx1pmTS+hrORWc2CamuhY=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao=
-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/pkg/v3 v3.5.4 h1:V5Dvl7S39ZDwjkKqJG2BfXgxZ3QREqqKifWQgIw5IM0=
-go.etcd.io/etcd/raft/v3 v3.5.4 h1:YGrnAgRfgXloBNuqa+oBI/aRZMcK/1GS6trJePJ/Gqc=
-go.etcd.io/etcd/server/v3 v3.5.4 h1:CMAZd0g8Bn5NRhynW6pKhc4FRg41/0QYy3d7aNm9874=
-go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+go.etcd.io/etcd/client/v2 v2.305.7 h1:AELPkjNR3/igjbO7CjyF1fPuVPjrblliiKj+Y6xSGOU=
+go.etcd.io/etcd/client/v3 v3.5.7 h1:u/OhpiuCgYY8awOHlhIhmGIGpxfBU/GZBUP3m/3/Iz4=
+go.etcd.io/etcd/client/v3 v3.5.7/go.mod h1:sOWmj9DZUMyAngS7QQwCyAXXAL6WhgTOPLNS/NabQgw=
+go.etcd.io/etcd/pkg/v3 v3.5.7 h1:obOzeVwerFwZ9trMWapU/VjDcYUJb5OfgC1zqEGWO/0=
+go.etcd.io/etcd/raft/v3 v3.5.7 h1:aN79qxLmV3SvIq84aNTliYGmjwsW6NqJSnqmI1HLJKc=
+go.etcd.io/etcd/server/v3 v3.5.7 h1:BTBD8IJUV7YFgsczZMHhMTS67XuA4KpRquL0MFOJGRk=
go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
go.opencensus.io v0.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 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
-go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
-go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
-go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
-go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8=
-go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw=
-go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
-go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8=
-go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g=
-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 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8=
-go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
-go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw=
-go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
-go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 h1:sxoY9kG1s1WpSYNyzm24rlwH4lnRYFXUVVBmKMBfRgw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
+go.opentelemetry.io/otel v1.12.0 h1:IgfC7kqQrRccIKuB7Cl+SRUmsKbEwSGPr0Eu+/ht1SQ=
+go.opentelemetry.io/otel v1.12.0/go.mod h1:geaoz0L0r1BEOR81k7/n9W4TCXYCJ7bPO7K374jQHG0=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 h1:UfDENi+LTcLjQ/JhaXimjlIgn7wWjwbEMmdREm2Gyng=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 h1:ZVqtSAxrR4+ofzayuww0/EKamCjjnwnXTMRZzMudJoU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0/go.mod h1:IlaGLENJkAl9+Xoo3J0unkdOwtL+rmqZ3ryMjUtYA94=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0 h1:+tsVdWosoqDfX6cdHAeacZozjQS94ySBd+aUXFwnNKA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0/go.mod h1:jSqjV+Knu1Jyvh+l3fx7V210Ev3HHgNQAi8YqpXaQP8=
+go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
+go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
+go.opentelemetry.io/otel/sdk v1.12.0 h1:8npliVYV7qc0t1FKdpU08eMnOjgPFMnriPhn0HH4q3o=
+go.opentelemetry.io/otel/sdk v1.12.0/go.mod h1:WYcvtgquYvgODEvxOry5owO2y9MyciW7JqMz6cpXShE=
+go.opentelemetry.io/otel/trace v1.12.0 h1:p28in++7Kd0r2d8gSt931O57fdjUyWxkVbESuILAeUc=
+go.opentelemetry.io/otel/trace v1.12.0/go.mod h1:pHlgBynn6s25qJ2szD+Bv+iwKJttjHSI3lUAyf0GNuQ=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
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.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
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.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1286,7 +1185,6 @@ golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnf
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
@@ -1301,10 +1199,9 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/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-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-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM=
-golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
+golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1315,6 +1212,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
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-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo=
+golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
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/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@@ -1341,24 +1240,21 @@ 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.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.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
+golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181108082009-03003ca0c849/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=
-golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
@@ -1385,9 +1281,11 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@@ -1397,19 +1295,13 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
-golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/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=
@@ -1420,13 +1312,9 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ
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-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-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-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-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.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
+golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
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=
@@ -1438,8 +1326,9 @@ 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-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1447,15 +1336,12 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
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-20190102155601-82a175fd1598/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190209173611-3b5209105503/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1500,12 +1386,10 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1521,7 +1405,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
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=
@@ -1535,30 +1418,25 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-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-20210809222454-d867a43fc93e/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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/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/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/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-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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/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/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.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
+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/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=
@@ -1569,17 +1447,17 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
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-20200630173020-3af7569d3a1e/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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1590,7 +1468,6 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3
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-20190425222832-ad9eeb80039a/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=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -1603,7 +1480,6 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/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-20190920225731-5eefd052ad72/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-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1638,29 +1514,25 @@ golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4X
golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-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.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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/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.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=
-gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc=
+gomodules.xyz/jsonpatch/v2 v2.3.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/api v0.3.2/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=
@@ -1683,16 +1555,6 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
-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.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
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=
@@ -1703,7 +1565,6 @@ google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1748,27 +1609,10 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D
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-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-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-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6 h1:62QuyPXKEkZpjZesyj5K5jABl6MnSnWl+vNuT5oz90E=
+google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE=
@@ -1787,8 +1631,8 @@ 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1801,6 +1645,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
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/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
@@ -1843,8 +1688,8 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
-helm.sh/helm/v3 v3.9.0 h1:qDSWViuF6SzZX5s5AB/NVRGWmdao7T5j4S4ebIkMGag=
-helm.sh/helm/v3 v3.9.0/go.mod h1:fzZfyslcPAWwSdkXrXlpKexFeE2Dei8N27FFQWt+PN0=
+helm.sh/helm/v3 v3.11.1 h1:cmL9fFohOoNQf+wnp2Wa0OhNFH0KFnSzEkVxi3fcc3I=
+helm.sh/helm/v3 v3.11.1/go.mod h1:z/Bu/BylToGno/6dtNGuSmjRqxKq5gaH+FU0BPO+AQ8=
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=
@@ -1857,46 +1702,40 @@ k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y=
-k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
-k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ=
-k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI=
-k8s.io/apiextensions-apiserver v0.25.3 h1:bfI4KS31w2f9WM1KLGwnwuVlW3RSRPuIsfNF/3HzR0k=
-k8s.io/apiextensions-apiserver v0.25.3/go.mod h1:ZJqwpCkxIx9itilmZek7JgfUAM0dnTsA48I4krPqRmo=
+k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo=
+k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4=
+k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo=
+k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ=
k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY=
-k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
-k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc=
-k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=
+k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg=
+k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
-k8s.io/apiserver v0.25.3 h1:m7+xGuG5+KYAnEsqaFtDyWMkmMMEOFYlu+NlWv5qSBI=
-k8s.io/apiserver v0.25.3/go.mod h1:9bT47iM2fzRuhICJpM/RcQR9sqDDfZ7Yw60h0p3JW08=
-k8s.io/cli-runtime v0.24.0 h1:ot3Qf49T852uEyNApABO1UHHpFIckKK/NqpheZYN2gM=
-k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A=
+k8s.io/apiserver v0.27.2 h1:p+tjwrcQEZDrEorCZV2/qE8osGTINPuS5ZNqWAvKm5E=
+k8s.io/apiserver v0.27.2/go.mod h1:EsOf39d75rMivgvvwjJ3OW/u9n1/BmUMK5otEOJrb1Y=
+k8s.io/cli-runtime v0.27.1 h1:MMzp5Q/Xmr5L1Lrowuc+Y/r95XINC6c6/fE3aN7JDRM=
+k8s.io/cli-runtime v0.27.1/go.mod h1:tEbTB1XP/nTH3wujsi52bw91gWpErtWiS15R6CwYsAI=
k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8=
k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
-k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
-k8s.io/client-go v0.25.3 h1:oB4Dyl8d6UbfDHD8Bv8evKylzs3BXzzufLiO27xuPs0=
-k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA=
+k8s.io/client-go v0.27.2 h1:vDLSeuYvCHKeoQRhCXjxXO45nHVv2Ip4Fe0MfioMrhE=
+k8s.io/client-go v0.27.2/go.mod h1:tY0gVmUsHrAmjzHX9zs7eCjxcBsf8IiNe7KQ52biTcQ=
k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q=
-k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
-k8s.io/code-generator v0.25.3 h1:BEH+wDi90bGyrYcY4abGtUqaOX7G94RRrEu8l+SvIeo=
-k8s.io/code-generator v0.25.3/go.mod h1:9F5fuVZOMWRme7MYj2YT3L9ropPWPokd9VRhVyD3+0w=
+k8s.io/code-generator v0.27.2 h1:RmK0CnU5qRaK6WRtSyWNODmfTZNoJbrizpVcsgbtrvI=
+k8s.io/code-generator v0.27.2/go.mod h1:DPung1sI5vBgn4AGKtlPRQAyagj/ir/4jI55ipZHVww=
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
-k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=
-k8s.io/component-base v0.25.3 h1:UrsxciGdrCY03ULT1h/S/gXFCOPnLhUVwSyx+hM/zq4=
-k8s.io/component-base v0.25.3/go.mod h1:WYoS8L+IlTZgU7rhAl5Ctpw0WdMxDfCC5dkxcEFa/TI=
-k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c=
+k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo=
+k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo=
k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
@@ -1907,9 +1746,8 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8
k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI=
-k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08=
+k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
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 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
@@ -1918,58 +1756,50 @@ k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec=
-k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
-k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
-k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kms v0.27.2 h1:wCdmPCa3kubcVd3AssOeaVjLQSu45k5g/vruJ3iqwDU=
+k8s.io/kms v0.27.2/go.mod h1:dahSqjI05J55Fo5qipzvHSRbm20d7llrSeQjjl86A7c=
k8s.io/kube-aggregator v0.25.3 h1:eOG9S4GPICAXWIFeQDHjnhqYaYPpgLIC1NunJu9pZCs=
k8s.io/kube-aggregator v0.25.3/go.mod h1:w87nqmzJMf7S73FRYcnexqfYW0AFiLJiCkvVCwM3feE=
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
-k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
-k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
-k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
-k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo=
-k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0=
+k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=
+k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
+k8s.io/kubectl v0.27.1 h1:9T5c5KdpburYiW8XKQSH0Uly1kMNE90aGSnbYUZNdcA=
+k8s.io/kubectl v0.27.1/go.mod h1:QsAkSmrRsKTPlAFzF8kODGDl4p35BIwQnc9XFhkcsy8=
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
-k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI=
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20210802155522-efc7438f0176/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-20220823124924-e9cbc92d1a73 h1:H9TCJUUx+2VA0ZiD9lvtaX8fthFsMoD+Izn93E/hm8U=
-k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg=
-oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+oras.land/oras-go v1.2.2 h1:0E9tOHUfrNH7TCDk5KU0jVBEzCqbfdyuVfGmJ7ZeRPE=
+oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33 h1:LYqFq+6Cj2D0gFfrJvL7iElD4ET6ir3VDdhDdTK7rgc=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33/go.mod h1:soWkSNf2tZC7aMibXEqVhCd73GOY5fJikn8qbdzemB0=
-sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ=
-sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0=
+sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU=
+sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk=
sigs.k8s.io/controller-tools v0.8.0 h1:uUkfTGEwrguqYYfcI2RRGUnC8mYdCFDqfwPKUcNJh1o=
sigs.k8s.io/controller-tools v0.8.0/go.mod h1:qE2DXhVOiEq5ijmINcFbqi9GZrrUjzB1TuJU0xa6eoY=
-sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
-sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
-sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
-sigs.k8s.io/kustomize/api v0.11.4 h1:/0Mr3kfBBNcNPOW5Qwk/3eb8zkswCwnqQxxKtmrTkRo=
-sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=
-sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=
-sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=
-sigs.k8s.io/kustomize/kyaml v0.13.6 h1:eF+wsn4J7GOAXlvajv6OknSunxpcOBQQqsnPxObtkGs=
-sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=
+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/kustomize/api v0.13.2 h1:kejWfLeJhUsTGioDoFNJET5LQe/ajzXhJGYoU+pJsiA=
+sigs.k8s.io/kustomize/api v0.13.2/go.mod h1:DUp325VVMFVcQSq+ZxyDisA8wtldwHxLZbr1g94UHsw=
+sigs.k8s.io/kustomize/kyaml v0.14.1 h1:c8iibius7l24G2wVAGZn/Va2wNys03GXLjYVIcFVxKA=
+sigs.k8s.io/kustomize/kyaml v0.14.1/go.mod h1:AN1/IpawKilWD7V+YvQwRGUvuUOOWpjsHu6uHwonSF4=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml
index ee5d2eee3d..37d2d38a53 100644
--- a/manifests/0000_50_olm_00-catalogsources.crd.yaml
+++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml
@@ -73,6 +73,467 @@ spec:
description: GrpcPodConfig exposes different overrides for the pod spec of the CatalogSource Pod. Only used when SourceType = SourceTypeGrpc and Image is set.
type: object
properties:
+ affinity:
+ description: Affinity is the catalog source's pod's affinity.
+ type: object
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for the pod.
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
+ type: object
+ required:
+ - preference
+ - weight
+ properties:
+ preference:
+ description: A node selector term, associated with the corresponding weight.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ weight:
+ description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
+ type: object
+ required:
+ - nodeSelectorTerms
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms. The terms are ORed.
+ type: array
+ items:
+ description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
nodeSelector:
description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node.
type: object
@@ -129,6 +590,9 @@ spec:
type: integer
publisher:
type: string
+ runAsRoot:
+ description: RunAsRoot allows admins to indicate that they wish to run the CatalogSource pod in a privileged pod as root. This should only be enabled when running older catalog images which could not be run as non-root.
+ type: boolean
secrets:
description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry.
type: array
diff --git a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml
index dd46e2b939..078947711d 100644
--- a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml
+++ b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml
@@ -121,7 +121,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -129,10 +129,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -231,7 +234,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -239,10 +242,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -345,7 +351,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -353,10 +359,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -447,7 +456,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -455,10 +464,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -507,10 +519,13 @@ spec:
version:
type: string
description:
+ description: Description of the operator. Can include the features, limitations or use-cases of the operator.
type: string
displayName:
+ description: The name of the operator in display format.
type: string
icon:
+ description: The icon for this operator.
type: array
items:
type: object
@@ -674,7 +689,7 @@ spec:
description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.
type: string
template:
- description: Template describes the pods that will be created.
+ description: Template describes the pods that will be created. The only allowed template.spec.restartPolicy value is "Always".
type: object
properties:
metadata:
@@ -1327,7 +1342,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1392,7 +1407,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1442,7 +1457,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1474,7 +1489,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1578,7 +1593,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1610,7 +1625,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1662,10 +1677,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -1676,7 +1723,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -1789,7 +1836,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1821,7 +1868,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2139,7 +2186,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2204,7 +2251,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2254,7 +2301,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2286,7 +2333,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2390,7 +2437,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2422,7 +2469,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2474,10 +2521,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -2488,7 +2567,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -2601,7 +2680,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2633,7 +2712,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2962,7 +3041,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3027,7 +3106,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3077,7 +3156,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3109,7 +3188,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3213,7 +3292,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3245,7 +3324,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3297,10 +3376,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -3311,7 +3422,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -3424,7 +3535,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3456,7 +3567,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3619,8 +3730,33 @@ spec:
conditionType:
description: ConditionType refers to a condition in the pod's condition list with matching type.
type: string
+ resourceClaims:
+ description: "ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: PodResourceClaim references exactly one ResourceClaim through a ClaimSource. It adds a name to it that uniquely identifies the ResourceClaim inside the Pod. Containers that need access to the ResourceClaim reference it with this name.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name uniquely identifies this resource claim inside the pod. This must be a DNS_LABEL.
+ type: string
+ source:
+ description: Source describes where to find the ResourceClaim.
+ type: object
+ properties:
+ resourceClaimName:
+ description: ResourceClaimName is the name of a ResourceClaim object in the same namespace as this pod.
+ type: string
+ resourceClaimTemplateName:
+ description: "ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. \n The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long). \n An existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed. \n This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim."
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
restartPolicy:
- description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy'
+ description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy'
type: string
runtimeClassName:
description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class'
@@ -3628,6 +3764,21 @@ spec:
schedulerName:
description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.
type: string
+ schedulingGates:
+ description: "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod. \n SchedulingGates can only be set at pod creation time, and be removed only afterwards. \n This is a beta feature enabled by the PodSchedulingReadiness feature gate."
+ type: array
+ items:
+ description: PodSchedulingGate is associated to a Pod to guard its scheduling.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name of the scheduling gate. Each scheduling gate must have a unique name field.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
securityContext:
description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.'
type: object
@@ -3679,7 +3830,7 @@ spec:
description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied."
type: string
supplementalGroups:
- description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. Note that this field cannot be set when spec.os.name is windows.
+ description: A list of groups applied to the first process run in each container, in addition to the container's primary GID, the fsGroup (if specified), and group memberships defined in the container image for the uid of the container process. If unspecified, no additional groups are added to any container. Note that group memberships defined in the container image for the uid of the container process are still effective, even if they are not included in this list. Note that this field cannot be set when spec.os.name is windows.
type: array
items:
type: integer
@@ -3800,7 +3951,7 @@ spec:
additionalProperties:
type: string
matchLabelKeys:
- description: MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector.
+ description: "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. \n This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default)."
type: array
items:
type: string
@@ -3814,10 +3965,10 @@ spec:
type: integer
format: int32
nodeAffinityPolicy:
- description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. \n If this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. \n If this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
type: string
nodeTaintsPolicy:
- description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. \n If this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. \n If this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
type: string
topologyKey:
description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
@@ -4074,7 +4225,7 @@ spec:
description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string
sizeLimit:
- description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
+ description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
anyOf:
- type: integer
@@ -4103,7 +4254,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -4119,7 +4270,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -4134,10 +4285,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -4148,7 +4317,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -4807,6 +4976,7 @@ spec:
description: InstallModeType is a supported type of install mode for CSV installation
type: string
keywords:
+ description: A list of keywords describing the operator.
type: array
items:
type: string
@@ -4816,6 +4986,7 @@ spec:
additionalProperties:
type: string
links:
+ description: A list of links related to the operator.
type: array
items:
type: object
@@ -4825,6 +4996,7 @@ spec:
url:
type: string
maintainers:
+ description: A list of organizational entities maintaining the operator.
type: array
items:
type: object
@@ -4854,6 +5026,7 @@ spec:
version:
type: string
provider:
+ description: The publishing entity behind the operator.
type: object
properties:
name:
@@ -4992,22 +5165,26 @@ spec:
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
apiVersions:
description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
operations:
description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.
type: array
items:
description: OperationType specifies an operation for a request.
type: string
+ x-kubernetes-list-type: atomic
resources:
description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required."
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
scope:
description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".
type: string
diff --git a/manifests/0000_50_olm_00-subscriptions.crd.yaml b/manifests/0000_50_olm_00-subscriptions.crd.yaml
index 8618f9d66b..6b51d9fa19 100644
--- a/manifests/0000_50_olm_00-subscriptions.crd.yaml
+++ b/manifests/0000_50_olm_00-subscriptions.crd.yaml
@@ -645,6 +645,21 @@ spec:
description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -655,7 +670,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -989,7 +1004,7 @@ spec:
description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string
sizeLimit:
- description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
+ description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
anyOf:
- type: integer
@@ -1018,7 +1033,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -1034,7 +1049,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -1049,10 +1064,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -1063,7 +1096,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
diff --git a/manifests/0000_90_olm_00-service-monitor.yaml b/manifests/0000_90_olm_00-service-monitor.yaml
index 710a551cf1..2ea19f4a64 100644
--- a/manifests/0000_90_olm_00-service-monitor.yaml
+++ b/manifests/0000_90_olm_00-service-monitor.yaml
@@ -78,7 +78,6 @@ metadata:
include.release.openshift.io/ibm-cloud-managed: "true"
include.release.openshift.io/self-managed-high-availability: "true"
spec:
- jobLabel: k8s-app
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 30s
diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml
index 897fbeecef..a4c35314dc 100644
--- a/pkg/manifests/csv.yaml
+++ b/pkg/manifests/csv.yaml
@@ -5,7 +5,7 @@ metadata:
name: packageserver
namespace: openshift-operator-lifecycle-manager
labels:
- olm.version: 0.19.0
+ olm.version: 0.0.0-e17b6a389771f79426879e9feeae14d959b90e48
olm.clusteroperator.name: operator-lifecycle-manager-packageserver
annotations:
include.release.openshift.io/self-managed-high-availability: "true"
@@ -159,7 +159,7 @@ spec:
- packageserver
topologyKey: "kubernetes.io/hostname"
maturity: alpha
- version: 0.19.0
+ version: 0.0.0-e17b6a389771f79426879e9feeae14d959b90e48
apiservicedefinitions:
owned:
- group: packages.operators.coreos.com
diff --git a/scripts/sync.sh b/scripts/sync.sh
index 72340c4e93..769eac96f6 100755
--- a/scripts/sync.sh
+++ b/scripts/sync.sh
@@ -38,13 +38,15 @@ candidates() {
for remote in "${UPSTREAM_REMOTES[@]}"; do
"${ROOT_DIR}"/scripts/sync_get_candidates.sh "$remote"
done
+
+ # Create uber cherry-pick list
+ cat *.cherrypick | sort > all.cherrypick
+ echo "Number of commits to cherrypick: $(cat all.cherrypick | wc -l)"
}
pop() {
echo "Applying all upstream commit candidates"
- for remote in "${UPSTREAM_REMOTES[@]}"; do
- "${ROOT_DIR}"/scripts/sync_pop_candidate.sh -a "${remote}"
- done
+ "${ROOT_DIR}"/scripts/sync_pop_candidate.sh -a "all"
}
check_local_branch_commit_diff() {
diff --git a/scripts/sync_get_candidates.sh b/scripts/sync_get_candidates.sh
index c92996fd23..fb23005e29 100755
--- a/scripts/sync_get_candidates.sh
+++ b/scripts/sync_get_candidates.sh
@@ -28,7 +28,7 @@ cherrypick_set="${remote}.cherrypick"
: > "${cherrypick_set}" # clear existing file
for rc in "${remote_commits[@]}"; do
if [[ -z $(git log -n 1 --no-merges --grep "${rc}" HEAD) && -z $(grep "${rc}" "${remote}.blacklist") ]]; then
- printf '%s\n' "${rc}" >> "${cherrypick_set}"
+ git show -s --format="%cI ${remote} %H" "${rc}" >> "${cherrypick_set}"
(( ++picked ))
fi
done
diff --git a/scripts/sync_pop_candidate.sh b/scripts/sync_pop_candidate.sh
index e371806d4c..f8680788f9 100755
--- a/scripts/sync_pop_candidate.sh
+++ b/scripts/sync_pop_candidate.sh
@@ -2,6 +2,7 @@
set -o errexit
set -o pipefail
+#set -x
ROOT_DIR=$(dirname "${BASH_SOURCE[@]}")/..
# shellcheck disable=SC1091
@@ -30,33 +31,50 @@ function pop() {
printf 'nothing to pick'
exit
fi
+ readarray -t rcs < <(echo "$rc" | tr " " "\n")
+ remote="${rcs[1]}"
+ subtree_dir="staging/${remote}"
+ rc="${rcs[2]}"
printf 'popping: %s\n' "${rc}"
if ! git cherry-pick --allow-empty --keep-redundant-commits -Xsubtree="${subtree_dir}" "${rc}"; then
# Always blast away the vendor directory given OLM/registry still commit it into source control.
git rm -rf "${subtree_dir}"/vendor 2>/dev/null || true
+ # Look for any deleted by us
+ readarray -t deletes < <(git status --porcelain| grep -oP "^DU \K.*")
+ for d in "${deletes[@]}"; do
+ git rm "${d}"
+ done
+ echo "Done with deletes"
+
+ # Handle other conflicts
num_conflicts=$(git diff --name-only --diff-filter=U --relative | wc -l)
while [[ $num_conflicts != 0 ]] ; do
- file=$(git diff --name-only --diff-filter=U --relative)
-
- if [[ $file == *"go.mod"* ]]; then
- git diff "${subtree_dir}"/go.mod
-
- git checkout --theirs "${subtree_dir}"/go.mod
- pushd "${subtree_dir}"
- go mod tidy
- git add go.mod go.sum
- popd
- else
- git checkout --theirs "$file"
- git diff "$file"
- git add "$file"
- fi
+ readarray -t files < <(git diff --name-only --diff-filter=U --relative)
+
+ for f in "${files[@]}"; do
+
+ # Note that this can be a problem if there are regressions! (e.g. 1.2 -> 1.1)
+ if [[ ${f} == *"go.mod"* ]]; then
+ git diff "${subtree_dir}"/go.mod
+
+ git checkout --theirs "${subtree_dir}"/go.mod
+ pushd "${subtree_dir}"
+ go mod tidy
+ git add go.mod go.sum
+ popd
+ else
+ git checkout --theirs "${f}"
+ git diff "${f}"
+ git add "${f}"
+ fi
+ done
num_conflicts=$(git diff --name-only --diff-filter=U --relative | wc -l)
echo "Number of merge conflicts remaining: $num_conflicts"
done
+ echo "Done with conflicts"
if [[ -z $(git status --porcelain) ]]; then
git commit --allow-empty
@@ -66,16 +84,36 @@ function pop() {
fi
fi
+ # Did go.mod change?
+ if ! git diff --quiet HEAD^ "${subtree_dir}"/go.mod; then
+ git diff HEAD^ "${subtree_dir}"/go.mod
+ pushd "${subtree_dir}"
+ echo "Running BASH subshell: go.mod has changed, check for regressions!"
+ echo -n ' to continue, ^C to quit: '
+ read
+ popd
+ fi
# 1. Pop next commit off cherrypick set
# 2. Cherry-pick
# 3. Ammend commit
# 4. Remove from cherrypick set
- make vendor
- make manifests
+ if ! make vendor; then
+ echo "Running BASH subshell: fix make vendor"
+ echo -n ' to continue, ^C to quit: '
+ read
+ fi
git add "${subtree_dir}" "${ROOT_GENERATED_PATHS[@]}"
git status
git commit --amend --allow-empty --no-edit --trailer "Upstream-repository: ${remote}" --trailer "Upstream-commit: ${rc}"
+ if ! make manifests; then
+ echo "Running BASH subshell: fix make manifests"
+ echo -n ' to continue, ^C to quit: '
+ read
+ fi
+ git add "${subtree_dir}" "${ROOT_GENERATED_PATHS[@]}"
+ git status
+ git commit --amend --allow-empty --no-edit
tmp_set=$(mktemp)
tail -n +2 "${cherrypick_set}" > "${tmp_set}"; cat "${tmp_set}" > "${cherrypick_set}"
diff --git a/staging/api/.github/workflows/go.yaml b/staging/api/.github/workflows/go.yaml
index 3fa8fbcb6a..2da8edbf35 100644
--- a/staging/api/.github/workflows/go.yaml
+++ b/staging/api/.github/workflows/go.yaml
@@ -13,9 +13,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Set up Go
- uses: actions/setup-go@v2
+ uses: actions/setup-go@v3
with:
- go-version: 1.18
+ go-version: 1.19
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v2
@@ -29,7 +29,12 @@ jobs:
restore-keys: |
${{ runner.os }}-go-
- name: unit-test
- run: go test -v ./...
+ run: go test -v ./... -coverprofile cover.out
+ - uses: codecov/codecov-action@v3
+ with:
+ files: cover.out
+ fail_ci_if_error: true
+ functionalities: fixes
go-apidiff:
name: go-apidiff
@@ -37,9 +42,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Set up Go
- uses: actions/setup-go@v2
+ uses: actions/setup-go@v3
with:
- go-version: 1.18
+ go-version: 1.19
id: go
- name: Print out Go env
run: go env
diff --git a/staging/api/.github/workflows/verify.yml b/staging/api/.github/workflows/verify.yml
index 11fa0edfe6..b5771af1c6 100644
--- a/staging/api/.github/workflows/verify.yml
+++ b/staging/api/.github/workflows/verify.yml
@@ -12,9 +12,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - uses: actions/setup-go@v2
+ - uses: actions/setup-go@v3
with:
- go-version: '~1.18'
+ go-version: '~1.19'
- name: Run the verify target
run: |
export GOPATH=$(go env GOPATH)
diff --git a/staging/api/.gitignore b/staging/api/.gitignore
index d6395083f0..48684a7b8b 100644
--- a/staging/api/.gitignore
+++ b/staging/api/.gitignore
@@ -20,3 +20,5 @@
.idea/*
vendor/
bin/
+
+.vscode
diff --git a/staging/api/Makefile b/staging/api/Makefile
index b5fdf9d55c..31ff7bd135 100644
--- a/staging/api/Makefile
+++ b/staging/api/Makefile
@@ -22,7 +22,6 @@ help: ## Show this help screen
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z0-9_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
.PHONY: install
-
install: ## Build & install operator-verify
$(Q)go install \
-gcflags "all=-trimpath=${GOPATH}" \
@@ -42,7 +41,7 @@ format: ## Format the source code
$(Q)go fmt $(PKGS)
tidy: ## Update dependencies
- $(Q)go mod tidy -v
+ $(Q)go mod tidy
$(Q)go mod verify
clean: ## Clean up the build artifacts
@@ -59,17 +58,17 @@ manifests: yq controller-gen ## Generate manifests e.g. CRD, RBAC etc
$(CONTROLLER_GEN) schemapatch:manifests=./crds output:dir=./crds paths=./pkg/operators/...
@# Add missing defaults in embedded core API schemas
- $(Q)$(YQ) w --inplace ./crds/operators.coreos.com_clusterserviceversions.yaml spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.spec.properties.containers.items.properties.ports.items.properties.protocol.default TCP
- $(Q)$(YQ) w --inplace ./crds/operators.coreos.com_clusterserviceversions.yaml spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.spec.properties.initContainers.items.properties.ports.items.properties.protocol.default TCP
+ $(YQ) --inplace '.spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.spec.properties.containers.items.properties.ports.items.properties.protocol.default="TCP"' ./crds/operators.coreos.com_clusterserviceversions.yaml
+ $(Q)$(YQ) --inplace '.spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.spec.properties.initContainers.items.properties.ports.items.properties.protocol.default="TCP"' ./crds/operators.coreos.com_clusterserviceversions.yaml
@# Preserve fields for embedded metadata fields
- $(Q)$(YQ) w --inplace ./crds/operators.coreos.com_clusterserviceversions.yaml spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.metadata.x-kubernetes-preserve-unknown-fields true
+ $(Q)$(YQ) --inplace '.spec.versions[0].schema.openAPIV3Schema.properties.spec.properties.install.properties.spec.properties.deployments.items.properties.spec.properties.template.properties.metadata.x-kubernetes-preserve-unknown-fields=true' ./crds/operators.coreos.com_clusterserviceversions.yaml
@# Remove OperatorCondition.spec.overrides[*].lastTransitionTime requirement
- $(Q)$(YQ) delete --inplace ./crds/operators.coreos.com_operatorconditions.yaml 'spec.versions[*].schema.openAPIV3Schema.properties.spec.properties.overrides.items.required(.==lastTransitionTime)'
+ $(Q)$(YQ) --inplace 'del(.spec.versions[].schema.openAPIV3Schema.properties.spec.properties.overrides.items.required[] | select(. == "lastTransitionTime"))' ./crds/operators.coreos.com_operatorconditions.yaml
@# Remove status subresource from the CRD manifests to ensure server-side apply works
- $(Q)for f in ./crds/*.yaml ; do $(YQ) d --inplace $$f status; done
+ $(Q)for f in ./crds/*.yaml ; do $(YQ) --inplace 'del(.status)' $$f; done
@# Update embedded CRD files.
$(Q)go generate ./crds/...
@@ -102,7 +101,8 @@ CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
YQ ?= $(LOCALBIN)/yq
## Tool Versions
-CONTROLLER_TOOLS_VERSION ?= v0.8.0
+CONTROLLER_TOOLS_VERSION ?= v0.9.0
+YQ_VERSION ?= v4.28.1
.PHONY: controller-gen
controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary.
@@ -112,4 +112,4 @@ $(CONTROLLER_GEN): $(LOCALBIN)
.PHONY: yq
yq: $(YQ) ## Download yq locally if necessary.
$(YQ): $(LOCALBIN)
- GOBIN=$(LOCALBIN) go install $(GO_INSTALL_OPTS) github.com/mikefarah/yq/v3@latest
+ GOBIN=$(LOCALBIN) go install $(GO_INSTALL_OPTS) github.com/mikefarah/yq/v4@$(YQ_VERSION)
diff --git a/staging/api/OWNERS b/staging/api/OWNERS
index cb3e6f7ea5..79add35148 100644
--- a/staging/api/OWNERS
+++ b/staging/api/OWNERS
@@ -9,6 +9,7 @@ approvers:
- joelanford
- jmrodri
- perdasilva
+ - grokspawn
# review == this code is good /lgtm
reviewers:
- ecordell
@@ -25,3 +26,5 @@ reviewers:
- ankitathomas
- jmrodri
- perdasilva
+ - grokspawn
+ - oceanc80
diff --git a/staging/api/crds/operators.coreos.com_catalogsources.yaml b/staging/api/crds/operators.coreos.com_catalogsources.yaml
index 2836d66fed..e42010c7ad 100644
--- a/staging/api/crds/operators.coreos.com_catalogsources.yaml
+++ b/staging/api/crds/operators.coreos.com_catalogsources.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: catalogsources.operators.coreos.com
spec:
@@ -71,6 +71,467 @@ spec:
description: GrpcPodConfig exposes different overrides for the pod spec of the CatalogSource Pod. Only used when SourceType = SourceTypeGrpc and Image is set.
type: object
properties:
+ affinity:
+ description: Affinity is the catalog source's pod's affinity.
+ type: object
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for the pod.
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
+ type: object
+ required:
+ - preference
+ - weight
+ properties:
+ preference:
+ description: A node selector term, associated with the corresponding weight.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ weight:
+ description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
+ type: object
+ required:
+ - nodeSelectorTerms
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms. The terms are ORed.
+ type: array
+ items:
+ description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
nodeSelector:
description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node.
type: object
@@ -127,6 +588,9 @@ spec:
type: integer
publisher:
type: string
+ runAsRoot:
+ description: RunAsRoot allows admins to indicate that they wish to run the CatalogSource pod in a privileged pod as root. This should only be enabled when running older catalog images which could not be run as non-root.
+ type: boolean
secrets:
description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry.
type: array
@@ -152,7 +616,7 @@ spec:
description: Represents the state of a CatalogSource. Note that Message and Reason represent the original status information, which may be migrated to be conditions based in the future. Any new features introduced will use conditions.
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
diff --git a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml
index 37b41c4608..e5a35991bd 100644
--- a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml
+++ b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: clusterserviceversions.operators.coreos.com
spec:
@@ -119,7 +119,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -127,10 +127,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -229,7 +232,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -237,10 +240,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -343,7 +349,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -351,10 +357,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -445,7 +454,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -453,10 +462,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -505,10 +517,13 @@ spec:
version:
type: string
description:
+ description: Description of the operator. Can include the features, limitations or use-cases of the operator.
type: string
displayName:
+ description: The name of the operator in display format.
type: string
icon:
+ description: The icon for this operator.
type: array
items:
type: object
@@ -550,7 +565,7 @@ spec:
- verbs
properties:
apiGroups:
- description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.
+ description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups.
type: array
items:
type: string
@@ -672,7 +687,7 @@ spec:
description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.
type: string
template:
- description: Template describes the pods that will be created.
+ description: Template describes the pods that will be created. The only allowed template.spec.restartPolicy value is "Always".
type: object
properties:
metadata:
@@ -1325,7 +1340,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1390,7 +1405,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1440,7 +1455,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1472,7 +1487,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1528,7 +1543,7 @@ spec:
description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.
type: string
ports:
- description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated.
+ description: List of ports to expose from the container. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Modifying this array with strategic merge patch may corrupt the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.
type: array
items:
description: ContainerPort represents a network port in a single container.
@@ -1576,7 +1591,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1608,7 +1623,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1660,10 +1675,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -1674,7 +1721,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -1787,7 +1834,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -1819,7 +1866,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -1966,10 +2013,10 @@ spec:
description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.'
type: boolean
ephemeralContainers:
- description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is beta-level and available on clusters that haven't disabled the EphemeralContainers feature gate.
+ description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource.
type: array
items:
- description: "An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation. \n To add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted. \n This is a beta feature available on clusters that haven't disabled the EphemeralContainers feature gate."
+ description: "An EphemeralContainer is a temporary container that you may add to an existing Pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a Pod is removed or restarted. The kubelet may evict a Pod if an ephemeral container causes the Pod to exceed its resource allocation. \n To add an ephemeral container, use the ephemeralcontainers subresource of an existing Pod. Ephemeral containers may not be removed or restarted."
type: object
required:
- name
@@ -2137,7 +2184,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2202,7 +2249,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2252,7 +2299,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2284,7 +2331,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2388,7 +2435,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2420,7 +2467,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2472,10 +2519,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -2486,7 +2565,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -2599,7 +2678,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -2631,7 +2710,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -2772,6 +2851,9 @@ spec:
hostPID:
description: 'Use the host''s pid namespace. Optional: Default to false.'
type: boolean
+ hostUsers:
+ description: 'Use the host''s user namespace. Optional: Default to true. If set to true or not present, the pod will be run in the host user namespace, useful for when the pod needs a feature only available to the host user namespace, such as loading a kernel module with CAP_SYS_MODULE. When set to false, a new userns is created for the pod. Setting false is useful for mitigating container breakout vulnerabilities even allowing users to run their containers as root without actually having root privileges on the host. This field is alpha-level and is only honored by servers that enable the UserNamespacesSupport feature.'
+ type: boolean
hostname:
description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value.
type: string
@@ -2957,7 +3039,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3022,7 +3104,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3072,7 +3154,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3104,7 +3186,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3160,7 +3242,7 @@ spec:
description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated.
type: string
ports:
- description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated.
+ description: List of ports to expose from the container. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Modifying this array with strategic merge patch may corrupt the data. For more information See https://github.com/kubernetes/kubernetes/issues/108255. Cannot be updated.
type: array
items:
description: ContainerPort represents a network port in a single container.
@@ -3208,7 +3290,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3240,7 +3322,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3292,10 +3374,42 @@ spec:
description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes'
type: integer
format: int32
+ resizePolicy:
+ description: Resources resize policy for the container.
+ type: array
+ items:
+ description: ContainerResizePolicy represents resource resize policy for the container.
+ type: object
+ required:
+ - resourceName
+ - restartPolicy
+ properties:
+ resourceName:
+ description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.'
+ type: string
+ restartPolicy:
+ description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired.
+ type: string
+ x-kubernetes-list-type: atomic
resources:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -3306,7 +3420,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -3419,7 +3533,7 @@ spec:
type: integer
format: int32
grpc:
- description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate.
+ description: GRPC specifies an action involving a GRPC port.
type: object
required:
- port
@@ -3451,7 +3565,7 @@ spec:
- value
properties:
name:
- description: The header field name
+ description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header.
type: string
value:
description: The header field value
@@ -3575,7 +3689,7 @@ spec:
type: string
x-kubernetes-map-type: atomic
os:
- description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set. \n If the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions \n If the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup This is a beta field and requires the IdentifyPodOS feature"
+ description: "Specifies the OS of the containers in the pod. Some pod and container fields are restricted if this is set. \n If the OS field is set to linux, the following fields must be unset: -securityContext.windowsOptions \n If the OS field is set to windows, following fields must be unset: - spec.hostPID - spec.hostIPC - spec.hostUsers - spec.securityContext.seLinuxOptions - spec.securityContext.seccompProfile - spec.securityContext.fsGroup - spec.securityContext.fsGroupChangePolicy - spec.securityContext.sysctls - spec.shareProcessNamespace - spec.securityContext.runAsUser - spec.securityContext.runAsGroup - spec.securityContext.supplementalGroups - spec.containers[*].securityContext.seLinuxOptions - spec.containers[*].securityContext.seccompProfile - spec.containers[*].securityContext.capabilities - spec.containers[*].securityContext.readOnlyRootFilesystem - spec.containers[*].securityContext.privileged - spec.containers[*].securityContext.allowPrivilegeEscalation - spec.containers[*].securityContext.procMount - spec.containers[*].securityContext.runAsUser - spec.containers[*].securityContext.runAsGroup"
type: object
required:
- name
@@ -3614,8 +3728,33 @@ spec:
conditionType:
description: ConditionType refers to a condition in the pod's condition list with matching type.
type: string
+ resourceClaims:
+ description: "ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: PodResourceClaim references exactly one ResourceClaim through a ClaimSource. It adds a name to it that uniquely identifies the ResourceClaim inside the Pod. Containers that need access to the ResourceClaim reference it with this name.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name uniquely identifies this resource claim inside the pod. This must be a DNS_LABEL.
+ type: string
+ source:
+ description: Source describes where to find the ResourceClaim.
+ type: object
+ properties:
+ resourceClaimName:
+ description: ResourceClaimName is the name of a ResourceClaim object in the same namespace as this pod.
+ type: string
+ resourceClaimTemplateName:
+ description: "ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. \n The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long). \n An existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed. \n This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim."
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
restartPolicy:
- description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy'
+ description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy'
type: string
runtimeClassName:
description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class'
@@ -3623,6 +3762,21 @@ spec:
schedulerName:
description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.
type: string
+ schedulingGates:
+ description: "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod. \n SchedulingGates can only be set at pod creation time, and be removed only afterwards. \n This is a beta feature enabled by the PodSchedulingReadiness feature gate."
+ type: array
+ items:
+ description: PodSchedulingGate is associated to a Pod to guard its scheduling.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name of the scheduling gate. Each scheduling gate must have a unique name field.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
securityContext:
description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.'
type: object
@@ -3674,7 +3828,7 @@ spec:
description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied."
type: string
supplementalGroups:
- description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. Note that this field cannot be set when spec.os.name is windows.
+ description: A list of groups applied to the first process run in each container, in addition to the container's primary GID, the fsGroup (if specified), and group memberships defined in the container image for the uid of the container process. If unspecified, no additional groups are added to any container. Note that group memberships defined in the container image for the uid of the container process are still effective, even if they are not included in this list. Note that this field cannot be set when spec.os.name is windows.
type: array
items:
type: integer
@@ -3794,16 +3948,28 @@ spec:
type: object
additionalProperties:
type: string
+ matchLabelKeys:
+ description: "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. \n This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default)."
+ type: array
+ items:
+ type: string
+ x-kubernetes-list-type: atomic
maxSkew:
description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. The global minimum is the minimum number of matching pods in an eligible domain or zero if the number of eligible domains is less than MinDomains. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 2/2/1: In this case, the global minimum is 1. | zone1 | zone2 | zone3 | | P P | P P | P | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 2/2/2; scheduling it onto zone1(zone2) would make the ActualSkew(3-1) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.'
type: integer
format: int32
minDomains:
- description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is an alpha field and requires enabling MinDomainsInPodTopologySpread feature gate."
+ description: "MinDomains indicates a minimum number of eligible domains. When the number of eligible domains with matching topology keys is less than minDomains, Pod Topology Spread treats \"global minimum\" as 0, and then the calculation of Skew is performed. And when the number of eligible domains with matching topology keys equals or greater than minDomains, this value has no effect on scheduling. As a result, when the number of eligible domains is less than minDomains, scheduler won't schedule more than maxSkew Pods to those domains. If value is nil, the constraint behaves as if MinDomains is equal to 1. Valid values are integers greater than 0. When value is not nil, WhenUnsatisfiable must be DoNotSchedule. \n For example, in a 3-zone cluster, MaxSkew is set to 2, MinDomains is set to 5 and pods with the same labelSelector spread as 2/2/2: | zone1 | zone2 | zone3 | | P P | P P | P P | The number of domains is less than 5(MinDomains), so \"global minimum\" is treated as 0. In this situation, new pod with the same labelSelector cannot be scheduled, because computed skew will be 3(3 - 0) if new Pod is scheduled to any of the three zones, it will violate MaxSkew. \n This is a beta field and requires the MinDomainsInPodTopologySpread feature gate to be enabled (enabled by default)."
type: integer
format: int32
+ nodeAffinityPolicy:
+ description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. \n If this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ type: string
+ nodeTaintsPolicy:
+ description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. \n If this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ type: string
topologyKey:
- description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes match the node selector. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
+ description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
type: string
whenUnsatisfiable:
description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assignment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.'
@@ -4057,7 +4223,7 @@ spec:
description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string
sizeLimit:
- description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
+ description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
anyOf:
- type: integer
@@ -4086,7 +4252,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -4102,7 +4268,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -4117,10 +4283,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -4131,7 +4315,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -4746,7 +4930,7 @@ spec:
- verbs
properties:
apiGroups:
- description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.
+ description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. "" represents the core API group and "*" represents all API groups.
type: array
items:
type: string
@@ -4790,6 +4974,7 @@ spec:
description: InstallModeType is a supported type of install mode for CSV installation
type: string
keywords:
+ description: A list of keywords describing the operator.
type: array
items:
type: string
@@ -4799,6 +4984,7 @@ spec:
additionalProperties:
type: string
links:
+ description: A list of links related to the operator.
type: array
items:
type: object
@@ -4808,6 +4994,7 @@ spec:
url:
type: string
maintainers:
+ description: A list of organizational entities maintaining the operator.
type: array
items:
type: object
@@ -4837,6 +5024,7 @@ spec:
version:
type: string
provider:
+ description: The publishing entity behind the operator.
type: object
properties:
name:
@@ -4975,22 +5163,26 @@ spec:
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
apiVersions:
description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
operations:
description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.
type: array
items:
description: OperationType specifies an operation for a request.
type: string
+ x-kubernetes-list-type: atomic
resources:
description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required."
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
scope:
description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".
type: string
diff --git a/staging/api/crds/operators.coreos.com_installplans.yaml b/staging/api/crds/operators.coreos.com_installplans.yaml
index 8e9b85e371..b85b77c562 100644
--- a/staging/api/crds/operators.coreos.com_installplans.yaml
+++ b/staging/api/crds/operators.coreos.com_installplans.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: installplans.operators.coreos.com
spec:
diff --git a/staging/api/crds/operators.coreos.com_olmconfigs.yaml b/staging/api/crds/operators.coreos.com_olmconfigs.yaml
index 44dfcd937e..c6ebe96815 100644
--- a/staging/api/crds/operators.coreos.com_olmconfigs.yaml
+++ b/staging/api/crds/operators.coreos.com_olmconfigs.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: olmconfigs.operators.coreos.com
spec:
@@ -50,7 +50,7 @@ spec:
conditions:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
diff --git a/staging/api/crds/operators.coreos.com_operatorconditions.yaml b/staging/api/crds/operators.coreos.com_operatorconditions.yaml
index aa6bd41955..ef4b7bef73 100644
--- a/staging/api/crds/operators.coreos.com_operatorconditions.yaml
+++ b/staging/api/crds/operators.coreos.com_operatorconditions.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: operatorconditions.operators.coreos.com
spec:
@@ -45,7 +45,7 @@ spec:
overrides:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- message
@@ -95,7 +95,7 @@ spec:
conditions:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
@@ -162,7 +162,7 @@ spec:
conditions:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
@@ -209,7 +209,7 @@ spec:
overrides:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- message
@@ -259,7 +259,7 @@ spec:
conditions:
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
diff --git a/staging/api/crds/operators.coreos.com_operatorgroups.yaml b/staging/api/crds/operators.coreos.com_operatorgroups.yaml
index b62f3996a9..f6794075b9 100644
--- a/staging/api/crds/operators.coreos.com_operatorgroups.yaml
+++ b/staging/api/crds/operators.coreos.com_operatorgroups.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: operatorgroups.operators.coreos.com
spec:
@@ -99,7 +99,7 @@ spec:
description: Conditions is an array of the OperatorGroup's conditions.
type: array
items:
- description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
+ description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, \n type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }"
type: object
required:
- lastTransitionTime
diff --git a/staging/api/crds/operators.coreos.com_operators.yaml b/staging/api/crds/operators.coreos.com_operators.yaml
index e7dce32925..73b202874f 100644
--- a/staging/api/crds/operators.coreos.com_operators.yaml
+++ b/staging/api/crds/operators.coreos.com_operators.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: operators.operators.coreos.com
spec:
diff --git a/staging/api/crds/operators.coreos.com_subscriptions.yaml b/staging/api/crds/operators.coreos.com_subscriptions.yaml
index 3523401502..31e7ae877a 100644
--- a/staging/api/crds/operators.coreos.com_subscriptions.yaml
+++ b/staging/api/crds/operators.coreos.com_subscriptions.yaml
@@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
- controller-gen.kubebuilder.io/version: v0.8.0
+ controller-gen.kubebuilder.io/version: v0.9.0
creationTimestamp: null
name: subscriptions.operators.coreos.com
spec:
@@ -643,6 +643,21 @@ spec:
description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -653,7 +668,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
@@ -987,7 +1002,7 @@ spec:
description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
type: string
sizeLimit:
- description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir'
+ description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir'
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
anyOf:
- type: integer
@@ -1016,7 +1031,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -1032,7 +1047,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -1047,10 +1062,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -1061,7 +1094,7 @@ spec:
- type: string
x-kubernetes-int-or-string: true
requests:
- description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
+ description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
additionalProperties:
pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
diff --git a/staging/api/crds/zz_defs.go b/staging/api/crds/zz_defs.go
index ea65d5c73e..6a98bd4bd7 100644
--- a/staging/api/crds/zz_defs.go
+++ b/staging/api/crds/zz_defs.go
@@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} {
return nil
}
-var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x7b\x6b\x73\xdc\xb6\x92\xf6\x77\xff\x8a\x2e\xbd\x6f\x95\xa4\xec\x0c\x65\x25\xa7\xb2\x27\xb3\xb9\x94\x22\xdb\x59\x55\x62\x5b\x65\xd9\xde\xda\x63\x79\xd7\x18\xb2\x87\x83\x08\x04\x68\x00\x94\x34\x39\x75\xfe\xfb\x56\x37\x00\x92\x73\xe1\xcc\x48\x71\xf4\xc5\x16\x88\x6b\x5f\x9f\x7e\x00\x89\x5a\xbe\x47\xeb\xa4\xd1\x13\x10\xb5\xc4\x7b\x8f\x9a\x7e\x73\xd9\xcd\xdf\x5d\x26\xcd\xc9\xed\xe9\x93\x1b\xa9\x8b\x09\x9c\x37\xce\x9b\xea\x0d\x3a\xd3\xd8\x1c\x9f\xe1\x4c\x6a\xe9\xa5\xd1\x4f\x2a\xf4\xa2\x10\x5e\x4c\x9e\x00\x08\xad\x8d\x17\xd4\xec\xe8\x57\x80\xdc\x68\x6f\x8d\x52\x68\xc7\x25\xea\xec\xa6\x99\xe2\xb4\x91\xaa\x40\xcb\x93\xa7\xa5\x6f\x9f\x66\xdf\x65\x4f\x9f\x00\xe4\x16\x79\xf8\x5b\x59\xa1\xf3\xa2\xaa\x27\xa0\x1b\xa5\x9e\x00\x68\x51\xe1\x04\x72\xe1\x85\x32\x65\xd8\x84\xcb\x4c\x8d\x56\x78\x63\x5d\x96\x1b\x8b\x86\xfe\xa9\x9e\xb8\x1a\x73\x5a\xbd\xb4\xa6\xa9\x27\xb0\xb1\x4f\x98\x2f\x6d\x52\x78\x2c\x8d\x95\xe9\x77\x80\x31\x18\x55\xf1\xff\xe3\xe1\xc3\xb2\x57\xbc\x2c\xb7\x2b\xe9\xfc\xaf\xeb\xdf\x7e\x93\xce\xf3\xf7\x5a\x35\x56\xa8\xd5\x0d\xf3\x27\x37\x37\xd6\xbf\xea\x96\xa7\xe5\x72\xe1\x9d\xcd\xc3\x67\xa9\xcb\x46\x09\xbb\x32\xf6\x09\x80\xcb\x4d\x8d\x13\xe0\xa1\xb5\xc8\xb1\x78\x02\x10\x45\x18\xa7\x1a\x83\x28\x0a\x56\x8b\x50\x97\x56\x6a\x8f\xf6\xdc\xa8\xa6\xd2\xed\x52\xd4\xa7\x40\x97\x5b\x59\x7b\x16\xfd\xdb\x39\x42\x6d\xd1\xfb\x05\x8b\x04\xcc\x0c\xfc\x1c\xd3\xda\xed\x28\x80\xdf\x9d\xd1\x97\xc2\xcf\x27\x90\x91\x84\xb3\x42\xba\x5a\x89\x05\xed\xa6\xd7\x2b\xa8\xe9\x59\xf8\xd6\x6b\xf7\x0b\xda\xba\xf3\x56\xea\x72\xdb\x56\xa8\xdf\xfe\x7b\x08\xa2\x79\xbb\xa8\xd7\xb7\xb0\xd2\xb8\xef\xfa\x75\x33\x55\xd2\xcd\xd1\xee\xbf\x89\x76\xc8\xda\x1e\x2e\x37\x7c\x19\xd8\x48\x6f\xd2\xe4\x50\xd9\x9a\x33\xac\x2d\x70\x56\xae\x9f\xb1\x10\x3e\x35\x86\x4e\xb7\xa7\x42\xd5\x73\x71\x1a\x1b\x5d\x3e\xc7\x4a\x74\xf6\x60\x6a\xd4\x67\x97\x17\xef\xbf\xb9\x5a\xf9\x00\xcb\xd2\x59\xb2\x73\x90\x0e\x04\x58\xac\x8d\x93\xde\xd8\x05\x49\xeb\xfc\xea\xbd\x1b\xc1\xf9\x9b\x67\x6e\x04\x42\x17\xad\xe3\x41\x2d\xf2\x1b\x51\xa2\xcb\xd6\xf6\x6a\xa6\xbf\x63\xee\x7b\xcd\x16\x3f\x37\xd2\x62\xd1\xdf\x05\x89\x27\xc9\x64\xa5\x99\xe4\xdf\x6b\xaa\x2d\xad\xe9\x7b\x8e\x1c\x7e\x7a\x51\x6e\xa9\x7d\xe5\x84\x87\x24\x86\xd0\x0f\x0a\x0a\x70\xe8\xd8\x04\xa2\x8f\x61\x11\x65\x17\x4c\x43\x3a\x3a\xbf\x45\x87\x3a\x84\x3c\x6a\x16\x3a\x9e\x29\x83\x2b\xb4\x34\x90\xdc\xbd\x51\x05\x45\xc2\x5b\xb4\x1e\x2c\xe6\xa6\xd4\xf2\x8f\x76\x36\x07\xde\xf0\x32\x4a\x78\x74\x1e\xd8\x6b\xb5\x50\x70\x2b\x54\x83\x41\x94\x95\x58\x80\x45\x9a\x17\x1a\xdd\x9b\x81\xbb\xb8\x0c\x5e\x1a\x8b\x20\xf5\xcc\x4c\x60\xee\x7d\xed\x26\x27\x27\xa5\xf4\x29\x86\xe7\xa6\xaa\x1a\x2d\xfd\xe2\x84\xc3\xb1\x9c\x36\x14\x0e\x4f\x0a\xbc\x45\x75\xe2\x64\x39\x16\x36\x9f\x4b\x8f\xb9\x6f\x2c\x9e\x88\x5a\x8e\x79\xb3\x9a\xe3\x78\x56\x15\xff\xcf\xc6\xa8\xef\x0e\x57\xc4\xb7\xd1\x98\x21\x85\xcd\xad\xb2\xa6\xe0\x19\xac\x28\x0c\x0f\x67\xe9\x44\x4a\x4d\x24\x95\x37\xcf\xaf\xde\x42\xda\x40\x10\x7b\x90\x70\xd7\xd5\x75\xc2\x26\x41\x49\x3d\x43\x1b\x7a\xce\xac\xa9\x78\x16\xd4\x45\x6d\xa4\xf6\xc1\xa5\x95\x44\xed\xc1\x35\xd3\x4a\x7a\xc7\x36\x87\xce\x93\x1e\x32\x38\xe7\x14\x06\x53\x84\xa6\x26\x4f\x2a\x32\xb8\xd0\x70\x2e\x2a\x54\xe7\xc2\xe1\x5f\x2e\x6a\x92\xa8\x1b\x93\xf8\xf6\x17\x76\x3f\x03\xaf\x0f\x58\xf3\x31\x80\x94\x21\xf7\xea\x3c\xe4\x94\x10\x3c\x70\x53\x04\x86\x2d\xbe\x48\x3f\xa2\x28\x2c\xba\x0d\x1f\xd6\x1c\x32\x74\x0c\x76\x32\x37\x8e\xf4\x27\x3c\xbc\xfe\xed\x25\xe4\x42\x43\xe3\x90\x9c\x27\x37\x5a\x93\x41\x78\x03\x82\x72\xd9\x18\xef\xa5\x63\x03\xb2\x58\x4a\xe7\xed\x22\x83\x17\xc6\x56\xc2\x4f\xe0\xfb\xd4\x34\xe6\xe9\x8c\x05\x59\xff\x38\xf9\xbe\x36\xd6\xff\x08\xaf\xb5\x5a\xd0\xa4\x05\xdc\xcd\x51\xc3\x55\x7b\x36\xf8\xa1\xf7\xcb\x2f\xb6\xce\x33\xb8\x28\xb5\xb1\xa9\x27\x59\xd5\x45\x25\x4a\x84\x99\x44\xc5\x76\xed\xd0\x67\xab\x1a\xdc\xaa\x45\x08\x70\x69\x26\xcb\x97\xa2\xde\x29\x9a\xf3\xd4\x93\xd6\xa2\xe5\xfb\xc9\xbb\xfb\xe8\x0d\x9b\x32\x1d\x89\xfe\x2b\xf2\x1b\x10\x71\x95\x4a\xd4\x63\xc7\x6e\xd3\x13\xd3\x7e\x12\x38\x4f\x13\x90\xfc\xba\xe6\x8b\x18\xb9\xb2\x87\x1e\xbb\x7f\xb2\x07\x8f\xed\x60\xc8\x4e\xa1\xbd\xdc\x94\x45\xf6\x58\xa3\xb4\x75\x7e\x69\x8a\x70\xec\x9d\xab\xfc\xd2\xef\x0d\x78\x5f\x1b\x87\x0e\x0a\x39\x9b\xa1\xa5\xb8\x63\x6e\xd1\x5a\x59\xa0\x83\x99\xb1\xac\xaf\xda\x14\xec\x93\xad\xfe\x96\x52\xed\xa5\x29\xf6\x55\x0c\x2d\xcd\x09\x23\x18\x63\x34\xc3\xc1\xe3\x6e\xf4\x76\xd8\xe1\xbc\xf4\xa3\x4d\x81\x57\xa8\x30\xf7\xc6\x6e\xee\xb1\x22\x93\x57\xbd\x01\x31\xea\xa7\xdf\xee\xe6\x32\x9f\x43\xd5\x38\x8e\xba\xde\x36\xb8\x24\x17\x6f\x60\x26\x3d\x18\x0d\x82\x97\xa5\x58\xbf\x3e\xb2\x12\x3e\x9f\xc7\x1e\x87\x0e\x94\x98\xa2\x72\xab\xf3\x4c\x91\x53\x6e\xd1\x28\x2c\x68\x42\x8e\x25\x3c\xe7\xc0\x11\x76\x48\x09\x42\x28\x6b\xf1\xf6\x76\x99\xc1\x2e\x2b\x0b\x82\x97\xc6\x4a\xbf\x38\x57\xc2\xb9\x21\x9b\x5e\x93\xee\xc5\x8c\xcd\x47\xce\x24\x16\x23\x90\xba\x90\x54\xd2\xb8\x74\xf6\x43\xd7\xce\x9b\x51\x5f\x4a\x70\xbd\xfe\x49\x42\xa9\x0f\xdc\x49\xa5\x48\x58\x05\xce\x44\xa3\x38\x48\xfe\x81\xd6\x80\x64\xeb\xb4\x6c\x57\xda\xa4\xcf\xdb\x85\xb7\xe5\xac\x0e\xf3\x86\xcf\x6a\xb4\xc7\x7b\x3f\xec\x5d\x6b\xe7\x3d\xb8\xda\x34\x94\x53\xc2\x14\xc1\x68\x0e\x84\x9f\x14\x96\x22\x5f\x7c\xa2\xed\x7f\xb2\x48\x1b\xc9\x3d\x16\x9f\x32\xc6\xf9\x4b\x2e\x46\x02\x32\x1c\xb5\x51\xd2\x09\x41\x6a\x52\x39\x39\x9b\xf4\x73\x16\x90\x95\xe5\xdc\x53\xaf\x58\x78\x2c\x6f\x80\x7d\xae\xfd\x48\xa9\x5f\x48\x8d\xf6\xc3\x57\x1f\xd7\x7a\x06\xc8\xc6\xb9\x4a\x29\x73\xd7\xb7\x4f\xdb\x68\x90\x9a\xfc\x1d\xd2\x01\xe1\xac\xa8\xa4\x63\x44\x7a\x74\x79\x75\x76\xbc\x74\x12\xa8\x4c\x81\x23\x3a\x5f\x61\xd0\xe9\x43\x4f\xde\x4e\x13\x3a\x4c\xcb\x08\x4f\xcb\x90\x4d\x44\x6f\xc9\x05\xe5\xcc\xb8\x26\x09\xcc\x50\x60\x99\x62\xbb\xf8\xd5\x19\x7c\x9a\x0a\x87\x4a\x6a\x0c\xb2\xab\xad\xbc\x95\x0a\x4b\x5a\x51\xa7\xda\xd3\x65\x70\xde\x58\x8a\x67\x6a\x11\x0d\x03\x36\x6b\x45\x3a\x68\xf4\x8a\xb9\x25\xcb\x0a\x98\xaf\xaf\x2c\xea\xed\x08\x75\x5d\xf1\x88\x05\x65\x71\x91\xfa\xb1\x6e\xfc\x5c\xe8\x41\xe5\x12\x52\xa4\x89\xa5\x0e\xa3\x64\x11\xa0\x39\x5a\x6b\x6c\x06\xff\x45\xb1\xb3\xa1\x0a\x1b\x8c\x2a\xd0\xa6\xea\x0e\x24\xc5\x4b\x37\x4a\x42\x62\xc4\x1e\x71\x60\x14\xcc\x06\xc1\x0f\x9f\x39\x62\x7e\x0a\x38\xc8\xb8\x24\xed\x37\x83\x6b\x4d\x80\x52\xc0\xac\x21\x08\x98\x6a\x8b\xe0\x73\x7d\xd1\x24\x27\x4c\x13\xf4\x96\x1f\xb5\xdb\xae\x84\x8c\xa6\xd6\xd6\x19\x36\x10\x2c\x34\x97\x6c\xcf\xe7\x82\x21\x8b\x76\x39\x33\x03\x53\x57\x21\x02\xba\xa6\x26\xf8\xe3\xe8\xa4\x9a\x44\x93\x2f\xa5\x9f\xda\x14\x6e\xa3\x00\x68\x5b\xb5\xc5\x5a\xd8\x36\x62\x3b\x84\x7c\x2e\x34\xd5\x7a\x74\xd0\x16\x2b\x13\xf6\xa2\x65\xc5\xd4\x34\x9e\x6d\x2c\xfa\xea\xcc\x34\xba\x00\x0a\x2a\x1d\x9c\xbe\x69\xa6\x68\x35\x7a\x64\x44\x5d\x98\xdc\x11\x98\xce\xb1\xf6\xee\x24\x79\xd3\x49\x6d\x8a\x71\xfa\x65\x2c\x92\x93\x9c\x1c\x1e\x3c\x36\x1a\x41\x92\xfc\x04\x82\xae\x06\x7a\xa1\x6e\xaa\xe1\x00\x3f\xde\x3e\x98\x3a\x74\x62\xdc\xd8\xc9\x1b\x45\x65\x73\xc7\xe9\x6c\xda\x68\x9f\xb4\xe8\xfa\x03\x69\xa2\xc7\x59\x44\x70\x1e\xa2\xdb\xa1\xeb\x4f\xbd\x3d\x68\x0b\x6b\xc5\xd0\x11\xa4\xc7\x6a\x4b\x86\x5b\x27\x54\x28\xb6\x51\x2d\xd6\x6d\x94\x01\x80\xf7\x82\x72\x31\x17\xbf\xe1\x0b\x85\x2b\xbd\x00\xb2\xe7\x88\xf3\x39\xab\xc7\x3c\xe6\xad\xac\x15\xc2\xf7\x37\xb8\x18\x85\xca\x18\x67\x33\xcc\xfd\x8f\xd1\x9f\xa9\x0f\xf7\x67\xe7\x4e\xd4\xc3\xf7\xe9\x7f\x3f\x0e\x9d\x78\xaf\x2c\xbf\x1b\x11\x85\x9f\xb0\xa5\x6d\x3d\x56\x24\xf4\x9c\x07\xac\xa4\xec\x20\x81\x30\x17\xc9\x87\x8f\x95\xc1\xf3\xaa\xf6\x0b\xa8\x50\x68\x97\xf0\x0e\xc5\x8c\x5e\x67\x17\x23\x5c\x2f\xda\x72\x92\x69\x99\x02\xb6\x90\x57\xe6\x2a\xa2\xa0\x11\x5c\x5a\x9c\xa1\xed\x5a\x38\x91\xbd\x32\xcf\xef\x31\x6f\xfc\x20\x2e\xea\xcb\x6d\xab\x4b\xd1\xcf\x0d\x2e\x1e\x20\x90\x5f\x71\x91\x2a\x9a\x70\xb2\x1b\x5c\x04\x63\xe0\xa6\xce\x86\x44\x5d\x2b\x89\xa1\x68\xdf\x26\x99\x1b\x5c\x38\x46\x3d\x34\xfe\x26\xcc\x8e\xd4\x7f\xd4\x59\x49\x02\x9f\xcf\xa9\x6e\x74\xff\x11\xec\x35\x37\xd5\x54\xea\xb0\x58\x98\x3a\xa9\x82\x67\x4f\x02\xd5\x05\xff\xca\xcb\x7c\x09\x71\xa5\x4d\x3d\x40\x66\xaf\xd3\x39\x3a\x46\x04\x04\xed\xe8\xd0\x81\x45\x15\x3c\x7e\x2e\xeb\x44\x34\xf1\xd6\x33\x78\x4f\xe9\xb1\xa3\xc7\xd9\x36\x82\x04\xf8\x54\xcf\x3f\x37\x42\x65\xf0\x2c\x44\x45\x3e\x7d\x6c\x8a\x9d\x48\x90\x9f\x1b\x79\x2b\x14\x55\x35\xde\x50\xca\x2a\x72\x61\x0b\xce\x06\x91\xbd\x72\x26\x68\x4f\xb4\x80\x23\x79\x7b\xa7\x23\xc7\xcc\x19\xd4\xc2\x7a\x99\x37\x4a\xd8\xc4\xc8\x2f\xbe\x88\x44\x3b\xa3\xb9\xc2\xdc\xe8\x62\xab\x07\x0f\x46\xd7\x38\xb6\x2f\x63\x86\x51\x68\xa5\x29\xb8\x70\x93\x15\xae\x1a\xe9\xd1\x72\x71\x63\x66\xc9\xab\x5b\x17\x1b\x05\x54\x73\x27\x5d\x24\xb7\x5a\x02\x41\x06\x82\xe1\xb8\x17\x1e\x5b\xaf\xc8\xe0\xe7\x45\xca\x57\x23\x90\x3e\x20\x72\xc6\x7f\x09\xc3\x24\x93\x8d\xc2\xee\x1c\x6a\x66\x2c\x52\xd1\x7f\x54\x18\x1e\x83\xb7\x32\xf7\xc7\x19\xfc\x83\x20\x3e\x29\x5e\x63\x29\xbc\xbc\x6d\x31\x64\x42\x22\xde\xa2\x20\x4c\x2c\x1c\x3c\x85\x23\x1e\x06\xb2\xaa\xb0\x90\xc2\xa3\x5a\x1c\xc3\x74\xc1\xcb\xb8\x85\xf3\x58\xed\xa3\x3a\xa9\x3d\x96\x4b\xec\xf8\xfa\xcf\x2c\x12\x37\x52\xfb\x6f\xff\xb6\xa5\x27\x6f\xf6\x01\x9a\x7d\xcf\x90\x72\x29\xd4\x04\x94\xb9\xa2\xc2\x36\x07\x99\x36\x8a\xb4\x71\x43\xba\xe8\x0b\xa3\xce\xaf\x7a\xd8\x2f\x85\x99\x56\xc1\xbf\x93\x1d\x08\xb0\xc8\x17\x3c\xd1\x72\xff\x84\x8d\xcb\x7c\x1b\x61\x32\x98\xd1\x86\xf9\x3c\x60\x84\x42\xf0\xff\xdb\xbf\x0d\x10\x25\x81\x8d\x27\x9d\xaf\x73\x7e\xb0\x47\xa2\xec\x26\x1f\x52\xd6\x4e\xb7\x6e\x97\x7f\xd4\x0c\x0c\xf5\x77\x92\x38\x2d\x81\x42\x25\x52\xd4\xf7\x38\xf1\x64\xd0\x56\x78\x61\x36\x0a\x7e\x52\x3b\x2f\xb4\x97\x1c\xd9\x5a\x46\x2d\x31\x6c\x04\xbf\x1f\x42\xe2\xb0\xad\xc5\x40\x13\x8c\x2b\x72\xa6\x6b\xf1\xe1\xc1\x64\x5b\x2a\xf3\x77\xb3\xaf\x97\x89\x10\x08\x6b\x0a\xe7\x64\x49\x28\x13\xee\x90\xab\xe1\x98\x4e\x96\xd1\x66\xa8\x0a\x78\xa0\xfc\x83\xbd\xa9\x6a\x93\x80\xf4\x09\xf7\xe7\x46\xbb\xa6\xc2\x22\xc5\x8c\x02\x6b\xd4\x05\xea\x7c\xc1\x5c\xbf\xba\x45\x9b\xc1\x3b\x47\x9a\x82\xff\x94\x25\xd5\x7d\x71\xd1\x3e\x54\x62\x54\x40\xa9\x7a\x79\x07\xd2\x91\xe8\x66\x68\x2d\x16\xcc\xb6\x01\x61\xa0\x34\x03\x16\x2b\xfd\x1d\x14\x0d\xdf\x40\xac\x6e\xa2\x21\x39\x04\xba\xc0\x52\x51\x93\xe8\xb9\x96\x28\x09\x0e\x4f\x47\x2a\x4d\xb8\x6b\xe0\xfb\x30\x8a\x9d\xde\x74\x71\x54\x06\x82\xb8\x9d\x43\x6a\xff\xcd\xd7\x61\xde\xe5\x42\x98\x09\xec\x95\xc3\x70\xe1\xd6\xe8\x20\x7c\xec\xb3\x34\x29\xcc\x3c\x0d\x53\x6d\x1a\xc7\xe1\x58\x54\xab\x5b\xee\x62\xba\x15\xfa\x06\x0b\x50\x78\x2f\x73\x53\x5a\x51\xcf\x65\x2e\x94\x5a\xb0\x9b\x32\x49\x26\xbd\xe3\xaa\x7f\x0b\x99\x3d\x14\xc6\xdb\x8b\xd1\x07\x93\xba\x0e\x73\x8b\x7e\xf7\x05\xc1\x55\xe8\xd7\x25\x65\x2e\x97\xcd\x2c\x4d\x10\x6c\x24\xda\x5c\x62\xc1\x45\x9e\x93\x23\xb1\xe9\x52\xd5\x1e\x01\x48\xcf\x94\x33\xb8\xe0\x94\x3a\x45\xc7\x56\x7e\x83\x58\x07\x4b\x53\xd2\x79\x70\x15\x73\x2a\x4e\xea\x1c\x01\x45\x3e\x0f\xe2\xd4\x88\x89\x66\xf4\x56\x62\x80\x41\x94\x6a\x17\xad\x6e\x50\xfb\xcd\xa0\x66\x7b\xdd\xb5\xa5\xe6\xda\x2e\xc6\x36\xa6\xec\x96\x64\x17\x8b\x52\x4e\x8c\x37\xf1\xae\x7b\xf4\xf0\x80\xa5\xc3\xed\xd9\x95\x27\xf0\x51\xee\x8e\x35\xef\x96\xba\xb7\xb7\xaf\x73\x73\x97\xee\xe1\xd6\x9c\x9c\x19\x9b\xa4\xdb\x42\xba\x9c\x3c\x1d\x0b\x38\x37\xda\x31\x3e\x0d\xd7\xb1\x7c\x9d\x7a\x2b\x54\x30\x85\x34\x71\x6d\x94\x62\x97\x6f\x52\x39\x41\x38\x5e\x03\x56\x53\x2c\x0a\x2c\xe8\x58\x61\x2b\x03\x69\xee\x4f\x12\xe8\x29\x3f\x5c\x1a\xa5\xb6\x67\xb1\xad\x75\xe9\x3e\x55\x69\x12\xc0\x36\x6c\xb4\x9c\xfa\x92\xc4\x22\x17\x47\x36\x5d\xa0\x47\x5b\x49\x1d\xe1\x11\x41\xdd\x56\xb0\x53\xf4\x77\x88\x1a\xf2\x39\xe6\x37\xad\x2b\xc5\xdb\xec\x15\xad\x45\xfe\x69\x39\x62\x75\x0f\x05\x8c\x52\x5c\x68\x38\x44\x90\x54\x13\x68\xbc\xeb\x73\x56\x1b\xd2\x0d\xa5\xe8\x5b\x21\x95\x98\x2a\xe4\xac\xd9\xfe\x36\x5a\xba\x55\x4f\xf9\xbc\x6e\x94\x22\x10\xab\x0b\x28\xdf\x5c\x9e\x83\xb7\x62\x36\x93\x39\x7d\x2a\xa4\x0d\xac\xef\xf2\x85\xfc\xf2\x82\xdb\xe0\xda\xa0\x47\x38\x2f\x7c\xb3\xa6\xa3\x2d\x0a\xde\xa6\x58\xaa\x43\xe4\x20\x41\xb4\xa4\xca\x37\xcb\xc5\x0a\x6d\x03\x43\xb1\xb5\xc4\x7f\x67\xf0\xca\x70\x8d\x20\x3c\xbc\x44\x47\x69\x97\x05\xf4\x06\x85\x33\xba\x17\x5d\x19\xfd\x5a\x59\x4a\x2d\x54\x3c\x54\x9f\xdf\x6b\x6b\x0f\xc1\x94\x72\x25\x4b\x2b\x7c\x1b\x14\xbb\x7d\xc7\xec\x12\xf3\x62\x60\x42\x33\x38\xd3\x0b\xd6\xf7\x0c\x05\x35\xd0\xcc\xde\x9a\xa2\xc9\x99\x87\x57\x8a\xaf\x7b\xbb\x49\xbe\x68\x18\x5d\xbe\x5e\x38\x4f\x8b\x24\xa0\xe7\xc8\x01\x84\x8c\x57\x4a\x46\x23\x08\x57\x53\x1d\x97\x6c\x32\x50\xe1\x9d\x80\x39\x59\x9c\x5d\x5e\x40\x7a\x30\x97\xc1\x78\x3c\x86\xb7\xd4\xec\xbc\x6d\x72\xce\x2f\xe4\x42\xba\x88\x99\x22\x58\x1f\x1f\x52\x30\xec\xe4\x63\x40\x64\x3e\x02\x04\xab\x85\x9f\x43\x16\x04\x9f\xf5\x44\x01\xf0\x82\x72\xcd\xbd\xa8\x6a\xb2\xfb\x6b\x1d\xa2\xf7\x0b\x63\xae\x82\x92\xc2\x9a\xff\x84\x93\x93\x55\x9b\x30\x53\x82\xa8\x91\x40\x64\xd3\x98\x19\x73\xe8\x96\x8f\x94\xd1\xc0\x5f\xb5\xb9\xd3\x9b\x56\xe7\xb5\x84\xc5\x09\x5c\x1f\x9c\x25\xef\xbb\x3e\x18\xc1\xf5\xc1\xa5\x35\x25\xc1\x56\xa9\x4b\x6a\x20\xa3\xba\x3e\x78\x86\xa5\x15\x05\x16\xd7\x07\x34\xed\xbf\xd5\x54\x61\xbd\x44\x5b\xe2\xaf\xb8\xf8\x81\x27\x6b\x9b\x53\x46\xf8\xa1\xa2\xef\xdc\x4e\x29\x98\xf2\xd4\x0f\x95\xa8\xdb\x86\x97\xa2\x6e\x07\x9f\x77\x76\xf6\xe1\x63\x85\x5e\xdc\x9e\x66\x9d\x46\x3f\xfd\xee\x8c\x9e\x5c\x1f\x74\xfb\x1f\x99\x8a\x2c\xa3\xf6\x8b\xeb\x03\x58\x5a\x75\x72\x7d\xc0\xeb\xa6\xf6\xb4\xc9\xc9\xf5\x01\xad\x44\xcd\xd6\x78\x33\x6d\x66\x93\xeb\x83\xe9\xc2\xa3\x1b\x9d\x8e\x2c\xd6\x23\x02\x4c\x3f\x74\x2b\x5c\x1f\x7c\x22\x9d\x9c\x9c\xc4\x2b\x0c\x56\xa6\x83\x7f\x6d\x26\xab\x77\xc6\xfd\xed\xf5\x1b\x93\xd0\xc2\xf9\xb7\x56\x68\x27\xd3\xfb\xb1\xc1\xae\x55\xf0\xf7\xc1\xef\x96\x63\xc0\xe0\xe7\x60\x0d\x83\x9f\x07\xb2\xe7\x3e\x99\x6b\xfd\x0c\x7b\xb2\xce\xeb\x03\x13\xa4\xa1\x2f\x1d\x4f\xd3\xea\x87\x72\x40\xec\x4d\xbe\x48\x38\x9e\x5c\x3c\xc6\x37\x42\x8c\x9a\xf5\x96\x45\xff\x6d\x0b\xfc\xf6\xed\x47\xa3\x0b\xb4\x8a\x2f\xab\xba\x59\xc3\x4d\x48\x91\x41\xe0\x0d\x44\xcb\xd2\xdc\x90\x23\x71\x76\xd2\x3d\xf2\x9a\xf7\xd5\xce\x48\xb1\x23\xf8\x7c\x9c\x86\x13\x5d\x9e\x63\xed\x39\xd3\x3d\xfe\x8a\x19\x7a\xa4\x0a\x21\xab\xb1\x1f\x36\x8f\x68\x1c\x7b\x0a\x3e\xf6\x8e\xaf\x75\x9a\x4a\x50\xea\x10\x05\xed\xb7\xfb\x16\xca\xb7\x50\x6e\x85\x90\x1a\x2e\x85\x02\xc7\x9f\xf4\x10\x45\x1d\x13\x09\x03\xb3\xda\x2f\x76\x32\x26\x7b\x1d\xbe\x12\xf7\xbf\xa1\x2e\xfd\x7c\x02\xdf\x7c\xfd\xef\xdf\xfe\x7d\xa0\x63\x08\x8c\x58\xfc\x82\x3a\x72\x41\x7b\x8a\x61\x7d\xe0\x2a\x69\xd8\x3d\xf1\x2c\xbb\x3e\x2d\xc9\xdd\x59\xd0\x9d\xe0\x07\x1c\x31\x5d\x36\x35\xc9\x85\x02\x7d\xe0\x1a\x72\x1c\x11\x48\xda\x38\x99\x6c\x03\xb8\x5a\xc0\xe9\xd7\x23\x98\x46\x11\xaf\x87\xef\x0f\xf7\x1f\xb3\x0d\x5b\x96\x0e\xbe\x1b\xad\xec\x47\x3a\x20\x55\x99\x19\x1b\x4e\x28\x31\x2d\x86\x4c\x98\xc8\x80\xf5\x4c\x88\xed\x7e\x77\x29\x6e\x17\x1f\xb8\x1f\x17\x58\x49\x2d\xab\xa6\x9a\xc0\xd3\x81\x2e\x21\xa4\xed\xa9\xcd\xd0\xb9\x03\x02\x82\x42\x57\x69\x45\x45\x90\x27\x07\x59\xa0\xf6\x72\x26\xf9\xd1\x40\x6b\xda\x5c\xee\x87\x81\xe9\x0d\x4a\x2b\x45\x7e\x9e\x42\x71\xa8\x67\xec\x97\x01\xe7\x58\xce\xc0\xf1\xf6\x26\xef\x07\xa8\x45\x8d\xc1\x1b\x42\x01\x03\x78\x5f\x07\xa8\xda\xbb\x86\xa8\x50\x68\xa9\xcb\xf4\xec\x25\x71\xc9\x21\xeb\xde\xcd\x31\xde\x9e\x63\xff\x2e\x28\xa7\x62\xa9\xe0\xba\x49\x40\xd9\x08\x2b\xb4\xa7\x32\xf6\xec\xf2\x22\x60\xf4\x55\x4e\x53\x74\x6f\x21\x93\x37\x06\x57\x0d\xc1\x8a\xb6\x18\xef\xcd\xd9\x63\xbf\x9c\xab\x9e\x3e\xfd\x7a\xab\xca\xdb\x7e\xc3\x57\x78\xc2\x7b\xb4\x7a\x02\xff\xf3\xe1\x6c\xfc\x0f\x31\xfe\xe3\xe3\x51\xfc\xcf\xd3\xf1\x77\xff\x3b\x9a\x7c\xfc\xaa\xf7\xeb\xc7\xe3\x9f\xfe\xff\xc0\x4c\x9b\xc1\xfc\x80\xf9\xc4\x24\x92\x70\x62\xd2\xe8\x28\xbd\x52\x79\x6b\x1b\x1c\xc1\x0b\xa1\x1c\x8e\xe0\x9d\xe6\xd4\xf0\x27\x85\xb6\xfd\x86\x9a\xb2\xf2\x01\xad\x3a\x74\x53\x1e\xbb\xf0\x96\xb6\xf7\x89\xdb\xdd\x56\xbe\xee\x27\xa4\x44\x35\xf4\x22\x4d\xef\xcd\x2d\x3f\xd2\x24\x47\x32\x59\x44\xb8\x59\x6e\xaa\x93\xde\x9b\x5c\x82\xd6\x2f\x85\x5e\x40\x17\xd6\x02\x28\x5d\xb5\x74\xe7\x29\x36\x89\xdc\x1a\xe7\xda\x47\xc5\x0e\x94\xbc\x41\x38\xeb\xea\x46\x0a\x96\x53\xcc\x05\x63\x71\x3b\x95\xde\x8a\x40\xfa\x26\x5c\xd9\x31\x4a\xb3\x46\xc1\x11\x95\xab\x19\x3f\x24\x5b\x8b\xae\xc7\x91\xbd\x9d\x4a\x25\xfd\x22\x94\xd2\xb9\xd1\x33\x25\x63\x09\x50\xd5\xc6\x7a\xa1\x7d\xe4\x19\xb1\xc4\x7b\x90\xdd\xd5\xb7\x74\x70\x54\x68\x77\x7a\xfa\xf5\x37\x57\xcd\xb4\x30\x95\x90\xfa\x45\xe5\x4f\x8e\x7f\x3a\xfa\xdc\x08\xc5\xb7\xbc\xaf\x44\x85\x2f\x2a\x7f\xfc\xe5\xd2\xe2\xe9\xb7\x7b\x78\xd1\xd1\x87\xe0\x2b\x1f\x8f\x3e\x8c\xe3\xff\xbe\x4a\x4d\xc7\x3f\x1d\x5d\x67\x5b\xbf\x1f\x7f\x45\x67\xe8\x79\xe0\xc7\x0f\xe3\xce\xfd\xb2\x8f\x5f\x1d\xff\xd4\xfb\x76\xbc\xc9\x19\xef\xc7\xdd\x53\x91\x31\x55\x01\xe3\x4a\xd4\xe3\x1b\x5c\x0c\x38\xe7\x20\x1c\x5d\x9f\x28\x48\xac\x12\xf5\xa6\xea\x3b\xbc\xad\x7d\x83\xfc\x9e\x33\xdf\x68\xe4\x7f\xf2\x06\x46\x8b\x01\x48\x36\xee\x5e\x60\x3d\x82\x75\xa2\xbc\x13\x98\xb6\x6d\x70\x7a\x0f\x6b\xd9\x0f\x3f\xea\x2d\xef\x17\x77\x2e\xd2\x9e\xf3\xd1\x33\x24\xff\x1e\xf8\xd3\x8f\xbd\xe7\x69\xe4\x60\xa5\xb5\xcc\x61\x5e\x3c\x0b\xd0\x97\x43\x0f\xc3\xb9\xb9\xa1\x3a\xaf\xd1\xf2\x73\x83\x70\xf1\x2c\xc6\xa3\x11\x48\x9d\xab\xa6\x20\xa4\xf0\xee\xdd\xc5\x33\xaa\xdf\x7f\x8e\xe1\xe6\x0e\xa1\x30\xfa\xd0\xc3\xeb\x57\xbf\xfd\x37\x93\x01\xdc\x63\x14\x12\x7a\xb8\x8f\x12\x4a\x86\xbf\x1a\x49\x09\x18\x7e\xc6\xf0\x4e\x8e\x57\xce\x45\xdd\xf2\x27\x1c\xee\xf8\x85\x95\xaa\x09\x40\xdc\x20\xb8\xc6\xc6\xdd\xd1\xc4\xe1\xc6\x97\x64\x0d\xf1\x3e\xb8\x44\xcf\x46\xae\xf8\xaf\x1f\x1e\x23\xb4\xf8\x1e\x5f\x1a\x7d\x45\x28\xf0\x2f\xf0\x0f\x32\xe4\xd7\x11\xb3\xf2\x1a\x8f\x70\x86\x2d\x7f\x84\xb0\xf3\x84\x10\x9d\xe9\x3c\x9c\xf4\x2f\xf7\xa4\xb5\xf3\x3e\x6a\xc5\xc0\x67\xf2\xcd\xe6\x9b\x1d\xfc\xf3\xda\x33\xae\xe5\xd2\x79\xe5\x6f\xc1\x98\x5b\x6d\x2f\x47\xe7\xc2\xc1\x14\x51\x33\x9d\x1b\xd8\x3f\xd4\xd1\xea\xb0\x23\x62\x9b\x7a\xec\xcd\xb8\xd8\xac\xbc\x1d\x92\xdb\x2d\xb5\x2d\x95\xeb\xd2\xd9\xce\x1e\x5c\xa8\xde\xcd\x17\x9b\x64\xe0\x02\x9d\xc9\x0f\x87\x12\x06\x79\xe8\xc1\x86\x0b\x93\x15\x56\x97\x2b\x8b\x48\x6a\xc4\x3a\x63\x7d\x4b\x54\x3d\x2e\x31\x1b\xde\xf0\x6d\xde\x32\xb3\xf7\xf0\x3d\x06\x35\x5f\xa1\xbd\x95\x8f\x4a\x7e\xbb\x1c\x33\x0f\xef\x4c\xce\xfe\x7a\xb7\x22\xe8\xf5\xe8\x45\x98\xfa\xcb\xcd\x8e\xeb\x9b\xad\xef\xdf\x59\x82\xdb\x5e\xf9\x3f\x64\x8e\x87\x26\xcb\x10\x4d\x26\xfc\x17\x17\xa9\xc9\x1b\xcb\x57\xee\xfd\xb6\x66\xda\x02\xe5\x6e\xf6\x58\x03\xc1\x3f\xff\xf5\xe4\xff\x02\x00\x00\xff\xff\x4a\xcc\x94\x67\x43\x3e\x00\x00")
+var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfb\x73\xdc\x36\x92\xff\xef\xfe\x2b\xba\xf4\xfd\x56\x49\xca\xcd\x50\x76\xb2\x95\xdb\xd5\xe6\x51\x5a\x39\xce\xa9\x12\xdb\x2a\xcb\xc9\xd6\xad\xe5\x3b\x63\xc8\x1e\x0e\x22\x12\x60\x00\x50\xf2\x24\x95\xff\xfd\xaa\x1b\x00\xc9\x79\x3f\x64\xc7\x76\x2d\xf9\x8b\x35\x24\x9e\x8d\x46\xf7\xa7\x1f\x80\x45\x25\x7f\x46\x63\xa5\x56\xa7\x20\x2a\x89\x6f\x1d\x2a\xfa\x65\x93\x9b\xbf\xda\x44\xea\x93\xdb\x47\x0f\x6e\xa4\xca\x4e\xe1\xbc\xb6\x4e\x97\x2f\xd0\xea\xda\xa4\xf8\x18\xc7\x52\x49\x27\xb5\x7a\x50\xa2\x13\x99\x70\xe2\xf4\x01\x80\x50\x4a\x3b\x41\xaf\x2d\xfd\x04\x48\xb5\x72\x46\x17\x05\x9a\x61\x8e\x2a\xb9\xa9\x47\x38\xaa\x65\x91\xa1\xe1\xc6\x63\xd7\xb7\x0f\x93\xbf\x25\x0f\x1f\x00\xa4\x06\xb9\xfa\x4b\x59\xa2\x75\xa2\xac\x4e\x41\xd5\x45\xf1\x00\x40\x89\x12\x4f\x21\x15\x4e\x14\x3a\xf7\x83\xb0\x89\xae\xd0\x08\xa7\x8d\x4d\x52\x6d\x50\xd3\x3f\xe5\x03\x5b\x61\x4a\xbd\xe7\x46\xd7\xd5\x29\x2c\x2d\xe3\xdb\x8b\x83\x14\x0e\x73\x6d\x64\xfc\x0d\x30\x04\x5d\x94\xfc\x77\x98\xbc\xef\xf6\x8a\xbb\xe5\xf7\x85\xb4\xee\x87\xc5\x6f\x3f\x4a\xeb\xf8\x7b\x55\xd4\x46\x14\xf3\x03\xe6\x4f\x76\xa2\x8d\x7b\xd6\x76\x4f\xdd\xa5\xc2\x59\x93\xfa\xcf\x52\xe5\x75\x21\xcc\x5c\xdd\x07\x00\x36\xd5\x15\x9e\x02\x57\xad\x44\x8a\xd9\x03\x80\x40\xc2\xd0\xd4\x10\x44\x96\xf1\xb2\x88\xe2\xd2\x48\xe5\xd0\x9c\xeb\xa2\x2e\x55\xd3\x15\x95\xc9\xd0\xa6\x46\x56\x8e\x49\xff\x72\x82\x50\x19\x74\x6e\xca\x24\x01\x3d\x06\x37\xc1\xd8\x77\x53\x0b\xe0\x17\xab\xd5\xa5\x70\x93\x53\x48\x88\xc2\x49\x26\x6d\x55\x88\x29\x8d\xa6\x53\xca\x2f\xd3\x63\xff\xad\xf3\xde\x4d\x69\xe8\xd6\x19\xa9\xf2\x75\x43\xa1\x72\xdb\x8f\xc1\x93\xe6\xe5\xb4\x5a\x1c\xc2\xdc\xcb\x6d\xfb\xaf\xea\x51\x21\xed\x04\xcd\xf6\x83\x68\xaa\x2c\x8c\xe1\x72\xc9\x97\x15\x03\xe9\x34\x1a\x37\x54\xb2\xb0\x19\x16\x3a\x38\xcb\x17\xe7\x98\x09\x17\x5f\xfa\x42\xb7\x8f\x44\x51\x4d\xc4\xa3\xf0\xd2\xa6\x13\x2c\x45\xcb\x0f\xba\x42\x75\x76\x79\xf1\xf3\x17\x57\x73\x1f\x60\x96\x3a\x33\x7c\x0e\xd2\x82\x00\x83\x95\xb6\xd2\x69\x33\x25\x6a\x9d\x5f\xfd\x6c\x07\x70\xfe\xe2\xb1\x1d\x80\x50\x59\xb3\xf1\xa0\x12\xe9\x8d\xc8\xd1\x26\x0b\x63\xd5\xa3\x5f\x30\x75\x9d\xd7\x06\x7f\xad\xa5\xc1\xac\x3b\x0a\x22\x4f\xa4\xc9\xdc\x6b\xa2\x7f\xe7\x55\x65\xa8\x4f\xd7\xd9\xc8\xfe\xe9\x48\xb9\x99\xf7\x73\x33\x3c\x24\x32\xf8\x72\x90\x91\x80\x43\xcb\x2c\x10\xf6\x18\x66\x81\x76\x9e\x35\xa4\xa5\xf9\x1b\xb4\xa8\xbc\xc8\xa3\xd7\x42\x85\x39\x25\x70\x85\x86\x2a\xd2\x76\xaf\x8b\x8c\x24\xe1\x2d\x1a\x07\x06\x53\x9d\x2b\xf9\x5b\xd3\x9a\x05\xa7\xb9\x9b\x42\x38\xb4\x0e\x78\xd7\x2a\x51\xc0\xad\x28\x6a\xf4\xa4\x2c\xc5\x14\x0c\x52\xbb\x50\xab\x4e\x0b\x5c\xc4\x26\xf0\x54\x1b\x04\xa9\xc6\xfa\x14\x26\xce\x55\xf6\xf4\xe4\x24\x97\x2e\xca\xf0\x54\x97\x65\xad\xa4\x9b\x9e\xb0\x38\x96\xa3\x9a\xc4\xe1\x49\x86\xb7\x58\x9c\x58\x99\x0f\x85\x49\x27\xd2\x61\xea\x6a\x83\x27\xa2\x92\x43\x1e\xac\x62\x39\x9e\x94\xd9\xff\x33\x41\xea\xdb\xc3\x39\xf2\x2d\x65\x66\x88\x62\x73\x2d\xad\x49\x78\x7a\x2e\xf2\xd5\xfd\x5c\x5a\x92\xd2\x2b\xa2\xca\x8b\xef\xae\x5e\x42\x1c\x80\x27\xbb\xa7\x70\x5b\xd4\xb6\xc4\x26\x42\x49\x35\x46\xe3\x4b\x8e\x8d\x2e\xb9\x15\x54\x59\xa5\xa5\x72\x7e\x4b\x17\x12\x95\x03\x5b\x8f\x4a\xe9\x2c\xf3\x1c\x5a\x47\xeb\x90\xc0\x39\xab\x30\x18\x21\xd4\x15\xed\xa4\x2c\x81\x0b\x05\xe7\xa2\xc4\xe2\x5c\x58\x7c\xef\xa4\x26\x8a\xda\x21\x91\x6f\x7b\x62\x77\x35\xf0\x62\x85\x85\x3d\x06\x10\x35\xe4\x56\x85\x57\x6d\x4a\xf0\x3b\x70\x99\x04\x86\x35\x7b\x91\x1e\x91\x65\x06\xed\x92\x0f\x0b\x1b\xd2\x17\xf4\x7c\x32\xd1\x96\xd6\x4f\x38\x78\xfe\xe3\x53\x48\x85\x82\xda\x22\x6d\x9e\x54\x2b\x45\x0c\xe1\x34\x08\xd2\x65\x43\x7c\x2b\x2d\x33\x90\xc1\x5c\x5a\x67\xa6\x09\x3c\xd1\xa6\x14\xee\x14\xbe\x8a\xaf\x86\xdc\x9c\x36\x20\xab\x6f\x4e\xbf\xaa\xb4\x71\xdf\xc0\x73\x55\x4c\xa9\xd1\x0c\xee\x26\xa8\xe0\xaa\x99\x1b\x7c\xdd\xf9\xf1\xbd\xa9\xd2\x04\x2e\x72\xa5\x4d\x2c\x49\x5c\x75\x51\x8a\x1c\x61\x2c\xb1\x60\xbe\xb6\xe8\x92\xf9\x15\x5c\xbb\x8a\xe0\xe1\xd2\x58\xe6\x4f\x45\xb5\x91\x34\xe7\xb1\x24\xf5\x45\xdd\x77\x95\x77\xfb\xd1\x69\x66\x65\x9a\x12\xfd\x29\xd2\x1b\x10\xa1\x97\x52\x54\x43\xcb\xdb\xa6\x43\xa6\xed\x28\x70\x1e\x1b\x20\xfa\xb5\xaf\x2f\x82\xe4\x4a\x76\x9d\x76\x77\x66\x3b\xd7\x6d\x61\xc8\x46\xa2\x3d\x5d\xa6\x45\xb6\xe8\x23\x37\x55\x7a\xa9\x33\x3f\xed\x8d\xbd\x7c\xdf\x2d\x0d\xf8\xb6\xd2\x16\x2d\x64\x72\x3c\x46\x43\x72\x47\xdf\xa2\x31\x32\x43\x0b\x63\x6d\x78\xbd\x2a\x9d\xf1\x9e\x6c\xd6\x6f\x46\xd5\x5e\xea\x6c\xdb\x85\xa1\xae\x59\x61\x78\x66\x0c\x6c\xb8\x72\xba\x4b\x77\x3b\x6c\xd8\xbc\xf4\x88\x31\xc3\xff\xe9\xf2\xaf\x73\xf4\x38\x0b\x85\x23\xa7\x06\x44\x15\x44\xc7\xa1\xa5\xe9\x1f\xda\xa6\xcd\x65\xc3\xdd\x62\xc8\xdb\x0c\x9b\x1e\xa5\x33\x3c\xdb\x30\xfc\x85\x29\x3c\xe6\x1f\x23\xb4\x5c\xbd\x19\x2a\x6b\xf0\xac\x2e\x58\xd4\xd4\xc5\xec\x8a\xae\x9a\xc7\x96\x73\xd9\x76\x3e\xbe\x1c\x8e\xd1\x18\xcc\x1e\xd7\xc4\xbf\x57\xcd\xa8\x82\x90\xf2\xaf\xbf\x7b\x8b\x69\xbd\x6a\x8f\xad\x9c\x3a\x81\xe2\x30\x4d\x34\x70\x27\x8b\x22\x74\x47\x02\x25\x7e\xa0\xf9\x32\x8e\x21\xf2\x58\x2f\xa4\xad\x70\xd2\x8e\xa7\x4c\x8e\x86\x60\xf8\x96\x74\x36\x5b\x2c\xcc\xf1\x72\x2c\x31\x83\xd1\x34\xa8\x6b\x12\x9e\x03\x18\xd5\x0e\xa4\x63\x5d\x9e\x4e\xb4\xb6\x08\xc2\xd3\x9d\xdb\xbd\x95\x9a\x91\x12\x68\x85\x24\x7f\x4a\x52\xc8\x61\xe3\x74\x9a\x4f\x78\xe4\x6d\x35\x69\xa1\x24\x89\xdf\xd0\x2a\xb2\x23\x35\x73\x27\xdd\x84\x7f\xe4\x04\xb9\x09\x85\xd9\xba\xa4\x46\xef\x50\xe6\x13\x67\x07\x20\x13\x4c\x78\x75\x51\xa4\x93\x4e\xb3\x25\xa2\xb3\x20\x8a\x22\x0e\xa1\xcb\x12\x5e\x6f\x96\x04\x51\xe0\xa8\xc1\x30\x01\x6f\x0c\x1a\xbd\x3a\xbf\x6a\x4b\xc9\x35\x00\x74\x69\x72\x3c\x80\x54\x97\x55\xed\x88\x26\x34\xc6\xd1\x14\xa4\x23\x9c\xed\xf1\x92\xd1\x75\xee\x67\x82\x45\xe8\x38\x82\x55\xaf\x99\x48\x38\x90\x8d\xa8\x72\x38\xf0\x93\x3b\x88\xf8\x93\x9a\x93\x7e\x12\x3c\xbf\x52\xb8\x74\x12\x20\x70\xaa\x8d\x41\x5b\x69\xc5\x35\xf9\xcb\x77\xed\xd8\xfe\xde\x54\x3a\xb2\xc7\x2d\x31\x27\x32\x9f\x44\x5a\x0a\x83\xfc\x6e\x76\x0d\xd6\xed\x91\x76\x9f\x08\x63\x66\x6c\xc9\x65\x8f\x74\x58\x6e\xd8\x25\x0b\xac\x7d\xa6\x00\xcb\xca\x4d\x3b\x3c\xd1\x59\x3d\x87\xa6\x6c\x68\xc0\x0b\xcc\xdb\xd5\xfa\xf9\xc9\xb2\x2a\x64\x2a\x5d\xe0\x10\x78\x08\x47\xcc\x22\xd2\x91\x28\x03\xa5\x87\xba\x3a\x4e\xe0\x8c\xdd\x17\x5b\x74\xa0\x74\xd3\x7e\x68\x88\x3a\xb5\xba\x6d\x6b\xe3\xdc\xb6\x14\x2a\xfe\x59\x8d\xe9\x16\x9f\x61\x18\x3f\xaa\x74\x1e\xe5\x2d\x2f\xee\x69\xb2\xb1\xe8\xb6\xe2\x2d\x96\x8e\x63\xd8\xa6\xf4\xfc\x52\x7b\x96\xb6\x58\x60\x4a\x26\x29\xd1\x7e\x00\xc2\x5a\x9d\x4a\x42\xf9\x2d\xd3\xce\x72\xba\x9f\xc9\x66\xda\xc3\xae\xf4\x87\x9d\xe7\x4f\xcf\xfc\xc6\xdb\xb6\xde\x02\x35\x0a\x49\xe0\x77\x3c\x47\x95\x19\x81\x35\x9a\xf2\xd7\x43\x0b\x85\x18\x61\x61\xb7\x23\x02\xec\xb4\x6b\xdb\x67\xcb\xfd\xbb\x72\x42\x2b\x27\x12\x6c\xcc\x66\xe1\x49\x68\x93\x6d\x26\xa4\xb2\xc1\x7e\x1e\x80\x80\x1b\x9c\x7a\x53\x9b\x2c\xf8\xe8\xb8\xe0\xc2\x06\xbd\xba\x21\xe6\xb8\xc1\x29\x17\x0a\x76\xf7\x0e\xc3\xdd\x99\x39\xfc\xb3\xcb\x36\x6d\x9f\x21\x0d\x74\xc7\x1a\x71\xd2\x3b\x54\xdb\x9d\x7f\xfd\x73\x83\x6b\x91\xd7\xb2\x67\x01\x92\x30\x4f\xf2\x7a\xf0\x22\xb1\xfe\x8a\x6b\x2c\xaa\xaa\x90\xc8\xf6\xfc\x8e\xdd\xac\xb5\x02\xd6\x3d\x91\x7a\xf7\x9a\xd7\x8b\xc6\xa1\xe1\x19\xf2\xd0\x7a\xe6\xa3\x9d\x3e\x91\x95\xb7\x6f\x2d\xf2\xc6\x8d\x9e\x9f\x9f\x45\x21\x5b\x57\x9b\x65\x3d\x7b\xa1\x06\xf0\x4c\x3b\xfa\xe7\x3b\xb2\x84\xed\x00\x1e\x6b\xb4\xcf\xb4\xe3\x9f\x09\x7c\xef\x3c\xaf\xff\xb8\xa5\x64\x7b\x07\x04\xf2\xe3\xbd\x17\x79\xce\x94\x97\x29\x34\xfd\xae\xcf\xc8\x26\x70\xe1\x61\x4b\xb3\x71\xa5\x85\x0b\x45\xe0\x30\x90\x81\xbd\x78\x5c\x36\x34\x51\xd6\x96\x9d\x3c\x4a\xab\x21\x63\x80\xa5\x6d\x78\xea\x51\x3b\x5d\xfa\xad\x69\x6e\x75\x53\xdf\xb3\xaf\xe1\xc7\x95\x95\x27\xe2\x96\x21\x9d\x54\x79\xd1\x80\xb7\x01\xdc\x4d\x64\x3a\xf1\xa8\x7b\x84\xde\x35\x58\x19\x24\x85\x25\x2c\x89\x2a\x7a\x93\xa3\x21\xb0\x2b\x63\x7b\xde\x31\x59\x88\x14\x33\xc8\x18\x5a\x7a\x27\x9b\x70\x98\xcb\x14\x4a\x34\x39\x42\x45\x9a\x64\xbf\xd5\xdf\x4d\xb0\xfb\x67\x67\xf1\xde\xed\x70\x27\x76\x63\x15\xf9\x84\xb0\xee\x9f\xa4\x1d\x19\x57\xf7\xda\xb1\xd7\x8e\x73\x4f\xaf\x1d\x9b\xa7\xd7\x8e\x1b\x9e\x5e\x3b\xf6\xda\xf1\xbd\x6b\x47\x6f\xcb\xee\x61\x3c\xff\xd3\xbb\x38\xe6\xad\x65\xd6\xb4\x31\x4c\x37\x6b\x36\x93\xbe\xb9\x0a\x02\xe7\x25\x9b\xda\xd2\x07\x49\x8c\x50\x39\xc2\xa3\xe1\xa3\x87\x0f\x77\x31\xaa\xc3\x42\x6e\x55\x63\x1c\x22\x3d\x52\xb9\x2f\x3e\x5f\x5b\x63\x95\xff\xed\x1d\x78\x4d\x03\x8f\x37\x8e\xbc\x19\xec\xb0\xc2\xf1\xc9\xd2\x49\x69\x07\x25\x3a\x10\x6e\xc6\x55\x24\x4b\x1c\x34\xa1\x02\x66\xf8\x10\xa5\x8c\x1e\xd8\x0c\xb4\x0a\x7e\x3c\x22\x7e\xb2\xdf\x08\x52\x14\x3e\xa4\x36\xc2\x66\x14\xba\xa4\x5e\xa5\x72\x71\xbb\xd0\x10\x30\x52\x05\x8e\x30\xc9\x13\xc8\x6a\xae\x26\x54\x08\x9b\x1e\xfb\xd1\xda\xa9\x75\x58\xb2\x27\x57\x1b\xfe\x87\x86\xed\xcc\x94\x0a\xe3\x2d\x2a\x57\x8b\xa2\x98\x02\xde\xca\xd4\x35\xf3\xe3\xa8\xad\x74\xde\xd9\xbe\x9d\x8b\x70\x2b\xe8\xb0\x3d\x5c\x18\x2e\x70\xb0\xdd\x50\x67\x17\x6d\xbf\xd0\xf6\x36\x7b\x72\x4e\x17\xfa\x99\x24\x2b\xc1\xaa\xa3\x76\xbd\x0f\x9c\xff\x64\xe6\x7a\xfe\x62\xb3\xcb\x15\x76\x96\x64\x3b\x48\xaf\x79\x58\x5a\x17\x05\x31\x86\xf7\xc2\x2e\x4e\x60\x89\x77\xd4\x4f\x69\x86\x99\xbd\xe3\xdd\xbb\x98\xcf\x9e\x3d\x26\xaa\x50\x99\x97\xba\xd2\x85\xce\xa7\x5d\x4a\xfb\xf4\x22\x59\x56\xd1\x39\x2e\xc0\xd6\xa3\x00\x1a\x88\xfd\x9e\xcd\x2d\x4d\xef\xf9\xeb\x3d\x7f\xbd\x6d\xb3\xf0\xf4\xb6\x4d\xf3\xf4\xb6\xcd\x86\xa7\xb7\x6d\x7a\xdb\xa6\xf7\xfc\x41\xaf\x1d\xd7\xd0\xa4\xd7\x8e\xd0\x6b\xc7\x95\xf3\xea\xb5\xe3\x5a\xf2\xf4\xda\xb1\xd7\x8e\xcb\x9e\x4a\x67\xf7\x48\x74\xac\x74\xb6\x26\xcf\xd1\x7b\x7d\x52\x3d\x2c\x74\x2a\x5c\xc8\xcb\xa7\x2a\xc1\xcf\x67\x45\xe9\x1d\x51\x03\xf8\x4d\x2b\xf4\xc9\x6b\xb4\x36\xec\x4e\xd2\x6e\x82\x86\x8a\x1f\xd9\xe3\xb5\x89\x4d\x7d\x9e\x64\x9f\x27\xf9\xd1\xe7\x49\x4e\x84\xf5\xeb\xea\x85\xd2\xea\xb4\xc9\xce\x86\x7c\x89\xa6\xfc\x44\xb3\x26\x89\x5d\xc2\x72\xf3\x89\xa7\x76\x49\xfd\xcc\xb3\x10\x2f\xc0\xec\x72\x76\xbe\x01\x2f\xf3\xa4\x44\x96\x61\x06\x15\x9a\xa1\x67\x11\x0d\x63\xa9\xb2\x25\x73\x8d\xf4\xf9\xa0\xd9\x8f\xb3\xf3\xf8\x80\x29\x90\xb3\x03\xd9\xc3\xe7\xda\x75\x1c\xcf\x48\xf8\x8f\x22\x21\x72\x57\x54\x3f\x04\x17\x9c\xbc\x3f\x6c\x89\xeb\x77\x87\xe6\x0c\xa8\xa3\x4b\x78\x7f\xbb\x92\x61\xf9\xaf\x35\x9a\x29\x9f\xff\x68\x01\x6b\x73\xb6\x2e\xc4\xc8\xa4\x85\x54\x58\xaf\x29\x76\x35\x2d\x77\x34\xa3\xf6\xb3\x53\xf6\xf7\x44\xc3\x3c\x5d\xe6\x9b\xf2\x36\x69\xb4\xc1\x3d\xcd\x96\x1a\xe1\x4b\xa2\x00\xad\xf7\x7f\xa7\xf1\xec\x0b\xdd\xf6\x02\x6e\x4b\x99\xe2\x23\x36\xce\x61\x7f\x03\x1d\xf6\x36\xd2\x61\x2f\x43\x1d\xf6\x35\xd6\xe1\x1e\x06\x3b\xec\x67\xb4\xc3\x3c\x2b\xd0\x0a\x05\x94\xf5\x7e\xec\x77\xb8\x8f\x89\x0a\xf7\xb0\xe3\x61\x7e\xaa\x0d\x9b\x9a\xf7\x65\xd4\x33\xaf\xcf\xd8\xf5\x7f\x36\xb1\xf6\xb3\xe9\x61\x9e\x54\xc1\x18\x96\x6c\xd0\x7e\x22\x16\xfe\x9f\x62\x6e\xc3\xbd\x4c\x6e\xd8\xdf\xec\x86\xfd\x39\x83\x55\xdd\x8f\x1c\x4e\xbd\xaf\xc2\xf4\xad\x78\x15\xc1\x67\x70\xc7\xf0\x3b\x69\x02\x5e\x97\x3f\xa0\x12\xd2\x58\xc2\x77\xc1\x67\xd2\xfd\x16\xac\xf3\x6e\x33\xa5\x3f\x42\x4c\xa2\xfa\x56\x14\xa4\x7b\x7c\x1e\x47\xb0\x8b\xa8\xf5\x79\x35\x3d\x80\xbb\x09\x59\x9b\x24\xa5\x9a\xf3\xce\x07\x37\x38\x3d\x18\x2c\x30\xd2\xc1\x85\x3a\xf0\x3a\x6a\x81\x75\x1a\x85\xa6\x55\x31\x85\x03\xfe\x76\xf0\xae\x35\xfb\x1e\x8a\xab\x7b\x85\xca\xbe\x7a\x61\x0f\x2e\x51\xf1\x5a\x97\x77\x0f\x36\xbd\x16\xf1\x81\x8d\xd8\x8b\x6d\x15\x0c\xa7\x5a\x74\x94\x4b\x93\x35\xc2\x3c\xc6\xef\xb3\x68\xfc\xd6\x2a\xdc\x74\x11\xcf\x9c\x87\xc6\xbc\x92\x5a\x4c\x69\x0a\x0b\xaf\x15\x5a\x06\x76\xd8\xb8\x88\x3a\x95\xb9\x6c\xe2\xd3\x41\x5a\x6d\xa7\xb2\xf9\x04\x91\xb6\x06\x63\xc4\x12\x85\xb2\x70\x10\x7d\x4f\x87\xb6\x2d\x71\x90\xb4\xa7\xfb\x9a\x16\x8f\x7e\xff\xe3\x78\xe6\x44\x5f\xdb\x60\x8f\xb4\x7b\xa4\xdd\x23\xed\x1d\x6a\xf5\x48\x7b\xf5\xd3\x23\xed\x1d\x9e\x1e\x69\xf7\x48\x7b\x5d\xc7\x3d\xd2\xee\x91\xf6\xe6\xce\xf7\x43\xda\xfb\xe6\x09\x75\x71\x6f\x08\xce\xf9\x8b\xcc\x84\x93\x69\x9b\x43\x14\x4b\xf9\xbf\xde\x2d\xde\xee\x62\xe9\xe5\x68\xbb\x8b\xc8\x17\x6c\x8b\x64\x03\xb4\x6e\xc0\xf7\x42\xcd\xf5\xa8\xfb\xe3\xca\x85\xda\x83\x37\x3a\x01\x85\x3d\x99\xe3\x65\x0c\x85\x87\x8b\xff\x46\xd8\xc6\xc9\x33\x38\x8a\x11\x97\x63\x22\xbe\xd2\x6e\xf6\xa3\x72\x72\xd8\x96\x68\x62\x30\x1c\x5e\x9c\x39\x6f\x33\x13\x96\x68\xa2\xee\x4d\xa4\xb8\x5d\x4f\x12\x21\x68\x66\xc6\x20\x6d\xb8\xde\x90\xb3\x25\x4c\xad\x14\xb5\xaa\x55\x0c\x1f\x7b\x99\xe3\xef\xe3\x0b\x9c\xe7\xc1\x12\x8f\x87\x11\x53\x4b\xa5\x4e\xbc\x53\x38\x7f\x05\x62\x48\xe5\xd7\x2a\x44\x44\xe9\x4d\x8c\xfa\x46\xa6\xe4\x19\xc9\xa6\xf7\x04\xbe\x63\x3e\xec\x36\x2c\x2d\xd3\x47\x14\x85\xbe\xdb\x45\x24\xfd\x59\xc7\xa2\xee\x76\x3e\x16\x35\x17\xbf\xeb\x4f\x45\xfd\x9b\x9c\x8a\xe2\x8f\x7e\x0b\xbd\xf3\xe3\x51\xf0\xcf\x70\x01\xa1\x41\x26\x55\x59\x17\x4e\x56\x6d\xae\x94\xf5\x5d\x15\x1e\x65\x8e\x43\xe6\xc9\x2c\x5f\x52\x6f\x22\x9d\xcc\xf3\x27\xb7\xc7\xb9\x55\x96\x37\x6d\xc8\xee\x10\x45\x11\xce\x14\x45\x48\xea\x53\x58\xe4\x87\xce\x4c\x78\x1c\xee\x6c\x6d\xac\x19\x16\x32\x47\x24\x0b\x0b\x5a\x50\x92\x6a\x6b\x84\xa8\x37\x8a\x6e\x31\xaa\xde\x5c\xde\xa2\x6a\x25\xe9\x91\x3d\x3e\x8e\x3a\xfc\x9d\x4a\xf8\xf7\x22\xa1\xbf\xea\x48\xd2\x6f\xb6\x91\xd1\x3c\xa1\x46\x4a\xb7\xe4\x6b\x65\xf4\x87\x4c\xc1\xd8\x25\xce\xbf\x9b\x8f\x61\x8f\xf8\xfe\x9f\x18\xdb\xff\x74\x4e\x96\x7d\x60\x0f\xe3\x87\xc8\xad\xff\xe8\xbd\x8a\x7d\x72\x7d\xfb\xdc\x37\xb9\xfe\xbd\x7b\x0e\x3f\x6c\x8e\xfd\x27\xe0\x2d\xfc\x90\x39\xf6\xbd\x87\x70\xed\xa2\x7c\x6c\xa9\xef\xb3\xcf\x5e\x1e\xc1\xde\x1b\xb8\xb7\x16\xde\x51\xe1\xdc\xd7\x0b\xb8\x23\x47\xec\x19\x67\xef\x63\xec\x7f\x4e\x8c\xbd\x47\xbc\x5b\x3e\x3d\xe2\x5d\x49\x94\x1e\xf1\x42\x8f\x78\x37\x4d\xaf\x47\xbc\x6b\xc9\xd3\x23\xde\xb5\x8b\xd2\x23\xde\x1e\xf1\xc2\xa7\x86\x78\xf7\xb9\xa5\xab\x8f\x75\xdf\x2b\xd6\xbd\xab\xb4\xd8\x49\x46\xec\xc8\x07\x3b\xc7\xb6\xfb\xb8\xf6\xc7\x12\xd7\xde\xfa\xc0\xbf\x72\xf2\xbe\x87\xfe\xbb\x6b\xb5\xea\xe4\xbf\xb8\xd5\x32\x83\xaa\x76\xe1\x3c\x75\x7f\xfa\xff\x5d\x9c\xfe\x9f\xa1\x7c\x7f\x05\xc0\x56\x57\x00\xac\xa2\x59\x7f\x0f\x40\x7f\x0f\xc0\x3b\x0e\x42\xf7\xf7\x00\xf4\xf7\x00\xf4\xf7\x00\xc4\xa7\x3f\x9d\x04\xfd\xe9\xa4\xad\x9e\xfe\x74\xd2\xea\xa7\x3f\x9d\xf4\xd1\x7a\x5f\xa1\x3f\x9d\xf4\x71\x7b\x62\xa1\x3f\x9d\xd4\x7b\x67\xb7\x5c\xa8\x4f\xf0\x74\x52\x7f\x0f\xc0\xc7\x9a\xa3\x00\x3d\xd2\xee\x91\x76\x8f\xb4\x7b\xa4\xbd\xfe\xe9\x91\xf6\x0e\x4f\x8f\xb4\x7b\xa4\xbd\xae\xe3\x1e\x69\xf7\x48\x7b\x73\xe7\xfd\x3d\x00\x9f\x50\x6e\x04\xf4\xf7\x00\xf4\xf9\x12\xfd\x3d\x00\xff\xbe\xf7\x00\xcc\xc4\xee\x3f\xdc\x65\x00\xbb\x0f\xa3\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\x20\x3e\xfd\x8d\x00\xfe\xf9\x98\x7c\x8d\xfd\xf9\xa8\x95\x44\xe9\xcf\x47\x41\x7f\x3e\x6a\xd3\xf4\x3e\x01\xbf\x61\x7f\x3e\xea\x23\xf4\x15\xf6\xe7\xa3\x7a\xbf\xe0\xfc\xe2\x7c\x22\xe7\xa3\xfa\x1b\x01\x3e\xc6\x68\x7b\x8f\x78\xb7\x7c\x7a\xc4\xbb\x92\x28\x3d\xe2\x85\x1e\xf1\x6e\x9a\x5e\x8f\x78\xd7\x92\xa7\x47\xbc\x6b\x17\xa5\x47\xbc\x3d\xe2\x85\x4f\x0d\xf1\xf6\x37\x02\xf4\x37\x02\xf4\x37\x02\x7c\x8a\x11\xee\x8d\x2b\x4d\x23\xdb\x64\xd0\xce\x2c\xe7\xb3\x4e\x85\x39\xf0\x1e\x4e\x34\x07\xdd\xea\x4c\x8d\x7c\xc0\x3b\xc6\x1f\xf9\xd8\xae\x6b\xe9\x9a\xc0\xd5\x92\x9a\x4c\xbe\x50\xe2\xd0\x7a\x42\xdb\xf9\x76\xe6\xe2\xb5\x9e\xd6\xdc\xe6\x8a\x29\x6c\x21\x6e\x77\x13\xae\x1b\x09\x5b\x19\xa9\x8d\x74\xd3\xf3\x42\x58\xfb\x4c\x94\xb8\x15\x75\x2f\xc6\x2d\xd3\x0e\x40\xaa\x4c\xa6\x8d\x75\xe3\x05\x49\x6c\x97\x01\x10\xf1\x43\xa7\x7c\xa4\x50\x2c\xe3\x03\xdc\x23\x24\xf6\x16\x75\xe1\x68\x8b\xfd\x86\x46\x87\x03\xe9\x06\x3d\x4f\xc5\xcf\xeb\x89\xb7\x66\xae\x16\xd3\x9a\xe7\xaa\x95\xc3\xb7\xee\x5c\xab\xb1\xcc\xb7\x9a\xef\xc1\xd5\xb2\xaa\x90\x0a\x45\xc3\xe6\x0b\x09\xc6\xf0\xa6\xc0\x5c\xa4\xd3\x37\x34\xfc\x37\x06\x69\x20\xb4\x67\xde\x78\xa5\x70\x2e\x9c\x28\x74\x7e\xc5\x11\xb3\xc3\x70\xc3\x84\x05\x94\x7c\x81\x84\x54\xbf\xf8\x0d\xd6\xc8\x0e\xc3\x79\x18\x95\xce\x12\xa2\x5c\x32\x37\x76\x96\xea\xcd\xc7\x00\x00\xd0\xbc\xfa\xec\xf5\x42\xc9\x00\x15\x08\x8c\xd0\x96\xec\xf2\xa7\xa9\x15\xc9\xa0\x4b\x9d\x41\x9c\x20\x9c\x65\xa5\x64\x74\x02\x47\x97\x57\x67\xc7\x33\x33\x81\x92\xaf\xc1\xd0\x06\x32\x8d\x56\x1d\x3a\xb6\x1b\xdc\x04\x6d\x8b\x48\x78\xe7\x73\x40\xd0\xef\x16\x8e\x08\xc6\x3e\x89\x60\x0c\x52\x46\xd8\x74\x7e\x75\x06\x6f\x46\xc2\x62\x21\x15\x7a\xda\x55\x46\xde\xca\x02\x73\xea\xb1\xe3\x5f\x81\xf3\xda\x18\x54\xae\x98\xc6\x9b\x0a\x96\xaf\x8a\xb4\x50\xab\x39\x76\x8b\x9c\xd5\x48\xc7\x66\xb1\xa8\xb4\xc5\x2c\x81\x2b\xae\x31\xf5\x50\x3a\x94\xe3\xb5\x71\x13\xa1\x56\x2e\x2e\x18\xb4\xd4\xb0\x54\xbe\x96\xcc\xd8\xb2\x02\x34\x86\x54\x33\x67\x2f\xd4\x96\x05\x75\x91\xa1\x81\xd4\xb3\x01\xc8\x52\xe4\x5e\xca\x33\x91\x58\xe5\x84\x14\x8f\x40\x98\x25\x84\x5f\x3d\xe7\x56\x69\xf1\x8a\xe8\x66\xbc\x09\x5c\x2b\x32\x5a\x04\x8c\x6b\x57\x1b\x84\x5b\x34\xbc\xba\xbc\xe7\xba\xa4\x89\x9b\x30\x36\xd0\xe9\x7e\xd0\x0c\xbb\x14\x32\xb0\x9a\x8d\x7d\x1a\x1c\xd5\xb2\x60\xb4\x22\x9b\xf9\x59\xcf\xc8\xa2\xe9\x4e\x8f\x41\x57\x65\xb8\x26\xa4\xae\x2a\x6d\x5c\xab\xc3\xd2\xee\xde\x08\x3a\x66\x09\x01\x68\x58\x95\xc1\x8a\x70\x6c\x90\xb4\x16\x21\x9d\x08\x95\x13\x7b\x5c\x2b\x78\xaa\x39\xa5\xc3\xe7\x05\x51\xb7\x62\xa4\x6b\xc7\x3c\x16\xf6\xea\x58\xd7\x2a\x03\x12\x2a\xa7\x30\x71\xae\xb2\xa7\x27\x27\x37\xf5\x08\x8d\x42\x87\x36\x91\xfa\x24\xd3\xa9\x3d\x49\xb5\x4a\xb1\x72\xf6\x24\xee\xa6\x93\x4a\x67\xc3\xf8\x63\x28\xe2\x26\x39\x39\x3c\xd8\x57\x1a\x41\xa4\xfc\x29\xf8\xb5\x5a\x51\x0a\x55\xbd\xe6\x52\x84\xe1\xfa\xca\x54\xa0\x25\xe3\xd2\x42\x4e\x17\x7c\x85\xc8\x1a\x4f\xe1\x2c\x50\x6a\xcb\x37\x57\x79\x44\xf6\xb0\x1d\xe9\x76\x68\xbb\x4d\xaf\x17\xda\xeb\x00\xe4\x06\xc8\xb8\x70\x8d\x07\xcb\x36\x02\x73\xed\x40\x19\x00\x38\x27\xf8\x22\x0f\x42\xe3\xfe\x0b\x89\x2b\x35\x05\xe2\x67\x17\x6e\x75\xe9\x5c\x73\xe2\x0c\xe7\x19\x7d\xd5\x58\x7d\x03\x1c\x8f\x31\x75\xdf\x84\xfd\xdc\xd8\x7f\xbc\xb9\xa3\xa5\xf6\x55\xfc\xeb\x9b\xd5\xc8\x67\x2b\xa3\x6a\x3b\xb7\x98\x1f\xd2\x7a\xb8\x3b\x43\xa1\xef\xb8\xc2\x9c\xca\xf6\x14\xf0\x6d\x11\x7d\x78\x5a\x11\xdb\x79\x23\x21\xe0\x1d\x92\x19\x9d\xc2\x36\x48\xb8\x8e\xb4\x0d\xb8\xaf\xb5\x50\x11\x9e\xe9\x90\x70\x87\x03\xb8\xe4\x3b\x50\xda\x37\xac\xc8\x9e\x69\x9f\x7a\xb7\x12\x17\x75\xe9\xb6\xd1\x1e\xd8\xe8\x18\x9c\x21\xc8\x0f\xad\x1b\xd0\xcf\x6c\xc6\x0d\xd8\x72\xf0\x8c\x95\xb7\x8e\x32\x37\x38\x6d\x5d\x47\xc1\xc9\xc8\x96\xd9\xa0\xe5\x92\x08\x3e\xbd\x27\xe8\xef\x21\x77\x46\x97\x23\xa9\x7c\x67\xbe\xe9\xb8\x14\xdc\x7a\x24\xa8\xca\xf8\x27\x77\xf3\x2e\xc8\xb5\x9d\xb7\x71\x86\x66\xcf\x77\xf0\x2d\x36\xde\x8a\xe5\x5e\xc5\x8e\x2b\xf1\xbb\x5f\x6b\x51\x24\xf0\xd8\x4b\x45\x9e\x7d\x78\x15\x0a\x2d\x78\x57\xee\x64\x91\xa5\xc2\x64\xac\x0d\xfc\x1e\x05\xab\xfd\xea\x89\x06\x70\xc4\xdd\xde\xae\x91\xbf\xe3\x07\x2a\x61\x9c\x4c\xeb\x42\xb0\xda\xc2\x5c\x9b\xe9\x3b\xa1\x68\xcb\x34\x57\x98\x6a\x95\x6d\x30\x78\x57\x48\xd7\x50\xb7\x4b\x63\x86\x51\x68\x64\x48\x65\x93\x25\xce\x33\xe9\xd1\xac\x71\xa3\xc7\x71\x57\x37\x5b\x6c\xe0\x51\xcd\x9d\x64\x58\xd6\xf8\x1b\xa4\x05\xe9\x73\x61\x8f\x3b\xe2\xb1\xd9\x15\x09\xfc\x63\x1a\xf5\xd5\x00\xa4\x8b\x56\x9e\x45\x17\x31\x4c\x64\xd9\x40\xec\x76\x43\x8d\xb5\xc1\x5b\x34\x70\x94\x69\xae\xc3\xe9\x9e\xc7\x09\xfc\x8b\x20\x3e\x7b\x27\x30\xf7\x99\x89\x81\xc5\x23\x12\x71\x7c\x29\x17\x5b\xbb\x0f\xe1\xc8\x67\x89\xca\xb2\xc4\x4c\x0a\x87\xc5\xf4\xd8\x07\x0a\x63\x9e\xe9\x36\x4b\xb7\x4d\x72\x71\x27\xa9\xf8\xcb\xbf\xac\x29\xc9\x83\xdd\x61\x65\x7f\x66\x48\x39\x23\x6a\x3c\xca\x9c\x5b\xc2\x46\x07\xe9\x35\xce\xe3\x8e\xb3\xb8\x83\xfd\xa2\x98\x69\x16\xf8\x17\xe2\x03\x01\x06\x73\xe6\x72\xcf\xb9\xf7\xe0\x71\x99\x2e\x4f\x8e\xde\xa0\xd1\xd6\xc7\x9f\x86\x40\xf0\xff\xcb\xbf\x64\xc2\x89\x15\x05\xfc\x9a\x4f\x2b\x5c\xf2\x7d\x93\xa2\x6c\x1b\x5f\xb5\x58\x1b\xb7\x75\xd3\xfd\x5e\x2d\x30\xd4\x5f\x56\x73\xd6\xa4\xa6\x52\x21\x1e\x11\xd7\x7b\x68\x30\x97\xd6\x99\xc6\xc5\x4b\x96\x22\x97\x73\x1a\xa4\xb2\x4e\x28\x27\x59\xb2\x41\x2c\x39\xb4\x68\x6e\xf9\xd6\x3e\x37\x49\xe0\x39\xd9\x5a\x64\xde\xc0\x1d\xa9\x69\x0f\xb0\x5f\x4e\x2b\x84\xaf\x3b\x3f\xbe\x37\x55\xca\xbc\x16\x04\x8d\x67\x2e\x91\x65\x06\xed\xa2\x7c\x58\xc6\x3e\x6b\xe7\x1f\xcd\xfc\x8d\x24\x38\xbc\x8c\x0e\x81\xe0\x03\xb5\x56\xe6\x84\x32\xe3\xa9\x84\xa0\x4e\x66\xd1\xa6\xb7\x0a\xb8\xa2\xfc\x8d\x77\x53\xd9\x28\x01\xe9\x22\xee\x4f\xb5\xb2\x75\x19\x93\x0b\xc8\xea\xa9\x50\x65\xa8\xd2\x29\xa7\xb1\x16\xb7\x68\x12\xf8\xc9\xd2\x4a\xc1\x7f\xc9\x9c\xec\xbe\xd0\x69\x17\x2a\xc5\xec\xe8\xb9\x11\x48\xdb\xb9\xdb\x8d\xd3\x25\x08\x03\xc5\x16\x30\x9b\x2b\x6f\x63\xc8\x66\x7e\x10\x9c\x5c\x1f\x1c\xf7\x7c\x7a\x22\xb8\xdf\x1a\x47\x89\xdf\xf0\x34\xa5\x5c\xfb\x44\xf9\x4a\x5b\x19\xb3\xba\x1b\x39\x3a\x73\x02\x43\x8f\xfd\xf9\x08\xdf\xee\xac\x21\xcc\xb1\xbf\xb9\xc9\xb0\xe1\x56\x2b\x4f\x7c\xec\x7a\x69\xa2\x98\x79\xe8\x9b\x5a\x56\xcf\xc5\x0b\x33\x67\x87\xdc\xca\x74\x23\xd4\x0d\x66\x50\xe0\x5b\x99\xea\xdc\x88\x6a\x22\x53\x3e\x04\x40\xdb\x94\x9d\x64\x9c\xfa\x2f\x4a\x4c\x0e\x57\x32\xda\x2a\x31\x5e\xd5\xa3\x42\xda\x09\x2e\xc5\x32\x6b\x79\xd4\x62\x6a\xd0\x2d\x95\x20\x33\x2c\x7a\xe5\xcb\xb5\x4a\x39\x46\x4e\x43\x03\x21\x33\xc0\xf3\x1c\x6f\x3c\x22\x71\x9a\xd2\x46\xf2\x47\x67\x94\x6b\x2f\x66\x6c\x68\x98\xc0\x05\xab\xd4\x11\x5a\xe6\xf2\x1b\xc4\xca\x73\x1a\xbb\xf0\x6d\xc9\x3e\x15\x2b\x55\x8a\xfe\x28\x83\x3f\x12\x82\x18\xdd\x8c\xce\x48\xf4\x30\x88\x54\xed\xb4\x59\x1b\x54\x6e\x39\xa8\x59\x6f\x77\xad\xb1\xb9\xd6\x93\xb1\x91\x29\x9b\x29\xd9\xca\xa2\xa8\x13\xe9\x6f\x22\x25\x7f\xd9\x75\x05\xfd\xc9\x93\x2b\x1f\x02\xdd\x2c\x6b\x7e\x9a\x29\x1e\x1c\xeb\x16\x26\xfa\x2e\xb4\x34\xbf\x69\x83\xc7\x26\xae\x6d\x26\x6d\x4a\x3b\x1d\x33\x38\xd7\xca\xc6\xe3\x27\x42\xf9\x13\x25\xb7\xa2\xf0\xac\x10\x1b\xae\x74\xc1\x27\x7b\xb2\x3a\x9a\x13\x3e\x4b\x04\xcb\x11\xf2\xb5\x91\x36\x0e\x65\x85\x9a\xdb\xa0\x62\x37\x69\xc1\xa8\x1f\x2e\x75\x51\xac\xd7\x62\x6b\xed\xd2\x6d\xac\xd2\x48\x80\xad\xaf\xec\xbd\x88\x14\x0b\xbe\x38\xe2\xe9\x0c\x1d\x9a\x52\xaa\x00\x8f\x08\xea\x36\x84\x1d\xa1\xbb\x43\x54\x90\x4e\x30\xbd\xb1\x6d\xac\x83\x2f\x70\x9d\x5b\xb5\xe0\x7f\x9a\x95\x58\x0d\x9e\xa2\x55\x61\x43\xc3\x22\x82\x24\x9b\x40\xe1\x5d\xd7\x67\xb5\x44\xdd\x90\x8a\xbe\x15\xb2\x10\xa3\xc2\x1f\xbb\x6a\x7e\x0d\xba\xe3\x90\x51\x9f\x57\x75\x51\xa0\x0f\xe8\xe5\x2f\x2e\xcf\xc1\x19\x31\x1e\xcb\x94\xc3\x39\xd2\x78\xaf\x6f\x50\x6c\x4b\xa7\xb0\xf9\x52\xe1\x25\x3b\xc2\x3a\xe1\xea\x85\x35\x5a\xb3\xc0\xeb\x16\x96\xec\x10\xb9\xd2\x41\x34\x77\x15\xe7\x8c\xb1\x42\xc3\x40\x6f\x6c\xcd\xf8\xbf\x13\x78\xa6\x5d\xb8\x49\xf7\x29\x5a\x52\xbb\x4c\xa0\x17\x28\xac\x56\x1d\xe9\xca\xe8\xd7\xc8\x5c\x2a\x51\x84\x49\x75\xfd\x7b\x8d\xed\x21\xd8\xa5\x5c\xca\xdc\x08\xd7\x08\xc5\x76\xdc\x41\xbb\x04\xbd\xe8\x3d\xa1\x09\x9c\xa9\x29\xaf\xf7\x18\x05\xbd\xa0\x96\x9d\xd1\x59\x9d\x62\x38\x73\x57\xdb\x6e\x23\xef\x54\x8c\xce\x86\x17\xce\x63\x27\x6d\x2c\x3f\x43\x27\x64\x08\x29\x69\x85\x20\x6c\x45\x76\x5c\xe4\x49\xef\x0a\x6f\x09\xcc\xca\xe2\xec\xf2\x02\x5e\x84\x43\x39\x09\x0c\x87\x43\x1f\xd5\xb4\xce\xd4\x29\xeb\x17\xda\x42\x2a\x0b\x9a\xc2\x73\x1f\x4f\x52\x74\xd2\x60\x82\xe7\xc3\x43\xb0\x4a\xb8\x09\x24\x9e\xf0\x49\x87\x14\x00\x4f\x48\xd7\xbc\x15\x65\x45\x7c\x7f\xad\xbc\xf4\x7e\xa2\xf5\x95\x5f\x24\xdf\xe7\xef\x70\x72\x32\xcf\x13\x7a\x44\x10\x35\x38\x10\x99\x35\xc6\x5a\x1f\xda\xd9\x29\x25\x54\xf1\x07\xa5\xef\xd4\xb2\xde\xb9\x2f\x61\xf0\x14\xae\x0f\xce\xe2\xee\xbb\x3e\x18\xc0\xf5\xc1\xa5\xd1\x39\xa7\x57\xa8\xfc\x3a\xe4\x4b\x5c\x1f\x3c\xc6\xdc\x88\x0c\xb3\xeb\x03\x6a\xf6\x3f\x38\x2f\xe6\x29\x9a\x1c\x7f\xc0\xe9\xd7\xdc\x58\xf3\x3a\x6a\x84\xaf\x7d\x0a\x0d\xbd\x27\x15\x4c\x7a\xea\xeb\x52\x54\xcd\x8b\xa7\xa2\x6a\x2a\x9f\xb7\x7c\xf6\xea\x75\x89\x4e\xdc\x3e\x4a\xda\x15\x7d\xf3\x8b\xd5\xea\xf4\xfa\xa0\x1d\xff\x40\x97\xc4\x19\x95\x9b\x5e\x1f\xc0\x4c\xaf\xa7\xd7\x07\xdc\x6f\x7c\x1f\x07\x79\x7a\x7d\x40\x3d\xd1\x6b\xa3\x9d\x1e\xd5\xe3\xd3\xeb\x83\xd1\xd4\xa1\x1d\x3c\x1a\x18\xac\x06\x04\x98\xbe\x6e\x7b\xb8\x3e\x78\x43\x6b\x72\x72\x12\x42\x18\xe1\x92\xe2\x3f\x96\x3b\xab\x37\xca\xfd\x4d\xf9\x83\x43\x28\x84\x75\x2f\x8d\x50\x96\xfb\x7f\x29\xcb\x65\x2a\x0c\x82\x2d\xc7\xfb\x7d\xe5\x77\xc3\x32\x60\xe5\x67\xcf\x0d\x2b\x3f\xaf\xd0\x9e\xdb\x68\xae\xc5\x39\x6c\xe9\x75\x5e\xac\xd8\x26\x16\x12\x9e\x8b\x7e\x9a\x66\x7d\x48\x07\x84\xd2\x18\x0e\xbc\xd2\x16\x0f\xf2\x8d\xd3\x86\x78\xdd\x42\xca\x57\x6b\xe0\xdf\x85\xc3\xb0\x50\xab\x0c\x4d\xc1\xc1\xaa\xb6\x55\x1f\x09\xc9\x12\xf0\x7e\x03\xd1\x78\x69\x6e\x68\x23\xb1\x76\x52\x1d\xe7\x35\x8f\xab\x69\x91\x64\x47\x38\x0f\xec\x9b\x61\x45\x97\xa6\x58\x39\xd6\x74\xfb\x87\x98\xa1\xe3\x54\x21\x64\x35\x74\xab\xd9\x23\x30\xc7\x96\x84\x0f\xa5\x7d\x7c\x7f\x52\x97\x82\x54\x87\xc8\x68\xbc\xed\x37\x6f\xbe\x79\x73\xcb\x8b\x54\x1f\x14\xf2\x3e\xfe\xb8\x0e\x81\xd4\x41\x91\x88\x26\xf1\x7b\x83\xc7\x64\xab\xc9\x97\xe2\xed\x8f\xa8\x72\x37\x39\x85\x2f\x3e\xff\xcf\x2f\xff\xba\xa2\xa0\x17\x8c\x98\x7d\x8f\x2a\xf8\x82\xb6\x24\xc3\x62\xc5\x79\xa7\x61\x42\x52\x29\x13\x4e\x24\x79\x5b\xa6\x71\x72\xb7\x1c\x74\x27\x2c\x1b\x34\x5e\x5d\xd6\x15\xd1\xe5\x09\x27\xaa\x58\x27\x54\x8a\x03\x02\x49\x4b\x1b\x93\x8d\x00\x2f\xa6\xf0\xe8\x73\x7f\x99\x3f\x77\xbd\x20\xbe\x5f\xbd\x7d\x9d\x2c\x19\xb2\xb4\xf0\xb7\xc1\xdc\x78\xa4\x05\x5a\x2a\x3d\x66\xc6\xf1\x26\xa6\x41\xaf\x09\xa3\x33\x60\x51\x13\x62\x33\xde\x4d\x0b\xb7\xc9\x1f\xb8\x9d\x2f\xb0\x94\x4a\x96\x75\x79\x0a\x0f\x57\x14\xf1\x22\x6d\xcb\xd5\xf4\x85\x5b\x20\x20\x48\x74\xe5\x46\x94\x25\xa7\xa4\xc9\x0c\x95\x93\x63\xc9\x49\x03\x0d\x6b\xb3\xb9\xef\x2b\xc6\x1c\x94\x86\x8a\x9c\x9e\x42\x72\xa8\xc3\xec\x97\x1e\xe7\x18\xd6\xc0\x21\x7a\x93\x76\x05\xd4\xb4\x42\xbf\x1b\xbc\x01\x03\xf8\xb6\xf2\x50\xb5\x13\x86\x28\x51\x28\xa9\xf2\x98\xf6\xd2\xfe\x47\x0e\xf4\xf1\x6e\x82\x21\x7a\x8e\xdd\x58\x50\x4a\xc6\x52\xc6\x76\x93\x80\xbc\x16\x46\x28\x47\x66\xec\xd9\xe5\x85\xc7\xe8\xf3\x3e\x4d\x42\x8e\x25\x16\xe7\xc2\x62\xdc\x8d\x7e\xab\x7a\x61\x15\x6f\x15\x68\xb2\x64\xdf\xd9\x56\x7d\xf4\xf0\xf3\xb5\x4b\xde\x94\x5b\x1d\xc2\x13\xce\xa1\x51\xa7\xf0\x3f\xaf\xce\x86\xff\x12\xc3\xdf\x5e\x1f\x85\x3f\x1e\x0e\xff\xf6\xbf\x83\xd3\xd7\x9f\x75\x7e\xbe\x3e\xfe\xf6\xff\xaf\x68\x69\x39\x98\x5f\xc1\x3e\x41\x89\x44\x9c\x18\x57\x74\x10\xb3\x54\x5e\x9a\x1a\x07\xf0\x44\x14\x16\x07\xf0\x93\x62\xd5\x70\x4f\xa2\xad\x8f\x50\x93\x56\x3e\xa0\x5e\x57\x45\xca\x43\x11\x1e\xd2\xfa\x32\x61\xb8\xeb\xcc\xd7\xed\x88\x14\x5d\x0d\x1d\x49\xa3\x3a\x7c\xe6\x53\xf3\xc6\x5a\x27\x01\xe1\x26\xa9\x2e\x4f\x9a\xef\x1e\x5a\x3f\x15\x6a\x0a\xad\x58\xf3\xa0\x74\x9e\xd3\xad\x23\xd9\x24\x52\xa3\xad\x6d\xcf\xcb\x43\x21\x6f\x10\xce\x5a\xbb\x91\x84\xe5\x08\x53\xc1\x58\xdc\x8c\xa4\x33\xc2\x3b\x7d\x23\xae\x6c\x3d\x4a\xe3\xba\x80\x23\x32\x57\x13\x4e\x24\x5b\x90\xae\xe1\xee\x0d\x31\x92\x05\xff\x17\x08\x64\x4a\xa7\x5a\x8d\x0b\x19\x4c\x80\xb2\xd2\xc6\x09\xe5\x62\x82\x70\x8e\x6f\xfd\xff\xba\xe2\xc3\x0e\xd2\xc2\x51\xa6\xec\xa3\x47\x9f\x7f\x71\x55\x8f\x32\x5d\x0a\xa9\x9e\x94\xee\xe4\xf8\xdb\xa3\x5f\x6b\x51\x70\x94\xf7\x99\x28\xf1\x49\xe9\x56\xff\xff\x15\x3b\xab\xc5\x47\x5f\x6e\xb1\x8b\x8e\x5e\xf9\xbd\xf2\xfa\xe8\xd5\x30\xfc\xf5\x59\x7c\x75\xfc\xed\xd1\x75\xb2\xf6\xfb\xf1\x67\x34\x87\xce\x0e\x7c\xfd\x6a\xd8\x6e\xbf\xe4\xf5\x67\xc7\xdf\x76\xbe\x1d\x2f\xdb\x8c\x6f\x87\x6d\xaa\xc8\x90\xac\x80\x61\x29\xaa\xe1\x0d\x4e\x57\x6c\xce\x95\x70\x74\xb1\x21\x4f\xb1\x52\x54\xcb\xac\xef\xb1\xcc\x9f\x8a\xea\x05\x8e\xd1\xa0\x4a\x97\x32\xf9\x3d\x23\x30\x64\x3f\xac\xf9\xc4\x19\x58\x7b\x78\x9d\x48\xef\x78\x4f\xdb\x3a\x38\xbd\x05\xb7\x6c\x87\x1f\xd5\x9a\xfc\xc5\xcd\x29\xa6\x71\x9e\x7b\xb7\x10\xf7\xf7\xcf\xde\x7f\xb4\x77\x3b\xb5\x5c\x69\x69\xcd\xfa\x30\x2f\x1e\x7b\xe8\xcb\xa2\x87\xe1\xdc\x44\x93\x9d\x57\x2b\xf9\x6b\x8d\x70\xf1\xb8\x39\x9a\x26\x55\x5a\xd4\x7c\x19\xce\x4f\x3f\x5d\x3c\x26\xfb\xfd\x1f\x41\xdc\xdc\x21\x64\x5a\x1d\x3a\x78\xfe\xec\xc7\xff\x66\x67\x00\x97\x18\x78\x85\x1e\xce\xc7\x14\x52\x78\x37\x59\x50\xc0\xf0\x0f\xf4\x79\x72\xdc\x73\x2a\xaa\xc6\x7f\xc2\xe2\x8e\x33\xac\x8a\x8a\x00\xc4\x0d\x82\xad\x4d\x18\x1d\x35\xec\x23\xbe\x9c\x45\x1f\xe2\xc1\x39\xf2\x59\xba\x71\x21\xdc\xea\x7c\xe1\xb5\x44\x4b\xb5\x52\x98\x72\xd0\x9c\x50\xe0\x7b\xd8\x1f\xc4\xc8\xcf\x03\x66\xe5\x3e\xf6\xd8\x0c\x21\xa0\xb6\x37\x5b\xd0\x18\xce\xfd\x4c\xdf\xfb\x4e\x5a\x98\xef\x5e\x3d\x7a\x7f\x26\x47\x36\x5f\x6c\xf0\x3f\x2f\xa4\x71\xcd\x9a\xce\x33\xde\xc3\xe0\x5b\x6d\x82\xa3\x13\x61\x61\x84\xa8\xd8\x9d\xeb\xbd\x7f\xa8\x02\xd7\x61\xeb\x88\xad\xab\xa1\xd3\xc3\x6c\xf9\xe2\x6d\xa0\xdc\x66\xaa\xad\xb1\x5c\xe7\x4e\x99\xee\x6a\xa8\xde\x4d\xa6\xcb\x68\x60\xdb\x4b\x77\x1a\x0c\xb2\xeb\xc4\x56\x1b\x26\x73\x5e\x5d\xb6\x2c\x82\x53\x23\xd8\x19\x8b\x43\x22\xeb\x71\xc6\xb3\xe1\x34\x47\xf3\x66\x3d\x7b\xbb\x8f\xd1\x2f\xf3\x15\x9a\x5b\xb9\x97\xf2\xdb\xb4\x31\x53\x9f\x67\x72\xf6\xfe\xb7\x15\x41\xaf\xbd\x3b\x61\xd7\x5f\xaa\x37\x84\x6f\xd6\xe6\xbf\x33\x05\xd7\x65\xf9\xef\xd2\xc6\xae\xca\xd2\x4b\x93\x53\x3e\x71\x11\x5f\x39\x6d\x38\xe4\xde\x7d\x57\x8f\x1a\xa0\xdc\xb6\x1e\x6c\x20\xf8\xfd\x8f\x07\xff\x17\x00\x00\xff\xff\x25\x01\x0e\x3b\xe7\xe7\x00\x00")
func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) {
return bindataRead(
@@ -105,7 +105,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x77\xe3\xb6\xb5\x30\x8c\xff\xdf\x4f\x81\xe5\xe4\x3c\xb2\x1b\x49\x9e\x69\x7b\xfa\x6b\xe7\xd7\xf7\x64\xf9\xd8\x4e\xe2\x37\x33\x1e\x2d\xdb\x99\x3c\x5d\x49\x4e\x0a\x91\x5b\x12\x6a\x12\x60\x01\x50\xb6\xfa\xe4\xf9\xee\xef\xc2\x06\xc0\x8b\x2e\xb6\x44\x72\xc6\xb2\x07\xe8\x5a\xcd\x58\x24\x41\x70\x63\x63\xdf\x2f\x34\x63\x1f\x40\x2a\x26\xf8\x1b\x42\x33\x06\xf7\x1a\xb8\xf9\x4b\x0d\x6f\xff\xa2\x86\x4c\x1c\xcf\x5f\xff\xee\x96\xf1\xf8\x0d\x39\xcd\x95\x16\xe9\x15\x28\x91\xcb\x08\xce\x60\xc2\x38\xd3\x4c\xf0\xdf\xa5\xa0\x69\x4c\x35\x7d\xf3\x3b\x42\x28\xe7\x42\x53\xf3\xb3\x32\x7f\x12\x12\x09\xae\xa5\x48\x12\x90\x83\x29\xf0\xe1\x6d\x3e\x86\x71\xce\x92\x18\x24\x4e\xee\x5f\x3d\x7f\x35\xfc\xcb\xf0\xd5\xef\x08\x89\x24\xe0\xe3\x37\x2c\x05\xa5\x69\x9a\xbd\x21\x3c\x4f\x92\xdf\x11\xc2\x69\x0a\x6f\x48\x94\xe4\x4a\x83\x54\x20\xe7\x2c\x02\xf7\xbc\x1a\x8a\x0c\x24\xd5\x42\xaa\x61\x24\x24\x08\xf3\x9f\xf4\x77\x2a\x83\xc8\xac\x62\x2a\x45\x9e\xbd\x21\x6b\xef\xb1\xf3\xfa\xc5\x52\x0d\x53\x21\x99\xff\x9b\x90\x01\x11\x49\x8a\xff\x76\x40\xb0\xaf\xbf\xb6\xaf\x77\x90\xc3\xeb\x09\x53\xfa\xfb\xcd\xf7\xbc\x65\x4a\xe3\x7d\x59\x92\x4b\x9a\x6c\xfa\x10\xbc\x45\xcd\x84\xd4\x97\xe5\xb2\xcc\x32\x22\x35\xaf\xfe\xdb\xdd\xc8\xf8\x34\x4f\xa8\xdc\x30\xdb\xef\x08\x51\x91\xc8\xe0\x0d\xc1\xc9\x32\x1a\x41\xfc\x3b\x42\xfc\xbb\xec\xe4\x03\x42\xe3\x18\x37\x92\x26\x23\xc9\xb8\x06\x79\x2a\x92\x3c\xe5\xc5\xcb\xcd\x3d\x31\xa8\x48\xb2\x4c\xe3\x66\xdd\xcc\x00\xa1\x46\xc4\x84\xe8\x19\x90\xd3\xeb\x0f\xc5\xad\x84\xfc\x53\x09\x3e\xa2\x7a\xf6\x86\x0c\xcd\x06\x0c\x63\xa6\xb2\x84\x2e\xcc\x12\x2a\x77\xd9\xdd\x3c\xb3\xd7\x2a\xbf\xeb\x85\x59\xaf\xd2\x92\xf1\xe9\x43\xef\x77\x1f\xb1\xdd\x12\xe6\x95\x7d\xaa\xbe\xfe\xc3\xca\xef\xdb\xbe\xde\x7f\x3e\x35\x6f\x26\x7a\x46\x35\xd1\x33\xa6\x88\xe0\x40\x24\x64\x09\x8d\x40\x3d\xb0\xa0\x35\xb7\xd8\x15\x5d\xad\x5e\xd8\xb0\xa4\xea\x94\x9a\xea\x5c\x0d\xb3\x19\x55\xab\x20\x1e\x2d\xfd\xba\x66\x3a\x7b\xe3\xfc\x35\x4d\xb2\x19\x7d\xed\x7e\x54\xd1\x0c\x52\x5a\xe2\x80\xc8\x80\x9f\x8c\x2e\x3e\xfc\xf1\x7a\xe9\x02\xa9\x43\x67\x2d\xf6\x13\xa6\x0c\xa8\x90\x82\x10\x4f\x42\x70\xef\x16\x19\x90\x7f\xac\x7d\xe6\x3a\x83\xe8\x1f\xc3\x95\x95\x8b\xf1\x3f\x21\xd2\x95\x9f\x25\xfc\x2b\x67\x12\xe2\xea\x8a\x0c\x80\x3c\x59\x5a\xfa\xd9\xc0\xbf\xf2\x53\x26\x0d\x59\xd0\x95\x23\x6f\x47\x85\x2e\xd6\x7e\x5f\xfa\xda\x9e\x01\x89\xfb\xc6\xd8\x90\x44\x50\x88\x8f\x0e\xe3\x20\x76\x70\xb4\x78\xca\x94\x41\x0e\x09\x0a\xb8\x25\x92\x88\x42\xdc\x7d\xd3\x90\x18\x00\x80\x54\x86\x00\xe4\x49\x6c\x68\xe7\x1c\xa4\x26\x12\x22\x31\xe5\xec\xdf\xc5\x6c\x8a\x68\x81\xaf\x49\xa8\x06\xa5\x09\x9e\x5a\x4e\x13\x32\xa7\x49\x0e\x7d\x42\x79\x4c\x52\xba\x20\x12\xcc\xbc\x24\xe7\x95\x19\xf0\x16\x35\x24\xef\x84\x04\xc2\xf8\x44\xbc\x21\x33\xad\x33\xf5\xe6\xf8\x78\xca\xb4\xa7\xfa\x91\x48\xd3\x9c\x33\xbd\x38\x46\x02\xce\xc6\xb9\x21\x9c\xc7\x31\xcc\x21\x39\x56\x6c\x3a\xa0\x32\x9a\x31\x0d\x91\xce\x25\x1c\xd3\x8c\x0d\x70\xb1\x1c\x29\xff\x30\x8d\xbf\x90\x6e\x93\x55\x6f\x09\x7c\x6b\xd1\x99\x78\x02\xfb\x20\xac\x0d\x79\xb5\x98\x64\x1f\xb7\xdf\x52\x82\xd4\xfc\x64\xa0\x72\x75\x7e\x7d\x43\xfc\x02\xdc\xb9\x44\x08\x97\xb7\xaa\x12\xd8\x06\x50\x8c\x4f\x40\xda\x3b\x27\x52\xa4\x38\x0b\xf0\x38\x13\x8c\x6b\xfc\x23\x4a\x18\x70\x4d\x54\x3e\x4e\x99\x56\x88\x73\xa0\xb4\xd9\x87\x21\x39\x45\xa6\x47\xc6\x40\xf2\x2c\xa6\x1a\xe2\x21\xb9\xe0\xe4\x94\xa6\x90\x9c\x52\x05\x1f\x1d\xd4\x06\xa2\x6a\x60\xc0\xb7\x3d\xb0\xab\x3c\x7b\xf5\x81\x95\x33\x46\x88\xe7\xa5\x1b\x77\x67\xe3\x19\x26\x31\x44\x09\x95\x56\x28\x20\x1a\x92\x84\xbc\x7f\xfb\x8e\xcc\xc4\x9d\xc1\x62\xc6\x95\xa6\x49\x82\xa7\xc0\xf1\x67\x4b\x4e\x23\xca\x49\x4a\x39\x9d\x02\xa1\x59\xa6\xc8\x44\x48\x42\xc9\x94\xcd\x81\xfb\xd3\x35\xdc\x76\xf1\x9b\x88\x04\xb1\xc4\x7d\x2d\x83\xf2\x57\xdd\x02\x97\xae\x6c\x22\x1b\x66\xac\xc8\x40\x0f\x40\xed\xa4\xbc\x17\x31\x9b\x93\x9c\x2b\x2d\x73\xdc\xec\x98\xdc\xc2\xc2\x21\x79\x4a\x33\xa2\xb4\x30\x3f\xde\x31\x3d\x23\xb4\x8a\xe0\x54\x23\x16\x8f\x81\x28\xd0\x64\xbc\x20\x46\x8c\x43\x82\xa0\x85\x48\x90\x5a\xe0\xb3\x48\x18\x24\x68\xc9\x60\x0e\x84\xca\x31\xd3\x92\xca\x45\x81\x0d\xcb\x00\x7d\x04\xa8\xf8\xb1\x15\xe1\x61\x33\x48\xc8\x43\xb8\x48\x2c\xb9\x75\xb2\x4b\x5c\x08\x96\x5b\x40\x6f\x74\xe1\xf0\xad\x14\x47\x95\xc3\x37\x50\xc4\xe0\x95\x93\x0f\x0a\xb9\x16\xdf\xe4\x10\x2b\x26\x42\x16\x98\x61\xc0\x56\x45\xc2\x31\x18\x72\x22\x29\x37\x17\xd6\x22\x77\x03\x68\x3d\x84\x36\x66\x88\x3b\xbe\x0e\x47\xab\x73\x53\x29\x6b\x02\x53\x75\x30\x0d\xe9\x86\x99\x1f\x84\x5d\xf1\xb3\x59\xe0\x9c\xc5\x60\x80\xa8\x29\xb3\xa8\x63\x4e\x2b\x1d\x8b\x5c\x5b\xd8\xb9\x5b\x62\x32\x67\x94\xd0\xe9\x54\xc2\x14\x11\x78\xe3\x6b\x1f\x81\x89\x1d\x9b\x0f\x68\x39\x06\x56\x92\x7f\xf0\x0e\x43\x06\x1f\xbc\x81\xaf\x3b\xe6\xd5\x1b\x56\x85\xc5\xfa\x78\x6c\x0f\xed\xa0\x91\x81\x89\x07\xad\x90\x0f\xde\xbc\xcd\xde\xda\xf1\xc8\x0e\xdb\x51\xdf\xe7\xa5\x85\xb8\xab\x63\x73\x3e\x4a\xd2\x6c\xc8\x01\xde\x58\x12\xdf\x31\x90\x0c\xe4\x44\xc8\xd4\x1c\x14\x4e\x28\x89\xac\xfc\x56\x10\x1e\x24\x8d\x3c\x7a\x08\x9c\x64\xdb\xfd\xb7\x63\x1b\x2c\xb0\x63\x40\x32\xaa\x67\x8f\xdc\xb6\xdd\x56\xd9\x51\x05\xda\xa3\x37\x3f\x42\xcd\x56\xe6\x2e\x39\x4c\xe7\x73\x1b\x30\x74\x3e\x29\xf2\x9c\x6d\x66\xad\xa1\xda\x15\xbd\x7b\x07\x4a\x19\x96\x8d\x52\x9a\xa4\x77\x04\x78\x24\x0c\xb1\xf8\x7f\xaf\xdf\x5f\xda\x69\x87\xe4\x42\x13\x96\x66\x09\xa4\x46\x10\x23\xef\xa8\x54\x33\x9a\x80\x44\xee\xf4\x03\x4f\x6b\x7f\x3b\x4c\xcc\x15\xc4\x86\x16\xc5\x90\xd0\x85\x9d\x2c\x86\x48\xc4\x86\x46\x0b\x49\x32\x23\xe0\xa6\x59\xae\x81\x50\x7b\x15\xdf\xcb\xf8\x74\x1d\x91\x6e\x05\x1a\x62\x24\x91\x94\xea\x37\x64\xbc\xd0\x8f\xa1\x3e\x21\xf7\x83\x78\x5b\x1a\x50\x5d\xcc\xe3\x94\xc0\x8e\xad\xe8\x41\x75\xe2\x47\xbf\xd2\x08\xa1\x94\x71\x90\x23\x21\xf5\x36\x44\xcb\x28\x1f\x53\x90\x0f\xde\xe9\x41\xc6\xb8\xfe\xe3\x1f\x1e\xb8\x33\x86\x2c\x11\x0b\x83\x17\x8f\x9f\x95\x2d\xbf\x67\xeb\x73\xbd\xed\x7c\xdb\x9e\xe5\x2d\xe7\xb3\xc6\xa9\x2e\x66\x5a\xa7\x40\x35\x9a\x88\x77\xf5\x6d\x85\x12\xf8\x64\xcc\x6f\x74\xe1\xad\x0d\x57\x30\x01\x09\x3c\x72\xb4\xe9\xfb\x7c\x0c\x92\x83\x06\x55\x11\xa4\x17\x99\xa3\x34\x46\x16\x5c\x66\x77\x4f\xc3\xe5\x1e\x91\x67\xfc\x6d\x8f\x48\x35\xfe\xb6\xc7\x64\x1b\x3b\x76\x61\x9b\x8f\x23\x9d\x1d\x3b\xd1\xd8\xc7\x11\xb0\xc1\xa4\xf3\xf5\xe6\x9c\x16\xf3\x1a\x9d\x78\x0f\x24\xbc\xeb\xda\x32\x6a\xf2\xdd\x84\x41\x12\x13\x66\x84\x37\xb3\x58\x32\x4e\x44\x74\xeb\xec\x96\x57\x67\x44\x09\x2b\xee\x19\x09\xdf\x30\xda\x48\x70\x95\xa7\x40\xd8\x63\x18\x1c\x44\xba\x20\xd2\x05\x91\xee\xb9\x88\x74\xd6\x3f\xb0\x0f\x94\x6a\x69\x21\x1b\x69\x15\xde\x17\xa8\xd5\x43\x23\x50\x2b\x1c\x81\x5a\x3d\x32\x9e\x1d\xb5\xda\x4a\x4e\x7b\x74\xae\xc7\x0e\x72\x30\xa6\x06\x63\x6a\x30\xa6\xba\x11\x78\x99\x1b\x81\x97\x05\x5e\x16\x8c\xa9\x0f\x4d\x19\x8c\xa9\x3b\x4e\x14\x8c\xa9\xc1\x98\x1a\x8c\xa9\xc1\x98\xfa\xd8\xc7\x04\x91\x2e\x88\x74\x41\xa4\xdb\x76\x31\xc1\x98\x1a\x8c\xa9\x0f\x8d\x40\xad\x2a\x23\x50\xab\x07\xc6\xcb\xa6\x56\xed\x8d\xa9\x51\x02\x94\xaf\x57\xaa\x96\xe2\xbf\xf1\x3e\x14\x8d\xd8\x84\xb9\x3c\x08\xf7\x34\x19\xc3\x8c\xce\x99\xc8\x25\xb9\x9b\x01\xf7\x29\x3b\x64\x0a\x5a\x19\x2c\x00\x0d\xeb\x04\xf3\x47\x68\xcd\xc3\xf4\x65\x40\x80\xd3\x71\xb2\x76\xe2\xc7\x48\x89\x7b\xf2\x61\xe3\xf1\x58\x08\xf3\x75\xab\x10\x43\x55\xc7\x6b\x3a\xbb\xc4\x33\x1f\x6c\xca\xb1\x5b\x1f\xd4\x7c\x7a\x75\xd6\x55\x28\x33\xf9\x99\x93\x8b\x62\x56\x82\x96\x69\x4c\x94\x30\x3c\xc4\xfc\xfa\xfe\x8e\x43\x8c\x49\x6e\x7d\xc2\xb4\xb9\xc1\x1c\x7a\x16\x31\x9d\x2c\x8a\x17\x0f\x0f\x76\xdf\xc4\x3d\x0a\x89\x3e\xbd\x3a\xdb\xde\x7c\xef\x37\xe0\x53\x58\xea\x83\x1d\x3e\xd8\xe1\x8b\x11\xc4\xa0\x86\x93\x06\x31\xe8\x81\xf1\xb2\xc5\xa0\x7d\xb7\x5b\x07\x6b\x33\x09\xd6\xe6\x87\x6f\x0b\xd6\xe6\x60\x6d\x0e\xf6\x9b\x0d\x23\x08\x2e\x38\x82\xe0\xf2\xc8\x78\x76\x82\x4b\xb0\x36\x07\x6a\x15\xa8\x55\xa0\x56\xcf\x83\x5a\x3d\xc7\xd0\xdd\x60\xf4\x0b\x46\xbf\x60\xf4\x0b\xdc\x28\x70\xa3\x47\xc6\xb3\xe3\x46\xc1\xe8\xb7\xeb\x44\xc1\xe8\xb7\x76\x04\xa3\xdf\x23\x23\x18\xfd\x82\xd1\x6f\xc3\x08\x82\x4b\xc3\x49\x83\xe0\xf2\xc0\x78\xd9\x82\x4b\x30\xfa\x05\x6a\x15\xa8\x55\xa0\x56\xcf\x83\x5a\xb5\x37\xfa\x3d\x72\x92\x1e\x7e\xf6\xe1\x93\xf2\xe0\xb3\x2c\x7a\xe8\x85\x9b\x20\xfa\x00\x04\x1f\x25\x5c\x8f\x91\xab\x01\x19\x53\x05\x7f\xfe\xd3\x4a\xdd\xf2\xea\x2d\x29\xc4\x8c\x9a\x57\xad\xbd\xe3\x71\x12\x56\xbe\x62\xf3\x9e\x6d\xb1\xf7\xc5\x32\x1a\xce\xe2\x0a\x2b\x3f\x1a\x14\x6b\xb6\x36\xbe\xb0\x37\x5f\x6b\x49\x35\x4c\x17\x95\x42\xde\x68\x93\x2d\x39\x0f\xdf\x50\x80\xbe\x50\x1a\xef\x66\x20\x01\x1f\xf2\xa5\xa7\x95\x9f\x94\xa9\x22\x7a\x39\x6e\x50\xdc\xf7\xb1\x70\x64\xff\x9e\x35\x97\x1f\xdb\xb4\x75\xd5\xb7\xd7\x02\xcb\x03\xe8\xcc\x5a\xaf\xcf\x8a\x14\xe0\x65\x88\x65\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x2b\x77\x2f\xc1\x7b\x13\x51\xdc\x82\x53\x3f\xce\xa1\x07\x95\x4c\xe5\x4d\x96\xf5\x6d\x18\xb3\xeb\x81\x31\x02\x99\x32\xa5\x36\x05\x5c\xd7\x97\xfe\x18\xd9\xdc\x82\x5c\x6e\x80\xbf\xff\xa2\xca\x72\x0a\xf1\x09\x77\x40\x8e\x69\x44\x64\x9e\x18\x61\x8a\xc7\xc4\x95\xbf\x26\x34\x8a\x44\xce\x35\xe1\x00\xb1\xb5\x6c\xac\xc3\xd5\x2d\x88\xed\x16\xf2\xd3\xb6\xd2\xd3\xc0\xae\xf3\xd1\xbb\xdc\x37\x9c\xd8\x4f\x58\x5b\x50\xbd\x3a\xb6\x97\xb6\xf0\xf5\x8f\x73\xad\x5d\x58\xe1\xd6\x8c\xb0\xb6\xbf\x23\x91\xb0\x68\x71\x95\x27\x40\x66\x22\x89\x15\x96\xf5\x37\xdc\xbd\x70\x38\x54\x45\xe4\x0c\xef\xc6\xd5\xf7\xc9\x38\xd7\x24\x16\xa0\x08\x17\xda\x17\x06\xa8\x3d\x6e\x5d\x4c\x77\x33\xdb\xda\xc1\x3c\x44\x68\x96\x25\x98\x4a\x21\x8c\xd0\x72\x37\x63\xd1\xcc\xf6\xab\xc9\x68\x04\xeb\x6e\xdb\x5e\x7a\xd9\x4a\xbc\x26\x3b\x89\xd8\xc4\xdb\xac\xc6\x8f\xa1\x0a\xd9\x51\xd6\x26\xb6\x44\xfc\xb7\x52\xe4\xd9\x96\xb7\xaf\x5a\x16\xed\xd3\x86\xca\xeb\xa5\x06\x36\xfe\xa2\x73\x19\xd9\xbd\xb1\xb7\x15\x26\xd1\x21\x21\x17\x13\x92\xe6\x89\x66\x59\x82\x8f\xd8\x6a\x03\x8a\x50\x09\x25\xdf\xe8\x13\xca\x17\xde\x03\xe5\xda\x44\x40\x4c\xe8\xd4\xcc\xa8\xb1\x3f\x8c\x2f\x49\xcf\xf3\x14\xcc\x69\x8e\xcb\x97\xa0\x3a\xc5\x17\xe5\xec\xe4\x8e\x25\x89\x91\x67\x69\x92\x88\xbb\xf5\x6c\x69\xdd\xd8\x4d\x28\x24\xbb\x09\x86\x64\x77\x11\x98\x10\x2e\xb8\x37\xed\xfe\x70\xf5\xb6\xd9\x26\x5e\xd6\xe7\x70\xbd\x40\x40\x1b\x90\x66\x54\x6a\x46\x13\x92\xcb\x44\xd9\x7d\xa4\x46\x09\x90\xbe\x99\xca\x8c\xa2\x67\x30\x02\x65\xbb\x76\x90\xdf\xdb\x9d\x73\x80\xb5\xe7\x53\xf0\x64\x41\xa8\xdd\xf9\x49\x9e\x24\x7d\x32\x61\x9c\x1a\xb2\x0b\x99\xcf\x84\x31\xfa\x13\xb9\x66\x3c\x02\xf3\x4d\x83\x42\xb0\xc0\x15\x99\x19\xcd\xf9\x2e\x0e\x69\xdc\x77\x6d\x45\xac\xb6\xac\xdc\x2b\xcc\x81\x8d\xe8\x38\x01\xec\x6b\xe1\x44\x96\x2b\x91\xa0\x79\xdb\x19\xbe\x63\xdb\x8b\x84\x56\x2f\xff\x37\xe3\xa8\xa4\x90\x2b\x64\x1c\x46\xd9\x01\xa6\x67\x46\xf7\xc9\xb2\x64\x61\x08\x85\xc1\x9d\x12\xa1\x0e\x55\x1e\xcd\xcc\x27\x1d\x64\x22\x56\x07\x86\x8c\x1c\x28\x88\x24\x68\x75\x70\x64\xfe\x5a\xfe\x06\xfc\xbe\xea\x73\xc7\x34\x63\x07\x47\x7d\x82\x00\xc2\x46\x27\x42\xcf\x9e\x2f\x1e\xfa\x6f\xad\xf5\xd7\x7a\x6c\xd4\xb5\xd6\xea\x0c\xae\x6b\x87\xc8\x6c\x13\x0c\x43\xa3\x35\x60\x9e\x94\x41\x4a\x44\x03\xdf\x1e\x6a\x95\x58\x13\x72\xc2\x09\xa4\x99\x5e\x20\x16\xa7\x40\xb9\xbb\x1b\xe6\x20\x17\x7a\x66\xb4\x55\xa6\x9e\xff\xe1\xdf\xd2\xb1\x54\x8e\xb5\x00\x77\x07\xde\x03\xb7\x44\x72\xdb\x59\x69\x19\xb8\xbd\xdf\xf7\xaa\x52\xaf\x11\x9f\x4a\x6a\xfe\x6c\x41\x89\xec\xb5\x11\x18\x3f\x98\x27\xeb\x20\xb4\x3f\x59\x6a\x59\xd0\x8f\xb7\x6f\x6d\x17\x25\x07\xab\xef\x19\x8f\x55\x51\xc9\x28\xb6\x64\xd0\xc1\x7b\x2d\x90\x71\x85\xcf\x11\xc0\xab\xe2\xeb\xb6\x22\xe7\x23\xd3\x57\xf4\x9b\x7d\x50\x49\xb0\x2b\x53\x4d\xca\x31\x74\xaa\x6f\x5d\x4e\x46\x17\x49\xe8\x18\x12\xdb\x72\xc9\x5c\x2d\x97\x4f\x4e\xde\xbe\x2b\xba\x93\x49\xa0\x8f\xd8\xb3\x3e\x82\x22\xb2\x85\xe3\x74\xa5\xc7\xdb\xea\xd8\x5e\xf6\x44\x50\xec\x66\x0c\x26\xd7\xa0\xed\x31\x4b\x69\x66\x4e\x99\x9d\x63\xad\x2d\xf3\x2d\x42\xfa\xf1\xc3\xb2\x93\xcc\xbe\x7d\x4f\xa6\x75\x2f\xd9\xea\xa8\x6c\xe7\xf1\xdd\xe5\xec\x3d\x60\xe1\x28\x47\x0d\xcc\x4b\x08\xed\xe4\x7a\x27\x89\x47\x45\x7f\x3d\x8b\xc1\xca\x26\x46\xdb\x34\x74\xe9\x7f\x2f\xa7\xe8\x78\x0b\x76\x51\x9a\x8c\xde\x9c\x40\xa4\xc5\xc3\x65\xdf\xfc\xcd\x1a\xd2\x2c\x79\xec\xe4\x91\x9d\x15\xac\x94\xf1\x2b\xa0\xf1\xe2\x1a\x22\xc1\xe3\x2d\x09\x6c\x6d\x3f\xde\x31\xce\xd2\x3c\x25\x3c\x4f\xc7\x80\x20\x56\x76\x2e\x24\x24\x56\x79\xa5\x84\xc3\x5d\xb2\x70\xc4\x23\x26\x99\x88\x3d\x3d\x19\x1b\x65\x8b\xc6\x0b\xec\x6f\x86\x05\x52\xf9\xc2\x4c\xc2\x74\xc9\x7d\x24\x89\x24\x55\x46\x2c\xea\xe3\xa4\x4c\x1b\x8e\x35\x06\xf4\x2d\xb1\x18\xcc\x1e\xd3\x39\x65\x89\x11\xad\x87\xe4\x0c\x26\x34\x4f\xb0\x4d\x1f\x79\x45\x0e\xcd\xcb\xbc\x3e\xb5\xee\x01\x23\xee\x2a\x61\x34\x71\xe5\x72\xdc\x71\x41\x47\x3b\x58\xcb\xb7\xa9\xdf\xe7\xc7\xb6\x75\xfc\xfc\xc8\x68\xae\xb6\x55\xc3\x6b\x1b\x73\xc1\x63\x73\x1e\xaa\x92\x68\x85\xa4\x33\xe5\x66\xde\x8e\x65\x3f\x5c\xfb\x60\xcd\xaa\xa5\x98\x4a\x50\xea\x0c\x68\x9c\x30\x0e\xcd\xf1\xeb\x66\x06\x24\xa5\xf7\x88\x63\x9a\xa5\x60\x24\x91\x2a\x86\xd1\xea\x57\x69\x41\x52\x7a\x0b\xc5\xeb\xc9\x18\x26\xd8\x86\x11\x3f\xb8\xb2\xfb\x16\x7f\x26\x94\x25\x10\x0f\xf1\x1d\x95\x59\xca\xee\xc5\x16\x71\xcc\xdf\x8c\xe7\x60\x9e\xca\xa4\x40\x65\xd2\x3e\x5a\xe5\xf1\xc8\x43\xa9\xb9\xd9\xd2\x61\xdf\xb1\x6f\xb4\x04\x8a\xf3\xfb\xc8\x1a\xf9\x24\x50\x85\xb7\x59\xdc\x54\xb9\x9c\x18\xd5\xd1\x6b\x9c\x95\x05\xb9\x56\xaf\xe4\x52\x68\xd7\xf8\xaf\xf8\x40\x7c\xda\x35\xa2\x04\xa5\x59\x8a\x07\x2c\xce\xa5\x6f\x8b\x89\x30\xa3\xeb\xb7\xbe\x76\x54\xfe\xfc\xea\xd5\x96\xf2\xdb\xc7\x47\x7a\x09\xa8\x29\x37\xc1\x97\xcb\x82\x0e\x79\xf2\x6f\x54\x60\xb3\xc7\xcc\x89\xc1\xd8\xdf\x13\x24\xfa\x09\x99\xd2\x8c\x4f\x73\xa6\x66\x64\x0c\xfa\x0e\x80\x13\xb8\xb7\x15\x2e\xc8\xbf\x41\x0a\xdc\x54\x03\xde\xd2\x45\x50\x03\xda\xeb\xfd\x81\xd8\x9c\x29\x26\xf8\x77\x4c\x69\x21\x17\x6f\x59\xca\x1e\x29\x3d\xea\xc7\x6a\x97\xe3\x02\x82\x22\x89\xb1\x37\x31\x8b\xe8\x35\xd8\x0f\x96\x80\x16\x4c\x2d\xac\x7a\x4a\xcc\x39\x19\xd3\xe8\xf6\xa3\x01\xf8\xd5\xbe\x40\xd8\xb3\xeb\x06\x50\x45\x79\xaf\x98\x00\xc9\x96\x45\xca\xf3\x7b\x0b\x9f\x1a\x94\xef\x66\x42\x01\xde\x60\x8d\x8c\xf8\x98\x77\x0a\x30\x55\x10\x0c\x73\xba\x05\x07\x45\xe8\x64\x52\xbf\xa3\x3c\xec\x28\x79\xa6\xb9\xd2\x24\xa5\x3a\x9a\x59\x53\x96\x88\x0b\x71\xa2\xa7\x9c\xd8\xbf\x0b\x94\xb7\x36\x22\xef\x6e\xee\x25\x76\x9d\xe7\xf7\x46\xb7\x7c\xd4\x9b\x53\x1f\x35\x90\x2f\x4f\x53\xd7\x80\x93\xfa\x86\x38\xb9\x2d\xb5\x2d\x82\x6f\xd0\x00\x5c\xfe\x82\xbb\x70\x72\x79\xb6\xbd\x29\xa6\x89\x82\xbb\xb3\x8a\xbb\x6c\xea\x7e\xe0\xa3\xbc\xc9\xd4\x5d\xa9\xdb\xbb\x6d\x6b\xe8\x3e\xa1\xe4\x16\x16\xb6\x8b\xf4\x4a\x5b\x5e\x09\x89\x93\x24\x00\xbb\xd3\x9a\x9b\x5c\x4b\xe9\x1d\xd6\xbb\x33\xf6\xd8\xb1\x9b\x2b\xc2\x8f\x81\x59\xe8\x8e\x4f\xf8\x8f\xde\xe1\xb1\xdd\x11\xdc\x8e\x5b\x58\xec\xf6\xc0\xd2\x76\x9b\x5d\x70\xba\x8f\xdd\x77\xf3\x43\x21\xe8\x15\x5b\xbd\x9b\x8f\xa8\x3a\x76\x36\x51\xf9\xe1\x81\xd8\xea\xf3\x0a\xf4\xab\x5a\x99\xcc\x37\xf6\x94\x45\x46\x73\xa6\x67\x2c\x43\x46\xe4\x9d\x01\xbe\xc9\xf9\x07\x9a\xb0\xb8\x98\xc2\x9e\xdf\x0b\xde\x37\xe2\x93\xf9\x0f\x12\x5d\x2b\xae\x9d\x09\x50\x97\x42\xe3\x2f\x9f\x0c\x40\x76\x99\xad\xc0\x63\xa7\x70\x56\x68\xa4\x32\xa8\x78\x55\xfa\xa3\xab\xa1\xaf\xec\x55\x80\x92\x29\x72\xc1\x89\x90\x1e\x0e\xd8\xb1\xde\x4e\x64\xa7\x40\x3e\x31\xb6\x0e\x0e\xb4\x4f\xaf\x9d\xc3\x81\x4f\xc8\x1a\xf4\x1e\x98\xce\x4d\x85\xf2\x81\xbd\x62\x3b\xe2\x27\x28\xed\x3a\x51\x95\x7a\x27\x37\x8b\x48\x0a\x72\x8a\x1e\x97\x68\x6b\x8f\x43\x7d\x53\x76\xa3\xbb\x76\xec\x4c\x7d\xab\x2f\xdc\x09\x0b\x90\x35\x59\x13\x50\x1b\xe6\x66\x67\xa8\x99\x9c\xfe\x8f\xa1\xe0\xb8\x07\xff\x97\x64\x94\x49\x35\x24\x27\x44\x31\x3e\x4d\xa0\x76\xcd\x69\x18\xd5\x69\xcc\x0c\x4c\x11\x43\x6a\xe7\x34\x71\xba\x14\xe5\x04\xac\xcd\xca\xcc\xbe\xcc\x52\xfb\x4e\x52\x31\x94\xa7\x70\x74\x1d\xdc\xc2\xe2\xa0\xbf\x82\x34\x07\x17\xfc\xc0\xf2\x96\x15\x34\x29\x18\x11\xfa\xc8\x0e\xf0\xda\x41\x97\x5c\x78\x47\x86\xd3\xd4\x8e\x56\x7f\xe9\xd6\x18\xe1\x63\x3b\x1a\x0a\xeb\x35\x2d\xd1\x45\x34\x69\x41\x72\x05\x56\x5a\xc7\x53\x46\xc0\xcb\x99\x28\x55\xa2\x62\xca\xe1\x0e\xa5\xc7\xbd\x11\xfc\x8c\x26\xc1\xf8\xf4\x87\x2c\xa6\x7a\xab\xa0\x52\x3b\x6a\x10\xe9\x5d\xd9\x49\x48\x8e\xb3\x18\xdc\x9a\xb0\x29\xc9\xa8\xa4\xa9\x1a\x92\x91\xab\x6e\x88\x98\xc6\x26\x55\x5b\xa2\x83\xdd\xcd\x22\x03\xf2\xff\x90\xab\xea\x5a\x86\x64\x30\x18\x90\x9b\xf7\x67\xef\xdf\x10\xfb\x8b\x95\xb2\xb5\x20\x13\x81\x4a\x90\xc8\xa5\x79\xd5\x1c\x38\x2a\xfe\x46\xbe\x17\x1c\xde\x4f\xcc\x09\xa1\x1a\xe6\x20\xc9\x9d\xd9\xaa\x88\xc5\x50\x58\xaf\x86\xbd\x8f\x8b\xc7\xcd\x24\x93\x94\xde\x5f\xe7\x72\xba\xc3\x06\x90\x95\x4d\xa8\x9a\x6c\x4a\x65\x12\x51\xaf\x9a\x9d\xab\xa2\x19\xc4\x79\x02\x31\xa1\x63\x31\x87\x9a\xc9\xb6\xfe\x18\xb2\xf4\x1c\xfc\x83\x86\xe7\x8d\x95\x48\x72\x5d\x28\xab\x87\x70\xff\x86\xfc\x27\xba\xb6\x29\xc9\x40\x46\xc0\x35\x9d\xc2\xb2\x19\xc0\xde\xf7\xfa\xd5\x7f\x1c\x39\x7e\x64\x66\x74\xd6\x93\x57\x06\x23\xde\xd1\xfb\x1f\x78\x69\x1a\x64\x8a\xbc\x1a\x92\x93\xa5\x97\xe1\x73\x49\x94\x27\x68\x6b\x41\x77\x7d\xe5\x95\xe3\x05\x91\x22\x47\x87\x3d\xc9\xb3\xba\x36\xfb\x87\xff\xfc\x0f\xa3\xf4\xd1\x34\x4b\xe0\x8d\x2f\x8a\x6a\xd5\x66\x23\xc3\x68\x41\xfe\xf8\xea\x3f\x2c\xf5\x34\xe7\xb3\xd4\x0a\x4b\x98\x51\x03\xb0\x3c\x23\x2c\xb5\xa1\x98\x90\x2c\xca\xea\xaa\xb2\x8e\xfe\x4a\x53\xa9\x55\x9f\xa0\x57\xbf\x10\x0e\xb5\xd0\x34\x59\xd2\xf2\x51\x0b\x87\x3b\x0b\xa4\x58\x20\x4c\x00\x0d\x55\xe4\xf5\x1f\x5f\xfd\xc7\xaa\x39\xe5\x3d\x8f\x00\x9f\xc4\x27\x30\xcc\x62\x6c\x94\xfb\x5b\x96\x24\x10\xf7\x1f\x5d\xfe\x24\x97\x7a\x06\xb2\x4f\x80\x2b\x6f\xac\x32\xeb\x5b\x5a\x1b\xce\x2e\x73\xce\x51\x46\xb0\xd6\x61\xb4\x68\x55\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x15\x4a\xaf\x5f\xf2\xf6\xc7\xcd\x0c\xca\x17\xef\x27\xbb\x8a\x03\x83\x06\x66\x88\xd5\xa7\x1b\x88\x94\xf7\x83\xdb\x22\x53\x72\xc0\xb8\x1e\x08\x39\xb0\xd3\xbc\x21\x5a\xe6\x8f\x7b\x0d\xca\x91\xd6\x4e\xc0\x27\x20\x03\x79\xe5\xbc\xad\xec\xea\x47\x39\xf9\xcd\xcf\x73\x2c\xee\xf8\x66\xca\x81\x84\xd3\xd1\x8c\x86\xa7\xbe\x6e\x71\x5b\x3a\x36\xe6\xed\xe6\xee\xff\xdf\x2a\x76\xef\x40\x0e\xdc\xd9\x2d\x4e\xbb\x91\xab\xd0\xe3\xd1\xdf\xe2\xed\xc5\xb1\xb5\x9c\xcf\xda\x9c\xcc\x0d\xf6\x35\x6b\x28\xd7\xca\x09\x5f\x43\x81\xec\x3a\x4a\x87\x8c\xc6\x88\x02\x73\xce\xd5\xc6\x83\x9e\x00\x55\x7a\x1d\x28\xc2\x41\x7f\x7c\x3c\x1c\xc0\xbf\x3c\xea\x42\xa7\x91\x90\x10\xe4\xa5\x8d\xf1\xd4\x22\xca\xc1\x15\x58\x0f\x9f\x0d\x38\xab\x09\x51\x07\xc5\x91\x30\xfb\x57\x97\xaf\x3e\x56\xd8\x8c\x37\x72\x36\x11\xad\xdd\xa3\x95\xc0\x5e\x67\x3a\x75\xc4\xab\xf0\x28\x5a\x97\xe6\xde\x48\xd1\x29\x68\xfa\x70\x92\xc7\xf2\xa8\x13\xed\x6b\x4d\x79\x4c\x65\xec\x56\xd9\xeb\xa9\x62\xca\x21\x79\x87\xbe\x34\x3e\x11\x6f\xc8\x4c\xeb\x4c\xbd\x39\x3e\x9e\x32\x3d\xbc\xfd\x8b\x1a\x32\x71\x1c\x89\x34\xcd\x39\xd3\x8b\x63\x74\xa0\xb1\x71\xae\x85\x54\xc7\x31\xcc\x21\x39\x56\x6c\x3a\xa0\x32\x9a\x31\x0d\x91\xce\x25\x1c\xd3\x8c\x0d\x4a\x99\x59\x0d\xd3\xf8\x0b\xff\xa2\x8f\x2c\x18\xd7\xce\x10\x5a\x97\xe4\x1c\x06\x39\xbf\xe5\xe2\x8e\x0f\x50\x93\x55\x3b\x9d\xa6\xed\xa2\x18\xfc\x58\x82\xf7\x2e\x81\x0b\x99\x88\x3f\xfa\x26\x98\x8f\x19\x50\x1e\x0f\xac\xd3\xf1\x23\xef\x45\x13\xdb\xee\xa0\x0c\x0c\xd8\x26\xe2\xdc\x8e\x66\xda\x10\x8d\x34\x9b\x43\x23\x27\xb6\x1f\xb5\xed\x7e\xef\x03\x46\xe3\x5c\xda\x1d\xaf\x78\xb3\xbd\x6f\x26\xa5\x0b\x94\x75\xf0\xdd\x44\x58\x56\xce\x45\x0c\xce\xf2\x39\x47\xd5\xfe\xda\x30\xf3\x1b\x23\x0a\x3b\x1f\x37\xda\x7d\x17\x4a\x43\x6a\x89\x93\x7d\x3e\x59\x10\x2d\x17\xd6\x31\x2e\x6f\x8d\xf2\xe9\x3c\xd7\x46\xe2\xbf\xc5\xfb\x94\x12\x11\x43\xd1\xa7\x84\xab\x97\xbb\xbc\x0d\x8f\x92\x4c\x28\x86\xef\x76\x3c\x6f\x37\xcb\x5c\x73\x76\x59\x71\xd3\xfd\xf9\x4f\xbb\x6c\xdd\x04\xdb\x28\xec\x68\x65\xaf\x47\x50\x4c\xaa\x11\xfe\x6e\x7b\x7a\xca\x2b\xae\x46\x2c\x89\x04\x57\x5a\x52\xb6\x39\x87\x69\xfd\x68\xe8\x0a\x69\xee\x6f\x20\x88\x41\x27\x8d\x80\x42\x56\x63\xb0\x3c\x53\x44\xb4\xf4\xa0\xae\x02\xc6\xa6\x38\xf9\x58\x42\x43\xb8\x1a\x9a\x56\x1b\xc0\x88\xb4\x82\x93\x7d\x1a\x26\x20\x25\xc4\x67\x28\x7d\x5e\x17\xdf\x75\x31\xe5\xa2\xf8\xf9\xfc\x1e\xa2\x7c\xdb\x4c\xf0\xd5\xb1\x62\xcb\xf3\x06\x11\x17\x76\x62\x17\x61\x8e\xae\xbf\xe0\xe4\x0f\x81\x60\x77\x82\x88\xa2\x9a\xa9\x89\xcd\x17\x2b\x36\x02\x2a\x8e\xcf\x02\x85\x0b\xf7\x30\xb2\x38\x9b\xfa\xc0\x34\x92\x9b\x68\x26\x84\x32\xa7\x1c\xf7\x13\xe7\x9d\x33\x61\x7d\x7e\x98\xbc\x22\x49\x6a\x68\x8c\x4f\x62\x29\xa7\xb7\x86\xda\xf2\x31\xa6\xac\x0a\x5e\x40\xd0\x7b\xa9\xcc\x34\x68\x78\x34\x7f\x4c\x51\x6a\x52\x9a\xa8\x3c\x35\x93\xde\x01\x9b\xce\xb4\xea\x13\x36\x84\x21\x62\x0d\xd0\x68\x56\x99\x36\x05\xd0\xb5\x2e\x28\x55\x54\xab\x5a\x89\x0f\x8b\xac\x06\x97\x86\xd3\x2f\x78\xcc\xf2\x5e\xae\x05\x57\x9f\x80\x8e\x86\x47\x7d\x52\x26\x8a\x9b\x35\x8e\x17\x84\x69\x30\x34\x1b\x75\x11\x29\xf2\xa9\xfd\x12\xf0\x31\x9d\xb8\xae\x22\xe5\x03\xbd\xa8\x31\xea\x8c\x07\xf6\xe3\x0e\xcc\xbe\xe1\xca\xf3\xd4\xe8\x8b\x05\x51\x47\xb3\xba\x6f\x9c\x23\xa4\x04\x95\x09\xab\x6d\x2e\x1b\xdc\xff\xff\xc5\x43\x87\xea\xa8\x04\xe6\x8c\x4d\x67\x1e\x96\xd4\x31\x82\xfa\x1e\xec\x7e\xf6\x48\x2b\x5f\x8a\x1d\x0d\x3d\x2a\x76\xd4\x7d\xdb\x3e\x5f\xa2\xc4\xaa\xca\xfe\x6b\x90\x69\x01\x45\x44\x11\x24\x19\xce\xce\xed\x1b\xd6\x38\x1c\x23\xaf\xc8\x21\x22\x19\xd3\x3d\x85\x08\x3f\x10\xd9\xd1\x90\x9c\x10\x9e\x17\x67\xee\xa1\x17\x70\x51\xcc\xef\x26\x32\x2f\x55\xa2\x9c\xab\xe1\x17\xb7\x22\x77\x76\x34\xf3\x94\x57\xc7\xc0\x41\x00\x1e\x2f\x8b\xf8\xd0\x24\x16\xd6\x0d\x27\x68\x47\xba\xfd\x1c\xfe\x2b\x9a\xcf\xb1\x12\x60\x81\xc7\xb5\x8c\xa2\x00\x99\xf6\xab\xd2\x53\x71\x20\xeb\xa7\xd8\xc2\xa2\x29\x56\x90\x6e\x30\x83\x74\x04\x57\xd2\x2a\x42\x67\xfd\x58\x0e\x63\xf1\x59\x54\x35\x68\xd7\x88\xfc\x78\x81\x57\x77\x0c\x5e\xda\x3c\xda\x52\xba\x72\xb4\xa2\x79\xe5\x78\x10\xf1\xf6\x2f\xb0\x67\xfd\xe8\x08\x6d\xed\x68\x4f\xda\xca\xb1\x7b\x68\xd0\xa6\x79\x1a\x04\x0c\xad\x1f\x5d\x9d\x4d\x3b\x1a\x04\x17\xad\x1f\x2b\x22\xea\xc7\x89\x35\x5a\x3f\x1a\x1b\x49\xd7\x8f\xa6\x71\x49\xeb\xc7\x52\xaa\xe2\x47\x0a\x52\xea\xd7\x23\x94\xc8\xb7\xda\x9e\xe3\xb7\xad\xf8\x49\x39\x3a\x06\x71\xb3\xc8\xa6\xf5\x63\x59\x00\x7c\x26\x51\x4e\x6b\xa6\xfa\x56\x9b\x69\xde\x6e\x7c\xd8\xe6\xa8\xfb\x38\x1d\xa7\x50\xf4\x5d\xea\x8c\xb7\x33\x63\x44\x75\x26\x01\xcb\x0a\x60\xd8\x97\xb7\xc3\x7c\x9a\xc0\xaa\xf5\xa3\x3b\xc6\x69\x47\x47\xec\xd3\x8e\xce\x90\x1b\x05\x9e\x6f\xac\x5d\xf8\x09\x65\x1d\x6b\x99\x0e\xb2\x4e\x90\x75\x76\x18\x41\xd6\xd9\x76\x04\x59\x67\xd3\x08\xb2\xce\x9a\x11\x64\x9d\x20\xeb\xb4\x1a\xfb\x27\xeb\x58\x4b\x55\x67\x06\xb3\x1f\xad\xc1\x75\xd9\x42\x86\xd2\x94\x0f\xe9\xa9\x9b\xca\x0c\xef\xbf\x76\x24\xf6\x06\xcd\x6b\x2e\x52\x5d\x52\x3e\x05\xf2\x7a\xf0\xfa\xd5\x96\xe9\x80\xeb\x47\x9b\xa0\x9d\xea\xd8\x35\x75\x70\x79\x6c\xf2\x48\x7c\x34\xef\x92\x3b\xa9\x85\xc3\xa3\x26\x61\x6e\x70\x10\x15\x55\xad\x52\xd0\x84\xea\x9a\x41\x9c\xa5\x50\x38\x44\x6b\x29\xc8\x65\x4c\xaf\xe0\xce\xdf\x61\x36\x75\xd8\x6c\x05\x11\x50\x1b\xc7\x3e\x86\x62\x15\x22\x05\x9b\x60\xea\x0f\xbd\x59\x02\x78\x58\x91\x43\x18\x4e\x87\x24\xb6\xc9\xda\x94\xbb\x98\xb1\xa3\x7e\xd5\x3d\x9e\x1a\xe2\x2a\xf1\x3f\x66\xd9\xce\x3f\x0e\x73\xe0\x3a\xa7\x49\xb2\x20\x30\x67\x91\x2e\xbe\x0f\x03\x02\x99\xb6\xce\xce\x36\xae\x94\x16\xe2\x61\x5b\x91\x70\xb0\x72\xb6\x76\xf3\x57\xfb\xd1\x5e\x76\x5b\x59\x47\x73\x7a\xb3\x24\x97\x58\x08\x0d\x37\xaa\x55\xda\xbc\xcd\xfa\x2b\xf1\x9f\x88\xe0\xef\xaf\x9a\xba\xc7\x48\x47\x3c\xa1\x35\x1f\x58\x56\xa0\xf2\x24\x31\xe8\x6d\x3d\x66\xab\x20\x58\xe3\xc9\x5a\x93\x6d\x63\xdd\xac\x69\x25\xeb\x06\xef\xb9\x11\x99\x48\xc4\x74\x51\xdd\x41\xdb\x91\xa5\x52\xde\x86\x12\x95\x8f\x9d\x08\x68\x0e\xd1\xe5\xd2\x96\x07\x5f\xc8\xc6\x11\x7c\x21\x2b\x23\xd8\x07\x96\x47\xb0\x0f\xec\x30\x82\x7d\x60\xcd\x08\xf6\x81\xd5\x11\xec\x03\xc1\x3e\xd0\x66\xbc\x7c\xfb\x00\x09\xbe\x90\x4d\x23\xc8\x3a\xe5\x08\xb2\xce\xf6\x23\xc8\x3a\xab\x23\xc8\x3a\x41\xd6\x09\xb2\x4e\x90\x75\x9a\x8e\x16\xc8\x9d\x89\xb8\xf3\x14\x99\x4c\xc4\x0f\x64\xc8\x58\x7b\x75\x24\x06\x89\x88\x8a\xca\x22\xe6\x11\xe7\xf9\x50\x34\xb5\x26\xf4\x3e\xf9\xb7\xe0\x60\xd3\x13\x6c\xc9\xda\x14\x88\xc0\x26\x10\x99\x88\x0f\xd5\x51\x83\xc0\xf3\x90\x61\x13\x32\x6c\x3e\x83\x0c\x9b\x19\x55\xae\xf0\x11\x92\xd6\xcd\x09\x37\x95\xe3\x7f\x03\x32\xfd\x6c\xf3\x6d\x0c\xc2\x39\x84\xc1\x1e\x71\x25\x52\x58\xd8\xc5\xce\xb7\x0b\xf1\xa8\x0e\x31\xa7\x97\xd9\x16\x3b\x71\x0c\x31\xc9\x40\x0e\x2c\x92\x09\x32\x61\xae\xfe\xd7\x12\xfe\x3a\x08\x3f\xf3\xbc\x99\x3a\x24\x9e\x75\xf2\x4c\xfd\x53\x3a\xf3\x4d\x55\x5d\x74\x35\xae\xf8\xec\x52\x69\xba\xd1\x4a\x07\x44\x3b\x77\xda\xf7\xad\xf4\xd2\xae\x94\x48\x54\xf2\xae\x77\x2a\x73\xbc\x79\xac\x2d\x4e\xfb\xaf\x1c\xe4\x82\x88\x39\xc8\x52\x31\x2a\xba\xf3\xf4\x8b\x26\x33\x11\x75\x05\x90\xbb\x31\xf0\x74\x62\x8a\xe8\x52\x53\xef\xda\x6b\x48\xf6\xac\xfa\xf1\xe6\xd1\xad\xe2\xd0\xa1\xda\xf0\xdc\x6a\x29\x6f\x1e\x9d\x9a\xdf\x48\xc7\x26\x38\xd2\xa1\x19\x8e\x74\x6b\x8a\x23\x9d\x9b\xe3\x48\x97\x26\x39\xf2\xc9\x2b\x40\x6f\x1e\x1d\x9b\x8f\x48\xe7\x56\x3a\xf2\x0c\xeb\x49\x6f\x1e\x1f\x01\xdc\x5d\x5a\xec\x48\xa8\x4e\xdd\x7a\x74\x6d\x50\x23\x5d\x1b\xd5\x48\xd7\x78\xd8\xa8\x0a\xf6\xe6\x11\xea\x63\x7f\x04\x39\xad\x33\x21\xa2\x6d\x4d\xed\xc7\x16\xda\x01\x4e\x16\xbd\x7b\x3f\x95\x02\x64\xb9\x74\xd9\x30\xd6\xbc\xbb\xd2\xab\x0b\x43\x35\xab\x8d\x4d\x7d\xdc\x2a\x62\x34\xfe\x1e\x7b\x83\x57\xce\x2b\xc5\xe3\x2a\x93\xad\xb4\x8e\x29\x4d\x67\x45\xf3\x18\xa3\x14\x94\x4d\xa7\x2a\x0f\xe3\xbd\x43\x1b\x4e\x5a\x4a\x13\x3c\x5e\x0e\x30\x2d\x9f\x40\xfd\xc2\xb6\xb3\x3d\xf0\x76\xec\x9e\x2a\xef\x38\x18\x56\x3b\xdf\xba\x19\x0f\xff\xcf\xff\x3d\xaa\x55\x6f\x29\x27\x0c\xda\xdf\xd6\x23\x68\x7f\xad\x46\xd0\xfe\x36\x8e\xa0\xfd\xb5\x18\x41\xfb\xdb\x6e\x04\xed\x6f\xf3\x08\xda\x5f\xd0\xfe\x1a\x8c\xa0\xfd\x05\xed\xaf\xe9\xf8\x8c\xb5\xbf\x6e\xa3\x9a\xab\xba\x98\x0b\x12\x41\xf9\x51\x53\xcd\xa2\x32\xe2\xd9\xdf\x65\xff\xd5\xad\x0e\x58\xd5\xef\xd6\x6b\x80\x55\x2d\x71\x45\x0b\x1e\x3e\xa2\xee\x15\x0a\xe1\xca\x93\x0f\x6b\x82\x2f\x2d\x72\xbb\x33\x4c\xac\xb8\x84\x3b\x45\xc5\x1b\x1f\x58\x56\x36\x5e\x2f\xa2\xce\x62\x72\xe8\x7d\xf1\xd8\x48\x85\x0b\x5d\xbf\xc8\x35\x1b\x94\x77\x14\xde\x79\x0c\xaa\xa9\xe5\xf3\xd7\x5c\xc8\x45\x0c\x5b\x11\x1f\x55\x62\x8f\x21\x8f\x20\x6b\x6b\xc0\xc6\xb5\x13\xc6\x6d\xa4\xa3\x6f\xfa\x23\xb8\x0f\x9a\xb2\xf4\x14\x29\xa0\xc7\x73\x2b\xfa\xe2\x7a\x50\xfe\x2d\x61\x57\x89\xf2\xa1\x78\xc8\x28\x77\xc9\xb0\x82\xfb\xae\xf4\xb6\xd3\x7c\x29\x2f\x17\xbd\x54\x8a\xb7\x0f\xc9\x39\x62\x7d\x75\x62\xa6\x10\x3e\xd4\xf6\x3f\xe9\x06\x91\xf7\xab\x70\xc3\xdd\xce\x85\x1b\x96\x22\x46\x42\xdd\x86\x50\xb7\xa1\x55\xdd\x06\xbc\x68\x0f\x77\xe7\x05\x1c\xc8\x8f\xae\x3d\x92\x04\x04\x55\x9a\x27\x9a\x65\x65\x04\xb6\xb2\xaf\x4a\xac\x26\x31\x71\x91\xa0\x75\x7c\x37\x6f\xa3\xd1\x6c\x19\xef\x71\x3e\x8c\xd8\x56\x48\x4e\x5c\xb4\x25\x36\x33\xc2\x8a\x03\x5e\xed\xb0\x21\xa5\xec\xf9\x47\x0a\x9e\x21\xc1\x56\xa5\xd6\x6c\x7b\x6d\x19\x3a\x9f\x18\x94\x30\x14\xfb\x01\x06\x51\x6d\x68\x81\x51\xab\x6c\x0e\xbc\xe4\x12\x87\xea\xe8\xc8\x4b\x43\x9d\x72\xaf\x8f\xc2\x7d\xfe\x56\xe1\x12\xff\xb5\x0d\xff\xc1\x0f\x2a\x38\x50\x09\xbe\x92\xff\x3c\xef\x90\xc8\xf6\xd1\x6d\x5d\x58\xe4\x3a\x8b\x6a\x7b\xf2\x88\xb6\xcf\xa9\xf6\xc5\x5e\xfa\x30\xf6\x4e\xeb\x78\x19\x7e\x8b\x90\x30\xba\xfd\x78\x0e\x09\xa3\x4f\xe4\x9b\x78\x3e\x79\xa3\xcf\xd6\x1f\xf1\x5c\xf2\x46\x83\x0f\x62\xa7\xf1\x52\xd3\x39\xeb\xa3\x43\x9f\x43\xf0\x37\x74\x2c\x53\x75\xc2\xfc\x3f\x8e\x9f\xa1\x13\xfc\xeb\x34\xba\x2c\x44\x96\x3d\x65\x64\x59\xd0\xc2\x82\x16\x56\x1f\x41\x0b\x5b\x19\x41\x0b\xdb\x61\x04\x2d\x6c\xf3\x08\x5a\xd8\xea\x08\x5a\x58\xd0\xc2\xb6\x18\x41\x0b\x0b\x5a\xd8\xb6\xe3\x33\xd3\xc2\xba\xab\xb7\x1e\x22\xbc\x3e\x42\x84\x57\x37\x94\xb0\x03\xfa\xd7\x09\xd6\x75\x14\xd1\x15\xa2\xb9\xf6\x3b\x9a\xab\x65\xd9\x39\xae\xd9\xc7\x29\x3d\x57\xdd\xed\x4d\xf5\xe7\xe8\x5c\xb0\x98\x64\xb9\x76\xd5\xb7\x42\x0d\xba\x7d\xae\x41\x57\xdb\xd1\x50\x88\x6e\xab\x42\x74\x9b\x60\x16\xaa\xd1\x6d\x18\xfb\x13\x63\x16\xaa\xd1\xed\x3a\x42\x35\xba\xf5\x23\x54\xa3\x7b\x60\x84\x6a\x74\xa1\x1a\x5d\xa8\x47\xd0\x62\x84\x7a\x04\x6b\x46\xa8\x47\xd0\x7c\x84\x7a\x04\x5b\x8d\x50\x8f\x20\xd4\x23\xa8\x8f\xe0\x85\x6a\x37\x42\x3d\x82\x96\x23\x78\xa6\x42\x3d\x82\x56\x13\x86\x6a\x74\x2f\x2a\x66\x90\x04\xed\x2f\x68\x7f\x5b\x8f\xa0\xfd\x6d\x1c\x41\xfb\x6b\x31\x82\xf6\xb7\xdd\x08\xda\xdf\xe6\x11\xb4\xbf\xa0\xfd\x35\x18\x41\xfb\x0b\xda\x5f\xd3\xf1\x19\x6b\x7f\xa1\x1a\xdd\xde\xc7\x2a\x92\x7d\xcc\x48\x0a\xd5\xe8\x42\xfc\x62\xa3\xed\x0e\xd5\xe8\x1e\x1f\x9f\x7d\x35\xba\x5a\x2c\xdd\xd3\x95\xa4\xdb\x7d\x19\xa1\x2e\x5d\xa8\x4b\x17\xea\xd2\x85\xba\x74\xa1\x2e\x5d\xa8\x4b\xb7\xfd\xd8\x7f\x6f\xc6\xde\xe9\x1f\x2f\xc3\x83\x11\x2a\x22\x6c\x3f\x42\x45\x84\x8d\x23\x54\x44\x08\x15\x11\x82\x37\xa2\xc9\x08\x15\x11\x76\x1c\xc1\xf3\x10\x2a\x22\xec\x34\x42\x5d\xba\x17\x13\x63\x16\xb4\xb0\xa0\x85\xd5\x47\xd0\xc2\x56\x46\xd0\xc2\x76\x18\x41\x0b\xdb\x3c\x82\x16\xb6\x3a\x82\x16\x16\xb4\xb0\x2d\x46\xd0\xc2\x82\x16\xb6\xed\xf8\xcc\xb4\xb0\x50\x97\x6e\xaf\x63\xbd\x42\x5d\xba\x35\x23\xc4\x75\xed\x77\x5c\x57\x43\x5c\xa1\xb9\x16\xa9\xc8\xb9\xbe\x06\x39\x67\x11\x9c\x44\x91\xf9\xeb\x46\xdc\xc2\x8e\xb1\x44\x75\x35\xf4\x81\x69\x09\xe3\x31\x8b\x50\x91\xbc\x9b\x01\x96\x95\x33\xf2\x2d\xde\x47\xa8\xbd\x91\x68\xbc\xb3\x44\x2f\x5c\xa7\x21\x6a\x18\x60\x83\x53\xef\x0a\x2f\x0b\xa1\xb1\x10\x09\x50\xbe\xc3\x93\x8e\x1b\x82\xdc\xf1\x34\xd7\x00\xf2\xd6\x91\xe2\x72\x32\x32\x86\x44\xf0\xa9\x8b\xe7\x71\x27\x60\x48\x4e\xcb\x1b\x22\xca\xf1\xf0\xe4\x52\x02\xd7\xc9\x02\xe1\x80\x05\xae\x50\x6b\x48\xc5\x1c\x62\x24\xd9\x18\x46\x64\xe5\x48\xaa\x49\x02\xd4\xbc\x8b\x43\xf9\x32\x73\x78\x28\x19\xe1\xfc\x76\xd2\x31\xb8\xd0\xa6\x46\x40\xdc\x9d\x36\x36\xa2\x86\x4b\x96\x0d\x27\x36\x21\x5f\x8a\x50\x3f\xaa\x7c\x21\x1e\xcd\x85\xc8\xc9\x1d\xb5\x92\x92\xcc\x39\x1e\x66\xfc\x74\x03\xda\x1d\x5f\xde\x42\x26\x69\x6e\x7e\x18\x20\x55\xdb\xf1\xb1\x36\xe6\x00\x2a\xa7\x8d\x98\x54\x6d\x6b\x7a\x27\x72\x9a\x5b\x91\xd0\xa1\x32\x70\x2d\x17\x18\x6f\x67\x65\x8a\x0a\x26\xa6\x74\x0a\xbd\x9e\x22\xa7\xef\xce\x0c\xf9\xcb\x95\xa1\xd6\xae\xca\x9e\x23\x87\x99\x14\x73\x16\x1b\xe4\xfe\x40\x25\xa3\xe3\xc4\xc8\x9d\x13\x90\xc0\x8d\x58\xf0\xe5\xe1\x87\x93\xab\x5f\x2f\x4f\xde\x9d\x1f\xa1\x04\x0a\xf7\x19\xe5\xe6\x54\xe4\xaa\x0c\x14\x75\xaf\x33\x2f\x02\x3e\x67\x52\x70\xb3\x3e\xd4\xd5\x28\x99\xfb\x59\xa3\xe2\x30\x48\x50\x22\x99\x43\x6c\xe5\xe4\xe2\x6d\x9e\xeb\x30\x9e\xe5\xda\xeb\x8e\x18\xbe\x68\x0e\x10\x8f\x66\x94\x4f\xcd\x3a\xcf\x44\x6e\xe6\xfb\xf2\x4b\x5c\x91\x84\x38\x8f\xac\xe4\x44\x3d\xd6\x7e\xd9\xf7\x9c\xc2\xd0\x7a\x65\x4b\x22\xaa\x88\x66\x7e\xcd\xd5\xcf\x52\x0b\xae\xe9\xfd\x1b\x1b\xbf\x77\xf0\x65\xe5\xd2\x81\x2f\x27\x29\xcc\x2b\x2c\xbf\xb1\xab\x4a\xb0\x92\x61\x42\x0e\xaa\x77\x0f\xc9\xb9\x79\x07\xc4\x55\x00\xda\xf0\x4b\x98\x83\x44\xcd\xd3\x81\xaf\x4f\x24\x4c\xa9\x8c\x13\x50\x18\x78\xe8\x69\xb3\xd5\x0e\x1c\xc0\xa0\xd0\x6b\xb9\xd0\xeb\x88\x09\x79\x27\x30\x08\x71\x22\xde\x90\x99\xd6\x99\x7a\x73\x7c\x7c\x9b\x8f\x41\x72\xd0\xa0\x86\x4c\x1c\xc7\x22\x52\xc7\x9a\xaa\x5b\x75\xcc\xb8\x39\x5c\x83\x98\x6a\x3a\xa8\x9c\xea\x63\xcb\xb9\x07\x91\x48\x53\xca\xe3\x01\x75\xd8\x35\x28\xb6\xf5\xf8\x0b\xc7\x53\x07\xb4\xb8\x8b\xf1\x01\x1d\xa8\x19\x24\x49\xaf\x01\x3e\xb7\x93\xf9\x5a\xc8\x7a\xad\x64\x3c\xf7\xed\xed\x0f\xf0\x79\x71\x5e\x2d\x0c\x86\xe4\x52\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\x37\x1e\xe9\xf3\xcb\x9b\xab\xbf\x8f\xde\x5f\x5c\xde\x84\x93\x1d\x4e\x76\x38\xd9\x2d\x4e\x36\xf0\x79\xeb\x53\xed\x65\xce\xca\x31\x29\xf6\x1b\x39\xb5\x02\xed\x8f\x41\xb1\x01\xad\x25\x44\x3b\x9e\x0c\xea\x35\x08\x9c\xf3\xf9\x07\x5a\xb7\xb0\xf3\xb5\xe0\x20\xee\x06\x2b\x28\x17\x32\x78\x9b\xf8\xf8\x16\xd6\xac\xb6\xee\xab\x46\x52\xa4\x1d\xed\x5d\x4b\xe6\xd5\xcd\x0d\x0d\xb5\xed\xbb\xa4\x69\x59\xa1\x7a\xcd\xae\x0d\xc9\x3b\xaf\xf6\x90\xd3\x5f\x2f\xce\xce\x2f\x6f\x2e\xbe\xb9\x38\xbf\x6a\xae\x47\x77\x60\x71\x41\x9b\x42\x47\x00\xe8\x35\xe4\x92\x99\x84\x39\x13\xb9\x4a\x16\x85\x15\x64\x3d\x11\x58\x3e\xfd\xce\xef\xbb\x28\xf4\xf1\xb5\x8f\x05\x66\xdb\x2d\xb3\x3d\x83\x09\xcd\x13\xab\x3d\x1d\x1c\x0c\x9b\x70\x39\x3b\xba\x42\xdf\x6f\xa4\x68\x51\x81\xb9\x86\xc2\xd7\xb6\x76\xfb\x44\xc8\x8d\xc7\xb8\xe7\xa2\x0f\x6a\xac\xc7\x09\x8f\xd6\x42\xe7\xa4\x47\xeb\x24\x6b\x09\x9d\x96\x5e\x86\x6e\x7c\xef\x91\xe0\x13\x36\x7d\x47\xb3\xef\x61\x71\x05\x93\x76\x66\xe2\x3a\xbc\xd1\xfa\xe8\x5c\xc9\x68\xab\x34\xec\xcc\xbe\xac\x9d\x9b\xa6\x33\x27\x4d\x57\xd1\x19\xed\x23\x33\xba\x0b\xa4\xe8\x24\x88\x62\xa5\x1e\xbe\xb5\x43\x3b\x8b\x72\x57\x31\x36\x9d\x78\xee\xdb\x71\x79\x3f\xea\xcc\xae\xca\xee\x1d\x9d\xd5\xdb\xaa\x1d\x91\xe0\x11\x64\x5a\x1d\x8b\xb9\xe1\x5c\x70\x77\x7c\x27\xe4\xad\xd1\x23\x8c\xee\x3a\xb0\x58\xab\x8e\xd1\x67\x70\xfc\x85\x75\x83\xdd\xbc\x3f\x7b\xff\x86\x9c\xc4\xb1\x6b\x6e\x92\x2b\x98\xe4\x89\x6b\x27\x30\x24\x34\x63\x1f\x40\x2a\x26\x78\x9f\xdc\x32\x1e\xf7\x49\xce\xe2\xaf\x9b\x13\x67\x3f\x3a\xdc\x05\x91\x59\x57\x67\xc7\x3b\x71\x8d\x3e\x96\x45\x8d\x77\x15\x44\xc4\x70\x2d\xa6\x15\xe2\xa6\xb7\x3a\x3b\x21\xa3\x23\xd0\xec\x6e\xa2\x5f\x1e\xb8\x85\xdd\xd2\xd5\x5e\x49\x58\xad\x8b\xd3\x21\x6a\x26\xe2\x37\x44\xe5\x59\x26\xa4\x56\x24\x05\x4d\x8d\xd2\x3b\x34\x18\xd6\xaf\xff\x89\xbe\xaa\x3e\xf9\x47\xf1\x23\x3a\x9c\xd4\x4f\xbd\xde\xdf\xbe\x3f\xff\xfb\x7f\xf5\x7a\xbf\xfc\xa3\x7a\x15\x59\xa1\x8d\x02\xaa\xdf\xa2\x32\x88\x86\x5c\xc4\x70\x89\xef\xc0\x3f\x55\xcd\xcd\xe2\x2e\x68\xaa\x73\x35\x9c\x09\xa5\x2f\x46\xc5\x9f\x99\x88\x97\xff\x52\x2d\x24\x0e\xb2\x9f\x8c\x01\xb7\x68\x44\xf5\x6c\x4f\xd8\x43\x49\x4b\x3a\x3e\xaa\x6e\xd6\x6a\x13\x9d\x94\xe2\x3f\xbf\xf1\x20\x30\xd2\xd3\x9d\x64\x5a\xa3\xeb\xcd\xa5\x82\x8b\x49\xdf\x9c\xda\x52\xec\x9c\xbf\x6e\x5d\x1f\xa5\x53\xd2\x56\xec\x60\xc7\x00\x43\x88\x38\x68\xd9\x83\x5c\x30\xd8\x55\x17\xf3\xc9\xe8\x82\xcc\x2d\x84\xf7\x06\x38\x3e\xbd\xf7\x9b\x8f\x4a\xe3\x8a\xa6\x4b\x0e\x54\x85\x86\xf8\xc6\x06\x05\x15\x49\xc6\x24\x61\x29\x73\xb1\x86\xae\x41\x93\x22\x87\xf6\xc7\x61\x94\xe5\x7d\x77\xc3\x30\x85\x54\xc8\x45\xf1\x27\x64\x33\x48\x8d\xa6\x35\x50\x5a\x48\x3a\x85\x7e\xf1\xb8\x7d\xac\xf8\xcb\x3e\x58\x7b\xc1\xea\xd3\x56\x15\x2e\x5d\xa5\x8e\x22\x43\xfc\xf2\x68\x9b\x07\xfd\x9e\x90\xb6\x02\x33\x2e\x3f\x82\x48\x58\x58\xe2\xac\xc0\x59\x40\x11\xf5\xc9\xb9\x48\xf2\x14\x54\xbf\x10\x83\xac\x35\x80\xcf\x8d\x66\xa9\xf6\x4a\x50\x8b\xd9\x9c\xa9\x2e\xc2\x88\xd7\xc8\x69\xcc\x45\xe4\x8b\x5c\x67\xb9\x76\xf5\x66\x2a\x8d\xdd\x84\x42\xbb\x45\x51\x14\xa0\x46\xf6\x5f\x1f\xb4\x8f\x46\xa7\x5a\x83\xe4\x6f\xc8\xff\x1c\xfe\xfc\xd5\x6f\x83\xa3\xaf\x0f\x0f\x7f\x7a\x35\xf8\xeb\x2f\x5f\x1d\xfe\x3c\xc4\x7f\xfc\xfe\xe8\xeb\xa3\xdf\xfc\x1f\x5f\x1d\x1d\x1d\x1e\xfe\xf4\xfd\xbb\x6f\x6f\x46\xe7\xbf\xb0\xa3\xdf\x7e\xe2\x79\x7a\x6b\xff\xfa\xed\xf0\x27\x38\xff\x65\xcb\x49\x8e\x8e\xbe\xfe\xb2\xf5\xd2\x29\x5f\xbc\x6f\x49\x40\xed\x18\x74\x56\x2e\x68\x79\xc6\x8e\xe2\xac\xef\x07\xa5\xd2\x34\x60\x5c\x0f\x84\x1c\xd8\xa9\xdf\x10\x2d\xf3\x76\xc4\xa4\x64\x4a\x5d\x9f\x7f\xdf\xbd\xeb\x4d\xc9\x90\x0a\x76\xbd\x37\x07\x5c\x41\x24\x41\x7f\x0a\x4b\x8e\x7d\x93\x97\x53\x96\x62\x1e\x5f\x1a\x9f\xfb\x1c\x8c\x3b\x45\xc8\x20\xee\x6b\x29\x89\x4e\xa4\x48\x87\xa4\xe2\xde\x98\x63\xc2\x87\xbb\xef\x16\x5a\x58\x41\xfd\x08\xc6\xa0\x60\x0c\xda\x30\x1e\x35\x06\x5d\x5b\x3c\xdc\x5b\x4b\x10\xf0\x79\x53\x17\xc6\x5a\x0f\xba\xd7\x75\xb4\x20\x99\xc8\xf2\x84\xea\x0d\x9e\xb1\x35\xee\x74\x77\xd4\xcb\x78\xe4\x32\x98\xc6\x32\xb4\x74\xbd\x0f\x93\x9c\x24\x09\x61\xdc\x1e\x7c\x9c\xc0\x3b\xcc\x24\x58\xd5\x86\x50\xeb\xcf\x9e\x9b\x25\xdc\xb9\xb2\x72\xd5\xb8\x1c\x45\x94\xa6\x52\x63\xec\x31\x96\x9d\xb3\xac\xc4\x79\x9f\x18\x2f\x8b\xcf\x15\xc2\x61\x91\x0b\xb2\xb6\x33\x66\x42\x95\xf6\xcb\xc6\xd5\x68\x7a\x8b\xde\xc6\x08\x62\xe0\x11\x60\x62\x5a\x0e\xe5\xb7\x8e\x8d\xde\x46\xce\xf9\xdc\xce\x41\x49\x9c\xdb\x60\x10\x4b\xfe\xd6\xcf\xf1\xb2\x02\x10\x0c\x22\x5e\xfb\x06\xc6\x45\x1c\x02\x52\xfd\x42\xc3\x2e\xf2\xfb\x0a\x2b\xab\x7a\x9a\xc8\x83\xf6\x3c\xb3\xf0\x6c\xb5\x12\x86\x56\x98\x65\x69\x7e\xae\x33\xc9\x97\xe0\x0c\x6c\xcf\x3e\x3f\x3b\xd6\xd9\x11\xdb\xec\x86\x65\xee\xe0\x3b\xe9\x92\x4d\x76\xe1\x2c\xc9\x24\x4c\xd8\x7d\x47\xe7\xf4\x84\x97\x96\x18\x16\x03\xd7\x6c\xc2\x6c\xcf\xfb\x4c\x42\x06\x3c\x2e\x0a\x97\x62\x72\x38\xaf\xc3\x66\x2f\x83\x79\xac\xc0\xdd\x2d\x29\xbb\x5e\x27\xec\x07\x3a\x46\x02\x1d\x6b\x3c\x3e\x11\x1d\x73\x98\xbb\x3f\x44\x0c\x23\xcf\xdb\x47\xbf\x9f\xd6\x43\xd9\x11\x91\x77\x46\xb4\x32\xb3\xeb\x18\x67\x51\x36\x4b\xb2\x48\xc3\x2e\x48\xa3\x16\x36\x78\x8d\xcc\xd8\xd4\x40\x36\x81\x39\x24\x4e\x6e\x22\x29\xe5\x74\x6a\xf3\xbb\xb5\xf0\xa6\x5a\xa3\x68\x19\x3c\x96\x2c\x5e\x89\xbb\x47\x39\xde\xe0\x76\x22\x68\x8c\x17\xa5\x48\x12\x90\x8a\x24\xec\x16\xc8\x19\x64\x89\x58\xb8\x74\x6d\x1e\x93\x6b\x4d\xb5\xc1\xea\x6b\xd0\xcd\xdc\xbe\xad\x30\x16\x57\x3c\xca\x93\x64\x24\x12\x16\x35\x32\xaa\xd4\x77\xee\x02\xf7\x2b\xcb\x93\x84\x64\x38\xe5\x90\xbc\xe7\x48\x34\x4e\x92\x3b\xba\x50\x7d\x72\x09\x73\x90\x7d\x72\x31\xb9\x14\x7a\x64\xa5\xef\x7a\xc0\x9d\xbd\x91\xb0\x09\x79\x83\xd5\x6d\x34\xd1\x74\x8a\xba\x93\x77\x03\xf6\x0d\xfc\xab\x13\x58\xfa\x70\xc7\xd4\x5a\x65\xa5\x35\xe2\x7c\x81\x33\x19\x5a\x65\xff\xfe\xe4\xdb\x94\xb0\x09\x44\x8b\x28\x69\x7f\xb4\x4e\x22\x0c\x60\x28\x33\xce\x2b\xf8\xed\xaa\xa9\xbb\x1c\x4f\xd4\x02\x19\x27\xb6\xcc\xb9\xad\xdf\x5e\xa2\x7a\xb1\x22\xab\xed\xaa\x4e\x95\xc4\xc6\xcc\xb3\x2d\xdb\xcc\x84\xd2\xd7\x46\x43\xef\xa4\x18\x7a\x6f\xe4\xa7\x23\x58\xf2\x39\x49\x20\x26\x2c\x4d\x21\x36\x5a\x7c\xb2\x20\x74\xa2\x31\xd7\xb6\x66\x21\x88\x24\x58\xac\x75\x55\x4c\x66\x94\xc7\x09\x48\x32\xa1\x2c\x71\xf6\x80\xda\xfd\x1a\x64\xca\x38\x9a\x05\xac\x47\x16\x4d\x0c\xe6\xaf\x28\x12\xd2\x97\xa7\x67\x5a\xf9\x4b\xe5\xc1\x44\x3e\x52\x41\x80\x65\xd7\x32\x19\x27\x22\xba\x55\x24\xe7\x9a\x25\x76\x31\x42\xdc\x92\x48\xa4\x59\x82\x47\xa7\xc5\xc9\x2a\xfe\x39\x28\x50\x69\x60\x66\x57\xc7\x5f\x94\x97\xf0\x87\xa6\x0c\xbd\x03\x41\xac\x0b\x31\x0c\xee\x21\xea\x2c\xcf\xff\xfc\x1e\xa2\x4a\x61\x09\xec\xc7\x80\x27\x1a\xf3\x3c\xe9\x2d\xbc\xa0\x4a\x76\x2d\x72\xe9\xaa\xa3\x06\xbf\x53\x3b\xa7\x2f\x84\xe5\x5e\x41\x12\xc6\x91\xbe\xb9\xfc\x3a\xc2\xb8\x32\x9c\xbd\x76\x18\xec\xd1\x73\x42\x2b\x89\x99\xc4\x2a\x08\x8b\x22\x90\xda\xcf\x85\x05\x06\x84\xd0\xe4\xb0\x77\xdc\x3b\x5a\xb1\x3f\xf6\x8c\x04\x92\x80\xa5\xb5\x3e\x71\xaf\x58\x94\x62\x69\x96\x2c\x70\x1d\xbd\xb8\x4f\x98\xf6\x91\xd6\x32\xe7\x7e\x55\x2e\xe9\xaf\x4f\x94\x20\x5a\x52\x5f\x5d\xc5\xfe\x6a\x6e\xd2\x32\x77\x54\xfe\xb0\xf7\x5b\xaf\x4f\x40\x47\x47\xe4\x4e\xf0\x9e\xc6\xe5\x0f\xc9\x8d\x30\xa2\x74\x39\xd1\x42\xe4\x84\x83\x0d\xec\x87\xfb\x2c\x61\x11\xd3\xc9\x02\x29\x16\x11\xb9\xb6\x39\xc4\x54\xfb\x64\xc3\xf3\x7b\xa6\x5d\xbc\x9a\x21\x19\xaf\x10\x9a\x96\x6a\x11\x6a\xc4\x9c\x39\x1c\xcf\x80\x26\x7a\x66\x83\x44\xb8\xe0\x83\x7f\x83\x14\x98\x83\xc8\xdd\x95\x17\x57\xf5\xaf\x13\xcd\xc1\x10\xd1\x6f\xa1\xbb\x26\x3e\xdf\xdd\xdc\x8c\xbe\x05\xbd\x44\x32\xcc\x5b\x7c\xe8\x0e\x5a\x03\x40\x4e\x84\x4c\xf7\x80\x76\x74\xe3\xac\x1c\x90\x4c\xc8\x7d\x20\x61\x33\xa1\x5a\xed\x25\x59\xd9\x4f\xa1\x34\x6a\x43\x4e\x1a\xe3\x10\x99\x1d\xac\xc7\x90\xf8\x3e\x37\x17\xa3\x21\xf9\xbb\xc8\xcd\xd7\x8c\xe9\x38\x59\x14\x95\x18\x14\x68\x72\x60\xa6\x3a\x30\xe4\xc9\x60\xc3\x77\x40\x63\xa3\xa2\x18\xea\x01\x74\x3f\xfa\x59\x11\x77\x1e\xdc\xda\xba\xe5\x03\xb9\xd2\x22\x25\x33\xf7\xd9\xf5\xd4\x4b\x77\x32\x86\x78\x7a\x7c\x5e\x93\x84\xcc\x52\x38\xf7\xcc\x8b\xa3\x5f\x2b\x74\xc3\xc2\xdd\xfd\x3e\xc6\x32\x56\x51\x15\x6c\xae\xa1\x93\x4d\x0c\xe2\x16\x58\x06\xd5\xa0\x99\xab\xa4\x3a\xf6\xb8\xf6\x68\xe3\x44\xce\xe5\x89\xd0\xa9\xd7\x3e\xd6\xab\xd3\xca\xa3\xdd\xc4\x0d\x90\x75\x46\x56\x87\x33\xd6\xfa\xd2\x11\x10\x3f\x4e\xe9\xcb\x4f\x01\x80\x6e\x36\x9f\x74\x09\x81\xac\x83\xd0\xee\xd5\xc0\x6e\x2d\x8c\x1e\x8a\xa9\x97\x96\xb8\x22\x99\x50\x20\xe7\x4d\x93\xb9\xcb\xd1\xdd\xa7\x8b\xe6\x1a\xbf\x1f\x6b\xf2\xa4\x25\xe1\x79\x3a\x06\x59\x66\xa6\x48\xbd\x0a\x90\x4a\x64\xc2\xa5\xbd\xdd\x9b\x73\xeb\xed\x13\xcd\x93\x7f\xfe\xcf\xff\xfc\xe3\x7f\x0e\xed\xf4\x45\x94\x02\x27\x17\x27\x97\x27\xbf\x5e\x7f\x38\xc5\xe4\xd8\xb6\x50\xed\x28\x04\xb3\xeb\x00\xcc\x4e\xc3\x2f\x3f\x6a\xf0\x25\xa6\x7c\xb4\xa6\x22\x75\xdb\x3f\x4e\x69\x30\xc0\xe8\x6d\x46\xe3\x74\xb2\x5f\xa5\x58\x99\x91\x35\xeb\x86\x54\x73\xd4\xf6\xe2\x8c\xe9\x28\xbb\x16\xd1\x6d\x87\x7a\xcd\x19\x64\x12\x22\x6b\x27\xbb\x39\x1d\xd9\xd9\x8d\x7e\x79\xf9\xfe\xa6\x4c\x35\xc0\x78\x1c\xf2\xd6\xdb\x97\xbe\x73\x96\x34\xa3\x93\xde\x42\xa6\x0b\xd5\x7d\x4c\xa3\xdb\x3b\x2a\x63\xb4\x6c\x51\xcd\xc6\x2c\x61\xb6\xf8\xaf\x6f\x0a\xc9\x85\x0d\xf8\xb3\x45\xce\xc4\x64\xb9\xb4\x66\x69\x0e\x45\x93\x95\x8d\xa3\x99\x50\x96\xa0\x05\x35\xe7\x9a\xa5\xe0\x22\x82\xa2\xac\x30\xe9\x55\x6d\xda\x41\xf9\xf2\x63\x6f\x95\xaf\xde\x7b\xef\xd5\xdb\x59\x0f\x6b\x1b\x97\xb8\xc7\xac\xce\xb1\x38\x9b\x10\x12\x58\xdd\x67\xc1\xea\x32\x09\xd7\x5a\x64\x1d\x79\x49\xec\x64\x1b\x7c\x24\x63\x98\x08\x43\x84\x37\x3a\x3d\x7c\x8f\x60\x8e\xc9\x81\xde\xaa\x25\x6a\x8e\x0d\x1b\x91\xa9\xf2\x68\xe6\x0d\x94\x1c\x94\x3a\x46\x77\x48\x9e\x59\xad\x15\xc9\x75\x2e\xa1\x6f\xbe\x0e\x52\x5c\x5d\xbf\xcc\x72\x30\xaf\x07\x6e\x7f\x04\x1d\x59\xcb\x6d\x85\x90\x63\x61\x50\xb7\xfc\x65\x37\x4a\x24\xa9\x9a\x01\x96\x17\x81\x7b\xe6\xbb\xa1\x8c\x44\xdc\xeb\x95\x9f\x62\x18\xcb\x54\xd2\x08\x48\x06\x92\x09\xc3\x8c\x72\xae\x63\x71\xc7\xc9\x18\xa6\x8c\x2b\x0f\x0a\x33\xb7\x87\x19\xfa\x63\x98\x2a\x0a\xc3\x0d\xc9\x55\xad\xd8\x89\x4b\x43\x8a\x44\x79\x34\xdd\x9a\x97\x3d\x49\xc8\xb1\x2a\x2d\x93\x0b\x08\xfb\xf0\x58\xbd\xc5\x92\x0f\x73\x8e\x6f\x8e\x21\xa1\x0b\x1b\x6d\x3a\x61\x9c\x26\xec\xdf\x20\xd5\x51\x07\x1e\x27\x03\xc2\xf2\xda\xc6\x75\x60\xa9\x7e\x1a\xcd\xda\x39\x7f\x83\x8b\x6a\xcb\x11\x5c\x54\x6d\x26\x09\x2e\xaa\xe0\xa2\x7a\x64\x04\x17\x55\x70\x51\x2d\x8d\xbd\xd5\x92\x82\x8b\xaa\xf1\x08\x2e\xaa\x87\x47\x70\x51\x6d\x31\x82\x8b\x6a\xcb\x11\x5c\x54\xc1\x45\x15\x5c\x54\xc1\x45\xf5\x19\xd9\xed\xfc\x08\x2e\xaa\x95\x49\x82\x8b\x2a\xb8\xa8\xb6\x1e\x7b\xab\x7c\x05\x17\x95\x1d\xc1\x45\x55\x1f\x9f\x17\xab\xf3\x0e\x9e\x91\x51\xf5\xda\xe7\xb4\x8d\xd0\xa9\xc0\x22\xe7\x27\xaa\x36\x8d\x2b\x5e\x55\xe9\x13\x57\x29\x0b\xe2\x53\x71\x9c\x47\xa8\xf4\x33\xad\xcd\x97\xda\xd5\x55\xe1\x93\x0c\xd5\x71\x26\xec\xff\x95\x8e\x8a\x8a\x87\xc2\x2a\xbc\xcd\x73\xd6\x9e\x2c\x1b\xab\x8d\x5b\xe2\xd3\xb8\x24\xf6\xc4\x7f\xd3\x81\x1b\x22\xb8\x20\x5e\x9c\x0b\xe2\xe5\x74\xcd\x75\x9e\xf9\x9b\x99\x04\x35\x13\x49\x63\x44\xaf\x21\xf9\x3b\xc6\x59\x9a\xa7\x06\xe7\x94\xc1\x67\x36\x2f\x42\x00\x54\x81\xae\x96\x62\x5b\x2b\xa2\xb9\x91\xc5\x80\xc5\x4e\x29\x4b\xcc\x36\x62\xfe\xe6\x8c\xce\x0d\xae\xab\x3c\x8a\x00\xb0\x95\x5a\x55\xc3\xf9\xe3\xb0\x78\x53\xd1\x3a\xe3\x75\x3b\x7a\xd3\x8e\x89\xdb\x72\xa4\x38\xcb\x1f\xff\xd0\x68\x8e\xa9\xcc\xba\xa1\xcb\xdf\x5e\x8d\x4e\xab\x6d\xb2\xb9\x27\xcb\x8c\xcf\x45\x32\xb7\x1d\xf6\xf1\x26\x23\xac\xb9\x66\xfc\xd8\xcc\x7d\x0c\x9a\x56\x74\x1b\xa7\x16\x28\x02\x9c\x8e\x13\xf3\x9c\x79\xaa\xe0\xc8\x23\xcb\x77\x81\xea\x5c\x02\x99\x52\xfd\x94\x04\xbf\xbd\x0a\xd3\x4a\x7d\xe9\x82\xdf\xb4\x95\xd0\xeb\x36\x38\x23\x87\xd7\xad\x50\x53\xc4\x0b\x5b\x41\x7f\x6b\x39\xbc\x35\xa5\x6c\x2f\x1b\xb7\x3f\x5a\x04\x4b\xdc\xe0\x87\x77\x06\xe0\x03\xd7\xf2\xd9\xb3\xf3\xaa\x12\xe4\xbb\x4a\x69\x41\xb2\x84\x96\x7d\xa1\x70\x07\xbe\x43\x1e\x74\x3a\x83\xe8\xf6\xca\x79\x62\x0f\x15\x40\x21\x9b\x4e\x99\x9e\xe5\xe3\x61\x24\xd2\x63\x43\x12\xec\xff\x8d\x13\x31\x3e\x4e\xa9\xd2\x20\x8d\xb8\xea\x58\xdc\x20\x32\xb3\x30\x3e\x1d\xa6\xf1\xd1\x90\xfc\xcc\x6d\x76\x7b\xd9\x87\xb2\x52\xdb\xc1\xbc\xdf\xd7\xd9\x18\x83\xa1\xae\x42\x56\xdb\x87\x8f\x17\xb8\xbc\x61\x9b\x42\xc9\xad\x59\x52\x4b\x2f\xf8\xa7\xf7\x80\x07\xca\x45\x3a\x30\xb8\x3c\x37\x4f\x77\x67\x11\x1f\x1d\x78\xb8\xf7\xc8\xbb\xbd\x37\xa2\xf1\xbe\x78\xb4\xf7\xb0\xda\x74\x07\x0e\xd8\x2e\x3c\xd8\xdd\x79\xaf\x3f\x42\x51\xe6\x8f\xe3\xb5\xee\xd0\xb4\xd7\x91\xb7\xfa\x53\x78\xaa\x3b\xf9\xea\xb6\x1e\xea\x4f\xe7\x9d\xee\xe6\x73\xbb\x54\x04\x9e\xab\x47\xba\x03\x13\x7d\x97\xe6\xf9\xce\x4c\xf3\x1f\xcd\x03\xdd\xde\xfb\xbc\x07\x9e\xe7\xd6\x40\x66\x9c\x69\x46\x93\x33\x48\xe8\xe2\x1a\x22\xc1\xe3\xc6\x1c\x66\xa9\x4a\x67\x71\x7e\x94\x9d\xd6\xd9\xa9\xea\x89\x16\x33\xea\x8a\x91\x1b\x8d\xca\x26\x96\x78\x5f\x86\x13\x28\xd0\xab\x6c\x57\xb9\x97\xde\x09\xb2\x37\x06\x31\x9b\x75\xd2\xe5\x26\x7e\x27\xee\x88\x98\x68\xe0\xe4\x90\x71\xbf\x8f\x47\x15\x35\xb0\xb4\x4e\x16\x68\x6d\xae\xbe\x7e\xe5\x6f\x7e\x79\x66\x47\x34\xb0\x2a\xf5\xf1\xad\xc0\xee\x45\x8f\x9b\x81\xdd\x8d\x93\x3c\xa9\x9b\x82\xad\x79\xb8\x4e\x6f\x5e\x97\xe5\x94\x5f\xe3\xbc\xc5\x69\xa3\x3c\x26\x2e\x13\xed\xe5\x6d\x5a\xeb\xb8\x9a\xba\xe8\x57\xc4\xd1\x3c\x66\x35\xbe\x39\x1d\x59\xa3\x71\x30\x97\xec\x8b\xb9\xe4\x89\x62\x53\xf6\x50\xd0\x7d\xa6\xf1\x28\x41\xd0\xdd\x61\x54\x72\x53\xbf\x95\x34\x82\x51\xe7\x32\x82\x3f\x4e\x24\xce\x25\x75\x04\xb0\x10\xf9\xfc\xe1\xe1\x00\xb1\x3d\x4d\x45\x3e\x2f\x66\xca\x4e\xf2\x24\x59\x90\x3c\x13\xbc\x9e\xfd\x6c\x7d\xed\xcb\xc9\xb4\x68\x92\x5f\xf3\x96\x52\xb0\xcc\xa4\x70\x3c\x53\xe6\x9c\x1b\x1a\x5c\xf6\x44\x43\x41\x12\xcb\x34\xd3\x5a\xca\xae\x62\x53\xb3\x7c\xc3\xff\x30\x9b\xb7\x0c\x40\xac\x4d\x68\x9e\x9e\x08\x19\xb1\x71\xb2\x20\x33\x9a\x14\x0d\x70\x28\xb9\x65\x49\xe2\xa6\x19\x92\x6b\xd0\xd6\xa5\x60\x79\x67\x22\xf8\x14\x17\x47\xb9\x6f\xbc\x08\x91\x79\x36\x4a\x80\xf2\x3c\xb3\xef\x33\x9c\x78\x21\x72\xe9\xdf\x37\x2c\x1c\x13\x05\x07\xe6\x2c\xe9\x57\xda\xbb\x3d\xb8\xb1\x45\xec\x4f\xae\x8c\x00\xf0\xde\x97\xa5\xee\x57\xe7\xf4\x95\xc3\x55\xa5\xb9\x4f\x26\xc5\x9c\xc5\xd6\xbb\xe1\xc1\x86\x8d\xa4\x6d\x03\x9f\xe2\x3c\x73\xc1\x07\x1c\xa6\x14\x05\x15\x77\x8a\xec\x9e\xd9\x79\x6c\x04\x01\x8f\xb1\xa5\x8f\x91\xf0\x45\x56\x4b\xa7\x9f\x33\xdb\x8c\xb8\x02\x39\x72\xc8\x05\x11\x18\x8f\x9a\x73\xa6\x6d\x83\xfb\x59\xae\x49\x2c\xee\xf8\xd1\x4e\x5e\x57\x74\xb4\xde\xac\x05\x50\xdd\xfd\xba\x4e\xce\xb1\xdf\xfb\x30\x78\x99\x72\xa6\xcf\x09\xc9\xb9\x82\x96\xec\xbd\x33\xe1\xe8\xcf\x7f\x6a\x46\x23\x58\x0a\x22\xd7\x9f\x44\xfb\xbb\x9b\xb1\x68\x56\x15\x66\x59\x0a\x8a\x88\x7c\x49\x2d\x7e\xed\x1e\x5b\xbf\x43\x41\x05\x5c\x37\x9a\x1a\x76\xd7\x58\xbf\x96\xcb\x21\x94\x9d\xaf\x31\x4e\xfc\xec\xf2\xfa\xd7\xb7\x27\xff\x7d\xfe\x76\x48\xce\x69\x34\xab\xd6\xc4\xe0\x84\x22\xd1\x40\x42\x31\xa3\x73\x20\x94\xe4\x9c\xfd\x2b\x77\x0e\xdf\xc3\xe2\xd9\xa3\x4e\x6b\xb5\x37\xe4\xbe\xd8\x9d\xbf\xb3\x76\x70\xb6\xd7\xbf\x8d\xcb\x12\x0a\xb0\x81\xcb\xb2\xf8\x74\x6e\x2e\x59\xe5\x00\x45\x2d\x0c\x9c\x9f\xb2\xb9\x23\xc3\xae\xf8\x3d\x8d\x8b\x48\x31\x83\xe7\x06\x2d\x0c\xab\xa2\x63\x8c\xf0\x9a\x01\xe1\xa0\x0d\x5a\x17\x36\x26\xc1\x55\xad\x38\x49\xae\x40\xf5\xc9\x38\xc7\x98\xb4\x4c\xb2\x94\x4a\x96\x2c\xaa\x93\x19\x5e\x75\x59\xb8\xbc\x17\xcb\x4b\x3a\x7b\x7f\x7e\x8d\x39\x02\x99\xb4\x65\x4b\x30\xa8\x0c\xaf\xe3\x67\x8d\xc1\x3c\xe1\xda\x08\x0f\xc9\x09\x5f\xd8\x8b\xf6\x80\x33\x45\x12\xa6\x34\x20\x0b\x76\x32\xa4\x77\xa6\x1f\xbc\x1a\xe2\xff\x0e\xcc\x57\x4a\x23\x64\x16\xb1\x72\xd1\x4a\xf0\xaa\x15\x43\xd9\x38\xa9\x40\xd3\x7d\xfb\x8b\x6a\x08\x57\x06\x09\x19\x20\x56\x1a\xc2\xd1\x62\xab\x11\xbc\xb6\x41\x20\xe3\xd3\xa4\x8a\x55\xcd\xc8\x7e\x5b\xdd\xb2\xad\x66\x39\x28\xbf\x60\xd4\x54\xc1\xec\xa4\x31\x5d\xb9\x86\x8e\xda\x39\x95\xdc\xcf\xab\x53\x8e\x22\x88\x6a\x87\xde\x8b\x91\x3f\x01\x4e\xba\x49\x97\xda\xba\x66\x65\x4c\x52\x9f\xbc\x22\x7f\x23\xf7\xe4\x6f\xa8\x5e\xfd\xb9\x6d\xf3\xab\xb6\x8a\x4f\x17\x21\x46\x46\xab\xbf\x18\x75\x04\xf1\x1f\x0d\x75\x32\x33\x1a\xa8\x6a\x41\xc6\xcc\x89\xf3\x70\xaf\x41\x1a\x3a\xea\x76\xe2\x49\xdb\x86\x99\x05\x7e\x42\x34\xb3\xee\x86\x8b\x49\x3d\xac\x69\x37\x44\x33\x8f\x7f\x27\x94\xbe\x74\x54\xa8\xde\x00\xa7\x9c\x2d\xa5\x3a\x9a\xd5\xc9\x98\x11\xd4\x94\x2e\x0f\x98\x22\xb1\xc0\x28\x2b\x1b\xbe\x3c\x63\x2d\x82\x27\xf6\x07\x8d\xdb\xf9\xd3\x6b\xfb\xf9\xd0\x4e\x2d\x19\x50\x50\xf3\x71\x82\x55\xa5\x32\x56\x26\x62\x27\x93\x99\x65\xc5\x15\x9e\xf1\x80\x50\xe6\x6c\x35\x85\x95\x19\x71\xc9\x9c\xa7\x88\x72\x9b\x40\x32\x01\x29\x6d\xc4\xf9\x78\xe1\x83\xf5\x5a\x6f\x5e\xab\x93\x94\x49\xa1\x45\x24\x5a\x74\x36\xab\xfb\xb8\xdd\x74\x08\x04\x1b\xe5\xeb\xcd\xe4\x3f\x9c\x8d\xfa\xe4\xe6\x74\x84\xdd\x9e\xae\x4f\x6f\x46\x75\x4d\xe5\xe0\xe6\x74\x74\xf0\xa4\xa0\x20\x5e\xb2\x42\xc3\x74\x83\x49\x6a\x86\x27\x23\xb6\x0d\x52\x9a\x0d\x6e\x61\xd1\x90\xa7\x76\xc1\xd7\x07\xc5\x0e\x77\xf2\x41\x16\xcc\x29\xcd\x76\x9e\x4d\x02\x8d\xd9\x27\xca\xe2\xf2\x61\xb0\xc5\x3b\xd7\xa7\x73\xa5\x62\x0e\xb1\x15\x87\xfd\x13\xc0\xe3\x4c\x30\x23\x2f\x86\x1c\xaf\xdd\x9f\x0e\x39\x5e\x5b\x8f\x90\xe3\x15\x72\xbc\x56\xc7\xde\x04\xb2\x86\x1c\xaf\x97\xe5\xb7\x0f\x39\x5e\x9f\xb9\xeb\x3f\xe4\x78\xad\x1f\x21\xc7\x2b\xe4\x78\x6d\x37\x42\x8e\xd7\xee\x63\xef\x82\x96\x42\x8e\xd7\x4e\x23\xe4\x78\xad\x8e\x90\xe3\xb5\x61\x84\x1c\xaf\x0d\x23\xe4\x78\x85\x1c\xaf\x90\xe3\x15\x42\x5f\x1f\x9d\x6b\x3f\x43\x5f\x49\xc8\xf1\x72\x23\xe4\x78\xbd\x88\x00\x3f\x12\x72\xbc\xb6\x1a\x21\xc7\x2b\xe4\x78\x35\x19\x21\xc7\xeb\xa5\x98\x4b\x42\x8e\x57\xc8\xf1\xfa\x7c\x04\xdd\x90\xe3\x15\x72\xbc\x42\x8e\x57\xc8\xf1\x7a\x70\x15\x21\xc7\xeb\x25\xa8\x80\xbe\x0f\x70\xfb\x9c\xa5\xde\xa9\x48\xb3\x5c\x03\xb9\xf2\x53\x16\x52\xa4\x25\x0c\x4c\x55\x25\x82\xf6\x21\x84\x91\xe0\x13\x36\x75\x94\xfd\xd8\x36\xdf\x1d\x14\xdf\x33\xa8\x34\xbc\x7d\x86\xf1\x83\x09\x4b\x59\xb3\x44\x32\xb2\xb2\x31\x6f\x71\xae\x8a\x5f\xc6\x9c\xa4\x94\xde\xe3\x11\xa1\xa9\xc8\x6d\xc3\xe2\xc8\xed\x5f\x01\x42\xeb\xbd\xda\xbb\x9d\x21\xdd\xa8\x38\x65\x46\xdc\xa8\x8b\xb0\x12\xaa\x35\x48\xfe\x86\xfc\xcf\xe1\xcf\x5f\xfd\x36\x38\xfa\xfa\xf0\xf0\xa7\x57\x83\xbf\xfe\xf2\xd5\xe1\xcf\x43\xfc\xc7\xef\x8f\xbe\x3e\xfa\xcd\xff\xf1\xd5\xd1\xd1\xe1\xe1\x4f\xdf\xbf\xfb\xf6\x66\x74\xfe\x0b\x3b\xfa\xed\x27\x9e\xa7\xb7\xf6\xaf\xdf\x0e\x7f\x82\xf3\x5f\xb6\x9c\xe4\xe8\xe8\xeb\x2f\x1b\x2f\xb9\xb5\x48\xdc\x9d\x40\xdc\x91\x38\xfc\x51\x84\x61\xe7\xd0\xed\xe8\x2c\xba\x60\x94\x95\xd3\xe8\x18\xd6\x43\xa7\xd1\x53\x53\x14\xf3\x8a\x79\x98\x22\x22\x65\xda\x08\x87\x46\x1e\xa4\xd5\x70\x56\xa6\x6b\x4a\xa9\xa3\x03\x18\xd0\x4d\xb5\x6d\xaf\x5e\x84\x82\x56\x82\x58\x84\x97\xfc\x5c\xff\x79\x96\x66\x09\xb6\x35\xc7\xf3\x3c\xf0\xb1\x2c\xc8\x5c\x03\x6d\x78\x7c\x04\xda\xf0\x12\x69\x83\x82\x28\x97\x4c\x2f\x4e\x05\xd7\x70\xdf\xc8\xc2\x52\x27\x0d\xd7\xf5\x09\x5d\xcc\x98\xcb\xe2\x76\xd7\x88\xc8\x6c\xdc\xf7\x52\x3a\xfd\x4c\xe4\x49\x8c\xc9\x1c\x39\x47\x05\xd3\x66\xe9\x81\xb6\xda\x1f\xea\x3d\x18\xca\xbd\xfc\x12\xaf\xcf\x59\x35\xf3\x5f\x39\x9b\xd3\xc4\x68\xbb\xe5\x13\x23\xd4\x60\xaa\x0f\x6d\x7b\xe6\x35\x55\xb7\xe5\x81\x87\x81\x91\xa1\x8b\x35\x1f\xfb\x4f\xc2\x9f\xe0\x5e\x3f\x47\x29\x0d\x05\xa4\x91\x64\x73\x96\xc0\x14\xce\x55\x44\x13\xa4\x6b\xdd\xf0\x8a\x93\x0d\xb3\xe3\xc6\x4b\x91\x28\x72\x37\x03\x43\xab\x09\xf5\x26\x00\xcc\xb0\x9b\x52\xc6\x49\x6a\xb6\x28\xf3\x0f\x2b\x6b\x4b\x30\xe4\x3f\xa3\xd2\x6c\x70\x61\x33\x40\x15\x79\x2c\x44\xe2\x32\x1e\x92\x45\x39\xbf\xcb\xfd\xe1\xe2\x57\x0e\x77\xbf\x9a\xd9\x14\x99\x24\x74\x5a\x98\x0a\x14\xe8\x15\x6b\x5f\x39\xf5\xc6\x0f\xc0\x74\x82\x1c\x08\x4d\xee\xe8\x42\x95\x86\x93\x4a\xdd\x07\xf5\x86\xbc\x3e\x42\x74\xa6\x8a\x14\x73\xc4\xe4\x0f\x47\xe8\xfe\x3b\x3d\x19\xfd\x7a\xfd\xf7\xeb\x5f\x4f\xce\xde\x5d\x5c\x92\x4b\xa1\xc1\x32\xb5\x4a\x73\xc0\xa8\xd0\x30\xcc\x2a\xf1\x1d\xa8\xa5\x0b\x35\x44\xdb\x25\x53\xe4\x8e\xf1\x58\xdc\xa9\xc6\x36\x5a\x8b\x7e\x06\x78\x40\x79\xa3\x39\x22\x9a\x51\xec\x79\xd8\x82\xc3\xac\x44\x98\x54\x27\x45\x1e\x1e\xc7\xc7\xb1\x14\x99\x05\x82\x37\x72\x95\xac\xb6\xae\x46\x57\x63\x58\x71\x7f\x27\xf5\x09\xa7\x92\x72\x5d\x5a\x7b\xca\x3d\x73\xcd\x16\x87\xad\xb7\xe3\x79\x67\x34\xd1\xb8\xbb\x6c\xa6\x93\x38\x86\xb8\x06\xfe\x17\x17\x39\x78\xea\x3f\x6e\x51\x56\xa9\x20\xa3\xf7\xd7\x17\xff\x7b\x09\x8f\x17\x59\xbb\x40\xa9\x6e\x32\x63\xa5\xc8\x3a\xdb\xdd\x2b\x97\x79\x19\xf6\x77\x2f\xf6\xb7\xe0\x96\xdd\xb8\xe7\xaf\x72\x5e\x2f\x64\x54\xce\x4f\x52\x11\xc3\x90\x8c\x0a\x3f\x41\xfd\x6a\xa5\xc0\x01\x95\x40\xcc\x2d\x5c\x33\x9a\x24\x8b\xaa\x88\xa6\x85\xcd\x42\xac\xd5\x66\xa8\x12\xf2\x09\x4d\xd4\x53\x53\xe3\x36\xbc\xd1\xc8\x11\xef\x8c\x3e\xdc\xc9\x76\x14\xb3\x91\x18\xb8\xd0\x4e\xb0\x36\xab\xc4\x7a\x17\x52\x44\xc4\x2a\xdf\x95\x60\xac\x1a\x7f\x53\xd6\x57\xe1\x59\x23\x53\x1e\xd8\xa3\x62\x66\x6b\xa8\xce\x15\x2c\x0b\xe8\xbe\x0f\x71\xa1\x8e\x9b\xd9\x25\xd0\x58\xf0\x64\x81\x91\x97\x36\x96\x22\xa5\xea\x16\x62\xfb\x83\x13\xcd\x0a\x4f\x85\x99\xb1\x78\xd5\x8d\x59\xb7\x77\x4b\xa0\x48\x66\x23\x3c\xd0\x9d\x01\xf1\x13\xef\x7a\x8b\x43\x68\x80\xf2\x9e\x27\x8b\x2b\x21\xf4\x37\x45\x1a\x6d\x27\x18\xf0\xa3\x93\x96\xeb\xa6\x68\x14\x27\x29\xbe\x77\x80\xbb\x81\x87\xaa\x9a\xc1\x7b\x56\xee\xf8\x73\x3f\x52\x32\xe7\x27\xea\x5b\x29\xf2\xc6\x4c\x6c\x45\xd8\xfc\xf6\xe2\x0c\x49\x51\xee\x5c\x95\x5c\xcb\x05\x96\x0e\x58\xad\xfa\x56\x28\x06\x3f\x38\x67\x6b\xf5\x4c\x94\x7e\x31\xf2\x8e\x2e\x08\x4d\x94\xf0\xb0\x64\x7c\xad\x16\xea\x54\x5c\x73\x79\x2c\xf4\x6c\x45\xb7\x35\x07\x6a\xf5\xb9\x7e\xc5\x73\x59\x96\xa1\x63\x7c\xe5\x71\x4d\x6f\x41\x91\x4c\x42\x04\x31\xf0\xe8\xa9\xb7\xfd\xa9\x1d\x7e\x88\x3a\x97\x82\x9b\x83\xd9\x09\xf2\x5c\x14\x9e\x5e\x07\xd2\x2a\xaa\xa0\xcf\xd8\x69\x7f\x14\x3d\xc7\x78\x2c\x73\x05\xd2\xba\xb9\x65\x0e\x76\x27\xbf\xcf\xc7\x90\x18\xc8\x1b\x95\xd4\x75\x8a\xb7\xe6\x0c\x96\xd2\x29\x10\xaa\x0b\x4c\xd3\x82\x00\x57\x86\x62\x5a\x03\xa8\x26\xb1\x80\x32\xfb\x9e\x2a\xf2\xc3\xc5\x19\x79\x45\x0e\xcd\xbb\x8e\x10\x7f\xb0\x91\xbc\x16\x36\xc8\x6d\x59\x47\x9d\xf8\x29\x70\x49\x88\xbc\x44\x48\x4b\x24\xfa\x84\x0b\xa2\xf2\x68\x56\xed\x5e\xef\xd5\x66\x17\x08\x89\xae\x95\xfd\xc4\xf5\xa7\xa5\x50\x3f\x28\x90\x9d\x11\xa8\x1f\x1a\x10\xa8\xaa\x18\x65\x70\xae\x0e\x3d\x8b\x58\x29\x68\x1a\x53\x4d\x1d\xe1\xf2\x37\xec\xed\x96\x7e\xde\xe4\x4b\xc1\x5b\xc6\xf3\x7b\x1b\x78\xd4\x9d\xa9\xe5\xfa\x1c\xa7\x25\x91\x87\x3a\xee\x3a\xcd\xb2\x84\xd9\x6a\x1b\x4b\x81\x70\x17\x35\x5c\xe9\x6f\x10\x13\x91\x4e\xd0\x24\x11\x86\x3e\x1a\xe1\x84\xf2\x58\xa4\x2b\x2f\x33\x42\x24\xd4\xea\xa5\x0e\x49\xc0\xbe\xfa\xd8\x13\xa3\x50\x02\x73\x68\x51\x5b\x6c\xb9\x3e\xac\x99\xcd\x00\xc7\x63\x04\x4e\x4f\x12\x3a\x86\xc4\xc2\xd8\x62\xa0\x5a\xc5\xc0\xa7\x8e\x46\x95\x22\xe9\x2e\x7d\xe6\x4a\x24\x60\xc3\xbb\x3c\x20\xcc\xf4\xcf\x02\x0e\x38\x49\x57\x70\x40\x6d\xb0\x06\x07\xd4\x6b\x9f\x03\x1c\xf2\x16\xac\x9e\x2c\xc3\xc1\xc8\x0d\x75\x38\x20\xf3\xde\x77\x38\x28\x88\x22\x91\x66\x23\x29\x8c\xda\xd9\x19\x6f\x72\xd3\x96\x3e\x43\x6b\xd8\x58\x13\x8c\x85\xbc\xa0\x7e\x33\x95\x95\xc0\x4e\xaa\x2d\x93\xf0\xd1\x9d\xff\xab\xc2\xb3\x90\xf4\x2c\x33\x32\x3f\x4b\xcd\xbd\x68\x9e\x74\x17\x9e\x33\x3b\xe8\x22\x37\xa2\x85\xb1\xb3\x13\x6e\x24\x22\x9a\x60\xed\xd8\x76\x28\x47\x96\xd1\x6e\x79\xe2\x4a\x38\x2f\xfa\x28\xf1\x37\x1f\x40\x82\x65\x44\xf1\x17\x67\xc2\xe4\x22\x86\x8a\x2f\xdb\xc6\x21\xdf\xd8\xb0\x4f\xbc\xcf\x47\x12\x1b\xb9\xc2\xbb\x95\xe3\xda\xd3\x5a\xb8\x0a\x68\xef\x8a\x8a\xb4\x66\x81\xc0\x63\xc6\xa7\x68\x57\xeb\x13\x09\x89\x8d\x41\x76\x44\xe0\xd6\x6a\x90\x3d\x3c\x12\x7e\x52\x7f\x1e\xfc\xab\x51\x16\x63\x82\xbb\x99\xd1\x52\xe4\x25\xac\x89\x25\xb7\x4c\x91\x83\xb7\x1e\x00\x2d\x4a\x78\xee\x23\x87\x39\xb0\x5f\x58\xec\xa6\xb5\x74\xde\x32\x1e\xbb\x70\xdd\x1a\xb0\x8a\x62\xeb\x56\x0e\xc6\x40\x70\x16\x57\x69\xcb\x1b\xf2\x33\x27\x05\xb0\xc8\xa0\x31\x7a\x5c\x59\x91\xd9\xdb\xe8\x06\x0f\x1b\x5e\x8b\x97\x2c\x4f\xf3\x03\xc7\xbd\x37\xef\x1d\x18\xcd\x7d\xf5\x3e\xff\x2d\x4f\x5a\xba\xc7\x51\xbf\xae\xb5\x98\x1f\xed\xb4\x5e\xa4\x8f\x0c\x5a\x6b\xc6\xa7\xaa\xaa\xc9\xd0\x24\xa9\x19\xc3\xd7\xa9\x32\x7e\x87\x8b\xd2\xfa\xab\x2a\xc4\x52\x9a\xc1\x73\x51\x43\x12\x23\x4e\x3c\x73\x25\x64\x9a\x2a\x7a\x2a\x0d\x24\x34\xa3\xc9\x75\xd6\xbc\x44\x29\x59\x29\x87\xf7\xee\xfa\xa4\x3e\x35\x32\x6b\xec\xfc\x60\xf6\xca\x5c\x27\x34\x4e\x99\x52\x68\x08\x83\xf1\x4c\x88\x5b\x72\xb8\xa6\x1e\x57\x25\x4e\x4b\xb1\xa9\x3a\x76\x38\x3f\x30\xab\x3f\x22\x8c\x27\x45\x54\x14\xea\xc1\x5c\x2b\x6f\xc8\xc1\x97\x44\xc5\x2a\x70\x0f\x5d\xdd\x6a\x17\xac\xb0\xba\x4c\x5b\xa9\xda\x60\xc1\x93\x13\xec\xd5\xed\xb9\x6c\x59\x76\xe5\x91\x2d\xba\x74\xb8\xbd\x5c\x59\x6d\x2d\x1c\xad\xf4\xf8\xe4\x40\x72\xc2\x45\x04\xaa\xbb\x82\x4e\xdf\x95\x73\x92\x18\x6c\x16\x0f\x60\xf4\x13\xdd\x18\x64\x87\x76\xe9\x1e\x26\x83\xba\x47\x7b\x55\x89\xfa\xa6\x24\x2e\x46\x1f\x49\xb2\x19\x1d\x58\x25\xdd\x50\x34\x24\x81\x5e\x84\x98\x09\x2e\x5c\x92\x84\x61\xa2\x82\x23\x4a\x23\x89\xb2\xde\x3c\xdc\x13\x47\xa2\x2b\x4b\x3d\x2d\xbd\xc4\x55\x47\x20\x26\x93\xd9\xfa\x11\xe5\x1a\xee\x98\x9e\xf9\x4e\x2f\x35\xaf\x21\xae\x44\x82\x42\x07\x0c\x27\x20\xa5\x90\x2e\x20\xcb\xdb\xad\x71\x26\xa4\xe4\x18\xd1\x65\x90\x84\x9a\xbf\x7a\xaa\xea\xa8\x2e\x4b\xc1\x63\xbc\xa2\xc1\x26\x98\x4c\x20\x42\x41\xab\x0a\x60\x4b\xb5\x0f\xcb\xc2\xb7\x2e\xcb\xc0\x20\x98\x2b\x25\x9f\xb2\x7b\xf3\x96\xea\x53\x55\x97\xb8\x2b\x38\xbb\xfe\xf2\xd1\x90\x90\x0b\x5e\x44\xf0\xf6\xcd\x2e\x56\xef\xf4\xa1\x67\xda\x7c\x62\xb5\x0f\x01\x7e\x40\xd5\x70\x66\xa4\x43\x99\x77\x80\xf1\x6d\xcc\xe1\xa4\x6a\x12\xef\x94\x1c\xa0\x69\xdc\x4d\x6a\xb6\xde\xcb\x00\x6d\x4c\xe5\xe6\x96\x8f\x65\x2e\x7f\x1e\x0e\x10\xd2\x96\xce\xb9\x6a\x0a\x1d\x15\x87\xbf\xae\xcc\x56\x91\xde\x0b\x87\xdb\x48\xc4\xb6\x9a\x4a\x51\x0d\x02\x7b\x3a\x61\x75\x17\xf6\x6f\x2f\x9f\x95\x32\x1e\x17\x36\x3b\xa0\x5a\x66\xc5\x95\xd4\x8e\x89\x11\xb5\x13\x6f\x5b\x48\xb3\x04\x30\x8b\xb3\x32\x73\x99\xa0\x5a\xa9\x26\xdf\x2f\x16\x52\x16\xa4\x77\xc5\x5d\xfa\xe4\x9f\x78\x28\x8b\x40\x54\x5f\x77\x62\x54\x3c\x6e\x35\x44\xa6\x7c\x6b\x09\xcc\xb0\xd4\xc2\x9b\x2e\x48\xcc\x26\x13\xf0\x01\xaf\x46\x73\xa4\x92\xa6\x86\xc4\x2b\xe2\x40\x30\x86\x29\xb3\x01\x91\x05\x61\xeb\x19\x71\xcf\xe5\xfa\xf5\x2d\x31\x64\x9a\xa4\x6c\x3a\xb3\x88\x42\x28\x66\xe8\x12\xef\x54\x4c\x04\x8d\x09\xe2\xb6\x90\xe4\x8e\xca\xd4\xf0\x0d\x1a\xcd\xd0\x43\x49\x39\x89\x73\x89\x55\x96\x35\xd0\x78\x31\x50\x9a\x6a\x23\x29\x83\x74\x0a\xa5\x5f\x7f\x28\xa9\xff\xe0\x08\x25\xf5\xb7\x1c\xa1\xa4\x7e\x28\xa9\xbf\x3a\xf6\x26\x3a\x34\x94\xd4\x7f\x59\x65\x92\x42\x49\xfd\xa7\xf6\x26\x84\x92\xfa\xa1\xa4\xfe\x43\x23\x94\xd4\x7f\x64\x84\x92\xfa\x0d\xc6\x0b\xa0\x5c\xa1\xa4\x7e\x83\x11\x4a\xea\xaf\x1f\xa1\xa4\xfe\xea\x08\x25\xf5\x37\x8e\x50\x52\xbf\xf1\x08\x25\xf5\x43\x49\xfd\x50\x69\x74\xb7\xb9\xf6\xb3\xd2\x28\x09\x25\xf5\xdd\x08\x25\xf5\x5f\x44\x3d\x45\x12\x4a\xea\x6f\x35\x42\x49\xfd\x50\x52\xbf\xc9\x08\x25\xf5\x5f\x8a\xb9\x24\x94\xd4\x0f\x25\xf5\x3f\x1f\x41\x37\x94\xd4\x0f\x25\xf5\x43\x49\xfd\x50\x52\xff\xc1\x55\x84\x92\xfa\x2f\x41\x05\x54\x3a\x66\x8d\x2a\x80\x6e\x53\xac\xc8\x05\xa1\x57\x6a\x03\x8c\xf3\xc9\x04\x24\x52\x2e\x7c\xf3\x4a\xf0\x54\x59\x97\x71\xd9\xc9\x0a\xba\x8f\x75\x8f\x5c\xbe\xce\x86\xc7\x5d\x31\x02\xac\xd4\x59\x46\x8a\x9f\xbf\xff\x66\x4d\x65\xa4\xc6\x51\x85\x4d\x63\xa4\x71\xcd\xef\x79\x33\xff\xf8\x06\x80\xaf\xcb\x1f\x73\x70\x8f\x12\xa1\x5c\x84\x3b\x02\x2b\x9a\x51\xce\xc1\xeb\x7b\x4c\xa3\x1d\x65\x0c\xc0\x89\xc8\xc0\x79\xa7\x29\x51\x8c\x4f\x13\x20\x54\x6b\x1a\xcd\x86\xe6\x4d\xdc\x03\xbb\x8c\x46\x77\xbf\x28\x2d\x81\xa6\x3e\x2e\x3f\xa5\xcc\x4e\x45\x68\x24\x85\x52\x24\xcd\x13\xcd\xb2\x62\x32\xa2\x00\x13\x6a\x2c\xa3\x2a\x80\x81\x51\x71\x65\x08\x7b\xbf\x7c\x9b\x5b\x96\xa8\x96\xa6\x43\x6d\xb3\x8f\xf5\xc0\xd3\x4c\x2f\x8a\x38\x5e\x20\x13\x26\x95\x26\x51\xc2\x90\x5b\xe3\x1b\x6d\xee\x34\xce\xd7\xf7\xbc\x9a\xbb\x95\x2a\xb7\x54\x1e\xa3\xd8\x9a\x69\x65\xa3\x62\xcb\x09\xdd\x54\x31\x53\x4e\xcc\x57\x7d\x42\x7d\xdd\x34\x0b\x68\xbf\x52\x04\xb5\xe7\x2c\x76\x76\xf7\x53\x65\xba\x4a\xbd\xd8\x32\x6c\xb8\x44\x74\x4c\x71\xf0\xc8\xd9\xaf\x65\x73\x94\x02\x05\x46\xe9\xad\x1c\x03\xdc\x00\x0e\x73\x83\x03\x10\x81\xe1\xaf\x74\x03\xd6\x7f\x72\xa4\xaf\x30\xc5\x77\xa0\x14\x9d\xc2\xa8\xa1\xa3\x61\x93\x46\x86\xbe\x86\x72\x63\x10\x15\x12\x9b\x5d\x5b\xfc\x52\x46\x67\xd6\xc5\x20\x92\xda\x35\x15\xc2\xcf\x9d\x64\x5a\x03\x6e\x2a\x56\xd8\x43\x5f\xe5\x72\x02\x7e\x6f\x29\xc6\xf3\x9d\x9f\xa4\x7c\xd8\x10\x75\x1e\xdb\x88\xcb\x31\x90\xb1\x64\x30\x21\x13\x86\x61\x9c\x18\x58\xd9\xb7\x05\x97\xa8\xb5\x02\x28\x65\xf4\x5d\xc1\xbd\x2c\xeb\xd7\x35\x24\x3f\xba\x85\x69\x99\xf3\x88\x56\x6a\xd9\x62\x86\x29\x9b\x90\x29\x06\x66\x3a\x69\xf1\x4f\xaf\xfe\xfa\x67\x32\x5e\x18\x96\x86\x92\x95\x16\x9a\x26\xc5\x47\x26\xc0\xa7\x06\x56\xf6\x78\xd6\x73\x24\x0b\x08\x60\x37\x0f\xbb\xf0\xd7\x7f\xb8\x1d\xd7\x79\xec\x71\x0c\xf3\xe3\x0a\xfc\x06\x89\x98\xae\xeb\x8f\xd2\x3c\x64\xbb\xa1\x4a\xb4\x06\xcd\x44\xc2\xa2\x45\x6b\x44\xf3\x95\xbf\xc8\x4c\xdc\x59\x59\x7f\x0d\xf6\x94\xe9\x56\x99\xc8\xf2\xc4\x1a\x9d\xbf\x29\xb2\x8b\x73\x05\xab\x39\x80\x6b\xcf\x05\x9a\x49\xdd\x14\xcb\x75\xd3\x6d\x3c\xae\x7f\xa5\x70\xb9\x25\xce\x90\x57\x14\x00\x43\x45\xe8\x1b\x9a\x24\x63\x1a\xdd\xde\x88\xb7\x62\xaa\xde\xf3\x73\x29\x85\xac\xaf\x25\xa1\x86\x5a\xce\x72\x7e\x6b\x3b\x38\x14\x25\x12\xc4\xd4\x88\x56\x59\xae\x7d\x22\xc3\xba\x0f\xb6\xf9\xf2\x9e\x08\x7b\x35\xa8\x9c\x05\xee\x59\xa9\xeb\xb8\x54\x2d\x8b\x91\xd5\xf9\x55\x15\xd9\xfe\xf0\xea\x4f\x7f\xb1\xa8\x4b\x84\x24\x7f\x79\x85\x31\xdb\xaa\x6f\x0f\x31\xd2\x36\xc3\x28\x52\x9a\x24\x46\x6d\xa8\x22\xa5\x01\xf4\x3a\x24\xfc\xe4\x38\xa8\xdb\xa3\xdb\xd6\xa2\xd4\xcd\xcd\xdf\x51\x8e\x62\x5a\x41\x32\xe9\xdb\xac\xa4\x42\xad\xe9\x21\x63\xe8\x39\xea\x83\xa9\x61\x7b\x20\x00\xcd\x45\x92\xa7\x70\x06\x73\xd6\x45\x13\xa7\xda\x6c\x5e\xd5\x4f\x98\xc2\x04\xb0\x71\x22\xa2\x5b\x12\xbb\x8b\x95\xc8\x93\xe5\x4a\xe0\xcd\xa1\xd0\x34\x06\xa7\x45\xec\xcd\xc6\xef\xaf\x45\xdd\xa4\x34\xcb\x8a\x1c\x21\x49\xef\x6a\xc0\xc0\x33\x89\xe5\x0a\x5a\xd6\x93\x69\x6d\x66\x6e\x6b\x64\x1e\xb8\x2f\x32\x74\xb3\xf1\x14\x8d\xa3\x4e\xda\xdb\xa8\xcb\xd5\x37\x37\x4c\xd6\x10\xa2\x9c\xd0\x9f\x86\x0c\xff\x6d\xb3\x4a\x56\xb2\x22\x8b\xc4\xba\x02\x31\xac\x00\x60\xd0\x07\x49\x72\x73\x83\x6b\x07\xd6\xcd\x76\x21\x47\x35\xb8\xf0\xc2\xaa\x9c\x52\xed\x04\x42\x6f\xbe\xa6\x24\x03\xa9\x98\x32\x7c\xf9\x03\x1e\xa8\xd3\x84\xb2\xb4\x62\x02\x7c\x1a\x20\xd8\xc3\x8d\xe5\x93\xdb\x53\xca\x91\x88\xdd\x84\x48\x0a\x6d\xe9\xe8\x35\x62\x6d\x5d\xaa\xed\x90\xa1\x3e\x35\xa9\xfc\x50\x42\xb3\x4e\x29\xcd\x2f\x05\xa9\xb4\x77\xbd\x24\x02\x89\xdf\xf7\x5c\xe9\x63\xb1\xf8\x8e\xc8\x00\x12\x46\xb7\xb9\x75\x4a\x58\x53\x1e\xed\x41\xa9\x88\xf4\x4e\x0f\x1c\x12\xeb\x05\x37\x67\xc2\x3d\x4a\x7a\x6f\x7a\x4f\x4a\x24\x2d\x88\xa4\xc8\xe8\xb4\x55\x2f\x9f\x25\x48\x2d\x4f\x5b\x2d\x34\x61\xd4\x20\xbc\x5e\x94\x5d\xc3\xbb\x20\x2e\xeb\xe8\x60\x95\x24\xeb\x1d\xf5\x00\x76\x0a\x82\xcd\xc7\xbe\xa3\x0b\x42\xa5\xc8\x79\xec\xec\x4b\x85\x81\xef\xdd\xd2\x8b\x2f\x05\x07\x6f\x38\x5f\xae\x53\x81\x16\x7d\xc6\xc9\xeb\xe1\xeb\x57\x2f\x85\x53\xe1\x17\x2e\x71\xaa\xcb\x82\x53\x59\xfa\xf4\xa4\xdf\xea\x2b\xde\x77\xf4\xbd\xef\x9c\x89\xa5\x2c\x68\xcf\x7c\xb9\x6c\xfc\xe9\x4e\x32\x0d\x95\x1e\x7f\x87\xa8\xb8\x18\xfd\xb0\x52\x95\xe1\x68\x5d\x27\x89\x96\x40\x6a\x57\x06\x43\xe5\xe3\x8f\x48\xb7\x1c\x81\xc2\xe3\xb6\xce\xc2\xa5\x1e\x20\x61\x55\x40\x1d\x1c\x90\x43\x7b\x67\xcf\x26\x34\x1f\x3d\x29\x6a\x39\xa0\x9d\xdf\x67\x2d\x6a\x6c\x2e\xe5\xce\x67\x14\x6d\x70\x59\x87\x10\xfc\x6f\x98\xd1\x39\x60\x22\x37\x4b\xa8\x4c\xd0\xe7\x78\x6d\xd7\x4e\xc6\xb9\x26\xc0\xe7\x4c\x0a\x9e\x02\xd7\x64\x4e\x25\xc3\xaa\x38\x12\xb0\xb2\x83\xd1\x45\xbf\x3c\xfc\x70\x72\x85\x01\x0d\x47\xae\x24\x85\x5b\x65\xae\x7c\xf9\x9a\xea\x4a\x2a\xd3\x3d\xba\x7d\x7e\x1d\x06\x86\x48\x73\xfd\xba\xcc\x7b\xd2\x5c\xe7\xb6\x2d\xcb\x7d\x94\xe4\x8a\xcd\x9f\x8a\x92\xb8\x0c\xfb\x33\xd6\x68\x9f\x97\xb2\xfd\x4b\x40\xad\x24\xee\xa3\x69\x7d\x4d\x82\xde\x8a\xc3\xa4\xa7\x8a\xa4\xbd\xaa\x0f\xdc\x99\x9e\x5c\x2d\x0d\x1b\x3e\xe7\x2b\x2e\xae\x88\x10\x58\x37\xe6\x69\x8d\x50\x31\x57\xa7\xb8\xc2\xdd\xc0\x5a\x0f\x48\xae\xe5\xf1\x9d\x5d\x5e\x57\x8b\x90\x58\x75\x49\xc4\x43\x32\x2a\x7f\x2c\x2b\xd5\x60\xfd\xb4\x42\x89\x04\x39\x2d\x8b\x8a\x4f\x81\x83\x44\x21\xc1\x4c\x59\x6b\xab\x4a\xc6\x54\x59\x27\xcf\xd9\xe5\xb5\xb5\xd9\xee\x06\xb3\xc6\x62\x76\x73\x09\xd5\x70\x7c\x9b\xc6\xd0\x40\xb8\xad\xf7\x4c\x2b\x0c\x56\x06\x30\xa8\x94\xda\x89\xc9\xc5\x88\xd0\x38\x96\xe8\xf6\x71\xa2\x4f\xa5\x52\x65\xe1\x5b\xc0\xaa\x30\x54\x41\x75\x4d\x15\x70\x23\x89\x2b\x01\x4b\xce\xf2\x2c\x61\xd6\x8d\x50\x7d\xa0\xac\x66\x83\x4d\xbe\x76\x47\xda\x36\x6a\x5e\x63\x25\xaf\x05\x15\x12\x4d\x8b\x52\x3e\xb0\x7b\x12\x94\x48\xe6\x65\x41\xe1\xa5\x5d\x73\x27\x02\x4d\xe2\xc5\xae\xf9\x1a\x94\x5b\xed\x18\x70\x2d\xcd\xd1\x5c\xde\x2d\xec\x62\x9f\xe4\x78\x9a\x8a\x09\xd9\x1c\xd0\x3f\xee\xca\x6f\xba\x32\x6e\x65\x89\x63\xeb\x1b\xb6\x55\xa6\x81\x4a\x4f\xd1\x70\x55\x0d\x4f\x22\x79\x2a\x44\x58\x36\x76\x9c\x5d\x5e\x5b\x4a\x68\x3f\xbe\xe8\x4e\xbb\x6e\x97\x4a\xaa\xd6\x18\x03\x9f\xac\xca\x50\x1b\xcd\x63\xa9\xb9\x9f\x6b\xd7\xdd\x2a\x90\xa5\x85\xf8\xd7\x2a\xd9\xae\xc5\xdb\x15\x50\x19\xcd\x9a\xc0\xff\x01\x42\x60\x27\x25\xb1\xb0\x91\x00\x13\x21\x51\x25\x1e\x20\x79\x4f\x84\xb8\xcd\xb3\x6d\x28\xba\x9b\xc6\x36\x5c\xdb\x8a\x40\xd4\x9e\xf8\xac\x68\x7a\xcc\x55\x13\x7f\x6f\x5d\xf6\x01\x6d\x25\x1e\x9c\xa8\x4c\xa0\x10\xcb\x7a\xd3\x69\x92\x2b\x0d\xf2\x1b\x26\x95\x3e\xf0\xf5\xa2\x11\x83\xad\x4d\xa4\x57\xbd\xe1\x47\xa6\x67\xae\x74\x63\xaf\x5f\xbf\x64\xfe\x76\x13\xf7\x8c\x4e\xdb\xbb\x14\x1c\x7a\xc3\x65\xb1\xab\x20\xe5\x05\x59\xdb\xc8\x53\xdc\xd2\x15\x24\x36\x5e\x14\x2f\x54\x70\xe5\xc6\x95\xad\x34\x6f\xf0\xf4\x4f\x81\x26\x14\x4b\xc4\xe1\xdd\xb3\xb2\xcc\xa4\xad\x1b\x65\xeb\x64\x0a\x27\xe8\x2d\xaa\x20\xaa\x94\x92\xd2\x62\xf3\x67\x37\x91\xe7\x76\xc6\x00\x5b\x7e\xd4\xd5\x0b\x79\xcb\xf8\xed\x8e\xe8\x57\x8f\x2e\x39\x5f\x99\xad\x56\x4f\xdc\xfa\x68\x19\xb7\xc1\x77\x86\xc5\xd0\xb1\xc8\xb5\xaf\x49\xa2\x2a\x8a\x23\xe3\xff\xb4\x7b\x81\xf6\xf6\xcc\x56\xec\x5b\xa7\x23\xaa\xbe\x35\xfa\x78\x25\x50\x2d\xb8\xa6\x58\x5b\xf4\x4c\x44\xb7\x20\x49\x62\x96\x31\x24\x65\xe0\x4b\xad\x9a\xa5\xcc\x61\xc7\xa8\x8b\xa6\x96\x0e\xc8\x66\x90\x82\xa4\x49\x59\xd4\xb5\x05\xa8\xdf\x3a\xc2\x59\xcc\x5a\x8d\x49\xb1\x45\xd1\x5c\x19\x46\x73\x0e\xcf\xd7\xdd\x95\xd2\x85\xaf\x74\xcb\x38\x86\x1b\xdc\x33\x85\x66\xfd\x4c\xc4\xd5\xc4\xb3\x5c\x81\x1c\x14\x69\x81\x2e\xf7\x46\x15\x81\x38\x31\x8c\xf3\xe9\x94\xf1\xa9\xa3\xce\x48\xd3\x2b\xe5\xb6\x0b\x4d\x07\x23\xbd\x23\x09\xb6\xe0\x2c\x4a\x0f\x36\xbe\x8c\x55\xef\x4f\x45\x6c\x6f\x1f\x2f\xac\x36\xe8\x77\xb6\x0c\x90\xbe\xe0\x44\x48\x57\x1a\x81\xc6\x31\xae\x7d\xf5\x0b\xf1\x6a\xfd\xab\xfa\x45\x1c\x87\x8d\xec\x2e\x9e\xaa\x80\x45\xe5\x63\x23\xec\xe4\x32\x82\x75\xb6\xd3\x4a\x89\x5f\x3a\xa7\x2c\x41\x3b\x85\xe0\x24\xb2\xa7\xd8\xc5\x9a\x99\xd3\xcf\x7b\x18\x05\x87\xcd\x3a\xf1\x9d\xe7\xab\x18\xd0\xa2\x44\x55\x53\x3e\xd3\x88\xc7\xd4\xcb\x0b\x9d\xf0\x35\xdf\x62\x03\xc6\x35\xa4\x99\x90\x54\x2e\x96\x3d\xa6\x86\x26\x1a\x8c\x33\xfb\xb5\xb4\x31\x23\x11\x23\xdb\x58\x83\x67\x73\xdb\x38\x78\x0d\xaa\xad\x45\x69\x24\xba\x5c\x10\xbf\x81\x86\x3d\xa8\x68\x06\x71\x8e\xc1\xea\xd3\x9c\x62\x63\x73\x43\x34\x9c\x6d\x7d\xe1\xa2\x00\x2d\xee\x15\xf1\x85\x45\x56\xc2\x02\x63\x72\xb0\xe8\xa7\xf9\x05\x8b\x87\xda\x48\x44\xdb\xd7\x19\x7b\xbc\x16\x41\x89\x37\x65\xab\x09\xfc\x58\x98\xb3\x48\xfb\x87\x26\x9b\xf0\x34\xa2\x45\x3b\xd9\x91\x70\xc5\x06\x23\x30\xb4\x4f\xab\xf2\x53\x5c\x10\x0b\x96\x13\xfd\x99\x1b\x9e\xb4\x19\xf5\x4b\x3c\x7f\x04\xc3\x51\x8c\xaf\x6f\xc5\x03\xd4\xa2\x80\xd2\xba\x6f\x37\x6b\x5a\xca\x1b\x70\xb8\xdd\xf9\x39\xd9\xb5\x0e\x54\x0b\x7d\xa3\xb9\x33\xb1\x91\x13\xb0\x8d\x6a\x43\xe5\xb4\xbd\x1a\xd8\x3b\x91\xd3\x3c\xb5\xe5\xc9\xc5\x52\x85\x68\x8b\xdf\x68\xb2\x33\xdc\xf8\xf4\xdd\x59\x35\x3b\xa3\x1a\x76\xee\x73\x5b\x8c\x94\xd7\xd2\x94\xbb\x6c\xcb\xbd\x30\x7a\x67\x61\x20\x2e\xd9\x86\x53\x50\x9d\xb1\xb2\x78\x9b\x57\xd0\x19\xcf\x8c\xa0\x81\xe2\x51\x69\xae\xe4\xd1\x8c\xf2\x29\x5a\xf8\x45\x6e\xe6\xfb\xf2\x4b\x5c\x91\x84\x38\x8f\x5c\x4b\x0c\x1f\xda\xfd\xa5\x37\x6c\xba\xea\x44\xd8\x99\x4f\x45\x34\xf3\x6b\xae\x7e\x96\x95\x42\xde\x10\x36\x84\x21\x39\xf8\xb2\x72\xe9\xc0\xbe\x3d\x93\xc2\xbc\xc2\x45\x85\xe3\xaa\x12\xa6\xf1\xd0\x1d\x54\xef\x1e\x92\x73\xf3\x0e\x74\xf6\x14\x00\xac\x04\x2e\x8f\x4b\xf0\xf5\x89\x84\x29\x95\x71\x82\xc9\x84\x93\x42\xde\xb2\x29\x47\x0e\x60\x78\xd2\x31\x54\x90\x0b\xbd\xce\xf0\xba\x65\xc6\x87\xa6\xea\x56\x1d\x5b\x29\x6d\x10\x53\x4d\x07\xd8\x46\xc4\x12\xa8\x63\x6b\x39\x18\xb8\x02\xae\x03\xea\x70\x6a\x50\x6c\xeb\xf1\x17\x2e\x69\x6c\x40\x8b\xbb\x18\x1f\xd0\x01\x96\x52\x6d\x1e\x06\xfb\x04\x11\x13\xad\x94\xf8\x16\x75\x7c\x97\x25\xef\xa2\x8e\x3b\xc2\x00\xbb\xa0\x94\x75\xbb\x8b\xe0\x0c\x57\xaa\xb6\x76\x90\xcf\x2f\x6f\xae\xfe\x3e\x7a\x7f\x71\x79\x13\xce\x73\x38\xcf\xe1\x3c\xb7\x38\xcf\xc0\xe7\xad\xcf\x72\xa1\xda\xad\xd3\x76\x97\xea\xe6\x55\x92\xc5\x5f\x50\xdc\xd9\x39\x9f\x7f\xa0\x46\xb8\xcc\x24\x28\x94\x45\x8c\x8c\xba\xce\x41\xec\x6e\xb0\x8d\xc4\x4e\x9f\x7d\xe0\xd9\x13\x86\x8d\x75\x18\x8e\x73\x59\xa9\x71\xb0\x6e\xd7\xaa\x9d\xfb\x4e\x7f\xbd\x38\x3b\xbf\xbc\xb9\xf8\xe6\xe2\xfc\xea\x49\xe3\x28\x5a\xd6\xad\xab\x73\xe3\x86\x5c\x32\x93\x30\x67\x22\x57\xc9\xa2\x28\x7d\xbb\x9e\x08\xac\x86\xe2\x71\xa3\x0a\x2e\x8a\xea\xbe\x6b\x1f\x0b\xcc\xb6\x5b\x66\x5b\x0f\x2b\x69\x51\xb2\xa4\x2b\xf4\xfd\x46\x8a\xb4\x23\x14\xbe\xb6\xe6\x01\x6f\xcd\x5f\x87\x4f\x3d\x57\xdd\xa0\xc6\x7a\x9c\xf0\x58\x96\x52\x30\x52\x68\x9a\xe9\x16\x7d\x0d\x3a\xa9\x54\xda\x4d\x51\x4f\x1b\x82\xf1\x8e\x66\xdf\xc3\xe2\x0a\x5a\x56\x46\x59\xf2\xa2\x24\x10\x19\x46\x47\x6e\x61\x61\x9d\xab\xa7\xfe\x65\x6d\x2a\xb8\xec\x65\xa1\xd7\x5b\x68\x53\x84\xb7\xcb\x0a\xad\xb7\xd0\x22\x26\xd3\x8f\x95\x5a\xa5\x66\x0b\x51\x4e\x33\x7b\xda\x6e\xf7\x48\xb7\xd5\x59\x3f\x42\x45\xda\x5e\x95\xdd\x3b\x3a\xab\x77\x2e\x1c\x21\xe6\x86\x73\xc1\xdd\xb1\x8b\x47\x1b\x18\x8d\x75\x60\xb1\x56\x1d\x63\xd0\xcd\xf1\x17\xf8\x1f\x72\xf3\xfe\xec\xfd\x1b\x72\x12\xc7\x2e\x2e\x3a\x57\x30\xc9\x13\x6b\xa5\x57\x43\x42\x33\xf6\x01\xa4\xc2\xc6\x70\xb7\x8c\xc7\x7d\x92\xb3\xf8\xeb\x36\xf5\xa4\xec\xe8\x70\x17\x84\xf7\x45\x75\xbb\x13\xd7\xce\xd5\x58\xe5\x5d\x05\x11\x21\x36\xe9\x11\x71\xd3\x97\x96\x71\x42\x46\x47\xa0\x69\xdb\x03\x8f\xd8\x2d\xec\x96\xae\xf6\x4a\xc2\x6a\xdd\x38\x45\xed\xad\xf8\x0d\x51\x39\xd6\xc0\x51\x45\xe3\x3a\x6c\x05\xdb\xaf\xff\xa9\x32\x1a\x41\x9f\xfc\xa3\xf8\x11\x5b\xcd\xab\x9f\x7a\xbd\xbf\x7d\x7f\xfe\xf7\xff\xea\xf5\x7e\xf9\x47\xf5\x2a\xb2\x42\xd4\x9a\x97\x6e\x41\xd7\x15\x17\x31\x5c\xe2\x3b\xf0\x4f\x27\xae\x9d\x44\x91\xc8\xb9\x76\x17\x30\x61\x79\x38\x13\x4a\x5f\x8c\x8a\x3f\x33\x11\x2f\xff\xa5\x5a\x15\x49\xdb\x4b\xc6\x80\x5b\xd4\x22\xf1\xc6\x8e\xee\xd8\x43\x49\x4b\x3a\x3e\xaa\x6e\xd6\xa2\x29\x47\x34\x83\xd4\x96\x69\xfa\xc6\x83\x00\x9b\xeb\xfa\xca\x08\x1c\xd3\xc9\x8d\x64\x5a\xaf\x98\x77\x30\x7f\xdd\xaa\x0b\xb9\x1d\x1d\x92\xb6\x62\x07\x3b\x06\x18\x42\xc4\x41\xcb\x1e\xe4\x82\xc1\x7a\x2d\xa5\x74\x34\x9f\x8c\x2e\xc8\xdc\x42\x78\x6f\x80\xe3\x3d\x6e\xdf\x7c\x54\x1a\x57\xf5\xeb\xd5\x34\xc4\x37\xb6\x17\xad\xbf\xee\x4a\x08\xa8\xa2\xaa\x17\x18\xc5\xe6\xd0\xfe\x38\x8c\xb2\xbc\xef\x6e\x18\xa6\x90\x0a\xb9\x28\xfe\x2c\xfc\x89\x03\xa5\x85\xa4\x53\x4c\x39\xb1\x8f\xdb\xc7\x8a\xbf\xec\x83\xb5\x17\xac\x3e\x6d\x55\xe1\x28\x97\x46\x68\x48\x16\x9e\x22\x37\x2c\x85\x51\x8e\x3d\xa4\x6d\x1e\xf4\x7b\x42\xda\x0a\xcc\x68\xdb\x71\xd6\x8e\x3a\x42\x96\x41\x01\x28\x70\x16\x50\x44\x7d\xd2\xa5\xd4\xf6\x0b\x31\xc8\x5a\x03\xf8\xdc\x68\x96\x8d\x8b\x82\x95\xa3\x43\x6a\x16\xb3\x39\x53\xa2\x45\x62\x4d\x31\xd1\xe6\x6c\x01\x57\xd5\xc3\xc6\x44\x15\x66\xb3\xfb\x0c\xeb\x20\x15\xe7\x75\x89\xec\xbf\x6e\xd3\x0a\xc9\x8e\x8c\x6a\x0d\x92\xbf\x21\xff\x73\xf8\xf3\x57\xbf\x0d\x8e\xbe\x3e\x3c\xfc\xe9\xd5\xe0\xaf\xbf\x7c\x75\xf8\xf3\x10\xff\xf1\xfb\xa3\xaf\x8f\x7e\xf3\x7f\x7c\x75\x74\x74\x78\xf8\xd3\xf7\xef\xbe\xbd\x19\x9d\xff\xc2\x8e\x7e\xfb\x89\xe7\xe9\xad\xfd\xeb\xb7\xc3\x9f\xe0\xfc\x97\x2d\x27\x39\x3a\xfa\xfa\xcb\xd6\x4b\xef\xa0\x2c\xa9\x1d\x5d\x16\x27\xad\xcf\xd8\x09\xfa\x7d\xc4\x8a\xfc\x76\x78\xf4\xea\xfa\xfc\xfb\xc0\xe8\x37\x25\x43\x2a\xd8\xf5\xde\x1c\x70\x05\x91\x04\xfd\x29\x2c\x39\xf6\x4d\x95\xe2\x08\x3d\x45\x0a\xd5\xe2\xa5\xf1\xb9\xcf\xc1\xb8\x53\xf4\xd2\xc3\x7d\x2d\x25\xd1\x89\x14\xa9\x4f\x78\x47\xf7\x06\x36\xd8\xf7\xf7\xdd\x42\xab\xee\xae\x76\x04\x63\x50\x30\x06\x6d\x18\x8f\x1a\x83\xae\x2d\x1e\xee\xad\x25\x08\xf8\xbc\xa9\x0b\x63\xad\x07\xdd\xeb\x3a\xd5\xea\x70\xdb\x39\xd4\x86\xfe\xa8\x97\x4d\x28\xcb\x10\x1a\xcb\xd0\xd2\xf5\x3e\x4c\x72\x82\xcd\xa6\xed\xc1\xc7\x09\xca\x8c\x12\xab\xda\xb8\xe2\x85\x30\x37\x4b\x28\xaa\x5f\xd7\xea\x5c\x62\x50\x25\x86\xb9\xfe\x68\xa3\x4e\x6f\x6d\x20\xaa\x51\xd2\x18\x2f\x2b\x84\x16\xc2\x61\x59\x56\x9a\x2a\x25\x22\x1b\x40\x5b\xe4\x37\x60\xd1\x3a\xb7\x6c\x5c\x0d\x76\xb8\xcf\x24\x44\x10\x03\x8f\xc0\x95\x9c\xae\x35\xdc\xa4\x9c\x9c\xf3\xb9\x2f\xbb\x1d\xfb\x6c\x19\x5c\xc9\xfa\x39\x5e\x56\x00\x82\x41\x44\xe7\x04\xab\xc4\x21\x20\xd5\x2f\x23\x67\x31\x14\x43\x4c\x4a\x2b\x6b\xb3\x9e\x7c\xad\xb9\x78\x7b\x9e\x59\x78\xb6\x5a\x09\x43\x2b\xcc\xb2\x34\x3f\xd7\x99\xe4\x4b\x70\x06\xb6\x67\x9f\x9f\x1d\xeb\xec\x88\x6d\x76\xc3\x32\x77\xf0\x9d\x74\xc9\x26\xbb\x70\x96\x64\x12\x26\xec\xbe\xa3\x73\x7a\xc2\x4b\x4b\x0c\x8b\x81\x6b\x36\x61\x36\x7b\x26\x93\x90\x01\xb7\x19\x09\x34\x9a\x21\xed\x77\x9c\xb2\x74\x4e\xef\x63\x30\x8f\x15\xb8\xbb\x25\x65\xd7\xeb\x84\xfd\x40\xc7\x48\xa0\x63\x8d\xc7\x27\xa2\x63\x0e\x73\xf7\x87\x88\x61\xe4\x79\xfb\x98\xf7\xd3\x7a\x19\x19\x44\xe4\x9d\x11\xad\x4c\x71\x3a\xc6\x59\x1a\x19\xa0\x5b\xe1\x03\xbe\x76\x94\x27\x49\x47\xa5\xb7\x7b\x17\x08\x8d\x2c\x4f\x12\x97\x71\x3c\x24\xef\x39\x1e\xc9\x13\x6c\xf1\xd0\x27\x97\x30\x07\xd9\x27\x17\x93\x4b\xa1\x47\x56\xb6\xad\x87\xb3\xd9\x1b\x09\x9b\x90\x37\x46\x6b\x52\x9a\x68\x5b\x66\xbf\x52\x14\x48\xc8\xda\x04\x65\xbd\xb1\x16\x61\xe8\x9b\xb7\xe5\x0b\x9f\x0b\x3a\x78\xa2\x6d\x2a\xfa\x98\x74\xa0\x9e\xba\x99\x7c\x80\x1c\x06\x45\x3a\xef\xc8\xba\x84\xde\x67\x58\x63\x23\x13\x4a\x5f\x1b\x2d\xb6\x9b\x1e\x37\x23\x3f\x1d\xb6\x8d\xa0\x49\x02\x71\xad\xc9\x91\x6d\xce\x41\xeb\x5a\x34\xa6\x1a\x17\xbd\x22\x80\xcc\x28\x8f\x13\x90\x58\xef\x5d\x2d\x17\xb5\x62\x65\x83\x83\xa2\x25\x85\x4f\x06\xa5\x51\x24\x64\xec\x9a\xcb\xba\xa4\x4c\x5c\x4c\x71\xbc\x90\xd6\xa6\x94\xd3\x29\xa0\x65\x61\xa5\x6a\x30\xd6\x92\x56\x95\xbe\x16\x33\x21\x6e\x49\x24\xd2\x2c\xc1\x03\xd0\xe2\x7c\x94\x6d\x75\x0a\x14\x1d\x98\xd9\xd5\x71\xa5\xe3\x0e\xfe\xd0\xae\xe1\x4e\x2b\x61\xa5\x0b\x51\x05\xee\x21\xea\xac\x25\xdf\xf9\x3d\x44\x95\x9e\x92\x66\x4b\x5c\x53\x49\x2d\xd0\xb6\xd1\xbe\x55\x70\x6b\xb3\x7c\x57\xa6\xf0\x16\x59\x66\xd5\xb1\x54\x43\x0e\xe7\xf4\x25\xb3\xdd\x2b\xb0\xfb\x80\xcd\x60\xc6\xcc\x33\x5f\x45\xbb\x76\x18\xec\xd1\x5b\x29\x3c\x57\x04\x1b\xfb\xb9\x30\xcf\x5a\x08\x4d\x0e\x7b\xc7\xbd\xa3\x15\x1b\xdd\x52\xdd\xe5\x9b\xca\x93\x0c\x0b\x0d\x66\x58\xb5\x0f\xa2\x5e\xdc\x27\x4c\x7b\x62\x6b\xeb\x1d\xe0\xaa\x5c\x3a\x5c\x9f\x28\x41\xb4\xa4\x31\x73\x5a\x10\xfe\x6a\x6e\xd2\x32\x77\xc5\x0e\x0e\x7b\xbf\xf5\xfa\x04\x74\x74\x44\xee\x04\xef\x69\x5c\x3e\x56\x06\xc9\x55\x65\xa2\x85\xc8\xb1\x01\x9f\x05\x41\x51\xe6\xc3\x50\x2c\x22\x72\xdb\xad\x67\x46\xb5\x4f\xc3\x3b\xbf\x67\xda\x77\xa8\x10\x13\xf2\xca\x36\x0b\x02\xea\xac\x84\x09\x9b\xc3\xf1\x0c\x68\xa2\x67\x36\x90\x82\x0b\x3e\xb0\xfd\xde\x0c\x29\x71\x57\xda\xfa\x14\xda\x99\xdc\xaa\xa3\x85\xf9\x6d\x75\x41\x2d\xa5\x6b\x43\x44\xbf\x6d\xde\x84\x96\xac\xf4\x67\xbe\xb9\x19\x7d\x5b\x6b\x43\x8b\x54\x5c\xeb\xcc\x87\xb7\x54\x4a\x66\xec\x01\xed\xe8\xc6\xa1\xd7\xaa\x1f\x2d\xe9\x90\x84\xb5\xed\x4b\x4b\x56\xfb\x6d\xef\xd6\x90\x96\xfc\x5d\xe4\xd8\x48\x8f\x8e\x93\x05\xb9\xa3\x5c\xfb\x54\xbc\x03\x33\xd5\x81\x21\x4f\x06\x1b\xbe\x03\x1a\x83\x54\x48\x3d\x80\x36\x2e\x0d\xe6\x47\x67\x8e\xa6\xca\xda\xba\xe5\x03\xb9\xd2\x22\x25\x33\xf7\xd9\xf5\xf4\x44\x77\x32\x86\x78\x7a\x7c\xee\x8f\x84\xcc\x52\x38\xf7\xcc\x8b\xa3\x5f\x2b\x74\xc3\xc2\xbd\x56\x42\x3f\xaa\x82\xad\xda\x68\x85\x71\x0b\x2c\xdb\x22\xb1\x23\x5a\xda\x41\x80\x00\xe9\x30\x48\x80\xb4\x4b\x76\x5c\x9e\x08\x1d\x5f\xed\xe3\xa1\x3a\x8b\x3b\x20\x9d\xf9\xd6\xc9\x3a\x43\xa4\xc3\x19\x1b\x05\xdb\x11\x10\x3b\xf5\x68\x93\xf6\xe9\x94\xd5\xf1\x30\x00\xba\xd9\x7c\xd2\x25\x04\xb2\x0e\xc2\x9f\x57\x83\x9f\x57\x1a\x85\x23\x99\xb0\xa5\x68\xf7\x86\xcb\xb4\xed\x9a\x4e\xd6\xe7\x12\x4b\xc2\x8b\x26\xb7\xfa\x59\x74\x4e\x27\xdd\x85\x29\x76\x1d\xa4\xd8\x69\x88\xe2\x47\x0d\x50\xc4\xb4\x88\xd6\x54\xa4\x6e\x1f\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\xd6\x1d\xdf\x88\xa3\x6e\x0e\x35\x47\x6d\x2f\xce\x98\x8e\xb2\x6b\x11\xdd\x76\xa8\xd7\x9c\x41\x26\x21\xb2\x76\xb2\x9b\xd3\x91\x9d\xdd\xe8\x97\x97\xef\x6f\xca\x70\x7c\x8c\x59\x29\x0d\x97\xdf\x39\x4b\x9a\xd1\x49\x6f\x21\xd3\x85\xea\x3e\xa6\xd1\xed\x1d\x95\x31\x5a\xb6\xa8\x66\x63\x96\x30\xbd\x40\xe5\x5c\x02\xc6\xfa\x73\x61\x83\xe2\x6c\xfd\x47\xe1\xbb\xb8\x16\x2d\xc6\x0b\x1b\x16\x5a\xc8\x5c\xf4\xcc\x84\x32\xa3\x8f\x17\xad\x7a\x6d\xd4\x4c\x94\x15\x26\xbd\xaa\x65\x3a\x28\x5f\x7e\xec\xad\xf2\x55\x69\x43\xbb\xab\x1e\xd6\x36\x76\x6f\x8f\x59\x9d\x63\x71\xb2\xe8\xb2\x16\x58\x5d\x47\xf3\xed\x2f\xab\xcb\x24\x5c\x6b\x91\x75\xe4\x25\xb1\x93\x6d\xf0\x91\x8c\x61\x22\x0c\x11\xde\xe8\xf4\x88\x73\x70\xa5\x39\x4f\x46\x17\x85\x55\x4b\xd4\x1c\x1b\x36\x6a\xd1\xd7\xe3\x4c\xd8\x1c\x38\x28\x75\x8c\xee\x90\x3c\xb3\x5a\xab\x6f\xa8\xdb\x37\x5f\x07\x29\xae\xae\x5f\x66\x02\xb8\x76\xbe\xf8\x23\xe8\xc8\x5a\x6e\x2b\x84\x1c\x3b\x85\xb9\xe5\x2f\xbb\x51\x22\x49\xd5\xcc\xb6\xba\x85\x7b\xa6\x5d\xbb\xe6\x91\x2d\x0f\x5c\xed\xb8\x3b\x95\x34\x02\x92\x81\x64\xc2\x30\xa3\x9c\xeb\x58\xdc\x71\x32\x86\x29\xe3\xca\x83\x02\x2b\x6e\x3a\x98\xa1\x3f\x86\xa9\xa2\x64\xda\x90\x5c\xd5\x0a\x82\xb8\x54\x9d\x48\x94\x47\xd3\xad\x79\xd9\x93\x84\x1c\x0b\xe1\x64\x1b\xc7\x14\x10\xae\xf6\xd2\x79\x6c\xc9\x87\x39\xc7\x37\xc7\x90\xd0\x85\x8d\xc8\xc4\x36\xd8\xec\xdf\x20\xd5\x51\x07\x1e\x27\xdb\x0d\xca\x5f\xdb\xb8\x0e\x2c\x75\x4a\xa3\x59\x3b\x17\x6e\x70\x51\x6d\x39\x82\x8b\xaa\xcd\x24\xc1\x45\x15\x5c\x54\x8f\x8c\xe0\xa2\x0a\x2e\xaa\xa5\xb1\xb7\x5a\x52\x70\x51\x35\x1e\xc1\x45\xf5\xf0\x08\x2e\xaa\x2d\x46\x70\x51\x6d\x39\x82\x8b\x2a\xb8\xa8\x82\x8b\x2a\xb8\xa8\x3e\x23\xbb\x9d\x1f\xc1\x45\xb5\x32\x49\x70\x51\x05\x17\xd5\xd6\x63\x6f\x95\xaf\xe0\xa2\xb2\x23\xb8\xa8\xea\xe3\xf3\x62\x75\xde\xc1\x33\x32\xaa\x5e\xfb\x1e\xc3\xa8\x30\x3a\x1a\xfb\x22\xd3\x9e\xda\xd8\xff\x3f\x8d\xed\x7f\x4f\x1c\x25\x1d\xd8\xfb\x83\xad\xff\xc5\xd9\xfa\xbb\xb1\x93\x75\x60\x23\x6b\x4d\x93\x9d\x0b\xfc\x66\x26\x41\xcd\x44\xd2\x18\xd1\x6b\x48\xfe\x8e\x71\x96\xe6\xa9\xc1\x39\x65\xf0\x99\xcd\x0b\x5f\xbb\x2a\x1b\x2f\xa3\x0b\xde\x9a\xeb\xcc\x8d\x2c\x06\xac\xbc\x49\x59\x62\xb6\x11\x13\x25\x67\x74\x6e\x70\x5d\xe5\x51\x04\x80\x7d\xbd\xaa\xaa\xc4\x1f\x87\xc5\x9b\x8a\x3e\x0e\xaf\xdb\xd1\x9b\x76\xdc\xd2\xd6\xc6\xc4\x59\xfe\xf8\x87\x46\x73\x4c\x65\xd6\x0d\x5d\xfe\xf6\x6a\x74\x5a\xa1\xcb\x94\x7b\xb2\xcc\xf8\x5c\x24\x73\xdb\xd8\x16\x6f\x32\x52\xd1\x70\xa5\x25\x66\xa1\x44\x38\xf9\x5b\xd9\x0e\xcc\xe6\x39\xf3\x54\x91\xd2\x3e\xb2\x81\x14\x8d\xbb\xc3\x96\xa3\x03\x82\xdf\x5e\x57\x68\xa5\x27\x74\xc1\x6f\xda\x8a\xc2\x75\x39\xc6\x08\xbc\x75\x73\xcf\x14\xf1\xc2\x96\x73\xdf\x5a\xe0\x6d\x4d\x29\xdb\x0b\xa1\xed\x8f\x16\xc1\x7a\x2b\xf8\xe1\x9d\x01\xf8\xc0\xb5\x10\xf7\xec\xbc\xaa\x6d\xf8\x16\x47\x5a\x90\x2c\xa1\x65\x93\x22\xdc\x81\xef\x90\x07\x9d\xce\x20\xba\xbd\x72\x2e\xcf\x43\x05\x50\xc4\xab\x4c\x99\x9e\xe5\xe3\x61\x24\xd2\x63\x43\x12\xec\xff\x8d\x13\x31\x3e\x4e\xa9\xd2\x20\x8f\x63\x11\x39\x16\x37\x88\xcc\x2c\x8c\x4f\x87\x69\x7c\x84\xed\x6d\x2f\xea\x4d\x11\x2b\xa5\x10\xcc\xfb\x9d\x32\x48\xc6\x60\xa8\xab\x40\x85\xbf\x52\x4f\xcd\x2c\x6f\xe7\xc6\xb5\xd5\xd1\x9a\x25\xb5\x74\x37\x7f\x7a\x57\x73\xa0\x5c\xa4\x03\xcb\xc6\x73\x73\x29\x77\x16\x5a\xd1\x81\x2b\x79\x8f\xdc\xc8\x7b\x23\x1a\xef\x8b\xeb\x78\x0f\x4b\x1f\x77\xe0\xe9\xec\xc2\x55\xdc\x9d\x9b\xf8\x23\x54\x08\xfe\x38\xee\xe1\x0e\x6d\x68\x1d\xb9\x85\x3f\x85\x4b\xb8\x93\xaf\x6e\xeb\x0a\xfe\x74\x6e\xe0\x6e\x3e\xb7\x4b\x45\xe0\xb9\xba\x7e\x3b\xb0\x85\x77\x69\x07\xef\xcc\x06\xfe\xd1\x5c\xbd\xed\xdd\xbc\x7b\xe0\xe2\x6d\x0d\x64\xc6\x99\x66\x34\x39\x83\x84\x2e\xae\x21\x12\x3c\x6e\xcc\x61\x96\x4a\x46\x16\xe7\x47\xd9\x69\x9d\x9d\xaa\x9e\xd1\x30\xa3\xae\x32\xb6\xd1\xa8\x6c\x06\x87\xf7\x4f\x38\x81\x02\x5d\x0b\x76\x95\x4d\x8a\xce\xdd\x09\x79\x9b\x08\x1a\xab\xe3\x4c\xd8\xff\x2b\xf3\x15\x2a\x89\x0a\xf6\x5d\xed\x32\x15\x9e\xda\x20\x66\xd3\x3b\xba\xdc\xc4\xef\xc4\x1d\x11\x13\x0d\x9c\x1c\x32\xee\xf7\xf1\xa8\xa2\x06\x96\xd6\xc9\x02\xad\xcd\xd5\xd7\xaf\xfc\xcd\x2f\xcf\xec\x88\x06\x56\xa5\x3e\xbe\x15\xd8\xbd\xe8\x71\x33\xb0\xbb\x71\x92\x27\x75\x53\xb0\x35\x0f\xd7\xe9\xcd\xeb\xb2\xb6\xef\x6b\x9c\xb7\x38\x6d\x94\xc7\xc4\xa5\x7c\xbd\xbc\x4d\x6b\x1d\xc0\x52\x17\xfd\x8a\x80\x95\xc7\xac\xc6\x37\xa7\x23\x6b\x34\x0e\xe6\x92\x7d\x31\x97\x3c\x51\x10\xc8\x1e\x0a\xba\xcf\x34\xf0\x23\x08\xba\x3b\x8c\x4a\x12\xe8\xb7\x92\x46\x30\xea\x5c\x46\xf0\xc7\x89\xc4\xb9\xa4\x8e\x00\x16\x22\x9f\x3f\x3c\x1c\x20\xb6\xa7\xa9\x48\x9c\xc5\x94\xd4\x49\x9e\x24\x0b\x92\x67\x82\xd7\xd3\x8c\xad\xaf\x7d\x39\x6b\x15\x4d\xf2\x6b\xde\x52\x0a\x96\x99\x14\x8e\x67\xca\x9c\x73\x43\x83\xcb\x06\x5d\x28\x48\x62\x55\x63\x5a\xcb\x8d\x55\x6c\x6a\x96\x6f\xf8\x1f\xa6\xcd\x96\x91\x7e\xb5\x09\xcd\xd3\x13\x21\x23\x36\x4e\x16\x64\x46\x93\xa2\x1b\x0b\x25\xb7\x2c\x49\xdc\x34\x43\x72\x0d\xda\xba\x14\x2c\xef\x4c\x04\x9f\xe2\xe2\x28\xf7\x5d\x00\x21\x32\xcf\x46\x09\x50\x9e\x67\xf6\x7d\x86\x13\x2f\x44\x2e\xfd\xfb\x86\x85\x63\xa2\xec\xba\xcf\x92\x7e\xa5\xd7\xd8\x83\x1b\x5b\xf4\xa7\xc9\x95\x11\x00\xde\xfb\x2a\xce\xfd\xea\x9c\x62\x0e\x52\xb2\xd8\xd9\xf9\xed\x6f\x99\x14\x73\x16\x5b\xef\x86\x07\x1b\x76\x35\xb6\xdd\x64\x8a\xf3\xcc\x05\x1f\x70\x98\x52\x14\x54\xdc\x29\xb2\x7b\x66\xe7\xb1\x11\x04\x3c\xc6\xfe\x32\x46\xc2\x17\x59\x2d\x6f\x7d\xce\x6c\x67\xdc\x0a\xe4\xc8\x21\x17\x44\x60\xe0\x67\xce\x99\xb6\xdd\xd6\x67\xb9\x26\xb1\xb8\xe3\x47\x3b\x79\x5d\xd1\xd1\x7a\xb3\x16\x40\x75\xf7\xeb\x3a\x39\xc7\x7e\xef\xc3\xe0\x65\xca\x99\x3e\x27\x24\xe7\x0a\x5a\xb2\xf7\xce\x84\xa3\x3f\xff\xa9\x19\x8d\x60\x29\x88\x5c\x7f\x12\xed\xef\x6e\xc6\xa2\x59\x55\x98\x65\x29\x28\x22\xf2\x25\xb5\xf8\xb5\x7b\x6c\xfd\x0e\x05\x15\x70\xdd\x68\x6a\xd8\x5d\x63\xfd\x72\x0d\x4b\x57\xe3\xf7\x2a\x0d\x99\x31\x34\xfb\xec\xf2\xfa\xd7\xb7\x27\xff\x7d\xfe\xd6\x9d\x4f\x5e\x65\xfa\x39\x67\xff\xca\x81\xd0\x54\x18\x59\x38\xa9\x86\x01\xf6\x51\xa3\xaf\xfc\x80\x27\xb9\xdb\x80\xc1\x86\x0c\x19\xbb\xc7\xb7\x0f\x8b\xc4\x1e\xf4\x1f\x3f\x2a\xf2\xa9\xbb\x6a\x95\xc1\x2d\x46\x6e\xac\x74\xd5\xa2\x84\x83\x36\x27\xcf\x4a\x94\xb6\xcb\x1a\xe3\xd3\xa4\x2a\x4c\x36\x23\x57\x6d\x75\xa2\xb6\x1a\xd1\xa0\xfc\x82\x51\x53\xc5\xa8\x93\xee\x5e\xe5\x1a\x3a\xea\x89\x53\x52\x6d\xaf\x06\xd8\xa6\xc5\x5e\x0d\xb0\xa2\xc7\xc5\x88\xd0\x38\x96\x28\xa6\xe0\xa9\x4f\x97\x7a\x63\x66\x65\x2c\x4d\x9f\xbc\x22\x7f\x23\xf7\xe4\x6f\xa8\x16\xfc\xb9\x6d\x07\xa1\xb6\x02\x7b\x17\xa1\x31\x46\x1b\xbd\x18\x75\x04\xf1\x1f\x67\x54\xe3\x8c\x06\xaa\x5a\x90\x31\x73\x62\x28\xdc\x6b\x90\x46\x2c\x72\x3b\xf1\xa4\xbd\x97\xcc\x02\x3f\x21\x9a\x59\x33\xf9\xc5\xa4\x1e\x8e\xb3\x1b\xa2\x99\xc7\x8d\x7e\x7f\xe9\xa8\x50\xbd\xcf\x49\x39\x5b\x4a\x75\x34\xab\x93\x31\x23\x60\xa8\x1a\x73\x8a\x05\x92\x71\x1b\x76\x3b\x63\x2d\x9c\xfe\xfb\x83\xc6\xed\xfc\xc0\xb5\xfd\x7c\x68\xa7\x96\x14\x7f\xe4\xf3\x4e\x30\xa8\x94\x4e\xca\x44\x3c\x24\xe7\x34\x9a\xe1\xb2\xe2\x0a\xcf\x30\x1a\x08\x4e\x36\xa3\x73\xb3\xf1\xee\x59\xdb\x17\x08\xa5\x95\xc2\x3a\x8a\xb8\x64\xce\x53\x44\xb9\x6d\xce\x39\x01\x29\x6d\xa4\xf4\x78\xe1\x83\xcc\x5a\x6f\x5e\xab\x93\x94\x49\xa1\x45\x24\x5a\xb4\x87\x5a\xce\xbe\xc0\xe9\x10\x08\x36\x3a\xd5\x9b\x77\x7f\x38\x1b\xf5\xc9\xcd\xe9\x08\x9b\xfa\x5c\x9f\xde\x8c\xea\x12\xf6\xc1\xcd\xe9\xe8\xe0\x49\x41\x41\xbc\x99\x0d\x0d\xaa\x0d\x26\xa9\x19\x4c\x12\xa6\xf4\x20\xa5\xd9\xe0\x16\x16\x0d\x79\x6a\x17\x7c\x7d\x50\xec\x70\x27\x1f\x64\xc1\x9c\xd2\x6c\xe7\xd9\x24\xd0\x98\x85\x34\x9f\xed\x47\x48\xf3\xd9\x72\x84\x34\x9f\x90\xe6\xb3\x3a\xf6\x26\x96\x31\xa4\xf9\xbc\x2c\xd7\x6d\x48\xf3\xf9\xcc\xbd\xbf\x21\xcd\x67\xfd\x08\x69\x3e\x21\xcd\x67\xbb\x11\xd2\x7c\x76\x1f\x7b\x17\xb7\x12\xd2\x7c\x76\x1a\x21\xcd\x67\x75\x84\x34\x9f\x0d\x23\xa4\xf9\x6c\x18\x21\xcd\x27\xa4\xf9\x84\x34\x9f\x10\xfd\xf8\xe8\x5c\xfb\x19\xfd\x48\x42\x9a\x8f\x1b\x21\xcd\xe7\x45\xc4\x78\x91\x90\xe6\xb3\xd5\x08\x69\x3e\x21\xcd\xa7\xc9\x08\x69\x3e\x2f\xc5\x5c\x12\xd2\x7c\x42\x9a\xcf\xe7\x23\xe8\x86\x34\x9f\x90\xe6\x13\xd2\x7c\x42\x9a\xcf\x83\xab\x08\x69\x3e\x2f\x41\x05\xf4\x3d\x57\xdb\xe7\xa8\x5c\xf9\x99\xb6\x0f\xeb\x23\xe7\x6b\x7e\x45\x4b\x88\xca\xcc\x24\xb2\x9c\x32\x91\x40\xe3\x05\x4e\x89\x7d\x1e\x2a\x42\xd6\x33\x8c\x0e\x4c\x58\xca\x9a\xa5\x05\x91\x95\x43\xf3\x16\xe7\xaa\x78\x5d\x0c\x58\x52\x7a\x8f\x07\x80\xa6\x22\xb7\xad\x5f\x23\x91\x66\xb9\xae\xc3\x14\xb7\xa7\x49\xd7\xd6\x09\x9b\x3a\x8e\x7a\x6c\x1b\xcc\x0e\x8a\x69\x07\x95\xa6\xae\x4f\xd8\xaa\x95\xc6\x3e\x6a\x6e\xd4\x45\xd0\x08\xd5\x1a\x24\x7f\x43\xfe\xe7\xf0\xe7\xaf\x7e\x1b\x1c\x7d\x7d\x78\xf8\xd3\xab\xc1\x5f\x7f\xf9\xea\xf0\xe7\x21\xfe\xe3\xf7\x47\x5f\x1f\xfd\xe6\xff\xf8\xea\xe8\xe8\xf0\xf0\xa7\xef\xdf\x7d\x7b\x33\x3a\xff\x85\x1d\xfd\xf6\x13\xcf\xd3\x5b\xfb\xd7\x6f\x87\x3f\xc1\xf9\x2f\x5b\x4e\x72\x74\xf4\xf5\x97\x8d\x97\xdc\x5a\xe0\xed\x4e\xdc\xed\x48\xd8\xfd\x28\xa2\xae\x73\xd7\x76\x74\x16\x5d\xa8\xc9\xca\x69\x74\xec\xe8\xa1\xd3\xe8\x35\x6e\x14\xe2\x8a\x79\x98\x22\x22\x65\x5a\x3b\x2a\x4a\xab\xc1\xaa\x4c\xd7\x54\x4e\x47\x07\xb0\x21\x36\xd5\xb6\x51\x75\x11\xe8\x59\x09\x51\x11\x5e\xae\x73\x9d\xbc\x59\x9a\x25\xd8\x20\x1a\xcf\xf3\xc0\x47\xaa\x20\xeb\x0c\xb4\xe1\xf1\x11\x68\xc3\x4b\xa4\x0d\x0a\xa2\x5c\x32\xbd\x38\x15\x5c\xc3\x7d\x23\xfb\xc9\x26\x03\xd2\x75\x7d\x6a\x17\x1b\xa6\x5c\x4c\x9b\xbd\x46\x44\x66\xe3\xbb\x37\x66\x4e\xcf\x44\x9e\xc4\x98\x97\x94\x73\x54\x29\x6d\x8a\x1b\x68\xab\xef\xa1\xa6\x83\xc1\xdb\xcb\xaf\xf3\x1a\x9c\x9d\xfa\x5f\x39\x9b\xd3\xc4\xe8\xb7\xe5\x13\x23\xd4\x59\xaa\x0f\x35\x32\x62\x3d\xb1\x8c\x85\xe2\xcd\x48\xb2\x39\x4b\x60\x0a\xe7\x2a\xa2\x09\x52\xa5\x6e\x28\xfd\xc9\x86\xd9\x71\x8b\xa4\x48\x14\xb9\x9b\x01\x76\xe0\xa7\x5e\x3d\xc7\x44\xb2\x29\x65\x9c\xa4\x86\xa8\x66\xfe\x61\x65\xf5\x7c\x43\xbc\x8d\xd4\xcb\x75\xa9\xcf\xa3\xfa\x3a\x16\x22\x71\xd9\x08\xc9\xa2\x9c\x9f\x59\xd3\x1b\x17\xbf\x72\xb8\xfb\xd5\xcc\xa6\xc8\x24\xa1\xd3\x42\x8d\x57\xa0\x57\x2c\x71\xe5\xd4\x1b\x3f\x00\x43\xfd\x73\x20\x34\xb9\xa3\x0b\x55\x1a\x35\xca\x39\x98\x7a\x43\x5e\x1f\x21\xe2\x51\x45\x8a\x39\x62\xf2\x87\x23\x74\xcd\x9d\x9e\x8c\x7e\xbd\xfe\xfb\xf5\xaf\x27\x67\xef\x2e\x2e\xc9\xa5\xd0\x60\x59\x52\xa5\x49\x5a\x44\xb9\xd1\x10\xdc\x2a\xf1\x1d\xa8\x41\x0b\x35\x44\xbb\x22\x53\xe4\x8e\xf1\x58\xdc\xa9\xc6\xf6\x53\x8b\x7e\x06\x78\x40\x79\xa3\x39\x22\x9a\x51\xec\xfd\xd6\x82\x3f\xac\x44\x7f\x54\x27\x45\x0e\x1c\xc7\xc7\xb1\x14\x99\x05\x82\x37\x40\x55\x95\xa4\xb3\x25\xbb\xb2\x8f\x2f\xc5\xfd\x9d\xd4\x27\x9c\x4a\xca\x75\x69\x89\x29\xf7\xcc\x35\x9d\x1b\xb6\xde\x8e\xe7\x9d\x6d\x44\xe3\xee\x32\x8d\x4e\xe2\x18\xe2\x1a\xf8\x5f\x5c\x54\xdf\xa9\xff\xb8\x45\x59\x8c\x81\x8c\xde\x5f\x5f\xfc\xef\x25\x3c\x5e\x64\xed\x82\x98\xba\x49\x00\x95\x22\xeb\x6c\x77\xaf\x20\x15\xf3\xb0\xbf\xfb\xb2\xbf\x05\xb7\xec\xc6\x75\x7e\x95\xf3\x2a\x43\xe3\x95\xf9\x49\x2a\x62\x18\x92\x51\x61\xc3\xaf\x5f\xad\x16\x99\x91\x40\xcc\x2d\x5c\x33\x9a\x24\x8b\xaa\x30\xa5\x85\xcd\x10\xac\x95\x20\xa8\x12\xf2\x09\x4d\xd4\x53\x53\xe3\x36\xbc\xd1\xc8\x11\xef\x8c\x36\xdb\xc9\x76\x14\xb3\x91\x18\xb8\xd0\x4e\x18\x36\xab\xc4\xb2\x0e\x52\x44\xc4\xaa\xce\x95\x40\xa9\x1a\x7f\x53\xd6\x8f\xe0\x59\x23\x53\x1e\xd8\xa3\x62\x66\x6b\x44\xce\x15\xa8\xf5\xac\xb1\x54\xa6\xcd\xec\x12\x68\x2c\x78\xb2\xc0\xa8\x48\x1b\xe7\x90\x52\x75\x0b\xb1\xfd\xc1\x89\x66\x85\x17\xc1\xcc\x58\xbc\xea\xc6\xac\xdb\xbb\x0c\x50\x24\xb3\xd1\x17\xe8\x6a\x30\x1a\xfe\x93\xee\x7a\x8b\x43\x68\x80\xf2\x9e\x27\x8b\x2b\x21\xf4\x37\x45\x8a\x6b\x27\x18\xf0\xa3\x93\x96\x11\x20\xf5\x48\x2f\x8a\xef\x1d\xe0\x6e\xe0\xa1\xaa\x66\xd7\x9e\x95\x3b\xfe\xdc\x8f\x94\xcc\xf9\x89\xfa\x56\x8a\xbc\x31\x13\x5b\x11\x36\xbf\xbd\x38\x43\x52\x94\x3b\x37\x22\xd7\x72\x91\x09\x66\x6d\x50\x1b\x14\x83\x1f\x9c\x23\xb4\x7a\x26\x4a\x9f\x15\x79\x47\x17\x84\x26\x4a\x78\x58\x32\xbe\x4e\x5f\x24\x4e\x19\x35\x97\xc7\x42\xcf\x56\xb4\x50\x73\xa0\x56\x9f\xeb\x57\xbc\x8a\x65\x6d\x30\xc6\x57\x1e\xd7\xf4\x16\x14\xc9\x24\x44\x10\x03\x8f\x9e\x7a\xdb\x9f\xda\x19\x87\xa8\x73\x29\xb8\x39\x98\x9d\x20\xcf\x45\xe1\x85\x75\x20\xad\xa2\x0a\xfa\x73\x9d\xf6\x47\xd1\xab\x8b\xc7\x32\x57\x20\xad\x0b\x5a\xe6\x60\x77\xf2\xfb\x7c\x0c\x89\x81\xbc\x51\x49\x5d\xc7\x6c\x6b\x78\x60\x29\x9d\x02\xa1\xba\xc0\x34\x2d\x08\x70\x65\x28\xa6\x35\x5f\x6a\x12\x0b\x28\x33\xe3\xa9\x22\x3f\x5c\x9c\x91\x57\xe4\xd0\xbc\xeb\x08\xf1\x07\x1b\x6a\x6b\x61\x03\xd0\x96\x75\xd4\x89\x9f\x02\x97\x84\xc8\x4b\x84\xb4\x44\xa2\x4f\xb8\x20\x2a\x8f\x66\xd5\x2e\xde\x5e\x6d\x76\x41\x8a\xe8\x18\xd9\x4f\x5c\x7f\x5a\x0a\xf5\x83\x02\xd9\x19\x81\xfa\xa1\x01\x81\xaa\x8a\x51\x06\xe7\xea\xd0\xb3\x88\x95\x82\xa6\x31\xd5\xd4\x11\xae\xa2\xab\xfa\xbe\x6e\xe9\xe7\x4d\xbe\x14\xbc\x65\x3c\xbf\xb7\x26\xd2\xee\x4c\x2d\xd7\xe7\x38\x2d\xe2\x10\x42\x1d\x77\x9d\x66\x59\xc2\x4a\x07\x72\x25\x48\xed\xa2\x86\x2b\xfd\x0d\x62\x22\xd2\x09\xef\x87\x36\xc2\x09\xe5\xb1\x48\x57\x5e\x86\x4e\x6f\x1a\xcd\xaa\x2f\x08\xd8\x57\x1f\x7b\x62\x14\x4a\x60\x0e\x2d\x4a\x68\x2d\x61\xde\x5b\x33\x9b\x01\x8e\xc7\x08\x9c\x9e\x24\x74\x0c\x89\x85\xb1\xc5\x40\xb5\x8a\x81\x4f\x1d\x29\x2a\x45\xd2\x5d\x6a\xcb\x95\x48\xc0\x86\x5e\x79\x40\x98\xe9\x9f\x05\x1c\x70\x92\xae\xe0\x80\xda\x60\x0d\x0e\xa8\xd7\x3e\x07\x38\xe4\x2d\x58\x3d\x59\x86\x83\x91\x1b\xea\x70\x40\xe6\xbd\xef\x70\x50\x10\x45\x22\xcd\x46\x52\x18\xb5\xb3\x33\xde\xe4\xa6\x2d\xfd\x7c\xd6\xb0\x81\x76\xfb\xaa\x06\xec\xbc\x7a\xf5\x9b\xa9\xac\x04\x5d\x52\x6d\x99\x84\x8f\xbc\xfc\x5f\x15\x9e\x85\xa4\x67\x99\x91\xf9\x59\x6a\x8e\x40\xf3\xa4\xbb\xf0\x9c\xd9\x41\x17\x79\x0b\x2d\x8c\x9d\x9d\x70\x23\x11\xd1\x04\x4b\xa4\xb6\x43\x39\xb2\x8c\x76\xcb\x13\x57\x42\x6d\xd1\x47\x89\xbf\xf9\xf0\x0f\xac\x96\x89\xbf\x38\x13\x26\x17\x31\x54\xbc\xce\x36\x46\xf8\xc6\x86\x64\xe2\x7d\x3e\xca\xd7\xc8\x15\x2e\x0a\x04\xe2\xda\xd3\x5a\xb8\xea\x64\xef\x8a\xc2\xab\x66\x81\xc0\x63\xc6\xa7\x68\x57\xeb\x13\x09\x89\x8d\x0f\x76\x44\xe0\xd6\x6a\x90\x3d\x3c\x12\x7e\x52\x7f\x1e\xfc\xab\x51\x16\x63\x82\xbb\x99\xd1\x52\xe4\x25\xac\x89\x25\xb7\x4c\x91\x83\xb7\x1e\x00\x2d\x2a\x55\xee\x23\x87\x39\xb0\x5f\x58\xec\xa6\xb5\x74\xde\x32\x1e\xbb\x50\xda\x1a\xb0\xbc\x9e\xeb\xe4\x60\x0c\xd2\x66\x71\x95\xb6\xbc\x21\x3f\x73\x52\x00\x8b\x0c\x1a\xa3\xc7\x95\x15\x99\xbd\x8d\x6e\xf0\xb0\xe1\xb5\x78\xc9\xf2\x34\x3f\x70\xdc\x7b\xf3\xde\x81\xd1\xdc\x57\xef\xf3\xdf\xf2\xa4\x65\x75\x1c\xf5\xeb\x5a\x8b\xf9\xd1\x4e\xeb\x45\xfa\xc8\xa0\xb5\x66\x7c\xaa\xaa\x9a\x4c\xbd\x1e\xfe\x7a\x55\xc6\xef\xf0\x44\x0a\x9b\x82\xb9\xaa\x42\x2c\xa5\x00\x3c\x17\x35\x24\x31\xe2\xc4\x33\x57\x42\xa6\xa9\xa2\xa7\xd2\x40\x42\x33\x9a\x5c\x67\xcd\xcb\x87\x92\x95\x52\x75\xef\xae\x4f\xea\x53\x23\xb3\x9e\x81\xb4\xbc\xdf\x5c\x27\x34\x4e\x99\x52\x68\x08\x83\xf1\x4c\x88\x5b\x72\xb8\xa6\x56\x56\x25\xca\x4a\xb1\xa9\x3a\x76\x38\x3f\x30\xab\x3f\x22\x8c\x27\x45\x24\x13\xea\xc1\x5c\x2b\x6f\xc8\xc1\x97\x44\xc5\x2a\x70\x0f\x5d\x79\x66\x17\xac\xb0\xba\x4c\x5b\x90\xd9\x60\xc1\x93\x13\xec\xd5\xed\xb9\x6c\x59\x12\xe5\x91\x2d\xba\x74\xb8\xbd\x5c\xf5\x6c\x2d\x1c\xad\xf4\xf8\xe4\x40\x72\xc2\x45\x04\xaa\xbb\x62\x4b\xdf\x95\x73\x92\x18\x6c\x86\x0d\x60\xf4\x13\xdd\x18\x0e\x87\x76\xe9\x1e\x26\x6a\xba\x47\x7b\x55\x89\xfa\xa6\x24\x2e\x46\x1f\x49\xb2\x19\x1d\x58\x25\xdd\x50\x34\x24\x81\x5e\x84\x98\x09\x2e\xa4\x45\x51\xc3\x44\x05\x47\x94\x46\x12\x65\xbd\x79\xb8\x27\x8e\x44\x57\x96\x7a\x5a\x7a\x89\xab\x8e\x40\x4c\xf4\xb2\xb5\x1d\xca\x35\xdc\x31\x3d\xc3\x1a\xac\xb3\x25\xaf\x21\xae\x44\x82\x42\x07\x0c\x27\x20\xa5\x90\x2e\x20\xcb\xdb\xad\x71\x26\xa4\xe4\x18\xd1\x65\x90\x84\x9a\xbf\x7a\xaa\xea\xa8\x2e\x2b\x9e\x63\x8c\xa1\xc1\x26\x98\x4c\x20\x42\x41\xab\x0a\x60\x4b\xb5\x0f\xcb\xa2\xb4\x3e\x85\x43\x0b\x5f\x31\x3d\x65\xf7\xe6\x2d\xd5\xa7\x96\xfa\xae\x70\xc1\x07\xeb\x2f\x1f\x0d\x09\xb9\xe0\x45\xfc\x6d\xdf\xec\x62\xf5\x4e\x1f\x7a\xa6\xcd\x27\x56\xcb\xed\xe3\x07\x54\x0d\x67\x46\x3a\x94\x79\x07\x18\xdf\xc6\x1c\x4e\xaa\x26\xf1\x4e\xc9\x01\x9a\xc6\xdd\xa4\x66\xeb\xbd\x0c\xd0\xc6\x54\x6e\x6e\xf9\x58\xe6\xf2\xe7\xe1\x00\x21\x6d\xe9\x9c\xab\x74\x10\x6a\xa0\x6f\x37\x42\x0d\xf4\x2d\x47\xa8\x81\x1e\x6a\xa0\xaf\x8e\xbd\x09\x19\x0c\x35\xd0\x5f\x56\x5d\x9b\x50\x03\xfd\xa9\x4d\xcc\xa1\x06\x7a\xa8\x81\xfe\xd0\x08\x35\xd0\x1f\x19\xa1\x06\x7a\x83\xf1\x02\x28\x57\xa8\x81\xde\x60\x84\x1a\xe8\xeb\x47\xa8\x81\xbe\x3a\x42\x0d\xf4\x8d\x23\xd4\x40\x6f\x3c\x42\x0d\xf4\x50\x03\x3d\x94\x86\xdc\x6d\xae\xfd\x2c\x0d\x49\x42\x0d\x74\x37\x42\x0d\xf4\x17\x51\x00\x8f\x84\x1a\xe8\x5b\x8d\x50\x03\x3d\xd4\x40\x6f\x32\x42\x0d\xf4\x97\x62\x2e\x09\x35\xd0\x43\x0d\xf4\xcf\x47\xd0\x0d\x35\xd0\x43\x0d\xf4\x50\x03\x3d\xd4\x40\x7f\x70\x15\xa1\x06\xfa\x4b\x50\x01\x95\x8e\x59\xa3\xb2\x90\xdb\x54\xb0\x71\x91\xc9\x95\x84\xf1\x71\x3e\x99\x80\x44\xca\x85\x6f\x5e\x09\x9e\x2a\x8b\xf5\x2d\x3b\x59\x41\xf7\xb1\x18\x8e\x4b\xe2\xd8\xf0\xb8\xcb\x50\xc7\xf2\x8d\x65\xf8\xf0\xf9\xfb\x6f\xd6\x94\xcb\x69\x1c\x55\xd8\x34\x70\x16\xd7\xfc\x9e\x37\xf3\x8f\x6f\x00\xf8\xba\xa4\x22\x07\xf7\x28\x11\xca\x85\x3d\x23\xb0\xa2\x19\xe5\x1c\xbc\xbe\xc7\x34\xda\x51\xc6\x00\x9c\x88\x0c\x9c\x77\x9a\x12\xc5\xf8\x34\x01\x42\xb5\xa6\xd1\x6c\x68\xde\xc4\x3d\xb0\xcb\x10\x65\xf7\x8b\xd2\x12\x68\xea\x83\xb5\x53\xca\xec\x54\x84\x46\x52\x28\x45\xd2\x3c\xd1\x2c\x2b\x26\x23\x0a\x30\xcb\xc2\x32\xaa\x02\x18\x18\x15\x57\xc6\x35\xf7\xcb\xb7\xb9\x65\x89\x6a\xbd\x32\xd4\x36\xfb\x58\xe2\x39\xcd\xf4\x82\x98\x4f\x4e\x5c\xd9\x57\xa9\x34\x89\x12\x86\xdc\x1a\xdf\x68\x13\x6a\x71\xbe\xbe\xe7\xd5\xdc\xad\x54\xb9\xa5\xf2\x18\xc5\xd6\x4c\x2b\x82\x61\xc0\xe5\x84\x6e\xaa\x98\x29\x27\xe6\xab\x3e\xa1\xbe\x98\x96\x05\xb4\x5f\x29\x82\xda\x73\x16\x3b\xbb\xfb\xa9\x32\x5d\xa5\x88\xa8\xc1\x4d\x6b\xc0\x2a\x11\x1d\xe3\xde\x3d\x72\xf6\x6b\x21\xfe\xa5\x40\x81\x51\x7a\x2b\xc7\x00\x37\x80\xc3\xdc\xe0\x00\x44\x60\xf8\x2b\xdd\x80\xf5\x9f\x1c\xe9\x35\x95\x53\xd0\x45\x3c\x53\xd3\x58\xf1\x7a\x58\x48\xb5\xdc\x6f\x55\x11\x29\x41\x86\xd0\x19\x89\x18\x53\x7e\xca\xbc\xaa\x75\xf5\x84\xed\x0a\x5d\x19\xb5\x75\x37\x78\xc1\xc8\x86\x68\x16\x2f\x55\x19\x8d\x40\x91\xc3\x8b\xd1\x69\x9f\x8c\x2e\xce\x5c\x1c\xa6\x98\xac\xcb\x63\x76\x34\xcc\x62\xe0\xa6\xca\xc6\x45\x85\xb6\xca\xf4\x95\xdc\x4f\xf7\xee\x51\x21\x5f\xfd\xcc\x5d\x78\xe9\x32\x05\x40\x91\xab\xa8\x6e\x4e\x54\x8e\x22\x92\xb3\x09\xb1\x22\x31\xc3\x21\x1f\x94\xe9\x88\xbe\xee\x90\x7f\xa2\x58\x88\x83\x92\xcb\xba\xf0\xbe\x6e\x24\xb0\xc8\xaf\x57\x52\x3b\x30\x14\xd4\xc5\xbd\x34\x8a\x77\x69\xa5\x21\x55\x44\xb1\x77\xa0\x14\x9d\xc2\xa8\xa1\x7b\x6b\x93\x1d\x00\x3d\x5c\x25\x39\x40\x02\x94\xd8\x44\xdf\xe2\x97\x32\x26\xb8\x2e\x7c\x93\xd4\xae\xa9\xc0\xac\x3b\xc9\xb4\x06\x24\x25\x58\xec\x0f\x37\x7b\xb9\x16\x40\x6f\x29\xb2\xf8\x9d\x9f\xa4\x7c\xd8\x88\x12\x3c\xb6\x71\xbe\x63\x20\x63\xc9\x60\x42\x26\x0c\x83\x87\x31\x9c\xb7\x6f\x6b\x3f\x51\x6b\x7b\x52\x0a\x24\xae\xc7\x69\x50\x7e\x5d\x43\xf2\xa3\x5b\x98\x96\x39\xb7\x4d\x47\x9c\x70\x8f\xc9\xae\x6c\x42\xa6\x18\x0e\xec\x74\x94\x3f\xbd\xfa\xeb\x9f\xc9\x78\x61\x04\x29\x44\x48\x2d\x34\x4d\x8a\x8f\x4c\x80\x4f\x0d\xac\x2c\x53\xa8\xa7\x6b\x16\x10\xc0\xb6\x20\x76\xe1\xaf\xff\x70\x3b\xae\x4b\x76\xc7\x31\xcc\x8f\x2b\xf0\x1b\x24\x62\x3a\x24\xa7\x45\x76\x64\x9e\xc5\x68\xe7\x6f\x5e\xaa\xbb\x3b\x34\x13\x09\x8b\x16\xad\x11\xcd\x17\x21\x23\x33\x71\x67\x35\xcc\x35\xd8\x53\x66\x7e\x65\x22\xcb\x13\xeb\xea\xf8\xa6\x48\x74\xce\x15\xac\xa6\x23\xae\x3d\x17\x68\x9c\x77\x53\x2c\xd1\x51\x17\x05\xee\x5f\x29\x5c\x9a\x8b\x33\x1f\x17\xb5\xc8\x90\x98\x7c\x43\x93\x64\x4c\xa3\xdb\x1b\xf1\x56\x4c\xd5\x7b\x7e\x2e\xa5\x90\xf5\xb5\x24\xd4\xf0\xe8\x59\xce\x6f\x6d\x2b\x88\xa2\x5a\x83\x98\x1a\x81\x3e\xcb\xb5\x2f\xee\xbd\xee\x83\x6d\xea\xbe\x67\xfd\x5e\xf9\x2e\x67\x81\x7b\x56\x6a\xd8\x2e\x6b\xcc\x62\x64\x75\x7e\x55\x45\xb6\x3f\xbc\xfa\xd3\x5f\x2c\xea\x12\x21\xc9\x5f\x5e\x61\xa6\x80\xea\xdb\x43\x8c\x1c\xd5\x88\x27\x29\x4d\x12\x43\xc8\xab\x48\x69\x00\xbd\x0e\x09\x3f\x39\x0e\xea\xf6\xe8\xb6\xb5\x00\x7f\x73\xf3\x77\xe4\x22\x4c\x2b\x48\x26\x7d\x9b\x20\x55\x28\xd3\x3d\x14\x47\x7a\x8e\xfa\x60\x96\xda\x1e\x88\xdd\x73\x91\xe4\x29\x9c\xc1\x9c\x75\xd1\xeb\xa9\x36\x9b\x37\x30\x25\x4c\x21\x1f\x1c\x27\x22\xba\x25\xb1\xbb\x58\x89\x77\x5a\x2e\x4a\xde\x1c\x0a\x4d\x23\xbf\x5a\x44\x7c\x6d\xfc\xfe\x5a\xac\x57\x4a\xb3\xcc\xc8\x00\x98\x87\x29\xe9\x5d\x0d\x18\x78\x26\xb1\x72\x42\xcb\xd2\x36\xad\x9d\x1b\x6d\x5d\x1b\x03\xf7\x45\x86\x6e\x36\x9e\xa2\x71\xac\x53\x7b\xcf\x48\xb9\xfa\xe6\xe6\xf0\x1a\x42\x94\x13\xfa\xd3\x90\xe1\xbf\x6d\x2e\xd3\x8a\x60\x5e\x14\xd5\x2c\x10\xc3\x0a\x00\x06\x7d\x90\x24\x37\x37\xf3\x77\x60\x53\x6f\x17\xe8\x56\x83\x0b\x2f\x7c\x19\x29\xd5\x4e\x20\xf4\xba\x0a\x25\x19\x48\xc5\x94\xe1\xcb\x1f\xf0\x40\x9d\x26\x94\xa5\x15\xc3\xf3\xd3\x00\xc1\x1e\x6e\xac\xe4\xdc\x9e\x52\x1a\x3d\xc5\x4e\x88\xa4\xd0\x56\xb1\x5e\x23\xd6\xd6\xa5\xda\xeb\x7c\x8c\xf8\x83\xb7\xef\xd2\x50\xaf\x43\x4e\xfc\xd4\x34\xf6\x43\xb9\x0d\x75\x12\x6b\x7e\x29\x68\xac\xbd\xeb\x25\x51\x56\xfc\xbe\xe7\x4a\x58\x8b\xc5\x77\x44\x3f\x90\xa2\xba\xcd\xad\x93\xd0\x9a\xd6\x69\x4f\x58\x45\x17\x70\x0a\xe4\x90\xd8\xa0\x0d\x73\x26\xdc\xa3\xa4\xf7\xa6\xf7\xa4\xd4\xd5\x82\x48\x8a\x8c\x4e\x5b\xf5\x23\x5a\x82\xd4\xf2\xb4\xd5\x62\x19\x46\x7f\xaa\x90\x92\xcc\xdd\x65\x28\x89\xaf\x05\x84\x95\x9e\xac\x33\xdf\x03\xd8\x69\x16\xd8\x2f\x8e\xdc\xd1\x05\xa1\x52\xe4\x3c\x76\xe6\xd0\xc2\x1e\xfd\x6e\xe9\xc5\x97\x82\x83\xf7\xf3\x2c\xd7\xda\x40\x07\x14\xe3\xe4\xf5\xf0\xf5\xab\x97\xc2\xe2\xf0\x0b\x97\x58\xdc\x65\xc1\xe2\x2c\x7d\x7a\xd2\x6f\xf5\x55\xfb\x3b\xfa\xde\x77\xce\x36\x53\x16\xe5\x67\xbe\xe4\x37\xfe\x74\x27\x99\x86\x4a\x97\xc1\x43\xd4\x78\x8c\x62\x59\xa9\x2c\x71\xb4\xae\x1b\x46\x4b\x20\xb5\x2b\xe5\xa1\xf2\xf1\x47\xa4\x5b\x8e\x40\xe1\x71\x5b\x67\x1a\x53\x0f\x90\xb0\x2a\xa0\x0e\x0e\xc8\xa1\xbd\xb3\x67\xf3\xef\x8f\x9e\x14\xb5\x1c\xd0\xce\xef\xb3\x16\x75\x42\x97\x4a\x3d\x64\x14\x8d\x77\x59\x87\x10\xfc\x6f\x98\xd1\x39\x60\xdd\x01\x96\x50\x99\xa0\x8b\xfc\xda\xae\x9d\x8c\x73\x4d\x80\xcf\x99\x14\x1c\xed\xc4\x73\x2a\x19\x56\xf6\x91\x30\x01\x09\xdc\x28\xb1\x5f\x1e\x7e\x38\xb9\xc2\xf8\x9b\x23\xdb\xf5\xc5\xaf\x32\x57\xbe\x04\x4f\x75\x25\x95\xe9\x1e\xdd\x3e\xbf\x0e\x03\x43\xa4\xb9\x7e\x5d\xe6\x3d\x69\xae\x73\xdb\x5a\xe6\x3e\x4a\x72\xc5\xe6\x4f\x45\x49\x5c\x41\x88\x33\xd6\x68\x9f\x97\x8a\x53\x94\x80\x5a\xa9\x33\x51\xba\x09\x1e\x29\xc3\xdd\x53\x45\x8e\x69\x35\x64\xc3\xd9\xac\x48\xca\xa6\x33\xed\xa2\x3d\x97\x3c\x07\x15\x17\x54\x8a\x66\xde\xa7\xb4\x5e\x19\xb6\x7b\x92\x30\xaa\x76\x15\xb9\x56\x12\x19\xdd\x2c\x18\xe8\xc1\x5d\xad\x3f\x9a\x14\x46\x19\xf3\x22\x6b\xa9\xbc\x18\x39\x0f\x9a\x87\x1b\xe3\xff\xb4\x81\x35\x85\x5a\x62\x03\x65\xec\x23\xd6\xdc\x38\x21\x95\xa2\x40\x3e\xa0\x04\x89\x3f\x56\xa2\x42\x8d\x84\x0b\x3e\x98\x55\x8a\x36\x65\x22\xde\x31\xc9\xaf\xa9\xe2\xd1\x48\xe5\x58\x0f\x41\x32\x13\x49\xec\x7b\x68\x5b\x5b\xce\x18\xf4\x1d\x00\x27\x17\x23\x84\x9f\xf9\x44\xf4\x08\x6d\x80\xa2\x75\x2b\x60\x79\xa6\x8a\x2a\x5b\x83\xe7\xae\x08\xd6\x42\x2b\x69\x23\xd2\x17\x5f\xda\xfa\xcc\x7f\x57\xc0\xcc\x47\x64\xd3\xb1\x98\x03\x82\x34\x8e\x25\xa8\x16\xe5\x8d\x9e\x40\x4f\x6d\x45\x4a\x59\xa3\xf6\x3e\x75\xc7\x48\x01\x36\x6f\x5a\x42\xf1\x1d\x8f\x2a\x22\xde\x27\xa6\x60\x17\xa3\xd3\x16\xd4\xab\xf7\x83\xf3\x8b\x98\xa9\x7a\x3d\x45\x58\x16\x95\x3e\xd7\x21\x29\xdd\x8d\x95\x44\x09\x2b\x31\xee\xe6\xeb\x6a\x2a\x26\x56\x88\x5a\x4b\x22\x4d\xb8\x9d\xc6\x90\x15\x97\x24\xed\xcc\x39\xe8\x74\xc8\x44\x8c\xfd\x97\x4a\x68\x28\xff\x44\x15\x20\x3e\x58\xc2\x12\x79\x17\x3a\xd2\x2f\x82\x90\x97\x08\x13\x9a\xde\x7d\xf8\x61\x85\x8a\xaf\x00\xf3\x93\xc1\x72\x74\x71\xd6\x25\xba\x64\x2c\xde\x3b\x74\xd9\x5d\xbf\xac\xa7\xc4\xd5\x2b\x49\xb8\x09\xfd\x61\x1f\x89\x78\x83\x98\x54\x32\x1a\xbc\xbf\xda\x09\x58\x0b\x42\x89\xb5\x2f\x2e\xf5\x78\x6f\x00\x94\x9d\xa9\x04\x8a\x5a\xa3\x3c\x49\xae\x21\x92\xb0\xab\x5d\xb5\xbe\xff\x17\x4b\x73\x6d\x12\x79\x2a\xf2\x3b\x96\x27\x70\x37\xf3\xb2\x08\x66\x25\xb0\xa3\x4c\x3e\xcc\xf2\x04\x63\x61\x29\x5f\x78\x80\xe3\xea\x55\xc5\x89\xc5\x94\x0f\xab\xb1\x61\x5c\xb5\x5d\x50\x50\xbc\xac\xe8\x29\x45\x95\xb2\xae\x56\xc6\x63\x36\x67\x71\x4e\x13\x7c\x11\x4a\xa1\xd5\xfe\xfb\x05\x87\x4c\x7d\x51\xd7\x06\x2d\xf8\x7d\x8f\x7d\xbb\xee\x2f\xec\xf2\x16\x8c\x4f\x07\xf8\x8b\x79\xb1\x5b\xe1\x40\xf0\x01\x1d\x18\xb4\x79\x26\x82\x1a\x96\x25\x7f\x8f\x92\xd0\x95\xdf\x5f\x2f\xd2\x1b\xc5\x4b\xe4\xd3\x19\x02\x4b\xa6\xd4\x57\x08\x4c\x40\x63\xf1\x37\xe7\xc0\xb5\x51\x3b\xee\xd9\xd8\x89\x55\xd5\x62\x78\x75\xdc\x78\x26\xc2\x5a\x53\x8b\xd6\x52\xf4\x71\x85\xcc\x38\x18\xe9\x9d\x31\x50\xcc\x41\xce\x19\xdc\x1d\x3b\x56\x37\x30\x6a\xfc\xc0\x42\x44\x1d\x23\x60\x8f\xbf\xb0\xe2\xe0\xcd\xfb\xb3\xf7\xd8\x49\xd9\x99\x19\x73\x05\x93\x3c\x71\xbd\xe8\x87\x84\x66\xec\x03\x48\x85\xb5\x62\x6f\x19\x8f\xfb\x24\x67\xf1\xd7\x9f\x30\xc2\x85\x71\x56\x86\xed\xb5\xa2\x5a\x6f\x1d\x55\x72\x69\xc3\xec\xdf\x65\xbb\x78\x17\x05\x34\x86\x44\xf0\x69\x25\xe9\x19\xc5\x81\x0b\xce\xf4\x4a\xd3\x59\x5b\xc0\x11\x55\x5a\x21\x63\x0c\x8e\x64\x42\xd6\xec\xb7\x66\x3e\x2c\x6b\x57\x09\xb1\x34\x24\x8d\xd5\xe6\xc3\xb8\x15\x55\x30\x0f\x62\x23\x1f\x7c\x7e\xa4\xaf\xfa\xeb\xcb\xe5\xd9\xea\x8d\x33\xca\x63\xfc\x33\x8a\x84\x8c\xdd\x7a\x99\x2e\xe2\x39\x6d\xf4\x8f\x0d\x39\x41\x36\x64\x28\x1a\xe5\xcb\x6f\x46\x8d\x51\xa6\xb5\xd8\x3f\x2f\xa6\xe4\x9c\xfd\x2b\x07\x42\x53\x61\x08\xf1\x72\x6d\xfb\x25\x88\xa4\x74\x81\xbc\x10\x97\xfa\xd6\xc7\xa7\xbb\xa4\x42\xd5\x27\x57\x40\x63\x56\xc9\x8b\xee\x93\xb7\xf5\x44\xe9\xbe\x59\xcb\xb5\xcd\xe0\x74\x3f\xd9\xd5\x4b\x50\x22\x97\x11\x5c\x59\xa7\x4e\xea\x03\x88\x56\x3f\xc6\xec\x8a\xa6\xb7\xc0\xad\x12\x6d\x40\x83\x7e\xab\x5c\xe2\x1e\x44\x33\x88\x73\xe4\x2a\xe3\x05\x99\x30\xdb\xf0\x02\x59\x3b\x9b\xce\x40\x69\x2f\x0c\x1e\x63\x50\x4e\xd9\x3b\xcc\x2f\x00\xd1\xb7\x12\xbd\x5b\x9a\x9d\x52\x8a\xe5\x98\xf1\xc8\x52\xed\x13\x54\xac\x8e\xa5\xf2\xd4\x9f\xe5\x65\x48\xab\x21\x79\x6b\x5e\x65\xf1\xa9\xd2\x48\x80\x2d\x01\x17\x9d\x6a\xce\x6e\x46\x26\x54\xcd\xb0\xcd\xc6\xf2\x16\xb8\x1a\xfd\x51\x2e\x0d\xc1\xb0\xa5\xb3\x29\xb6\x47\xc7\x56\xba\xd8\x49\x7b\x9d\xa1\xa5\x65\x42\x82\x59\xec\xa0\xc2\xef\x9e\x0b\x13\x3b\x29\x02\xcc\x0d\xe0\xa3\x25\x4a\x60\x77\xd2\x30\x2c\x5f\x62\x4a\xe6\xbc\xf4\x70\x1a\xaa\xf0\xe9\x58\x52\x73\x7f\x66\x23\x3f\x64\x1b\x0e\x48\xe5\xb4\xbd\xa5\xa2\x77\x22\xa7\xb9\x3d\xe8\x8e\x0a\x97\x85\xb6\x87\x4b\x81\xc6\x28\x4c\x19\x0d\xe4\xf4\xdd\x59\x35\xb3\xa9\x9a\xb2\xe1\xf3\xc2\x86\xe4\x43\x5b\xbb\xf2\xb2\x61\xd9\x10\xf4\xd2\x5a\x5d\xb6\xc9\x30\x44\x23\x99\x7b\x95\xa0\x78\x9b\x97\x7c\x19\xcf\x72\xed\x38\x61\xa9\x24\xf2\x68\x46\xf9\x14\xf5\x42\x91\x9b\xf9\xbe\xfc\x12\x57\x24\x21\xce\x23\xd7\x63\xc4\x63\xed\x97\xde\xca\xea\x2a\x7b\x21\xb9\x52\x11\xcd\xfc\x9a\xab\x9f\xf5\xff\xb1\xf7\x3f\xde\x71\xdb\x46\xbf\x30\xfe\xaf\xe0\xa8\x3d\x5f\x69\x93\xdd\xb5\x9d\xb4\x7d\x52\xdf\x7c\x9b\xa3\x48\x72\xaa\x1b\x5b\xd6\x23\xc9\xc9\xdb\x37\xce\xd3\x62\x49\xec\x2e\x2a\x12\x60\x08\x50\xf2\xf6\xfa\xfe\xef\xef\xc1\x0c\x00\x02\xdc\x95\x2c\x91\x94\x77\xa5\x2c\x7b\x4e\x63\x71\x49\x90\x1c\x0c\x06\xf3\xf3\x33\x6a\x21\x34\xfd\xf0\x92\xf0\x31\x1b\x93\x9d\x3f\x06\x3f\xed\xe0\xd3\x8b\x52\x9a\x47\xd8\x8a\x0a\x78\xab\x8c\x6b\xc8\x6c\xd8\x09\xaf\x1e\x93\x23\xf3\x0c\x88\x3c\x79\x02\x06\x49\xff\x93\x9a\x7c\x43\x52\xb2\x19\x2d\xd3\xcc\x7a\x48\xae\x83\x4a\x11\x4f\x30\xf6\x81\x2b\xad\x70\x1b\xd2\x1d\x84\x93\xa6\xea\xd2\x88\x22\xb3\xb8\x46\x29\xd5\x74\x14\xac\xea\x67\x68\x6a\x8d\x2c\xf8\xf1\x88\x5a\xee\xaa\xa5\xd6\xb3\x3f\xd8\x82\xcb\x11\xf5\x57\x71\xa3\x94\x03\x0c\x71\x7b\x55\xe7\xb1\xb9\xc5\x3a\x60\x60\xc7\x0b\xf8\xa8\x06\xc6\x07\x1a\x40\x5b\x99\x5a\x65\xf2\x72\xd4\xc2\x3c\xdf\xb0\xa4\x8f\x4e\x2e\xce\xfe\x71\xfa\xf6\xf8\xe4\x62\xbb\xb2\xb7\x2b\x7b\xbb\xb2\x3b\xac\x6c\x26\xae\x3a\xaf\x6a\x67\x3d\xad\x0a\xd4\x36\xd1\x27\x83\x9a\xa3\x27\x94\x0e\x77\x24\xae\x7e\xa2\x46\x99\x2e\x4a\xa6\x40\x3f\x81\x28\xd3\x8a\xb8\xb5\xbd\x00\x55\xf7\x83\x47\x9f\x0f\xb7\xc6\x6c\xb6\x1e\xb3\x84\x42\xc7\xca\xaa\x59\x0b\x9b\x22\x1e\xfc\xf3\xf8\xf0\xe8\xe4\xe2\xf8\xd5\xf1\xd1\xd9\x5a\xd3\x3b\x3a\xa2\x3f\xc6\xfb\x72\xcb\x5d\xb2\x28\xd9\x15\x97\x95\xca\x16\x1e\x40\x7a\xb5\x10\x58\xce\x10\x14\x29\x78\x3c\x1c\x46\xf6\xca\xdb\xb6\x9b\x6d\xbf\x9b\x6d\x9c\xed\xd2\x01\xf8\xa7\x2f\xf6\x7d\x55\xca\xbc\x27\x16\x3e\x47\x5f\x8c\x0b\x61\xaf\xe2\xa7\x5d\x8b\x11\x12\x6d\x3d\x56\x79\xac\x01\x49\x8c\x3e\x9a\x17\xba\x43\x77\x90\x5e\xf0\x7e\xfb\x81\xc6\xc5\x0c\x9b\x37\xb4\xf8\x91\x2d\xce\x58\x47\x7c\xa1\x98\xde\x2c\x63\x89\xd9\xe8\xc8\x25\x5b\x60\x3a\xe5\x81\x7b\x58\x17\x1c\xa4\x8d\x84\x4b\xbe\x64\x5d\xa0\xac\xfb\xc4\x39\xbe\x64\x1d\x52\x45\xdd\xb1\x84\xf8\x6b\xa6\x10\xf4\x34\x33\xa7\xdd\x66\x8f\xf4\x8b\x71\xfc\x00\xb8\xce\x4f\x37\x8e\x12\x1f\x3d\xce\x82\x0b\xdf\xf6\x3c\x13\x18\x49\x5f\x44\x7b\x97\x17\x22\x04\x8b\x38\x81\x37\x5d\xe8\xc1\x2a\x19\x3d\x91\xa6\x6b\x7b\x41\x82\x53\xd8\xaf\x5c\xdd\xad\x05\x2b\x66\xe6\x7b\x04\xbb\xf4\xa5\x03\x3d\x50\xbe\x27\x20\x74\xd9\x1d\xc6\x7f\x42\x60\x74\x48\xfe\xe5\x4f\x42\x17\x7f\xf5\xcb\xee\xee\xb7\x3f\x1e\xfd\xe3\x6f\xbb\xbb\xbf\xfe\x2b\xfc\x15\xb6\x42\x0c\x6f\xc7\x97\x00\x82\x83\x90\x29\x3b\x81\x67\xc0\x9f\x56\x5d\xdb\xc7\x10\x8a\xfd\x01\x0a\xb0\xc7\x98\x6b\xe4\xff\x2c\x64\xda\xfc\x4b\x75\x82\x1a\xdc\xc8\x8d\x01\xa6\xa8\x43\x3d\x10\x1e\xfd\x6d\x0f\xb5\x2c\xe9\x79\xa9\xda\x51\x7d\x6b\x9b\x64\xce\x72\x04\x3b\x7b\xe5\x48\x00\x7d\x8b\x1d\xd2\x83\x80\xf2\x78\xa3\x99\xc6\xb8\x93\x3b\x57\x2f\x3a\x35\x78\xc7\xa3\x47\xd1\xe6\x67\xb0\x67\x82\x01\x45\x2c\xb5\x70\x21\xfb\x0d\xd6\xa7\xb9\xf8\xbe\x9a\xfb\xa7\xc7\xe4\x0a\x29\xbc\x31\xc4\x71\xe1\xcd\x57\x0f\x2a\xe3\x7c\x10\xb5\x59\x86\xfb\x12\x33\x98\xdd\xef\x16\x12\x41\x79\x6c\x3c\x66\x0c\x9b\x3d\x3c\x39\x4e\x8a\x6a\x68\x2f\x18\xe7\x2c\x97\xe5\xc2\xff\xe9\x4b\x31\x47\x4a\xcb\x92\xce\xa0\x12\x06\x6f\xc7\xdb\xfc\x5f\x78\x63\xf4\x80\xe5\xbb\xd1\x14\xae\x63\xa9\x56\x22\xb7\x84\xf6\xa8\x8f\x0d\x94\x6d\x8e\xf4\x1b\x22\xda\x92\xae\x00\x4d\xf1\x11\x33\xa4\xf7\xc4\xa1\xc2\xe9\xa9\x08\xf6\xa4\x2d\x11\x1e\xd6\x59\x6c\xe0\x0d\x10\x57\xc6\xb2\x6c\x0d\xad\x57\x1f\x3d\x4a\xb3\x94\x5f\x71\x25\x3b\xd4\xfb\xf8\x81\x6e\xce\x78\xb4\x28\x25\x98\xc5\xe5\xdd\x66\x1f\x0a\x40\x13\xf3\xeb\xb5\x21\xf6\x5f\x74\x69\x28\x86\x47\x41\xb5\x66\xa5\x78\x49\xfe\x67\xef\xfd\x97\x1f\x47\x83\xef\xf6\xf6\x7e\x79\x3e\xfa\xeb\xaf\x5f\xee\xbd\x1f\xc3\x3f\xbe\x18\x7c\x37\xf8\xe8\xfe\xf8\x72\x30\xd8\xdb\xfb\xe5\xc7\x37\x3f\x5c\x9c\x1e\xfd\xca\x07\x1f\x7f\x11\x55\x7e\x89\x7f\x7d\xdc\xfb\x85\x1d\xfd\x7a\xc7\x41\x06\x83\xef\xfe\xd8\xf9\xd5\x7b\x00\xf7\xc5\xa3\x4f\x88\xdf\x78\xc4\x5e\xd8\xef\x01\xfb\x5a\xe0\xe1\xd8\xab\xef\xf5\x7f\xe6\xa4\x66\x90\xd5\xe3\xb6\xeb\x8d\x59\xe0\x98\x16\xfa\x39\x3c\x39\xf8\xa4\xb8\x42\xc6\x9b\x16\x4f\x6d\x9f\xfb\x3d\x38\x77\x7c\x47\x4a\x98\xd7\x5a\x13\x9d\x96\x32\x77\x75\xf8\x10\xde\xc0\x8a\x31\x7b\xdd\x25\xeb\xd4\x23\x19\x8f\xad\x33\x68\xeb\x0c\xba\xe1\xf8\xa4\x33\x08\x8b\x08\x36\xd7\x13\xc4\xc4\x55\xdb\x10\xc6\xca\x08\xba\xb3\x75\x42\xb4\xbb\xbb\x05\xd4\xc6\x6e\xa9\xd7\xad\x5c\xeb\x64\x1a\xdc\xd0\xf2\xd5\x31\x4c\xb2\x0f\x2d\xdb\x71\xe1\xc3\x00\x1e\x4d\x94\xa1\x69\xe3\xaa\x26\xaf\xcc\x2b\x78\x0c\xf9\x08\x2d\x16\x72\x8b\xb9\x98\x59\xfc\x09\xdc\x4a\x6c\xf4\x89\x8b\x1a\x67\xd7\x2b\x87\x35\x38\x3b\x55\x4a\x26\xd0\x05\x09\x61\xf1\x3c\x08\x9f\x7d\x6d\x78\x1b\x4d\x2f\x21\xda\x98\xb0\x94\x89\x84\x59\xe0\xf6\xa8\x6d\x2d\x15\xe4\x48\x5c\x39\xf0\xfa\xb4\xc2\x64\x10\x14\x7f\xab\xc7\x78\x5a\x09\x08\x86\x11\x6d\x10\x2c\xc8\x43\x00\xa9\xef\x2d\x6c\x0a\xa9\x18\x72\x5a\x7b\x59\xdb\x75\xb6\xec\xbc\x8b\x77\xdf\x33\x7d\x64\xab\x93\x32\xb4\xb4\x59\xd6\xee\xe7\x78\x93\x7c\x0a\xc1\xc0\xee\xdb\xe7\xef\x6e\xeb\xec\x69\xdb\xec\x67\xcb\xbc\x47\xec\xa4\xcf\x6d\xb2\x8f\x60\x49\x51\xb2\x29\xff\xd0\xd3\x3a\xdd\x0f\xea\x09\x79\xca\x84\xe6\x53\x8e\xcd\x7b\x8b\x92\x15\x4c\x80\xab\x15\x4a\x34\x8c\xec\xb7\x3b\x65\x1d\x9c\xde\xc4\x64\x1e\x54\xb8\xfb\x15\x65\xe7\xab\x94\xfd\xad\x1c\x23\x5b\x39\xd6\xfa\xf8\x4c\x72\xcc\x72\xee\xe6\x08\x31\xc8\x3c\xef\x9e\xfd\x7e\x10\xa7\xb2\x03\x23\x77\x2f\x21\x6e\xc0\xb8\x79\xd1\xa8\x25\x26\xaf\x61\x1d\x5b\x49\x32\x76\xc5\x32\xab\x37\x91\x9c\x0a\x3a\x43\xec\x7d\x2d\x3d\x5a\x8f\x2c\x7d\xff\xa4\x66\xde\x3d\xe8\xf1\xae\xc4\x0b\x7e\x2c\x65\x96\xb1\x52\x91\x8c\x5f\x32\x72\xc8\x8a\x4c\x2e\x72\x9b\xfb\x9a\x92\x73\x4d\xb5\xe1\xea\x73\xa6\xdb\x85\x7d\xbb\xc1\x78\xb8\x2a\xf4\x9e\xc0\xce\xb1\xac\x1d\x8a\xc2\x49\x61\x2b\x28\xdf\x0a\x10\x1a\xfb\xd0\xca\x65\x48\x4e\xd8\x15\x2b\x87\xe4\x78\x7a\x22\xf5\x29\x6a\xdf\x71\xc2\x1d\x5e\x48\xf8\x94\xbc\x34\x76\x9d\xd2\x44\x63\x3b\x8d\xa0\x40\x5d\x96\xd1\x00\x35\x50\x5b\x1f\xf5\x79\xcb\xb5\xe7\x30\x92\xaf\x3c\x6f\x15\xc9\xe8\x34\x4d\xbe\x5f\x51\xe7\x09\xda\xc7\x7a\xd2\x1a\xbb\x37\xe0\x6f\xc4\x55\x70\xd0\x63\x60\x05\x72\x41\x4a\xa6\x0a\x29\x14\x8b\x71\x15\xfd\x1b\xa1\xb5\xdb\x2f\x68\x6b\xeb\xcd\xb3\xeb\xb6\x59\x48\xa5\xa1\x84\xb6\x9f\x2e\x58\xa7\x6e\x38\xa8\x48\xa6\x59\xc6\xd2\xa8\x0d\x1a\xb6\xef\xa1\xb1\x87\x20\x81\x76\x0c\xa9\x6f\xe8\x81\x85\xca\x51\x8d\x73\x74\xbd\x6f\xa9\xe7\x9a\xd6\xb8\x7e\xca\x37\x55\x36\xd7\x0b\x13\xf6\x91\x80\x01\x96\x10\x9e\x01\xf7\x5b\x05\x9d\x6f\xe6\x52\x5e\x92\x44\xe6\x45\x06\x4b\xa7\xc3\xca\xaa\x1b\x6f\x79\x56\x1a\x99\xd1\xd5\xb3\xa0\x27\x17\x9c\xe8\xd6\x92\xab\x93\x22\xd6\x87\x1a\xc6\x3e\xb0\xa4\xb7\xa6\x9d\x47\x1f\x58\x12\x74\x9d\x05\x0c\xaa\xc4\x21\x44\x98\x15\xdb\xbd\x99\x78\xe7\x90\x43\x5f\x6e\xfe\x0e\xb5\x74\xe1\xd1\x80\xed\x83\x31\x1d\xbc\xb9\x7d\x04\x74\x8a\x00\x5b\x08\xeb\xeb\x42\x18\x0d\xcf\x8c\xb8\xf4\x96\xb0\xfe\x7c\x22\xb5\x1b\x0b\x7a\x42\x49\xa9\xc9\xde\xee\xb3\xdd\xc1\x92\xff\xb1\x81\x91\x7d\x11\xdc\xc9\x01\xdb\xb1\x00\xa0\x44\x96\xec\xa6\x43\xc2\xb5\xcb\xb4\xc6\x86\x45\xf0\x56\xb6\xe8\x6f\x48\x94\x24\xba\xa4\x29\xb7\x6a\x0c\x9c\x35\x17\xe9\xb2\xb2\x52\x7e\x6f\xf7\xe3\xae\xed\x65\x74\x2d\xc5\xae\x86\xd7\x1f\x93\x0b\xc4\x89\xf1\x03\x2d\x64\x05\x2d\x3a\x91\x04\x45\xc6\x13\xae\xb3\x05\x48\x2c\x22\x2b\xec\xe7\x65\xf6\x0b\x5b\x6c\x78\xf4\x81\x6b\xd7\x4d\x44\x4e\xc9\x73\x6c\x27\xc6\xa8\xf5\x80\x66\xfc\x8a\x3d\x9b\x33\x9a\xe9\x39\x26\x89\x08\x29\x46\xd8\x11\xd2\x88\x12\xfb\x4b\xd7\x78\x49\x37\x77\x62\x78\x74\x70\x2d\x2e\xbf\x50\x47\xcb\xc1\x08\xd1\x1f\xda\xb7\xa9\x26\x4b\x70\x5d\x17\x17\xa7\x3f\x44\x8d\xaa\x41\x8a\x6b\x5d\xb8\xd4\x9d\xa0\x9b\xfb\x06\xc8\x8e\x7e\x82\x95\x9d\x3a\x56\x93\x1e\x45\x58\xd7\xce\xd5\x64\x35\xfc\xda\xdd\x5b\x56\x93\x7f\xc8\x0a\xc0\x40\xe8\x24\x5b\x78\x24\x06\xc5\x34\xd9\x31\x43\xed\x18\xf1\x64\xb8\xe1\xef\x8c\xa6\x08\x94\xa1\x34\xa3\xad\x54\xb7\xf0\xe8\x2d\x88\x16\xbc\x5b\xbf\xfb\x40\xa5\xb4\xcc\xc9\xdc\x7e\x76\x5c\x7a\x69\x57\xc6\x18\x56\x8f\xab\x6b\x2a\x59\x81\x12\xce\xde\xf3\xe4\xe4\xd7\x92\xdc\x40\xba\x47\x5d\x0b\x92\x90\x6c\x61\x53\x1c\x2e\x90\x58\x88\x3b\xd3\x93\x2c\xed\x21\xf9\x81\xf4\x98\x00\x41\xba\x15\x72\x36\x07\x82\xa0\x5e\xf7\x5c\xaf\xde\x72\x2a\x48\x6f\x79\x03\x64\x95\x93\xd5\xf2\x0c\x7a\x5f\x7a\x22\x62\xaf\xd1\x7a\xd2\xbd\x54\x34\x3c\x6e\x27\x40\x3f\x93\x4f\xfa\xa4\x40\xd1\x43\x6a\xf7\x72\x62\x37\xc2\x48\x41\xe9\x25\x0a\x57\x10\x13\x8a\x95\x57\x6d\x8b\xb9\xeb\xa3\xbf\x4f\x97\xed\x2d\x7e\x77\xac\xa8\x93\x2e\x89\xf0\x6d\xb0\x1d\xac\xe9\x32\x41\x82\xcc\x04\xdb\x35\xdb\xb9\x73\xdd\x76\x44\xc5\x8c\x91\x17\xe6\xce\xbf\xfc\xf9\xcf\x5f\xff\x79\x8c\xc3\xfb\x2c\x05\x41\x8e\xf7\x4f\xf6\xff\x79\xfe\xd3\x01\x14\xc7\x76\xa5\x6a\x4f\x29\x98\x7d\x27\x60\xf6\x9a\x7e\xf9\xa0\xc9\x97\x50\xf2\xd1\x59\x8a\xc4\xbe\x7f\x18\x32\xc4\xf7\xb4\xba\x5f\x80\xb3\x67\x74\xcd\xd8\x91\x6a\x96\xda\x46\xac\x31\x9d\x14\xe7\x32\xb9\xec\xd1\xae\x39\x64\x45\xc9\x12\xf4\x93\x5d\x1c\x9c\xe2\xe8\xc6\xbe\x3c\x79\x7b\x51\x97\x1a\x40\x3e\x4e\x0d\xa6\xf7\x77\xeb\x49\x33\x36\xe9\x25\x2b\xb4\x37\xdd\x27\x34\xb9\xbc\xa6\x65\x0a\x9e\x2d\xaa\xf9\x84\x67\x5c\x23\xf6\x5f\xc9\x6c\xdf\x2a\x4c\xf8\x43\x90\x33\xd7\x17\x18\x65\x39\x3a\x10\x9c\x3b\x14\x5c\x56\x98\x47\x33\xa5\x3c\x03\x0f\xaa\x6d\xc9\x8b\x19\x41\x49\xe1\x5d\x7a\xa1\x4f\x7b\x6b\x7c\xb9\x63\x63\x8d\xaf\xa0\x65\xf0\x7d\xed\xb0\xae\x79\x89\x1b\xbc\xd5\xd9\x2d\xae\x8c\xba\x77\x6f\xb7\xba\x1e\xc6\xdb\xdc\xad\xae\x28\xd9\xb9\x96\xad\x5a\x00\x90\xe5\x28\x09\x0e\x76\x43\x8c\x64\xc2\xa6\xd2\x08\xe1\x1b\x83\x1e\x69\x05\x8b\x90\x0a\x28\x0e\x74\x5e\x2d\x19\x05\x36\x30\x23\xd3\xf5\xcb\xce\x2c\x70\xea\x33\x15\xa2\xa5\xba\xe6\xc7\x43\xf3\x75\x2c\x87\xb7\x1b\xd6\x55\x0e\xb6\xf5\x32\x9c\x64\x3a\x41\xcf\x6d\x20\xc8\x01\x39\xd4\xbe\x7e\x33\x8c\x92\x94\x54\xcd\xb1\x2d\x31\xfb\xc0\x5d\x7f\xfa\x53\x99\x36\x9b\x89\xcf\x4a\x9a\x30\x52\xb0\x92\x4b\xb3\x19\x55\x42\xa7\xf2\x5a\x90\x09\x9b\x71\xa1\x1c\x29\x00\x3c\xdd\xd2\x0c\xe2\x31\x5c\x79\x60\xb8\x31\x39\x8b\xc0\x4e\x6c\x19\x52\x22\xeb\xa5\x69\xdf\xb9\x19\x49\x82\x1d\x0b\xe8\x84\xbd\x7a\x3c\x85\xc3\xf6\x45\x9f\x7a\xe5\xbd\x4a\xc0\x93\x53\x96\xd1\x05\x66\x9b\x42\xcb\x72\xfe\x1f\x56\xaa\x41\x0f\x11\x27\x6c\xc0\xe5\x7e\xbb\xf1\x3d\xb8\x22\x25\xa3\xc9\xbc\x5b\xf0\x77\x1b\xa2\xba\xe3\xb1\x0d\x51\x75\x19\x64\x1b\xa2\xda\x86\xa8\x3e\x71\x6c\x43\x54\xdb\x10\x55\xe3\xd8\x58\x2b\x69\x1b\xa2\x6a\x7d\x6c\x43\x54\xb7\x1f\xdb\x10\xd5\x1d\x8e\x6d\x88\xea\x8e\xc7\x36\x44\xb5\x0d\x51\x6d\x43\x54\xdb\x10\xd5\xef\xc8\x6f\xe7\x8e\x6d\x88\x6a\x69\x90\x6d\x88\x6a\x1b\xa2\xba\xf3\xb1\xb1\xc6\xd7\x36\x44\x85\xc7\x36\x44\x15\x1f\xbf\xaf\xad\xce\x05\x78\x4e\x8d\xa9\xd7\xbd\xa6\xed\x14\x82\x0a\x3c\xb1\x71\x22\x39\x8d\xea\xa0\xf0\x51\xe3\xba\x47\x45\x00\x0b\xe2\x4a\x71\x6c\x44\xa8\x8e\x33\xad\xac\x97\xea\xd8\x47\xae\x90\x69\x1d\xa8\x08\x22\x14\x68\xf0\xb6\xaf\x59\x5b\x5b\x35\x56\x97\xb0\xc4\xe7\x09\x49\x6c\x48\xfc\xa6\x87\x30\xc4\x36\x04\xf1\xe4\x42\x10\xfd\xb8\xef\x7a\x70\xdd\x75\xde\x2a\x6c\x64\xfe\x62\x5e\x32\x35\x97\x59\x6b\x46\x8f\x98\xfc\x0d\x17\x3c\xaf\x72\xe8\x14\x6b\xf8\x99\x5f\xf9\x14\x00\xdf\xbe\xda\x4a\x6c\xf4\x22\x06\x2d\x65\x5d\x2b\x59\xa8\xdf\x9c\xd3\x2b\x68\x8f\x5a\x25\x09\x63\x69\xd0\x94\x1e\x34\xac\xaf\xc7\xfe\x49\xbe\x75\xc6\x8b\x6e\xf2\xa6\xdb\x26\x8e\x70\xa4\x30\xca\xd7\x5f\xb5\x1a\x63\x56\x16\xfd\xc8\xe5\x1f\xce\x4e\x0f\x02\xb9\x4c\x85\x13\xcb\x5c\x5c\xc9\x0c\xa8\x4a\xf1\x22\xa3\xac\x8d\xb1\x7e\x9f\x1b\x83\x69\xc2\x34\x0d\x6c\x1b\x6b\x16\x28\xc2\x04\x9d\x40\x87\x5a\x73\x97\xdf\x91\x4f\x71\xdf\x65\x54\x57\x25\x23\x33\xaa\xd7\x29\xf0\xbb\x9b\x30\x9d\xcc\x97\x3e\xf6\x9b\xae\x1a\x7a\xec\x83\x33\x7a\x78\xec\x85\x9a\x01\x5f\x20\x82\xfe\x9d\xf5\xf0\xce\x92\xb2\xbb\x6e\xdc\x7d\x69\x11\x80\xb8\x81\x0f\xef\x8d\xc0\x3b\xe7\xb6\x75\x94\xdd\xce\x43\x23\xc8\x75\x95\xd2\x92\x14\x19\xad\xfb\x42\xc1\x0c\xfc\x1d\xf6\xa0\x83\x39\x4b\x2e\xcf\x6c\x24\x76\x4f\x31\xe6\x75\xd3\x19\xd7\xf3\x6a\x32\x4e\x64\xfe\xcc\x88\x04\xfc\xbf\x49\x26\x27\xcf\x72\xaa\x34\x2b\x8d\xba\x6a\xb7\xb8\x51\x62\x46\xe1\x62\x36\xce\xd3\xc1\x98\xbc\x17\x58\xdd\x5e\xf7\xa1\x0c\xb0\x1d\xcc\xf3\x1d\xce\xc6\x84\x19\xe9\x2a\xc1\x0f\x11\x40\xd8\x99\xd7\x1b\x77\x01\x4a\xee\xbc\x25\x75\x8c\x82\x7f\xfe\x08\xf8\x56\x72\x91\x1e\x1c\x2e\x8f\x2d\xd2\xdd\x5b\xc6\x47\x0f\x11\xee\x0d\x8a\x6e\x6f\x8c\x6a\xbc\x29\x11\xed\x0d\x44\x9b\xee\x21\x00\xdb\x47\x04\xbb\xbf\xe8\xf5\x03\x80\x32\x3f\x4c\xd4\xba\x47\xd7\x5e\x4f\xd1\xea\xcf\x11\xa9\xee\xe5\xab\xbb\x46\xa8\x3f\x5f\x74\xba\x9f\xcf\xed\xd3\x10\x78\xac\x11\xe9\x1e\x5c\xf4\x7d\xba\xe7\x7b\x73\xcd\x3f\x58\x04\xba\x7b\xf4\x79\x03\x22\xcf\x9d\x89\xcc\x05\xd7\x9c\x66\x87\x2c\xa3\x8b\x73\x96\x48\x91\xb6\xde\x61\x1a\x28\x9d\x7e\xfd\x28\x1c\xd6\xfa\xa9\xe2\x42\x8b\x39\xb5\x60\xe4\xc6\xa2\xc2\xc2\x12\x17\xcb\xb0\x0a\x05\x44\x95\xf1\x2d\x37\x32\x3a\x41\x36\xc6\x21\x86\x55\x27\x7d\x4e\xe2\xdf\xe5\x35\x91\x53\xcd\x04\xd9\xe3\xc2\xcd\xe3\x20\x30\x03\x6b\xef\xa4\x67\x6b\xf3\xeb\x8b\xe7\xee\xe2\xa7\xe7\x76\x04\x07\xab\x52\x0f\xef\x05\xb6\x0f\xfa\xb4\x1b\xd8\x5e\x38\xad\xb2\xd8\x15\x8c\xee\xe1\x58\xde\xbc\xa8\xe1\x94\x5f\xc0\xb8\x7e\xb5\x51\x91\x12\x5b\x89\xf6\xf4\x26\xad\x73\x5e\x4d\xac\xfa\xf9\x3c\x9a\x4f\x79\x8d\x2f\x0e\x4e\xd1\x69\xbc\x75\x97\x6c\x8a\xbb\x64\x4d\xb9\x29\x1b\xa8\xe8\x3e\xd2\x7c\x94\xad\xa2\x7b\x8f\x23\xa8\x4d\xfd\xa1\xa4\x09\x3b\xed\x5d\x47\x70\xcb\x89\xa4\x55\x49\xad\x00\xf4\x2a\x9f\x5b\x3c\x82\xb1\x14\x57\x93\xaf\xe7\x85\x4a\xd9\x69\x95\x65\x0b\x52\x15\x52\xc4\xd5\xcf\x18\x6b\x6f\x16\xd3\x82\x4b\x7e\xc5\x53\x6a\xc5\xb2\x28\xa5\xdd\x33\xcb\x4a\x08\x23\x83\xeb\x9e\x68\xa0\x48\x02\x4c\x33\x8d\x4a\x76\x15\x9f\x99\xd7\x37\xfb\x1f\x54\xf3\xd6\x09\x88\xd1\x80\xe6\xee\xa9\x2c\x13\x3e\xc9\x16\x64\x4e\x33\xdf\x00\x87\x92\x4b\x9e\x65\x76\x98\x31\x39\x67\x1a\x43\x0a\xb8\x77\x66\x52\xcc\xe0\xe5\xa8\x70\x8d\x17\x59\x62\xee\x4d\x32\x46\x45\x55\xe0\xf3\xcc\x4e\xbc\x90\x55\xe9\x9e\x37\xf6\x81\x09\xbf\x03\x0b\x9e\x0d\x83\xf6\x6e\xb7\x4e\xac\xcf\xfd\xa9\x94\x51\x00\xde\x3a\x58\xea\x61\x38\xa6\x43\x0e\x57\x41\x73\x9f\xa2\x94\x57\x3c\xc5\xe8\x86\x23\x1b\x34\x92\xc6\x06\x3e\x7e\x3d\x0b\x29\x46\x82\xcd\x28\x28\x2a\x76\x15\xe1\x9c\xe1\x38\x98\x41\x20\x52\x68\xe9\x63\x34\x7c\x59\x44\xe5\xf4\x57\x1c\x9b\x11\x07\x94\x23\x7b\x42\x12\x09\xf9\xa8\x95\xe0\x1a\x1b\xdc\xcf\x2b\x4d\x52\x79\x2d\x06\xf7\x8a\xba\x42\xa0\xf5\x62\x25\x81\xe2\xf0\xeb\x2a\x3d\x07\xbf\xf7\x76\xf2\x72\x65\x5d\x9f\x53\x52\x09\xc5\x3a\x6e\xef\xbd\x29\x47\x7f\xf9\x53\x3b\x19\xc1\x73\x26\x2b\xfd\x59\xac\xbf\xeb\x39\x4f\xe6\xa1\x32\xcb\x73\xa6\x88\xac\x1a\x66\xf1\x0b\x7b\xdb\xea\x19\xda\x9a\x80\xab\x8e\xb6\x8e\xdd\x15\xde\xaf\x26\x1c\x42\xdd\xf9\x1a\xf2\xc4\x0f\x4f\xce\xff\xf9\x7a\xff\xfb\xa3\xd7\x63\x72\x44\x93\x79\x88\x89\x21\x08\x05\xa1\x01\x82\x62\x4e\xaf\x18\xa1\xa4\x12\xfc\xb7\xca\x06\x7c\xf7\xfc\xbd\x83\x5e\xb1\xda\x5b\xee\xbe\xd0\x9d\xbf\xb7\x76\x70\xd8\xeb\x1f\xf3\xb2\xa4\x62\xd0\xc0\xa5\xa9\x3e\x1d\x99\x9f\xd0\x38\x00\x55\x0b\x12\xe7\x67\xfc\xca\x8a\x61\x0b\x7e\x4f\x53\x9f\x29\x66\xf8\xdc\xb0\x85\xd9\xaa\xe8\x04\x32\xbc\xe6\x8c\x08\xa6\x0d\x5b\x7b\x1f\x93\x14\x2a\x02\x27\xa9\x14\x53\x43\x32\xa9\x20\x27\xad\x28\x79\x4e\x4b\x9e\x2d\xc2\xc1\xcc\x5e\x75\xe2\x43\xde\x8b\xe6\x2b\x1d\xbe\x3d\x3a\x87\x1a\x81\xa2\x44\xd8\x12\x48\x2a\x83\xdf\xe1\xb3\x26\xcc\xdc\x61\xdb\x08\x8f\xc9\xbe\x58\xe0\x8f\xb8\xc0\xb9\x22\x19\x57\x9a\xc1\x16\x6c\x75\x48\x17\x4c\xdf\x79\x3e\x86\xff\xed\x98\xaf\x2c\x8d\x92\xe9\x73\xe5\x92\xa5\xe4\x55\x54\x43\xf9\x24\x0b\xa8\x69\xbf\xfd\x49\x35\x84\xab\x93\x84\x0c\x11\x83\x86\x70\xd4\x4f\x35\x90\x17\x1b\x04\x72\x31\xcb\x42\xae\x6a\x27\xf6\xbb\xda\x96\x5d\x2d\xcb\x51\xfd\x05\xa7\x6d\x0d\xcc\x5e\x1a\xd3\xd5\xef\xd0\x53\x3b\xa7\x7a\xf7\x73\xe6\x94\x95\x08\x32\xec\xd0\x7b\x7c\xea\x56\x80\xd5\x6e\xf2\x46\x5b\xd7\xa2\xce\x49\x1a\x92\xe7\xe4\x5b\xf2\x81\x7c\x0b\xe6\xd5\x5f\xba\x36\xbf\xea\x6a\xf8\xf4\x91\x62\x64\xac\xfa\xe3\xd3\x9e\x28\xfe\xb3\x91\x4e\x66\x44\x43\x55\x2d\xc9\x84\x5b\x75\x9e\x7d\xd0\xac\x34\x72\xd4\xce\xc4\x5a\xdb\x86\x99\x17\xfc\x8c\x6c\x86\xe1\x86\xe3\x69\x9c\xd6\x74\x3f\x46\x33\xb7\xff\x5d\x2a\x7d\x62\xa5\x50\xdc\x00\xa7\x1e\x2d\xa7\x3a\x99\xc7\x62\xcc\x28\x6a\x4a\xd7\x0b\x4c\x91\x54\x42\x96\x15\xa6\x2f\xcf\x79\x87\xe4\x89\xcd\x61\xe3\x6e\xf1\xf4\x68\x3e\x6f\x9b\xa9\x86\x03\x05\x2c\x1f\xab\x58\x05\xc8\x58\x85\x4c\xad\x4e\x66\x5e\x2b\x0d\xf6\x8c\x5b\x94\x32\xeb\xab\xf1\x5e\x66\xe0\x25\xb3\x9e\x12\x2a\xb0\x80\x64\xca\xca\x12\x33\xce\x27\x0b\x97\xac\xd7\x79\xf2\x3a\xad\xa4\xa2\x94\x5a\x26\xb2\x43\x67\xb3\x38\xc6\x6d\x87\x03\x22\x60\x96\xaf\x73\x93\xbf\x3b\x3c\x1d\x92\x8b\x83\x53\xe8\xf6\x74\x7e\x70\x71\x1a\x5b\x2a\x3b\x17\x07\xa7\x3b\x6b\x25\x05\x71\x9a\x15\x38\xa6\x5b\x0c\x12\x39\x9e\x8c\xda\x36\xca\x69\x31\xba\x64\x8b\x96\x7b\x6a\x1f\xfb\xfa\xc8\xcf\x70\x2f\x1f\x84\x64\xce\x69\x71\xef\xd1\x4a\x46\x53\xfe\x99\xaa\xb8\x5c\x1a\xac\x7f\xe6\xea\x72\xae\x5c\x5e\xb1\x14\xd5\x61\x77\x07\x13\x69\x21\xb9\xd1\x17\xb7\x35\x5e\xf7\xbf\x7b\x5b\xe3\x75\xe7\x63\x5b\xe3\xb5\xad\xf1\x5a\x3e\x36\x26\x91\x75\x5b\xe3\xf5\xb4\xe2\xf6\xdb\x1a\xaf\xdf\x79\xe8\x7f\x5b\xe3\xb5\xfa\xd8\xd6\x78\x6d\x6b\xbc\xee\x76\x6c\x6b\xbc\xee\x7f\x6c\x5c\xd2\xd2\xb6\xc6\xeb\x5e\xc7\xb6\xc6\x6b\xf9\xd8\xd6\x78\xdd\x70\x6c\x6b\xbc\x6e\x38\xb6\x35\x5e\xdb\x1a\xaf\x6d\x8d\xd7\x36\xf5\xf5\x93\x63\x6d\x66\xea\x2b\xd9\xd6\x78\xd9\x63\x5b\xe3\xf5\x24\x12\xfc\xc8\xb6\xc6\xeb\x4e\xc7\xb6\xc6\x6b\x5b\xe3\xd5\xe6\xd8\xd6\x78\x3d\x15\x77\xc9\xb6\xc6\x6b\x5b\xe3\xf5\xfb\x51\x74\xb7\x35\x5e\xdb\x1a\xaf\x6d\x8d\xd7\xb6\xc6\xeb\xd6\xb7\xd8\xd6\x78\x3d\x05\x13\xd0\xf5\x01\xee\x5e\xb3\xb4\x7b\x20\xf3\xa2\xd2\x8c\x9c\xb9\x21\xbd\x16\x89\x82\x81\xab\x50\x23\xe8\x9e\x42\x98\x48\x31\xe5\x33\x2b\xd9\x9f\x61\xf3\xdd\x91\xff\x9e\x51\xd0\xf0\xf6\x11\xe6\x0f\x66\x3c\xe7\xed\x0a\xc9\xc8\xd2\xc4\xbc\x86\xb1\x82\xb8\x8c\x59\x49\x39\xfd\x00\x4b\x84\xe6\xb2\xc2\x86\xc5\x89\x9d\x3f\x4f\x42\x8c\x5e\x6d\xdc\xcc\x90\x7e\x4c\x9c\xba\x22\xee\xb4\x8f\xb4\x12\xaa\x35\x2b\xc5\x4b\xf2\x3f\x7b\xef\xbf\xfc\x38\x1a\x7c\xb7\xb7\xf7\xcb\xf3\xd1\x5f\x7f\xfd\x72\xef\xfd\x18\xfe\xf1\xc5\xe0\xbb\xc1\x47\xf7\xc7\x97\x83\xc1\xde\xde\x2f\x3f\xbe\xf9\xe1\xe2\xf4\xe8\x57\x3e\xf8\xf8\x8b\xa8\xf2\x4b\xfc\xeb\xe3\xde\x2f\xec\xe8\xd7\x3b\x0e\x32\x18\x7c\xf7\xc7\xd6\xaf\xdc\x59\x25\xee\x4f\x21\xee\x49\x1d\x7e\x10\x65\xd8\x06\x74\x7b\x5a\x8b\x36\x19\x65\x69\x35\xda\x0d\xeb\xb6\xd5\xe8\xa4\x29\xa8\x79\x7e\x1c\xae\x88\xcc\xb9\x36\xca\xa1\xd1\x07\x69\x98\xce\xca\x75\x64\x94\x5a\x39\x00\x09\xdd\x54\x63\x7b\x75\x9f\x0a\x1a\x24\xb1\x48\xa7\xf9\xd9\xfe\xf3\x3c\x2f\x32\x68\x6b\x0e\xeb\x79\xe4\x72\x59\x60\x73\xdd\xca\x86\x4f\x1f\x5b\xd9\xf0\x14\x65\x83\x62\x49\x55\x72\xbd\x38\x90\x42\xb3\x0f\xad\x3c\x2c\xb1\x68\x38\x8f\x07\xb4\x39\x63\xb6\x8a\xdb\xfe\x46\x64\x81\x79\xdf\x8d\x72\xfa\xb9\xac\xb2\x14\x8a\x39\x2a\x01\x06\x26\x56\xe9\x31\x8d\xd6\x1f\xd8\x3d\x90\xca\xdd\x7c\x88\xb3\xe7\xd0\xcc\xfc\xad\xe2\x57\x34\x33\xd6\x6e\x7d\xc7\x29\x58\x30\xe1\x4d\x77\x5d\xf3\x9a\xaa\xcb\x7a\xc1\xb3\x91\xd1\xa1\xfd\x3b\x3f\x73\x9f\x04\xa7\xd8\x07\xfd\x18\xb5\x34\x50\x90\x4e\x4b\x7e\xc5\x33\x36\x63\x47\x2a\xa1\x19\xc8\xb5\x7e\xf6\x8a\xfd\x1b\x46\x87\x89\x2f\x65\xa6\xc8\xf5\x9c\x19\x59\x4d\xa8\x73\x01\x40\x85\xdd\x8c\x72\x41\x72\x33\x45\x85\xbb\x59\xa1\x2f\xc1\x88\xff\x82\x96\x66\x82\xbd\xcf\x00\x4c\xe4\x89\x94\x99\xad\x78\xc8\x16\xf5\xf8\xb6\xf6\x47\xc8\x7f\x0a\x76\xfd\x4f\x33\x9a\x22\xd3\x8c\xce\xbc\xab\x40\x31\xbd\xe4\xed\xab\x87\xbe\xf1\x03\xa0\x9c\xa0\x62\x84\x66\xd7\x74\xa1\x6a\xc7\x49\x80\xfb\xa0\x5e\x92\x17\x03\x60\x67\xaa\x88\x1f\x23\x25\x5f\x0d\x20\xfc\x77\xb0\x7f\xfa\xcf\xf3\x7f\x9c\xff\x73\xff\xf0\xcd\xf1\x09\x39\x91\x9a\xe1\xa6\x16\x34\x07\x4c\xbc\x85\x61\xde\x12\x9e\x01\x56\xba\x54\x63\xf0\x5d\x72\x45\xae\xb9\x48\xe5\xb5\x6a\xed\xa3\x45\xf6\x33\xc4\x63\x54\xb4\x1a\x23\xa1\x05\x85\x9e\x87\x1d\x76\x98\xa5\x0c\x93\x70\x50\xd8\xc3\xd3\xf4\x59\x5a\xca\x02\x89\xe0\x9c\x5c\xf5\x56\x1b\x9b\xd1\x61\x0e\x2b\xcc\xef\x34\x1e\x70\x56\x52\xa1\x6b\x6f\x4f\x3d\x67\xb6\xd9\xe2\xb8\xf3\x74\x3c\xee\x8a\x26\x9a\xf6\x57\xcd\xb4\x9f\xa6\x2c\x8d\xc8\xff\xe4\x32\x07\x0f\xdc\xc7\x2d\x6a\x94\x0a\x72\xfa\xf6\xfc\xf8\xff\x69\xf0\xf1\xa2\xe8\x96\x28\xd5\x4f\x65\x6c\x29\x8b\xde\x66\xf7\xcc\x56\x5e\x6e\xe7\x77\x23\xe6\xd7\xef\x96\xfd\x84\xe7\xcf\x2a\x11\x03\x19\xd5\xe3\x93\x5c\xa6\x6c\x4c\x4e\x7d\x9c\x20\xfe\x35\x00\x38\xa0\x25\x23\xe6\x12\xa1\x39\xcd\xb2\x45\xa8\xa2\x69\x89\x55\x88\x11\x36\x43\x28\xc8\xa7\x34\x53\xeb\x96\xc6\x5d\xf6\x46\xa3\x47\xbc\x31\xf6\x70\x2f\xd3\xe1\x47\x23\x29\x13\x52\x5b\xc5\xda\xbc\x25\xe0\x5d\x94\x32\x21\x68\x7c\x07\xc9\x58\xd1\xfe\xa6\x30\x56\xe1\xb6\x46\xae\x1c\xb1\x4f\xfd\xc8\xe8\xa8\xae\x14\x6b\x2a\xe8\xae\x0f\xb1\x37\xc7\xcd\xe8\x25\xa3\xa9\x14\xd9\x02\x32\x2f\x31\x97\x22\xa7\xea\x92\xa5\x78\xc2\xaa\x66\x3e\x52\x61\x46\xf4\x8f\xba\x30\xef\xed\xc2\x12\xa0\x92\x61\x86\x07\x84\x33\x58\xba\xe6\x59\xef\xb0\x08\x0d\x51\xde\x8a\x6c\x71\x26\xa5\x7e\xe5\xcb\x68\x7b\xe1\x80\x9f\xad\xb6\x1c\xbb\xa2\x41\x9d\xa4\xf0\xdc\x11\xcc\x06\x2c\xaa\xb0\x82\xf7\xb0\x9e\xf1\xc7\xbe\xa4\xca\x4a\xec\xab\x1f\x4a\x59\xb5\xde\xc4\x96\x94\xcd\x1f\x8e\x0f\x41\x14\x55\x36\x54\x29\x74\xb9\x00\xe8\x80\x65\xd4\x37\x6f\x18\xbc\xb3\xc1\xd6\x70\x4d\xd4\x71\x31\xf2\x86\x2e\x08\xcd\x94\x74\xb4\xe4\x62\xa5\x15\x6a\x4d\x5c\xf3\xf3\x44\xea\xf9\x92\x6d\x6b\x16\xd4\xf2\x7d\xc3\x20\x72\x59\xc3\xd0\x71\xb1\x74\xbb\xa6\x97\x4c\x91\xa2\x64\x09\x4b\x99\x48\xd6\x3d\xed\xeb\x0e\xf8\x01\xeb\x9c\x48\x61\x16\x66\x2f\xcc\x73\xec\x23\xbd\x96\xa4\x21\xab\x40\xcc\xd8\x5a\x7f\x14\x22\xc7\xb0\x2c\x2b\xc5\x4a\x0c\x73\x97\x15\xc3\x99\xfc\xb1\x9a\xb0\xcc\x50\xde\x98\xa4\xb6\x53\x3c\xba\x33\x78\x4e\x67\x8c\x50\xed\x39\x4d\x4b\xc2\x84\x32\x12\x13\x1d\xa0\x9a\xa4\x92\xd5\xd5\xf7\x54\x91\x77\xc7\x87\xe4\x39\xd9\x33\xcf\x1a\x00\xff\x40\x23\x79\x2d\x31\xc9\xad\x69\xa3\x4e\xdd\x10\xf0\x4a\xc0\xbc\x44\x96\x28\x24\x86\x44\x48\xa2\xaa\x64\x1e\x76\xaf\x77\x66\xb3\x4d\x84\x84\xd0\xca\x66\xf2\xfa\x7a\x25\xd4\x3b\xc5\xca\xde\x04\xd4\xbb\x16\x02\x2a\x54\xa3\x0c\xcf\xc5\xd4\x43\xc6\xca\x99\xa6\x29\xd5\xd4\x0a\x2e\x77\xc1\xc6\x4e\xe9\xef\x5b\x7c\x29\xf6\x9a\x8b\xea\x03\x26\x1e\xf5\xe7\x6a\x39\x3f\x82\x61\x49\xe2\xa8\x0e\xb3\x4e\x8b\x22\xe3\x88\xb6\xd1\x48\x84\x3b\x8e\x78\x65\x78\x83\x9a\x08\x72\x82\x66\x99\x34\xf2\xd1\x28\x27\x54\xa4\x32\x5f\x7a\x98\x51\x22\x59\x84\x97\x3a\x26\x5b\xee\x8b\x8f\x0d\x71\x0a\x65\xec\x8a\x75\xc0\x16\x6b\xe2\xc3\x9a\xd1\x0c\x71\x1c\x47\xc0\xf0\x24\xa3\x13\x96\x21\x8d\x91\x03\xd5\x32\x07\xae\x3b\x1b\xb5\x94\x59\x7f\xe5\x33\x67\x32\x63\x98\xde\xe5\x08\x61\x86\x7f\x14\x74\x80\x41\xfa\xa2\x03\x58\x83\x11\x1d\xc0\xae\x7d\x0c\x74\xa8\x3a\x6c\xf5\xa4\x49\x07\xa3\x37\xc4\x74\x80\xcd\x7b\xd3\xe9\xa0\x58\x92\xc8\xbc\x38\x2d\xa5\x31\x3b\x7b\xdb\x9b\xec\xb0\x75\xcc\x10\x1d\x1b\x2b\x92\xb1\x60\x2f\x88\x2f\xa6\x65\x90\xd8\x49\x35\x6e\x12\x2e\xbb\xf3\xff\x17\xec\x59\x20\x7a\x9a\x1b\x99\x1b\x25\x0a\x2f\x9a\x3b\xed\x0f\x8f\x79\x3b\xe8\xa3\x36\xa2\x83\xb3\xb3\x97\xdd\x48\x26\x34\x03\xec\xd8\x6e\x2c\x47\x9a\x6c\xd7\x1c\x38\x48\xe7\x85\x18\x25\x9c\x73\x09\x24\x00\x23\x0a\x67\xac\x0b\x53\xc8\x94\x05\xb1\x6c\xcc\x43\xbe\xc0\xb4\x4f\xb8\xce\x65\x12\x1b\xbd\xc2\x85\x95\xd3\xe8\x6e\x2d\x2d\x02\xda\x1b\x8f\x48\x6b\x5e\x90\x89\x94\x8b\x19\xf8\xd5\x86\xa4\x64\x19\xe6\x20\x5b\x21\x70\x89\x16\xe4\x2e\x2c\x09\x37\xa8\x5b\x0f\xee\xd1\xa0\x8b\x71\x29\xec\xc8\xe0\x29\x72\x1a\xd6\x14\xc5\x2d\x57\x64\xe7\xb5\x23\x40\x07\x08\xcf\x4d\xdc\x61\x76\xf0\x0b\xfd\x6c\xa2\xa7\xf3\x92\x8b\xd4\xa6\xeb\x46\xc4\xf2\x60\xeb\xa8\x07\x43\x22\x38\x4f\x43\xd9\xf2\x92\xbc\x17\xc4\x13\x8b\x8c\x5a\xb3\xc7\x19\xaa\xcc\xce\x47\x37\xba\xdd\xf1\xea\x1f\xd2\x1c\xe6\x9d\x80\xb9\x37\xcf\x1d\x19\xcb\x7d\xf9\x3a\xf7\x2d\x6b\x85\xee\xb1\xd2\xaf\x6f\x2b\xe6\x67\x1c\xd6\xa9\xf4\x89\x61\x6b\xcd\xc5\x4c\x85\x96\x0c\xcd\xb2\xc8\x19\xbe\xca\x94\x71\x33\xec\xa1\xf5\x97\x4d\x88\x46\x99\xc1\x63\x31\x43\x32\xa3\x4e\x3c\x72\x23\x64\x96\x2b\x7a\x50\x1a\x4a\x68\x4e\xb3\xf3\xa2\x3d\x44\x29\x59\x82\xc3\x7b\x73\xbe\x1f\x0f\x0d\x9b\x35\x74\x7e\x30\x73\x65\x7e\x27\x34\xcd\xb9\x52\xe0\x08\x63\x93\xb9\x94\x97\x64\x6f\x05\x1e\x57\x90\xa7\xa5\xf8\x4c\x3d\xb3\x3c\x3f\x32\x6f\x3f\x20\x5c\x64\x3e\x2b\x0a\xec\x60\xa1\x95\x73\xe4\xc0\x43\x12\xff\x16\x30\x87\x16\xb7\xda\x26\x2b\x2c\xbf\x26\x22\x55\x1b\x2e\x58\xbb\xc0\x5e\x9e\x9e\x93\x8e\xb0\x2b\x9f\x98\xa2\x13\xcb\xdb\x4d\x64\xb5\x95\x74\x44\xed\x71\xed\x44\xb2\xca\x45\xc2\x54\x7f\x80\x4e\x7f\xaf\xc7\x24\x29\xc3\x2a\x1e\x06\xd9\x4f\xf4\xc6\x24\x3b\xf0\x4b\xef\x42\x31\xa8\xbd\x75\x37\xd4\xa8\x2f\x6a\xe1\x62\xec\x91\xac\x98\xd3\x11\x1a\xe9\x46\xa2\x81\x08\x74\x2a\xc4\x5c\x0a\x69\x8b\x24\xcc\x26\x2a\x05\xb0\x34\x88\x28\x8c\xe6\xc1\x9c\x58\x11\x1d\xbc\xea\x41\x1d\x25\x0e\x03\x81\x50\x4c\x86\xf8\x11\xf5\x3b\x5c\x73\x3d\x77\x9d\x5e\xa2\xa8\x21\xbc\x49\xc9\x14\x04\x60\x04\x61\x65\x29\x4b\x9b\x90\xe5\xfc\xd6\x30\x12\x48\x72\xc8\xe8\x32\x4c\x42\xcd\x5f\xbb\x2a\x0c\x54\xd7\x50\xf0\x90\xaf\x68\xb8\x89\x4d\xa7\x2c\x01\x45\x2b\x24\x30\x4a\xed\xbd\x1a\xf8\xd6\x56\x19\x18\x06\xb3\x50\xf2\x39\xff\x60\x9e\x12\xde\x15\x86\xc4\x2d\xe0\xec\xea\x9f\x07\x63\x42\x8e\x85\xcf\xe0\x1d\x9a\x59\x0c\xaf\x74\xa9\x67\xda\x7c\x62\xd8\x87\x00\x3e\x20\x74\x9c\x19\xed\xb0\xac\x7a\xe0\xf8\x2e\xee\x70\x12\xba\xc4\x7b\x15\x07\xe0\x1a\xb7\x83\x9a\xa9\x77\x3a\x40\x17\x57\xb9\xb9\xe4\xa1\xdc\xe5\x8f\x23\x00\x42\xba\xca\x39\x8b\xa6\xd0\x13\x38\xfc\x79\x30\x5a\xa0\xbd\xfb\x80\xdb\xa9\x4c\x11\x4d\xc5\xa3\x41\x40\x4f\x27\x40\x77\xe1\xff\x71\xfa\x59\xad\xe3\x09\x89\xd5\x01\x21\xcc\x8a\x85\xd4\x4e\x89\x51\xb5\x33\xe7\x5b\xc8\x8b\x8c\x41\x15\x67\x30\x72\x5d\xa0\x1a\xa0\xc9\x0f\xfd\x8b\xd4\x80\xf4\x16\xdc\x65\x48\xfe\x0d\x8b\xd2\x27\xa2\x3a\xdc\x89\x53\x7f\x3b\x5a\x88\x5c\xb9\xd6\x12\x50\x61\xa9\xa5\x73\x5d\x90\x94\x4f\xa7\xcc\x25\xbc\x1a\xcb\x91\x96\x34\x37\x22\x5e\x11\x4b\x82\x09\x9b\x71\x4c\x88\xf4\x82\x6d\xd7\xa8\x7b\xb6\xd6\x6f\x88\xc2\x90\x6b\x92\xf3\xd9\x1c\x19\x85\x50\xa8\xd0\x25\x2e\xa8\x98\x49\x9a\x12\xe0\x6d\x59\x92\x6b\x5a\xe6\x66\xdf\xa0\xc9\x1c\x22\x94\x54\x90\xb4\x2a\x01\x65\x59\x33\x9a\x2e\x46\x4a\x53\x6d\x34\x65\x56\x5a\x83\xd2\xbd\xff\x16\x52\xff\xd6\x63\x0b\xa9\x7f\xc7\x63\x0b\xa9\xbf\x85\xd4\x5f\x3e\x36\x26\x3b\x74\x0b\xa9\xff\xb4\x60\x92\xb6\x90\xfa\xeb\x8e\x26\x6c\x21\xf5\xb7\x90\xfa\xb7\x1d\x5b\x48\xfd\x4f\x1c\x5b\x48\xfd\x16\xc7\x13\x90\x5c\x5b\x48\xfd\x16\xc7\x16\x52\x7f\xf5\xb1\x85\xd4\x5f\x3e\xb6\x90\xfa\x37\x1e\x5b\x48\xfd\xd6\xc7\x16\x52\x7f\x0b\xa9\xbf\x45\x1a\xbd\xdf\x58\x9b\x89\x34\x4a\xb6\x90\xfa\xf6\xd8\x42\xea\x3f\x09\x3c\x45\xb2\x85\xd4\xbf\xd3\xb1\x85\xd4\xdf\x42\xea\xb7\x39\xb6\x90\xfa\x4f\xc5\x5d\xb2\x85\xd4\xdf\x42\xea\xff\x7e\x14\xdd\x2d\xa4\xfe\x16\x52\x7f\x0b\xa9\xbf\x85\xd4\xbf\xf5\x2d\xb6\x90\xfa\x4f\xc1\x04\x54\x3a\xe5\xad\x10\x40\xef\x02\x56\x64\x93\xd0\x03\x6c\x80\x49\x35\x9d\xb2\x12\x24\x17\x3c\x79\x29\x79\xaa\xc6\x65\x6c\x06\x59\x99\x1e\x02\xee\x91\xad\xd7\xb9\xe1\x76\x0b\x46\x00\x48\x9d\x75\xa6\xf8\xd1\xdb\x57\x2b\x90\x91\x5a\x67\x15\xb6\xcd\x91\x86\x77\x7e\x2b\xda\xc5\xc7\x6f\x20\xf8\xaa\xfa\x31\x4b\xf7\x24\x93\xca\x66\xb8\x03\xb1\x92\x39\x15\x82\x39\x7b\x8f\x6b\xf0\xa3\x4c\x18\x13\x44\x16\xcc\x46\xa7\x29\x51\x5c\xcc\x32\x46\xa8\xd6\x34\x99\x8f\xcd\x93\x84\x23\x76\x9d\x8d\x6e\xcf\x28\x5d\x32\x9a\xbb\xbc\xfc\x9c\x72\x1c\x8a\xd0\xa4\x94\x4a\x91\xbc\xca\x34\x2f\xfc\x60\x44\x31\x28\xa8\xc1\x8d\xca\x13\x03\xb2\xe2\xea\x14\xf6\x61\xfd\x34\xfb\x5a\x32\x84\xa6\x03\x6b\x73\x08\x78\xe0\x79\xa1\x17\x3e\x8f\x97\x91\x29\x2f\x95\x26\x49\xc6\x61\xb7\x86\x27\x62\xed\x34\x8c\x37\x74\x7b\xb5\xb0\x6f\xaa\xec\xab\x8a\x14\xd4\xd6\x42\x2b\xcc\x8a\xad\x07\xb4\x43\xa5\x5c\x59\x35\x5f\x0d\x09\x75\xb8\x69\x48\x68\xf7\xa6\x40\x6a\xb7\xb3\xe0\xe8\xf6\x54\x30\x5c\x80\x17\x5b\xa7\x0d\xd7\x8c\x0e\x25\x0e\x8e\x39\x87\x51\x35\x47\xad\x50\x40\x96\xde\xd2\x32\x80\x09\x10\xec\xca\xf0\x00\x4b\x98\xd9\x5f\xe9\x0d\x5c\xff\xd9\x99\x3e\xd8\x14\xdf\x30\xa5\xe8\x8c\x9d\xb6\x0c\x34\xdc\x64\x91\x41\xac\xa1\x9e\x18\x60\x85\x0c\xab\x6b\xfd\x99\x3a\x3b\x33\x56\x83\x48\x8e\xef\xe4\x95\x9f\xeb\x92\x6b\xcd\x60\x52\x01\x61\x0f\x62\x95\xcd\x02\xfc\xdd\x46\x8e\xe7\x1b\x37\x48\x7d\xb3\x11\xea\x22\xc5\x8c\xcb\x09\x23\x93\x92\xb3\x29\x99\x72\x48\xe3\x84\xc4\xca\x21\x02\x2e\x51\xf4\x02\x28\x65\xec\x5d\x29\x9c\x2e\xeb\xde\x6b\x4c\x7e\xb6\x2f\xa6\xcb\x4a\x24\x34\xc0\xb2\x85\x0a\x53\x3e\x25\x33\x48\xcc\xb4\xda\xe2\x9f\x9e\xff\xf5\x2f\x64\xb2\x30\x5b\x1a\x68\x56\x5a\x6a\x9a\xf9\x8f\xcc\x98\x98\x19\x5a\xe1\xf2\x8c\x6b\x24\x3d\x05\xa0\x9b\x07\xbe\xf8\x8b\xaf\x2e\x27\xf1\x1e\xfb\x2c\x65\x57\xcf\x02\xfa\x8d\x32\x39\x5b\xd5\x1f\xa5\x7d\xca\x76\x4b\x93\x68\x05\x9b\xc9\x8c\x27\x8b\xce\x8c\xe6\x90\xbf\xc8\x5c\x5e\xa3\xae\xbf\x82\x7b\xea\x72\xab\x42\x16\x55\x86\x4e\xe7\x57\xbe\xba\xb8\x52\x6c\xb9\x06\x70\xe5\xba\x00\x37\xa9\x1d\xa2\x89\x9b\x8e\xf9\xb8\xee\x91\xd2\xd6\x96\x58\x47\x9e\x07\x00\x03\x43\xe8\x15\xcd\xb2\x09\x4d\x2e\x2f\xe4\x6b\x39\x53\x6f\xc5\x51\x59\xca\x32\x7e\x97\x8c\x1a\x69\x39\xaf\xc4\x25\x76\x70\xf0\x10\x09\x72\x66\x54\xab\xa2\xd2\xae\x90\x61\xd5\x07\x63\xbd\xbc\x13\xc2\xce\x0c\xaa\x47\x61\x1f\x78\x6d\xeb\xd8\x52\x2d\xe4\xc8\x70\x7c\x15\x32\xdb\x57\xcf\xff\xf4\x0d\xb2\x2e\x91\x25\xf9\xe6\x39\xe4\x6c\xab\x21\x2e\x62\x90\x6d\x66\xa3\xc8\x69\x96\x19\xb3\x21\x64\x4a\x43\xe8\x55\x4c\xf8\xd9\x79\x50\x77\x67\xb7\x3b\xab\x52\x17\x17\xff\x00\x3d\x8a\x6b\xc5\xb2\xe9\x10\xab\x92\xbc\x59\xb3\x0b\x1b\xc3\xae\x95\x3e\x50\x1a\xb6\x01\x0a\xd0\x95\xcc\xaa\x9c\x1d\xb2\x2b\xde\x47\x13\xa7\x68\x34\x67\xea\x67\x5c\x41\x01\xd8\x24\x93\xc9\x25\x49\xed\x8f\x41\xe6\x49\x13\x09\xbc\x3d\x15\xda\xe6\xe0\x74\xc8\xbd\xb9\xf1\xfb\xa3\xac\x9b\x9c\x16\x85\xaf\x11\x2a\xe9\x75\x44\x0c\x58\x93\x00\x57\xd0\x11\x4f\xa6\xb3\x9b\xb9\xab\x93\x79\x64\xbf\xc8\xc8\xcd\xd6\x43\xb4\xce\x3a\xe9\xee\xa3\xae\xdf\xbe\xbd\x63\x32\x62\x88\x7a\x40\xb7\x1a\x0a\xf8\x37\x56\x95\x2c\x55\x45\xfa\xc2\x3a\xcf\x18\xa8\x00\x18\xf6\x01\x91\xdc\xde\xe1\xda\x83\x77\xb3\x5b\xca\x51\x44\x17\xe1\xbd\xca\x39\xd5\x56\x21\x74\xee\x6b\x4a\x0a\x56\x2a\xae\xcc\xbe\xfc\x13\x2c\xa8\x83\x8c\xf2\x3c\x70\x01\xae\x87\x08\xb8\xb8\x01\x3e\xb9\xbb\xa4\x3c\x95\xa9\x1d\x10\x44\x21\x42\x47\xaf\x50\x6b\x63\xad\xb6\xc7\x0d\x75\xdd\xa2\xf2\xa7\x9a\x9a\xb1\xa4\x34\x67\xbc\xa8\xc4\xab\x9e\x92\x80\x84\xef\x7b\xac\xf2\xd1\xbf\x7c\x4f\x62\x00\x04\xa3\x9d\xdc\x58\x12\x46\xc6\x23\x2e\x94\x40\xa5\xb7\x76\xe0\x98\x60\x14\xdc\xac\x09\x7b\x2b\xd9\x7d\xb9\xbb\x56\x21\x89\x24\x2a\x65\x41\x67\x9d\x7a\xf9\x34\x28\xd5\x1c\x36\x04\x9a\x30\x66\x10\xfc\xee\x61\xd7\xe0\x2a\x96\xd6\x38\x3a\x80\x92\x84\xd1\x51\x47\x60\x6b\x20\x60\x3d\xf6\x35\x5d\x10\x5a\xca\x4a\xa4\xd6\xbf\xe4\x1d\x7c\x6f\x1a\x0f\x3e\x91\x82\x39\xc7\x79\x13\xa7\x02\x3c\xfa\x5c\x90\x17\xe3\x17\xcf\x9f\xca\x4e\x05\x5f\xd8\xd8\xa9\x4e\xfc\x4e\x85\xf2\x69\xad\xdf\xea\x10\xef\x7b\xfa\xde\x37\xd6\xc5\x52\x03\xda\x73\x07\x97\x0d\xa7\xae\x4b\xae\x59\xd0\xe3\x6f\x0f\x0c\x17\x63\x1f\x06\xa8\x0c\x83\x55\x9d\x24\x3a\x12\xa9\x1b\x0c\x86\xaa\x26\x0f\x28\xb7\xac\x80\x82\xe5\xb6\xca\xc3\xa5\x6e\x11\x61\x21\xa1\x76\x76\xc8\x1e\x5e\xb9\x8b\x05\xcd\x83\xb5\xb2\x96\x25\xda\xd1\x87\xa2\x03\xc6\x66\xa3\x76\xbe\xa0\xe0\x83\x2b\x7a\xa4\xe0\xf7\x6c\x4e\xaf\x18\x14\x72\xf3\x8c\x96\x19\xc4\x1c\xcf\xf1\xdd\xc9\xa4\xd2\x84\x89\x2b\x5e\x4a\x91\x33\xa1\xc9\x15\x2d\x39\xa0\xe2\x94\x0c\x90\x1d\x8c\x2d\xfa\xc7\xbd\x9f\xf6\xcf\x20\xa1\x61\x60\x21\x29\xec\x5b\x56\xca\xc1\xd7\x84\x6f\x12\x0c\xf7\xc9\xe9\x73\xef\x61\x68\x08\x32\xd7\xbd\x97\x79\x4e\x5e\xe9\x0a\xdb\xb2\x7c\x48\xb2\x4a\xf1\xab\x75\x49\x12\x5b\x61\x7f\xc8\x5b\xcd\x73\xa3\xda\xbf\x26\xd4\x52\xe1\x3e\xb8\xd6\x57\x14\xe8\x2d\x05\x4c\x76\x95\x2f\xda\x0b\x63\xe0\xd6\xf5\x64\xb1\x34\x30\x7d\xce\x21\x2e\x2e\xa9\x10\x80\x1b\xb3\x5e\x27\x94\x90\x29\xbb\x3f\xea\x4e\x9c\xde\x63\x87\xc0\x98\x79\x50\xc1\xa7\x92\x39\x4b\x2b\x80\x77\xe2\x0a\xc1\x51\x8d\xf9\x40\x6b\x14\x3e\x01\x5d\x82\x8e\xa7\x1e\xd2\x40\x8c\xc0\x39\x88\x34\x77\xf7\x97\x0e\x00\xc1\x9d\x50\x8d\x11\xc1\x28\x35\x63\x0d\x09\x55\xaa\xca\x71\x49\x60\x03\x84\x29\xd7\xca\xf7\x98\x75\xda\xb1\x59\x18\xf7\x2c\xa8\xea\x40\xdf\x73\x96\x01\x73\x75\xa0\xf1\xee\x49\x30\x0e\x12\x5a\xb9\xbf\x2c\xc3\xd9\x84\x09\x88\xb6\xf9\x3c\x4e\x09\x5e\xd2\x29\x87\x26\x4a\xd4\xd2\xfb\x7c\xc5\x9d\xa8\x3a\xe0\x15\x00\x0f\x43\x27\x2c\x53\xcd\x81\x26\xf5\xa4\x58\x54\x52\x4b\xf8\x8e\x5d\x72\xa9\x52\x7c\x26\xa0\x7f\xa6\x19\xed\x9e\x9d\x32\x5b\xdb\x4c\x7d\x74\xc1\x6d\x2d\xd5\xa2\x2c\xac\x9c\x16\x23\x6b\xf5\x6a\x99\xf3\xe4\x1e\x23\xc9\x7b\xbe\x72\xa3\x56\x3a\xaa\xc1\x7d\x7b\xbe\xe4\xf1\x51\x81\x57\x63\x4c\xce\x65\x6e\x53\x9c\x44\xd0\xc5\xcb\x35\x53\x35\x3b\x46\xc9\x0c\x2d\x20\xf1\x88\xd7\xd1\x78\xe8\x7a\xe3\xaa\xa0\xe1\x39\x5e\x25\xb7\x61\x5c\x80\x9f\xb4\xcd\x5c\x65\x96\xc9\x6b\x48\x2c\xc6\x71\x1d\x6f\x43\x0a\xcc\x4b\x32\x6a\x74\xa6\x1d\xc7\xa0\xa1\xb7\x3f\xc7\x5e\x3b\xfc\xf4\x53\x30\x3f\x07\xe0\xf8\x8e\x0f\xc3\x3f\x8f\x4f\x0f\xdc\x9f\xcd\x37\x89\x9b\x30\xdc\x7c\x55\x08\x87\x7d\xd3\x55\x53\xec\x63\xf4\x89\x9f\x0f\xe6\x54\xb8\xb8\xd5\x8d\xcf\x5b\xa8\x44\x67\xf5\xeb\xcc\x69\xc9\x2c\x5c\x9c\x11\xdc\xaa\xa0\xc9\x8d\x6f\xe1\xb1\xd9\x6e\xbd\xe0\xd6\x37\x55\x55\xe1\xfa\x6b\x67\x70\xa1\x7f\x93\x9a\xcb\x7e\xf9\xe2\xd7\x3b\x12\xf3\x53\xf7\xac\x22\xed\xed\xf7\x44\x5d\xfa\xee\x74\xc7\xea\x1e\x5e\x77\xbb\x37\x68\x83\x77\xa7\xeb\x6f\x6a\xc1\x7b\xd7\xa7\xb9\xd6\x6d\x77\xfb\xb0\xe6\x6c\xdf\xe1\x72\x9c\xfb\x4f\x67\xcd\x99\x05\x79\x0c\x88\x9b\xd3\xc5\xa9\x4c\xcd\xda\xc4\x14\xb9\xfb\x01\x1b\xb4\x96\xf6\x6d\x3d\x63\x2d\xfc\x59\xed\xfd\x58\xed\xfc\x02\x0d\x5d\xe1\x06\xd4\x53\x8b\xc8\x26\x66\x24\xc2\x99\xaa\xca\x92\x09\xe8\x90\x5f\x41\x52\xa4\xeb\x7c\x8f\xf2\x1c\xe4\xb2\xc5\xf4\x44\x60\x7a\xb2\xef\xb7\x4d\x9b\x2c\x97\x53\xc0\xf9\x0c\x70\xad\xa7\x15\xe4\x3e\xc2\x2e\x81\xb8\x75\x52\x98\xf7\x78\xb9\x0a\x4c\x43\x16\x4c\x04\x6d\xf1\xad\x82\x3d\x32\xfc\x17\xc1\x6b\xa0\xce\x30\xce\xd3\x3f\x14\x19\xd5\x53\x59\xe6\x23\xa7\x49\x8e\x22\x7d\x82\x1c\x40\x16\x8e\x72\xa6\x18\xa6\xc2\x22\xfe\xa6\x48\x33\x16\x6c\xfc\xfe\x53\x45\x8a\x68\x55\xa4\x12\x25\x4b\xe4\x4c\xf0\xff\xd4\x84\x80\x2d\xd0\xfb\x91\xa8\x32\x9b\x2e\x11\x55\x96\xdd\x3f\x65\xa1\xa5\xbe\x20\xaf\x58\x39\x67\xf4\x9e\xcc\xdb\xc8\x7e\xb1\x63\xd4\x6d\x4a\x95\x85\x1f\xb0\xda\xb1\x7b\x88\xd1\xa2\x65\x02\x65\x70\x18\x8d\x77\x39\xce\x14\xf6\x7e\xa3\x14\x52\x32\xe3\x57\x4c\x38\x74\xf2\x83\x8c\xfa\x56\xdb\x0e\x90\xd5\x22\xa4\x57\x5a\xfa\xfc\x06\x42\x75\x80\x91\x0c\xe9\x50\x36\xb4\x1a\x8e\x13\x5c\x62\x1b\x75\x67\xae\x29\xda\x5d\xae\x84\x14\x03\xec\x12\x39\xac\x3f\x29\x77\x6e\xd8\x08\x84\x93\x24\x90\x08\xe3\xac\x16\x9b\x00\xf3\xe9\x47\xd8\xec\x35\x23\x83\x56\x0d\x63\x35\x6b\x8f\x16\x5b\x13\x36\x33\x5b\xc7\x02\xf5\xa1\xe3\x69\xfc\x24\x1e\xe1\xf3\x43\x99\x14\x68\xea\xb5\xe9\x78\x2a\x53\xa3\xb0\x0d\x89\x9f\xca\xb0\x4f\xb9\x0d\xcd\xe0\x9a\x0c\x16\x23\xea\x73\x65\xc9\x54\x21\xb1\x4d\x40\xf8\xd8\x61\xe0\x2a\xe3\x3a\xca\xcb\xc3\x86\x6f\x7e\x69\x20\x90\xdb\x7f\x58\x29\x57\xaa\xfb\x33\xae\xc7\x97\xdf\x80\xae\xcf\xc4\x9c\x8a\x04\xcd\xac\x67\x97\xac\x50\xcf\x14\x9f\xa1\x6a\xff\x97\x6f\xbe\x01\x3d\xdf\x91\xe4\xd9\xd9\xd1\xfe\xe1\x9b\xa3\x71\x9e\x3e\x22\xa5\xbf\xa0\x5a\xb3\x52\xbc\x24\xff\xb3\xf7\xfe\xcb\x8f\xa3\xc1\x77\x7b\x7b\xbf\x3c\x1f\xfd\xf5\xd7\x2f\xf7\xde\x8f\xe1\x1f\x5f\x0c\xbe\x1b\x7c\x74\x7f\x7c\x39\x18\xec\xed\xfd\xf2\xe3\x9b\x1f\x2e\x4e\x8f\x7e\xe5\x83\x8f\xbf\x88\x2a\xbf\xc4\xbf\x3e\xee\xfd\xc2\x8e\x7e\xbd\xe3\x20\x83\xc1\x77\x7f\xbc\xe7\x8b\xb6\x2c\x61\xe9\x5a\xb6\xd2\xa9\x54\xa5\xc7\xf2\x94\xa2\x64\x2c\x07\xf1\xd7\x26\xb1\x2b\x76\xa8\x36\x86\x72\x1b\xac\xfd\xcb\xc8\x44\xf7\x34\x31\x33\x62\x52\xa1\xe8\xcc\xe4\x35\x24\x63\x72\x69\x14\xa7\x31\x79\x0b\xfb\x20\x39\x61\x57\xac\x1c\xba\x51\x5f\x9b\x8b\x4e\xfd\x35\xa1\xc7\x6e\xd5\x15\x2d\xcb\x01\x5a\xce\x89\x7b\xf7\x0e\xc4\xc3\x16\x27\xf6\xe5\x41\x3e\x8d\xc9\x4f\xb4\xe4\xb2\x52\x56\x17\x09\x91\xc1\x31\xdb\xcc\xef\x24\xe0\xc0\xb0\xb1\x20\x3f\x88\x2f\x22\x73\xe1\x20\x4f\x9b\x7d\x2f\xaf\x0f\x56\x6f\x09\x5c\x9b\x99\xba\x72\x8f\x2a\x5d\x56\xec\x12\xa8\x38\x6e\x06\x2b\xe5\xbf\xdb\xd1\x54\xf8\xa2\x30\x8c\x7b\x0f\x90\xad\x46\x13\xc3\x51\xe6\x7c\xe6\x72\xaf\xe1\xfb\xd1\xd2\x0d\xce\x7a\x0e\x69\x31\xa5\x6d\x96\x69\xdb\x12\x80\xa2\xf9\x7d\x1d\xd8\x22\x86\x5e\x0e\xd1\x9b\x5d\xf1\x51\xbd\x6e\x76\x90\x4f\x60\x13\x19\x25\x25\xd7\x3c\xa1\xd9\x0e\x6c\x4e\xee\xa7\x24\xab\x8c\x9e\x18\xfe\x5a\x32\xa2\xaf\x25\x3e\x85\x66\xe4\x92\x2d\xae\x65\x99\xba\xfd\xd9\x3d\xb1\x9e\x0b\xa5\xdd\x23\x8d\x2d\x08\x0b\x18\x3d\x12\x65\xce\x4a\x32\x61\xce\xd9\xde\xb8\x78\x31\x26\xfb\x62\x61\x23\x95\x22\xac\x47\x0c\x40\xdc\x40\x47\x40\x2d\x2a\x62\x12\xbb\x89\xb9\xa7\x51\xac\x14\xbd\xc9\x11\x6d\x14\x30\xbf\x0a\xdc\xee\xef\x3c\xd1\xb2\xb4\x05\x51\xb0\x3a\x4a\x2c\xe7\x92\xee\xe7\xcf\x22\x2d\x8c\x7e\xc3\x05\x53\xea\x07\x33\x95\x5d\xd4\xd5\x98\x3b\x28\xa8\x25\x76\x6c\x28\xaa\xaa\xb3\x8f\x99\x59\x52\x18\x4e\x36\x62\x58\xa6\xf5\x95\x63\xb2\x0f\x27\x20\x7d\xde\x68\x5e\x50\x70\x67\x06\xe3\x5a\x35\xfb\xd0\xe3\x15\xfb\x27\x87\x2e\xcd\x19\x35\x05\x15\x23\xab\xa3\xca\x1c\xbf\x09\x68\x7a\x36\xd9\x96\xfd\x56\x51\x68\xa9\xbb\x73\x51\x56\x6c\xa7\x9d\xaa\x84\x98\xfd\xcf\xfe\xfc\xcd\x73\xd0\x96\xfc\xf3\x46\xf0\xbc\x36\xaa\xd2\xfd\xd3\x69\x5a\x25\xd2\x34\x73\x88\xce\x42\x7e\x70\x04\x77\x76\x87\x8d\x6f\x41\x19\x30\x4c\x93\xa7\x79\x2b\x2f\x6c\xab\xb4\x99\xf6\x09\x33\xa3\xfa\x75\x2f\xee\xdf\xee\xac\x4b\xae\x4b\xf4\xdc\x3e\x02\x62\xf5\x68\x38\x2b\x0a\xa7\xc4\x3f\x27\x70\x02\x63\x57\x0c\x7b\x1a\x32\x67\x41\x70\x41\x00\x01\xc4\xe3\xa2\xe8\x90\x25\xdc\x42\xde\x40\x51\x4c\x67\xfd\x6e\xf7\x0c\x07\x22\x45\xad\xd0\x2d\x15\x3b\xf8\x60\x30\xe8\x1d\x56\x95\xdb\x87\xca\xb1\x21\x79\x2b\x5e\x61\x2a\xfd\x10\xb5\xbb\x08\xa8\x04\x2f\xea\xb5\xa2\xf0\xd9\x1f\xec\xb7\x8f\xf0\x95\xdb\x08\x85\xfb\x93\x3b\xb0\x1c\x3b\xee\xfe\xbb\x67\x8d\xb1\x22\xd6\x8b\x2c\x63\xbb\x43\xf2\xba\x4d\x9a\x15\x9f\x64\x56\xca\xaa\x70\x41\xd7\xb8\xe7\x59\xdd\xe8\x03\x63\x85\xd8\x12\x58\xc8\x78\x68\xef\xfc\x00\x06\x66\xb5\xd7\x2c\x25\x09\x9a\xc7\x6e\xd7\xc5\x82\x29\xf4\x20\x94\x95\x88\x5b\xa2\x07\x61\xcb\x9d\x8c\xcd\x68\xb2\xd8\x89\x9f\xb3\x2a\x48\xcc\xa1\x8e\x87\xe7\x88\xad\x8e\xcf\xab\xcb\x1f\xa0\x4a\x02\xf4\x07\x5c\x6b\xa0\x1a\x54\xca\xbe\xa2\xdb\xf2\x5d\xfd\x1e\x7a\xb6\xca\x0e\x96\xf9\x9f\xbf\xf9\xf3\xc8\xf9\xde\xe0\x55\x3e\x0b\x43\xf9\x20\x6f\xaf\xba\x64\x34\x67\x46\x41\xe2\xaa\x80\xf9\x05\x4d\xac\xde\xce\xfd\xd3\x6f\x53\xb7\x56\x0f\xe2\x26\xa0\x1e\xe2\xb3\x90\x2b\xf6\xc0\x77\x59\x7e\xcd\x0e\x31\x73\x99\xa5\xb0\x50\x6c\x1f\x27\xf7\x28\x42\xb5\x2e\xf9\xa4\xd2\xd6\x4d\x9a\xc8\x3c\x8f\xcb\x2b\x6d\x2f\xbd\x31\xa9\xeb\xeb\x42\x13\x16\x38\x79\x4c\xc8\x39\x63\xd8\x47\x32\x78\x0f\x90\xb3\x8e\x94\xd6\xdb\x2a\xa7\xd8\xf4\x1b\x8d\xb0\xcf\xe4\x16\x6a\xbf\x1d\xdb\x40\x5c\x47\xaf\xfd\xce\xbe\xb7\x52\xc2\x78\x19\x0a\xb8\xa5\xd6\xbe\x8d\x9d\x09\x32\x8f\xeb\x00\xad\x4d\x44\x32\xb4\x50\x08\x27\x0b\xbc\xfc\x23\xb6\x01\x85\x2c\x4b\x88\x1a\xa2\x6f\xf2\xda\x0c\x31\xe7\x05\xda\xd4\x54\xfb\xdb\x21\xde\x6f\x7e\x0e\x51\x1a\xa0\xaf\xe5\x0b\x34\x6a\xe5\x35\x78\x85\x7f\x38\x3e\xf4\x6b\xc4\x5c\xf5\xea\x1c\x43\x42\x5f\x8d\x6d\x97\x5e\x3d\xe3\x29\x99\x60\x8e\x87\x91\x97\x7b\x82\x5d\x63\xd6\xb8\x75\x9c\x7a\xbd\xfa\xca\x65\x53\xe3\x68\xfe\xe1\x76\xc8\x01\xf9\xda\xf6\x4b\x65\xa5\xb3\xca\x27\xdc\x66\x95\xbe\x3d\xdb\x75\xee\xea\xeb\x51\x79\x3d\x1a\x8d\x46\x36\x14\x0c\x52\x7a\x18\xd1\xc0\x0b\xf3\x5c\xa6\x7c\xba\x68\x50\xc2\xb0\x79\xfd\x08\xe0\x48\x2a\x16\xf6\xed\xba\xb7\xf6\xbd\x3f\x92\x77\x37\x77\x5c\x17\xe4\x86\x15\x61\xe6\xae\xf1\xa9\x55\x91\x6b\xb4\x93\x55\x0d\x80\x2e\xa7\xc8\xa4\x90\x68\x7f\xc3\xc4\x38\x2f\x90\xe5\x1a\x0b\xeb\x87\x56\x3a\xfb\x50\x48\x04\x0d\x86\x42\x16\x68\xee\xd6\x0c\x4f\x40\xf2\xa8\x59\x55\x90\x8f\x17\xad\x1a\xab\x50\x60\x44\xcc\x11\x81\x4c\xa8\x19\xd2\xbf\xce\x5e\x83\x4f\x06\x63\x72\x6c\x59\x0b\x0c\x42\x21\x6d\x8b\x38\x22\x05\x61\xc5\x9c\xe5\xac\xa4\x59\xfc\x20\x5b\xd0\xfb\xd2\x88\xdb\xd2\x70\x29\x86\x00\x72\x5a\xa0\xb4\x05\xe1\x99\xf2\xd2\xb5\x98\x0d\x42\x73\x3b\x6f\xc5\x99\x94\xfa\x0d\x57\xa0\xbb\x58\x67\x08\x6a\x9a\x3b\xab\x36\x34\xf7\x5b\x9d\x1d\xdd\x95\x93\x3f\x5b\xfc\x8b\xb8\x36\x71\x7d\xc8\x5a\x23\x41\x8c\xd0\xba\x6f\x27\xb8\x77\x16\xef\x27\x6a\xb8\xeb\x7d\xb1\xab\xfa\xbc\x2d\x35\x79\xfb\xcc\x5d\xde\x6c\x02\x17\xd5\x11\xb0\xd6\xe7\xee\x4c\xbe\x3e\xe9\x05\x2c\x73\x22\x61\x9d\x74\x64\x9a\xe3\xe5\xe6\x72\x35\x8b\x80\xbb\xcf\x77\xcd\x14\x52\x8c\xa0\xd9\x53\xa5\x5c\xe0\xb2\x74\x2e\xdf\x68\x03\xb2\x1d\x28\x71\xdb\xc4\x2e\x82\xb4\x56\xe9\x8d\xea\x24\x54\x55\x32\x9f\xcc\x98\x4a\x56\x37\x7e\xa2\x8a\xbc\x3b\x3e\x24\xcf\xc9\x1e\x24\xf2\xfa\x62\x6e\x84\xaf\x30\xa6\x6c\x23\xdb\x74\xea\x86\x88\x4d\x17\x8b\x1d\x21\x24\xca\x22\xd7\x15\x53\x0a\xbf\x0d\x5b\x0c\xce\x1b\x7a\x19\xae\x9b\xc7\xdb\xf2\x63\xbb\x74\x7d\x9f\x21\xd3\x83\x0c\x7a\xd7\x42\x06\x85\x8a\x75\x1f\x9d\x28\xd7\x3d\x7b\xbf\x77\x09\x15\x27\xb9\xf5\xc0\x54\xe7\x47\x30\x20\xe2\x46\x7c\xd0\x56\x8d\xbf\x67\x9b\xf3\x65\x7c\x20\x0b\x92\xe4\xa1\x04\x4a\x2a\x52\x99\x2f\x3d\xcd\xcc\x26\x18\x6f\xc1\x6c\x6e\xd9\xee\xa6\xa3\x53\xb5\x67\xb7\x62\x49\xb0\xf1\x7b\xa8\x92\x7d\x0d\xbe\x02\xae\x3c\x27\xa0\xf3\x00\xf2\xc7\x97\xcc\xd6\xce\x20\x0a\x9d\x8b\x86\x4a\x99\xb5\xac\xbb\x8b\xbe\xfa\x4c\x66\xb6\xde\xc1\x7d\xb6\x19\x78\x63\xbf\x5a\xb7\x0c\x13\x34\xc5\xcb\xa2\x68\x7c\x35\xb8\x73\x36\xf5\xab\xab\x56\xbb\x34\x69\x7e\x35\xa4\xc3\x46\x5f\x0d\xfb\xee\x26\x7e\x75\x9c\xfd\xdc\xc3\x66\x62\x07\x24\xd2\xe6\x60\xdb\xa6\x03\x4d\x3c\x94\x3a\x43\x12\x9c\x50\x8f\x4b\x8e\x76\xa9\x98\xc7\x44\xa7\xcf\x2d\xba\x65\x42\xb3\x39\xb6\x7c\x6f\x37\xcf\xa4\x39\xd7\xcd\x21\x83\x64\x0c\x6a\xde\x16\xce\x05\x29\x85\x14\xc1\x9c\x64\x1d\x90\x69\x04\x5f\xac\x9b\xce\xde\xe9\xb2\x21\xcc\xfe\x5b\x67\x38\x86\x77\x6b\x69\xbb\xd0\x3a\xd0\x78\x0a\x2f\xc8\x30\x5f\xb1\xa0\x7a\x3e\x24\x25\xcb\x10\x07\xd6\xae\xb3\x4b\x34\xa5\x76\xa3\xb4\x49\xc7\xb1\xee\xd1\xa0\xb0\x40\x17\x6a\x18\x19\x5c\x3e\x4e\x0d\x99\xa2\xfc\xe2\x8a\xec\xbc\x76\x04\xd8\x79\xcc\x02\x7a\x07\xbf\xc7\xcf\x1d\x7a\xb1\x2e\xb9\x48\x2d\x40\x6a\x44\x1a\x9f\xa2\x8b\xba\xa1\xf3\x30\xb9\xb5\x4e\x4b\x06\xce\x5e\x4f\x1a\x32\x6a\xcd\x0c\x36\x14\xe6\x02\xa2\xa3\x1b\x94\x4c\xe7\x53\x71\x0f\x69\x0e\xf3\x4e\xc0\x4c\x0b\xa8\x9d\x10\x72\xc5\x75\xee\x5b\xda\x35\x4b\xec\x22\x7a\x97\x8a\x5c\x3a\x8a\xdf\x7d\x0f\x4b\x35\xc3\x9a\x99\x40\x85\xaf\xa1\x2b\xad\x5d\x68\x3b\x41\x37\x54\xef\x21\xcc\x8e\xcd\x77\x5d\xda\x9d\x30\xbd\x2a\xa7\xe5\x82\xfc\x70\x7c\x88\x1a\x78\x64\x08\x08\xe9\x1e\xed\x39\x25\xb5\xe8\x84\x54\x2c\x36\x40\x71\x6e\x87\x10\xd3\x1a\x1f\xa6\x2b\xf2\x6e\x27\x33\x11\x4b\xb8\x3a\xf2\xd4\xb9\x2d\x04\x9b\xcb\x2c\x25\xd4\x33\x98\x70\x45\x60\xa9\x7b\x0e\x06\xd0\x83\xea\xcf\xb1\x31\xbe\x6c\x70\xba\x12\x75\xa5\x88\xbb\x7e\xaf\xa9\x12\xb8\x35\x3d\xb0\xa5\xd0\xce\x33\x95\xd1\x4a\x24\xf3\xdf\x0b\xcb\xac\xa0\xbe\x0f\x75\x50\x72\xc9\x4a\xc1\x32\x52\xd0\x92\xe6\x4c\xfb\x66\x87\x8a\xb5\x81\xfe\xe9\x88\x1c\xd4\x0d\x37\xa8\x03\xe6\x4f\xfb\xa6\x85\x5d\xd1\x82\xba\x60\xb0\xac\xe8\xe4\x36\xc5\xdd\xd1\xbc\xd2\xc2\x36\xf8\x6c\x39\x78\x67\x60\x8c\x4e\x6d\x08\x63\x10\x2c\x44\xf0\xdf\x88\x6f\x8b\xcb\x7c\x7b\xb0\x6e\x7e\xc6\x01\x6b\x3c\x02\x97\xc9\x70\x5f\x77\x99\x53\x99\x96\x51\xc0\x76\xd5\x92\x2b\x2a\x6e\x99\xf0\x99\x7d\xe5\xad\xe5\x2e\xd4\x01\x3e\x2a\x0f\xd7\x2c\x57\xf4\xa0\x64\x50\x71\x4a\xb3\xf3\x82\xb5\x6c\xe2\x1f\xb7\xf0\x7f\x73\xbe\x1f\x0f\x0a\x9b\x12\x24\x5b\x9b\x39\x31\xbf\x07\x25\x03\xd7\x6c\x32\x97\xf2\x92\xec\xad\x28\x7b\x0c\xaa\x5c\x14\x9f\xa9\x67\x96\xbd\x47\xe6\xbd\x07\x84\x0b\x80\xb2\x5d\x86\x00\x76\x0f\x49\xfc\x5b\xc0\x5c\xd9\x9c\x35\xbb\x0d\x2f\xbf\x26\xc8\x28\xcc\xa8\x59\x87\x81\xb3\x3c\x19\xf7\xcf\xf7\x72\xc7\x27\x26\xe4\xa6\xf2\xd7\x95\x54\x43\x87\xc6\x5a\x48\x62\xcd\x6d\xa3\xbe\xf7\x40\x87\xbf\xd7\xa3\x85\xc8\x6b\x7c\x1a\x81\xc2\xd7\x86\x92\x0f\x56\xee\x42\x73\x2a\x7b\xeb\x6e\xa8\xd5\xc7\xd0\x69\x34\x2b\xe6\xd4\xa6\x86\x61\x39\xb0\xcb\xa0\x98\x30\x32\x97\x42\x96\xb6\xcc\xa1\x2e\xe4\x01\x31\x83\x75\x37\x30\x03\x56\xde\x06\xaf\x7a\x50\x7b\x90\x5c\xbf\x94\x69\x46\x67\xd0\xdc\xa6\x51\x8d\x03\xc2\x55\x56\x18\xd5\x0c\x2f\x76\x25\x8b\xae\x71\x03\xe0\x46\x2b\x94\x62\x2e\x98\x69\xcb\x36\x20\x0b\x64\xdf\xbc\xb7\x21\xcb\xa9\x4b\x66\x76\xaf\x00\x6e\x0a\x5f\xb4\xa9\x0c\xef\x60\xfe\x06\xbf\x62\x11\x81\x51\xf2\xee\x39\xd4\x1a\x8d\x49\x56\xb8\x5f\xc0\xfd\x94\xe4\xfc\x83\x79\x4a\x78\x57\x58\x6d\x20\x52\x88\x12\xaf\xfe\x79\x60\x8c\xb1\xda\x72\x1b\x9a\x59\x0c\xaf\x0c\x9a\x2a\x08\xf8\xe1\x04\xcb\x05\xf0\x03\xc2\x48\x8b\xed\x8f\xd0\x85\xbf\xdb\xa3\x9a\xf9\x50\x69\x4f\x4b\x1d\x42\xa6\x76\x38\x33\xd1\x6e\xfb\xee\x12\x42\x35\x97\xf4\x11\x46\x5d\xde\xa3\x3f\xfb\xd6\xfe\x39\x65\x98\x62\xe5\x15\x4f\xd8\x7e\x92\xc8\x4a\x74\xca\x42\x3d\x64\xe6\x13\xa8\x66\xe9\x79\x34\x26\x7a\xdc\x53\xf8\x15\x2b\xd1\x69\xc6\x29\x22\x12\xc5\x57\x62\x91\x5d\x3d\x0e\x78\xec\x1b\x6f\x68\x59\x46\x69\x46\xdb\x65\x94\x76\xa4\x50\xd7\x54\xf9\xe5\x2f\x5e\xb5\xc3\x35\x28\x68\x9d\xf5\x4b\x69\xf0\x77\xab\x41\xd0\x54\x5d\xd6\x38\x4d\x0c\xca\x90\xfc\x62\x0a\xce\xdb\x0f\x1d\x51\x7c\x6a\x2b\xec\xa6\x16\xd4\xd5\x46\xee\x99\x8f\xdf\x57\xaf\xfe\xfb\xf0\xa4\x5b\xe6\xb8\x6f\x51\x83\xf5\x2d\x73\x3b\xb4\x57\xd5\xc3\xb2\xfc\xb0\x3c\xd1\x3c\x79\x48\x4a\x6a\xd1\xf7\x6d\xe7\xb5\x8c\x51\xf4\xa9\x90\xbd\x20\x53\x7f\x30\x36\x32\xbd\x8e\x96\xa3\xa8\xb7\x8d\xd2\x72\x46\x85\x0a\x4a\x50\x19\x0c\xed\xb2\x62\xfd\xfb\xe0\x46\x68\x67\xdb\x7a\x0f\xf6\x9c\xd3\x35\xbe\x42\xe9\xb2\x4a\x34\xa9\xb4\x32\xe7\xf1\xe1\x4e\x60\xde\xe1\xf1\x25\x9b\x71\xa5\xcb\x85\x6b\xe1\x36\x0d\x5e\xc2\x7a\x85\xfc\x25\x97\x6c\x41\xfe\xfe\xe3\xd1\x3f\xfe\xf9\xfa\xed\xc1\xfe\xeb\x7f\xbe\xd9\x3f\xf8\xfb\xf1\xc9\xd1\xfb\xf7\xe7\xff\x38\xbf\x38\x7a\xf3\xfe\xfd\x01\x22\x8c\xd8\x72\xdc\x73\xa6\xdf\xbf\xb7\x9c\xaa\xde\xbf\xbf\x48\x0a\x5e\xbc\x7f\x7f\xea\x7c\x20\xd8\x9c\xe1\xbf\x0f\x4f\x40\x7e\x62\x55\x98\x4f\x7b\x82\xbd\x15\x89\x0e\xef\x3d\xa7\xaa\x4e\xb2\x8c\xea\x6d\x5a\x00\x7a\xb6\xdd\xee\x56\xc2\x29\x75\x5a\xec\x66\xc0\xba\xab\x92\x73\xf1\x7a\x2f\x1d\x99\x30\x7d\xcd\x6c\x19\xe3\x4a\xbc\x2e\x1a\x14\x46\x07\x10\x5c\xab\x3a\xb7\xa0\x72\x26\xc9\x15\x67\xd7\x88\x39\x81\x4d\xf2\xea\xf6\x41\x50\xd6\x8c\xa5\xad\xcb\xa8\x60\xa0\x24\x15\x32\xf5\xad\x92\x1a\x7e\xe9\x25\x9f\x74\x54\x46\x83\xb8\x6f\x2c\x25\xa7\xc7\x87\xe4\xc5\x18\x95\x9c\xe3\x43\x84\xa1\x5c\x89\x52\xe5\x2c\x55\xb3\xa1\xe2\xee\xbb\xa2\xea\xa0\x66\x80\x36\xc2\xa8\x05\x07\x54\x93\x54\xe6\xf4\xbe\x4d\xd1\x3e\x51\xbf\x82\x2d\x2b\x7f\xab\x68\x86\x3a\xc0\xa9\x4c\x97\x25\xd3\xce\xb7\xee\xd4\xdf\xc6\xdf\xfa\xf7\xf8\xdb\xf8\x5b\x68\x86\xe9\xc8\xf6\xb7\xb1\xba\x4a\xc6\xdf\xda\x02\x69\x62\x2f\x5a\x99\x23\xbc\x54\xed\x64\xf5\x59\xbc\x07\x9e\x4d\x41\xdf\xfd\x2c\xe5\x2e\x3d\x76\x15\xed\xb9\x97\x28\x6a\x81\x50\x7b\x9d\x94\x8c\x62\xaa\x39\x49\x59\xc6\x6a\x1c\x98\x0d\x68\x66\x79\x73\x77\x4f\x17\x6b\x8b\x7a\x9f\x86\xbe\x29\xaf\x2f\xfd\xee\x5b\xa4\x86\x06\xc3\xd7\x75\xc7\xf9\x16\x0b\xa0\x23\x52\xc3\xbd\xc2\x46\x5a\x66\x0c\xe7\xa7\xcb\x4a\x59\x59\x57\xb7\xab\xc2\xd1\xdb\x10\x62\x1d\xd5\xe8\x17\x0e\xc8\xd4\x70\xc4\x85\x7f\x7f\xb0\x34\xb0\xf5\x1f\x06\x57\xf1\x17\xa8\x76\x5b\x10\xb3\x6b\x69\xf4\x64\x84\x15\xa2\xba\x84\x26\x85\xdf\x5e\xb2\xc5\x10\x01\x3d\x50\x09\xf9\x5b\x80\xc8\xec\x4b\xa2\x11\x78\x4d\x96\xe4\x5b\xf7\xaf\xbf\xdd\xd7\x5a\xeb\xe0\x47\xed\xe2\x45\xc5\x8f\xea\x1c\xf9\x3a\xc2\x2a\x98\x18\xe1\x03\x29\x6b\x0b\x64\xb4\x44\x72\x8d\xc9\x11\xd4\xbd\xa2\x46\x6a\x51\x69\xb3\x2c\xba\x58\xb9\x0e\x93\x11\x3a\x04\xf8\x5f\x82\xea\x98\x13\x79\x6e\x2b\x33\x01\x66\x67\xca\xca\xfa\x0c\x08\x98\x13\x79\xf4\x81\x25\x95\xfe\x9c\xd5\xea\x78\x5c\xb2\xee\x3d\xbf\x7e\x64\x1e\x82\x08\x69\x63\xb4\x70\x5f\x99\x50\xaf\xce\x20\x39\xed\x76\xda\x5e\xb2\x85\xf2\x20\x6b\x97\x38\xba\xad\x6a\xf6\xfc\xeb\x36\xb2\xa3\x0f\x5c\x69\xf5\xbf\x5c\xc3\xb1\x7c\x52\xb7\x7a\xa3\x98\x25\x56\x8f\x1e\x00\xec\x99\x3f\xe1\x31\x9f\x9b\xe0\xee\x03\x3a\x53\xfd\xad\xa3\x44\x00\xa1\x47\xcd\x37\xed\x2a\x9b\x9e\x24\x05\x14\xaa\x85\x58\x6c\x75\x62\x0d\xde\x8c\xfc\x89\x34\x04\xba\x1c\x19\x25\x2f\xde\x66\xec\x29\x7b\x11\x07\x54\x11\x7e\x45\x33\x26\x2c\x8a\x6d\x96\x26\xb4\xc4\x10\xbd\x05\x14\x52\x16\x08\xdb\x22\x69\x98\x3d\xce\x4a\xb2\x7a\x96\x95\x0d\xe5\xd1\x52\xf3\xa4\xca\x68\x49\xcc\x7a\x9c\xc9\xf2\x9e\xb8\x43\x78\x74\x6b\x7c\xe7\x59\xb4\x43\x3f\xe8\x58\xbe\x37\x47\x6c\x02\x1d\x5a\xed\xc5\x98\x4c\x50\x5f\x13\x2f\x94\xbd\x18\x48\x5b\x4e\x9d\x6c\xf2\x82\x22\x84\xca\xd3\x91\x73\x9c\xcf\xc0\xff\x3d\x08\x36\x0f\xbf\x32\xc7\xe4\x7b\x5f\x2d\x3e\x24\xb5\xcf\x18\x6a\x52\xed\x33\xed\xb2\xb1\xd3\x55\x2f\xea\xa9\x2c\xa1\x8b\xe1\x5e\x2a\xe1\x1e\x76\xc5\x13\x3d\x18\x93\xff\xd7\x68\x8a\xe0\x44\x76\xea\xa4\x5d\x66\xbe\x0e\xb7\x06\xec\x7b\x4e\xf6\xe0\xb6\x50\x95\x1c\xb8\x40\x91\x45\x02\x7d\x64\xd9\x30\x1d\x22\xdc\x2b\xa2\xdb\x91\x18\x45\x4d\xb1\xc1\x1a\x7e\xe7\x97\x5e\x42\x7a\x99\xc8\x95\x5d\xa5\x91\xe7\xd6\xc7\x59\x9c\x08\xf5\x8c\xf3\x6f\xf0\xd1\x93\x92\xcd\x60\xfd\xe1\xea\xf9\x8c\xab\x4f\xcb\x42\x66\x72\xb6\x38\x2f\x4a\x46\xd3\x03\x29\x94\x2e\x41\x34\x74\xc1\x77\xbb\x69\xcc\xa0\x71\xd6\x5c\x5e\x13\x6a\xcb\xd9\xe5\x14\x11\xf2\x64\x35\x9b\x63\xab\x00\xb8\xd1\x35\x99\x75\xaf\x68\x8d\x4e\x35\x26\xe7\xbe\x15\x00\x30\xb8\xef\x2c\x00\xa3\x80\xc3\xe3\x9a\x2e\xec\x62\xa2\x13\x9e\x32\x15\xe4\x28\xbb\x97\xc1\xd0\xcf\x8d\xdf\x0f\x52\x79\xff\xe4\xf0\xbe\xfd\x17\xd6\xa8\xd0\xde\xf0\x29\x5e\x33\x42\xaa\xd7\xf4\xf5\x1a\x29\xd0\x8d\xe6\xd2\x6a\xaa\x88\xe5\xea\x28\xf3\x19\x75\xd3\x2e\xe0\x4b\x39\xfd\x70\x7e\xc9\xae\x5b\xdc\xe9\x3e\xf4\x47\x76\xff\x54\xb0\x11\xd8\xa3\xef\x84\xa2\x9a\xab\x29\x34\x6a\xf9\x8c\xfa\x38\x14\x1d\xb4\xeb\x27\x81\x47\x5c\xbb\x13\x8e\xe6\x8a\xc2\x3d\xde\x62\xc4\x2c\x36\xff\xaf\xb6\x83\x70\x03\xc4\x22\x08\xdf\x8a\xc2\xac\xa0\xc4\xb6\x67\xd2\xb2\x8e\x43\x63\xa4\xa2\xca\x27\xac\xf4\x6b\x1f\x9d\x01\xbc\x6c\x40\xd3\x36\xd6\x7e\x7b\xc1\xd8\x3a\x13\xae\x6b\x5a\x19\x90\xe7\xe8\x83\xd1\x3c\x54\xbb\x44\x25\x3c\xe2\xee\x6a\x8d\x41\x31\x3c\xe6\x12\x38\x1b\xd3\x10\x75\x39\x01\xb3\x37\x3c\xd3\x56\xce\xd5\x47\xb7\xfe\x8c\xa4\x5b\x8f\x46\xb2\x22\x51\xfa\xc6\xcf\x6f\xb4\x4a\x09\x0b\xfe\xac\x53\x48\x0d\x51\x81\x47\x07\x36\x15\xf5\xc6\x6e\xdb\xe6\x67\x5e\x9b\x33\x46\x91\xb9\x08\xef\xeb\xda\x08\xa9\x43\x8f\x47\xd2\x43\x9f\x47\x02\xb2\xec\xb2\x85\x04\x0c\xef\x77\xc4\x6a\x3d\x48\xf7\x8e\x8f\xa4\xbd\x41\x5d\x1f\x11\x43\x5d\xd6\xa6\x35\x72\x56\x64\x5a\xd7\xc2\xae\x36\xac\x3b\x3d\xbb\x87\x36\x68\xa4\xa3\x8d\x5b\x1f\x11\x21\xe4\x3d\xac\x5d\x0a\x01\x26\x39\x75\xab\x63\xa5\xcd\x7b\x2c\x86\xe4\x44\x6a\xf3\x9f\xc0\xfc\x3d\x94\x4c\x9d\x48\x0d\x67\x36\x82\x94\xf8\x09\x3d\x12\xd2\xb5\x11\x00\xbc\x37\x90\x9b\x36\x44\x6b\x76\x3c\x47\xb0\x15\x86\xc5\xb1\x20\xb2\x74\x14\xf3\xd6\x85\xb2\x43\x84\x61\x05\x8b\xb1\x75\xa3\x71\x62\xc6\x09\xe9\x7c\xcb\x70\x76\x28\xc8\xfe\xc2\x5f\x00\x3c\xb5\xc8\xa0\x40\x20\xad\x4a\xc4\xb0\x35\xba\xa6\x66\x33\x9e\x90\x9c\x95\x33\x68\x1b\x9d\xcc\xfb\x98\xbe\x2e\xfb\x0a\x1e\x1d\x77\x97\xf0\x65\x3a\xf0\x12\x6c\xd9\xa0\x62\xf5\xa8\x02\xe0\x78\xb8\xad\xe5\x14\x2c\xa9\xff\xe3\x7d\xd0\xff\x97\x14\x94\x97\x80\x79\x6b\x63\xc7\xe1\x6f\x36\xfa\x12\x0e\x63\x46\x58\xf2\x2d\x51\x41\x18\x56\x32\x99\xd1\x9b\x8a\xc7\x90\x5c\xcf\xa5\xc2\xcd\xd0\xbb\x3f\x76\x2e\xd9\x62\x67\xb8\xc4\x7a\x3b\xc7\x62\xa7\x0e\x0c\x47\xcc\xe6\x37\x61\xc8\x20\xdc\x81\xdf\x76\x1e\x4e\x57\xe9\xb4\xd9\xf6\xd1\x31\xa0\xf9\x42\x2d\xf9\xca\xda\x3c\x9d\x35\xff\xdd\x37\x38\x50\x60\x9f\x63\x4c\x70\x56\x32\x2c\xc6\x04\x53\x1a\x14\x75\xdb\xdd\xa5\x12\xec\x8a\x99\xc9\x4a\xb9\xb2\x78\x80\x2e\xc5\xe0\x5f\x4b\x26\xd1\xff\xff\x50\x9e\x48\xed\xac\xf6\x7f\x39\xb7\x17\xf2\xdf\x07\x9e\x57\x39\xe2\x66\x69\x63\x29\xa4\x7c\xea\x80\x80\x5d\x66\x43\x6c\x2f\xc4\x66\xab\xe5\x63\x4d\xcb\x19\x64\x38\x5a\x7b\xc1\xb1\xd9\x2c\x93\x13\x9a\x91\x9c\x0b\xf3\x18\x1b\xbc\x8c\xce\xf9\x37\xb1\x7f\xde\xf2\x20\x58\x0b\x7c\xc6\x27\x19\xb3\x06\x49\x03\x63\x3b\xb8\xb9\x71\x21\x2c\xd2\x8c\x29\x85\xf1\xc6\x37\x5c\x1c\x3a\x6f\xc6\x2b\x59\x12\xf6\x81\xe6\x45\xc6\xb0\x44\x8f\x7c\x3d\xfa\x8f\x14\x8c\xd8\x00\xfd\x90\xb8\xe9\xa9\xfb\x96\xbd\xc0\x85\x54\x37\x16\xf0\xd9\x17\x91\x4d\xe8\x3d\x29\x8a\x7c\xf5\xec\xab\x67\x2f\x5e\x9a\x3d\x04\xdd\xf4\x54\x59\x08\xa2\x65\x6a\xbc\x18\x93\x8f\xc4\xbc\xc1\x0b\xfb\xdf\xaf\xec\x7f\xbf\x26\x1f\xc9\x47\x42\x4e\xc9\x29\x09\xff\x6b\xfe\x43\x3e\x92\x91\x21\x42\xf0\xaa\x2f\xcc\xd7\x24\x32\xb7\x14\x04\x1f\xb4\x2f\xb8\xf5\x7d\x03\xb5\xb4\x43\x43\xb5\x53\x22\x73\x06\xaf\xfa\xd5\xff\x72\xd7\x40\xa8\x58\x63\x6b\x47\x78\xa9\x3d\x78\xa5\x01\xb9\x06\xa7\x5a\x4e\x2f\xd1\xa0\xdc\x4f\x74\x45\x33\xf3\xf0\xbd\xaf\x47\x2f\x06\x44\x8a\xf8\xf2\x2b\x2e\x8d\xf2\xee\xde\x70\xef\xc5\x60\xbc\xf4\xca\x5f\xad\x78\xe5\x46\x97\x43\x5b\xee\x68\x06\xbd\x99\xdf\x1d\xab\xef\x8b\xc5\x35\x5d\x78\x86\x77\x06\xf5\x8c\x5f\x79\xb4\xff\x00\x84\x04\xa2\x8d\xc0\xbf\xdc\xe1\x4a\xe1\xa0\x0b\xc2\xf5\x98\x1c\xeb\xdd\x5d\xd7\x53\xd3\xe8\xfa\xae\x2d\xc1\x61\x88\x97\x09\x84\x07\xde\x78\xde\xc8\x46\x6e\x81\xce\xd6\xab\x5b\xf7\x5e\x7d\x05\xf0\xc8\xfd\x2a\xe9\x2c\xe2\x76\xea\x15\x17\x55\xb3\x2f\xaf\xfa\xe6\xc2\xf5\x89\x53\xb7\xae\xee\x06\xea\xb5\x13\x43\x97\x6c\xd1\x58\xf9\xf5\x37\x0d\x21\x87\xc7\x79\xed\x08\xba\xed\xd0\x55\xaf\xc8\xfb\x9d\x78\x5d\xbe\xdf\x01\xe7\xbd\xdf\x3f\x6d\x1f\x1f\x9a\x25\x95\x6d\x00\x27\xa7\xc4\xb1\x71\x80\xd0\xb5\x2f\xd2\x3a\x65\xa2\xe5\xfb\x03\x84\x3d\xe8\x8c\x33\x88\x23\x94\xcb\x5f\x12\xa4\x55\x44\x59\x78\x66\x15\xd6\xeb\x78\x4c\xf6\x91\x81\x15\x04\x3f\xee\xf2\x5e\x37\xd2\xae\x6e\x07\x7b\x2d\xc5\x6e\x0d\xbc\x4b\x72\x89\x10\x69\xc2\x6d\x8f\xd6\x57\x25\x89\x06\x55\xc5\x4f\xeb\xf1\x74\x45\x1e\x4c\xed\x20\x46\xf0\x49\xc3\x24\x50\x37\x11\xf2\x4f\x80\xea\xff\x62\x05\x12\xa3\x5d\x2e\x2a\x26\xd7\x73\xcb\x48\xf5\x33\xa5\xc6\xe7\xfe\xdc\x94\x1f\x5e\xf9\x8e\xf6\x4d\x68\x99\xd9\x66\xb3\xf8\x6a\xd8\x78\x7b\x7b\xfe\xcf\x6d\xf6\x90\xaf\x5e\xde\x6f\x73\xb0\xff\xbd\x88\xa6\x79\xe5\xec\xfe\x79\xaf\x7e\xcb\x01\x04\x30\x57\x2c\x02\x28\x76\xa8\x83\x59\x63\xbf\xa1\x29\xae\x2b\x8a\xf5\x11\x82\x5d\xdb\xa4\xb5\x9b\x3f\x2a\xa8\x71\x73\xc2\x7d\x68\xf6\x1f\x5a\x29\x06\x45\x2b\x15\xd4\x33\x1b\x42\xba\x20\xda\xd7\x7b\x5f\x93\x11\x79\x3e\x30\xdc\x20\x90\xad\x80\x98\xe1\x56\x66\xb6\x06\x9b\x83\xa9\xe7\x46\x79\x32\x94\x51\x43\xdf\x4a\xab\xb1\x09\xc1\x94\xfa\x5e\x89\x02\xab\x6a\x56\x75\x4b\x84\xb2\x19\xb3\x32\x6b\x12\x1d\x8b\x53\x99\xc6\x3e\x7f\x5f\x08\x33\xa3\x9a\xb5\x02\x3d\x58\xaf\xbc\x0f\x3c\xf1\x3d\x84\x7f\xfd\x58\x4e\xc3\x33\x46\x8a\x9c\x22\x24\x05\x76\x34\x1e\x43\xbb\x6a\xbb\xd7\xda\xd4\x46\x74\xf2\x58\xde\xe1\xca\xfb\xf9\x38\x54\x8a\x25\x41\x93\xc0\x12\xc5\x05\x4f\x59\xc9\x5c\x43\xe4\x30\x11\xd6\x47\x50\xc8\xcf\xf5\x95\x98\x00\x0b\x99\x42\x38\xd0\xdf\xb0\xf0\x6a\x67\x52\x25\x97\x4c\x3b\x0b\xa9\x84\xdc\xbd\xa2\xd2\x64\x42\x33\x2a\x8c\xad\xbd\xe4\x31\xd7\x12\x07\xc3\x3b\xe1\x29\x58\x4d\xee\x13\x34\x71\xe8\x20\xbe\xcf\x85\xd2\x66\x34\x0c\xfc\xd7\x2f\xb8\x9f\x29\x39\x24\xd7\xf5\x00\xcb\x9a\x2e\x0c\x65\xff\x8d\x46\x9f\x00\xda\x39\xff\xbf\xc3\xfa\xb0\x2b\x6c\x4c\xd8\x78\x06\x42\xb6\x31\x13\x3b\x71\x75\x81\x4b\x58\xdd\x19\xe2\xc7\x98\x09\xb1\xd5\x1e\x56\xc3\xb6\x38\xd4\xc1\xcb\x8a\x14\x8a\xa0\x9a\x03\xfb\x2b\xe2\x27\x98\x25\xe8\x46\x07\x51\x79\xfb\xe8\xc7\x7a\x95\x96\xf5\xb9\xf3\x21\x96\x74\xca\xee\x46\xde\xf2\x36\x53\x2b\x42\x36\x30\x98\x32\x9a\xb9\xd4\x49\xe8\x93\xe3\x41\x42\xc5\xee\x6e\xad\x8d\x02\x87\xa3\xc4\xa9\xf7\x4b\xa3\x4d\x47\xfb\x15\xd9\x73\xb5\x0e\x44\xb3\x2c\xc3\x35\x58\x6f\xdb\x46\xfc\x86\x6d\xe1\x39\x8c\x10\x6b\xce\x2b\x6f\x8c\x7b\xc9\x63\x12\x1f\x18\x67\x0b\x0f\xef\x33\x24\x93\x4a\x1b\x35\xdb\x88\xcc\x3b\x29\xda\x68\x4c\xcc\x59\x56\x90\x92\xa5\x55\x62\x8b\xfe\x40\x46\xef\x87\x5a\x01\xb6\x65\x74\x8b\x7e\x27\x22\xe8\x0e\xf6\x09\x11\xb1\x11\xc1\xa7\xb0\xa4\xc1\xf4\xe1\x53\xc2\xae\x58\xb9\x20\x85\x54\x0a\x56\x17\x2c\x1a\xcc\x7c\x07\x27\x8b\x47\x22\x84\x1d\x0c\xde\xca\x6d\x1a\x3b\x76\xd7\xd8\x01\xad\x4a\x46\x12\xe6\xf3\x18\x91\x5f\x3f\x7b\x61\x8c\xc8\xdb\x14\x80\x53\xf8\x5f\x6d\x15\xba\xff\x1e\x4f\x57\xe8\x39\xf5\xbb\x44\x9c\x73\x1f\xc3\xf1\x2b\xb0\xef\xbe\x1e\x04\xf6\xe3\xd7\xc6\xd4\xdd\x33\xef\xfa\xd5\xc0\xbc\x75\x60\x19\x7e\x15\x58\x86\xfe\x4e\xfb\x46\x4c\x45\xb6\xe1\xb1\xb0\x65\x0e\xd0\x23\xcc\x6a\x87\x36\x65\xde\xbc\x91\xd2\x56\x2f\xe0\xb9\x13\xd1\xc8\x76\xb1\x66\xba\xab\xd1\x44\xe5\x9a\x7c\x61\x54\xd3\x2f\x82\xeb\x6f\xb4\xe9\xda\x9b\x6a\x5d\x5b\xcf\x67\x5c\x69\xe8\x3f\x6f\x34\xff\xfb\xf7\x46\x6e\x1f\x4b\xef\x1a\x49\x5f\xfe\x0a\x24\x48\x4e\x8b\x7b\x8c\x83\x60\xec\x9d\x1a\x95\xbd\xb6\x51\x58\x3b\x94\x8d\x32\xa2\x23\x21\xb7\xd1\xf0\xc9\x22\x2c\x9e\x99\xb0\x4c\x22\xb4\xbd\xcd\x13\xbc\x47\x5d\x9e\xef\x0d\xa4\xb4\x2c\xe9\x8c\x3d\xb3\x8f\x7d\x2c\x3d\xc1\x7e\x42\xf4\xfb\x28\xa4\x84\xd8\x05\x16\x17\xdf\xd5\x2f\xb9\x64\x03\x90\x02\x34\x81\xd4\x7f\x20\x64\x04\x3e\x15\x14\x15\x3c\x92\xbc\x95\x16\x48\x39\x5d\xa2\xa4\xf4\x5a\x1d\x65\x54\x69\x9e\x7c\x9f\xc9\xe4\xf2\x5c\xcb\xb2\x07\xd5\x62\xd5\xa8\xd1\x9c\x0a\xb2\xff\xf3\x39\x39\xe4\xea\xb2\x6e\xb1\x84\x30\xe6\x71\xb6\x3d\xf5\x30\x7e\xb6\xf0\x92\xe4\x34\x99\xa3\x46\x6a\xfd\x1e\xae\x95\x43\x7f\x6b\xe5\x0f\xf4\x5a\x31\x7c\xfd\x89\x79\x7d\xf3\x33\x6b\x2f\x82\xd7\x06\xba\x84\x9f\x73\x7c\xb8\x86\x2c\x97\xa9\x6a\xdb\x7b\x8e\xac\x68\x08\xe2\x90\x65\xb1\x80\x30\x63\xb6\x29\x2c\xc0\x19\xc6\x4d\x3e\x80\x87\x16\xb2\x22\xd7\x14\xc3\x55\x20\x61\xc7\xe4\x82\x17\x2f\xc9\x51\x00\x97\xbf\x6a\x28\xa3\x7d\x78\xe8\x32\x9b\x20\x08\x3c\xb7\xdc\x1a\xff\x08\x55\x2b\xf5\x92\xec\xb0\x0f\xfa\x4f\x3b\x43\xb2\xf3\x61\xaa\xcc\x7f\x84\x9e\x42\x7b\x0d\xdb\xb6\xcb\xe8\x78\x62\xca\xca\xda\x22\xc4\x1b\x96\x51\x03\xfa\x67\x59\x72\xf1\xf6\xf0\xed\x4b\xd0\xe5\x53\x69\x8c\x39\xdb\xd8\xd6\x61\x60\x58\xd9\x18\x90\x01\x8a\x39\x13\x99\x17\xa5\xcc\x79\x50\xa9\x02\x4b\xae\xcd\x0a\x20\x7d\x84\x4a\xc1\x5e\x05\x66\xe8\x85\x9f\xfc\x70\x8e\xa5\x82\x13\xe2\x2e\xcc\x74\x3c\x25\x12\x83\x53\x71\xad\x1c\x57\xfe\x22\xc3\x3e\x76\x14\x6c\xd7\x5a\x33\x8c\xd1\xcc\xed\x4f\xcf\x52\x76\xf5\x4c\xa5\xf4\xc5\x10\x1e\x83\xdc\xb0\x68\xbc\x13\x55\x64\xe7\xc5\xce\x98\x9c\xf3\x9c\x67\xb4\xcc\x6c\x1f\x39\x3b\x44\x7d\x9d\x31\x14\xdc\x80\x60\xfe\x3e\xdf\x21\x7b\x58\xac\x06\xea\x46\xc6\x1c\x74\x89\x87\xea\x82\x58\xfe\xa0\x95\x76\x49\x7a\x70\x0e\x91\xce\x0e\x22\x62\x5b\xca\xbe\x15\x59\xeb\x14\x9f\x98\x39\xdc\x68\x2e\xd3\xbb\xac\x6c\x35\xed\x54\x96\xd6\x08\xf4\x97\xb8\x8a\x78\x2e\xac\xda\xf2\xc6\x4c\xfd\xfd\xdb\x38\x3e\xd4\xf6\x43\x7a\x40\x69\x21\x7e\x17\xe9\x87\xbe\x6e\x34\x08\x7f\x09\xfe\x5b\xc5\xc8\xf1\xa1\xef\xd7\xcd\x4a\xc5\x95\x36\x22\x2a\x8d\x54\x03\x8e\xfa\xc2\xde\x7e\x4e\xff\x23\x05\x39\xfa\xfe\xdc\xbe\xd6\x60\x03\x89\xdd\x52\xd2\xd1\xff\x54\x25\x33\x1a\x51\x67\xf5\xcb\x8f\xd4\x54\xb9\xcc\x79\x72\x48\x35\x45\xcd\x0b\x25\x95\xac\x51\x24\x40\xa9\x9a\x40\x76\xaf\x83\x08\x69\xa9\x3c\x93\xf5\x6b\x3f\x86\x83\x4e\xda\xc3\x4e\x9a\xdb\xdf\x9d\x1d\xaf\x41\x77\x4a\x60\xbb\x9d\xbd\x91\x69\x4f\x0a\x54\x30\xa0\xdb\xf2\x00\xd5\xeb\x00\xcf\x93\xdc\x3c\x89\x9c\x48\xc1\x86\xe4\x8c\xd1\x94\x18\xe9\x66\xff\xf9\x73\xc9\xf5\x7d\x81\x12\xea\xa3\xf3\xd6\xef\x26\xb1\x17\x42\xb8\xc1\x1c\x11\x4e\x02\x70\x1c\x40\x72\x02\xa1\x63\x75\x80\x49\x26\x27\xc4\x0a\x8b\x75\x7e\xfd\xbb\xb3\xe3\xde\x3e\xfe\xdd\xd9\xb1\xfb\x76\xf3\x4f\x39\xdd\xcc\xcf\xee\xd1\x78\xa8\x6d\x87\x57\x0d\x65\xbf\x56\xe7\x6a\x4c\xf9\xa6\x41\x70\x77\x6b\x60\xdc\x97\x1d\xb0\x2e\x9a\x5f\x72\xd1\x3a\x59\x3c\x96\x36\x80\x27\xef\xb1\x13\x82\xd8\x18\x40\xb6\xa4\x2f\x49\x5e\x65\x1a\xca\xe3\x81\xd7\x0c\xf3\x41\x86\x82\xe3\x3a\x62\xa1\xa2\x08\x39\x64\x18\x8e\x48\x5f\xba\x84\x45\x7f\xc7\xea\x1b\xde\x50\x41\x67\xe6\x72\xd8\x01\x49\x8e\x7f\x06\x4c\xbe\x87\x4e\x77\xe1\x7f\xa2\x57\x94\x67\x74\xc2\x33\xae\x41\x9f\x1b\x8c\x9d\x36\xaf\x10\x2b\xc3\xbc\xf2\xda\xa4\x5f\xaf\xaa\xad\x57\x5b\xc3\x42\x62\xc0\xc1\x21\x7b\xe6\xb7\x67\xd7\x46\xd4\x0f\xc6\x20\xf7\xe1\x42\x80\x2d\x6d\x28\xbf\x67\x9f\x52\x7e\xd7\xa2\xa7\xc2\x7c\xbf\x6a\xd9\xec\x62\x59\x77\x32\x23\xad\xd4\x9d\xe0\x07\x8b\x4e\xf5\xc4\xd5\x27\x6c\x38\xda\x41\x81\x82\xb5\xd3\xf2\xfe\xae\x2a\xd4\xc3\x2c\x9c\xf4\xe9\x2d\x1c\x82\x6d\x81\xec\x4c\xf7\x42\xae\x7a\x38\xa7\x6b\x78\x14\x42\xfc\xa9\x51\x67\x85\x2b\xeb\xdc\xca\x72\x87\x4e\x08\xf7\x9b\xf5\xd4\xa6\x0a\x13\x8f\xce\xe2\xd7\x73\x70\x3f\x74\x71\xa3\x39\xb2\xe0\x26\x05\xa7\x49\xeb\x75\xd6\xf1\x33\x13\x56\xcc\xa7\xdd\xb3\x29\xcd\x30\xaf\xce\xe3\xa8\xcd\x01\x2b\xe6\xe4\xd5\xf9\x0a\x31\x89\x99\xac\xe6\xbb\x15\xc6\x72\x76\x15\xc9\xf8\x94\x69\xde\x8a\x08\x6b\x16\x94\xb9\x14\x5c\xcb\x52\xad\xa3\x96\xd4\x3e\xba\x1f\xc5\xcd\x8d\x66\xf8\xf3\xcc\x11\x85\xbc\x09\xce\x52\x92\xc8\x2c\x63\x89\xcb\x2f\x85\x29\xf6\xb7\xad\x70\xc4\xd8\x0c\x04\x35\xbe\xfc\x06\x5c\x31\xd6\xe9\xf2\x0c\xd9\xee\xd9\xd9\xd1\xfe\xe1\x9b\xa3\x71\x9e\xfe\x61\x2e\xaf\x47\x5a\x8e\x2a\xc5\x46\x5c\x77\xd3\xb7\xd6\x58\x78\xda\x83\xa7\x5b\xcf\xfb\x72\x72\xeb\xb9\x99\xb2\x1a\xfd\xf0\x9d\xaa\xf1\x49\x5d\xdc\xb9\x94\x52\x2f\x23\x94\x4e\xab\x2c\xc3\xb9\xd5\x25\x63\xc3\xd0\xbf\x7d\x4f\xfc\xd6\xfa\xd8\x2c\x5d\xb8\x76\xf3\x46\x24\x7a\x58\xcd\x78\x53\x16\x48\x77\x5d\xa1\xad\xa6\x4d\x96\xe6\xa1\x1e\x2f\x9e\x89\xf3\xe8\x3c\x06\x44\xf4\xdc\xcc\xcb\x25\x5b\x10\xa8\x31\x9c\xca\x12\xf0\xbe\x63\xfe\x64\x3a\x01\xe2\x3d\x83\xe6\xda\x56\xe1\xd8\x10\xc2\x77\x51\x45\xe0\x43\xce\xd8\xb4\x4f\xb2\x9f\xb1\xe9\x2a\xaa\xdb\xd3\x00\x8a\xe6\xd3\xe3\x8c\xbe\x52\xe9\x39\xa6\xbc\x22\x18\x23\xd2\x76\xe5\x34\xd8\x22\xd1\x0d\xa1\x7b\xa7\xf2\xbe\x3e\x4a\xd0\xbb\xb4\x12\x22\x4b\x93\x17\xba\x2d\xed\x24\xe9\x7b\x87\x41\xe4\x95\xb1\x62\xd9\xf5\xb3\x6b\x59\x5e\x72\x31\x1b\x5d\x73\x3d\x1f\x21\xa5\xd4\x33\x80\x86\x7d\xf6\x07\xf8\x8f\x8d\x22\xef\xa7\xa9\xcd\x7f\xab\x14\x9b\x56\x19\x66\xa6\xa9\x31\xa1\x05\xff\x89\x95\x0a\xb2\x2c\x2f\xb9\x48\x87\xa4\xe2\xe9\x77\x6d\x67\x8c\xf4\xb1\x5a\xda\xb7\x76\x6d\xd2\xba\xb2\xdd\x5d\x65\xb8\x8d\x96\x4e\x26\x95\x34\x95\x0a\x1b\x04\x18\x52\x45\x4b\x80\xa6\x39\x17\x9b\xb2\x02\xda\x5a\x07\x5c\xa4\xed\x28\xd9\x08\x40\xc0\x38\xb1\x79\x60\xcf\xd9\x30\xb6\xcf\xf9\xa1\xce\x7b\x82\x1d\x40\x6d\xf6\x4f\x9c\xfb\x73\x27\xc1\x92\x2f\xd4\x6f\xd9\x08\x9f\x32\x2a\xd2\x9a\xae\xdb\x44\x9e\xfb\x1c\x9f\x2f\x91\xa7\x5f\x87\xfc\x67\x48\xcf\x79\x50\x8e\x23\x1b\xac\x33\x3f\xac\x1f\x6c\x8d\xa4\xee\xae\x19\x3f\x8c\x86\x56\xef\x3e\xd0\xbc\x46\x39\x44\x15\x50\xc0\x50\x2a\x39\x7f\x1a\xf6\x43\xf6\xdd\x12\x5c\x85\x71\x22\x85\xb0\x40\xba\x6f\x0b\x26\xce\x35\x4d\x2e\x3b\x46\x75\xb7\x5a\xd5\xef\x4c\xab\x7a\xa0\x44\x20\xc7\xa2\x58\x4f\x67\xd3\xdf\xea\x64\x6f\x5c\xe4\x8f\x50\x00\x63\x57\x98\x37\xb4\xe8\xee\x5d\x75\x23\x35\x34\x28\x7f\xda\x3a\x54\xa1\x38\xa8\x90\x45\x95\x21\x4c\x2c\x57\x96\x8e\x9f\x5f\xe3\xe9\xba\xbe\xed\x16\xd3\x5f\x0e\x4c\x30\x60\x2c\x51\x73\x73\x66\xc2\x75\x2d\x2b\x15\xd3\x08\x3f\x62\xb1\xf4\xa4\x20\x89\x2d\x31\x06\x7d\xc4\xe8\x1e\x76\xb8\x40\x57\x11\x44\x26\xda\x15\x83\x7a\xa4\x92\xe7\xcf\x9f\x3f\x47\xf4\x85\xff\xfa\xaf\xff\x22\xb2\x84\xa6\x55\x09\xcf\x97\x2f\x84\xab\xfe\xfc\xe2\xc5\x98\xfc\x63\xff\xcd\x6b\xa8\x68\x28\xb4\xc2\x56\x26\x38\xb2\xb9\x20\xba\x59\x0d\xc9\xff\x3e\x7f\x7b\x52\x57\x05\xc7\xbf\x82\x69\xee\x3f\x2f\x06\x90\x7e\xfe\x97\x3f\xfd\x69\x4c\x0e\x79\x09\x15\x5d\x9c\xf9\xe6\xa4\xde\xd5\x42\x4b\x86\x68\x11\x50\xb7\xef\x34\x2e\xee\xfb\x00\x59\x08\x28\x6c\xdf\x8c\x85\xae\x86\x21\x33\x9e\x68\x2c\x1e\x43\xb1\xe6\x7a\x9f\x22\xf6\xb4\x45\x73\xb7\xda\x1f\xbc\xdc\x90\x64\xfc\x92\x91\xa9\x82\xb6\xe8\x35\x1e\x90\xed\xd8\x67\x0b\x65\x70\xb0\x7a\xae\x14\xd3\x8f\x3c\x6d\xb5\x93\xab\x39\xe2\x6d\x18\xa9\xa1\xb0\xda\xf2\xd6\x4b\xb6\x18\x21\x9f\x15\x94\xfb\x62\x18\xc8\x00\x8c\x9a\x45\x79\x5f\x4f\x4a\x0e\xbc\x54\x71\x75\xee\x45\x29\xff\x8d\x2c\x00\x25\xc6\x81\x78\x86\x12\x60\x98\x49\x5b\x00\x1c\x44\xb7\x5c\x99\xb4\xed\x4e\xea\x4e\x5b\xc8\xf3\xe5\xbe\x11\x19\x57\xe6\x11\x00\x30\x71\xcb\x93\xeb\xa6\x77\x86\x4b\x15\xf2\x4b\x25\x96\xee\xb6\xc5\xfc\x56\x5c\xda\x6e\x51\x16\xba\xaf\x1e\x03\x71\x8c\x2c\xf6\x82\xbd\xd6\x51\xc9\x13\x22\xca\xb7\x56\x4c\x57\x96\x34\x90\x45\x6f\x9e\x0d\x9d\x8c\xe0\x0b\x73\x5a\x5e\x1a\xc3\xd5\x4a\x97\x31\x39\x35\x2f\xe9\xe1\x1b\x10\x15\xef\x0a\x03\x9b\x39\x5d\xc0\x63\xad\xe2\x06\x0f\xd9\x1d\x8f\x77\x71\xf9\xc9\x92\x28\x4d\x4b\xbb\x96\xcc\xf9\xa7\x01\xc7\xf9\x86\x16\x0a\xe1\xe1\x8c\xa6\x0a\xd0\x89\x12\x4a\xd2\xf5\xbc\xee\x8f\x8c\xb4\xde\x42\x68\x92\x11\x10\xa6\xf5\x00\x1b\x0e\x9f\x69\x67\xdf\xae\xf2\x8d\xc0\x76\xcc\x3b\x28\x1c\x78\x34\x63\xaa\x69\x23\xb2\x71\x27\x7d\xc3\xb6\x0f\xc8\xd8\xa3\x52\x30\x56\xb7\x0b\xb3\x82\x33\x54\xc0\xe2\x1e\xe7\x8f\x55\x8f\xc0\xa3\x0f\x6d\x02\x8f\xee\x3a\x05\x1e\x5d\x82\xc8\x78\x44\x3c\xec\x22\xc9\x48\x4c\xbb\x81\xe1\x1e\x35\xad\xa7\x00\x9a\xba\x14\xc1\xb2\xc6\x0e\x68\xae\x93\x9f\x20\x74\xa2\x64\x56\x69\xbc\xb5\xfe\x31\xdc\xfd\x60\x50\x07\x2e\x09\x5b\x9e\xbf\x2c\xd8\x0b\x41\x0b\xc0\xed\xa3\xcb\xb6\x88\x47\x67\xb1\xd1\xc5\x09\xf1\x3b\x72\x40\x74\xa6\xb3\x37\xd8\xfa\xa0\xb5\x1b\xcc\x57\xdc\x5d\xcf\x99\x4d\x81\x08\xf4\x3e\x23\x4d\x8d\x8c\x00\xa5\xd2\xa9\x70\x88\x87\x93\xae\xc5\xcd\x98\x28\xde\xdd\x97\xa0\x38\xd9\xf3\x7d\xd5\x7d\xda\xdd\xb1\xd0\xac\x9c\xd2\x84\x0d\x42\x1f\x03\x2b\xe6\x2c\x67\xa5\x21\x94\xbd\xce\xd5\x68\xcf\xa9\x48\x33\x0b\x5c\xc0\x4a\x58\xc1\xec\x83\x66\xa5\x21\xea\xc1\xf9\x31\x49\x4b\x7e\xc5\x4a\x45\xf6\xbe\x67\xc6\xd6\x40\x18\xaa\xc1\x23\x4c\x83\xc5\x0f\x59\x87\x07\x04\x1e\xdc\x4f\xe9\x07\x0c\xb5\xaa\x25\x74\x3d\x55\x0e\xf2\xca\x4c\xab\x0a\x7d\x47\x63\xb3\x20\x60\x0b\x05\xe9\x0b\xad\x0f\x31\xb6\xe9\x3a\xfd\x42\x87\x86\x44\xe3\xc0\x54\xd9\xce\xbf\x00\x87\x63\x05\xbb\x85\x49\x59\x5b\x71\x43\xff\x05\x25\x75\xb0\xea\xb6\xda\x8f\xa9\xb5\x2b\xe5\x15\x4f\x9d\x3a\x04\xa9\x11\x35\xe8\x5f\x41\x55\x00\x5e\x40\x95\x92\xb6\x9f\x79\x30\x35\x68\xa5\x82\xd2\x14\xf7\xcc\x70\xe1\xe6\x30\x4c\x26\x01\x79\xbe\x55\xc3\x2e\xd2\xcb\x86\x28\x53\x76\x5a\x4d\x32\xae\xe6\xe7\xbd\x86\x44\x56\x0d\x8c\x49\x89\x4b\x99\x2a\x37\x46\x46\x14\x13\x8a\xdb\xfe\xaa\xa8\x6e\x71\xa3\x6d\x4b\x98\x06\x77\x77\xb8\x28\x24\x54\xc3\x43\xd7\x56\xf7\xd3\x49\xfd\x1e\x16\xac\x04\xdb\x05\xa6\xec\x9d\x28\xa2\xf3\x09\xcd\x32\x65\xf5\x5b\x0f\x86\xed\xf6\x1e\xd4\x50\x1d\x80\x09\x72\x05\x37\x0c\xe3\xde\x1e\x52\x70\x50\x78\x79\xe4\xf6\x95\x1f\xa6\x02\x88\x4b\x29\xdc\x45\xd0\xf5\xd0\xdd\xe0\x29\x84\x95\x38\xc8\x74\x6b\xc4\xcc\xde\x86\x7f\x1e\x5f\xf8\xe7\x61\x6a\x2a\xea\x5e\x54\x14\x4e\x8e\xa0\x42\xcb\x75\xd4\xa7\x1e\xd9\xa0\xb6\x24\xc7\x9f\x4a\xd3\x5c\x5b\x08\x18\xdf\x6f\x5f\x5b\xfc\xf3\x7e\xbc\xbb\xcd\x41\x41\x15\x33\xa6\x38\x48\xa8\x91\xa5\x5f\x12\x2c\x29\x6b\x23\xfb\x75\xbe\x2c\xd7\xea\x3d\x1d\xb6\x73\x3c\xb9\xab\x48\x2a\x93\xca\x18\x5f\x35\xd9\xeb\x84\x8b\x6e\x6d\x6d\x9e\x16\xce\x7e\x2a\xaf\xc5\x35\x2d\xd3\xfd\xd3\x56\xb5\xb9\xb1\x72\x56\x8f\x15\xaa\xde\xee\x34\x31\xe7\xe9\x44\x56\xda\x63\x1b\x6e\xa3\x7d\x2b\x87\x08\xa5\xf9\x2a\x77\x9b\x96\x46\xc8\xde\x31\x9a\x77\x5f\x87\xdd\x36\x40\xb8\x0d\x10\x46\xc7\x26\x05\x08\x8f\x31\x40\x18\xb6\x84\x8b\xc4\x8b\xf5\xd0\x1a\x8a\x3f\x89\x18\xd3\x61\x2d\x52\x51\x13\x6f\xd6\xf3\x36\x94\x7f\x5c\xbc\x35\xd7\x05\x06\x83\x93\xb9\xa0\x97\x3d\x85\x78\xd4\x06\xc4\x93\x80\x96\x1d\xac\x42\x3c\x62\x81\x5f\xd7\xab\x21\x4a\x2d\x06\xa6\x83\x08\x77\x21\xd3\x97\x08\x1a\x0b\x40\xef\xd8\x9c\x6c\x68\x61\xbf\x87\xd6\x77\x21\x52\xf8\x87\x2a\x68\xc2\x40\xbe\x79\xf5\xa7\x97\x20\x41\x47\x06\x20\x3d\x31\x01\x01\x46\x00\xea\x9c\x76\xe1\x06\xd2\x1b\x47\x98\xa3\xb6\x78\xba\x8e\xd4\x44\x14\xc5\x51\x1d\x23\xa8\x64\xce\x72\x0a\xff\x7c\xe5\x48\x60\x64\xa3\x31\x1e\x34\x43\x08\x38\x56\xe6\x8a\xc8\xe9\x30\xca\x74\xdd\xb9\x7a\xb1\xd3\x2d\xd8\x40\xfa\x8b\x53\x12\xb7\x8e\x4e\x3b\x07\x7b\x48\x93\x60\xa7\x51\x6c\xc7\xac\x21\xd0\x79\xcc\xb2\xf2\x70\xf6\x3e\x83\x02\xf6\x0f\xa4\xf0\xc6\x10\xa7\xef\x20\x6e\xdb\xe0\xed\xd0\x47\x0d\x1e\x81\xf2\xb7\x0d\xde\x3e\xc5\xe0\x6d\xb0\x31\x3a\x41\xb7\x22\x90\x1b\x86\x04\x5c\x34\x77\xc2\x9c\x51\x63\x6d\x18\x17\xca\x75\x71\x5c\x59\xc6\xa9\x4b\xbb\xe3\xf1\xee\xae\x8b\xee\x5a\xbe\xaf\xf4\x74\xf4\x0d\x61\x22\x91\x29\x32\x8b\x19\xbf\x54\x1a\xd4\xbd\xda\xdd\x16\xbe\x4b\xee\x9e\x15\xa6\x3f\xc1\xd8\x7d\x4c\x75\x67\xd9\xe2\x20\x09\x5f\x3d\x80\x12\x53\xab\x2e\x1e\xf8\xd0\x92\xc8\xe3\x59\x5b\x1d\xc6\xfd\xae\x48\xc6\x73\x6e\x1b\xa5\x9a\x85\xce\x94\x56\x64\x0f\x4f\x8e\x93\xa2\x1a\xda\x0b\xc6\x39\xcb\x65\xb9\x18\xfa\x8b\xcc\x8f\xd1\x5d\xf6\x8a\x01\xb6\x31\xa9\xca\x92\x09\x9d\x2d\x9e\xb2\x06\xe4\x88\xb8\x21\x0a\x90\x9f\xe3\x2e\x88\x23\xf5\x11\xb3\x56\x1d\xf1\x05\xb7\x79\xd0\x5f\xc0\xa3\xd1\xaa\x61\x1d\x17\x37\x67\x99\xb8\x22\x57\xb4\xbc\x27\x72\xfc\xaa\xa3\x47\x9d\x27\xe5\x57\x5c\x75\xed\x62\x4c\x9a\xe4\x39\xf7\x4e\x68\xb3\xd8\x64\xa5\x8b\x4a\x5b\x89\xee\x56\xa0\x43\x19\xf7\x2b\xaf\xa1\x1c\xbe\x68\xd3\x5d\x29\x3e\x0a\xaa\x35\x2b\xc5\x4b\xf2\x3f\x7b\xef\xbf\xfc\x38\x1a\x7c\xb7\xb7\xf7\xcb\xf3\xd1\x5f\x7f\xfd\x72\xef\xfd\x18\xfe\xf1\xc5\xe0\xbb\xc1\x47\xf7\xc7\x97\x83\xc1\xde\xde\x2f\x3f\xbe\xf9\xe1\xe2\xf4\xe8\x57\x3e\xf8\xf8\x8b\xa8\xf2\x4b\xfc\xeb\xe3\xde\x2f\xec\xe8\xd7\x3b\x0e\x32\x18\x7c\xf7\xc7\xce\xaf\x4e\xc5\xe2\x6d\x47\x51\x88\xc7\xa8\xc7\x2d\x39\x1e\xb1\x17\xf6\x6b\xb4\x95\xe0\x42\x8f\x64\x39\xc2\xa1\x5f\x02\x58\x70\xc7\x07\x38\xf6\xea\x7b\xfd\xd7\x6a\x40\x0d\xb7\xef\x94\xfa\x35\x2f\x70\x08\x7d\x1e\xf2\x1e\xca\x8c\xdd\x48\x71\x99\x8c\x66\x79\x21\x4b\x5a\x2e\x48\x6a\xbd\x99\x8b\x15\x08\x44\x01\x04\x51\x67\x48\x61\x78\x8f\x94\x97\x6b\xa8\x34\xee\x8c\x28\xc4\x52\x5e\xe5\x3d\xe1\x09\xc1\x58\xe1\x64\x5c\x03\xf2\xbe\x45\xed\x77\x29\x45\xf6\x32\x1b\xd0\x98\xd0\xe4\x12\x2d\x28\x3f\x5b\xa8\x37\x06\xa5\xf5\x3b\x3b\x36\x25\x22\x67\x54\x78\xc7\xbe\xeb\x38\x66\xa6\xd2\x5d\x8c\x63\x47\x4e\x78\x8c\xb4\xdb\x04\xc2\xba\x23\x95\x2c\xc9\x1b\x50\x80\xd6\x3a\xfb\xa4\x17\xac\x10\xfe\x1f\xf6\xda\x68\x7d\x3d\x55\xa2\xba\xe1\x5c\x02\x91\x96\x60\x6f\x5a\x5c\xaf\x29\x34\xd9\xaa\x33\xc4\x22\xcd\x02\x26\xf2\xc8\x2d\x4b\x17\xbf\x35\xd3\x69\x46\x45\xdd\x14\x1c\xd3\x99\xc2\xbc\x15\x9e\x40\x1f\x28\xb0\x4d\x61\x3a\xfc\x14\x5e\x04\xcd\xa1\x2b\x65\x9e\x24\x45\x7c\x4d\xfd\x20\x6c\x93\x35\x41\x9e\x70\x1d\x5d\x63\x8b\xda\xfc\x72\xee\xbf\xac\xf6\x67\x40\xc9\xb2\x33\x3f\x55\x05\x46\x8a\x7d\x8a\x55\xb5\xe5\x14\x32\x2b\x82\x7e\x3d\xae\x25\xcd\x12\xa3\x0a\x9e\xc5\x9c\xea\x3a\x4f\xf8\x0f\xaf\x84\x4d\x28\x5c\x62\xbb\xd5\x5c\x57\x29\x56\x8e\x66\x15\x4f\xfb\xe3\xb7\x47\xa7\x76\x74\x54\x36\xfa\x52\x31\x7a\x51\x2c\x7a\x57\x27\x7c\xca\x66\xf7\x0e\xc9\x75\xf6\x67\xb4\x9f\x86\xcd\x31\xe2\x4c\x50\xea\xfb\xa1\x39\x61\xe0\xd2\x0d\x2e\xbc\x2b\xc9\xee\xb3\xc9\x22\xb1\xd0\x4e\x3c\x6a\xdd\x83\xc3\xe2\x9a\x80\xa2\xaa\x91\x6f\x95\x5a\x3b\x24\xc8\x84\x4d\x31\xe3\x09\xef\x01\x4f\x81\x2d\x05\x4b\x59\xc6\x34\x0b\x7a\x1c\x17\xd8\x95\xb5\x64\xb9\xbc\x32\xcb\xec\xbd\x20\xef\x94\x8d\x97\xf3\xe9\x4b\x42\x07\x51\xc1\xb1\x42\x03\x5b\x30\x96\x62\x7d\x58\xd0\x54\xb0\xac\x84\x1a\x92\xc9\xc0\xe5\xb3\x2a\xec\x1e\x5a\x82\x53\xcd\x76\xf7\x02\x3f\x56\xc9\x0c\x01\x00\xa4\xaa\x94\x39\x51\x82\x16\x6a\x2e\x35\xb8\x4c\x68\x41\x13\xae\x17\x44\x97\x34\xb9\x34\x97\x40\x1c\x15\x1e\x37\x24\xc9\xc0\xa6\xb7\x87\xe4\x8b\x4b\xd6\xf4\xbc\x94\xd5\x6c\x0e\x35\x54\x78\x55\x92\x51\xe5\xbe\x7e\xe5\xfd\xd6\x86\x57\x24\x5d\x08\x9a\xf3\xc4\xf7\x0e\x29\xe5\x15\x57\x5c\xda\x48\x97\x1b\xf7\xd4\x77\x61\xc0\xe8\xd9\x41\x46\x79\x4e\xf6\x14\x63\xe4\xc8\xb1\x04\xfe\x72\x8e\x9a\x24\x7a\x12\xcb\x38\xa9\xce\x02\x3e\x5a\xe0\x01\x73\xa6\x16\xbd\x3e\x55\x01\x95\x01\xf3\xe6\x2b\x1f\x3a\xf0\xd3\xb5\xfa\x9d\x64\x09\x09\x6f\xae\x05\x10\x13\xa9\x0c\x32\x62\xf6\x4f\x8f\x55\x68\xdf\xda\x36\x8a\x38\x12\xfc\x90\x49\x31\x0b\x81\xef\x6a\xce\x34\x42\x5e\x40\x3f\xcc\x2b\x9e\x56\x34\x43\xf1\x6e\x5f\xe6\xe0\xfc\x18\x6f\xe7\xb3\xb9\x1e\x5d\x33\xf0\x7e\xe2\x2e\x58\xaf\x19\xf7\x50\xbe\x94\x69\xcb\x15\x6c\x07\xda\x7a\xd9\xd0\x93\x0c\x3d\x27\xe9\x02\x80\x77\x6d\x72\x67\x94\x8c\xe3\x60\xea\x71\x88\x55\x14\x87\xd7\xdb\xf7\x0d\x12\x8d\x4a\x04\xee\x61\x43\x62\xe0\xd4\xe5\x77\x83\x6e\x8f\x75\xcf\x0d\x7f\x5a\xd7\x9d\x1f\x41\x21\x6e\xdf\x39\x78\x6d\x8a\xec\x55\xcd\x26\x17\x2c\x2f\x32\xaa\xfb\x49\x2d\xd9\xf9\x39\x70\x7f\x07\xc1\x63\xb3\x1c\xa9\x48\x47\x34\x33\x1c\x79\xfa\xd3\x81\xad\x6c\xc3\x05\x16\xa5\xaf\x5d\xd4\x3d\x4a\x51\x39\x40\x2d\x69\xe5\xd2\x02\x2c\xb5\x09\x4b\x41\x18\xd9\x27\x83\x8f\xe2\x5a\x60\xeb\x5f\xf3\xc7\xe9\x4f\x07\x43\xc2\xc7\x6c\xec\xfe\xf2\x97\x3a\x69\xa8\xe5\x0c\x0b\x1c\x7c\x05\x0d\xf0\x33\x76\xe1\x0e\x9c\xbf\xe1\xbd\xff\xfa\xd6\xbc\xa4\xf9\xf5\x6f\xa3\x6f\x83\x5e\x46\x7f\xfb\x97\x11\xae\xa5\xb9\x20\x3e\x1b\xe6\x97\x83\xdc\x33\x7f\xfd\xeb\x54\xa6\xe7\x05\x4b\xc6\xf8\x59\xea\x5f\x98\x25\x40\x98\xd0\x46\xd7\x3e\x95\x90\x59\xc6\x53\xe4\x72\x78\x76\xc9\xfe\xed\x02\x04\xb6\x5d\xaa\x15\x24\x09\xd5\x4c\xc0\x06\xe0\x0a\x8d\x85\xd4\x78\x3b\x36\x5a\x85\xf7\xdf\x9b\x86\xad\x4f\xb5\x94\xb0\xcc\x51\x94\xec\x0b\xc2\x3e\x70\x05\xb8\x33\xf8\xad\x40\x0e\x6a\x93\xd7\xdd\x9e\x66\x86\x35\x14\xf6\x30\x43\xd8\x3d\x3c\xcb\xc8\x17\x42\xea\x2f\xfc\xf4\xbb\xc4\x44\xd8\xb8\x24\xa1\x57\x92\xa7\xa4\x82\xbe\x59\x66\x05\x0a\xf0\x6c\xd7\xad\x0b\x27\x0b\x92\x73\xa5\xe9\x25\x1b\x93\x73\xb3\x67\x85\x19\x06\x48\x3d\x41\xa0\x0b\x0d\x4b\x49\x25\x34\xcf\xe0\xd7\x7a\x1c\xf3\xca\xe1\x5e\x76\x3c\x25\xaa\x4a\xa0\x39\x6f\xc9\x46\x6e\x77\xb4\x57\x2d\xc9\x98\xfa\x5b\x86\x7e\xb2\xe7\x14\xed\xa7\x22\x85\x5b\xb1\xd5\xaf\xb0\xec\xb5\x94\x57\x6d\xde\x53\x8a\xa4\xde\x11\x81\x98\xd0\x35\xdb\x6c\x82\x99\x4b\x00\x42\x53\xce\x06\x0c\x04\x4b\x98\x52\xb4\x5c\x60\x37\x54\xee\x9b\x36\xda\x94\x57\xd8\xa9\x73\x2a\x2a\x18\xa0\x64\xd8\x5b\xb7\x4a\x80\x3a\x94\x4c\x4a\x79\xc9\x84\x2f\x21\xf0\x0d\xd2\x7d\x42\x75\x9d\x35\x0a\xf1\x7b\x49\x92\x39\x15\x33\x56\x57\x91\xe7\x34\x05\xda\xff\xe8\x35\x2d\xf7\x3d\x86\x02\x74\x6a\x14\x16\xae\x81\x14\x13\xb3\x3f\xf9\xb0\xc7\x7b\xe1\x71\x70\x87\x75\x5c\xc2\x7c\x12\xcf\x5a\xc9\x44\xd2\x8f\x23\xbc\xbb\x0b\x7c\x04\x0a\xc5\x1a\x93\xb7\x73\xa6\x69\x4a\x35\xed\x2d\x81\xfb\x0d\xf5\x5d\x3f\x6d\x52\x07\xb0\x43\x90\xec\x61\xf7\x58\xa7\x4a\xca\x82\x87\xb8\x02\x20\x0d\xe6\x6e\xf6\x01\x97\x4a\x1b\xbe\xb6\x41\x47\xcc\xcb\x06\x5d\x8d\x66\x99\xbc\xb6\x48\x75\x6e\x34\x14\x59\x2c\x25\x69\x05\x6a\x5f\x2d\xd2\xba\x04\xc5\x7b\x89\x99\x98\x89\xee\x8d\xca\x17\x75\xec\x3f\x89\x73\xb3\x57\x2a\x68\xb8\xd7\x31\xa1\x39\xb6\xc6\x77\x40\x10\x96\xf8\x95\xc0\xa5\xda\x98\x06\x98\xa7\x19\xd3\xaa\xce\xaa\xc4\xdd\xc4\x88\x48\xbb\x97\x5b\x27\x02\x6c\x35\x76\x6a\xac\x1d\xbe\x5a\x53\xc4\x89\x53\xd2\xee\x16\x66\xff\x5a\xfb\xcc\xf4\x17\x3c\xc2\xf6\xb7\x6f\x64\xda\x3d\x0a\xd5\xe8\xe3\x5a\x0f\x5c\x57\x9b\x60\xe5\x91\x02\x27\x0f\x5e\x00\x31\x79\x15\xc1\x64\xe0\x16\x30\xa7\x57\xed\xdd\xa9\xb5\x66\x3a\xf2\xcd\xda\xe0\x71\x23\x78\xdc\xe8\x45\x57\xc7\x75\xf7\xac\x45\x77\x74\xcc\x5e\x8c\x5f\xa8\x87\x48\x85\x11\xad\xe7\xbd\x04\x12\x1a\x28\x4a\x7e\x5c\xbb\xff\xda\xcc\x0c\x9f\x0d\x63\xeb\x69\x19\x37\x52\xf3\x25\xf9\x22\xd2\xb8\xac\x66\xeb\xad\x61\xac\x62\xda\x73\xe6\xf1\xd8\x4e\xbc\x83\xf3\x8a\x2f\x1f\x34\x06\x03\x55\x6f\xb5\xd5\xe8\xaa\xa5\xbc\xfa\x6d\x54\x65\xe8\xc3\xef\x6b\x54\x0d\x33\x97\x32\xcb\x5c\xef\x76\xb4\x90\x1b\xb9\x4d\xd0\x37\x08\xa3\x25\x43\xef\x86\xf0\xfa\xbe\x60\xd7\x5e\xb1\xa3\x0a\xe1\x4a\x5d\xac\x1e\x5c\x25\x2e\xe1\x6c\xd5\x78\xbe\xa2\x6b\x5f\x2c\xf0\xd5\x0f\x03\xd2\xa2\x7b\x81\xcc\xcc\x83\x8c\x05\x20\xe8\x24\xc3\x8c\x1c\xaf\xf8\xc0\xbb\xd0\xec\x9a\x2e\x14\xac\xb2\xda\x62\xf3\xcf\xb7\x58\xef\xf5\xc0\x67\x6c\xda\xa1\x9f\x7c\x78\xf4\x16\xcd\xef\x2f\x9e\x0f\x60\x2b\x5c\xb4\x4f\xd2\xad\x87\x69\xd1\x82\xbb\x79\xf4\x97\x16\x00\x99\x91\x90\x16\xd5\x47\x7c\x35\x5a\xce\xfb\xa7\xc7\x30\xb0\xb3\xdc\x66\xf0\x87\xdb\xd1\x7d\xa0\x70\xc2\xcc\x7a\xab\x21\xa2\x80\x77\xc3\x7b\x57\xe4\x8d\xd5\x4c\xff\x23\xf4\x43\xb2\xf1\x17\x57\x0f\x6c\x36\x84\xfd\xd3\x63\x7c\xe2\x18\x5a\xe2\x52\xb1\xb0\xba\x96\x9e\xf3\x32\x1d\x15\xb4\xd4\x0b\x74\x5e\x0c\xa3\xa7\xf9\xa2\xc8\x1e\xc8\xd1\x6b\x68\xb8\x4b\x0b\xb5\xf0\x88\xe6\x08\xc8\xe7\x02\x2f\x36\x72\x76\xe3\xcc\x6c\x1a\x45\xba\x96\x68\xba\x23\xa2\x48\xd8\x42\xc7\xf9\x2e\x1e\x05\x45\xd2\x50\x10\x3f\xd4\xbe\x6c\x64\xbc\x8a\xd3\x59\x70\x9b\x05\x1d\xda\xfa\x9b\x64\x58\x37\xe6\x75\x36\x30\xfe\xcd\x48\x43\xc2\xa7\x66\x83\x93\x62\x64\xab\xd5\xbd\x73\xdc\xea\x7d\x2e\xef\x13\x0d\x79\xb3\x74\xd1\xfd\x19\x3e\x2b\x1c\xc0\xaf\x75\xb2\x27\xa4\xc0\xf5\x8f\xd7\x0e\x30\xed\xf5\x06\xff\x2e\x5c\x32\x26\x3f\xcf\x99\x08\x37\xbf\xd0\x21\x3e\xf4\x9b\x30\x17\xa9\x99\x7c\xd8\x19\xc1\x1f\xa0\xaa\x24\x61\xcc\x7b\x90\xc2\x76\xf1\xb5\x7c\xb2\xaf\x9c\x53\x9d\xcc\x99\x22\x4a\x02\xec\xa8\xd2\x34\xcb\x6a\xcf\x8d\x25\x97\x04\x3d\xc2\x79\xd1\x03\xf5\x22\x2a\xf2\xb6\x4e\xac\x22\xa3\xd6\x53\x32\xad\x44\x82\x89\x55\x5c\x2f\xdc\x1b\x1c\x36\x55\x29\x30\x57\x15\x3a\x74\xf8\x14\x7d\xb7\x81\xd9\xe9\x89\x09\x02\x76\x81\x22\x35\xde\xf9\x2d\xb6\x9e\x91\xa6\x13\x9a\x5c\x5e\xd3\x32\x55\x50\xbf\x4e\x35\xc7\x16\x87\xc3\x68\xd8\xbd\xe0\x1d\xcc\xd3\x23\x4d\x61\xe0\x8d\x5b\xc5\x7c\x2b\xbb\xfa\x31\x84\x56\x5a\xe6\x54\xf3\x04\xdc\x36\x7c\x1a\x78\xe2\x73\xdf\x02\xc2\x47\x52\x51\xb2\xc3\x5e\x61\x3f\x03\x2c\xb8\x12\xcb\x2c\xf4\xb5\x24\x3c\x37\x1a\x18\x85\xd6\xcf\x53\x5f\xad\xee\x62\x06\xb7\xbd\xa9\x51\x33\x7f\x86\x40\x4d\x70\x15\x3a\x84\x8c\xa9\xae\x60\x78\x1f\x15\xf0\xee\x70\x5b\x96\x3d\x6c\x28\x48\xf6\x1e\xc3\xd3\xe6\x5d\x03\x56\x1d\x9a\xe9\xb9\x66\x46\xef\x52\xb7\x32\xac\x1a\xaf\x7a\x23\x3e\x13\x58\xb8\xcb\x95\x73\x21\xd8\x4c\xec\xbd\xb4\x94\x45\x61\x9d\x81\xf9\xa0\xf9\x46\x10\x7b\x2b\xaf\x98\x82\xb8\xb3\xcb\xed\x36\x64\x98\x31\xc1\x4a\xaa\xc1\x93\x6f\xe1\x08\x61\xe5\x36\x1f\x11\x2d\x98\x31\x82\xb2\x0c\xc8\x3b\xdb\xe0\xdf\x33\xae\xcf\x14\xbf\x93\x62\x8a\x9e\x45\xab\x9b\x6e\x35\xca\x5b\x87\xd9\x6a\x94\x5b\x8d\xb2\xc5\xb1\xd5\x28\x9b\xc7\x56\xa3\x0c\x0f\x9f\x8c\xdc\xaf\x36\x59\x57\x17\x04\x89\x1f\x61\x2a\x55\x7d\xc1\x4d\x2e\xbf\xe3\x29\x39\x63\x89\xbc\x62\x25\x6e\x22\x47\x1f\x0a\x2a\x8c\xae\xf4\x8a\xf2\xcc\x6c\x21\x6e\x2b\xa9\xdd\x1b\xd0\x47\x27\x76\xb1\x07\x1e\x25\x3f\x1f\x76\xb1\xe6\xf6\xa5\x2c\xd2\x85\xb9\xde\x06\xf2\x8b\x92\x5d\x71\x59\x29\x97\xf0\x55\x69\x14\x16\x4a\x5b\x7d\x66\xce\x67\xbe\xdd\x9d\x4f\xc7\x28\x59\x22\xcb\xb4\x86\xac\x52\x9a\xea\x4a\xc5\x35\xa4\x09\xfa\xb4\xfb\x73\x67\x7a\x3a\x6e\xd0\xee\xd9\xe7\x3e\x83\x19\x73\xbd\xaf\xd7\xdd\xd7\x98\x89\x87\x27\x27\x96\x0d\x5d\x72\x60\x9d\x98\x68\x54\xdf\x4a\xb3\x80\x5d\x2d\x63\xdd\x7b\x0e\x23\x3c\x9a\x67\xd8\x3c\x7c\xe4\x87\x1d\xd5\xb9\x80\xad\xfb\x23\x86\x47\x8f\xb3\x49\x7a\x07\x4e\x09\x8f\x47\x97\x3a\x18\x1f\xbd\x55\x2d\x90\x07\xa9\x5c\x20\xfd\x57\x2f\x90\x87\xaf\x60\x20\xbe\xa2\xac\xff\x75\x7f\xe6\x2a\xdc\x1a\x2b\xdf\x6e\x4b\xb7\xad\xfc\x08\x4a\xcd\x8f\xc3\x15\x91\x39\xd7\x9a\xb9\x04\x12\xbf\x92\xc1\xe1\x1f\x56\xf8\x58\x99\x03\xbe\x04\xcc\x12\x61\x1f\x7c\x0f\xa9\x40\x57\x05\x8d\xf3\x9a\x2b\x30\x90\xa8\x30\x76\x2d\x22\xda\x82\xec\x18\xd9\x74\x5f\x67\xab\x6f\xe5\x50\xf7\x71\xb7\x72\x28\x3c\xb6\x72\x88\x40\x37\xae\x0c\x8a\x47\x7a\x55\x8c\xdd\xa0\x16\x4a\x87\x4e\x58\x46\x7e\xab\x58\xb9\x20\x46\xd1\xad\xd3\x4c\xa1\xdd\x96\xe2\xa9\x4d\xd4\xb4\x8e\xc9\xae\xd6\xe5\x86\xea\x78\xe0\x38\x3d\xfa\x60\xec\x04\x40\x40\xe8\x5d\xea\x37\x1f\x10\x03\x19\xe1\x2c\xf8\x99\x09\xad\x03\xcc\x11\x89\xec\x05\x63\x2a\xec\x9f\x1c\xf6\x69\xea\xf7\x91\x3e\x40\xfa\x4b\x21\x20\x4b\x2e\x99\x5b\x48\x84\xa4\xf4\xbf\xc0\xc6\xe6\xd3\x3c\xbc\xa3\x91\x5c\xb2\xc5\xd0\x66\x53\xd9\x5e\x8b\xee\x62\x4c\x4c\x8c\x1b\xbe\x74\x03\x0a\x8c\x8f\x9e\x77\xa0\x3e\x7d\x83\x78\x74\x6d\xf0\x11\x8f\xe5\x88\xdb\xcf\xa6\xd8\xf3\x26\xdb\x43\x23\x90\xf0\xb8\xa9\x29\x08\x72\x2b\xf4\x10\x70\xd5\x52\x9e\x41\xa1\x42\x0c\x24\x6c\x3f\xec\x45\xfa\x76\x4f\xe1\xe1\xa6\xf1\x81\x88\xe5\x97\x60\x54\x96\x73\xc9\x16\xbb\xca\x62\x69\x48\xa1\xe6\xbc\x70\x5d\x22\x41\x4e\xda\x55\x49\x7e\x82\xfc\x37\x37\x04\x4a\xc4\x63\x31\x24\x27\x52\x9b\xff\x1c\x41\x42\x2f\xc6\x58\x24\x53\x27\x52\xc3\x99\x8d\x26\x37\x7e\xda\x03\x11\xdb\x86\x68\x38\x84\x58\x30\x75\x1d\x6a\x57\x5d\x9a\x27\x10\xd5\xe6\xf2\xf8\x89\xe1\x8a\x1c\x0b\x22\x4b\x47\x55\xed\x1a\x5f\x29\x3b\x84\xf3\x5e\x07\xd1\xb0\x15\x63\xd8\xc9\x90\x65\x34\x17\xb7\x0c\xe7\x03\x6b\xdc\xfd\x02\xde\x6d\x88\x44\xfa\xdc\x54\x68\xbe\x44\x35\x9b\xf1\x84\xe4\xac\x9c\x01\xee\x4a\x32\xef\x7b\x8a\xfb\xda\x17\xf1\xe8\x71\x77\xc4\xa3\x57\x3e\x04\x15\xe5\x35\x64\x1d\x3f\x8c\xfa\x83\x63\xe3\x76\x9d\xd3\xc2\xb0\xe0\xff\x31\xbb\x32\x70\xc1\xff\x85\xe6\x6e\x6a\x4c\xf6\x89\xe2\x62\x96\xb1\xe8\x37\xeb\xcf\x0c\x87\x31\x23\x18\xfb\xf5\xb7\x8a\x5f\xd1\x8c\x61\x95\x00\x15\xbe\xf5\x8a\x9c\x2e\x29\x5d\x43\xdb\xe1\xcd\xc8\x65\x1f\x83\xdf\xb9\x64\x8b\x9d\xe1\x12\xdb\xee\x1c\x8b\x9d\x1a\xc2\x29\x62\x54\xaf\x5c\x40\x78\x76\x07\x7e\xdb\xf9\x3c\x7a\xda\x23\x30\x63\x7b\xe3\x49\xeb\x72\x3e\xc8\xa8\x52\x7d\xa0\xc9\x34\x0a\xc2\x1b\xa3\xaf\x6a\x2c\x71\x1e\x5c\x53\x97\x84\xdb\x0a\x94\xde\xfd\xe8\x50\x01\xd9\x57\x3e\x70\x0f\xf4\xbf\xb2\xfd\xac\xbb\xc2\xd0\xad\x84\x02\x07\x10\x36\x57\x21\x1b\x21\x2a\xd4\x69\x3a\x37\x50\xfc\x27\x88\x88\xc8\x29\x79\x55\x37\x8c\xe0\x0a\x5c\x54\xdc\xd5\xcc\x0a\xa9\x09\x17\x49\x56\xd9\x60\x08\xdc\x0a\x0e\xae\x7e\x0c\xd8\xde\xc8\xdb\x3b\x63\xd7\xc3\x3a\x8e\x76\x29\x45\x4b\x85\x50\xcd\xec\x0f\xc8\xb7\xf1\xd9\x14\x48\xed\x75\x52\x6b\xda\xaa\xe4\x23\x6e\x74\x92\xc4\xfa\xe5\x2b\x3e\x29\x19\x39\x98\x53\x21\x58\x16\xa0\xc8\x58\x67\x28\xd5\x9a\x26\x73\x8c\xd9\x51\x62\xd6\x71\xc6\xf4\xae\xc2\x06\xfd\x39\x4d\xe6\x5c\x78\x5c\x05\xe1\xd1\x94\xea\xba\xb2\x35\xb4\x06\xea\x6a\x20\xf5\xd8\x55\x66\xd7\xb6\x95\xb1\x7c\x17\xf6\x73\x89\xbb\xcd\xd4\x00\xe5\xcd\x6b\x6a\xa4\x7e\xbb\xe6\x81\xf2\xb8\x2f\x43\xeb\x13\xb8\xf6\xf6\x7e\x35\xb9\x77\x68\x73\x31\x65\x65\x89\x33\x34\x61\xf6\x86\x46\x8f\xd9\xb1\x6d\x62\x31\x97\xd7\x24\x95\xe4\x1a\xba\xad\x5e\x19\x05\x02\x52\x91\x94\x53\x3d\x82\x37\x85\xc4\xc0\x44\xe6\x45\x29\x73\xae\x5c\xf9\xa3\x65\x8f\xb5\x01\xa6\x64\x55\x6b\xcc\xd9\x78\x16\xb3\x4a\xc4\xcd\x1e\x5f\x1d\x10\x4d\xcb\x19\xd3\xe6\x19\x44\x54\xf9\x84\x75\xc4\x85\x59\x37\x2a\x79\xaf\x5d\x40\x76\x7d\x1b\x90\x88\x6a\x9f\xe8\xef\x41\xce\xdc\x5d\x90\x40\x08\x69\x8a\x53\x59\xda\x64\x4b\xff\xa3\x85\xa1\x37\x5c\xf8\x93\xdd\x38\x2b\xa1\x55\x47\x54\xf8\x2e\xfd\x41\x90\x15\x7e\xfe\xf9\xa4\x1f\x58\xf7\xdd\x7a\xbc\x9b\xb8\xee\x5a\x96\x59\x7a\xcd\x53\x54\xce\x14\xd9\x33\x17\x0f\xba\x51\x60\x8d\x28\xef\x9d\x57\xfa\xf5\x35\x4f\x7b\x22\x3e\x0c\x15\x13\xdd\xe5\x51\x1b\xa2\x13\xa0\x3a\x4f\x99\xd0\x46\x58\x96\x8a\xec\xc1\x1d\x03\x72\xc4\xb1\x12\x1f\xee\x07\x10\xd5\x7c\xc2\x45\x8d\xf2\x50\x4f\xaa\xd9\x2e\x8d\xdc\x70\xe6\xbd\x62\x1a\x6b\xa8\xa1\x0c\x59\xea\x39\x51\x3c\xaf\x32\x4d\x05\x93\x95\xca\x16\x1d\x59\xfb\xb1\x4e\xec\x34\x63\x1f\x70\x85\x77\x57\x7a\xfc\x50\xb1\xf2\x03\x89\xb6\x35\x70\xca\x92\xf6\x53\xa7\x82\xa7\xcf\xbc\x26\xe4\x81\x00\xd8\x07\x96\xd8\x1a\xb1\x22\xab\x66\xbc\x55\x51\xf0\xb6\x0f\x62\xab\xbb\xef\xd6\x07\xb1\x6e\xf7\x56\x29\x56\x23\x97\x75\xeb\x43\xbe\x81\x6d\x0b\xd7\xab\x5f\x5e\xac\x6e\x59\x98\xb2\x82\x89\x14\xa0\xd3\x5f\xd5\xeb\x0f\x5f\x7e\x6d\xb4\xb7\x90\xe5\xfd\xec\x15\x0e\xff\x3c\xda\xa5\x83\xc4\xfb\xb9\xcc\x52\x45\xd8\x07\x5d\x52\xb3\x1d\xe4\x46\xf0\xfb\x7b\xa6\x84\x8a\xae\xa2\xfd\xa9\x34\xde\x22\x9f\x49\x03\x4d\x9f\xa8\x06\xaa\x7a\xed\xc8\xb9\xab\xc2\x3e\x9c\x35\xf5\xa2\xd3\x3d\x37\xe7\xc4\x0d\xd4\x4a\x07\x15\xd7\xa1\xad\x68\xa2\x69\x9f\x12\xd7\xbf\x74\x6b\xa6\xa9\x56\xb4\xd6\x6b\xbc\xd5\x1a\x17\xeb\xb6\xb3\xe6\xe3\xea\xac\x39\x05\xb8\xa7\xee\xe0\xc7\x76\x9c\x86\xcf\xce\x9e\xb4\x6a\xeb\x5d\x7c\x74\x76\x45\x05\x7b\x32\x74\xca\xb1\x03\x59\xd8\x04\xa2\xcc\x6c\xd4\xc5\x11\x95\x10\xed\xa4\xf9\xba\xfb\x0e\x52\x4d\x15\xd3\x5d\x3c\xc9\xb1\x82\x59\x8f\x67\x44\x4e\xc8\xf9\xf6\x27\xec\xde\x09\x85\x9e\x0e\x02\x89\x8c\xfe\x66\x75\x51\x11\x5d\x69\xb4\x50\x47\x77\x07\x8e\xcc\x7c\x66\x19\x8e\x91\x9a\xd9\x4e\xa8\xee\xd8\x90\xbe\xc3\x6e\x6c\xdf\xf6\xdd\xbb\xe3\xc3\x3e\x49\x68\xc6\x73\xda\x2a\xfc\x3b\x26\xa3\xe5\x52\x00\xd0\xe5\xbf\x55\xa1\xa1\x0d\xd0\x8d\x9e\x70\xf6\xfa\x75\x50\x67\x96\xb0\x3a\x4c\x70\xc8\xd5\x65\x77\x80\xf3\xa5\x21\xe3\xe5\xfe\xc3\xc1\x11\xb1\x67\xef\xe4\x9d\xbf\x8f\x7b\xbe\x2b\x2a\xf6\x2c\x61\x75\xe0\x2e\xe5\xea\x72\x0d\xe0\xe8\x5d\x6d\xe0\x22\x3d\x69\x57\xc7\xb9\x99\x91\x86\xa6\x85\xe7\x60\x54\x03\x7c\xdf\x85\xac\xc8\xb5\x85\x11\xb4\x16\xe2\x05\x2f\x5e\x92\x23\xa1\xaa\x92\xd5\x19\x5a\xcd\xa1\x8c\xbe\x75\x67\x7b\x11\x90\x1a\xd5\xcb\xde\xa2\x12\x7d\x73\xea\x53\x09\x73\x14\xb4\xd4\x60\xc8\xf5\xc3\x48\x7e\x38\x27\xa7\x83\x13\xe2\x2e\x9c\x74\x3c\x75\xc5\x17\x43\x8b\x29\xe6\x81\xd3\xdd\x45\x86\x77\x02\x90\xd1\x90\x5b\x5e\x79\x60\x5f\xf2\x2c\x65\x57\xcf\x54\x4a\x5f\x0c\xe1\x31\xae\x64\x30\x7e\x27\xaa\xc8\xce\x8b\x9d\x31\x39\xe7\x39\xcf\x68\x99\x2d\xa2\x06\x67\xf5\x75\x66\xdb\x75\x03\x42\x36\xcb\xf3\x1d\xb2\x27\x4b\x18\x39\xa1\x82\x64\xcc\x61\x2e\xd8\x55\xbd\x40\xbb\x63\xb0\x19\x22\x92\x6c\x4c\xa4\x08\xa5\x65\x4f\xbc\x96\x3a\x9d\xca\xee\xf7\x11\x68\xed\x61\xbd\xe1\x71\x61\x76\xc1\x31\x79\x67\xb7\x2f\xab\x17\x20\x33\xc0\x62\x76\x57\x6c\xd6\x64\x6d\x9e\x3f\xa4\x95\x67\x63\x39\x74\xb7\x69\x84\x6e\xeb\x3d\x99\x71\x7d\xc6\x0a\xd9\x83\x0e\x87\x03\x35\xe2\x0b\x5c\x9b\x13\x52\x71\x68\x4f\x43\x35\xa1\x28\x92\x92\x2a\xa3\xc6\xa8\xc3\xe8\xc2\x98\x1c\x1e\x9d\x9e\x1d\x1d\xec\x5f\x1c\x1d\xbe\x24\x3f\xd8\x91\x78\x68\x07\x8c\xc9\x45\x88\x3b\x1d\x54\xb4\x59\x70\x5f\xff\xac\xa1\x15\xb1\x54\xd4\x8d\x33\x00\x87\x93\x0a\x72\x2c\xb8\xae\x5b\x86\x61\x5d\x40\x26\x85\xcd\xf4\x37\x77\xdb\xe8\xc6\x8c\x63\x3e\xaa\xb0\x83\x99\x9f\xe3\xd1\x60\x85\x62\x83\x1d\xff\x2a\xad\x1c\x24\x6b\x56\xfe\xea\xe9\x59\x87\xa1\xea\x7a\xe1\xf4\x63\x63\xf9\x3e\x48\x0e\x06\x02\xa3\xc5\xf5\x79\xdc\x6c\x7d\xdb\x47\x07\xac\x2b\xcb\xa8\x2b\xe3\x78\xbc\x3b\x26\x66\x1b\xdf\x1d\xef\x3a\x95\x2f\x5b\x6a\x1d\xea\x07\x0d\xf1\xcb\x63\x86\x1f\x13\xf2\xd6\x95\x4d\x02\xf8\xd4\xea\x2e\xa4\x88\xbf\x18\xf4\x9c\x6c\x2c\x1b\x57\xba\x5f\x4d\xc2\x87\x5a\xc0\xf3\x19\xbf\x62\x02\x3f\x6c\x7d\x92\xda\xbd\x6a\x2f\xd3\x18\x7e\xb9\xb5\x94\xcf\x5e\xaf\xef\xdb\x50\xe2\xf4\xf4\x65\x56\x7c\xd9\xef\x4a\x64\x9e\x23\x42\xf7\xdc\x83\xc9\xd4\x78\x30\x5e\x3a\xae\xc5\xca\x47\x5c\xf2\x69\xab\x85\xdd\xd8\x19\xdc\x50\x0d\xab\xde\x9f\xb6\xe5\xcd\xa2\x36\xa7\xee\xdf\xc7\xcc\x02\xe3\x2b\x07\xb2\x6a\xb7\xd9\x67\xfe\xe1\xcf\xce\x8e\xf6\x0f\xdf\x1c\x8d\xf3\xf4\x11\x0a\x69\x26\xd2\x42\x72\xa1\x55\x5b\x0b\xbf\x5d\x3f\xf4\xae\xe2\xdd\xbf\x76\x3f\x3a\x9c\x1f\xce\xad\x1f\x77\x22\xe8\x72\x90\x32\x4d\x79\xa6\x02\xee\xd2\xb2\x90\x99\x9c\xad\x6e\x80\x76\x0f\xb6\xf9\x03\x22\xe4\x8e\xe8\xc8\xf0\xe3\xfa\x8c\xdd\xf6\x7d\x94\x9b\x76\x2e\xf6\x4d\x36\x84\xac\xa9\xe5\xed\x46\x68\x77\xfc\x04\x08\xf6\x19\xcd\x88\x25\x2a\xa2\x3b\x07\xc4\x9b\x6b\x42\x51\x77\x75\x08\xba\xab\xdf\xd5\xbe\x58\x0f\xf1\xdb\x9a\x16\x46\x92\xb7\x6d\xe3\x1f\x53\xdd\x8d\x14\x6f\x20\x45\xc9\x46\x1e\x36\x1b\xda\x7b\xcb\x32\x50\xcb\xc2\xfd\xc4\x79\x82\x9d\xdf\x18\xaf\xca\x16\x4d\x8f\x70\xad\xc9\x7b\x47\x3c\x62\x11\x66\xd9\xa2\x6e\x8d\x62\xbd\x61\x74\x86\x70\xd8\xa5\x0d\xc8\x15\x25\xbf\xe2\x19\x9b\x41\xdb\x23\x2e\x66\x01\x8c\x53\x08\xfc\x64\xdb\x20\xc5\xc1\xa9\x37\xe6\xaf\xa0\xf5\x1e\x70\xd6\xc9\xdb\x0b\xe8\xa0\x05\x29\x15\x9d\x0d\x4e\xf3\x40\x58\xf3\xa3\xd1\x08\x5c\x7f\x7b\xff\x36\x96\x4f\x9a\x0d\xc8\xcf\xcc\x3e\x47\x42\x8b\xaf\x12\xda\xdc\xcf\xa5\xef\xb7\x04\xef\x5a\x53\x16\x18\x1a\xd3\xf8\xec\x55\xcf\xcc\x95\x46\xa3\xc6\xad\x3c\xba\x9e\x33\x80\xec\xae\xf3\x0c\x1e\xa3\x95\xb4\xa6\x0d\xb4\x67\x69\xef\x82\x4d\xab\xd6\x88\x4f\x1f\x70\xfb\x02\x25\x6a\x91\x67\x5c\x5c\xd6\x18\xf1\x53\x69\xf8\x18\xcb\x99\xb9\xb8\x74\xab\xa6\x64\x34\xbb\x79\xc7\x68\xc3\xa3\x6b\xdb\x2d\x74\x6f\xf1\x08\x88\x17\x18\x69\xf1\x77\x27\xbc\x6c\x02\x58\x28\xea\x77\x76\x1e\x35\xc5\xb8\x4a\x14\xef\x2e\xde\x61\x98\x48\xb6\x0b\x72\x7c\x7e\x70\x7e\xfc\x59\xa3\x7e\x37\x6d\xae\xf0\x76\x8f\xda\x7a\xe0\xbf\xb5\xcb\xaa\x1a\x91\xac\x6a\x7b\x27\xba\x5e\x4e\x65\xa9\x69\xb6\x06\xc1\x99\xcc\x69\xb1\x5f\xe9\xf9\x21\x57\x80\xd6\xd8\x8f\xfa\xb7\x34\x6a\x50\xaf\x88\x7d\xe8\x5c\xc3\x0d\xee\xd8\xd7\x5e\x77\xf0\xf7\xfd\x53\x42\x2b\xc3\x8f\xda\xb6\x18\x5a\x5b\xb2\x9c\xfb\x8a\x73\xac\x81\xee\x95\x32\x76\xcc\x4f\xd0\xc5\x5d\xb5\x49\x54\xf9\x7c\x55\x6f\xdb\x78\x34\xec\x5c\x28\xf5\x9f\x48\x0c\x9a\x0b\xae\x39\xd5\xb2\xec\x2d\x36\x18\x8d\xe8\x1d\x86\x95\xd2\x32\xb7\xab\xe8\xd8\x5d\x01\x09\x59\xa0\xbf\x2d\xdd\x54\x7b\x13\xc1\xfa\x04\x9a\x1f\x0b\x63\x2b\xd2\x84\x35\xca\x6c\x86\xd0\xfa\x07\xc7\xe6\xfe\x9a\x6f\xad\x13\x1d\x50\xec\xb3\xbf\xbd\x8c\x9a\x63\x2e\x75\x30\x76\x5e\xcc\xba\x3d\xee\xda\xbc\xd2\xfc\xb7\x7e\x44\x1b\xff\x4d\x34\xe2\x09\x48\xa2\xff\xae\x68\x86\xa4\x3d\x59\xa7\xf3\x3d\x9e\xd2\x7e\xbe\x38\xe6\x12\xfb\xf1\x35\x4b\x9c\x78\x6f\x5b\xa5\x10\xa3\x1f\x29\xa2\x4b\x2a\x94\xe1\x93\xd8\x9f\xb1\x6b\x13\x20\x76\xc9\x9e\x4e\x8a\xc1\xda\x28\xd5\x57\x39\x6c\x56\x89\x50\x59\xc5\x6f\xbf\x40\xd6\x78\xed\xcb\x61\xbb\x7d\xe6\xda\x93\x1c\x60\xb5\xf7\xe3\xb7\xb5\x63\x79\x3e\x0a\xe9\x85\x0a\x22\x79\xcd\x95\x76\x0d\x84\xe1\x04\x57\xb6\xd7\x1a\xd8\x02\xa7\x44\x96\x84\x17\xff\xa4\x69\x5a\xbe\x44\x3d\xc2\xda\xaa\xf0\x6f\xe5\xe1\xf0\xa9\xf0\xd9\x36\x7b\x7a\x51\xd8\x26\x1e\x17\x07\xa7\x04\x1b\x85\x7f\xf3\x97\xe7\x60\x17\x7c\xfd\xd5\x5f\x9e\x77\x64\xc4\xc7\x5a\x55\x48\xfa\xf6\x89\xf6\x9e\x59\xf1\x44\xaa\x48\xa2\x6a\x11\x43\x0b\xd0\x76\xcf\xb1\x38\xc3\xec\x93\x56\x68\xe2\x42\x30\x5c\xe9\x77\xef\x3e\x75\xe2\x6d\xd5\xc5\xef\xa8\xea\x82\xf8\x6a\x7c\x14\xac\xbd\x30\x72\x38\x20\xc0\xea\x2c\x0b\x70\x94\xdd\xa7\x8f\x45\x76\xb7\xa4\x6e\x5b\x4e\x8e\x39\x38\x4c\xf1\x73\xad\xf3\xeb\xf2\xd4\xc3\x93\xf3\x7f\xbe\xde\xff\xfe\xe8\x35\x7c\xab\xcd\x0a\x34\xec\x69\x2d\xa1\x36\x39\xeb\x77\x67\xf7\xf6\xce\xad\xb6\x24\xed\x23\xc1\x40\x34\x52\x0b\x04\x39\x79\x75\x7e\xdf\xac\x82\xae\xe6\xac\x98\x76\xa0\xde\x63\x8b\x6b\x40\xa7\x75\x56\xae\xa7\x72\xbe\xe7\xa0\x48\x00\x7b\x1f\xf9\x51\x0c\x0f\xe1\x37\x76\x76\x75\xb4\xe4\x0d\xb2\x71\xba\xde\xed\xf1\x6f\x43\x31\xa4\x62\xef\x91\xef\xcf\x4a\xed\x6e\x3a\x64\xd9\x17\xac\xc3\x2e\x8e\xe5\xd4\x47\x23\xc2\x70\xef\x28\xcd\xae\x6a\xf6\x53\xa6\x7c\x37\xe6\x27\xc0\xad\xc5\xaa\xd6\x83\xdd\x77\x87\x95\xc3\xda\x1e\xdc\xae\xf5\x52\x90\x55\x10\xd5\x75\xdf\xd4\xc0\xd3\x65\x64\x52\xeb\x08\x53\x05\x4d\x7a\x6d\x08\x5f\x9f\xc2\x33\x00\xbd\xf7\x18\x37\x18\x78\xf1\x35\x95\x97\xf9\x67\xf7\xb3\x1c\xfd\x70\x4d\xa4\x95\x7b\x71\x89\x6b\x5f\x5e\x48\x87\xa4\x13\x42\xb2\x6c\x24\x0b\x91\x8d\xdb\x87\xfc\x36\xf4\x73\x4b\x77\xc3\x3a\x5d\x0d\xc5\x5c\x6a\x29\x7a\xae\xa1\x5d\x35\x68\x2c\xd8\x4e\xe1\x8a\x03\xac\x74\xcf\x58\x19\xc8\x5b\xac\x20\xf2\x61\x75\x63\x79\xb8\xad\x5b\x0a\x17\x60\x8f\xc3\xeb\x8f\x4f\x12\x15\xe9\xf1\xe1\x1a\x84\xd0\x53\x03\x3b\xba\x6f\x98\x70\x6d\x89\xb2\x69\x4f\x95\xfb\x66\x20\x47\xf3\xe3\x43\x6b\x2e\xb8\xb2\x7c\x65\x97\x15\xb9\x79\x5d\xad\x45\x95\x92\xa5\xbe\x96\x65\x5f\xf0\x71\xf1\x70\x8d\x2c\x4c\xfb\xdb\x12\x18\xc7\xd3\x94\x22\xf8\x95\x8f\x5e\x92\x9c\x83\x24\x69\xb4\x41\xbd\x49\xa2\x3c\x84\x40\x79\x3c\x82\xe4\x61\x14\x97\x87\x45\xe2\x5a\x9b\xf9\xeb\x96\x47\x2f\xc4\x72\x83\x59\x37\xa8\x61\x94\x5a\xee\x52\x70\x37\x07\x92\x67\x2d\x72\xb6\x94\x46\x0e\xb5\x13\x27\xb1\x88\x75\x23\x61\x70\x10\xdb\x36\x66\x99\x99\x59\x29\xc2\x86\x8f\x16\xac\x6b\x48\xb0\x67\x62\x4e\x0b\xdb\x34\x3f\x95\xd7\xe2\x9a\x96\x29\xd9\x3f\x3d\xfe\xfc\x72\xb5\x73\x25\x28\xae\x87\x2e\xbd\x05\xe2\x5a\xd0\x7a\x3c\xc8\xc0\x87\x24\x21\xf3\xc7\x84\x6b\x85\xa9\xfc\x90\x8c\xaf\x43\x6f\x94\xd9\xa7\x7c\x26\x8b\x91\x74\x46\xaa\xd9\x91\x02\xb5\x4a\x10\x99\x68\x9a\xb9\x46\xcc\x4c\x5f\x33\x26\xc8\xf3\xe7\xcf\x31\x40\xf1\xfc\xbf\xfe\xeb\xbf\x08\x74\xdd\x4c\x59\xc2\xf3\xe5\x0b\xe1\xaa\x3f\xbf\x78\x31\x26\xff\xd8\x7f\xf3\x9a\xd0\x04\x6c\x39\x44\xbe\xc5\x91\x61\x3e\xc3\x9b\xd5\x90\xfc\xef\xf3\xb7\x27\x6e\xfb\x52\x8d\x5f\x81\x5d\xfc\xe7\x8d\xc9\x61\x90\x7b\x1f\x06\x0f\xa8\x9e\x03\x35\x84\xd4\x84\x4e\xa7\xc8\x70\x20\xb9\xb9\x72\xc2\xc4\x61\xcf\xf1\xd9\xdc\x75\xa2\x37\xac\x96\x41\x51\x00\x37\xaf\x08\x01\x1b\x87\xe3\x88\x35\x0e\x30\x96\xdf\x44\xe0\x55\x86\x24\xe3\x97\x8c\x4c\x15\xf4\xa3\xaf\x1b\xa7\x94\x4c\x19\x03\x2c\xa1\xc2\x8c\x8e\x83\xd5\x33\xa3\x58\x47\x6c\xcc\x75\x67\x4e\x74\xec\x5c\x1e\x87\x90\xed\x9a\x77\x2d\xc4\x6c\x6f\x40\x57\xa3\x85\x22\xc3\xcc\xc2\x63\xcd\x64\x88\xbe\xf6\xd4\x7f\x0f\x32\x95\x45\x3f\xac\x25\x23\xcd\xa4\x98\x85\x3c\x58\x6b\x1f\x2e\x99\x72\x51\xb0\xb6\xc4\xe8\xa9\xa1\x4e\x3f\xed\xe9\x50\xb8\xbf\xa1\x45\xb7\x4e\x20\x71\x8e\xae\x1b\x33\xc2\xa1\xa4\x13\x59\x69\x97\xb3\x67\x7f\x07\xf8\x36\x2d\x1d\xe9\x3b\xbd\x42\x6f\x5d\x8a\xfa\xeb\xfb\xd7\x53\xd3\xad\x38\x67\x0e\x76\xed\x58\x65\x1d\x12\x46\x93\x39\xb9\x64\x8b\x11\xee\x00\x05\x05\xf4\x08\xa0\xf6\xa1\xa1\x71\xd4\x86\xdf\x7b\x9e\x53\x63\x4d\xda\xa9\x70\x09\x96\x81\x7e\xe0\xd0\x27\x9c\xc1\xa5\xac\x5e\x6e\x5b\x59\x89\xc0\x43\xe9\x7a\x57\x26\x52\x68\xdb\x17\xd3\xf7\xae\x82\x84\xd1\x06\x20\x81\x91\x30\x2c\x35\xb7\xa9\xdb\x9e\x5c\x67\x95\x9a\x1d\xc5\xea\x1f\x95\x58\xba\x1b\xf0\xdc\x21\xa7\x57\x31\x8b\x8c\x44\x5d\x4f\xc4\x20\x33\x75\xce\x13\xa8\x38\x32\x97\xdb\x6b\x1d\x95\x3c\x21\x22\xc0\x04\xc5\x74\x65\x49\x03\x79\xc2\xe6\xd9\x4c\x29\xc2\xe1\x0b\x73\x5a\x5e\x32\x07\x34\x4c\xb3\x31\x39\x35\x2f\xe9\xd1\xe6\xb1\x95\xe0\x15\x16\x88\x18\x19\x13\x22\x41\x98\x87\xec\x8e\xc7\xbb\xb8\x55\xae\xc0\x85\xe8\xcc\x35\x7d\x76\x91\xeb\xad\x7b\x5c\xc4\xca\x6f\x68\xa1\xb0\x9b\x9e\x31\x2d\xa0\x63\xa5\x04\xdc\x16\x3d\x77\xca\x04\xed\x08\x21\x1e\x1e\x3d\xb7\x31\xeb\xb7\x13\x6a\x7f\x7d\x50\x3b\xc4\xda\xe3\xa3\xef\xfe\xa7\x3d\x76\x3f\xbd\xa9\xf7\xa9\xe5\x21\x2b\x49\xfa\xea\xc8\xd8\x7b\xcb\xcd\xbc\x87\xc6\x66\xee\x88\x43\x47\xa0\xdf\x46\x58\xd2\x77\xb2\x45\x2c\x94\x7a\xc6\x1e\x95\xf1\x71\x3c\x05\x91\xba\x1a\xeb\x26\xb4\xcb\xdc\x0e\x63\x28\xb0\x7e\xab\xa3\x6b\x97\x3d\x77\x3c\x44\x9b\xfa\xee\x66\x49\xf3\xe8\x92\x44\xd3\x3c\x62\x47\x46\x00\x2b\xe1\xb7\xda\xb0\xfa\x18\xa6\x4a\x4b\xe8\xd6\x59\x0b\x87\x31\x79\x63\xb7\x62\x64\x72\x3a\x51\x32\xab\xb4\x47\xa2\x58\xb1\x4f\xc3\xa0\xae\xb7\x27\x82\x36\xb9\xcb\x82\x5d\x1b\xf4\x15\xdc\xca\xfa\xd9\xc0\xf1\xe8\x51\xf8\x74\x4d\x90\xc5\xe3\x77\x96\x26\x8b\x47\x8f\xb3\xe0\xd4\xc5\x9e\x67\xc2\x0d\xeb\xd1\x3b\x5d\x45\x64\xa4\xdd\x42\x8e\xac\x56\xa8\x3a\x3b\x45\x15\x6b\x28\xdb\x22\x60\xd7\x47\x77\xaf\xae\xfd\x2e\xeb\x60\xdc\x3f\x3d\xee\xd1\x2a\x0d\x46\xbd\xc1\x2e\x0d\xaf\xd8\x5a\xa6\x77\x39\x22\x02\x1f\xa3\x65\x6a\x54\x7a\xe7\x40\x3a\xac\x29\x6a\x43\x7a\x46\x28\xff\x0e\x4c\x9b\xa5\x0f\x7f\x65\x36\xa3\xb0\x98\x2b\xee\xd0\x81\xce\xe0\x7a\xdb\x0a\xba\x7a\xb8\x1c\x1e\x10\x71\x4f\xdf\x0c\xda\x50\xe3\x05\xa8\xdf\xa1\x62\xa7\x79\xc4\xbb\xe8\x99\x23\x22\x39\x67\x99\xd9\xf4\x48\xc3\x65\x53\xc8\xf4\x25\xf6\xfc\xa6\x42\x48\x0d\x7c\xa3\x86\x24\x83\x7e\xe4\x43\x74\xc5\x18\x0d\x34\xc8\xfe\x2a\x83\xa0\x69\xcf\x3a\x67\x6f\xcc\x43\x7a\x67\x20\x02\x4c\x04\xb4\x3b\xed\x87\x93\xc8\x03\x70\x93\x39\x6a\x55\xa5\xcf\xb6\xfc\x11\x5f\xd9\xf1\x1d\x13\xa9\x64\xce\x72\x8a\xfd\x48\x1c\x81\x8c\xbc\xbe\x2e\xb9\xd6\x0c\x51\xc7\x59\x99\x2b\x22\xa7\xc3\x28\x6e\xbc\x73\xf5\x62\xa7\x2f\x7d\x96\x3c\x84\x41\x4d\xdc\x0a\x6d\x0b\x03\x76\xd3\x11\xc7\x0d\x22\xe3\xc2\xac\x4e\xb0\xa6\x33\x68\x90\x24\x1a\x0e\x4b\xa3\x44\x5c\x21\xfd\x37\x9a\x74\x0f\xe7\x8b\x68\xeb\x83\x18\x7a\xc5\x74\xeb\x83\xd8\xfa\x20\xfa\x18\xf1\xc1\x7c\x10\xc1\xc6\xed\x84\xe9\x0a\x7f\x44\x58\x88\xe7\x9c\x12\x35\x94\x45\x00\x13\x6d\x58\xde\xb9\x23\x64\x19\xc7\x0a\x76\xc7\xe3\xdd\x5d\xe7\xa4\xb0\xeb\xa3\xd2\xd3\xd1\x37\x84\x89\x44\xa6\xc8\x54\x66\xfc\x52\x69\x50\x6a\x6b\xab\x3c\x7c\x97\xdc\x3d\x2b\x8c\x37\xc0\xd8\xfd\xb2\x44\x8f\x12\xca\xa5\xa4\xbc\x7a\x50\x15\xac\x56\xbc\x3c\x0c\x98\x25\xa0\x47\x4b\xb4\x1a\x58\x9d\x22\x93\xf1\x9c\x5b\x7c\x42\x23\x2e\x98\xd2\x8a\xec\xe1\xc9\x71\x52\x54\x43\x7b\xc1\x38\x67\xb9\x2c\x17\x43\x7f\x91\xf9\x31\xba\xcb\x5e\x31\x00\xad\x2d\xa9\xca\x92\x09\x9d\x2d\x7e\xbf\xfa\x9b\x23\xf1\x06\xab\x6f\x9e\x2b\xba\xd4\x7d\xac\x3a\x62\xb6\xac\x9b\x08\x80\xf7\xce\x53\x1b\xf6\x21\x5b\x81\x31\xac\x9d\x3f\xe6\x2c\x13\x57\xe4\x8a\x96\xad\x2b\x30\x56\x1d\x0f\xa2\xb1\xa5\xfc\x8a\x2b\xd9\xba\x86\x6d\xe5\x90\x21\xf1\xce\xed\xa6\x8c\x3e\x62\x59\xe9\xa2\xd2\x76\x77\x71\x6b\xdb\x41\xf6\xf9\x35\xdd\x50\x7c\x5f\xec\xf4\xf8\x72\x05\xd5\x9a\x95\xe2\x25\xf9\x9f\xbd\xf7\x5f\x7e\x1c\x0d\xbe\xdb\xdb\xfb\xe5\xf9\xe8\xaf\xbf\x7e\xb9\xf7\x7e\x0c\xff\xf8\x62\xf0\xdd\xe0\xa3\xfb\xe3\xcb\xc1\x60\x6f\xef\x97\x1f\xdf\xfc\x70\x71\x7a\xf4\x2b\x1f\x7c\xfc\x45\x54\xf9\x25\xfe\xf5\x71\xef\x17\x76\xf4\xeb\x1d\x07\x19\x0c\xbe\xfb\x63\x8f\x1f\x41\xc5\xe2\x6d\x6f\x22\x18\x8f\xd1\x83\xa8\x11\xf1\xd8\x3d\xb3\x2e\x21\x1f\x46\xb5\x47\x7b\xc4\x85\x1e\xc9\x72\x84\x0f\x79\x49\x74\x59\xf5\x25\xba\xea\xed\xef\xe1\x64\x4c\xad\xc4\xd4\x08\x98\xce\xb0\xd9\x40\x21\x82\x89\xa9\x3d\x7a\x86\x6d\x1f\xdb\xd5\x4e\x61\xfb\xe3\xd6\x1f\x7c\x97\xe3\x01\x33\x95\x2c\x9e\xcd\xef\x3c\x4d\xe9\xdc\x76\x53\xde\xe6\x28\x2d\x1d\xdb\x1c\xa5\xe5\x63\x9b\xa3\x74\xcf\x63\x9b\xa3\xe4\x8e\x6d\x8e\xd2\xd6\x3f\xd8\xfd\xf8\x9d\xfb\x07\xb7\x39\x4a\xf7\x3d\xb6\x39\x4a\xad\x8f\x47\x94\xa3\x84\x4a\xfe\xaa\x4c\x25\xab\xe6\xd7\x69\x4a\x1b\x9b\xa5\xa4\x0c\x3f\x24\x6c\x3f\x49\x64\x25\xf4\x85\xbc\x64\x1d\x03\xb9\x0d\x9b\x74\x69\x74\x80\x44\xbc\xc1\x46\x5d\xbe\x78\x23\x0d\xd6\xbe\xf4\xd1\x1e\xf4\xc7\xfe\x34\x47\x5a\xa5\xdc\xd8\xa8\x3d\x2f\x16\x37\x6c\x08\x8b\x2d\x52\x96\xd6\x3f\x58\x91\xa6\xcd\x7c\x8f\xc9\x3e\x29\x59\xc2\x0b\x6e\x36\x00\xc0\x0a\x82\xf3\xb8\x7c\x7c\x17\x67\xae\x15\xcb\xa6\xb6\x93\xad\xa8\xcb\x9c\xcb\xc0\xfe\xb4\x3b\xca\xca\xc7\xa0\x0e\x21\x5d\xaf\x51\xa2\xe6\xb2\xca\x52\x52\xb2\x7f\x3b\xe5\xc3\xbe\xcd\x45\x38\x42\xe8\x52\x85\x4f\xa9\x1f\x6b\x07\xa7\x05\xb7\xa0\x62\x9b\x24\x06\xd9\x87\x82\x97\xb0\xd8\xce\x59\x22\x45\xda\xb7\x87\x64\x69\xfc\x5a\x57\x80\xb8\x10\x4b\x49\x5a\xe1\x05\x50\x8e\x49\x33\x9e\x72\xbd\xf0\xf9\x1c\xb8\xec\x8d\xda\x8a\xbd\x83\x2d\x23\xa8\x7a\x22\x08\x2d\x8a\x52\xd2\x64\xce\x54\xf0\x34\x54\x42\x2d\x50\x86\xaf\xf2\xcc\xaa\x19\x17\xa8\x87\xc2\x3d\x46\x59\xc9\x16\xa4\x94\xda\xa5\xa6\xdd\xf0\xc0\x8b\x60\x30\xb8\x1d\x35\x0e\x5d\x2e\x20\x7f\x4d\x86\x43\xe0\x5b\xf1\x69\xf8\x87\x22\x32\x4b\x1d\x34\xeb\x37\xcf\x8d\xe2\x9f\x58\x2e\x36\x9b\x00\x80\x66\x6a\x49\x32\xa3\x3c\x99\x8d\xe1\xe6\x9b\xbf\xfa\x13\x99\xcb\xaa\x54\xe3\x10\xec\xef\x05\x9c\x43\x0f\x87\x33\x1c\x34\xc9\x18\x55\x9a\xbc\x78\x4e\x72\x2e\x2a\xb3\xe3\xf7\xc4\x78\x7d\xe9\xba\x81\x96\xfb\x97\x3f\x75\x1c\xad\x1f\xfd\xf6\x46\xcd\xb6\xc0\x8e\x79\x56\xbd\xb5\x6b\x1c\x01\x3d\xb0\x6b\x66\x43\xd9\xb5\x5b\x52\x38\x8b\x42\xcb\x35\xaf\xfc\xdf\x2a\x39\x59\xe8\xee\x10\x36\x76\x9c\x18\xbb\xe6\xbf\xed\xc9\xbb\x40\xc5\xd6\x48\xb1\x2d\x5e\x65\xed\x3d\xbe\x67\x5c\xe9\x56\x1d\xbe\x6b\xcc\x9b\x16\x37\x77\xdd\xcc\x67\xc6\x3e\xee\xa5\x92\x1e\x46\x72\x16\x9d\xf3\x48\x27\x09\x53\x20\x8a\x1c\x28\x1c\x38\x77\xf1\xda\x96\x0f\xdd\x50\xb4\x99\x55\x20\x32\x8e\xf9\x7b\xe8\x55\xda\x89\x58\x5d\x54\x7e\xc7\xd8\x3d\x51\x0b\x07\x8b\x65\x84\xe2\x62\x86\xad\x45\xf3\x2a\xd3\xbc\xc8\x6a\xca\x9d\xb9\x1b\xec\x06\x1c\x46\x0b\x68\xe0\x9e\xa6\x08\x7a\x85\xe8\xe7\x10\x59\xd9\xf3\x63\x31\xa1\xb1\x43\x66\x69\xf6\xf1\x82\x96\xd4\x93\x3f\x91\x79\x4e\xd5\xc0\x06\x1e\x28\x64\xc1\xd8\x36\x40\xe6\x2e\x9a\xd5\x6f\x1c\x64\x1d\xac\x8b\x71\x35\x13\x54\xb4\x0e\xff\xc5\x80\xf3\x30\x14\x91\xd7\x3e\xd1\x1e\x9b\xdc\x37\x38\xd6\x2a\xc4\xdf\xd3\xe4\x92\x89\x94\xbc\x53\x8e\x70\xe9\x42\xd0\xdc\xe2\xc7\x17\xa5\xc4\x2e\xea\x2c\x6d\xdc\xaf\x86\xd6\xed\x88\xd0\x27\x0e\xc0\x0a\xf5\xad\x75\x51\xb1\x52\x3d\x81\x07\x9b\x81\x3e\x25\xef\x14\xba\x74\x4b\x7e\x95\x30\xa7\x3b\x9a\xfb\xd6\xf5\xf1\x57\xad\xd1\xea\xc8\x6a\xe8\x28\xdb\xc6\x14\x57\x21\x6c\xe9\x3e\x72\x09\x30\xf1\x34\x33\x22\x6e\xe1\x31\x7f\x1a\x0c\x36\x59\x80\xdf\x6b\x2d\xc8\x63\xe5\xa4\x3b\xa6\xd4\x6e\x39\x49\x63\x61\x76\x46\x53\xa9\xc8\xf7\x99\x4c\x2e\xc9\x21\x03\xa3\xe1\x21\x9b\xef\x97\x93\xf4\x71\x37\xce\xcc\xe9\xac\x5d\xc6\xc8\x88\xe4\x52\x70\x2d\xcb\x36\xf2\x78\x83\x80\x02\xb7\xad\x0c\xef\x82\x98\x6e\xd6\xd9\x53\x69\x64\x68\x58\xbe\x1f\xd6\x81\xa1\xbc\xeb\x04\x24\x0f\x9e\x02\xa1\xda\x5a\x8e\xfc\x61\x2e\xaf\x47\x5a\x8e\x2a\xc5\x46\xbc\x75\x22\x54\x67\x42\x5d\xb2\x05\x64\x95\xf5\x42\x2a\x3b\x58\x64\xb9\x6b\x09\x7e\x76\x38\x6f\xf4\xbb\xb3\xef\x0f\xdf\x29\x56\x8e\x43\x6b\xe5\x19\xd3\xc9\xb3\x84\x15\xf3\x67\x76\x84\x47\x4f\x56\x27\x36\xfb\xa1\xab\x1b\x0d\x15\x81\x44\x66\x99\x05\x18\x93\x53\x72\xc0\x8a\xb9\x7f\xdc\x66\xd0\xed\x31\xf7\x94\x2b\xa4\xec\xa7\xdd\xd4\xae\x19\x29\x16\x1b\x70\x06\xa5\x46\xc0\xfc\xe5\xe4\x7e\x8d\xbc\x37\x91\xdd\x3f\x63\x77\x96\x36\xad\xf8\x36\x82\xbc\x9b\xd3\xd2\x6f\x37\xea\xe9\x17\xd6\x0f\xc5\x0d\xfb\x5c\x76\x6a\x24\xb6\x8f\xa7\x68\x8c\xa6\x2c\x25\xf2\x8a\x95\x25\x4f\x99\x22\x5e\x6e\x87\x3e\x28\x9e\x6d\x06\xe5\xb7\xbd\x03\x1f\x57\xc2\xc1\xe6\xb8\x1f\x76\xc1\xff\x10\x09\x71\x38\xb3\x24\xc4\x69\x9a\x73\xb1\x19\xdc\xde\x92\x6e\x2a\xa1\x19\x3b\x7e\xdb\xd9\x5a\xb7\xe3\xc4\x06\xfb\xb9\x3d\x19\xf4\x14\xf8\x04\xce\xfe\x8f\x9e\x77\x89\x90\x69\xbb\x00\xda\x9a\xcd\xee\x19\xd5\xec\xba\xa5\x22\x34\xaa\x45\x7e\xdb\xfb\xc1\x3c\x7b\xdc\x66\xfb\x46\x74\x0a\x09\x56\x39\x42\xfe\xaf\x4b\xc9\xb2\xfc\xd4\x4f\x20\x09\xc7\x0a\x9b\xb2\x35\x5b\xb1\xb9\x35\xbb\x7f\x7a\x4c\x7e\xc0\xcb\xd7\xd7\x05\xa5\x94\x1a\x4d\x9e\x43\x99\x53\xde\x4f\x03\xf4\xe6\xa0\xcd\x7e\x58\x21\x11\x4e\xfd\xb5\xc4\x5e\x6c\x94\xa2\x1a\x6e\xb8\x2a\x59\x4a\xac\x3f\xe5\x89\xb5\x78\x58\x52\xa7\x9f\x46\x8b\x87\x87\xea\x92\x1d\xb8\xe6\x5d\xfd\x4e\xad\x45\x3b\x76\x02\x25\xc2\xe7\x3a\x11\xc5\x84\xe2\x90\xde\x10\x64\xe0\x81\xaa\x0d\x69\xe9\xbe\x58\x07\xd5\xee\x21\x79\x2d\x67\x5c\x38\x29\x26\x6d\x56\xcd\x94\xf2\xac\x1b\x39\xb7\x7a\xf2\xef\x4c\x4f\x56\x2a\x3b\x12\x74\x92\xb5\x4f\x99\x8c\x17\x81\x1f\x8e\xbc\xca\xe8\x8c\x30\xf8\xe3\x59\xca\x95\xf9\x2f\x39\x3f\x7f\x0d\xc1\xe0\x4a\x38\xfb\x12\xc2\x9c\x76\x6f\xf1\xa5\xd1\x28\x64\xd6\x27\x17\x50\x88\xf7\xd6\xc1\x23\x18\x8f\x70\x91\x9a\x4f\x67\x2a\x4a\x4a\xb6\x57\x60\xaf\x14\x5f\x77\x87\xa9\x8f\x13\x46\x2e\xe6\x3c\xb9\x3c\x0d\xe2\xbf\xb2\x34\xe7\x44\x70\x2a\x52\x52\x9a\xbf\xad\x6b\x37\xb2\x9f\x75\xda\x97\x43\x2d\x18\xcf\xed\xd4\x4e\x9c\x9e\x5b\x0a\xc2\x6f\x54\x29\x99\xf0\x3a\xff\x00\x3c\xd1\xf5\xf6\x9d\xc2\xf6\xbd\x3e\xaa\x80\xc2\xd9\x0f\x41\x50\xcf\x5d\xa1\xb5\x38\x8e\xb2\x57\x50\x15\x6a\x29\x5c\x38\xba\xad\x8d\x08\xc8\xe3\xbd\xb5\x34\xad\x87\x5b\x6e\x69\xea\xcc\xcc\x46\x88\xdc\x15\xbc\x5a\x06\x72\x26\x83\xed\xa1\xbd\xcc\x42\xbe\xb5\xa9\x6d\x66\xb2\x16\xd2\xb5\x2f\x4d\x5f\xe5\xfe\x6b\xe4\x07\xe1\x39\x1b\x34\x07\xd9\x53\xc8\xa2\xca\x30\xb3\xb6\x7b\x67\x57\x17\x63\xc4\xe7\xac\x21\x88\xbe\x69\x9d\x9d\x76\xc3\xf2\xbc\xfb\xd7\x2b\x3e\x8d\xfe\x4e\x81\x69\xf1\xfc\x2f\x7f\xfa\xd3\x63\xef\xf8\xd4\xcd\x71\xb7\xee\x96\x4f\x9d\x42\x6f\x2b\xb0\x19\x8e\xb7\xd8\x0c\x5b\x6c\x86\xf8\x58\x7b\x7c\xf8\xf3\xa3\x2f\xf4\x52\xdd\xd6\x47\x65\x5b\x57\x7c\x85\x8e\x55\x71\xfd\x54\xc4\x75\x46\x50\xf8\x1c\xb8\x09\x3d\xd5\x88\x75\xc7\x48\xd8\x22\x23\xfc\xbe\x90\x11\xfa\xab\x11\xeb\x0b\x05\xa1\x7b\x6d\xd8\xef\x07\xf1\xa0\xb3\xd8\xe8\x5a\x57\xdf\xb9\x9a\xbe\xaf\xa6\x1f\x7d\x79\xf7\x7b\xf3\x30\xec\xd6\xe3\xad\xf4\xb7\x38\x88\x37\x87\xa6\xbf\xbb\xab\x02\xb0\x7c\x2d\x8d\x74\x59\xa3\xe9\x4c\x3a\x7b\x1e\xf0\x55\x64\xab\xbd\x7b\x95\x17\xef\xed\x79\x23\x41\xc0\x9f\xde\xfc\xbc\x80\x6d\x80\xbc\x5b\x9a\xfa\xd3\x0a\x8f\x3e\xd1\x0e\xf8\x0f\x15\x1e\x55\x11\x6a\xae\xf3\x3a\x82\x80\x04\x15\x4e\x4e\xc2\xce\x34\xb5\x58\xd8\x3f\x3d\x26\x49\xc9\x00\xda\x81\x66\x6a\x4c\x56\x68\x78\x2e\x80\x64\x35\x42\xa7\xd9\x51\xad\x59\x5e\xe8\xae\x9c\xb7\x8d\x8e\xfe\xce\xa2\xa3\x0f\x1e\xa5\x98\x57\x39\x15\x23\x23\x2d\x20\x3e\x1a\xe5\x9d\x34\xf6\xc3\x31\xb1\x72\x01\xd5\x0a\xf0\x85\x42\x49\x73\x25\xf8\x6f\x15\xab\xdd\x15\x5e\xeb\xd8\x80\xe0\x0e\xbc\x47\xcf\xb4\x43\x8d\xaa\x21\x45\x12\xb9\x54\xc4\x65\x09\xe2\xe9\xe8\x04\x46\xa0\x96\x45\xae\x37\x3d\x67\xa8\xbd\x9d\x02\x48\x42\x7d\x55\x6c\x1f\xa2\x81\x48\xb3\x4c\x5e\xe3\xb3\x43\x7d\xc4\xcc\x9f\x79\x17\x8b\x4b\x32\x61\x24\xe7\x65\x29\x4b\x1b\x46\x0a\x5f\x07\xd3\x87\x8c\x9d\xc9\x4a\x34\xd8\x4a\x9b\xf4\x71\xce\xb4\x9d\x6a\x60\x15\x2d\x09\x15\x58\xc0\x69\xfe\xed\x32\xae\xe1\xd9\x4e\xde\x4d\xd8\x9c\x5e\x71\x59\x95\x78\xb7\x96\x64\xc7\xfe\x04\x7b\xef\x42\x56\xde\x77\x5e\x41\x85\x96\xff\x3a\xb5\x82\x4e\x27\xf5\x8f\x60\xe0\xa6\xd2\xb9\x23\x47\xec\x03\x57\x7a\xf9\x5b\x1c\x89\x5c\xcb\x89\x75\x70\xde\x95\x2a\xcc\x06\xfb\x53\xeb\xda\xdb\x98\xdf\xc2\xd1\x62\x4d\xf5\xea\x1c\x7e\xfa\x94\x9e\x6a\x11\x6b\xb0\x64\xde\x95\xc3\x3d\xbe\x1c\x56\xfc\xca\x96\xbd\xae\x36\x52\x51\xde\x2a\xc9\xb7\x1e\x3e\xcb\x22\xe3\xc9\xe2\xf8\xb0\xdf\xcc\x0d\x1c\xd3\x6d\x7f\xca\x67\x6d\x98\xf3\xe4\x7b\xaa\x58\x4a\xde\x50\x41\x67\xe8\x75\xd9\x3b\x3f\xfd\xfe\xcd\xc0\x70\x11\x78\x75\x8e\x0f\x57\xa6\x76\x9c\x87\x83\x9f\xac\xab\xce\x9d\x34\x49\xd7\x9b\xda\xb0\x34\x6a\x4b\xf2\xad\x0d\x02\x80\x78\x9d\xa0\x4b\xfb\xb4\x15\xea\xc0\x69\x13\x24\x0a\xd3\x37\x1c\xfa\x9b\x6a\x8a\xea\xab\x3c\xbd\x7c\x48\x02\x04\x7e\xf3\xdb\xbe\xf2\x6e\x31\xb0\x3b\xc4\xb9\xe2\x6e\x24\xba\xa4\x9a\xcd\x16\x87\xac\xc8\xe4\xc2\x30\xc0\x69\xe0\xc6\xc7\x4b\x27\xa8\x36\x94\x13\x9a\x90\xb2\xca\x18\xf6\x16\x6a\xc2\xae\x09\xc6\xd2\x5a\xd2\x71\xa1\x34\x05\xd0\x35\x1c\xff\xd6\x37\xba\xf3\x66\x75\xd7\x6d\x69\x84\xef\xf9\xc9\xab\x62\x88\x4a\xb3\x4a\x6e\xbd\xe5\xee\x1b\x13\x3c\xfe\xd3\x3c\x7b\x9f\xb8\xe6\x9d\x23\x98\x71\x77\x40\x58\xe5\x67\x55\x66\x36\x9f\x2c\x6d\xb4\x78\x05\x3d\xcd\xce\x31\xa2\x5d\x80\x4c\x30\x6f\x3f\x24\x93\xca\x28\x71\x4c\x45\x3e\xee\x65\xa8\xcf\xeb\x39\x86\xb4\xcd\x4d\x84\x16\x45\xc6\x31\x85\x59\x96\x36\x2e\x1d\x38\x34\x97\x2f\xbb\x8b\x68\xb9\xa7\x2e\x73\x3f\xdd\x65\x44\xae\x58\x39\xb9\x0b\x4e\xc5\x7d\xd5\x12\x5a\x70\x88\xe3\xdc\x59\x8b\x89\x26\x6e\xff\xf4\x18\xef\x5e\xe5\x38\x76\x3f\xe2\x0c\xda\xb9\x71\xe1\x0d\xdb\x33\x08\x2d\x17\x8f\xb4\xb4\x7f\x7a\x8c\xd0\x5e\x16\x6c\xa9\x76\x7f\x18\x3b\x81\x62\x92\x63\x8d\xf0\x48\x67\x66\x44\x4d\xa4\xf0\x0f\x65\xa2\xca\x19\x02\x34\xd5\xcd\xc6\x8c\xf1\x28\x16\xf5\xe8\xb5\xf7\xc4\xd8\x3a\x77\x57\x48\xee\x1f\xe1\xbf\x67\x44\xff\xde\x7b\x91\x90\xe2\xcc\x7e\xe6\xbb\xb3\xd7\xed\x26\xf1\x24\x1e\xc3\x02\xf2\x30\xc0\x1e\x2c\x68\xa9\x39\xcd\x48\x55\x66\x2e\x24\x88\xf9\xfd\x36\x8d\x6e\x4e\xaf\x02\xd0\xa2\x31\x21\x5f\xe0\xcc\x59\xc2\xe2\xfa\xc4\xe6\xbb\xd6\x8d\x5b\x65\xd9\x90\x4c\x39\xb4\x5b\xd7\xac\x20\x61\x48\xea\x9c\x8b\xc4\x98\x72\x62\xe4\xbb\xe9\xc0\x1b\x39\x03\xcf\x2f\x52\x88\x78\x82\xbe\xcb\xb2\x14\x80\x2c\xe1\x11\x66\xc1\x26\xe0\x6e\x30\x16\xe8\x41\x56\x29\xcd\xca\x33\x69\x36\x83\x20\xe5\x06\x40\x3d\x68\xf8\xf3\xf7\x5c\xa4\x90\x63\x75\x06\x1b\x47\x42\x05\x61\x1c\x1c\x39\x66\x48\x88\x9d\x1b\xde\xa9\x19\x6a\x4f\x55\xc9\xdc\x7c\xd2\x4e\x21\x53\xb5\x63\xc4\xc8\x0e\xba\xfb\xd4\xce\xc0\xfc\xd5\xfc\x06\xcc\xa0\x09\xee\x7b\x46\x0b\xbe\x33\x18\x12\x20\x10\x04\xef\xa4\x9e\x3f\x5e\x3e\x74\xdf\x0a\xf6\x75\x2b\x2e\x3c\x0b\x47\x00\x1e\x14\x75\x98\xee\x7a\xce\x35\xf3\xad\xd1\xd1\x4b\xe4\x51\x6a\x9a\xc2\x9a\x90\x7d\x41\x58\x5e\x68\xf0\x3c\x93\x9c\x51\x17\xce\x66\x57\xac\x5c\x18\xfb\x1e\x50\x3c\x1e\xfd\xe2\xf7\xfc\xd8\x89\xe0\x8d\xbe\xf3\x35\x93\xc3\x0a\x5b\x22\xee\xee\x17\xbb\x91\xcf\x20\xcb\x02\x69\xfe\x68\x49\x09\xdb\x6b\x2b\x32\xfe\x64\xee\x8c\x49\x88\xa7\x50\x5a\x7a\xf9\xf1\xfa\xb5\x0d\x8a\x20\xad\x7e\xe4\x22\x55\xbe\x13\xa2\xcd\xd9\xb6\xf4\x5e\x49\x64\x78\xc3\xc7\x48\xe0\x65\xf5\xf5\xae\x2a\xe7\x2d\xc3\x3b\x8d\xfd\xa6\xa1\x6e\x1d\xc0\xaa\xfd\x6f\x64\xba\x7a\xe9\x44\xf3\x7b\x1c\x5c\xec\x13\x05\x6a\x9f\x89\x1d\xcb\xaa\xaa\x8b\x62\xa5\x3e\x7f\xfb\x74\xdc\x42\xfa\x9b\xde\xa4\x76\x16\x80\x9c\x0c\x7e\x01\x4f\x10\x62\x94\x93\x69\x46\x67\x35\x1b\x81\xd4\x43\x25\xe9\xe0\xfc\x27\xf7\x09\x8a\xf0\xd5\xea\xea\x27\xf5\xd9\x4f\x69\xb0\xa3\x9a\x4a\x37\x5e\x61\x1e\xb2\xf2\xc7\x4f\xab\xb1\x7e\xf0\x9b\xb9\xe9\x2e\x81\x42\x7d\xab\x13\xee\x26\xfa\x3b\x7f\x1b\x0d\x38\xc1\x81\xad\x39\xa3\x12\x72\x9f\x40\x0f\x39\xff\x29\x62\x93\x4f\xbc\xef\x0d\x4c\x7b\xc9\x16\xd7\xb2\x5c\x8d\xa3\xde\x9a\xbf\x6e\x7d\x62\x46\x27\x2c\xfb\xf4\x02\x79\x43\x0b\xf3\xd9\x75\xa2\x29\x5a\xde\x36\x4e\x89\xba\x3f\xe6\x84\xb9\x3c\x3c\x59\xce\xa8\xe0\xff\xc1\xec\xdc\xc4\xac\x63\x59\x9a\x3f\xf7\x30\xd6\x81\x76\x7b\xc6\x12\x3d\xb0\xfc\xb7\x52\xee\x7d\x82\x41\x69\x9a\x72\xd4\x1e\x4e\x3f\xc1\x4b\xb7\x13\x81\x8b\xcb\x87\xa0\xf9\x2d\x0b\xeb\xd3\xbc\x7f\x7b\xb0\xf4\x0e\xb2\xb9\x2a\x6f\xc9\xa3\xba\xf5\xfe\x9c\x72\xdb\x55\x77\xe3\xa8\xc2\x72\xca\xdb\x7e\x16\x1e\x1d\xe8\x9a\x53\x5d\x95\x5c\xaf\xdc\x90\x6e\xbf\x91\x8b\x1f\xab\x09\xb3\xf1\xe1\x7b\xdf\x2e\x20\x4d\x70\xff\xf4\xb8\xdf\xe9\x88\x56\x38\x58\xf1\xf6\x05\x8d\xde\x42\x2a\x41\xf3\x09\x9f\x55\xb2\x52\xd9\x22\x74\x4a\x52\x08\x6f\x1b\xa3\x1e\xbd\x32\xff\x1f\x7b\x57\xf3\xdb\xb8\x8d\xc5\xef\xfd\x2b\x08\x5f\x32\x13\xc4\x1e\x2c\xda\xd9\xc3\xdc\x82\x24\xc5\x06\x9b\x8f\x81\x9d\xb6\x97\x1e\xca\x48\xb4\x2d\x44\x22\xbd\xa4\x64\xc7\x2d\xfa\xbf\x2f\xf8\xf8\x48\x89\xb6\x44\x51\xb1\x93\xa6\xc5\xf8\x92\x19\x89\x7c\xe2\xe7\xe3\xfb\xfa\x3d\xf2\x93\x92\x50\x2e\xf8\xb6\xc0\xa2\x3c\xc9\xab\x94\x79\x14\xc1\x0b\xb8\x16\x59\x4a\x68\x55\x8a\x82\x96\x59\x42\x12\xc1\x64\x02\x1e\xc3\x26\xa5\x4a\x31\x42\x3b\xea\x26\x95\x2a\x45\x41\x0a\x2a\xd5\x92\xe6\x79\xd7\x1c\x1f\xe1\x54\x0b\xa5\x1e\x1f\x43\xff\x3b\x5f\xae\x4d\xab\x5f\xb8\xbe\x7b\x32\xad\x47\xac\x6f\xdd\xb8\x83\x08\xac\xbb\x57\x69\x04\x0d\xc4\xf8\xb7\x66\x2f\xea\x99\x98\xbe\xd1\x09\xed\xdc\xde\x7e\x05\xb8\x61\xb0\x2e\x04\xe9\xb2\xf4\xba\xa0\x8b\x08\x41\xf2\x46\x6b\x07\x94\x6f\x6d\x35\x93\x68\x53\x9d\x11\x21\x31\x6a\xc4\xdd\x8b\x8e\xaf\x5c\xb2\x56\x49\xee\xc1\x1d\x27\x24\x86\x6f\xe3\x2a\x85\xa0\x7e\x26\xe7\x42\x16\x5a\xae\xcb\x24\x99\x57\x1c\x8c\x64\x0a\xa3\xbd\x41\x25\x41\x5b\x0d\xcd\x95\x70\x3b\x10\xfc\x7b\xdc\x36\x82\x50\x45\x36\x2c\xcf\x27\xe4\x3c\xcf\x31\x03\x68\x23\xd7\x43\x8d\xd7\xae\x63\x0a\x1e\xb7\x24\xcd\x16\x4c\x95\xe4\xc3\xec\x3f\xe7\x1f\xe1\xd4\x06\x3b\xc6\x96\x94\xd4\xc2\xd5\x7c\xfb\x0c\x9c\xff\x69\x05\x72\x42\x42\x4b\x9a\x8b\x85\x71\xab\x83\x9d\x96\xa7\x64\x95\xd3\x2d\xa4\xf7\x5f\x51\x09\x11\xa7\x89\xb1\xd1\x10\x59\x71\x48\x6c\xfc\xa6\x27\x4e\x3f\x2b\x08\xe5\x1e\x1e\xc3\x9a\x7c\xe1\x56\xef\xc9\xf0\xfa\xba\x47\x99\x64\xab\x9c\x76\x58\x15\xbc\x15\xfd\xe0\x81\x91\xb5\x98\x0b\x2a\xac\xe0\xcc\xd1\x98\x90\x99\x59\x3b\x05\x2d\x13\xe3\xd3\xfc\xad\x60\x25\x4d\x69\x49\x27\x5a\x17\xfc\xcd\x47\xc6\x89\x3c\xd5\x84\xba\x27\xba\xa3\xcd\x46\x5e\x6c\xbf\x10\xdf\xdf\x85\x5a\xa8\x75\xc5\x41\x3e\xb7\xfb\x31\x68\xc6\x38\x90\x3f\x41\xf7\xaf\x9e\xb5\x2a\x16\xf4\xa1\x79\x6d\xdd\xad\xe4\x5b\x19\x72\xbf\x27\xb8\x5a\x0b\x06\x69\x22\x1f\xf0\x26\x24\xfb\x04\x4c\xa8\xe7\x77\x97\xdd\xe6\xae\x7e\x93\x41\x8f\x89\xc0\x77\x0c\x04\x9a\x67\x0d\xcc\xf8\xc6\xf7\x0e\x58\x38\x0c\x00\x08\x0d\xb8\x84\xda\x6c\x30\xb6\xb0\x99\x30\x1f\xfa\x68\xea\x75\xdb\x47\xa2\xdc\x33\x31\x4e\x99\x3e\xa4\xd9\xd8\x35\xb6\xb3\x50\x9c\x8f\xa6\x17\x0d\xd6\x85\xf6\x32\x23\x0f\xe0\x10\x6b\x22\x75\x83\x1d\xeb\xd3\x8a\xb4\xef\xd8\xae\x0e\x68\xa8\x9b\x4a\x2f\xf0\xe8\x89\x6d\x4f\x14\xa2\x5e\x04\x57\xcb\x6c\x65\xe0\x8a\xe8\x86\xc0\xd9\x25\x3f\xd3\x3c\x4b\x1d\x09\xb3\xaa\xaf\xf9\x19\xb9\x13\xa5\xfe\x73\xf5\x9c\xa9\xd2\xa8\x9f\x97\x82\xa9\x3b\x51\xc2\x93\xa3\x74\xd5\x34\x61\x40\x47\x51\x01\x36\x96\x6c\xd8\x57\x0d\x35\xd9\x76\xe8\x1a\xd9\x9e\x1d\x94\x4c\x91\x6b\xae\x25\x02\xec\x91\x83\xf1\x2a\x24\x61\x31\x28\x5c\xf0\x31\xd8\xb8\x5b\x69\xe0\x40\x08\xe9\x8d\x43\x80\x1c\x92\x32\x01\x80\xf0\x26\x53\x96\x89\xbb\x33\x9b\x5a\xb3\x5b\x96\x90\x82\xc9\x05\x78\x6d\x92\x1e\xaf\x45\xac\x29\x32\xca\x00\xd9\x3b\x57\xc0\x32\x6f\x3a\x0d\x17\x7b\x93\xd4\x28\x6f\xd8\x52\x61\xac\x19\x7f\x68\xee\x03\x23\xf5\x27\x60\xb9\xd5\x84\x9c\xdb\x6b\x66\x9a\xef\xd0\x7b\xd5\x24\xa3\x29\x64\x8a\x68\x56\xb2\xa6\x39\x33\x59\xf6\x29\x77\x78\x2b\x31\xdf\x63\xec\x67\x88\xe9\xd6\x7b\xd6\x89\x4c\xa3\x27\xb6\x1d\x9d\xed\x4d\xed\xe8\x9a\x8f\x6a\xd0\x9d\x37\x99\x8e\x89\x82\xb4\x35\x82\x77\xa3\x97\x9f\x05\x41\x66\x19\x6f\x5e\xe9\x9d\x37\xf5\x94\xb5\xbb\x9f\x5b\x85\x8d\x0f\xea\xa3\x1e\x42\x70\xf9\x4a\x52\x08\x09\xe6\x4c\xfd\xb4\x99\xde\x43\x8b\xaa\x4f\xd9\x6a\x55\x67\x43\xa9\x56\x0b\x49\x53\x46\x16\x92\xae\x96\x43\xc5\x12\x23\xdb\xb4\x91\xff\xdb\x08\xba\x1d\x83\x1f\xd0\xe8\x82\xf5\x36\xec\x71\x29\xc4\x13\x40\xe1\x60\x21\xbc\xa2\xfd\xe1\x17\xf3\xad\xcb\xfa\x99\x55\x25\x15\x49\x59\x49\xb3\x1c\x62\x39\xee\x6f\x6e\x31\xda\xc3\x9e\xe3\xb6\x95\xed\x81\x13\x47\x50\x00\x68\x8a\x51\x48\x53\xb6\xce\xd8\x06\xad\x12\x5d\x71\x1a\x63\xb2\x60\x1c\x82\x13\x02\x41\x3c\x63\xa2\xb2\x94\x5d\x01\xf0\xb6\x9b\xd0\x01\x86\xf3\x8e\x36\xf7\x6d\xde\x30\x07\xef\xe5\xde\x11\xa7\xac\x53\x7f\xbf\x0a\x19\x48\x04\x14\x87\x03\x8e\xc3\xf8\x62\x24\xf9\x17\xf2\xc3\x0f\xdf\x77\x16\x2a\xe8\x73\x56\x54\xc5\x17\xf2\xef\xcf\x9f\xbf\xff\xdc\x5d\x2c\xe3\xa6\xd8\xbf\xba\xfb\x87\xbb\xed\x62\x7a\xf9\x0e\xc6\x3b\x75\xd1\x74\x61\xa7\x5c\x04\xa9\x39\xcd\xf2\x4a\x62\x1c\x67\xa4\x8a\xf0\x63\xb3\x0e\x38\x54\x6a\xe0\x03\xb5\x14\x6d\xb0\x17\x06\x81\xcd\x33\xce\x14\x5c\xe0\x52\x71\xc9\x12\xb1\xe0\xd9\xef\x2c\xb5\xf7\xb7\x40\x60\x07\x64\x7a\xb7\x4b\x9c\x30\x9e\x9a\x7b\x34\xf5\x99\xb7\xa4\x3c\xcd\x43\x0e\xff\x88\x9e\x36\x77\xf0\x41\x43\x06\x27\xcf\xa0\x01\xbb\xad\x6b\xec\x0c\x17\xdc\x06\x8a\xee\x27\x73\xa2\x99\x61\x3b\xa8\xa7\x86\x31\xce\x02\x8a\x75\x4b\x1b\xf7\xf4\x3e\xa3\xb2\xc2\xb3\xff\x55\x4c\x6e\x01\xe4\x51\x0b\xf6\x8d\x40\xb0\x87\x3a\x87\x80\xed\x06\x4a\x54\x26\x89\xcb\x8e\x2e\x5c\x0b\x31\x75\xb8\xc7\xce\xb7\xa1\x0e\x33\xee\x73\xeb\x48\x22\xe7\x84\x57\x79\xde\x55\x94\x8b\x90\xcb\xa9\x39\x76\x3d\xaa\x64\x9c\x8e\x17\x6b\x16\x68\x19\xe9\x37\x35\x0e\x34\x3b\x7e\x24\x51\xfe\x7d\x9b\x0b\x9a\x1d\x8e\x8a\xe9\x8c\x8f\xe7\x8c\x4b\x55\x13\x61\x46\x30\xbf\x21\x01\x9f\x91\x09\x66\x5e\xd3\xb0\x60\x7e\x83\xe2\x73\xe2\x8c\x0c\x2d\x4d\x7f\x77\xa6\x86\x17\x74\x3e\xc6\xec\xd0\xd2\xf5\x6f\xc6\x87\xbd\x01\x8f\x8d\x86\x1a\x10\x09\x15\x39\x93\x11\x46\x09\xf3\xfb\x66\x9a\x18\x74\x12\x45\x30\xe6\x61\x66\x8a\xe8\x59\x95\x2c\xe3\x6b\x61\x12\x3d\x0f\x92\xe1\xa6\x7b\x15\x77\x44\xb9\x0d\x70\x56\x94\xe5\x9c\xf0\xdb\x14\x69\xb5\x42\x4b\x2a\xd5\x6f\xec\x0e\xf7\x20\x8c\xfd\x38\x8a\x0e\xe2\xf7\xbc\xca\xd9\x2f\x59\xb9\xbc\xb7\x89\xdd\x71\x55\x97\xd5\x2a\x87\xce\x36\x5e\xe8\x25\x34\xad\x25\xc3\x6b\x73\x95\x18\x4b\x44\x51\x30\x9e\x9a\x20\xa2\x82\x3e\x31\x52\x5f\x57\xa9\x65\x3c\x10\x83\x81\x1c\x7b\x5e\x51\x5e\xcb\x89\x6b\xcd\xcb\x43\x2b\x2a\x72\x3d\xc5\x9e\xb5\xd1\xa0\x8a\x30\x98\xa2\x81\x86\xf0\x40\x13\xe4\x91\xe5\x02\x60\xd8\x26\x52\xd4\xc4\x32\x63\x51\x60\xc9\xf8\x14\x4f\x3d\x4c\xfa\xc8\xf8\xa2\xce\x25\xa5\x72\xb8\x58\x16\x39\xb0\xe0\x6c\x42\xa6\x28\xc2\xc4\x49\x45\x31\xec\x34\x92\x95\x46\x1f\x88\x75\x1e\x85\xc1\x23\x6b\xeb\x35\xc7\x76\x6d\x9f\xc5\x8c\xae\x2d\xfc\x4f\x1e\x5f\x77\xe9\xc2\xb0\xe1\xf5\xb7\x74\x7d\x2a\xb8\xb1\xdd\x61\x5e\x89\xb9\xb6\x18\x4c\x75\x63\x72\x31\xbd\x3a\x7f\xb8\x3a\x23\x3f\x7d\xbd\x84\xbf\x97\x57\x37\x57\xfa\xef\xc5\xfd\xdd\xdd\xd5\xc5\x83\x96\x23\x4e\x4d\xfa\x78\xad\xc6\xe9\xd1\xd5\xe7\x91\xf0\xb9\x05\xe5\x5b\x32\xaf\x4a\xcd\x0e\xea\x8f\x79\xad\xa0\xc6\x06\x40\xd3\x54\xab\x8c\x7f\xbb\x39\x6c\x1f\xf0\x5d\xb3\x49\xf3\xde\x0c\x93\x71\x1f\xc1\x52\xfd\x62\x52\xf4\x22\x89\x46\x1d\x78\x4d\x1e\xbd\x10\x6e\xf0\x2b\x27\x3f\x0a\x49\xf0\xa2\x31\xb8\x79\x32\x55\x27\x08\xea\xd0\xff\x9e\x98\x47\x9f\x72\xb1\x38\x71\x58\x0f\x46\x72\xb1\x20\xaa\x7a\x74\x18\x1c\x38\x4d\xa1\xf4\xa9\x2d\xe6\x41\x17\xce\x1c\x10\xa7\x51\xcb\x11\xf7\xea\x34\x0b\x34\xe9\x7e\x82\xdb\xc1\xbc\x92\xfa\xc1\x2e\xc1\xd3\x4f\xed\x2d\xb0\x82\x53\x26\x77\x6a\xfc\xca\xf5\x72\xdd\x64\x79\x9a\x50\x99\xee\xad\x59\x38\xdc\xcc\x94\xc3\xe8\x99\x94\xb9\xe6\x26\xe7\x9a\x38\x26\xba\x10\x6b\x26\x73\xba\x32\x11\xe2\x90\xb3\x18\x42\x8f\xe0\x23\x97\x6c\xc5\x00\x07\x65\x6f\x1a\x67\x3c\xc9\x05\xe4\xd4\x30\x27\xe3\x99\xdf\x75\x13\x8a\x64\x13\x0f\x22\x98\xa6\xde\x21\xa3\x77\xcb\xe6\x20\xcc\x78\xd0\xea\x35\x81\xc9\x9d\x89\x59\x1c\x6e\xc3\x28\x8d\x4e\xf2\x65\x64\x84\x28\xb3\xd1\x19\x19\xb9\xdc\x23\x29\x4a\xc9\xa3\xd3\x51\x5d\xa0\x89\x53\x02\x21\x19\x5d\x42\x63\xf8\x4e\x13\xcd\x08\x13\x6c\x1d\x57\xee\xd3\x75\xfe\x18\x7d\xb4\xa1\x11\x0b\xda\xe0\x13\x9a\x78\x0d\xd9\xfb\x6a\x0d\xb1\xeb\xfd\xa2\x6e\x7e\xa3\x7a\x09\x70\x74\x03\xd5\xc3\xc1\x91\x4c\xcf\x86\x0d\x48\x9b\x79\x8b\xc7\x39\xde\x9a\x09\x6e\x32\x49\x56\x54\x6a\x55\xc4\x96\xf4\xaf\x28\x3b\xed\xbd\xa0\x2c\x62\x11\x34\xfc\x2b\x91\x52\xfb\xcc\xd5\xb8\xc8\xa9\x52\x2d\x96\x57\x60\x04\x9a\x30\x61\x86\x32\xa1\xd6\xf9\x04\xf9\xa7\x97\x74\x1d\x48\x50\x10\xd1\xe8\x92\xca\x05\x2b\xc3\x9e\x11\xca\xb7\xf7\xc1\x94\x66\xe3\xe8\x24\xaa\xe3\xb8\xdd\xf4\x3c\xae\x13\x68\x8d\x33\x5e\x8e\x85\x1c\x9b\x2a\x5f\x48\x29\xab\x2e\x1f\x57\x99\x15\x4c\x54\xe5\x8c\x25\x82\xb7\x23\x1a\xb0\xdc\xd1\x5c\x3d\x03\x60\x1e\xe8\x6d\x3c\xb7\x62\x44\x33\x09\xa1\x55\xcc\x6a\x19\xc3\x7a\x18\xfd\x34\x2a\xf7\x37\xb7\x87\x4c\x36\x01\x18\x73\x78\x26\x7f\x46\xb6\xcf\x17\xae\xa5\xd8\xf2\x60\xb5\xdb\xaa\x1c\x5e\xe9\xc2\x79\xae\xc2\xa5\x71\x30\xc2\xa9\x30\x3a\xfb\xaf\x4a\x5a\x56\x7b\xab\xc1\x9b\x1b\x64\x96\x33\x03\x29\x43\x99\x7e\x06\xf5\x9a\x46\xbe\x7d\xfc\xbf\xc9\x29\x02\xe5\x6c\xb0\xe2\x84\x60\x45\xbd\x3f\x4b\x49\x33\xa3\x40\xd2\xa4\xac\x00\x9b\x4c\x4b\x0c\x6c\xc4\x04\x38\xdf\xb5\x75\xa3\x55\x65\x0c\xa9\x89\x09\x93\xa5\xba\xa1\xaa\xfc\x69\x95\xd2\x0e\xf4\xd2\x4e\xc0\xa2\x2a\x61\xc3\x18\xc1\x7a\xc3\x59\xaa\x39\x3c\x0e\x81\xa1\x47\x36\x9a\xf5\x56\x86\xe2\x50\x4f\x7e\xbd\x81\x74\xf5\xb1\xfe\x54\x7b\xab\xa7\x42\x8f\xc9\x79\x2b\x03\xf2\x43\x35\xfa\x5a\xab\x8f\x13\x09\xd4\x08\x67\xcf\x6d\x1a\xf7\xe1\x2d\xce\x19\xe5\xed\xe1\xf2\x3b\x2b\x0a\xca\x0d\x5f\x43\xf8\x01\xb2\x59\x66\x5a\x64\x35\x28\x2f\x45\xac\x08\x95\xb2\x9c\x75\x80\xbd\x0e\x0c\x25\xc5\x2f\x5c\xe2\x07\xa2\xc2\x9c\xbe\xfa\x75\x9c\x41\x1f\x85\x70\x04\x4f\xd4\xc2\x32\x4a\x0f\x4e\x6b\xda\xed\x15\x88\x2f\x8f\xb9\x48\x9e\x4c\x42\x30\xc0\xf3\x67\xbf\x33\x69\xe3\xce\xeb\xcb\xc0\xf0\x86\xaa\x85\xbd\x7d\xd3\x8e\x9b\xbd\x8e\x08\xa8\x68\xda\x7a\x00\x1d\x7d\x21\x6b\xcb\x62\xc5\x11\x3d\xf7\x36\xa1\xab\x56\x51\x81\x78\x7d\xcf\x73\xb0\xaf\xb3\x98\xdc\x21\x90\xaf\x10\x55\x46\x5a\x20\xba\xe5\xd3\x7f\xbb\x91\x20\x47\x0d\x47\x0d\xe1\x51\x4c\x09\x18\x3e\x9e\x04\x53\xcd\x04\x91\x2b\xb1\x96\xaf\x1e\x84\x0a\x89\x17\xd2\x5d\x93\x63\xa8\x1d\x35\xb8\xf0\xe8\xde\xbe\x4e\x18\x40\xfd\x1b\xe2\xc3\x8b\x4d\x94\x3a\xc8\xcb\xc4\x87\x24\xb4\xf4\x93\x87\x38\xb5\x03\x41\x9e\xc6\x13\x3f\x17\xb2\x53\x81\x39\x5e\xe3\xc3\x78\xa6\x5e\x42\x5a\xfa\xec\x8e\x5d\xdb\x07\xef\x68\xee\xe5\xaa\x9c\x11\x4a\x96\x99\x2a\x85\x44\xd7\x1a\x5c\x26\x26\x29\x5c\x76\xda\x1e\x03\x76\x9c\x68\xb8\x0b\xd7\x04\x42\x57\x2b\x46\xdd\x3d\x43\x78\x36\xc1\x45\x41\x92\x25\x42\xa6\xad\x0d\xb3\xda\x7d\xab\x2c\xd5\xfa\xf9\x23\x60\x33\x73\xaa\xca\x07\xd7\x06\x2d\x20\x44\x72\x63\x5f\xfc\xc1\x2e\xd6\xbd\xb1\xe9\x5c\x04\xaf\x5f\x0a\x42\xb9\xb1\x6a\x1c\x26\x83\xf7\x0b\x19\x75\xdf\x8c\x34\xf7\xa2\x7e\x6d\x9c\xe4\xd6\xe8\xe2\xdb\xb4\xbc\x60\x4a\x05\x81\x46\x3b\x41\x1a\x90\xd3\x97\xb8\x9c\xbe\x58\xdd\x1e\xf6\x46\x40\x30\xe1\x98\x36\xeb\xd6\xb6\x7b\xa9\x11\x10\x13\x8c\x41\xc1\x6d\xab\x83\xa6\x6c\xb5\xa4\x2a\xb6\x33\x6e\x17\xb9\x10\xdf\xe8\xed\x10\xd9\x1a\xc9\xa8\x0a\x41\x25\x77\xc6\xf6\x51\x66\x6c\x4e\x2e\x68\xc1\xf2\x0b\xaa\x8e\x39\xb8\xc0\x01\x26\x84\x4d\x16\x13\x72\x32\x6d\x78\x5b\xef\x44\x79\x1b\xba\x73\xa1\x27\x3b\x40\xcc\x8e\x7e\xd5\xbd\x7c\xb0\x92\xd0\xbf\x73\x0f\xdc\xb3\x07\xb7\x30\xb0\x43\xdf\xc5\xde\x0c\xe3\x7d\xbb\xf6\xa3\xbf\x13\x2b\x09\x16\xbf\xe4\xa5\x3b\xb2\x07\xcc\xd8\xb5\x0b\xdf\xf3\xfe\xeb\xe9\x92\x23\x31\x6b\x35\x99\xec\xf5\xee\xc1\xd3\x5c\xc1\xec\xdf\x0c\xb0\x33\xb7\xfd\x67\x4a\xab\x60\xc7\x14\x5b\xfe\x5a\xb0\x3d\x4e\x60\xe7\xfb\x80\x5c\x3e\x0e\x9f\xc2\x87\x02\xf9\x53\x70\xb4\xe8\x15\xf0\x96\x01\x18\x97\xf6\xab\x68\xeb\x70\x99\x76\xe1\x7f\x73\xbc\xd1\x0c\xcb\x78\xeb\xe3\x03\xdc\x1d\xc7\xd6\xe6\xc2\x46\x00\x7c\x30\xc2\x99\xd2\x9b\xe2\x63\xe0\xf3\x91\x0a\x55\x9c\x32\xd5\xaf\xe8\xf6\x2a\xb1\xa4\x7f\x6a\x6d\xa1\xd0\x04\x9b\x5f\xac\xce\x16\xa1\x13\x0f\x50\xd6\xfa\x35\x9e\x01\xc4\x7a\xc5\xbf\x81\xf4\xda\x0d\xb8\xbb\xbf\x9d\xcc\xbe\xba\xca\x14\x98\xb4\x71\x0c\x27\x9a\x03\x27\x90\xef\xd9\xf0\x6e\x64\x4f\xbe\xfd\x76\xba\xcb\x03\x21\xdc\xd0\x5f\xe1\xc7\xea\x56\x55\x65\xc7\x1b\xf3\xde\x0c\x1a\xd1\xf4\xde\x41\x3a\x90\xde\x05\xf4\xba\x89\x0a\xcc\xaf\x6f\xd5\xfd\xf5\xeb\x2d\x26\x21\x53\x70\x8d\xbd\x52\x66\x16\xc5\xe4\x9a\xa5\x9e\xa7\x0e\xf3\xae\xfb\xcf\x1a\x7e\xdb\x9a\x3e\x0e\x3b\xf9\xe3\xcf\xef\xfe\x1f\x00\x00\xff\xff\x1b\xfd\x79\x5c\xe0\xce\x07\x00")
+var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\xe3\x36\x96\x30\x8c\xff\x3f\x9f\x02\xe5\xc9\x3e\xb6\x67\x24\xb9\x7b\x6e\xbf\x99\xfe\xcd\xbb\x29\xaf\xed\x24\x7e\xd3\xed\x56\xd9\x4e\xe6\x99\x4a\xb2\x59\x88\x3c\x92\xb0\x26\x01\x2e\x00\xca\xd6\x3c\x79\xbe\xfb\x5b\x38\x00\x48\x50\x17\x5b\x12\xd9\x6d\xd9\x01\xa6\x2a\xd3\x16\x49\x10\x3c\x38\x38\xf7\x0b\x2d\xd8\xf7\x20\x15\x13\xfc\x1d\xa1\x05\x83\x07\x0d\xdc\xfc\xa5\x06\x77\x7f\x55\x03\x26\x4e\x66\x6f\x7f\x73\xc7\x78\xfa\x8e\x9c\x95\x4a\x8b\xfc\x1a\x94\x28\x65\x02\xe7\x30\x66\x9c\x69\x26\xf8\x6f\x72\xd0\x34\xa5\x9a\xbe\xfb\x0d\x21\x94\x73\xa1\xa9\xf9\x59\x99\x3f\x09\x49\x04\xd7\x52\x64\x19\xc8\xfe\x04\xf8\xe0\xae\x1c\xc1\xa8\x64\x59\x0a\x12\x27\xf7\xaf\x9e\xbd\x19\xfc\x6d\xf0\xe6\x37\x84\x24\x12\xf0\xf1\x5b\x96\x83\xd2\x34\x2f\xde\x11\x5e\x66\xd9\x6f\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x33\x96\x80\x7b\x5e\x0d\x44\x01\x92\x6a\x21\xd5\x20\x11\x12\x84\xf9\xbf\xfc\x37\xaa\x80\xc4\xac\x62\x22\x45\x59\xbc\x23\x2b\xef\xb1\xf3\xfa\xc5\x52\x0d\x13\x21\x99\xff\x9b\x90\x3e\x11\x59\x8e\xff\x76\x40\xb0\xaf\xbf\xb1\xaf\x77\x90\xc3\xeb\x19\x53\xfa\xdb\xf5\xf7\xbc\x67\x4a\xe3\x7d\x45\x56\x4a\x9a\xad\xfb\x10\xbc\x45\x4d\x85\xd4\x57\xf5\xb2\xcc\x32\x12\x35\x0b\xff\xed\x6e\x64\x7c\x52\x66\x54\xae\x99\xed\x37\x84\xa8\x44\x14\xf0\x8e\xe0\x64\x05\x4d\x20\xfd\x0d\x21\xfe\x5d\x76\xf2\x3e\xa1\x69\x8a\x1b\x49\xb3\xa1\x64\x5c\x83\x3c\x13\x59\x99\xf3\xea\xe5\xe6\x9e\x14\x54\x22\x59\xa1\x71\xb3\x6e\xa7\x80\x50\x23\x62\x4c\xf4\x14\xc8\xd9\xcd\xf7\xd5\xad\x84\xfc\xb7\x12\x7c\x48\xf5\xf4\x1d\x19\x98\x0d\x18\xa4\x4c\x15\x19\x9d\x9b\x25\x04\x77\xd9\xdd\x3c\xb7\xd7\x82\xdf\xf5\xdc\xac\x57\x69\xc9\xf8\xe4\xb1\xf7\xbb\x8f\xd8\x6c\x09\xb3\x60\x9f\xc2\xd7\x7f\xbf\xf4\xfb\xa6\xaf\xf7\x9f\x4f\xcd\x9b\x89\x9e\x52\x4d\xf4\x94\x29\x22\x38\x10\x09\x45\x46\x13\x50\x8f\x2c\x68\xc5\x2d\x76\x45\xd7\xcb\x17\xd6\x2c\x29\x9c\x52\x53\x5d\xaa\x41\x31\xa5\x6a\x19\xc4\xc3\x85\x5f\x57\x4c\x67\x6f\x9c\xbd\xa5\x59\x31\xa5\x6f\xdd\x8f\x2a\x99\x42\x4e\x6b\x1c\x10\x05\xf0\xd3\xe1\xe5\xf7\x7f\xbc\x59\xb8\x40\x9a\xd0\x59\x89\xfd\x84\x29\x03\x2a\xa4\x20\xc4\x93\x10\xdc\xbb\x79\x01\xe4\xbf\x56\x3e\x73\x53\x40\xf2\x5f\x83\xa5\x95\x8b\xd1\x7f\x43\xa2\x83\x9f\x25\xfc\x4f\xc9\x24\xa4\xe1\x8a\x0c\x80\x3c\x59\x5a\xf8\xd9\xc0\x3f\xf8\xa9\x90\x86\x2c\xe8\xe0\xc8\xdb\x11\xd0\xc5\xc6\xef\x0b\x5f\x7b\x68\x40\xe2\xbe\x31\x35\x24\x11\x14\xe2\xa3\xc3\x38\x48\x1d\x1c\x2d\x9e\x32\x65\x90\x43\x82\x02\x6e\x89\x24\xa2\x10\x77\xdf\x34\x20\x06\x00\x20\x95\x21\x00\x65\x96\x1a\xda\x39\x03\xa9\x89\x84\x44\x4c\x38\xfb\x57\x35\x9b\x22\x5a\xe0\x6b\x32\xaa\x41\x69\x82\xa7\x96\xd3\x8c\xcc\x68\x56\x42\x8f\x50\x9e\x92\x9c\xce\x89\x04\x33\x2f\x29\x79\x30\x03\xde\xa2\x06\xe4\x83\x90\x40\x18\x1f\x8b\x77\x64\xaa\x75\xa1\xde\x9d\x9c\x4c\x98\xf6\x54\x3f\x11\x79\x5e\x72\xa6\xe7\x27\x48\xc0\xd9\xa8\x34\x84\xf3\x24\x85\x19\x64\x27\x8a\x4d\xfa\x54\x26\x53\xa6\x21\xd1\xa5\x84\x13\x5a\xb0\x3e\x2e\x96\x23\xe5\x1f\xe4\xe9\x6f\xa5\xdb\x64\x75\xb8\x00\xbe\x95\xe8\x4c\x3c\x81\x7d\x14\xd6\x86\xbc\x5a\x4c\xb2\x8f\xdb\x6f\xa9\x41\x6a\x7e\x32\x50\xb9\xbe\xb8\xb9\x25\x7e\x01\xee\x5c\x22\x84\xeb\x5b\x55\x0d\x6c\x03\x28\xc6\xc7\x20\xed\x9d\x63\x29\x72\x9c\x05\x78\x5a\x08\xc6\x35\xfe\x91\x64\x0c\xb8\x26\xaa\x1c\xe5\x4c\x2b\xc4\x39\x50\xda\xec\xc3\x80\x9c\x21\xd3\x23\x23\x20\x65\x91\x52\x0d\xe9\x80\x5c\x72\x72\x46\x73\xc8\xce\xa8\x82\x4f\x0e\x6a\x03\x51\xd5\x37\xe0\xdb\x1c\xd8\x21\xcf\x5e\x7e\x60\xe9\x8c\x11\xe2\x79\xe9\xda\xdd\x59\x7b\x86\x49\x0a\x49\x46\xa5\x15\x0a\x88\x86\x2c\x23\x1f\xdf\x7f\x20\x53\x71\x6f\xb0\x98\x71\xa5\x69\x96\xe1\x29\x70\xfc\xd9\x92\xd3\x84\x72\x92\x53\x4e\x27\x40\x68\x51\x28\x32\x16\x92\x50\x32\x61\x33\xe0\xfe\x74\x0d\x36\x5d\xfc\x3a\x22\x41\x2c\x71\x5f\xc9\xa0\xfc\x55\xb7\xc0\x85\x2b\xeb\xc8\x86\x19\x4b\x32\xd0\x23\x50\x3b\xad\xef\x45\xcc\xe6\xa4\xe4\x4a\xcb\x12\x37\x3b\x25\x77\x30\x77\x48\x9e\xd3\x82\x28\x2d\xcc\x8f\xf7\x4c\x4f\x09\x0d\x11\x9c\x6a\xc4\xe2\x11\x10\x05\x9a\x8c\xe6\xc4\x88\x71\x48\x10\xb4\x10\x19\x52\x0b\x7c\x16\x09\x83\x04\x2d\x19\xcc\x80\x50\x39\x62\x5a\x52\x39\xaf\xb0\x61\x11\xa0\x4f\x00\x15\x3f\x36\x10\x1e\xd6\x83\x84\x3c\x86\x8b\xc4\x92\x5b\x27\xbb\xa4\x95\x60\xb9\x01\xf4\x86\x97\x0e\xdf\x6a\x71\x54\x39\x7c\x03\x45\x0c\x5e\x39\xf9\xa0\x92\x6b\xf1\x4d\x0e\xb1\x52\x22\x64\x85\x19\x06\x6c\x21\x12\x8e\xc0\x90\x13\x49\xb9\xb9\xb0\x12\xb9\x77\x80\xd6\x63\x68\x63\x86\xb8\xe7\xab\x70\x34\x9c\x9b\x4a\xd9\x10\x98\xc2\xc1\x34\xe4\x6b\x66\x7e\x14\x76\xd5\xcf\x66\x81\x33\x96\x82\x01\xa2\xa6\xcc\xa2\x8e\x39\xad\x74\x24\x4a\x6d\x61\xe7\x6e\x49\xc9\x8c\x51\x42\x27\x13\x09\x13\x44\xe0\xb5\xaf\x7d\x02\x26\x76\xac\x3f\xa0\xf5\xe8\x5b\x49\xfe\xd1\x3b\x0c\x19\x7c\xf4\x06\xbe\xea\x98\x87\x37\x2c\x0b\x8b\xcd\xf1\xd4\x1e\xda\x41\x13\x03\x13\x0f\x5a\x21\x1f\xbd\x79\x93\xbd\xb5\xe3\x89\x1d\xb6\xa3\xb9\xcf\x0b\x0b\x71\x57\x47\xe6\x7c\xd4\xa4\xd9\x90\x03\xbc\xb1\x26\xbe\x23\x20\x05\xc8\xb1\x90\xb9\x39\x28\x9c\x50\x92\x58\xf9\xad\x22\x3c\x48\x1a\x79\xf2\x18\x38\xc9\xa6\xfb\x6f\xc7\x26\x58\x60\x47\x9f\x14\x54\x4f\x9f\xb8\x6d\xb3\xad\xb2\x23\x04\xda\x93\x37\x3f\x41\xcd\x96\xe6\xae\x39\x4c\xe7\x73\x1b\x30\x74\x3e\x29\xf2\x9c\x4d\x66\x6d\xa0\xda\x35\xbd\xff\x00\x4a\x19\x96\x8d\x52\x9a\xa4\xf7\x04\x78\x22\x0c\xb1\xf8\x7f\x6f\x3e\x5e\xd9\x69\x07\xe4\x52\x13\x96\x17\x19\xe4\x46\x10\x23\x1f\xa8\x54\x53\x9a\x81\x44\xee\xf4\x1d\xcf\x1b\x7f\x3b\x4c\x2c\x15\xa4\x86\x16\xa5\x90\xd1\xb9\x9d\x2c\x85\x44\xa4\x86\x46\x0b\x49\x0a\x23\xe0\xe6\x45\xa9\x81\x50\x7b\x15\xdf\xcb\xf8\x64\x15\x91\x6e\x05\x1a\x62\x24\x91\x9c\xea\x77\x64\x34\xd7\x4f\xa1\x3e\x21\x0f\xfd\x74\x53\x1a\x10\x2e\xe6\x69\x4a\x60\xc7\x46\xf4\x20\x9c\xf8\xc9\xaf\x34\x42\x28\x65\x1c\xe4\x50\x48\xbd\x09\xd1\x32\xca\xc7\x04\xe4\xa3\x77\x7a\x90\x31\xae\xff\xf8\x87\x47\xee\x4c\xa1\xc8\xc4\xdc\xe0\xc5\xd3\x67\x65\xc3\xef\xd9\xf8\x5c\x6f\x3a\xdf\xa6\x67\x79\xc3\xf9\xac\x71\xaa\x8b\x99\x56\x29\x50\x3b\x4d\xc4\xbb\xfa\xb6\x4a\x09\x7c\x36\xe6\x37\xbc\xf4\xd6\x86\x6b\x18\x83\x04\x9e\x78\xda\x54\xfd\xa9\x05\xa1\xe4\xdb\x72\x04\x92\x83\x06\x15\xc8\xd5\xf3\x02\xbc\x69\x07\xec\x03\x12\x24\x29\x35\xcb\xd8\xbf\x40\x3d\x45\x59\x3e\x11\xdb\x7b\x42\xc0\xf1\xb7\x3d\x21\xe6\xf8\xdb\x9e\x12\x76\xec\xd8\x86\x8f\x3e\x8d\x85\x76\x34\xf6\x09\x35\x7b\x27\xaa\x57\x3b\x93\x36\xb7\xa2\x73\x4a\xfe\x34\x9a\xaf\x58\xe9\x10\xcd\xb7\x0d\xf3\xe7\xba\x05\x93\xa3\x75\x26\xf3\x81\xd1\x8b\x07\x68\x94\xfd\xe1\xa7\x81\x9d\xf2\x78\x40\x2e\xf2\x42\xcf\xbd\x6d\x83\x3d\x31\x39\x53\x84\x0b\xbd\x2c\x95\x75\x0e\xa6\xd9\x6a\x33\xd8\x93\x90\x3a\x1d\x5e\x7a\x03\xeb\x67\xdc\x5a\x55\x40\xb2\x07\x52\xf7\x4d\x63\x19\x0d\x99\x7b\xcc\x20\x4b\x09\x33\x02\xb5\x59\x2c\x19\x65\x22\xb9\x73\xb6\xe4\xeb\x73\xa2\x84\xa5\x39\x46\xeb\x32\xc2\x4f\x22\xb8\x2a\x73\x20\xec\x29\x22\x12\xc5\xec\x28\x66\x47\x31\xfb\xa5\x88\xd9\xd6\x67\xb3\x0f\x94\x6a\x61\x21\x6b\x69\x15\xde\x17\xa9\xd5\x63\x23\x52\x2b\x1c\x91\x5a\x3d\x31\x5e\x1c\xb5\xda\x48\x06\x7c\x72\xae\xa7\x0e\x72\x34\x70\x47\x03\x77\x34\x70\xbb\x11\x79\x99\x1b\x91\x97\x45\x5e\x16\x0d\xdc\x8f\x4d\x19\x0d\xdc\x5b\x4e\x14\x0d\xdc\xd1\xc0\xdd\x18\xd1\xc0\x1d\x0d\xdc\xd1\xc0\x1d\x0d\xdc\x6b\x46\x14\xb3\x77\x9c\x34\x8a\xd9\x8f\x8c\xd7\x2d\x66\x47\x03\x77\xa4\x56\x91\x5a\x45\x6a\xf5\x32\xa8\x55\x7b\x03\x77\x92\x01\xe5\xab\x15\xdd\x85\x3c\x09\xbc\x0f\x45\x23\x36\x66\x2e\x5f\xc8\x3d\x4d\x46\x30\xa5\x33\x26\x4a\x49\xee\xa7\xc0\x7d\x6a\x1b\x99\x80\x56\x06\x0b\x40\xc3\x2a\xdd\xe8\x09\x5a\xf3\x38\x7d\xe9\x13\xe0\x74\x94\xad\x9c\xf8\x29\x52\xe2\x9e\x7c\xdc\xa0\x3f\x12\xc2\x7c\xdd\x32\xc4\x50\xae\xf7\x72\xf2\x36\x71\xff\x07\xeb\xf4\x8e\xd5\xc1\xff\x67\xd7\xe7\x5d\x85\xfc\x93\x1f\x39\xb9\xac\x66\x25\xe8\x2d\xc0\x84\x22\xc3\x43\xcc\xaf\x1f\xef\x39\xa4\x98\x0c\xda\x23\x4c\x9b\x1b\xcc\xa1\x67\x09\xd3\xd9\xbc\x7a\xf1\xe0\x60\xfb\x4d\xdc\xa3\xd4\x81\xb3\xeb\xf3\xcd\x5d\x2a\x7e\x03\x3e\x87\xf7\x24\xfa\x46\xa2\x6f\xa4\x1a\x51\x0c\xda\x71\xd2\x28\x06\x3d\x32\x5e\xb7\x18\xb4\xef\xbe\x84\xe8\x01\x20\xd1\x03\xe0\x6f\x8b\x1e\x80\xe8\x01\xe8\x06\x4c\xd1\x03\x10\x3d\x00\x8f\xdf\x14\x85\xc9\x1d\x27\x8d\xc2\xe4\x23\xe3\x75\x0b\x93\xd1\x03\x10\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xf5\x12\x43\xdc\xa3\x21\x36\x1a\x62\xa3\x21\x36\x72\xa3\xc8\x8d\x9e\x18\x2f\x8e\x1b\x45\x43\xec\xb6\x13\x45\x43\x6c\x34\xc4\xae\x1b\xd1\x10\x1b\x0d\xb1\xd1\x10\x1b\x0d\xb1\x8f\x8f\x28\x4c\xe2\x88\xc2\xe4\x13\xe3\xc5\x09\x93\xd1\x10\x1b\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xd5\xde\x10\xfb\xc4\x49\x6a\xa0\x4c\x68\x3f\x75\x92\xa3\x8f\x07\xc6\xca\xfe\x84\xf1\x24\x2b\x53\xc0\x2b\x63\xa0\xba\x94\xa0\x7a\x24\x63\x39\xf3\x75\xdb\x85\x34\xd8\xd1\x4f\xa8\x02\xb5\x34\xc7\x8a\xf7\x3f\xbe\xf6\xc7\x4f\xea\xa3\x7d\x58\xaa\x40\x66\xc6\xfd\x3c\x0e\x57\xb6\x5e\x06\x4b\x36\x80\x9d\x79\xbf\xb9\x11\x6b\xf3\xdb\x36\x0b\x4f\x7e\xf6\x3a\xbc\x7a\x04\x8f\x9e\x24\xdf\x4f\x11\xed\x3e\x19\x51\x05\x7f\xf9\xd3\x52\x37\x90\xf0\x96\x1c\x52\x46\xcd\xab\x56\xde\xf1\x34\x21\xaf\x5f\xb1\x1e\x73\x37\x38\x01\xd5\x32\x76\x9c\xc5\xb5\x2b\x78\x72\xef\x0c\x82\xa5\x97\xf6\xe6\x1b\x2d\xa9\x86\xc9\x3c\x68\x8f\x81\xf8\x54\xf3\x5f\xbe\xa6\xad\x4b\xa5\x59\xdd\x4f\x41\xda\x33\xe2\x1b\x3a\x28\x3f\x29\x53\x55\xae\x43\xba\x43\xc9\xfc\xa7\x92\x17\xfc\x7b\x56\x5c\x7e\x6a\xd3\x56\xf5\xb4\x58\x09\x2c\x0f\xa0\x73\xeb\x57\x39\xaf\x8a\x38\x2c\x42\xac\xa0\xd2\xf0\x09\xef\x7f\x41\xd1\x25\xb8\x7b\x01\xde\xeb\x58\xc3\x06\xf2\xca\xd3\x72\x4a\x3f\xa8\x35\xb1\xce\xe7\xb3\x89\x78\xe2\x3a\x4b\x0d\x41\xe6\x4c\xa9\x75\xe9\x19\xcd\xa5\x3f\xc5\x3c\x36\x60\x1a\x6b\xe0\xef\xbf\x28\x58\x4e\x25\x44\x5a\xb5\x7f\x44\x13\x22\xcb\xcc\x88\x94\x3c\x25\xae\xa9\x04\xa1\x49\x22\x4a\xae\x09\x07\x48\x6d\xe2\xc7\x2a\x5c\xdd\x80\xe5\x6c\x20\x45\x6e\x2a\x43\xf6\xed\x3a\x9f\xbc\xcb\x7d\xc3\xa9\xfd\x84\x95\x6d\x4a\xc2\xb1\xb9\xcc\x89\xaf\x7f\x9a\x77\x6f\x23\x10\x6c\x2c\x0e\x34\x0d\x5d\x22\x63\xc9\xfc\xba\xcc\x80\x4c\x45\x96\x2a\x6c\x96\x63\xf8\x56\xe5\x0a\x0b\x15\x85\x02\xef\xc6\xd5\xf7\xc8\xa8\xd4\x24\x15\x60\x0d\x54\xae\xb4\x4b\xe3\x71\xeb\xfc\xbc\x9f\xda\x86\x49\xe6\x21\x42\x8b\x22\xc3\xc4\x2b\x61\x78\xf7\xfd\x94\x25\x53\xdb\x05\xae\xa0\x09\xac\xba\x6d\x73\x19\x6e\x23\x25\x83\x6c\xa5\x68\x10\x6f\x3c\x1d\x3d\x85\x2a\x64\x4b\x8d\x83\xd8\xc6\x2b\x5f\x4b\x51\x16\x1b\xde\xbe\x6c\x77\xb3\x4f\x1b\x2a\xaf\x17\xc4\x11\x7f\xd1\x39\x33\xed\xde\x28\x67\x9c\x73\xc6\xfa\x01\x21\x97\x63\x92\x97\x99\x66\x45\x86\x8f\xd8\x7a\x31\x8a\x50\x09\x35\xdf\xe8\x11\xca\xe7\xde\x37\xea\x9a\x2f\x41\x4a\xe8\xc4\xcc\xa8\xb1\xeb\x9a\x6f\xf4\xc2\xcb\xdc\xc8\x20\x81\xd9\x4f\xa1\x52\xc9\xe7\xf5\xec\xe4\x9e\x65\x99\x91\xea\x69\x96\x89\x7b\x48\x07\xe4\xe0\x60\x91\x94\x27\x42\x06\xeb\x41\x62\x72\xf0\xbb\xc6\x5d\x86\x72\xd4\x0b\xde\x04\x47\xc8\xd6\xe2\x35\xd9\x4e\xc4\x26\xdb\x2b\x13\x84\x70\xc1\xbd\xd9\xf8\xbb\xeb\xf7\xbb\x21\xc2\x55\x73\x0e\xd7\xa5\x0b\xb4\xd9\x96\x82\x4a\xcd\x68\x46\x4a\x99\x29\x8b\x0b\xd4\x08\xcc\xd2\xb7\x39\x9b\x52\xf4\x7b\x27\xa0\x6c\x3f\x2d\xf2\x3b\xbb\xfb\x6e\x73\xec\x19\x17\x3c\x9b\x13\x6a\xb7\x66\x5c\x66\x59\x8f\x8c\x19\xa7\x86\x74\x43\xe1\x73\xef\x8c\x26\x4a\x6e\x18\x4f\xc0\x7c\x53\xbf\x12\x4e\x70\x45\x66\x46\x43\x23\xaa\x83\x9e\xf6\x5c\xc3\x2f\x6b\x77\x50\xee\x15\xe6\xd0\x27\x74\x94\x01\x4a\xb5\x4e\xec\xb9\x16\x19\x7a\x6b\x2a\x93\x32\x76\x09\xa3\xe1\xe5\xff\x60\x1c\xd5\x3d\x72\x8d\xcc\xc7\xa8\x8d\xc0\xf4\xd4\x68\x91\x45\x91\xcd\x0d\xb1\x31\xc8\x52\x23\xe5\x91\x2a\x93\xa9\xf9\xa4\x83\x42\xa4\xea\xc0\x90\xa2\x03\x05\x89\x04\xad\x0e\x8e\xcd\x5f\x8b\xdf\x80\xdf\x17\x3e\x77\x42\x0b\x76\x70\xdc\x23\x08\x20\x6c\x41\x26\xf4\xf4\xe5\xe2\xa1\xff\xd6\x46\xe7\xcb\xa7\x46\x53\xff\x0f\x67\x70\xfd\xb4\x44\x61\xdb\x53\x19\x3a\xaf\x01\x33\x33\x0d\x52\x22\x1a\x04\x1e\xb7\x05\x82\x4f\xc8\x29\x27\x60\x7d\x24\xa0\x49\x0e\x94\xbb\xbb\x61\x06\x72\xae\xa7\xe8\x36\x51\x15\x01\x79\xf1\x40\x6f\x07\x70\x77\xe0\x3d\x70\x6b\x24\xb7\x3d\x0f\x17\x81\x7b\xf8\xbb\xc3\x45\x42\x5a\x73\x84\x17\x0b\x4a\x64\xd1\x3b\x81\xf1\x7b\xf3\x64\x13\x84\xf6\x27\x4b\x2d\x2b\xfa\xf1\xfe\xbd\xed\x6f\xe8\x60\xf5\x2d\xe3\xa9\xaa\xea\xd9\xa5\x96\x0c\x3a\x78\xaf\x04\x32\xae\xf0\x25\x02\x78\x59\x04\xde\x54\x6c\x7d\x62\xfa\x40\x47\xda\x07\xb5\x06\xfb\x25\x36\x24\x25\x43\xa7\x7a\xd6\x79\x67\x44\x90\x8c\x8e\x20\x53\xce\xe0\x02\xc1\xf2\xc9\xe9\xfb\x0f\x55\xdf\x50\x09\xf4\x09\xcb\xe0\x27\x50\x66\x36\x88\x02\x58\xea\xbe\xba\x3c\x36\x97\x5f\x11\x14\xdb\x99\xd5\xc9\x0d\x68\x7b\xcc\x72\x5a\x98\x53\x66\xe7\x58\x69\x15\x7e\x8f\x90\x7e\xfa\xb0\x6c\x25\xf7\x6f\xde\x2d\x71\xd5\x4b\x36\x3a\x2a\x9b\x45\x1a\x6c\x73\xf6\x1e\xb1\x92\xd4\x63\xc1\xa8\xda\x40\x68\xa7\x1b\x38\x69\x3e\xa1\xa1\xb1\x35\x05\x65\x4b\x31\xd8\xc2\x17\xd2\xff\x5e\x4f\xd1\xf1\x16\x6c\xa3\x78\x19\xdd\x3b\x83\x44\x8b\xc7\x8b\x7f\xfa\x9b\x35\xe4\x45\xf6\xd4\xc9\x23\x5b\x2b\x69\x39\xe3\xd7\x40\xd3\xf9\x0d\x24\x82\xa7\x1b\x12\xd8\xc6\x7e\x7c\x60\x9c\xe5\x65\x4e\x78\x99\x8f\x00\x41\xac\xec\x5c\x48\x48\xac\x02\x4c\x09\x87\xfb\x6c\xee\x88\x47\x4a\x0a\x91\x7a\x7a\x32\x32\x0a\x1b\x4d\xe7\xd8\x79\x14\xcb\x64\xf3\xb9\x99\x84\xe9\x9a\xfb\x48\x92\x48\xaa\x8c\x58\xd4\xc3\x49\x99\x36\x1c\x6b\x04\xe8\xa5\x63\x29\x98\x3d\xa6\x33\xca\x32\x23\x5a\x0f\xc8\x39\x8c\x69\x99\x61\x03\x5d\xf2\x86\x1c\x99\x97\x79\x9d\x6c\xd5\x03\x46\xdc\x55\xc2\x68\xf3\xca\x55\xd5\xc0\x05\x1d\x6f\xe1\x77\xd8\xa4\x8a\xab\x1f\x9b\x56\x73\xf5\xa3\xa0\xa5\xda\x54\x95\x6f\x6c\xcc\x25\x4f\xcd\x79\x08\x25\xd1\x80\xa4\x33\xe5\x66\xde\x8c\x65\x3f\x5e\x6d\x65\xc5\xaa\xa5\x98\x48\x50\xea\x1c\x68\x9a\x31\x0e\xbb\xe3\xd7\xed\x14\x48\x4e\x1f\x10\xc7\x34\xcb\xc1\x48\x22\x21\x86\xd1\xf0\xab\xb4\x20\x39\xbd\x83\xea\xf5\x64\x04\x63\x6c\x90\x8c\x1f\x1c\xec\xbe\xc5\x9f\x31\x65\x99\xd1\xd0\x6f\x9b\xb0\xc1\x5e\xc9\x22\xcb\x40\x5a\xc4\x31\x7f\x33\x5e\x62\x88\x5d\x21\x05\x2a\x93\xf6\xd1\x90\xc7\x23\x0f\xa5\xe6\x66\x4b\x87\x7d\x2f\xdd\xe1\x02\x28\x2e\x1e\x12\x6b\x28\x94\x40\x15\xde\x66\x71\x53\x95\x72\x6c\x54\x47\xaf\x71\x06\x0b\x72\x4d\xd8\xc9\x95\xd0\x2e\x92\xaf\xfa\x40\x7c\xda\xb5\x88\x06\xa5\x59\x8e\x07\x2c\x2d\xa5\x6f\x58\x8d\x30\xa3\xab\xb7\xbe\x71\x54\xfe\xf2\xe6\xcd\x86\xf2\xdb\xa7\x47\x7a\x09\xa8\x29\xef\x82\x2f\x57\x15\x1d\xf2\xe4\xdf\xa8\xc0\x66\x8f\x99\x13\x83\xb1\xf3\x36\x48\xf4\xb8\x32\xa5\x19\x9f\x94\x4c\x4d\xc9\x08\xf4\x3d\x00\x27\xf0\x60\x6b\xea\x90\x7f\x81\x14\xb8\xa9\x06\xbc\xb5\x9b\xa1\x01\xb4\xb7\xfb\x03\xb1\x19\x53\x4c\xf0\x6f\x98\xd2\x42\xce\xdf\xb3\x9c\x3d\x51\x80\xda\x8f\x65\xb7\x5f\x05\x41\x91\xa5\xe4\xda\x6e\xc5\x0d\xd8\x0f\x96\x80\x56\x50\x2d\xac\x7a\x4a\xcc\x39\x19\xd1\xe4\xee\x93\x01\xf8\xcd\xbe\x40\xd8\xb3\xeb\x1d\xa0\x8a\xf2\x5e\x35\x01\x92\x2d\x8b\x94\x17\x0f\x16\x3e\x0d\x28\xdf\x4f\x85\x02\xbc\xc1\x1a\x2a\xf1\x31\xef\x58\x60\xaa\x22\x18\xe8\x96\xe5\xa0\x08\x1d\x8f\x9b\x77\xd4\x87\x1d\x25\xcf\xbc\x54\x9a\xe4\x54\x27\x53\x6b\xca\x12\x69\x25\x4e\x1c\x2a\x27\xf6\x6f\x03\xe5\x8d\x0d\xd1\xdb\x9b\x8c\x89\x5d\xe7\xc5\x83\xd1\x2d\x9f\xf4\x08\x35\x47\x03\xe4\x8b\xd3\x34\x35\xe0\xac\xb9\x21\x4e\x6e\xcb\x6d\xf3\xfe\x5b\x34\x22\xd7\xbf\xe0\x2e\x9c\x5e\x9d\x6f\x6e\x8a\xd9\x45\xc1\xdd\x5a\xc5\x5d\x34\x97\x3f\xf2\x51\xde\x64\xea\xae\x34\x6d\xe6\xa8\xa1\xa8\x1e\xa1\xe4\x0e\xe6\x3d\xcb\xc5\x16\x1b\xe6\x4b\xc8\x9c\x24\x01\xd8\x37\xde\xdc\x64\x9f\xdb\x1c\x24\x3b\x60\x8f\x1d\xdb\xb9\x33\xfc\xe8\x9b\x85\x6e\xf9\x84\xff\xe8\x2d\x1e\xdb\x1e\xc1\xed\xb8\x83\xf9\x76\x0f\x2c\x6c\xb7\xd9\x05\xa7\xfb\xd8\x7d\x37\x3f\x54\x82\x5e\xb5\xd5\xdb\xf9\x99\xc2\xb1\xb5\x89\xca\x0f\x0f\xc4\x56\x9f\x57\xa1\x5f\x68\x65\x32\xdf\x78\xa8\x2c\x32\x9a\x33\x3d\x65\x85\xcd\x7a\x70\xce\x00\x87\x91\xe4\x7b\x9a\xb1\xb4\x9a\xc2\x9e\xdf\x4b\xde\x33\xe2\x93\xf9\x3f\x24\xba\x56\x5c\x3b\x17\xa0\xae\x84\xc6\x5f\x3e\x1b\x80\xec\x32\x5b\x81\xc7\x4e\xe1\xac\xd0\x48\x65\x50\xf1\xb2\x11\xf7\x1e\x0c\x97\x8b\x91\x3b\x8a\x5c\x72\x22\xa4\x87\x83\xb9\xe8\x26\xb2\x53\x20\x9f\x18\x59\x07\x07\xda\xa7\x57\xce\xe1\xc0\x27\x64\x03\x7a\x8f\x4c\xe7\xa6\x42\xf9\xc0\x5e\x41\x1d\xab\xc8\x50\xda\x75\xa2\x2a\xf5\x8e\x72\x96\x90\x1c\xe4\x04\x3d\x2e\xc9\xc6\x1e\x87\xe6\xa6\x6c\x47\x77\xed\xd8\x9a\xfa\x86\x2f\xdc\x0a\x0b\x90\x35\x59\x13\x50\x1b\xe6\x66\x67\x68\x98\x9c\xfe\x8f\xa1\xe0\xb8\x07\xff\x97\x14\x94\x49\x35\x20\xa7\x44\x31\x3e\xc9\xa0\x71\xcd\x69\x18\xe1\x34\x66\x06\xa6\x88\x21\xb5\x33\x9a\x39\x5d\x8a\x72\x02\xd6\x66\x65\x66\x5f\x64\xa9\x3d\x27\xa9\x18\xca\x53\x39\xba\x0e\xee\x60\x7e\xd0\x5b\x42\x9a\x83\x4b\x7e\x60\x79\xcb\x12\x9a\x54\x8c\x08\x7d\x64\x07\x78\xed\xa0\x4b\x2e\xbc\x25\xc3\xd9\xd5\x8e\xd6\x7c\xe9\xc6\x18\xe1\xe3\x43\x76\x14\xd6\x1b\x5a\xa2\x8b\x8a\xd2\x82\x94\x0a\xac\xb4\x8e\xa7\x8c\x80\x97\x33\x51\xaa\x44\xc5\x94\xc3\x3d\x4a\x8f\x7b\x23\xf8\x19\x4d\x82\xf1\xc9\x77\x45\x4a\xf5\x46\xe1\xb9\x76\x34\x20\x72\x78\x6d\x27\x21\x25\xce\x62\x70\x6b\xcc\x26\xa4\xa0\x92\xe6\x6a\x40\x86\xae\x9e\x2a\x62\x1a\x1b\x87\xb6\x44\x07\xbb\xdb\x79\x01\xe4\xff\x21\xd7\xe1\x5a\x06\xa4\xdf\xef\x93\xdb\x8f\xe7\x1f\xdf\x11\xfb\x8b\x95\xb2\xb5\x20\x63\x81\x4a\x90\x28\xa5\x79\xd5\x0c\x38\x2a\xfe\x46\xbe\x17\x1c\x3e\x8e\xcd\x09\xa1\x1a\x66\x20\xc9\xbd\xd9\xaa\x84\xa5\x50\x59\xaf\x06\x87\x9f\x16\x8f\x77\x93\x4c\x72\xfa\x70\x53\xca\xc9\x16\x1b\x40\x96\x36\x21\x34\xd9\xd4\xca\x24\xa2\x5e\x98\x7b\xae\x92\x29\xa4\x65\x06\x29\xa1\x23\x31\x83\x86\xc9\xb6\xf9\x18\xb2\xf4\x12\xfc\x83\x86\xe7\x8d\x94\xc8\x4a\x5d\x29\xab\x47\xf0\xf0\x8e\xfc\x19\x5d\xdb\x94\x14\x20\x13\xe0\x9a\x4e\x60\xd1\x0c\x60\xef\x7b\xfb\xe6\xdf\x8e\x1d\x3f\x32\x33\x3a\xeb\xc9\x1b\x83\x11\x1f\xe8\xc3\x77\xbc\x36\x0d\x32\x45\xde\x0c\xc8\xe9\xc2\xcb\xf0\xb9\x2c\x29\x33\xb4\xb5\xa0\xbb\x3e\x78\xe5\x68\x4e\xa4\x28\xd1\x61\x4f\xca\xa2\xa9\xcd\xfe\xe1\xcf\xff\x66\x94\x3e\x9a\x17\x19\xbc\xf3\x65\x98\xad\xda\x6c\x64\x18\x2d\xc8\x1f\xdf\xfc\x9b\xa5\x9e\xe6\x7c\xd6\x5a\x61\x0d\x33\x6a\x00\x56\x16\x84\xe5\x36\x9c\x13\xb2\x79\x5d\xcf\x59\x36\xd1\x5f\x69\x2a\xb5\xea\x11\xf4\xea\x57\xc2\xa1\x16\x9a\x66\x0b\x5a\x3e\x6a\xe1\x70\x6f\x81\x94\x0a\x84\x09\xa0\xa1\x8a\xbc\xfd\xe3\x9b\x7f\x5b\x36\xa7\x7c\xe4\x09\xe0\x93\xf8\x04\x86\x59\x8c\x8c\x72\x7f\xc7\xb2\x0c\xd2\xde\x93\xcb\x1f\x97\x52\x4f\x41\xf6\x08\x70\xe5\x8d\x55\x66\x7d\x0b\x6b\xc3\xd9\x65\xc9\x39\xca\x08\xd6\x3a\x8c\x16\xad\xc0\xc2\xe5\x3e\xd6\x30\x42\x4d\x72\xa1\xf4\xea\x25\x6f\x7e\xdc\xcc\xa0\x7c\xfe\x71\xbc\xad\x38\xd0\xdf\xc1\x0c\xb1\xfc\xf4\x0e\x22\xe5\x43\xff\xae\x4a\xfc\xed\x33\xae\xfb\x42\xf6\xed\x34\xef\x88\x96\xe5\xd3\x5e\x83\x7a\xe4\x8d\x13\xf0\x19\xc8\x40\x19\x9c\xb7\xa5\x5d\xfd\x24\x27\x7f\xf7\xf3\x9c\x8a\x7b\xbe\x9e\x72\x20\xe1\x74\x34\x63\xc7\x53\xdf\xb4\xb8\x2d\x1c\x1b\xf3\x76\x73\xf7\xff\x6f\x19\xbb\xb7\x20\x07\xee\xec\x56\xa7\xdd\xc8\x55\xe8\xf1\xe8\x6d\xf0\xf6\xea\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x15\x94\x6b\xe9\x84\xaf\xa0\x40\x76\x1d\xb5\x43\x46\x63\x44\x81\x39\xe7\x6a\xed\x41\xcf\x80\x2a\xbd\x0a\x14\xf1\xa0\x3f\x3d\x1e\x4f\x02\x58\x1c\x4d\xa1\xd3\x48\x48\x08\xf2\xda\xc6\x78\x66\x11\xe5\xe0\x1a\xac\x87\xcf\x06\x9c\x35\x84\xa8\x83\xea\x48\x98\xfd\x6b\xca\x57\x9f\x2a\x6c\xc6\x1b\x39\x77\x11\xad\xdd\xa3\x41\x70\xb0\x33\x9d\x3a\xe2\x55\x79\x14\xad\x4b\xd3\xea\x2b\x36\xca\xcf\x1d\x0c\xff\xf6\x81\x2a\x20\x19\x48\xc0\xd3\x67\xa3\x91\xad\x02\x84\x7a\xd1\x69\x76\x4f\xe7\xea\x60\x6f\xa4\xf0\x1c\x34\x7d\x3c\xd1\x64\x71\x34\x89\xfe\x8d\xa6\x3c\xa5\x32\x75\xab\x3c\x3c\x54\xd5\x94\x03\xf2\x01\x7d\x71\x7c\x2c\xde\x91\xa9\xd6\x85\x7a\x77\x72\x32\x61\x7a\x70\xf7\x57\x35\x60\xe2\x24\x11\x79\x5e\x72\xa6\xe7\x27\xe8\x80\x63\xa3\x52\x0b\xa9\x4e\x52\x98\x41\x76\xa2\xd8\xa4\x4f\x65\x32\x65\x1a\x12\x5d\x4a\x38\xa1\x05\xeb\xd7\x32\xb7\x1a\xe4\xe9\x6f\xfd\x8b\x3e\xb1\x60\xdd\x38\x83\x68\x9d\x92\x33\xe8\x97\xfc\x8e\x8b\x7b\xde\x47\x4d\x58\x6d\x75\x1a\x37\x8b\x82\xf0\x63\x01\xde\xdb\x04\x3e\x14\x22\xfd\xe4\x9b\x60\x3e\xa6\x4f\x79\xda\xb7\x4e\xcb\x4f\xbc\x17\xbb\xd8\x86\xfb\x75\x60\xc1\x26\x51\xef\x76\xec\xa6\x4d\xd1\x44\xb3\x19\xec\xe4\x04\xf7\xa3\xb1\xdd\x1f\x7d\xc0\x69\x5a\x4a\xbb\xe3\x81\x37\xdc\xfb\x76\x72\x3a\x47\x59\x09\xdf\x4d\x84\x15\x05\xb8\x48\xc1\x59\x4e\x67\x68\x1a\xb8\x31\xe4\xe8\xd6\x88\xd2\xce\x47\x8e\x76\xe3\xb9\xd2\x90\x5b\xe2\x66\x9f\xcf\xe6\x44\xcb\xb9\x75\xac\xcb\x3b\xa3\xbc\x3a\xcf\xb7\xd1\x18\xee\xf0\x3e\xa5\x44\xc2\x50\x74\xaa\xe1\xea\xe5\x36\x6f\x03\xa4\xa4\x10\x8a\xe1\xbb\x1d\xcf\xdc\xce\xb2\xb7\x3b\xbb\x0d\xdc\x7c\x7f\xf9\xd3\x36\x5b\x37\xc6\x2a\x27\x5b\x5a\xe9\x9b\x11\x18\xe3\x30\xcb\xc0\x6d\xcf\xa1\xf2\x8a\xaf\x11\x6b\x12\xc1\x95\x96\x94\xad\xcf\xa3\x5a\x3d\x76\x74\xa5\xec\xee\xaf\x20\x88\x41\xa7\x3b\x01\x85\xac\x4e\x8c\x1d\x61\x66\x4d\x0a\x15\xa8\x43\xc0\xd8\x34\x2b\x1f\x8b\x68\x08\xd7\x8e\xa6\xd9\x1d\x60\x44\x5a\xc1\xc9\x3e\x6d\xab\x2c\xa5\xe7\x28\xbd\xde\x54\xdf\x75\x39\xe1\xa2\xfa\xf9\xe2\x01\x92\x72\xd3\x9c\xfc\xe5\xb1\x64\x0b\xf4\x06\x15\x17\xb6\x62\x17\x61\x8e\xae\xbf\xe0\xe4\x17\x81\x60\x77\x82\x8c\xa2\x9a\xa9\xb1\xcd\x59\xab\x36\x02\x02\xc7\x69\x85\xc2\x95\x7b\x19\x59\x9c\x4d\x9d\x60\x1a\xc9\x4d\x32\x15\x42\x99\x53\x8e\xfb\x89\xf3\xce\x98\xb0\x3e\x43\x4c\xa0\x91\x24\x37\x34\xc6\x27\xd2\xd4\xd3\x5b\xc1\xa9\x7e\x8c\x29\xab\xc2\x57\x10\xf4\x5e\x2e\x33\x0d\x1a\x2e\xcd\x1f\x13\x94\xba\x94\x26\xaa\xcc\xcd\xa4\xf7\xc0\x26\x53\xad\x7a\x84\x0d\x60\x80\x58\x03\x34\x99\x06\xd3\xe6\x00\xba\xd1\xb7\x29\x44\xb5\xd0\xca\x7c\x54\x65\x45\xb8\x54\xa0\x5e\xc5\x63\x16\xf7\x72\x25\xb8\x7a\x04\x74\x32\x38\xee\x91\x3a\x65\xdf\xac\x71\x34\x27\x4c\x83\xa1\xd9\xa8\xcb\x48\x51\x4e\xec\x97\x80\x8f\x09\xc5\x75\x55\x29\x23\xe8\x85\x4d\x51\xe7\x3c\xb0\x1f\x77\x60\xf6\x0d\x57\x5e\xe6\xbe\xa8\x12\x7e\x1f\x9a\xe5\xa1\x4a\x2c\x92\xa0\x0a\x61\xb5\xd5\x45\x83\xfd\xff\xbf\x7a\xe8\x48\x1d\xd7\xc0\x9c\xb2\xc9\xd4\xc3\x92\x3a\x46\xd0\xdc\x83\xed\xcf\x1e\x69\xe5\x8b\xb1\x63\x47\x8f\x8c\x1d\x4d\xdf\xb8\xcf\xb7\xa8\xb1\x2a\xd8\x7f\x0d\x32\xaf\xa0\x88\x28\x82\x24\xc3\xd9\xc9\x7d\x8b\x2d\x87\x63\xe4\x0d\x39\x42\x24\x63\xfa\x50\x21\xc2\xf7\x45\x71\x3c\x20\xa7\x84\x97\xd5\x99\x7b\xec\x05\x5c\x54\xf3\xbb\x89\xcc\x4b\x95\xa8\xe7\xda\xf1\x8b\x5b\x91\x3b\x3b\x76\xf3\xb4\x87\xa3\xef\x20\x00\x4f\x17\x0d\x7d\x6c\x12\x0b\xeb\x1d\x27\x68\x47\xba\xfd\x1c\xfe\x2b\x76\x9f\x63\x29\x40\x03\x8f\x6b\x1d\x85\x01\x32\xef\x85\xd2\x53\x75\x20\x9b\xa7\xd8\xc2\x62\x57\xac\x20\xdd\x60\x06\xe9\x08\xae\xa4\x55\x84\xcf\xea\xb1\x18\x06\xe3\xb3\xb0\x1a\xd0\x6e\x10\xf9\xd1\x1c\xaf\x6e\x19\xfc\xb4\x7e\xb4\xa5\x74\xf5\x68\x45\xf3\xea\xf1\x28\xe2\xed\x5f\x60\xd0\xea\xd1\x11\xda\xda\xd1\x9e\xb4\xd5\x63\xfb\xd0\xa2\x75\xf3\xec\x10\x70\xb4\x7a\x74\x75\x36\xed\xd8\x21\x38\x69\xf5\x58\x12\x51\x3f\x4d\xac\xd2\xea\xb1\xb3\x91\x75\xf5\xd8\x35\xae\x69\xf5\x58\x48\x75\xfc\x44\x41\x4e\xbd\x66\x84\x13\xf9\x5a\xdb\x73\xfc\xbe\x15\x3f\xa9\x47\xc7\x20\xde\x2d\x32\x6a\xf5\x58\x14\x00\x5f\x48\x94\xd4\x8a\xa9\xbe\xd6\x66\x9a\xf7\x6b\x1f\xb6\x39\xee\x3e\xce\xc7\x29\x14\x3d\x97\x7a\xe3\xed\xd4\x18\x91\x5d\x48\xc0\xd2\x06\x18\x36\xe6\xed\x30\x9f\x27\x30\x6b\xf5\xe8\x8e\x71\xda\xd1\x11\xfb\xb4\xa3\x33\xe4\x46\x81\xe7\x2b\x6b\x17\x7e\x46\x59\xc7\x5a\xa6\xa3\xac\x13\x65\x9d\x2d\x46\x94\x75\x36\x1d\x51\xd6\x59\x37\xa2\xac\xb3\x62\x44\x59\x27\xca\x3a\xad\xc6\xfe\xc9\x3a\xd6\x52\xd5\x99\xc1\xec\x1f\xd6\xe0\xba\x68\x21\x43\x69\xca\x87\x04\x35\x4d\x65\x86\xf7\xdf\x38\x12\x7b\x8b\xe6\x35\x17\xe9\x2e\x29\x9f\x00\x79\xdb\x7f\xfb\x66\xc3\x74\xc2\xd5\xa3\x4d\xd0\x4f\x38\xb6\x4d\x3d\x5c\x1c\xeb\x3c\x12\x9f\xcc\xbb\xe4\x4e\x6a\xe5\xf0\x68\x48\x98\x6b\x1c\x44\x55\x55\xac\x1c\x34\xa1\xba\x61\x10\x67\x39\x54\x0e\xd1\x46\x0a\x73\x1d\x13\x2c\xb8\xf3\x77\x98\x4d\x1d\xec\xb6\x82\x04\xa8\x8d\x83\x1f\x41\xb5\x0a\x91\x83\x4d\x50\xf5\x87\xde\x2c\x01\x3c\xac\xc8\x11\x0c\x26\x03\x92\xda\x64\x6f\xca\x5d\xcc\xd9\x71\x2f\x74\x8f\xe7\x86\xb8\x4a\xfc\x3f\xb3\x6c\xe7\x1f\x87\x19\x70\x5d\xd2\x2c\x9b\x13\x98\xb1\x44\x57\xdf\x87\x01\x85\x4c\x5b\x67\x67\x1b\x57\x4a\x0b\xf1\xb0\xad\x48\xd8\x5f\x3a\x5b\xdb\xf9\xab\xfd\x68\x2f\xbb\x2d\xad\x63\x77\x7a\xb3\x20\x97\x58\x08\x0d\xd6\xaa\x55\xda\xbc\xcd\xfa\x2b\xf1\x9f\x88\xe0\x1f\xaf\x77\x75\x8f\x91\x8e\x78\x42\x6b\x3e\xb0\xa8\x40\x95\x59\x66\xd0\xdb\x7a\xcc\x96\x41\xb0\xc2\x93\xb5\x22\x5b\xc7\xba\x59\xf3\x20\x6b\x07\xef\xb9\x15\x85\xc8\xc4\x64\x1e\xee\xa0\xeb\x03\x53\x97\xc7\xa1\x44\x95\x23\x27\x02\x9a\x43\x74\xb5\xb0\xe5\xd1\x17\xb2\x76\x44\x5f\xc8\xd2\x88\xf6\x81\xc5\x11\xed\x03\x5b\x8c\x68\x1f\x58\x31\xa2\x7d\x60\x79\x44\xfb\x40\xb4\x0f\xb4\x19\xaf\xdf\x3e\x40\xa2\x2f\x64\xdd\x88\xb2\x4e\x3d\xa2\xac\xb3\xf9\x88\xb2\xce\xf2\x88\xb2\x4e\x94\x75\xa2\xac\x13\x65\x9d\x5d\x47\x0b\xe4\x2e\x44\xda\x79\x8a\x4c\x21\xd2\x47\x32\x64\xac\xbd\x3a\x11\xfd\x4c\x24\x55\x65\x12\xf3\x88\xf3\x7c\x28\x9a\x5b\x13\x7a\x8f\xfc\x4b\x70\xb0\xe9\x09\xb6\xe4\x6d\x0e\x44\x60\x13\x89\x42\xa4\x47\xea\x78\x87\xc0\xf3\x98\x61\x13\x33\x6c\x7e\x05\x19\x36\x53\xaa\x5c\xe1\x24\x24\xad\xeb\x13\x6e\x82\xe3\x7f\x0b\x32\xff\xd5\xe6\xdb\x18\x84\x73\x08\x83\x7d\xea\x6a\xa4\xb0\xb0\x4b\x9d\x6f\x17\xd2\x61\x13\x62\x4e\x2f\xb3\x2d\x7a\xd2\x14\x52\x52\x80\xec\x5b\x24\x13\x64\xcc\x5c\xfd\xb0\x05\xfc\x75\x10\x7e\xe1\x79\x33\x4d\x48\xbc\xe8\xe4\x99\xe6\xa7\x74\xe6\x9b\x0a\x5d\x74\x0d\xae\xf8\xe2\x52\x69\xba\xd1\x4a\xfb\x44\x3b\x77\xda\xb7\xad\xf4\xd2\xae\x94\x48\x54\xf2\x6e\xb6\x2a\x93\xbc\x7e\xac\x2c\x6e\xfb\x3f\x25\xc8\x39\x11\x33\x90\xb5\x62\x54\x75\xf7\xe9\x55\x4d\x6a\x12\xea\x0a\x28\x77\x63\xe0\xe9\xc4\x14\xd1\xa5\xa6\xde\xb5\xd7\x90\xec\x59\xf5\xe4\xf5\xa3\x5b\xc5\xa1\x43\xb5\xe1\xa5\xd5\x62\x5e\x3f\x3a\x35\xbf\x91\x8e\x4d\x70\xa4\x43\x33\x1c\xe9\xd6\x14\x47\x3a\x37\xc7\x91\x2e\x4d\x72\xe4\xb3\x57\x90\x5e\x3f\x3a\x36\x1f\x91\xce\xad\x74\xe4\x05\xd6\xa3\x5e\x3f\x3e\x01\xb8\xbb\xb4\xd8\x91\x58\xdd\xba\xf5\xe8\xda\xa0\x46\xba\x36\xaa\x91\xae\xf1\x70\xa7\x2a\xda\xeb\x47\xac\xaf\xfd\x09\xe4\xb4\xce\x84\x88\xb6\x35\xb9\x9f\x5a\x68\x07\x38\x59\xf5\xfe\xfd\x5c\x0a\x90\xe5\xd2\x75\xc3\x59\xf3\xee\xa0\xd7\x17\x86\x6a\x86\x8d\x51\x7d\xdc\x2a\x62\x34\xfe\x9e\x7a\x83\x57\xc9\x83\xe2\x71\xc1\x64\x4b\xad\x67\x6a\xd3\x59\xd5\x7c\xc6\x28\x05\x75\xd3\xaa\xe0\x61\xbc\x77\x60\xc3\x49\x6b\x69\x82\xa7\x8b\x01\xa6\xf5\x13\xa8\x5f\xd8\x76\xb8\x07\xde\x8e\x7d\xa8\xea\x3b\x0e\x06\x61\xe7\x5c\x37\xe3\xd1\xff\xf9\xbf\xc7\x8d\xea\x2d\xf5\x84\x51\xfb\xdb\x78\x44\xed\xaf\xd5\x88\xda\xdf\xda\x11\xb5\xbf\x16\x23\x6a\x7f\x9b\x8d\xa8\xfd\xad\x1f\x51\xfb\x8b\xda\xdf\x0e\x23\x6a\x7f\x51\xfb\xdb\x75\xfc\x8a\xb5\xbf\x6e\xa3\x9a\x43\x5d\xcc\x05\x89\xa0\xfc\xa8\xa9\x66\x49\x1d\xf1\xec\xef\xb2\xff\xea\x56\x07\x0c\xf5\xbb\xd5\x1a\x60\xa8\x25\x2e\x69\xc1\x83\x27\xd4\xbd\x4a\x21\x5c\x7a\xf2\x71\x4d\xf0\xb5\x45\x6e\x77\x86\x89\x81\x4b\xb8\x53\x54\xbc\xf5\x81\x65\x75\xe3\xf6\x2a\xea\x2c\x25\x47\xde\x17\x8f\x8d\x58\xb8\xd0\xcd\x8b\x5c\xb3\x7e\x7d\x47\xe5\x9d\xc7\xa0\x9a\x46\x3e\x7f\xc3\x85\x5c\xc5\xb0\x55\xf1\x51\x35\xf6\x18\xf2\x08\xb2\xb1\x06\x6c\x7c\x3b\x66\xdc\x46\x3a\xfa\xa6\x41\x82\xfb\xa0\x29\x4b\x4f\x6d\xeb\x05\x87\xe7\x56\xf4\xc5\xf5\xa0\xfc\x5b\xc3\x2e\x88\xf2\xa1\x78\xc8\x28\x77\xc9\xb0\x82\xfb\xae\xf6\xb6\x53\x7d\x2d\x2f\x57\xbd\x58\xaa\xb7\x0f\xc8\x05\x62\x7d\x38\x31\x53\x08\x1f\xd7\x26\xa2\x1b\x44\xde\xaf\xc2\x0d\xf7\x5b\x17\x6e\x58\x88\x18\x89\x75\x1b\x62\xdd\x86\x56\x75\x1b\xf0\xa2\x3d\xdc\x9d\x17\x70\x20\xff\x70\xed\x95\x24\x20\xa8\xf2\x32\xd3\xac\xa8\x23\xb0\x95\x7d\x55\x66\x35\x89\xb1\x8b\x04\x6d\xe2\xbb\x79\x1b\x4d\xa6\x8b\x78\x8f\xf3\x61\xc4\xb6\x42\x72\xe2\xa2\x2d\xb1\x19\x12\x56\x1c\xf0\x6a\x87\x0d\x29\x65\x2f\x3f\x52\xf0\x1c\x09\xb6\xaa\xb5\x66\xdb\xab\xcb\xd0\xf9\xcc\xa0\x84\xa1\xd8\x8f\x30\x88\xb0\xa1\x05\x46\xad\xb2\x19\xf0\x9a\x4b\x1c\xa9\xe3\x63\x2f\x0d\x75\xca\xbd\x3e\x09\xf7\xf9\x7b\xc0\x25\xfe\x7d\x13\xfe\x83\x1f\x54\x71\xa0\x1a\x7c\x35\xff\x79\xd9\x21\x91\xed\xa3\xdb\xba\xb0\xc8\x75\x16\xd5\xf6\xec\x11\x6d\xbf\xa6\xda\x17\x7b\xe9\xc3\xd8\x3b\xad\xe3\x75\xf8\x2d\x62\xc2\xe8\xe6\xe3\x25\x24\x8c\x3e\x93\x6f\xe2\xe5\xe4\x8d\xbe\x58\x7f\xc4\x4b\xc9\x1b\x8d\x3e\x88\xad\xc6\x6b\x4d\xe7\x6c\x8e\x0e\x7d\x0e\xd1\xdf\xd0\xb1\x4c\xd5\x09\xf3\xff\x34\x7e\x86\x4e\xf0\xaf\xd3\xe8\xb2\x18\x59\xf6\x9c\x91\x65\x51\x0b\x8b\x5a\x58\x73\x44\x2d\x6c\x69\x44\x2d\x6c\x8b\x11\xb5\xb0\xf5\x23\x6a\x61\xcb\x23\x6a\x61\x51\x0b\xdb\x60\x44\x2d\x2c\x6a\x61\x9b\x8e\x5f\x99\x16\xd6\x5d\xbd\xf5\x18\xe1\xf5\x09\x22\xbc\xba\xa1\x84\x1d\xd0\xbf\x4e\xb0\xae\xa3\x88\xae\x18\xcd\xb5\xdf\xd1\x5c\x2d\xcb\xce\x71\xcd\x3e\x4d\xe9\xb9\x70\xb7\xd7\xd5\x9f\xa3\x33\xc1\x52\x52\x94\xda\x55\xdf\x8a\x35\xe8\xf6\xb9\x06\x5d\x63\x47\x63\x21\xba\x8d\x0a\xd1\xad\x83\x59\xac\x46\xb7\x66\xec\x4f\x8c\x59\xac\x46\xb7\xed\x88\xd5\xe8\x56\x8f\x58\x8d\xee\x91\x11\xab\xd1\xc5\x6a\x74\xb1\x1e\x41\x8b\x11\xeb\x11\xac\x18\xb1\x1e\xc1\xee\x23\xd6\x23\xd8\x68\xc4\x7a\x04\xb1\x1e\x41\x73\x44\x2f\x54\xbb\x11\xeb\x11\xb4\x1c\xd1\x33\x15\xeb\x11\xb4\x9a\x30\x56\xa3\x7b\x55\x31\x83\x24\x6a\x7f\x51\xfb\xdb\x78\x44\xed\x6f\xed\x88\xda\x5f\x8b\x11\xb5\xbf\xcd\x46\xd4\xfe\xd6\x8f\xa8\xfd\x45\xed\x6f\x87\x11\xb5\xbf\xa8\xfd\xed\x3a\x7e\xc5\xda\x5f\xac\x46\xb7\xf7\xb1\x8a\x64\x1f\x33\x92\x62\x35\xba\x18\xbf\xb8\xd3\x76\xc7\x6a\x74\x4f\x8f\x5f\x7d\x35\xba\x46\x2c\xdd\xf3\x95\xa4\xdb\x7e\x19\xb1\x2e\x5d\xac\x4b\x17\xeb\xd2\xc5\xba\x74\xb1\x2e\x5d\xac\x4b\xb7\xf9\xd8\x7f\x6f\xc6\xde\xe9\x1f\xaf\xc3\x83\x11\x2b\x22\x6c\x3e\x62\x45\x84\xb5\x23\x56\x44\x88\x15\x11\xa2\x37\x62\x97\x11\x2b\x22\x6c\x39\xa2\xe7\x21\x56\x44\xd8\x6a\xc4\xba\x74\xaf\x26\xc6\x2c\x6a\x61\x51\x0b\x6b\x8e\xa8\x85\x2d\x8d\xa8\x85\x6d\x31\xa2\x16\xb6\x7e\x44\x2d\x6c\x79\x44\x2d\x2c\x6a\x61\x1b\x8c\xa8\x85\x45\x2d\x6c\xd3\xf1\x2b\xd3\xc2\x62\x5d\xba\xbd\x8e\xf5\x8a\x75\xe9\x56\x8c\x18\xd7\xb5\xdf\x71\x5d\x3b\xe2\x0a\x2d\xb5\xc8\x45\xc9\xf5\x0d\xc8\x19\x4b\xe0\x34\x49\xcc\x5f\xb7\xe2\x0e\xb6\x8c\x25\x6a\xaa\xa1\x8f\x4c\x4b\x18\x4f\x59\x82\x8a\xe4\xfd\x14\xb0\xac\x9c\x91\x6f\xf1\x3e\x42\xed\x8d\x44\xe3\x9d\x35\x7a\xe1\x3a\x0d\x51\xc3\x00\x1b\x9c\x7a\x5b\x78\x59\x08\x8d\x84\xc8\x80\xf2\x2d\x9e\x74\xdc\x10\xe4\x96\xa7\xb9\x01\x90\xf7\x8e\x14\xd7\x93\x91\x11\x64\x82\x4f\x5c\x3c\x8f\x3b\x01\x03\x72\x56\xdf\x90\x50\x8e\x87\xa7\x94\x12\xb8\xce\xe6\x08\x07\x2c\x70\x85\x5a\x43\x2e\x66\x90\x22\xc9\xc6\x30\x22\x2b\x47\x52\x4d\x32\xa0\xe6\x5d\x1c\xea\x97\x99\xc3\x43\xc9\x10\xe7\xb7\x93\x8e\xc0\x85\x36\xed\x04\xc4\xed\x69\xe3\x4e\xd4\x70\xc1\xb2\xe1\xc4\x26\xe4\x4b\x09\xea\x47\xc1\x17\xe2\xd1\x9c\x8b\x92\xdc\x53\x2b\x29\xc9\x92\xe3\x61\xc6\x4f\x37\xa0\xdd\xf2\xe5\x2d\x64\x92\xdd\xcd\x0f\x7d\xa4\x6a\x5b\x3e\xd6\xc6\x1c\x40\xe5\x64\x27\x26\xd5\xd8\x9a\xc3\x53\x39\x29\xad\x48\xe8\x50\x19\xb8\x96\x73\x8c\xb7\xb3\x32\x45\x80\x89\x39\x9d\xc0\xe1\xa1\x22\x67\x1f\xce\x0d\xf9\x2b\x95\xa1\xd6\xae\xca\x9e\x23\x87\x85\x14\x33\x96\x1a\xe4\xfe\x9e\x4a\x46\x47\x99\x91\x3b\xc7\x20\x81\x1b\xb1\xe0\x8b\xa3\xef\x4f\xaf\x7f\xbe\x3a\xfd\x70\x71\x8c\x12\x28\x3c\x14\x94\x9b\x53\x51\xaa\x3a\x50\xd4\xbd\xce\xbc\x08\xf8\x8c\x49\xc1\xcd\xfa\x50\x57\xa3\x64\xe6\x67\x4d\xaa\xc3\x20\x41\x89\x6c\x06\xa9\x95\x93\xab\xb7\x79\xae\xc3\x78\x51\x6a\xaf\x3b\x62\xf8\xa2\x39\x40\x3c\x99\x52\x3e\x31\xeb\x3c\x17\xa5\x99\xef\x8b\x2f\x70\x45\x12\xd2\x32\xb1\x92\x13\xf5\x58\xfb\x45\xcf\x73\x0a\x43\xeb\x95\x2d\x89\xa8\x12\x5a\xf8\x35\x87\x9f\xa5\xe6\x5c\xd3\x87\x77\x36\x7e\xef\xe0\x8b\xe0\xd2\x81\x2f\x27\x29\xcc\x2b\x2c\xbf\xb1\xab\xca\xb0\x92\x61\x46\x0e\xc2\xbb\x07\xe4\xc2\xbc\x03\xd2\x10\x80\x36\xfc\x12\x66\x20\x51\xf3\x74\xe0\xeb\x11\x09\x13\x2a\xd3\x0c\x14\x06\x1e\x7a\xda\x6c\xb5\x03\x07\x30\xa8\xf4\x5a\x2e\xf4\x2a\x62\x42\x3e\x08\x0c\x42\x1c\x8b\x77\x64\xaa\x75\xa1\xde\x9d\x9c\xdc\x95\x23\x90\x1c\x34\xa8\x01\x13\x27\xa9\x48\xd4\x89\xa6\xea\x4e\x9d\x30\x6e\x0e\x57\x3f\xa5\x9a\xf6\x83\x53\x7d\x62\x39\x77\x3f\x11\x79\x4e\x79\xda\xa7\x0e\xbb\xfa\xd5\xb6\x9e\xfc\xd6\xf1\xd4\x3e\xad\xee\x62\xbc\x4f\xfb\x6a\x0a\x59\x76\xb8\x03\x3e\xb7\x93\xf9\x5a\xc8\x7a\xad\x64\x3c\xf7\xed\xed\x0f\xf0\x45\x75\x5e\x2d\x0c\x06\xe4\x4a\x68\x17\x1f\xeb\x42\xb1\x91\x8e\x22\x7c\xd7\x1e\xe9\x8b\xab\xdb\xeb\x7f\x0e\x3f\x5e\x5e\xdd\xc6\x93\x1d\x4f\x76\x3c\xd9\x2d\x4e\x36\xf0\x59\xeb\x53\xed\x65\xce\xe0\x98\x54\xfb\x8d\x9c\x5a\x81\xf6\xc7\xa0\xda\x80\xd6\x12\xa2\x1d\xcf\x06\xf5\x06\x04\x2e\xf8\xec\x7b\xda\xb4\xb0\xf3\x95\xe0\x20\xee\x06\x2b\x28\x57\x32\x78\x9b\xf8\xf8\x16\xd6\xac\xb6\xee\xab\x9d\xa4\x48\x3b\xda\xbb\x96\xcc\xab\x77\x37\x34\x34\xb6\xef\x8a\xe6\x75\x85\xea\x15\xbb\x36\x20\x1f\xbc\xda\x43\xce\x7e\xbe\x3c\xbf\xb8\xba\xbd\xfc\xea\xf2\xe2\x7a\x77\x3d\xba\x03\x8b\x0b\xda\x14\x3a\x02\xc0\xe1\x8e\x5c\xb2\x90\x30\x63\xa2\x54\xd9\xbc\xb2\x82\xac\x26\x02\x8b\xa7\xdf\xf9\x7d\xe7\x95\x3e\xbe\xf2\xb1\xc8\x6c\xbb\x65\xb6\xe7\x30\xa6\x65\x66\xb5\xa7\x83\x83\xc1\x2e\x5c\xce\x8e\xae\xd0\xf7\x2b\x29\x5a\x54\x60\x6e\xa0\xf0\x8d\xad\xdd\x3e\x16\x72\xed\x31\x3e\x74\xd1\x07\x0d\xd6\xe3\x84\x47\x6b\xa1\x73\xd2\xa3\x75\x92\xb5\x84\x4e\x4b\x2f\x43\x37\xbe\xf7\x44\xf0\x31\x9b\x7c\xa0\xc5\xb7\x30\xbf\x86\x71\x3b\x33\x71\x13\xde\x68\x7d\x74\xae\x64\xb4\x55\x1a\x76\x66\x5f\xd6\xce\x4d\xd3\x99\x93\xa6\xab\xe8\x8c\xf6\x91\x19\xdd\x05\x52\x74\x12\x44\xb1\x54\x0f\xdf\xda\xa1\x9d\x45\xb9\xab\x18\x9b\x4e\x3c\xf7\xed\xb8\xbc\x1f\x4d\x66\x17\xb2\x7b\x47\x67\xf5\xa6\x6a\x47\x22\x78\x02\x85\x56\x27\x62\x66\x38\x17\xdc\x9f\xdc\x0b\x79\x67\xf4\x08\xa3\xbb\xf6\x2d\xd6\xaa\x13\xf4\x19\x9c\xfc\xd6\xba\xc1\x6e\x3f\x9e\x7f\x7c\x47\x4e\xd3\xd4\x35\x37\x29\x15\x8c\xcb\xcc\xb5\x13\x18\x10\x5a\xb0\xef\x41\x2a\x26\x78\x8f\xdc\x31\x9e\xf6\x48\xc9\xd2\x2f\x77\x27\xce\x7e\x74\xb8\x0b\xa2\xb0\xae\xce\x8e\x77\xe2\x06\x7d\x2c\xf3\x06\xef\xaa\x88\x88\xe1\x5a\x4c\x2b\xc4\x4d\x6f\x75\x76\x42\x46\x47\xa0\xd9\xde\x44\xbf\x38\x70\x0b\xbb\xa5\xab\x87\x35\x61\xb5\x2e\x4e\x87\xa8\x85\x48\xdf\x11\x55\x16\x85\x90\x5a\x91\x1c\x34\x35\x4a\xef\xc0\x60\x58\xaf\xf9\x27\xfa\xaa\x7a\xe4\xbf\xaa\x1f\xd1\xe1\xa4\x7e\x38\x3c\xfc\xfb\xb7\x17\xff\xfc\xf7\xc3\xc3\x9f\xfe\x2b\xbc\x8a\xac\xd0\x46\x01\x35\x6f\x51\x05\x24\x03\x2e\x52\xb8\xc2\x77\xe0\x9f\xaa\xe1\x66\x71\x17\x34\xd5\xa5\x1a\x4c\x85\xd2\x97\xc3\xea\xcf\x42\xa4\x8b\x7f\xa9\x16\x12\x07\xd9\x4f\xc6\x80\x5b\x34\xa4\x7a\xba\x27\xec\xa1\xa6\x25\x1d\x1f\x55\x37\x6b\xd8\x44\x27\xa7\xf8\xcf\xaf\x3c\x08\x8c\xf4\x74\x2f\x99\xd6\xe8\x7a\x73\xa9\xe0\x62\xdc\x33\xa7\xb6\x16\x3b\x67\x6f\x5b\xd7\x47\xe9\x94\xb4\x55\x3b\xd8\x31\xc0\x10\x22\x0e\x5a\xf6\x20\x57\x0c\x76\xd9\xc5\x7c\x3a\xbc\x24\x33\x0b\xe1\xbd\x01\x8e\x4f\xef\xfd\xea\x93\xd2\xb8\xaa\xe9\x92\x03\x55\xa5\x21\xbe\xb3\x41\x41\x55\x92\x31\xc9\x58\xce\x5c\xac\xa1\x6b\xd0\xa4\xc8\x91\xfd\x71\x90\x14\x65\xcf\xdd\x30\xc8\x21\x17\x72\x5e\xfd\x09\xc5\x14\x72\xa3\x69\xf5\x95\x16\x92\x4e\xa0\x57\x3d\x6e\x1f\xab\xfe\xb2\x0f\x36\x5e\xb0\xfc\xb4\x55\x85\x6b\x57\xa9\xa3\xc8\x90\xbe\x3e\xda\xe6\x41\xbf\x27\xa4\xad\xc2\x8c\xab\x4f\x20\x12\x56\x96\x38\x2b\x70\x56\x50\x44\x7d\x72\x26\xb2\x32\x07\xd5\xab\xc4\x20\x6b\x0d\xe0\x33\xa3\x59\xaa\xbd\x12\xd4\x52\x36\x63\xaa\x8b\x30\xe2\x15\x72\x1a\x73\x11\xf9\xa2\xd4\x45\xa9\x5d\xbd\x99\xa0\xb1\x9b\x50\x68\xb7\xa8\x8a\x02\x34\xc8\xfe\xdb\x83\xf6\xd1\xe8\x54\x6b\x90\xfc\x1d\xf9\xcf\xa3\x1f\x7f\xff\x4b\xff\xf8\xcb\xa3\xa3\x1f\xde\xf4\xff\xf6\xd3\xef\x8f\x7e\x1c\xe0\x3f\x7e\x77\xfc\xe5\xf1\x2f\xfe\x8f\xdf\x1f\x1f\x1f\x1d\xfd\xf0\xed\x87\xaf\x6f\x87\x17\x3f\xb1\xe3\x5f\x7e\xe0\x65\x7e\x67\xff\xfa\xe5\xe8\x07\xb8\xf8\x69\xc3\x49\x8e\x8f\xbf\xfc\xa2\xf5\xd2\x29\x9f\x7f\x6c\x49\x40\xed\xe8\x77\x56\x2e\x68\x71\xc6\x8e\xe2\xac\x1f\xfa\xb5\xd2\xd4\x67\x5c\xf7\x85\xec\xdb\xa9\xdf\x11\x2d\xcb\x76\xc4\xa4\x66\x4a\x5d\x9f\x7f\xdf\xbd\xeb\x5d\xcd\x90\x2a\x76\xbd\x37\x07\x5c\x41\x22\x41\x7f\x0e\x4b\x8e\x7d\x93\x97\x53\x16\x62\x1e\x5f\x1b\x9f\xfb\x35\x18\x77\xaa\x90\x41\xdc\xd7\x5a\x12\x1d\x4b\x91\x0f\x48\xe0\xde\x98\x61\xc2\x87\xbb\xef\x0e\x5a\x58\x41\xfd\x88\xc6\xa0\x68\x0c\x5a\x33\x9e\x34\x06\xdd\x58\x3c\xdc\x5b\x4b\x10\xf0\xd9\xae\x2e\x8c\x95\x1e\x74\xaf\xeb\x68\x41\x0a\x51\x94\x19\xd5\x6b\x3c\x63\x2b\xdc\xe9\xee\xa8\xd7\xf1\xc8\x75\x30\x8d\x65\x68\xf9\x6a\x1f\x26\x39\xcd\x32\xc2\xb8\x3d\xf8\x38\x81\x77\x98\x49\xb0\xaa\x0d\xa1\xd6\x9f\x3d\x33\x4b\xb8\x77\x65\xe5\xc2\xb8\x1c\x45\x94\xa6\x52\x63\xec\x31\x96\x9d\xb3\xac\xc4\x79\x9f\x18\xaf\x8b\xcf\x55\xc2\x61\x95\x0b\xb2\xb2\x33\x66\x46\x95\xf6\xcb\xc6\xd5\x68\x7a\x87\xde\xc6\x04\x52\xe0\x09\x60\x62\x5a\x09\xf5\xb7\x8e\x8c\xde\x46\x2e\xf8\xcc\xce\x41\x49\x5a\xda\x60\x10\x4b\xfe\x56\xcf\xf1\xba\x02\x10\x0c\x22\xde\xf8\x06\xc6\x55\x1c\x02\x52\xfd\x4a\xc3\xae\xf2\xfb\x2a\x2b\xab\x7a\x9e\xc8\x83\xf6\x3c\xb3\xf2\x6c\xb5\x12\x86\x96\x98\x65\x6d\x7e\x6e\x32\xc9\xd7\xe0\x0c\x6c\xcf\x3e\x7f\x75\xac\xb3\x23\xb6\xd9\x0d\xcb\xdc\xc2\x77\xd2\x25\x9b\xec\xc2\x59\x52\x48\x18\xb3\x87\x8e\xce\xe9\x29\xaf\x2d\x31\x2c\x05\xae\xd9\x98\xd9\x9e\xf7\x85\x84\x02\x78\x5a\x15\x2e\xc5\xe4\x70\xde\x84\xcd\x5e\x06\xf3\x58\x81\xbb\x5b\x52\x76\xb3\x4a\xd8\x8f\x74\x8c\x44\x3a\xb6\xf3\xf8\x4c\x74\xcc\x61\xee\xfe\x10\x31\x8c\x3c\x6f\x1f\xfd\x7e\xd6\x0c\x65\x47\x44\xde\x1a\xd1\xea\xcc\xae\x13\x9c\x45\xd9\x2c\xc9\x2a\x0d\xbb\x22\x8d\x5a\xd8\xe0\x35\x32\x65\x13\x03\xd9\x0c\x66\x90\x39\xb9\x89\xe4\x94\xd3\x89\xcd\xef\xd6\xc2\x9b\x6a\x8d\xa2\x65\xf0\x58\xb2\x74\x29\xee\x1e\xe5\x78\x83\xdb\x99\xa0\x29\x5e\x94\x22\xcb\x40\x2a\x92\xb1\x3b\x20\xe7\x50\x64\x62\xee\xd2\xb5\x79\x4a\x6e\x34\xd5\x06\xab\x6f\x40\xef\xe6\xf6\x6d\x85\xb1\xb8\xe2\x61\x99\x65\x43\x91\xb1\x64\x27\xa3\x4a\x73\xe7\x2e\x71\xbf\x8a\x32\xcb\x48\x81\x53\x0e\xc8\x47\x8e\x44\xe3\x34\xbb\xa7\x73\xd5\x23\x57\x30\x03\xd9\x23\x97\xe3\x2b\xa1\x87\x56\xfa\x6e\x06\xdc\xd9\x1b\x09\x1b\x93\x77\x58\xdd\x46\x13\x4d\x27\xa8\x3b\x79\x37\x60\xcf\xc0\x3f\x9c\xc0\xd2\x87\x7b\xa6\x56\x2a\x2b\xad\x11\xe7\xb7\x38\x93\xa1\x55\xf6\xef\xcf\xbe\x4d\x19\x1b\x43\x32\x4f\xb2\xf6\x47\xeb\x34\xc1\x00\x86\x3a\xe3\x3c\xc0\x6f\x57\x4d\xdd\xe5\x78\xa2\x16\xc8\x38\xb1\x65\xce\x6d\xfd\xf6\x1a\xd5\xab\x15\x59\x6d\x57\x75\xaa\x24\xee\xcc\x3c\xdb\xb2\xcd\x42\x28\x7d\x63\x34\xf4\x4e\x8a\xa1\x1f\x0e\xfd\x74\x04\x4b\x3e\x67\x19\xa4\x84\xe5\x39\xa4\x46\x8b\xcf\xe6\x84\x8e\x35\xe6\xda\x36\x2c\x04\x89\x04\x8b\xb5\xae\x8a\xc9\x94\xf2\x34\x03\x49\xc6\x94\x65\xce\x1e\xd0\xb8\x5f\x83\xcc\x19\x47\xb3\x80\xf5\xc8\xa2\x89\xc1\xfc\x95\x24\x42\xfa\xf2\xf4\x4c\x2b\x7f\xa9\x3e\x98\xc8\x47\x02\x04\x58\x74\x2d\x93\x51\x26\x92\x3b\x45\x4a\xae\x59\x66\x17\x23\xc4\x1d\x49\x44\x5e\x64\x78\x74\x5a\x9c\xac\xea\x9f\xfd\x0a\x95\xfa\x66\x76\x75\xf2\xdb\xfa\x12\xfe\xb0\x2b\x43\xef\x40\x10\xeb\x42\x0c\x83\x07\x48\x3a\xcb\xf3\xbf\x78\x80\x24\x28\x2c\x81\xfd\x18\xf0\x44\x63\x9e\x27\xbd\x83\x57\x54\xc9\xae\x45\x2e\x5d\x38\x1a\xf0\x3b\xb3\x73\xfa\x42\x58\xee\x15\x24\x63\x1c\xe9\x9b\xcb\xaf\x23\x8c\x2b\xc3\xd9\x1b\x87\xc1\x1e\x3d\x27\xb4\x92\x94\x49\xac\x82\x30\xaf\x02\xa9\xfd\x5c\x58\x60\x40\x08\x4d\x8e\x0e\x4f\x0e\x8f\x97\xec\x8f\x87\x46\x02\xc9\xc0\xd2\x5a\x9f\xb8\x57\x2d\x4a\xb1\xbc\xc8\xe6\xb8\x8e\xc3\xb4\x47\x98\xf6\x91\xd6\xb2\xe4\x7e\x55\x2e\xe9\xaf\x47\x94\x20\x5a\x52\x5f\x5d\xc5\xfe\x6a\x6e\xd2\xb2\x74\x54\xfe\xe8\xf0\x97\xc3\x1e\x01\x9d\x1c\x93\x7b\xc1\x0f\x35\x2e\x7f\x40\x6e\x85\x11\xa5\xeb\x89\xe6\xa2\x24\x1c\x6c\x60\x3f\x3c\x14\x19\x4b\x98\xce\xe6\x48\xb1\x88\x28\xb5\xcd\x21\xa6\xda\x27\x1b\x5e\x3c\x30\xed\xe2\xd5\x0c\xc9\x78\x83\xd0\xb4\x54\x8b\x50\x23\xe6\xcc\xe0\x64\x0a\x34\xd3\x53\x1b\x24\xc2\x05\xef\xff\x0b\xa4\xc0\x1c\x44\xee\xae\xbc\xba\xaa\x7f\x9d\x68\x0e\x86\x88\x7e\x0d\xdd\x35\xf1\xf9\xe6\xf6\x76\xf8\x35\xe8\x05\x92\x61\xde\xe2\x43\x77\xd0\x1a\x00\x72\x2c\x64\xbe\x07\xb4\xa3\x1b\x67\x65\x9f\x14\x42\xee\x03\x09\x9b\x0a\xd5\x6a\x2f\xc9\xd2\x7e\x0a\xa5\x51\x1b\x72\xd2\x18\x87\xc4\xec\x60\x33\x86\xc4\xf7\xb9\xb9\x1c\x0e\xc8\x3f\x45\x69\xbe\x66\x44\x47\xd9\xbc\xaa\xc4\xa0\x40\x93\x03\x33\xd5\x81\x21\x4f\x06\x1b\xbe\x01\x9a\x1a\x15\xc5\x50\x0f\xa0\xfb\xd1\xcf\x8a\xb8\xf3\xe0\xd6\xd6\x2d\x1f\x28\x95\x16\x39\x99\xba\xcf\x6e\xa6\x5e\xba\x93\x31\xc0\xd3\xe3\xf3\x9a\x24\x14\x96\xc2\xb9\x67\x5e\x1d\xfd\x5a\xa2\x1b\x16\xee\xee\xf7\x11\x96\xb1\x4a\x42\xb0\xb9\x86\x4e\x36\x31\x88\x5b\x60\x19\x54\x83\xdd\x5c\x25\xe1\xd8\xe3\xda\xa3\x3b\x27\x72\x2e\x4e\x84\x4e\xbd\xf6\xb1\x5e\x9d\x56\x1e\xed\x26\x6e\x80\xac\x32\xb2\x3a\x9c\xb1\xd6\x17\x6b\xcf\x41\x73\x8c\xf7\xa1\x26\x94\x0b\xce\x12\x9a\xb1\x7f\x41\x4a\xca\x42\x70\x17\x3f\x87\x72\x4e\x42\x15\xf4\xd1\xa9\xcb\xb5\xab\x99\x56\x67\x2b\x9a\xe3\xa8\x85\x40\xe1\x03\xdd\x78\x86\x3e\xda\xf7\xed\x6f\x81\xcd\xcf\x01\xe6\x6e\x50\x8c\x74\x09\x81\xa2\x83\x00\xf2\xe5\xf0\x71\x2d\x8c\xb6\x8b\x09\x9e\x96\x84\x23\x31\x52\x20\x67\xed\x51\xa0\xbb\x4f\x17\xbb\xdb\x15\xfc\x58\x91\x8d\x2d\x09\x2f\xf3\x11\xc8\x3a\xff\x45\xea\x65\x80\x04\xf1\x0f\x57\xf6\x76\x6f\x34\x6e\x36\x69\x34\x4f\xfe\xe5\xcf\x7f\xfe\xe3\x9f\x07\x76\xfa\x2a\x16\x82\x93\xcb\xd3\xab\xd3\x9f\x6f\xbe\x3f\xc3\x14\xdc\xb6\x50\xed\x28\xd0\xb3\xeb\x30\xcf\x4e\x83\x3c\x3f\x69\x88\x27\x26\x96\xb4\xa6\x22\x4d\x0f\x03\x4e\x69\x30\xc0\x68\x87\x46\xaf\x75\x12\x66\x50\x12\xcd\x48\xb4\x4d\x73\xad\x39\x6a\x7b\x71\xc6\x74\x52\xdc\x88\xe4\xae\x43\xed\xe9\x1c\x0a\x09\x89\xb5\xc6\xdd\x9e\x0d\xed\xec\x46\x8b\xbd\xfa\x78\x5b\x27\x34\x60\xd4\x0f\x79\xef\xad\x58\xdf\x38\x7b\x9d\xd1\x7c\xef\xa0\xd0\x95\x81\x60\x44\x93\xbb\x7b\x2a\x53\xb4\x9f\x51\xcd\x46\x2c\x63\xb6\xc4\xb0\x6f\x3d\xc9\x85\x0d\x2b\xb4\xa5\xd4\xc4\x78\xb1\x80\x67\x6d\x74\x45\xc3\x98\x65\x81\x63\xca\x32\xb4\xd3\x96\x5c\xb3\x1c\x5c\xdc\x51\x52\x54\x86\xc3\xd0\x72\x1e\x55\x3c\x3f\xf6\x56\xc5\x3b\xfc\xe8\x7d\x87\x5b\x6b\x7b\x6d\xa3\x1f\xf7\x98\xd5\x39\x16\x67\xd3\x4e\x22\xab\xfb\x55\xb0\xba\x42\xc2\x8d\x16\x45\x47\xbe\x18\x3b\xd9\x1a\x4f\xcc\x08\xc6\xc2\x10\xe1\xb5\xae\x15\xdf\x89\x98\x63\x0a\xa2\xb7\x9d\x89\x86\xfb\xc4\xc6\x7d\xaa\x32\x99\x7a\x33\x28\x07\xa5\x4e\xd0\xe9\x52\x16\x56\x37\x46\x72\x5d\x4a\xe8\x99\xaf\x83\x1c\x57\xd7\xab\x73\x29\xcc\xeb\x81\xdb\x1f\x41\x27\xd6\x3e\x1c\x10\x72\x2c\x3f\xea\x96\xbf\xe8\xac\x49\x24\x55\x53\xc0\x22\x26\xf0\xc0\x7c\xcf\x95\xa1\x48\x0f\x0f\xeb\x4f\x31\x8c\x65\x22\x69\x02\xa4\x00\xc9\x84\x61\x46\x25\xd7\xa9\xb8\xe7\x64\x04\x13\xc6\x95\x07\x85\x99\xdb\xc3\x0c\xbd\x3e\x4c\x55\xe5\xe7\x06\xe4\xba\x51\x52\xc5\x25\x3b\x25\xa2\x3e\x9a\x6e\xcd\x8b\xfe\x2a\xe4\x58\x41\x63\xe6\x0a\xc2\x3e\x08\x57\x6f\xb0\xe4\xa3\x92\xe3\x9b\x53\xc8\xe8\xdc\xc6\xb4\x8e\x19\x47\xcd\x51\xaa\xe3\x0e\xfc\x5a\x06\x84\xf5\xb5\xb5\xeb\xc0\x86\x00\x34\x99\xb6\x73\x31\x47\x47\xd8\x86\x23\x3a\xc2\xda\x4c\x12\x1d\x61\xd1\x11\xf6\xc4\x88\x8e\xb0\xe8\x08\x5b\x18\x7b\xab\x25\x45\x47\xd8\xce\x23\x3a\xc2\x1e\x1f\xd1\x11\xb6\xc1\x88\x8e\xb0\x0d\x47\x74\x84\xad\x1f\xd1\x11\xd6\x6e\x31\xd1\x11\x16\x1d\x61\x6e\xfc\xfa\xac\x83\x7e\x44\x47\xd8\xd2\x24\xd1\x11\x16\x1d\x61\x1b\x8f\xbd\x55\xf1\xa2\x23\xcc\x8e\xe8\x08\x6b\x8e\x5f\x17\xab\xf3\x6e\xa4\xa1\x51\x28\xdb\xe7\xe7\x0d\xd1\x75\xc1\x12\xe7\x8d\x0a\x1b\xe0\x55\xaf\x0a\x7a\xde\x05\x25\x4e\x7c\x5a\x91\xf3\x3b\xd5\xde\xac\x95\xb9\x5f\xdb\x3a\x44\x7c\xc2\xa4\x3a\x29\x84\xfd\x4f\xed\x0e\x09\xfc\x20\x56\xad\xde\x3d\xff\xee\xd9\x32\xcb\xda\x38\x3f\x3e\x8f\xe3\x63\x4f\xbc\x44\x1d\x38\x3b\xa2\xa3\xe3\xd5\x39\x3a\x5e\x4f\x07\x60\xe7\xff\xbf\x9d\x4a\x50\x53\x91\xed\x8c\xe8\x0d\x24\xff\xc0\x38\xcb\xcb\xdc\xe0\x9c\x32\xf8\xcc\x66\x55\xa0\x81\xaa\xd0\xd5\x52\x6c\x6b\xab\x34\x37\xb2\x14\xb0\x70\x2b\x65\x99\xd9\x46\xcc\x45\x9d\xd2\x99\xc1\x75\x55\x26\x09\x00\xb6\x85\x0b\x35\x9c\x3f\x0e\xaa\x37\x55\x6d\x40\xde\xb6\xa3\x37\xed\x98\xb8\x2d\xad\x8a\xb3\xfc\xf1\x0f\x3b\xcd\x31\x91\x45\x37\x74\xf9\xeb\xeb\xe1\x59\xd8\xf2\x9b\x7b\xb2\xcc\xf8\x4c\x64\x08\x55\x6a\x6f\x32\xc2\xda\x33\x12\xe9\xf6\x6a\x47\x2b\x95\xa3\x0b\x1e\xd1\x56\xaa\x6e\xda\xcd\x8c\xec\xdc\xb4\x1c\x4d\x70\x2f\x6d\x05\xff\x8d\x65\xe7\xd6\xd4\xad\xbd\x3c\xdb\xfe\x38\x10\x2c\xb1\x83\x1f\xde\x19\x80\x0f\x5c\xcb\x69\xcf\x82\x43\xc5\xc5\x77\xb5\xd2\x82\x14\x19\xad\xfb\x52\xe1\x0e\x7c\x83\x7c\xe3\x6c\x0a\xc9\xdd\xb5\xf3\xd1\x1e\x29\x80\x4a\x9e\x9c\x30\x3d\x2d\x47\x83\x44\xe4\x27\xe6\x18\xdb\xff\x8c\x32\x31\x3a\xc9\xa9\xd2\x20\x8d\x88\xe9\xd8\x52\x3f\x31\xb3\x30\x3e\x19\xe4\xe9\xf1\x80\xfc\xc8\x6d\x76\x7d\xdd\x07\x33\xa8\x2d\x61\xde\xef\xeb\x7c\x8c\xc0\x50\x44\x21\xc3\xf6\xe5\xa3\x39\x2e\x6f\xd0\xa6\x50\x73\x6b\x36\xd2\xd2\x3f\xfe\xf9\x7d\xe3\x91\x72\x91\x0e\x8c\x24\x2f\xcd\x07\xde\x59\x2c\x48\x07\xbe\xef\x3d\xf2\x7b\xef\x8d\x38\xbb\x2f\xbe\xee\x3d\xac\x76\xdd\x81\x7f\xbb\x0b\xdf\x76\x77\x7e\xed\x4f\x50\x14\xfa\x25\xfb\xb3\x3b\x34\xfa\x75\xe4\xc7\xfe\x1c\x3e\xec\x4e\xbe\xba\xad\xef\xfa\xf3\xf9\xad\xbb\xf9\xdc\x2e\xd5\x8d\x97\xea\xab\xee\xc0\x78\xdf\xa5\xe1\xbe\x33\xa3\xfd\x27\xf3\x4d\xb7\xf7\x4b\xef\x81\x4f\xba\x35\x90\x19\x67\x9a\xd1\xec\x1c\x32\x3a\xbf\x81\x44\xf0\x74\x67\x3e\xb6\x50\x8b\xb4\x3a\x3f\xca\x4e\xeb\x2c\x58\xcd\x44\x8f\x29\x75\x25\xd7\x8d\xde\x66\x13\x5b\xbc\x97\xc3\x89\x2d\xe8\x6f\xb6\xab\xdc\x4b\xbf\x05\xd9\x1b\x53\x99\xcd\x7a\xe9\x72\x13\xbf\x11\xf7\x44\x8c\x35\x70\x72\xc4\xb8\xdf\xc7\xe3\x40\xd9\xac\xed\x96\x15\x5a\x9b\xab\x6f\xdf\xf8\x9b\x5f\x9f\x41\x12\x4d\xaf\x4a\x7d\x7a\xfb\xb0\x7b\xd1\xd3\x06\x62\x77\xe3\xb8\xcc\x9a\x46\x62\x6b\x38\x6e\xd2\x9b\xb7\x75\xd1\xe8\xb7\x38\x6f\x75\xda\x28\x4f\x89\xcb\x84\x7b\x7d\x9b\xd6\x3a\xe2\xa6\x29\xfa\x55\x11\x36\x4f\xd9\x93\x6f\xcf\x86\xd1\x9c\xbc\x5f\x46\x99\x67\x8a\x5a\xd9\x43\x41\xf7\x85\x46\xaa\x44\x41\x77\x8b\x11\xe4\xc6\x7e\x2d\x69\x02\xc3\xce\x65\x04\x7f\x9c\x48\x5a\x4a\xea\x08\x60\x25\xf2\xf9\xc3\xc3\x01\x52\x7b\x9a\xaa\x7c\x62\xcc\xd4\x1d\x97\x59\x36\xb7\x36\x87\x46\xf6\xb5\xf5\xc2\x2f\x26\xf3\xa2\xe1\x7f\xc5\x5b\x6a\xc1\xb2\x90\xc2\xf1\x4c\x59\x72\x6e\x68\x70\xdd\xf9\x0d\x05\x49\x2c\x46\x4d\x1b\x29\xc3\x8a\x4d\xcc\xf2\x0d\xff\xc3\x6c\xe2\x3a\x34\xb1\x31\xa1\x79\x7a\x2c\x64\xc2\x46\xd9\x9c\x4c\x69\x56\xb5\xf9\xa1\xe4\x8e\x65\x99\x9b\x66\x40\x6e\x40\x5b\xc7\x85\xe5\x9d\x99\xe0\x13\x5c\x1c\xe5\xbe\xbd\x24\x24\xe6\xd9\x24\x03\xca\xcb\xc2\xbe\xcf\x70\xe2\xb9\x28\xa5\x7f\xdf\xa0\x72\x7f\x54\x1c\x98\xb3\xac\x17\x34\xb1\x7b\x74\x63\x6b\x13\x8d\x32\x02\xc0\x47\x5f\x7c\xbb\x17\xce\xe9\xeb\xa3\xab\xa0\x85\x51\x21\xc5\x8c\xa5\xd6\x87\xe2\xc1\x86\xed\xb2\x6d\x9b\xa2\xea\x3c\x73\xc1\xfb\x1c\x26\x14\x05\x15\x77\x8a\xec\x9e\xd9\x79\x6c\x6c\x01\x4f\xb1\x71\x91\x91\xf0\x45\xd1\x48\xe7\x9f\x31\xdb\x72\x39\x80\x1c\x39\xe2\x82\x08\x8c\x54\x2d\x39\xd3\xb6\x8d\xff\xb4\xd4\x24\x15\xf7\xfc\xd8\xd9\xac\x98\x22\x94\x8c\x40\xd3\x20\xd6\xd4\x31\x38\x45\x80\xd3\x51\x66\xf6\x1c\x43\xb1\x6e\x57\x02\x88\x8c\x81\xea\x52\x02\x99\x50\x0d\x2b\xe5\x1c\xfb\xbd\x8f\x83\x97\x29\x67\x60\x1d\x93\x92\x2b\x68\xc9\xde\x3b\x13\x8e\xfe\xf2\xa7\xdd\x68\x04\xcb\x41\x94\xfa\xb3\x68\x7f\xf7\x53\x96\x4c\x43\x61\x96\xe5\xa0\x88\x28\x17\xd4\xe2\xb7\xee\xb1\xd5\x3b\x14\x55\xc0\x55\x63\x57\xf3\xf1\x0a\xeb\xd7\x62\x39\x86\xba\xbf\x37\x46\x90\x9f\x5f\xdd\xfc\xfc\xfe\xf4\x3f\x2e\xde\x0f\xc8\x05\x4d\xa6\x61\x4d\x0e\x4e\x28\x12\x0d\x24\x14\x53\x3a\x03\x42\x49\xc9\xd9\xff\x94\xce\xad\x7c\x54\x3d\x7b\xdc\x69\x45\xfa\x1d\xb9\xaf\xa1\x36\x3b\x61\xfc\xca\xa6\x77\x38\x9b\x8b\xd8\x12\x0a\xb0\x4d\xcd\x92\xf8\x54\xf9\xb2\xe7\x56\x45\x40\x81\x0b\x03\xeb\xcf\x3f\x5e\xdc\x60\xc0\x7e\x21\x6d\xa5\x12\x8c\xf0\xc2\xeb\x38\xd3\x08\xcc\x13\xae\x3f\xf1\x80\x9c\xf2\xb9\xbd\x68\xcf\x14\x53\x24\x63\x4a\x03\x72\x3d\x27\xb6\x79\x2f\xf9\xc1\x9b\x01\xfe\xef\x80\xd0\x34\x95\x46\xae\xab\x02\xd7\x92\xa5\x48\x52\x2b\xf9\xb1\x51\x16\x7c\x00\x07\x6d\xe3\xd4\x3e\x88\xd4\xad\x1c\x39\x09\x7a\xc8\x2c\x1b\x54\x5a\x52\x0d\x13\x96\x90\x1c\xe4\x04\x48\x41\x75\x32\x25\x39\x9d\x93\x44\x48\x59\x16\xb6\x9b\x41\x4a\x35\x1d\x90\xaf\x84\x24\xb9\x3f\xc4\x06\xe7\x0d\x1f\xbe\x59\x1d\x39\x50\x9f\xec\xf0\x9f\x4c\xa9\x12\xd4\xc9\xdb\x37\x7f\xfd\xc3\x9f\xff\xfc\xaa\x1a\xe0\x55\xa1\xbd\x18\xf7\x12\x34\xc0\xa3\x7e\x17\xec\xae\xdb\x86\x88\x8c\x4f\xb2\x10\xbf\x76\x63\x00\x6d\xb5\xcc\xb6\x3a\x66\xbf\xfe\x82\xe1\xae\xaa\x66\x27\x8d\xf8\xea\x35\x74\xd4\xbe\xaa\xe6\x83\x5e\xb1\x72\xb4\x41\x84\x1d\x89\x2f\x87\xfe\x60\x3a\x39\x27\x5f\x68\x63\x5b\xd4\x31\x50\x3d\xf2\x86\xfc\x9d\x3c\x90\xbf\xa3\xa2\xf5\x97\xb6\xcd\xbe\xda\xaa\x40\x5d\x84\x34\x19\xfd\xfe\x72\xd8\x11\xc4\xff\x61\x88\xa6\x99\xd1\x40\x55\x0b\x32\x62\x4e\xb0\x87\x07\x0d\xd2\x08\x9a\x6e\x27\x9e\xb5\x4d\x9a\x59\xe0\x67\x44\x33\xeb\x78\xb8\x1c\x37\xc3\xa8\xb6\x43\x34\xf3\xf8\x37\x42\xe9\x2b\x47\x85\x9a\x0d\x7f\xea\xd9\x72\x24\xfc\x0d\x32\x66\xf8\x86\xd2\xf5\x01\x53\x24\x15\x18\xd5\x65\x43\x9c\xa7\xac\x45\xb0\xc6\xfe\xa0\x71\x3b\xff\x7d\x63\x3f\x1f\xdb\xa9\x05\x53\x0a\xea\x40\x4e\xc4\x0a\x6a\x74\x15\x22\x75\xd2\x99\x59\x56\x1a\xf0\x8c\x47\xc4\x33\x67\xb5\xa9\xec\xcd\x88\x4b\xe6\x3c\x25\x94\xdb\x24\x93\x31\x48\x69\xa3\xd2\x47\x73\x1f\x1c\xd8\x7a\xf3\x5a\x9d\xa4\x42\x0a\x2d\x12\xd1\xa2\x93\x5b\xd3\xdb\xed\xa6\x43\x20\x14\x16\x77\x1d\xe4\xbf\x3b\x1f\xf6\xc8\xed\xd9\x10\xbb\x5b\xdd\x9c\xdd\x0e\x9b\x3a\xcb\xc1\xed\xd9\xf0\xe0\x59\x41\x41\xbc\xc0\x87\x26\xea\x1d\x26\x69\x98\xa0\x8c\x34\xd9\xcf\x69\xd1\xbf\x83\xf9\x8e\x3c\xb5\x0b\xbe\xde\xaf\x76\xb8\x93\x0f\xb2\x60\xce\x69\xb1\xf5\x6c\x12\x68\xca\x3e\x53\xa6\x97\x0f\xbb\xad\xde\xb9\x3a\xe5\x2b\x17\x33\x48\xad\x94\xee\x9f\x00\x9e\x16\x82\x19\x79\x31\xe6\x81\x6d\xff\x74\xcc\x03\xdb\x78\xc4\x3c\xb0\x98\x07\xb6\x3c\xf6\x26\x70\x36\xe6\x81\xbd\x2e\x0f\x7e\xcc\x03\xdb\x7e\x3c\xbb\xe3\x3e\xe6\x81\xad\x1e\x31\x0f\x2c\xe6\x81\x6d\x36\x62\x1e\xd8\xf6\x63\xef\x42\x8e\x62\x1e\xd8\x56\x23\xe6\x81\x2d\x8f\x98\x07\xb6\x66\xc4\x3c\xb0\x35\x23\xe6\x81\x2d\x8f\x98\x07\xb6\xdd\x88\x79\x60\x31\x0f\xec\x55\x87\xc7\x92\x98\x07\xe6\x46\xcc\x03\x7b\x15\x41\x80\x24\xe6\x81\x6d\x34\x62\x1e\x58\xcc\x03\xdb\x65\xc4\x3c\xb0\xd7\x62\x94\x89\x79\x60\x31\x0f\xec\xd7\x23\xe8\xc6\x3c\xb0\x98\x07\x16\xf3\xc0\x62\x1e\xd8\xa3\xab\x88\x79\x60\xaf\x41\x05\x94\xa0\xd8\xbf\x60\x28\x32\x96\xcc\x5b\x47\x29\x5e\xbb\xc6\xc7\xca\x4d\x4b\x0a\x9c\x37\x08\xad\x6a\x91\x79\xb2\x67\x09\x37\xd7\x01\xe0\xc2\xc4\x9b\xaa\xf9\xf3\x27\x00\xc1\x5e\x24\xdf\xf8\x0f\xbc\xda\xdd\x93\xd2\xf7\x0d\x08\x2c\xf8\x76\xb3\x5b\xb4\x56\x11\xc2\x0f\xe9\x28\x1e\xfc\x30\xcc\x88\xac\x30\x41\x8b\x8a\x82\xb1\xb5\x08\x42\x8b\x22\x63\xa0\x06\xe4\xa6\x6a\xc0\x83\xd4\x4b\xbd\x23\x49\x51\xf6\x48\x0e\xb9\x90\xf3\x16\xda\x44\x07\x02\x67\x63\xd7\x3a\x02\xd9\xb5\x9d\xd3\x83\xc1\x28\x11\x45\x91\xcd\xad\x30\x55\xa7\x92\x56\x50\x63\x9e\xb8\xa4\x28\xee\x2c\x44\x79\x30\xdd\x50\xc3\xae\x84\xbe\x76\x08\xff\x6c\xb1\xf6\xeb\xa2\xca\xa9\x16\x39\x4b\x76\x21\xd8\x96\xc6\xb6\x8f\x29\x3f\x13\x79\x51\x6a\x68\x90\x6d\x0b\x2c\x2b\xc9\x31\x15\xaa\x70\xed\xa3\xc1\x13\xc1\xc7\x6c\xe2\x44\xf1\x13\xdb\xd1\xbd\x5f\x7d\x4f\x3f\xe8\xa2\xfe\x02\x43\xc1\x93\x8c\xb2\xdd\xfd\xf6\xcd\xd0\xaa\x33\x9c\x0b\x33\x74\xeb\xe0\x2a\x8c\xd1\xad\xa0\xd5\xab\x02\x97\x98\x3d\x26\x03\x7f\xc9\x3e\xdc\xb3\x91\xbe\x46\xff\x40\xa1\x73\xc5\x86\xfe\xc8\x6b\xf1\x98\x13\x9a\x15\xd3\xc7\x05\x64\xb3\x90\xf3\x39\xa7\x39\x4b\x3c\xc6\x9c\x66\x99\x48\xac\x42\xd4\x14\x91\xfd\xdc\x76\x3e\xf3\x92\x3c\x2f\x35\x1d\x65\x30\x20\x97\x36\x43\x48\xf0\x6c\x6e\xb0\x49\x81\xf6\x8e\x0f\xb7\xfd\x3b\xc7\x60\xb5\x0f\xc0\x68\x19\x7c\xb1\x52\x1a\xc2\x0d\xb1\xd9\x50\xc0\xcd\x29\x13\x1c\x08\x70\x2d\xe7\x66\xef\x86\x22\xbd\x31\xdb\xd7\xb8\xbb\x75\x92\x54\xcb\x98\x8b\x2e\xe2\x2d\x5a\xc6\x5a\x74\x13\x21\xd1\x3e\x3a\x62\xd9\xcd\x1b\xe4\x2d\x86\x81\x8f\x8d\x5d\x2d\x44\x3a\x58\x71\x2a\xbd\x68\x30\x14\xa9\x61\x70\x12\xc2\x56\x78\x4e\x3f\xc4\x03\x92\xd3\x3b\x54\xb1\xa9\xae\x39\x1f\x9d\x51\x96\x99\x23\xb4\x22\x1f\xbf\x5d\xe0\x44\x07\xa2\x41\xd7\xc9\x60\xa4\x2d\x06\x75\x99\xcc\x45\xb0\x73\x57\xce\x76\xab\xfe\x40\x96\x18\xef\x7b\x9c\x2b\x08\xc7\x32\x38\x91\xd3\x07\xd4\x59\x69\x2e\x4a\xae\x6d\x86\x97\xe5\xcf\x15\xd1\xb7\x41\x6b\x7b\xc7\x79\x49\x37\x64\x87\xa6\x3e\x05\x66\xd8\x45\x34\x39\xd5\x1a\x24\x7f\x47\xfe\xf3\xe8\xc7\xdf\xff\xd2\x3f\xfe\xf2\xe8\xe8\x87\x37\xfd\xbf\xfd\xf4\xfb\xa3\x1f\x07\xf8\x8f\xdf\x1d\x7f\x79\xfc\x8b\xff\xe3\xf7\xc7\xc7\x47\x47\x3f\x7c\xfb\xe1\xeb\xdb\xe1\xc5\x4f\xec\xf8\x97\x1f\x78\x99\xdf\xd9\xbf\x7e\x39\xfa\x01\x2e\x7e\xda\x70\x92\xe3\xe3\x2f\xbf\xd8\x79\xc9\xad\x6d\xd4\xdd\x59\xa8\x3b\xb2\x4f\x7f\x12\xeb\xb4\x8b\xe3\xec\xe8\x2c\xba\x18\xf4\xa5\xd3\xe8\x2c\x48\x8f\x9d\x46\xcf\x25\x51\x11\xa9\xe6\x61\x8a\x88\x9c\x69\xa3\xc0\x19\xb1\x86\x86\x99\x67\x0b\xea\x89\xa3\x03\x98\x7b\x49\x31\x45\x2c\xc8\xda\x0a\xb4\x1a\xe1\x4d\xb1\xa8\x1e\x71\xc2\xf2\x22\x83\x1c\xb8\xc6\xf3\xdc\xf7\x92\x20\xea\x8b\x83\x7a\x25\x89\x95\xd8\xe1\x21\x01\x48\xdd\xcb\x22\xe9\x78\x7a\x44\xd2\xf1\x1a\x49\x87\x82\xa4\x94\x4c\xcf\xcf\x04\xd7\xf0\xb0\x93\x47\xb4\x49\x39\x6e\x9a\x13\x3a\x85\xcc\xc5\xb4\xba\x6b\x44\x14\x36\x83\x73\xa1\x44\xd6\x54\x94\x59\x8a\x69\xd9\x25\x47\x87\x90\xad\xb7\x01\xda\x7a\x6b\x50\x20\x44\x69\x71\xf1\x25\xde\xff\x62\xdd\x42\xff\x53\xb2\x19\xcd\x80\xeb\xe0\x89\x21\x7a\x1c\xc2\x87\x36\x3d\xf3\x9a\xaa\xbb\xfa\xc0\x43\xbf\x10\x69\x7d\xbe\x4f\xfc\x27\xe1\x4f\xf0\xa0\x5f\xa2\x92\x8e\xf2\xd3\x50\xb2\x19\xcb\x60\x02\x17\x2a\xa1\x19\xd2\xb5\x6e\x58\xc9\xe9\x9a\xd9\x71\xe3\xa5\xc8\x94\x91\xf9\x0d\x29\x27\xd4\xbb\xec\x50\x13\x9e\x50\xc6\x6d\x85\xab\xc2\x3f\xac\xac\xef\xcf\x70\x87\x82\x4a\xb3\xc1\x95\x8f\x0f\xf5\xea\x91\x10\x99\xcb\x5d\xce\xe6\xf5\xfc\x2e\x8b\x9f\x8b\x9f\x39\xdc\xff\x6c\x66\x53\x64\x9c\xd1\x49\xe5\xda\x33\xca\xf6\xa2\x77\xbe\x9e\x7a\xed\x07\x60\x62\x70\x09\x84\x66\xf7\x74\xae\x6a\x47\x67\x50\xcb\x4d\xbd\x23\x6f\x8f\x11\x9d\xa9\x22\xd5\x1c\x29\xf9\xc3\x31\x86\xeb\x9d\x9d\x0e\x7f\xbe\xf9\xe7\xcd\xcf\xa7\xe7\x1f\x2e\xaf\xc8\x95\xd0\x60\x79\x5e\xa0\xff\x24\x95\x81\xc9\xac\xb2\xb2\xff\x0d\x84\x1a\xa0\x8e\x85\xd1\xe7\x3c\x15\xf7\x6a\x67\x2b\xa8\x45\x3f\x03\x3c\xa0\x7c\x37\x33\x0f\x2d\x28\x76\x38\x6f\xc1\x61\x96\x22\xc2\xc3\x49\x91\xc5\xa7\xe9\x49\x2a\x45\x61\x81\xe0\x9d\xd2\x81\x81\xa4\xe1\xf6\x0a\x33\xdb\x70\x7f\xc7\xcd\x09\x27\x92\x72\x5d\x7b\x67\xeb\x3d\x73\xad\xd5\x07\xad\xb7\xe3\xf9\x18\x7f\x17\x56\x02\x9a\x76\x57\x97\xe0\x34\x4d\x21\x6d\x80\xff\xd5\xe5\x13\x9d\xf9\x8f\x0b\xdc\x5e\x64\xf8\xf1\xe6\xf2\x7f\x2f\xe0\xf1\xbc\x68\x97\xd8\xd0\x4d\x8d\x1b\x29\x8a\xce\x76\xf7\xda\xd5\x50\x89\xfb\xbb\x17\xfb\x5b\x71\xcb\x6e\xc2\x69\xaf\x4b\xde\x2c\x4e\x5a\xcf\x4f\x72\x91\xc2\x80\x0c\xab\xb8\x9e\xe6\xd5\xa0\x54\x19\x95\x40\xcc\x2d\x5c\x33\x9a\x65\xf3\x50\x44\xd3\xc2\xd6\x13\x69\x54\x59\x0b\x09\xf9\x98\x66\xea\xb9\xa9\x71\x1b\xde\x68\xe4\x88\x0f\x46\x5d\xee\x64\x3b\xaa\xd9\x48\x0a\x5c\x68\x27\x58\x9b\x55\x62\xe5\x3a\x29\x12\x62\x75\xf3\x20\x79\xa2\xc1\xdf\x94\x8d\x2d\xf2\xac\x91\x29\x0f\xec\x61\x35\xb3\x75\xcb\x96\x0a\x16\x05\x74\xc7\x1a\x6b\x6d\xdd\xcc\x2e\x81\xa6\xe8\xb5\x28\xa8\x9e\xda\xd8\xe7\x9c\xaa\x3b\x48\xed\x0f\x4e\x34\xab\x1c\x27\x68\xe8\xf5\xaf\xba\x35\xeb\xf6\x3e\x12\x14\xc9\x6c\x44\x36\x7a\x57\x20\x7d\xe6\x5d\x6f\x71\x08\x0d\x50\x3e\xf2\x6c\x7e\x2d\x84\xfe\xaa\x2a\x88\xd3\x09\x06\xfc\xc3\x49\xcb\x4d\xc7\x15\x8a\x93\x14\xdf\xdb\xc7\xdd\xc0\x43\x15\xd6\xe2\x39\xaf\x77\xfc\xa5\x1f\x29\x59\xf2\x53\xf5\xb5\x14\xe5\xce\x4c\x6c\x49\xd8\xfc\xfa\xf2\x1c\x49\x51\xe9\x42\x0b\xb9\x96\x73\x2c\x02\xb6\x5c\xc9\xb9\x52\x0c\xbe\x73\xc1\x91\xe1\x99\xa8\xe3\xd8\xc8\x07\x3a\x27\x34\x53\xc2\xc3\xd2\xb9\xb5\x16\xb5\x50\xa7\xe2\x9a\xcb\x23\xa1\xa7\x4b\xba\xad\x39\x50\xcb\xcf\xf5\x82\x48\xc3\x3a\x1e\x80\xf1\xa5\xc7\x35\xfa\x4c\x0a\x09\x09\xa4\xc0\x93\xe7\xde\xf6\xe7\x0e\xd0\x43\xd4\xb9\x12\xdc\x1c\xcc\x4e\x90\xe7\xb2\x8a\xcc\x74\x20\x0d\x51\x05\x9d\x62\x4e\xfb\xa3\x18\xe9\x89\xc7\xb2\x54\x20\x6d\x58\xaa\x2c\xc1\xee\xe4\xb7\xe5\x08\x32\x03\x79\xa3\x92\x62\x1d\x51\xaa\xad\x39\x83\xe5\x74\x02\x84\xea\x0a\xd3\xb4\x20\xc0\x55\x29\xdd\x26\x32\x4d\x52\x01\x75\x1d\x2d\xaa\xc8\x77\x97\xe7\xe4\x0d\x39\x32\xef\x3a\x46\xfc\x19\x53\x96\x61\x10\x28\x06\x95\x2c\xe8\xa8\x63\x3f\x05\x2e\x09\x91\x97\x08\x69\x89\x44\x8f\x70\x41\x54\x99\x4c\xfd\x9a\x8c\xde\xeb\xd5\x66\x97\xb8\x84\x9e\x97\xfd\xc4\xf5\xe7\xa5\x50\xdf\x29\x90\x9d\x11\xa8\xef\x76\x20\x50\xa1\x18\x65\x70\xae\x09\x3d\x8b\x58\x39\x68\x9a\x52\x4d\x1d\xe1\xf2\x37\xec\xed\x96\xfe\xba\xc9\x97\x82\xf7\x8c\x97\x0f\x36\x51\xa0\x3b\x53\xcb\xcd\x05\x4e\x4b\x12\x0f\x75\xdc\x75\x1b\x7c\x97\x7a\x6b\x4a\x10\x24\x73\xd9\xc0\x95\xde\x1a\x31\x11\xe9\x04\xb5\xc1\x30\x60\x84\x13\xca\x53\x91\x2f\xbd\xcc\x08\x91\xd0\xe8\x81\x30\x20\x11\xfb\x9a\x63\x4f\x8c\x42\x19\xcc\xa0\x45\x95\xe0\xc5\x9e\x0f\x66\x36\x03\x1c\x8f\x11\x38\x3d\xc9\xe8\x08\x32\x17\xa8\x65\xc3\x3f\x97\x31\xf0\xb9\xb3\xc7\xa4\xc8\xba\x4b\x77\xbf\x16\x19\xd8\x74\x0c\x0f\x08\x33\xfd\x8b\x80\x03\x4e\xd2\x15\x1c\x50\x1b\x6c\xc0\x01\xf5\xda\x97\x00\x87\xb2\x05\xab\x27\x8b\x70\x30\x72\x43\x13\x0e\xc8\xbc\xf7\x1d\x0e\x0a\x92\x44\xe4\xc5\x50\x0a\xa3\x76\x76\xc6\x9b\xdc\xb4\xb5\xcf\xd0\x1a\x36\x56\x84\x6e\x22\x2f\x68\xde\x4c\x65\x90\x88\x45\xb5\x65\x12\x3e\x1b\xeb\x7f\x05\x3c\x0b\x49\xcf\x22\x23\xf3\xb3\x34\xdc\x8b\xe6\x49\x77\xe1\x25\xb3\x83\x2e\x72\x99\x5b\x18\x3b\x3b\xe1\x46\x22\xa1\x19\x76\x81\x68\x87\x72\x64\x11\xed\x16\x27\x0e\xd2\xef\xd0\x47\x89\xbf\x05\x91\xc6\x14\x0d\x2d\xde\x84\xc9\x45\x0a\x81\x2f\xdb\x46\x2f\xde\xda\x34\x2d\xbc\xcf\x67\xfe\x19\xb9\xc2\xbb\x95\xd3\xc6\xd3\x5a\xb8\x5a\xc6\x1f\xaa\xde\x12\x66\x81\xc0\x53\xc6\x27\x68\x57\xeb\x11\x09\x99\xcd\x19\x74\x44\xe0\xce\x6a\x90\x87\x78\x24\xfc\xa4\xfe\x3c\xf8\x57\xfb\xc0\x64\x37\x73\x18\x6d\xcc\xc6\x96\xdc\x32\x45\x0e\xde\x7b\x00\xb4\x28\xc6\xbf\x8f\x1c\xe6\xc0\x7e\x61\xb5\x9b\xd6\xd2\x79\xc7\x78\xea\xd2\xeb\x1a\xc0\xaa\xba\x39\x59\x39\x18\x13\x37\x59\x1a\xd2\x96\x77\xe4\x47\x4e\x2a\x60\x91\xfe\xce\xe8\x71\x6d\x45\x66\x6f\xa3\xeb\x3f\x6e\x78\xad\x5e\xb2\x38\xcd\x77\x1c\xf7\xde\xbc\xb7\x6f\x34\xf7\xe5\xfb\xfc\xb7\x3c\x6b\x41\x4f\x47\xfd\xba\xd6\x62\xfe\x61\xa7\xf5\x22\x7d\x62\xd0\x5a\x33\x3e\x51\xa1\x26\x43\xb3\xac\x61\x0c\x5f\xa5\xca\xf8\x1d\xae\x7a\x77\x2d\xab\x10\x0b\x69\xc1\x2f\x45\x0d\xc9\x8c\x38\xf1\xc2\x95\x90\x49\xae\xe8\x99\x34\x90\xd0\x8c\x66\x37\xc5\xee\xcd\x06\xc8\x52\x61\xeb\x0f\x37\xa7\xcd\xa9\x91\x59\xbb\x98\x74\xc0\xeb\x84\xa6\x39\x53\x0a\x0d\x61\x30\x9a\x0a\x71\x47\x8e\x1e\xed\xb9\xd6\x57\x6c\xa2\x4e\x1c\xce\xf7\xcd\xea\x8f\x09\xe3\x59\x15\x15\x85\x7a\x30\xd7\x55\x18\x3c\xbe\x24\xa9\x56\x81\x7b\xe8\x3a\xd0\xb8\x60\x85\xe5\x65\xda\x9e\x33\x06\x0b\x9e\x9d\x60\x2f\x6f\x4f\xbb\x54\xc2\x27\xb7\xe8\xca\xe1\xf6\x62\xbd\xe5\x95\x70\xb4\xd2\xe3\xb3\x03\xc9\x09\x17\x09\xa8\xee\xca\xbc\x7e\x53\xcf\x49\x52\xb0\x59\xf7\x80\xd1\x4f\x74\x6d\x90\x1d\xda\xa5\x0f\xb1\x78\x8b\x7b\xf4\x30\x94\xa8\x9b\xd9\x4a\x98\x0c\xd5\xb7\x4a\xba\xa1\x68\x48\x02\xbd\x08\x31\x15\x5c\xb8\x1c\x39\xc3\x44\x05\x47\x94\x46\x12\x65\xbd\x79\xb8\x27\x8e\x44\x07\x4b\x3d\xab\xbd\xc4\xa1\x23\x10\x8b\x3f\xe8\xaa\x49\xa2\x5d\xc3\x3d\xd3\x53\xec\xd8\x30\x5d\xf0\x1a\xe2\x4a\x24\x28\x74\xc0\x70\x02\x52\x0a\xe9\x02\xb2\xbc\xdd\xda\xa5\x6a\x0d\x45\x8a\x11\x5d\x06\x49\xa8\xf9\xeb\x50\x85\x8e\xea\xba\xa9\x53\x55\x83\x13\xc6\x63\x48\x50\xd0\x0a\x01\x6c\xa9\xf6\x51\xdd\xc2\xc2\x25\x21\x18\x04\x73\x4d\xa1\x72\xf6\x60\xde\x12\x3e\x15\xba\xc4\x5d\xeb\x88\xd5\x97\x8f\x07\x84\x5c\xf2\x2a\x82\xb7\x67\x76\x31\xbc\xd3\x87\x9e\x69\xf3\x89\x61\x47\x31\xfc\x80\xd0\x70\x66\xa4\x43\x59\x76\x80\xf1\x6d\xcc\xe1\x24\x34\x89\x77\x4a\x0e\xd0\x34\xee\x26\x35\x5b\xef\x65\x80\x36\xa6\x72\x73\xcb\xa7\x32\x97\xbf\x0c\x07\x08\x69\x4b\xe7\x5c\xf5\xb3\x8e\xda\x3c\xdd\x04\xb3\x05\xd2\x7b\xe5\x70\x1b\x8a\xd4\x56\x3f\xac\xaa\xb7\x65\x73\x5f\x8d\xb1\xca\x89\x0e\x64\x3c\x2e\x6c\xf2\x40\x58\x16\xd1\x35\xc7\x49\x89\x11\xb5\x33\x6f\x5b\xc8\x8b\x0c\xb0\xea\x4a\x30\x73\x5d\x50\x26\xe8\x0b\xd5\xab\x33\xd8\xaa\xd6\x52\xae\x18\x63\x8f\xfc\x37\x1e\xca\x2a\x10\xd5\xd7\x89\x1b\x56\x8f\x5b\x0d\x91\x29\xdf\x24\x0e\x93\x53\xb5\xf0\xa6\x0b\x92\xb2\x31\xe6\x49\x6a\xf7\xca\x82\x4a\x9a\x1b\x12\xaf\x88\x03\xc1\x08\x26\xcc\x06\x44\x56\x84\xed\xd0\x88\x7b\xae\x36\x47\xcf\x12\x43\xa6\x49\xce\x26\x53\x8b\x28\x84\x62\x45\x1d\xe2\x9d\x8a\x99\xa0\x29\x36\x97\x25\x42\x92\x7b\x2a\x73\xc3\x37\x68\x32\x45\x0f\x25\xe5\x24\x2d\x25\xf6\x4b\xd1\x40\xd3\x79\x5f\x69\xaa\x8d\xa4\x0c\xd2\x29\x94\x7e\xfd\xb1\x39\xd6\xa3\x23\x36\xc7\xda\x70\xc4\xe6\x58\xb1\x39\xd6\xf2\xd8\x9b\xe8\xd0\xd8\x1c\xeb\x75\x95\x35\x8d\xcd\xb1\xb6\x1f\xcf\x5e\xcd\x34\x36\xc7\x5a\x3d\x62\x73\xac\xd8\x1c\x6b\xb3\x11\x9b\x63\x6d\x3f\xf6\xae\x0e\x73\x6c\x8e\xb5\xd5\x88\xcd\xb1\x96\x47\x6c\x8e\xb5\x66\xc4\xe6\x58\x6b\x46\x6c\x8e\xb5\x3c\x62\x73\xac\xed\x46\x6c\x8e\x15\x9b\x63\xbd\xea\x9e\x01\x24\x36\xc7\x72\x23\x36\xc7\x7a\x15\x95\xd1\x49\x6c\x8e\xb5\xd1\x88\xcd\xb1\x62\x73\xac\x5d\x46\x6c\x8e\xf5\x5a\x8c\x32\xb1\x39\x56\x6c\x8e\xf5\xeb\x11\x74\x63\x73\xac\xd8\x1c\x2b\x36\xc7\x8a\xcd\xb1\x1e\x5d\x45\x6c\x8e\xf5\x1a\x54\x40\xa5\x53\xb6\x53\x6d\xd0\x4d\xca\x18\xb9\xf0\xf4\xa0\x6a\xc0\xa8\x1c\x8f\x41\x22\xe5\xc2\x37\x2f\x85\x55\xd5\x15\x1b\x17\x5d\xb9\xa0\x7b\x58\x11\xc9\x65\xf2\xac\x79\xdc\x95\x29\xc0\x1a\x9e\x75\x0c\xf9\xc5\xc7\xaf\x56\xd4\x4c\xda\x39\xde\x70\xd7\xe8\x69\x5c\xf3\x47\xbe\x9b\x17\x7e\x0d\xc0\x57\x65\x96\x39\xb8\x27\x99\x50\x2e\xf6\x1d\x81\x95\x4c\x29\xe7\xe0\xf5\x3d\xa6\xd1\x8e\x32\x02\xe0\x44\x14\xe0\x7c\xe0\x94\x28\xc6\x27\x19\x10\xaa\x35\x4d\xa6\x03\xf3\x26\xee\x81\x5d\xc7\xa9\xbb\x5f\x94\x96\x40\x73\x1f\xb1\x9f\x53\x66\xa7\x22\x34\x91\x42\x29\x92\x97\x99\x66\x45\x35\x19\x51\x80\xa9\x36\x96\x51\x55\xc0\xc0\x78\xb9\x3a\xb8\xbd\x57\xbf\xcd\x2d\x4b\x84\x45\xeb\x50\xdb\xec\x61\x21\xf1\xbc\xd0\xf3\x2a\xc2\x17\xc8\x98\x49\xa5\x49\x92\x31\xe4\xd6\xf8\x46\x9b\x55\x8d\xf3\xf5\x3c\xaf\xe6\x6e\xa5\xca\x2d\x95\xa7\x28\xb6\x16\x5a\xd9\x78\xd9\x7a\x42\x37\x55\xca\x94\x13\xf3\x55\x8f\x50\x5f\x51\xcd\x02\xda\xaf\x14\x41\xed\x39\x8b\x9d\xdd\xfd\x14\x4c\x17\x54\x92\xad\x03\x8a\x6b\x44\xc7\xe4\x07\x8f\x9c\xbd\x46\x9e\x47\x2d\x50\xb8\x7e\x19\x0b\xc7\x00\x37\x80\xc3\xcc\xe0\x00\x24\x60\xf8\x2b\x5d\x83\xf5\x9f\x1d\xe9\x03\xa6\xf8\x01\x94\xa2\x13\x18\xee\xe8\x68\x58\xa7\x91\xa1\xaf\xa1\xde\x18\x44\x85\xac\xd1\x93\x2c\x8c\xdb\x6c\x8a\x41\x24\xb7\x6b\xaa\x84\x9f\x7b\xc9\xb4\x06\xdc\x54\xac\xbd\x87\x1e\xd1\xc5\xd4\xfc\xc3\x85\xe8\xcf\x0f\x7e\x92\xfa\x61\x43\xd4\x79\x6a\x63\x31\x47\x40\x46\x92\xc1\x98\x8c\x19\x06\x78\x62\xc8\x65\xcf\x96\x62\xa2\xd6\x0a\xa0\x94\xd1\x77\x05\xf7\xb2\xac\x5f\xd7\x80\xfc\xc3\x2d\x4c\xcb\x92\x27\x34\xa8\x72\x8b\xb9\xa7\x6c\x4c\x26\x18\xb2\xe9\xa4\xc5\x3f\xbd\xf9\xdb\x5f\xc8\x68\x6e\x58\x1a\x4a\x56\x5a\x68\x9a\x55\x1f\x99\x01\x9f\x18\x58\xd9\xe3\xd9\xcc\x9e\xac\x20\x80\x6d\x40\xec\xc2\xdf\xfe\xe1\x6e\xd4\xe4\xb1\x27\x29\xcc\x4e\x02\xf8\xf5\x33\x31\x59\xd5\x38\x6b\xf7\x60\xee\x1d\x55\xa2\x15\x68\xd6\x4d\xc7\x47\x5f\x13\x8c\x4c\xc5\xbd\x95\xf5\x57\x60\x4f\x9d\x88\x55\x88\xa2\xcc\xac\xd1\xf9\xab\x2a\xef\xb8\x54\xb0\x9c\x1d\xb8\xf2\x5c\xa0\x99\xd4\x4d\xb1\x58\x51\xdd\x46\xea\xfa\x57\x0a\x97\x75\xe2\x0c\x79\x55\x69\x30\x54\x84\xbe\xa2\x59\x36\xa2\xc9\xdd\xad\x78\x2f\x26\xea\x23\xbf\x90\x52\xc8\xe6\x5a\x32\x6a\xa8\xe5\xb4\xe4\x77\xb6\xf5\x43\x55\x3c\x41\x4c\x9c\x2b\xd7\xa7\x38\xac\xfa\x60\x9b\x49\xef\x89\xb0\x57\x83\xea\x59\xe0\x81\xd5\xba\x8e\x4b\xe2\xb2\x18\x19\xce\xaf\x42\x64\xfb\xc3\x9b\x3f\xfd\xd5\xa2\x2e\x11\x92\xfc\xf5\x0d\x46\x73\xab\x9e\x3d\xc4\x48\xdb\x0c\xa3\xc8\x69\x96\x19\xb5\x21\x44\x4a\x03\xe8\x55\x48\xf8\xd9\x71\x50\xb7\x47\xb7\x8d\x45\xa9\xdb\xdb\x7f\xa2\x1c\xc5\xb4\x82\x6c\xdc\xb3\xf9\x4a\x95\x5a\x73\x88\x8c\xe1\xd0\x51\x1f\x4c\x1a\xdb\x03\x01\x68\x26\xb2\x32\x87\x73\x98\xb1\x2e\xba\xfb\x35\x66\xf3\xaa\x7e\xc6\x14\xa6\x86\x8d\x32\x91\xdc\x91\xd4\x5d\x0c\xe2\x5b\x16\x6b\x84\xbf\xdc\x46\xad\xe1\xf7\x37\x62\x7b\x72\x5a\x14\x55\xf6\x90\xa4\xf7\x0d\x60\xe0\x99\xc4\x42\x06\x2f\xbf\x51\xab\xfd\x22\x43\x37\x77\x9e\x62\xe7\x80\xa0\xf6\x36\xea\x7a\xf5\x1d\xb5\xe3\xab\x27\xf4\xa7\xa1\xc0\x7f\xdb\x7c\x93\xa5\x7c\xc9\x2a\xe5\xae\x42\x0c\x2b\x00\x18\xf4\x41\x92\xfc\x6c\x0d\x45\x49\xeb\xc0\xa6\x06\x5c\xf8\x23\x3d\xed\x28\x29\x40\x2a\xa6\x0c\x5f\xfe\x1e\x0f\x94\x6d\x66\x58\x9b\x00\x9f\x07\x08\xf6\x70\x63\x61\xe5\xf6\x94\x72\x28\x52\x37\x21\x92\x42\x5b\x54\x7a\x85\x58\xdb\x94\x6a\x3b\x64\xa8\xcf\x4d\x2a\xbf\xaf\xa1\xd9\xa4\x94\xe6\x97\x8a\x54\xda\xbb\x5e\x13\x81\xc4\xef\x7b\xa9\xf4\xb1\x5a\x7c\x47\x64\x00\x09\xa3\xdb\xdc\x26\x25\x6c\x28\x8f\xf6\xa0\x04\x22\xbd\xd3\x03\x07\xc4\x7a\xc1\xcd\x99\x70\x8f\x92\xc3\x77\x87\xcf\x4a\x24\x2d\x88\xa4\x28\xe8\xa4\x55\x97\x9f\x05\x48\x2d\x4e\x1b\x96\xa0\x30\x6a\x10\x5e\xaf\x0a\xb2\xe1\x5d\x90\xd6\x15\x76\xb0\x7e\x92\xf5\x8e\x7a\x00\x3b\x05\xc1\x66\x6a\xdf\xd3\x39\xa1\x52\x94\x3c\x75\xf6\xa5\xca\xc0\xf7\x61\xe1\xc5\x57\x82\x43\xdd\x35\xb4\x59\xc1\x02\x2d\xfa\x8c\x93\xb7\x83\xb7\x6f\x5e\x0b\xa7\xc2\x2f\x5c\xe0\x54\x57\x15\xa7\xb2\xf4\xe9\x59\xbf\xd5\xd7\xc2\xef\xe8\x7b\x3f\x38\x13\x4b\x5d\xea\x9e\xf9\x42\xda\xf8\xd3\xbd\x64\x1a\x82\xe6\x80\x47\xa8\xb8\x18\xfd\x30\xa8\xd7\x70\xbc\xaa\xc7\x44\x4b\x20\xb5\x2b\x90\xa1\xca\xd1\x27\xa4\x5b\x8e\x40\xe1\x71\x5b\x65\xe1\x52\x8f\x90\xb0\x10\x50\x07\x07\xe4\xc8\xde\x79\x68\x53\x9d\x8f\x9f\x15\xb5\x1c\xd0\x2e\x1e\x8a\x16\xd5\x37\x17\xb2\xea\x0b\x8a\x36\xb8\xa2\x43\x08\xfe\x07\x4c\xe9\x0c\x30\xc5\x9b\x65\x54\x66\xe8\x73\xbc\xb1\x6b\x27\xa3\x52\x13\xe0\x33\x26\x05\xcf\x81\x6b\x82\x31\xf0\xa3\x0c\xc2\xde\xd8\x5f\x1c\x7d\x7f\x7a\x8d\x01\x0d\xc7\xae\x58\x85\x5b\x65\xa9\x7c\x61\x9b\x70\x25\xc1\x74\x4f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9e\xbc\xd4\xa5\x6d\xd8\xf2\x90\x64\xa5\x62\xb3\xe7\xa2\x24\x2e\xf7\xfe\x9c\xed\xb4\xcf\x0b\x75\x00\x6a\x40\x2d\xa5\xf4\xa3\x69\x7d\x45\x1a\xe0\x92\xc3\xe4\x50\x55\xa9\x81\xa1\x0f\xdc\x99\x9e\x5c\x95\x0d\x1b\x3e\xe7\x6b\x31\x2e\x89\x10\x58\x51\xe6\x79\x8d\x50\x29\x57\x67\xb8\xc2\xed\xc0\xda\x0c\x48\x6e\x64\x0b\x9e\x5f\xdd\x84\xe5\x49\xac\xba\x24\xd2\x01\x19\xd6\x3f\xd6\x35\x6c\xb0\xb2\x5a\xa5\x44\x82\x9c\xd4\xe5\xc6\x27\xc0\x41\xa2\x90\x60\xa6\x6c\x34\x5c\x25\x23\xaa\xac\x93\xe7\xfc\xea\xc6\xda\x6c\xb7\x83\xd9\xce\x62\xf6\xee\x12\x2a\xa6\xb4\x60\x1a\xc3\x0e\xc2\x6d\xb3\x9b\x5a\x65\xb0\x32\x80\x41\xa5\xd4\x4e\x4c\x2e\x87\x84\xa6\xa9\x44\xb7\xcf\x42\xf2\x8d\xd1\xcf\xbd\x6f\x01\xeb\xc5\x50\x05\xe1\x9a\x02\x70\x23\x89\xab\x01\x4b\xce\xcb\x22\x63\xd6\x8d\x10\x3e\x50\xd7\xb9\xc1\xf6\x5f\xdb\x23\x6d\x1b\x35\x6f\x67\x25\xaf\x05\x15\x12\xbb\x96\xab\x7c\x64\xf7\x24\x28\x91\xcd\xea\x52\xc3\x0b\xbb\xe6\x4e\x04\x9a\xc4\xab\x5d\xf3\xd5\x29\x37\xda\x31\xe0\x5a\x32\x58\xde\x2d\x72\x6d\xde\x5c\xe2\x69\xaa\x26\x64\x33\x40\xff\xb8\x2b\xcc\xe9\x0a\xbc\xd5\xc5\x8f\xad\x6f\xd8\xd6\x9f\x06\x2a\x3d\x45\xc3\x55\xed\x78\x12\xc9\x73\x21\xc2\xa2\xb1\xe3\xfc\xea\xc6\x52\x42\xfb\xf1\x55\xdf\xda\x55\xbb\x54\x53\xb5\x9d\x31\xf0\xd9\xea\x0f\xb5\xd1\x3c\x16\xda\xfe\xb9\x3e\xdf\xad\x02\x59\x5a\x88\x7f\xad\x92\xed\x5a\xbc\x5d\x01\x95\xc9\x74\x17\xf8\x3f\x42\x08\xec\xa4\x24\x15\x36\x12\x60\x2c\x24\xaa\xc4\x7d\x24\xef\x99\x10\x77\x65\xb1\x09\x45\x77\xd3\xd8\x56\x6c\x1b\x11\x88\xc6\x13\xbf\x2a\x9a\x9e\x72\xb5\x8b\xbf\xb7\x29\xfb\x80\xb6\x12\x0f\x4e\x54\x27\x50\x88\x45\xbd\xe9\x2c\x2b\x95\x06\xf9\x15\x93\x4a\x1f\xf8\x4a\xd2\x88\xc1\xd6\x26\x72\x18\xde\xf0\x0f\xa6\xa7\xae\xa8\xe3\x61\xaf\x79\xc9\xfc\xed\x26\x3e\x34\x3a\xed\xe1\x95\xe0\x70\x38\x58\x14\xbb\x2a\x52\x5e\x91\xb5\xb5\x3c\xc5\x2d\x5d\x41\x66\xe3\x45\xf1\x42\x80\x2b\xb7\xae\xa0\xa5\x79\x83\xa7\x7f\x0a\x34\xa1\x58\x3c\x0e\xef\x9e\xd6\x05\x28\x6d\x45\x29\x5b\x41\x53\x38\x41\x6f\x1e\x82\x28\x28\x32\xa5\xc5\xfa\xcf\xde\x45\x9e\xdb\x1a\x03\x6c\x61\x52\x57\x95\xe4\x3d\xe3\x77\x5b\xa2\x5f\x33\xba\xe4\x62\x69\xb6\x46\xa5\x71\xeb\xa3\x65\xdc\x06\xdf\x19\x16\x43\x47\xa2\xd4\xbe\xf2\x89\x0a\x14\x47\xc6\xff\xdb\xee\x05\xda\xdb\x0b\x5b\xcb\x6f\x95\x8e\xa8\x7a\xd6\xe8\xe3\x95\x40\x35\xe7\x9a\x62\xd5\xd1\x73\x91\xdc\x81\x24\x99\x59\xc6\x80\xd4\x81\x2f\x8d\x3a\x97\xb2\x84\x2d\xa3\x2e\x76\xb5\x74\x40\x31\x85\x1c\x24\xcd\xea\x72\xaf\x2d\x40\xfd\xde\x11\xce\x6a\xd6\x30\x26\xc5\x96\x4b\x73\x05\x1a\xcd\x39\xbc\x58\x75\x57\x4e\xe7\xbe\x06\x2e\xe3\x18\x6e\xf0\xc0\x14\x9a\xf5\x0b\x91\x86\x89\x67\xa5\x02\xd9\xaf\xd2\x02\x5d\xee\x8d\xaa\x02\x71\x52\x18\x95\x93\x09\xe3\x13\x47\x9d\x91\xa6\x07\x85\xb8\x2b\x4d\x07\x23\xbd\x13\x09\xb6\x14\x2d\x4a\x0f\x36\xbe\x8c\x85\xf7\xe7\x22\xb5\xb7\x8f\xe6\x56\x1b\xf4\x3b\x5b\x07\x48\x5f\x72\x22\xa4\x2b\xc0\x40\xd3\x14\xd7\xbe\xfc\x85\x78\xb5\xf9\x55\xbd\x2a\x8e\xc3\x46\x76\x57\x4f\x05\x60\x51\xe5\xc8\x08\x3b\xa5\xdc\xb6\x76\xe8\xae\x84\x7f\x27\xa2\xdf\xac\x2a\x74\xca\xeb\x2d\x3e\x0b\x03\xe6\x28\xd1\x90\x17\x42\x52\x39\x5f\x74\x61\x1a\x22\x65\x50\xc0\x00\x70\x01\x52\x43\x91\x22\x1d\x5f\xb1\xf1\x33\xdb\xe3\x77\xc5\xde\xaf\xc4\x31\xa4\x82\x5c\x10\x0f\x51\x43\xaf\x55\x32\x85\xb4\xc4\xe8\xf1\x49\x49\xb1\x07\xb9\x39\xc5\xce\xd8\x3d\x77\x61\x79\x16\x19\xaa\x80\xbf\x2a\x4d\x60\x8e\x41\x32\x58\x9f\xd3\xfc\x82\x75\x3e\x6d\x68\xa0\x6d\xc1\x8c\xed\x58\xab\x28\xc1\xdb\xba\x2b\x04\x7e\x2c\xcc\x58\xa2\xfd\x43\xe3\x75\x88\x93\xd0\xaa\xf3\xeb\x50\xb8\xba\x80\x09\x18\x62\xa4\x55\xfd\x29\x2e\xaa\x04\x2b\x7f\xfe\xc8\x0d\x93\x58\x8f\x8b\x35\xe2\x3d\x81\x72\x28\x57\x37\xb7\xe2\x91\xe3\x5b\x41\x69\xc5\xb7\x6f\x5b\x92\xa9\x85\x50\xbe\xbb\xc7\x6d\x27\x4f\x59\x1b\xf9\x9f\xca\x49\x7b\x5d\xe9\xf0\x54\x4e\xca\xdc\x56\xf7\x16\x0b\x05\x96\x2d\xce\xa1\x5d\xcb\xb0\xac\xb3\x0f\xe7\x61\x0a\x43\x18\x9b\xed\x13\x40\x8c\x28\xd4\xd2\xde\xb9\x68\xf0\xbc\x34\xca\x59\x65\x45\xad\x69\xab\xd3\xe2\x9c\x45\xaf\x7a\x9b\xd7\x62\x19\x2f\x0c\x37\x46\x19\x22\x28\x3d\x92\x4c\x29\x9f\xa0\x19\x5c\x94\x66\xbe\x2f\xbe\xc0\x15\x49\x48\xcb\xc4\x75\x94\xf0\xf1\xcf\x5f\x78\xeb\x9f\x2b\x14\x84\x8d\xed\x54\x42\x0b\xbf\xe6\xf0\xb3\x2c\xab\x7e\x47\xd8\x00\x06\xe4\xe0\x8b\xe0\xd2\x81\x7d\x7b\x21\x85\x79\x85\x0b\x9d\xc6\x55\x65\x4c\xe3\x41\x38\x08\xef\x1e\x90\x0b\xf3\x0e\xf4\x88\x54\x00\x0c\xa2\x7b\x47\x35\xf8\x7a\x44\xc2\x84\xca\x34\xc3\x8c\xbb\x71\x25\x94\xd8\xbc\x1c\x07\x30\x3c\x7d\x18\x4f\xc7\x85\x5e\x65\x9d\xdc\x30\x2d\x42\x53\x75\xa7\x4e\xac\x28\xd3\x4f\xa9\xa6\x7d\xec\xc2\x61\x89\xc6\x89\x55\xaf\xfb\xae\xfe\x69\x9f\x3a\x9c\xea\x57\xdb\x7a\xf2\x5b\x97\x59\xd5\xa7\xd5\x5d\x8c\xf7\x69\x1f\x2b\x91\xee\x1e\x2b\xfa\x0c\x61\x05\xad\x34\xdd\x16\x65\x70\x17\xc5\xd3\xaa\x0c\x3a\xc2\x00\x9b\x88\xd4\x65\xaf\xab\x08\x06\x57\xe9\xb5\x71\x90\x2f\xae\x6e\xaf\xff\x39\xfc\x78\x79\x75\x1b\xcf\x73\x3c\xcf\xf1\x3c\xb7\x38\xcf\xc0\x67\xad\xcf\x72\xa5\xff\xac\x52\x09\x17\x4a\xd8\x05\x19\xd5\xaf\x28\x38\xeb\x82\xcf\xbe\xa7\x46\xe0\x2b\x24\x28\x94\x45\x8c\xdc\xb8\xca\x8b\xea\x6e\xb0\x7d\xb8\xce\x5e\x7c\x74\xd6\x33\xc6\x56\x75\x18\xb3\x72\x15\x14\x02\x58\xb5\x6b\x61\xe3\xbb\xb3\x9f\x2f\xcf\x2f\xae\x6e\x2f\xbf\xba\xbc\xb8\x7e\xd6\x60\x83\x96\xc5\xdd\x9a\xdc\x78\x47\x2e\x59\x48\x98\x31\x51\xaa\x6c\x5e\x55\xa1\x5d\x4d\x04\x96\xe3\xd5\xb8\x51\xcf\xe6\x55\xa1\xdd\x95\x8f\x45\x66\xdb\x2d\xb3\x6d\xc6\x5e\xb4\xa8\xeb\xd1\x15\xfa\x7e\x25\x45\xde\x11\x0a\xdf\x58\x95\xdd\x9b\xbc\x57\xe1\xd3\xa1\x2b\x01\xd0\x60\x3d\x4e\x78\xac\xeb\x0d\x18\x29\x34\x2f\x74\x8b\xb6\x00\x9d\x14\x0d\xed\xa6\xbe\xa6\x8d\x53\xf8\x40\x8b\x6f\x61\x7e\x0d\x2d\xcb\x87\x2c\xb8\x1a\x32\x48\x0c\xa3\x23\x77\x30\xb7\x1e\xc8\x33\xff\xb2\x76\x45\x30\xf7\xb0\xe6\xea\x1d\xb4\xa9\x87\xdb\x65\xb1\xd4\x3b\x68\x11\xb8\xe8\xc7\x52\x41\x4f\xb3\x85\x28\xa7\x99\x3d\xdd\xab\x12\xa6\x9f\xa0\x38\xec\x61\xc8\xee\x1d\x9d\xd5\x5b\x57\x57\x10\x33\xc3\xb9\xe0\xfe\xc4\x05\x6d\xf5\x8d\xc6\xda\xb7\x58\xab\x4e\x30\x32\xe5\xe4\xb7\xb6\x70\xec\xed\xc7\xf3\x8f\xef\xc8\x69\x9a\xba\xe0\xe1\x52\xc1\xb8\xcc\x6c\x18\xb0\x1a\x10\x5a\xb0\xef\x41\x2a\xec\xab\x76\xc7\x78\xda\x23\x25\x4b\xbf\x6c\x53\x74\xc9\x8e\x0e\x77\x41\x78\x87\x4d\xb7\x3b\x71\xe3\xfc\x71\x21\xef\xaa\x88\x08\xb1\x99\x81\x88\x9b\xbe\xfe\x8a\x13\x32\x3a\x02\x4d\xdb\x16\x72\xc4\x6e\x61\xb7\x74\xf5\xb0\x26\xac\x36\x4e\xbc\x2a\x50\x95\xbe\x23\xaa\xc4\x42\x31\xaa\xea\xfb\x86\x9d\x54\x7b\xcd\x3f\x55\x41\x13\xe8\x91\xff\xaa\x7e\xc4\x4e\xed\xea\x87\xc3\xc3\xbf\x7f\x7b\xf1\xcf\x7f\x3f\x3c\xfc\xe9\xbf\xc2\xab\xc8\x0a\x51\x6b\x5e\xb8\x05\xfd\x3b\x5c\xa4\x70\x85\xef\xc0\x3f\x9d\xb8\x76\x9a\x24\xa2\xe4\xda\x5d\xc0\xac\xde\xc1\x54\x28\x7d\x39\xac\xfe\x2c\x44\xba\xf8\x97\x6a\x55\x49\x6c\x2f\x19\x03\x6e\x51\x8b\xec\x14\x3b\xba\x63\x0f\x35\x2d\xe9\xf8\xa8\xba\x59\xab\xfe\x18\xc9\x14\x72\x5b\xcb\xe8\x2b\x0f\x02\xec\x4d\xeb\xcb\x07\x70\xcc\xb9\x36\x92\x69\xb3\xac\xdc\xc1\xec\x6d\xab\x26\xde\x76\x74\x48\xda\xaa\x1d\xec\x18\x60\x08\x11\x07\x2d\x7b\x90\x2b\x06\xeb\xb5\x94\xda\x1b\x7b\x3a\xbc\x24\x33\x0b\xe1\xbd\x01\x8e\xf7\x82\x7d\xf5\x49\x69\x5c\xe8\x6b\x6b\x68\x88\xef\x6c\x2b\x57\x7f\xdd\xe5\xd9\xab\xaa\xf4\x15\x18\xc5\xe6\xc8\xfe\x38\x48\x8a\xb2\xe7\x6e\x18\xe4\x90\x0b\x39\xaf\xfe\xac\x7c\x7c\x7d\xa5\x85\xa4\x13\xcc\xcb\xb0\x8f\xdb\xc7\xaa\xbf\xec\x83\x8d\x17\x2c\x3f\x6d\x55\xe1\xa4\x94\x46\x68\xc8\xe6\x9e\x22\xef\x58\x2f\xa2\x1e\x7b\x48\xdb\x3c\xe8\xf7\x84\xb4\x55\x98\xd1\xb6\x61\xab\x1d\x4d\x84\xac\x1d\xf5\x28\x70\x56\x50\x44\x7d\xd2\xe5\x9d\xf6\x2a\x31\xc8\x5a\x03\xf8\xcc\x68\x96\x3b\x57\xce\xaa\x47\x87\xd4\x2c\x65\x33\xa6\x44\x8b\xec\x93\x6a\xa2\xf5\x21\xf5\xae\xf4\x85\x0d\x1c\xaa\xcc\x66\x0f\x05\x16\x0b\xaa\xce\xeb\x02\xd9\x7f\xdb\xa6\x2b\x91\x1d\x05\xd5\x1a\x24\x7f\x47\xfe\xf3\xe8\xc7\xdf\xff\xd2\x3f\xfe\xf2\xe8\xe8\x87\x37\xfd\xbf\xfd\xf4\xfb\xa3\x1f\x07\xf8\x8f\xdf\x1d\x7f\x79\xfc\x8b\xff\xe3\xf7\xc7\xc7\x47\x47\x3f\x7c\xfb\xe1\xeb\xdb\xe1\xc5\x4f\xec\xf8\x97\x1f\x78\x99\xdf\xd9\xbf\x7e\x39\xfa\x01\x2e\x7e\xda\x70\x92\xe3\xe3\x2f\xbf\x68\xbd\xf4\x0e\x6a\x77\xda\xd1\x65\x05\xcf\xe6\x8c\x9d\xa0\xdf\x27\x2c\x5b\x6f\x87\x47\xaf\xae\xcf\xbf\x8f\x1e\x7e\x57\x33\xa4\x8a\x5d\xef\xcd\x01\x57\x90\x48\xd0\x9f\xc3\x92\x63\xdf\x14\x54\x10\x38\x54\xa4\x52\x2d\x5e\x1b\x9f\xfb\x35\x18\x77\xaa\xb6\x76\xb8\xaf\xb5\x24\x3a\x96\x22\xf7\x59\xe1\xe8\xde\xc0\xfe\xf4\xfe\xbe\x3b\x68\xd5\x1c\xd5\x8e\x68\x0c\x8a\xc6\xa0\x35\xe3\x49\x63\xd0\x8d\xc5\xc3\xbd\xb5\x04\x01\x9f\xed\xea\xc2\x58\xe9\x41\xf7\xba\x4e\x58\x42\x6d\x33\x87\xda\xc0\x1f\xf5\xba\x1f\x64\x1d\x42\x63\x19\x5a\xbe\xda\x87\x49\x4e\xb1\x57\xb3\x3d\xf8\x38\x41\x9d\x76\x61\x55\x1b\x57\xe1\x0f\x66\x66\x09\x55\x89\xe8\x46\x31\x48\x0c\x74\xc4\xd0\xd3\x7f\xd8\x48\xd0\x3b\x1b\x1c\x6a\x94\x34\xc6\xeb\x32\x9a\x95\x70\x58\xd7\x5e\xa6\x4a\x89\xc4\x06\xb5\x56\x49\x00\x58\xd9\xcd\x2d\x1b\x57\x83\x0d\xe2\x0b\x09\x09\xa4\xc0\x13\x70\x75\x99\x1b\xbd\x2f\x29\x27\x17\x7c\xe6\x6b\x53\xa7\x3e\xa5\x04\x57\xb2\x7a\x8e\xd7\x15\x80\x60\x10\xd1\x39\xc1\x82\x38\x04\xa4\xfa\x75\x34\x2b\x86\x62\x88\x71\x6d\x65\xdd\xad\x3d\x5e\x6b\x2e\xde\x9e\x67\x56\x9e\xad\x56\xc2\xd0\x12\xb3\xac\xcd\xcf\x4d\x26\xf9\x1a\x9c\x81\xed\xd9\xe7\xaf\x8e\x75\x76\xc4\x36\xbb\x61\x99\x5b\xf8\x4e\xba\x64\x93\x5d\x38\x4b\x0a\x09\x63\xf6\xd0\xd1\x39\x3d\xe5\xb5\x25\x86\xa5\xc0\x35\x1b\x33\x9b\x62\x52\x48\x28\x80\xdb\x2c\x01\x9a\x4c\x91\xf6\x3b\x4e\x59\x3b\xa7\xf7\x31\x98\xc7\x0a\xdc\xdd\x92\xb2\x9b\x55\xc2\x7e\xa4\x63\x24\xd2\xb1\x9d\xc7\x67\xa2\x63\x0e\x73\xf7\x87\x88\x61\xe4\x79\xfb\x98\xf7\xb3\x66\xad\x15\xd7\x95\x76\x4b\x44\xab\xd3\x8e\x4e\x70\x96\x9d\x0c\xd0\xad\xf0\x01\x5f\x3b\x2c\xb3\xac\xa3\xfa\xd4\x87\x97\x08\x8d\xa2\xcc\x32\x97\x96\x3b\x20\x1f\x39\x1e\xc9\x53\xec\x83\xd0\x23\x57\x30\x03\xd9\x23\x97\xe3\x2b\xa1\x87\x56\xb6\x6d\x86\xb3\xd9\x1b\x09\x1b\x93\x77\x46\x6b\x52\x9a\x68\x5b\x8b\x3e\xa8\x9c\x23\x64\x63\x82\xba\x28\x57\x8b\x30\xf4\xf5\xdb\xf2\x5b\x9f\x30\xd9\x7f\xa6\x6d\xaa\x9a\x7d\x74\xa0\x9e\xba\x99\x7c\x80\x1c\x06\x45\x3a\xef\xc8\xaa\xac\xd7\x17\x58\x88\xa2\x10\x4a\xdf\x18\x2d\xb6\x9b\x46\x30\x43\x3f\x1d\xf6\x56\xa0\x59\x06\x69\xa3\x13\x90\xed\x60\x41\x9b\x5a\x34\xe6\xe3\x56\x0d\x15\x80\x4c\x29\x4f\x33\x90\x58\x14\x5d\x2d\x56\x7e\x62\x75\x17\x80\xaa\x6f\x83\x4f\xd0\xa4\x49\x22\x64\xea\x3a\xb0\xba\x44\x49\x5c\x4c\x75\xbc\x90\xd6\xe6\x94\xd3\x09\xa0\x65\x61\xa9\xb4\x2e\x16\x5c\x56\x41\xf3\x87\xa9\x10\x77\x24\x11\x79\x91\xe1\x01\x68\x71\x3e\xea\xde\x33\x15\x8a\xf6\xcd\xec\xea\x24\x68\x4b\x83\x3f\xb4\xeb\x4a\xd3\x4a\x58\xe9\x42\x54\x81\x07\x48\x3a\xeb\x5b\x77\xf1\x00\x49\xd0\x78\xd1\x6c\x89\xeb\xbc\xa8\x05\xda\x36\xda\xf7\xd3\x6d\x6d\x96\xef\xca\x14\xde\x22\xcb\x2c\x1c\x0b\x85\xd6\x70\x4e\x5f\x57\xda\xbd\x02\x4b\xf4\xdb\xac\x62\xcc\x3c\xf3\xa5\xa6\x1b\x87\xc1\x1e\xbd\xa5\xea\x6c\x55\xb0\xb1\x9f\x0b\x73\x9f\x85\xd0\xe4\xe8\xf0\xe4\xf0\x78\xc9\x46\xb7\x50\x9c\xf8\x36\x78\x92\x61\x35\xbe\x02\x4b\xdb\x41\x72\x98\xf6\x08\xd3\x9e\xd8\xda\xa2\x00\xb8\x2a\x97\x0e\x87\x1d\xea\xb5\xa4\x29\x73\x5a\x10\xfe\x6a\x6e\xd2\xb2\x74\x15\x01\x8e\x0e\x7f\x39\xec\x11\xd0\xc9\x31\xb9\x17\xfc\x50\xe3\xf2\xb1\x7c\x46\xa9\x82\x89\xe6\xa2\xc4\x2e\x75\x16\x04\x55\x2d\x0c\x43\xb1\x88\x28\x6d\x4b\x9b\x29\xd5\x3e\x0d\xef\xe2\x81\x69\xdf\xc6\x41\x8c\xc9\x1b\xdb\x51\x07\xa8\xb3\x12\x66\x6c\x06\x27\x53\xa0\x99\x9e\xda\x40\x0a\x2e\x78\xdf\x36\x45\x33\xa4\xc4\x5d\x69\xeb\x53\x68\x67\x72\x0b\x47\x0b\xf3\xdb\xf2\x82\x5a\x4a\xd7\x86\x88\x7e\xbd\x7b\xa7\x56\xb2\xd4\xc4\xf8\xf6\x76\xf8\x75\xa3\x57\x2b\x52\x71\xad\x0b\x1f\xde\x12\xd4\x95\xd8\x03\xda\xd1\x8d\x43\xaf\x55\xd3\x56\xd2\x21\x09\x6b\xdb\xbc\x95\x2c\x37\xa5\xde\xae\x6b\x2b\xf9\xa7\x28\xb1\xdb\x1c\x1d\x65\x73\x72\x4f\xb9\xf6\xa9\x78\x07\x66\xaa\x03\x43\x9e\x0c\x36\x7c\x03\x34\x05\xa9\x90\x7a\x00\xdd\xb9\x7e\x96\x1f\x9d\x39\x9a\x82\xb5\x75\xcb\x07\x4a\xa5\x45\x4e\xa6\xee\xb3\x9b\xe9\x89\xee\x64\x0c\xf0\xf4\xf8\xdc\x1f\x09\x85\xa5\x70\xee\x99\x57\x47\xbf\x96\xe8\x86\x85\x7b\xa3\xce\x7c\x12\x82\x2d\xec\x46\xc2\xb8\x05\x96\xed\x23\xd8\x11\x2d\xed\x20\x40\x80\x74\x18\x24\x40\xda\x25\x3b\x2e\x4e\x84\x8e\xaf\xf6\xf1\x50\x9d\xc5\x1d\x90\xce\x7c\xeb\x64\x95\x21\xd2\xe1\x8c\x8d\x82\xb5\x36\x8f\x46\xe9\xb8\x84\x72\xc1\x59\x42\x33\xf6\x2f\x48\x6d\x57\x5c\x1b\x63\x86\x72\x4e\x42\x15\xf4\xd1\xf1\xc9\x2d\xfd\x0b\xda\xbc\x72\x73\x1c\xb5\x10\x28\x7c\xa0\xab\xcb\xd0\x47\xfb\xbe\xf6\x91\x0b\xa4\x5b\xbf\x39\x69\x9f\xb4\x19\x8e\xc7\xc1\xdc\x0d\x8a\x91\x2e\x21\x50\x74\x10\x64\xbd\x1c\x62\xbd\xd4\xb3\x1b\x89\x91\xad\x0a\xbb\x37\xbc\xac\x6d\x03\x73\xb2\x3a\x63\x59\x12\x5e\xf5\x9b\x7d\x19\x4d\xcc\x49\x77\xc1\x90\x5d\x87\x42\x76\x1a\x08\xf9\x49\xc3\x20\x31\xf9\xa2\x35\x15\x69\x5a\xe1\x71\x4a\x83\x01\x46\x3b\x34\x7a\xad\x93\x30\x9d\x0d\xc9\xf7\xc4\x68\x1a\x5d\xcd\x51\xdb\x8b\x33\xa6\x93\xe2\x46\x24\x77\x1d\x6a\x4f\xe7\x50\x48\x48\xac\x35\xee\xf6\x6c\x68\x67\x37\x5a\xec\xd5\xc7\xdb\x3a\xe8\x1f\x23\x63\x6a\xf3\xe8\x37\xce\x5e\x67\x34\xdf\x3b\x28\x74\x65\x20\x18\xd1\xe4\xee\x9e\xca\x14\xed\x67\x54\xb3\x11\xcb\x98\x9e\xa3\x09\x40\x02\x66\x14\x70\x61\x43\xef\x6c\x29\x46\xe1\x1b\xaa\x56\xdd\xbe\x2b\x4b\x19\xda\xe1\x1c\x0b\x1c\x53\x66\xb4\xfe\xaa\x6b\xae\x8d\xcd\x49\x8a\xca\x70\x18\xda\xbf\xa3\x8a\xe7\xc7\xde\xaa\x78\x41\x47\xd8\x6d\xb5\xbd\xb6\x11\x82\x7b\xcc\xea\x1c\x8b\x93\x55\xc3\xb3\xc8\xea\x3a\x9a\x6f\x7f\x59\x5d\x21\xe1\x46\x8b\xa2\x23\x5f\x8c\x9d\x6c\x8d\x27\x66\x04\x63\x61\x88\xf0\x5a\xd7\x4a\x5a\x82\x2b\xca\x79\x3a\xbc\xac\x6c\x67\xa2\xe1\x3e\xb1\xb1\x91\xbe\x12\x67\xc6\x66\xc0\x41\xa9\x13\x74\xba\x94\x85\x6b\xfa\xef\x7a\xdb\xf6\xcc\xd7\x41\x8e\xab\xeb\xd5\xf9\x06\xae\xb3\x2e\xfe\x08\x3a\xb1\xf6\xe1\x80\x90\x63\xd3\x2e\xb7\xfc\x45\x67\x4d\x22\xa9\x9a\xda\xae\xb3\xf0\xc0\xb4\xeb\x9c\x3c\xb4\x95\x7a\xc3\xe6\xb7\x13\x49\x13\x20\x05\x48\x26\x0c\x33\x2a\xb9\x4e\xc5\x3d\x27\x23\x98\x30\xae\x3c\x28\xb0\xd6\xa6\x83\x19\x7a\x7d\x98\xaa\x0a\xb3\x0d\xc8\x75\xa3\xec\x88\x4b\x08\x4a\x44\x7d\x34\xdd\x9a\x17\xfd\x55\xc8\xb1\x10\x4e\xb6\x87\x4b\x05\xe1\xb0\xad\xcd\x53\x4b\x3e\x2a\x39\xbe\x39\x85\x8c\xce\x6d\xdc\x27\x76\xa4\x66\xff\x02\xa9\x8e\x3b\xf0\x6b\xd9\xc6\x4c\xfe\xda\xda\x75\x60\x91\x53\x9a\x4c\xdb\x39\x8a\xa3\x23\x6c\xc3\x11\x1d\x61\x6d\x26\x89\x8e\xb0\xe8\x08\x7b\x62\x44\x47\x58\x74\x84\x2d\x8c\xbd\xd5\x92\xa2\x23\x6c\xe7\x11\x1d\x61\x8f\x8f\xe8\x08\xdb\x60\x44\x47\xd8\x86\x23\x3a\xc2\xd6\x8f\xe8\x08\x6b\xb7\x98\xe8\x08\x8b\x8e\x30\x37\x7e\x7d\xd6\x41\x3f\xa2\x23\x6c\x69\x92\xe8\x08\x8b\x8e\xb0\x8d\xc7\xde\xaa\x78\xd1\x11\x66\x47\x74\x84\x35\xc7\xaf\x8b\xd5\x79\x37\xd2\xd0\x28\x94\xed\x9b\x0a\xa3\x5a\xea\x68\xec\xab\x4c\xe1\x6a\xe3\x65\xf8\x3c\x1e\x86\x3d\x71\xc7\x74\xe0\x55\x88\x1e\x85\x57\xe7\x51\xe8\xc6\x1a\xd7\x81\x25\xae\x35\x4d\x76\x8e\xf6\xdb\xa9\x04\x35\x15\xd9\xce\x88\xde\x40\xf2\x0f\x8c\xb3\xbc\xcc\x0d\xce\x29\x83\xcf\x6c\x56\x79\xf4\x55\xdd\x69\x19\x1d\xfd\xd6\x28\x68\x6e\x64\x29\x60\x15\x51\xca\x32\xb3\x8d\x98\xf4\x39\xa5\x33\x83\xeb\xaa\x4c\x12\x00\xec\x51\x16\xaa\x12\x7f\x1c\x54\x6f\xaa\x7a\x52\xbc\x6d\x47\x6f\xda\x71\x4b\x5b\xe7\x13\x67\xf9\xe3\x1f\x76\x9a\x63\x22\x8b\x6e\xe8\xf2\xd7\xd7\xc3\xb3\x80\x2e\x53\xee\xc9\x32\xe3\x33\x91\xcd\x6c\x27\x5b\xbc\xc9\x48\x45\xcf\x48\xa4\xdb\xcb\xf7\xad\x64\xfb\x2e\x78\x44\x5b\xf1\xb5\x29\x7b\x18\x21\xb5\x69\xa2\x99\xe0\x5e\xda\x72\xf2\x1b\x0b\xa9\xad\xa9\x5b\x7b\xc1\xb1\xfd\x71\x20\x58\xef\x05\x3f\xbc\x33\x00\x1f\xb8\x3e\xdf\x9e\x05\x87\x1a\x82\x6f\xb1\xa4\x05\x29\x32\x5a\x37\x49\xc2\x1d\xf8\x06\xf9\xc6\xd9\x14\x92\xbb\x6b\xe7\x0c\x3d\x52\x00\x55\x24\xcb\x84\xe9\x69\x39\x1a\x24\x22\x3f\x31\xc7\xd8\xfe\x67\x94\x89\xd1\x49\x4e\x95\x06\x79\x92\x8a\xc4\xb1\xa5\x7e\x62\x66\x61\x7c\x32\xc8\xd3\x63\x6c\xc3\x7b\xd9\x6c\xca\x18\x94\x62\x30\xef\x77\x0a\x1c\x19\x81\xa1\x88\x02\x95\xf4\xa0\x9e\x9b\x59\xde\xd6\x8d\x73\xc3\xd1\x9a\x8d\xb4\x74\x44\x7f\x7e\x27\x74\xa4\x5c\xa4\x03\x6b\xc4\x4b\x73\x36\x77\x16\x74\xd1\x81\x93\x79\x8f\x1c\xcc\x7b\x23\xce\xee\x8b\x53\x79\x0f\x4b\x2f\x77\xe0\x48\xee\xc2\x89\xdc\x9d\x03\xf9\x13\x54\x28\x7e\xc9\x8e\xe3\x0e\xad\x6b\x1d\x39\x8c\x3f\x87\xb3\xb8\x93\xaf\x6e\xeb\x24\xfe\x7c\x0e\xe2\x6e\x3e\xb7\x4b\x75\xe3\xa5\x3a\x85\x3b\xb0\x92\x77\x69\x21\xef\xcc\x3a\xfe\xc9\x9c\xc0\xed\x1d\xc0\x7b\xe0\xfc\x6d\x0d\x64\xc6\x99\x66\x34\x3b\x87\x8c\xce\x6f\x20\x11\x3c\xdd\x99\x8f\x2d\x14\xc6\xac\xce\x8f\xb2\xd3\x3a\x0b\x56\x33\xa3\x62\x4a\x5d\xfd\x6f\xa3\xb7\xd9\x0c\x12\xef\xb9\x70\x62\x0b\x3a\x1d\xec\x2a\x77\x29\xad\x77\x2f\xe4\x5d\x26\x68\xaa\x4e\x0a\x61\xff\x53\xe7\x4b\x04\x89\x12\xf6\x5d\xed\x32\x25\x9e\xdb\x54\x66\xd3\x4b\xba\xdc\xc4\x6f\xc4\x3d\x11\x63\x0d\x9c\x1c\x31\xee\xf7\xf1\x38\x50\x36\x6b\xbb\x65\x85\xd6\xe6\xea\xdb\x37\xfe\xe6\xd7\x67\x90\x44\xd3\xab\x52\x9f\xde\x3e\xec\x5e\xf4\xb4\x81\xd8\xdd\x38\x2e\xb3\xa6\x91\xd8\x1a\x8e\x9b\xf4\xe6\x6d\x5d\xc1\xf8\x2d\xce\x5b\x9d\x36\xca\x53\xe2\x52\xce\x5e\xdf\xa6\xb5\x0e\x6d\x69\x8a\x7e\x55\x28\xcb\x53\xf6\xe4\xdb\xb3\x61\x34\x27\xef\x97\x51\xe6\x99\xc2\x43\xf6\x50\xd0\x7d\xa1\x21\x21\x51\xd0\xdd\x62\x04\x49\xa8\x5f\x4b\x9a\xc0\xb0\x73\x19\xc1\x1f\x27\x92\x96\x92\x3a\x02\x58\x89\x7c\xfe\xf0\x70\x80\xd4\x9e\xa6\x2a\x71\x17\x53\x62\xc7\x65\x96\xcd\xad\xcd\xa1\x91\xe6\x6c\xbd\xf0\x8b\x59\xb3\x68\xf8\x5f\xf1\x96\x5a\xb0\x2c\xa4\x70\x3c\x53\x96\x9c\x1b\x1a\x5c\xb7\x21\x43\x41\x12\x6b\x37\xd3\x46\x6e\xae\x62\x13\xb3\x7c\xc3\xff\x30\x6d\xb7\x8e\x01\x6c\x4c\x68\x9e\x1e\x0b\x99\xb0\x51\x36\x27\x53\x9a\x55\x3d\x67\x28\xb9\x63\x59\xe6\xa6\x19\x90\x1b\xd0\xd6\x71\x61\x79\x67\x26\xf8\x04\x17\x47\xb9\xef\x75\x08\x89\x79\x36\xc9\x80\xf2\xb2\xb0\xef\x33\x9c\x78\x2e\x4a\xe9\xdf\x37\xa8\xdc\x1f\x15\x07\xe6\x2c\xeb\x05\x1d\xd5\x1e\xdd\xd8\xda\x44\xa3\x8c\x00\xf0\xd1\xd7\xaa\xee\x85\x73\x8a\x19\x48\xc9\x52\xe7\x4d\xb0\xbf\x15\x52\xcc\x58\x6a\x7d\x28\x1e\x6c\xd8\xbb\xd9\xf6\xcc\xa9\xce\x33\x17\xbc\xcf\x61\x42\x51\x50\x71\xa7\xc8\xee\x99\x9d\xc7\xc6\x16\xf0\x14\xbb\xe8\x18\x09\x5f\x14\x8d\xbc\xf9\x19\xb3\xfd\x7f\x03\xc8\x91\x23\x2e\x88\xc0\x90\xd0\x92\x33\x6d\x7b\xca\x4f\x4b\x4d\x52\x71\xcf\x8f\x9d\xcd\x8a\x29\x42\xc9\x08\x34\x0d\x82\x3a\x1d\x83\x53\x04\x38\x1d\x65\x66\xcf\x31\x5a\xe9\x76\x25\x80\xc8\x18\xa8\x2e\x25\x90\x09\xd5\xb0\x52\xce\xb1\xdf\xfb\x38\x78\x99\x72\x06\xd6\x31\x29\xb9\x82\x96\xec\xbd\x33\xe1\xe8\x2f\x7f\xda\x8d\x46\xb0\x1c\x44\xa9\x3f\x8b\xf6\x77\x3f\x65\xc9\x34\x14\x66\x59\x0e\x8a\x88\x72\x41\x2d\x7e\xeb\x1e\x5b\xbd\x43\x51\x05\x5c\x35\x76\x35\x1f\xaf\xb0\x7e\xb9\xb6\xac\xcb\x91\x7d\x41\xdb\x69\x0c\xda\x3e\xbf\xba\xf9\xf9\xfd\xe9\x7f\x5c\xbc\x77\xe7\x93\x87\x4c\xbf\xe4\xec\x7f\x4a\x20\x34\x17\x46\x16\xce\xc2\x00\xc1\x1e\x6a\xf4\xc1\x0f\x78\x92\xbb\x0d\x25\xdc\x91\x21\x63\x8f\xfc\xf6\x01\x93\xd8\x69\xff\xd3\xc7\x4b\x3e\x77\xef\xb0\xaa\x2b\x05\x46\x69\x04\xbd\xc3\x28\xe1\xa0\xcd\xc9\xb3\x12\xa5\xed\x25\xc7\xf8\x24\x0b\x85\xc9\xdd\xc8\x55\x5b\x9d\xa8\xad\x46\xd4\xaf\xbf\x60\xb8\xab\x62\xd4\x49\x0f\xb3\x7a\x0d\x1d\x75\xfe\xa9\xa9\xb6\x57\x03\x6c\x6b\x66\xaf\x06\x58\xd1\xe3\x72\x48\x68\x9a\x4a\x14\x53\xf0\xd4\xe7\x0b\x1d\x40\x8b\x3a\x62\xa7\x47\xde\x90\xbf\x93\x07\xf2\x77\x54\x0b\xfe\xd2\xb6\x4f\x52\x5b\x81\xbd\x8b\x00\x1c\xa3\x8d\x5e\x0e\x3b\x82\xf8\x3f\xa6\x54\xe3\x8c\x06\xaa\x5a\x90\x11\x73\x62\x28\x3c\x68\x90\x46\x2c\x72\x3b\xf1\xac\x1d\xa6\xcc\x02\x3f\x23\x9a\x59\x33\xf9\xe5\xb8\x19\xf4\xb3\x1d\xa2\x99\xc7\x8d\x7e\x7f\xe5\xa8\x50\xb3\x9b\x4b\x3d\x5b\x4e\x75\x32\x6d\x92\x31\x23\x60\xa8\x06\x73\x4a\x05\x92\x71\x1b\x90\x3b\x65\x2d\x42\x0b\xf6\x07\x8d\xdb\x79\x9b\x1b\xfb\xf9\xd8\x4e\x2d\x28\xfe\xc8\xe7\x9d\x60\x10\x94\x6e\x2a\x44\x3a\x20\x17\x34\x99\xe2\xb2\xd2\x80\x67\x18\x0d\x04\x27\x9b\xd2\x99\xd9\x78\xf7\xac\xf5\x63\xa3\xb4\x52\x59\x47\x11\x97\xcc\x79\x4a\x28\xb7\x2d\x48\xc7\x20\xa5\x8d\xa1\x1e\xcd\x7d\x28\x5b\xeb\xcd\x6b\x75\x92\x0a\x29\xb4\x48\x44\x8b\x26\x58\x8b\x79\x19\x38\x1d\x02\xa1\xb0\xb8\xeb\x20\xff\xdd\xf9\xb0\x47\x6e\xcf\x86\xd8\xba\xe8\xe6\xec\x76\xd8\x94\xb0\x0f\x6e\xcf\x86\x07\xcf\x0a\x0a\xe2\xcd\x6c\x68\x50\xdd\x61\x92\x86\xc1\x24\x63\x4a\xf7\x73\x5a\xf4\xef\x60\xbe\x23\x4f\xed\x82\xaf\xf7\xab\x1d\xee\xe4\x83\x2c\x98\x73\x5a\x6c\x3d\x9b\x04\x9a\xb2\x98\x00\xb4\xf9\x88\x09\x40\x1b\x8e\x98\x00\x14\x13\x80\x96\xc7\xde\x44\x4c\xc6\x04\xa0\xd7\xe5\xba\x8d\x09\x40\xdb\x8f\x67\xf7\xd8\xc6\x04\xa0\xd5\x23\x26\x00\xc5\x04\xa0\xcd\x46\x4c\x00\xda\x7e\xec\x5d\xac\x49\x4c\x00\xda\x6a\xc4\x04\xa0\xe5\x11\x13\x80\xd6\x8c\x98\x00\xb4\x66\xc4\x04\xa0\xe5\x11\x13\x80\xb6\x1b\x31\x01\x28\x26\x00\xbd\xea\xb8\x48\x12\x13\x80\xdc\x88\x09\x40\xaf\x22\xfa\x8b\xc4\x04\xa0\x8d\x46\x4c\x00\x8a\x09\x40\xbb\x8c\x98\x00\xf4\x5a\x8c\x32\x31\x01\x28\x26\x00\xfd\x7a\x04\xdd\x98\x00\x14\x13\x80\x62\x02\x50\x4c\x00\x7a\x74\x15\x31\x01\xe8\x35\xa8\x80\x12\x14\xfb\x17\x0c\x45\xc6\x92\x79\xeb\x80\xbf\x6b\xd7\x5a\x56\xb9\x69\x49\x81\xf3\x06\xa1\x55\x2d\x92\x38\xf6\x2c\x77\xe5\x3a\x00\x5c\x98\xc3\x52\xb5\xd7\xfd\x04\x20\xd8\x8b\x3c\x16\xff\x81\x57\xbb\x7b\x52\x70\x12\xa3\x35\x5a\xf0\xed\x66\xb7\x68\xad\x22\x84\x1f\xd2\x51\x68\xf5\x61\x98\x0a\x57\x61\x82\x16\x15\x05\x63\x6b\x11\x84\x16\x45\xc6\x40\x0d\xc8\x4d\xd5\xe2\x04\xa9\x97\x7a\x47\x92\xa2\xec\x91\x1c\x72\x21\xe7\x2d\xb4\x89\x0e\x04\xce\xc6\xae\x75\x04\xb2\x6b\x3b\xa7\x07\x83\x51\x22\x8a\x22\x9b\x5b\x61\xaa\xce\x1c\xac\xa0\xc6\x3c\x71\x49\x51\xdc\x59\x88\xf2\x60\xba\xa1\x86\x5d\x09\x7d\xed\x10\xfe\xd9\xc2\xd6\xd7\x05\x68\x53\x2d\x72\x96\xec\x42\xb0\x2d\x8d\xed\x90\x5a\x6f\x1c\xa1\x4d\x2e\x56\xfc\x8a\xa6\x6b\x55\x98\x49\x64\x3d\x65\x26\x81\xa6\x73\x9c\x12\x9b\xf9\x04\x5a\xf1\x0b\x0c\xf4\x4e\x32\xca\x76\xf7\xca\x37\x03\xa7\xce\x70\x2e\x62\x50\xa1\x0e\x9d\xc2\x08\xdc\x0a\x7c\xbd\x2a\x2c\x89\xd9\x43\x30\xf0\x97\xec\xc3\x3d\x1b\xc7\x6b\x40\x8e\x22\x25\x0a\xde\x4c\x85\x1a\xf7\x8f\xbc\x16\x7e\x39\xa1\x59\x31\x7d\x5c\xfc\x35\x0b\x39\x9f\x73\x9a\xb3\xc4\x23\xc6\xa9\xdd\x3b\xa3\xee\x34\x05\x60\x3f\xb7\x9d\xcf\xbc\x24\xcf\x4b\x4d\x47\x19\x0c\xc8\xa5\x4d\xa5\x11\x1c\x3b\xdd\x63\xfc\x85\x73\x6b\x78\x24\xda\x35\xc2\xaa\x7d\x78\x45\xcb\xd0\x8a\x95\xa7\x07\x37\xc4\xa6\x0d\x01\x37\x98\x2f\x38\x10\xe0\x5a\xce\xcd\xde\x0d\x45\x7a\x63\xb6\xaf\x71\x77\xeb\x6c\xa2\x96\x11\x15\x5d\x44\x53\xb4\x8c\xa4\xe8\x26\xfe\xa1\x7d\xec\xc3\xb2\x13\x37\x48\xf0\x0b\xc3\x1a\x1b\xbb\x6a\x68\xd8\x8a\x53\xe9\x19\xff\x50\xa4\x86\x7d\x49\x08\x5b\x89\x39\xed\x0f\x0f\x48\x4e\xef\x50\x81\xa6\xba\xe6\x6b\x74\x46\x59\x66\x8e\x50\x9d\x1e\xd0\x52\x56\xf4\xa3\x03\xc6\xdf\x75\xd6\x14\x69\x8b\x41\x5d\x66\x3d\x11\xec\x7c\x94\xb3\xdd\x32\xf8\xc9\x92\x0c\xf8\x1e\xe7\x0a\x82\xad\x0c\x4e\xe4\xf4\x01\x35\x52\x9a\x8b\x92\x6b\x83\x29\x89\xc8\x8b\x52\x37\x79\x26\xb2\xdf\xad\x55\xd5\x44\xf0\x31\x9b\x38\x13\xd7\x49\x4e\x39\x9d\x40\xbf\x9a\xb6\x5f\x93\xde\x93\x76\x7a\x6a\x2b\xb2\x43\x53\x9f\xe0\x32\xec\x22\x56\x9c\x6a\x0d\x92\xbf\x23\xff\x79\xf4\xe3\xef\x7f\xe9\x1f\x7f\x79\x74\xf4\xc3\x9b\xfe\xdf\x7e\xfa\xfd\xd1\x8f\x03\xfc\xc7\xef\x8e\xbf\x3c\xfe\xc5\xff\xf1\xfb\xe3\xe3\xa3\xa3\x1f\xbe\xfd\xf0\xf5\xed\xf0\xe2\x27\x76\xfc\xcb\x0f\xbc\xcc\xef\xec\x5f\xbf\x1c\xfd\x00\x17\x3f\x6d\x38\xc9\xf1\xf1\x97\x5f\xec\xbc\xe4\xd6\x16\xe8\xee\xec\xcf\x1d\x59\x9f\x3f\x89\xed\xd9\x45\x69\x76\x74\x16\x5d\x84\xf9\xd2\x69\x74\xf6\xa1\xc7\x4e\xa3\xe7\x92\xa8\x66\x54\xf3\x30\x45\x44\xce\xb4\x76\x52\x32\x0d\xf3\xca\x16\x94\x0f\x47\x07\xd8\xd8\x52\x7a\xa6\xc2\x9c\xac\x40\x67\x11\xde\xd0\x8a\xca\x0f\x27\x2c\x2f\x32\xc8\x81\x6b\x3c\xcf\x7d\x2f\x09\xa2\x36\x38\xa8\x57\x92\x50\x6e\x64\x76\x78\x48\x00\x52\xf7\xb2\x48\x3a\x9e\x1e\x91\x74\xbc\x46\xd2\xa1\x20\x29\x25\xd3\xf3\x33\xc1\x35\x3c\xec\xe4\xef\x5c\xe7\xf0\xbd\x69\x4e\xed\x54\x33\x17\xbb\xea\xae\x11\x51\xd8\x4c\xcd\xb5\x35\x90\xa6\xa2\xcc\x52\xac\x30\x50\x72\x74\x01\xd9\x62\x15\xa0\xad\x7f\x06\x85\x44\x94\x20\x17\x5f\xe7\x3d\x2e\x76\xea\xff\x29\xd9\x8c\x66\xc0\x75\xf0\xc4\x10\x7d\x0c\xe1\x43\x3b\x99\x89\x9e\x59\xc5\x46\xe9\x67\x28\xd9\x8c\x65\x30\x81\x0b\x95\xd0\x0c\xa9\x52\x37\x8c\xe0\x74\xcd\xec\xb8\x45\x52\x64\xca\x48\xec\x86\x10\x13\xea\xdd\x69\xa8\xc7\x4e\x28\xe3\x24\x37\x44\xb5\xf0\x0f\x2b\xeb\x97\x33\xb4\xbd\xa0\xd2\x6c\x45\xe5\x7f\x43\xad\x78\x24\x44\xe6\xf2\x8a\xb3\x79\x3d\x3f\xb3\xca\x01\x17\x3f\x73\xb8\xff\xd9\xcc\xa6\xc8\x38\xa3\x93\xca\xed\x66\x54\xe5\x45\xcf\x79\x3d\xf5\xda\x0f\xc0\xa4\xdd\x12\x08\xcd\xee\xe9\x5c\xd5\x4e\xc8\x7a\x0e\xa6\xde\x91\xb7\xc7\x88\x78\x54\x91\x6a\x8e\x94\xfc\xe1\x18\x43\xe9\xce\x4e\x87\x3f\xdf\xfc\xf3\xe6\xe7\xd3\xf3\x0f\x97\x57\xe4\x4a\x68\xb0\x1c\x2b\xd0\x5e\x1c\xb3\x71\xab\xac\x6c\x73\x03\xa1\x06\xa8\x21\x61\x64\x38\x4f\xc5\xbd\xda\xd9\x42\x69\xd1\xcf\x00\x0f\x28\xdf\xcd\x48\x43\x0b\x8a\xfd\x9d\x5b\xf0\x87\xa5\x68\xed\x70\x52\x64\xd0\x69\x7a\x92\x4a\x51\x58\x20\x78\x87\x71\x68\x23\x3b\x5f\x88\x03\xf1\x59\x67\xb8\xbf\xe3\xe6\x84\x13\x49\xb9\xae\x3d\xa7\xf5\x9e\xb9\xc6\xd2\x83\xd6\xdb\xf1\x7c\x6c\xbb\x0b\x1d\x9f\xa6\xdd\xd5\x0c\x38\x4d\x53\x48\x1b\xe0\x7f\x75\xb9\x3e\x67\xfe\xe3\x02\x97\x14\x19\x7e\xbc\xb9\xfc\xdf\x0b\x78\x3c\x2f\xda\x25\x1d\x74\x53\xca\x45\x8a\xa2\xb3\xdd\xbd\x86\x5c\xcc\xe2\xfe\xee\xcb\xfe\x56\xdc\xb2\x9b\x50\xd7\xeb\x92\x87\x0c\x8d\x07\xf3\x93\x5c\xa4\x30\x20\xc3\x2a\xe6\xa6\x79\x35\x2c\x17\x29\x81\x98\x5b\xb8\x66\x34\xcb\xe6\xa1\x30\xa5\x85\xad\xf5\xd1\x28\x26\x16\x12\xf2\x31\xcd\xd4\x73\x53\xe3\x36\xbc\xd1\xc8\x11\x1f\x8c\xb2\xdb\xc9\x76\x54\xb3\x91\x14\xb8\xd0\x4e\x18\x36\xab\xc4\x02\x6d\x52\x24\xc4\x6a\xd6\x41\x62\x43\x83\xbf\x29\x1b\xf7\xe3\x59\x23\x53\x1e\xd8\xc3\x6a\x66\xeb\x32\x2d\x15\xa8\xd5\xac\xb1\xd6\xb5\xcd\xec\x12\x68\x8a\x3e\x87\x82\xea\xa9\x8d\x4b\xce\xa9\xba\x83\xd4\xfe\xe0\x44\xb3\xca\xed\x81\x66\x5a\xff\xaa\x5b\xb3\x6e\xef\xe1\x40\x91\xcc\x46\x4b\xa3\x6f\x04\xd2\x67\xde\xf5\x16\x87\xd0\x00\xe5\x23\xcf\xe6\xd7\x42\xe8\xaf\xaa\x62\x35\x9d\x60\xc0\x3f\x9c\xb4\xdc\x74\x3b\xa1\x38\x49\xf1\xbd\x7d\xdc\x0d\x3c\x54\x61\x9d\x9c\xf3\x7a\xc7\x5f\xfa\x91\x92\x25\x3f\x55\x5f\x4b\x51\xee\xcc\xc4\x96\x84\xcd\xaf\x2f\xcf\x91\x14\x95\x2e\xec\x8f\x6b\x39\x2f\x04\xb3\x26\xaa\x35\x8a\xc1\x77\x2e\x70\x31\x3c\x13\x75\x8c\x19\xf9\x40\xe7\x84\x66\x4a\x78\x58\x3a\xa7\xd4\x82\xbe\x48\x9c\x32\x6a\x2e\x8f\x84\x9e\x2e\x69\xa1\xe6\x40\x2d\x3f\xd7\x0b\xa2\x00\x6b\x5f\x3d\xe3\x4b\x8f\x6b\xf4\x78\x14\x12\x12\x48\x81\x27\xcf\xbd\xed\xcf\x1d\x3c\x87\xa8\x73\x25\xb8\x39\x98\x9d\x20\xcf\x65\x15\x35\xe9\x40\x1a\xa2\x0a\xba\xb4\x9c\xf6\x47\x31\x0a\x13\x8f\x65\xa9\x40\xda\x90\x51\x59\x82\xdd\xc9\x6f\xcb\x11\x64\x06\xf2\x46\x25\xc5\x72\x99\x54\x5b\xc3\x03\xcb\xe9\x04\x08\xd5\x15\xa6\x69\x41\x80\xab\x52\xba\x4d\x64\x9a\xa4\x02\xea\x1a\x57\x54\x91\xef\x2e\xcf\xc9\x1b\x72\x64\xde\x75\x8c\xf8\x33\xa6\x2c\xc3\x00\x4d\x0c\xf8\x58\xd0\x51\xc7\x7e\x0a\x5c\x12\x22\x2f\x11\xd2\x12\x89\x1e\xe1\x82\xa8\x32\x99\xfa\x35\x19\xbd\xd7\xab\xcd\x2e\xa9\x08\xfd\x26\xfb\x89\xeb\xcf\x4b\xa1\xbe\x53\x20\x3b\x23\x50\xdf\xed\x40\xa0\x42\x31\xca\xe0\x5c\x13\x7a\x16\xb1\x72\xd0\x34\xa5\x9a\x3a\xc2\xe5\x6f\xd8\xdb\x2d\xfd\x75\x93\x2f\x05\xef\x19\x2f\x1f\xac\x89\xb4\x3b\x53\xcb\xcd\x05\x4e\x8b\x38\x84\x50\xc7\x5d\xb7\x81\x71\x55\xfc\x50\x10\xe2\x72\xd9\xc0\x95\xde\x1a\x31\x11\xe9\x84\x0f\x43\x32\xc2\x09\xe5\xa9\xc8\x97\x5e\x86\x31\x4f\x34\x99\x86\x2f\x88\xd8\xd7\x1c\x7b\x62\x14\xca\x60\x06\x2d\x8a\xe1\x2e\x60\xde\x7b\x33\x9b\x01\x8e\xc7\x08\x9c\x9e\x64\x74\x04\x99\x0b\xb3\xb2\xa1\x99\xcb\x18\xf8\xdc\x99\x5d\x52\x64\xdd\xa5\xa2\x5f\x8b\x0c\x6c\xaa\x84\x07\x84\x99\xfe\x45\xc0\x01\x27\xe9\x0a\x0e\xa8\x0d\x36\xe0\x80\x7a\xed\x4b\x80\x43\xd9\x82\xd5\x93\x45\x38\x18\xb9\xa1\x09\x07\x64\xde\xfb\x0e\x07\x05\x49\x22\xf2\x62\x28\x85\x51\x3b\x3b\xe3\x4d\x6e\xda\xda\xcf\x67\x0d\x1b\x2b\x02\x2f\x91\x17\x34\x6f\xa6\x32\x48\x92\xa2\xda\x32\x09\x9f\x29\xf5\xbf\x02\x9e\x85\xa4\x67\x91\x91\xf9\x59\x1a\x8e\x40\xf3\xa4\xbb\xf0\x92\xd9\x41\x17\x79\xc6\x2d\x8c\x9d\x9d\x70\x23\x91\xd0\x0c\x9b\x1d\xb4\x43\x39\xb2\x88\x76\x8b\x13\x07\xa9\x71\xe8\xa3\xc4\xdf\x82\x38\x61\x8a\x86\x16\x6f\xc2\xe4\x22\x85\xc0\xeb\x6c\x63\x0f\x6f\x6d\x0a\x15\xde\xe7\xb3\xf2\x8c\x5c\xe1\xa2\x40\x20\x6d\x3c\xad\x85\xab\x33\xfc\xa1\x6a\xa1\x60\x16\x08\x3c\x65\x7c\x82\x76\xb5\x1e\x91\x90\xd9\x7c\x3e\x47\x04\xee\xac\x06\x79\x88\x47\xc2\x4f\xea\xcf\x83\x7f\xb5\x0f\x2b\x76\x33\x87\xb1\xc2\x6c\x6c\xc9\x2d\x53\xe4\xe0\xbd\x07\x40\x8b\x9a\xf3\xfb\xc8\x61\x0e\xec\x17\x56\xbb\x69\x2d\x9d\x77\x8c\xa7\x2e\xf5\xad\x01\x2c\xaf\xe7\x3a\x39\x18\x93\x2a\x59\x1a\xd2\x96\x77\xe4\x47\x4e\x2a\x60\x91\xfe\xce\xe8\x71\x6d\x45\x66\x6f\xa3\xeb\x3f\x6e\x78\xad\x5e\xb2\x38\xcd\x77\x1c\xf7\xde\xbc\xb7\x6f\x34\xf7\xe5\xfb\xfc\xb7\x3c\x6b\xb1\x4d\x47\xfd\xba\xd6\x62\xfe\x61\xa7\xf5\x22\x7d\x62\xd0\x5a\x33\x3e\x51\xa1\x26\xd3\xec\x6c\xb5\x5a\x95\xf1\x3b\x3c\x96\x22\xf7\x71\xc5\x8b\xaa\x41\x33\x65\xf7\xa5\xa8\x21\x99\x11\x27\x5e\xb8\x12\x32\xc9\x15\x3d\x93\x06\x12\x9a\xd1\xec\xa6\xd8\xbd\x11\x00\x59\x2a\x3a\xfd\xe1\xe6\xb4\x39\x35\x32\x6b\x17\x51\x0e\x78\x9d\xd0\x34\x67\x4a\xa1\x21\x0c\x46\x53\x21\xee\xc8\xd1\x8a\x0a\xba\x41\x94\x95\x62\x13\x75\xe2\x70\xbe\x6f\x56\x7f\x4c\x18\xcf\xaa\x48\x26\xd4\x83\xb9\xae\x82\xd8\xf1\x25\x49\xb5\x0a\xdc\x43\xd7\x68\xc5\x05\x2b\x2c\x2f\xd3\xb6\x56\x31\x58\xf0\xec\x04\x7b\x79\x7b\xda\xa5\xf9\x3d\xb9\x45\x57\x0e\xb7\x17\x6b\x21\xaf\x84\xa3\x95\x1e\x9f\x1d\x48\x4e\xb8\x48\x40\x75\x57\x82\xf5\x9b\x7a\x4e\x92\x82\xcd\x88\x07\x8c\x7e\xa2\x6b\xc3\xe1\xd0\x2e\x7d\x88\x85\x55\xdc\xa3\x87\xa1\x44\xdd\xcc\x35\xc2\x54\xa6\xbe\x55\xd2\x0d\x45\x43\x12\xe8\x45\x88\xa9\xe0\x42\x5a\x14\x35\x4c\x54\x70\x44\x69\x24\x51\xd6\x9b\x87\x7b\xe2\x48\x74\xb0\xd4\xb3\xda\x4b\x1c\x3a\x02\xb1\x30\x83\xad\xc5\x56\xaf\xe1\x9e\xe9\x29\x76\x53\x98\x2e\x78\x0d\x71\x25\x12\x14\x3a\x60\x38\x01\x29\x85\x74\x01\x59\xde\x6e\xed\x12\xad\x86\x22\xc5\x88\x2e\x83\x24\xd4\xfc\x75\xa8\x42\x47\x75\xdd\xbb\xa8\xaa\x8f\x09\xe3\x31\x24\x28\x68\x85\x00\xb6\x54\xfb\xa8\x6e\x2f\xe1\x33\xf8\xb4\xf0\xbd\x8f\x72\xf6\x60\xde\x12\x3e\xb5\xd0\x41\x91\x0b\xde\x5f\x7d\xf9\x78\x40\xc8\x25\xaf\xe2\x6f\x7b\x66\x17\xc3\x3b\x7d\xe8\x99\x36\x9f\x18\x36\xce\xc2\x0f\x08\x0d\x67\x46\x3a\x94\x65\x07\x18\xdf\xc6\x1c\x4e\x42\x93\x78\xa7\xe4\x00\x4d\xe3\x6e\x52\xb3\xf5\x5e\x06\x68\x63\x2a\x37\xb7\x7c\x2a\x73\xf9\xcb\x70\x80\x90\xb6\x74\xce\x55\x26\x8b\xdd\x8c\x36\x1b\xb1\x9b\xd1\x86\x23\x76\x33\x8a\xdd\x8c\x96\xc7\xde\x84\x0c\xc6\x6e\x46\xaf\xab\x0e\x65\xec\x66\xb4\xfd\x78\xf6\xf2\x93\xb1\x9b\xd1\xea\x11\xbb\x19\xc5\x6e\x46\x9b\x8d\xd8\xcd\x68\xfb\xb1\x77\x85\x73\x63\x37\xa3\xad\x46\xec\x66\xb4\x3c\x62\x37\xa3\x35\x23\x76\x33\x5a\x33\x62\x37\xa3\xe5\x11\xbb\x19\x6d\x37\x62\x37\xa3\xd8\xcd\xe8\x55\x17\x79\x27\xb1\x9b\x91\x1b\xb1\x9b\xd1\xab\x28\x65\x4d\x62\x37\xa3\x8d\x46\xec\x66\x14\xbb\x19\xed\x32\x62\x37\xa3\xd7\x62\x94\x89\xdd\x8c\x62\x37\xa3\x5f\x8f\xa0\x1b\xbb\x19\xc5\x6e\x46\xb1\x9b\x51\xec\x66\xf4\xe8\x2a\x62\x37\xa3\xd7\xa0\x02\x2a\x9d\xb2\x9d\x0a\x46\x6e\x52\xdb\xc6\xc5\x2c\x07\xa9\xe4\xa3\x72\x3c\x06\x89\x94\x0b\xdf\xbc\x14\x56\x55\x97\xf1\x5b\x74\xe5\x82\xee\x61\x99\x1c\x97\xde\xb1\xe6\x71\x97\xbb\x8e\x85\x1d\xeb\xc0\xe2\x8b\x8f\x5f\xad\x28\xa4\xb3\x73\xbc\xe1\xae\x21\xb5\xb8\xe6\x8f\x7c\x37\x2f\xfc\x1a\x80\xaf\x4a\x37\x72\x70\x4f\x32\xa1\x5c\x40\x34\x02\x2b\x99\x52\xce\xc1\xeb\x7b\x4c\xa3\x1d\x65\x04\xc0\x89\x28\xc0\xf9\xc0\x29\x51\x8c\x4f\x32\x20\x54\x6b\x9a\x4c\x07\xe6\x4d\xdc\x03\xbb\x0e\x5e\x76\xbf\x28\x2d\x81\xe6\x3e\x8c\x3b\xa7\xcc\x4e\x45\x68\x22\x85\x52\x24\x2f\x33\xcd\x8a\x6a\x32\xa2\x00\xf3\x2f\x2c\xa3\xaa\x80\x81\xf1\x72\x75\xc4\x73\xaf\x7e\x9b\x5b\x96\x08\x2b\x99\xa1\xb6\xd9\xc3\xda\xd0\x79\xa1\xe7\xc4\x7c\x72\xe6\x0a\xc2\x4a\xa5\x49\x92\x31\xe4\xd6\xf8\x46\x9b\x6a\x8b\xf3\xf5\x3c\xaf\xe6\x6e\xa5\xca\x2d\x95\xa7\x28\xb6\x16\x5a\x11\x0c\x10\xae\x27\x74\x53\xa5\x4c\x39\x31\x5f\xf5\x08\xf5\x65\xb6\x2c\xa0\xfd\x4a\x11\xd4\x9e\xb3\xd8\xd9\xdd\x4f\xc1\x74\x41\x79\x51\xdf\x18\xc8\xe5\x20\xd9\x58\xf9\x8c\x4e\x2a\xe4\xec\x35\x82\xff\x6b\x81\xc2\xb5\x40\x58\x38\x06\xb8\x01\x1c\x66\x06\x07\x20\x01\xc3\x5f\xe9\x1a\xac\xff\xec\x48\xaf\xa9\x9c\x80\xae\xd2\x05\x76\x8d\x22\x6f\x06\x9f\x84\x85\x80\x43\x45\xa4\x06\x19\x42\xc7\x35\x13\x09\x32\xae\x56\x55\x1a\xb6\x2b\x74\x05\xd6\x56\xdd\xe0\x05\x23\x1b\xbc\x59\x77\xa0\x29\x68\x02\x8a\x1c\x5d\x0e\xcf\x7a\x64\x78\x79\xee\x22\x34\xc5\x78\x55\x86\xb3\xa3\x61\x16\x03\xd7\xd5\x3c\xae\x6a\xb7\x05\xd3\x07\x59\xa1\xee\xdd\xc3\x4a\xbe\xc2\xb6\x32\xab\x28\x00\x8a\x5c\x55\x59\x74\xa2\x6c\x87\x2c\x67\x13\x62\x55\xca\x86\x43\x3e\xa8\x13\x15\x7d\x45\x22\xff\x44\xb5\x10\x07\x25\x97\x8f\xe1\x3d\xea\x48\x60\x91\x5f\x2f\x25\x7d\x60\x90\xa8\x8b\xae\xd9\x29\xaa\xa6\x95\x86\x14\x88\x62\x1f\x40\x29\x3a\x81\xe1\x8e\xee\xad\x75\x76\x00\xf4\x70\xd5\xe4\x00\x09\x50\xd6\x68\x5d\x16\x46\x0b\x37\x85\x6f\x92\xdb\x35\x55\x98\x75\x2f\x99\xd6\x80\xa4\x04\xcb\x00\xe2\x66\x2f\x56\x09\x38\x5c\x88\x39\xfe\xe0\x27\xa9\x1f\x36\xa2\x04\x4f\x6d\x04\xf0\x08\xc8\x48\x32\x18\x93\x31\xc3\xb0\x62\x0c\xf4\xed\xd9\xaa\x50\xd4\xda\x9e\x94\x02\x69\xbb\x15\x59\x0d\xca\xaf\x6b\x40\xfe\xe1\x16\xa6\x65\xc9\x6d\x37\x2a\x27\xdc\x63\x1a\x2c\x1b\x93\x09\x06\x0a\x3b\x1d\xe5\x4f\x6f\xfe\xf6\x17\x32\x9a\x1b\x41\x0a\x11\x52\x0b\x4d\xb3\xea\x23\x33\xe0\x13\x03\x2b\xcb\x14\x9a\x89\x9c\x15\x04\xb0\x9f\x88\x5d\xf8\xdb\x3f\xdc\x8d\x9a\x92\xdd\x49\x0a\xb3\x93\x00\x7e\xfd\x4c\x4c\x06\xe4\xac\xca\x9b\x2c\x8b\x14\xed\xfc\xbb\x17\xf1\xee\x0e\xcd\xba\x69\x0c\xe9\xcb\x93\x91\xa9\xb8\xb7\x1a\xe6\x0a\xec\xa9\x73\xc2\x0a\x51\x94\x99\x75\x75\x7c\x55\xa5\x40\x97\x0a\x96\x13\x15\x57\x9e\x0b\x34\xce\xbb\x29\x16\xe8\xa8\x8b\x0f\xf7\xaf\x14\x2e\x01\xc6\x99\x8f\xab\x2a\x65\x48\x4c\xbe\xa2\x59\x36\xa2\xc9\xdd\xad\x78\x2f\x26\xea\x23\xbf\x90\x52\xc8\xe6\x5a\x32\x6a\x78\xf4\xb4\xe4\x77\xb6\x87\x44\x55\xc7\x41\x4c\x5c\x00\x81\x2f\xfb\xbd\xea\x83\x6d\x52\xbf\x67\xfd\x5e\xf9\xae\x67\x81\x07\x56\x6b\xd8\x2e\x9f\xcc\x62\x64\x38\xbf\x0a\x91\xed\x0f\x6f\xfe\xf4\x57\x8b\xba\x44\x48\xf2\xd7\x37\x98\x43\xa0\x7a\xf6\x10\x23\x47\x35\xe2\x49\x4e\xb3\xcc\x10\xf2\x10\x29\x0d\xa0\x57\x21\xe1\x67\xc7\x41\xdd\x1e\xdd\x36\x16\xe0\x6f\x6f\xff\x89\x5c\x84\x69\x05\xd9\xb8\x67\x53\xa7\x2a\x65\xfa\x10\xc5\x91\x43\x47\x7d\x30\x7f\x6d\x0f\xc4\xee\x99\xc8\xca\x1c\xce\x61\xc6\xba\x68\x02\xd8\x98\xcd\x1b\x98\x32\xa6\x90\x0f\x8e\x32\x91\xdc\x91\xd4\x5d\x0c\xa2\xaa\x16\xcb\x95\xbf\xdc\x7e\xae\xe1\xf7\x37\x22\xca\x72\x5a\x14\x46\x06\xc0\x0c\x4d\x49\xef\x1b\xc0\xc0\x33\x89\x35\x15\x5e\x7e\x3f\x57\xfb\x45\x86\x6e\xee\x3c\xc5\xce\x61\x68\xed\x3d\x23\xf5\xea\x3b\xea\xeb\x57\x4f\xe8\x4f\x43\x81\xff\xb6\x59\x4e\x4b\x82\x79\x55\x6e\xb3\x42\x0c\x2b\x00\x18\xf4\x41\x92\xfc\x6c\x7d\x47\x49\xeb\x70\xba\x06\x5c\xf8\x23\xcd\xf1\x28\x29\x40\x2a\xa6\x0c\x5f\xfe\x1e\x0f\x94\xed\x8a\x58\x1b\x9e\x9f\x07\x08\xf6\x70\x63\x8d\xe7\xf6\x94\xd2\xe8\x29\x76\x42\x24\x85\xb6\xbe\xf5\x0a\xb1\xb6\x29\xd5\xde\x94\x23\xc4\x1f\xbc\x7d\x9b\x4e\xab\x1d\x72\xe2\xe7\xa6\xb1\xdf\xd7\xdb\xd0\x24\xb1\xe6\x97\x8a\xc6\xda\xbb\x5e\x13\x65\xc5\xef\x7b\xa9\x84\xb5\x5a\x7c\x47\xf4\x03\x29\xaa\xdb\xdc\x26\x09\x6d\x68\x9d\xf6\x84\x05\xba\x80\x53\x20\x07\xc4\x06\x6d\x98\x33\xe1\x1e\x25\x87\xef\x0e\x9f\x95\xba\x5a\x10\x49\x51\xd0\x49\xab\x4e\x45\x0b\x90\x5a\x9c\x36\x2c\xa3\x61\xf4\xa7\x80\x94\x14\xee\x2e\x43\x49\x7c\x95\x20\xac\x01\x65\x9d\xf9\x1e\xc0\x4e\xb3\xc0\x46\x73\xe4\x9e\xce\x09\x95\xa2\xe4\xa9\x33\x87\x56\xf6\xe8\x0f\x0b\x2f\xbe\x12\x1c\xea\xbe\xa5\xcd\x2a\x1c\xe8\x80\x62\x9c\xbc\x1d\xbc\x7d\xf3\x5a\x58\x1c\x7e\xe1\x02\x8b\xbb\xaa\x58\x9c\xa5\x4f\xcf\xfa\xad\xbe\x9e\x7f\x47\xdf\xfb\xc1\xd9\x66\xea\x72\xfd\xcc\x17\x03\xc7\x9f\xee\x25\xd3\x10\xb4\x27\x3c\x42\x8d\xc7\x28\x96\x41\xcd\x89\xe3\x55\x7d\x32\x5a\x02\xa9\x5d\x91\x0f\x55\x8e\x3e\x21\xdd\x72\x04\x0a\x8f\xdb\x2a\xd3\x98\x7a\x84\x84\x85\x80\x3a\x38\x20\x47\xf6\xce\x43\x9b\x99\x7f\xfc\xac\xa8\xe5\x80\x76\xf1\x50\xb4\xa8\x20\xba\x50\x04\xa2\xa0\x68\xbc\x2b\x3a\x84\xe0\x7f\xc0\x94\xce\x00\x2b\x12\xb0\x8c\xca\x0c\x5d\xe4\x37\x76\xed\x64\x54\x6a\x02\x7c\xc6\xa4\xe0\x68\x27\xc6\x94\x8d\x51\x06\x61\x77\xee\x2f\x8e\xbe\x3f\xbd\xc6\xf8\x9b\x63\xdb\x0f\xc6\xaf\xb2\x54\xbe\x38\x4f\xb8\x92\x60\xba\x27\xb7\xcf\xaf\xc3\xc0\x10\x69\xae\x5f\x97\x79\x4f\x5e\xea\xd2\x36\x9d\x79\x48\xb2\x52\xb1\xd9\x73\x51\x12\x57\x2a\xe2\x9c\xed\xb4\xcf\x0b\x65\x2b\x6a\x40\x2d\x55\xa0\xa8\xdd\x04\x4f\x14\xe8\x3e\xfc\xff\xd8\xfb\x1b\xee\x36\x6e\x6b\x5f\x18\xff\x2a\x58\x6a\xd7\x5f\x52\x4b\x52\x76\x72\xda\xd3\xe3\x9b\x7f\xb3\x54\x49\x4e\x74\x63\xcb\x3a\x96\x9c\x3c\x7d\xe2\x9c\x16\x9a\x01\x49\x54\x33\xc0\x64\x80\x91\xcc\xde\xdc\xef\xfe\x2c\xec\xbd\x81\x01\x86\x94\x63\x71\xc6\xa6\xe4\x70\xba\x56\x63\x91\x43\x0c\x06\x2f\x1b\xfb\xf5\xf7\x33\xa1\x92\x35\x4e\xd9\x20\x9f\x15\x2b\xe5\x6c\x6e\x29\xdb\xb3\x13\x39\x88\x42\x50\x25\xb8\x79\x37\xe9\xbd\x72\xc7\xee\x61\x21\xb9\xb9\xaf\xca\xb5\x54\x2e\x49\xad\x10\x73\xbf\xf6\xb9\x45\xde\x29\xe3\x1e\x84\x9e\xca\xd3\x73\x8a\xa0\xf9\x71\x93\xea\x5f\x98\x58\x13\xcc\x12\x4c\x94\xc1\x9f\xa0\xbb\x71\xca\x22\xb8\x20\x9f\x50\x02\xc2\x1f\x30\xaa\xc0\x22\x51\x5a\x8d\xe7\x11\x9c\x53\xa5\xf3\x7b\x96\x12\xae\x6b\x78\xac\x65\x72\xac\x1e\x41\x36\xd7\x45\xee\xc9\xb7\xd1\x97\x73\x25\xec\xad\x10\x8a\x9d\x9e\xc3\xf8\xb9\x57\xc4\x72\xae\xd5\xa3\x88\x61\x85\xc0\xfa\xbe\x6a\x3c\xef\xbb\xc0\x7a\x58\x25\x7d\x54\xfa\xf0\xa6\xbd\xf7\xfc\xb7\x61\xcc\x7c\x46\x36\xbf\xd2\x37\x02\x86\x34\xcf\x6b\x61\x7a\x00\x1f\x6d\xc0\x4e\xed\x25\x4a\xe5\x5a\xc4\x3f\x69\x60\x24\x0c\x9b\x77\x2d\x81\xfa\x0e\x5b\x15\x16\xde\x27\x96\x60\xa7\xe7\x47\x3d\xa4\xd7\xee\x1b\x8a\x8b\xb8\xa6\x76\x77\x0d\x93\x55\xd6\xc6\x5c\x27\xac\x0d\x37\x46\x85\x12\xa8\x31\xde\x2f\xd6\xb5\xae\x9a\x18\x09\xb5\x9e\x42\x9a\x29\x6c\xc6\x89\x15\x2a\xc5\x26\x77\x0e\x04\x1d\x2a\x9d\x03\x33\x53\x3b\x1a\xc6\xff\x22\x1e\x10\x9f\x2c\x81\x42\x9e\x52\x47\x46\x21\x09\xb9\x23\x98\xc0\xf5\xee\xd3\x0f\x23\x29\xbe\x34\x98\x9f\x6c\x2c\xcf\x4f\x8f\x87\x5c\x2e\x95\xcc\x1f\xdc\x72\x79\x63\xee\x5d\xd2\xff\xfe\x97\x04\x4c\xbf\x5f\x7b\x4b\x0c\x36\x11\x4c\x1f\xfd\x0d\x69\xea\xda\x32\xe2\x7d\x0c\x99\xb0\xab\x12\x3a\x40\x8a\xa4\x4f\x1a\xb9\xbf\xa7\x4d\x01\x8b\xb4\x4d\xee\x0d\x99\xc9\x3c\xe4\x85\x82\x36\xc0\x6f\xb8\x2c\x10\x31\x53\xdf\xdd\xa4\x0f\xbf\x17\x9a\xe7\x58\xee\x71\x2d\x6a\x25\x0a\x56\xea\xbc\x29\xd0\x9b\x17\xf8\x85\x5f\xbe\x3a\x7e\xf3\xe2\xc4\x27\x61\x89\x76\x3a\x47\x8c\x33\x25\x6e\xa1\x75\x05\x0a\x49\x46\xc0\x5d\xa1\xec\xc7\xed\x27\x8f\xc5\x89\x66\x28\x3a\x26\xfc\x0b\x95\xd2\xca\x19\x02\x6c\xb6\x6a\xe1\x55\x2d\xf8\xb5\x6e\x2c\xbb\x69\x0a\x25\xea\x96\x1f\x53\xdc\x08\x85\x3e\x58\xf7\x03\xf7\xd8\x18\xab\x51\xd6\x09\x44\x26\x01\xa7\x79\xd8\x4f\x9e\x91\x26\x4f\x25\x46\xf0\x65\x44\x0e\x9d\x50\x48\xbe\x1f\xba\xd4\x6b\x5e\x11\x6a\x29\x96\x13\x2f\x43\x96\x7a\x74\x49\x4c\xa3\xb9\xf0\x19\x30\x94\xf8\xf2\xe9\xb6\xc3\xfd\xdd\x2d\x69\x85\x68\x0a\xdf\x42\x0d\xfa\xb3\xef\x5c\xe7\x77\x58\x0d\xad\xde\x05\xf7\xc7\x94\xd9\x56\x33\xce\xd0\xdd\x3e\xf6\xf0\x37\x90\x29\xbb\x8e\x18\xbc\xf7\xa1\x09\x96\xc7\x79\x53\x14\x17\x22\xab\xc5\x7d\xc3\x0c\xa9\xa4\x38\xed\xb4\x75\x97\x05\x10\x99\xb3\x80\x09\x42\x37\xab\x16\x7f\x20\xca\x73\x6a\x6b\x71\xab\xa6\x80\xd4\x70\xae\x16\x7e\xc0\xa1\xf7\x26\x8a\xe9\x4a\xe3\xb3\xcc\x50\xfa\x24\xb3\x60\x44\x78\x58\x20\x5f\xe3\xc6\x60\xe6\x81\x54\xb9\xbc\x91\x79\xc3\x0b\x78\x10\x18\x65\x94\xb0\xc5\x09\xc7\x1c\xf7\x72\xe9\xd1\x8f\xef\x9b\xc3\xdc\xee\xc9\x03\xec\xf7\xef\xb0\x7b\x0b\xa9\x66\x63\xf8\xc4\x3d\x98\x7a\x38\xd6\x6a\xcc\xc7\x6e\xd9\x3c\x12\xbb\x05\xf0\xfb\x5f\x81\x61\xf0\xda\xcf\xaf\x17\x43\x86\x09\xa5\x9b\xd9\x1c\x06\xab\x2e\xb9\x87\xd2\x2c\x84\x05\x94\x44\xca\x67\xc0\x24\x36\xfa\x6d\x4e\x56\x46\x8c\x1a\x99\xae\x8d\x47\x62\xbb\xac\xeb\xe0\xed\x24\xe3\x47\x62\x86\xc6\xc8\xde\x7b\x05\xea\x1b\x51\xdf\x48\x71\x7b\x40\x9a\xdf\xd8\x9d\x09\x63\x1c\x11\x73\x00\x03\x7b\xf0\x3b\xb4\x8e\x2e\x5f\x1d\xbf\x02\xca\x71\xf2\xba\xfb\xa3\xca\x1d\x05\x66\xc2\x78\x25\xbf\x17\xb5\x01\x50\xe5\x6b\xa9\xf2\x11\x6b\x64\xfe\xf5\x27\x4c\xf8\x92\x4a\xb6\x59\xac\xbd\xa4\xd6\x0b\x92\x4a\x54\x45\x2f\xff\x8d\xcb\x33\x3a\x41\xaf\x44\xa1\xd5\x2c\xc2\x00\x80\xd3\xfc\x54\x49\xbb\xc4\xce\x8c\x48\xa7\xe0\xe1\xd1\x75\x0e\xb9\xc2\x52\xd7\x49\x38\xc3\xb5\x07\xf8\x8f\x51\xc6\xb1\x13\x69\x32\x69\x0f\xd2\xb8\x4c\xab\x23\x61\x22\x90\x2f\x17\xf6\xf0\xd8\x1e\x57\x12\xcf\xe2\x39\x57\x39\xfc\x99\x65\xba\xce\xa9\xbf\xd2\x86\xf4\x66\x4c\x86\xc3\x0c\x2c\x38\x86\x9c\x44\xe3\xaa\xfb\x64\x50\xd3\xea\x32\x49\x85\xf5\x5a\x7b\xa3\xe4\xcf\x8d\x60\xbc\xd4\x4e\x10\x77\x49\x20\x3a\x23\x52\xf2\x05\x9c\x85\xd0\xd5\x17\xbe\x5c\x83\x6a\x6c\xcd\x88\xbd\x16\x4e\xe9\x6a\x61\x02\x46\xec\x45\x8a\x1b\x30\x72\x7d\xb9\xc0\x82\x66\xfa\x08\x7b\x5f\x0b\xa3\x9b\x3a\x13\xaf\x31\xc6\x59\xfa\x7c\xba\xe5\x97\x71\xb3\x62\xf9\xb5\x50\xe8\x53\x72\x43\x03\x61\xdc\xa6\x86\x39\xc8\xe6\x22\x6f\xe0\x54\xb9\x5a\xb0\xa9\x44\x66\x18\x38\xda\xe5\x6c\x2e\x8c\xf5\xb6\xd1\x01\xe4\xa8\xb5\x24\x7b\xbe\x03\xb0\x7c\xa3\x64\xf6\xd6\x0b\x5b\x72\xc0\x2d\x87\x2d\xcb\xad\xaf\xd7\x42\x6d\xd0\x34\xa5\xdf\xcb\xdd\x91\x36\x13\xf6\xc2\x3d\x0a\xd7\x53\xc4\xb8\x21\x3b\x83\x0b\x31\x66\x72\x23\xb3\x29\x37\x73\xe0\xa3\xe9\x4e\x01\x91\x59\x64\x4d\xed\x04\x06\x62\xcc\xf3\x3c\x77\xd2\xb5\x66\x35\x52\xce\xaf\xf2\x3b\xf6\xac\xcf\x71\x9d\x1d\x47\xe7\xdd\x63\x39\xc4\x0e\x43\xbd\x85\x1b\xf8\xac\x23\x09\x70\x26\xdd\x81\xe5\x71\xdd\x9c\xc2\x1d\x02\xfe\x4e\x2a\x7c\xba\x23\x69\xfd\xf0\xfe\x5a\x61\xf9\x3e\x27\x20\xaf\x67\xfd\x1d\x77\xbb\x87\xf5\xac\xc1\x8d\x4e\x52\xb8\x45\xa4\x9f\x74\xf2\xee\x41\x99\x72\xb6\xea\xd1\xcb\xe3\xb8\xd0\x2f\xae\x60\xf2\x65\x92\x13\xf6\x7d\xdf\x30\x4b\x37\xce\xe2\x04\x7a\x1b\xbc\x69\xf9\x64\x9c\xd0\x28\x6e\xbc\x49\x10\x9e\xe6\x35\x5f\xa9\xaa\xc6\xd2\x49\x18\x01\x74\x65\x73\xae\x66\xe0\x26\xd1\x8d\x6b\xef\xf7\xbf\x87\x1e\xd5\x22\x6f\x32\x22\xe3\xf1\xab\xf6\xf7\x3e\xe8\x40\x70\x7a\x20\xae\x4c\xc6\x2b\xdf\xe7\xf8\xb5\xcc\x42\x59\xfe\xee\x19\x93\x13\x31\x61\x3b\xbf\x8f\xbe\xda\xc1\xa7\x57\xb5\x76\x8f\xa0\x02\x23\xe8\x55\x21\x2d\x24\xfa\xec\xc4\x77\x4f\xd8\x89\x7b\x06\x04\x62\xc3\x00\x46\x35\x30\x57\xed\xf0\x8d\x58\x2d\x66\xbc\xce\x0b\x72\x18\xde\x46\x85\x53\x61\xc0\xc4\x3b\x69\xac\x21\x6f\x41\x0f\xe1\x64\xb9\xb9\x76\xa2\xc8\x6d\xae\x71\xce\x2d\x1f\x47\xbb\xfa\x00\x4d\xad\x31\xa1\x84\x8f\x39\xad\xae\x56\x6a\x1d\xfc\x8e\xea\x8f\xc7\x3c\xdc\x25\x9d\x52\x0e\x78\xdd\xeb\xab\x3a\x8f\xcd\x4b\xdc\x03\x2c\x3e\xdd\xc0\x27\x2d\x83\x04\x8c\x01\xf0\x2f\xb5\x2a\x53\x90\xa3\x84\x87\x7e\xc7\x96\x3e\x39\xbb\x7c\xfd\xf7\xf3\x57\xa7\x67\x97\xdb\x9d\xbd\xdd\xd9\xdb\x9d\xdd\x63\x67\x0b\x75\xd3\x7b\x57\x7b\xeb\x69\x55\xde\x42\x17\xf2\x35\x2a\xc1\xfb\x8c\xb2\x43\x4f\xd4\xcd\xf7\xdc\x29\xd3\xe4\xd7\xa6\xa0\xeb\x8a\x34\x0e\xba\x01\x55\xf7\xa3\x47\x9f\x1e\xba\xc1\xe4\xce\x01\x93\xe6\x62\xc7\xca\xaa\x59\x8b\xd9\x43\x8f\xfe\x71\x7a\x7c\x72\x76\x79\xfa\xfc\xf4\xe4\xf5\x46\xb3\x9d\x7a\x82\xa1\xa6\xe7\xf2\x9a\xa7\x64\x55\x8b\x1b\xa9\x1b\x53\x2c\x02\x6a\xfb\x6a\x21\xb0\x9c\x30\xab\x72\xf0\x78\x78\x60\xfa\x95\x3f\xdb\x1e\xb6\xc3\x1e\xb6\x69\xf2\x57\x0f\x1c\xac\xa1\x96\xef\xf3\x5a\x97\x03\x2d\xe1\x0b\xf4\xc5\xf8\x60\xdb\xaa\xf5\xb4\x4b\x90\x39\xc9\xd1\x43\xca\x63\x8b\xcf\xe3\xf4\xd1\xb2\xb2\x3d\x68\x74\x06\x01\xd9\x1e\x06\x8f\x1a\x13\xce\x5e\xf2\xea\x3b\xb1\x78\x2d\x7a\xc2\x6d\xa5\xe3\x2d\x0a\x91\xb9\x83\x8e\x5d\x8b\x05\x66\x17\x1f\xf9\x87\xf5\x03\x8d\x7e\x80\x18\xe5\xd7\xa2\x0f\x7e\xfc\x90\xe0\xe2\xd7\xa2\x47\xe6\xb4\xbf\x96\x00\xb0\xdd\x14\x82\x9e\xe6\xe6\xf4\x41\x41\x7e\x7f\x04\x30\xf5\xcf\x37\x8e\x92\x5e\x03\xce\x82\x0f\xdf\x0e\x3c\x13\x18\x49\x5f\x24\x67\x57\x10\x22\x0c\x6b\x9a\x61\x6d\xfa\xd0\x03\x29\x19\x03\x0d\x4d\x5f\x1e\x4e\x86\x53\x38\xac\x5c\xdd\x6d\x05\x2b\xe6\x5c\x04\x40\xc7\xfc\x99\xc7\x00\x31\x81\x3c\x13\xe8\xa8\x47\xe9\x9f\x94\xd6\xf2\xcf\xf0\x61\xc1\xaf\x44\x61\x7e\xdc\xdd\xfd\xea\xbb\x93\xbf\xff\x75\x77\xf7\xa7\x7f\xc6\xdf\xc2\x51\x88\xe1\xed\xf4\x16\x00\x34\x51\x3a\x17\x67\xf0\x0c\xf8\x93\xd4\xb5\x43\x0c\xa1\xd0\x17\x80\x47\x30\xc1\xd4\xbb\xf0\x67\xa5\xf3\xee\x5f\xa6\x17\xf2\xe6\x83\x3c\x18\x60\x8a\x7a\x94\xc7\xe1\x35\xdc\xf1\xd0\xca\x92\x81\xb7\x2a\xb5\x1a\xf8\xa4\xb2\xb9\x28\x11\xfb\xef\xb9\x1f\x02\x20\xf8\xf6\xc0\x27\x0a\xd0\x22\x9c\x66\x9a\xc2\xb0\xee\xdc\x3c\xdd\x79\x50\x07\x4c\x98\xc1\x81\x07\x0c\x46\x84\x46\x0b\x37\x72\x38\x60\x43\x9a\x4b\x20\xa0\x3d\x3c\x3f\x65\x37\x38\xc2\x0f\x66\x70\x7c\x78\xf3\xf9\x47\x95\x71\x21\x88\xda\xad\x4a\x7f\x86\x69\x65\xfe\x7b\x42\x08\x31\x01\x2a\x52\x38\xc3\x66\x0f\x3f\x9c\x64\x55\x33\xa2\x1b\x26\xa5\x28\x75\xbd\x08\x7f\x86\xca\xe4\xb1\xb1\xba\xe6\x33\x28\x0c\xc3\x9f\xe3\xcf\xc2\x5f\xf8\xc3\xe4\x01\xcb\xbf\x46\x53\xb8\x8d\xa5\x92\x44\x5e\x13\xe9\xa6\xbd\x1e\xa0\x6c\xf3\x43\xff\x40\x44\x5b\xd6\x17\xaf\x2c\xbd\xd2\x05\x19\x3c\x71\xa8\x70\x86\x51\x04\x7b\x92\x2a\xe6\x47\x6d\x16\x1b\x78\x03\xd4\x8d\xb3\x2c\xd7\x46\x9a\x6c\xaf\x01\xa5\x59\x2e\x6f\xa4\xd1\x3d\xca\xdf\x42\x43\x77\x67\x3c\x12\x68\x0f\x66\x71\x05\xb7\xd9\xbb\x0a\xc0\xf5\xc2\x7e\xed\x88\xfd\xa7\x7d\x58\xfc\xf0\xaa\xb8\xb5\xa2\x56\xcf\xd8\xff\xec\xbd\xfd\xe3\x2f\xe3\xfd\xaf\xf7\xf6\x7e\x7c\x32\xfe\xaf\x9f\xfe\xb8\xf7\x76\x02\xff\xf8\xc3\xfe\xd7\xfb\xbf\xf8\x3f\xfe\xb8\xbf\xbf\xb7\xf7\xe3\x77\x2f\xbf\xb9\x3c\x3f\xf9\x49\xee\xff\xf2\xa3\x6a\xca\x6b\xfc\xeb\x97\xbd\x1f\xc5\xc9\x4f\x1f\xd8\xc8\xfe\xfe\xd7\xbf\xef\xdd\xf5\x01\xb0\xae\xf1\x1a\x12\xf1\x3a\x6d\x71\x90\xe5\xf7\x11\x69\x5e\xf0\xf2\xcb\x6b\xe8\xfd\xff\xda\x4b\xcd\x28\xab\xc7\x1f\xd7\x0f\x66\x83\x63\x5a\xe8\xa7\xf0\xe4\xe0\x93\xd2\x82\xb1\x60\x5a\x7c\x6e\xe7\xdc\x6f\xc1\xb9\x13\x68\x60\x61\x5e\x5b\x4d\x74\x5a\xeb\xd2\xc3\x52\x40\x78\x03\x0b\x28\xe9\xbe\x6b\xd1\x8b\x4c\x1c\xaf\xad\x33\x68\xeb\x0c\xba\xe3\xfa\x55\x67\x10\x16\x11\x3c\x5c\x4f\x90\x50\x37\xeb\x86\x30\x56\x46\xd0\xbd\xad\x13\x83\x3f\x7e\x58\x40\x6d\xe2\xb7\x7a\xcb\x9f\xdc\x26\xd3\xe0\x81\x56\xae\x8e\x61\xb2\xc3\xa2\x60\x52\xe1\xc6\x87\x06\x42\x2d\x96\x40\xd3\xc6\x17\x11\xdf\xb8\x2e\x84\xaa\xab\x04\x3c\x19\x72\x8b\xa5\x9a\x51\x61\x14\x1e\x25\x14\x7d\x92\xaa\x85\x9d\x0e\xca\x61\xcb\x55\xc0\x8d\xd1\x19\x90\x82\x61\xa5\x55\xc0\xa4\xa4\x6e\x43\x6f\x2c\xbf\x86\x68\x63\x26\x72\xa1\x32\x41\x3c\x06\x09\x57\x34\x57\xec\x44\xdd\x78\x2e\x87\xbc\xc1\x64\x10\x14\x7f\xab\xdb\xf8\xbc\x12\x10\xdc\x42\xa4\x20\x58\x94\x87\x00\x52\x3f\x58\xd8\x1c\x52\x31\xf4\xb4\xf5\xb2\xae\x47\x27\xdb\xfb\x14\xef\x7f\x66\x86\xc8\x56\x2f\x65\x68\xe9\xb0\x6c\xdd\xcf\xe9\x21\xf9\x39\x04\x03\xfb\x1f\x9f\xbf\xb9\xa3\x73\xa0\x63\x73\x98\x23\xf3\x1e\xb1\x93\x21\x8f\xc9\x21\x82\x25\x55\x2d\xa6\xf2\xdd\x40\xfb\xf4\x30\xaa\x27\x94\xb9\x50\x56\x4e\x25\x32\x66\x57\xb5\xa8\x84\x02\x57\x2b\x94\x68\x38\xd9\x4f\x27\x65\x1b\x9c\x7e\x88\xc9\x3c\xa8\x70\x0f\x2b\xca\x2e\x56\x29\xfb\x5b\x39\xc6\xb6\x72\x6c\xed\xeb\x13\xc9\x31\x5a\xb9\x0f\x47\x88\x41\xe6\x79\xff\xec\xf7\xa3\x34\x95\x9d\x58\xdc\xfb\x96\x10\x77\x0a\xf4\x83\x68\xb4\x1a\x93\xd7\xb0\x8e\xad\x66\x58\xb3\x8f\x7a\x13\x2b\xb9\xe2\x33\xa4\xa2\xb0\x3a\x80\x57\xe9\x3a\xd0\x89\x75\xf3\xee\x41\x8f\xf7\x25\x5e\xf0\x65\xad\x8b\x42\xd4\x86\x15\xf2\x5a\xb0\x63\x51\x15\x7a\x51\x52\xee\x6b\xce\x2e\x2c\xb7\x6e\x55\x5f\x08\xbb\x5e\xd8\xb7\x1f\xaa\x8d\xaf\x42\x1f\x08\xfb\x1f\xcb\xda\xa1\x28\x9c\x55\x54\x41\xf9\x4a\x81\xd0\x38\x04\x66\xa3\x11\x3b\x13\x37\xa2\x1e\xb1\xd3\xe9\x99\xb6\xe7\xa8\x7d\xa7\x09\x77\x78\x23\x93\x53\xf6\xcc\xd9\x75\xc6\x32\x8b\xec\x32\x51\x81\xba\xae\x93\x06\x5a\xdc\xc2\x21\xea\xf3\x96\x6b\xcf\xa1\xa5\x50\x79\xbe\x56\x24\xa3\xd7\x34\x05\xfa\xae\xde\x13\x74\x88\xf5\xa4\x2d\x94\x75\xb4\xbe\x11\x57\xc1\x23\xf1\x81\x15\x28\x15\xab\x85\xa9\xb4\x32\x22\x85\x19\x0d\x3d\x42\x6b\x77\x58\x0c\xe3\xb5\x0f\xcf\xbe\xc7\x66\xa5\x8d\x85\x12\xda\x61\x48\xe1\xce\x7d\x73\x50\x91\xcc\x8b\x42\xe4\x09\x2b\x20\xb2\x59\xf1\xd4\x43\x40\x68\x28\x81\xdf\x06\x0b\x95\x93\x1a\xe7\xe4\xfe\xc0\x30\xe9\x39\x9c\x3c\xbd\xf8\x5d\x95\xcd\xed\xc6\x84\x73\x24\x5a\x00\x4b\x80\xe7\x00\x83\x6f\x22\x22\xa8\xb9\xd6\xd7\x2c\xd3\x65\x55\xc0\xd6\xe9\xb1\xb3\x5a\x1e\xba\xb0\x94\xc6\xae\x75\x73\x10\x51\xd4\xc1\x07\xfd\x18\xea\x7a\x29\x62\x43\xa8\x61\xe2\x9d\xc8\x06\xe3\xb0\x3d\x79\x27\xb2\x88\x84\x19\x20\xd9\x32\x8f\x10\xe1\x76\x6c\x7f\x6e\xfd\xde\x21\x87\xa1\xdc\xfc\x3d\x6a\xe9\xe2\xab\x83\x62\x09\x6d\x7a\xb4\x7f\x7a\x04\x10\xa7\x80\x2d\x84\xf5\x75\x31\x8c\x46\x58\x8c\xb8\xf5\x96\xa0\x2f\x43\x22\xb5\x6f\x0b\x28\xd2\xb4\xb6\x6c\x6f\xf7\x60\x77\x7f\xc9\xff\xd8\x81\x8c\xbf\x8c\x7e\x29\x01\xea\xb4\x02\xdc\x50\x91\xed\xe6\x23\x26\xad\xcf\xb4\x46\xb8\x27\xe8\x15\x15\xfd\x8d\x98\xd1\xcc\xd6\x3c\x97\xa4\xc6\xc0\xa7\xee\x26\x5b\x37\x24\xe5\xf7\x76\x7f\xd9\x25\x6a\xaf\x5b\xad\x76\x2d\x74\x7f\xc2\x2e\x11\x27\x26\x34\xb4\xd0\x0d\xe0\x42\xe1\x10\x54\x85\xcc\xa4\x2d\x16\x20\xb1\x98\x6e\x10\x93\xca\x9d\x17\x54\x6c\x78\xf2\x4e\x5a\x4f\xae\xa3\xa7\xec\x09\xb2\xeb\x21\x86\x13\x37\xc0\xb0\x7e\x30\x17\xbc\xb0\x73\x4c\x12\x51\x5a\x8d\x91\x20\xd5\x89\x12\xfa\xa6\x6f\xbc\xa4\x9f\x3b\x31\xbe\x7a\xb8\x16\x97\x3b\xd4\xd3\x72\x70\x42\xf4\x9b\xf5\x59\xdb\xd9\x12\x7a\xdd\xe5\xe5\xf9\x37\x09\x6f\x3b\x48\x71\x6b\x2b\x9f\xba\x03\xde\x00\x51\x4f\x75\x5d\x3e\x00\xd9\x31\x4c\xb0\xb2\x17\x81\x3b\x1b\x50\x84\xf5\x25\x72\x67\xab\xd1\x08\x3f\x9c\xc1\x9d\xfd\x5d\x37\x00\x06\xc2\xaf\x8a\x45\x40\x62\x30\xc2\xb2\x1d\xd7\xd4\x8e\x13\x4f\x6e\x35\x7c\x2b\x78\x8e\x40\x19\xc6\x0a\xbe\x96\xea\x16\x5f\x83\x05\xd1\xa2\xbe\x0d\x7b\x0e\x34\xc6\xea\x92\xcd\xe9\xb5\xd3\xd2\x4b\xda\x19\x13\xd8\x3d\xbe\xae\xa9\x16\x15\x4a\x38\xfa\xcd\x67\x27\xbf\x96\xe4\x06\x8e\x7b\x42\xe2\x91\xc5\xc3\x16\x73\x44\x49\x85\x83\x85\xb8\x33\x03\xc9\xd2\x01\x92\x1f\xd8\x80\x09\x10\xac\x5f\x21\x67\xb7\x21\x08\xea\xf5\xcf\xf5\x1a\x2c\xa7\x82\x0d\x96\x37\xc0\x56\x39\x59\x69\xcd\xa0\xf7\x05\xfd\x39\xe0\x8e\xf1\x31\xd4\x8c\x2b\xad\x64\xc6\x0b\xf9\x6f\x91\x23\x43\x3e\xe6\xcf\x81\x9e\x93\x71\x23\xc6\x10\xd4\x55\x44\xec\x19\x55\x2b\xba\xed\x68\xb5\x06\xe5\x23\x20\x9f\xe1\xf3\xfa\x67\x65\xb0\x61\x73\x02\x58\xff\x82\xd4\xf8\x7a\xff\x30\x0f\xb3\xc4\xd8\x90\x23\x50\x0d\x90\x40\xbe\x9c\x3e\x8e\x60\x55\x50\xe0\x89\x22\x1c\x84\x11\xc2\x6b\x3e\x98\xb3\xcc\xe9\x24\x83\xbe\x3a\xba\xe3\x6b\xa6\x02\xf7\xbc\xc7\x12\x5e\x1e\x90\x28\xff\x81\xa8\xea\xbd\xd3\xd8\x1f\x7a\x5c\xcd\x04\x7b\xea\x7e\xf9\xe7\x3f\xfd\xe9\xcb\x3f\x4d\xb0\xf9\x90\x0b\xa1\xd8\xe9\xe1\xd9\xe1\x3f\x2e\xbe\x3f\x82\x12\xdc\xbe\xa3\x3a\x50\xa2\xe7\xd0\x69\x9e\x83\x26\x79\x7e\xd4\x14\x4f\x28\x2c\xe9\x2d\x45\xd2\x08\x03\x34\x19\xa3\x88\x92\x86\x19\xa1\xf9\x21\xd2\x6d\xec\xae\x75\x5b\xed\x41\xec\x31\x9b\x55\x17\x3a\xbb\x1e\xd0\x7a\x3a\x16\x55\x2d\x32\xf4\xc6\x5d\x1e\x9d\x63\xeb\xce\x8a\x3d\x7b\x75\xd9\x16\x34\x40\xd6\x4f\x0b\xd9\xf7\x2d\xf9\xeb\x9c\xe5\x7b\x2d\x2a\x1b\x1c\x04\x57\x3c\xbb\xbe\xe5\x75\x0e\xfe\x33\x6e\x25\x00\x14\x23\xc2\x60\x2d\x88\x2c\x0e\xd3\x0a\x11\x4a\xcd\x93\x71\xa3\x2c\x47\x37\x85\x77\xba\x82\x63\x0c\x8f\xc0\x29\x97\x05\xf8\x69\x89\x07\x1b\xf3\x8e\xb2\x2a\x38\x0e\x63\xcf\xf9\xd6\xc4\xf3\xd7\x83\x35\xf1\x22\x9e\xee\xfb\x5a\x7b\x7d\xb3\x1f\x1f\xf0\x51\x47\x47\x5c\x9d\x50\xe6\x6f\x8f\xba\x01\xda\x7b\xb8\x47\x5d\x55\x8b\x0b\xab\xd7\xe2\xdd\x60\xcb\xb1\x18\x6c\xec\x8e\x48\xcc\x95\x98\x6a\x27\x84\xef\x0c\xad\xe4\x0d\x6c\x42\xae\xa0\x04\xd1\xfb\xce\x74\x12\x3e\xc1\xbc\xcf\x80\x92\x4f\xf0\xac\x07\x26\xc6\x64\xf5\x8c\xe3\x23\xf7\x76\xa2\x84\xde\x8d\xda\x5a\x0a\xe2\x3b\x87\x0f\x85\xcd\xd0\x3f\x1c\x09\x72\xc0\x27\xa5\xee\x77\x83\x35\x59\xcd\xcd\x1c\xb9\xc0\xc5\x3b\x69\x09\xfd\xf5\x5c\xe7\x5d\x06\xff\x59\xcd\x33\xc1\x2a\x51\x4b\xed\x0e\xa3\x46\xd9\x5c\xdf\x2a\x76\x25\x66\x52\x19\x3f\x14\x00\xd1\x4e\x63\x06\x51\x1f\x69\x02\xfc\xdc\x84\xbd\x4e\x20\x55\xa8\xd8\x29\xd3\xed\xd6\xa4\x3e\x77\xe3\x55\x70\x62\xc1\x38\x21\xac\x7e\x18\xe1\x98\x33\xec\xd7\xba\xbc\xd7\x28\x78\x72\x2e\x0a\xbe\xc0\x9c\xd6\xa9\x54\x60\x39\xd6\x66\x7f\x80\xb8\x16\xb2\xde\xf9\xef\xee\xec\x87\x34\xac\x16\x3c\x9b\xf7\x0b\x31\x6f\x03\x61\x1f\x78\x6d\x03\x61\x7d\x1a\xd9\x06\xc2\xb6\x81\xb0\x5f\xb9\xb6\x81\xb0\x6d\x20\xac\x73\x3d\x58\x2b\x69\x1b\x08\x5b\xfb\xda\x06\xc2\xde\x7f\x6d\x03\x61\x1f\x70\x6d\x03\x61\x1f\x78\x6d\x03\x61\x77\x5f\xdb\x40\x58\xbf\xce\x6c\x03\x61\xdb\x40\x18\x5d\xbf\x3d\xef\xa0\xbf\xb6\x81\xb0\xa5\x46\xb6\x81\xb0\x6d\x20\xec\x83\xaf\x07\x6b\xe2\x6d\x03\x61\x78\x6d\x03\x61\xe9\xf5\xdb\x3a\xea\x7c\x18\xe9\xdc\x19\x94\xfd\xeb\xf3\xce\x21\x74\x21\x33\x8a\x46\xe9\x69\x52\xd3\x85\x8f\x9a\xb4\x7c\x1b\x11\xc4\x89\x2f\x2b\xa2\xb8\x53\x1b\xcd\x5a\x59\xfb\xd5\x93\x13\xaf\xd2\x79\x1b\x0e\x89\xe2\x20\x68\x56\xaf\x5f\x7f\xb7\xb1\xca\xb2\x3e\xc1\x8f\x4f\x13\xf8\x78\x20\x51\xa2\x01\x82\x1d\xdb\x40\xc7\x67\x17\xe8\x18\xc6\x49\x38\x80\x83\xb0\xf7\x51\x41\xf1\xff\xcb\x79\x2d\xcc\x5c\x17\x6b\x2f\xf4\x64\x91\xbf\x94\x4a\x96\x4d\x09\xac\xb7\x6e\x3d\xcb\x9b\x90\x68\x60\x5a\x5a\x7d\x90\xd8\xe8\xab\x8c\xe8\x71\x3d\x2d\x2e\xd4\xa2\x12\xcd\xbd\x69\xb2\x4c\x08\xa0\x85\x8b\x2d\x9c\x2f\x27\xe1\x49\x81\x06\xe4\x69\x3f\x79\xd3\xef\x10\x47\x68\x55\x68\xe5\xcb\x2f\xd6\x6a\x63\x56\x57\xc3\xc8\xe5\x6f\x5e\x9f\x1f\x45\x72\x99\x2b\x2f\x96\xa5\xba\xd1\x05\x8c\x2a\xc7\x9b\x9c\xb2\xb6\x41\x21\xdd\xdf\xec\xe8\x65\x72\x0c\x71\x46\xf4\xd5\xaa\x53\xbf\x99\xd3\x9d\x53\xcf\xd1\x0c\xe6\x12\x11\xfc\x3f\x58\x77\xee\x2d\xdd\xfa\xeb\xb3\xfd\xb7\x03\x03\x88\x1d\x78\xf1\xc1\x06\x78\xe7\x82\xa8\xab\xe8\x08\x8e\x0d\x17\xcf\x6a\x65\x35\xab\x0a\xde\xf2\x52\xc1\x0c\x7c\x0b\xe7\xc6\xd1\x5c\x64\xd7\xaf\x29\x46\xbb\x67\x84\x08\xfa\xe4\x4c\xda\x79\x73\x35\xc9\x74\x79\xe0\xb6\x31\xfe\xdf\x55\xa1\xaf\x0e\x4a\x6e\xac\xa8\x9d\x8a\x49\xc7\xd2\x38\x73\xad\x48\x35\x9b\x94\xf9\xfe\x84\xbd\x55\x58\x5d\xdf\xf2\x60\x46\xd8\x12\xee\xf9\x1e\xe7\xe3\x4a\x38\x89\xa8\xc1\x77\x10\x41\xe8\xb9\xee\x4d\xfa\x00\x35\xf7\x3e\x46\x7a\xc6\xc7\x3f\x7d\x6c\x7c\x2b\xb9\xd8\x00\x4e\x92\xc7\x16\x03\x1f\x2c\x17\x64\x80\xd8\xf7\x03\x8a\x7b\x3f\x18\x75\xf6\xa1\xc4\xba\x1f\x20\xda\xf5\x00\xf1\xed\x21\x62\xdb\xc3\xc5\xb5\x3f\x02\x28\xf4\x63\x8e\x67\x0f\xe8\xf4\x1b\x28\x8e\xfd\x29\x62\xd8\x83\xbc\x75\xdf\xd8\xf5\xa7\x8b\x5b\x0f\xf3\xba\x43\x9a\x1b\x8f\x35\x56\x3d\x80\xf3\x7e\x48\xc7\xfd\x60\x4e\xfb\x8f\x16\x9b\xee\x1f\x97\x7e\x00\x31\xe9\xde\x83\x2c\x95\xb4\x92\x17\xc7\xa2\xe0\x8b\x0b\x91\x69\x95\xaf\x7d\x8e\x75\xb0\x48\xc3\xfe\x31\xd8\x2c\x79\xb0\xd2\x42\x8f\x39\x27\xc8\x75\x67\xb7\x61\x61\x8b\x8f\x72\x90\xda\x02\xf1\x66\xec\xe5\x83\x8c\x5b\xb0\x07\xe3\x2a\xc3\xaa\x97\x21\x27\xf1\x5b\x7d\xcb\xf4\xd4\x0a\xc5\xf6\xa4\xf2\xf3\xb8\x1f\x19\x9b\xad\xdf\x32\x2c\x6b\xf7\xed\xd3\x27\xfe\xe6\xcf\xcf\x21\x09\xae\x57\x63\x3e\xbe\x7f\x98\x1e\xf4\xeb\x0e\x62\xba\x71\xda\x14\xa9\x93\x18\x1d\xc7\xa9\xbc\x79\xda\x82\x46\x3f\x85\x76\xc3\x6e\xe3\x2a\x67\x54\x09\xf7\xf9\x4d\x5a\xef\x8c\x9b\x54\xf5\x0b\x19\x36\xbf\xe6\x4f\xbe\x3c\x3a\xdf\xba\x93\x1f\x96\x53\x66\x43\x59\x2b\x0f\x50\xd1\x7d\xa4\x99\x2a\x5b\x45\xf7\x1e\x57\x54\x1b\xfb\x4d\xcd\x33\x71\x3e\xb8\x8e\xe0\xb7\x13\xcb\x9b\x9a\x93\x00\x0c\x2a\x9f\xdf\x3c\x4a\x88\x1c\x77\x53\xa8\x27\x86\x4a\xdd\x69\x53\x14\x0b\xf4\x39\x24\xd5\xd7\x18\x85\xef\x16\xf3\x82\xe3\x7f\xc5\x53\x5a\xc5\xb2\xaa\x35\x9d\x99\x75\xa3\x94\x93\xc1\x2d\xf3\x1b\x28\x92\x00\x46\xcd\x93\x92\x61\x23\x67\xae\xfb\xee\xfc\x83\x6a\xe2\x36\x35\x31\x69\xd0\xfd\x7a\xaa\xeb\x4c\x5e\x15\x0b\x36\xe7\x45\xa0\xf9\xe1\xec\x5a\x16\x05\x35\x33\x61\x17\xc2\x62\xe0\x02\xcf\xce\x42\xab\x19\x74\x8e\x2b\x4f\x2f\x29\x32\xf7\xdb\xac\x10\x5c\x35\x15\x3e\xcf\x9d\xc4\x0b\xdd\xd4\xfe\x79\x93\x10\xfe\x08\x27\xb0\x92\xc5\x28\x22\xb1\x7b\xef\xc4\xb6\x2e\x1a\xe3\x14\x80\x57\x1e\x7c\x7b\x14\xb7\xe9\xf1\xd1\x4d\x44\x61\x54\xd5\xfa\x46\xe6\x18\x43\xf1\xc3\x06\x74\xd9\x48\x53\x14\xf6\xb3\xd2\x6a\xac\xc4\x8c\x83\xa2\x42\xbb\x08\xe7\x0c\xdb\xc1\xdc\x02\x95\x03\x71\x91\xd3\xf0\x75\x95\x94\xf3\xdf\x48\xa4\x5c\x8e\x46\x8e\xed\x29\xcd\x34\x64\xaa\x36\x4a\x5a\xa4\xf1\x9f\x37\x96\xe5\xfa\x56\xed\x93\xcf\x4a\x1a\xc6\xd9\x95\xb0\x3c\xca\x35\xa5\x03\xce\x30\xa1\xf8\x55\xe1\xe6\x1c\x52\xb1\x2e\x57\x0e\x10\x9b\x0a\x6e\x9b\x5a\xb0\x19\xb7\x62\xa5\x9e\x83\xef\xfb\xfe\xe1\x95\x86\x1c\xac\x53\xd6\x28\x23\x7a\x1e\xef\x83\x29\x47\x7f\xfe\x8f\xf5\x64\x84\x2c\x85\x6e\xec\x27\xb1\xfe\x6e\xe7\x32\x9b\xc7\xca\xac\x2c\x85\x61\xba\xe9\x98\xc5\x4f\xe9\x67\xab\x67\x68\x6b\x02\xae\xba\xd6\x75\x1f\xaf\xf0\x7e\x75\xe1\x18\x5a\x7e\x6f\xc8\x20\x3f\x3e\xbb\xf8\xc7\x8b\xc3\xbf\x9d\xbc\x98\xb0\x13\x9e\xcd\x63\x4c\x0e\xc5\x38\x08\x0d\x10\x14\x73\x7e\x23\x18\x67\x8d\x92\x3f\x37\x14\x56\xde\x0b\xbf\xdd\x1f\x14\x91\x7e\xcd\xd3\xd7\x49\x9b\xb5\x56\xfc\x4a\xd2\x3b\x68\x8d\x32\xb6\xb4\x11\x40\x53\xb3\xa4\x3e\x85\x58\xf6\x02\x4d\x04\x50\xb8\x20\xb1\xfe\xf8\xd5\xc9\x05\x24\xec\x57\x35\x22\x95\x40\x86\x17\x7c\x0f\x2d\x5d\x09\xf7\x0b\xe2\x27\x9e\xb0\x43\xb5\xc0\x2f\x71\x4f\x49\xc3\x0a\x69\xac\x80\x53\x8f\xd4\x36\x1f\x25\xdf\x79\x32\x81\xff\xed\x30\x9e\xe7\xb5\xd3\xeb\x42\xe2\x5a\xb6\x94\x49\x8a\x9a\x9f\xbc\x2a\xa2\x17\x50\xc2\x62\x9e\xda\x4b\x9d\x53\xcf\xe1\x24\x81\x08\x19\x1e\x83\xc6\xd6\xdc\x8a\x99\xcc\x58\x29\xea\x99\x60\x15\xb7\xd9\x9c\x95\x7c\xc1\x32\x5d\xd7\x4d\x85\x6c\x06\x39\xb7\x7c\xc2\x9e\xeb\x9a\x95\x7e\x13\xbb\x35\xef\xce\xe1\x8b\xd5\x99\x03\xed\xce\x8e\xff\x29\x8d\x69\x84\x39\x78\xfa\xe4\x2f\x5f\xfc\xe9\x4f\x9f\x15\x01\x5e\x48\xed\x85\xbc\x97\x88\x00\x8f\xfb\x59\xc0\x59\x47\x42\x44\xa9\x66\x45\xbc\xbe\xd6\x3b\x00\xfa\x5a\x99\x7d\x6d\xcc\x71\xfb\x06\xe7\xeb\x9a\x9a\x83\x10\xf1\xb5\x7d\x18\x88\xbe\xaa\x3d\x07\xbd\x61\x45\xb2\x41\xc7\x8c\xc4\xa7\xe7\x7e\x63\x92\x9e\x53\x76\x68\x6c\xab\x36\x07\x6a\xc4\x9e\xb0\xaf\xd8\x3b\xf6\x15\x18\x5a\x7f\xee\x4b\xf6\xd5\xd7\x04\x1a\x22\xa5\xc9\xd9\xf7\xa7\xe7\x03\x8d\xf8\x0f\x4e\x68\xba\x16\xdd\xa8\x5a\xcd\xae\x24\x29\xf6\xe2\x9d\x15\xb5\x53\x34\x69\x26\x36\x4a\x93\xe6\x3a\xf8\x09\x97\x19\x06\x1e\x4e\xa7\x69\x1a\xd5\xfd\x16\x9a\xfb\xf9\xb7\xda\xd8\x33\x92\x42\x29\xe1\x4f\xdb\x5a\x09\x82\x3f\x11\x63\xee\xdc\x30\xb6\xdd\x60\x86\xe5\x1a\xb2\xba\x30\xc5\x79\x2e\x7b\x24\x6b\x3c\x9c\x65\xdc\x2f\x7e\x9f\xcc\xe7\xfb\x66\xaa\xe3\x4a\x01\x1b\x88\x54\xac\x08\xa3\xab\xd2\x39\x69\x67\xae\x5b\x79\x74\x66\xbc\x47\x3d\x23\xaf\x4d\xf0\x37\xc3\x5a\x72\xfb\x29\xe3\x0a\x8b\x4c\xa6\xa2\xae\x31\x2b\xfd\x6a\xe1\x93\x03\x7b\x4f\x5e\xaf\x9d\x54\xd5\xda\xea\x4c\xf7\x60\x72\x4b\xa3\xdd\xd4\x1c\x0c\x42\x85\x6b\x97\x46\xfe\xcd\xf1\xf9\x88\x5d\x1e\x9d\x03\xbb\xd5\xc5\xd1\xe5\x79\x6a\xb3\xec\x5c\x1e\x9d\xef\x6c\x74\x28\x98\x57\xf8\xc0\x45\xbd\x46\x23\x89\x0b\xca\x69\x93\xe3\x92\x57\xe3\x6b\xb1\x58\xf3\x4c\x1d\xe2\x5c\x1f\x87\x19\x1e\xe4\x85\x70\x98\x4b\x5e\xdd\xbb\xb5\x5a\xf0\x5c\x7e\xa2\x4a\x2f\x9f\x76\x1b\x9e\xb9\xba\xe4\xab\xd4\x37\x22\x47\x2d\xdd\xff\x42\xa8\xbc\xd2\xd2\xe9\x8b\xdb\x3a\xb0\xfb\xff\x7a\x5b\x07\xf6\xc1\xd7\xb6\x0e\x6c\x5b\x07\xb6\x7c\x3d\x98\xc4\xd9\x6d\x1d\xd8\xe7\x15\xc1\xdf\xd6\x81\xdd\xff\xda\x78\xe0\x7e\x5b\x07\xb6\xfa\xda\xd6\x81\x6d\xeb\xc0\x3e\xec\xda\xd6\x81\xdd\xff\x7a\x70\x29\x47\xdb\x3a\xb0\x7b\x5d\xdb\x3a\xb0\xe5\x6b\x5b\x07\x76\xc7\xb5\xad\x03\xbb\xe3\xda\xd6\x81\x2d\x5f\xdb\x3a\xb0\xfb\x5d\xdb\x3a\xb0\x6d\x1d\xd8\x67\x9d\x1e\xcb\xb6\x75\x60\x74\x6d\xeb\xc0\x3e\x8b\x24\x40\xb6\xad\x03\xfb\xa0\x6b\x5b\x07\xb6\xad\x03\x5b\xe7\xda\xd6\x81\x7d\x2e\x4e\x99\x6d\x1d\xd8\xb6\x0e\xec\xb7\xa3\xe8\x6e\xeb\xc0\xb6\x75\x60\xdb\x3a\xb0\x6d\x1d\xd8\x7b\x7b\xb1\xad\x03\xfb\x1c\x4c\xc0\x5a\x18\xf9\x6f\x71\xae\x0b\x99\x2d\x7a\x67\x29\xbe\x26\xe2\x63\x43\xcd\xb2\x0a\xda\x8d\x52\xab\x7a\x54\x9e\x3c\xb0\x82\x9b\xd7\xd1\xc0\xc5\x85\x37\x81\xfc\xf9\x23\x0c\xc1\x83\x28\xbe\xf1\x2f\x78\xb6\x7e\x24\x65\xec\x09\x08\x70\xf8\xd6\xf3\x5b\xf4\x36\x11\xe2\x17\x19\x28\x1f\x7c\x37\xae\x88\x0c\x2b\xc1\xea\x20\xc1\xe4\x9d\x0b\x84\x57\x55\x21\x85\x99\xb0\x8b\x40\xc0\x03\xd2\xcb\x3c\x63\x59\xd5\x8c\x58\x29\x4a\x5d\x2f\x7a\x58\x13\x03\x28\x9c\xc9\xac\x0d\x34\x64\xaf\xb1\x4d\x3f\x0c\xce\x88\xa8\xaa\x62\x81\xca\x54\x5b\x4a\x1a\x46\x4d\x7a\xe1\x92\x83\xba\xd3\xc9\xf2\x90\x36\x31\xc3\xce\xb4\x7d\x4d\x0b\x7e\x63\xb9\xf6\x77\x65\x95\x73\xab\x4b\x99\xad\x23\xb0\x51\xc6\xf6\xcf\x29\x3f\xd2\x65\xd5\x58\x91\x88\x6d\x1c\x2c\xd4\xe4\xa4\x89\x4d\xb8\xfe\xd9\xe0\x99\x56\x53\x39\x23\x55\xfc\x00\x19\xdd\xc7\xe1\x7d\xc6\x11\x8b\xfa\x23\x4c\x05\xcf\x0a\x2e\xd7\x8f\xdb\xa7\xa9\x55\x47\xd0\x16\x54\xe8\xb6\xc9\x55\x90\xa3\x1b\x46\x6b\x14\x12\x97\x24\x6e\x93\x89\xff\x0a\x7f\x3c\xc2\x4c\x5f\x67\x7f\x80\xd2\xb9\x62\x42\xdf\xaa\x56\x3d\x56\x8c\x17\xd5\xfc\xfd\x0a\xb2\xeb\xc8\xf1\x42\xf1\x52\x66\x7e\xc5\x1c\x16\x85\xce\xd0\x20\x4a\x55\x64\xdf\x36\xb6\xe7\x1e\x52\x96\x8d\xe5\x57\x85\x98\xb0\x53\xac\x10\xd2\xaa\x58\xb8\xd5\x64\x84\xf5\x81\x0f\x9a\xfe\xb5\x73\xb0\xfa\x27\x60\xf4\x4c\xbe\x58\xa9\x0d\xc1\x84\x60\x35\x94\x50\x6e\x97\x69\x25\x98\x50\xb6\x5e\xb8\xb9\x3b\xd7\xf9\x85\x9b\xbe\xe4\xee\xde\x45\x52\x3d\x73\x2e\x86\xc8\xb7\xe8\x99\x6b\x31\x4c\x86\x44\xff\xec\x88\xe5\x30\x6f\x54\xb7\x18\x27\x3e\x26\xb3\x5a\xe9\x7c\xb2\x62\x57\x7a\xd5\xe0\x5c\xe7\xee\x80\xab\x45\x4c\x85\x47\xf6\x21\x6c\x90\x92\x5f\x83\x89\xcd\x6d\x7b\xf2\xf1\x1b\x2e\x0b\xb7\x85\x56\xd4\xe3\xf7\x4b\x9c\x18\x40\x35\x18\xba\x18\x8c\xf5\x5d\x41\x43\x16\x73\x31\x60\xee\x2a\xe5\x7a\xe8\x0f\x6c\xe9\xe0\x7d\x01\x6d\x45\xe9\x58\x6e\x4d\x94\xfc\x1d\xd8\xac\xbc\xd4\x8d\xb2\x58\xe1\x85\xe7\x73\x10\xfa\x98\xb4\xf6\xe0\x4e\x5e\x36\x8c\xd8\xe1\xb9\x2f\x81\x39\x1f\x22\x9b\x9c\x5b\x2b\x6a\xf5\x8c\xfd\xcf\xde\xdb\x3f\xfe\x32\xde\xff\x7a\x6f\xef\xc7\x27\xe3\xff\xfa\xe9\x8f\x7b\x6f\x27\xf0\x8f\x3f\xec\x7f\xbd\xff\x8b\xff\xe3\x8f\xfb\xfb\x7b\x7b\x3f\x7e\xf7\xf2\x9b\xcb\xf3\x93\x9f\xe4\xfe\x2f\x3f\xaa\xa6\xbc\xc6\xbf\x7e\xd9\xfb\x51\x9c\xfc\xf4\x81\x8d\xec\xef\x7f\xfd\xfb\xb5\xbb\xdc\xdb\x47\x3d\x9c\x87\x7a\x20\xff\xf4\x47\xf1\x4e\x53\x1e\xe7\x40\x7b\x91\x72\xd0\x97\x76\x23\x79\x90\xde\xb7\x1b\xfd\x29\x09\x86\x48\x68\x47\x1a\xa6\x4b\x69\x9d\x01\xe7\xd4\x1a\x1e\x57\x9e\x75\xcc\x13\x92\x03\x50\x7b\xc9\xa1\x44\x2c\xaa\xda\x8a\xac\x1a\xed\x5d\xb1\x60\x1e\x29\x26\xcb\xaa\x10\xa5\x50\x16\xf6\xf3\xd8\x6b\x82\x60\x2f\x4e\xda\x9e\x64\xa8\xb1\x8b\x77\x99\x10\x39\x3d\x6c\x2b\x3a\x7e\xfd\xda\x8a\x8e\xcf\x51\x74\x18\x91\x35\xb5\xb4\x8b\x23\xad\xac\x78\xb7\x56\x44\x34\x95\x1c\x17\x69\x83\x64\x90\x51\x4e\x2b\x7d\xc7\x74\x85\x15\x9c\x1d\x88\xac\xb9\x6e\x8a\x1c\xca\xb2\x1b\x05\x01\x21\xc4\xdb\x10\x16\xa3\x35\xa0\x10\x82\xb6\xd8\x7d\x88\x8f\xbf\x60\x58\xe8\xe7\x46\xde\xf0\x42\x28\x1b\xfd\xe2\x1c\x22\x0e\xf1\x8f\x3e\x74\xcf\x5b\x6e\xae\xdb\x0d\x2f\xc6\x95\xce\xdb\xfd\x7d\xe0\x5f\x09\x3e\x12\xef\xec\x63\x34\xd2\x41\x7f\x3a\xaf\xe5\x8d\x2c\xc4\x4c\x9c\x98\x8c\x17\x20\xd7\x86\x39\x4a\x0e\xef\x68\x1d\x26\xbe\xd6\x85\x71\x3a\xbf\x13\xe5\x8c\xfb\x90\x1d\x58\xc2\x33\x2e\x15\x22\x5c\x55\xfe\xc7\x06\x63\x7f\xee\x74\xa8\x78\xed\x26\x38\xc4\xf8\xc0\xae\xbe\xd2\xba\xa0\xda\xe5\x62\xd1\xb6\x4f\x55\xfc\x4a\xff\x43\x89\xdb\x7f\xb8\xd6\x0c\x9b\x16\x7c\x16\x42\x7b\xce\xd8\xee\x46\xe7\xdb\xa6\xef\x7c\x01\x28\x0c\x6e\x04\xe3\xc5\x2d\x5f\x98\x36\xd0\x19\x61\xb9\x99\x67\xec\xe9\x3e\x2c\x67\x6e\x58\x68\x23\x67\x5f\xec\x43\xba\xde\xd1\xe1\xf9\x3f\x2e\xfe\x7e\xf1\x8f\xc3\xe3\x97\xa7\x67\xec\x4c\x5b\x81\x67\x5e\x64\xff\x64\xc1\xc1\xe4\x7a\x19\xfc\x7f\x13\x6d\x26\x60\x63\x41\xf6\xb9\xca\xf5\xad\x59\xdb\x0b\x8a\xcb\xcf\x0d\x9e\xe0\x6a\x3d\x37\x0f\xaf\x38\x30\x9c\xf7\x38\x61\x96\x32\xc2\xe3\x46\xe1\x88\xcf\xf3\x83\xbc\xd6\x15\x0e\x82\x0f\x4a\x47\x0e\x92\x24\xec\x15\x57\xb6\xc1\xfc\x4e\xd3\x06\x67\x35\x57\xb6\x8d\xce\xb6\x73\x46\xd4\xea\x93\xde\xd3\xb1\xb9\x83\x7f\x08\x2f\x01\xcf\x87\xc3\x25\x38\xcc\x73\x91\x27\xc3\xff\xd9\xd5\x13\x1d\xf9\x97\x8b\xc2\x5e\xec\xfc\xd5\xc5\xe9\xff\xd3\x59\xc7\x8b\xaa\x5f\x61\xc3\x30\x18\x37\xb5\xae\x06\x9b\xdd\xd7\x84\xa1\xb2\x9d\xdf\x07\x31\xbf\xe1\xb4\x1c\x26\x9d\xf6\x75\xa3\x52\x70\xd2\xb6\x7d\x56\xea\x5c\x4c\xd8\x79\xc8\xeb\x49\xbf\x8d\xa0\xca\x78\x2d\x98\xbb\x45\x59\xc9\x8b\x62\x11\xab\x68\x56\x23\x9e\x48\x82\xb2\x16\x0b\xf2\x29\x2f\xcc\xa6\xa5\x71\x9f\xb3\xd1\xe9\x11\x2f\x9d\xb9\x3c\xc8\x74\x84\xd6\x58\x2e\x94\xb6\xa4\x58\xbb\x5e\x02\x72\x5d\xad\x33\x86\xb6\x79\x54\x3c\x91\x9c\x6f\x06\x73\x8b\xfc\xd1\x28\x8d\x1f\xec\xf3\xd0\x32\x86\x65\x1b\x23\xba\x0a\x3a\x1d\x8d\xad\xb5\xee\x5a\xaf\x05\xcf\x21\x6a\x51\x71\x3b\xc7\xdc\xe7\x92\x9b\x6b\x91\xe3\x07\xa4\x9a\x85\xc0\x09\x38\x7a\xfd\xa3\x2e\x5d\xbf\x7d\x8c\x04\x54\x32\xcc\xc8\x86\xe8\x8a\xc8\x37\x3c\xeb\x3d\x36\xa1\x1b\x94\x57\xaa\x58\xbc\xd6\xda\x3e\x0f\x80\x38\x83\xac\x80\x1f\x48\x5b\x4e\x03\x57\xa0\x4e\x72\x78\xee\x18\x66\x03\x36\x55\x8c\xc5\x73\xdc\xce\xf8\x63\xdf\x52\x75\xa3\x0e\xcd\x37\xb5\x6e\xd6\x3e\xc4\x96\x94\xcd\x6f\x4e\x8f\x41\x14\x35\x94\x5a\xa8\x6c\xbd\x00\x10\xb0\x65\x24\xe7\x60\x18\xbc\xa1\xe4\xc8\x78\x4f\xb4\x79\x6c\xec\x25\x5f\x30\x5e\x18\xed\xc7\x92\xc2\x5a\x5d\x2b\x94\x4c\x5c\xf7\xf5\x95\xb6\xf3\x25\xdb\xd6\x6d\xa8\xe5\xdf\x8d\xa2\x4c\xc3\x36\x1f\x40\xaa\xa5\x9f\x5b\x88\x99\x54\xb5\xc8\x44\x2e\x54\xb6\xe9\x69\xdf\x74\x82\x1e\x2c\x9d\x33\xad\xdc\xc6\x1c\x64\xf1\x9c\x86\xcc\x4c\x1a\xd2\x78\xa9\x40\x50\x8c\xac\x3f\x0e\x99\x9e\xb0\x2d\x1b\x23\x6a\x4c\x4b\xad\x1b\x81\x33\xf9\x5d\x73\x25\x0a\x37\xf2\xce\x24\x05\x1c\x51\x6e\xd1\x9d\x21\x4b\x3e\x13\x8c\xdb\xb0\xd2\xac\x66\x42\x99\xa6\xa6\x49\x94\x96\xe5\x5a\xb4\x38\x5a\xdc\xb0\x37\xa7\xc7\xec\x09\xdb\x73\xcf\xda\x87\xf5\x33\xe5\xb2\x80\x24\x50\x48\x2a\xe9\xd8\xa8\x53\xdf\x04\x74\x09\x16\x2f\xd3\x35\x0a\x89\x11\x53\x9a\x99\x26\x9b\xfb\x3e\x39\xbb\xd7\x9b\xcd\x54\xb8\x04\x91\x97\x87\xb9\xd6\x37\x2b\xa1\xde\x18\x51\x0f\x26\xa0\xde\xac\x21\xa0\x62\x35\xca\xad\xb9\x74\xf4\x70\x61\x95\xc2\xf2\x9c\x5b\x4e\x82\xcb\xdf\xf0\x60\xa7\xf4\xb7\x2d\xbe\x8c\x78\x21\x55\xf3\x0e\x0b\x05\x86\x73\xb5\x5c\x9c\x40\xb3\x2c\xf3\xa3\x0e\xb3\x8e\xc9\x77\xb9\xf7\xa6\x44\x49\x32\xa7\xc9\x5a\x19\xdd\xa1\x26\x82\x9c\xe0\x98\x0c\x23\x9c\x72\xc2\x55\xae\xcb\xa5\x87\x39\x25\x52\x24\x1c\x08\x13\xb6\x5d\x7d\xe9\xf5\x40\x9c\x42\x85\xb8\x11\x3d\x50\x82\xbb\x9c\x0f\xae\x35\x37\x38\x7e\x45\x40\xf3\xac\xe0\x57\xa2\xa0\x44\x2d\x4c\xff\x5c\x5e\x81\x9b\xae\x1e\xab\x75\x31\x5c\xb9\xfb\x6b\x5d\x08\x2c\xc7\xf0\x03\xe1\x9a\x7f\x14\xe3\x00\x8d\x0c\x35\x0e\x60\x0d\x26\xe3\x00\x76\xed\x63\x18\x87\xa6\xc7\x51\xcf\xba\xe3\xe0\xf4\x86\x74\x1c\xe0\xf0\x7e\xe8\xe3\x60\x44\x96\xe9\xb2\x3a\xaf\xb5\x33\x3b\x07\x3b\x9b\xa8\xd9\x36\x66\x88\x8e\x8d\x15\xa9\x9b\x70\x16\xa4\x37\xf3\x3a\x2a\xc4\xe2\x16\x0f\x09\x5f\x8d\xf5\xff\x8b\xce\x2c\x10\x3d\xdd\x83\xcc\xb7\x92\x84\x17\xdd\x2f\xe9\x8b\xc7\x7c\x1c\x0c\x51\xcb\xdc\xc3\xd9\x39\xc8\x69\xa4\x33\x5e\x00\x0b\x44\xbf\x25\xc7\xba\xcb\xae\xdb\x70\x54\x7e\x07\x31\x4a\xf8\x2c\xca\x34\xe6\xe0\x68\xf1\x2e\x4c\xa5\x73\x11\xc5\xb2\x31\x7b\xf1\x12\xcb\xb4\xe0\x3e\x5f\xf9\xe7\xf4\x0a\x1f\x56\xce\x93\x5f\x5b\x4d\x58\xc6\x2f\x03\xb7\x84\xeb\xa0\x50\xb9\x54\x33\xf0\xab\x8d\x58\x2d\x0a\xac\x19\x24\x21\x70\x8d\x16\xe4\x2e\x6c\x09\xdf\xa8\xdf\x0f\xfe\xd1\x3e\x31\x99\x5a\x8e\xb3\x8d\xe5\x14\xc5\xad\x34\x6c\xe7\x85\x1f\x80\x1e\x60\xfc\x0f\xf1\x84\xd9\xc1\x37\x0c\xb3\x89\x9e\xce\x6b\xa9\x72\x2a\xaf\x4b\x06\x2b\xb0\x39\xa1\x1e\x0c\x85\x9b\x32\x8f\x65\xcb\x33\xf6\x56\xb1\x30\x58\x6c\xbc\xf6\xf2\x78\x8d\x2a\xb3\xf7\xd1\x8d\xdf\xef\x78\x0d\x0f\xe9\x36\xf3\x46\xc1\xdc\xbb\xe7\x8e\x9d\xe5\xbe\x7c\x9f\x7f\x97\x8d\x02\x7a\x92\xf4\x1b\xda\x8a\xf9\x01\x9b\xf5\x2a\x7d\xe6\x96\xb5\x95\x6a\x66\x62\x4b\x86\x17\x45\xe2\x0c\x5f\x65\xca\xf8\x19\x0e\xdc\x5d\xcb\x26\x44\xa7\x2c\xf8\xb1\x98\x21\x85\x53\x27\x1e\xb9\x11\x32\x2b\x0d\x3f\xaa\xdd\x48\x58\xc9\x8b\x8b\x6a\x7d\xb2\x01\xb6\x04\x6c\xfd\xf2\xe2\x30\x6d\x1a\x0e\x6b\xca\x49\x17\xf0\x3d\xe3\x79\x29\x8d\x01\x47\x98\xb8\x9a\x6b\x7d\xcd\xf6\xde\xcb\xb9\x36\x36\x72\x66\x0e\x68\xcd\x8f\x5d\xef\xf7\x99\x54\x45\xc8\x8a\x02\x3b\x58\xd9\x90\x06\x0f\x0f\xc9\x42\x2f\x60\x0e\x89\x81\x86\x92\x15\x96\xbb\x89\x9c\x33\x6e\x15\x6c\x5c\x60\x2f\x4f\x4f\xbf\x52\xc2\x5f\x9d\xa2\x33\x5a\xdb\x5d\xbc\xe5\x95\xe3\x88\xda\xe3\xc6\x07\x89\x94\x8b\x4c\x98\xe1\x60\x5e\xbf\x6d\xdb\x64\xb9\xc0\xaa\x7b\x01\xd9\x4f\xfc\xce\x24\x3b\xf0\x4b\xef\x02\x78\x0b\xfd\x74\x37\xd6\xa8\xd3\x6a\x25\x28\x86\x1a\xa3\x91\xee\x24\x1a\x88\x40\xaf\x42\xcc\xb5\xd2\x54\x23\xe7\x0e\x51\xad\x60\x49\x83\x88\xc2\x68\x1e\xcc\x09\x89\xe8\xa8\xab\x47\x6d\x94\x38\x0e\x04\x02\xf8\x83\x0d\x24\x89\xd8\x87\x5b\x69\xe7\xc0\xd8\x30\xef\x44\x0d\xa1\x27\xb5\x30\x10\x80\x51\x4c\xd4\xb5\xae\x29\x21\xcb\xfb\xad\xa9\x54\xeb\x5c\xe7\x90\xd1\xe5\x16\x09\x77\x7f\xed\x9a\x38\x50\xdd\x92\x3a\x05\x0c\x4e\x31\x9d\x8a\x0c\x14\xad\x78\x80\x51\x6a\xef\xb5\x14\x16\x54\x84\xe0\x16\x18\x91\x42\x95\xf2\x9d\x7b\x4a\xfc\xab\x38\x24\x4e\xd4\x11\xab\xbf\xde\x9f\x30\x76\xaa\x42\x06\xef\xc8\xcd\x62\x7c\xa7\x4f\x3d\xb3\xee\x15\x63\x46\x31\x78\x81\xd8\x71\xe6\xb4\xc3\xba\x19\x60\xc5\xf7\x71\x87\xb3\xd8\x25\x3e\xa8\x38\x00\xd7\x38\x35\xea\xa6\xde\xeb\x00\x7d\x5c\xe5\xee\x96\x8f\xe5\x2e\x7f\x1c\x01\x10\xd6\x57\xce\x11\xfa\xd9\x40\x34\x4f\x17\x51\x6b\x91\xf6\x1e\x02\x6e\xe7\x3a\x47\xf4\xc3\x80\xde\x56\x2c\x3c\x1a\x63\xa8\x89\x8e\x74\x3c\xa5\xb1\x78\x20\x86\x45\x24\x72\x9c\x9c\x39\x55\xbb\xf0\xbe\x85\xb2\x2a\x04\xa0\xae\x44\x2d\xb7\x80\x32\x11\x2f\xd4\xa8\xad\x60\x0b\xd4\x52\x04\xc6\x38\x62\xff\x82\x4d\x19\x12\x51\x3d\x4e\xdc\x79\xf8\x39\x5a\x88\xd2\x78\x92\x38\x28\x4e\xb5\xda\xbb\x2e\x58\x2e\xa7\x50\x27\x69\xe9\x91\x15\xaf\x79\xe9\x44\xbc\x61\x34\x04\x57\x62\x26\x31\x21\x32\x08\xb6\x5d\xa7\xee\x11\x36\xc7\x08\x85\xa1\xb4\xac\x94\xb3\x39\x2e\x14\xc6\x01\x51\x87\xf9\xa0\x62\xa1\x79\x0e\xe4\xb2\x4c\xd7\xec\x96\xd7\xa5\x3b\x37\x78\x36\x87\x08\x25\x57\x2c\x6f\x6a\xe0\x4b\xb1\x82\xe7\x8b\xb1\xb1\xdc\x3a\x4d\x59\xd4\x64\x50\xfa\xfe\x6f\xc9\xb1\xde\x7b\x6d\xc9\xb1\x3e\xf0\xda\x92\x63\x6d\xc9\xb1\x96\xaf\x07\x93\x1d\xba\x25\xc7\xfa\xbc\x60\x4d\xb7\xe4\x58\xf7\xbf\x36\x8e\x66\xba\x25\xc7\x5a\x7d\x6d\xc9\xb1\xb6\xe4\x58\x1f\x76\x6d\xc9\xb1\xee\x7f\x3d\x38\x1c\xe6\x2d\x39\xd6\xbd\xae\x2d\x39\xd6\xf2\xb5\x25\xc7\xba\xe3\xda\x92\x63\xdd\x71\x6d\xc9\xb1\x96\xaf\x2d\x39\xd6\xfd\xae\x2d\x39\xd6\x96\x1c\xeb\xb3\xe6\x0c\x60\x5b\x72\x2c\xba\xb6\xe4\x58\x9f\x05\x32\x3a\xdb\x92\x63\x7d\xd0\xb5\x25\xc7\xda\x92\x63\xad\x73\x6d\xc9\xb1\x3e\x17\xa7\xcc\x96\x1c\x6b\x4b\x8e\xf5\xdb\x51\x74\xb7\xe4\x58\x5b\x72\xac\x2d\x39\xd6\x96\x1c\xeb\xbd\xbd\xd8\x92\x63\x7d\x0e\x26\xa0\xb1\xb9\x5c\x0b\x1b\xf4\x43\x60\x8c\x28\x3d\x3d\x42\x0d\xb8\x6a\xa6\x53\x51\x83\xe4\x82\x27\x2f\xa5\x55\xb5\x88\x8d\xdd\x50\xae\xb0\x23\x40\x44\xa2\x4a\x9e\x3b\x7e\x4e\x30\x05\x80\xe1\xd9\xe6\x90\x9f\xbc\x7a\xbe\x02\x33\x69\xed\x7c\xc3\x75\xb3\xa7\xa1\xcf\xaf\xd4\x7a\x51\xf8\x3b\x06\x7c\x55\x65\x19\x8d\x7b\x56\x68\x43\xb9\xef\x30\x58\xd9\x9c\x2b\x25\xbc\xbd\x27\x2d\xf8\x51\xae\x84\x50\x4c\x57\x82\x62\xe0\x9c\x19\xa9\x66\x85\x60\xdc\x5a\x9e\xcd\x27\xee\x49\xca\x0f\x76\x9b\xa7\x4e\x9f\x18\x5b\x0b\x5e\xfa\x8c\xfd\x92\x4b\x6c\x8a\xf1\xac\xd6\xc6\xb0\xb2\x29\xac\xac\x42\x63\xcc\x08\x28\xb5\xc1\x83\x2a\x0c\x06\xe4\xcb\xb5\xc9\xed\xa3\xf6\x69\xd4\x2d\x1d\x83\xd6\x81\xb5\x39\x02\x20\xf1\xb2\xb2\x8b\x90\xe1\x2b\xd8\x54\xd6\xc6\xb2\xac\x90\x70\x5a\xc3\x13\xb1\xaa\x1a\xda\x1b\xf9\xb3\x5a\x51\x4f\x0d\x75\x55\xe5\xa0\xb6\x56\xd6\x60\xbe\x6c\xdb\x20\x35\x95\x4b\x43\x6a\xbe\x19\x31\xee\x11\xd5\x70\xa0\x7d\x4f\x61\xa8\xfd\xc9\x82\xad\xd3\x47\x51\x73\x11\x92\x6c\x9b\x50\xdc\x2e\x74\x28\x7e\xf0\x8b\x73\x94\xd4\x79\xb4\x0a\x05\xf1\x65\x74\xb6\x01\x4c\x80\x12\x37\x6e\x0d\x88\x4c\xb8\xf3\x95\xdf\xb1\xea\x3f\xf9\xa2\x8f\x0e\xc5\x97\xc2\x18\x3e\x13\xe7\x6b\x06\x1a\xee\xb2\xc8\x20\xd6\xd0\x4e\x0c\x2c\x85\x22\xe1\x24\x8b\xf3\x36\x53\x35\x88\x95\xd8\xa7\xa0\xfc\xdc\xd6\xd2\x5a\x01\x93\x0a\xd8\x7b\x10\x11\xed\x96\xe6\xef\x76\xb2\x3f\x5f\xfa\x46\xda\x1f\x3b\xa1\xae\x72\xcc\xc5\xbc\x12\xec\xaa\x96\x62\xca\xa6\x12\x12\x3c\x21\xe5\x72\x84\x50\x4c\x1c\xbd\x00\xc6\x38\x7b\x57\x2b\xaf\xcb\xfa\x7e\x4d\xd8\x0f\xd4\x31\x5b\x37\x2a\xe3\x11\xca\x2d\xd4\x9e\xca\x29\x9b\x41\xca\x26\x69\x8b\xff\xf1\xe4\xbf\xfe\xcc\xae\x16\xee\x48\x03\xcd\xca\x6a\xcb\x8b\xf0\x92\x85\x50\x33\x37\x56\xb8\x3d\xd3\xea\xc9\x30\x02\x40\x03\x82\x1d\x7f\xfa\xc5\xf5\x55\x7a\xc6\x1e\xe4\xe2\xe6\x20\x1a\xbf\x71\xa1\x67\xab\x88\xb3\xd6\x4f\xe6\x5e\xd3\x24\x5a\xb1\xcc\x86\x61\x7c\xf4\x98\x60\x6c\xae\x6f\x51\xd7\x5f\xb1\x7a\xda\x42\xac\x4a\x57\x4d\x81\x4e\xe7\xe7\xa1\xee\xb8\x31\x62\xb9\x3a\x70\xe5\xbe\x00\x37\x29\x35\xd1\x45\x54\xc7\x4c\x5d\xff\x48\x4d\x55\x27\xe4\xc8\x0b\xd0\x60\x60\x08\x3d\xe7\x45\x71\xc5\xb3\xeb\x4b\xfd\x42\xcf\xcc\x2b\x75\x52\xd7\xba\x4e\xfb\x52\x70\x27\x2d\xe7\x8d\xba\x46\xea\x87\x00\x9e\xa0\x67\x14\xca\xf5\x25\x0e\xab\x5e\x18\x2b\xe9\xbd\x10\xf6\x66\x50\xdb\x8a\x78\x27\x5b\x5b\x87\x8a\xb8\x70\x45\xc6\xed\x9b\x78\xb1\x7d\xf1\xe4\x3f\xfe\x82\x4b\x97\xe9\x9a\xfd\xe5\x09\x64\x73\x9b\x11\x6e\x62\x90\x6d\xee\xa0\x28\x79\x51\x38\xb3\x21\x5e\x94\x6e\xa0\x57\x2d\xc2\x4f\xbe\x06\x6d\xff\xe5\xf6\xc1\xaa\xd4\xe5\xe5\xdf\x41\x8f\x92\xd6\x88\x62\x3a\xc2\x7a\xa5\x60\xd6\xec\xc2\xc1\xb0\x4b\xd2\x07\x8a\xc6\x1e\x80\x02\x74\xa3\x8b\xa6\x14\xc7\xe2\x46\x0e\xc1\xee\x97\xb4\xe6\x4d\xfd\x42\x1a\x28\x0d\xbb\x2a\x74\x76\xcd\x72\xfa\x32\xca\x6f\xe9\x62\x84\x3f\x5e\xa2\xd6\xf8\xfd\x93\xdc\x9e\x92\x57\x55\xa8\x1e\xaa\xf9\x6d\x32\x18\xb0\x27\x01\xc8\xe0\xf1\x13\xb5\xe2\x1b\x39\xb9\xb9\x76\x13\x6b\x27\x04\xf5\xf7\x51\xb7\xbd\x1f\x88\x8e\xaf\x6d\xd0\xef\x86\x0a\xfe\x8d\xf5\x26\x4b\xf5\x92\xa1\xe4\x2e\x2c\x0c\x54\x00\xdc\xf2\x01\x91\xbc\x31\x42\x51\xd6\x3b\xb1\x29\x19\x17\xf5\x1e\x4e\x3b\xce\x2a\x51\x1b\x69\xdc\xb9\xfc\x3d\x6c\x28\x24\x33\x6c\x5d\x80\x9b\x19\x04\xdc\xdc\x00\xac\xdc\x5f\x52\x9e\xeb\x9c\x1a\x04\x51\x88\xa0\xd2\x2b\xd4\xda\x54\xab\x1d\xf0\x40\xdd\xb4\xa8\xfc\xbe\x1d\xcd\x54\x52\xba\x4f\x82\xa8\xc4\xbb\x3e\x27\x01\x09\xef\xf7\x58\xe5\x63\xe8\xfc\x40\x62\x00\x04\x23\x4d\x6e\x2a\x09\x13\xe3\x11\x37\x4a\xa4\xd2\x93\x1d\x38\x61\x18\x05\x77\x7b\x82\x7e\xca\x76\x9f\xed\x6e\x54\x48\xe2\x10\xd5\xba\xe2\xb3\x5e\x2c\x3f\x9d\x91\xea\x36\x1b\x43\x50\x38\x33\x08\xbe\x0f\x80\x6c\x70\x97\xc8\x5b\x84\x1d\xc0\x4f\xc2\xe8\xa8\x1f\x60\x32\x10\xb0\x52\xfb\x96\x2f\x18\xaf\x75\xa3\x72\xf2\x2f\x05\x07\xdf\xcb\xce\x83\xcf\xb4\x12\x2d\x6b\x68\x8a\x60\x01\x1e\x7d\xa9\xd8\xd3\xc9\xd3\x27\x9f\xcb\x49\x05\x6f\xd8\x39\xa9\xce\xc2\x49\x85\xf2\x69\xa3\xef\xea\xb1\xf0\x07\x7a\xdf\x97\xe4\x62\x69\xa1\xee\xa5\x07\xd2\x86\x8f\x6e\x6b\x69\x45\x44\x0e\xb8\x07\x86\x8b\xb3\x0f\x23\xbc\x86\xfd\x55\x1c\x13\x3d\x07\xa9\x1f\x40\x86\x69\xae\x3e\xa2\xdc\x22\x01\x05\xdb\x6d\x95\x87\xcb\xbc\x47\x84\xc5\x03\xb5\xb3\xc3\xf6\xf0\xce\x5d\x2c\x75\xde\xdf\xe8\xd2\xa2\x41\x3b\x79\x57\xf5\x40\xdf\xec\x54\xd5\x57\x1c\x7c\x70\xd5\x80\x23\xf8\x37\x31\xe7\x37\x02\x4a\xbc\x65\xc1\xeb\x02\x62\x8e\x17\xd8\x77\x76\xd5\x58\x26\xd4\x8d\xac\xb5\x2a\x85\xb2\x0c\x72\xe0\xaf\x0a\x11\x73\x63\xff\x7e\xef\xfb\xc3\xd7\x90\xd0\xb0\x4f\x60\x15\xd4\xcb\xc6\x78\x60\x9b\xb8\x27\x51\x73\xbf\x3a\x7d\xbe\x1f\x6e\x0c\x41\xe6\xfa\x7e\xb9\xe7\x94\x8d\x6d\x90\xb0\xe5\x5d\x56\x34\x46\xde\x6c\x4a\x92\x50\xed\xfd\xb1\x5c\x6b\x9e\x3b\x38\x00\xed\x40\x2d\x95\xf4\x83\x6b\x7d\x45\x19\xe0\x52\xc0\x64\xd7\x84\xd2\xc0\x38\x06\x4e\xae\x27\x42\xd9\xc0\xf4\x39\x8f\xc5\xb8\xa4\x42\x00\xa2\xcc\x66\x9d\x50\x4a\xe7\xe2\xfe\x78\x3c\x69\x7a\x0f\x35\x81\x31\xf3\xa8\x4e\xd0\x64\x73\x91\x37\x05\xb1\x79\x03\x6c\xaa\x33\x1f\x78\x8b\xcf\xa7\x80\x3f\xe8\x74\x1a\xc0\x0e\xd4\x18\x9c\x83\x38\xe6\xfe\xf7\xb5\x87\x46\xf0\x1f\x98\x4e\x8b\x60\x94\xba\xb6\x46\x8c\x1b\xd3\x94\xb8\x25\x90\x1a\x61\x2a\xad\x69\xc9\xc2\x49\x3b\x76\x1b\xe3\x9e\x65\x5b\x3d\xc6\xf7\x42\x14\xb0\xb8\x7a\x8c\xf1\xee\x59\xd4\x0e\x0e\xb4\xf1\x7f\xd1\x82\xa3\x84\x09\x88\xb6\x85\x3c\x4e\x0d\x5e\xd2\xa9\x04\x7a\x25\x4e\xe3\x7d\xb1\xe2\x97\xa8\x3a\xe0\x1d\x00\x1c\xc3\xaf\x44\x61\xba\x0d\x5d\xb5\x93\x42\x78\xa5\x34\xf0\x3d\xf9\x73\xb9\x31\x72\xa6\x80\x59\xd3\xb5\x76\x4f\x0e\xcd\xb5\x6d\xa6\x21\xf8\x71\xd7\x96\x6a\x49\x16\x56\xc9\x2b\x22\x62\xe7\x56\x97\x32\xbb\x47\x4b\xfa\x9e\x5d\xee\x54\x64\x27\x95\xbe\xaf\x2e\x96\x3c\x3e\x26\xf2\x6a\x4c\xd8\x85\x2e\x29\xc5\x49\x45\xfc\x5e\x9e\x66\xd5\x9d\x18\xb5\x70\x63\x01\x89\x47\xb2\x8d\xc6\x03\x1f\x8e\xaf\xb5\x86\xe7\x04\x95\x9c\xc2\xb8\x00\x4c\x49\x34\xaf\xba\x28\xf4\x2d\x24\x16\x63\xbb\x7e\x6d\x43\x0a\xcc\x33\x36\xee\x70\xd6\x4e\x52\x38\xd1\xf7\x3f\x87\xee\x1d\xfd\xfa\x53\x30\x3f\x07\x80\xfa\x4e\x8f\xe3\x3f\x4f\xcf\x8f\xe2\x3f\xdf\x18\x37\x4a\xf4\x41\xb7\x6b\x29\x5f\xc3\xdd\x77\xc5\xc8\xd9\x77\xdd\x35\x45\xca\xa3\x5f\xf9\xfa\x68\xce\x95\x0f\x64\xdd\xf9\xbc\x85\xc9\x6c\xd1\x76\x67\xce\x6b\x41\xc8\x72\x4e\x92\x9b\x8a\x67\x77\xf6\x22\xc0\xb8\xbd\xf7\x86\xf7\xf6\xd4\x34\x95\x67\xea\x2e\xe0\xc6\xd0\x93\x76\xd9\xfd\xf8\x87\x9f\x3e\x70\x30\x7f\xed\x37\xab\x86\xf6\xfd\xbf\x49\x08\xfd\x3e\xe8\x17\xab\xe9\xbe\x3e\xec\xb7\x11\x63\xde\x07\xdd\x7f\x17\x5b\xef\x87\x3e\xcd\xb3\xbc\x7d\xd8\x8b\x75\x67\xfb\x03\x6e\x87\x29\xbd\x1f\x26\xc2\xda\x22\x7c\x5d\x77\xd7\x1a\x4e\xaa\xf5\x9d\x53\xeb\x19\xfb\x1d\x05\xe0\x0e\x90\x53\x02\x60\x53\x33\x96\xc0\x4a\x35\x75\x2d\x14\xf0\xe5\x37\x90\xe9\xe8\x79\xf0\x51\x48\x83\xb0\x25\x08\x4f\xc4\xa1\x67\x87\xe1\x2c\xa4\x0c\xb8\x92\x03\xac\x67\x04\x63\x3d\x6d\x20\xa1\x11\x44\x3f\xc2\xd4\x69\xe5\xfa\xf1\x6c\x15\x0e\x87\xae\x84\x8a\x58\xf0\x49\x6b\x1e\xbb\x35\x94\x20\x73\xa0\x22\x30\x29\xf3\xdf\x55\x05\xb7\x53\x5d\x97\x63\xaf\x1e\x8e\x13\x25\x81\x1d\x41\x6a\x8d\xf1\xf6\x15\xe6\xb7\x22\xdc\xa6\xca\x0b\x11\x9d\xe6\xe1\x55\x55\x8e\xe0\x54\xac\x51\xb5\xc8\xf4\x4c\x41\xe5\x31\x7d\x0b\xe7\x5a\x70\x0e\x71\xe3\x4e\x52\xa6\x9a\xa2\xb8\x7f\x1e\xc2\x9a\x4a\x80\xbe\x11\xf5\x5c\xf0\x7b\x2e\xde\x4e\x4a\x0b\xb5\xd1\xb2\x92\x1a\x42\x2e\x20\x95\xd7\x3f\xc4\xa9\xc6\x3a\x83\xda\x36\x0c\xb1\xfb\xc4\x65\x0e\x07\xba\xd3\xf4\x38\x9b\xc9\x1b\xa1\x3c\x18\xf9\x51\xc1\x03\xb3\xb6\xc7\x5f\x25\x40\xf4\xc6\xea\x90\xb4\xc0\xb8\x8d\x20\x91\x21\xc7\x89\xe2\xa5\x71\x3b\xd1\x2d\xc4\xcb\x5d\x78\x0e\xb4\x0f\xb9\x13\xf2\x06\x90\x14\x72\xd4\xbe\x52\xe9\x7d\xab\x09\xe6\x26\xcb\x20\xbb\xc5\x9b\x22\x94\xd5\xf2\xeb\x8f\xa0\x94\x34\x27\x83\x56\x35\x43\xea\x72\x00\x87\x6d\x07\xb6\x70\xe2\x7f\x81\x4a\xce\xe9\x34\x7d\x92\x4c\xe0\xf8\xa1\xf6\x09\xd4\xef\xd6\x1e\x3c\xd7\xb9\xd3\xc2\x46\x2c\x4c\x65\x4c\x4b\x4e\xf1\x16\xdc\x93\xd1\x66\x44\x25\xad\xae\x85\xa9\x34\xb2\x02\xc4\x8f\x1d\x45\xfe\x2f\x69\x93\x64\x3b\xe4\x77\x0b\x5b\x03\x71\xdb\xfe\x2d\x6a\xbd\x52\x87\x9f\x49\x3b\xb9\xfe\x0b\x28\xf0\x42\xcd\xb9\xca\xd0\x76\x3a\xb8\x16\x95\x39\x30\x72\x86\xfa\xfa\x9f\xff\xf2\x17\x50\xde\xfd\x90\x1c\xbc\x3e\x39\x3c\x7e\x79\x32\x29\xf3\x47\xa4\xc9\x57\xdc\x5a\x51\xab\x67\xec\x7f\xf6\xde\xfe\xf1\x97\xf1\xfe\xd7\x7b\x7b\x3f\x3e\x19\xff\xd7\x4f\x7f\xdc\x7b\x3b\x81\x7f\xfc\x61\xff\xeb\xfd\x5f\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf1\xbb\x97\xdf\x5c\x9e\x9f\xfc\x24\xf7\x7f\xf9\x51\x35\xe5\x35\xfe\xf5\xcb\xde\x8f\xe2\xe4\xa7\x0f\x6c\x64\x7f\xff\xeb\xdf\xdf\xb3\xa3\x6b\xd6\xa5\xf4\xad\x45\xe9\x55\x7f\x32\x60\xcd\x49\x55\x0b\x51\x82\xf8\x5b\x27\x5b\x2b\xf5\x92\x76\x9a\xf2\x07\x2c\xfd\xe5\x64\xa2\x7f\x9a\x9a\x39\x31\x69\x50\x74\x16\xfa\x16\x32\x2c\xa5\x76\xca\xcf\x84\xbd\x82\x73\x90\x9d\x89\x1b\x51\x8f\x7c\xab\x2f\xdc\x4d\xe7\xe1\x9e\xd8\x0d\xb7\xea\x8e\x35\x73\xfc\xd7\x9c\x13\xdf\xf7\x1e\x83\x87\x8c\x26\xd4\x79\x90\x4f\x13\xf6\x3d\xaf\xa5\x6e\x0c\xe9\x22\x31\x10\x38\xa6\x90\x85\x93\x04\xbc\x12\x14\xe0\x09\x8d\x84\xca\x30\x1f\xe3\x09\x63\x73\x18\xe4\xf5\xd1\xea\x23\x41\x5a\x37\x53\x37\xfe\x51\xb5\x4f\x75\x5d\xc2\x10\xc7\xc3\x60\xa5\xfc\xf7\x27\x9a\x89\x3b\x0a\xcd\xf8\x7e\x80\x6c\x3d\x23\x64\x13\xc1\xe6\x72\xe6\x13\xaa\xe1\xfd\xd1\x7c\x8d\x3e\x0d\x2b\x64\x8d\x29\x5d\x67\x9b\xae\x9b\xd7\x5f\x75\xdf\xaf\xc7\xb2\x48\x91\x96\x63\xb0\x66\x5f\x51\xd4\xee\x9b\x1d\x5c\x27\x70\x88\x8c\xb3\x5a\x5a\x99\xf1\x62\x07\x0e\x27\xff\x55\x56\x34\x4e\x4f\x8c\xbf\xad\x05\xb3\xb7\x1a\x9f\xc2\x0b\x76\x2d\x16\xb7\xba\xce\xfd\xf9\xec\x9f\xd8\xce\x85\xb1\xfe\x91\x52\xd0\x06\x46\x37\x43\x5d\x8a\x9a\x5d\x09\xef\x41\xef\xdc\xbc\x98\xb0\x43\xb5\xa0\xf0\xa3\x8a\x8b\x0c\x23\xfc\x37\xd0\x11\x50\x8b\x4a\x16\x09\x1d\x62\xfe\x69\xdc\x12\x20\xce\x6a\xef\xb2\x53\xc0\xc2\x2e\xf0\xa7\xbf\x77\x2f\xeb\x9a\xaa\x9c\x60\x77\xd4\x58\xa3\xa5\xfd\xd7\x9f\x44\x5a\x38\xfd\x46\x2a\x61\xcc\x37\x6e\x2a\xfb\xa8\xab\xe9\xea\xe0\xa0\x96\x50\xdb\x50\x29\xd5\xa6\x14\x0b\xb7\xa5\x30\x46\xec\xc4\xb0\xce\xdb\x3b\x27\xec\x10\x3e\x80\x9c\x78\xa7\x79\x41\x15\x9d\x6b\x4c\x5a\xd3\xa5\x9d\xc7\x3b\x0e\xcf\x8e\x7d\xee\x32\x6a\x0a\x26\x05\x52\x47\x95\x39\xed\x09\x68\x7a\x94\x41\x2b\x7e\x6e\x38\x30\xe8\xee\x5c\xd6\x8d\xd8\x59\x4f\x55\x42\x88\xfe\x83\x3f\xfd\xe5\x09\x68\x4b\xe1\x79\x63\x78\xde\x3a\xaa\xd2\xfd\x73\x64\xd6\xca\x8e\xe9\x26\x06\xbd\x8e\xd7\x83\x1f\x70\x6f\x77\x50\xd0\x0a\x6a\x7b\x61\x9a\xc2\x98\xaf\xe5\x5a\x5d\x2b\x17\x66\xfd\x2c\x98\x71\xdb\xdd\xcb\xfb\xb3\x9b\xf5\x49\x60\x49\x9e\x3b\x44\x94\xab\x6d\x0d\x67\xc5\xe0\x94\x84\xe7\x44\x9e\x5d\x24\xc1\xa0\x8f\x21\x1d\x16\x04\x17\x44\x05\x40\x3c\x2e\xaa\x1e\xa9\xbf\x6b\xc8\x1b\x34\x5e\x21\xad\xae\x97\x7f\xfb\x75\xd2\x12\x49\x6e\x7f\x54\x74\xbe\x0c\x35\xe4\x94\x30\xed\x6b\x73\x00\x7c\x2a\xa0\xc6\x78\x98\x7f\xe0\x43\x09\x94\x1f\x50\x99\x83\x5a\x81\xef\xbc\x89\x92\x23\x73\xc1\xf8\x0d\x97\x05\xf2\xa0\x38\x93\x4e\x9b\xc4\xc9\x8e\x1d\xca\xb4\x32\x4d\x09\xcf\x28\xdd\xe9\x82\x67\xc6\x5b\xd5\xd6\xa4\x2a\x24\x61\x79\x6f\x55\xaa\xeb\xe1\xf1\x42\xf1\x52\x66\xfe\x0d\x0f\x0b\x4f\xfc\xd6\xa9\x4b\xf5\x6d\x07\x37\xb9\x2c\xcb\xc6\xba\x6e\xde\x13\xd5\x74\xc3\xf2\x28\x9a\xc8\x38\x6e\x2e\xde\xf1\xcc\x16\x0b\x70\x54\xa5\x37\xd9\x79\xad\x9b\xd9\x9c\x71\x06\x7f\x5f\xc0\x57\x13\x76\x6a\x9d\x2d\x09\x64\xed\x04\xd7\x20\x2d\x9e\xdf\x8d\x92\x3f\x37\xa2\x58\x30\x09\x7c\x42\x21\x66\x92\x36\x1b\xa1\xc7\x03\xd3\x4c\xc4\x6e\x83\x5a\x80\x10\xb9\x87\x3c\x20\xd3\xfe\x8e\xce\xa3\xdd\x0e\xda\x83\x3b\xf0\xf9\xfd\x93\x78\x36\x24\x3f\xd7\xc8\xfe\xeb\x23\x36\xd7\xcd\xa4\x5a\xc6\x62\x5b\x3d\xc3\x32\x0a\x1f\x67\xdd\x39\x06\x53\xa5\x4d\xc0\x02\xa2\xc6\xe3\xb3\x8b\x7f\xbc\x38\xfc\xdb\xc9\x8b\x4f\x5e\x4b\x82\xbd\xec\x3d\x18\xb8\x17\xa2\x9c\x57\xe2\x3f\x8b\x4c\xb6\x64\xcd\xae\xff\x9e\x1b\x23\xe1\x48\x0e\x98\x3e\x7c\x44\x29\x8f\x73\xb7\xd5\xae\xc3\x9e\x77\x36\x3b\x19\x09\x74\x0e\x03\xa8\xa5\x0a\xf1\x37\xde\xa6\x39\xf4\x2b\xfb\xef\x91\x61\x95\x8c\xd3\xa5\x28\x2b\x67\x1f\x0f\x36\x5e\xe9\xe9\x1c\x37\xff\x2b\x03\xe7\x6f\xfd\xf0\x01\xc4\x83\x4e\x30\xeb\x7f\x19\x27\xed\x40\xde\x29\x3a\x7b\x39\x53\xe2\x36\x7d\x98\x4f\xe9\xf1\xbf\xb8\xd2\x8d\x22\x4e\x7c\xdf\xf8\x0f\x88\xe2\x41\x39\x29\x80\x10\x5e\x08\xeb\xad\xbb\x74\xce\xa9\xda\x1c\x89\xa2\xe8\x3e\x54\x1c\xe2\xb0\xce\x8a\xdf\x5c\x09\xf6\x15\x40\x9c\xf0\x52\xfc\x75\xfc\x55\x10\x4a\xf0\xf7\x88\x36\x69\xe7\xe3\xd6\xa1\x95\x9e\x91\x13\x74\x62\x40\x8e\x3f\xf1\xa3\x69\x95\x38\xc0\xbd\x59\x2a\x43\x3e\x80\x53\x89\x14\xa8\x45\x9e\x4c\xd2\x59\xb2\xf0\x73\x8a\x1e\xa4\x9d\xde\x13\x93\xd9\x84\x59\xad\x01\x9a\x04\xb1\xd6\x0f\x15\x13\xef\xa4\x01\x8b\xb9\xfb\x8a\xb1\xa1\x4c\xe9\x3b\xf8\x08\x7d\xab\x52\xa0\x10\x2c\x5d\xa6\x94\x29\x43\x16\x62\x94\xa6\xc2\x6f\xb4\xf4\xa9\x71\x5c\x41\xf0\x07\x23\x15\x61\x70\xae\x16\xac\x94\x06\x48\x72\x00\x4f\x31\x6f\x0a\xbc\x39\x47\x24\x12\x84\x27\x43\x57\x83\x9b\x5b\x28\x86\x4a\x2a\xb3\xdb\x46\x3b\x0a\x80\x3b\x2e\x4a\x7d\x23\xf2\xf7\x29\x57\xc4\x8d\x02\xe5\xf5\xb3\xae\xa6\x18\x4a\x2c\x12\xef\x7e\xf2\x94\xa8\x20\xad\xd6\x05\xab\x0a\xae\x04\xd5\xe8\x07\x8f\xc4\xb2\x9c\x5e\x17\xa7\x7e\x98\x1c\x17\x67\x56\x40\xa2\xcb\xb5\x58\xdc\x5b\x6c\xaf\xa1\x56\x2c\x3f\x1c\xdf\xa3\xe4\xd5\xfd\x4c\x11\xb7\x18\x7a\xbb\x9a\x77\x5f\x63\x43\xac\x6a\x7d\xcb\x4b\xc5\xd4\x21\xd9\x14\xa4\x0a\x79\x95\x0f\x01\x99\x62\xc4\x5e\xa9\xe7\x58\xaa\x3b\x42\x47\xf3\x84\x9d\x2a\x66\x74\x49\x25\xc2\xef\xac\x19\x21\x19\x23\x67\xa6\xb9\x32\x82\xd8\xee\x9c\xa1\x41\x11\x4f\x0a\xe9\x56\xa2\x2e\xa5\x8d\x53\x7b\xdd\x92\xc3\xc7\x0c\x8a\x79\x72\xf0\x3b\x1a\xbd\x31\xbe\xf4\x3a\x1e\x8e\xfb\xdb\x8e\x51\x18\xac\xa7\x2b\x73\xf7\x75\xa7\xad\xc4\x8e\x4e\xc2\x7c\xe9\x41\x04\x29\x71\xe8\x0b\x62\xb3\x5a\x37\x95\x3f\x43\x52\xbe\xe6\x96\xa4\xd0\x1f\x24\xe8\x1f\x4c\x9b\x0e\x42\x0b\xac\x71\xd1\x1e\x8c\xb9\xd3\x47\x8d\x19\xad\x94\x8b\x75\xa3\x3c\xb7\xb1\x00\x1f\x62\x94\x58\xb9\x53\x88\x19\xcf\x16\x3b\xe9\x73\x56\xa5\xb1\xa2\xc9\x29\x4b\xe4\x85\xc2\xe7\xb5\x05\xda\x50\xc7\x0d\x26\x35\x3a\x0e\xd0\x4e\x32\xd4\x45\xef\xbf\xf4\x08\x23\x18\xa6\xaf\x7b\x84\x19\xff\xf4\x97\x3f\x8d\x7d\x22\x01\x74\xe5\x93\x2c\xa8\x90\x86\x3a\xa8\x63\x3c\x99\x33\xa7\x09\x48\x53\xc1\xfc\xc2\x49\xd7\xfa\x26\xc3\xd3\xdf\xe7\x3b\x5e\xdd\x88\x9f\x80\xb6\x89\x4f\x38\x5c\x52\xcd\xfa\x3a\x8b\x77\x2e\xd2\xa6\x68\x35\xea\x8a\xff\xdc\xb4\x45\xdb\x24\xdb\x50\x61\x88\x86\x98\x06\x05\xaa\x98\xdb\x3e\xb5\xd2\xd5\x4d\xc7\x72\xfb\x6e\x80\xa3\x9d\x12\x06\xd7\x58\xbe\xf0\xbb\x3b\xed\x16\x68\x0b\x56\x84\x72\xa5\x36\x6b\x39\x6c\x47\x6e\x9d\xda\xd9\xcd\x89\x16\x41\x31\xed\xbe\x67\xe6\xde\x32\x62\xe6\xe7\x16\xfd\xa8\x70\xb2\x53\x8e\x05\x62\xd3\x00\xcd\x24\x68\x1b\x24\xfa\x9d\x0a\x70\xcb\xeb\xdc\xa4\x6e\x23\x82\x32\x23\xd7\x0f\x45\xcd\xbc\x16\x71\xae\xf3\xb6\x07\xc1\xb5\x9b\x3a\x8a\x1e\x91\x33\x28\x1d\x4d\x78\xfd\x36\xf3\x05\x24\xf7\x39\xaa\x89\xb3\x86\xd7\x39\x84\x0c\xda\x85\xb0\xf5\xb1\xac\xba\x86\xf3\xb1\x78\xb6\xa7\x76\x43\xa2\x1f\xf2\x04\xb0\x9e\xd2\x4f\x23\x32\x66\x4e\xce\x19\x34\x0e\xd6\xe6\x39\xff\x2d\x2b\xb2\x9d\x54\xcd\x3e\x6a\x51\x97\x75\x78\xae\x8b\x1c\x14\x18\xe2\x06\xf7\x8f\x72\x82\xaf\x96\x57\x8d\xa5\x5c\xbc\x4c\x97\x65\x0a\xcc\x85\xe1\x79\x33\x61\x2d\x32\x53\x9c\x27\x01\x92\x78\xc2\xd8\x85\x10\x30\x77\x71\x3f\x40\x83\xf6\x47\x1c\x1d\x02\x7a\xca\x84\x5b\x48\xb8\x40\x3e\x51\xee\xd1\xfa\x1b\x8b\x32\xb6\x7b\xa6\x86\xee\x1c\x86\x50\x78\x9c\x58\x8d\x8a\x27\x9e\x8b\xbc\xaa\x0a\x89\x75\xfc\x1d\x9b\x03\x6a\xd6\xdb\xd4\x7e\x2a\x61\x73\x63\x41\xe1\x0d\xd8\xae\xdf\x35\x57\xa2\xc0\x64\x34\xb4\x58\x31\x01\xee\xd6\x35\x31\x97\x15\xee\x6a\x6e\xc3\xcf\xc1\xb7\xd1\x35\xdb\x9f\xb9\x13\xe9\x29\xba\x3a\xf4\x2d\xa4\x1e\x7e\x73\x7a\x1c\x74\x17\x77\xd7\xf3\x0b\xcc\x1b\xff\x02\xef\x32\xc2\xce\x64\xce\xae\xb0\x3a\xc8\x9d\x84\x7b\x4a\xdc\x22\xde\x00\x39\x6c\x42\xf0\xf6\xc6\xd7\xe1\x63\x6b\xe1\xe1\xd4\xe4\x3e\xfb\x12\xdb\x04\xe3\x07\x53\x3f\xae\x24\xd5\x23\xbf\x7a\xbd\xeb\x73\x22\x6f\xc7\xf5\xed\x78\x3c\x1e\x53\x11\x01\x68\xcf\xa3\x64\x0c\xc2\xa9\x5e\xea\x5c\x4e\x17\x9d\x91\x00\x0f\x42\x78\x04\xac\x48\xae\x16\xd4\xbb\x09\x3b\xd3\x56\x78\x0c\x8d\xe0\x18\x68\x39\x93\xdd\x2b\x42\x2c\x1b\x52\xad\xb5\x99\x78\x4f\x8b\x4f\xd3\xbd\xbf\x05\xdf\x2f\xe7\xab\x0f\xe6\xe7\x8a\x7a\x84\xbe\x49\xd0\xab\x4a\x1c\x7c\x48\x2f\x10\xf4\xe9\x29\x2e\x52\x80\x68\xb8\x63\x62\xfc\x39\x44\xab\x86\x42\x7b\x98\x0a\x22\xde\x55\x1a\x49\xad\xc0\xcd\x7f\xae\xf3\xe5\x1c\x58\x54\xb6\xaa\x0a\x2b\x39\x93\x5d\x43\x86\x1e\xa6\x5d\xfb\x41\x60\x57\xdc\x35\x19\xba\xb3\xd7\x59\x27\xfb\x10\x79\x82\xa6\xe1\xbc\x53\x9a\x89\xe9\xd4\x59\x94\x5a\x31\x51\xcd\x45\x29\x6a\x5e\xa4\x0f\x22\x28\xb8\x67\x4e\xdc\xd6\x6e\x95\x62\x9e\x69\xc9\x2b\x94\xb6\x20\x3c\x73\x59\x03\xa4\xae\x4c\xf2\xbf\x77\x5e\xa9\xd7\x5a\xdb\x97\xd2\x80\x4d\x49\x19\x37\xe8\x01\xd8\x59\x65\x68\xf8\xef\xda\xba\xfa\xbe\x2b\xf9\x93\x25\x59\x33\xf4\x09\x1c\x0e\x22\x6b\x9d\x04\x71\x42\x2b\x18\xee\x4e\x99\xb6\xf5\xa2\xd2\x52\xd9\x65\xb4\x9c\x00\xb2\xfc\x86\x90\xa2\xc1\x10\xf6\x87\x56\x48\xf8\x63\x2f\xf9\x22\xb8\x84\x29\x8f\xb9\x73\xc6\xa2\x6b\x80\xbe\x03\x0c\xb7\xee\x21\xec\xa6\xf0\x1c\x90\x83\xe3\x8f\x47\x51\xf6\x70\x92\xf0\xd2\xfd\xb9\xe5\xd7\xc2\xb0\xaa\x16\x99\xc8\x21\xfc\x88\x3e\x55\x6e\x13\x48\xf6\x9e\x93\xfe\x88\xa4\x17\x2c\x99\x33\x0d\xfb\xa4\xe7\xa2\x39\x8d\x72\xe0\x08\x3d\xa9\x5d\x22\xa0\xe3\xba\xb5\xc4\x21\xe8\xac\xd5\x18\x08\xc4\x1b\xe3\xb3\xe3\x6b\x9f\x57\x98\x1c\x40\xe4\xb5\xc7\x63\x13\xea\x88\x9d\x95\xe8\x57\x98\x53\x9d\x94\x69\x6a\x11\xca\x60\x73\x2d\x5a\x32\x71\x6e\xd8\x9b\xd3\x63\xf6\x84\xed\x41\x09\x78\x80\x01\x0c\x89\x0c\xdd\x3a\xe5\xa9\x6f\x22\x75\x29\x11\xea\xa8\xd2\x28\x8b\xba\x91\x04\x74\x35\x42\x9a\x5d\xfe\x20\xd7\xf8\xba\xeb\x71\x3d\xa0\x87\x50\x4a\x35\x80\x0c\x7a\xb3\x86\x0c\x8a\x15\x6b\xb7\xbc\xd2\xb1\xc2\x35\x54\x0a\xcb\x01\xd1\x16\x65\x93\xbf\xe1\x41\xce\xde\x6f\x5d\x42\xa5\xd5\x90\x03\x2c\xaa\x8b\x13\x68\xd0\x87\x13\x48\x8d\x47\xdb\x21\x5f\xb6\x1d\xbc\x2c\xf8\x15\xa0\x04\x1f\xf0\x0c\x20\x94\x35\x57\xb9\x2e\x97\x9e\xe6\x66\x13\x8c\xb7\x68\x36\xb7\xcb\xee\xae\xab\x57\xfe\x44\xbf\xec\x09\xb0\xf1\x07\xc0\x57\x7b\x01\xbe\x02\x69\xc2\x4a\x40\xe7\x01\x20\x0f\x2c\x99\xad\xbd\xe1\x37\x7b\x27\x43\xd4\xba\x58\x33\xeb\x21\xcd\x11\xd1\x05\x21\x65\xf8\xd7\x76\x0d\x3f\xd8\xb7\xb6\x6b\xe6\xa2\x76\xc5\xcb\xa2\xea\xbc\x35\xb8\x73\x1e\xea\x5b\x37\x6b\x9d\xd2\xac\xfb\xd6\x50\x37\x9d\xbc\x35\x9c\xbb\x0f\xf1\xad\xd3\x32\xf9\x01\x0e\x13\x6a\x90\x69\x2a\xd6\x27\xba\xca\x2e\x92\x6e\x5b\x86\x0b\x4e\xa8\xc7\x25\x47\xfb\x60\x2d\x62\x35\xdd\xa7\x16\xdd\x3a\xe3\x05\x20\x5a\xac\x3b\xcf\xac\x3b\xd7\xdd\x26\xa3\x8a\x1f\xee\x7a\x0b\x9f\x45\x75\xab\x1c\x61\xc0\x75\x1b\x28\xef\x04\xc5\xc9\x4d\x47\xbf\xf4\x69\x95\xee\xfc\x6d\xcb\x68\xe3\x5f\x5b\x0d\x28\x4e\x2d\xdd\x20\x87\x0e\x0a\x4c\x9b\xa9\xb8\x9d\x8f\x18\xa4\xea\xc8\x9b\x90\x5a\x73\x8d\xa6\xd4\x6e\x52\x9b\xeb\x57\xac\x7f\xb4\xcf\x98\xa6\x96\xe3\x80\x9c\x9c\xa2\xfc\x92\x86\xed\xbc\xf0\x03\xb0\xf3\x98\x05\xf4\x0e\xbe\x4f\x98\x3b\xf4\x62\x5d\x4b\x95\x13\xb5\x4e\x32\x34\xa1\x0e\x1c\x75\x43\xef\x61\xf2\x7b\x9d\xd7\x02\x9c\xbd\x61\x68\xd8\x78\xed\xc5\x40\x29\x0a\x3e\x51\x65\x7c\x87\x92\xe9\x7d\x2a\xfe\x21\xdd\x66\xde\x28\x98\x69\x05\x20\x1b\x4a\xaf\xb8\xcf\xbf\xcb\x7a\x49\x52\x7d\x44\xef\x12\x1a\x4a\x4f\xf1\x7b\x18\x62\xe3\x33\x04\x57\x89\x54\x78\x1b\x48\x4f\xc8\x2e\x04\x1b\x52\xaa\x8e\xea\x3d\x82\xd9\xa1\xa2\xea\xa5\xd3\x09\x6b\xf8\x4a\x5e\x2f\xd8\x37\xa7\xc7\x04\xda\x43\x8e\xce\xbd\x38\x06\xbf\x8f\x51\x6a\x8c\x44\x94\xa2\xbc\x42\xef\xa7\x59\x2e\x64\x4f\x20\xd1\x42\x3e\x5f\x23\xf3\xf7\x18\xb4\x5d\xf3\x43\xe9\x18\x03\xc2\xbf\x7b\x0d\xc8\x10\x64\xc0\xa8\xc5\x6a\xad\xfd\xa3\xf4\x10\x79\xe0\xac\xdb\x2b\xe8\xcc\x95\x37\x62\xc4\xc4\x8d\x50\x94\x55\xb9\x80\x3b\xdc\xd9\x26\x55\x56\x34\xb9\x7f\x1c\x70\x1c\x18\xbb\xb1\xe3\x70\x3d\xe4\xe5\xb5\x71\x97\xfb\x32\x5a\xf5\x32\xa2\x11\x09\xa9\xe7\x8e\xbb\x20\x3c\xa5\xb9\x2e\x72\xc6\xc3\xf6\x0b\xa9\xc8\xb9\x7f\xce\x52\xba\x2a\xe4\xe0\x52\x4a\x55\xa3\x5a\xb0\x16\x7f\xff\x5e\x57\x61\xf2\x12\x6f\x9f\x20\x06\xbd\xdf\xae\xe0\x8d\xca\xe6\xbf\x95\x25\xb3\x62\xf4\x43\x20\x88\xb3\x6b\x51\x2b\x51\xb0\x8a\xd7\xbc\x14\x40\x73\xe3\x1d\x08\x9f\xbe\x52\xa1\x1f\x1e\x77\x0f\x2c\xed\x31\x3a\x37\x36\x50\x5c\xd1\x07\xdb\x78\x65\xc6\x08\xf7\x5d\x42\xae\xc6\xb5\xa6\x91\x0d\x51\x0e\x01\x23\x3a\xc8\xab\x21\xcb\xe5\xc3\x78\xb7\x14\x3e\x6f\x00\xdb\xef\x07\x6c\xb0\xc5\xf9\xf4\x79\x1e\xf7\x75\x26\x7a\x85\x72\x19\x5d\x7f\xd7\x2c\x39\xea\x52\x2a\xd2\x4f\x1c\x49\x58\x5b\xee\x02\x14\xd7\xa3\xf2\xff\xcd\x4a\xc3\x8f\x6a\x01\x35\x72\xbc\xb8\xa8\x44\x36\x80\xfd\xf1\xcd\xcb\x8b\xc3\xb4\x51\x38\x94\xb0\xf0\x6c\x2e\xe0\xfb\x08\xb5\xe3\x56\x5c\xcd\xb5\xbe\x66\x7b\x2b\x90\xc7\xa2\x64\x29\x23\x67\xe6\x80\x96\xf7\xd8\xf5\x7b\x9f\x49\x05\x14\x51\xe1\x50\x0d\xd4\x5a\xfe\x21\x59\xe8\x05\xcc\x15\x65\x5a\xd3\x31\xbc\xdc\xcd\xb3\x5e\x09\x69\xbd\x65\xd2\xf2\x64\xac\x5f\x9d\xf5\x2b\x13\x72\x17\x02\xdd\xca\x51\x43\x77\xcf\x46\x86\x84\x9c\x11\x4e\x03\x1f\x60\x1c\xbe\x6d\x5b\x8b\x19\x0d\xe4\x34\x21\x5b\x6c\xcd\xc8\x10\xca\xdd\x05\xd2\x77\xfa\xe9\x6e\x6c\x76\xa4\x35\x41\x50\xcf\x4d\x89\x73\x88\xc8\xe7\xf3\x4b\xae\x04\x9b\x6b\xa5\x6b\x42\x1a\x69\xb1\x74\x40\xcc\x60\x12\x2f\xcc\x00\xc9\xdb\xa8\xab\x51\xd9\xb1\x4f\xe3\x9d\x16\x7c\x06\xa4\xd1\x1d\x40\x1c\x10\xae\xba\xc1\x98\x6f\x7c\xb3\x2f\x07\xf3\x84\xa8\xc0\xc7\x66\x50\x8a\xf9\x50\x2f\x25\x54\x43\x8e\xcc\xa1\xeb\xf7\x14\xd3\x6b\x77\x13\x18\x8e\x36\x8f\x33\x54\xe9\x05\x83\x28\x19\x60\x94\xbc\x7b\x32\x94\x7e\x45\x15\xf6\x94\x07\x5a\xca\x77\xee\x29\xf1\xaf\x62\xc0\x0f\x28\xab\x52\xe3\xd5\x5f\xef\x4f\x18\x3b\x6d\xed\xda\x91\x9b\xc5\xf8\xce\x88\xac\x54\xc1\x17\x67\x88\xd8\x81\x2f\x10\xc7\xa1\x88\x77\xb4\xcf\xfa\x5e\x9f\x2d\x20\x04\x92\x07\xda\xea\x10\x50\xa6\xe6\xdc\x44\xfb\xe3\xbb\x4f\x80\x19\x6c\xe3\x01\x82\xcc\xcb\x67\xf4\x27\x3f\xda\x3f\xa5\x0c\x33\xa2\xbe\x91\x99\x38\xcc\x32\xdd\xa8\x5e\x39\xba\xc7\xc2\xbd\x02\xb7\x22\xbf\x48\xda\xc4\x78\x44\x0e\xdf\x62\x4a\x3c\x2f\x24\x47\xa4\xef\xf4\x4e\x2c\x11\x6d\xdb\x81\x78\x46\xa7\x87\xb4\x64\x8c\x15\x7c\xbd\x7c\xdb\x9e\x23\xd4\xb7\xc0\x6b\xf9\x8d\x57\x9d\x70\x9d\x11\xa4\x50\xc6\x52\xf1\xd6\x87\x55\xce\x59\x6e\xae\x5b\xfc\x73\x01\x48\x40\x61\x33\x45\x9f\xd3\x8b\x8e\x39\x3e\x75\x2d\x4c\xf4\x35\x46\xd7\x3a\xb9\xe7\x5e\xfe\xd0\x3c\xff\xef\xe3\xb3\x7e\xf5\x4e\x81\xfa\x19\x21\x66\xe6\xd4\x74\x50\xd5\x63\x64\xcc\x18\x21\xcc\x3d\x79\xc4\x6a\x4e\xac\x96\x1c\x85\x50\x21\x38\xfa\x54\xd8\x5e\x54\x5f\xb6\x0f\x75\x90\x6d\x2e\x01\x8a\xfa\x11\xce\x4b\x29\xb8\x32\x11\x0a\x9c\x80\xa6\xbd\x53\x2f\xf4\x07\x0f\x42\x9a\x6d\xf2\x1e\xec\x79\x97\x74\x7a\x87\xb1\x75\x93\x59\xd6\x58\xe3\x3e\xc7\x87\x7b\x81\xf9\x01\x8f\xaf\xc5\x4c\x1a\x5b\x13\x60\x9e\x6b\xb0\xed\x04\x79\x85\xc2\x2d\xd7\x62\xc1\xbe\xfd\xee\xe4\xef\xff\x78\xf1\xea\xe8\xf0\xc5\x3f\x5e\x1e\x1e\x7d\x7b\x7a\x76\xf2\xf6\xed\xc5\xdf\x2f\x2e\x4f\x5e\xbe\x7d\x7b\x84\x20\xbf\x84\x88\x77\x21\xec\xdb\xb7\xb4\x52\xcd\xdb\xb7\x97\x59\x25\xab\xb7\x6f\xcf\xbd\x0f\x04\x49\x4f\xff\xfb\xf8\x0c\xe4\x27\x02\x33\x85\xa4\x30\x38\x5b\x71\xd0\xa1\xdf\x73\x6e\xda\x14\xd4\xa4\x4a\x74\x0d\xa2\x9c\x75\x8f\xbb\x95\xa8\xe4\xbd\x36\xfb\x1c\x9c\xc1\x9e\xad\xdc\x7b\x69\x5b\xc0\x80\x2b\x61\x6f\x05\x21\x89\xad\xc4\xc1\xe7\xdd\x72\x7f\x4a\x4b\x5f\xc1\x88\xec\x91\x7e\x6e\xa4\xb8\x45\xd8\x57\x39\x53\xbc\x88\x68\xb9\x01\x59\x10\xd1\xe5\x96\xd1\xf6\x41\x49\xaa\x74\x1e\x28\xc8\x3b\x5e\xfb\x25\x8f\x7d\x52\xfc\x89\x7c\x0a\x22\x67\xe7\xa7\xc7\xec\xe9\x04\x95\x9c\xd3\x63\xa4\x77\x59\x09\xf6\xee\x2d\x55\x77\xa0\xe2\xe9\xbb\xa2\x26\xa3\x5d\x00\xeb\x08\xa3\x35\x56\x40\x73\x95\xeb\x92\xcb\x7b\x52\x94\xfd\x4a\xd5\xe5\xb4\x29\x8a\x05\xfb\xb9\xe1\x05\xea\x00\xe7\x3a\x5f\x96\x4c\x3b\x5f\xf9\x8f\xfe\x3a\xf9\x2a\xf4\xe3\xaf\x93\x80\xc0\x00\xc3\xf6\xd7\x89\xb9\xc9\x26\x5f\x11\x46\x21\xa3\x9b\x56\x66\x50\x2f\xd5\xe8\x92\x3e\x8b\xbf\x81\x67\x73\xd0\x77\x3f\x49\x91\x66\x44\xcf\xfc\x4d\xcd\x33\x71\x2e\x6a\x09\x2a\x93\x56\x79\x9f\x92\x4d\xbf\x64\x58\xee\x51\xbb\xa5\x62\x06\x9b\x0d\x43\xa0\x84\xc8\x51\x49\xa4\x5e\x08\x36\x73\x9d\x80\x89\x41\x2d\x10\xa0\x31\xb2\x5a\x70\x4c\xc4\x27\x9c\x0c\x0f\xc5\x3c\x21\xf7\x99\x0f\x0e\x3b\x8d\x5f\x89\x19\x86\x78\x29\x8e\x80\x61\x64\x94\xb2\x08\x9f\x18\x62\x9b\xc6\xea\x8a\xc9\xb2\x14\xb9\x53\x80\x8a\x05\xbb\x91\x1c\x25\x3f\x54\x7a\xe2\x3e\xdd\x53\x9a\x69\xf0\xc6\x37\x4a\x92\x73\x6e\xde\x58\x96\xeb\x5b\xb5\xdf\x12\xf0\xe3\x03\x9c\xb5\x22\x8b\x51\x52\xf6\x0c\xaf\xc4\x2a\x18\xd8\x14\x6d\xc4\xeb\x4b\xd0\xc3\xe4\x36\xd2\x3d\x56\x0d\x1e\x82\x3b\x20\xa8\xa8\x97\x20\x1e\xc1\xbb\x05\x0d\xc0\x90\x93\x50\x96\xf1\x84\x82\x9b\x5e\xca\xcb\x12\xcc\xcb\x43\x29\x16\x37\xe8\x7e\x3d\xd5\x75\x26\xaf\x8a\x05\x9b\xf3\xa2\xa5\xe3\x8e\xc7\x06\xac\xc8\xf8\xf5\x0b\xad\x66\xf1\x41\x8d\xd0\xec\x50\x9f\x2e\xb8\x6a\x2a\x7c\x9e\x3b\xdf\x16\xba\xb9\xc3\x60\xf8\xf2\x89\x7f\xd5\x0d\x80\xa5\xde\x2b\x6c\x64\x75\x21\x70\x7e\xfa\xec\x94\x95\xd5\xe0\xbb\x26\x6e\x7d\x9d\x81\xd8\x44\xcd\xed\xa5\x47\x5e\x71\x2b\xe2\x32\xf4\x1f\x2c\x0d\x6b\x39\x94\xa3\xbb\xdd\x8e\xdf\x40\x2d\xe0\x82\xb9\x53\x8b\x90\xd5\x62\x5c\x03\x5b\xcb\xaa\x10\xec\xab\x6b\xb1\x18\x21\xa6\x2e\x2a\x21\x7f\x8d\x98\xce\x02\x2a\x21\x72\x1f\xe8\x9a\x7d\xe5\xff\xf5\xd7\x4f\x58\xbf\xdb\xc7\x8b\x8a\x2f\xd5\x3b\xf2\x75\x82\x35\x42\x29\xc8\x2e\x8e\x2c\x95\x0f\x59\x8d\xc3\x35\x61\x27\x80\xd6\x80\x1a\x29\xb1\x3d\x15\x45\x72\xb3\x21\xcd\x26\x05\x68\x05\xff\x4b\x54\x3b\x74\xa6\xa9\xc0\x5a\x00\xd2\xf5\x54\xd4\xed\x27\x20\x60\xce\xf4\xc9\x3b\x91\x35\xf6\x53\x02\x46\xe2\x75\x2d\xfa\x73\xe9\x7f\x27\x02\x0a\x38\x8e\x8d\xd3\xc2\x43\xdd\x46\xbb\x3b\xa3\xd4\xbd\xf7\x8f\xed\xb5\x58\x98\xc0\x73\x70\x8d\xad\x13\xc2\x40\x58\xbf\xfe\x20\x3b\x79\x27\x8d\x35\xff\xcb\x13\xf9\x97\x57\x5e\x7e\x63\xd3\x7e\x32\xa1\xf5\x88\xe3\xc2\xfd\x09\x8f\xf9\xd4\x03\xee\x5f\xa0\xf7\xa8\xbf\xf2\x23\x11\xb1\x58\x70\xf7\x4e\xbb\x86\x92\xb7\xb4\x82\x32\xbe\x98\x0e\xa1\x4d\x3b\xc2\x1f\xe3\xfa\xc4\x31\x84\x71\x39\x71\x4a\x5e\x7a\xcc\xd0\x47\x74\x93\x04\x60\x5f\x79\xc3\x0b\xa1\x88\x1d\xaa\xc8\x33\x5e\x63\x88\x9e\x30\xbd\x0d\x11\xcc\x11\x98\xad\x3b\xe3\x48\x92\xb5\xb3\x6c\x28\x94\xc7\x6b\x2b\xb3\xa6\xe0\x35\x73\xfb\x71\xa6\xeb\x7b\x42\x7f\xe3\xd5\x6b\x4e\xda\x25\xba\x96\x3a\x87\x57\x2a\xdf\xbb\x2d\x76\xb9\x46\x48\x7b\x71\x26\x93\x44\xf4\xd2\x78\xa3\xec\xa5\x04\x75\x7a\xea\x65\x53\x10\x14\x31\x5b\x85\x4d\x01\xb3\x66\xe0\xff\xde\x8f\x0e\x8f\xb0\x33\x27\xec\x6f\x01\xe3\x64\xc4\x5a\x9f\x31\x54\xec\xd2\x33\x69\xdb\xd0\x74\xb5\x9b\x7a\xaa\x6b\x71\x23\x6a\xb6\x97\x6b\x84\xfc\xb8\x91\x99\xdd\x9f\xb0\xff\xd7\x69\x8a\xe0\x44\xf6\xea\x24\x6d\xb3\x50\xa5\xdc\x72\x66\x3c\x61\x7b\xf0\xb3\x58\x95\xdc\xf7\x81\x22\x22\xe3\x79\x64\xd9\x30\x3d\x22\xdc\x2b\xa2\xdb\x89\x18\x45\x4d\xb1\xb3\x34\xc2\xc9\xaf\x83\x84\x0c\x32\x51\x1a\xda\xa5\x89\xe7\x36\xc4\x59\xbc\x08\x0d\x0b\xe7\x5f\xe0\xa3\x67\xb5\x98\xc1\xfe\xc3\xdd\xf3\x09\x77\x9f\xd5\x95\x2e\xf4\x6c\x71\x51\xd5\x82\xe7\x47\x5a\x19\x5b\x83\x68\xe8\x43\xb1\x70\x57\x9b\x11\x38\xe7\x5c\xdf\x32\x4e\x09\x6c\x7a\x8a\x24\x15\xba\x99\xcd\x11\x6e\x06\x7e\xc8\x78\x56\x6b\x00\x9c\xc5\xe6\xc8\xe8\x34\x01\xfb\xce\xbb\x0f\x02\x3a\x0d\xb4\x02\x0e\x8f\x5b\xbe\xa0\xcd\xc4\xaf\x64\x2e\x4c\x94\xc1\xed\x3b\x83\xa1\x9f\x3b\xdf\x1f\xa4\xf2\xe1\xd9\xf1\x7d\x79\x4d\x37\xa8\xd0\xde\xf1\x2a\x41\x33\xc2\x51\x6f\xc7\x37\x68\xa4\x30\x6e\xbc\xd4\xa4\xa9\x22\x9d\x92\x1f\x99\x47\x82\x2d\x53\xf2\x77\x17\xd7\xe2\x76\x8d\x5f\xfa\x17\xfd\x4e\xdc\x3f\x15\x6c\x0c\xf6\xe8\x1b\x65\xb8\x95\x66\x0a\x04\xc8\x9f\x50\x1f\x87\x92\x8c\xf5\x78\x5a\xf1\x4a\x2b\x9b\xe2\xd6\x7c\xc9\x7c\xc0\xcf\x4d\x16\x0b\xe5\xff\xb5\x76\x10\xa5\x7f\x42\x89\x48\xa0\x78\x75\x3b\x28\x23\xda\x73\xab\xdb\x38\x34\x46\x2a\x9a\xf2\x4a\xd4\x61\xef\xa3\x33\x40\xd6\x1d\xfc\xc8\xce\xde\x7f\x84\x98\xbd\x30\x3c\x27\xef\x9c\xe6\x61\xd6\x4b\x54\xc2\x2b\x99\xaa\x6e\xa3\x18\x1e\xf3\x09\x9c\x9d\x69\x48\xd8\x83\x09\xeb\xbd\xfd\x64\x5d\x39\xd7\x5e\x7d\x52\x29\xf1\x5a\x3b\xa1\x12\xaf\x6e\x1a\xf9\x9d\xaf\xdf\xa1\x20\x8e\xcb\x21\xc9\x29\x64\x46\xa8\xc0\xa3\x03\x1b\x60\xdb\xe8\x60\x87\x9b\x11\x3c\xd5\x04\xa3\xc8\xdd\x84\xbf\xeb\x4b\x30\xbe\xf6\xfa\xc4\xab\x5f\xbe\x26\x5e\x63\xf7\x4a\xbd\x7e\xef\x07\x6b\xed\x46\xfa\x6e\x36\xbc\xd6\x34\xa8\xdb\x2b\x59\x50\xd7\xad\x69\x8d\x2b\x2b\x31\xad\x5b\x61\xd7\x1a\xd6\xbd\x9e\xdd\x3b\xdb\x13\xaf\x3e\x36\x6e\x7b\x25\x03\xa1\xef\x61\xed\x72\x46\x48\xae\xb4\x3b\x56\xda\xbc\xa7\x6a\xc4\xce\xb4\x75\xff\x89\xcc\xdf\x63\x2d\xcc\x99\xb6\xf0\xc9\x83\x18\x4a\x7c\x85\x01\x07\xd2\x33\x79\x22\x31\x86\x93\x9b\x14\xa2\x75\x27\x9e\x1f\xb0\x15\x86\xc5\xa9\x62\xba\xf6\x23\x16\xac\x0b\x43\x4d\xc4\x61\x05\x42\x20\xbb\xd3\x38\x71\xed\xc4\xe3\xfc\x9e\xe6\xa8\x29\xc8\xfe\xc2\x6f\x00\x2b\xba\x2a\xa0\x40\x20\x6f\x6a\xa4\x91\x72\xba\xa6\x15\x33\x99\xb1\x52\xd4\x33\xc1\x00\xd0\x73\x88\xe9\xeb\x73\xae\xe0\xd5\xf3\x74\x89\x3b\xd3\x63\x2d\xc1\x91\x0d\x2a\xd6\x80\x2a\x00\xb6\x87\xc7\x5a\xc9\xc1\x92\xfa\x3f\xc1\x07\xfd\x7f\x59\xc5\x65\x0d\xb4\x53\x14\x3b\x8e\xbf\xa3\xe8\x4b\xdc\x8c\x6b\x61\xc9\xb7\xc4\x15\x13\x58\xe7\xe5\x5a\xef\x2a\x1e\x23\x76\x0b\x50\xcd\x4e\x26\x06\xf7\xc7\xce\xb5\x58\xec\x8c\x96\x96\xde\xce\xa9\xda\x69\x03\xc3\xc9\x62\x0b\x87\x30\x64\x10\xee\xc0\x77\x3b\x1f\x4f\x57\xe9\x75\xd8\x0e\x41\xda\xd9\xed\xd0\x9a\xeb\xaa\x9d\xbc\xef\xd6\xc0\x74\x64\x4b\xd5\x94\x2f\x93\xf6\xbc\xb6\x64\x49\x49\x6f\x8f\x3f\x83\x49\xff\x45\x84\xb8\x6f\x80\x58\xd6\xc3\x88\x55\x48\x12\x36\x6b\x53\x66\x78\x91\x21\xef\x2e\xce\x2a\x34\xe2\x66\xd3\xdb\x18\x85\xd6\xd7\x4d\xe5\x57\x05\x24\x19\x00\x46\x90\xca\x74\x49\x56\x07\x3e\x1f\x1c\x2b\xb4\xe4\xc6\x14\xc8\xc3\xe5\x1b\x16\x07\xb1\x5d\x26\xe6\x4c\xda\xe1\xe0\x77\x08\xb0\xfe\xf7\x79\x85\x90\xf3\x12\xf7\x8e\xb0\xff\x78\x19\xdc\xe5\x53\x5d\x5f\xc9\x3c\x07\x53\x1a\x1f\x14\x92\xff\x3a\x03\xed\xf6\x44\x62\x7d\x4d\xba\x77\xac\x48\xc9\xef\x9a\x6b\x6a\xd7\x62\x02\x04\xfc\x00\x14\x94\x5c\xbb\x0f\xc3\xa3\xef\x18\xd0\xf0\x86\xe4\xb6\x74\x02\x43\x35\x45\x11\xe0\xb7\xd1\xb0\x40\xaf\x24\x6c\x50\x72\xe7\xcf\xdc\x96\xb5\xe9\x40\xaf\x04\xf0\x5d\x66\x7d\x72\x5d\x49\x5f\xf1\x54\x9d\xeb\x3c\x75\x61\x24\x58\xbe\x54\x0d\xe5\x41\x80\xf7\x22\x34\xe0\x90\x52\xb5\x4e\x11\x6c\xbf\x53\xa6\xc7\xd9\xd2\xf3\x44\xb9\x0b\x5e\x95\x5b\x5d\xca\x6c\x0d\x51\x02\xee\x93\xde\x32\x64\xf7\x25\x36\x14\xb9\xfa\x30\xbd\x60\x56\x0b\xac\x7a\x87\xed\x05\xdb\x8d\x80\xfd\x1b\x25\x6e\x84\x5b\x56\xb9\x34\x04\xbc\xea\xb3\x95\xfe\xb9\xe4\x5d\xf9\xff\x1f\xeb\x33\x6d\xbd\x03\xf0\x9f\xde\x83\x8e\x47\xd9\x3b\x59\x36\x65\x4b\x14\xc0\x72\x39\xf5\xb4\x54\x3e\x49\x2a\x75\x3d\xa4\x1e\x30\xda\x22\x96\xd7\x33\x48\x96\x26\xd7\x83\x3f\xb1\x66\x85\xbe\xe2\x05\x2b\xa5\x72\x8f\xa1\x3c\x88\xe4\xb3\xd0\x13\xfa\xf3\x3d\x0f\x82\x63\x55\xce\xe4\x55\x21\xc8\xb7\xd1\x61\xcc\x8c\x7e\xdc\xb9\x11\xb6\x56\x01\x54\x5c\x73\xae\xd8\x4b\xa9\x8e\xbd\x63\xf4\xb9\xdb\xb2\xef\x78\x59\x15\x02\x6b\xa1\xd9\x97\xe3\x7f\x6b\x25\x18\xe5\xfa\x8c\x98\x9f\x1e\x4a\x01\xb3\x9a\x3d\x1d\x79\x02\x91\x88\x65\x14\xe4\x58\x2a\x41\xbd\x53\xd6\xb0\x2f\x0e\xbe\x38\x78\xfa\xcc\xa9\xa3\x18\xf1\xe3\x86\xb0\xde\x96\x47\xe3\xe9\x84\xfd\xc2\x5c\x0f\x9e\xd2\x7f\xbf\xa0\xff\x7e\xc9\x7e\x61\xbf\x30\x76\xce\xce\x59\xfc\x5f\xf7\x1f\xf6\x0b\x1b\xbb\x41\x88\xba\xfa\x74\x94\x0a\xae\x04\x6a\x9c\xd6\x02\x1c\x23\xd8\x34\x88\x8a\x4c\x97\x02\xba\xfa\xc5\xff\x8a\x21\x9a\xa5\x65\x5a\xd1\x9d\x4f\xf7\xa0\x4b\xfb\xec\x16\xfc\xf3\x25\xbf\x46\xdf\xd4\x61\x66\x1b\x5e\xb8\x87\xef\x7d\x39\x7e\xba\xcf\xb4\x4a\x6f\xbf\x91\x1a\xd8\x78\xa8\x87\x7b\x4f\xf7\x27\x4b\x5d\xfe\x62\x45\x97\x93\xde\x42\x2f\xb8\x5a\x40\xd3\x77\xaf\x77\xbf\xd4\x0f\xd5\xe2\x96\x2f\xc2\x82\xf7\xe7\xe6\x4c\xde\x04\xee\xde\x08\xed\x09\x12\x17\x60\xfd\x4a\x0f\xe0\x87\x8d\x2e\x98\xb4\x13\x76\x6a\x77\x77\x0d\x84\x1d\xd0\x6d\xe0\x49\x86\x8f\x63\x60\x62\x18\x78\x58\x1b\x4f\x3a\x85\x0d\x6b\xc0\x60\x0e\x1a\x21\xba\x17\x4b\x30\x5e\x65\xd8\x25\x03\xa8\x49\xa1\xad\x04\x36\x64\x79\xd7\x77\x37\x6e\xc8\xc1\x7c\xef\xee\xee\x70\x58\x7a\x31\x74\x4d\x2a\x59\xbb\xf3\xdb\x77\x1a\x41\x3a\xa0\x3f\x3d\x19\x1d\x9f\x10\xf5\x33\xec\xed\x4e\xba\x2f\xdf\xee\x40\x1c\x30\xa8\xe2\x04\x15\x40\xea\x0d\xc1\xcc\xfa\x65\x1c\x41\x21\x1e\xaa\xbc\xcd\xbe\x5a\xb3\xff\x40\x48\x0b\xe6\xe7\x0c\x42\x92\xf5\xf2\x9b\x44\x19\x5a\x49\x42\xaf\xdb\x85\x11\xe2\x3d\x3b\xc4\x05\x6c\x20\x8e\xfa\x21\xfd\xba\x73\xec\x22\xee\x03\x50\x98\x42\x3c\xa9\x44\xe6\x4c\x77\x3b\x6d\x6c\x74\x7b\x7b\x26\xcc\x30\xad\xa7\xd3\x15\x29\x75\x6d\xac\x09\x51\x7e\xdd\x22\x81\x12\xac\x78\xfd\x44\x1c\xbd\x4f\x57\x40\xde\xd2\x76\x31\xe9\x70\x3d\xa1\x85\xd4\x3e\x53\x5b\x7c\xee\x0f\x5d\xf9\x11\xec\xf8\xe4\xdc\x04\x2d\x6d\x9d\xc3\xe2\x8b\x51\xa7\xf7\xf4\xf9\x9f\xd6\x39\x43\xbe\x78\x76\xbf\xc3\x81\xfe\x7b\x99\x4c\xf3\xca\xd9\xfd\xd3\x5e\xdb\xcb\x7d\xc8\x85\x58\xb1\x09\xa0\x6e\xaa\x8d\x8b\x4f\xc2\x81\x66\xa4\x6d\x38\x96\x5a\x29\x71\x4b\xf9\xaf\x77\xbf\x54\xa4\x9b\x7b\xe1\x3e\x72\xe7\x0f\x6f\x80\x2c\xb5\xac\x1a\x80\x46\x70\x03\xe9\x35\xed\x2f\xf7\xbe\x64\x63\xf6\x64\xdf\xad\x06\x85\xcb\x0a\x06\x33\x3e\xca\xdc\xd1\x40\xe9\xdc\x76\xee\x94\x27\x37\x32\x66\x84\x04\x9b\x45\xd1\x3d\x84\xee\xa3\x78\x87\xb1\xd9\xac\xd2\xbd\xa9\xb3\x40\xe9\x5c\x1c\x4e\x81\xff\x67\xb1\x2e\xc2\x77\xf7\x4c\x38\x5b\x6a\x33\x3a\x1b\xe6\xfa\x96\xdd\x52\x96\x36\x2c\x39\x2a\x36\x8c\x3b\x72\xe0\xfe\x08\x6b\x0a\xe4\x59\x10\xc9\xa4\x42\x04\x51\x4a\xdb\xc8\xc0\xb4\xbf\x8a\xe1\x8b\xc6\xec\x5b\xad\x74\xfd\x0c\xb5\x23\xd7\xa4\x69\x45\xf1\xdd\x8f\x43\x51\x13\x83\xb9\x24\x07\x82\x71\xea\xcd\x29\x58\x87\xcf\x7e\xad\x95\x60\x43\x42\xc2\x78\x1e\xe4\xd8\xfb\x1a\x47\xd4\xfa\x3b\x32\x93\x03\x42\xfa\x92\x6b\xca\x7d\x0b\xaf\x4b\xec\x64\x93\xce\xfa\xa7\xf2\x54\xbf\xa0\x7d\x8a\x73\x87\x47\xc6\xcd\xdc\xa9\xeb\x9e\x91\x5a\xe1\xd4\xbd\x6f\x5b\x40\x41\xea\xfa\x6b\x7e\x4d\x7b\xcf\x8d\xe4\x25\xe4\x25\x0c\xb9\x60\xe3\x16\xdf\xbb\x5c\x11\xb2\x0c\xf3\x22\x7a\x2f\x4d\x5c\x15\xa1\x7e\x17\x5a\x1d\x31\x5e\x68\x70\xb6\x38\x39\xeb\x3e\x12\x39\xdd\x38\xd5\xde\x27\xb3\xe4\xbf\x98\x43\xc9\x72\x9b\x99\x33\x4a\xd6\x5a\x77\xd1\xfa\x17\xf8\x80\x65\xda\x6b\x49\xe2\x33\x3f\xff\x35\x19\xe5\x4d\x0c\x90\xac\x17\xda\xf2\x46\xf4\xb5\x80\xf3\x0f\x66\x0e\x1d\x55\x13\x18\x17\x32\x67\xa8\x10\x05\x7d\x92\x2d\xe3\xb4\x8f\xca\x22\x19\x72\xc6\x8b\x58\x9b\x72\x1a\x99\xcc\x45\x8d\x07\xec\x95\x48\xca\x96\x42\xbe\x0b\xfb\xa1\xbd\x13\xcb\x95\x20\xaf\x1b\x1b\xfa\x2b\x96\xc9\xef\x5c\x35\xd9\xb5\xb0\xde\x9f\x5d\x43\xa5\x45\xd5\x58\x76\xc5\x0b\xae\x32\xb7\x78\xbb\xf9\x0d\x56\x63\x63\xf8\x4b\x78\x0a\x62\xff\x84\x72\x1a\x6c\x3a\xca\xc6\x94\xca\x58\xd7\x1a\xa6\x69\xb6\x1d\x3c\x2c\x8c\x1e\xb9\x2d\xea\x1b\x58\x76\x26\x40\x53\xf4\x6f\x74\xd1\xd3\x61\x20\x84\xa5\x7a\xbd\xc8\xaf\x4e\xe3\xdc\x39\xc0\xb0\x2c\x3d\x15\x13\x13\x06\xfc\xa8\xa7\xd3\xee\x94\xed\xa4\x45\xa3\xbe\x0e\x69\x67\x84\x6f\xed\x66\x8e\x8a\x78\xc9\xdb\x41\xe4\x2b\xd1\x5b\xa9\x1c\x6a\xdb\xbb\x0d\x87\x3b\xd2\x27\x38\x75\xc8\xb7\x0e\x6a\xeb\xfb\x5b\x3f\xb5\xab\x2c\xde\x4f\xbd\x67\x96\xec\xfb\xfe\x0e\xb7\x65\x95\x3f\x95\xe4\x90\x79\xc3\x0b\x5f\x11\x43\xec\xb8\x84\x8c\xaf\x76\x77\x5b\xcf\x00\x6c\x05\x94\x2c\xad\xed\xe2\xa4\x68\x62\x3b\xb0\x3d\xaf\xfa\x31\x2b\x8a\x02\x37\x6b\x6b\x42\x39\x55\x38\x66\x8c\x93\xd0\x42\xea\xc5\x58\xf9\xc3\x15\x34\x73\xe8\x28\x5b\x04\x4c\xcb\x11\xbb\x6a\x2c\x9b\xc9\x1b\x77\x00\x7c\x90\xd3\x03\x1d\x3b\x73\x51\x54\xac\x16\x79\x93\x11\x96\x03\x9c\x4e\x87\xb1\x85\x06\x99\xeb\x41\x3a\xec\x24\x03\xba\x83\xb4\xa7\x2a\x3d\x7c\xe4\x14\x36\x08\x28\x5a\x72\xca\xc4\x8d\xa8\x17\xac\xd2\xc6\xc0\x36\x04\xb1\x85\x05\x8d\x10\x3b\x0b\xf0\xdb\x60\x4d\x40\xaf\xbc\x02\xbf\x43\x1a\xfc\x0e\x58\xb8\x3a\x11\x45\x9f\xc6\xa1\xf7\xe5\xc1\xd3\x83\xa7\xef\x37\xc6\xce\xe1\x7f\xad\x87\xce\xff\xf7\x74\xba\xc2\xe6\x6c\xfb\x92\xac\x9c\xfb\x38\xf1\xbe\x00\x5f\xdb\x97\xfb\x91\x2f\xef\xcb\x83\x2f\x0e\x9e\xee\xb9\xbe\x7e\xb1\xef\x7a\x1d\x79\xe9\xbe\x88\xbc\x74\xe1\x97\xd4\x23\x61\x12\x3f\xdd\xa9\xa2\xea\xd5\x5b\x5d\xe7\x94\xa5\xeb\x2b\x21\x5d\x8f\x10\xf9\xd0\x9d\x0d\xa5\x97\xe5\xb8\xec\x52\x2f\xc1\xae\x45\x77\xa1\xb4\xec\x0f\xa5\xae\xc5\x1f\xa2\xfb\xef\xf4\xaf\xad\xef\x36\xdb\x30\xf9\xdb\xfa\x29\x92\x7d\x13\x24\x87\x61\x91\x43\x06\xa2\x3e\x39\xcd\xbb\x2f\x3c\x71\x27\x36\x45\xc9\x63\xe8\xd4\x2d\x29\xc9\xf1\x6a\x11\xd7\x44\x5f\x09\xa7\xd2\xa2\x0f\xac\x05\x4e\xbc\x27\x51\xb1\xb1\xba\xe6\x33\x71\x40\x8f\x5d\xa7\x82\x79\x13\xb9\xc8\xdf\x23\xe5\x53\x92\x29\x84\x90\x54\x44\x06\xe5\xcb\xd2\x7d\x0e\x29\x48\x01\x9e\x41\x45\x27\x0c\x64\x02\x7a\x1a\xd5\x8a\x3e\x92\x74\xe4\x4f\x4c\x75\xc9\x6f\xcd\x49\xc1\x8d\x95\xd9\xdf\x0a\x9d\x5d\x5f\x58\x67\xf5\xf4\x56\x2d\x56\xb5\x9a\xcc\xa9\x62\x87\x3f\x5c\xb0\x63\x69\xae\x5b\xbe\x67\xcf\x81\x1f\x17\x51\xf2\x80\x5d\x4d\x78\x1a\xac\xe4\xd9\x1c\x55\x57\xf2\x41\x7b\xfe\xb2\xe1\xf6\xca\xef\xf8\xad\x11\xd8\x7d\xe0\xd3\x75\x5f\x8b\xf5\x45\xf0\xc6\xb0\x34\xf1\x75\x4e\x8f\x37\x90\xbc\x3c\x35\x97\x6b\x03\x75\x2f\xb3\xe0\x79\x3a\x05\xc4\x85\x28\x04\x56\x1b\x21\x26\x79\xca\x6c\x07\x6b\x68\xa1\x1b\x76\xcb\xd1\xae\x06\x09\x3b\x61\x97\xb2\x7a\xc6\x4e\x22\x8e\xa8\x55\x4d\x39\xed\x23\x20\xd2\x92\x41\x0d\x6b\x0e\x93\x91\x9c\x40\xa6\x3a\x27\x76\x82\xaa\x95\x79\xc6\x76\xc4\x3b\xfb\x1f\x3b\x23\xb6\xf3\x6e\x6a\xdc\x7f\x94\x9d\x02\xa7\x1c\x71\x88\x3b\x1d\x4f\x4d\x45\xdd\x9a\x8e\xf8\x83\x65\x30\xa8\xe1\x97\x2c\xbb\x7c\x75\xfc\xea\x19\xe8\xf2\xb9\x76\x56\x5f\x55\x8b\x1b\xa7\x53\x12\xb4\x19\xc9\xc6\x68\x18\x20\x7d\x26\xd3\x65\x55\xeb\x52\x46\x05\xc8\xb0\xe5\xd6\xd9\x01\x6c\x88\x0c\x38\x30\x6c\x61\x31\x0c\xb2\x9e\x42\x73\x7e\x49\x45\x1f\xa8\x0f\x59\x4c\xa7\x53\xa6\x31\x51\x20\x85\x40\x90\x26\xdc\xe4\x96\x0f\xb5\xa2\x00\x57\xaa\x5d\x30\x4e\x33\xa7\xaf\x0e\x72\x71\x73\x60\x72\xfe\x74\x04\x8f\xc1\xd5\xb0\xe8\xf4\x89\x1b\xb6\xf3\x74\x67\xc2\x2e\x64\x29\x0b\x5e\x17\x44\xd5\x4d\x4d\xb4\xf7\x39\x43\xc1\x37\x08\xe6\xef\x93\x1d\xb6\x87\x18\x04\xa0\x6e\x14\xc2\x23\xd2\x05\x04\x56\x48\xd2\xd9\x5f\x4b\xbb\x64\x03\x38\xe3\x59\x6f\x87\x3c\x03\x29\xc9\xf3\x57\xaa\x58\x3b\x73\x3b\x5d\x1c\xbe\x35\x5f\xc0\x57\x37\xe4\xcf\x9c\xea\x9a\x8c\xc0\x70\x8b\x07\x3a\x92\x8a\xd4\x96\x97\x6e\xea\xcd\x83\x39\x7e\xd8\x00\xe0\x7b\x2c\x9c\x22\xc3\x8c\xaf\x6f\x0d\x52\x11\x90\xe3\xfa\xf4\xd8\x0b\xf1\x4a\xd4\x46\x1a\xeb\x44\x54\x9e\xa8\x06\x12\xf5\x85\xbd\xc3\x92\xff\x5b\x2b\x76\xf2\xb7\x0b\xea\xd6\xfe\x03\x1c\xec\x35\x25\x1d\xff\x77\x53\x0b\xa7\x11\xf5\x56\xbf\x42\x4b\x5d\x95\xcb\x7d\xce\x8e\xb9\xe5\xa8\x79\xa1\xa4\xd2\x2d\x38\x18\x72\xec\x43\xd1\x96\x47\x7e\x5b\x53\x79\x66\x9b\xd7\x7e\xdc\x0a\x3a\x5b\x1f\x4d\xdc\xfd\xfc\xcd\xeb\xd3\x0d\xe8\x4e\x19\x1c\xb7\xb3\x97\x3a\x1f\x48\x81\x8a\x1a\xf4\x47\x1e\x80\xb5\x1e\xe1\xe7\xac\x74\x4f\x62\x67\x5a\x89\x11\x7b\x2d\x78\xce\x9c\x74\xa3\x7f\xfe\x50\x4b\x7b\x5f\xfc\xab\xf6\xea\x7d\xf4\xfb\x49\x1c\x64\x20\x7c\x63\x7e\x10\x62\x86\x7e\x00\xe8\x04\xa1\x43\x3a\xc0\x55\xa1\xaf\x18\x09\x8b\x4d\xbe\xfd\x9b\xd7\xa7\x83\xbd\xfc\x9b\xd7\xa7\xfe\xdd\xdd\x3f\xf5\xf4\x61\xbe\xf6\x80\xc6\x43\x6b\x3b\x3c\xef\x28\xfb\xad\x3a\xd7\x12\x29\x75\x0d\x82\x0f\xb7\x06\x26\x43\xd9\x01\x9b\x1a\xf3\x6b\xa9\xd6\xae\x01\x4c\xa5\x0d\x90\x28\x05\x48\xac\x28\x88\x06\x48\x7c\xf9\x33\x56\x36\x85\x05\xd4\x23\x58\x6b\x6e\xf1\x41\xb6\x98\x5f\x75\x8c\x10\x40\x19\x3b\x16\x18\x8e\xc8\x9f\xf9\x3a\x94\xf0\x8b\xd5\x3f\x78\xc9\x15\x9f\xb9\xdb\xe1\x04\x64\x25\xfe\x19\x2d\xf2\x3d\x74\xba\xab\xf0\x15\xbf\xe1\xb2\xe0\x57\xb2\x90\x16\xf4\xb9\xfd\x89\xd7\xe6\xb1\x54\x01\xba\xbc\x31\xe9\x37\xa8\x6a\x1b\xd4\xd6\x18\x1f\x06\xe0\x0d\xd9\x9e\xfb\xee\xe0\xd6\x89\xfa\xfd\x09\xc8\x7d\xb8\x11\xd0\xe8\x3b\xca\xef\xeb\x5f\x53\x7e\x37\xa2\xa7\xc2\x7c\x3f\x5f\x93\xe1\x6d\x59\x77\x72\x2d\xad\xd4\x9d\xe0\x0b\x02\x1d\xfd\xcc\xd5\x27\x64\xd9\xef\xa1\x40\xc1\xde\x59\xf3\xf7\x7d\x55\xa8\x8f\xb3\x71\xf2\xcf\x6f\xe3\x30\xe4\xc2\xa4\x99\x1e\x64\xb8\xda\xe6\xbc\xae\x11\xc0\xa5\xf1\xab\x4e\xf9\x3c\xee\xac\x0b\x92\xe5\x1e\x74\x1a\x7e\xef\xf6\xd3\x3a\xe0\x1a\x78\xf5\x16\xbf\x61\x05\x0f\x33\x2e\xbe\x35\x3f\x2c\x78\x48\xc1\xc7\x6c\xed\x7d\xd6\xf3\x35\x33\x51\xcd\xa7\xfd\x33\xdb\x5d\x33\xcf\x2f\xd2\xa8\xcd\x91\xa8\xe6\xec\xf9\xc5\x0a\x31\x89\x55\x05\xee\xbd\x0d\xc6\x72\x76\x0d\x2b\xe4\x54\x58\xb9\xd6\x20\x6c\x58\x50\x96\x5a\x49\xab\x6b\xb3\x01\x31\xe7\x1f\x3d\x8c\xe2\xe6\x5b\x73\xeb\xf3\xb5\x1f\x14\xf6\x32\xfa\x94\xb3\x4c\x17\x85\xc8\x7c\xae\x3f\x4c\x71\xf8\xd9\x0a\x47\x0c\x65\x20\x98\xc9\xf5\x5f\xc0\x15\x43\x4e\x97\x03\x5c\x76\x07\xaf\x4f\x0e\x8f\x5f\x9e\x4c\xca\xfc\x77\x73\x7d\x3b\xb6\x7a\xdc\x18\x31\x96\xb6\x9f\xbe\xb5\x41\x3c\x91\x01\x3c\xdd\x76\x3e\x94\x93\xdb\xce\xdd\x94\xb5\xa0\xd6\x6f\x4c\x0b\x3b\xef\xe3\xce\xb5\xd6\x76\x19\x78\x7e\xda\x14\x05\xce\xad\xad\x85\x18\xc5\xfe\xed\x7b\xc2\xf2\xb7\xd7\xc3\xd2\x85\x5b\x37\x6f\x32\x44\x1f\x57\x33\x7e\x28\x1b\xa4\xbf\xae\xb0\xae\xa6\xcd\x96\xe6\xa1\x6d\x2f\x9d\x89\x8b\xe4\x73\x0c\x88\xd8\xb9\x9b\x97\x6b\xb1\x60\x00\x1d\x31\xd5\x35\xd0\xb8\xa4\xeb\x53\xd8\x0c\x06\xef\xa0\x31\xa2\x9e\x90\xc2\xf1\x40\x06\xbe\x8f\x2a\x02\x2f\xf2\x5a\x4c\x87\x1c\xf6\xd7\x62\xba\x6a\xd4\xe9\x63\xc0\xba\x0d\xe9\x71\x4e\x5f\x69\xec\x1c\x73\x63\x11\x63\x1b\xc7\x76\xe5\x34\x10\xf6\xc7\x03\x19\xf7\x5e\xa8\x0d\x43\x20\x0b\xf5\x61\x88\x64\x4b\x93\x17\xbb\x2d\x69\x92\xec\xbd\xc3\x20\xfa\xc6\x59\xb1\xe2\xf6\xe0\x56\xd7\xd7\x52\xcd\xc6\xb7\xd2\xce\xc7\x38\x52\xe6\x00\x10\xff\x0f\x7e\x07\xff\xa1\x28\xf2\x61\x9e\x53\xfe\x5b\x63\xc4\xb4\x29\x30\x33\xcd\x4c\x18\xaf\xe4\xf7\xa2\x36\x90\x65\x79\x2d\x55\x3e\x62\x8d\xcc\xbf\x5e\x77\xc6\xd8\x10\xbb\xc5\xed\xfd\x61\x36\x0a\x70\x3a\x49\x43\xcc\x8c\x74\x8c\xd6\x5e\x26\xd5\x3c\xd7\x06\x79\x9f\xdc\x50\x25\x5b\x80\xe7\xa5\x54\x0f\x65\x07\xac\x6b\x1d\x48\x95\xaf\x37\x92\x9d\x00\x04\xb4\x93\x9a\x07\xf4\x19\x85\xb1\x43\xce\x0f\xf7\xde\x13\xa4\xbd\xa7\xec\x9f\x34\xf7\xe7\x83\x04\x4b\xb9\x30\x3f\x17\x63\x7c\xca\xb8\xca\xdb\x71\xdd\x26\xf2\xdc\xe7\xfa\x74\x89\x3c\xc3\x3a\xe4\x3f\x41\x7a\xce\x47\x5d\x71\xec\x01\xeb\xcc\x1f\xd7\x0f\xb6\xc1\xa1\xee\xaf\x19\x7f\x1c\x0d\xad\x3d\x7d\x80\x93\xd0\x78\xa0\x3c\x50\xc0\x50\x2a\x79\x7f\x1a\xe4\xc8\xb7\x24\x58\x1e\xed\x21\xd3\x4a\x11\x3f\xc2\xab\x4a\xa8\x0b\xcb\xb3\xeb\x9e\x51\xdd\xad\x56\xf5\x1b\xd3\xaa\x3e\x52\x22\x90\x5f\xa2\x58\x78\x47\xe9\x6f\x6d\xb2\x37\x6e\xf2\x47\x28\x80\x91\xec\xef\x25\xaf\xfa\x7b\x57\x7d\x4b\x1d\x0d\x2a\x7c\x4c\x0e\x55\x28\x0e\xaa\x74\x05\x60\x63\x54\x82\x0a\xe3\xf8\xe9\x35\x9e\xbe\xfb\x9b\x8e\x98\xe1\x72\x60\xa2\x06\x53\x89\x5a\xba\x4f\xae\xa4\x6d\x65\xa5\x11\x16\xa1\xa0\x08\x22\x59\x2b\x96\x11\xdc\x03\xe8\x23\x11\x88\x41\xa4\xab\x28\xa6\x33\xeb\xab\x46\x03\x6a\xd4\x93\x27\x4f\x9e\x20\x12\xce\x7f\xfe\xe7\x7f\x32\x5d\x03\x17\x69\x26\xcb\xe5\x1b\xe1\xae\x3f\x3d\x7d\x3a\x61\x7f\x3f\x7c\xf9\x02\x2a\x1a\x2a\x6b\x10\xf5\x0d\x5b\x76\x37\x24\x3f\x36\x23\xf6\xbf\x2f\x5e\x9d\xb5\x18\x0d\xe9\xb7\x60\x9a\x87\xd7\x4b\x79\x41\x9e\xfc\xf9\x3f\xfe\x63\xc2\x8e\x65\x0d\x15\x5d\x52\x04\xce\xf9\xe0\x6a\xe1\xb5\x40\xe4\x1e\xc0\x50\xf1\x1a\x97\x0c\xf4\x8e\x54\x9f\x5c\xca\xd9\xdc\x52\x45\xac\x5b\x90\x85\xcc\x2c\x16\x8f\xa1\x58\xf3\x94\xf6\x48\x29\x42\x24\x3d\xa4\xfd\x41\xe7\x46\xac\x90\xd7\x82\x4d\xcd\x37\xb5\x6e\xaa\x16\xe6\x91\x88\x98\xa9\x50\x06\x1b\x6b\xe7\xca\x08\xfb\xc8\xd3\x56\x7b\xb9\x9a\x93\xb5\x0d\x2d\x75\x14\x56\x2a\x6f\x6d\xa1\x0e\x2b\x2e\x43\x31\x0c\x64\x00\x26\x1c\xa0\xc1\xd7\x93\xb3\xa3\x20\x55\x3c\xe6\x48\x55\xeb\x7f\xe1\x12\x80\x5a\xe4\x48\x3c\x43\xad\x30\xcc\x24\x55\x0a\x47\xd1\x2d\x5f\x4f\x4d\xa4\xf3\xfe\x63\x62\xb2\x59\xa6\x03\x2b\xa4\x71\x8f\x00\xb0\x9f\xf7\x3c\xb9\xe5\x32\x76\xab\xd4\xe0\x7a\x69\xd4\xd2\xaf\x09\x58\x85\xc4\x25\x91\x80\x12\xbe\x62\xdb\x06\xc2\x03\x10\x0e\x0e\xdd\xeb\x47\x29\x0c\x44\x92\x6f\x6d\x84\x6d\x68\x68\x20\x8b\xde\x3d\x1b\x08\x2a\xe1\x0d\x4b\x5e\x5f\x3b\xc3\x95\xa4\xcb\x84\x9d\xbb\x4e\x06\x28\x1d\x04\x3b\xbe\xc1\xc0\x66\xc9\x17\xf0\x58\x52\xdc\xe0\x21\xbb\x93\xc9\x2e\x6e\x3f\x5d\x33\x63\x79\x4d\x7b\xc9\x7d\xfe\x79\xa0\xac\xbf\xe4\x95\x41\xd4\x5f\xa7\xa9\x02\x22\xb6\x86\xda\x75\x3b\xf7\x22\x88\xd3\x58\x6f\x91\xd1\xd9\x18\x06\x66\xed\x06\x1e\x38\x2a\x3a\xcd\x3e\xed\xf2\x07\x01\xd9\x5d\xf6\x50\x38\xf0\xea\xc6\x54\xf3\x4e\x64\xe3\x83\xf4\x0d\x62\x85\x2a\xc4\xa3\x52\x30\x56\xb3\xc0\x92\xe0\x8c\x15\xb0\x98\x1e\xf4\xf1\xea\x11\x78\x0d\xa1\x4d\xe0\xd5\x5f\xa7\xc0\xab\x4f\x10\x19\xaf\x64\x0d\xfb\x48\x32\x0e\x26\x1d\x60\x78\x46\x4d\xdb\x29\x00\xae\xbe\x2a\xda\xd6\x48\x6c\xeb\x09\x9a\x15\xe3\x57\x46\x17\x8d\xc5\x9f\xb6\x5f\xc6\xa7\x1f\x34\xea\x31\xc3\xe1\xc8\x0b\xb7\x45\x67\x21\x68\x01\x78\x7c\xf4\x39\x16\xf1\xea\x2d\x36\xfa\x38\x21\x7e\x43\x0e\x88\xde\xe3\x1c\x0c\xb6\x21\xc6\xda\x37\x16\x2a\xee\x6e\xe7\x82\x52\x20\x22\xbd\xcf\x49\x53\x27\x23\x40\xa9\xf4\x2a\x1c\x02\xe7\xe4\x1b\x71\x33\x66\x46\xf6\xf7\x25\x18\xc9\xf6\x8e\x42\x79\xbc\x4f\xbb\x3b\x55\x56\xd4\x53\x9e\x89\xfd\xd8\xc7\x20\xaa\xb9\x28\x45\xed\x06\x8a\xee\xf3\x35\xda\x73\xae\x72\x82\x9d\xca\x44\x0d\x3b\x58\xbc\xb3\xa2\x76\x83\x7a\x74\x71\xca\xf2\x5a\xde\x88\xda\xb0\xbd\xbf\x01\x9c\x20\xc2\x4d\xed\x3f\xc2\x34\x58\x7c\x91\x4d\x78\x40\xe0\xc1\xc3\x94\x7e\x40\x53\x5e\x86\xab\x48\xce\xb4\x53\xe5\xb1\xb1\xdc\xb4\x9a\xd8\x77\x34\x71\x1b\x02\x8e\x50\x90\xbe\xc0\x68\x8d\xb1\x4d\x0f\x66\x0f\xc4\x5b\x99\xc5\x86\xb9\x61\xb5\x98\x39\x6b\xac\x8e\x40\xfb\x10\x26\x65\x63\xc5\x0d\xc3\x17\x94\xb4\xc1\xaa\xf7\xd5\x7e\x4c\xc9\xae\xd4\x37\x32\xf7\xea\x10\x02\xe3\x07\x68\xb8\x8a\x9b\x08\xbc\x80\x1b\xa3\x33\x09\xae\xa6\x68\x6a\xd0\x4a\x05\xa5\x29\xa5\x42\xf3\xe1\xe6\x38\x4c\xa6\x81\x50\x68\x2d\x1e\x56\x36\xc8\x81\xa8\x73\x71\xde\x5c\x15\xd2\xcc\x2f\x06\x0d\x89\xac\x6a\x18\x93\x12\x97\x32\x55\xee\x8c\x8c\x18\xa1\x8c\x24\xda\x7c\x54\xb7\xa4\x06\x96\x05\x37\x0d\xfe\xd7\xf1\xa6\xd0\x50\x0d\x0f\x64\xfc\xfe\xab\xb3\xb6\x1f\x04\x56\x82\x2c\xd0\xb9\x78\xa3\xaa\xe4\xf3\x8c\x17\x85\x21\xfd\x36\x70\x9c\xf8\xb3\x07\x35\x54\x0f\x60\x82\xab\x42\xba\x05\xe3\x7b\x0f\x29\x38\x28\xbc\x02\x21\xcf\xca\x17\x33\x11\xdc\xb0\x56\xfe\x26\x20\xb3\xf6\x3f\x08\x23\x84\x95\x38\xb8\xe8\x36\x48\x85\xb2\x0d\xff\x3c\xbe\xf0\xcf\xc7\xa9\xa9\x68\x29\x46\x39\x7c\x38\x86\x0a\x2d\x0c\x6d\x34\x44\x9b\xeb\x0f\x1a\x7f\x20\xfd\x4a\x9a\xe6\xc6\x42\xc0\xd8\xbf\x43\x4b\x5c\x14\xc3\x78\x77\xbb\x8d\x82\x2a\xe6\x4c\x71\x90\x50\x63\x1a\xbf\x2c\xda\x52\x64\x23\x87\x7d\xbe\x2c\xd7\xda\x33\x1d\x8e\x73\xfc\x70\xd7\xb0\x5c\x67\x8d\x33\xbe\xda\x61\x6f\x13\x2e\xfa\xb1\x15\x7e\x5e\xf4\x49\xb9\xbe\x55\xb7\xbc\xce\x0f\xcf\xd7\xaa\xcd\x4d\x95\xb3\xb6\xad\x58\xf5\xf6\x1f\x33\xf7\x39\xbf\x02\xc0\x5b\xc2\x36\xdc\x46\xfb\x56\x36\x11\x4b\xf3\x55\xee\x36\xab\x9d\x90\xfd\xc0\x68\xde\x7d\x1d\x76\xdb\x00\xe1\x36\x40\x98\x5c\x0f\x29\x40\x78\x8a\x01\xc2\x98\xe9\x37\x11\x2f\xe4\xa1\x75\x23\xfe\x59\xc4\x98\x8e\x5b\x91\x8a\x9a\x78\xb7\x9e\xb7\xa3\xfc\xe3\xe6\x6d\x57\x5d\x64\x30\x78\x99\x0b\x7a\xd9\xe7\x10\x8f\x7a\x00\xf1\x24\x18\xcb\x1e\x56\x21\x5e\xa9\xc0\x6f\xeb\xd5\x10\xa5\x16\x03\xd3\x51\x84\xbb\xd2\x39\x71\x1b\x00\xe9\x06\x12\x08\x8c\x02\x33\xa0\xf2\xe5\xa6\xa0\x9d\x57\x3c\x13\x20\xdf\x82\xfa\x33\x48\x90\xa0\xe7\x02\x60\x03\x2d\x02\x06\x0b\x01\x46\xe7\xbc\xcf\x6a\x60\x83\xad\x08\x77\xb5\x16\x4f\xdf\x96\xba\x88\xa2\xd8\xaa\x5f\x08\x26\x9b\x8b\x92\xc3\x3f\x9f\xfb\x21\x70\xb2\xd1\x19\x0f\x56\x20\x04\x9c\xa8\x4b\xc3\xf4\x74\x94\x64\xba\xee\xdc\x3c\xdd\xe9\x17\x6c\x60\xc3\xc5\x29\x99\xdf\x47\xe7\xbd\x83\x3d\xac\x3b\x60\xe7\x49\x6c\xc7\xed\xa1\x96\x03\xd3\xe3\xde\x87\x0c\x0a\x38\x3f\x70\x84\x1f\xcc\xe0\x0c\x1d\xc4\x5d\x37\x78\x3b\x0a\x51\x83\x47\xa0\xfc\x6d\x83\xb7\x9f\x63\xf0\x36\x3a\x18\xbd\xa0\x5b\x11\xc8\x8d\x43\x02\x3e\x9a\x7b\x25\xbc\x51\x43\x36\x8c\x0f\xe5\xfa\x38\xae\xae\xd3\xd4\xa5\xdd\xc9\x64\x77\xd7\x47\x77\x69\xdd\x37\x76\x3a\xfe\x0b\x13\x2a\xd3\xb9\x27\xf0\x9d\xca\xda\x58\x50\xf7\x5a\x77\x5b\xdc\x97\xd2\x3f\x2b\x4e\x7f\x82\xb6\x87\x98\xea\xde\xb2\xc5\x43\x12\x3e\xff\x08\x4a\x4c\xab\xba\x04\xe0\x43\x1a\xa2\x80\x67\x4d\x3a\x8c\xff\xde\xb0\x42\x96\x92\xf8\xef\xdd\x46\x17\xc6\x1a\xb6\x87\x1f\x4e\xb2\xaa\x19\xd1\x0d\x93\x52\x94\xba\x5e\x8c\xc2\x4d\xee\xcb\xe4\x57\x74\xc7\x3e\xf2\x9d\x34\x75\x2d\x94\x2d\x16\x9f\xb3\x06\xe4\x07\xf1\x81\x28\x40\x61\x8e\xfb\x20\x8e\xb4\x57\xba\xb4\xda\x88\x2f\xb8\xcd\x23\x7e\x81\x80\x46\x6b\x46\x6d\x5c\xdc\x7d\x2a\xd4\x0d\xbb\xe1\xf5\x3d\x91\xe3\x57\x5d\x03\xea\x3c\xb9\xbc\x91\x46\xaf\x1d\x16\x8d\x1a\x8a\x87\xe7\x22\x38\xa1\xdd\x66\xd3\x8d\xad\x1a\x4b\x12\xdd\xef\x40\x8f\x32\x1e\x76\x5e\x47\x39\x7c\xba\x0e\x8b\x52\x7a\x55\xdc\x5a\x51\xab\x67\xec\x7f\xf6\xde\xfe\xf1\x97\xf1\xfe\xd7\x7b\x7b\x3f\x3e\x19\xff\xd7\x4f\x7f\xdc\x7b\x3b\x81\x7f\xfc\x61\xff\xeb\xfd\x5f\xfc\x1f\x7f\xdc\xdf\xdf\xdb\xfb\xf1\xbb\x97\xdf\x5c\x9e\x9f\xfc\x24\xf7\x7f\xf9\x51\x35\xe5\x35\xfe\xf5\xcb\xde\x8f\xe2\xe4\xa7\x0f\x6c\x64\x7f\xff\xeb\xdf\xf7\xee\x3a\x57\x8b\x57\x3d\x45\x21\x5e\xe3\x01\x8f\xe4\xb4\xc5\x41\x96\x5f\x87\x56\x42\x2a\x3b\xd6\xf5\x18\x9b\x7e\x06\x60\xc1\x3d\x1f\xe0\x97\xd7\xd0\xfb\xbf\x55\x03\x5a\xb8\x7d\xaf\xd4\x6f\x78\x83\x43\xe8\xf3\x58\x0e\x50\x66\xec\x5b\x4a\xcb\x64\xac\x28\x2b\x5d\xf3\x7a\xc1\x72\xf2\x66\x2e\x56\x20\x10\x45\x10\x44\xbd\x21\x85\xa1\x1f\xb9\xac\x37\x50\x69\xdc\x1b\x51\x48\xe4\xb2\x29\x07\xc2\x13\x82\xb6\xe2\xc9\xb8\x05\xe4\x7d\x42\xed\xf7\x29\x45\x74\x1b\x05\x34\xae\x78\x76\x8d\x16\x54\x98\x2d\xd4\x1b\xa3\xd2\xfa\x9d\x1d\x4a\x89\x28\x05\x57\xc1\xb1\x0f\xb9\x2d\x3a\x17\x6e\x2a\xfd\xcd\xd8\x76\xe2\x84\xc7\x48\x3b\x25\x10\xb6\x8c\x54\xba\x66\x2f\x41\x01\xda\xe8\xec\xb3\x41\xb0\x42\xe4\xbf\xc5\x0b\xa7\xf5\x0d\x54\x89\xea\x9b\xf3\x09\x44\x56\x83\xbd\x49\xb8\x5e\x53\x20\xd9\x6a\x33\xc4\x12\xcd\x02\x26\xf2\xc4\x6f\x4b\x1f\xbf\x75\xd3\xe9\x5a\x45\xdd\x14\x1c\xd3\x85\xc1\xbc\x15\x99\x01\x0f\x14\xd8\xa6\x30\x1d\x61\x0a\x2f\x23\xa2\xfe\xc6\xb8\x27\x69\x95\xde\xd3\x3e\x08\x69\xb2\xae\x70\x4d\x78\x76\xed\xd4\xa2\x76\xdf\x5c\x84\x37\x6b\xfd\x19\x50\xb2\xec\xcd\x4f\xd3\x80\x91\x42\x4f\x21\x55\x5b\x4f\x21\xb3\x22\xe2\xeb\xf1\x94\x34\x4b\x0b\x55\xc9\x22\x5d\xa9\x9e\x79\x22\xbc\x78\xa3\x28\xa1\x70\xe3\xcb\xee\xd1\x69\x1f\x3d\x75\x8e\xa1\x34\x8d\x41\xf4\x8b\xc1\xb5\x8a\x90\xb9\xd9\x9f\xef\xb5\x4d\x02\x4d\x8e\xd5\x98\x23\x23\x4d\x08\xe5\x81\x16\xcd\xcb\x04\x9f\x75\x70\x19\x3c\x4a\x74\xdc\x66\x8b\x8c\x10\x9e\x64\xc2\xe0\x83\xcd\xe2\xd6\x80\xda\xaa\x71\x60\xaf\x6e\xfd\x12\xec\x4a\x4c\x31\xf1\x09\x7f\x03\x0e\x03\xaa\x08\xcb\x45\x21\xac\x88\x68\xe7\x2b\x24\xca\xae\x45\xa9\x6f\x88\xa6\xf5\x8d\xa1\xb0\xb9\x9c\x3e\x63\x7c\x3f\xa9\x3b\x36\xc4\x83\x2c\x44\x8e\x65\x62\x11\xb7\x60\xdd\x28\x33\x62\x57\xfb\x3e\xad\x95\x58\x30\x6b\xf0\xad\x11\xc9\x17\xb8\xb3\x6a\xe1\x06\x00\xb0\xaa\x6a\x5d\x32\xa3\x78\x65\xe6\xda\x82\xe7\x84\x57\x3c\x93\x76\xc1\x6c\xcd\xb3\x6b\x77\x0b\x84\x53\xe1\x71\x23\x96\xed\x53\x96\x7b\x3c\x7c\x69\xe5\x9a\x9d\xd7\xba\x99\xcd\xa1\x94\x0a\xef\xca\x0a\x6e\xfc\xdb\xaf\xfc\x3d\x99\xf2\x86\xe5\x0b\xc5\x4b\x99\x05\x0a\x91\x5a\xdf\x48\x23\x35\x05\xbc\x7c\xbb\xe7\x81\x8c\x01\x83\x68\x47\x05\x97\x25\xdb\x33\x42\xb0\x13\xbf\x24\xf0\x9b\x0b\x54\x28\xd1\xa1\x58\xa7\xb9\x75\x84\xfb\x48\xf8\x03\xee\x93\x56\x02\x87\x8c\x05\xd4\x09\x5c\xcf\x57\x3e\x74\x3f\x4c\xd7\xea\x3e\xe9\x1a\xf2\xde\x3c\x13\x90\x50\xb9\x8e\x12\x63\x0e\xcf\x4f\x4d\x6c\xe6\x12\x9b\x22\xb6\x04\x5f\x14\x5a\xcd\x62\xfc\xbb\x76\x65\x3a\x59\xaf\x80\x16\xf3\x46\xe6\x0d\x2f\x50\xca\x53\x67\x8e\x2e\x4e\xf1\xe7\x72\x36\xb7\xe3\x5b\x01\x4e\x50\x3c\x0c\xdb\x3d\xe3\x1f\x2a\x97\x12\x6e\xa5\x81\x53\xc1\x92\xb3\x0d\x1d\xca\x40\x3d\xc9\x17\x80\xbf\x4b\x39\x9e\x49\x4e\x8e\x47\xab\xc7\x26\x56\x8d\x38\x74\xef\x30\xf0\x24\x3a\xcd\x08\xbc\xc4\x6e\x88\x61\xa5\x2e\xf7\x0d\x48\x1f\x5b\xea\x8d\xf0\xb1\x6d\x09\x20\x41\x2f\x5e\x9f\x28\x78\x63\xfa\xec\x4d\xbb\x4c\x2e\x45\x59\x15\xdc\x0e\x93\x61\xb2\xf3\x43\xe4\x05\x8f\x62\xc8\x6e\x3b\x72\x95\x8f\x79\xe1\x56\xe4\xf9\xf7\x47\x54\xe0\x86\x1b\x2c\xc9\x62\xbb\x6c\xa9\x4a\x3d\x4b\xb5\x53\x96\x56\x6e\x2d\x80\x54\xbb\x12\x39\x08\x23\x7a\x32\xb8\x2a\x6e\x15\x52\x05\xbb\x3f\xce\xbf\x3f\x1a\x31\x39\x11\x13\xff\x57\xb8\xd5\x4b\x43\xab\x67\x58\xe7\x10\x0a\x69\x60\x3d\x43\x57\x62\x1f\x70\xfc\xdb\x7f\x7e\xe5\x3a\xe9\xbe\xfd\xeb\xf8\xab\x88\xd2\xe8\xaf\xff\x74\xc2\xb5\x76\x37\xa4\x9f\xc6\x69\xe6\x20\xf7\xdc\x5f\xff\x3c\xd7\xf9\x45\x25\xb2\x09\xbe\x96\xf9\x27\x26\x0b\x30\xa1\xac\x53\xb9\xcf\x35\x24\x98\xc9\x1c\x57\x39\x3c\xbb\x16\xff\xf2\x71\x02\x62\x4d\x25\x41\x92\x71\x2b\x14\x1c\x00\xbe\xde\x58\x69\x8b\x3f\x47\xbe\x55\xe8\xff\xde\x34\x66\x40\xb5\x5a\xc3\x36\x47\x51\x72\xa8\x98\x78\x27\x0d\xc0\xcf\xe0\xbb\xc2\x70\x70\xca\x61\xf7\x67\x9a\x6b\xd6\x8d\x70\x40\x1b\x02\x0a\x56\xd7\xb7\x3f\x28\x6d\xff\x10\xa6\xdf\xe7\x27\x22\x9f\x39\xe3\x37\x5a\xe6\xac\x01\xfa\x2c\xb7\x03\x15\x38\xb8\x5b\x06\xc3\xab\x05\x2b\xa5\xb1\xfc\x5a\x4c\xd8\x85\x3b\xb3\xe2\x44\x03\x1c\x3d\xc5\x80\x8c\x46\xe4\xac\x51\x56\x16\xf0\x6d\xdb\x8e\xeb\x72\x7c\x96\x9d\x4e\x99\x69\x32\xe0\xe8\xad\xc5\xd8\x9f\x8e\x74\xd7\x92\x8c\x69\xdf\x65\x14\x26\x7b\xce\xd1\x8c\xaa\x72\xf8\x29\x32\xfe\x2a\x5a\x5e\x4b\xe9\xd5\xae\x9f\x5a\x65\xed\x89\x08\x83\x09\x2c\xdb\xee\x10\x2c\x7c\x1e\x10\x5a\x74\x14\x37\x50\x22\x13\xc6\xf0\x7a\x81\xa4\xa8\x32\x70\x37\x52\xe6\x2b\x9c\xd4\x25\x57\x0d\x34\x50\x0b\xa4\xd8\x6d\x32\x18\x1d\xce\xae\x6a\x7d\x2d\x54\xa8\x24\x70\xb3\x98\xe6\x55\xb7\xc9\xa3\xc8\x3e\xcd\xb2\x39\x57\x33\xd1\x16\x93\x97\x3c\x87\xb1\xff\x2e\x68\x5a\xfe\x7d\xdc\x08\xf0\xa9\x53\x58\xa4\x85\xa1\xb8\x72\xe7\x53\x88\x7e\xbc\x55\x01\x0e\x77\xd4\x86\x27\xdc\x2b\xc9\x62\x2d\x99\xc8\x86\xf1\x87\xf7\xf7\x84\x8f\x41\xa1\xd8\x60\x0e\x77\x29\x2c\xcf\xb9\xe5\x83\xe5\x71\xbf\xe4\x81\xfc\x93\x72\x3b\x60\x39\x44\x39\x1f\x74\xc6\x7a\x55\x52\x57\x32\x86\x17\x00\x69\x30\xf7\xb3\x0f\xf0\x54\xd6\xad\x6b\x8a\x3d\x62\x7a\x36\xe8\x6a\xbc\x28\xf4\x2d\x01\xd6\xf9\xd6\x50\x64\x89\x9c\xe5\x0d\xa8\x7d\xad\x48\xeb\x13\x1b\x1f\x24\x74\xe2\x26\x7a\xb0\x51\xbe\x6c\x53\x00\xb2\x34\x45\x7b\xa5\x82\x86\x67\x9d\x50\x56\x22\x95\xbe\xc7\x83\xa0\xc1\x6f\x14\x6e\xd5\xce\x34\xc0\x3c\xcd\x84\x35\x6d\x72\x25\x9e\x26\x4e\x44\xd2\x59\x4e\xbe\x04\x38\x6a\x68\x6a\xc8\x1c\x5f\xad\x29\xe2\xc4\x19\x4d\xa7\x85\x3b\xbf\x36\x3e\x33\xc3\xc5\x90\x90\x05\xf7\xa5\xce\xfb\x07\xa3\x3a\x74\xae\x6d\xc3\x6d\xd1\x09\x16\x20\x19\xf0\xf5\xe0\x0d\x10\x9a\x37\x09\x5a\x06\x1e\x01\x73\x7e\xb3\xbe\x57\xb5\xd5\x4c\xc7\x81\xb3\x0d\x1e\x37\x86\xc7\x8d\x9f\xf6\xf5\x5f\xf7\x4f\x5e\xf4\x57\xcf\x24\xc6\xb4\x43\x03\x04\x2c\x9c\x68\xbd\x18\x24\x9e\xd0\x01\x53\x0a\xed\xd2\xf9\x4b\x09\x1a\x21\x29\x86\xca\x6a\x85\x74\x52\xf3\x19\xfb\x43\xa2\x71\x91\x66\x1b\xac\x61\x2c\x66\xda\xf3\xe6\xf1\x84\x26\xde\xa3\x7a\xa5\xb7\xef\x77\x1a\x03\x55\x6f\xb5\xd5\xe8\x8b\xa6\x82\xfa\xed\x54\x65\xa0\xe3\x0f\xa5\xaa\x6e\x31\xd7\xba\x28\x3c\x85\x3b\x5a\xc8\x9d\x14\x27\xa0\x0f\xc2\xa0\xc9\x28\xb8\x21\x82\xbe\xaf\xc4\x6d\x50\xec\xb8\x41\xd4\x52\x1f\xb2\x07\x57\x89\xcf\x3b\x5b\xd5\xde\x04\x38\xf0\xe1\xfb\x43\xb5\xc0\xce\x1f\x47\x83\x8b\x0e\x06\x36\x73\x8f\x72\x36\x80\xe2\x57\x85\xd3\x42\xa2\x09\x08\xcf\xe9\x1c\x69\x56\x47\x77\xbd\x16\x53\xf2\x0c\xc4\x1f\x7d\xd8\x6f\xf1\x3c\x4c\x7e\x38\x69\xb3\x24\x49\x4d\x8e\x90\x32\x69\xd4\x93\x5b\xd2\xac\xa2\x4e\x6b\x09\x60\xcf\xaa\x1e\xf4\x4c\x3d\x18\x30\xf9\x60\xb8\xf4\x03\xc0\x86\x91\x6a\xfd\x9c\xe2\xb6\x99\x35\x18\xc3\xbb\xd7\x70\x59\x0c\x90\xc8\x09\x59\x5c\x43\x84\x83\x13\xb1\x73\x78\x7e\x0a\x0d\x7b\x0b\x73\x06\x7f\x78\xcd\x23\xc4\x35\xaf\x84\x93\x0b\x2d\xa2\x15\xac\xc8\xf8\xb7\x2b\xd2\xdc\xda\xcd\xf9\x1d\xd0\x37\x51\xb8\xc8\x97\x2f\xbb\x83\xeb\xf0\xfc\x14\x9f\x38\x01\x06\x5f\xae\x16\xa4\x13\xda\xb9\xac\xf3\x71\xc5\x6b\xbb\x40\x27\xcb\x28\x79\x5a\xa8\xe1\x1c\x60\x38\x06\x8d\x64\xf7\x61\x7c\x8b\xaf\x64\x8e\x60\xf8\x7c\x9c\x88\x02\x7d\x77\xce\xcc\x43\x1b\x91\xbe\x15\xa5\xfe\x4a\x46\x24\x66\xfc\xf1\x3e\x96\x47\x31\x22\x89\x8c\xfe\x58\xfa\x83\x13\xff\x26\xcd\xbe\x41\x75\x00\x74\x7d\xf2\x8b\xe9\xb8\xcc\x2d\xe8\x96\xe0\xa4\x70\x2d\x8d\x98\x9c\xba\x83\x58\xab\x31\x15\xd7\x07\x27\x3e\xe9\xa7\x3e\x4d\x15\x1d\x0e\xb0\x75\xa3\xa7\xc4\x3f\x0d\xbb\x9c\xed\x29\xad\x70\xe7\xe3\xbd\xfb\x98\x9f\x7b\x87\x07\x1a\x6e\x09\xa7\x79\xec\x97\x88\x24\x8d\x57\x13\xa4\xca\xdd\xb4\xc3\xb1\x07\x1e\x0b\xd3\x64\x99\x10\xc1\xc7\x15\xf3\xda\xb7\x92\x89\xba\x5c\x72\x9b\xcd\x85\x61\x46\x03\x3e\xaa\xb1\xbc\x28\x5a\xdf\x12\x0d\x94\x06\x4d\xc7\xfb\xf9\x23\x05\x28\xa9\x46\x27\x37\x5b\x55\x70\xf2\xe5\x4c\x1b\x95\x61\x06\x98\xb4\x8b\x98\x19\x35\x51\xf6\xc0\xa0\x36\xe8\x72\x92\x53\xf4\x2e\x47\x86\x71\x18\x4c\x10\xad\x0b\x14\xa6\x73\xcf\x3d\x0e\xb6\x1a\x81\x00\x3a\x39\x7a\xc5\xb3\xeb\x5b\x5e\xe7\x06\x0a\xed\xb9\x95\xc8\xc5\x38\x42\xad\x23\x56\x22\xd4\xee\x6e\x1c\xa8\x95\xaa\xab\xdf\xc4\x1d\xd9\x8b\x7a\xbd\xa4\xf7\xec\x07\x7d\xc7\x88\xc0\xd2\xd7\x76\x8c\xf1\xc6\xea\x92\x5b\x99\x81\x2b\x4a\x4e\xa3\xe8\x42\x19\xd8\x2d\x42\x90\x18\x4f\x01\x38\x57\xe8\xc5\x69\x1d\xac\xd6\x80\x56\x74\x3c\xea\xab\x7f\xcd\xd5\xfd\x8a\x8e\x26\x7a\xd0\x25\xc6\xab\x21\x0a\x56\x0b\xc1\x64\xe9\x14\x58\x0e\x04\xda\xd3\x50\xf3\xef\x43\x2e\xef\x1b\x14\xa7\xa5\xff\x00\x71\xae\xe8\x2e\xf4\xa7\x15\x85\xbe\x35\xcc\xde\xea\x60\xf4\xb7\xd1\x04\x2a\x6e\x1f\x75\x54\x3a\xfa\x8d\xdb\x6a\x6e\x58\xa2\x7d\x34\x72\x6b\xe7\x56\x14\x85\xfb\xef\xfb\x76\x93\x99\xac\xea\x91\x9c\x29\x2c\x7f\x96\xc6\x7b\x60\x28\x9f\x7d\x2f\xaf\x75\x55\x91\x2f\xb5\xdc\xef\xf6\x08\x42\x97\xf5\x8d\x30\x10\xbd\xf7\x19\xf2\x6e\x18\x66\x42\x89\x9a\x5b\x08\x84\x10\xa8\x23\x08\x94\xee\x23\x92\x69\x5c\xd9\xb9\x78\xb8\x30\x10\xf4\xfe\xe1\xa1\x6f\xc1\x63\xe1\x46\xca\x2f\x18\x33\x41\xe0\x9c\x7d\xf6\xc6\xe0\x0b\x85\x3d\x1b\xb2\xf9\x3f\xc8\x66\x40\xb7\x2f\x99\x0d\x13\xb6\x77\x58\x54\xf3\xa8\xd5\x58\x4b\x0f\xd5\x52\x69\x4f\x93\xe7\x1d\xd5\xda\x98\x33\xff\x93\xfb\x3c\x7a\xab\xc1\xbf\xaf\x99\xad\x06\xbf\xd5\xe0\xd7\xb8\xb6\x1a\x7c\xf7\xda\x6a\xf0\xdd\x2b\x08\xf8\x8f\x32\x2c\x41\xbd\x49\xcf\x92\xf7\x0d\x10\x3b\xd3\x96\x42\xac\xa0\xe2\xf1\x3b\x3d\x45\x1c\x0e\x92\x5b\xbe\x98\x28\x61\x09\x51\xc7\x3b\x05\x5f\xfb\xf6\xbe\xa9\x9d\xb2\x43\xba\x71\xb4\x59\xfd\xce\xf7\x58\x3e\xd1\x53\xac\xc6\xf3\xb7\x8d\xf8\xc2\xe7\xbb\x86\xe2\x9d\xee\x7b\xa8\xaf\x8b\x1b\xc8\xc4\x84\x5d\x08\x4f\x61\x92\x3c\x7c\x19\x35\x25\x17\x96\xcb\xc2\xb4\x07\xee\xe5\x1d\x07\xf8\xfa\x07\xea\x43\x5a\x67\xa1\x26\x62\x58\x2b\xb1\x2d\x72\x8a\x12\xcf\xe2\x8c\xce\xf6\x86\xbb\x42\x0e\xa7\x53\xf6\x5a\x64\xfa\x46\xd4\x38\xb6\x27\xef\x2a\xae\x9c\x25\xf4\x9c\xcb\xc2\x8d\xac\x1f\xe1\xd6\xb9\x0a\x74\x5e\x69\x88\x2f\xf2\x68\x87\x65\x4d\xd3\x58\x52\xa7\x08\x70\xc7\xdd\x4f\x89\x44\x55\x2d\x6e\xa4\x6e\x8c\xcf\x3b\x6d\x2c\x1e\x4a\xc6\x92\xed\x31\x97\xb3\xc0\xba\x19\xd2\xc1\x6a\x91\xe9\x3a\x6f\x97\xaf\xb1\xdc\x36\x26\x2d\x65\xcf\x30\xa6\x36\x5c\x38\x25\x8c\xe3\x03\xd2\xd2\x86\xd4\x67\x60\xc0\x06\x68\xa7\x9b\x03\x04\xd6\x8a\x01\x4c\x8d\x48\x02\xc6\xd2\x0f\xab\x84\xa4\xc2\x09\x75\x8b\x68\xe2\xbf\xc2\x1f\x8f\xda\xb5\xd3\x26\x67\x48\xd3\x66\x17\xb7\x99\x0e\x12\xec\x13\xee\x04\x4a\x64\x88\x07\x71\x02\xcb\xd7\xab\xf5\xc7\x68\xf9\xbf\xa6\x67\x1d\x16\xce\x1a\x41\xf1\x14\x89\x94\x15\x59\x14\xb2\x2c\x1b\xeb\xf6\xc1\x84\x9d\x62\xdd\x2d\xd8\x34\x64\x2a\x4f\xdb\x9a\x4f\x51\x9b\xb5\x73\x1f\xe2\x6b\xb8\xe0\x1b\x1b\x2e\x00\xc7\xba\x53\xfd\x3a\x9e\xb4\x18\x4d\x4f\x2b\x81\x39\x4c\x6e\x7e\x7d\x8e\x53\x72\xf7\xda\x90\x59\xe9\x35\xe0\xd6\xc2\x6b\x38\x33\x08\xaf\x41\xac\x18\xbc\x86\xdc\xfb\x78\x0d\xa5\x17\xe2\xb5\xac\x1d\x82\x64\x07\xcf\x5c\xa2\x25\x26\xab\xa3\xd2\xf9\x64\x85\x04\x08\x39\x77\x3a\xa7\x84\xba\xd4\x7f\x88\x65\xf6\xa7\xae\xf9\x6b\x9f\xbc\x1a\x4e\x21\x7e\xc3\x65\x01\x15\x13\x52\x19\x99\x0b\x64\x05\x22\xc9\x31\xd8\xfb\x0e\xaa\x90\x76\x92\xdd\x9d\xf0\x1c\x97\xbc\x1a\x5f\x8b\xc5\x40\xd3\x3d\xd8\x4a\x5c\xee\x28\x8e\x44\xc9\xab\xde\xad\x63\x31\xc9\xe0\x67\xd2\xee\x0b\x2c\x52\xc1\x0f\xaf\x48\x35\xf2\x75\x33\x6d\xcd\x4e\xa6\xcb\xaa\xb1\x22\x52\xa1\x48\xd9\xb9\xb7\x5e\x91\x40\x35\x1e\x94\x5c\xf1\x99\x18\x87\x66\xc7\xed\x71\xb1\x36\x75\x78\x7c\x0d\x2c\x06\x87\xc5\x14\x8c\xaf\x47\x57\x4e\x93\x5e\x83\x15\xf4\xb2\x8f\x52\xd4\xcb\x86\x2f\xec\x65\x1f\xbf\xb8\x97\x05\xb0\x85\xe1\xf7\xfd\x6b\x0f\xfe\xd0\xd9\xf9\x64\x2a\xbd\x6f\xe7\x27\x28\xc3\xa1\x1d\x69\x98\x2e\xa5\xb5\xc2\x27\x55\x87\x9d\x0c\x49\x30\x71\xf1\x3b\xc9\x1c\x88\x5e\x61\xe6\xb4\x78\x17\xe8\x55\x23\x83\x1e\xbc\x6d\xb7\xd2\xa0\x09\xae\x98\x2c\x2b\x24\x7b\x00\xd9\x31\xf6\x9a\x32\x45\x87\x42\x4f\x32\xc8\xde\x64\xe2\x1d\xc4\xc8\xf0\x61\x5b\x31\xb5\x15\x53\x5b\x31\xf5\x31\xc4\x14\x62\x02\xf4\x87\xd8\x48\xc4\x93\x6f\x94\x40\x28\xf9\x95\x28\xd8\xcf\x8d\xa8\x17\x4c\xdf\x88\xa8\x32\x0b\x88\x6a\x9d\x22\x8b\xb5\x4d\x14\x29\xef\xab\xc9\x3e\x50\xb7\x04\xd8\x0b\x27\xef\xaa\x5a\x20\x76\xd8\xe0\x87\x42\xf7\x01\x29\x04\x28\xce\x42\x98\x99\xd8\xa1\x85\x69\xd5\x89\x8b\x8b\xd7\x82\x1d\x9e\x1d\x0f\xe9\x79\x7c\xe8\x46\xff\xe1\x7b\x86\x08\x87\x32\x7c\x03\xe7\x5e\xc8\x8c\x0e\xc1\x65\x76\x2d\x16\x23\x2a\x40\x20\x96\x72\x7f\x33\xd6\xf2\xa4\x54\x89\xfd\x20\xb6\xd3\xeb\x11\xf8\x0b\xfa\x51\xe3\xa5\x6d\xf9\xc1\x7d\xa0\xfe\x87\xde\x14\x7a\xf1\x75\x17\x9d\x1e\xae\x56\x60\xdf\xf2\x38\x03\x61\x81\x02\xb6\x02\x48\xd8\x07\xeb\x16\x60\xc0\xf2\x84\xd3\xf8\x91\x06\x2b\x6c\xc1\xa4\x92\xfd\x5a\x2c\x76\x0d\xa1\xd0\x69\x65\xe6\xb2\xf2\xfc\xea\x20\x27\x69\x57\xb2\xef\xa1\x64\xc4\x37\x81\x12\xf1\x54\x8d\xd8\x99\xb6\xee\x3f\x27\x50\x03\x07\xfb\xf8\x58\x0b\x73\xa6\x2d\x7c\xf2\xa0\x87\x1b\x5f\xed\x23\x0d\x36\xa5\xe5\x90\xdb\x1a\xaa\x3d\x01\xf5\xc5\x57\x46\xc1\xa0\x52\xb2\x78\x98\x18\x69\xd8\xa9\x62\xba\xf6\xa3\x6a\x3d\x65\xac\xa1\x26\x7c\x60\x3f\x4a\xb6\x5a\xd1\x06\x4d\x86\xae\x93\xb9\x78\x4f\x73\x21\x9d\x4a\xfa\x6f\x20\x96\x08\xa9\x71\xa1\x9c\x0b\x68\x4b\xb9\x15\x33\x99\xb1\x52\xd4\x33\x40\x2c\xcc\xe6\x43\x4f\xf1\x50\xe7\x22\x5e\x03\x9e\x8e\x78\x0d\xba\x0e\x41\x45\x79\x01\x85\x7a\x1f\x47\xfd\xc1\xb6\xf1\xb8\x2e\x79\xe5\x96\xe0\xff\x71\xa7\x32\xac\x82\xff\x0b\xb4\xc8\x66\xc2\x0e\x99\x91\x6a\x56\x88\xe4\x3b\x0a\xc1\xc5\xcd\xb8\x16\x9c\x79\xfb\x73\x23\x6f\x78\x21\xb0\xb0\x96\xab\x40\x5a\xa8\xa7\x4b\x4a\xd7\x88\xb8\x91\x9d\x5c\x0e\x4e\xdd\x9d\x6b\xb1\xd8\x19\x2d\x2d\xdb\x9d\x53\xb5\xd3\x82\x9f\x26\x0b\x35\x28\x17\x10\x8f\xd9\x81\xef\x76\x3e\x8d\x9e\xf6\x08\xcc\xd8\xc1\xd6\x24\x45\x49\x8f\x0a\x8e\x71\xf9\x61\x23\xda\xdd\xd6\x57\x51\xb2\x5d\x44\xf7\xb4\xd9\x0c\x54\xb4\x3d\x78\xe8\x17\x40\x43\x86\x2a\xa1\x1b\x60\xfc\xb1\x5f\x7d\x88\x40\xfc\xb5\x82\x44\x07\xe0\x8b\x3d\xa8\x4c\x82\x45\xd6\x66\x8c\xdf\x31\xe2\xdf\x43\x10\x5f\x4f\xd9\xf3\x96\x6a\x0d\xc2\xa5\x4e\xad\x22\x98\x19\xa5\x2d\x93\x2a\x2b\x1a\x8a\xdf\xc3\x4f\x31\xe8\xfb\xb0\x86\x77\xf0\x85\xdd\x36\xeb\x57\xb4\xcf\x71\x5f\xc2\x0e\xe8\x66\xfc\x42\x02\x78\xc8\x71\xc5\xd1\xde\xe4\x68\x4d\xd7\xaa\x92\x4e\x29\x02\xb3\x54\xbf\x7c\x2e\xaf\x6a\xc1\x8e\xe6\x5c\x29\x51\x44\xf8\x8b\xe4\x2b\xe5\xd6\xf2\x6c\x8e\x69\x26\x9c\xb9\x7d\x5c\x08\xbb\x6b\xd8\x5c\x43\x4c\x31\x9b\x4b\x15\x10\xc9\x54\xc0\x21\x6d\xa1\x18\x36\x40\xaa\xd9\xd7\x40\x1a\x90\x8f\x71\x97\x08\x19\x69\xdd\xc5\x4c\x88\x29\x4f\x63\x4b\xed\xd3\xbd\xa7\xe5\xb8\xa2\x3d\x0f\x23\x8f\xe7\x32\x90\x06\xc2\xbd\xef\x67\x7a\x2c\x83\xbf\x5b\xaa\xa9\xa8\x6b\x9c\xa1\x2b\x41\x3f\x60\x72\xca\x1a\x15\x25\x8f\x23\xfd\xdb\x5c\xdf\xb2\x5c\xb3\x5b\x01\xd9\x42\x4e\x81\x80\xf4\x73\xe3\x55\x8f\xa8\xa7\x50\xa9\x92\xe9\xb2\xaa\x75\x29\x43\xfa\x36\x2d\x8f\x8d\x41\x0d\x16\xcd\xda\x6c\x0d\xe9\x2c\x16\x8d\x4a\x69\xd2\x9f\x1f\x31\xcb\xeb\x99\xb0\xee\x19\x4c\x35\xe5\x95\xe8\x89\xa8\xb8\x69\x3e\x9f\x41\xf9\xf3\x76\x03\x81\x5e\x32\x6a\xbf\xc2\x8c\xc7\x5e\xfb\x5f\x41\xa2\x01\x54\xc1\x4c\x75\x9d\xf9\xb4\x46\xcf\xc9\x87\x04\x4e\x6e\x15\x7e\x4f\x07\x67\xa3\xac\xe9\xc9\xa7\xd4\x87\x59\x0f\x97\xc2\x0f\x3f\x9c\x0d\x43\x88\xb4\xdb\xb6\x77\xd7\xaa\xbb\xd5\x75\x91\xdf\xca\xdc\x27\x75\xed\xb9\x9b\xf7\xfb\x8d\xc0\x06\xf9\x91\x7a\xef\xf4\xdb\x5b\x99\x0f\x34\xf8\xd0\x54\x3a\xe8\xbe\xa4\xcf\x0d\x3a\x83\x51\x97\xb9\x50\xd6\x09\xcb\xda\xb0\x3d\xf8\xc5\x3e\x3b\x91\x08\x5e\x05\xbf\x87\x54\xb4\xf2\x4a\xaa\x16\x18\xad\x9d\x54\x77\x5c\x3a\xb9\xe1\xcd\x7b\x23\x2c\xc2\x0e\x41\x95\xb9\xb6\x73\x66\x64\xd9\x14\x96\x2b\xa1\x1b\x53\x2c\x7a\x2e\xed\xc7\x3a\xb1\xd3\x42\xbc\xc3\x1d\xde\x5f\xe9\x09\x4d\xa5\xca\x0f\x14\x57\xb5\x58\x83\x4b\xda\x4f\x5b\x9b\x98\x1f\x04\x4d\x28\x60\x67\x89\x77\x22\x23\x58\x85\xaa\x68\x66\x72\x2d\x1c\x9d\x2d\x83\xf8\x5a\xbf\xfe\x30\x06\xf1\x96\x28\xb9\x31\xa2\xc5\xfc\x25\x90\xbb\x4d\xe9\x25\xc3\x13\x7e\x6f\x56\xbf\xbc\x5c\x4d\xf6\x9d\x8b\x4a\xa8\x1c\x48\x87\x9e\xb7\xfb\x0f\x3b\xbf\xb1\xb1\x27\xb2\x9f\x61\xce\x0a\xcf\x1c\x94\x9c\xd2\x51\x82\xe4\x5c\x17\xb9\x61\xe2\x9d\xad\xb9\x3b\x0e\x4a\x27\xf8\xc3\x6f\xa6\x8c\xab\xbe\xa2\xfd\x73\xa1\xac\x65\x9f\x48\x03\xcd\x3f\x53\x0d\xd4\x0c\xca\x65\xbf\x6b\x62\x06\xfb\x76\xf4\x92\x8f\x07\xa6\xb5\xc7\x03\x94\xa4\x83\x49\x21\x11\x56\xd0\xcf\xb7\x25\x55\xcb\xd8\x3e\x6b\xd2\xd0\x9b\x15\xa4\xd4\x9d\x5e\x6d\x70\xb3\x6e\x39\xe9\x1f\x17\x27\xfd\x14\x10\x52\xfb\xd3\x86\x50\x3b\x1d\x9f\x1d\x7d\x48\x6a\xeb\x87\xf8\xe8\x68\x47\x45\x67\xb2\x9b\x37\xdf\x10\x21\x8d\x31\xe3\x66\xa3\x2d\x8b\x6c\x94\x5a\x4f\x9a\x6f\x9a\xb1\x9b\x5b\x6e\x84\xed\xe3\x49\x4e\x15\xcc\xb6\x3d\x27\x72\xe2\x95\x4f\x5f\x21\xef\x3d\x20\x8f\x78\xd4\x50\x36\xfe\x2b\xe9\xa2\x2a\xb9\xd3\x69\xa1\x7e\xdc\x3d\xad\x88\x08\x99\x65\xd8\x46\xee\x66\x3b\xe3\x76\xed\x8a\xdd\xde\xa7\x31\xf5\xf6\xcd\x9b\xd3\xe3\x21\x87\xd0\xb5\xe7\xb5\x55\xf8\x77\x3a\x8c\x93\x50\x4c\xd6\x28\xf9\x73\x13\x1b\xda\x80\x76\x1e\x06\x8e\xee\xdf\xc4\xe8\xcc\x32\xd1\x86\x09\x8e\xa5\xb9\xee\x4f\x0d\xb4\xd4\x64\xba\xdd\xbf\x39\x3a\x61\xf4\xe9\x07\x79\xe7\xef\xe3\x9e\xef\x4b\xec\x31\xcb\x44\x1b\xb8\xcb\xa5\xb9\xde\x00\xad\x50\x5f\x1b\xb8\xca\xcf\xd6\x2b\xc9\x79\x98\x91\x86\xae\x85\xe7\x99\x07\x22\x4a\x8c\x85\x6e\xd8\x2d\x21\x6f\x93\x85\x78\x29\xab\x67\xec\x44\x99\xa6\x16\x6d\x86\x56\xb7\x29\xa7\x6f\x7d\xb0\xbd\x08\xe0\xe6\xe6\xd9\x60\x51\x89\xa1\x57\xea\xe7\x12\xe6\xa8\x78\x6d\xc1\x90\x1b\x66\x21\x85\xe6\xbc\x9c\x8e\x3e\x50\x1f\xb2\x92\x4e\xa7\xbe\x36\x63\x44\x30\xbc\x81\x72\xc8\xdf\xe4\xd6\x4e\x84\xcb\x1f\xaf\x96\xe7\x81\x0b\x83\x1d\xe4\xe2\xe6\xc0\xe4\xfc\xe9\x08\x1e\xe3\xab\xdc\xd3\x3e\x71\xc3\x76\x9e\xee\x4c\xd8\x85\x2c\x65\xc1\xeb\x62\x91\x50\x03\xb7\xf7\xb9\x63\xd7\x37\x08\xd9\x2c\x4f\x76\xd8\x9e\xae\xa1\xe5\x8c\x2b\x56\x08\x0f\x02\x46\xbb\x7a\x81\x76\xc7\xfe\xc3\x10\x91\xec\xc1\x44\x8a\x50\x5a\x0e\xb4\xd6\x72\xaf\x53\xd1\x79\x9f\xf0\x3c\x1c\xb7\x07\x9e\x54\xee\x14\x9c\xb0\x37\x74\x7c\x91\x5e\x80\x8b\x01\x36\xb3\xbf\xe3\x61\x4d\xd6\xc3\xf3\x87\xac\xe5\xd9\x58\x0e\xdd\x3d\xb4\x81\x5e\xd7\x7b\x32\x93\xf6\xb5\xa8\xf4\x00\x3a\x1c\x36\xd4\x89\x2f\x48\xeb\x3e\xd0\x46\x02\xb1\x23\xb7\x8c\xa3\x48\xca\x9a\x82\x3b\xa3\x0e\xa3\x0b\x13\x76\x7c\x72\xfe\xfa\xe4\xe8\xf0\xf2\xe4\xf8\x19\xfb\x86\x5a\x92\xb1\x1d\x30\x61\x97\x31\x55\x4b\x54\xf0\x46\x7c\x18\xe1\x59\x23\x12\xb1\x5c\xb5\x94\x73\x00\x5d\xcf\x15\x3b\x55\xd2\xb6\x64\xbb\x58\x17\x50\x68\x45\x99\xfe\xee\xd7\x14\xdd\x98\x49\x4b\x60\xc8\xd8\x98\xfb\x3a\x6d\x8d\xaa\xc2\x9d\xb2\xd9\x16\x75\x3f\x42\xe5\xaf\x9d\x9e\x4d\x18\xaa\x9e\x45\x72\x18\x1b\x2b\x30\x88\x7a\x84\x2c\x8c\x16\xb7\x9f\xe3\x61\x1b\x08\xd3\x3d\x17\x85\xae\x13\x3e\xf3\xc9\x64\x77\xc2\xdc\x31\xbe\x3b\xd9\xf5\x2a\x5f\xb1\x44\xba\x1f\x1a\x8d\x29\x7f\xd2\x05\x3f\x61\xec\x95\xaf\xaa\x04\x1c\xd4\xd5\xfc\xfd\x08\x59\x1e\xb1\xb5\x77\xb6\x8d\x47\x9b\x69\xae\xe2\x87\x12\x47\xd0\x4c\xde\x10\x9a\xe5\xc6\x62\x0a\x6d\x57\x07\x99\xc6\xf8\xcd\xc9\x52\x7e\xfd\x62\x73\xef\x86\x12\x67\xa0\x37\x23\xf1\x45\xef\x95\xe9\xb2\x44\x52\x9b\x79\xc0\xd9\x6b\xa1\xf2\x82\x74\xdc\x88\x95\x8f\x54\x3e\xd3\xb5\x36\x76\xe7\x64\xf0\x4d\x75\xac\xfa\xf0\x31\x55\x3f\xab\xd6\x9c\xba\x3f\x03\x30\x71\x49\x19\x0f\x41\x46\xc7\xec\x41\x78\xf8\xc1\xeb\x93\xc3\xe3\x97\x27\x93\x32\x7f\x84\x42\x5a\xa8\xbc\xd2\x52\x59\xb3\xae\x85\xcf\xed\x7c\x03\xe2\x3d\x74\x7b\x18\x1d\x2e\x34\xe7\xf7\x8f\xff\x20\x22\x06\x23\x70\xb7\x68\x75\x59\x5d\xe9\x42\xcf\x56\x53\x07\xdf\x63\xd9\xfc\x0e\x49\x25\xc6\x7c\xec\xd6\xe3\xe6\x8c\x5d\x3b\x1f\xca\xce\xb5\x73\x3f\x90\xed\x68\x05\xbb\xd1\xce\x3f\x8f\x01\xfb\x84\x66\xc4\xd2\x28\xa2\x3b\x07\xc4\x9b\xe7\x6d\x6b\x89\xd0\x2a\x51\x97\x12\xab\x50\x3e\xd4\xbe\xd8\xcc\xe0\xaf\x6b\x5a\x38\x49\x7e\xbe\xe6\x72\x4d\x47\xdd\xb7\x94\x1e\x20\x55\x2d\xc6\x81\x69\x66\x2a\x0b\x01\xa8\xea\x41\x43\x8a\xcf\x13\xef\x09\xf6\x7e\x63\xbc\xab\x58\x74\x3d\xc2\x11\xb0\x9b\x77\xc4\x23\xfe\x74\x51\x2c\x5a\x36\x41\xf2\x86\xf1\x19\x32\xc8\xd4\x14\x90\xab\x6a\x79\x23\x0b\x31\x03\xa6\x50\xa9\x66\x11\xf2\x60\x8c\x55\x48\x30\x95\x69\x70\xea\xa5\xfb\x2b\x22\xad\x86\x95\x75\xf6\xea\x12\x48\x67\x21\xa5\xa2\xb7\xc1\xe9\x1e\x08\x7b\x7e\x3c\x1e\x83\xeb\x6f\xef\x5f\xce\xf2\xc9\x8b\x7d\xf6\x83\xa0\xe7\x68\x60\xc5\xad\x65\x66\xd9\xed\x5c\x07\x8a\x52\xe8\x6b\x3b\xb2\xb0\xa0\x31\x8d\x8f\xee\x3a\x70\x77\x3a\x8d\x1a\x8f\xf2\xe4\x7e\x29\x80\xf7\xab\xcd\x33\x78\x8c\x56\xd2\x86\x0e\xd0\x81\xa5\xbd\x0f\x36\xad\xda\x23\x21\x7d\xc0\x9f\x0b\x9c\x99\x45\x59\x48\x75\xdd\xd2\x2a\x4d\x35\x21\xb3\x0a\xe6\xbe\xf0\xbb\xa6\x16\xbc\xb8\xfb\xc4\x58\x67\x8d\x6e\xec\xb4\xb0\x83\xc5\x23\x20\x5e\xe0\xa4\xc5\xb7\x5e\x78\x51\x02\x58\x2c\xea\x77\x76\x1e\xf5\x88\x49\x93\x19\xd9\x5f\xbc\x43\x33\x89\x6c\x57\xec\xf4\xe2\xe8\xe2\xf4\x93\x46\xfd\xee\x3a\x5c\xa1\x77\x8f\xda\x7a\x90\x3f\xaf\x97\x55\x35\x66\x45\xb3\xee\x2f\xd1\xf5\x72\xae\x6b\xcb\x8b\x0d\x08\xce\x6c\xce\xab\xc3\xc6\xce\x8f\xa5\x01\x80\xe1\x61\xd4\xbf\xa5\x56\xa3\x7a\x45\xa4\x6e\xf6\x1c\x75\xd2\x2f\x5f\xba\xef\xe8\xdb\xc3\x73\xc6\x1b\xb7\x1e\x2d\xb1\x72\x6e\x2c\x59\xce\xbf\xc5\x05\xd6\x40\x0f\x3a\x32\xd4\xe6\xaf\x8c\x8b\xbf\xeb\x21\x8d\xca\xa7\xab\x7a\xdb\xc6\xa3\xe1\xe4\x42\xa9\xff\x99\xc4\xa0\xa5\x92\x56\x72\xab\xeb\xc1\x62\x83\x49\x8b\xc1\x61\xd8\x18\xab\x4b\xda\x45\xa7\xfe\x0e\x48\xc8\x02\xfd\x6d\xe9\x47\xad\x37\x11\xac\x4f\x18\xf3\x53\xe5\x6c\x45\x9e\x89\x4e\x99\xcd\x08\xd8\x32\xb1\x6d\x19\xee\xf9\x8a\x9c\xe8\xc0\x5c\x54\xfc\xf5\x59\xc2\x27\xdf\x52\x53\x7a\x12\x60\xf2\x62\x66\x5a\x29\x91\xf5\xe1\x56\xee\x3f\x25\x3f\x0f\x23\xda\xe4\xcf\xaa\x13\x4f\xc0\x21\xfa\xef\x86\x17\x38\xb4\x67\x9b\x74\xbe\xa7\x53\x3a\xcc\x1b\xa7\xab\x84\x5e\xbe\x5d\x12\x67\xc1\xdb\xd6\x18\xe4\x65\xc2\x11\xb1\x35\x57\xc6\xad\x93\xd4\x9f\xb1\x4b\x09\x10\xbb\x6c\xcf\x66\xd5\xfe\xc6\x46\x6a\xa8\x72\xd8\xa2\x51\xb1\xb2\x8a\xef\x7e\x89\x4b\xe3\x45\x28\x87\xed\xf7\x9a\x1b\x4f\x72\x80\xdd\x3e\x8c\xdf\x96\xda\x0a\xeb\x28\x1e\x2f\x54\x10\xd9\x0b\x69\x2c\xd6\xd1\xe0\xcd\x00\xe3\x82\xf5\x84\xce\x16\x38\x67\xba\x66\xb2\xfa\x07\xcf\xf3\xfa\x19\xea\x11\x64\xab\xc2\xbf\x4d\x60\x0a\xe2\x2a\x64\xdb\xec\xd9\x45\x45\x1c\x71\x97\x47\xe7\x70\xa7\x61\x7f\xf9\xf3\x13\xb0\x0b\xbe\xfc\xe2\xcf\x4f\x7a\x2e\xc4\xc7\x5a\x55\xc8\x86\xf6\x89\x0e\x9e\x59\xf1\x99\x54\x91\x24\xd5\x22\x40\x27\xe3\xb4\xdd\x0b\x2c\xce\x70\xe7\x24\x09\x4d\xdc\x08\x6e\x55\x86\xd3\x7b\x48\x9d\x78\x5b\x75\xf1\x1b\xaa\xba\x60\xa1\x1a\x1f\x05\xeb\x20\x0b\x39\x6e\x10\x60\x75\x96\x05\x38\xca\xee\xf3\xc7\x22\xbb\xd7\x1c\xdd\x75\x57\x72\xba\x82\xe3\x14\x3f\x2a\xc4\x8d\xca\x53\x8f\xcf\x2e\xfe\xf1\xe2\xf0\x6f\x27\x2f\xe0\x5d\x29\x2b\xd0\x2d\x4f\xb2\x84\xd6\xc9\x59\xff\xf0\xe5\xbe\xbe\x73\x6b\xdd\x21\x1d\x22\xc1\x40\x75\x52\x0b\x14\x3b\x7b\x7e\x71\xdf\xac\x82\xbe\xe6\xac\x9a\xf6\x18\xbd\xc7\x16\xd7\x70\x3f\x05\xbe\xd6\x4d\x54\xce\x0f\x1c\x14\x89\x50\xf1\x13\x3f\x8a\x5b\x43\xf8\x8e\xbd\x5d\x1d\x6b\xae\x0d\xf6\xe0\x74\xbd\xf7\xc7\xbf\xdd\x88\xe1\x28\x0e\x1e\xf9\xfe\xa4\xa3\xdd\x4f\x87\xac\x87\x82\x75\xd8\xc5\xb6\xbc\xfa\xe8\x44\x18\x9e\x1d\xb5\x3b\x55\xdd\x79\x2a\x4c\x20\x28\xfa\x0c\x56\x6b\xb5\x8a\x6e\xba\xff\xe9\xb0\xb2\x59\xfc\xe7\x85\x67\x0b\x8c\xb2\x0a\x92\xba\xee\xbb\x18\xe5\x7d\x46\x26\x2f\x23\x62\xcd\x21\x91\x1f\xdb\x8f\xf0\x13\x24\xc9\x7b\x84\x07\x0c\x74\x7c\x43\xe5\x65\xe1\xd9\xc3\x6c\xc7\xd0\x5c\x17\x69\xe5\x5e\xab\x84\x71\xe3\x15\x39\xca\x35\x8f\x21\x59\x1e\xe4\x12\x62\x0f\xee\x1c\x0a\xc7\xd0\x0f\x6b\xba\x1b\x36\xe9\x6a\xa8\xe6\xda\x6a\x35\x70\x0d\xed\xaa\x46\x53\xc1\x76\x0e\x77\x1c\x61\xa5\x7b\x21\xea\x48\xde\x62\x05\x51\x08\xab\x3b\xcb\xc3\x1f\xdd\x5a\xf9\x00\x7b\x1a\x5e\x7f\x7c\x92\xa8\xca\x4f\x8f\x37\x20\x84\x3e\x37\xb0\xa3\xfb\x86\x09\x37\x96\x28\x9b\x0f\x54\xb9\xef\x1a\xf2\x63\x7e\x7a\x4c\xe6\x82\x2f\xcb\x37\xb4\xad\xd8\xdd\xfb\x6a\x23\xaa\x94\xae\xed\xad\xae\x87\x82\x8f\x4b\x9b\xeb\x64\x61\xd2\x77\x4b\x60\x1c\x9f\xa7\x14\xc1\xb7\x7c\xf4\x92\xe4\x02\x24\x49\x87\xb9\xfb\x2e\x89\xf2\x31\x04\xca\xe3\x11\x24\x1f\x47\x71\xf9\xb8\x48\x5c\x1b\x33\x7f\xfd\xf6\x18\x64\xb0\x7c\x63\xe4\x06\x75\x0b\xa5\x95\xbb\x1c\xdc\xcd\x91\xe4\xd9\x88\x9c\xad\xb5\x93\x43\xeb\x89\x93\x54\xc4\xfa\x96\x30\x38\x88\xac\x8e\x45\xe1\x66\x56\xab\x98\x0f\x92\xc0\xba\x46\x0c\x39\x13\x4b\x5e\x19\x24\xa5\xc8\xf5\xad\xba\xe5\x75\xce\x0e\xcf\x4f\x3f\xbd\x5c\xed\x5d\x09\x8a\xfb\xa1\x0f\xb7\x40\x5a\x0b\xda\xb6\x07\x19\xf8\x90\x24\xe4\xfe\xb8\x92\x16\x69\x9b\x31\x19\xdf\xc6\xde\x28\x77\x4e\x85\x4c\x16\x27\xe9\x9c\x54\xa3\x96\x22\xb5\x4a\x31\x9d\x59\x5e\x20\x05\x08\xbb\x12\xf6\x56\x08\xc5\x9e\x3c\x79\x82\x01\x8a\x27\xff\xf9\x9f\xff\xc9\x80\x94\x33\x17\x99\x2c\x97\x6f\x84\xbb\xfe\xf4\xf4\xe9\x84\xfd\xfd\xf0\xe5\x0b\xc6\x33\xb0\xe5\x10\xf9\x16\x5b\x86\xf9\x8c\x7f\x6c\x46\xec\x7f\x5f\xbc\x3a\x6b\x09\xe5\xd3\x6f\x61\xb9\x84\xd7\x9b\xb0\xe3\x28\xf7\x3e\x0e\x1e\x70\x3b\x87\xd1\x50\xda\x32\x3e\x9d\xe2\x82\xf3\xac\xf6\x24\x4c\x3c\xf6\x9c\x9c\xcd\xe1\x75\xa5\x82\xa5\x56\x40\x51\x80\x74\x5d\x84\x80\x8d\xc7\x71\xc4\x1a\x07\x68\x2b\x1c\x22\xd0\x95\x11\x2b\xe4\xb5\x60\x53\xf3\x4d\xad\x9b\xaa\x25\x4e\xa9\x85\x71\x06\x58\xc6\x95\x6b\x1d\x1b\x6b\x67\xc6\x88\x9e\xd8\x98\x9b\xce\x9c\xa0\x7d\x3a\x4c\x08\x99\xf6\xbc\xa7\x10\x23\x6e\x40\x5f\xa3\x85\x22\xc3\xcd\xc2\x63\xcd\x64\x48\xde\xf6\x3c\xbc\x0f\x2e\x2a\x42\x3f\x6c\x25\x23\x2f\xb4\x9a\xc5\x6b\xb0\xd5\x3e\x7c\x32\xe5\xa2\x12\xeb\x0e\xc6\x40\x84\x3a\xc3\xd0\xd3\xa1\x70\x7f\xc9\xab\x7e\x4c\x20\x69\x8e\xae\x6f\x33\xc1\xa1\xe4\x57\xba\xb1\x3e\x67\x8f\xbe\x07\xf8\x36\xab\xfd\xd0\xf7\xea\xc2\x60\x2c\x45\xc3\xf1\xfe\x0d\x44\xba\x95\xe6\xcc\xc1\xa9\x9d\xaa\xac\x23\x26\x78\x36\x67\xd7\x62\x31\xc6\x13\xa0\xe2\x80\x1e\x01\xa3\x7d\xec\xc6\x18\x61\x72\xd3\x74\x86\x4c\xe4\xce\x9a\xa4\xa9\xf0\x09\x96\x91\x7e\xe0\xd1\x27\xbc\xc1\x65\x48\x2f\x27\x2a\x2b\x15\x79\x28\x3d\x77\x65\xa6\x95\x25\x5e\xcc\xc0\x5d\x05\x09\xa3\x1d\x40\x02\x27\x61\x44\xee\x7e\x66\xde\xf7\xe4\x36\xab\xd4\x9d\x28\xff\x1f\x7b\x5f\xf7\xdc\x38\x6e\x24\xfe\x9e\xbf\x02\xe5\xdf\xaf\xca\xf6\xc4\xd2\xec\x5e\x36\xa9\xdc\xbe\xa4\x3c\xf6\x6c\xce\xb5\xf3\xe1\xb3\x66\x27\x0f\xbb\xb9\x0a\x44\xc2\x12\xcf\x24\xc0\x00\xa0\x3c\xda\x6c\xfe\xf7\x2b\x74\x03\x20\x28\xf1\x4b\x22\x3d\x96\x67\xcc\x97\x19\x53\x00\x08\x34\x1a\x8d\xfe\x6e\xcb\x7f\x14\x7c\xab\x37\xe4\x73\x07\x9f\x5e\xc5\x6c\x66\x24\xea\x6a\x22\x06\x9e\xa9\xcb\x24\x82\x88\x23\xd3\xdc\xb6\x75\x50\xf2\x80\xa8\x24\x4c\x50\x4c\x17\x16\x34\xe0\x27\x6c\xbe\xcd\x94\x22\x09\xac\x30\xa3\xf2\x8e\xb9\x44\xc3\x34\x9d\x92\x6b\x33\x49\x9f\x6d\x1e\x4b\x09\xae\x30\x40\xc4\xd0\x98\x30\x13\x84\xf9\xc8\xf1\x74\x7a\x8c\x57\x65\x4d\x5e\x88\xc1\x58\x33\x66\x15\xb9\xd1\xaa\xc7\x55\x50\xf9\x2d\xcd\x15\x56\xd3\x33\xa2\x05\x54\xac\x14\x90\xb7\x45\x2f\x1d\x33\x41\x07\xa6\x10\x0f\x9f\x91\xcb\x98\x8d\x5b\x09\x75\xbc\x3a\xa8\x03\x6c\xed\xd5\x67\xec\xfa\xa7\x23\x56\x3f\x6d\xaa\x7d\x6a\x71\xc8\x52\x92\xb1\x2a\x32\x8e\x5e\x72\x33\x1b\xa1\xb0\x99\x7b\xaa\xa6\x23\xe0\x6f\x2b\xb9\xa4\x7b\xc9\x22\x36\x95\x7a\xca\x9e\x94\xf0\x71\x75\x0b\x24\xb5\x3e\xd7\x4d\x28\x97\xb9\x1b\xc6\x40\xe0\xf1\xa5\x8e\xa1\x55\xf6\xdc\xf3\x10\x65\xea\x87\x8b\x25\x9b\xcf\x10\x27\x9a\xcd\xa7\xaa\xc8\x08\xd2\x4a\xf8\xab\x36\x8c\x3e\x86\xad\xd2\x02\xaa\x75\x96\xc4\x61\x4a\xde\xda\xab\x18\x91\x9c\xce\x95\x48\x0b\xed\x33\x51\xd4\xdc\xd3\x30\xa8\xab\xed\x89\x49\x9b\x5c\xb3\xe0\xd6\x06\x7e\x05\xaf\xb2\x71\x2e\x70\x7c\x46\x24\x3e\x43\x1d\x64\xf1\xf9\xca\xdc\x64\xf1\x19\x71\x17\x1c\xbb\x38\xf2\x4e\xb8\x61\x7d\xf6\x4e\x17\x11\x59\xe1\x6e\xc1\x47\x56\x2b\x64\x9d\x1d\xa3\x8a\x31\x94\xfb\x66\xc0\x2e\x9f\xe1\x5a\x5d\xbb\x2e\xab\x60\x3c\xbf\xbe\x1a\x51\x2a\x0d\x46\x6d\x90\x4b\xc3\x16\xcf\x92\x69\x9f\xa7\x02\xe0\x2b\x94\x4c\x0d\x4b\xef\x14\x48\x97\x25\x44\xad\x49\xcf\x10\xe5\xaf\x40\xb4\xd9\x5a\xf8\x0f\xe6\x32\x0a\x83\xb9\xaa\x15\x3a\x50\x19\x5c\x5e\x5b\x41\x55\x0f\xe7\xc3\x03\x24\xee\xcb\x17\x83\x0e\x54\x78\x01\xe8\x0f\x88\xd8\xd9\x7c\xaa\xb7\xe8\x8d\x03\x22\x99\xb1\xd4\x5c\x7a\x64\x43\x65\x93\x8b\xf8\x7b\xac\xf9\x4d\x39\x17\x1a\xf0\x46\x9d\x91\x14\xea\x91\x9f\xa1\x2a\xc6\x70\xa0\x81\xf7\x97\x0c\x8c\xa6\x23\xf3\x9c\xa3\x21\x0f\x19\x1d\x81\x08\x20\x11\xc0\xee\x7a\x1c\x4c\x22\x0f\x80\x4d\xe6\x29\x59\x95\x31\xcb\xf2\x57\xf0\xca\x8e\xef\x90\x48\x45\x4b\x96\x51\xac\x47\xe2\x00\x64\xe8\xf5\xbd\x4c\xb4\x66\x98\x75\x9c\xc9\x4c\x11\x71\x7b\x56\xb1\x1b\x1f\xad\xbe\x3d\x1a\x8b\x9f\x25\x0f\x21\x50\x13\x77\x42\xf7\x4d\x03\xd6\xf4\x54\xed\x06\x15\xe1\xc2\x9c\x4e\x90\xa6\x53\x28\x90\xc4\x37\x14\x96\x86\x89\x58\x21\xfc\x0f\x1a\x74\x0f\xa7\x8b\xd8\x57\x07\x71\xe6\x19\xd3\x67\x1d\xc4\xb3\x0e\x62\x8c\x11\x1f\x4c\x07\x11\x5c\xdc\x8e\x98\xd6\xe8\x23\xc2\x40\x3c\xa7\x94\x28\x53\x59\x04\x69\xa2\x0d\xca\x3b\x75\x84\x90\x55\x5b\xc1\xf1\x74\x7a\x7c\xec\x94\x14\xf6\x7c\x14\xfa\x76\xf2\x67\xc2\x78\x24\x62\x44\x2a\x33\xbe\x54\x1a\x98\xda\x52\x2a\x0f\xe7\x92\xb9\x6f\x85\xf6\x06\x18\x7b\x5c\x94\x18\x91\x42\x39\x97\x94\x1f\x1e\x94\x05\x2b\x19\x2f\x9f\x06\xcc\x02\xd0\x67\x4b\xb4\x1c\x58\xe9\x22\x93\x26\x59\x62\xf3\x13\x1a\x72\xc1\x94\x56\xe4\x04\x5f\x4e\xa3\xbc\x38\xb3\x0d\xa6\x19\xcb\x84\x5c\x9f\xf9\x46\xe6\xc7\x4a\x2f\xdb\xe2\x14\xb8\xb6\xa8\x90\x92\x71\x9d\xae\xbf\x5e\xfe\xcd\x81\xf8\x80\xd9\x37\x8f\x15\x43\xe2\x3e\xea\x9e\x2a\x5a\x96\x45\x04\x40\x7b\xe7\xa1\x0d\xf7\x90\x8d\xc0\x38\x2b\x95\x3f\xe6\x2d\xe3\x2b\xb2\xa2\x72\xef\x08\x8c\xba\xe7\x41\x38\xb6\x38\x59\x25\x4a\xec\x1d\xc3\x56\x3b\x64\x08\xbc\x99\xbd\x94\x51\x47\x2c\x0a\x9d\x17\xda\xde\x2e\xee\x6c\xbb\x94\x7d\xfe\x4c\x6f\x30\xbe\xdf\x1e\x8d\x38\xb9\x9c\x6a\xcd\x24\xff\x9e\xfc\xcf\xc9\x2f\xbf\xff\x6d\x72\xfa\x97\x93\x93\x9f\xbf\x99\xfc\xe7\xdf\x7f\x7f\xf2\xcb\x14\xfe\xf3\xe2\xf4\x2f\xa7\xbf\xb9\x3f\x7e\x7f\x7a\x7a\x72\xf2\xf3\x8f\x6f\xff\xfa\xe1\xfa\xf5\xdf\x93\xd3\xdf\x7e\xe6\x45\x76\x87\x7f\xfd\x76\xf2\x33\x7b\xfd\xf7\x9e\x83\x9c\x9e\xfe\xe5\xff\x8f\xb8\x08\xca\xd7\xef\x47\x23\xc1\xf8\x4c\x1e\x84\x8d\xa8\x8e\x3d\x32\xea\x12\xf2\x69\x52\x6a\xb4\x27\x09\xd7\x13\x21\x27\xf8\x91\xef\x89\x96\xc5\x58\xa4\xab\xbc\xfe\x1e\x8e\xc6\x94\x4c\x4c\x99\x01\xd3\x09\x36\x07\x48\x44\xd0\x31\x75\x44\xcd\xb0\xad\x63\x5b\xaf\x14\xb6\x3f\x3e\xeb\x83\xfb\x3c\x0f\xe8\xa9\x64\xf3\xd9\x7c\xe5\x6e\x4a\x33\x5b\x4d\xf9\xd9\x47\x69\xeb\x79\xf6\x51\xda\x7e\x9e\x7d\x94\x76\x7c\x9e\x7d\x94\xdc\xf3\xec\xa3\xf4\xac\x1f\x1c\xfe\x7c\xe5\xfa\xc1\x67\x1f\xa5\x5d\x9f\x67\x1f\xa5\xbd\x9f\x27\xe4\xa3\x84\x4c\x7e\x9d\xa7\x92\x65\xf3\x4b\x37\xa5\x83\xf5\x52\x52\x06\x1f\x22\x76\x1e\x45\xa2\xe0\xfa\x83\xb8\x63\x03\x0d\xb9\x1b\x32\xe9\xd6\xe8\x90\x12\xb1\x41\x46\xdd\x6e\x7c\x90\x02\xeb\x58\xfc\xe8\x08\xfc\xe3\x78\x9c\x23\x2d\xe2\xc4\xc8\xa8\x23\x1f\x16\x37\x6c\x98\x16\x9b\xc7\x2c\x2e\x7f\xb0\x24\x4d\x9b\xfd\x9e\x92\x73\x22\x59\x94\xe4\x89\xb9\x00\x20\x57\x10\xbc\xc7\xe3\xe3\xab\x38\x27\x5a\xb1\xf4\xd6\x56\xb2\xe5\x65\x98\xb3\x0c\xe4\x4f\x7b\xa3\xd4\x7e\x06\x79\x08\xe1\x6a\x8d\x12\xb5\x14\x45\x1a\x13\xc9\xfe\xd7\x31\x1f\x76\x36\x1f\xc2\x11\x42\x95\x2a\x2c\xa5\xfc\xac\x1d\x9c\xe6\x89\x4d\x2a\x76\x48\x64\x90\x7d\xca\x13\x09\x87\x6d\xc6\x22\xc1\xe3\xb1\x35\x24\x5b\xe3\x97\xbc\x02\xd8\x85\x58\x4c\xe2\x02\x1b\x40\x38\x26\x4d\x93\x38\xd1\x6b\xef\xcf\x81\xc7\xde\xb0\xad\x58\x3b\xd8\x22\x82\x2a\x37\x82\xd0\x3c\x97\x82\x46\x4b\xa6\x82\xaf\x21\x13\x6a\x13\x65\xf8\x28\xcf\xb4\x58\x24\x1c\xf9\x50\xe8\x63\x98\x95\x74\x4d\xa4\xd0\xce\x35\xad\xe1\x83\x1f\x82\xc1\xa0\x3b\x72\x1c\x5a\xae\xc1\x7f\x4d\x84\x43\xe0\xac\x92\xdb\xf0\x0f\x45\x44\x1a\xbb\xd4\xac\x7f\xfe\xc6\x30\xfe\x91\xc5\x62\x73\x09\x40\xd2\x4c\x2d\x48\x6a\x98\x27\x73\x31\x34\x77\xfe\x8f\xef\xc8\x52\x14\x52\x4d\xc3\x64\x7f\xdf\xc2\x3b\xd4\x70\x38\xc1\x41\x93\x94\x51\xa5\xc9\xb7\xdf\x90\x2c\xe1\x85\xb9\xf1\x47\x42\xbc\xb1\x78\xdd\x80\xcb\xfd\xd3\x77\x03\x47\x1b\x87\xbf\x6d\xe4\x6c\x73\xac\x98\x67\xd9\x5b\x7b\xc6\x31\xa1\x07\x56\xcd\xdc\x60\x76\xed\x95\x14\xee\x22\xd7\xe2\x91\x4f\xfe\x3f\x0b\x31\x5f\xeb\xe1\x29\x6c\xec\x38\xd5\xdc\x35\xff\x6d\x5f\xf6\x49\x15\x5b\x66\x8a\xdd\x63\x2a\x8f\x5e\xe3\x7b\x91\x28\xbd\x57\x85\xef\x32\xe7\xcd\x1e\x9d\x87\x5e\xe6\x0b\x23\x1f\x8f\x12\x49\x0f\x23\x39\x89\xce\x69\xa4\xa3\x88\x29\x20\x45\x2e\x29\x1c\x28\x77\xb1\xed\x9e\x1f\x3d\xd0\x6c\x33\x75\x49\x64\x1c\xf2\x8f\x50\xab\x74\x10\xb0\x86\xb0\xfc\x0e\xb1\x47\x82\x16\x0e\x56\xa5\x11\x2a\xe1\x0b\x2c\x2d\x9a\x15\xa9\x4e\xf2\xb4\x84\xdc\x8d\xeb\x60\x2f\xe0\xd0\x5a\x40\x03\xf5\x34\xc5\xa4\x57\x98\xfd\x1c\x2c\x2b\x27\x7e\x2c\xc6\x35\x56\xc8\x94\xe6\x1e\xcf\xa9\xa4\x1e\xfc\x91\xc8\x32\xaa\x4e\xad\xe1\x81\x82\x17\x8c\x2d\x03\x64\x7a\xd1\xb4\x9c\x71\xe0\x75\xf0\x58\x88\xab\x19\xa7\x7c\x6f\xf3\x5f\x35\xe1\x3c\x0c\x45\xc4\xbd\x77\xb4\xc7\x22\xf7\x1b\x18\x6b\x19\xe2\x57\x34\xba\x63\x3c\x26\x3f\x29\x07\xb8\x78\xcd\x69\x66\xf3\xc7\xe7\x52\x60\x15\x75\x16\x6f\xf4\x57\x67\x56\xed\x88\xa9\x4f\x5c\x02\x2b\xe4\xb7\x1e\x0b\x8a\x85\x1a\x29\x79\xb0\x19\xa8\x8b\xde\x29\x54\xe9\xca\x64\x15\x31\xc7\x3b\x9a\x7e\x8f\xb5\xf8\xd5\xde\xd9\xea\x48\x7d\xea\x28\x5b\xc6\x14\x4f\x21\x5c\xe9\xde\x72\x09\x69\xe2\x69\x6a\x48\xdc\xda\xe7\xfc\xd9\x40\xb0\xf9\x1a\xf4\x5e\x8f\x92\x79\x4c\xce\x87\xe7\x94\x3a\x96\xf3\xb8\x4a\xcc\x6e\x68\x2c\x14\x79\x95\x8a\xe8\x8e\x5c\x32\x10\x1a\x1e\xb2\xf8\xbe\x9c\xc7\x4f\xbb\x70\x66\x46\x17\xfb\x79\x8c\x4c\x48\x26\x78\xa2\x85\xdc\x87\x1e\x1f\x50\xa2\xc0\xe7\x52\x86\x7d\x32\xa6\x9b\x73\xf6\xa5\x14\x32\x34\x28\x3f\x0e\xea\xc0\x50\x5e\x75\x02\x94\x07\x5f\x01\x51\xdd\x9b\x8e\xfc\xbf\xa5\xb8\x9f\x68\x31\x29\x14\x9b\x24\x7b\x3b\x42\x0d\x06\xd4\x1d\x5b\x83\x57\xd9\x28\xa0\xb2\x83\x55\x24\x77\x2d\x40\xcf\x0e\xef\x0d\x7f\x77\xf3\xea\xf2\x27\xc5\xe4\x34\x94\x56\x5e\x32\x1d\xbd\x8c\x58\xbe\x7c\x69\x47\x78\xf2\x60\x75\x64\x73\x1c\xb8\xba\xd1\x90\x11\x88\x44\x9a\xda\x04\x63\xe2\x96\x5c\xb0\x7c\xe9\x3f\x77\x18\x70\x7b\xca\x35\xe5\x72\x21\xc6\x29\x37\x75\x6c\x46\xaa\x92\x0d\x78\x83\x54\x23\x40\x7e\x39\xdf\xad\x90\xf7\x21\xa2\xfb\x67\xac\xce\xb2\x4f\x29\xbe\x83\x00\xef\xe1\x94\xf4\x3b\xae\xd4\xf4\x0b\xe3\x87\xaa\x05\xfb\x9c\x77\x6a\x85\x6c\x5f\xdd\xa2\x30\x1a\xb3\x98\x88\x15\x93\x32\x89\x99\x22\x9e\x6e\x87\x3a\xa8\x24\x3d\x0c\xc8\x3f\xd7\x0e\x7c\x5a\x0e\x07\x87\xa3\x7e\x38\x06\xfd\x43\x85\x88\xc3\x9b\x2d\x22\x4e\xe3\x2c\xe1\x87\x81\xed\x7b\xc2\x4d\x45\x34\x65\x57\xef\x07\x4b\xeb\x76\x9c\xaa\xc0\x3e\xb3\x2f\x83\x9a\x02\x1d\x79\xf6\x7f\xf4\xb8\x4b\xb8\x88\xf7\x33\xa0\x3d\xb2\xd8\xbd\xa0\x9a\xdd\xef\xc9\x08\x4d\x4a\x92\xbf\x6f\x7f\x10\xcf\x9e\xb6\xd8\x7e\x10\x95\x42\x82\x53\x8e\x29\xff\x1f\x8b\xc9\xb2\xf8\x34\x8e\x21\x09\xc7\x0a\x8b\xb2\x6d\x96\x62\x73\x67\xf6\xfc\xfa\x8a\xfc\x15\x9b\x3f\x5e\x15\x14\x29\x34\x8a\x3c\x97\x22\xa3\xc9\x38\x05\xd0\x37\x07\xdd\xac\x87\x15\x02\xe1\xda\xb7\x25\xb6\xb1\x61\x8a\xca\x74\xc3\x85\x64\x31\xb1\xfa\x94\x2f\xac\xc4\xc3\x16\x3b\xfd\x65\x94\x78\x78\xa8\x2a\xd9\x81\x6a\xde\xc5\xef\x94\x5c\xb4\x43\x27\x60\x22\xbc\xaf\x13\x51\x8c\xab\x04\xdc\x1b\x02\x0f\x3c\x60\xb5\xc1\x2d\xdd\x07\xeb\x20\xdb\x7d\x46\xde\x88\x45\xc2\x1d\x15\x13\xd6\xab\xe6\x96\x26\xe9\x30\x70\x3e\xf3\xc9\x5f\x19\x9f\xac\x54\xfa\x9a\xd3\x79\xba\xbf\xcb\x64\xf5\x10\xf8\xe1\xc8\x0f\x29\x5d\x10\x06\x7f\xbc\x8c\x13\x65\xfe\x25\xb3\xd9\x1b\x30\x06\x17\xdc\xc9\x97\x60\xe6\xb4\x77\x8b\x0f\x8d\x46\x22\xf3\x78\x74\x01\x89\xf8\x68\x15\x3c\x82\xf1\x48\xc2\x63\xb3\x74\xa6\x2a\x4e\xc9\xb6\x05\xd6\x4a\xf1\x71\x77\xe8\xfa\x38\x67\xe4\xc3\x32\x89\xee\xae\x03\xfb\xaf\x90\xe6\x1d\x0f\x5e\x55\x98\x94\xcd\xdf\x1e\xeb\x36\xb2\xcb\xba\x1e\x4b\xa1\x16\x8c\xe7\x6e\x6a\x47\x4e\x67\x16\x82\xf0\x1b\x55\x4a\x44\x49\xe9\x7f\x00\x9a\xe8\xf2\xfa\x8e\xe1\xfa\x7e\x3c\xa8\x00\xc3\x39\x0e\x40\x90\xcf\xad\xe1\x5a\x1c\x46\xd9\x16\x54\x85\x5c\x4a\xc2\x1d\xdc\x1e\x0d\x08\x88\xe3\xa3\x95\x34\x2d\x87\xdb\x2e\x69\xea\xc4\xcc\x0d\x13\xb9\x0b\x78\xb5\x08\xe4\x44\x06\x5b\x43\x7b\x1b\x85\x7c\x69\x53\x5b\xcc\xe4\x51\x40\xb7\x7f\x68\x7a\x9d\xfa\x6f\xc3\x3f\x08\xdf\x59\xa3\x39\xd0\x9e\x5c\xe4\x45\x8a\x9e\xb5\xc3\x2b\xbb\x3a\x1b\x23\x7e\xe7\x11\x8c\xe8\x87\x56\xd9\xe9\x38\x0c\xcf\xdb\x3d\x5e\xf1\xcb\xa8\xef\x14\x88\x16\xdf\xfc\xe9\xbb\xef\x9e\x7a\xc5\xa7\x61\x8a\xbb\xc7\x2e\xf9\x34\xc8\xf4\x56\x93\x9b\xe1\xea\x39\x37\xc3\x73\x6e\x86\xea\xf3\xe8\xf6\xe1\xcf\x9f\x7d\x61\x94\xe8\xb6\x31\x22\xdb\x86\xe6\x57\x18\x18\x15\x37\x4e\x44\xdc\xe0\x0c\x0a\x9f\x23\x6f\xc2\x48\x31\x62\xc3\x73\x24\x3c\x67\x46\xf8\xba\x32\x23\x8c\x17\x23\x36\x56\x16\x84\xe1\xb1\x61\x5f\x4f\xc6\x83\xc1\x64\x63\x68\x5c\xfd\xe0\x68\xfa\xb1\x8a\x7e\x8c\xa5\xdd\x1f\x4d\xc3\x70\x5c\x8e\x57\xab\x6f\x71\x29\xde\x5c\x36\xfd\xe3\x63\x15\x24\xcb\xd7\xc2\x50\x97\x47\x14\x9d\xc9\x60\xcd\x03\x4e\x45\xec\x75\x77\xd7\x69\xf1\xde\xcf\x36\x1c\x04\xfc\xeb\xc3\xf7\x0b\x78\x36\x90\x0f\x73\x53\xff\xb2\xcc\xa3\x5f\x68\x05\xfc\x87\x32\x8f\xaa\x4a\xd6\x5c\xa7\x75\x04\x02\x09\x2c\x9c\x98\x87\x95\x69\x4a\xb2\x70\x7e\x7d\x45\x22\xc9\x20\xb5\x03\x4d\xd5\x94\xd4\x70\x78\xce\x80\x64\x39\x42\xc7\xd9\x51\xad\x59\x96\xeb\xa1\x98\xf7\x6c\x1d\xfd\xca\xac\xa3\x0f\x6e\xa5\x58\x16\x19\xe5\x13\x43\x2d\xc0\x3e\x5a\xf1\x3b\xd9\xb8\x0f\xa7\xc4\xd2\x05\x64\x2b\x40\x17\x0a\x21\xcd\x05\x4f\xfe\x59\xb0\x52\x5d\xe1\xb9\x8e\x03\x30\xee\xc0\x3c\x46\x86\x1d\x72\x54\x1b\x54\x24\x12\x5b\x41\x5c\x16\x20\x1e\x8e\x8e\x60\x04\x6c\x59\x45\xf5\xa6\x97\x0c\xb9\xb7\x6b\x48\x92\x50\xb6\xaa\xca\x87\x28\x20\xd2\x34\x15\xf7\xf8\xed\x90\x1f\x31\xfb\x67\xe6\x62\xf3\x92\xcc\x19\xc9\x12\x29\x85\xb4\x66\xa4\x70\x3a\xe8\x3e\x64\xe4\x4c\x26\x51\x60\x93\xd6\xe9\x63\xc6\xb4\xdd\x6a\x40\x15\x2d\x08\xe5\x18\xc0\x69\xfe\xef\x3c\xae\xe1\xdb\x8e\xde\xcd\xd9\x92\xae\x12\x51\x48\xec\xad\x05\x39\xb2\x3f\xc1\xdd\xbb\x16\x85\xd7\x9d\x17\x10\xa1\xe5\x57\xa7\x6a\xe0\xf4\xae\xfc\x11\x04\xdc\x58\x38\x75\xe4\x84\x7d\x4a\x94\xde\x5e\x8b\x03\x91\x2b\x39\xf1\x18\x98\xb7\x52\xb9\xb9\x60\x3f\xee\x1d\x7b\x5b\xc5\xb7\x70\xb4\x2a\xa7\xba\x9a\xc1\x4f\x5d\x7c\xaa\xcd\x58\x83\x21\xf3\x2e\x1c\xee\xe9\xf9\xb0\xe2\x2a\xf7\xac\x75\x75\x90\x8c\xf2\x33\x93\xdc\xfa\x78\x2f\x8b\x34\x89\xd6\x57\x97\xe3\x7a\x6e\xe0\x98\xee\xfa\x53\xde\x6b\xc3\xbc\x27\xaf\xa8\x62\x31\x79\x4b\x39\x5d\xa0\xd6\xe5\x64\x76\xfd\xea\xed\xa9\xc1\x22\xd0\xea\x5c\x5d\xd6\xba\x76\xcc\xc2\xc1\xdf\x3d\x56\x9c\x3b\xd9\x04\xdd\x68\x6c\xc3\xd6\xa8\x7b\x82\xef\xd1\x52\x00\x10\xcf\x13\x0c\x29\x9f\x56\xc3\x0e\x5c\x6f\x26\x89\x42\xf7\x0d\x97\xfd\x4d\x6d\x92\xea\x55\x16\xdf\x3d\x24\x00\x02\xbd\x79\xdb\x2a\xfb\xd9\xc0\x7a\xd8\xb9\xaa\xd5\x48\xb4\xa4\x9a\x2d\xd6\x97\x2c\x4f\xc5\xda\x20\xc0\x75\xa0\xc6\xc7\xa6\x73\x64\x1b\xe4\x9c\x46\x44\x16\x29\xc3\xda\x42\x9b\x69\xd7\x38\x63\x71\x49\xe9\x12\xae\x34\x85\xa4\x6b\x38\x7e\xeb\x8c\x7a\x5f\x56\x7d\xaf\xa5\x09\xce\xb3\xb3\x55\x35\x45\xa5\x39\x25\xad\x5d\xfa\x5f\x4c\xf0\xf9\x6e\x9c\xdd\xc5\xae\xd9\xdb\x82\x59\xad\x0e\x08\xa7\xfc\xa6\x48\xcd\xe5\x93\xc6\x1b\x25\x5e\x81\x4f\xb3\x7b\x8c\xd9\x2e\x80\x26\x98\xd9\x9f\x91\x79\x61\x98\x38\xa6\x2a\x3a\xee\xed\x54\x9f\xf7\x4b\x34\x69\x9b\x4e\x84\xe6\x79\x9a\xa0\x0b\xb3\x90\xd6\x2e\x1d\x28\x34\xb7\x9b\xf5\x21\x2d\x3b\xf2\x32\xbb\xf1\x2e\x13\xb2\x62\x72\xde\x27\x4f\xc5\xae\x6c\x09\xcd\x13\xb0\xe3\xf4\xe6\x62\x2a\x1b\x77\x7e\x7d\x85\xbd\xeb\x14\xc7\xee\x47\xdc\x41\xbb\x37\xce\xbc\x61\x6b\x06\xa1\xe4\xe2\x33\x2d\x9d\x5f\x5f\x61\x6a\x2f\x9b\x6c\xa9\x54\x7f\x18\x39\x81\xa2\x93\x63\x99\xe1\x91\x2e\xcc\x88\x9a\x08\xee\x3f\xca\x78\x91\x31\x4c\xd0\x54\x16\x1b\x33\xc2\x23\x5f\x97\xa3\x97\xda\x13\x23\xeb\x18\xd1\xe7\xe8\x28\x64\x84\x31\xf4\x41\x06\xf3\x01\x62\x72\xf4\xa2\xd2\xca\x50\x8e\x72\xc2\x7d\xaf\x9f\xdd\xbd\x04\x76\xf4\x0a\xd8\xf9\x3e\xe3\x82\xdf\x58\x50\xfd\x74\xf3\x66\x3f\x44\x78\x57\x1d\xc3\x26\xf5\x61\x90\xbf\x30\xa7\x52\x27\x34\x25\x85\x4c\x9d\x59\x11\x63\x04\xac\x2b\xde\x92\xae\x82\xc4\x47\x53\x42\x5e\xe0\xee\xdb\xcd\xc1\x33\x8e\x05\x7c\xad\x2a\xb8\x48\xd3\x33\x72\x9b\x40\xc9\x76\xcd\x72\x12\x9a\xb5\x66\x09\x8f\x8c\x38\xc8\x27\xbe\x22\x0f\xcc\xc8\x09\x89\xfe\xa0\x83\xd5\x14\x78\x66\x96\xc6\x90\x0c\x13\x3e\x61\x0e\x7d\x04\x2a\x0b\x23\xc5\x5e\xa4\x85\xd2\x4c\xde\x08\x73\xa1\x04\x6e\x3b\x90\x18\x84\x86\x3f\xbf\x4a\x78\x0c\x7e\x5a\x37\x70\xf9\x44\x94\x13\x96\x80\x32\xc8\x0c\x09\xf6\x77\x83\x2c\x25\x52\x9e\xa8\x22\x5a\x9a\x25\x1d\xe5\x22\x56\x47\x86\x14\x1d\xa1\xca\x50\x1d\x9d\x9a\xbf\x36\xd7\x80\x5e\x38\x41\xbf\x97\x34\x4f\x8e\x4e\xcf\x08\x00\x08\x0c\x80\x42\x2f\x9f\x2e\x1e\xba\xb5\x82\x8c\xbe\x17\x16\xde\x84\x23\x00\x0e\xf2\xd2\xd4\x77\xbf\x4c\x34\xf3\xe5\xd5\x51\xd3\xe4\x33\xdd\x6c\x12\x7c\x42\xce\x39\x61\x59\xae\x41\x7b\x4d\x32\x46\x9d\x49\x9c\xad\x98\x5c\xeb\xa5\xcd\x04\xe2\x08\xc8\x93\x07\xfa\x30\x80\x6f\xd4\xae\x2f\x91\x1c\x4e\xd8\x16\x70\x8f\x5f\x1c\x6f\x12\xd2\xf2\x46\x78\xb2\xa0\x84\x2b\x7a\x2f\x30\x7e\x34\x3d\xab\x20\xc4\x57\x48\x2d\x3d\xfd\x78\xf3\xc6\x1a\x56\x10\x56\x3f\x26\x3c\x56\xbe\x9a\xa2\xf5\xfb\xb6\xf0\xae\x05\x32\xcc\xf0\x29\x02\x78\x9b\x05\xee\xcb\xb6\xb6\x0c\xef\xb8\xfe\xa6\xa1\x5a\x07\xb0\xa2\xc3\x5b\x11\xd7\x1f\x9d\xca\xfe\x5e\x05\x8d\xbd\xb3\x41\xa9\x77\xb1\x63\x59\x76\x77\x9d\xd7\xca\x04\xed\xdb\xd1\x02\xfa\xa6\x99\x94\x0a\x07\xa0\x93\xc1\x2f\xa0\x4d\xc2\x3c\xe7\xe4\x36\xa5\x8b\x12\x8d\x80\xea\x21\xa3\x75\x31\xfb\xe8\x96\xa0\x48\x52\xcf\xf2\x76\xf2\xc4\x5d\x5c\xf0\xa4\x84\x52\x63\x0b\xf3\x91\xda\x1f\xbb\x59\x61\x3f\x78\x33\x36\xf5\x31\x36\xea\x56\x45\x5e\x13\xfc\x9d\xce\x8e\x06\x98\xe0\x12\xb6\x39\xc1\x14\xfc\xa7\x80\x0f\x99\x7d\xac\xa0\x49\xc7\x7c\x1b\x90\xf6\x8e\xad\xef\x85\xac\xcf\xc5\x5e\xe5\xeb\x3d\x1d\x72\x5d\x9c\x04\xe6\x8c\x97\xa8\x1f\x14\xb5\x49\xe7\xf7\x46\xd5\xd6\xc9\xa7\x74\xce\xd2\xee\xa9\xbf\xa5\xb9\x99\x77\xe9\xf7\x8a\x8a\x00\x6b\x36\x45\x51\x04\x5d\xd4\x9c\x5b\xa0\x90\x0b\xca\x93\x5f\xd1\x59\x38\x32\x24\x41\x48\xf3\xe7\x09\x9a\x5e\x50\x8d\x90\xb2\x48\x9f\x5a\x54\xae\x25\xa1\x1d\xb8\x4e\xe3\x38\x41\x46\xe4\xba\x03\x2d\xdb\x81\x90\xf0\xbb\x5d\xb6\x0f\xda\xa3\x37\x19\x2e\xf6\x81\xf7\xae\xe5\xac\x77\x1f\xc7\x76\x1b\x70\x8f\xeb\xa2\x90\x2d\xee\x61\xad\xfd\x33\x9a\xd8\x62\xc1\xbb\x40\xd7\x62\x0e\xb5\x1c\xa6\x21\x90\x66\x7d\x7e\xb4\xcf\x70\x58\x06\x01\x9c\x65\x34\xd9\x17\x62\xf8\x0c\xd8\xb2\x8c\xea\x42\x26\xba\xf6\xfa\x6d\xef\x98\xf0\x1f\x8b\x39\xb3\x16\xf5\x9d\xbb\x73\x70\xac\x3c\xbf\xbe\xaa\x05\xcb\x38\xd7\x2c\xe8\x3d\xec\x04\x0d\x97\x46\x0a\x4e\xb3\x79\xb2\x28\x44\xa1\xd2\x75\xa8\xc6\xa5\xe0\x10\x30\x25\xe4\x0a\xf5\x58\xfc\x58\x13\xca\x05\x5f\x67\xb6\x29\x8f\xd2\x22\x66\x95\x11\xc1\x6e\xba\x12\x49\x4c\x68\xa1\x45\x46\x75\x12\x91\x48\x30\x19\x81\x8d\x35\x1c\xa9\x50\x8c\xd0\x86\xbe\x51\xa1\xb4\xc8\x48\x46\xa5\x5a\xd2\x34\x6d\xda\xe3\x11\xee\xf0\xb6\x64\xed\x13\x58\x7f\xe3\x8f\x2b\x9c\xf5\x9e\xf8\xdd\x91\x9b\xbe\x07\x7e\x9b\xc9\x0d\x1a\x60\xd5\x8c\xa5\x3d\xc6\xb0\x59\x11\x6a\xf3\x3d\x55\x10\xee\xc3\x92\x91\xbc\x98\xa7\x89\x02\xc9\x14\x28\xd1\x9a\xcc\xd9\x32\xb1\xde\xd9\xdd\x24\xa8\x71\x8b\xbb\xe0\xdc\x46\x03\x3a\x21\xd4\x42\xb2\x5b\xfb\xda\x2b\xed\x2a\xa3\x8b\x1e\x0c\xf8\x1b\x43\xb0\x29\x5f\xfb\x9b\x10\x92\x9c\xaa\x33\x22\xa4\xf5\xd8\xf1\x35\xe9\xed\x4f\x3e\x51\xae\x24\xef\x2d\xe8\xac\xeb\xbc\xc5\x77\x08\xa8\x60\xf2\x56\xc8\xcc\x00\x38\x91\xe4\xb6\xe0\xa0\xa0\x54\xd6\xd3\x1e\x6e\x09\xab\xe3\xa2\xa9\x12\xfe\x2c\xc3\x5e\x70\x37\x09\x42\x15\xb9\x67\x69\x3a\x25\xe7\x69\x6a\xb3\xaf\x06\x79\x36\xca\x58\xf9\xd2\x9f\x63\xbe\x26\x71\xb2\x60\x4a\x93\x93\xd9\x7f\x9d\x9f\x02\x8b\x02\xfa\x9f\x35\xd1\xd4\x85\x0a\x56\xf5\x5a\xc0\xec\xc4\x05\x30\x45\x11\xd5\x34\x15\x0b\x74\x69\x00\x1d\x39\x8f\x49\x9e\xd2\x35\x94\x56\xc8\xa9\x04\x6f\xdf\x08\x75\x5b\x44\x16\x1c\x92\x4a\x7f\xd6\xbb\xab\x9b\xa8\xb4\xe5\x7d\x9e\x00\x4e\xee\x49\x34\x3a\xb2\xeb\x3e\xec\xa5\x28\x59\x9e\xd2\x06\x6d\xcc\xd6\x81\x2f\x03\xc1\x8d\x78\x00\xa2\xbf\xe0\xcc\x8f\x31\x25\x33\xc4\x9d\x8c\xea\x08\xed\xc9\xff\xc8\x98\xa6\x31\xd5\x74\x6a\x64\xe8\x7f\x54\xa3\x12\x45\x1a\x9b\x81\x9a\x37\xba\x61\xce\xc8\x1c\x8b\x6e\x22\xf5\xc6\x70\xf0\xbe\x39\xc8\x35\xee\x3c\xb6\xaa\x7f\x06\xd2\x27\x58\xfe\xeb\x4f\x46\x84\x6d\xb5\x5f\x56\xe6\xba\xd9\xa9\xaa\x9d\x49\xab\x2b\xb1\xd8\x9a\x31\x48\xd1\xf9\xc1\x56\xa1\x72\x6f\x40\xf5\x7c\xfe\xee\xb2\x59\x4d\xd8\xad\x6a\xe9\x50\xad\x6c\xf2\xa7\x8d\xd3\x73\x8a\x79\xfb\x4b\xd5\x32\xe3\x42\x91\x20\x78\x13\x03\x7b\x28\xf7\x37\x87\x4b\xce\x9f\x82\xc6\x20\x0c\x3b\xc5\x7e\xcd\x7a\xa5\x5e\xa6\xb1\x3e\x06\xb1\xae\x28\xbf\x89\x9f\x6c\x63\xa3\x7e\xf6\xb1\xce\x48\xbc\xa6\x48\x3b\x84\x3c\x04\xe6\x38\xd5\xb2\x07\x76\x5f\x7b\x62\x4f\xbd\x98\x5b\xea\x0e\x13\xf5\x5b\x59\x71\xfa\xba\x63\xeb\x63\x2b\x23\x1a\x4c\x5f\x26\x39\x86\x8a\x5a\xf3\x8d\xdd\x5d\xf2\x91\xa6\x49\xec\x87\x40\xac\xbe\xe2\x67\xe4\x9d\xd0\xe6\x9f\xd7\x9f\x12\xa5\x51\xd6\xbe\x14\x4c\xbd\x13\x1a\xde\x8c\xb2\x54\x9c\xc2\x0e\x0b\xb5\xd2\x3e\x5a\x00\xe0\x5c\x05\x3a\x01\xb7\xa0\xab\xdb\x0a\x67\x64\x5a\x5f\x71\xc3\x11\xd8\x15\xf9\x10\x6a\x65\x87\x70\xf1\x3f\x5c\xf0\x09\xd8\x06\x6a\xc7\xb0\x80\x10\xb2\x02\x87\x96\xe1\xec\x50\xe8\x7c\x09\xbf\x24\xca\x11\x71\x7f\x67\x53\xa7\xae\x4c\x22\x92\x31\xb9\x00\x6b\x57\xd4\x61\xed\xe9\xab\xc2\xed\xa5\xb8\xed\xdc\x2b\x20\x99\x6f\x1a\xb5\x34\x5b\x9b\x14\xb4\x47\xb2\x94\xa1\xea\xe6\x5f\x86\xfa\x00\xa4\xfe\x0d\x71\xf4\x6a\x4a\xce\x5d\x89\x9f\xf0\x37\x6b\xf5\x0b\x87\x31\x23\x24\x8a\x18\x52\xb2\xa2\x29\xc3\x0a\x07\x94\xfb\x58\x37\x71\xbb\x45\xd8\xcf\x6c\x3c\xbd\x39\xb3\x9e\x65\x3a\xba\x63\xeb\xa3\xb3\xad\xad\x3d\xba\xe2\x47\x65\xc0\x63\x65\x33\x3d\x11\x05\x6e\xeb\x08\x7e\x3b\xda\xff\x2e\x68\x25\x96\xfd\x75\x49\x9d\xfb\xa6\xee\x92\x7a\xd3\x7f\x2d\xb3\x71\xa2\x4e\x41\xed\xc1\xb1\xd6\x92\x90\xa0\x06\x36\x6f\xc3\xd4\x2a\x86\x55\xbd\x4b\xf2\xbc\xcc\x44\x53\xe4\x0b\x49\x63\x46\x16\x92\xe6\xcb\x5d\xd9\x12\xe4\x6d\xea\x86\x7f\x32\x8c\x6e\x03\xf0\x5b\x64\xc3\xd6\x7e\xf7\x6c\xbe\x14\xe2\x0e\xc2\x10\x01\x11\x1e\x50\x93\xf1\x37\xfc\xd6\x65\xf9\xce\x09\xa5\x8a\xc4\x4c\xd3\x24\x05\x3f\x9a\xf7\x6f\xde\x5a\x4f\x1b\x77\x8f\xbb\x59\xd6\x3b\xad\x8c\x20\x00\xd0\xd8\x7a\x80\xdd\xb0\x55\xc2\xee\xad\x7e\xa3\xc9\x47\x66\x42\x16\x8c\x83\x63\x48\x8b\x03\xd5\x84\xa8\x24\x66\xaf\x21\xe8\xb9\x79\xa0\x01\x06\x87\x86\x39\x77\x1d\xde\x76\x0a\xde\x49\xbd\x7b\xdc\xb2\x5e\xfc\xbd\x16\xb2\x25\x09\x53\xbf\x18\xec\x7e\xf1\xd5\xd6\x8b\xff\x7b\xf2\xdd\x77\x7f\x68\x6c\x94\xd1\x4f\x49\x56\x64\xdf\x93\x3f\xfd\xf1\x8f\x7f\xf8\x63\x73\xb3\x84\x63\xb3\x6f\x9b\xd7\x67\x4f\xdb\xc5\xcd\xe5\x01\xc0\x3b\xf6\x9e\x8c\xed\xc6\xcc\x1e\x43\xdd\xd2\x24\x2d\xa4\xf5\xa1\xed\x29\x22\xfc\x10\xf6\x01\x43\x54\x19\x74\x42\xdd\x88\xce\xd1\xce\x3a\xe0\xdd\x26\x9c\x29\x28\x9e\x53\x70\xc9\x22\xb1\xe0\xc9\xaf\x2c\x76\xb5\x73\xc0\x21\x06\xb2\xec\x3b\x14\x27\x8c\xc7\x58\xc3\xd4\xdc\x79\x4b\xca\xe3\xb4\xcd\x51\xa2\xc7\x4a\xc3\x13\x3c\x08\x64\x70\xf3\xec\x04\xb0\xb7\x65\x8f\x0d\x70\x41\x25\x56\x6b\xb6\xc3\x1b\x0d\xc1\x36\x68\xa5\x48\x18\x67\x2d\x82\x75\xcd\x1c\xb7\xe4\x3e\x14\x59\xe1\xdd\x3f\x0b\x26\xd7\x10\x60\x53\x32\xf6\x81\x13\xde\x87\x32\x7f\x83\x5b\x86\xe5\xa8\x30\x81\xce\x86\x2c\x5c\x32\x31\xa5\x9b\xcc\xc6\xb7\xa1\x0f\x43\xb7\x03\x67\x35\x23\xe7\x84\x17\x69\xda\xd4\x94\x8b\x36\xfb\x5a\x08\xbb\x0e\x51\xb2\x9f\x8c\xd7\x57\x2d\x50\x03\xe9\xcf\xaa\x1c\x08\x17\x3e\x12\x2b\x7f\xd8\xea\x82\x70\xc1\xbd\xfc\x69\xfb\xfb\xd2\xf6\x4b\x13\xd4\x43\x8d\x80\xcf\x2e\xce\xb6\x3d\x93\xfb\x3c\xa4\x62\x01\x9f\x9d\xfc\x9a\xfa\x29\x19\x6a\xa6\x7e\x70\xaa\x86\x3d\x16\xdf\x47\xed\x50\xb3\xf4\x67\xe5\xc3\x16\xc0\xfb\x7a\x91\xed\xe0\x41\xd6\x73\x27\x7b\x28\x25\xf0\x79\x56\x4d\xec\x74\x13\xf5\x20\xcc\xbb\xa9\x29\x7a\xef\xaa\x64\x09\x5f\x09\x4c\xb2\xbd\x13\x0f\x77\xb3\xd5\x71\x83\x95\xbb\x07\xca\x6a\x79\x39\xcf\xfc\x86\x2c\xad\x11\x68\x49\xa1\xba\x95\xdd\xed\x2b\x68\x8f\xbb\x19\x45\x06\xa9\xae\xbc\x48\xd9\xdf\x12\xbd\x7c\xef\x92\xea\x5b\xac\xd6\x45\x9e\xc2\x62\x83\x1f\x0c\x0a\xdd\x94\x9c\xe1\x15\x96\x71\x63\x91\xc8\x32\xc6\x63\x74\x22\xca\xe8\x1d\x23\x65\xa9\x50\xc3\xe3\x01\x1b\x0c\xc3\xb1\x4f\x39\xe5\x25\x9f\xb8\x32\xb4\xbc\x0d\xa3\x7a\xe2\x53\xdf\xbb\xb6\x77\x40\x4b\x7b\x20\x4b\x10\x89\x52\x09\x58\x21\x73\x96\x0a\x08\x81\x47\x0f\x5b\xf4\x01\x77\x31\x20\x86\x24\xdb\xb7\xf6\xd6\xb3\x09\x37\x19\x5f\x94\x79\xbc\x54\x0a\x45\x7d\x2d\x05\x16\x9c\x4d\xc9\x8d\x65\x61\xfa\x71\x45\x7d\xc8\x69\x4f\x52\xba\xc3\x85\xf8\x69\x52\x66\xcb\x98\x18\x66\x77\x62\x67\xa3\x45\x96\x44\x5d\x9b\xd2\xad\xeb\xc0\x67\x73\x5b\x5c\xbf\x70\x63\x56\xee\x5d\x9f\xad\x71\x8d\x9f\x37\xa7\xe1\xf1\xa5\x36\x76\xdb\x9b\x2a\x31\x29\xef\x23\xbf\x31\x1b\x64\x33\xc2\x62\xd5\xa0\x24\x9c\x90\x8b\x9b\xd7\xe7\x1f\x5e\x9f\x91\x9f\xae\x2f\xe1\xdf\xcb\xd7\x6f\x5e\x9b\x7f\x2f\xde\xbf\x7b\xf7\xfa\xe2\x83\xe1\x60\x5e\x60\xd1\x00\x23\x40\x9a\xad\x31\x37\xa1\xa8\xd2\x29\xca\xd7\xe4\xb6\xd0\x86\x10\x95\x1f\xab\xcc\x82\xa2\xf6\x81\xc6\xb1\x11\x56\x9f\x1c\x02\xd4\x03\x7c\x53\x61\x13\x56\x4b\xc1\x3a\x0b\x36\x44\xae\x9b\x41\xfb\x3c\x18\xd6\x3b\xc8\xa4\xb2\xde\xa3\x3d\xa3\x4b\x7e\xe1\xe4\x07\x21\x89\xad\x4d\x07\xc5\x4a\x63\x75\x6c\x63\x78\xcc\xff\xa7\xf8\xea\x65\x2a\x16\xc7\x3e\xb4\x87\x91\x54\x2c\x88\x2a\xe6\x3e\xe4\x0a\x98\x00\x68\xfd\xc2\x35\xab\x44\xaa\x9c\xf9\xb8\xab\xa0\x97\x1f\xbc\xd2\x27\x6c\x10\x8e\xfb\x12\x0a\xca\x55\x5a\x9a\x17\x9b\x03\xbe\x78\x59\x3f\x03\xc7\xef\x25\x72\xa3\xc7\x2f\xdc\xe0\xfa\x7d\x92\xc6\x11\x95\xf1\x16\xc2\xc3\x9d\x8c\xf8\x02\xd0\xc3\x2c\xcb\x58\xfc\xbb\x1c\xdc\xe6\x46\x11\x2b\x26\x53\x9a\x63\x40\x00\xa4\xb9\x06\x8f\x29\xf8\xc8\x25\xcb\x19\x84\xbd\xb9\xe2\xf4\x8c\x47\xa9\x80\x34\x2c\x78\xa1\x9f\x55\x97\x8e\x1e\x54\x2e\x57\xa5\x0b\xbe\xf4\xc7\xeb\xe8\xcb\x24\xb0\xe0\x47\xbe\x13\xea\xa3\xe7\x79\x63\x22\x20\x1f\xe3\x83\x82\xb2\xe7\xf6\x19\x39\xb2\x11\x89\x47\x67\xe4\xc8\xe7\xba\x89\xad\x64\x70\xf4\xe2\xa8\x6c\x10\xc6\xb4\x81\x60\x60\xcd\x60\x13\xf8\x4e\x18\x3d\x0b\xd8\xe1\x8c\x75\xfe\xd3\x65\xbe\x22\x73\x23\x5b\xc5\x1d\xcc\xa1\x3a\xd0\xb4\x32\x91\xad\xaf\x96\xe1\x98\x9d\x5f\x34\xd3\x0f\xba\x6b\x48\x7f\x80\x61\x9d\x16\x38\x92\x99\xad\x74\x4e\x78\xb3\x0a\xe6\x79\x63\x63\x98\x50\x29\x91\x24\xa7\xd2\x88\x5f\xae\x65\xb5\x24\xde\x8b\xce\x82\x78\x3d\x30\x28\xb0\x29\xf5\x94\x54\x66\xbe\xc7\x45\x4a\x95\xaa\xd1\x36\x03\x15\x31\x03\x13\x86\x23\x13\xea\x0c\x6e\x90\xef\x7c\x49\x57\x2d\x09\x31\x7a\x4c\x5a\x53\xb9\x60\xba\xdd\x1a\x44\xf9\xfa\x7d\x6b\x0a\xbd\x49\xef\xa4\xbd\x93\x7e\x47\xb1\x72\x08\x13\xae\x27\x42\x4e\xb0\xcb\xf7\x44\xcb\xa2\xc9\xae\xa7\x93\x8c\x89\x42\xcf\x58\x24\x78\x7d\xf4\x8b\x6d\x37\x9a\x79\x6b\x87\x90\x20\x6b\x61\x3d\x77\x0c\x4c\x98\xf4\xd2\x09\xa3\x25\x77\xe3\xac\xaa\xd5\xb4\x3d\xef\xdf\xbc\x1d\xb2\xd9\x04\xc2\xe6\xdb\x77\xf2\xa3\xbd\x33\xf8\xc2\xcf\xd4\xce\xbc\xb5\xdb\xdb\x42\xef\xde\xe9\xc2\x5b\xeb\xda\x5b\x5b\x60\xb4\xa7\x5e\x69\x5c\xbf\xd2\x54\x17\x5b\xd8\x50\xd9\x1b\x4b\x2c\x67\x18\x7e\x68\x45\x91\x19\xf4\x0b\x15\x9b\xdb\xf9\x26\x30\x87\x0d\xb4\x73\x0e\x9a\x53\x62\x3b\x9a\xf3\xa9\x25\x4d\x50\x68\xa6\x91\x2e\x20\x8e\x9d\x6a\xeb\xcc\x69\x13\x2e\xfd\xae\x6e\x19\xb5\x62\x72\x9b\x68\x1c\x31\xa9\xd5\x1b\xaa\xf4\x4f\x79\x4c\x1b\x22\xdd\x36\x9c\x34\x95\x86\x03\x83\x2c\xfd\x3d\x67\xb1\xa1\xf0\x16\x04\x38\x1e\xb9\x37\xa4\xb7\xc0\x11\x1b\x5d\x0f\x1a\x51\xce\x1d\x20\xd3\x7d\x62\x3e\x55\x3f\xeb\x1b\x61\x60\x72\x5e\x4b\x80\xaa\xee\x29\x5d\xb3\x35\xd7\x89\x84\xd1\x08\x67\x9f\xea\xb4\x0c\xc3\x67\x9c\x32\xca\xeb\x83\x0d\x36\x30\x0a\xda\xed\x8e\x43\xf6\x03\xe4\x7e\x99\x18\x7e\x17\x23\x02\x15\x71\xfc\x57\xcc\x52\xd6\x10\x18\x38\xd0\x7d\xd6\x7e\xe1\xd2\x7e\xa0\x97\x6b\xd7\x75\xb5\x8f\x37\x62\x58\x0e\xde\x86\x9e\x94\x9c\xb6\xe5\x1e\xbc\xbc\xb6\xb9\x2a\x60\x5f\xe6\xa9\x88\xee\x30\x01\x1d\xe4\x7e\x48\x7e\x65\xd2\xf9\xda\x97\xc5\xe7\x6c\x45\xb4\x85\xab\xf6\xea\xe0\xe6\xca\x5f\xc1\x28\x66\x6c\x03\x40\x3f\xbe\x90\xa5\x36\xb5\xe0\x36\xd2\xf2\xf3\xb8\xeb\x3a\x29\x07\x62\x14\x2a\xd6\x92\x6d\x81\x07\x73\xd5\x40\x7e\x4c\x2b\xac\xd2\xcc\xc6\x06\xbd\xfc\xb1\x39\x8e\x66\x54\x17\xdc\xb6\x68\x1e\x6c\x01\xe0\xe3\x51\x6b\x6a\xa3\xd6\xb8\x9f\xbe\xda\xbe\x8e\xf8\x1e\xd2\x9f\xc3\xf7\x53\xee\x33\xda\xa8\x0e\x95\xa3\x5b\x38\x1b\x43\x1f\xca\x67\x17\xbb\x65\xdf\xc4\xbc\x3b\x59\xd6\xf8\x2e\x09\x54\xab\x89\x66\xbc\xd8\x61\xa3\x78\xd1\xfb\xe0\x56\xc8\x46\x01\x66\xbc\xc9\xb7\x47\x83\x75\x0e\x64\xb8\xcf\x66\x7f\xbd\xed\x80\x25\x43\xbd\x7c\x97\x33\x42\xc9\x32\x51\x5a\x48\x6b\x4e\x84\xe2\x75\x92\x42\x71\xdd\x7a\xbf\xb7\x71\x3c\x00\x2f\xfc\x14\x08\xcd\x73\x46\x7d\x5d\x2b\x7b\x37\x41\x61\x2a\xc9\x22\x21\xe3\xda\x89\x39\xd5\x40\x2d\x2f\x55\xfb\xf9\x11\x22\x5b\x53\xaa\xf4\x07\x3f\x07\xc3\x20\xf4\xa4\xc6\x55\xf6\xc7\x2e\xb1\x5c\x8d\x4b\xfd\x23\x78\xf9\xa3\x20\x94\xa3\x4a\x64\x18\x0f\xde\xcd\x64\x94\x6b\x43\x6e\x6e\xaf\x75\xdd\x7b\xce\x2d\x58\xe2\xe7\x99\x79\xc6\x94\x6a\x0d\xae\xda\x70\x4c\x81\x1c\xd2\xc4\xe7\x90\xb6\xdd\xdd\x65\x8f\x0c\x02\xba\xa0\xba\x2c\x6f\xeb\x66\x54\x23\xc0\x26\xa0\x42\xc1\x1f\xab\x41\x5b\x96\x2f\xa9\xea\xbb\x18\x7f\x8a\xbc\x5b\x73\xef\xe3\xd0\x73\x36\x92\x51\xd5\x16\x68\xba\x01\xdb\xb9\x4c\xd8\x2d\xb9\xa0\x19\x4b\x2f\xa8\x1a\x13\xb8\x40\x01\xa6\x84\x4d\x17\x53\x72\x7c\x13\x58\x98\xdf\x09\xfd\xb6\xad\xc6\x47\x47\xfa\x87\x3e\x27\xfa\x41\xcf\xf2\x60\x21\xa1\xfb\xe4\x0e\x3c\xb3\x83\x67\xd8\x72\x42\x0f\xe2\x6c\xb6\x47\x4b\x37\x9d\xc7\xea\x49\x2c\x24\x68\xfc\xa2\x7d\x4f\x64\x47\x00\x67\xd3\x29\x3c\xe4\xf3\xd7\xb1\x24\x3f\xc4\xac\x56\x65\xb2\xb5\xba\x0f\x15\xc9\x15\x6c\x06\xa1\x53\x21\xa4\x87\x37\x33\xbd\x98\x7d\x1c\x93\x6d\x79\xdc\x54\x05\x76\x03\x1b\x7f\x6f\xe1\xcb\x27\xed\xb7\xf0\xd0\x34\x08\x31\x58\x69\x0c\x06\x7c\x4e\xa7\x93\x4b\xf7\x55\xab\xeb\xf0\x99\x9d\xe1\xaf\x5b\x5b\x41\xcf\xb6\xa9\xe0\xc7\x09\xd4\x2a\x64\x2b\x2c\x10\x0a\x41\x2e\x8c\x70\xa6\xcc\xa1\x38\x6d\xf9\x7c\x4f\x81\xaa\x9f\x30\xd5\x2d\xe8\x76\x0a\xb1\xa4\x7b\x6b\x5d\xa3\xb6\x0d\xc6\xa7\xaf\xcc\xd6\x43\x26\xde\x41\x58\xeb\x96\x78\x76\x18\xac\x93\xfd\xdb\x71\xbc\x7a\x05\xee\xe6\xb3\x91\x49\xda\x74\xb9\x01\x22\x8d\x56\xe5\xc8\x50\xe0\x08\xf2\x8b\x23\xed\xb6\xe4\xa9\xaa\xbf\xbd\xd9\xa4\x81\xe0\x62\x59\xc5\xf0\xb1\x96\x55\x14\xc9\x78\x30\xef\xcc\x3f\xd2\x7b\xbc\x03\x48\xa6\xd2\x89\x40\x0f\x9b\x9c\x01\x9f\x2e\xac\x7b\x7c\x7c\xeb\x93\x29\xab\x15\xc7\x1e\x28\xaf\x8d\x62\x72\xc5\xe2\x8a\xa5\xce\xe6\xf9\xaf\xbe\x0b\xec\xb6\xe5\xf8\x16\xec\xe4\x5f\xff\xfe\xdd\xff\x05\x00\x00\xff\xff\x96\x44\x81\xaa\x39\x2a\x08\x00")
func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -125,7 +125,7 @@ func operatorsCoreosCom_clusterserviceversionsYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x93\xdb\x36\x12\xbe\xcf\xaf\xe8\x9a\x1c\x9c\x54\x59\x9a\x24\x7b\x49\xe9\xe6\x9d\x6c\xb6\x66\x37\x0f\x97\x67\xe2\x4b\x36\x87\x16\xd9\x12\x91\x01\x01\x04\x0f\xc9\xda\x54\xfe\xfb\x56\x03\x7c\x4a\x24\x45\x8d\x27\x8e\x6b\x2b\xbc\xd8\x43\x36\x80\x7e\xf7\xd7\x00\x84\x46\xbc\x25\xeb\x84\x56\x2b\x40\x23\xe8\x9d\x27\xc5\x7f\xb9\xe5\xe3\x57\x6e\x29\xf4\xcd\xee\x8b\xab\x47\xa1\xf2\x15\xdc\x06\xe7\x75\xf9\x86\x9c\x0e\x36\xa3\xaf\x69\x23\x94\xf0\x42\xab\xab\x92\x3c\xe6\xe8\x71\x75\x05\x80\x4a\x69\x8f\xfc\xda\xf1\x9f\x00\x99\x56\xde\x6a\x29\xc9\x2e\xb6\xa4\x96\x8f\x61\x4d\xeb\x20\x64\x4e\x36\x4e\x5e\x2f\xbd\xfb\x7c\xf9\xd5\xf2\xf3\x2b\x80\xcc\x52\x1c\xfe\x20\x4a\x72\x1e\x4b\xb3\x02\x15\xa4\xbc\x02\x50\x58\xd2\x0a\x84\x72\x1e\xa5\x34\x12\x95\x5b\x6a\x43\x16\xbd\xb6\x6e\x99\x69\x4b\x9a\xff\x29\xaf\x9c\xa1\x8c\xd7\xde\x5a\x1d\xcc\x0a\x06\x69\xd2\x6c\x35\x8b\xe8\x69\xab\xad\xa8\xff\x06\x58\x80\x96\x65\xfc\x7f\x12\xfd\x2e\x2d\xfa\x5a\xa2\x8a\x6f\xa5\x70\xfe\xdf\xc7\x5f\xbe\x15\xce\xc7\xaf\x46\x06\x8b\xb2\xcf\x6a\xfc\xe0\x0a\x6d\xfd\xf7\xed\xc2\xbc\x90\x30\xe9\x93\x50\xdb\x20\xd1\xf6\x46\x5d\x01\xb8\x4c\x1b\x5a\x41\x1c\x64\x30\xa3\xfc\x0a\xa0\x52\x5a\x35\xc9\x02\x30\xcf\xa3\x21\x50\xbe\xb6\x42\x79\xb2\xb7\x5a\x86\x52\x35\x8b\x30\x4d\x4e\x2e\xb3\xc2\xf8\xa8\xec\x87\x82\x60\x23\xac\xf3\x70\x7b\xff\x16\x84\x02\x5f\x50\x94\x09\xf4\x06\x32\x19\x9c\x27\x7b\x4f\x76\x27\x32\xaa\x7c\x23\xae\xdf\x4c\x07\xf0\x8b\xd3\xea\x35\xfa\x62\x05\x4b\x56\xf7\x72\x7c\xd0\x4f\x9f\xff\xdc\x19\x97\x6c\x78\x7b\xff\xb6\xf3\xce\x1f\x58\x42\xe7\xad\x50\xdb\x29\x8e\xd1\x18\xab\x77\x28\xa1\xd4\x39\x4d\xf0\x52\xd3\x9d\x2c\xfb\xea\xf4\xc3\xc8\xda\xc3\x53\x46\xe5\x0f\x4d\xd9\xfb\x90\xa6\x5c\x6b\x2d\xa9\xf2\x96\x9a\x78\xf7\x05\x4a\x53\xe0\x17\xd5\x4b\x97\x15\x54\x62\x6b\x24\x6d\x48\xbd\x7a\x7d\xf7\xf6\x6f\xf7\x47\x1f\xa0\xaf\x8b\x8e\xcb\x41\xce\x51\x48\x2e\x1a\xb0\x72\x9c\x18\x3d\x6c\x48\x04\x47\xd1\xa2\x6d\x04\x9c\xb0\xa9\xd7\xbf\x50\xe6\x3b\xaf\x2d\xfd\x1a\x84\xa5\xbc\xbb\x3a\x6b\xa4\x8e\xf1\xa3\xd7\xac\x9d\xce\x2b\x63\x79\x2d\xdf\x89\xa4\xf4\x74\x92\x4c\xef\xfd\x91\x64\x2f\x58\xfc\x44\xd7\x93\xac\x72\x78\xca\x2b\x9d\xb1\x50\xbe\x10\x0e\x2c\x19\x4b\x8e\x94\x6f\x85\x56\x95\x4c\x4b\x60\x67\x24\xeb\x38\xea\x82\xcc\x39\x11\xed\xc8\x7a\xb0\x94\xe9\xad\x12\xff\x6d\x66\x73\xe0\x75\x8a\x00\xf4\xe4\x3c\xc4\x10\x52\x28\x61\x87\x32\xd0\x4b\x40\x95\x43\x89\x07\xb0\xc4\xf3\x42\x50\x9d\x19\x22\x89\x5b\xc2\x77\xda\xb2\x01\x36\x7a\x05\x85\xf7\xc6\xad\x6e\x6e\xb6\xc2\xd7\x29\x34\xd3\x65\x19\x94\xf0\x87\x9b\x98\x0d\xc5\x3a\xb0\x35\x6e\x72\xda\x91\xbc\x71\x62\xbb\x40\x9b\x15\xc2\x53\xe6\x83\xa5\x1b\x34\x62\x11\x99\x55\x31\x8d\x2e\xcb\xfc\x13\x5b\x25\x5d\xf7\xe2\x48\x7d\x83\xfe\x0b\x75\xde\x9a\xd4\x35\xe7\x2f\x10\x8e\xdd\x24\x0e\x4f\xb2\xb4\x2a\xe5\x57\xac\x95\x37\xff\xb8\x7f\x80\x9a\x81\xa4\xf6\xa4\xe1\x96\xd4\xb5\xca\x66\x45\x09\xb5\x21\x9b\x28\x37\x56\x97\x71\x16\x52\xb9\xd1\x42\xf9\xf8\x47\x26\x05\x29\x0f\x2e\xac\x4b\xe1\x5d\xf4\x39\x72\x9e\xed\xb0\x84\xdb\x58\x41\x60\x4d\x10\x4c\x8e\x9e\xf2\x25\xdc\x29\xb8\xc5\x92\xe4\x2d\x3a\xfa\xc3\x55\xcd\x1a\x75\x0b\x56\xdf\x7c\x65\x77\x0b\xe0\xe9\x80\x93\x18\x03\xa8\x4b\xd4\xa8\x75\x3a\x31\x7e\x6f\x28\x6b\xa2\xa1\x89\xe9\x57\xc6\x48\x91\x25\xb7\x6f\xbc\x83\x1d\x79\xdd\x24\x82\x5e\x56\x9a\x64\x67\x2c\xec\x21\x95\x97\xd3\xb4\xd9\xff\x74\xb2\x10\x7f\x9a\x55\x46\x60\x22\x67\x40\xcc\x1b\x69\xe9\xd3\x2f\x47\xfa\xaa\x53\x3b\x3b\x34\x7b\x58\x70\x64\xdb\x82\x61\xb4\x14\xd9\x01\x36\xda\x72\x7e\xe8\xe8\x76\x09\x77\x1e\xca\xe0\xa2\xbf\x69\x45\xac\xd9\xeb\x57\xc1\xeb\x12\xbd\xc8\xae\x41\x5b\xb8\xfe\x0e\x55\x40\x79\xbd\x1c\x60\x61\xd4\x21\x5a\xde\x87\x54\x3a\x5c\x23\xda\x67\x5c\x75\xe3\x73\xa1\xb5\x78\x18\xf8\x2a\x3c\x95\x83\xc3\xce\x70\xbf\x25\xc5\x45\x63\x20\x63\xb7\x43\x39\x51\x6e\xc9\x9e\x7c\x4f\xde\x38\x3e\x6e\x64\xc9\x34\xac\x41\x3a\x17\x8d\x77\x1e\x7d\x38\x91\xb3\xe7\x22\xd7\xdd\x98\x8a\xe4\x9d\x04\x56\x15\xd0\x8d\xb6\x65\x8a\x29\x5c\xeb\x90\x92\x55\x9a\x9a\x3d\xc3\x79\x32\xae\x09\x15\x0e\xb6\x4c\x97\x46\x92\xef\xd7\xde\x25\xfc\x47\x41\xb5\x02\xa7\x43\x6f\x51\xc8\x38\x15\x66\x3e\xa0\x8c\x33\x52\x55\xa1\x0f\xce\x53\xb9\xbc\x7e\x9e\x48\xcd\xd0\xa3\xd4\xdb\xfb\x94\x0d\x06\x08\x4c\x81\x8e\x2e\x89\x3f\xef\x49\x05\xce\xc2\x95\x33\xbe\xca\x32\x1d\x94\x7f\x43\x9b\xf3\x21\x39\x3e\x16\x2c\x6d\xc8\x92\xca\xaa\xfa\xee\x12\x01\x60\xa2\x00\x5f\xa0\xe7\x48\x0e\x2e\xa9\x39\xd7\x09\x07\xe7\x0d\x94\xa9\x15\x3e\x1e\x95\x83\xca\x3b\x27\x2f\x4c\x62\x95\x61\x31\x5f\xdf\xd5\xf8\x24\xc1\x12\xaa\xa5\xf3\x43\xcc\xc1\xb9\x28\xe0\x67\x23\x48\xe6\x11\x7f\xce\xe1\xe0\xc5\x5d\xa5\xd0\x58\xc5\xbd\x06\x04\x23\x28\xa3\x1e\x1c\x8a\x0a\x23\xcc\xab\x97\x5c\xf0\x2c\x55\xdf\x5e\xa6\x5a\x5d\xc1\x80\x16\x2e\x79\x14\x0a\x90\x71\x81\xc8\xe1\x5f\xf7\x3f\x7c\x7f\xf3\x4f\x9d\x78\x63\x4b\x91\x73\xc9\x93\x4b\x52\xfe\x25\xb8\x90\x15\x80\x8e\x59\x63\xf7\x64\xff\xa7\x65\x89\x4a\x6c\xc8\xf9\x65\x35\x1b\x59\xf7\xd3\x97\x3f\x2f\xe1\x1b\x6d\x81\xde\x21\x07\xcf\x4b\x10\x49\x6b\x0d\xa8\xa8\x5c\x23\xa6\x72\x16\xa6\x19\x0b\x7b\xe1\x8b\xc8\x92\xd1\x79\xc5\xf4\x3e\x32\xeb\xf1\x91\xf3\x77\x62\x36\x70\x2f\xf3\x48\x2b\xb8\x4e\xad\x49\xb3\xf4\x6f\x0c\xc3\x7f\xbf\x86\x4f\xf7\x05\x59\x82\x6b\xfe\xf3\x3a\x2d\xd8\x60\x40\x7e\x57\xdb\xb1\x5d\x38\x3a\xa4\xb7\x62\xbb\xa5\x18\xf9\x0c\x68\x18\x34\x7c\xc6\x15\x42\x6c\x40\xe9\x0e\x71\x9c\x82\xf5\x69\x28\x13\x1b\x41\xf9\x09\x23\x3f\x7d\xf9\xf3\x35\x7c\xda\x97\x0b\x84\xca\xe9\x1d\x7c\x99\xda\x31\xe1\x58\xc6\xcf\x96\xf0\x10\x2d\x73\x50\x1e\xdf\xf1\x9c\x59\xa1\x1d\x29\xd0\x4a\x1e\x98\xe3\x02\x77\x04\x4e\x97\x04\x7b\x92\x72\x91\x50\x42\x0e\x7b\x3c\xb0\x0c\xb5\x2a\xd9\xaa\x08\x06\xad\x3f\x42\xc8\x0f\x3f\x7c\xfd\xc3\x2a\xad\xc6\x66\xdb\x2a\x5e\x82\xd1\xd7\x46\x30\xfe\x65\xe0\x9b\x50\x5c\xb4\x39\x33\x12\x92\x91\x38\xf5\x15\xa8\xb6\x54\x37\x8f\x9b\xc0\x78\x6a\x79\x8c\x98\x66\x7b\xfc\x10\x5c\x1d\x76\xf6\x08\x5b\x8f\x03\xed\x4f\x04\x85\xb3\x45\x8c\x3d\xe0\x2c\x11\xbf\xef\xf8\xe0\xa4\x88\x8f\x61\x4d\x56\x91\xa7\x28\x65\xae\x33\xc7\x02\x66\x64\xbc\xbb\xd1\x3b\x4e\xaa\xb4\xbf\xd9\x6b\xfb\x28\xd4\x76\xc1\x4e\xb6\x48\x96\x77\x37\x71\xf7\xe3\xe6\x93\xf8\xcf\x7b\x49\x34\x5a\xaa\x87\xc5\x8a\xe4\x1f\x42\x36\x5e\xc7\xdd\x3c\x59\xb4\x1a\x52\x5f\x52\x09\x5e\xdc\xa7\x80\xcf\x8e\x47\x73\xb8\xec\x0b\x91\x15\x75\xd3\xda\xc9\x70\x25\xe6\x29\x05\xa2\x3a\xfc\xe1\x6e\xcc\x0a\x0c\x96\xd7\x3e\x2c\xaa\x7d\xb9\x05\xaa\x9c\xff\xef\x84\xf3\xfc\xfe\xc9\x1a\x0b\x62\x66\x00\xff\x78\xf7\xf5\x87\x71\xee\x20\x9e\x18\xad\xeb\xa0\x72\x49\xdf\x6a\xfd\x18\xcc\x20\x48\xe8\x09\xf4\xf7\x2e\x75\xdd\x7f\x54\x5d\x9a\x50\x0b\x63\xf5\xd6\x72\xad\xec\x74\xb9\x60\x82\x4c\xe9\x35\x28\x83\xd9\x23\x6e\xa9\x5a\x34\x96\x11\xee\x8d\xab\x72\x54\xb5\x02\xe3\x30\xe7\x09\xb8\x7f\x94\xfb\xb4\x1b\x50\xf1\x39\xc2\x66\x5d\x17\x99\xc7\x88\x60\x2b\xbe\xcf\xf3\x7b\x16\x98\x4d\x61\xdb\xf4\x1c\x21\xdc\x37\xb4\x19\x25\x14\x39\xfb\xfd\x46\x0c\xb4\x27\x35\x89\x41\x5f\x8c\x7e\xb4\x64\x24\x0e\x81\x68\x98\x01\x21\xe1\x84\xcf\x31\xba\x23\x6b\xdc\x1e\x0d\xab\x2d\x52\x27\x8c\x4a\xcb\x3d\xb2\xf8\xa6\xb2\x02\x8b\x04\x7b\x74\x31\x03\xc9\x1d\xe5\x71\x03\x66\x0c\x87\xce\xb0\xc8\x3c\x69\x61\x16\x6c\x1e\x90\xf7\x09\xe0\xb9\xcb\xf8\x44\x3a\x4a\xcf\x59\x20\x3d\xc0\xd3\x5f\x70\xfa\x2f\x38\xfd\x91\xc3\xe9\x8b\x62\x60\x0a\x5a\x0f\xb9\xff\xc7\x0a\xb0\x2f\x12\x7a\x0a\x6c\x0f\x09\xfd\x91\x40\xee\x8b\x65\x9c\x84\xdf\x63\x82\x7e\x24\x20\xfc\x22\x61\x67\x02\xf2\x21\x91\xff\x9f\x61\xf9\x45\x3a\x9c\x80\xe8\x43\x7a\xfb\x28\x80\xfa\x6c\x01\x33\xad\xd2\x29\xf8\x04\x4a\xe9\x63\xad\x66\xc0\xf1\x3e\x30\x33\x8d\xb2\xb7\x4f\xdb\x85\xc9\xe7\xe0\xd4\x18\x24\x4f\xcf\x04\x30\xef\x4e\x72\x06\x93\x9d\xc7\xca\xe9\x59\x54\xdb\xd7\x67\x88\x78\xcd\x09\x92\x79\x08\x10\x40\xa2\xf3\x0f\x16\x95\x13\xf5\x0d\x8e\x69\xfa\x23\x8b\x7c\x8b\xdc\x76\x88\xb2\xe9\x32\x92\x7d\xc0\x37\x53\x56\x80\x36\x1e\xd5\x54\xfb\xf2\x8c\x69\x94\xf6\xc5\x58\xd3\xd1\x3e\x33\xa3\x84\x9f\x74\x0e\xb0\x82\x1c\x3d\x2d\x98\xa3\xb3\x62\xff\x18\x0f\x2b\x9f\x4d\x64\xc6\xf0\xc6\xea\x35\xe5\x7f\x9a\x54\x25\x39\x87\xdb\xcb\xc4\x79\x05\x45\x28\x51\x81\x25\xcc\x71\x2d\xa9\x9e\x84\xd1\x58\x3c\xad\x54\x5b\xc8\xc9\xa3\x90\xae\x73\xc2\xd2\xda\xf7\xd9\x84\xb5\x84\xee\x5c\x95\x80\xd3\x2b\x26\x69\x58\x3c\x28\xec\xd9\xe3\x85\x8b\x46\xfe\x23\x38\x1d\x3e\xb9\x9a\xe4\xf4\xbe\x39\x91\xea\x31\xf9\xb2\x3e\xc1\x7c\xb0\x81\x5e\xc2\x37\x28\x1d\xbd\x84\x1f\xd5\xa3\xd2\xfb\xe7\xe3\x37\x12\x5e\xa4\xd7\x83\x89\x5c\x35\x7c\x3e\x03\x2b\x6d\x77\x3f\x33\xd9\xdf\x35\x03\xea\x1d\x9a\xaa\x43\x5f\x04\x25\x7e\x0d\xfd\x46\xa5\x39\x64\xfa\xf4\xb8\x85\xb9\xbd\x7f\x1b\x9d\x23\xb5\xdb\x2e\x35\x32\x75\x6b\x77\x7b\xff\xd6\x7d\x76\xa6\x36\x4c\x4a\x65\x26\x1b\xd5\x9e\x3c\xdc\xd3\x1e\xb5\x5a\x52\x67\x9d\xab\x3f\xed\xb6\x8c\x09\x52\x2e\xe1\xce\xbf\x70\xcc\x83\xc8\x50\xca\x03\x77\x2d\xa2\xe4\xc0\x6c\x50\xcf\xb9\xaa\x36\xcd\xf9\x8c\x02\x71\x12\x6c\xb4\xd9\x50\xe6\xc5\x8e\x3a\xc3\x6b\x45\xa7\x0d\x27\xca\x2b\x39\xde\x8b\xb9\x7a\x2b\x67\x26\x6b\x6f\x2a\xf2\xda\x51\xba\xf6\x6f\xb5\x5a\x4d\x9a\x7a\xcd\xe8\x34\x8a\x60\xa3\x83\xca\x01\x7d\x34\xcf\x13\x79\xee\x9f\xe1\x7e\xb8\x03\xff\x69\xfc\xf4\x3c\x9b\x8d\x9d\x13\xf8\x06\x7d\x4d\x81\xaf\x36\xc9\xd1\x3b\xca\x42\xe7\x8e\x57\xf7\x0e\xc7\xd3\xf6\x1a\xcf\xbb\xec\x25\x68\x66\x56\xfa\x9c\x5b\x7f\xe7\xe2\x89\x67\x5d\xf4\x6c\xb9\x9f\x15\x69\xd3\x55\x77\x18\x7f\xbf\x49\x45\x37\x6e\x75\x66\x58\x92\xcc\xd0\x51\x7e\x5c\x8b\x13\x18\x9f\x53\x80\x67\x30\x7a\xae\xe8\xce\x98\x62\xba\x0e\x9e\x75\xfb\x58\x15\x13\xd5\xba\xbe\x05\xd1\xb4\x1b\x3d\xff\xe6\x7c\x82\x90\x91\x8d\x45\x26\x5d\xa2\x43\xd6\xd5\xbe\xd0\x4f\xce\x8c\x13\xd6\xee\xb1\xfe\x5d\x8d\xdf\x78\xc1\x88\xed\x16\x27\xd8\xae\xaa\x7f\x2d\xb6\xa3\xbc\x77\x95\x26\x16\xc9\x12\x0f\xf1\x6a\x5a\x69\xb4\xf5\x98\x0e\x38\x82\xca\xc9\x3a\x8f\x2a\xe7\xb1\xfb\xe2\x10\xd5\x60\x58\xe6\x02\x1d\x08\xef\x20\xf5\xc5\xbe\x32\xd8\xc5\x77\xb0\xe2\x7d\x97\xb3\x42\x76\x94\xfd\x9a\x07\x34\x10\xa1\xb7\x78\xaa\xab\x3d\xc3\x4c\x5a\x61\x9a\x31\x89\x13\x17\xab\xde\x37\xcf\xde\x7b\x32\xc7\x79\xb5\x23\x84\x8a\x70\x7c\x27\xf2\x74\x19\x89\x0c\x08\xf5\x3c\x49\xf5\xfc\x01\x4e\x3a\x98\x18\x0f\xab\x45\xb3\x4b\x33\x4a\x30\xd1\xd1\x9e\x4f\xea\xda\xa4\x9b\xf2\xe7\x62\x7f\xec\x6e\x5e\x7a\x1a\x29\xde\x33\x5d\x8e\xdf\x94\x4b\xcf\x89\x55\xeb\x5f\x5f\x4c\x58\xb7\x73\x57\x37\xde\x06\xf5\xb6\x42\x52\x87\x59\x36\x86\xb9\x5b\x10\x73\x36\x20\x16\xe9\x47\x18\x93\x14\x8f\x42\x9d\xde\x1f\xed\x12\x30\x00\x9b\x24\x68\x2f\x0e\xce\x24\x8b\x1b\x93\x93\xb4\xd5\xa1\xd4\x7b\x9e\x89\xa5\x5f\xa0\x7c\x98\x4d\xfc\x99\x13\xd5\x47\x48\xcf\x32\xd9\xf9\x5d\xf6\x99\x13\xb5\xa6\x79\xe6\xe9\x66\xec\x8f\xcf\x9c\x73\x37\x67\xe3\xf9\x19\xa0\xc7\x49\xc8\x57\xdd\xfe\x44\x4d\x32\x68\xbd\xc8\x82\x44\xdb\xc6\x7e\x4c\xf2\x27\xbf\x5b\xba\x98\x67\xe7\xd1\xfa\x31\x14\x7a\xbc\x29\x91\x28\x6b\x4e\xe3\xae\xd6\xbe\x20\xd5\x1c\xfe\xa5\x9f\x81\xc1\x9a\xb6\x5c\x3c\x8d\x91\x87\xfa\x37\x06\xed\x0d\x76\x29\x9c\x8f\xf8\xa1\xc5\x02\x73\xaf\x42\x8c\xaa\x7d\x0c\x02\x3b\xb2\x3b\xca\x57\xe0\x6d\x68\x5e\x79\x6d\x19\x17\xf5\xde\x85\x75\xc3\x5f\xab\x86\xca\x8e\xf0\xdb\xef\x57\xff\x0b\x00\x00\xff\xff\xae\xb2\xfa\x2c\x43\x37\x00\x00")
+var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x93\x1b\xb7\x11\xbe\xef\xaf\xe8\x5a\x1f\x64\x57\x89\x5c\xdb\xb9\x24\xbc\x29\xeb\x38\xb5\x89\x1f\x2a\xed\x5a\x17\xc7\x87\xe6\x4c\x93\x03\x2f\x06\x80\xf1\x20\xc5\xb8\xfc\xdf\x53\x0d\xcc\x93\x9c\x19\x0e\x57\x6b\x59\x95\xf2\x5c\xa4\x9d\x69\x00\xfd\xee\xaf\x01\x10\x8d\x78\x4b\xd6\x09\xad\x56\x80\x46\xd0\x3b\x4f\x8a\xff\x72\xcb\xc7\xbf\xba\xa5\xd0\x37\xbb\x2f\xae\x1e\x85\xca\x57\x70\x1b\x9c\xd7\xe5\x1b\x72\x3a\xd8\x8c\xbe\xa2\x8d\x50\xc2\x0b\xad\xae\x4a\xf2\x98\xa3\xc7\xd5\x15\x00\x2a\xa5\x3d\xf2\x6b\xc7\x7f\x02\x64\x5a\x79\xab\xa5\x24\xbb\xd8\x92\x5a\x3e\x86\x35\xad\x83\x90\x39\xd9\x38\x79\xbd\xf4\xee\xf3\xe5\xdf\x96\x9f\x5f\x01\x64\x96\xe2\xf0\x07\x51\x92\xf3\x58\x9a\x15\xa8\x20\xe5\x15\x80\xc2\x92\x56\x20\x94\xf3\x28\xa5\x91\xa8\xdc\x52\x1b\xb2\xe8\xb5\x75\xcb\x4c\x5b\xd2\xfc\x4f\x79\xe5\x0c\x65\xbc\xf6\xd6\xea\x60\x56\x30\x48\x93\x66\xab\x59\x44\x4f\x5b\x6d\x45\xfd\x37\xc0\x02\xb4\x2c\xe3\xff\x93\xe8\x77\x69\xd1\xd7\x12\x55\x7c\x2b\x85\xf3\xff\x3e\xfe\xf2\x8d\x70\x3e\x7e\x35\x32\x58\x94\x7d\x56\xe3\x07\x57\x68\xeb\xbf\x6b\x17\xe6\x85\x84\x49\x9f\x84\xda\x06\x89\xb6\x37\xea\x0a\xc0\x65\xda\xd0\x0a\xe2\x20\x83\x19\xe5\x57\x00\x95\xd2\xaa\x49\x16\x80\x79\x1e\x0d\x81\xf2\xb5\x15\xca\x93\xbd\xd5\x32\x94\xaa\x59\x84\x69\x72\x72\x99\x15\xc6\x47\x65\x3f\x14\x04\x1b\x61\x9d\x87\xdb\xfb\xb7\x20\x14\xf8\x82\xa2\x4c\xa0\x37\x90\xc9\xe0\x3c\xd9\x7b\xb2\x3b\x91\x51\xe5\x1b\x71\xfd\x66\x3a\x80\x9f\x9d\x56\xaf\xd1\x17\x2b\x58\xb2\xba\x97\xe3\x83\x7e\xfc\xfc\xa7\xce\xb8\x64\xc3\xdb\xfb\xb7\x9d\x77\xfe\xc0\x12\x3a\x6f\x85\xda\x4e\x71\x8c\xc6\x58\xbd\x43\x09\xa5\xce\x69\x82\x97\x9a\xee\x64\xd9\x57\xa7\x1f\x46\xd6\x1e\x9e\x32\x2a\x7f\x68\xca\xde\x87\x34\xe5\x5a\x6b\x49\x95\xb7\xd4\xc4\xbb\x2f\x50\x9a\x02\xbf\xa8\x5e\xba\xac\xa0\x12\x5b\x23\x69\x43\xea\xd5\xeb\xbb\xb7\x7f\xb9\x3f\xfa\x00\x7d\x5d\x74\x5c\x0e\x72\x8e\x42\x72\xd1\x80\x95\xe3\xc4\xe8\x61\x43\x22\x38\x8a\x16\x6d\x23\xe0\x84\x4d\xbd\xfe\x99\x32\xdf\x79\x6d\xe9\x97\x20\x2c\xe5\xdd\xd5\x59\x23\x75\x8c\x1f\xbd\x66\xed\x74\x5e\x19\xcb\x6b\xf9\x4e\x24\xa5\xa7\x93\x64\x7a\xef\x8f\x24\x7b\xc1\xe2\x27\xba\x9e\x64\x95\xc3\x53\x5e\xe9\x8c\x85\xf2\x85\x70\x60\xc9\x58\x72\xa4\x7c\x2b\xb4\xaa\x64\x5a\x02\x3b\x23\x59\xc7\x51\x17\x64\xce\x89\x68\x47\xd6\x83\xa5\x4c\x6f\x95\xf8\x6f\x33\x9b\x03\xaf\x53\x04\xa0\x27\xe7\x21\x86\x90\x42\x09\x3b\x94\x81\x5e\x02\xaa\x1c\x4a\x3c\x80\x25\x9e\x17\x82\xea\xcc\x10\x49\xdc\x12\xbe\xd5\x96\x0d\xb0\xd1\x2b\x28\xbc\x37\x6e\x75\x73\xb3\x15\xbe\x4e\xa1\x99\x2e\xcb\xa0\x84\x3f\xdc\xc4\x6c\x28\xd6\x81\xad\x71\x93\xd3\x8e\xe4\x8d\x13\xdb\x05\xda\xac\x10\x9e\x32\x1f\x2c\xdd\xa0\x11\x8b\xc8\xac\x8a\x69\x74\x59\xe6\x9f\xd8\x2a\xe9\xba\x17\x47\xea\x1b\xf4\x5f\xa8\xf3\xd6\xa4\xae\x39\x7f\x81\x70\xec\x26\x71\x78\x92\xa5\x55\x29\xbf\x62\xad\xbc\xf9\xc7\xfd\x03\xd4\x0c\x24\xb5\x27\x0d\xb7\xa4\xae\x55\x36\x2b\x4a\xa8\x0d\xd9\x44\xb9\xb1\xba\x8c\xb3\x90\xca\x8d\x16\xca\xc7\x3f\x32\x29\x48\x79\x70\x61\x5d\x0a\xef\xa2\xcf\x91\xf3\x6c\x87\x25\xdc\xc6\x0a\x02\x6b\x82\x60\x72\xf4\x94\x2f\xe1\x4e\xc1\x2d\x96\x24\x6f\xd1\xd1\xef\xae\x6a\xd6\xa8\x5b\xb0\xfa\xe6\x2b\xbb\x5b\x00\x4f\x07\x9c\xc4\x18\x40\x5d\xa2\x46\xad\xd3\x89\xf1\x7b\x43\x59\x13\x0d\x4d\x4c\xbf\x32\x46\x8a\x2c\xb9\x7d\xe3\x1d\xec\xc8\xeb\x26\x11\xf4\xb2\xd2\x24\x3b\x63\x61\x0f\xa9\xbc\x9c\xa6\xcd\xfe\xa7\x93\x85\xf8\xd3\xac\x32\x02\x13\x39\x03\x62\xde\x48\x4b\x9f\x7e\x39\xd2\x57\x9d\xda\xd9\xa1\xd9\xc3\x82\x23\xdb\x16\x0c\xa3\xa5\xc8\x0e\xb0\xd1\x96\xf3\x43\x47\xb7\x4b\xb8\xf3\x50\x06\x17\xfd\x4d\x2b\x62\xcd\x5e\xbf\x0a\x5e\x97\xe8\x45\x76\x0d\xda\xc2\xf5\xb7\xa8\x02\xca\xeb\xe5\x00\x0b\xa3\x0e\xd1\xf2\x3e\xa4\xd2\xe1\x1a\xd1\x3e\xe3\xaa\x1b\x9f\x0b\xad\xc5\xc3\xc0\x57\xe1\xa9\x1c\x1c\x76\x86\xfb\x2d\x29\x2e\x1a\x03\x19\xbb\x1d\xca\x89\x72\x4b\xf6\xe4\x7b\xf2\xc6\xf1\x71\x23\x4b\xa6\x61\x0d\xd2\xb9\x68\xbc\xf3\xe8\xc3\x89\x9c\x3d\x17\xb9\xee\xc6\x54\x24\xef\x24\xb0\xaa\x80\x6e\xb4\x2d\x53\x4c\xe1\x5a\x87\x94\xac\xd2\xd4\xec\x19\xce\x93\x71\x4d\xa8\x70\xb0\x65\xba\x34\x92\x7c\xbf\xf6\x2e\xe1\x3f\x0a\xaa\x15\x38\x1d\x7a\x8b\x42\xc6\xa9\x30\xf3\x01\x65\x9c\x91\xaa\x0a\x7d\x70\x9e\xca\xe5\xf5\xf3\x44\x6a\x86\x1e\xa5\xde\xde\xa7\x6c\x30\x40\x60\x0a\x74\x74\x49\xfc\x79\x4f\x2a\x70\x16\xae\x9c\xf1\x55\x96\xe9\xa0\xfc\x1b\xda\x9c\x0f\xc9\xf1\xb1\x60\x69\x43\x96\x54\x56\xd5\x77\x97\x08\x00\x13\x05\xf8\x02\x3d\x47\x72\x70\x49\xcd\xb9\x4e\x38\x38\x6f\xa0\x4c\xad\xf0\xf1\xa8\x1c\x54\xde\x39\x79\x61\x12\xab\x0c\x8b\xf9\xfa\xae\xc6\x27\x09\x96\x50\x2d\x9d\x1f\x62\x0e\xce\x45\x01\x3f\x1b\x41\x32\x8f\xf8\x73\x0e\x07\x2f\xee\x2a\x85\xc6\x2a\xee\x35\x20\x18\x41\x19\xf5\xe0\x50\x54\x18\x61\x5e\xbd\xe4\x82\x67\xa9\xfa\xf6\x32\xd5\xea\x0a\x06\xb4\x70\xc9\xa3\x50\x80\x8c\x0b\x44\x0e\xff\xba\xff\xfe\xbb\x9b\x7f\xea\xc4\x1b\x5b\x8a\x9c\x4b\x9e\x5c\x92\xf2\x2f\xc1\x85\xac\x00\x74\xcc\x1a\xbb\x27\xfb\x3f\x2d\x4b\x54\x62\x43\xce\x2f\xab\xd9\xc8\xba\x1f\xbf\xfc\x69\x09\x5f\x6b\x0b\xf4\x0e\x39\x78\x5e\x82\x48\x5a\x6b\x40\x45\xe5\x1a\x31\x95\xb3\x30\xcd\x58\xd8\x0b\x5f\x44\x96\x8c\xce\x2b\xa6\xf7\x91\x59\x8f\x8f\x9c\xbf\x13\xb3\x81\x7b\x99\x47\x5a\xc1\x75\x6a\x4d\x9a\xa5\x7f\x65\x18\xfe\xdb\x35\x7c\xba\x2f\xc8\x12\x5c\xf3\x9f\xd7\x69\xc1\x06\x03\xf2\xbb\xda\x8e\xed\xc2\xd1\x21\xbd\x15\xdb\x2d\xc5\xc8\x67\x40\xc3\xa0\xe1\x33\xae\x10\x62\x03\x4a\x77\x88\xe3\x14\xac\x4f\x43\x99\xd8\x08\xca\x4f\x18\xf9\xf1\xcb\x9f\xae\xe1\xd3\xbe\x5c\x20\x54\x4e\xef\xe0\xcb\xd4\x8e\x09\xc7\x32\x7e\xb6\x84\x87\x68\x99\x83\xf2\xf8\x8e\xe7\xcc\x0a\xed\x48\x81\x56\xf2\xc0\x1c\x17\xb8\x23\x70\xba\x24\xd8\x93\x94\x8b\x84\x12\x72\xd8\xe3\x81\x65\xa8\x55\xc9\x56\x45\x30\x68\xfd\x11\x42\x7e\xf8\xfe\xab\xef\x57\x69\x35\x36\xdb\x56\xf1\x12\x8c\xbe\x36\x82\xf1\x2f\x03\xdf\x84\xe2\xa2\xcd\x99\x91\x90\x8c\xc4\xa9\xaf\x40\xb5\xa5\xba\x79\xdc\x04\xc6\x53\xcb\x63\xc4\x34\xdb\xe3\x87\xe0\xea\xb0\xb3\x47\xd8\x7a\x1c\x68\x7f\x20\x28\x9c\x2d\x62\xec\x01\x67\x89\xf8\x5d\xc7\x07\x27\x45\x7c\x0c\x6b\xb2\x8a\x3c\x45\x29\x73\x9d\x39\x16\x30\x23\xe3\xdd\x8d\xde\x71\x52\xa5\xfd\xcd\x5e\xdb\x47\xa1\xb6\x0b\x76\xb2\x45\xb2\xbc\xbb\x89\xbb\x1f\x37\x9f\xc4\x7f\xde\x4b\xa2\xd1\x52\x3d\x2c\x56\x24\xff\x10\xb2\xf1\x3a\xee\xe6\xc9\xa2\xd5\x90\xfa\x92\x4a\xf0\xe2\x3e\x05\x7c\x76\x3c\x9a\xc3\x65\x5f\x88\xac\xa8\x9b\xd6\x4e\x86\x2b\x31\x4f\x29\x10\xd5\xe1\x77\x77\x63\x56\x60\xb0\xbc\xf6\x61\x51\xed\xcb\x2d\x50\xe5\xfc\x7f\x27\x9c\xe7\xf7\x4f\xd6\x58\x10\x33\x03\xf8\x87\xbb\xaf\x3e\x8c\x73\x07\xf1\xc4\x68\x5d\x07\x95\x4b\xfa\x46\xeb\xc7\x60\x06\x41\x42\x4f\xa0\xbf\x77\xa9\xeb\xfe\xa3\xea\xd2\x84\x5a\x18\xab\xb7\x96\x6b\x65\xa7\xcb\x05\x13\x64\x4a\xaf\x41\x19\xcc\x1e\x71\x4b\xd5\xa2\xb1\x8c\x70\x6f\x5c\x95\xa3\xaa\x15\x18\x87\x39\x4f\xc0\xfd\xa3\xdc\xa7\xdd\x80\x8a\xcf\x11\x36\xeb\xba\xc8\x3c\x46\x04\x5b\xf1\x7d\x9e\xdf\xb3\xc0\x6c\x0a\xdb\xa6\xe7\x08\xe1\xbe\xa1\xcd\x28\xa1\xc8\xd9\xef\x37\x62\xa0\x3d\xa9\x49\x0c\xfa\x62\xf4\xa3\x25\x23\x71\x08\x44\xc3\x0c\x08\x09\x27\x7c\x8e\xd1\x1d\x59\xe3\xf6\x68\x58\x6d\x91\x3a\x61\x54\x5a\xee\x91\xc5\x37\x95\x15\x58\x24\xd8\xa3\x8b\x19\x48\xee\x28\x8f\x1b\x30\x63\x38\x74\x86\x45\xe6\x49\x0b\xb3\x60\xf3\x80\xbc\x4f\x00\xcf\x5d\xc6\x27\xd2\x51\x7a\xce\x02\xe9\x01\x9e\xfe\x84\xd3\x7f\xc2\xe9\x8f\x1c\x4e\x5f\x14\x03\x53\xd0\x7a\xc8\xfd\x3f\x56\x80\x7d\x91\xd0\x53\x60\x7b\x48\xe8\x8f\x04\x72\x5f\x2c\xe3\x24\xfc\x1e\x13\xf4\x23\x01\xe1\x17\x09\x3b\x13\x90\x0f\x89\xfc\xff\x0c\xcb\x2f\xd2\xe1\x04\x44\x1f\xd2\xdb\x47\x01\xd4\x67\x0b\x98\x69\x95\x4e\xc1\x27\x50\x4a\x1f\x6b\x35\x03\x8e\xf7\x81\x99\x69\x94\xbd\x7d\xda\x2e\x4c\x3e\x07\xa7\xc6\x20\x79\x7a\x26\x80\x79\x77\x92\x33\x98\xec\x3c\x56\x4e\xcf\xa2\xda\xbe\x3e\x43\xc4\x6b\x4e\x90\xcc\x43\x80\x00\x12\x9d\x7f\xb0\xa8\x9c\xa8\x6f\x70\x4c\xd3\x1f\x59\xe4\x1b\xe4\xb6\x43\x94\x4d\x97\x91\xec\x03\xbe\x99\xb2\x02\xb4\xf1\xa8\xa6\xda\x97\x67\x4c\xa3\xb4\x2f\xc6\x9a\x8e\xf6\x99\x19\x25\xfc\xa4\x73\x80\x15\xe4\xe8\x69\xc1\x1c\x9d\x15\xfb\x87\x78\x58\xf9\x6c\x22\x33\x86\x37\x56\xaf\x29\xff\xc3\xa4\x2a\xc9\x39\xdc\x5e\x26\xce\x2b\x28\x42\x89\x0a\x2c\x61\x8e\x6b\x49\xf5\x24\x8c\xc6\xe2\x69\xa5\xda\x42\x4e\x1e\x85\x74\x9d\x13\x96\xd6\xbe\xcf\x26\xac\x25\x74\xe7\xaa\x04\x9c\x5e\x31\x49\xc3\xe2\x41\x61\xcf\x1e\x2f\x5c\x34\xf2\xef\xc1\xe9\xf0\xc9\xd5\x24\xa7\xf7\xcd\x89\x54\x8f\xc9\x97\xf5\x09\xe6\x83\x0d\xf4\x12\xbe\x46\xe9\xe8\x25\xfc\xa0\x1e\x95\xde\x3f\x1f\xbf\x91\xf0\x22\xbd\x1e\x4c\xe4\xaa\xe1\xf3\x19\x58\x69\xbb\xfb\x99\xc9\xfe\xae\x19\x50\xef\xd0\x54\x1d\xfa\x22\x28\xf1\x4b\xe8\x37\x2a\xcd\x21\xd3\xa7\xc7\x2d\xcc\xed\xfd\xdb\xe8\x1c\xa9\xdd\x76\xa9\x91\xa9\x5b\xbb\xdb\xfb\xb7\xee\xb3\x33\xb5\x61\x52\x2a\x33\xd9\xa8\xf6\xe4\xe1\x9e\xf6\xa8\xd5\x92\x3a\xeb\x5c\xfd\x69\xb7\x65\x4c\x90\x72\x09\x77\xfe\x85\x63\x1e\x44\x86\x52\x1e\xb8\x6b\x11\x25\x07\x66\x83\x7a\xce\x55\xb5\x69\xce\x67\x14\x88\x93\x60\xa3\xcd\x86\x32\x2f\x76\xd4\x19\x5e\x2b\x3a\x6d\x38\x51\x5e\xc9\xf1\x5e\xcc\xd5\x5b\x39\x33\x59\x7b\x53\x91\xd7\x8e\xd2\xb5\x7f\xab\xd5\x6a\xd2\xd4\x6b\x46\xa7\x51\x04\x1b\x1d\x54\x0e\xe8\xa3\x79\x9e\xc8\x73\xff\x0c\xf7\xc3\x1d\xf8\x4f\xe3\xa7\xe7\xd9\x6c\xec\x9c\xc0\x37\xe8\x6b\x0a\x7c\xb5\x49\x8e\xde\x51\x16\x3a\x77\xbc\xba\x77\x38\x9e\xb6\xd7\x78\xde\x65\x2f\x41\x33\xb3\xd2\xe7\xdc\xfa\x3b\x17\x4f\x3c\xeb\xa2\x67\xcb\xfd\xac\x48\x9b\xae\xba\xc3\xf8\xfb\x4d\x2a\xba\x71\xab\x33\xc3\x92\x64\x86\x8e\xf2\xe3\x5a\x9c\xc0\xf8\x9c\x02\x3c\x83\xd1\x73\x45\x77\xc6\x14\xd3\x75\xf0\xac\xdb\xc7\xaa\x98\xa8\xd6\xf5\x2d\x88\xa6\xdd\xe8\xf9\x37\xe7\x13\x84\x8c\x6c\x2c\x32\xe9\x12\x1d\xb2\xae\xf6\x85\x7e\x72\x66\x9c\xb0\x76\x8f\xf5\x6f\x6b\xfc\xc6\x0b\x46\x6c\xb7\x38\xc1\x76\x55\xfd\x6b\xb1\x1d\xe5\xbd\xab\x34\xb1\x48\x96\x78\x88\x57\xd3\x4a\xa3\xad\xc7\x74\xc0\x11\x54\x4e\xd6\x79\x54\x39\x8f\xdd\x17\x87\xa8\x06\xc3\x32\x17\xe8\x40\x78\x07\xa9\x2f\xf6\x95\xc1\x2e\xbe\x83\x15\xef\xbb\x9c\x15\xb2\xa3\xec\xd7\x3c\xa0\x81\x08\xbd\xc5\x53\x5d\xed\x19\x66\xd2\x0a\xd3\x8c\x49\x9c\xb8\x58\xf5\xbe\x79\xf6\xde\x93\x39\xce\xab\x1d\x21\x54\x84\xe3\x3b\x91\xa7\xcb\x48\x64\x40\xa8\xe7\x49\xaa\xe7\x0f\x70\xd2\xc1\xc4\x78\x58\x2d\x9a\x5d\x9a\x51\x82\x89\x8e\xf6\x7c\x52\xd7\x26\xdd\x94\x3f\x17\xfb\x63\x77\xf3\xd2\xd3\x48\xf1\x9e\xe9\x72\xfc\xa6\x5c\x7a\x4e\xac\x5a\xff\xfa\x62\xc2\xba\x9d\xbb\xba\xf1\x36\xa8\xb7\x15\x92\x3a\xcc\xb2\x31\xcc\xdd\x82\x98\xb3\x01\xb1\x48\x3f\xc2\x98\xa4\x78\x14\xea\xf4\xfe\x68\x97\x80\x01\xd8\x24\x41\x7b\x71\x70\x26\x59\xdc\x98\x9c\xa4\xad\x0e\xa5\xde\xf3\x4c\x2c\xfd\x02\xe5\xc3\x6c\xe2\xcf\x9c\xa8\x3e\x42\x7a\x96\xc9\xce\xef\xb2\xcf\x9c\xa8\x35\xcd\x33\x4f\x37\x63\x7f\x7c\xe6\x9c\xbb\x39\x1b\xcf\xcf\x00\x3d\x4e\x42\xbe\xea\xf6\x27\x6a\x92\x41\xeb\x45\x16\x24\xda\x36\xf6\x63\x92\x3f\xf9\xdd\xd2\xc5\x3c\x3b\x8f\xd6\x8f\xa1\xd0\xe3\x4d\x89\x44\x59\x73\x1a\x77\xb5\xf6\x05\xa9\xe6\xf0\x2f\xfd\x0c\x0c\xd6\xb4\xe5\xe2\x69\x8c\x3c\xd4\xbf\x31\x68\x6f\xb0\x4b\xe1\x7c\xc4\x0f\x2d\x16\x98\x7b\x15\x62\x54\xed\x63\x10\xd8\x91\xdd\x51\xbe\x02\x6f\x43\xf3\xca\x6b\xcb\xb8\xa8\xf7\x2e\xac\x1b\xfe\x5a\x35\x54\x76\x84\x5f\x7f\xbb\xfa\x5f\x00\x00\x00\xff\xff\xa9\xc5\x05\x0b\x43\x37\x00\x00")
func operatorsCoreosCom_installplansYamlBytes() ([]byte, error) {
return bindataRead(
@@ -145,7 +145,7 @@ func operatorsCoreosCom_installplansYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_olmconfigsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\x6f\x6f\xdb\x46\xd2\x7f\xef\x4f\x31\xd0\xf3\x00\xb1\x73\x12\x15\x27\x87\x5c\x4a\x20\x08\x02\xe5\x5c\x04\x89\xaf\x41\xec\xcb\x01\x67\xf9\xae\x43\x72\x44\x6d\x43\xee\xb2\xbb\xb3\xb6\xd5\xa2\xdf\xfd\x30\xbb\x24\x45\xc9\xa2\x63\xa0\xad\xde\x58\x9a\x9d\x9d\x9d\xbf\xbf\x99\x31\x36\xea\x0b\x59\xa7\x8c\x4e\x01\x1b\x45\x77\x4c\x5a\x7e\xb9\xe4\xeb\x2b\x97\x28\x33\xbf\x39\x3d\xfa\xaa\x74\x91\xc2\xc2\x3b\x36\xf5\x67\x72\xc6\xdb\x9c\xde\xd1\x4a\x69\xc5\xca\xe8\xa3\x9a\x18\x0b\x64\x4c\x8f\x00\x50\x6b\xc3\x28\x64\x27\x3f\x01\x72\xa3\xd9\x9a\xaa\x22\x3b\x2b\x49\x27\x5f\x7d\x46\x99\x57\x55\x41\x36\x08\xef\x9e\xbe\x79\x96\xbc\x4a\x9e\x1d\x01\xe4\x96\xc2\xf5\x4b\x55\x93\x63\xac\x9b\x14\xb4\xaf\xaa\x23\x00\x8d\x35\xa5\x60\xaa\x3a\x37\x7a\xa5\x4a\x97\x98\x86\x2c\xb2\xb1\x2e\xc9\x8d\x25\x23\x7f\xea\x23\xd7\x50\x2e\x2f\x97\xd6\xf8\x26\x85\x83\x3c\x51\x56\xa7\x20\x32\x95\xc6\xaa\xee\x37\xc0\x4c\x1e\x09\xdf\xa3\xe1\x3f\x7c\x3c\x5f\x84\x27\x03\xad\x52\x8e\x3f\xec\xd2\x3f\x2a\xc7\xe1\xac\xa9\xbc\xc5\x6a\xa8\x64\x20\x3b\xa5\x4b\x5f\xa1\x1d\x1c\x1c\x01\xb8\xdc\x34\x94\xc2\xa2\xf2\x8e\xc9\x1e\x01\xb4\xce\x68\xf5\x98\xb5\x06\xdf\x9c\xb6\x6a\xb9\x7c\x4d\x35\x76\x4a\x82\x98\xa6\xdf\x7e\x7a\xff\xe5\xc5\xc5\xde\x01\x40\x41\x2e\xb7\xaa\xe1\xe0\xda\x5e\x4d\x50\x0e\x10\x6c\x1b\x40\xf9\xd2\x18\xed\x54\x56\x11\xac\x8c\x85\xa8\x98\xb7\x4a\x97\x72\x27\x19\xc8\xe3\x8d\x68\x6a\xb2\x9f\x28\xe7\x01\xd9\xd2\xcf\x5e\x59\x2a\x86\x4f\x8b\xe2\x5d\x42\x0c\xc8\x8d\x95\x48\xf0\xc0\xcb\xf1\x33\x48\xbf\x1d\xfa\x9e\x0d\x4f\xc4\xd0\xc8\x07\x85\x64\x1e\x39\xe0\x35\x75\x2e\xa3\xa2\xf5\x0e\x98\x15\xf0\x5a\x39\xb0\xd4\x58\x72\xa4\x63\x2e\x0a\x19\x75\x6b\x40\x02\x17\x64\xe5\x22\xb8\xb5\xf1\x55\x21\x86\xdf\x90\x65\xb0\x94\x9b\x52\xab\x5f\x7a\x69\x0e\xd8\x84\x67\x2a\x64\x72\x0c\x4a\x33\x59\x8d\x15\xdc\x60\xe5\x69\x0a\xa8\x0b\xa8\x71\x03\x96\x44\x2e\x78\x3d\x90\x10\x58\x5c\x02\xe7\xc6\x12\x28\xbd\x32\x29\xac\x99\x1b\x97\xce\xe7\xa5\xe2\xae\xb8\x72\x53\xd7\x5e\x2b\xde\xcc\x43\x9d\xa8\xcc\x4b\xae\xce\x0b\xba\xa1\x6a\xee\x54\x39\x43\x9b\xaf\x15\x53\xce\xde\xd2\x1c\x1b\x35\x0b\xca\xea\x50\x60\x49\x5d\xfc\x5f\x17\x4d\xf7\x64\xcf\x7d\x31\x64\x8e\x25\x9c\x3b\x47\x21\xa7\x1f\xf4\xb5\x64\x77\xcc\x95\x78\x3d\xda\xb2\x75\xa9\x90\xc4\x2b\x9f\xff\x7e\x71\xb9\x4d\xa7\xe0\xf6\xe8\xe1\x2d\xab\xdb\x3a\x5b\x1c\xa5\xf4\x8a\x6c\xe4\x5c\x59\x53\x07\x29\xa4\x8b\xc6\x28\xcd\xe1\x47\x5e\x29\xd2\x0c\xce\x67\xb5\x62\x17\x12\x8c\x1c\x4b\x1c\x12\x58\x04\x6c\x81\x8c\xc0\x37\x05\x32\x15\x09\xbc\xd7\xb0\xc0\x9a\xaa\x05\x3a\xfa\xd3\x5d\x2d\x1e\x75\x33\x71\xdf\xe3\x9d\x3d\x84\xc6\xfb\x17\xee\x15\x14\x40\x07\x5f\xa3\xd1\xe9\xab\xf9\xa2\xa1\x5c\xa2\x24\x6e\x93\x5b\xa1\x86\x51\x0f\xca\xbd\x0b\x4d\xf2\xd8\xc7\xc7\xcb\x54\x3e\x2b\x42\x71\xcd\x81\x93\x3d\x15\xcf\x5a\xc6\x80\xfd\xa8\x74\xd4\x51\x70\x53\xea\xb0\x83\x19\x14\xdc\xf9\xe1\xe3\x79\x2f\x77\x5f\xcd\x6f\xa8\xfa\x2d\x75\x83\x5a\xca\xc9\x33\x0b\xd3\x28\x2a\x16\x17\x5f\x46\xd8\xf6\xf4\x7f\xb7\x7f\x4b\xdc\xec\x1d\x15\x02\x07\xad\x48\xd1\xfc\x89\x83\x49\x64\x82\xc5\xc5\x97\x49\x67\x48\x08\x44\xdf\x77\x40\x69\xc7\x58\x55\x54\x00\x76\x39\x1e\x00\x3f\xe2\xff\x14\x6e\xd7\x64\x09\x70\x97\x5c\xf4\x02\xe4\x6d\xa3\xa5\xbc\x90\x61\x8d\x0e\x32\x22\x3d\x10\xaa\x74\x08\x7a\xcb\xfd\xbd\x74\xbd\xc8\xcb\x68\x4b\x62\x07\x58\x55\xb1\xdd\x35\x98\x0b\x20\xfd\x6b\x4d\x1a\x2c\x91\x16\x33\x8a\x69\x08\xc1\xad\xaa\x2a\x81\x3f\xe9\xbd\x14\x94\x1c\x18\xe6\x26\xc1\x22\xc2\x7c\x3d\xa6\xe4\xa1\xd0\x6d\xc3\x97\x19\x53\x11\xea\xdd\x3c\x67\x64\x7f\x2f\x1c\x23\x99\x1e\x78\xfb\x5c\x8f\xbf\xfe\xec\x6c\xcf\x8d\x2e\xd4\x60\x8e\x39\x24\x14\xad\xc5\xcd\x81\x53\xc5\x54\x8f\x65\xe4\xd0\xc2\xc9\xa2\x7b\x64\x5b\x2a\x05\x31\xaa\x2a\xda\x27\x71\x47\xa9\x6d\x8e\x7d\x8d\x20\xf7\xd6\x06\x80\x64\x09\x54\xd7\xec\xde\x7e\x7a\x0f\xdd\x5c\x96\xc0\x6c\x36\x83\x4b\x21\x3b\xb6\x3e\x67\xf1\x9b\x34\x2e\x5d\x50\x11\xa4\x16\xca\x86\x6e\xe5\x44\xb8\xf8\x30\x98\xd1\x65\xe7\x4a\x51\x55\x40\x83\xbc\x86\x24\xba\x3a\xd9\xba\x22\x01\x38\x93\x54\xb8\xc3\xba\xa9\x68\x1a\xdc\x00\x67\xc6\xb4\x11\x8a\x0f\xfe\x0a\xf3\x39\x7c\xee\x3b\x40\x90\x6a\x32\x47\xf6\x26\xce\x85\xa1\x19\xc3\xca\x98\x27\x6e\xd7\x9e\x44\x2e\x7e\xd0\xe6\x56\x1f\x7a\x3a\xbc\x85\x96\x52\x58\x4e\xde\xde\xa0\xaa\x24\x7f\x97\x93\x29\x2c\x27\x9f\xac\x29\x2d\x39\x19\xb3\x84\x20\x6d\x79\x39\x79\x47\xa5\xc5\x82\x8a\xe5\x44\xc4\xfe\xa5\x41\xce\xd7\xe7\x64\x4b\xfa\x40\x9b\xd7\x41\x58\x4f\xbe\x60\x2b\x43\xe0\xe6\x75\x2d\xe7\x81\x2e\x68\x75\xb9\x69\xe8\x75\x8d\x4d\x4f\x38\xc7\xa6\xbf\xdc\x87\xce\xc1\xd5\xb5\xc0\xfc\xcd\x69\xb2\x0d\xe7\x8f\x3f\x39\xa3\xd3\xe5\x64\xab\xff\xd4\xd4\x92\x16\x0d\x6f\x96\x13\xd8\x79\x35\x5d\x4e\xc2\xbb\x1d\xbd\x53\x32\x5d\x4e\xe4\x25\x21\x5b\xc3\x26\xf3\xab\x74\x39\xc9\x36\x4c\x6e\x7a\x3a\xb5\xd4\x4c\xa5\xaa\x5f\x6f\x5f\x58\x4e\x7e\x84\xa5\x16\x65\x0d\xaf\xc9\xc6\x48\x3a\xf8\x6d\x72\x30\x11\xbf\x81\xac\x63\xc3\xdd\xf6\x33\x83\x0a\x1d\x5f\x5a\xd4\x4e\x75\x03\xfb\x28\x6b\x4d\xce\x61\x39\x7e\x6e\x09\x9d\xd1\xa3\xc7\x31\x1b\x46\x8f\xc5\x96\x83\x87\xdf\xea\x0f\x70\xc0\x86\x31\xce\xbd\xda\xbd\x7f\xb1\x03\x28\x39\x01\x16\x42\xa8\xd8\x3e\x27\xb8\xe7\x96\x42\x94\xf1\x47\xea\xbb\x85\x33\x36\x80\x3a\xc4\x2d\x69\x8b\x37\xce\xa6\x19\x49\x83\xd0\x41\x94\xd7\x05\xd9\x6a\x23\xe3\xd7\x56\x6a\xbe\x46\x5d\xca\x2c\x04\xef\x57\x11\xf8\x95\x03\x99\x93\xbe\x4a\x21\x4d\xe5\xa2\x06\xef\xba\x99\x2d\xe8\xd5\x4b\x14\xe0\x88\x05\xdf\x8a\x09\x63\x5f\x9e\x53\xc3\x52\x5d\x63\xb0\xfe\xc0\xc0\x33\xfc\xac\x8c\xad\x91\x53\x90\x61\x6d\xc6\xe3\xe9\xd1\x26\xc7\x23\x1d\xdf\x72\xc7\x01\x75\xed\x6b\x94\x6e\x86\x45\x68\xca\xfd\x99\x2e\x54\x8e\x61\x50\xed\xf0\x14\x33\xe3\x23\xc2\x6d\xe3\xd0\xba\x5a\x26\xd3\x8c\x04\x09\x43\x7d\xb6\x66\xfd\x4e\xe3\x6b\xbc\xfb\x48\xba\xe4\x75\x0a\x2f\x9e\xff\xed\xe5\xab\x11\xc6\x08\x8c\x54\x7c\x4f\x5a\x5a\xe9\x81\x3d\x68\xc4\x0d\xf7\x2f\x0e\xa6\xee\x60\x67\xd2\x0d\x9f\x49\xb9\xe5\x89\xa3\xc1\x4e\x5e\xde\xa2\x03\x47\x0c\x19\xca\x88\xe3\x1b\xf1\x8b\xa0\x7c\x98\x31\x74\x4e\x53\x50\xab\xc3\xc2\x54\x0f\xe0\xd5\x06\x4e\x9f\x4f\x21\x6b\x5d\x7c\x1f\xbe\xaf\xee\xae\x93\x03\x2a\x2b\x07\xdf\x4d\xf7\xf4\x91\x81\xc7\x87\x8e\x27\x89\x03\xb7\x8a\xd7\x61\x57\x95\xa6\xd5\xee\x63\x07\xda\x20\xf5\xfa\x7e\x2b\x70\xd2\x0c\xcb\xb0\x70\x1f\xfe\x74\x69\xab\x34\xbf\xfc\xeb\x78\x7c\x95\x56\xb5\xaf\x53\x78\x36\xc2\x12\x21\xed\x91\xd1\x8c\xcc\xdb\x29\x00\x05\xba\x4a\x8b\x75\x8d\xac\x72\x50\x85\xec\x21\x2b\x45\x76\x98\xda\x62\x74\x7b\x51\xfa\xfa\x8e\x17\x9f\xb8\x16\x87\x06\xc9\xfe\xc9\x9a\xc2\xe7\xb2\x8b\x99\x55\x58\x19\xd4\x4a\xe5\x43\x80\x92\x05\x27\x54\x43\x5c\xb1\x81\xee\xc4\xe9\xfd\x32\x1b\xf7\x5d\x42\xad\x74\xe9\xda\x27\x65\x93\x13\x00\x89\x5d\xf7\x76\x4d\xa1\xf5\x84\xd5\xbc\xbd\x63\x83\x56\x4e\x15\x64\x65\x06\x86\xd2\xa3\x45\xcd\x44\x85\xc0\x8f\x94\x60\xcb\x3b\x80\x3c\xdc\xae\x75\x5d\x35\xc6\x52\x8d\x60\x25\x2a\xb6\xab\x60\xa8\xd8\x3f\xae\x54\x4f\x9f\x3d\x7f\x30\xe4\x3d\xdf\x28\x53\x83\xcc\x64\x75\x0a\xff\xb9\x7a\x3b\xfb\x37\xce\x7e\xb9\x3e\x6e\xbf\x3c\x9b\x7d\xf7\xdf\x69\x7a\xfd\x74\xf0\xf3\xfa\xe4\xcd\xff\x8f\x48\x3a\x3c\x20\x8f\xa4\x4f\xdb\x44\xba\x21\xb1\x8b\xe8\x34\x74\x18\xb3\x82\x4b\xeb\x69\x0a\x67\x58\x39\x9a\xc2\x3f\x75\x68\x0d\xbf\xd3\x69\xa4\x7d\x3d\xae\x9d\x74\xe5\x89\xbc\x7a\x78\xf8\xe8\x59\x82\x4a\x0f\xf3\xb4\xea\x3e\xb4\x61\x3c\xce\x49\x61\x6c\x8b\x0b\x68\x87\x34\x83\x7f\x1f\x40\x40\x3c\x19\x4b\x93\x76\xbc\x4d\x72\x53\xcf\x07\xff\x5e\x90\xb9\xfa\x1c\xf5\x06\xb6\xb0\x16\x87\xd2\xfd\x4c\x77\x2c\xd8\x84\xb9\x35\xce\xf5\x6b\x89\x83\x4a\x7d\x25\xe8\x27\xd7\x08\x96\x19\xe5\x18\x06\x71\x9b\x29\xb6\x68\x37\x83\xbd\x03\x72\xd4\xe1\xbf\x1d\x8e\x56\xbe\x82\x63\x47\x04\x89\x36\x05\xdd\x47\xd7\x93\x88\xa1\x98\xa9\x4a\xf1\x26\xac\xa9\x24\x7b\x76\xa5\xda\xf9\xbf\x6e\x8c\x65\xd4\x1c\xcb\xcd\x52\x49\x77\xa0\x18\x6a\x99\x37\x29\xac\x56\xc7\x85\x76\xa7\xa7\xcf\x5f\x5c\xf8\xac\x30\x35\x2a\x7d\x56\xf3\xfc\xe4\xcd\xf1\xcf\x1e\x2b\x41\x9e\xe2\x1f\x58\xd3\x59\xcd\x27\x7f\x5c\x5b\x3c\x7d\xf9\x88\x2a\x3a\xbe\x8a\xb5\x72\x7d\x7c\x35\x6b\xbf\x3d\xed\x48\x27\x6f\x8e\x97\xc9\x83\xe7\x27\x4f\xc5\x86\x41\x05\x5e\x5f\xcd\xb6\xe5\x97\x5c\x3f\x3d\x79\x33\x38\x3b\xe9\x8a\x31\xf6\xa9\x14\xd8\xfa\x6e\x68\x71\x6c\xac\x0c\x29\x3b\x34\x9f\xf5\xe1\xdd\x26\x61\x5b\xb9\xf0\xeb\x6f\x47\xff\x0b\x00\x00\xff\xff\x65\x57\xc7\x70\x5d\x17\x00\x00")
+var _operatorsCoreosCom_olmconfigsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x58\x6f\x6f\xdb\x46\xd2\x7f\xef\x4f\x31\xd0\xf3\x00\xb1\x73\x12\x15\x27\x87\x5c\x43\x20\x08\x02\xe5\x5c\x04\x89\xaf\x41\xec\xcb\x01\x67\xf9\xae\x43\x72\x44\x6d\x43\xee\xb2\xbb\xb3\xb6\xd5\xa2\xdf\xfd\x30\xbb\x24\x45\xc9\xa2\x63\xa0\xad\xde\x58\x9a\x9d\x9d\x9d\xbf\xbf\x99\x31\x36\xea\x0b\x59\xa7\x8c\x4e\x01\x1b\x45\x77\x4c\x5a\x7e\xb9\xe4\xeb\x77\x2e\x51\x66\x7e\x73\x7a\xf4\x55\xe9\x22\x85\x85\x77\x6c\xea\xcf\xe4\x8c\xb7\x39\xbd\xa3\x95\xd2\x8a\x95\xd1\x47\x35\x31\x16\xc8\x98\x1e\x01\xa0\xd6\x86\x51\xc8\x4e\x7e\x02\xe4\x46\xb3\x35\x55\x45\x76\x56\x92\x4e\xbe\xfa\x8c\x32\xaf\xaa\x82\x6c\x10\xde\x3d\x7d\xf3\x2c\x79\x95\x3c\x3b\x02\xc8\x2d\x85\xeb\x97\xaa\x26\xc7\x58\x37\x29\x68\x5f\x55\x47\x00\x1a\x6b\x4a\xc1\x54\x75\x6e\xf4\x4a\x95\x2e\x31\x0d\x59\x64\x63\x5d\x92\x1b\x4b\x46\xfe\xd4\x47\xae\xa1\x5c\x5e\x2e\xad\xf1\x4d\x0a\x07\x79\xa2\xac\x4e\x41\x64\x2a\x8d\x55\xdd\x6f\x80\x99\x3c\x12\xbe\x47\xc3\x7f\xf8\x78\xbe\x08\x4f\x06\x5a\xa5\x1c\x7f\xd8\xa5\x7f\x54\x8e\xc3\x59\x53\x79\x8b\xd5\x50\xc9\x40\x76\x4a\x97\xbe\x42\x3b\x38\x38\x02\x70\xb9\x69\x28\x85\x45\xe5\x1d\x93\x3d\x02\x68\x9d\xd1\xea\x31\x6b\x0d\xbe\x39\x6d\xd5\x72\xf9\x9a\x6a\xec\x94\x04\x31\x4d\xbf\xfd\xf4\xfe\xcb\x8b\x8b\xbd\x03\x80\x82\x5c\x6e\x55\xc3\xc1\xb5\xbd\x9a\xa0\x1c\x20\xd8\x36\x80\xf2\xa5\x31\xda\xa9\xac\x22\x58\x19\x0b\x51\x31\x6f\x95\x2e\xe5\x4e\x32\x90\xc7\x1b\xd1\xd4\x64\x3f\x51\xce\x03\xb2\xa5\x9f\xbd\xb2\x54\x0c\x9f\x16\xc5\xbb\x84\x18\x90\x1b\x2b\x91\xe0\x81\x97\xe3\x67\x90\x7e\x3b\xf4\x3d\x1b\x9e\x88\xa1\x91\x0f\x0a\xc9\x3c\x72\xc0\x6b\xea\x5c\x46\x45\xeb\x1d\x30\x2b\xe0\xb5\x72\x60\xa9\xb1\xe4\x48\xc7\x5c\x14\x32\xea\xd6\x80\x04\x2e\xc8\xca\x45\x70\x6b\xe3\xab\x42\x0c\xbf\x21\xcb\x60\x29\x37\xa5\x56\xbf\xf4\xd2\x1c\xb0\x09\xcf\x54\xc8\xe4\x18\x94\x66\xb2\x1a\x2b\xb8\xc1\xca\xd3\x14\x50\x17\x50\xe3\x06\x2c\x89\x5c\xf0\x7a\x20\x21\xb0\xb8\x04\xce\x8d\x25\x50\x7a\x65\x52\x58\x33\x37\x2e\x9d\xcf\x4b\xc5\x5d\x71\xe5\xa6\xae\xbd\x56\xbc\x99\x87\x3a\x51\x99\x97\x5c\x9d\x17\x74\x43\xd5\xdc\xa9\x72\x86\x36\x5f\x2b\xa6\x9c\xbd\xa5\x39\x36\x6a\x16\x94\xd5\xa1\xc0\x92\xba\xf8\xbf\x2e\x9a\xee\xc9\x9e\xfb\x62\xc8\x1c\x4b\x38\x77\x8e\x42\x4e\x3f\xe8\x6b\xc9\xee\x98\x2b\xf1\x7a\xb4\x65\xeb\x52\x21\x89\x57\x3e\xff\xfd\xe2\x72\x9b\x4e\xc1\xed\xd1\xc3\x5b\x56\xb7\x75\xb6\x38\x4a\xe9\x15\xd9\xc8\xb9\xb2\xa6\x0e\x52\x48\x17\x8d\x51\x9a\xc3\x8f\xbc\x52\xa4\x19\x9c\xcf\x6a\xc5\x2e\x24\x18\x39\x96\x38\x24\xb0\x08\xd8\x02\x19\x81\x6f\x0a\x64\x2a\x12\x78\xaf\x61\x81\x35\x55\x0b\x74\xf4\xa7\xbb\x5a\x3c\xea\x66\xe2\xbe\xc7\x3b\x7b\x08\x8d\xf7\x2f\xdc\x2b\x28\x80\x0e\xbe\x46\xa3\xd3\x57\xf3\x45\x43\xb9\x44\x49\xdc\x26\xb7\x42\x0d\xa3\x1e\x94\x7b\x17\x9a\xe4\xb1\x8f\x8f\x97\xa9\x7c\x56\x84\xe2\x9a\x03\x27\x7b\x2a\x9e\xb5\x8c\x01\xfb\x51\xe9\xa8\xa3\xe0\xa6\xd4\x61\x07\x33\x28\xb8\xf3\xc3\xc7\xf3\x5e\xee\xbe\x9a\xdf\x50\xf5\x5b\xea\x06\xb5\x94\x93\x67\x16\xa6\x51\x54\x2c\x2e\xbe\x8c\xb0\xed\xe9\xff\x6e\xff\x96\xb8\xd9\x3b\x2a\x04\x0e\x5a\x91\xa2\xf9\x13\x07\x93\xc8\x04\x8b\x8b\x2f\x93\xce\x90\x10\x88\xbe\xef\x80\xd2\x8e\xb1\xaa\xa8\x00\xec\x72\x3c\x00\x7e\xc4\xff\x29\xdc\xae\xc9\x12\xe0\x2e\xb9\xe8\x05\xc8\xdb\x46\x4b\x79\x21\xc3\x1a\x1d\x64\x44\x7a\x20\x54\xe9\x10\xf4\x96\xfb\x7b\xe9\x7a\x91\x97\xd1\x96\xc4\x0e\xb0\xaa\x62\xbb\x6b\x30\x17\x40\xfa\xd7\x9a\x34\x58\x22\x2d\x66\x14\xd3\x10\x82\x5b\x55\x55\x02\x7f\xd2\x7b\x29\x28\x39\x30\xcc\x4d\x82\x45\x84\xf9\x7a\x4c\xc9\x43\xa1\xdb\x86\x2f\x33\xa6\x22\xd4\xbb\x79\xce\xc8\xfe\x5e\x38\x46\x32\x3d\xf0\xf6\xb9\x1e\x7f\xfd\xd9\xd9\x9e\x1b\x5d\xa8\xc1\x1c\x73\x48\x28\x5a\x8b\x9b\x03\xa7\x8a\xa9\x1e\xcb\xc8\xa1\x85\x93\x45\xf7\xc8\xb6\x54\x0a\x62\x54\x55\xb4\x4f\xe2\x8e\x52\xdb\x1c\xfb\x1a\x41\xee\xad\x0d\x00\xc9\x12\xa8\xae\xd9\xbd\xfd\xf4\x1e\xba\xb9\x2c\x81\xd9\x6c\x06\x97\x42\x76\x6c\x7d\xce\xe2\x37\x69\x5c\xba\xa0\x22\x48\x2d\x94\x0d\xdd\xca\x89\x70\xf1\x61\x30\xa3\xcb\xce\x95\xa2\xaa\x80\x06\x79\x0d\x49\x74\x75\xb2\x75\x45\x02\x70\x26\xa9\x70\x87\x75\x53\xd1\x14\x96\x3a\x78\x02\xce\x8c\x69\x83\x14\xdf\xfc\x15\xe6\x73\xf8\xdc\x37\x81\x20\xd8\x64\x8e\xec\x4d\x1c\x0d\x43\x3f\x86\x95\x31\x4f\xdc\xae\x49\x89\x5c\xfc\xa0\xcd\xad\x3e\xf4\x7a\x78\x0b\x2d\xa5\xb0\x9c\xbc\xbd\x41\x55\x49\x0a\x2f\x27\x53\x58\x4e\x3e\x59\x53\x5a\x72\x32\x69\x09\x41\x3a\xf3\x72\xf2\x8e\x4a\x8b\x05\x15\xcb\x89\x88\xfd\x4b\x83\x9c\xaf\xcf\xc9\x96\xf4\x81\x36\xaf\x83\xb0\x9e\x7c\xc1\x56\xe6\xc0\xcd\xeb\x5a\xce\x03\x5d\x00\xeb\x72\xd3\xd0\xeb\x1a\x9b\x9e\x70\x8e\x4d\x7f\xb9\x8f\x9e\x83\xab\x6b\x41\xfa\x9b\xd3\x64\x1b\xd1\x1f\x7f\x72\x46\xa7\xcb\xc9\x56\xff\xa9\xa9\x25\x33\x1a\xde\x2c\x27\xb0\xf3\x6a\xba\x9c\x84\x77\x3b\x7a\xa7\x64\xba\x9c\xc8\x4b\x42\xb6\x86\x4d\xe6\x57\xe9\x72\x92\x6d\x98\xdc\xf4\x74\x6a\xa9\x99\x4a\x61\xbf\xde\xbe\xb0\x9c\xfc\x28\x31\x99\xcf\xc1\xf0\x9a\x6c\x0c\xa6\x83\xdf\x26\x07\x73\xf1\x1b\xe0\x3a\x36\xdf\x6d\x3f\x33\xa8\xd0\xf1\xa5\x45\xed\x54\x37\xb3\x8f\xb2\xd6\xe4\x1c\x96\xe3\xe7\x96\xd0\x19\x3d\x7a\x1c\xb3\x61\xf4\x58\x6c\x39\x78\xf8\xad\x16\x01\x07\x6c\x18\xe3\xdc\x2b\xdf\xfb\x17\x3b\x8c\x92\x13\x60\x21\x84\xa2\xed\x73\x82\x7b\x6e\xa9\x45\x99\x80\xa4\xc4\x5b\x44\x63\x03\xa8\x43\xdc\x92\xb6\x7e\xe3\x78\x9a\x91\xf4\x08\x1d\x44\x79\x5d\x90\xad\x36\x32\x81\x6d\xa5\xe6\x6b\xd4\xa5\x8c\x43\xf0\x7e\x15\xb1\x5f\x39\x90\x51\xe9\xab\x14\xd2\x54\x2e\x6a\xf0\xae\x1b\xdb\x82\x5e\xbd\x44\xc1\x8e\x58\xf3\xad\x98\x30\xf9\xe5\x39\x35\x2c\xd5\x35\x86\xec\x0f\xcc\x3c\xc3\xcf\xca\xd8\x1a\x39\x05\x99\xd7\x66\x3c\x9e\x1e\x6d\x72\x3c\xd2\xf1\x2d\x77\x9c\x51\xd7\xbe\x46\x69\x68\x58\x84\xbe\xdc\x9f\xe9\x42\xe5\x18\x66\xd5\x0e\x52\x31\x33\x3e\x82\xdc\x36\x0e\xad\xab\x65\x38\xcd\x48\xc0\x30\xd4\x67\x6b\xd6\xef\x34\xbe\xc6\xbb\x8f\xa4\x4b\x5e\xa7\xf0\xe2\xf9\xdf\x5e\x7e\x37\xc2\x18\x81\x91\x8a\xef\x49\x4b\x37\x3d\xb0\x0a\x8d\xb8\xe1\xfe\xc5\xc1\xe0\x1d\xec\x4c\xba\xf9\x33\x29\xb7\x3c\x71\x3a\xd8\xc9\xcb\x5b\x74\xe0\x88\x21\x43\x99\x72\x7c\x23\x7e\x11\xa0\x0f\x63\x86\xce\x69\x0a\x6a\x75\x58\x98\xea\x01\xbc\xda\xc0\xe9\xf3\x29\x64\xad\x8b\xef\xc3\xf7\xd5\xdd\x75\x72\x40\x65\xe5\xe0\xd5\x74\x4f\x1f\x99\x79\x7c\x68\x7a\x92\x38\x70\xab\x78\x1d\xd6\x55\xe9\x5b\xed\x4a\x76\xa0\x13\x52\xaf\xef\xb7\x02\x27\xfd\xb0\x0c\x3b\xf7\xe1\x4f\x97\xb6\x4a\xf3\xcb\xbf\x8e\xc7\x57\x69\x55\xfb\x3a\x85\x67\x23\x2c\x11\xd2\x1e\x19\xcd\xc8\xbc\x1d\x04\x50\xa0\xab\xb4\x58\xd7\xc8\x2a\x07\x55\xc8\x2a\xb2\x52\x64\x87\xa9\x2d\x46\xb7\x17\xa5\xb5\xef\x78\xf1\x89\x6b\x71\x68\x90\xec\x9f\xac\x29\x7c\x2e\xeb\x98\x59\x85\xad\x41\xad\x54\x3e\x04\x28\xd9\x71\x42\x35\xc4\x2d\x1b\xe8\x4e\x9c\xde\xef\xb3\x71\xe5\x25\xd4\x4a\x97\xae\x7d\x52\x96\x39\x01\x90\xd8\x75\x6f\xd7\x14\x5a\x4f\xd8\xce\xdb\x3b\x36\x68\xe5\x54\x41\x56\xc6\x60\x28\x3d\x5a\xd4\x4c\x54\x08\xfc\x48\x09\xb6\xbc\x03\xc8\xc3\xed\x66\xd7\x55\x63\x2c\xd5\x08\x56\xa2\x62\xbb\x0d\x86\x8a\xfd\xe3\x4a\xf5\xf4\xd9\xf3\x07\x43\xde\xf3\x8d\x32\x35\xc8\x4c\x56\xa7\xf0\x9f\xab\xb7\xb3\x7f\xe3\xec\x97\xeb\xe3\xf6\xcb\xb3\xd9\xab\xff\x4e\xd3\xeb\xa7\x83\x9f\xd7\x27\x6f\xfe\x7f\x44\xd2\xe1\x19\x79\x24\x7d\xda\x26\xd2\xcd\x89\x5d\x44\xa7\xa1\xc3\x98\x15\x5c\x5a\x4f\x53\x38\xc3\xca\xd1\x14\xfe\xa9\x43\x6b\xf8\x9d\x4e\x23\xed\xeb\x71\xed\xa4\x2b\x4f\xe4\xd5\xc3\xc3\x47\xcf\x12\x54\x7a\x98\xa7\x55\xf7\xa1\x25\xe3\x71\x4e\x0a\x63\x5b\xdc\x41\x3b\xa4\x19\xfc\x07\x01\x02\xe2\xc9\x58\x9a\xb4\x13\x6e\x92\x9b\x7a\x3e\xf8\x0f\x83\x8c\xd6\xe7\xa8\x37\xb0\x85\xb5\x38\x94\xee\x67\xba\x63\xc1\x26\xcc\xad\x71\xae\xdf\x4c\x1c\x54\xea\x2b\x41\x3f\xb9\x46\xb0\xcc\x28\xc7\x30\x8b\xdb\x4c\xb1\x45\xbb\x19\xac\x1e\x90\xa3\x0e\xff\xf0\x70\xb4\xf2\x15\x1c\x3b\x22\x48\xb4\x29\xe8\x3e\xba\x9e\x44\x0c\xc5\x4c\x55\x8a\x37\x61\x53\x25\x59\xb5\x2b\xd5\xae\x00\x75\x63\x2c\xa3\xe6\x58\x6e\x96\x4a\xba\x03\xc5\x50\xcb\xbc\x49\x61\xbb\x3a\x2e\xb4\x3b\x3d\x7d\xfe\xe2\xc2\x67\x85\xa9\x51\xe9\xb3\x9a\xe7\x27\x6f\x8e\x7f\xf6\x58\x09\xf2\x14\xff\xc0\x9a\xce\x6a\x3e\xf9\xe3\xda\xe2\xe9\xcb\x47\x54\xd1\xf1\x55\xac\x95\xeb\xe3\xab\x59\xfb\xed\x69\x47\x3a\x79\x73\xbc\x4c\x1e\x3c\x3f\x79\x2a\x36\x0c\x2a\xf0\xfa\x6a\xb6\x2d\xbf\xe4\xfa\xe9\xc9\x9b\xc1\xd9\x49\x57\x8c\xb1\x4f\xa5\xc0\xd6\x77\x43\x8b\x63\x63\x65\x48\xd9\xa1\xf9\xac\x0f\xef\x36\x09\xdb\xca\x85\x5f\x7f\x3b\xfa\x5f\x00\x00\x00\xff\xff\x1e\x16\x84\x1b\x60\x17\x00\x00")
func operatorsCoreosCom_olmconfigsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -165,7 +165,7 @@ func operatorsCoreosCom_olmconfigsYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xdd\x6f\x1b\xb9\x11\x7f\xf7\x5f\x31\x50\x0b\xc4\x4e\xa5\x55\x9c\x2b\xae\x39\x01\x41\x10\xe4\x9a\x22\x48\x7c\x09\x62\xf7\x1e\x6a\xb9\xcd\xec\x72\x24\xf1\xb2\x4b\xee\x91\x5c\xd9\xba\xc3\xfd\xef\xc5\x90\xfb\x25\x69\xa5\xf8\x90\x34\x68\x0b\xf2\xc5\x12\x3f\x86\xc3\xf9\xfe\xd1\x14\x96\xf2\x47\x32\x56\x6a\x35\x03\x2c\x25\xdd\x39\x52\xfc\xcd\x26\x1f\x9f\xd8\x44\xea\xe9\xfa\xfc\xe4\xa3\x54\x62\x06\x2f\x2a\xeb\x74\xf1\x9e\xac\xae\x4c\x46\xdf\xd3\x42\x2a\xe9\xa4\x56\x27\x05\x39\x14\xe8\x70\x76\x02\x80\x4a\x69\x87\xdc\x6d\xf9\x2b\x40\xa6\x95\x33\x3a\xcf\xc9\x4c\x96\xa4\x92\x8f\x55\x4a\x69\x25\x73\x41\xc6\x13\x6f\xb6\x5e\x3f\x4a\x9e\x24\x8f\x4e\x00\x32\x43\x7e\xf9\x95\x2c\xc8\x3a\x2c\xca\x19\xa8\x2a\xcf\x4f\x00\x14\x16\x34\x03\x5d\x92\x41\xa7\x4d\xa6\x95\xf0\xdb\xdb\xa4\xe9\xb2\x49\xa6\x0d\x69\xfe\x53\x9c\xd8\x92\x32\xe6\x60\x69\x74\x55\x76\xcb\xb6\xe6\x04\x9a\x0d\xa3\xe8\x68\xa9\x8d\x6c\xbe\x03\x4c\x40\xe7\x85\xff\x1c\x04\xf0\xb6\xa6\xf1\xa2\xd9\xda\x8f\xe5\xd2\xba\xd7\xc3\xe3\x6f\xa4\x75\x7e\x4e\x99\x57\x06\xf3\x21\xe6\xfd\xb0\x5d\x69\xe3\x7e\xe8\x58\xe1\xad\xb3\xad\x4d\xac\x54\xcb\x2a\x47\x33\x40\xe2\x04\xc0\x66\xba\xa4\x19\x78\x0a\x25\x66\x24\x4e\x00\x6a\xc9\xd6\x14\x27\xb5\xf4\xd6\xe7\xf5\x06\x36\x5b\x51\x81\xcd\x76\xc0\x64\xd5\xf3\x77\xaf\x7e\xfc\xe6\x72\x67\x00\x40\x90\xcd\x8c\x2c\x9d\xd7\xd3\xde\x19\x41\x5a\xc0\xda\x36\xa0\x31\x0e\xd0\x0b\x70\x9b\x92\xe0\xc3\xde\xfc\x0f\x70\xbb\x92\xd9\x8a\x97\x55\x96\x04\x38\xcd\x47\x5d\xd3\x06\xa4\x5a\x68\x53\x78\xe5\x73\xef\xdb\x37\x17\x80\xa9\xae\x1c\xb8\x15\x81\x75\xe8\x3c\x59\x54\xad\x08\x92\x1e\x93\xbc\xdb\x0c\x74\xfa\x13\x65\xae\xd7\x6d\xe8\xe7\x4a\x1a\x12\xfd\xf3\xb0\x34\x1a\x93\xed\x75\x97\x86\xe9\xba\x9e\xfe\x43\xeb\x39\xc8\x56\xff\x8e\x60\x1e\xb0\xf4\xc2\x3c\x10\xec\x1b\x64\x3d\xe3\xb5\x1e\x48\xd4\x22\xf7\xa2\x59\x49\x0b\x86\x4a\x43\x96\x54\xf0\x96\xe6\x68\xfe\x00\x09\x5c\x92\xe1\x85\x6c\x19\x55\x2e\x82\x84\x8c\x03\x43\x99\x5e\x2a\xf9\x4b\x4b\xcd\xb2\xa4\x78\x9b\x1c\x1d\x59\x07\x52\x39\x32\x0a\x73\x58\x63\x5e\xd1\x18\x50\x09\x28\x70\x03\x86\x98\x2e\x54\xaa\x47\xc1\x4f\xb1\x09\x5c\x68\x43\x5e\xf8\x33\x58\x39\x57\xda\xd9\x74\xba\x94\xae\x71\xff\x4c\x17\x45\xa5\xa4\xdb\x4c\xbd\x27\xcb\xb4\x62\x2f\x9a\x0a\x5a\x53\x3e\xb5\x72\x39\x41\x93\xad\xa4\xa3\xcc\x55\x86\xa6\x58\xca\x89\x67\x56\x05\xd7\x2c\xc4\x1f\x4c\x6d\x13\xf6\xc1\x8e\xf8\x82\xca\xac\x33\x52\x2d\xb7\x86\xbc\xb7\x1d\x95\x35\xfb\x5b\x30\xbc\xb0\x3c\x9c\xa5\x13\x29\x77\xb1\x54\xde\xff\xf5\xf2\x0a\x1a\x06\x82\xd8\x83\x84\xbb\xa9\xb6\x13\x36\x0b\x4a\xaa\x05\x99\x30\x73\x61\x74\xe1\xa9\x90\x12\xa5\x96\x2a\x18\x62\x96\x4b\x52\x0e\x6c\x95\x16\xd2\x59\x6f\x60\x64\x1d\xeb\x21\x81\x17\x3e\xfa\x41\x4a\x50\x95\x02\x1d\x89\x04\x5e\x29\x78\x81\x05\xe5\x2f\xd0\xd2\x7f\x5c\xd4\x2c\x51\x3b\x61\xf1\xdd\x5f\xd8\xfd\xe0\xbd\xbf\x60\xcf\xa1\x00\x9a\xc0\x7a\x50\x3b\x7b\x2e\x7f\x59\x52\x06\x98\xe7\xfa\x96\x35\x96\xe5\x95\x75\x64\x00\x45\x21\xd5\x01\xf7\x3f\xee\xf7\x75\x74\x18\x43\xa9\x1d\x9f\x1e\xf3\x7c\x03\x7a\x4d\xc6\x48\xc1\x9a\x0f\x6b\x0c\x95\xda\x38\x12\x90\x6e\x3c\xa5\xa1\xa8\x71\xf4\xa0\x87\x43\x42\x38\x72\x99\xeb\x4d\xc1\x16\xb4\x3f\xd8\x50\x45\x63\x70\x33\x30\x2a\x1d\x15\x83\xcb\x8e\x28\x8a\x5b\x7d\xc8\x21\x7e\x3e\x63\xcb\x2d\xed\x8d\xba\xc8\xce\x56\x88\x52\x59\x10\xe4\x50\xe6\x16\x16\xda\x80\x56\x04\xc8\x36\xe0\x42\x24\x23\xc8\x2a\x63\xbc\x4b\x34\xaa\xf2\xde\xf3\xfc\xdd\xab\x36\x1d\x24\x30\x99\x4c\xe0\x8a\xbb\xad\x33\x55\xe6\xd8\x77\x39\x54\x29\x41\xc2\x53\x15\xd2\xf8\xf8\x64\x99\x38\xeb\xda\x1f\x03\x30\x18\xc1\x42\x52\x2e\xa0\x44\xb7\x82\x84\x77\xa9\x38\x7d\xb7\xe9\x1f\xe0\xa5\x36\x40\x77\x58\x94\x39\x8d\x43\xde\x79\xa9\xf5\xa5\x9f\x58\x6f\xf8\x2b\x4c\xa7\xf0\xbe\xf5\xf9\x60\x10\xa9\x25\xb3\x0e\xb5\x8a\xb7\x30\x58\x68\xfd\xc0\x6e\x9f\x27\xe1\x85\xaf\x95\xbe\x55\x43\x5b\xfb\xbd\xd0\xd0\x0c\xe6\xa3\xe7\x6b\x94\x39\xa6\x39\xcd\x47\x63\x98\x8f\xde\x19\xbd\x34\x64\x39\x71\x73\x07\x07\xe2\xf9\xe8\x7b\x5a\x1a\x14\x24\xe6\x23\x26\xfb\xa7\x12\x5d\xb6\xba\x20\xb3\xa4\xd7\xb4\x79\xea\x89\xb5\xdd\x97\xce\x70\x41\xb2\x79\x5a\xf0\xb8\xef\xe7\x4a\xe3\x6a\x53\xd2\xd3\x02\xcb\xb6\xe3\x02\xcb\x76\x71\xab\x3a\x0b\xd7\x37\xec\xd8\xeb\xf3\xa4\x53\xe7\x87\x9f\xac\x56\xb3\xf9\xa8\xe3\x7f\xac\x0b\x36\x8b\xd2\x6d\xe6\x23\xd8\xda\x75\x36\x1f\xf9\x7d\x9b\xfe\x86\xc9\xd9\x7c\xc4\x3b\x71\xb7\xd1\x4e\xa7\xd5\x62\x36\x1f\xa5\x1b\x47\x76\x7c\x3e\x36\x54\x8e\xb9\xcc\x78\xda\xed\x30\x1f\x7d\x80\xb9\x62\x66\xb5\x5b\x91\x09\x9a\xb4\xf0\xdb\xe8\x88\xed\x0f\xba\x62\x68\xc3\xe9\xbc\x6b\x9c\xd8\xad\xc5\x25\x1d\x1c\x37\x84\xb6\xae\xa9\x86\x86\x83\x8a\x0f\x0e\x33\x83\x83\x83\xc7\x22\x45\x68\x39\x5a\x77\x65\x50\x59\xd9\x54\xb7\x87\x66\xee\x38\xe4\xfe\x42\xf6\x9e\x90\xf3\xad\x03\xc7\x1d\xde\x0d\x5b\x45\xbb\x76\x36\x7b\x17\x67\x31\x76\xda\x70\x34\x8e\x9d\xa8\xbc\x32\x92\xda\x23\x43\x89\x91\x12\xdc\xae\x48\x79\x52\x95\x12\x64\xf2\x0d\xc7\xd2\x8e\x6a\xb6\x42\xb5\xe4\x94\x06\xaf\xd8\xc5\xd1\x3b\x31\xa7\xbb\x8f\xec\x1d\x63\x5e\xa8\xa0\xb2\x4d\xea\xf5\x7c\xb5\x14\x39\x1a\x04\x2f\xae\xc9\xf8\xec\x9d\x65\x54\x3a\x76\x99\xdd\x98\xdc\xb5\xa3\xe1\xb0\x69\x21\x71\xcc\x80\x73\xee\x84\x37\x3e\x30\xb3\x36\x8e\x7b\x0a\xbe\x9e\x1d\xea\x8c\x55\x55\xa0\x62\xeb\x11\xcc\x6f\x37\xa6\x84\xcc\xd0\xd7\x1b\x4d\x90\xec\x72\x57\xa7\x87\x5a\xd4\x5c\x60\xa4\xc4\xe1\xcd\x3b\x5d\x7d\xac\xcf\x3c\x7c\x81\x77\x6f\x48\x2d\xdd\x6a\x06\xdf\x3c\xfe\xcb\xb7\x4f\x0e\x4c\x0c\xd1\x8e\xc4\xdf\x48\x71\x1e\x1c\x28\x67\x0f\x88\x61\x7f\x61\xaf\x78\xf2\xe7\x4c\x9a\x1a\x22\x59\x76\x73\xbc\x85\x6c\xdb\xe5\x2d\x5a\xb0\xe4\x20\x45\x2e\xfc\xab\x92\xe5\xc2\xa1\x5b\x2a\xeb\x50\x65\x34\x06\xb9\x18\x26\x26\xdb\xa8\x9c\x6f\xe0\xfc\xf1\x18\xd2\x5a\xc4\xfb\x31\xf9\xfa\xee\x26\x19\x60\x59\x5a\xf8\x6e\xbc\xc3\x0f\x57\x83\x95\x4f\x63\x6c\x38\x70\x2b\xdd\x8a\x8b\x45\x9f\xdb\xea\xb2\x7a\x20\xb7\x51\xcb\xef\xa7\x14\xc7\x19\x6e\x49\xe6\x93\x66\x2b\x95\xfb\xf6\xcf\x87\xf5\x2b\x95\x2c\xaa\x62\x06\x8f\x0e\x4c\x09\x21\xed\x9e\xda\x0c\x93\xbb\xd4\x8e\x1c\xba\x96\x06\x0b\xae\xbc\x32\x90\x82\x0b\xaa\x85\x24\xd3\x37\x6d\x3e\x74\xbd\x90\x93\xf5\x96\x14\x1f\xd8\x3a\x0e\xf5\x8c\xfd\x9d\xd1\xa2\xca\xb8\xa4\xd6\x0b\x5f\x2f\xca\x85\xcc\xfa\x01\x8a\xeb\x54\xef\x0d\x01\x29\x01\xdd\xb1\xd0\x5b\x4c\x12\x60\x0b\xa1\x92\x6a\x69\xeb\x2d\xb9\x20\xe7\x00\x12\x52\xe9\xed\x8a\x7c\x3e\xf1\x08\xab\x5e\x63\x3c\x57\x56\x0a\x32\x24\x00\x61\x59\xa1\x41\xe5\x88\x04\x87\x1f\x76\xc1\x7a\x6e\x2f\xe4\x61\x57\x9d\x37\xde\x18\x5c\x35\x04\x2b\x66\xb1\xae\xe8\xbd\xc7\x7e\x39\x57\x3d\x7f\xf4\xf8\xa8\xca\xdb\x79\x07\x27\x95\xe8\x18\xeb\xcd\xe0\x9f\xd7\xcf\x27\xff\xc0\xc9\x2f\x37\xa7\xf5\x87\x47\x93\xef\xfe\x35\x9e\xdd\x3c\xec\x7d\xbd\x39\x7b\xf6\xc7\x03\x94\x82\x07\xdd\xd3\x7c\xea\x24\xd2\x54\x7e\x8d\x46\xc7\x3e\xc3\xe8\x05\x5c\x19\x46\x9d\x2f\x31\xb7\x34\x86\xbf\x2b\x9f\x1a\x3e\x53\x68\xa4\xaa\xe2\x30\x77\x9c\x95\x47\xbc\xeb\x70\x45\xd1\x4e\xf1\x2c\x1d\x9f\x53\xb3\x7b\x60\x8e\xe7\xf5\x7e\x42\xf2\xb5\x98\x5e\xf4\x23\x4d\x0f\x05\x82\x8f\x78\x5c\x6b\x26\x75\xcd\x9a\x64\xba\x98\xf6\x50\x22\x17\xcb\x17\xa8\x36\xd0\x85\xb5\x50\x69\xee\x5a\xba\x65\xf8\x03\x98\x19\x6d\x6d\x0b\x73\x2d\xe4\xf2\x23\x41\x5b\x8e\x86\x60\x99\x52\x86\xbe\xba\x36\xa9\x74\x06\xcd\xa6\xe3\xce\x42\x86\xca\x83\x56\x4b\x8b\x2a\x87\x53\x4b\x04\x89\xd2\x82\xf6\xa3\xeb\x59\x88\xa1\x98\xca\x5c\xba\x0d\x47\x49\x41\x99\x56\x8b\x5c\xd6\x45\x7d\xc1\xa0\x0b\x95\x0b\xee\x66\x68\x49\x77\x20\x1d\x14\x5c\x44\x92\xe5\x29\xa7\x42\xd9\xf3\xf3\xc7\xdf\x5c\x56\xa9\xd0\x05\x4a\xf5\xb2\x70\xd3\xb3\x67\xa7\x3f\x57\x98\x73\xe4\x11\x3f\x60\x41\x2f\x0b\x77\xf6\xe5\xd2\xe2\xf9\xb7\xf7\xf0\xa2\xd3\xeb\xe0\x2b\x37\xa7\xd7\x93\xfa\xd3\xc3\xa6\xeb\xec\xd9\xe9\x3c\x39\x3a\x7e\xf6\x90\xcf\xd0\xf3\xc0\x9b\xeb\x49\xe7\x7e\xc9\xcd\xc3\xb3\x67\xbd\xb1\xb3\x7d\x67\xe4\x8c\x25\x33\x7a\x9e\x65\xba\xfa\x6a\x98\x72\xd8\xf7\x3f\x81\xe6\x43\x08\x68\xf0\xfc\x36\x2c\x1f\xc0\xf2\xd2\xd9\x3a\x7d\x06\xd8\x1e\x2c\xa3\x0e\x24\x1c\x60\x9d\x41\x99\x07\xb3\xca\x5c\x85\x79\x0f\xf3\x83\xdd\x58\x47\xc5\x17\x82\xec\x9d\x19\x47\xf8\x1c\xe1\x73\x84\xcf\x7b\x6d\x32\x00\x36\x23\xd2\x8e\x48\xbb\x6b\x11\x69\x47\xa4\x1d\x91\xf6\xbd\xb4\x19\x91\x76\x44\xda\xdb\x2d\x22\xed\x7a\x4e\x44\xda\x11\x69\x7f\x6d\xa4\x1d\xf2\xd4\x0c\x9c\xa9\x9a\xa2\xc5\x3a\x6d\xb8\x48\x81\x05\x9b\x6c\xd3\x59\xa5\xad\x7e\x3b\x2b\xac\x5d\x17\x7e\xfd\x6d\xfb\x39\xcd\xe3\xf8\x9c\x26\x3e\xa7\x89\xcf\x69\xe2\x73\x9a\xa6\x7d\xed\xe7\x34\xdb\xd7\x6f\xe1\xcd\xcb\xd6\x75\x9b\xb7\xd9\xd2\xe8\xb5\x14\x64\x77\x1e\xdf\xf8\x3a\x7c\x27\xcb\x14\xa8\xaa\xfe\x83\x1a\xfa\x3a\xcf\x69\xe2\xdd\x5c\xbc\x9b\x8b\x77\x73\xf1\x6e\xae\xd7\xe2\xdd\x5c\xdb\xe2\xdd\x5c\xbc\x9b\x8b\x77\x73\xf1\x6e\x2e\xde\xcd\xed\xb6\x78\x37\x17\x5a\xbc\x9b\x8b\x77\x73\x03\xed\x7f\xe3\x6e\xae\x6f\x41\xf1\x57\x15\x11\x7a\x46\xe8\xf9\x5f\x06\x3d\x23\x9e\x8c\x78\x32\xe2\xc9\x81\x16\xf1\x64\xc4\x93\x11\x4f\x46\x3c\xb9\xd7\x22\x9e\xac\xe7\x44\x3c\x19\xf1\x64\xfc\x55\xc5\xef\xfc\x55\xc5\xdb\x37\x17\xbd\x97\x1c\xe1\x85\x47\xcf\xb2\x56\xb8\x26\x48\x89\x54\x5b\x46\xc4\xff\xc2\x46\x28\x1c\xa1\x70\xfc\x2f\x2c\x44\xd4\x1c\x51\x73\x44\xcd\x11\x35\xef\x2a\x2e\xa2\xe6\x88\x9a\xb7\x55\x19\x51\xf3\xef\x17\x5a\x44\xcd\x11\x35\x0f\xa8\xe2\xff\x03\x35\x1f\xfb\x85\x44\xbf\xef\x53\x3f\x90\xf8\x77\x00\x00\x00\xff\xff\x79\xf0\xdc\xa4\x52\x56\x00\x00")
+var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\x1b\xb9\x11\x7f\xf7\xa7\x18\xa8\x05\x62\xa7\xd2\x2a\x4e\x8a\xf4\x22\x20\x08\x82\x5c\x53\x04\x89\x2f\x41\xec\xde\x43\x2d\xb7\x99\x5d\x8e\x24\x9e\x77\xc9\x3d\x92\x2b\x5b\x77\xb8\xef\x5e\x0c\xb9\xff\x64\xad\x14\x1f\x92\x06\x6d\x41\xbe\x58\x22\x87\x43\x72\xfe\xff\x68\x0a\x4b\xf9\x23\x19\x2b\xb5\x9a\x01\x96\x92\x6e\x1d\x29\xfe\x66\x93\xeb\xef\x6c\x22\xf5\x74\x7d\x7a\x74\x2d\x95\x98\xc1\xab\xca\x3a\x5d\x7c\x24\xab\x2b\x93\xd1\xf7\xb4\x90\x4a\x3a\xa9\xd5\x51\x41\x0e\x05\x3a\x9c\x1d\x01\xa0\x52\xda\x21\x77\x5b\xfe\x0a\x90\x69\xe5\x8c\xce\x73\x32\x93\x25\xa9\xe4\xba\x4a\x29\xad\x64\x2e\xc8\x78\xe6\xcd\xd2\xeb\x47\xc9\xb3\xe4\xd1\x11\x40\x66\xc8\x4f\xbf\x90\x05\x59\x87\x45\x39\x03\x55\xe5\xf9\x11\x80\xc2\x82\x66\xa0\x4b\x32\xe8\xb4\xc9\xb4\x12\x7e\x79\x9b\x34\x5d\x36\xc9\xb4\x21\xcd\x7f\x8a\x23\x5b\x52\xc6\x3b\x58\x1a\x5d\x95\xdd\xb4\x2d\x9a\xc0\xb3\xd9\x28\x3a\x5a\x6a\x23\x9b\xef\x00\x13\xd0\x79\xe1\x3f\x07\x01\xbc\xaf\x79\xbc\x6a\x96\xf6\x63\xb9\xb4\xee\xed\xf0\xf8\x3b\x69\x9d\xa7\x29\xf3\xca\x60\x3e\xb4\x79\x3f\x6c\x57\xda\xb8\x1f\xba\xad\xf0\xd2\xd9\xd6\x22\x56\xaa\x65\x95\xa3\x19\x60\x71\x04\x60\x33\x5d\xd2\x0c\x3c\x87\x12\x33\x12\x47\x00\xb5\x64\x6b\x8e\x93\x5a\x7a\xeb\xd3\x7a\x01\x9b\xad\xa8\xc0\x66\x39\x60\xb6\xea\xe5\x87\x37\x3f\x3e\x39\xbf\x33\x00\x20\xc8\x66\x46\x96\xce\xeb\x69\xe7\x8c\x20\x2d\x60\x6d\x1b\xd0\x18\x07\xe8\x05\xb8\x4d\x49\xf0\x69\x87\xfe\x13\xdc\xac\x64\xb6\xe2\x69\x95\x25\x01\x4e\xf3\x51\xd7\xb4\x01\xa9\x16\xda\x14\x5e\xf9\xdc\xfb\xfe\xdd\x19\x60\xaa\x2b\x07\x6e\x45\x60\x1d\x3a\xcf\x16\x55\x2b\x82\xa4\xb7\x49\x5e\x6d\x06\x3a\xfd\x89\x32\xd7\xeb\x36\xf4\x73\x25\x0d\x89\xfe\x79\x58\x1a\x8d\xc9\xf6\xba\x4b\xc3\x7c\x5d\x4f\xff\xa1\xf5\x1c\x64\xab\xff\x8e\x60\x1e\xb0\xf4\x02\x1d\x08\xf6\x0d\xb2\x7e\xe3\xb5\x1e\x48\xd4\x22\xf7\xa2\x59\x49\x0b\x86\x4a\x43\x96\x54\xf0\x96\xe6\x68\xfe\x00\x09\x9c\x93\xe1\x89\x6c\x19\x55\x2e\x82\x84\x8c\x03\x43\x99\x5e\x2a\xf9\x4b\xcb\xcd\xb2\xa4\x78\x99\x1c\x1d\x59\x07\x52\x39\x32\x0a\x73\x58\x63\x5e\xd1\x18\x50\x09\x28\x70\x03\x86\x98\x2f\x54\xaa\xc7\xc1\x93\xd8\x04\xce\xb4\x21\x2f\xfc\x19\xac\x9c\x2b\xed\x6c\x3a\x5d\x4a\xd7\xb8\x7f\xa6\x8b\xa2\x52\xd2\x6d\xa6\xde\x93\x65\x5a\xb1\x17\x4d\x05\xad\x29\x9f\x5a\xb9\x9c\xa0\xc9\x56\xd2\x51\xe6\x2a\x43\x53\x2c\xe5\xc4\x6f\x56\x05\xd7\x2c\xc4\x1f\x4c\x6d\x13\xf6\xc1\x1d\xf1\x05\x95\x59\x67\xa4\x5a\x6e\x0d\x79\x6f\x3b\x28\x6b\xf6\xb7\x60\x78\x61\x7a\x38\x4b\x27\x52\xee\x62\xa9\x7c\xfc\xeb\xf9\x05\x34\x1b\x08\x62\x0f\x12\xee\x48\x6d\x27\x6c\x16\x94\x54\x0b\x32\x81\x72\x61\x74\xe1\xb9\x90\x12\xa5\x96\x2a\x18\x62\x96\x4b\x52\x0e\x6c\x95\x16\xd2\x59\x6f\x60\x64\x1d\xeb\x21\x81\x57\x3e\xfa\x41\x4a\x50\x95\x02\x1d\x89\x04\xde\x28\x78\x85\x05\xe5\xaf\xd0\xd2\x7f\x5c\xd4\x2c\x51\x3b\x61\xf1\xdd\x5f\xd8\xfd\xe0\xbd\x3b\x61\xc7\xa1\x00\x9a\xc0\xba\x57\x3b\x3b\x2e\x7f\x5e\x52\x06\x98\xe7\xfa\x86\x35\x96\xe5\x95\x75\x64\x00\x45\x21\xd5\x1e\xf7\x3f\xec\xf7\x75\x74\x18\x43\xa9\x1d\x9f\x1e\xf3\x7c\x03\x7a\x4d\xc6\x48\xc1\x9a\x0f\x73\x0c\x95\xda\x38\x12\x90\x6e\x3c\xa7\xa1\xa8\x71\xf0\xa0\xfb\x43\x42\x38\x72\x99\xeb\x4d\xc1\x16\xb4\x3b\xd8\x70\x45\x63\x70\x33\x30\x2a\x1d\x15\x83\xd3\x0e\x28\x8a\x5b\x7d\xc8\xa1\xfd\x7c\xc1\x92\x5b\xda\x1b\x75\x91\x9d\xad\x10\xa5\xb2\x20\xc8\xa1\xcc\x2d\x2c\xb4\x01\xad\x08\x90\x6d\xc0\x85\x48\x46\x90\x55\xc6\x78\x97\x68\x54\xe5\xbd\xe7\xe5\x87\x37\x6d\x3a\x48\x60\x32\x99\xc0\x05\x77\x5b\x67\xaa\xcc\xb1\xef\x72\xa8\x52\x82\x84\xe7\x2a\xa4\xf1\xf1\xc9\x32\x73\xd6\xb5\x3f\x06\x60\x30\x82\x85\xa4\x5c\x40\x89\x6e\x05\x09\xaf\x52\x71\xfa\x6e\xd3\x3f\xc0\x6b\x6d\x80\x6e\xb1\x28\x73\x1a\xc3\x5c\x85\xd4\xf3\x5a\xeb\x73\x4f\x5b\xaf\xf9\x2b\x4c\xa7\xf0\xb1\x75\xfb\x60\x13\xa9\x25\xb3\x0e\xe5\x8a\x37\x32\x58\x68\xfd\xc0\x6e\x1f\x29\xe1\x89\x6f\x95\xbe\x51\x43\xab\xfb\xb5\xd0\xd0\x0c\xe6\xa3\x97\x6b\x94\x39\xa6\x39\xcd\x47\x63\x98\x8f\x3e\x18\xbd\x34\x64\x39\x77\x73\x07\xc7\xe2\xf9\xe8\x7b\x5a\x1a\x14\x24\xe6\x23\x66\xfb\xa7\x12\x5d\xb6\x3a\x23\xb3\xa4\xb7\xb4\x79\xee\x99\xb5\xdd\xe7\xce\x70\x4d\xb2\x79\x5e\xf0\xb8\xef\xe7\x62\xe3\x62\x53\xd2\xf3\x02\xcb\xb6\xe3\x0c\xcb\x76\x72\xab\x3d\x0b\x97\x57\xec\xdb\xeb\xd3\xa4\xd3\xe8\xa7\x9f\xac\x56\xb3\xf9\xa8\xdb\xff\x58\x17\x6c\x19\xa5\xdb\xcc\x47\xb0\xb5\xea\x6c\x3e\xf2\xeb\x36\xfd\xcd\x26\x67\xf3\x11\xaf\xc4\xdd\x46\x3b\x9d\x56\x8b\xd9\x7c\x94\x6e\x1c\xd9\xf1\xe9\xd8\x50\x39\xe6\x4a\xe3\x79\xb7\xc2\x7c\xf4\x89\x75\x32\x9d\x82\x76\x2b\x32\x41\x99\x16\x7e\x1b\x1d\x30\xff\x41\x6f\x0c\x6d\x38\xa3\x77\x8d\x73\xbb\xb5\xb8\xa4\xbd\xe3\x86\xd0\xd6\x65\xd5\xd0\x70\x50\xf1\xde\x61\xde\xe0\xe0\xe0\xa1\x60\x11\x5a\x8e\xd6\x5d\x18\x54\x56\x36\x05\xee\x3e\xca\x3b\x3e\xb9\x3b\x91\x1d\x28\xa4\x7d\xeb\xc0\x71\x87\xf7\xc4\x56\xd1\xae\xa5\x66\x07\xe3\x44\xc6\x7e\x1b\x8e\xc6\xe1\x13\x95\x57\x46\x52\x3b\x65\xa8\x32\x52\x82\x9b\x15\x29\xcf\xaa\x52\x82\x4c\xbe\xe1\x70\xda\x71\xcd\x56\xa8\x96\x9c\xd5\xe0\x0d\x7b\x39\x7a\x3f\xe6\x8c\x77\xcd\xde\x31\xe6\x89\x0a\x2a\xdb\x64\x5f\xbf\xaf\x96\x23\x07\x84\xe0\xc8\x35\x1b\x9f\xc0\xb3\x8c\x4a\xc7\x2e\x73\x37\x2c\x77\xed\x60\x44\x6c\x5a\xc8\x1d\x33\xe0\xb4\x3b\xe1\x85\xf7\x50\xd6\xc6\x71\x4f\xc1\xd7\xd4\xa1\xd4\x58\x55\x05\x2a\xb6\x1e\xc1\xfb\xed\xc6\x94\x90\x19\xfa\x92\xa3\x89\x93\x5d\xfa\xea\xf4\x50\x8b\x9a\x6b\x8c\x94\x38\xc2\x79\xa7\xab\x8f\xf5\x85\x87\x2f\xf0\xf6\x1d\xa9\xa5\x5b\xcd\xe0\xc9\xe3\xbf\x3c\xfd\x6e\x0f\x61\x88\x76\x24\xfe\x46\x8a\x53\xe1\x40\x45\xbb\x47\x0c\xbb\x13\x7b\xf5\x93\x3f\x67\xd2\x94\x11\xc9\xb2\xa3\xf1\x16\xb2\x6d\x97\x37\x68\xc1\x92\x83\x14\xb9\xf6\xaf\x4a\x96\x0b\x47\x6f\xa9\xac\x43\x95\xd1\x18\xe4\x62\x98\x99\x6c\xa3\x72\xbe\x81\xd3\xc7\x63\x48\x6b\x11\xef\xc6\xe4\xcb\xdb\xab\x64\x60\xcb\xd2\xc2\xb3\xf1\x9d\xfd\x70\x41\x58\xf9\x4c\xc6\x86\x03\x37\xd2\xad\xb8\x5e\xf4\xe9\xad\xae\xac\x07\xd2\x1b\xb5\xfb\xfd\x9c\xe2\x38\xc9\x2d\xc9\x7c\xd6\x6c\xa5\x72\x4f\xff\xbc\x5f\xbf\x52\xc9\xa2\x2a\x66\xf0\x68\x0f\x49\x08\x69\xf7\xd4\x66\x20\xee\xb2\x3b\x72\xe8\x5a\x1a\x2c\xb8\xf8\xca\x40\x0a\xae\xa9\x16\x92\x4c\xdf\xb4\xf9\xd0\xf5\x44\xce\xd7\x5b\x52\x7c\x60\xeb\x38\xd4\x33\xf6\x0f\x46\x8b\x2a\xe3\xaa\x5a\x2f\x7c\xc9\x28\x17\x32\xeb\x07\x28\x2e\x55\xbd\x37\x04\xb0\x04\x74\xcb\x42\x6f\x61\x49\x40\x2e\x84\x4a\xaa\xa5\xad\x97\xe4\x9a\x9c\x03\x48\x48\xa5\x37\x2b\xf2\xf9\xc4\x83\xac\x7a\x8e\xf1\xbb\xb2\x52\x90\x21\x01\x08\xcb\x0a\x0d\x2a\x47\x24\x38\xfc\xb0\x0b\xd6\xb4\xbd\x90\x87\x5d\x81\xde\x78\x63\x70\xd5\x10\xac\x78\x8b\x75\x51\xef\x3d\xf6\xeb\xb9\xea\xe9\xa3\xc7\x07\x55\xde\xd2\xed\x25\x2a\xd1\x31\xdc\x9b\xc1\x3f\x2f\x5f\x4e\xfe\x81\x93\x5f\xae\x8e\xeb\x0f\x8f\x26\xcf\xfe\x35\x9e\x5d\x3d\xec\x7d\xbd\x3a\x79\xf1\xc7\x3d\x9c\x82\x07\xdd\xd3\x7c\xea\x24\xd2\x14\x7f\x8d\x46\xc7\x3e\xc3\xe8\x05\x5c\x18\x06\x9e\xaf\x31\xb7\x34\x86\xbf\x2b\x9f\x1a\xbe\x50\x68\xa4\xaa\x62\xff\xee\x38\x2b\x8f\x78\xd5\xe1\x8a\xa2\x25\xf1\x5b\x3a\x4c\x53\x6f\x77\x0f\x8d\xdf\xeb\xfd\x84\xe4\x6b\x31\xbd\xe8\x47\x9a\x1e\x10\x04\x1f\xf1\xb8\xd6\x4c\xea\xb2\x35\xc9\x74\x31\xed\x01\x45\xae\x97\xcf\x50\x6d\xa0\x0b\x6b\xa1\xd2\xbc\x6b\xe9\x96\x11\x10\x60\x66\xb4\xb5\x2d\xd2\xb5\x90\xcb\x6b\x82\xb6\x1c\x0d\xc1\x32\xa5\x0c\x7d\x81\x6d\x52\xe9\x0c\x9a\x4d\xb7\x3b\x0b\x19\x2a\x8f\x5b\x2d\x2d\xaa\x1c\x8e\x2d\x11\x24\x4a\x0b\xda\x8d\xae\x27\x21\x86\x62\x2a\x73\xe9\x36\x1c\x25\x05\x65\x5a\x2d\x72\x59\xd7\xf5\x05\xe3\x2e\x54\x2e\xb8\x9b\xa1\x25\xdd\x82\x74\x50\x70\x11\x49\x96\x49\x8e\x85\xb2\xa7\xa7\x8f\x9f\x9c\x57\xa9\xd0\x05\x4a\xf5\xba\x70\xd3\x93\x17\xc7\x3f\x57\x98\x73\xe4\x11\x3f\x60\x41\xaf\x0b\x77\xf2\xf5\xd2\xe2\xe9\xd3\x7b\x78\xd1\xf1\x65\xf0\x95\xab\xe3\xcb\x49\xfd\xe9\x61\xd3\x75\xf2\xe2\x78\x9e\x1c\x1c\x3f\x79\xc8\x67\xe8\x79\xe0\xd5\xe5\xa4\x73\xbf\xe4\xea\xe1\xc9\x8b\xde\xd8\xc9\xae\x33\x72\xc6\x92\x19\xbd\xcc\x32\x5d\x7d\x33\x58\x39\xec\xfb\x9f\x01\xf4\x21\x04\x34\x90\x7e\x1b\x99\x0f\xc0\x79\xe9\x6c\x9d\x3e\x03\x72\x0f\x96\x51\x07\x12\x0e\xb0\xce\xa0\xcc\x83\x59\x65\xae\xc2\xbc\x07\xfb\xc1\x6e\xac\xa3\xe2\x2b\xa1\xf6\xce\x8c\x23\x82\x8e\x08\x3a\x22\xe8\xa1\x36\x19\xc0\x9b\x11\x6c\x47\xb0\xdd\xb5\x08\xb6\x23\xd8\x8e\x60\xfb\x5e\xda\x8c\x60\x3b\x82\xed\xed\x16\xc1\x76\x4d\x13\xc1\x76\x04\xdb\xdf\x1a\x6c\x87\x3c\x35\x03\x67\xaa\xa6\x68\xb1\x4e\x1b\x2e\x52\x60\xc1\x26\xdb\x74\x56\x69\xab\xdf\xce\x0a\x6b\xd7\x85\x5f\x7f\xdb\x7e\x54\xf3\x38\x3e\xaa\x89\x8f\x6a\xe2\xa3\x9a\xf8\xa8\xa6\x69\xdf\xfa\x51\xcd\xf6\x0d\x5c\x78\xf9\xb2\x75\xe3\xe6\x6d\xb6\x34\x7a\x2d\x05\xd9\x3b\x4f\x70\x7c\x1d\x7e\x27\xcb\x14\xa8\xaa\xfe\xb3\x1a\xfa\x36\x8f\x6a\xe2\xf5\x5c\xbc\x9e\x8b\xd7\x73\xf1\x7a\x6e\xbb\xc5\xeb\xb9\xb6\xc5\xeb\xb9\x78\x3d\x17\xaf\xe7\xe2\xf5\x5c\xbc\x9e\xbb\xdb\xe2\xf5\x5c\x68\xf1\x7a\x2e\x5e\xcf\x0d\xb4\xff\x8d\xeb\xb9\xbe\x05\xc5\x9f\x57\x44\xf4\x19\xd1\xe7\x7f\x1f\xfa\x8c\x90\x32\x42\xca\x08\x29\x07\x5a\x84\x94\x11\x52\x46\x48\x19\x21\xe5\x4e\x8b\x90\xb2\xa6\x89\x90\x32\x42\xca\xf8\xf3\x8a\xdf\xf9\xf3\x8a\xf7\xef\xce\x7a\xef\x39\xc2\x3b\x8f\x9e\x65\xad\x70\x4d\x90\x12\xa9\xb6\x8c\x88\xff\x8b\x8d\x68\x38\xa2\xe1\xf8\xbf\xd8\xba\x45\xe0\x1c\x81\x73\x04\xce\x11\x38\x6f\x29\x2e\x02\xe7\x08\x9c\xb7\x55\x19\x81\xf3\xef\x17\x5a\x04\xce\x11\x38\x0f\xa8\xe2\xff\x03\x38\x1f\xfa\xa9\x44\xbf\xef\x73\xbf\x94\xf8\x77\x00\x00\x00\xff\xff\x0a\x10\x91\x5e\x61\x56\x00\x00")
func operatorsCoreosCom_operatorconditionsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -185,7 +185,7 @@ func operatorsCoreosCom_operatorconditionsYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x79\x6f\x23\x37\x96\xff\xbf\x3f\xc5\x83\x66\x81\xb6\xb3\x3a\xda\x9d\x45\x36\x23\x20\x08\x8c\xee\x74\xe0\x4d\xb7\xdb\x68\xbb\xb3\xc0\x5a\xde\x1d\xaa\xea\x55\x89\x63\x16\x59\x43\xb2\x24\x6b\x82\x7c\xf7\xc5\x7b\x64\x1d\xba\xe5\x1c\xb3\x93\x85\xea\x1f\x5b\x3c\xdf\xc1\xf7\x7b\x07\x29\x4a\xf9\x23\x5a\x27\x8d\x1e\x83\x28\x25\x3e\x79\xd4\xf4\xcb\x0d\x1f\xbf\x76\x43\x69\x46\xf3\x8b\x17\x8f\x52\xa7\x63\x78\x53\x39\x6f\x8a\x4f\xe8\x4c\x65\x13\x7c\x8b\x99\xd4\xd2\x4b\xa3\x5f\x14\xe8\x45\x2a\xbc\x18\xbf\x00\x10\x5a\x1b\x2f\xa8\xd9\xd1\x4f\x80\xc4\x68\x6f\x8d\x52\x68\x07\x39\xea\xe1\x63\x35\xc5\x69\x25\x55\x8a\x96\x17\xaf\xb7\x9e\xbf\x1a\x7e\x3d\x7c\xf5\x02\x20\xb1\xc8\xd3\xef\x64\x81\xce\x8b\xa2\x1c\x83\xae\x94\x7a\x01\xa0\x45\x81\x63\x30\x25\x5a\xe1\x8d\xcd\xad\xa9\x4a\x37\xac\x7f\xba\x61\x62\x2c\x1a\xfa\x53\xbc\x70\x25\x26\xb4\x3b\x8f\x69\xa7\xac\x8c\x09\xeb\xd5\x44\x0a\x8f\xb9\xb1\xb2\xfe\x0d\x30\x00\xa3\x0a\xfe\x3f\x30\xff\x31\xae\xf1\x3d\x2d\xc9\xed\x4a\x3a\xff\xc3\x66\xdf\x7b\xe9\x3c\xf7\x97\xaa\xb2\x42\xad\x13\xcc\x5d\x6e\x66\xac\xbf\x6e\xb7\xe7\xed\xf2\xd0\x25\x75\x5e\x29\x61\xd7\xe6\xbd\x00\x70\x89\x29\x71\x0c\x3c\xad\x14\x09\xa6\x2f\x00\xa2\xf8\xe2\x32\x83\x28\xa2\xf9\x45\x5c\xd5\x25\x33\x2c\x44\xbd\x07\xd0\x92\xfa\xf2\xe6\xea\xc7\x2f\x6f\xd7\x3a\x00\x52\x74\x89\x95\xa5\x67\x65\xac\x30\x04\xd2\x81\x9f\x21\x54\x5a\x7a\x30\x19\x14\x95\xf2\xd2\xa3\x16\x3a\x59\x42\x66\x2c\x7c\x7c\xff\x01\x0a\xa1\x45\x8e\x69\x47\xd4\x70\xe5\x49\xf7\xce\x5b\x21\x75\x58\x41\x6a\xe7\x85\x52\xac\x5e\x5a\xa9\x19\x0c\x52\x83\xf4\x2e\x68\x84\x78\x03\x6f\x40\x00\xa9\x51\x66\x12\x53\x70\xc8\x5b\x7b\x61\x73\xf4\xed\x30\x37\xec\x70\xe0\x97\x24\x1e\x33\xfd\x2b\x26\xbe\xd3\x6c\xf1\x6f\x95\xb4\x98\x76\x99\x25\x51\xd5\x87\xb6\xd3\x5c\x5a\xa2\xc8\x77\x4e\x41\xf8\x3a\x26\xb2\xd2\xbe\x26\xb5\x97\x24\xda\x30\x0e\x52\xb2\x0e\x0c\x6c\x47\x25\x11\x1b\x2c\x76\xe6\x64\x26\x1d\x58\x2c\x2d\x3a\xd4\xbe\x91\x88\xd0\x91\x81\x21\xdc\xa2\xa5\x89\x74\x56\x2a\x95\x92\x28\xe7\x68\x3d\x58\x4c\x4c\xae\xe5\xdf\x9b\xd5\x1c\xc9\x8a\xb6\x51\xc2\xa3\xf3\x20\xb5\x47\xab\x85\x82\xb9\x50\x15\xf6\x41\xe8\x14\x0a\xb1\x04\x8b\xb4\x2e\x54\xba\xb3\x02\x0f\x71\x43\xf8\x60\x2c\x69\x27\x33\x63\x98\x79\x5f\xba\xf1\x68\x94\x4b\x5f\x03\x40\x62\x8a\x82\x94\xbf\x1c\xb1\x2d\xcb\x69\x45\x3a\x1b\xa5\x38\x47\x35\x72\x32\x1f\x08\x9b\xcc\xa4\xc7\xc4\x57\x16\x47\xa2\x94\x03\x26\x56\x33\x08\x0c\x8b\xf4\x4f\x36\x42\x86\x7b\xb9\x26\xbe\xa0\x32\xe7\xad\xd4\xf9\x4a\x17\xdb\xdc\x5e\x59\x93\xe5\xd1\xc9\x14\x71\x7a\xe0\xa5\x15\x29\x35\x91\x54\x3e\x7d\x77\x7b\x07\x35\x01\x41\xec\x41\xc2\xed\x50\xd7\x0a\x9b\x04\x25\x75\x86\x36\x8c\xcc\xac\x29\x78\x15\xd4\x69\x69\xa4\xf6\xfc\x23\x51\x12\xb5\x07\x57\x4d\x0b\x3a\xb4\x74\xc0\xd0\x79\xd2\xc3\x10\xde\x30\xfe\xc1\x14\xa1\x2a\x53\xe1\x31\x1d\xc2\x95\x86\x37\xa2\x40\xf5\x46\x38\xfc\xdd\x45\x4d\x12\x75\x03\x12\xdf\xf1\xc2\xee\xc2\xf7\xe6\x84\x0d\x83\x02\xa8\xe1\x75\xa7\x76\x56\xf0\xe3\xb6\xc4\xa4\xc6\x10\x9a\xc9\x98\x21\xf4\x1a\xc8\xd4\x2a\x1a\x1e\x4b\x04\x6d\x99\x89\x4a\xf9\x75\x4a\x00\xaa\x32\xb7\x22\xc5\x5b\x6f\x09\xd6\x97\x63\x78\x1b\x46\xae\x0d\xdc\x65\xee\xcc\x22\x2a\x4c\xbc\xb1\x9b\x3d\x6b\xac\xde\xc6\x81\x71\x46\x60\x73\x85\xb5\x97\x6e\x3f\x6e\x1d\xc1\xe9\x21\x6a\xe9\x2b\x84\x4f\x66\xdf\x3d\xd1\x99\xee\xb8\x84\x03\xd4\xaf\x4f\x0a\x16\x45\x9e\x8d\xd0\x48\x89\x29\xaa\x46\x14\x35\x92\x16\xc1\x64\xee\x66\xb8\xd2\x02\xc2\x22\x5c\x5e\xbf\xc5\x74\x1b\x73\x2d\x83\xc2\x5a\xb1\xdc\x31\x42\x7a\x2c\x76\x12\xbe\x46\xfa\xe5\x1e\xf2\x22\x30\xd4\x3d\x7e\x26\xd8\x17\x79\xf6\x44\x01\xf4\xfa\x20\xe0\x11\x97\x01\x1f\x09\x76\xa3\xca\xc2\x60\x8b\x8c\xa6\xac\xcc\x47\x5c\xf2\xa0\x08\x96\x3b\xa9\x3b\xa0\xbf\xf0\x6d\xf7\x46\xab\xdf\x80\xb6\xdc\xdb\x5f\x13\xbb\x73\xd0\xa1\xc3\x12\xbe\x47\x5c\xee\xeb\x5e\x13\x38\xc9\x21\x9a\x71\x90\x3c\x35\xb0\xb4\xd8\xb2\x6b\x61\x8b\xb2\x54\x12\x19\x0d\xf7\xae\xbd\x13\x8e\x56\xbf\x9a\xd5\x67\x10\xda\xa8\xb2\x45\xf8\xa0\xec\x97\x2e\x28\x96\x4e\xfa\x4c\x96\x31\xc8\x08\xa1\x45\xed\x0a\x7f\x14\x4a\x76\xc2\x18\x3e\xd5\x57\xba\x0f\xd7\xc6\xd3\x9f\xef\x9e\x24\x41\x3d\x9d\x87\xb7\x06\xdd\xb5\xf1\xdc\xf2\x9b\xb0\x1a\x48\x78\x06\xa3\x61\x02\x1f\x76\x1d\xec\x8a\x38\xe9\xfa\x43\x0a\xc3\x32\xd6\x4f\x23\x14\xe9\xc8\x23\x19\x5b\x73\xc4\x11\x4a\x58\x28\x2c\x51\x54\x8e\x1d\x98\x36\x7a\x80\x45\xe9\x97\x5b\xd7\x88\x82\x30\x76\x45\x0e\x7b\x96\x8b\x4b\xdd\x91\x5f\x0d\x3d\x21\x02\x52\x14\xca\x42\x5a\x31\xd1\xec\xcd\x09\xb4\x65\x02\x05\xda\x1c\xa1\x24\x84\x3a\x46\xbc\xfb\x70\x25\x7c\x07\xd0\xe5\x48\x5d\x31\x64\xbe\x27\x03\x78\x06\xc4\x86\xf1\x01\x96\x0a\x51\x92\x9a\x7e\x22\xf4\x61\x49\xfd\x0c\xa5\x90\x14\x31\x5f\x72\xf4\xaf\x70\xa5\x4f\x6a\x96\x69\x77\x19\x5a\x41\x3a\x20\x28\x99\x0b\x45\x78\x47\x27\x59\x03\xaa\x80\x7e\x14\xa4\xaf\x01\x7b\x1f\x16\x33\xe3\x02\x98\x65\x12\x15\xc7\x4e\xbd\x47\x5c\xf6\xfa\x1b\xaa\xed\x5d\xe9\x5e\xc0\xc5\x0d\x65\x36\x20\x6a\xb4\x5a\x42\x8f\xfb\x7a\xbf\xdc\x17\xec\x05\x4b\x91\xa6\x9c\x5e\x0a\x75\x73\x04\x9a\xed\xd5\x9b\x43\x3b\x97\x09\x5e\x26\x89\xa9\x34\x27\x5e\x47\xf8\xf5\xf5\x29\x35\xf8\x89\xb4\x90\x7a\x25\x37\xe1\x91\x20\xc2\x50\x58\xcc\x64\x32\x83\x85\x54\x8a\xc3\x40\x87\x29\xa9\x27\xc5\x52\x99\x65\x23\xe7\x33\x77\x1e\x34\x4b\xf1\x68\x2d\x7b\xce\xf4\x76\x87\x06\xbb\x98\xa3\xf4\x21\xb9\xb1\x66\x2e\x53\x4c\x2f\x6f\xae\xb6\x4a\x69\x95\x39\x9e\x02\x1e\x95\x72\x9c\xbe\x51\xcc\xea\x4d\x8c\x59\xb7\x86\x30\x65\x67\xfd\x4e\x92\xbf\x93\xd8\xa9\x31\x0a\xc5\x66\x7f\x08\x85\x9a\x24\xf6\x30\xad\x77\x6b\x13\x22\xdc\xe1\x53\xa9\x64\x22\x7d\x8d\xdf\x6d\x6c\xc5\xf9\x10\x4f\x62\xe0\x92\x1c\x0d\x38\xf4\xfd\x36\x56\x93\x0e\x64\xae\x8d\xdd\x7e\x3e\xf7\xe3\xc9\x1e\x14\x39\x80\x1d\x4f\x83\xc7\x6a\x8a\x56\xa3\x47\x37\xa0\x18\x6b\x10\x27\xe0\xa6\x09\xac\x87\xb0\x87\xa4\xd4\xfb\xbc\x3a\x61\x25\x01\x8d\x8b\xd5\xd8\x1a\xb2\xf6\x95\xe4\x9b\x46\x35\x12\x64\x7b\xb6\xc8\x46\x9c\x54\xd6\xa2\xf6\x6a\x09\x7e\x61\xc0\x55\x65\x69\xac\xc7\x74\x7d\x49\x32\x4d\x98\xe8\x3a\xd0\x1e\xf3\xa1\x62\x13\x60\xa0\x10\x4a\x99\x05\x24\xaa\x72\x1e\x6d\xb4\xac\x98\x29\xb3\xba\x0a\x33\xc7\x3a\x8d\x0d\x2e\x81\x9c\x41\x39\x13\x0e\xdb\x1c\xcc\x55\x49\x82\x98\x62\x1a\x3a\xa2\x2b\xc1\x2c\xc3\xc4\xcb\x39\xaa\x25\x14\x28\xb8\xd2\x20\x7c\xbb\x3f\x9d\xec\xb0\x7d\xcb\xf0\xda\x8e\x1a\x9f\x7c\x9d\xa4\x83\xe4\x24\x7c\xb5\x52\x61\x1b\x76\x67\xc2\x41\x26\xa4\xa2\xbc\x6e\xa2\xe1\x0e\x93\xd9\x8d\xc5\xb9\xc4\xc5\x67\xed\x44\x86\xef\x84\x54\xef\x8c\x5d\x08\x9b\x76\x64\xf0\x7b\xb0\x4f\x54\x35\x7d\x81\xa4\x5a\x2e\x97\x0d\x70\xaa\x65\xbf\xa5\x22\x47\x4d\x02\x20\x7e\x17\x35\x83\x37\x8a\x24\xb6\x98\xa1\x26\xd7\x5b\x4d\x9b\x13\x05\x16\x33\xb4\xa8\xc9\x9e\x44\xbd\x7e\x67\x52\xe3\x1e\x12\xe1\x85\x32\x39\x4b\x66\x8a\xa8\xeb\xbc\x17\x16\xd2\xcf\x40\xf0\x66\xb5\xf4\x32\x0e\xaf\x11\x90\x42\x05\x62\x31\xda\x6e\xa7\x68\x34\xd1\xf0\x9f\x97\x9f\xae\xaf\xae\xbf\x1f\xb3\x57\xd9\x27\xe1\xcd\x73\x2d\x1d\x54\x3c\xaa\x53\xf5\x70\x95\xf2\x74\xc4\x2b\x8d\x4f\x25\x26\x44\xda\x14\x67\x62\x2e\xc9\x06\x6c\xac\x87\xcc\xd1\x8a\xa9\x42\xa0\x34\x18\x94\x71\xb4\x8e\x42\xe7\x60\x69\x2a\x98\x89\x39\x42\x8a\x58\x42\xa5\x53\xb4\xce\x0b\x9d\x12\xf5\x26\x8b\x91\xef\x2a\x13\x30\x45\xea\xad\x2b\x62\x1b\xd6\xd5\x7b\x2e\xc0\xb7\x99\xee\x8e\x44\x96\x3e\xd4\x55\xb1\x1d\x95\x06\x7b\x66\x51\xef\x3e\x11\xaf\xa6\xfd\x5e\xf8\x6a\x03\xfa\xf6\x24\xfe\x3c\xbe\x49\xfd\xc3\xaf\x6d\xc9\xff\xa7\xe7\xe7\xfe\xbb\xf3\xa8\x01\x28\xe1\xfc\xe7\x70\x0a\x9f\x91\xf1\x27\x46\x07\xb3\x39\xec\x92\xde\x34\x43\xd7\x63\xef\x6d\x9e\xb3\x5d\xf8\x37\x75\x36\xab\xf0\xdf\x90\xd4\x86\x68\x29\x7a\x21\x55\x90\xb8\xd1\x08\x82\x42\x16\x5f\x53\x19\x81\x9d\xd5\x82\x4d\x45\xf2\xf2\xe6\x0a\x1a\x6d\xc0\x60\x30\x08\x20\xeb\xbc\xad\x12\xf6\xa3\x52\x7b\xd4\x04\x42\xb4\x6a\x2a\x2d\x97\x14\x1d\x2d\xde\xca\x21\x66\x84\x21\xcc\x2c\x85\x9f\xc1\x30\x28\x7f\xd8\x11\x05\xc0\x3b\x63\x01\x9f\x44\x51\x2a\xec\xb3\x18\xe0\x9d\x31\xf1\xcc\x84\x0d\x7f\x82\xd1\x08\x3e\xb5\x49\x1c\x07\xaa\x53\x8a\xb7\x42\x0e\xc7\x15\x53\xc8\x8c\x21\x29\x77\xf9\x19\xd2\xc4\x1f\xb4\x59\xe8\x6d\x5b\xf3\x5e\xc2\xe2\x18\x26\xbd\xcb\xb9\x90\x8a\x4c\x7f\xd2\xeb\xc3\xa4\x77\x63\x4d\xce\x21\xb3\xce\x27\x31\x06\x9e\xf4\xde\x22\xc3\x4c\x3a\xe9\xd1\xb2\xff\xca\x19\xc9\x07\x4a\x4e\x7e\xc0\xe5\x37\xbc\x58\xd3\x5c\xbb\xdf\x6f\x42\xf2\x42\xed\xe4\xe8\xef\x96\x25\x7e\x43\x51\x7b\xdd\xf0\x41\x94\xcd\xe4\xce\x69\xba\x7f\x28\xd0\x8b\xf9\xc5\xb0\x55\xe7\x5f\xfe\xea\x8c\x1e\x4f\x7a\x2d\xfd\x7d\x53\xd0\xb1\x28\xfd\x72\xd2\x83\x95\x5d\xc7\x93\x1e\xef\x5b\xb7\xd7\x44\x8e\x27\x3d\xda\x89\x9a\xad\xf1\x66\x5a\x65\xe3\x49\x6f\xba\xf4\xe8\xfa\x17\x7d\x8b\x65\x9f\xc0\xe9\x9b\x76\x87\x49\xef\x2f\x04\xc4\xa3\x11\x18\x3f\x43\x1b\x34\xe9\xe0\xe7\x6d\xc8\x75\x44\x28\x7f\xa8\xe6\x11\x2c\xf6\xce\x0a\xed\x64\x7d\xf3\xb3\x73\x68\x81\xce\x89\x7c\x77\xbf\x45\xe1\xb6\x86\xa5\xa1\x3b\x9c\x86\x9d\xdd\xc4\xcb\xd6\xce\xc3\x05\x95\x4d\x1e\x8e\x2c\x64\x6d\x4e\x6c\xcb\x2c\xce\x83\xa7\x06\xb6\xd8\xe6\x4c\xf8\x66\x34\x19\x22\x05\x01\x64\xdf\x11\x60\x39\x15\x64\xbd\xc5\x08\x29\x5e\x20\x4c\x31\xf8\xf9\x70\x95\x93\xa2\x55\x4b\x72\x53\xed\xaa\xc9\x4c\xe8\x9c\x02\x9b\x90\xee\x0b\xb6\x77\x0a\x9f\x1e\xc9\x90\x38\x4d\xd4\x50\xb9\xba\xb0\xce\x74\x35\x2b\x12\x70\x04\x83\x8f\xcb\x30\x32\x26\x09\x96\x9e\xac\xeb\x50\xd5\xec\x40\x6d\x24\x33\xb6\x10\x7e\x4c\xee\x19\x07\x7e\xf7\xf1\x88\x87\xe3\x48\xc1\xc7\xd1\x21\x2b\x9f\x55\x85\xa0\xa8\x47\xa4\x1c\x08\x34\x7d\x3a\x95\x89\xe0\x60\xa5\xc6\x53\x31\x35\x55\x40\xb8\x56\x0f\x51\xd4\x14\x71\x4c\x91\xd3\x13\xb2\xcf\xc8\xd6\xaf\x64\xbe\x10\x4f\xef\x51\xe7\x7e\x36\x86\x2f\x5f\xff\xfb\x57\x5f\xef\x18\x18\x80\x11\xd3\xef\x43\x98\xb7\xe5\xb2\x6a\x87\x18\x36\x27\x76\x0b\x67\xc4\xe7\xb0\xbe\x21\x18\xe6\xed\x98\xa6\xf2\xd7\x9e\xa0\x85\xe0\x44\x0b\xa6\xc2\x71\x8a\x40\x72\x21\x94\xe7\xb8\x51\x27\xd8\xa7\xe8\x7a\xeb\x62\xd2\x75\x32\x8d\x8b\xd7\x7d\x98\x46\x11\x6f\xc2\xf7\xfd\xd3\xc3\x70\x0b\xc9\xd2\xc1\x9f\xfb\x6b\xf4\x50\x6e\x5d\xb1\xc7\xe3\xb4\x96\x23\x52\x8b\xc1\x0d\xc6\x70\x7b\x8b\x1b\xc4\x86\xde\x43\x8a\x23\x67\x98\xe3\xee\x2a\x6c\x7d\x6c\xa5\xf6\x5f\xfd\xdb\x6e\xfd\x4a\x2d\x8b\xaa\x18\xc3\xab\x1d\x43\x02\xa4\x1d\xa9\xcd\x30\xb8\x8d\x02\x04\x41\x57\x6e\x45\x51\x70\xca\x2f\x53\xd4\x5e\x66\x12\x6d\xf7\x68\x87\xc4\x83\x27\xd6\x31\x7a\x23\xc5\x97\x2e\xe2\x50\xe7\xb0\xdf\x58\x93\x56\x09\x5a\xf6\xc0\xb1\x12\x92\x74\x01\x6a\x59\x62\xb0\x86\x90\x86\x42\x13\x7a\xd7\xd5\x24\x0a\xcf\x51\x68\xa9\x73\x17\xb7\x94\x2e\x00\x48\xf0\xba\x8b\x19\xb2\xeb\x59\xa9\x40\x31\x55\x4e\xa6\x68\x31\x05\x01\x79\x25\xac\xd0\x1e\x31\x25\xf8\x09\x55\xa8\x70\x0b\xd8\x42\x9e\x68\xef\xde\x6a\x6b\x0c\xa6\x1a\xc0\x8a\x48\x8c\xf7\x75\xa1\x3e\xf9\x9b\x99\xea\xc5\xab\xd7\x7b\x55\xde\x8c\xdb\x5d\xc3\x17\xde\xa3\xd5\x63\xf8\xef\xfb\xcb\xc1\x7f\x89\xc1\xdf\x1f\xce\xe2\x3f\xaf\x06\x7f\xfe\x9f\xfe\xf8\xe1\x8b\xce\xcf\x87\xf3\x6f\xff\x65\xc7\x4a\xdb\xc3\xf6\x1d\xc7\x27\x3a\x91\x3a\x48\xac\x35\xda\x67\x0f\x63\x32\xb8\xb3\x15\xf6\xe1\x9d\x50\x0e\xfb\xf0\x59\xb3\x6b\xf8\x95\x42\xdb\x9d\xb9\x84\x6f\x00\x3d\xda\x75\x7b\xf0\xd1\x0c\x61\x92\xf6\x8f\x89\xe4\xee\xab\x48\x1e\x27\x24\x0e\xdb\x4c\xd6\x45\x9a\xce\x1d\x2f\x30\xe2\x51\x58\x3a\x8c\xe1\xed\x30\x31\xc5\xa8\x73\x07\x4c\x71\xf5\x07\xa1\x97\xd0\xc2\x5a\x08\x4a\xd7\x4f\xba\xf3\x84\x4d\x22\xb1\x94\x91\x36\xb7\xe8\xa0\xe4\x23\x42\x13\xb9\x06\xb0\x9c\x62\x22\x38\x10\xb7\x53\xe9\xad\xb0\xcb\x4e\xde\x01\x89\xd0\xb1\x16\x99\x55\x0a\xce\x1c\x22\x0c\xb5\x49\x71\x13\x5d\xcf\x03\x86\x8a\xa9\x54\xd2\x2f\x43\xe1\x32\x31\x3a\x53\x32\xc6\xff\x45\x69\xac\x17\xda\xd7\x45\xdf\x1c\x9f\x40\xfa\x50\x6f\x0e\xc5\xb9\xb3\x54\xbb\x8b\x8b\xd7\x5f\xde\x56\xd3\xd4\x14\x42\xea\x77\x85\x1f\x9d\x7f\x7b\xf6\xb7\x4a\x28\xae\x98\x5e\x8b\x02\xdf\x15\xfe\xfc\xb7\x73\x8b\x17\x5f\x1d\x61\x45\x67\xf7\xc1\x56\x1e\xce\xee\x07\xf1\xbf\x2f\xea\xa6\xf3\x6f\xcf\x26\xc3\xbd\xfd\xe7\x5f\x10\x0f\x1d\x0b\x7c\xb8\x1f\xb4\xe6\x37\x7c\xf8\xe2\xfc\xdb\x4e\xdf\xf9\xa6\x31\x76\xb2\xd2\x83\x09\xe6\xfb\x76\x6c\x88\x4e\x7c\xfd\x18\xaa\xb6\xcc\xd5\xd0\x70\x3d\xe5\x8c\x56\x4c\xfe\x38\x2e\xf3\xec\xaa\xf2\x31\x41\x97\x3e\xbe\x8a\xbb\x5a\xbf\xed\x94\x4d\x36\xae\xc6\x1b\x0f\xb4\xc2\xd4\x3f\x6b\x9d\x76\xf5\x66\xe1\x13\x66\xcf\xbc\x58\xf8\x84\x59\xb7\xd4\x16\x04\xb3\x7a\x9f\x10\x9f\xab\x34\x17\x0e\xbf\xc3\xdb\x81\xdd\x0f\x9c\xb6\xb2\x40\xc1\x7e\x5d\x2f\x8d\xe7\x31\xf2\xb0\xf3\x22\xf4\xa0\x49\xb3\x3f\xbe\x11\x7e\x76\x14\x05\x2f\xaf\xa2\xd8\xf8\xd6\x90\xef\x71\x4b\x89\x09\xae\xbc\xa1\xe2\x38\x0e\x45\x1a\x1b\x29\xf0\xb1\x18\xfb\xfa\x21\xe2\x88\x77\xa5\xed\x1b\x2b\x0a\x9a\x40\x10\x10\xcb\x14\xfe\xe3\xf6\xe3\xf5\xe8\x7b\x13\x63\x05\xca\x66\x5c\xb0\x2d\xbe\xe5\xea\x83\xab\x92\x19\x08\x47\xa4\x51\x7e\x7b\xcb\xa5\x87\x42\x68\x99\xa1\xf3\xc3\xb8\x1a\x5a\x77\xff\xfa\x61\xb8\x5a\xee\x90\xf1\x42\xb5\x7e\x89\x14\x0f\x00\xdb\x06\x31\xd3\xcc\xe5\xa0\x95\x49\x2a\x4d\x1a\x89\x5e\x30\xb1\x5e\x3c\x22\x98\x48\x6c\x85\xec\x14\xc6\xd0\xa3\x63\xd2\xd9\xfa\x27\x32\xac\x9f\x7b\x70\xb6\xe0\x92\x7e\x8f\x7e\xf6\xc2\x86\xcd\xc3\x31\x6a\xeb\x78\xfc\xb8\x71\x88\xef\xad\xcc\x73\x0e\xb7\xb8\x6e\x3b\x47\xed\xcf\xd9\xbf\x65\xa0\x4d\x67\xb0\x8e\xf7\x63\xed\xad\xd8\x3a\x21\xf7\xaf\x1f\x7a\x70\xb6\xca\x17\x85\xa0\xf8\x04\xaf\x9b\x9b\xb0\xd2\xa4\xe7\x75\xd6\xba\xd4\x5e\x3c\x71\x62\x30\x33\x0e\x75\xb8\x48\xf0\x26\x54\x63\x9d\xa1\xe4\x13\x95\x1a\x84\x00\x33\x85\x45\x28\xc0\xd5\xa2\x0c\x97\xc9\xa5\xb0\x7e\xed\x59\xdd\xdd\xc7\xb7\x1f\xc7\x61\x37\x52\x5b\xae\xeb\x2c\x37\x93\x5a\xa8\x58\xd6\x6e\xe2\x43\x22\xa4\x0a\x4a\xf2\x26\xa6\xb6\x75\x45\x37\xab\x7c\x65\x71\xb8\xfe\xcc\xea\xe8\x13\xbf\xed\x8d\xdb\xf6\xc3\xce\x6f\xdd\xd6\x0d\xed\xff\xf0\x25\xd9\xd1\x2c\xea\x1d\x37\xad\x9b\x2c\x5e\x77\xce\xe0\x5e\x16\x5b\x68\x26\x2e\x53\x93\x38\x62\x30\xc1\xd2\xbb\x91\x99\x13\x74\xe2\x62\xb4\x30\xf6\x51\xea\x7c\x40\x87\x6c\x10\x34\xef\x46\xec\x62\x46\x7f\xe2\x3f\xbf\x8a\x23\xf6\x53\xc7\xb3\x15\x1e\xb4\xfe\x03\x78\x63\xf7\x39\xfa\xc5\xac\xd5\xf1\xe5\x73\x3c\xc1\xcb\xdb\x3a\xf9\x5b\x9b\x4d\xe6\x12\x2e\xc2\xe3\x4b\xd7\x0e\xc2\x15\x22\x0d\x10\x28\xf4\xf2\x77\x3f\xc6\x24\x40\xce\xf1\x93\xe5\x20\x3e\x45\x1f\x08\x9d\x0e\x9a\xf8\x3a\x59\xfe\x62\x89\x55\xf2\x48\x03\xfe\x7c\xf5\xf6\x1f\x73\xb8\x2b\xf9\x2c\x6b\x0d\x55\x94\x31\x78\x5b\xd5\xd1\x9d\xf3\xc6\x8a\x1c\x57\xdb\xaa\x69\x93\x7c\xb4\x0c\xc7\xbc\x12\x7e\xfa\x99\x9b\xda\xc7\xe7\x42\x95\x33\xf1\xba\x9e\x7b\x7a\x82\x7e\x7a\x82\x7e\x7a\x82\x7e\x7a\x82\xbe\x57\xd8\x7f\xd4\x27\xe8\xa7\x27\xe4\xa7\x27\xe4\xa7\x27\xe4\xbb\xbb\x4f\x4f\xc8\x4f\x4f\xc8\x4f\x4f\xc8\xd7\xbf\xd3\x13\xf2\xd3\x13\xf2\xd3\x13\xf2\xd3\x13\xf2\x2d\xdf\x4e\x35\xfd\xff\x7e\x7c\x79\xba\x1c\xfb\x63\x5c\x8e\x9d\xae\xbb\x4e\xd7\x5d\xa7\xeb\xae\xd3\x75\xd7\x2f\x38\xf1\xa7\xeb\xae\xd3\x75\xd7\xe9\xba\xeb\x74\xdd\xf5\x4f\x7a\xdd\x95\x09\xe5\x8e\xbe\xef\xfa\xdf\x00\x00\x00\xff\xff\x25\xf1\x04\x48\x34\x4b\x00\x00")
+var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\x79\x6f\x23\x37\x96\xff\xbf\x3f\xc5\x83\x66\x81\xb6\xb3\x3a\xda\x9d\x45\x76\x22\x20\x08\x8c\xee\x74\xe0\x4d\xb7\xdb\x68\xbb\xb3\xc0\x5a\xde\x1d\xaa\xea\x55\x89\x63\x16\x59\x43\xb2\x24\x6b\x82\x7c\xf7\xc5\x7b\x64\x1d\xba\xe5\x1c\xb3\x93\x85\xea\x1f\x5b\x3c\xdf\xc1\xf7\x7b\x07\x29\x4a\xf9\x23\x5a\x27\x8d\x1e\x83\x28\x25\x3e\x79\xd4\xf4\xcb\x0d\x1f\xff\xec\x86\xd2\x8c\xe6\x17\x2f\x1e\xa5\x4e\xc7\xf0\xa6\x72\xde\x14\x9f\xd0\x99\xca\x26\xf8\x16\x33\xa9\xa5\x97\x46\xbf\x28\xd0\x8b\x54\x78\x31\x7e\x01\x20\xb4\x36\x5e\x50\xb3\xa3\x9f\x00\x89\xd1\xde\x1a\xa5\xd0\x0e\x72\xd4\xc3\xc7\x6a\x8a\xd3\x4a\xaa\x14\x2d\x2f\x5e\x6f\x3d\x7f\x35\xfc\x7a\xf8\xea\x05\x40\x62\x91\xa7\xdf\xc9\x02\x9d\x17\x45\x39\x06\x5d\x29\xf5\x02\x40\x8b\x02\xc7\x60\x4a\xb4\xc2\x1b\x9b\x5b\x53\x95\x6e\x58\xff\x74\xc3\xc4\x58\x34\xf4\xa7\x78\xe1\x4a\x4c\x68\x77\x1e\xd3\x4e\x59\x19\x13\xd6\xab\x89\x14\x1e\x73\x63\x65\xfd\x1b\x60\x00\x46\x15\xfc\x7f\x60\xfe\x63\x5c\xe3\x7b\x5a\x92\xdb\x95\x74\xfe\x87\xcd\xbe\xf7\xd2\x79\xee\x2f\x55\x65\x85\x5a\x27\x98\xbb\xdc\xcc\x58\x7f\xdd\x6e\xcf\xdb\xe5\xa1\x4b\xea\xbc\x52\xc2\xae\xcd\x7b\x01\xe0\x12\x53\xe2\x18\x78\x5a\x29\x12\x4c\x5f\x00\x44\xf1\xc5\x65\x06\x51\x44\xf3\x8b\xb8\xaa\x4b\x66\x58\x88\x7a\x0f\xa0\x25\xf5\xe5\xcd\xd5\x8f\x5f\xde\xae\x75\x00\xa4\xe8\x12\x2b\x4b\xcf\xca\x58\x61\x08\xa4\x03\x3f\x43\xa8\xb4\xf4\x60\x32\x28\x2a\xe5\xa5\x47\x2d\x74\xb2\x84\xcc\x58\xf8\xf8\xfe\x03\x14\x42\x8b\x1c\xd3\x8e\xa8\xe1\xca\x93\xee\x9d\xb7\x42\xea\xb0\x82\xd4\xce\x0b\xa5\x58\xbd\xb4\x52\x33\x18\xa4\x06\xe9\x5d\xd0\x08\xf1\x06\xde\x80\x00\x52\xa3\xcc\x24\xa6\xe0\x90\xb7\xf6\xc2\xe6\xe8\xdb\x61\x6e\xd8\xe1\xc0\x2f\x49\x3c\x66\xfa\x57\x4c\x7c\xa7\xd9\xe2\xdf\x2a\x69\x31\xed\x32\x4b\xa2\xaa\x0f\x6d\xa7\xb9\xb4\x44\x91\xef\x9c\x82\xf0\x75\x4c\x64\xa5\x7d\x4d\x6a\x2f\x49\xb4\x61\x1c\xa4\x64\x1d\x18\xd8\x8e\x4a\x22\x36\x58\xec\xcc\xc9\x4c\x3a\xb0\x58\x5a\x74\xa8\x7d\x23\x11\xa1\x23\x03\x43\xb8\x45\x4b\x13\xe9\xac\x54\x2a\x25\x51\xce\xd1\x7a\xb0\x98\x98\x5c\xcb\xbf\x37\xab\x39\x92\x15\x6d\xa3\x84\x47\xe7\x41\x6a\x8f\x56\x0b\x05\x73\xa1\x2a\xec\x83\xd0\x29\x14\x62\x09\x16\x69\x5d\xa8\x74\x67\x05\x1e\xe2\x86\xf0\xc1\x58\xd2\x4e\x66\xc6\x30\xf3\xbe\x74\xe3\xd1\x28\x97\xbe\x06\x80\xc4\x14\x05\x29\x7f\x39\x62\x5b\x96\xd3\x8a\x74\x36\x4a\x71\x8e\x6a\xe4\x64\x3e\x10\x36\x99\x49\x8f\x89\xaf\x2c\x8e\x44\x29\x07\x4c\xac\x66\x10\x18\x16\xe9\x9f\x6c\x84\x0c\xf7\x72\x4d\x7c\x41\x65\xce\x5b\xa9\xf3\x95\x2e\xb6\xb9\xbd\xb2\x26\xcb\xa3\x93\x29\xe2\xf4\xc0\x4b\x2b\x52\x6a\x22\xa9\x7c\xfa\xee\xf6\x0e\x6a\x02\x82\xd8\x83\x84\xdb\xa1\xae\x15\x36\x09\x4a\xea\x0c\x6d\x18\x99\x59\x53\xf0\x2a\xa8\xd3\xd2\x48\xed\xf9\x47\xa2\x24\x6a\x0f\xae\x9a\x16\x74\x68\xe9\x80\xa1\xf3\xa4\x87\x21\xbc\x61\xfc\x83\x29\x42\x55\xa6\xc2\x63\x3a\x84\x2b\x0d\x6f\x44\x81\xea\x8d\x70\xf8\xbb\x8b\x9a\x24\xea\x06\x24\xbe\xe3\x85\xdd\x85\xef\xcd\x09\x1b\x06\x05\x50\xc3\xeb\x4e\xed\xac\xe0\xc7\x6d\x89\x49\x8d\x21\x34\x93\x31\x43\xe8\x35\x90\xa9\x55\x34\x3c\x96\x08\xda\x32\x13\x95\xf2\xeb\x94\x00\x54\x65\x6e\x45\x8a\xb7\xde\x12\xac\x2f\xc7\xf0\x36\x8c\x5c\x1b\xb8\xcb\xdc\x99\x45\x54\x98\x78\x63\x37\x7b\xd6\x58\xbd\x8d\x03\xe3\x8c\xc0\xe6\x0a\x6b\x2f\xdd\x7e\xdc\x3a\x82\xd3\x43\xd4\xd2\x57\x08\x9f\xcc\xbe\x7b\xa2\x33\xdd\x71\x09\x07\xa8\x5f\x9f\x14\x2c\x8a\x3c\x1b\xa1\x91\x12\x53\x54\x8d\x28\x6a\x24\x2d\x82\xc9\xdc\xcd\x70\xa5\x05\x84\x45\xb8\xbc\x7e\x8b\xe9\x36\xe6\x5a\x06\x85\xb5\x62\xb9\x63\x84\xf4\x58\xec\x24\x7c\x8d\xf4\xcb\x3d\xe4\x45\x60\xa8\x7b\xfc\x4c\xb0\x2f\xf2\xec\x89\x02\xe8\xf5\x41\xc0\x23\x2e\x03\x3e\x12\xec\x46\x95\x85\xc1\x16\x19\x4d\x59\x99\x8f\xb8\xe4\x41\x11\x2c\x77\x52\x77\x40\x7f\xe1\xdb\xee\x8d\x56\xbf\x01\x6d\xb9\xb7\xbf\x26\x76\xe7\xa0\x43\x87\x25\x7c\x8f\xb8\xdc\xd7\xbd\x26\x70\x92\x43\x34\xe3\x20\x79\x6a\x60\x69\xb1\x65\xd7\xc2\x16\x65\xa9\x24\x32\x1a\xee\x5d\x7b\x27\x1c\xad\x7e\x35\xab\xcf\x20\xb4\x51\x65\x8b\xf0\x41\xd9\x2f\x5d\x50\x2c\x9d\xf4\x99\x2c\x63\x90\x11\x42\x8b\xda\x15\xfe\x28\x94\xec\x84\x31\x7c\xaa\xaf\x74\x1f\xae\x8d\xa7\x3f\xdf\x3d\x49\x82\x7a\x3a\x0f\x6f\x0d\xba\x6b\xe3\xb9\xe5\x37\x61\x35\x90\xf0\x0c\x46\xc3\x04\x3e\xec\x3a\xd8\x15\x71\xd2\xf5\x87\x14\x86\x65\xac\x9f\x46\x28\xd2\x91\x47\x32\xb6\xe6\x88\x23\x94\xb0\x50\x58\xa2\xa8\x1c\x3b\x30\x6d\xf4\x00\x8b\xd2\x2f\xb7\xae\x11\x05\x61\xec\x8a\x1c\xf6\x2c\x17\x97\xba\x23\xbf\x1a\x7a\x42\x04\xa4\x28\x94\x85\xb4\x62\xa2\xd9\x9b\x13\x68\xcb\x04\x0a\xb4\x39\x42\x49\x08\x75\x8c\x78\xf7\xe1\x4a\xf8\x0e\xa0\xcb\x91\xba\x62\xc8\x7c\x4f\x06\xf0\x0c\x88\x0d\xe3\x03\x2c\x15\xa2\x24\x35\xfd\x44\xe8\xc3\x92\xfa\x19\x4a\x21\x29\x62\xbe\xe4\xe8\x5f\xe1\x4a\x9f\xd4\x2c\xd3\xee\x32\xb4\x82\x74\x40\x50\x32\x17\x8a\xf0\x8e\x4e\xb2\x06\x54\x01\xfd\x28\x48\x5f\x03\xf6\x3e\x2c\x66\xc6\x05\x30\xcb\x24\x2a\x8e\x9d\x7a\x8f\xb8\xec\xf5\x37\x54\xdb\xbb\xd2\xbd\x80\x8b\x1b\xca\x6c\x40\xd4\x68\xb5\x84\x1e\xf7\xf5\x7e\xb9\x2f\xd8\x0b\x96\x22\x4d\x39\xbd\x14\xea\xe6\x08\x34\xdb\xab\x37\x87\x76\x2e\x13\xbc\x4c\x12\x53\x69\x4e\xbc\x8e\xf0\xeb\xeb\x53\x6a\xf0\x13\x69\x21\xf5\x4a\x6e\xc2\x23\x41\x84\xa1\xb0\x98\xc9\x64\x06\x0b\xa9\x14\x87\x81\x0e\x53\x52\x4f\x8a\xa5\x32\xcb\x46\xce\x67\xee\x3c\x68\x96\xe2\xd1\x5a\xf6\x9c\xe9\xed\x0e\x0d\x76\x31\x47\xe9\x43\x72\x63\xcd\x5c\xa6\x98\x5e\xde\x5c\x6d\x95\xd2\x2a\x73\x3c\x05\x3c\x2a\xe5\x38\x7d\xa3\x98\xd5\x9b\x18\xb3\x6e\x0d\x61\xca\xce\xfa\x9d\x24\x7f\x27\xb1\x53\x63\x14\x8a\xcd\xfe\x10\x0a\x35\x49\xec\x61\x5a\xef\xd6\x26\x44\xb8\xc3\xa7\x52\xc9\x44\xfa\x1a\xbf\xdb\xd8\x8a\xf3\x21\x9e\xc4\xc0\x25\x39\x1a\x70\xe8\xfb\x6d\xac\x26\x1d\xc8\x5c\x1b\xbb\xfd\x7c\xee\xc7\x93\x3d\x28\x72\x00\x3b\x9e\x06\x8f\xd5\x14\xad\x46\x8f\x6e\x40\x31\xd6\x20\x4e\xc0\x4d\x13\x58\x0f\x61\x0f\x49\xa9\xf7\x79\x75\xc2\x4a\x02\x1a\x17\xab\xb1\x35\x64\xed\x2b\xc9\x37\x8d\x6a\x24\xc8\xf6\x6c\x91\x8d\x38\xa9\xac\x45\xed\xd5\x12\xfc\xc2\x80\xab\xca\xd2\x58\x8f\xe9\xfa\x92\x64\x9a\x30\xd1\x75\xa0\x3d\xe6\x43\xc5\x26\xc0\x40\x21\x94\x32\x0b\x48\x54\xe5\x3c\xda\x68\x59\x31\x53\x66\x75\x15\x66\x8e\x75\x1a\x1b\x5c\x02\x39\x83\x72\x26\x1c\xb6\x39\x98\xab\x92\x04\x31\xc5\x34\x74\x44\x57\x82\x59\x86\x89\x97\x73\x54\x4b\x28\x50\x70\xa5\x41\xf8\x76\x7f\x3a\xd9\x61\xfb\x96\xe1\xb5\x1d\x35\x3e\xf9\x3a\x49\x07\xc9\x49\xf8\x6a\xa5\xc2\x36\xec\xce\x84\x83\x4c\x48\x45\x79\xdd\x44\xc3\x1d\x26\xb3\x1b\x8b\x73\x89\x8b\xcf\xda\x89\x0c\xdf\x09\xa9\xde\x19\xbb\x10\x36\xed\xc8\xe0\xf7\x60\x9f\xa8\x6a\xfa\x02\x49\xb5\x5c\x2e\x1b\xe0\x54\xcb\x7e\x4b\x45\x8e\x9a\x04\x40\xfc\x2e\x6a\x06\x6f\x14\x49\x6c\x31\x43\x4d\xae\xb7\x9a\x36\x27\x0a\x2c\x66\x68\x51\x93\x3d\x89\x7a\xfd\xce\xa4\xc6\x3d\x24\xc2\x0b\x65\x72\x96\xcc\x14\x51\xd7\x79\x2f\x2c\xa4\x9f\x81\xe0\xcd\x6a\xe9\x65\x1c\x5e\x23\x20\x85\x0a\xc4\x62\xb4\xdd\x4e\xd1\x68\xa2\xe1\x3f\x2f\x3f\x5d\x5f\x5d\x7f\x3f\x66\xaf\xb2\x4f\xc2\x9b\xe7\x5a\x3a\xa8\x78\x54\xa7\xea\xe1\x2a\xe5\xe9\x88\x57\x1a\x9f\x4a\x4c\x88\xb4\x29\xce\xc4\x5c\x92\x0d\xd8\x58\x0f\x99\xa3\x15\x53\x85\x40\x69\x30\x28\xe3\x68\x1d\x85\xce\xc1\xd2\x54\x30\x13\x73\x84\x14\xb1\x84\x4a\xa7\x68\x9d\x17\x3a\x25\xea\x4d\x16\x23\xdf\x55\x26\x60\x8a\xd4\x5b\x57\xc4\x36\xac\xab\xf7\x5c\x80\x6f\x33\xdd\x1d\x89\x2c\x7d\xa8\xab\x62\x3b\x2a\x0d\xf6\xcc\xa2\xde\x7d\x22\x5e\x4d\xfb\xbd\xf0\xd5\x06\xf4\xed\x49\xfc\x79\x7c\x93\xfa\x87\x5f\xdb\x92\xff\x4f\xcf\xcf\xfd\x77\xe7\x51\x03\x50\xc2\xf9\xcf\xe1\x14\x3e\x23\xe3\x4f\x8c\x0e\x66\x73\xd8\x25\xbd\x69\x86\xae\xc7\xde\xdb\x3c\x67\xbb\xf0\x6f\xea\x6c\x56\xe1\xbf\x21\xa9\x0d\xd1\x52\xf4\x42\xaa\x20\x71\xa3\x11\x04\x85\x2c\xbe\xa6\x32\x02\x3b\xab\x05\x9b\x8a\xe4\xe5\xcd\x15\x34\xda\x80\xc1\x60\x10\x40\xd6\x79\x5b\x25\xec\x47\xa5\xf6\xa8\x09\x84\x68\xd5\x54\x5a\x2e\x29\x3a\x5a\xbc\x95\x43\xcc\x08\x43\x98\x59\x0a\x3f\x83\x61\x50\xfe\xb0\x23\x0a\x80\x77\xc6\x02\x3e\x89\xa2\x54\xd8\x27\xbb\x27\x49\xc0\x3b\x63\xe2\xb1\x09\x7b\xfe\x04\xa3\x11\x7c\x6a\xf3\x38\x8e\x55\xa7\x14\x72\x85\x34\x8e\x8b\xa6\x90\x19\x43\x82\xee\xb2\x34\xa4\x89\x3f\x68\xb3\xd0\xdb\x76\xe7\xbd\x84\xc5\x31\x4c\x7a\x97\x73\x21\x15\x59\xff\xa4\xd7\x87\x49\xef\xc6\x9a\x9c\xa3\x66\x9d\x4f\x62\x18\x3c\xe9\xbd\x45\x46\x9a\x74\xd2\xa3\x65\xff\x95\x93\x92\x0f\x94\x9f\xfc\x80\xcb\x6f\x78\xb1\xa6\xb9\xf6\xc0\xdf\x84\xfc\x85\xda\xc9\xd7\xdf\x2d\x4b\xfc\x86\x02\xf7\xba\xe1\x83\x28\x9b\xc9\x9d\x03\x75\xff\x50\xa0\x17\xf3\x8b\x61\xab\xd1\xbf\xfc\xd5\x19\x3d\x9e\xf4\x5a\xfa\xfb\xa6\xa0\x93\x51\xfa\xe5\xa4\x07\x2b\xbb\x8e\x27\x3d\xde\xb7\x6e\xaf\x89\x1c\x4f\x7a\xb4\x13\x35\x5b\xe3\xcd\xb4\xca\xc6\x93\xde\x74\xe9\xd1\xf5\x2f\xfa\x16\xcb\x3e\xe1\xd3\x37\xed\x0e\x93\xde\x5f\x48\x27\xa3\x11\x18\x3f\x43\x1b\x94\xe9\xe0\xe7\x6d\xe0\x75\x44\x34\x7f\xa8\xec\x11\x8c\xf6\xce\x0a\xed\x64\x7d\xf9\xb3\x73\x68\x81\xce\x89\x7c\x77\xbf\x45\xe1\xb6\x46\xa6\xa1\x3b\x9c\x86\x9d\xdd\xc4\xcb\xd6\xce\xc3\x35\x95\x4d\x1e\x8e\xac\x65\x6d\x4e\x6c\x2b\x2d\xce\x83\xa7\x06\x36\xda\xe6\x4c\xf8\x66\x34\xd9\x22\xc5\x01\x64\xe2\x11\x63\x39\x1b\x64\xbd\xc5\x20\x29\xde\x21\x4c\x31\xb8\xfa\x70\x9b\x93\xa2\x55\x4b\xf2\x54\xed\xaa\xc9\x4c\xe8\x9c\x62\x9b\x90\xf1\x0b\x36\x79\x8a\xa0\x1e\xc9\x90\x38\x53\xd4\x50\xb9\xba\xb6\xce\x74\x35\x2b\x12\x76\x04\x9b\x8f\xcb\x30\x38\x26\x09\x96\x9e\xac\xeb\x50\xe1\xec\x40\x79\x24\x33\xb6\x10\x7e\x4c\x1e\x1a\x07\x7e\xf7\xf1\x88\x87\xe3\x48\xc1\xc7\xd1\x21\x31\x9f\x55\x85\xa0\xc0\x47\xa4\x1c\x0b\x34\x7d\x3a\x95\x89\xe0\x78\xa5\x86\x54\x31\x35\x55\x00\xb9\x56\x0f\x51\xd4\x14\x74\x4c\x91\x33\x14\xb2\xcf\xc8\xd6\xaf\x64\xbe\x10\x4f\xef\x51\xe7\x7e\x36\x86\x2f\x5f\xff\xfb\x57\x7f\xde\x31\x30\x00\x23\xa6\xdf\x87\x48\x6f\xcb\x7d\xd5\x0e\x31\x6c\x4e\xec\xd6\xce\x88\xcf\x61\x7d\x49\x30\xcc\xdb\x31\x4d\xf1\xaf\x3d\x41\x0b\xc1\xb9\x16\x4c\x85\xe3\x2c\x81\xe4\x42\x40\xcf\xa1\xa3\x4e\xb0\x4f\x01\xf6\xd6\xc5\xa4\xeb\x24\x1b\x17\xaf\xfb\x30\x8d\x22\xde\x84\xef\xfb\xa7\x87\xe1\x16\x92\xa5\x83\xaf\xfb\x6b\xf4\x50\x7a\x5d\xb1\xd3\xe3\xcc\x96\x83\x52\x8b\xc1\x13\xc6\x88\x7b\x8b\x27\xc4\x86\xde\x43\x8a\x23\x7f\x98\xe3\xee\x42\x6c\x7d\x6c\xa5\xf6\x5f\xfd\xdb\x6e\xfd\x4a\x2d\x8b\xaa\x18\xc3\xab\x1d\x43\x02\xa4\x1d\xa9\xcd\x30\xb8\x0d\x04\x04\x41\x57\x6e\x45\x51\x70\xd6\x2f\x53\xd4\x5e\x66\x12\x6d\xf7\x68\x87\xdc\x83\x27\xd6\x61\x7a\x23\xc5\x97\x2e\xe2\x50\xe7\xb0\xdf\x58\x93\x56\x09\x5a\xf6\xc0\xb1\x18\x92\x74\x01\x6a\x59\x62\xb0\x86\x90\x89\x42\x13\x7d\xd7\x05\x25\x8a\xd0\x51\x68\xa9\x73\x17\xb7\x94\x2e\x00\x48\xf0\xba\x8b\x19\xb2\xeb\x59\x29\x42\x31\x55\x4e\xa6\x68\x31\x05\x01\x79\x25\xac\xd0\x1e\x31\x25\xf8\x09\x85\xa8\x70\x11\xd8\x42\x9e\x68\xaf\xdf\x6a\x6b\x0c\xa6\x1a\xc0\x8a\x48\x8c\x57\x76\xa1\x44\xf9\x9b\x99\xea\xc5\xab\xd7\x7b\x55\xde\x8c\xdb\x5d\xc6\x17\xde\xa3\xd5\x63\xf8\xef\xfb\xcb\xc1\x7f\x89\xc1\xdf\x1f\xce\xe2\x3f\xaf\x06\x5f\xff\x4f\x7f\xfc\xf0\x45\xe7\xe7\xc3\xf9\xb7\xff\xb2\x63\xa5\xed\x91\xfb\x8e\xe3\x13\x9d\x48\x1d\x27\xd6\x1a\xed\xb3\x87\x31\x19\xdc\xd9\x0a\xfb\xf0\x4e\x28\x87\x7d\xf8\xac\xd9\x35\xfc\x4a\xa1\xed\x4e\x5e\xc2\x37\x80\x1e\xed\xba\x3d\xf8\x68\x86\x30\x49\xfb\xc7\x44\x72\xf7\x15\x25\x8f\x13\x12\x87\x6d\x26\xeb\x22\x4d\xe7\x9a\x17\x18\xf1\x28\x2c\x1d\xc6\x08\x77\x98\x98\x62\xd4\xb9\x06\xa6\xd0\xfa\x83\xd0\x4b\x68\x61\x2d\x04\xa5\xeb\x27\xdd\x79\xc2\x26\x91\x58\x4a\x4a\x9b\x8b\x74\x50\xf2\x11\xa1\x89\x5c\x03\x58\x4e\x31\x11\x1c\x8b\xdb\xa9\xf4\x56\xd8\x65\x27\xf5\x80\x44\xe8\x58\x8e\xcc\x2a\x05\x67\x0e\x11\x86\xda\xa4\xb8\x89\xae\xe7\x01\x43\xc5\x54\x2a\xe9\x97\xa1\x76\x99\x18\x9d\x29\x19\x53\x80\xa2\x34\xd6\x0b\xed\xeb\xba\x6f\x8e\x4f\x20\x7d\x28\x39\x87\xfa\xdc\x59\xaa\xdd\xc5\xc5\xeb\x2f\x6f\xab\x69\x6a\x0a\x21\xf5\xbb\xc2\x8f\xce\xbf\x3d\xfb\x5b\x25\x14\x17\x4d\xaf\x45\x81\xef\x0a\x7f\xfe\xdb\xb9\xc5\x8b\xaf\x8e\xb0\xa2\xb3\xfb\x60\x2b\x0f\x67\xf7\x83\xf8\xdf\x17\x75\xd3\xf9\xb7\x67\x93\xe1\xde\xfe\xf3\x2f\x88\x87\x8e\x05\x3e\xdc\x0f\x5a\xf3\x1b\x3e\x7c\x71\xfe\x6d\xa7\xef\x7c\xd3\x18\x3b\x89\xe9\xc1\x1c\xf3\x7d\x3b\x36\x44\x27\xbe\x7e\x0f\x55\x5b\xe6\x6a\x68\xb8\x9e\x75\x46\x2b\x26\x7f\x1c\x97\x79\x76\x61\xf9\x98\xa0\x4b\x1f\x5f\xc8\x5d\x2d\xe1\x76\x2a\x27\x1b\xb7\xe3\x8d\x07\x5a\x61\xea\x9f\xb5\x54\xbb\x7a\xb9\xf0\x09\xb3\x67\xde\x2d\x7c\xc2\xac\x5b\x6d\x0b\x82\x59\xbd\x52\x88\x2f\x56\x9a\x3b\x87\xdf\xe1\xf9\xc0\xee\x37\x4e\x5b\x59\xa0\x60\xbf\x2e\x99\xc6\xf3\x18\x79\xd8\x79\x17\x7a\xd0\xa4\xd9\x1f\xdf\x08\x3f\x3b\x8a\x82\x97\x57\x51\x6c\x7c\x71\xc8\x57\xb9\xa5\xc4\x04\x57\x9e\x51\x71\x1c\x87\x22\x8d\x8d\x14\xf8\x58\x8c\x7d\xfd\x10\x71\xc4\xeb\xd2\xf6\x99\x15\x05\x4d\x20\x08\x88\x65\x0a\xff\x71\xfb\xf1\x7a\xf4\xbd\x89\xb1\x02\x65\x33\x2e\xd8\x16\x5f\x74\xf5\xc1\x55\xc9\x0c\x84\x23\xd2\x28\xbf\xbd\xe5\xd2\x43\x21\xb4\xcc\xd0\xf9\x61\x5c\x0d\xad\xbb\x7f\xfd\x30\x5c\xad\x78\xc8\x78\xa7\x5a\x3f\x46\x8a\x07\x80\x6d\x83\x98\x69\xe6\x72\xd0\xca\x24\x95\x26\x8d\x44\x2f\x98\x58\x2f\x1e\x11\x4c\x24\xb6\x42\x76\x0a\x63\xe8\xd1\x31\xe9\x6c\xfd\x13\x19\xd6\xcf\x3d\x38\x5b\x70\x55\xbf\x47\x3f\x7b\x61\xc3\xe6\xed\x18\xb5\x75\x3c\x7e\xdc\x38\xc4\xf7\x56\xe6\x39\x87\x5b\x5c\xba\x9d\xa3\xf6\xe7\xec\xdf\x32\xd0\xa6\x33\x58\xc7\x2b\xb2\xf6\x62\x6c\x9d\x90\xfb\xd7\x0f\x3d\x38\x5b\xe5\x8b\x42\x50\x7c\x82\xd7\xcd\x65\x58\x69\xd2\xf3\x3a\x6b\x5d\x6a\x2f\x9e\x38\x31\x98\x19\x87\x3a\xdc\x25\x78\x13\x0a\xb2\xce\x50\xf2\x89\x4a\x0d\x42\x80\x99\xc2\x22\xd4\xe0\x6a\x51\x86\xfb\xe4\x52\x58\xbf\xf6\xb2\xee\xee\xe3\xdb\x8f\xe3\xb0\x1b\xa9\x2d\xd7\x75\x96\x9b\x49\x2d\x54\xac\x6c\x37\xf1\x21\x11\x52\x05\x25\x79\x13\x53\xdb\xba\xa8\x9b\x55\xbe\xb2\x38\x5c\x7f\x69\x75\xf4\x89\xdf\xf6\xcc\x6d\xfb\x61\xe7\xe7\x6e\xeb\x86\xf6\x7f\xf8\x98\xec\x68\x16\xf5\x8e\xcb\xd6\x4d\x16\xaf\x3b\x67\x70\x2f\x8b\x2d\x34\x13\x97\xa9\x49\x1c\x31\x98\x60\xe9\xdd\xc8\xcc\x09\x3a\x71\x31\x5a\x18\xfb\x28\x75\x3e\xa0\x43\x36\x08\x9a\x77\x23\x76\x31\xa3\x3f\xf1\x9f\x5f\xc5\x11\xfb\xa9\xe3\xd9\x0a\x6f\x5a\xff\x01\xbc\xb1\xfb\x1c\xfd\x62\xd6\xea\xf8\xf2\x39\x9e\xe0\xe5\x6d\x9d\xfc\xad\xcd\x26\x73\x09\x77\xe1\xf1\xb1\x6b\x07\xe1\x0a\x91\x06\x08\x14\x7a\xf9\xbb\x1f\x63\x12\x20\xe7\xf8\xc9\x72\x10\x5f\xa3\x0f\x84\x4e\x07\x4d\x7c\x9d\x2c\x7f\xb1\xc4\x2a\x79\xa4\x01\x7f\xbe\x7a\xfb\x8f\x39\xdc\x95\x7c\x96\xb5\x86\x2a\xca\x18\xbc\xad\xea\xe8\xce\x79\x63\x45\x8e\xab\x6d\xd5\xb4\x49\x3e\x5a\x86\x63\x5e\x09\x3f\xfd\xcc\x4d\xed\xfb\x73\xa1\xca\x99\x78\x5d\xcf\x3d\xbd\x42\x3f\xbd\x42\x3f\xbd\x42\x3f\xbd\x42\xdf\x2b\xec\x3f\xea\x2b\xf4\xd3\x2b\xf2\xd3\x2b\xf2\xd3\x2b\xf2\xdd\xdd\xa7\x57\xe4\xa7\x57\xe4\xa7\x57\xe4\xeb\xdf\xe9\x15\xf9\xe9\x15\xf9\xe9\x15\xf9\xe9\x15\xf9\x96\x6f\xa7\x9a\xfe\x7f\xbf\xbf\x3c\x5d\x8e\xfd\x31\x2e\xc7\x4e\xd7\x5d\xa7\xeb\xae\xd3\x75\xd7\xe9\xba\xeb\x17\x9c\xf8\xd3\x75\xd7\xe9\xba\xeb\x74\xdd\x75\xba\xee\xfa\x27\xbd\xee\xca\x84\x72\x47\xdf\x77\xfd\x6f\x00\x00\x00\xff\xff\x43\xb0\x74\xb5\x37\x4b\x00\x00")
func operatorsCoreosCom_operatorgroupsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -205,7 +205,7 @@ func operatorsCoreosCom_operatorgroupsYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\xcd\x72\xe3\x36\x12\xbe\xfb\x29\xba\x94\x83\x93\x2a\xfd\x24\xb3\x97\x94\x6e\x2e\x7b\xb2\xe5\xdd\xac\x67\x6a\xec\x99\x4b\x2a\x87\x16\xd9\x12\xb1\x02\x01\x06\x0d\x4a\xd6\x4e\xcd\xbb\x6f\x35\x00\x4a\xa4\x24\x4b\xd4\xac\x27\x1b\x5c\x24\x82\x40\xa3\x7f\xbf\xee\x06\xb1\x52\x9f\xc8\xb1\xb2\x66\x0a\x58\x29\x7a\xf6\x64\xe4\x89\xc7\xcb\x9f\x79\xac\xec\x64\xf5\xd3\xd5\x52\x99\x7c\x0a\xb7\x35\x7b\x5b\x7e\x20\xb6\xb5\xcb\xe8\x8e\xe6\xca\x28\xaf\xac\xb9\x2a\xc9\x63\x8e\x1e\xa7\x57\x00\x68\x8c\xf5\x28\xd3\x2c\x8f\x00\x99\x35\xde\x59\xad\xc9\x8d\x16\x64\xc6\xcb\x7a\x46\xb3\x5a\xe9\x9c\x5c\x20\xde\x1c\xbd\xfa\x71\xfc\xf3\xf8\xc7\x2b\x80\xcc\x51\xd8\xfe\xa4\x4a\x62\x8f\x65\x35\x05\x53\x6b\x7d\x05\x60\xb0\xa4\x29\xd8\x8a\x1c\x7a\xeb\x78\xbc\xfb\x97\x59\x47\x56\x7e\xca\x2b\xae\x28\x93\x83\x17\xce\xd6\x55\x7b\x75\x6b\x4d\x24\xd5\xf0\x87\x9e\x16\xd6\xa9\xe6\x19\x60\x04\x56\x97\xe1\x7f\x94\xfb\x5d\xa2\x11\xa6\xb4\x62\xff\xcf\xce\xf4\xaf\x8a\x7d\x78\x55\xe9\xda\xa1\x6e\x9d\x19\x66\x59\x99\x45\xad\xd1\xed\xe6\xaf\x00\x38\xb3\x15\x4d\xe1\x56\xd7\xec\x49\x26\x92\x1e\x12\x0f\xa3\x24\xeb\xea\xa7\xc4\x12\x67\x05\x95\xd8\x30\x08\x42\xca\xdc\xbc\xbf\xff\xf4\xb7\xc7\xbd\x17\x00\x39\x71\xe6\x54\xe5\x83\x56\x1b\x1e\xc1\x51\xe5\x88\xc9\x78\x06\x84\x2c\x1e\xbb\x65\x68\xdc\xda\xee\x37\xc2\x98\x9d\xfd\x9b\x32\xdf\x9a\xae\x9c\x2c\xf6\x2d\x2d\xc5\xd1\xf2\x9e\xce\xfc\x1e\x1f\xd7\xc2\x6c\x5c\x07\xb9\x38\x0e\x31\xf8\x82\x1a\xb1\x29\x4f\x12\x82\x9d\x83\x2f\x14\xef\xf8\x0d\xbe\x20\xd3\x68\x12\x57\x63\x78\x24\x27\x1b\x81\x0b\x5b\xeb\x5c\x3c\x6c\x45\xce\x83\xa3\xcc\x2e\x8c\xfa\xcf\x96\x1a\x83\xb7\xe1\x18\x8d\x9e\xd8\x83\x32\x9e\x9c\x41\x0d\x2b\xd4\x35\x0d\x01\x4d\x0e\x25\x6e\xc0\x91\xd0\x85\xda\xb4\x28\x84\x25\x3c\x86\x7f\x59\x47\xa0\xcc\xdc\x4e\xa1\xf0\xbe\xe2\xe9\x64\xb2\x50\xbe\x89\x8d\xcc\x96\x65\x6d\x94\xdf\x4c\x82\x9b\xab\x59\x2d\x76\x9f\xe4\xb4\x22\x3d\x61\xb5\x18\xa1\xcb\x0a\xe5\x29\xf3\xb5\xa3\x09\x56\x6a\x14\x98\x35\x21\x3e\xc6\x65\xfe\x9d\x4b\xd1\xc4\xd7\x7b\xea\x8b\x76\x60\xef\x94\x59\x74\x5e\x05\x9f\x3c\xa9\x6b\x71\x4f\x50\x62\xe8\xb8\x3d\xca\xb2\x53\xa9\x4c\x89\x56\x3e\xbc\x7d\x7c\x82\x86\x81\xa8\xf6\xa8\xe1\x96\xb7\xec\x94\x2d\x8a\x52\x66\x4e\x2e\xae\x9c\x3b\x5b\x06\x2a\x64\xf2\xca\x2a\xe3\xc3\x43\xa6\x15\x19\x0f\x5c\xcf\x4a\xe5\xc5\x8a\x7f\xd4\xc4\x5e\xec\x30\x86\xdb\x00\x0d\x30\x23\xa8\xab\x1c\x3d\xe5\x63\xb8\x37\x70\x8b\x25\xe9\x5b\x64\xfa\xe6\xaa\x16\x8d\xf2\x48\xd4\xd7\x5f\xd9\x6d\x64\x3b\xdc\x70\x10\x25\x00\x0d\xfc\xbc\x68\x9d\x26\x22\x1f\x2b\xca\x3a\xa1\x90\x13\x2b\x27\xae\xeb\xd1\x93\x38\x7c\x07\x76\xfa\x1c\xed\xd1\xd7\xdc\xef\xf0\xb0\xb4\x73\xbc\x9d\xb1\x18\xba\x75\x3e\x9a\x1d\x7c\x48\xa4\x88\x41\x33\x5b\x56\xd6\x88\x63\xf4\xe5\xea\x65\xe8\x80\x90\x1c\x1a\x7a\x87\xef\xf6\x78\xbf\xdd\x2e\x4d\xf3\x33\xe2\xad\xf7\x8a\x0c\xe8\x23\x39\xa6\x28\xd0\x11\x70\xeb\xc1\xad\x0c\x71\x5b\xb1\xc5\x31\x9e\x04\x9c\x35\xce\x48\x3f\x92\xa6\xec\xd0\x3c\xe7\x24\x96\xd1\xd9\x7f\x7c\xc9\x9e\xf0\xbf\xb6\x77\xc4\xd8\x0e\x44\xe0\x8f\x9a\xdc\x06\xec\x8a\x9c\x84\x3b\x79\x31\xdc\x4e\x29\x35\x53\x2e\x18\xc8\x61\x67\x47\x2d\xd7\x27\x8c\xd9\x53\x4d\x7d\x44\x95\x51\xa2\xcf\x8a\xb7\xcf\x02\x29\xad\x1c\xd7\x43\xea\xfd\x8d\x49\x70\xc5\x41\xcc\xa8\x00\x6e\x94\x92\x8c\x56\x46\xd4\x7a\x2a\xa8\x33\x03\xe8\x08\x6e\x1e\xee\x28\x3f\xe6\x0f\x5d\x81\xd1\x39\xdc\x9c\x58\xa5\x3c\x95\x27\x85\xd8\x13\xe3\xe6\x04\xab\x09\xa7\x9b\x37\xc9\x8b\x8d\x47\x65\x38\xe5\xa0\x21\x20\x2c\x69\x13\xd3\x95\x64\xc1\x26\x28\xc3\x62\x47\x21\xb9\x05\xdb\x2e\x69\x13\x16\xa5\xdc\x75\x92\xc3\x1e\xb6\x8d\xe3\x74\x30\xec\xc6\x48\x8e\x3f\xbb\xc6\x1e\x07\xb5\xee\xe8\xe3\x54\x71\x2c\x69\x73\x6e\xc9\x9e\x31\x44\x47\x8a\x53\x55\x20\x56\x91\x89\xa0\x49\x99\xda\x1a\x02\xab\x4a\x2b\x0a\x89\xeb\x2c\xfd\x17\xb3\xc7\xe1\x68\xc4\xbf\x90\x69\x7b\xb4\x8c\x5b\xd2\xe6\x9a\xa3\x03\x48\x74\x14\xaa\x92\x58\xdf\xc2\x40\x53\xc1\x7c\x42\xad\xf2\x5d\x51\x1a\x22\xe1\xde\x0c\xe1\xc1\x7a\xf9\x79\xfb\xac\x24\x43\x8b\xdf\xdc\x59\xe2\x07\xeb\xc3\xcc\xab\x8a\x1d\x59\xb9\x50\xe8\xb8\x29\x04\x88\x89\x31\x29\x52\xb5\x4b\x1a\x1e\xc3\xfd\xbc\x83\x6a\xb2\xfa\xde\x80\x75\x8d\x74\xa1\xc8\x8c\x84\x22\x89\xb2\xe6\x50\x83\x18\x6b\x46\x54\x56\x7e\x73\x94\x46\x52\x8a\x75\x1d\x9d\x9c\x20\x97\x48\x3d\x49\x69\x14\xdf\xc4\x22\x56\x63\x46\x39\xe4\x75\x60\x3a\x14\x64\xd2\x6e\xa8\x0c\x4a\x72\x0b\x82\x4a\x10\xae\xaf\xaa\xcf\xe1\x52\x1c\x3d\xd0\xa9\x4d\xf4\x8c\xfd\x02\x04\x87\xec\x73\x21\x6c\xc7\x3d\x11\xde\x4a\xac\xc4\x74\x9f\x05\xc5\x82\xf6\xbe\x40\x85\xca\xf1\x18\x6e\x42\x7b\xa4\xa9\xf3\x4e\x99\xa0\xe7\x36\x19\xa1\xa0\x18\x04\x8a\x56\xa8\x05\x37\xc5\xd3\x0d\x90\x8e\x28\x6a\xe7\x07\xc9\x62\x08\xeb\x42\x6a\x01\x89\xef\xb9\x22\x1d\x4a\xe2\xc1\x92\x36\x83\xe1\x81\xb9\x07\xf7\x66\x10\xf1\xf5\xc0\xc0\x5b\x30\xb6\x46\x6f\x60\x10\xde\x0d\xfe\xb7\xfc\x72\x16\x74\x31\xcf\x43\x63\x8d\xfa\x7d\x4f\x24\x3c\x6b\x4b\x47\xf3\x17\x49\x74\x8c\xf7\x81\xe6\x51\x98\x56\x39\x31\x27\x47\x26\x14\x59\xf6\xc5\x1a\x62\x57\x75\x0c\x13\x8a\x52\x0e\x6b\xe5\x8b\x6e\xed\xf2\x92\x76\xce\x7b\xf8\x19\xbf\xee\x0a\xa1\xb2\xe2\x43\xc3\x76\xf4\xc1\xad\x14\x11\x23\x1b\x6e\x87\x40\xc6\xa9\xac\x68\x98\x95\x22\x37\x16\xd2\x62\xf9\x68\x86\x13\x99\xb4\x97\x41\xfb\xa5\xb3\x97\x3b\xe9\x13\x82\xde\xbc\xbf\x6f\x7a\xe8\xd8\x3a\x53\x23\xe8\x19\x00\xef\x09\xde\x3b\x1d\x5c\xc0\xd4\xed\x76\x53\x3b\x5f\xb5\xfa\xf0\x6d\x8b\x11\x5a\xc6\xc6\x83\xfa\x30\x7c\x1e\x02\x7b\xc1\xdf\x71\x76\x77\xdc\xb6\x99\xc5\x15\x2a\x8d\x33\xdd\xb4\x48\x31\xd9\xa6\x06\x69\xcb\xfc\x75\x74\x1b\x3a\x87\xe5\xbd\xcb\xae\xfe\x85\x97\x94\x55\xd1\x65\x7b\x2c\x94\xf3\xcf\x2c\xeb\x5f\x7d\x49\x27\xc3\xfe\xc9\xa1\x61\xd5\x5c\xd9\xf5\xc9\x3c\x7b\xad\x0d\x7b\xf0\xaa\xa4\xe4\x0d\x8d\x31\xfc\x96\x2c\xe5\xf1\xb6\xc1\x1a\x6a\x62\x33\xa0\xbf\xf5\x05\xbd\x08\x28\xed\x71\x41\xa5\x22\x63\x6e\x5d\x89\x7e\x0a\x39\x7a\x1a\x09\x67\xbd\xd4\xf0\x31\x5c\x6a\xbc\xaa\x0a\xd6\xc8\x62\x8d\x19\xe5\x7f\x05\x21\x4b\x62\xc6\xc5\xe5\xd2\xdd\x40\x51\x97\x28\xd1\x85\x79\x88\xa3\x44\x08\x94\xc9\x55\x86\xe1\x3a\x2a\x27\x8f\x4a\x33\xe0\xcc\xd6\x31\xfa\x76\xe6\x7f\x75\x0b\x3b\x42\x3e\x87\xb2\x47\xe4\x88\x29\x5f\xb6\x8a\xf2\xba\xa6\xba\xe6\xe0\x03\xdf\x92\xeb\xe3\xd7\x3b\x67\xb9\x4e\x57\x3d\x5b\xb0\x4d\x0c\x0f\x43\x34\xd9\x39\x3c\xb9\x9a\x86\xf0\x0b\x6a\xa6\x21\x7c\x34\x4b\x63\xd7\xaf\xcf\x7b\x58\x7c\xb1\xbe\x37\x55\xe0\x70\xcb\xf3\x2b\xb2\x15\x0a\xc2\xf7\xe8\x8b\x0b\xd2\xda\xf5\x7d\xaa\x85\x42\x2d\x1f\xaa\x88\x4a\x51\x46\x9d\xcb\x69\x50\x86\x3d\x61\x9e\x26\xc9\x78\xe5\x28\xbd\x1b\xc6\x9b\xd3\xd4\xc1\xec\x2e\xaf\xa5\xbe\x04\x94\xb2\x53\xe5\xf0\x8f\xc7\x77\x0f\x93\xbf\xdb\x54\xb2\x62\x96\x11\xa7\xd4\x22\x75\xe6\x10\xb8\xce\x0a\x40\x6e\xae\x0b\x1f\x43\xd2\x29\xd1\xa8\x39\xb1\x1f\x27\x6a\xe4\xf8\xb7\x37\xbf\x8f\xe1\x17\xeb\x80\x9e\xb1\xac\x34\x0d\x41\xa5\x36\xa7\xb9\xe2\x6d\x95\x47\x41\x98\xed\xde\x50\x09\x05\x96\x2a\x9b\x27\xa6\xd7\x81\x59\x8f\x4b\x02\x9b\x98\xad\x09\xb4\x5a\xd2\x14\x06\x5c\x51\xd6\x3a\xfa\xb3\xc1\x92\xbe\x0c\xe0\xfb\x75\x41\x8e\x60\x20\x8f\x83\x78\xe0\xb6\x84\x94\xb9\x96\x53\xa6\x83\x63\x1f\xee\xd4\x62\x41\x8e\x62\x31\x4e\x2b\x32\xfe\x07\xe9\xc4\xd4\x1c\x8c\x6d\x2d\x0e\x24\x44\x9f\x15\x65\x6a\xae\x28\x3f\x60\xe4\xb7\x37\xbf\x0f\xe0\xfb\xae\x5c\x82\x3a\xf4\x0c\x6f\x62\x97\xa1\x58\x64\xfc\x21\x35\x6e\xbc\x31\x1e\x9f\x85\x66\x26\xad\x83\x89\x35\xbf\xb7\x50\xe0\x8a\x80\x6d\x49\xb0\x26\xad\x47\xf1\xde\x34\x87\x75\x6c\x49\x1b\x55\xc6\x16\xaf\x42\xe7\xf7\xbe\x57\x3c\xbd\xbb\x7b\x37\x8d\xa7\x89\xd9\x16\x46\x8e\x30\xd6\xc3\x5c\x19\xd4\xa9\xef\x50\xbc\x6b\x53\xb8\x8e\x46\xf2\x16\xb2\x02\x4d\xc0\xca\xa0\x8d\x79\xed\x6b\x47\xe3\xfd\xfb\xeb\xaf\x8a\x81\x63\x1f\x12\x4e\xb9\x7f\xf8\xac\xb0\x5f\x64\xfe\x1f\x2f\xed\xbf\x4a\xe8\xf0\x5d\xed\x02\xa1\x1f\x5a\x7e\x7a\x52\xe8\x65\x3d\x23\x67\xc8\x53\x90\x3b\xb7\x19\x8b\xc8\x19\x55\x9e\x27\x76\x45\x6e\xa5\x68\x3d\x59\x5b\xb7\x54\x66\x31\x12\x47\x1c\x45\xef\xe0\x49\xf8\x16\x39\xf9\x2e\xfc\xbc\x9a\x8c\x5c\x61\x76\xb1\xa0\x61\xd3\x9f\x21\xad\x9c\xc3\x93\x57\x11\xb6\x69\xe4\x2e\xef\x9d\xae\x1f\x23\x70\x64\xfb\x34\x24\xec\xd6\x85\xca\x8a\xe6\x53\x64\x0b\x29\x4b\xcc\x23\x94\xa2\xd9\x7c\x73\xe7\x17\x95\xd6\x4e\xce\xde\x8c\xd2\x67\xf4\x11\x9a\x5c\xfe\xb3\x62\x2f\xf3\xaf\xa2\xc3\x5a\x5d\x04\x04\x1f\xef\xef\xfe\x9c\x90\xa8\xd5\x57\x44\x7d\xfc\x8c\x35\x05\xef\xea\xa6\xa6\x65\x6f\x9d\x54\xae\x9d\xb9\x7a\xb6\xbd\xb1\xd8\x09\x9f\x8a\x2c\xf8\xfc\xe5\xea\xbf\x01\x00\x00\xff\xff\x7e\x2b\xf8\xdd\x18\x21\x00\x00")
+var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x73\xe3\xb6\x11\x7f\xf7\xa7\xd8\x51\x1e\x9c\xcc\xe8\x4f\x72\x7d\x69\xf5\xe6\xb1\x2f\x1d\xb7\xa9\xef\xe6\xec\xbb\x97\x4c\x1e\x56\xe4\x4a\x44\x05\x02\x0c\x16\x94\xac\xde\xdc\x77\xef\x2c\x00\x4a\xa4\x24\x4b\xd4\xd5\x97\x06\x2f\x12\x41\x60\xb1\x7f\x7f\xbb\x0b\x62\xa5\x3e\x91\x63\x65\xcd\x14\xb0\x52\xf4\xec\xc9\xc8\x13\x8f\x97\x7f\xe5\xb1\xb2\x93\xd5\x4f\x57\x4b\x65\xf2\x29\xdc\xd6\xec\x6d\xf9\x81\xd8\xd6\x2e\xa3\x3b\x9a\x2b\xa3\xbc\xb2\xe6\xaa\x24\x8f\x39\x7a\x9c\x5e\x01\xa0\x31\xd6\xa3\x4c\xb3\x3c\x02\x64\xd6\x78\x67\xb5\x26\x37\x5a\x90\x19\x2f\xeb\x19\xcd\x6a\xa5\x73\x72\x81\x78\x73\xf4\xea\xc7\xf1\xdf\xc6\x3f\x5e\x01\x64\x8e\xc2\xf6\x27\x55\x12\x7b\x2c\xab\x29\x98\x5a\xeb\x2b\x00\x83\x25\x4d\xc1\x56\xe4\xd0\x5b\xc7\xe3\xdd\xbf\xcc\x3a\xb2\xf2\x53\x5e\x71\x45\x99\x1c\xbc\x70\xb6\xae\xda\xab\x5b\x6b\x22\xa9\x86\x3f\xf4\xb4\xb0\x4e\x35\xcf\x00\x23\xb0\xba\x0c\xff\xa3\xdc\xef\x12\x8d\x30\xa5\x15\xfb\x7f\x76\xa6\x7f\x51\xec\xc3\xab\x4a\xd7\x0e\x75\xeb\xcc\x30\xcb\xca\x2c\x6a\x8d\x6e\x37\x7f\x05\xc0\x99\xad\x68\x0a\xb7\xba\x66\x4f\x32\x91\xf4\x90\x78\x18\x25\x59\x57\x3f\x25\x96\x38\x2b\xa8\xc4\x86\x41\x10\x52\xe6\xe6\xfd\xfd\xa7\xbf\x3c\xee\xbd\x00\xc8\x89\x33\xa7\x2a\x1f\xb4\xda\xf0\x08\x8e\x2a\x47\x4c\xc6\x33\x20\x64\xf1\xd8\x2d\x43\xe3\xd6\x76\xbf\x11\xc6\xec\xec\xdf\x94\xf9\xd6\x74\xe5\x64\xb1\x6f\x69\x29\x8e\x96\xf7\x74\xe6\xf7\xf8\xb8\x16\x66\xe3\x3a\xc8\xc5\x71\x88\xc1\x17\xd4\x88\x4d\x79\x92\x10\xec\x1c\x7c\xa1\x78\xc7\x6f\xf0\x05\x99\x46\x93\xb8\x1a\xc3\x23\x39\xd9\x08\x5c\xd8\x5a\xe7\xe2\x61\x2b\x72\x1e\x1c\x65\x76\x61\xd4\x7f\xb6\xd4\x18\xbc\x0d\xc7\x68\xf4\xc4\x1e\x94\xf1\xe4\x0c\x6a\x58\xa1\xae\x69\x08\x68\x72\x28\x71\x03\x8e\x84\x2e\xd4\xa6\x45\x21\x2c\xe1\x31\xfc\xcb\x3a\x02\x65\xe6\x76\x0a\x85\xf7\x15\x4f\x27\x93\x85\xf2\x4d\x6c\x64\xb6\x2c\x6b\xa3\xfc\x66\x12\xdc\x5c\xcd\x6a\xb1\xfb\x24\xa7\x15\xe9\x09\xab\xc5\x08\x5d\x56\x28\x4f\x99\xaf\x1d\x4d\xb0\x52\xa3\xc0\xac\x09\xf1\x31\x2e\xf3\xef\x5c\x8a\x26\xbe\xde\x53\x5f\xb4\x03\x7b\xa7\xcc\xa2\xf3\x2a\xf8\xe4\x49\x5d\x8b\x7b\x82\x12\x43\xc7\xed\x51\x96\x9d\x4a\x65\x4a\xb4\xf2\xe1\xed\xe3\x13\x34\x0c\x44\xb5\x47\x0d\xb7\xbc\x65\xa7\x6c\x51\x94\x32\x73\x72\x71\xe5\xdc\xd9\x32\x50\x21\x93\x57\x56\x19\x1f\x1e\x32\xad\xc8\x78\xe0\x7a\x56\x2a\x2f\x56\xfc\xbd\x26\xf6\x62\x87\x31\xdc\x06\x68\x80\x19\x41\x5d\xe5\xe8\x29\x1f\xc3\xbd\x81\x5b\x2c\x49\xdf\x22\xd3\x37\x57\xb5\x68\x94\x47\xa2\xbe\xfe\xca\x6e\x23\xdb\xe1\x86\x83\x28\x01\x68\xe0\xe7\x45\xeb\x34\x11\xf9\x58\x51\xd6\x09\x85\x9c\x58\x39\x71\x5d\x8f\x9e\xc4\xe1\x3b\xb0\xd3\xe7\x68\x8f\xbe\xe6\x7e\x87\x87\xa5\x9d\xe3\xed\x8c\xc5\xd0\xad\xf3\xd1\xec\xe0\x43\x22\x45\x0c\x9a\xd9\xb2\xb2\x46\x1c\xa3\x2f\x57\x2f\x43\x07\x84\xe4\xd0\xd0\x3b\x7c\xb7\xc7\xfb\xed\x76\x69\x9a\x9f\x11\x6f\xbd\x57\x64\x40\x1f\xc9\x31\x45\x81\x8e\x80\x5b\x0f\x6e\x65\x88\xdb\x8a\x2d\x8e\xf1\x24\xe0\xac\x71\x46\xfa\x91\x34\x65\x87\xe6\x39\x27\xb1\x8c\xce\xfe\xe3\x4b\xf6\x84\xff\xa5\xbd\x23\xc6\x76\x20\x02\xbf\xd7\xe4\x36\x60\x57\xe4\x24\xdc\xc9\x8b\xe1\x76\x4a\xa9\x99\x72\xc1\x40\x0e\x3b\x3b\x6a\xb9\x3e\x61\xcc\x9e\x6a\xea\x23\xaa\x8c\x12\x7d\x56\xbc\x7d\x16\x48\x69\xe5\xb8\x1e\x52\xef\x6f\x4c\x82\x2b\x0e\x62\x46\x05\x70\xa3\x94\x64\xb4\x32\xa2\xd6\x53\x41\x9d\x19\x40\x47\x70\xf3\x70\x47\xf9\x31\x7f\xe8\x0a\x8c\xce\xe1\xe6\xc4\x2a\xe5\xa9\x3c\x29\xc4\x9e\x18\x37\x27\x58\x4d\x38\xdd\xbc\x49\x5e\x6c\x3c\x2a\xc3\x29\x07\x0d\x01\x61\x49\x9b\x98\xae\x24\x0b\x36\x41\x19\x16\x3b\x0a\xc9\x2d\xd8\x76\x49\x9b\xb0\x28\xe5\xae\x93\x1c\xf6\xb0\x6d\x1c\xa7\x83\x61\x37\x46\x72\xfc\xd9\x35\xf6\x38\xa8\x75\x47\x1f\xa7\x8a\x63\x49\x9b\x73\x4b\xf6\x8c\x21\x3a\x52\x9c\xaa\x02\xb1\x8a\x4c\x04\x4d\xca\xd4\xd6\x10\x58\x55\x5a\x51\x48\x5c\x67\xe9\xbf\x98\x3d\x0e\x47\x23\xfe\x85\x4c\xdb\xa3\x65\xdc\x92\x36\xd7\x1c\x1d\x40\xa2\xa3\x50\x95\xc4\xfa\x16\x06\x9a\x0a\xe6\x13\x6a\x95\xef\x8a\xd2\x10\x09\xf7\x66\x08\x0f\xd6\xcb\xcf\xdb\x67\x25\x19\x5a\xfc\xe6\xce\x12\x3f\x58\x1f\x66\x5e\x55\xec\xc8\xca\x85\x42\xc7\x4d\x21\x40\x4c\x8c\x49\x91\xaa\x5d\xd2\xf0\x18\xee\xe7\x1d\x54\x93\xd5\xf7\x06\xac\x6b\xa4\x0b\x45\x66\x24\x14\x49\x94\x35\x87\x1a\xc4\x58\x33\xa2\xb2\xf2\x9b\xa3\x34\x92\x52\xac\xeb\xe8\xe4\x04\xb9\x44\xea\x49\x4a\xa3\xf8\x26\x16\xb1\x1a\x33\xca\x21\xaf\x03\xd3\xa1\x20\x93\x76\x43\x65\x50\x92\x5b\x10\x54\x82\x70\x7d\x55\x7d\x0e\x97\xe2\xe8\x81\x4e\x6d\xa2\x67\xec\x17\x20\x38\x64\x9f\x0b\x61\x3b\xee\x89\xf0\x56\x62\x25\xa6\xfb\x2c\x28\x16\xb4\xf7\x05\x2a\x54\x8e\xc7\x70\x13\xda\x23\x4d\x9d\x77\xca\x04\x3d\xb7\xc9\x08\x05\xc5\x20\x50\xb4\x42\x2d\xb8\x29\x9e\x6e\x80\x74\x44\x51\x3b\x3f\x48\x16\x43\x58\x17\x52\x0b\x48\x7c\xcf\x15\xe9\x50\x12\x0f\x96\xb4\x19\x0c\x0f\xcc\x3d\xb8\x37\x83\x88\xaf\x07\x06\xde\x82\xb1\x35\x7a\x03\x83\xf0\x6e\xf0\xbf\xe5\x97\xb3\xa0\x8b\x79\x1e\x1a\x6b\xd4\xef\x7b\x22\xe1\x59\x5b\x3a\x9a\xbf\x48\xa2\x63\xbc\x0f\x34\x8f\xc2\xb4\xca\x89\x39\x39\x32\xa1\xc8\xb2\x2f\xd6\x10\xbb\xaa\x63\x98\x50\x94\x72\x58\x2b\x5f\x74\x6b\x97\x97\xb4\x73\xde\xc3\xcf\xf8\x75\x57\x08\x95\x15\x1f\x1a\xb6\xa3\x0f\x6e\xa5\x88\x18\xd9\x70\x3b\x04\x32\x4e\x65\x45\xc3\xac\x14\xb9\xb1\x90\x16\xcb\x47\x33\x9c\xc8\xa4\xbd\x0c\xda\x2f\x9d\xbd\xdc\x49\x9f\x10\xf4\xe6\xfd\x7d\xd3\x43\xc7\xd6\x99\x1a\x41\xcf\x00\x78\x4f\xf0\xde\xe9\xe0\x02\xa6\x6e\xb7\x9b\xda\xf9\xaa\xd5\x87\x6f\x5b\x8c\xd0\x32\x36\x1e\xd4\x87\xe1\xf3\x10\xd8\x0b\xfe\x8e\xb3\xbb\xe3\xb6\xcd\x2c\xae\x50\x69\x9c\xe9\xa6\x45\x8a\xc9\x36\x35\x48\x5b\xe6\xaf\xa3\xdb\xd0\x39\x2c\xef\x5d\x76\xf5\x2f\xbc\xa4\xac\x8a\x2e\xdb\x63\xa1\x9c\x7f\x66\x59\xff\xea\x4b\x3a\x19\xf6\x4f\x0e\x0d\xab\xe6\xca\xae\x4f\xe6\xd9\x6b\x6d\xd8\x83\x57\x25\x25\x6f\x68\x8c\xe1\xb7\x64\x29\x8f\xb7\x0d\xd6\x50\x13\x9b\x01\xfd\xad\x2f\xe8\x45\x40\x69\x8f\x0b\x2a\x15\x19\x73\xeb\x4a\xf4\x53\xc8\xd1\xd3\x48\x38\xeb\xa5\x86\x8f\xe1\x52\xe3\x55\x55\xb0\x46\x16\x6b\xcc\x28\xff\x33\x08\x59\x12\x33\x2e\x2e\x97\xee\x06\x8a\xba\x44\x89\x2e\xcc\x43\x1c\x25\x42\xa0\x4c\xae\x32\x0c\xd7\x51\x39\x79\x54\x9a\x01\x67\xb6\x8e\xd1\xb7\x33\xff\xab\x5b\xd8\x11\xf2\x39\x94\x3d\x22\x47\x4c\xf9\xb2\x55\x94\xd7\x35\xd5\x35\x07\x1f\xf8\x96\x5c\x1f\xbf\xde\x39\xcb\x75\xba\xea\xd9\x82\x6d\x62\x78\x18\xa2\xc9\xce\xe1\xc9\xd5\x34\x84\x9f\x51\x33\x0d\xe1\xa3\x59\x1a\xbb\x7e\x7d\xde\xc3\xe2\x8b\xf5\xbd\xa9\x02\x87\x5b\x9e\x5f\x91\xad\x50\x10\xbe\x47\x5f\x5c\x90\xd6\xae\xef\x53\x2d\x14\x6a\xf9\x50\x45\x54\x8a\x32\xea\x5c\x4e\x83\x32\xec\x09\xf3\x34\x49\xc6\x2b\x47\xe9\xdd\x30\xde\x9c\xa6\x0e\x66\x77\x79\x2d\xf5\x25\xa0\x94\x9d\x2a\x87\x7f\x3c\xbe\x7b\x98\xfc\xdd\xa6\x92\x15\xb3\x8c\x38\xa5\x16\xa9\x33\x87\xc0\x75\x56\x00\x72\x73\x5d\xf8\x18\x92\x4e\x89\x46\xcd\x89\xfd\x38\x51\x23\xc7\xbf\xbe\xf9\x6d\x0c\x3f\x5b\x07\xf4\x8c\x65\xa5\x69\x08\x2a\xb5\x39\xcd\x15\x6f\xab\x3c\x0a\xc2\x6c\xf7\x86\x4a\x28\xb0\x54\xd9\x3c\x31\xbd\x0e\xcc\x7a\x5c\x12\xd8\xc4\x6c\x4d\xa0\xd5\x92\xa6\x30\xe0\x8a\xb2\xd6\xd1\x9f\x0d\x96\xf4\x65\x00\xdf\xaf\x0b\x72\x04\x03\x79\x1c\xc4\x03\xb7\x25\xa4\xcc\xb5\x9c\x32\x1d\x1c\xfb\x70\xa7\x16\x0b\x72\x14\x8b\x71\x5a\x91\xf1\x3f\x48\x27\xa6\xe6\x60\x6c\x6b\x71\x20\x21\xfa\xac\x28\x53\x73\x45\xf9\x01\x23\xbf\xbe\xf9\x6d\x00\xdf\x77\xe5\x12\xd4\xa1\x67\x78\x13\xbb\x0c\xc5\x22\xe3\x0f\xa9\x71\xe3\x8d\xf1\xf8\x2c\x34\x33\x69\x1d\x4c\xac\xf9\xbd\x85\x02\x57\x04\x6c\x4b\x82\x35\x69\x3d\x8a\xf7\xa6\x39\xac\x63\x4b\xda\xa8\x32\xb6\x78\x15\x3a\xbf\xf7\xbd\xe2\xe9\xdd\xdd\xbb\x69\x3c\x4d\xcc\xb6\x30\x72\x84\xb1\x1e\xe6\xca\xa0\x4e\x7d\x87\xe2\x5d\x9b\xc2\x75\x34\x92\xb7\x90\x15\x68\x02\x56\x06\x6d\xcc\x6b\x5f\x3b\x1a\xef\xdf\x5f\x7f\x55\x0c\x1c\xfb\x90\x70\xca\xfd\xc3\x67\x85\xfd\x22\xf3\xff\x78\x69\xff\x55\x42\x87\xef\x6a\x17\x08\xfd\xd0\xf2\xd3\x93\x42\x2f\xeb\x19\x39\x43\x9e\x82\xdc\xb9\xcd\x58\x44\xce\xa8\xf2\x3c\xb1\x2b\x72\x2b\x45\xeb\xc9\xda\xba\xa5\x32\x8b\x91\x38\xe2\x28\x7a\x07\x4f\xc2\xb7\xc8\xc9\x77\xe1\xe7\xd5\x64\xe4\x0a\xb3\x8b\x05\x0d\x9b\xfe\x08\x69\xe5\x1c\x9e\xbc\x8a\xb0\x4d\x23\x77\x79\xef\x74\xfd\x18\x81\x23\xdb\xa7\x21\x61\xb7\x2e\x54\x56\x34\x9f\x22\x5b\x48\x59\x62\x1e\xa1\x14\xcd\xe6\x9b\x3b\xbf\xa8\xb4\x76\x72\xf6\x66\x94\x3e\xa3\x8f\xd0\xe4\xf2\x9f\x15\x7b\x99\x7f\x15\x1d\xd6\xea\x22\x20\xf8\x78\x7f\xf7\xc7\x84\x44\xad\xbe\x22\xea\xe3\x67\xac\x29\x78\x57\x37\x35\x2d\x7b\xeb\xa4\x72\xed\xcc\xd5\xb3\xed\x8d\xc5\x4e\xf8\x54\x64\xc1\xe7\x2f\x57\xff\x0d\x00\x00\xff\xff\x08\x9c\x4f\xa3\x18\x21\x00\x00")
func operatorsCoreosCom_operatorsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -225,7 +225,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) {
return a, nil
}
-var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe3\xb8\x95\x38\xfa\xff\x7c\x0a\x94\x93\x2a\xdb\x59\x49\xee\xce\xe6\x97\xe4\xf6\xa6\xb2\xe5\xb1\xdd\x13\xff\xa6\xbb\xc7\xdb\x76\xcf\xd4\xde\x6c\xee\x06\x22\x21\x09\x31\x09\x70\x00\x50\x6e\xe5\xf1\xdd\x6f\xe1\x1c\x00\x04\xa9\x17\x29\xc9\x8f\x9e\x21\xff\x98\x69\x53\x00\x08\x1c\x1c\x9c\x17\xce\x83\x16\xfc\x7b\xa6\x34\x97\xe2\x0d\xa1\x05\x67\x9f\x0d\x13\xf6\x2f\x3d\xba\xff\xbd\x1e\x71\x79\x36\x7f\xfd\xd5\x3d\x17\xe9\x1b\x72\x51\x6a\x23\xf3\x8f\x4c\xcb\x52\x25\xec\x92\x4d\xb8\xe0\x86\x4b\xf1\x55\xce\x0c\x4d\xa9\xa1\x6f\xbe\x22\x84\x0a\x21\x0d\xb5\xaf\xb5\xfd\x93\x90\x44\x0a\xa3\x64\x96\x31\x35\x9c\x32\x31\xba\x2f\xc7\x6c\x5c\xf2\x2c\x65\x0a\x06\xf7\x9f\x9e\xbf\x1a\xfd\x7e\xf4\xea\x2b\x42\x12\xc5\xa0\xfb\x1d\xcf\x99\x36\x34\x2f\xde\x10\x51\x66\xd9\x57\x84\x08\x9a\xb3\x37\x44\x97\x63\x9d\x28\x5e\xc0\x27\x46\xb2\x60\x8a\x1a\xa9\xf4\x28\x91\x8a\x49\xfb\xbf\xfc\x2b\x5d\xb0\xc4\x7e\x7c\xaa\x64\x59\xbc\x21\x2b\xdb\xe0\x70\x7e\x8e\xd4\xb0\xa9\x54\xdc\xff\x4d\xc8\x90\xc8\x2c\x87\x7f\xe3\xda\x6f\xa3\xaf\xc2\xeb\x8c\x6b\xf3\xed\xd2\x4f\xef\xb8\x36\xf0\x73\x91\x95\x8a\x66\x8d\xd9\xc2\x2f\x7a\x26\x95\xf9\x50\x7d\xdb\x7e\x4b\x97\xe3\xf8\xdf\xae\x21\x17\xd3\x32\xa3\xaa\x3e\xc8\x57\x84\xe8\x44\x16\xec\x0d\x81\x31\x0a\x9a\xb0\xf4\x2b\x42\x1c\x1c\xdd\x98\x43\x42\xd3\x14\xf6\x86\x66\x37\x8a\x0b\xc3\xd4\x85\xcc\xca\x5c\x84\x6f\xda\x36\x29\x0b\xa3\xbe\x21\x77\x33\x46\x0a\x9a\xdc\xd3\x29\xf3\xdf\x1b\xb3\x94\x18\x19\x3a\x10\xf2\x37\x2d\xc5\x0d\x35\xb3\x37\x64\x64\x41\x3c\xb2\x10\x8c\x7e\xc6\xfd\xb9\xc1\x41\xa2\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x09\x35\x34\x93\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\x4b\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\xe9\xb6\xf9\xba\xf5\x94\x66\x54\x08\x96\x11\x39\x21\x65\x91\x52\xc3\x34\x31\xb2\x82\xcf\x66\xf0\xb8\xce\x4b\xb3\xb9\x58\x7a\xbf\x62\x3a\xd8\x74\xfe\x9a\x66\xc5\x8c\xbe\x76\x2f\x75\x32\x63\x39\xad\xf6\x50\x16\x4c\x9c\xdf\x5c\x7f\xff\xef\xb7\x8d\x1f\x48\x7d\x29\x31\x8a\x92\x7b\xc6\x0a\x5d\x1d\x0a\x52\x16\x76\x4d\x76\x71\x64\xbc\x20\x46\xd1\xe4\x9e\x8b\x29\x2c\x7d\x8a\xeb\xbd\xc0\x8d\xd1\xa3\xa5\x29\xcb\xf1\xdf\x58\x62\xa2\xd7\x8a\xfd\x58\x72\xc5\xd2\x78\x2a\x16\xb2\x9e\x44\x34\x5e\x5b\x38\x45\xaf\x0a\x65\xa7\x65\xa2\x73\x88\x4f\x44\xa3\x6a\xef\x1b\xcb\x3c\xb6\xb0\xc0\x76\x24\xb5\xe4\xc9\x4e\x7f\xc6\xfc\xe1\x60\xa9\x03\xa0\xdd\x4e\x33\xe3\x9a\x28\x56\x28\xa6\x99\x40\x82\x65\x5f\x53\xe1\xd6\x34\x22\xb7\x4c\xd9\x8e\xf6\xc0\x96\x59\x6a\xe9\xd8\x9c\x29\x43\x14\x4b\xe4\x54\xf0\xbf\x87\xd1\x00\x44\xf6\x33\x99\xc5\x0f\x43\xe0\xb8\x09\x9a\x91\x39\xcd\x4a\x36\x20\x54\xa4\x24\xa7\x0b\xa2\x98\x1d\x97\x94\x22\x1a\x01\x9a\xe8\x11\x79\x2f\x15\x23\x5c\x4c\xe4\x1b\x32\x33\xa6\xd0\x6f\xce\xce\xa6\xdc\x78\x0a\x9c\xc8\x3c\x2f\x05\x37\x8b\x33\x20\xa6\x7c\x5c\xda\x8d\x3b\x4b\xd9\x9c\x65\x67\x9a\x4f\x87\x54\x25\x33\x6e\x58\x62\x4a\xc5\xce\x68\xc1\x87\x30\x59\x81\x24\x32\x4f\x7f\xa1\x1c\xcd\xd6\xc7\x0d\xf0\xad\x3c\x07\xc4\x53\xbd\x8d\xb0\xb6\xc4\x8f\x70\x4d\xa8\xeb\x8e\x6b\xa9\x40\x6a\x5f\x59\xa8\x7c\xbc\xba\xbd\x23\x7e\x02\x08\x76\x84\x70\xd5\x54\x57\xc0\xb6\x80\xe2\x62\xc2\x14\xb6\x9c\x28\x99\xc3\x28\x4c\xa4\x85\xe4\xc2\xc0\x1f\x49\xc6\x99\x30\xf6\x18\xe6\xdc\x68\xc0\x39\xa6\x8d\xdd\x87\x11\xb9\x00\x06\x44\xc6\xcc\x1d\xd8\x74\x44\xae\x05\xb9\xa0\x39\xcb\x2e\xa8\x66\x8f\x0e\x6a\x0b\x51\x3d\xb4\xe0\x6b\x0f\xec\x98\x7f\x2e\x77\x58\x3a\x63\x84\x78\x06\xb7\x76\x77\xe2\x03\x7f\x5b\xb0\x24\x1c\x07\x2a\xc8\x79\x51\x64\x3c\x41\x8c\x37\x33\x6a\x48\x42\x85\x85\x17\x17\xda\xd0\x2c\x03\x76\xd2\x6a\x16\xeb\x4e\x3b\x81\xa3\xdd\x60\x0e\xfe\xf5\x12\x85\xae\xff\x10\x98\x5a\xa3\xc5\x3a\xca\x60\x1f\x47\x67\x97\x7f\xd8\x00\x72\x82\x92\xc9\x84\x4f\x57\x75\x5b\x0b\xcb\x0b\xe8\x02\x32\x0d\xe5\x42\xbb\x21\x4a\x85\xd0\xac\x38\x95\xe5\x5d\xb4\xc6\xb7\x47\x6b\x67\xb7\x12\xb2\xdb\xd6\x6c\x1f\x3a\x01\x09\x6c\xb1\xfa\xd7\xc6\x2a\xae\x27\xd5\xf4\x06\x44\xce\x99\x52\x3c\x75\xf4\xb1\x90\xe9\xb1\x06\x6a\x96\x96\x19\xd0\x7e\x29\xb4\x51\x94\xc3\xd1\x14\x3c\xb3\x2b\x19\x52\x83\xe7\x81\x69\xf2\xc0\xb3\x8c\xfc\x4a\x48\xf3\xab\x30\x12\x0c\x24\x15\x9f\xf2\x40\xfa\x34\xe1\xc2\x8f\x0f\x1c\xd1\xb1\x74\xa9\x59\x63\xc0\x11\xf9\xa4\x19\x61\x79\x61\x16\x9e\x38\x9c\xfc\xe3\x5f\xa7\x96\xb0\x32\x45\x75\x34\x70\xad\x9f\x27\x9f\x6b\xd6\xbf\x05\xbc\x6d\x40\x6c\x1f\x21\x53\x76\xbe\x05\xd4\x4b\xe0\xbe\x64\x28\x21\x68\xe8\x1e\xb6\x2a\x06\xb2\x2a\x33\xa6\x83\x94\x63\x61\xb4\x61\xf0\x16\x6b\x69\xbb\x1e\x6c\xc7\x26\x4c\x29\x96\x5e\x96\xf6\x68\xdc\x86\x59\x5d\x4f\x85\x0c\xaf\xaf\x3e\xb3\xa4\x34\x2b\xb8\xee\xc6\xa5\x5b\xb9\xc9\x2d\x93\x29\x44\x15\xfc\x1c\x88\x4e\xee\x07\xbb\x5e\x60\x9c\x16\x3c\x1a\xe9\x90\xa6\x86\xeb\xc9\x02\xc0\x11\x00\xc6\x3e\x5b\x26\x01\xb2\x6d\x74\xbe\xac\xa0\x02\xfc\x81\xb3\x2c\x1d\x90\x71\x69\x08\x37\xc0\x3c\x92\x99\xb4\xf8\x45\x11\xee\x30\xee\x9c\x4b\x60\xcd\x44\x0a\x8b\x49\x24\xb7\x1c\x00\x44\x00\x16\x0f\x3f\x82\x99\x57\xdd\xb8\x26\xb9\xd4\xa6\x82\x95\x7d\x03\x58\x2e\x18\x79\xe0\x66\x06\x7f\x4c\xad\xba\x62\xd9\xbe\x2e\x73\x3b\xe8\x03\xe3\xd3\x99\xd1\x03\xc2\x47\x6c\x04\xbb\xcb\x68\x32\x8b\x86\xcd\x19\x33\x9a\xd0\x2c\xf3\x53\x88\x51\x02\xe9\x69\x6e\x79\x22\x39\x09\x4c\xd3\x31\xb8\x41\xa0\xb7\xcd\x5d\x5b\x09\xae\x01\x61\x26\x19\x9d\x0e\x48\x22\xf3\xc2\x9e\x16\x0a\x73\x1c\x2f\x08\x37\x56\xf6\x43\x06\xad\x64\x39\xc5\x95\xb0\xcc\x7d\xd8\x4b\x47\x00\x5c\x10\x5f\xac\x36\x21\xa6\xe4\x08\x17\x77\xe4\x05\x1e\x3b\x1c\xc7\x45\xc0\xfa\x72\x6a\x92\x99\xa3\x29\x89\x54\x8a\xe9\x42\x0a\xe8\x09\xbf\x5c\x55\x73\xfb\x8f\xd0\xe9\x44\x9f\x56\xc0\x9c\xf1\xe9\xcc\xc3\x92\x2a\xa4\x29\xf5\x3d\xd8\x74\x46\xaa\x73\x42\x95\xa2\x8b\x2d\x2d\xb9\x61\xf9\x96\x53\xb2\x84\xda\xe7\xc2\x11\xa9\x0a\x27\xa2\xdd\x33\x4c\xe5\x01\x06\xb0\xc1\x70\x5c\x35\xae\x8f\xe7\x96\xed\x72\xe3\x30\x84\xbc\x22\x27\x80\x22\xdc\x1c\x6b\x40\xd7\xa1\x2c\x4e\x47\xe4\x1c\xb4\xdd\x16\x1f\x10\x32\x8c\xef\x06\xb2\x1f\xd5\xb2\x1a\x6b\xeb\xda\x5a\x12\x15\x7c\xd6\xf3\xfa\xe5\x67\xe8\xe6\xcf\xc4\x0a\x56\xbf\xaa\x39\xc2\x64\x6b\xd3\xb6\xe4\xcd\xb7\xf6\x73\x68\xd3\xba\xb9\xd5\x88\xd2\x9a\x65\x2c\x31\x96\x46\x33\x95\x0f\x08\xd5\x5a\x26\xdc\x8a\x95\x15\xd2\xd6\x31\x1d\x57\xb2\x1d\xf6\xa4\x2b\xfc\x49\xe7\xf5\xdb\xa7\x79\xf0\xda\xf6\x5b\x82\x46\xc6\xb5\xb1\x94\xa1\x0e\x95\x1a\xc1\x1a\x2f\xe0\xd7\x63\x4d\x32\x3a\x66\xd9\x5a\xbe\xbc\xfc\xb4\x3f\xb5\xd5\xd3\xf2\xfc\xae\x5d\xd0\xda\x85\x38\xa5\x26\x6c\x3c\x88\xc8\x5e\xe0\x43\x89\x63\x40\x28\xb9\x67\x0b\xd4\xed\xac\xca\xe8\x94\x69\x6c\xac\x18\xb2\x1b\x8b\x1c\xf7\x6c\x01\x8d\x36\x4b\x2a\xeb\x61\xd2\x01\x39\xf0\xe9\x72\x4c\xab\x67\x68\x27\xda\xb1\x87\x5f\x74\x87\x6e\xdd\xf1\x17\x9f\x7b\xb6\x51\xf2\x5a\xf5\x2c\x89\x24\x80\x93\xb0\x1f\xb0\x49\xc0\xbf\xfc\x1e\x53\xab\x12\x81\xad\xa3\xcb\x0e\x91\x6d\x0a\xc6\xa6\xc7\x43\x6f\xaf\x75\x7d\x0c\x1a\x34\x22\xe4\xb1\x46\xe4\xb3\x27\x7d\xc6\xc1\xae\x63\x31\x19\x0e\xae\x37\x35\x7c\x4f\x33\x9e\x46\xe6\x1f\xcb\x67\xaf\xc5\x80\x7c\x90\xc6\xfe\xef\xea\x33\xd7\x56\x7c\xb9\x94\x4c\x7f\x90\x06\xfe\x1c\x91\x6f\x0c\xe2\xfa\xbb\x96\x94\xed\x00\x00\xc2\xf9\xee\x05\x9e\x73\x81\x34\xc5\x2e\x3f\x36\x52\xe8\x91\x55\x87\x40\x94\xf3\x07\x97\x6b\x72\x2d\xac\x70\xe8\xc0\x00\x66\x23\x54\x62\x70\x88\xbc\xd4\x60\x55\x10\x52\x0c\x41\x06\x58\x39\x06\x42\xcf\x8e\x13\xc3\x6f\xc3\x70\xeb\x87\xfa\xc6\xd8\x61\xde\xad\xed\x3c\xa3\x73\x10\xe9\xb8\x98\x66\x41\x78\x1b\x90\x87\x19\x4f\x66\x28\x75\x83\x4e\x6f\x98\x2a\x14\xb3\x0c\x8b\x82\xf6\x6f\xdf\x4c\x99\xb2\xc2\x2e\xf7\xe3\xa1\x25\x2c\xa3\x09\x4b\x49\x0a\xa2\x25\x5a\x75\xa8\x61\x53\x9e\x90\x9c\xa9\x29\x23\x85\xe5\x24\xbb\xed\x7e\x37\xc2\x8e\x4f\x67\xf2\x1e\x7f\xb0\x13\xba\x01\x8b\x7c\x6b\x65\xdd\x27\xe2\x8e\x20\x57\xf7\xdc\xb1\xe7\x8e\x8d\xa7\xe7\x8e\xe1\xe9\xb9\xe3\x96\xa7\xe7\x8e\x3d\x77\x7c\x74\xee\x88\xba\xec\x0e\xca\xf3\x0f\x68\xe2\x68\x6a\xcb\xc0\x69\xfd\xbd\x50\x5d\x6d\xb6\xfc\xe6\xd6\x11\x9c\x3b\x50\xb5\x9d\xed\x58\x51\x31\x65\xe4\xf5\xf0\xf5\xab\x57\x5d\x94\x6a\xb7\x91\xad\x7a\x4c\xa4\xca\xa9\x81\x3e\xff\xfe\xeb\x8d\x3d\xd6\xd9\xdf\x0e\x60\x35\x75\x38\x1e\x0c\x79\x35\xd9\x61\x8d\xe1\x13\xa8\x93\x90\x86\xe4\xcc\x10\x6a\x6a\xa6\x22\x9e\xb3\x81\x37\x2c\x23\xc2\xbb\x6b\x31\x6f\x81\x4d\x89\x14\xce\x8e\x67\x81\x3f\xda\x6d\x06\x09\xa3\x9a\x59\x4a\x3a\x66\x61\x16\x32\xb7\x5f\xe5\xc2\xf8\xe3\x62\xa7\xc0\x3c\x54\xc8\x09\x1b\x4d\x47\x24\x2d\xa1\x1b\x15\xee\x9e\xee\x14\x67\xab\x17\xda\xb0\x1c\x2c\xb9\x52\xc1\xff\xec\xb4\x8d\x5a\xc0\x5d\xc0\x9c\x09\x53\xd2\x2c\x5b\x10\x36\xe7\x89\x09\xeb\x83\x6b\x42\x6e\xd0\xd8\xde\xce\x44\xd8\x4a\x74\x68\x2f\x2e\x0c\x97\x30\x58\x6f\xe9\xd3\x85\xdb\x2f\x8d\xdd\xe6\x4c\x36\x78\x21\xae\x64\xb4\x56\x58\x35\x76\x5c\xb4\x81\xc3\x3f\x01\xb9\xbe\xfb\xb8\xdd\xe4\x4a\x3a\x53\xb2\x0e\xd4\xab\x29\x96\x96\x59\x66\x11\x03\xad\xb0\xcb\x0b\x58\x61\x1d\xc5\x25\xd5\x90\x19\x0d\xef\x68\x62\x3e\xff\x70\x69\xa1\x62\xdb\xdc\xc9\x42\x66\x72\xba\x88\x21\x0d\x2b\x03\xdb\xad\xeb\x8b\xb7\x7a\x28\x34\x58\xf4\xfb\xd0\xd8\x9a\xde\xf2\xd7\x5b\xfe\x7a\xdd\x66\xe9\xe9\x75\x9b\xf0\xf4\xba\xcd\x96\xa7\xd7\x6d\x7a\xdd\xa6\xb7\xfc\x91\x9e\x3b\x6e\x80\x49\xcf\x1d\x49\xcf\x1d\xd7\xae\xab\xe7\x8e\x1b\xc1\xd3\x73\xc7\x9e\x3b\xae\x7a\x0a\x99\xee\xe1\xe8\x58\xc8\x74\x83\x9f\x23\x5a\x7d\x12\x39\xcc\x64\x42\x8d\x73\x04\xb7\x5d\x9c\x9d\x4f\xd3\x1c\x0d\x51\x03\xf2\x77\x29\x18\x3a\xaf\xd9\xbd\x01\x73\x92\x34\x33\xa6\x6c\xf3\x13\x7d\xba\xd1\xb1\xa9\xf7\x93\xec\xfd\x24\x5f\xbc\x9f\xe4\x8c\x6a\xdc\x57\x24\x4a\xeb\xdd\x26\xa3\x03\x79\xc7\x54\xfe\x85\x7a\x4d\x5a\x74\x71\xdb\x0d\x21\x36\xd5\x96\xe2\xca\x53\x77\x5f\xc0\xd2\x9b\xfa\x7a\x9d\xbc\x0c\x8b\xa2\x69\xca\x52\x52\x30\x35\x44\x14\x91\x64\xc2\x45\xba\x62\xad\x1e\x3e\xcf\xea\xfd\x58\x5f\xc7\x33\xba\x40\xd6\x27\xb2\x83\xcd\x35\x36\x1c\xd7\x28\xfc\x8b\x70\x88\xec\x2a\xd5\x0f\x89\x71\x46\xde\x6f\x5b\xca\xf5\xdd\x45\x73\x10\xa8\xbd\x49\x78\x77\xbd\x12\xc4\xf2\x1f\x4b\xa6\x16\x10\x63\x51\x09\xac\x21\x98\xcb\xdd\x91\x71\x4d\x12\xaa\x91\x53\x74\x55\x2d\x3b\xaa\x51\xbb\xe9\x29\xbb\x5b\xa2\x49\x13\x2e\xcd\xa1\x50\x27\xf5\x3a\x38\xc2\x6c\xa5\x12\xbe\xe2\x16\xa0\xb2\xfe\x77\x9a\xcf\xae\xa2\xdb\x4e\x82\xdb\x4a\xa4\x78\xc1\xca\x39\xd9\x5d\x41\x27\x3b\x2b\xe9\x64\x27\x45\x9d\xec\xaa\xac\x93\x3d\x14\x76\xb2\x9b\xd2\x4e\x9a\xa8\x60\x77\xc8\x49\x59\x8f\xa3\xbf\x93\x7d\x54\x54\xb2\x87\x1e\x4f\x9a\x4b\x0d\x68\xaa\x1e\x4b\xa9\x07\x5c\xaf\xe9\xf5\x4f\x0d\xac\xdd\x74\x7a\xd2\x04\x95\x8f\xba\x03\x85\xf6\x0b\xd1\xf0\x9f\x44\xdd\x26\x7b\xa9\xdc\x64\x77\xb5\x9b\xec\x8e\x19\xc0\xea\xde\xc1\x75\xea\xbe\x0c\x13\x47\x41\x16\x91\xd3\xc2\x22\xc5\x3f\x2c\x27\x80\x7d\xf9\x17\x29\x28\x57\xda\xca\x77\xce\x66\x12\xff\xe6\xb4\xf3\x78\x18\x3b\x02\xd7\xc4\x92\xea\x39\xcd\x2c\xef\x41\x3f\x0e\xa7\x17\xd9\xd1\x9b\x6c\x7a\x40\x1e\x20\xea\xd3\x52\x29\xd4\x96\xb8\x26\x47\xf7\x6c\x71\x34\x58\x42\xa4\xa3\x6b\x71\x84\x3c\x6a\x09\x75\x02\x43\x93\x22\x5b\x90\x23\xf8\xed\xe8\xd0\x9c\x7d\x07\xc6\x15\x27\xdb\xd8\x95\x2f\xec\x80\x25\xc2\xc7\x4a\x1f\x5e\xd8\x44\x2e\x82\x17\x1b\xfe\x2b\xba\x62\x30\xe0\x6a\x11\x31\x97\xe0\x35\x02\x38\x06\xef\x53\xaf\xfc\x96\xc2\xa5\x56\x00\xdd\xb5\x1a\x0c\x99\xd4\xb2\x4b\x93\xdb\x78\x29\x98\x06\xc1\x8e\x05\x13\x51\xd4\x19\xda\x8e\xd0\x1d\xa4\xe2\x76\x22\x6d\x3a\x88\x54\x3d\x40\x46\xcc\x19\x15\x9a\x1c\x79\xdb\xd3\xb1\xae\x5a\x1c\x8d\xaa\xe8\xbe\x30\x22\x04\x21\xc7\x11\x7d\xd5\x80\xbd\xa4\xdd\x4b\xda\xbd\xa4\xdd\xa1\x57\x2f\x69\xaf\x7f\x7a\x49\xbb\xc3\xd3\x4b\xda\xbd\xa4\xbd\xe9\xc3\xbd\xa4\xdd\x4b\xda\xdb\x3f\xbe\x9b\xa4\xbd\xab\x9f\x50\x2c\xf7\xba\xcb\x39\xcc\x9c\x45\x0d\x4f\x2a\x1f\x22\xdf\x0a\xff\x75\x58\x79\x3b\x96\xa5\x57\x4b\xdb\xb1\x44\xbe\xa4\x5b\x8c\xb6\x88\xd6\x41\xf8\x5e\xea\xb9\x59\xea\x7e\x59\xbe\x50\x3b\xe0\x46\x74\xa1\xb0\x23\x72\xdc\xf9\xab\x70\x97\x69\x6e\xcc\xaa\x7b\xf2\x94\x9c\xf8\x1b\x97\x53\x0b\x7c\x21\x4d\xfd\x47\x61\xf8\xb0\x6a\x11\xee\x60\xe0\x7a\xb1\x16\x6f\x53\xbb\x96\x08\xb7\xee\xe1\xa6\xb8\xda\x4f\x4b\x42\x98\xaa\xcd\x81\x6b\x97\x40\x0c\xbc\x25\x54\x29\x84\x1d\x55\x0a\x7f\x7d\x8c\x34\x07\x13\xc0\x39\xcc\x43\x61\x09\xe6\x03\x12\x53\x05\xa5\xe8\xbe\x93\x1a\xcc\xb9\xe7\x5c\xf9\xa5\x70\x37\xa2\xf6\x8d\xbf\xf5\xf5\x48\x09\x2b\xe2\xe1\xeb\x23\x72\x05\x78\x18\x0f\xcc\x35\xc0\x87\x66\x99\x7c\xe8\x42\x92\x9e\x2a\x2c\xea\xa1\x73\x58\x54\xe3\xfe\xae\x8f\x8a\xfa\x99\x44\x45\xc1\x8f\x78\x84\x0e\x1e\x1e\x45\x7e\x98\x31\xc0\x22\xc5\x00\x54\x79\x99\x19\x5e\x54\xbe\x52\x1a\x3f\x95\xa1\x94\x39\x71\x9e\x27\x75\xbc\xb4\x5f\xa3\xc9\xac\x89\x9f\x30\x1e\xf8\x56\x69\x38\xb4\xce\xbb\x83\x66\x99\x8b\x29\xf2\x22\x29\xba\xb0\xf0\xe7\xf6\x4c\xb8\xf4\x59\x11\xbd\x36\x03\x44\xe6\xc4\xd2\xc2\x6c\xe1\x32\xd5\x6d\x20\xa2\xa8\x14\xcd\x99\x67\xbd\x53\x3e\x67\xa2\xa2\xa4\x27\xfa\xf4\xd4\xf3\xf0\x83\x52\xf8\x47\xa1\xd0\x7f\x88\x28\xe9\x1f\xdb\xd0\x68\x58\x50\xa0\xd2\x15\xf8\x2a\x1a\xfd\x9c\x2e\x18\x5d\xee\xf9\xbb\xd9\x18\x76\xb8\xdf\x7f\xc2\xbb\xfd\x2f\x27\xb2\xec\x99\x2d\x8c\xcf\xe1\x5b\xff\xe2\xad\x8a\xbd\x73\x7d\xf5\xec\xeb\x5c\xff\xe8\x96\xc3\xe7\xf5\xb1\xff\x02\xac\x85\xcf\xe9\x63\xdf\x5b\x08\x37\x6e\xca\x4b\x73\x7d\xaf\x3f\x3b\x59\x04\x7b\x6b\xe0\xce\x5c\xb8\x23\xc3\xd9\xd7\x0a\xd8\x11\x23\x76\xbc\x67\xef\xef\xd8\x9f\xe6\x8e\xbd\x97\x78\x5b\x3e\xbd\xc4\xbb\x16\x28\xbd\xc4\x4b\x7a\x89\x77\xdb\xf2\x7a\x89\x77\x23\x78\x7a\x89\x77\xe3\xa6\xf4\x12\x6f\x2f\xf1\x92\x2f\x4d\xe2\xdd\x25\x4b\x57\x7f\xd7\xbd\xd7\x5d\x77\x57\x6a\xd1\x89\x46\x74\xc4\x83\xce\x77\xdb\xfd\xbd\xf6\x4b\xb9\xd7\x6e\x1d\xf0\x2f\x0c\xdf\x37\xe8\x3f\xde\xab\x75\x91\xff\x74\x2e\x79\x4a\x8a\xd2\xb8\x78\xea\x3e\xfa\xff\x10\xd1\xff\x35\xc8\xf7\x29\x00\x5a\xa5\x00\x58\x07\xb3\x3e\x0f\x40\x9f\x07\xe0\xc0\x97\xd0\x7d\x1e\x80\x3e\x0f\x40\x9f\x07\xc0\x3f\x7d\x74\x12\xe9\xa3\x93\x5a\x3d\x7d\x74\xd2\xfa\xa7\x8f\x4e\x7a\xb1\xd6\x57\xd2\x47\x27\xbd\x6c\x4b\x2c\xe9\xa3\x93\x7a\xeb\x6c\xcb\x8d\xfa\x02\xa3\x93\xfa\x3c\x00\x2f\xd5\x47\x81\xf4\x92\x76\x2f\x69\xf7\x92\x76\x2f\x69\x6f\x7e\x7a\x49\xbb\xc3\xd3\x4b\xda\xbd\xa4\xbd\xe9\xc3\xbd\xa4\xdd\x4b\xda\xdb\x3f\xde\xe7\x01\xf8\x82\x7c\x23\x48\x9f\x07\xa0\xf7\x97\xe8\xf3\x00\xfc\x7c\xf3\x00\xd4\xee\xee\x9f\x2f\x19\x40\xf7\x69\xf4\x19\x01\xfa\x8c\x00\x7d\x46\x80\x3e\x23\x80\x7f\xfa\x8c\x00\xf8\xbc\x24\x5b\x63\x1f\x1f\xb5\x16\x28\x7d\x7c\x14\xe9\xe3\xa3\xb6\x2d\xef\x0b\xb0\x1b\xf6\xf1\x51\x2f\xd0\x56\xd8\xc7\x47\xf5\x76\xc1\xe6\xe6\x7c\x21\xf1\x51\x7d\x46\x80\x97\x78\xdb\xde\x4b\xbc\x2d\x9f\x5e\xe2\x5d\x0b\x94\x5e\xe2\x25\xbd\xc4\xbb\x6d\x79\xbd\xc4\xbb\x11\x3c\xbd\xc4\xbb\x71\x53\x7a\x89\xb7\x97\x78\xc9\x97\x26\xf1\xf6\x19\x01\xfa\x8c\x00\x7d\x46\x80\x2f\xf1\x86\x7b\xeb\x4e\x33\x31\x5f\xb7\xa7\xb5\x5d\xbc\x12\xf3\xba\x9e\xc2\xc4\x9c\x2b\x29\x80\x02\xcf\xa9\xe2\x74\x9c\xc1\x49\x05\x89\xc7\xc1\xdf\xd1\x4f\xa6\x46\xe4\x82\x0a\x77\xd1\x8a\x37\x99\x6b\xe7\xbf\x1d\xf1\xb7\xa0\x7a\x73\xda\xdf\xd3\xba\xa8\x26\x56\x4e\x9d\xb8\x06\x76\xea\x94\x5c\x84\x89\xaf\xfd\x4c\x2b\x02\xde\x46\x3f\x18\x02\x72\xae\x6d\xd0\x4e\x8a\xb7\x43\x6c\x3e\x9b\x35\xb0\x7c\xa0\x79\x15\xe2\xbf\x02\x1a\x23\xf2\xde\x49\x48\x94\x5c\xfc\xef\xf5\xe5\xd5\x87\xbb\xeb\xb7\xd7\x57\x1f\x37\x23\x5d\x4b\xb2\x02\x07\xa9\xc3\x64\x8f\xbf\xf7\x7b\x04\x61\xde\x4c\x58\x0a\xfc\xcb\x93\xef\xcf\x3f\xfe\xef\x87\xf3\xf7\x57\xa7\xc0\x7e\xd9\xe7\x82\x8a\x94\xa5\xa4\xd4\x9e\x24\x14\x8a\xcd\xb9\x2c\x75\xb6\x08\xc7\x7b\x35\xd2\x36\xb1\xd5\x29\x9a\x0b\xa2\x99\x9a\xf3\x64\x35\x88\x50\x8a\xa5\x15\x02\x25\x01\xc3\x15\xd3\x32\x9b\xb3\x14\x65\x8d\x30\x69\xff\x1d\x2e\x8a\xd2\x78\x89\x18\x5c\x10\xec\xa9\x10\xc9\x8c\x8a\x29\x4b\x47\xe4\x52\x96\x76\xbc\x5f\xfe\x12\x16\xa6\x58\x5a\x26\xc8\xeb\xa8\x17\x98\x7e\x39\xf0\x94\xc4\xd2\x02\x8d\x69\x14\x74\x42\x0b\xbf\xf4\x18\x3a\x7a\x21\x0c\xfd\xfc\x06\xef\xe0\x8f\x7e\x19\xfd\x74\xe4\x53\x50\x48\xfb\x09\xa4\x47\x38\xab\x0c\xb2\x1f\x64\xe4\x28\x6e\x3d\x22\x57\xf6\x1b\x2c\x8d\xf7\x01\x5d\x28\xd8\x9c\x29\x90\xa7\xdd\x2e\x0c\x88\x62\x53\xaa\xd2\x8c\x69\x70\x1e\x78\x98\x31\x48\xe7\x81\x12\x96\x03\x18\x0b\xd2\xba\x90\x66\x44\x2e\xd9\x84\x96\x99\x01\x1a\x72\x74\x34\x3a\x3e\x18\xaa\xbd\x55\x72\x4b\xf0\x7b\x0d\xdd\x6e\x31\xa9\xc4\x44\xaa\xb5\xc7\xe3\xd8\x99\x26\x6a\x64\x4d\x5b\x4e\xe2\x34\x3d\x4f\xab\x51\xbf\x68\xb1\x92\x16\x82\x60\x7b\x75\x3e\x91\x62\xc2\xa7\xef\x69\xf1\x2d\x5b\x7c\x64\x93\x8e\xde\x10\xc8\x44\x9d\x4e\x0b\x0c\xcc\x92\x43\x1c\x70\x3b\xd3\x79\xc4\xbb\xfc\x36\x46\x93\x6e\x36\x8f\xd6\x96\x8e\xa5\x94\x16\xc8\xf4\x1d\xfb\x3e\x60\x72\x9e\xea\xd9\x4e\xd1\x57\x4e\xee\x38\x26\xed\xee\x9c\x9a\x11\x79\x2f\xc1\x25\x67\x22\xdf\x90\x99\x31\x85\x7e\x73\x76\x76\x5f\x8e\x99\x12\xcc\x30\x3d\xe2\xf2\x2c\x95\x89\x3e\x4b\xa4\x48\x58\x61\xf4\x99\x9c\x5b\xca\xc7\x1e\xce\x1e\xa4\xba\xe7\x62\x3a\xb4\x92\xce\x10\x77\x55\x9f\x81\x30\x75\xf6\x0b\x94\xd8\xef\xbe\xbb\xfc\xee\x0d\x39\x4f\x53\x97\xb1\xa7\xd4\x6c\x52\x66\x2e\x7b\xc7\x88\xd0\x82\x7f\xcf\x94\x55\xca\x06\xe4\x9e\x8b\x74\x40\x4a\x9e\xfe\xe7\xe6\xc3\xbd\x23\xc4\x64\x81\xba\xd1\x0e\x50\xbb\x05\x41\x71\x51\xa3\x53\x01\xe9\x2d\x85\xe2\x46\xc3\x9e\x7b\xc3\x81\x63\x28\x1d\x96\x31\x96\x32\x63\x54\x6c\xe9\x01\x60\xeb\x7e\x66\x8f\xab\x43\x8b\x5a\x8e\x43\x80\x42\xa6\x6f\x88\x2e\x8b\x42\x2a\xa3\x49\xce\x0c\x4d\xa9\xa1\x23\xbb\x73\x83\xfa\x9f\x20\x1c\x0f\xc8\x5f\xc3\x4b\x90\x70\xf5\x9f\x8f\x8f\xff\xf0\xed\xd5\x7f\xff\xf1\xf8\xf8\x2f\x7f\x8d\x7f\x05\xb2\x87\xa6\xae\x7a\x13\x2b\x72\x8f\xac\xb8\xfb\x01\xbe\x01\x7f\x3a\x36\x7a\x9e\x24\xb2\x14\xc6\xfd\x60\xa8\x29\xf5\x68\x26\xb5\xb9\xbe\x09\x7f\x16\x32\x6d\xfe\xa5\xb7\x70\x02\xf2\xb8\x44\x07\xc0\x79\x43\xcd\xec\xc0\xa4\xa7\x3a\x17\x3b\xa0\xab\xeb\x19\x67\x48\xca\x29\xfc\xf3\xad\x9f\xae\xe5\x40\x0f\x8a\x1b\xc3\x04\xc8\x1d\xe0\x77\x27\x27\x03\x8b\xb9\x15\x9b\x9d\xbf\xee\xa4\x8e\xb6\x3e\x8a\x01\x6a\x3b\x2c\x0e\x66\xef\x56\x86\xc8\x1c\x08\xed\xb2\x5e\x77\x7e\x73\x4d\xe6\x08\x8d\x83\x2f\xc4\x7b\x61\xbd\xdd\xfb\x4c\x86\x4c\x55\x6e\x59\x41\xd2\x7c\x83\x96\xa5\xe0\xef\x45\x32\x9e\x73\x67\x00\x76\x59\xad\x34\x39\xc1\x97\xa3\xa4\x28\x07\xae\xc1\x28\x67\xb9\x54\x8b\xf0\x27\x2b\x66\x2c\xb7\x12\xdb\x50\x1b\xa9\xe8\x94\x0d\x42\x77\xec\x16\xfe\xc2\x8e\xb5\x0f\x2c\xf7\x46\x91\x3a\x29\x95\x65\x1e\xd9\xc2\x53\x10\x96\x3e\xef\x59\xf4\x60\x3a\xf0\x51\x0c\xbb\xf1\x61\x47\x96\x1b\xb4\x45\x64\xda\x61\x55\x20\x43\xce\x65\x56\xe6\x4c\x0f\x02\x7b\x42\x69\x5d\xcc\xad\x34\xa9\x1f\x85\x11\xa6\x7c\xce\xf5\x4e\xf7\xd3\xb7\xc1\x52\x07\x26\xb2\xd2\x58\x4d\x05\x9d\xc1\xa3\x8c\x70\x52\x83\x0e\x10\x7c\x14\x6b\x24\xe5\xf5\x51\xbb\xdb\x57\x6a\x0c\x53\xe2\x0d\xf9\xff\x4e\xfe\xe7\xdf\xfe\x39\x3c\xfd\xcf\x93\x93\x3f\xbf\x1a\xfe\x3f\x7f\xf9\xb7\x93\xff\x19\xc1\x3f\x7e\x75\xfa\x9f\xa7\xff\xf4\x7f\xfc\xdb\xe9\xe9\xc9\xc9\x9f\xbf\x7d\xff\xcd\xdd\xcd\xd5\x5f\xf8\xe9\x3f\xff\x2c\xca\xfc\x1e\xff\xfa\xe7\xc9\x9f\xd9\xd5\x5f\x5a\x0e\x72\x7a\xfa\x9f\xbf\x6c\x35\x3d\x2a\x16\xdf\xb5\x38\xf0\xf8\x0c\x77\xf0\xb0\xaf\x7a\x75\x30\xd0\x7f\x1e\x56\x42\xdb\x90\x0b\x33\x94\x6a\x88\xdd\xdf\x10\xa3\xca\xed\x07\xa3\x22\x6a\xbb\xe0\xb9\x4f\x07\xf6\xa6\x22\x68\x81\x34\x1f\x1c\x91\x35\x4b\x14\x33\x87\xd2\x60\x70\x34\xcf\x3f\x1a\x26\xd9\x5e\xa9\xa9\x94\x9a\x60\x97\x04\x78\x55\x9c\x77\xa2\x64\x3e\x22\x91\x59\x68\x0e\x37\x99\xae\xdd\x3d\xdb\xa2\xe5\xfa\xa7\x57\x82\xbe\x2c\x25\xe8\x16\xf7\xf7\xd1\x35\x20\x26\xe6\x9b\xcc\x34\x4d\x9b\xee\x5b\x08\x65\x89\xcd\xd1\x5e\x80\x32\x92\x14\xb2\x28\x33\x6a\xd6\x98\xed\x56\xd8\xa6\x1d\xee\x57\xb7\x00\x76\xa3\xc1\x0e\xec\xa8\x5c\xbe\xda\x18\x4a\xce\xb3\x8c\x70\x81\x27\x01\x06\xf0\xd6\x3c\xc5\x50\x5e\x22\x14\x0d\xce\x73\x3b\x85\x07\x17\x70\x13\x19\x1a\xb9\xb6\xba\x8e\x32\x60\xf1\x87\x80\x1c\xa4\x59\xce\x34\xc6\x45\x15\x96\x13\xb8\x6d\xb8\xa5\x5c\x99\x7f\x31\xa3\xda\xf8\x69\xc3\x6c\x0c\xbd\x07\x53\x68\xc2\x52\x26\x12\x06\x2e\x08\x25\xab\xd6\x3a\xb6\xc2\x20\x98\xf7\x61\x0c\x4a\xd2\xb2\xc8\x78\x62\xe1\x67\x67\xb2\x7a\x8c\xeb\x3c\x2f\x0d\x18\x8a\x9f\xca\x8a\x6f\x77\xfc\xd6\xa7\x7b\x0d\xc6\x7c\x20\x55\x41\xb4\x0e\xde\x16\x41\x75\xd7\xfb\x99\xef\xdb\x11\xde\x60\x6e\xdb\xca\xa9\x96\x28\x6e\x65\x63\xa8\x53\xda\xa7\xb6\x18\xb6\xa3\xb3\x3f\x49\x1a\xdb\x81\xbe\xb6\xa7\xad\x1d\x8c\x4b\x5d\xe9\x69\x5b\x6b\x52\xa1\xd8\x84\x7f\xee\x80\x8f\xe7\xa2\x52\x51\x78\xca\x84\xb1\x8a\x00\x64\xa6\x2e\x14\x2b\x98\x48\x43\xb8\x1f\x38\x78\x89\xfa\x3a\x1e\xf5\xc6\x08\xa5\x8c\xee\xc7\xeb\x76\x95\x14\xd3\x9f\xad\x9f\xf8\xd9\x72\xbb\x7e\xf8\x83\x25\x64\xba\xd5\xf9\xbb\xb1\x8f\x51\x8f\x86\xa7\xab\x4b\xff\xed\x26\x69\xb5\xb7\x70\xe5\x54\xc8\x14\x73\x5c\x9b\xca\x09\x61\x44\x6e\x57\xf4\x04\x5f\x03\xd7\xe2\xf8\x58\xa3\x5b\x82\x6e\x0e\xd4\x88\x6e\x46\xcf\x04\x1c\xb4\x23\x4a\x21\xab\x2b\x15\x58\x7e\xcf\xa8\xd6\x7c\x2a\x86\x85\x4c\x21\x2f\xf7\xd9\x3a\x84\x68\x71\xa8\xba\x79\x36\x6d\xc5\xab\x60\x9c\x68\xb7\x4d\x1f\x83\xfd\x2d\x92\x2d\x7c\x46\x78\x15\xfd\xe8\xec\x3a\xde\x8f\x3e\x92\x21\x2b\x89\x68\x3f\x98\xe6\x54\xd0\x29\x1b\xba\x8f\x0f\xc3\xc7\x87\xe1\x5b\xfb\x80\xb9\x0d\xd5\x42\x93\x62\xeb\xb2\x10\xc7\xef\xd0\x64\x99\x86\xf2\x10\xe8\xbf\xf7\x99\xe7\x65\x4e\x68\x2e\x4b\x74\xd1\x5b\x06\xa7\x77\x64\x39\x08\xc0\x56\x00\x4a\xaf\x85\x54\x4b\x68\x91\x9d\x5c\xee\x5e\xa8\x65\xab\x95\x45\xab\x9b\x25\xab\x83\x05\x6b\x67\xcb\x95\x37\x52\xb7\xc7\xc7\x8f\xde\x6e\xde\xc0\x48\x2e\xb6\x62\xa4\x0a\xf9\xee\xaf\x27\x24\x8c\xc3\x35\x91\x39\x37\xc6\x19\x74\x69\x75\xec\x07\x84\x9b\x9a\xf5\xd3\x9d\x05\xa8\xf7\x80\x25\x32\xd8\x67\xab\x4d\x71\xb0\xa2\xfb\x5b\x8b\x01\x72\xd9\x07\x8e\xd9\x21\xa8\x20\x3c\x2f\xd0\x99\x15\x70\x7a\xe8\x75\x33\xe7\x64\xd0\x9f\x8f\xfe\x7c\xac\xea\xa4\xbb\xc8\x22\xb1\x18\x52\x79\x30\x06\x71\xc4\x62\xb6\x2f\x3c\x03\x1e\x9a\x88\x43\xf6\x2c\x80\x13\x3d\x17\x53\xf2\x91\x81\x65\xe0\x96\x19\xed\x7c\x22\xa1\x07\x55\x6c\x39\xc4\xcc\x5b\x42\x82\xab\x2d\x9d\x4c\xea\x2d\x52\x56\x64\x72\x91\x83\x64\x7b\x6d\x62\x79\x26\x88\x2e\x2c\x2f\x32\x6a\x58\x10\x6c\x36\x5b\x1b\xf6\xe6\x7c\x5d\xe2\xbb\x9e\x37\xa2\xab\x9d\x77\x70\x0b\x9f\xe0\x97\x1f\xa7\xd5\x5a\x23\x6b\x6b\x77\x6f\x63\x73\x6f\x19\x6f\xd5\x5e\x09\x6c\x65\x94\x7f\xec\x28\xaa\x4e\xea\x58\xdb\x48\xa9\x97\x1f\x1b\xd5\x61\xd9\x6d\xe3\x9f\xfa\x88\xa7\x4d\xa0\x6e\x17\xb5\xd0\x3a\x62\xa1\xd5\xfe\xb5\x8c\x5c\xea\x63\x95\x3a\xf0\x97\x47\x10\xfe\xb6\xee\xa5\x91\x19\x43\xc9\xb5\x9d\xee\x7e\x57\xb5\x0f\xf5\xcf\xf0\x7a\x37\x1a\xe9\x69\x6e\x29\xee\xbc\xd8\x62\xcf\x56\x35\x2f\x40\x2d\x63\x28\x14\x3b\x33\xd2\xcf\xcb\x6e\x9c\x58\x10\xbb\x67\xc6\x55\xbe\x8b\x4a\xc1\x19\x05\x97\x3e\x7f\x08\xd8\x36\x60\x20\x3f\xfd\x31\xf2\x6f\x0f\xf1\x2f\x01\x43\xfe\xe0\xff\xf5\xc7\x3d\xe3\x16\xda\x31\x36\x9c\x52\x07\x01\xe3\x0a\x3a\x10\x2e\x52\xb8\x60\x72\x4b\x05\x08\xe0\x58\x16\x3e\xb0\x2c\x1f\xff\x82\x81\x54\xce\xcc\x05\x37\x51\x55\x63\xed\xae\xcc\x22\xbd\xca\x99\x14\xaa\x93\xc1\xc8\x07\xe9\x92\x12\xb2\x01\xb9\x01\x5b\x6a\xf5\x06\x4e\xd2\x07\x89\xe9\x09\xd7\xde\x65\xc5\x70\xdb\xca\x45\xb6\x32\xfa\x1a\x40\xbe\xad\x98\x3c\xae\xac\xc6\xe4\x2b\x0c\xae\x45\xc2\x6d\x82\xcc\x3d\x5b\x54\xcc\xc6\x89\x10\x40\xf2\x07\x15\x96\x78\x56\x80\xbc\xe3\x3f\xbc\x29\x2b\x1f\x73\x81\x1f\xc3\xa1\xfd\x56\xc0\xe8\x1e\xa0\x56\xb2\xcb\x32\xfc\xcc\x21\xc0\xd5\x4e\xce\xa8\xc1\xec\xbb\x0e\x32\x46\xa0\x92\xab\xa5\x8b\x48\xa4\xb8\xfa\xb1\xa4\x59\x3d\x08\xc1\xbd\x72\x8d\x96\xa8\xfa\x03\xcf\xd2\x84\x2a\xe7\xe5\x05\x67\x94\x68\x89\xbb\x87\x59\xf1\x12\x2a\xc2\x69\xaf\xf6\x08\xeb\x20\x92\x82\x2a\xc3\x93\x32\xa3\x8a\xd8\xb3\x30\x95\xaa\x55\xa0\xc0\x56\x88\x56\x48\x73\xcb\x12\x29\xd2\x2e\x0a\xc0\x5d\xb3\x6f\xf3\xae\xb5\x60\x8a\xbb\x74\x7f\x3c\x67\x4d\x24\x3d\xa9\xdb\xb4\xe5\xc4\x9f\xea\x70\xc4\x6a\x96\x8f\x2a\x26\x93\x6b\xc2\x31\x5f\xe8\x69\x44\x1e\xc3\xa9\x18\x91\xaf\x17\xde\xcc\x02\x26\x17\x17\x5d\xa1\x99\xf1\x81\x30\x1e\x65\x1d\xb0\xab\x03\x35\x91\x0a\x82\x53\x4e\x52\x89\x11\x19\x73\x9e\x98\xd3\x11\xf9\x7f\x99\x92\x18\xc1\xc9\xa6\x98\xbd\xd1\xa1\x78\x50\x5c\xa1\x70\x29\xdc\xe0\xbf\x22\x27\x98\x49\x93\xe7\x39\x4b\x39\x35\x2c\x5b\x9c\xa2\x1e\xeb\x73\x71\xb6\xd9\xba\x36\x46\x83\x28\xf1\xea\x6f\x7f\xb3\xa1\x65\xd7\x18\xaa\xef\x7d\x54\x4a\x05\x19\xf4\x21\x68\x6c\x61\xe0\x41\x72\x83\xb8\x19\xfb\x20\x54\x41\x9d\x9e\xcc\x84\x0d\xfe\x9b\xc5\x03\x4a\x14\x9b\x02\x96\x23\xe6\xee\x89\xe3\xe8\x4d\xf9\x5e\x96\x62\xbd\x49\xb0\xb6\xf0\x77\x4e\x09\xff\x3e\xea\xb8\x36\x4a\xf1\x49\xc4\x84\x68\x26\x91\x89\x92\x12\xb0\x4b\x02\x3b\xb7\xe4\x01\x5b\x55\x9e\x28\x5b\x27\x79\xd0\x88\x44\x98\xcb\x16\xaf\xf7\x83\xc4\x2d\x86\x0f\x75\xc0\x65\x70\x10\x77\x80\x69\xc4\xed\x19\x47\x0e\x00\x3f\x11\x82\x15\x82\xc2\xb7\x58\xea\xbd\xd8\x30\xd6\x18\xba\x92\xe3\x37\xc7\x07\x21\xbe\xb8\x1c\x25\x0b\x3a\xa5\xdb\xf3\x1d\xd7\x95\x91\x46\x57\x92\x32\xc3\x54\x0e\x89\x69\x67\xf2\x01\x7f\x47\xb6\x55\xb8\x56\xcc\xe5\xf4\xb5\xab\x9d\x49\x0d\x5c\xa9\x1e\xc4\x08\xe7\x17\x2e\x46\x1f\xe8\x82\x50\x25\x4b\x91\x3a\xa9\x29\x10\xd0\xf7\x8d\x0f\x7f\x90\x02\x28\x45\xa9\x2d\xac\xee\x6a\x54\x7a\xcc\x0c\xb5\xc7\xe6\xf5\xe8\xf5\x96\xdc\xd3\x2d\x01\xd6\x31\x6e\x15\x66\xd3\xb0\x14\xfa\xbb\x72\x7f\x66\x0e\x32\x2f\xc5\x68\xfa\x9d\xc8\xba\xc8\x72\xef\x11\xbd\xa0\xeb\x10\x94\x30\x3e\x01\xdb\xed\x00\x5f\x3d\x28\x6e\x58\x44\x1e\x4f\x26\x34\xd3\x50\x70\xbb\x14\x41\x84\x3d\xad\x8b\x20\xd0\xa4\xcd\x82\xb6\xfb\x83\xe8\x72\xbc\xe7\x39\x73\x07\x0a\x50\xae\x3a\x66\x01\xe1\x8e\xf5\x86\x23\x57\x0f\xee\x24\x27\xd8\xd2\x4a\x6c\x52\x9a\x8d\xe5\xdd\xdb\x3b\x89\xe0\x02\xad\x66\xdd\x45\x25\xf1\x71\xc3\xc5\x01\x57\xfb\x35\x9b\xd1\x39\xd3\x44\xf3\x9c\x67\x54\x65\x10\x2b\x78\x8b\xf3\x83\x62\xec\x2b\x23\xd0\xbb\x45\x37\xc7\x33\x89\x86\xdb\x0a\x6a\x3f\x0f\x0b\x27\xa0\x11\x7e\x5e\x98\x04\xdc\x67\x0e\xff\x9c\x64\xa5\xe6\xf3\x7d\x4f\x93\x8b\x7e\xd8\x81\x55\x37\xb9\x74\x21\xd3\xdb\x82\x25\x4f\xc9\xa3\xeb\x1a\x86\x25\x55\xa9\xdf\x74\xe0\xc9\xa8\xec\x53\x2c\xac\x3f\x66\x84\x26\x09\xd3\xda\xfb\x54\x2e\x62\x3f\xcf\xb0\x86\x2f\x25\xa1\x00\x7d\xd0\x57\x19\xd5\x86\x27\x5f\x67\x32\xb9\xbf\x35\x52\x75\x8a\xd9\x5f\xd5\xbf\x91\x86\xe1\xfc\x87\x5b\x72\xc9\xf5\x7d\x14\x4d\xe0\x2e\x4d\x63\x73\x09\x25\xf7\xe5\x98\x65\xcc\x1c\x1f\x6b\xe4\x72\x39\x4d\x66\x5c\x30\xcf\xe0\x44\x08\x49\x71\x0a\x9f\x85\x72\xd7\x3b\x53\x17\xf8\x74\xe6\xf0\xf5\x17\xf4\x41\x33\x9c\xfe\xd8\x4e\xdf\xfe\xcc\xda\x44\xa4\x1f\xf4\x9e\x02\x27\x73\x7d\x79\xa0\x3b\x88\x89\xbe\xb3\x73\xec\x66\xdc\x3e\xc6\x5e\x5e\x75\x98\xf0\x8c\xb9\xea\x03\x76\xc1\xde\x47\xcd\x9d\x0a\xd8\xbf\x85\x2c\xc9\x03\x45\x1d\x19\x28\xe2\x88\xdc\xf1\xe2\x0d\xb9\x12\xba\x54\xac\xb2\x6e\x34\x87\xe2\xba\x8a\x33\xf3\xca\x15\xec\x37\x2a\x20\x96\xee\x39\x5d\x8b\x5c\x7d\xa6\x79\x91\x31\xfd\x86\x1c\xb1\xcf\xe6\x37\x47\x03\x72\xf4\x79\xa2\xed\xff\x84\x99\xe8\xa3\x11\xb9\xce\xc3\xad\x3b\x17\x13\xa6\x14\xf3\x8e\x50\xd8\xc1\xb2\xe6\x88\xeb\x3e\x0a\xba\x38\xa7\x3a\x2b\xbb\xa5\x92\x3c\x60\x3e\x0a\x4b\xf0\x99\x52\x52\x05\x3f\xf4\x08\x0c\xc0\x6b\x12\x99\x17\x4a\xe6\x3c\x32\xf3\x01\xba\x1f\xd4\xdb\x0e\x8c\x0f\x6d\x0a\x72\x34\xb1\x21\x74\xf4\x08\x11\xbd\x10\x6d\x50\xe1\x7a\xe2\x9d\x29\x50\x8b\x74\x6a\x3d\x0c\xe7\x1a\xd9\xcd\x77\xa3\x58\x42\x16\x6f\xf7\xdb\x10\x50\x47\xce\x52\x36\x3f\xd3\x29\x7d\x3d\x80\xcf\x68\xe7\x08\x58\x9f\x13\xd5\xe4\xe8\xf5\xd1\x88\xdc\x7a\x46\x3c\x88\xe7\x58\xb5\x9b\x48\x15\x06\x04\x3b\xfb\xab\x23\x72\x22\x15\x8c\x9c\x50\x41\x32\x46\xe7\xce\xb6\x8c\xc7\x6d\x81\xea\xee\x69\xeb\x80\xc8\xb6\xb1\x61\xed\x2b\xaf\xb4\x15\x52\x97\x37\xd1\xf7\xf3\x26\x00\x55\xba\x58\x81\x89\x54\x2e\x0f\x48\x68\xa2\x99\x81\xa3\xc7\x45\x4d\x85\x7e\x06\x02\x4b\x3a\x86\xd2\x7b\xea\xd9\x15\x3a\xbe\x1f\xe8\x40\x82\xff\x58\x32\x72\x7d\x19\x02\xea\x99\xd2\x5c\x1b\x7b\x8c\xd3\x1a\xeb\xe2\xc8\xcf\x4e\xce\x73\xfa\x77\x29\xc8\xd5\xd7\xb7\x6e\x02\xa7\xcf\x0a\xaa\xad\xd4\x80\xfe\xbd\x54\xcc\x72\xe1\x0e\xcc\x3d\xf4\x69\x32\x74\xfb\x9e\x5c\x52\x43\x91\xaf\x3b\x4f\x2b\x51\x91\x72\xcb\xb2\xc7\x5c\xa4\xee\xa7\x88\x61\x3f\x35\x6f\xb5\xbb\xf7\x61\x93\x98\x14\x37\xfc\xf4\xf1\xfa\x40\x3c\x38\x01\x62\x3e\x7d\x2f\xd3\xce\x8c\x38\xea\xea\x89\xef\x9f\x2c\x4c\x2f\xf0\x3d\xc9\xed\x98\xc4\x6a\xef\x03\xf2\x91\xd1\x94\xd8\xf3\xeb\xfe\xf9\x83\xd5\x3d\x5b\xd3\xaa\x56\x2c\xc4\x03\xb0\xe3\x32\x7c\x37\xbf\x84\xd8\xd3\x3d\xb5\x98\x03\xc7\xca\xf1\x92\x71\x26\xc7\xc4\x1d\x87\x43\xcf\xfd\xd3\xc7\xeb\x1d\xa6\xfe\xe9\xe3\xb5\x9f\xb9\xfd\xa7\x9c\x3c\xdd\xa4\x77\x12\xdf\x2a\xe9\xed\x6d\x43\xdc\xaa\x58\x72\x15\xb8\xd1\x14\xc9\xda\xcb\x63\xa3\x43\x49\x62\x87\x84\xd8\x3d\x17\x2d\xa2\x70\xeb\xa7\xcc\xf6\xb1\x0a\x05\xfa\xaa\x45\xf7\x88\xb7\x33\x0a\xa1\xcf\x21\x20\x0f\xf6\xd9\x6e\xbc\xb6\x5c\xc1\xef\xb8\x55\x02\x81\xb6\x91\x4b\x86\xb7\x9c\xe9\x1b\xef\x3b\x10\x7a\xac\xee\xf0\x1e\x3c\x35\x53\x47\x5f\x09\x3a\x6e\xa6\x11\x82\x9d\xa0\x55\x49\x84\x9f\xe8\x9c\xf2\x8c\x8e\x79\xc6\x21\x95\xba\xd5\xee\x63\x6f\x54\x0d\x53\x3e\xe8\xa9\xdf\x51\xe4\x08\xe2\xc4\x92\x71\x8b\x9c\xd8\xdf\xce\xc0\x38\x76\x3a\x02\x6a\x05\x0d\x21\x47\x63\x43\x28\xf9\xb8\x4d\x28\x39\x98\xfc\x00\x3b\x60\x4f\x4c\x57\xae\x68\xfb\xac\xe4\x8a\xf0\xc3\xad\xcb\x27\xf7\x92\x19\x23\xc6\x5a\xb5\x62\x8d\x80\x5f\x5b\x5b\xb6\x67\x8e\xfb\x22\x57\xfa\x65\x20\x17\x09\x11\x6d\x3b\xf0\xcf\xaa\xa3\xe7\x43\xa0\x24\x81\xc7\x99\x8b\x76\xab\xb9\x66\x22\xf6\xdd\x3a\x5a\xe3\x52\x30\x21\xd7\xb5\x38\xd7\xa6\x2e\x5a\x97\xa4\x0d\x1e\x23\xba\xae\xca\xf7\xf3\x8b\x42\x12\x08\xaf\x49\x0b\x5c\x6c\x3d\xc9\x84\x15\xb3\x49\x97\x2b\x71\xdb\xe1\xed\x6d\xdd\x12\x78\xc1\x8a\x19\x79\x7b\xbb\xe2\x18\x03\xec\x61\xd6\x1a\xed\x83\xc7\x9a\x64\x7c\xc2\x0c\xdf\xb2\x84\x47\x38\xc8\xb9\x14\xdc\x48\xb5\x3e\x04\x9a\x74\x3a\x9c\x7e\xb8\xae\x0c\xd5\xf7\xb3\x3b\x5b\x25\x10\x79\x1f\xbd\xa5\x24\x91\x59\xc6\x12\xe3\x52\x5a\x01\x78\x43\xb7\x15\xca\x13\x73\xf6\x80\xd1\xfd\xef\x41\x7d\x72\x8a\xd2\x19\x6e\xee\xd9\xc7\xab\xf3\xcb\xf7\x57\xa3\x3c\xfd\xc5\x4c\x3e\x0c\x8d\x1c\x96\x9a\x0d\x79\x8b\x0c\x25\xcf\xe7\xbd\x88\x4f\xd1\x2a\x61\x56\xd3\x20\x83\xb9\xbe\xbe\xf3\xf1\x93\xe4\x93\x46\xaf\x05\xb0\x1d\xf9\x3b\x29\x29\xcd\x80\x28\xea\x62\x24\xa9\x33\x3d\x95\x59\x86\xd0\x36\x8a\xb1\x41\x6c\x8b\xd9\x18\x1a\xd2\x79\x61\x7b\x1b\x2a\x6a\x0b\x7c\x5c\x19\xe2\xe9\x11\xae\x0b\xc7\xd8\x2e\x93\x2c\x43\xb1\xea\x59\x87\xe3\x6d\xed\x3d\x1a\xce\xcc\xcc\x42\xf5\x9e\x2d\x08\x38\x02\x4f\xa4\xb2\xf8\xa4\xea\xb8\xc1\x4c\x02\x4b\x3f\x2b\x35\x53\x23\xc7\x76\x9e\x1c\x6c\x1d\xb2\x08\xed\x90\xbc\x2d\x74\x5c\x05\x33\xf7\xba\xca\xec\xeb\xe4\x35\x5a\x9a\x19\x13\xc6\x8a\xfd\x96\x96\x39\xc8\xac\x04\xa2\xf3\xc3\x7e\x72\xa8\xb5\x4c\x62\xd4\x2d\xe5\x50\x9f\xa6\xa7\x0b\x4e\xda\x53\xd3\x15\x1d\x6d\x1f\x08\x44\x8c\xc9\x7c\x88\xe5\x52\x34\x95\xe0\xb0\x81\x19\xe8\x6a\x88\x46\xd3\x9c\x8b\x17\x78\x3a\x13\x2e\xd2\x6d\x70\x68\x18\xc0\xa0\x47\x5d\x14\x73\xef\x9c\x41\x3f\xdc\x1b\x52\xaf\x49\x61\xc0\xbb\xbb\x41\xac\xdf\x1f\xb6\x3a\x7c\xf9\x42\xff\x98\x0d\xf1\x2b\xc3\x22\xad\xa0\xd2\x5f\x06\x2e\xdf\xe0\x1d\xd6\xa4\xf4\x04\x57\x7c\x07\xda\x6d\xf2\xc4\xd2\xd0\xe3\xea\xb9\x4f\x02\xa8\x2e\x32\xcf\xbe\xdc\xbb\xa2\x99\x50\x78\x5f\xfb\xe0\x33\xcc\x6c\x06\x67\xd4\xeb\xcb\x50\x90\x9f\x2a\x9a\x33\xc3\x14\xba\xc0\x39\xa7\x3a\xe1\xa2\x13\xbe\x2b\x98\xb8\x35\x34\xb9\x3f\x74\x2a\xd4\x9e\xe3\x3e\x1e\xc7\xdd\xfb\x2a\xd0\x23\x82\xcb\x8b\xb4\x88\x6f\x91\xb9\x70\x5c\xe8\x85\x90\x98\x90\x8e\xac\x8b\x95\x23\xa4\xa3\xaa\x73\xd7\x2a\x3d\x19\x1a\x36\xc0\xd3\x2d\xe4\xd7\x03\x0f\x7e\x84\xc2\x61\xb8\x61\xfb\x33\xe0\x48\xe0\x2e\xf7\x68\x51\xd7\x3a\x75\xc8\xed\x9b\x31\x37\xd5\xb9\xd7\xcc\x90\x82\xa9\x9c\xbb\xb0\x6e\x29\x48\xe2\xc2\x02\x80\xaf\x59\x1e\xe6\x86\x8b\x78\x9e\x20\x32\x31\xd4\xc5\xcc\x90\x31\x33\x0f\x8c\x09\xf2\xea\xd5\xab\x57\x20\x97\xbc\xfa\xdd\xef\x7e\x47\x20\x8f\x44\xca\x12\x9e\x2f\x37\x84\x56\xff\xe7\xf5\xeb\x11\xf9\xef\xf3\xf7\xef\xc0\xab\xac\x30\x9a\x8c\xa5\x99\xb9\x91\x6d\x83\x5a\x67\x3d\x20\xff\xf7\xf6\xbb\x0f\x5e\x9c\xd0\x8d\x5f\x41\x05\x09\xcb\xab\xbb\x08\xbe\xfa\xed\x6f\x7e\x33\x22\x97\x5c\x41\x3c\x31\x87\x08\x88\xe0\x04\x59\x78\xc7\x40\x28\x3c\xd4\x8c\xe0\x77\x1c\xc4\x39\x09\xe7\x7c\x3a\x03\x00\xd8\x03\x21\xc5\x24\xe3\x89\xc1\x9c\x82\x78\xf4\x11\xd0\xae\x2e\x12\x75\xe1\x5e\x4e\x8a\x80\xc9\x0d\x48\xc6\xef\x19\x99\xe8\x6f\x94\x2c\x8b\x2a\xcc\x51\x31\x6d\x65\xd9\x84\x0a\x88\x2a\x81\xc1\xaa\xbd\xd2\xcc\x3c\xab\x13\x46\x4b\x43\x50\x0d\x07\xa1\x4f\x43\x40\x19\x84\xdc\x6a\x43\xc4\x87\x82\xf2\xe0\x38\x08\x77\xea\xb5\xcc\xfe\x41\xf7\x4c\xa3\x5c\x72\x3e\x76\xa5\x50\xf2\x6f\xb8\x55\x5c\xf8\x28\x28\x27\x21\x6b\x27\x93\xb9\xa0\x53\x11\xd9\x5c\x7d\x54\xbe\xe5\x85\x2e\xe2\x3f\x8a\x9f\xba\x9e\xc4\x81\x76\x10\x96\x8e\xe5\xd5\x6a\x89\x2f\x57\x7c\xb9\x4a\xd6\x6e\xb1\x49\xe3\xbe\x96\x62\xa9\xb7\xab\xa3\xe2\xc8\x8f\xab\xae\xe3\x42\xd8\xaa\x31\xd0\x15\xd7\x05\x00\x45\x35\x9b\x6a\xc9\xe8\x6a\x5e\x3e\x9a\x99\xd2\x81\x06\x3c\xaf\xec\xb7\x99\xd6\x2e\x8e\x28\xa7\xea\xde\x2a\x09\x8e\x0a\x8c\xc0\xeb\x59\x87\x18\x26\x0c\x28\x9b\xa3\xb1\x3c\xa7\x8b\x5a\xd4\x80\xfd\xc8\xf1\x68\x74\x8c\xc7\x44\x2a\xcc\xe5\x89\x38\x6f\xdf\x3f\x53\xbc\x74\xdd\x2b\x9d\x16\x58\x76\x0f\xec\x39\xae\x6c\x09\xad\x79\x3b\x53\x07\xa9\x36\x19\x7c\x3b\x96\x2d\xec\x56\x1f\xb7\x7d\x5d\xdc\x21\x2c\xa0\x45\xd3\xae\x35\x70\x3b\xd4\xbe\x5d\x97\xad\xc1\xc1\xd8\x9d\x84\xb6\x15\x21\x3b\xe7\x02\xcf\x5b\xb1\xbe\x15\x53\x3d\xce\x1d\xe7\xfb\xae\x1b\xe7\x73\xf1\x7a\xb5\xe2\x60\x2f\x9f\xd5\x5d\x4f\x30\xd2\xa5\x4e\xba\x1c\x69\x88\x45\x81\x50\x88\xab\x0a\x7b\x79\xd1\x1c\x2d\x46\x9b\x6e\x89\xe7\xbb\x70\x37\x7c\xda\x5d\x4c\xe0\x53\xc3\x35\x7f\x3b\x81\x8b\x76\xa4\xb4\xa8\x15\xf8\xc8\xd0\x6e\x00\x32\xa6\x3f\x3c\x23\xf2\xde\x91\x5a\x44\x32\x3a\xd6\x32\x2b\x0d\x76\xad\x7e\x8c\xe9\x30\x0c\xea\xb3\x2c\x00\xf1\x0d\xcd\x22\xaa\x6c\xaa\x12\x67\xed\x08\x34\x3e\x1d\x0e\x67\x9f\xed\xf3\x11\xb3\x7d\x86\xfc\xb4\xba\x65\xbd\x26\xfd\x68\xe9\x75\x13\xcd\xbb\xe8\x57\x9a\x93\x93\xaa\x4c\x88\xbf\x8e\xbf\x16\x86\xa9\x09\x4d\xd8\x69\xac\x77\x85\x72\x2c\xc1\x45\xc8\xc7\x45\xcc\xa8\x48\x33\x14\xc0\x13\xa6\x00\xf7\xd9\x67\xc3\x94\x05\xc9\xc5\xed\x35\x49\x15\x9f\x33\xa5\xc9\xc9\xd7\xcc\xca\x8b\x8c\x9a\x52\xb1\x56\xd1\x55\x87\xf5\xad\x84\x69\x1c\x4a\xd3\x83\xc1\xba\xba\xea\x41\x27\x4f\x79\x44\x74\xbe\x2a\x30\x21\x54\x11\xa4\x3a\xd6\x65\x47\x16\x95\x80\x40\x03\xcd\x58\xc8\x52\x39\x2b\xba\xcf\xab\x9a\x48\x65\xd5\x25\x1c\x98\x6a\xa2\xd8\xd4\x4a\xb3\xca\x17\x1b\x66\x24\xc9\x4a\xfb\xe2\xa0\xee\x6c\xfb\x38\x00\x56\xa6\xd9\x4d\xbe\x7a\x13\x27\x55\xcb\x39\x4f\x3d\xab\xc4\xda\xc7\xa1\xaa\x61\x41\x75\x14\x6a\x13\x65\xa0\x8f\x00\x8b\x32\x3a\x30\xd4\x10\xc4\x5a\x73\xf6\x8f\x8d\xc2\x12\x72\x5b\xb4\x28\x1f\xd1\x85\x08\xcb\x94\xdd\x94\xe3\x8c\xeb\xd9\xed\x8e\x26\xc4\x55\x43\xa0\xb3\xc2\xd2\xad\xdf\x5a\x4b\xa2\x66\x42\x73\x60\x79\x96\x8c\x5b\xa6\xcb\xad\x1c\x25\x01\x88\xbe\x77\x8c\x90\x12\xa2\x3f\x32\xe6\x32\x18\xd8\x9f\x3e\x54\xf3\x70\x41\x69\x98\xb3\x24\x65\x9f\x44\x51\x7b\x9f\xd0\x2c\xd3\xcd\x80\x5d\x4f\x31\x51\xf6\xf0\x81\x6a\xb8\xa7\xdc\x6e\x77\xa8\x8c\xd2\xc8\x7e\xb9\x76\x61\x9a\xe4\x12\xc3\x78\x04\x91\xc2\x37\x82\xd4\x2b\xbe\x43\x14\xc8\x08\xe1\xca\x80\x32\x07\x2e\x1d\xd9\x9b\x4b\x1f\xcf\x5c\xba\xaf\x1f\x5e\x5c\xef\xbd\x8a\x86\xae\xa5\x25\x0d\xa4\xd4\x93\xdc\x2d\x4e\x1d\x07\xbd\x56\xc0\x6f\x9e\x1b\xa3\xf8\xb8\x34\xdd\xf3\xbd\x35\xba\x03\x9b\xb6\x8a\x08\x9c\xe2\xa1\x5b\x7d\x12\xa1\xa8\xd3\x10\xc2\x59\x58\x3e\xfb\x15\xcf\x01\x76\x83\x2f\x8f\x35\x49\x65\x52\x86\xbc\xb0\x00\xb4\xea\x02\xad\x4d\xf6\x44\xd2\xf5\x5c\x75\x4f\xe9\x15\x7f\x64\x2b\x7a\xa5\xf2\x41\x3c\x50\x95\x9e\xdf\x6c\xf1\xbe\xaf\xb3\xf3\xaa\x57\x2c\x28\xf9\xd7\x50\x05\x90\x8e\x65\x69\xaa\xd4\xa1\x3f\x1d\x7b\xf5\x2a\x35\xdd\x48\x4b\x1a\x5a\xda\xa3\xbb\x2a\xfa\xbd\x89\xbb\x37\x71\xd7\x9e\x5d\x4c\xdc\xd7\x68\xe2\x8e\xf3\xe0\xd6\x8e\xab\x4f\xaf\xc0\xb3\xb6\xbe\xbd\x8f\x69\x25\xbd\xac\x08\x0c\x4a\x53\x4d\x3f\xfe\x86\x00\x87\x47\xa4\xda\xdb\x48\xe8\xf3\x14\x08\x78\xf6\xf3\x5b\x54\x1f\xc9\x4e\xda\xbe\x4e\x31\x3e\xeb\x0a\x09\x6e\xaa\x5b\x0c\x52\x43\x54\x68\x78\xe0\xb2\x40\x0f\x9c\xde\x25\xd2\xaa\x84\x1f\x26\xa1\xee\x50\xa6\x14\x9f\x8e\xc0\x27\x9d\x37\x80\x74\x2c\x22\x8c\x4f\xd7\xdd\x20\x3b\x14\x14\xc6\xe7\x99\xcb\x0a\xe3\xd3\xd9\xf6\x4d\xba\x97\x18\x5e\xb1\xdc\xc7\x2d\x34\xbc\xe3\xd2\x76\x37\xeb\xef\x6a\xce\x1f\x54\xe5\xed\x5e\x3e\x5b\xef\xcd\xf9\x4b\xcf\x13\x9a\xf3\x23\xc2\xed\x89\xc1\x0a\xd3\x7e\x6c\x6e\xf3\xf6\xfd\x31\xf3\x62\xe5\xa8\xca\xbe\x66\x51\xce\x5b\xf6\xa5\xaa\x5f\xab\x1e\x8f\x46\xc7\xc7\xde\xde\xef\xf0\xb3\x34\x93\xe1\xef\x09\x13\x89\x4c\x71\x53\xed\xf8\x4a\x1b\x60\xfa\x95\x9a\x1e\xcf\x25\xf7\xdf\x8a\xaf\x66\x61\xec\x6e\x5b\xd2\xe1\x04\x77\x2f\x1b\xbe\x0a\xd2\x4f\x51\x3c\x3c\x2e\x11\x5e\xaf\x08\x8e\x2d\xf6\x29\x03\x1e\x03\xef\xd1\xf9\x6b\xeb\xc2\xe0\xf8\xec\xc2\x5e\x77\x28\x12\x8e\xcf\x13\x97\x0a\xc7\x67\x27\x8e\xda\xa9\x6c\xf8\x8a\xc5\x3d\x5d\xf1\x70\x7c\x5e\x68\x21\x99\xfa\xd3\xa9\x90\x38\x3e\xbb\x95\x13\xaf\xf7\xed\xb8\xf5\x07\x29\x2d\x8e\x4f\xb7\x02\xe3\xf8\x1c\xba\xcc\x38\x3e\x2d\x21\x01\xc6\xf0\x4b\xde\x29\x14\xc1\xf7\xa9\xbb\x4b\x1a\x96\x17\x52\x51\xb5\x20\xa9\xb3\x35\x2c\x56\x44\x84\x46\x21\xa1\x7b\xa7\x86\x81\x79\xa4\x5c\x1d\x28\x1a\xa1\x43\x34\x28\x4b\x79\xb9\xb6\x5c\xf3\x3a\xb0\x61\xaf\x18\x68\x0f\x90\x0d\xcc\x65\x12\xf3\xd7\x9d\xae\x99\x4f\xac\x48\x93\x7b\x57\x31\xc8\x43\x15\x79\x7f\x14\xe4\x72\x74\xd4\xc8\x03\x0d\xe6\x31\xb8\xfb\x73\x95\x11\x7d\x63\x1c\xbb\x66\xca\xc2\xdb\x10\xe7\x16\x70\xe2\x1a\x9e\x5a\x89\xe4\x3d\xb0\xc1\x27\xda\x25\xd2\x31\xb2\x8d\xff\x9d\x41\xb9\xb1\xce\xbe\xf1\xbe\x63\x48\x07\x2d\x41\x32\x0f\x75\xd1\x32\x99\x44\x77\xcf\x35\x0e\x05\xdb\x70\xe5\x91\xdf\xdb\xee\xed\x66\xd8\x51\x51\xbe\x00\xa3\x4f\xa6\xf1\x5e\x8f\x27\x90\xda\x12\xa4\x78\x00\x66\xd8\x80\xbb\xa8\x4a\x60\xa9\xed\x97\x20\xf3\x7c\xd4\xa6\xfa\xd0\x83\xcf\xb0\x69\xa2\x42\x6e\x75\xdd\xc3\xfe\x72\x1b\x56\x56\xe9\x6d\x10\x02\xe1\x05\x75\x5d\x82\x98\xe8\xbe\xe2\xc4\x25\x39\x81\xbb\xab\xaa\x2c\x5a\x48\xee\xb8\x84\x66\x82\x67\x75\x3c\xf3\xb9\xec\xc2\xc2\x4b\xe1\x1c\x0d\x96\x90\x66\x35\xce\x94\x9a\xa9\xe1\xb4\xe4\xe9\x2e\xd8\xf2\x82\x19\x60\x6b\xb6\xd7\x9d\xd9\x75\x64\x71\x7b\x30\xb6\xe0\x88\xd1\x81\x35\x1c\x55\xde\x1b\x35\xde\x10\xa7\xc5\xab\x7b\x72\x50\xef\x2c\x10\x8e\x9c\xbf\x12\xba\x0b\xaa\xad\xe3\x19\xc9\x22\x71\xc1\xba\xbc\x96\xee\x12\x87\x45\xcc\x03\xc7\xd6\xa1\xfd\x8f\x57\x81\xbd\x3d\x7f\xcc\x26\xb2\xaa\x90\x82\x1a\x91\x73\xc7\x4d\x59\xc6\xa0\x8c\xbc\x2f\x51\x6f\x1b\xc0\x95\x70\x2e\xe7\x16\x99\xff\x47\x90\x4f\x3e\x67\x3f\x9f\xbc\x21\xf4\xb4\x16\x02\xe1\xaa\xce\x08\xc6\x52\xf4\xd1\xcd\xaa\xef\xa8\x52\xe8\x01\x19\x9f\x7a\x7f\x14\x38\x71\xc2\x8a\x85\x99\x97\x78\x51\xaf\x56\xcc\x02\x00\xc2\x8e\x95\xcc\x89\x16\xb4\xd0\x33\x69\x40\x35\xa4\x05\x4d\xb8\x59\x10\xa3\x68\x72\x0f\x25\x8a\x14\x73\x9f\x1b\x90\xe4\xd4\x39\x76\xc5\xe0\xab\xbb\x0d\x9b\x99\x92\xe5\x74\x06\x9e\xb0\xd8\x2a\xc9\xa8\xf6\xab\x5f\xd9\xdf\x69\x3b\x9a\xa4\x0b\x41\x73\x9e\x84\xac\x81\x4a\xce\xb9\xe6\xd2\x59\x7b\xfd\xb8\x37\x21\x33\x1c\x5a\x90\x2f\x32\xca\x73\x72\xa2\x19\x23\x57\x1e\x25\xf0\x17\x57\xc6\x1e\x2d\x1b\xaa\xee\x1c\x20\x43\x4a\x73\xe1\x12\x22\x54\x04\x2e\x5c\x5e\x21\xc3\xb4\x33\x5f\xf9\xd1\xd3\xb0\x5d\xab\xe7\x24\x15\x5c\xdc\xfb\xd4\x9d\x4c\xa4\x32\xba\xb5\x3c\xbf\xb9\xd6\xb1\x36\x82\xb8\xe5\xf2\xde\xc1\x0f\x99\x14\xd3\x38\x8d\x40\x85\x99\x96\x94\x0a\x28\xef\x32\xe7\x69\x49\x33\x24\xa2\x6e\x32\x17\xb7\xd7\xd8\x9d\x4f\x67\x66\xf8\xc0\xc0\x1a\x83\xbc\xa6\x3a\x33\xfe\xa3\x7c\xc9\x5b\x87\x6b\x20\xba\xc6\x59\x13\xd0\xb2\x65\xa7\xf6\x40\x17\x90\xb6\xc6\xb9\x98\xd4\x2e\x4c\x7d\x62\x31\x1c\x62\x15\xc4\x61\x7a\xe7\xa1\x5c\x87\x15\x1b\xc0\x5c\x65\x41\x0c\x98\xba\x3c\x37\x0b\xf8\x28\x0f\x60\x78\xed\x2a\xb3\x51\xbb\x41\x56\xb8\xdb\xac\xcb\x3c\x82\x50\x36\xaf\x36\xf9\xce\x95\x4e\xec\x28\x1c\x1c\xfd\x10\x99\xcd\xa2\x8b\x0e\x7b\x6c\xa8\x48\x87\x34\xb3\x98\x73\xf3\xfd\x85\xf3\x70\xc6\x83\x50\xbb\xc8\xf7\x55\x90\xb8\x08\x69\xb3\xad\xcc\xb0\xf2\x08\x40\x1c\xfc\x98\xa5\x40\x34\xe2\x82\x91\x0f\x56\x43\x76\x9b\x77\xf3\xfd\xc5\x80\xf0\x11\x1b\xf9\xbf\x42\x53\x4f\xb5\x8c\x9c\xa2\x1b\x60\xf0\xf1\x04\xbc\x83\xa9\xc4\xc6\xa8\xb8\xef\x5f\xff\x60\x27\x69\x7f\xfd\xe3\xf0\x0f\x51\xb6\xd1\x3f\xfe\xd5\x12\x41\x65\x1b\xd4\xdf\xc6\xbe\x64\x21\xeb\xfe\x5f\x6f\x5c\x56\x6a\x97\xb3\xfa\xaf\xae\x18\x17\x13\xc6\xca\x8d\x37\x12\x6e\xe9\x79\x8a\xd8\x08\xdf\x56\xec\x6f\xde\xb0\x08\x60\x0a\x46\x9d\x84\x1a\x26\x80\x50\xfb\xa0\x0c\x21\x0d\x76\x77\x75\x67\xed\xfc\x4f\xc0\x24\x80\x41\x65\x03\x62\xa4\x84\xe3\x88\x47\xfe\x5c\x10\xe6\x6b\x75\xe2\x5a\x01\x1c\xd4\x39\xaa\x79\xde\x63\x87\xb5\x10\x0e\x21\xb8\x76\x1e\x30\xb7\x5f\x09\x69\x7e\x15\xb6\xbf\x51\x45\x9c\xce\x25\xf7\x09\xc8\xed\x49\x11\x58\xd1\x31\xa4\xc4\x1e\x2f\x48\xce\xb5\xa1\xf7\x6c\x44\x6e\x2d\x6f\x89\x6f\xc3\x10\x7a\x82\x40\x06\x4b\x96\x92\x52\x18\x9e\xc1\xaf\xd5\x38\x76\xca\x31\xcf\xb9\x9e\x10\x5d\x42\x79\xf3\x42\xb1\xa1\xe7\x62\xae\xd5\x12\x2d\xa8\xd6\x32\x08\x9b\x3d\xa3\xa8\x0b\x14\x29\x74\x05\x78\x50\xe1\xd0\x6b\xc9\x8f\xcb\xce\x53\x8a\xa4\xe2\x5c\x00\x4c\x3d\x22\x1f\x80\x59\x65\xfe\x4a\x18\xd5\x12\x67\xc0\x14\x2c\x61\x5a\x53\xb5\x18\x40\x62\x77\x1e\x92\x81\x3b\xd7\x1d\xe0\xa8\x39\x15\x98\x56\x5d\xb1\x44\x0a\x6d\x54\x99\x18\xac\xb3\x37\x56\xf2\x9e\x89\xe0\x2e\x68\x77\xb1\xee\xc0\x55\xf9\xcf\xc0\x7d\x97\x24\xc9\x8c\x8a\x69\x54\xa7\x26\xa7\x29\xc0\xfe\xdb\x20\xe5\xf8\xf5\x58\x08\xd0\x89\x15\x2c\xb8\x01\x50\x8c\x2d\x1f\x09\x66\xd8\xff\x11\x21\x1f\xcf\xa0\xb2\x93\xda\x25\xf1\x6c\x0b\xed\xea\x44\xbf\x48\x47\xa3\xde\x10\xd8\xf6\x81\x1d\xc0\x72\x66\x68\x4a\x0d\xdd\xc1\x09\xec\x7d\x55\x5c\xcf\xd7\xd7\xc7\x02\xa7\xe1\x62\xd2\xf1\x21\x2f\x6e\xc9\x82\xc7\xf1\x4f\x70\x12\x67\x1e\xf2\x10\x71\x6d\x2c\x4e\xb9\x8b\x02\xf4\xed\x02\x79\xc6\x57\x2f\xb3\xc3\xfb\xd1\x90\x5c\x54\xa5\x19\x2b\x72\xd2\xee\x1a\xaa\xa3\x05\xd6\x82\x7e\x07\x18\xdd\x55\x77\x65\x49\xdd\xbf\x6b\xa5\x08\x82\x5c\x82\x09\xc3\x15\x8b\xc3\xcd\x1c\xe8\x4a\x81\x48\xde\x00\x22\x40\x79\xca\x8c\xae\x3c\x54\x90\x0e\x5b\xe2\xe2\xf8\x9d\x53\x46\x81\x48\x3b\xc0\x3a\x7d\x6e\xb5\x2c\x84\x60\xd7\xd2\xd1\x59\x4b\xf9\x1f\x05\xae\xbb\x18\x9d\xb1\x9c\xc0\x7b\x99\x76\xb1\x53\x37\xb2\xf0\x57\x43\x54\xfe\x9b\xe8\x89\xab\x41\xa9\xc7\x06\x70\x5b\xa5\x6b\x41\x73\x48\xe4\x66\x74\xbe\xbb\x91\xaa\x92\x91\x86\x21\x95\x31\x7c\x6e\x08\x9f\x1b\xbe\x6e\x6f\xcc\xeb\xe2\x01\xe2\x9f\xd6\x9e\x20\xf5\x8f\x74\xb2\x9c\x5a\x92\x72\xdb\xd1\xdc\xd9\x88\x46\x0e\x23\x38\x9a\xef\x6e\x11\xc3\xcd\xad\x8b\x74\x60\xdc\x52\x8b\x37\xe4\x57\x35\x2e\xef\xa4\xa9\xa0\x29\xa1\xa7\xee\x89\x57\x9d\x46\x6e\x2b\x7c\xf0\x79\xbd\xf9\x69\x63\x30\x10\x2f\x56\x6b\x14\xde\x23\x38\x88\x7c\x56\x3c\x53\x60\x3c\xf3\xf1\x07\x16\xbd\x94\xcc\x32\xa6\x60\x09\x4e\x7b\x6a\xdc\xa2\x43\x2e\x53\xb4\xe9\x0e\x82\x8a\x1a\x64\x4c\xc1\x1e\x82\x30\x41\x35\xa6\x6e\xf1\x37\x5e\xcc\x15\xce\x5b\x3b\x5e\xf0\x5a\x3e\x17\x0b\x9c\xfa\x65\x04\x5a\x54\x3d\xc9\xd4\x7e\xc8\x4a\x9d\x82\x8e\x33\xbc\x3d\x0e\xcc\x16\xe6\x42\xb3\x07\xba\xd0\x80\xf7\x95\x34\x1f\xbe\xef\xb2\xaa\x55\x03\x7f\x64\x13\xec\xdd\xfa\x46\x6c\xa7\x3b\xb1\x5d\x6e\xc5\x20\x9c\x92\x8b\x36\x2e\x48\x55\x87\x8d\x85\x43\x9a\xcf\x2e\xd7\x68\xe0\xa7\x02\xd7\xe7\xdd\xee\x44\xea\x75\xca\x6f\xae\x61\x08\x2f\x93\x4f\xe1\x0f\xcf\x71\xc2\xa5\xc1\x98\x59\xac\xae\x02\xa5\x01\x43\xe2\xbe\x2b\x3c\x09\x2a\xd4\xfa\x16\xb2\xb1\x3a\x2b\x71\xa8\x34\xa6\x18\x78\x82\xc0\x17\x47\x50\x8e\x80\x8a\x85\xe3\xe4\x66\xc6\x55\x3a\x2c\xa8\x32\x0b\x54\x1f\x07\xb5\xaf\x05\xf7\xfa\x4e\x0b\xdf\xf1\x3a\xa7\x5d\xea\xe3\xb5\x10\x86\xc5\x7b\xf3\xb0\xb3\xce\xaf\x85\xeb\x53\xac\xa7\xbd\x03\xff\xca\xf5\xc4\xa9\x45\xbd\x46\xf8\x6c\xeb\x49\x63\xf2\xb1\x3f\xdf\xb0\x34\x48\xd7\xaf\x5e\x91\x0d\xc4\xa5\xab\x64\xec\x05\x1d\xb8\x3c\x28\x44\x76\xa4\x81\xd5\x43\x69\x55\x6b\x3c\x32\xec\x39\x49\xc1\xfb\xd0\xb8\x4a\x47\x62\xe1\x4c\x37\xf1\xb7\xe2\x01\xc2\x29\x21\x27\x42\x0a\x3c\x39\xd8\xf6\x14\x5d\x88\xd6\xd8\xa6\xa0\x89\x2b\x51\x57\xaf\x10\x1a\x9d\x54\xcf\x24\xb8\x48\xed\xd6\x01\xe5\x06\x1d\x49\x97\x49\xc2\x58\xd0\xaa\xe3\x12\x35\xd5\xc9\x76\x53\xf6\xa5\x2e\xb5\x84\x24\x2e\xda\xd0\x2c\xab\xb4\x59\x07\x2e\x09\x7c\xce\x5b\x00\x23\xf6\x57\x0b\xb4\x71\x8a\x3d\x14\x51\x47\xb7\x97\x52\x24\x78\x85\xcf\xcd\xc2\xcf\xe0\xb2\xc9\xea\x41\x8d\xd0\xa8\xe4\xf2\x09\xda\x9d\x22\x75\x20\x00\x13\x48\x93\x2b\xe1\x5e\xe7\x4c\x2e\x37\x83\xa5\x43\x63\x9a\xdc\x3f\x50\x95\x42\x29\xdf\x82\x1a\x8e\x69\xc1\x07\xb5\x61\x4f\xa2\x39\x40\x21\xfd\x18\x8b\x4e\x83\xd2\xa1\x59\x48\x41\x5d\x7d\x86\xd0\xd2\xc8\x9c\x1a\x9e\x80\x2a\xcb\x27\x91\x15\x31\x0f\x29\x0d\x1b\x65\x07\x81\xca\x86\x02\xf6\x77\x78\x1b\xa3\x18\x31\x0f\x92\xf0\xdc\x4a\x08\x14\x4a\x69\x4c\x42\xc4\x90\xb7\x77\x6e\x9a\xa9\x15\x83\x7e\x00\x23\x73\xd4\x0a\x95\x64\xab\x42\x69\x18\x3e\x58\x34\x83\x29\xcf\x85\xdc\x0c\x1a\x0c\xdc\xf5\xb1\x38\x6d\xe7\x1a\xa1\xea\xc0\x6e\xcf\x03\xb3\x72\x81\xde\x88\xb0\x7a\xb4\x6a\x46\x58\xd3\x56\x93\x94\xeb\x46\x61\xea\x93\x54\xc9\xa2\x70\x06\x92\xfc\xb4\x39\x23\xb8\x37\x50\x73\xa6\xa3\xda\xcb\x68\xaa\x9e\x32\x11\x8a\x87\xbb\x74\x16\x70\x72\x9b\x9f\xa8\x1d\x98\x11\x06\x84\x9e\x92\x4f\xae\xa8\x50\x40\xdc\xe0\x75\xd7\x4a\x70\x42\x6b\x8b\x93\x9d\x7a\x89\xa7\xed\xd3\x4b\x3c\xbd\xc4\xf3\xf3\x96\x78\x82\xbb\xd7\xae\xd2\x4e\xe5\xe3\xd8\x28\x48\xee\x9d\x01\xaa\x06\xeb\x8c\x18\xd7\x13\xf2\x91\x25\x72\xce\x14\x12\x39\x28\xfc\x69\x79\xf9\x5b\xca\x33\x4b\xe2\x3c\xa9\xab\xd4\x43\xc8\xa8\x5a\x37\xcd\x45\x1a\x79\x80\xa6\x43\xf3\xdc\x4d\xca\x45\xfa\xd9\xf6\xee\x92\xac\x50\x6c\xce\x65\xa9\xbd\xcb\x42\x69\xf0\x98\x69\xe3\xf8\xed\x8c\x4f\x43\x62\xee\x70\xd5\xa9\x58\x22\x55\x5a\x85\x94\x6b\x43\x4d\xa9\xeb\x71\x12\x09\x5a\xd3\x0e\x67\xa0\x09\x70\x7c\x64\xea\xbe\x1b\x25\x45\x8f\x8d\x3d\x4e\xc5\xf1\x3b\xf4\xf9\xa8\xea\x6e\x9b\xc8\x0d\xa5\x72\x81\xb1\x22\x54\x69\x58\x84\x56\x0e\x01\x3a\xc3\xba\x16\xf5\x7a\x86\x85\x5b\x86\x61\xd8\x61\xe5\x75\xd2\x22\xe3\x7a\xfc\xec\x04\x75\xb2\x47\x80\x67\xfc\xbc\x60\xc7\x93\xc6\x62\xbb\x7b\x5f\x92\x3d\x3d\x30\xc9\x3e\x5e\x98\xe4\x90\x9e\x98\x24\xf8\x73\xef\x73\x62\x3e\x7a\x4f\xf2\xc6\x99\x71\x84\x77\xd3\x99\xa9\x25\x14\x08\xe3\x70\xed\x2b\x40\xba\x6b\xcd\x70\x06\xc0\x24\x18\xfb\x03\xbb\xd3\x0a\xda\x1c\xde\x5d\xb2\xcf\x21\xeb\x6f\x24\xc7\x54\x45\xb5\x8d\x04\x0f\x84\xbc\xc0\x4c\x40\x70\xea\x86\xce\x25\xcb\x6b\x4b\xfd\x09\xee\x4f\x70\xdb\xfe\xcf\x79\x82\xd1\xe3\xb9\x8b\x43\x7e\xa3\x52\x10\x76\x77\x41\xb8\x74\xcc\x32\xf2\x63\xc9\xd4\x82\x58\x21\xa8\x72\xef\x81\xf4\xc6\x9a\xa7\xce\x41\xc6\x19\x55\xda\xcb\xec\x4f\xc8\xff\xc1\x64\x73\xf5\xd9\x4a\x80\x10\xc7\xb6\x07\x5d\x6b\x0e\x55\x0f\x55\x46\x68\x05\x08\xc6\x12\x1e\xde\x30\xd6\x64\x3e\x2b\xee\x9d\x7f\xb8\xdc\x4d\xd1\xe9\x76\xa9\x45\x76\xb9\xd8\x5a\x5a\xfc\xf9\x86\x05\x22\x20\xc2\x2f\xf5\x6a\x52\xc1\x14\x41\xee\xd9\x62\xe0\xee\xc1\x5d\xf6\x76\xdf\x18\xdd\x39\xea\x29\x45\xdb\xa6\xaa\x58\x05\xa0\x1d\x28\xe4\x6e\xd6\x03\x7c\xda\x27\xa1\xac\xf7\xf2\x40\xe8\x4a\x88\x77\x26\xe1\x9d\x92\x55\xc6\xcf\xba\xc4\x95\x88\x13\x90\x81\xcf\xfb\x35\x07\x34\x00\x5f\x6e\xa0\x16\x5d\x37\x91\xec\xae\x02\xe3\xe3\x01\xbb\xf7\x52\x03\x9a\xd6\x1c\x73\xef\xd9\xe2\x58\xbb\xa8\x41\x29\xf4\x8c\x17\x3e\x3f\x3c\x50\x02\x87\xb9\xe4\x7b\xf0\x0f\xf0\x43\xe0\x99\xbf\x16\x03\xf2\x41\x1a\xfb\xbf\x2b\x70\x15\x42\x4b\xa5\x64\xfa\x83\x34\xf0\xe6\xc9\x81\x85\xd3\xdd\x1b\x54\xce\x4c\xc9\xc1\xcc\x88\x2e\x6d\x10\x9f\xe1\x5d\x50\x00\x24\xee\xbe\x35\x80\x95\x6b\x72\x2d\x88\x54\x1e\x26\xc6\x27\x0f\xd6\x6e\x08\x6f\x5b\x8a\x2c\xc2\x2b\xc6\x70\xa0\x94\xaa\x06\xc9\x0d\xc3\x05\xe3\x32\xf7\xbf\x80\xed\x09\xac\xf1\xc1\x6f\x06\x52\xe0\x52\xc3\xa6\x3c\x21\x39\x53\x53\x88\x0f\x4d\x66\xbb\x6f\x50\x77\xba\x8d\xcf\x4e\xd4\x3b\xfe\x70\x67\xcc\x00\x56\xf7\x0e\x3c\x97\xf6\x65\x98\x38\x0a\xb2\x88\x9c\x16\x16\x29\xfe\x61\x39\x01\xec\xcb\xbf\x20\x65\xb5\x1e\x91\x73\x5f\xf0\x34\xfe\xcd\x59\x31\xe2\x61\xec\x08\x56\xa6\xff\xb1\xe4\x73\x9a\x31\xf4\xe7\xa3\x22\xa4\xf1\x94\x93\x25\x36\x3d\x70\x79\xab\x2d\x95\x0a\x37\x43\x47\xf7\x6c\x71\x34\x58\x42\xa4\xa3\x6b\x71\x54\x05\x69\xd7\x50\x27\x30\x34\xb8\x34\x38\x82\xdf\x8e\x0e\xcd\xd9\x9f\x49\xb4\xdf\x01\x4b\x9c\x41\xe8\x22\xa3\x5a\x77\x8b\x6f\x6d\x84\x16\x35\xc6\x59\x95\x80\xf1\x36\x6a\x53\x05\x17\x39\xef\xcd\x83\xdb\xb3\xc0\xcb\xbf\xbb\xa7\x51\x27\xe8\xcd\x5d\xf5\x94\xf6\x89\x1b\x56\x26\x14\x83\xb4\x05\x3e\x86\xa3\x16\x17\x57\x5d\xc6\xae\x81\xd7\xf7\x60\x57\x94\x93\xb8\xc8\x33\xd7\xa0\x06\x73\x1f\xd5\x21\xa4\x21\x5c\x24\x59\xe9\x4c\x8a\xd0\x15\x94\xe8\xae\xa2\xfe\x0e\xc0\xd9\x03\xa9\xaa\x01\x3c\x36\xf9\x6b\xdf\x25\x07\xde\xe6\x0d\x1d\xdc\x89\x86\x1b\x2f\x84\xd5\xa1\xd7\x3a\xd9\xe2\x2e\x59\x4f\xc6\x99\xd4\x65\x8f\xb7\x7c\xac\x18\xb9\x98\x51\x21\x58\x16\x45\xbb\x3a\x63\x47\x28\x67\x05\x02\x89\x2b\x62\x75\x5c\xaf\x62\xe5\xe9\x9b\x08\xb1\xd5\x07\xaf\x1d\xfc\x53\x2a\x2a\x75\xb0\x3a\xe5\x2e\x55\xe3\x4c\x3e\x90\x54\x92\x07\xa8\x5b\x30\xb7\x4c\x0b\x2e\x65\xb5\x67\x77\xd1\x4c\xc1\x45\x22\x91\x79\xa1\x64\xce\xb5\x77\x8e\x77\xdb\x78\xd0\xd0\xd0\xac\x6c\x91\x03\xa8\xbe\x07\x59\x29\xea\x29\xe1\xdf\x5e\x10\x43\xd5\x94\x19\x3b\x1a\x11\x65\x3e\x66\xad\xe3\x57\x1f\x23\x07\xd9\x97\x54\x42\xf4\xb0\x45\xb0\x70\x1b\x7e\xf8\xe1\x43\xe7\xd2\xbb\x55\xcf\x75\x7b\xfb\x20\x55\x96\x3e\xf0\x14\x59\xb4\x26\x27\xb6\xf1\xe9\xcb\xaf\x94\xfb\xf0\xc0\xd3\xce\xe0\x80\x4e\x75\x30\x78\x3f\x28\x0b\x06\x02\x70\x70\x15\x9e\x38\xa4\xd1\x86\x1e\xa7\xe4\x8a\x63\x74\x11\xf4\x87\x44\x35\xf9\x98\x8b\x2a\xc2\xac\x02\xb3\x25\xc6\xf6\xbc\x78\xd5\x44\x33\x83\x71\x21\x10\x5a\x21\xcd\x8c\x68\x9e\x97\x99\xa1\x82\xc9\x52\x67\x8b\xd6\xa8\xf2\x3c\xa0\x9e\x64\xec\x33\x62\x76\x17\x26\x17\x3a\xd5\x99\x1d\xb8\xae\x54\x61\x94\x4b\xdc\xae\x72\xae\x4a\xcf\x02\xe7\x0b\xe1\x46\xec\x33\x4b\x9c\x57\x70\x91\x95\x53\xbe\x25\xfc\xe1\x67\x96\xd5\xbc\x4a\x20\x5d\x6a\x56\x45\xea\xb7\xad\xeb\xf2\x44\x49\xc8\x9f\x97\xc3\xdf\xad\x4e\x40\x9e\xb2\x82\x89\x14\x52\xa2\xbd\xad\x30\x17\x27\x7f\x50\xc8\xb9\xf4\x62\x5d\xa9\x96\xcf\x4a\x56\xa3\xe0\x91\x0b\xd7\x4c\x66\xa9\x26\xec\xb3\x51\xd4\x12\xa6\xdc\x92\xa0\xd0\x67\x42\xa8\x68\x4f\x64\x5e\x46\x8a\x60\x72\x70\x6e\xff\xb8\xf5\x32\x5f\x62\xc9\xcb\x6a\xed\x7a\x63\xc1\xea\xfd\x52\xd7\x23\x21\x76\x67\x45\xd7\x3d\x84\x57\xa4\x98\x77\x5f\xa9\x7b\x26\xee\x97\x6a\x5e\xaf\x48\xaa\xdd\x98\x55\x5f\xa6\xf3\x8b\xc8\x3b\x3f\x81\xc0\xe0\x2e\x49\x98\x5c\x8f\x86\x46\xed\x5e\x36\x0b\x42\x6f\xd0\xa0\x1d\xde\x46\x7c\x00\x32\x9e\xba\x81\x5c\x58\x13\xd1\x16\x96\x95\xeb\x5c\x29\xc4\x36\x2a\xf6\x18\x59\xc4\xa9\xa1\x9a\x99\x76\xd6\x94\xba\xe8\x50\xf5\xb4\x07\x30\xc6\x2f\xf7\x13\x66\xb1\x07\x87\x74\x1f\x2c\x4b\x86\x7f\x74\x52\x86\xa8\xb5\xb4\xf2\x85\x87\x8f\x4f\xd2\xc4\xc2\x2d\x32\x8e\x91\xda\x5d\x49\xa8\x69\x5d\x72\xa7\x15\x5f\x70\x33\xf8\xf4\xa9\x73\x2d\xd7\xa8\xa7\x97\x43\xe0\xdf\x75\x20\x38\x5c\x80\x44\x3e\xfc\xc7\x32\x56\x07\x20\xb9\x45\x58\xb6\x6b\x7f\xa8\xb5\x4d\x13\x56\x19\xaf\x2e\xb9\xbe\xef\x92\x8c\x6c\xa9\x73\xfd\x48\x7c\x73\x71\x45\xdc\xdb\x56\xf6\xa5\x2e\x06\xa6\x7d\x33\x63\x4d\x13\x56\x19\x6d\x53\xae\xef\x9f\xbc\xac\x7a\x91\x7e\xd8\xe6\x01\xfe\x74\xf6\xaf\xa6\xd4\xeb\x53\xb4\x44\xb9\x83\x16\xb2\x24\x0f\x2e\xf5\x81\x93\x9a\xef\x78\xf1\x86\x5c\x09\x5d\x2a\x56\xdd\xdc\x36\x87\xb2\x5c\xf7\x25\x95\x5e\xdf\x0b\x4b\x5e\xb2\xf1\xad\xa0\xca\x80\x78\xdc\x15\x0d\x42\x47\x4f\x9f\xa2\x17\xa2\x0d\x1e\x5c\x4f\xbc\x63\xdd\xc0\xc5\x78\x87\xc4\x65\xbe\x91\xdd\xf9\x28\xad\x49\xbc\xd7\x6f\x43\xca\x1f\x72\x96\xb2\xf9\x99\x4e\xe9\xeb\x01\x7c\xc6\x3b\x3c\xd7\xe7\x44\x35\x39\x7a\x7d\x34\x22\xb7\x3c\xe7\x19\x55\xd9\xa2\x96\x8a\xb9\x6a\x67\x99\x85\x1f\x10\x6e\xe5\x5e\x1d\x91\x13\xa9\x60\xe4\x84\x0a\x92\x31\x1f\xd1\xe4\xce\xd9\x02\x65\xc7\xd3\xa7\x26\x2e\xe4\x51\xed\x97\x48\x67\x3a\xe3\x44\xea\x39\xb6\xe3\x47\xb5\x74\x36\x97\x15\x49\xe7\xc2\xd2\xf9\x11\xf9\xb4\xaa\x50\x39\x1c\x19\xdf\xe2\xb9\x80\xfa\x34\x7a\xdf\x4e\x1a\xdc\xb2\x39\xf8\xf9\xc0\xb4\x5d\x4b\x9c\x72\xf3\x91\x15\xb2\x93\x84\x80\x5d\x1a\xf6\x38\x6e\xec\x0b\xa9\x39\x24\x2a\xa5\x06\xca\x02\x2b\xc3\x93\x32\xa3\x56\xac\x46\x6b\xdc\x88\x5c\x5e\xdd\x7c\xbc\xba\x38\xbf\xbb\xba\x7c\x43\xbe\x71\x23\xf1\x58\xc2\x1b\x91\xbb\x38\x1b\x54\xe4\xd1\xeb\x52\xee\x84\x6f\x0d\x1c\x19\xa2\xa2\x4a\xee\x08\x39\x3e\xa8\x20\xd7\x82\x9b\x2a\x3d\x32\xfa\x9d\x65\x52\x30\x5f\x3d\xb4\x90\xce\x1a\x38\xe5\xe8\x0d\x22\xdc\x60\xf6\xe7\xfa\x68\x70\x3a\x30\xd5\x6a\x98\xca\x16\x45\xf0\x11\x44\x8b\x0a\xb8\x87\x12\xff\x7d\xfe\xd3\xae\xb2\x6f\xc8\x46\xeb\x03\x9c\xd0\xfa\x5f\xbd\x47\x66\x10\x12\xb3\xfb\x74\x37\x2b\x4a\x5a\x13\xcb\x66\x8e\x47\xc7\x5e\xa0\xc8\x96\x92\xf0\x87\x41\xe3\x8c\x5e\x75\x64\x1b\x11\xf2\x9d\x77\xd9\x86\xd0\xe3\xd5\xf9\xfc\x31\x3b\x44\x94\x15\xbe\x81\xb2\x3e\x30\xa6\x1c\xc7\x1f\x75\x29\xc0\xa6\x7c\xce\x04\x2e\xec\xb0\x14\xca\x7f\xbe\x73\x75\xb4\x6a\xde\x4e\xff\xf8\xf8\xee\xb0\x33\xc3\xf3\xd7\x79\x5e\xee\xd8\xba\x59\x25\x32\xcf\x31\x5f\xd4\x2c\x04\x18\x56\x31\x82\x81\x2a\x1c\x4c\xf3\xc1\xcc\x57\x93\x2d\xc8\xdf\xa0\x67\xbe\x53\x43\xd3\x09\xaf\x5d\x50\x82\xa8\xc4\xdc\xee\x79\x98\x5d\x92\x35\xed\x93\xa7\x38\xd2\x7e\x16\x3e\x7e\xf6\xf1\xea\xfc\xf2\xfd\xd5\x28\x4f\x9f\x9c\xb4\x30\x91\x16\x92\x0b\xa3\xb7\xeb\x37\xdb\xaa\xce\xb4\x27\x3f\xe1\xa3\x5d\xb9\x73\xe8\xe8\x71\xcc\xbf\x88\xf2\xd2\xa5\xcc\x50\x9e\xe9\x68\x0f\x8d\x2c\x64\x26\xa7\xab\xd3\x2f\x77\xd8\x9c\x5f\x60\x7e\x99\x21\x1d\xda\x5d\x3f\xac\xa8\xdf\xa6\x8e\x46\x53\xca\xaf\x2a\x62\x57\x6b\x0d\x52\x33\x94\xbb\x78\xa1\xcb\x7d\x14\xe1\x6c\x09\x06\xa8\x48\xc2\x01\xf6\x29\xfb\xaa\x1c\x78\x51\x0d\x9b\xb6\x52\xdb\x63\x83\x6e\xbb\xc0\x66\xe9\xcf\xf6\x42\x45\x75\x98\xf9\x3e\x75\x02\x57\x28\x36\x0c\xe9\x9a\xa0\xb4\x8a\x54\x11\xc3\x8d\xe9\x9d\xb7\xde\x78\x5b\x0f\xb6\xca\x16\x4d\x2b\x4e\x25\x1f\x05\xd3\x17\xe6\x18\xc8\xb2\x45\x95\x06\xd2\x69\xd1\x74\x8a\x69\x98\x94\x33\x13\x17\x8a\xcf\x79\xc6\xa6\x90\x8a\x95\x8b\x69\x14\xfe\x1a\x07\xcc\xba\xd4\xac\x75\xa3\xeb\x7b\xfb\x57\x94\x74\x1b\xf0\xe2\xc3\x77\x77\x90\xd5\x17\x2e\xb8\xf6\x16\xc2\xed\x07\xe1\xbc\x0d\x87\x43\x30\x19\x9c\xfc\xcd\xca\x93\x69\x76\x4a\x7e\x60\xee\x3b\x12\xd2\x0e\x2b\x28\x05\x34\x93\x21\x07\x2c\xcc\xb5\x82\x2c\xa0\x23\x5e\xef\xbb\x56\x67\xb6\xa5\x95\x95\x90\xd5\xd4\xda\x43\xe5\x53\x4c\xdd\x88\x77\x4c\x4f\x2f\x7b\x1e\x90\xec\xef\x4c\xe5\xbc\x69\x75\x15\x7e\x86\x8b\x1f\x4f\x0f\x29\xd1\x8b\x3c\xe3\xe2\xbe\xca\x0b\x36\x91\x16\x87\x30\x34\x81\x8b\x7b\x8f\xb1\x8a\xd1\x6c\x3d\xa5\xdc\x05\x3f\x0e\x4a\x25\xcd\x0e\x16\x40\xb0\xd0\xd9\x73\xf6\x27\x7f\xec\xdd\x35\x74\x4c\xe2\x8e\x8e\x5e\xdc\x7a\xb9\xee\x56\x06\xff\x18\x3a\xd4\x68\x9a\x20\xd7\xb7\x17\xb7\xd7\x4f\x6a\xa1\x5e\xc7\x12\x60\x76\xcf\x28\xd5\xf1\x1f\xb7\xdd\x0e\x0f\x49\x56\x6e\x6f\x83\xea\xdd\x8d\x54\x86\x66\x07\x22\x02\xc9\x8c\x16\xe7\xa5\x99\x5d\x72\x0d\x39\x14\xba\x0a\x01\x4b\xfd\x23\x4f\x67\xcc\xdd\xec\x13\x06\x72\x8f\x0e\xae\xdd\xc5\x9f\xce\x6f\x08\x2d\xed\xfe\x1a\x97\x5c\xf4\xa0\x17\xee\x7e\x66\xb7\x18\x61\xb0\xe3\xba\x5c\xef\x2d\xab\xf2\xad\x1e\x7b\x4d\x8f\xe1\x87\xdb\xdf\x45\x00\x0d\x45\x0a\xf6\x82\xef\x1f\xb8\xe0\x86\x53\x23\x5b\x16\x2a\xab\xa1\x40\xad\x6f\x30\x08\x94\xda\xc8\xdc\x61\xf0\xb5\x6f\x01\x57\xc8\xc0\xc5\x97\x3a\x55\xd6\x02\x90\xde\x01\x62\xd7\xc2\xca\xda\x34\x61\x0d\x07\xc8\x01\x24\xfd\xc4\xb1\x79\x68\xf3\x07\x67\xa0\x82\xfc\x60\xd9\x1f\xdf\xd4\x52\xb1\x2f\xd5\xb5\xf0\x56\x8a\xaa\x68\xc2\x41\x2d\x3e\xfc\xc7\xae\x44\x81\xff\x28\x1a\x96\x36\x5c\xe0\x7f\x95\x34\x43\xc0\x7c\x38\xb4\x59\xaa\x0e\xe4\xae\xf3\xad\xef\x90\x9b\x7a\xb5\x1d\x1f\x82\x96\x5e\x6a\xcc\x3c\x86\xeb\x31\x8a\x0a\x6d\xf7\xa8\xae\x8b\x1d\xbb\x8b\xa7\x63\x72\x62\x92\xa2\x75\xed\xfe\x47\x72\x6d\xcf\x4a\x51\x2b\xe4\x0c\x33\xbf\xc3\x6d\x79\x17\x5c\xdb\xdb\x4e\xf2\x51\xae\x86\x00\xcb\xbb\x5a\x55\x5c\xaf\xb0\x5b\xf1\xba\x90\xf5\x93\x77\x5c\x1b\x5f\x90\x01\x5e\x70\xed\xf2\x08\x83\xdc\x75\x63\x15\x39\x5e\xfc\x2f\x4d\x53\xf5\x06\xb9\x94\xaf\xbe\xac\x40\xfa\xf2\x49\xbe\xa8\x08\x77\x89\x27\x66\x51\xb8\x04\x80\x77\x17\x37\x04\x0b\xa4\xfc\xfe\xb7\x58\xf9\xf5\xdf\x7f\xfd\xdb\x57\xad\xb7\xfb\xf9\x9c\xc7\x77\xb4\x63\x1c\xfc\x8e\xe9\x45\xf8\x0d\xd6\xfc\x03\xed\x4a\x40\x36\xb9\x45\x77\x3c\x4b\x59\xdd\x51\x47\xc4\xb2\xbb\x1c\xe8\xfd\x6e\x12\x4c\xef\x67\xf7\xac\x7e\x76\x24\x44\x94\x20\x91\xe8\x88\x2e\x71\x57\x08\x31\x5c\x26\x3b\x48\x71\x6e\x5e\x1e\xc5\xd9\x0a\x9b\xed\x58\x54\xc7\x9e\xf8\x32\xde\x97\xbf\xa9\x5c\xd8\x2f\x3f\xdc\xfe\xef\xbb\xf3\xaf\xaf\xde\xc1\x4c\xdd\xfd\xbd\x45\x0d\x2e\x76\xf6\x9f\x6a\x8f\x6a\x6d\x94\xd7\xed\x00\xe9\x76\x2d\x23\x1a\x17\x32\x82\x7c\x78\x7b\xdb\xf5\x2e\x66\x5f\x01\x5d\x4c\x5a\xad\xfd\x69\xad\x6d\x50\xd5\x84\xa9\xc3\xc5\x8f\xec\x6c\x94\x8b\x12\x69\xd5\xf4\x2f\xbb\x53\x38\xc3\xbd\x55\xa4\xad\x3b\x40\x5e\xc0\xbd\x83\x5d\x2f\xc2\xe0\xe0\x37\x0e\x8f\x04\xab\xb6\x72\x80\xea\x1e\x58\x74\x8c\xbd\xbc\x08\x60\x0f\x29\xd2\x36\x65\x69\xb6\xa5\xd6\x4c\x87\xea\x0b\x2f\x14\x53\x8a\x55\xe9\x99\xbb\x50\xaf\x95\x03\xd4\xca\x95\xd5\xee\x62\x6a\xb1\x14\xeb\xd2\x99\x7b\x0f\x05\xea\x94\x57\x5d\xd0\xe4\xa0\x05\x55\xaa\x57\xf8\x06\x82\xdc\x9f\x9e\x00\xc2\x67\x0f\xe8\x48\x1b\xc6\xeb\x8a\xc8\xa1\x63\x33\x4a\xae\xd3\x0e\xf9\x42\x1f\x85\xf4\x11\x88\x71\x38\xdd\x33\x6f\x1f\x79\x5a\x6d\xe7\x87\x1d\x15\x9d\x43\x2b\x39\xc5\x4c\x1a\x29\x76\xf6\x92\x5f\xd5\xbd\x7e\xa0\x6f\xa0\xc5\x45\x55\xc6\x26\xaa\xf1\x08\x1e\x94\xe1\x32\xc2\xca\x73\x9e\x5d\x48\xe1\xaf\x25\xea\x97\x12\x4f\x2e\x82\xa4\xd7\x97\x07\x3a\x7c\x5f\x6e\x88\x67\x57\x63\xf0\x41\x9d\x41\xd2\xce\x31\x29\xb6\x8b\x87\xd8\xf5\xa5\x13\xcd\x7c\xc0\x89\x76\x08\x49\xd6\x63\xe4\xc1\x58\xa7\x54\xe6\x41\xaa\xee\xa1\xde\xf5\x8e\x0d\x5f\x05\xf7\xdb\x52\x28\xd6\x4b\x3c\x3d\x38\xc7\x67\x3e\x41\xb7\x70\x82\x1a\x09\xce\xd7\x9d\xa4\xc7\x38\x48\xcf\x7b\x80\xf6\x65\x54\x8f\x1b\xe5\x7b\x50\x21\xdd\xa3\x5b\xc7\xa5\xfa\x6e\xce\x98\x60\x37\xa9\xa2\x16\x14\x4c\x2e\xd1\x89\x3b\x18\x75\x50\x12\x4b\x50\x76\x21\x0c\xbe\x0f\x1a\x70\x31\xd1\x73\x96\x59\xa8\x4a\x11\xa7\x88\x76\x61\xbc\x03\x82\x59\x96\x73\x5a\xf8\x9a\xdc\xf2\x41\x3c\x50\x95\x92\xf3\x9b\xeb\xc3\x50\x83\x0e\x7e\xd6\x88\x49\xed\x32\x7a\xd5\x3d\xad\xab\x9e\x58\xe6\x66\xc6\xa0\xb6\x22\x19\x73\xa3\xab\x9a\x7e\xcc\xc4\x7a\xa5\xa5\x82\xe1\x2e\xcb\x9e\x65\x7b\x6e\xdd\x48\x11\xc3\x14\x44\x26\x86\x66\xbe\x88\x80\x2b\x93\xf3\xea\xd5\x2b\x34\x85\xbd\xfa\xdd\xef\x7e\x87\x95\x95\x52\x96\xf0\x7c\xb9\x21\xb4\xfa\x3f\xaf\x5f\x8f\xc8\x7f\x9f\xbf\x7f\x07\x95\x1f\x0b\xa3\x31\x2b\x09\x8e\x8c\x95\xe0\xa3\xce\x7a\x40\xfe\xef\xed\x77\x1f\xaa\x32\x31\xf5\x5f\x5d\x41\x6d\xb7\xbc\x11\xb9\x8c\xfc\x9f\x62\x43\x17\x35\x33\x57\xd0\xc8\x10\x3a\x99\x20\x62\x8c\x7d\x39\x5d\x3c\x70\x3e\x7a\x1c\xaa\x82\x63\xfd\x11\x8b\x12\x19\x38\x66\x59\x95\x1c\x4d\x83\x3e\xb3\x01\xfa\x99\xc1\x58\x81\x4c\xc2\x54\x06\x58\x4b\x7e\xa2\xa1\x0a\x49\x95\xfe\x4f\x31\x6d\x85\x52\x57\x5d\x11\x07\xab\x76\x46\xb3\xd6\xb9\x1e\x1e\xe3\x06\xa8\x75\x75\x8c\xba\xe9\xde\x9d\x21\x9f\xbe\xd5\xe5\x2e\xae\xca\xd4\xff\x0d\x6f\x43\xb7\x39\x09\x3f\xd2\x8d\x4c\x6d\xae\x37\x61\x36\xb8\x75\x2e\x4b\x40\x45\x27\x68\x26\xa1\x92\x57\xd8\xe9\x8a\x8b\x45\x45\xef\xb7\x2f\xa5\x73\xf2\xc5\xae\x09\x78\x91\x50\xbd\xa7\xad\xcb\xf9\xd4\xfd\x45\x7c\xef\x5a\x5e\x05\x3a\x96\xa5\xf1\x77\xd8\xee\x77\x08\xc0\xc6\x2a\xeb\x1d\xd2\x48\xee\x90\x79\x72\x97\x0c\xc4\x9d\x93\x98\xd6\xef\x9b\x81\x27\xd4\x45\x89\x01\x61\x34\x99\x91\x7b\xb6\x18\x22\xdd\x2a\x28\x44\xf3\x00\x54\x2e\x2d\x2c\x6a\x85\x4f\xaa\xda\x35\x56\x3e\x76\x20\xf3\x8e\x01\x11\xf7\xf1\xd1\x40\x5e\x08\xd5\x4e\x5e\x72\x69\x44\x45\x64\x29\xf0\xb9\xaa\xa3\x7a\xc4\x21\x6f\x28\x16\x23\xaf\x07\xa9\xd8\xf3\xc6\x52\xdb\x4d\x6f\xfa\x72\xe5\x0d\x61\xe9\xa0\xe3\x6e\xa5\x58\xea\xed\x8a\x6f\x3b\xe1\x0f\x3e\x48\x7d\x76\xe6\xc8\xa3\x02\xca\xf9\xb9\x4a\x4e\xae\xad\x87\x52\x00\x44\x2d\x88\x46\x33\x53\x3a\xd0\x60\xbd\xb0\x52\x64\x4c\x6b\xc2\x61\x85\x39\x55\xf7\xcc\x27\x8c\xa1\xd9\x88\xdc\xd8\x49\x86\xfc\x55\x98\x16\x79\x8e\x2e\x76\xf6\xcc\xc6\xd1\x41\xf6\x23\xc7\xa3\xd1\x31\x12\xf8\x15\xb1\x42\x1d\xf0\x63\xb7\x9c\xba\x3b\xe4\xd2\x6d\x94\xf6\x2e\x34\x66\x06\xb6\x22\x1f\x64\xbe\x96\x10\x05\x67\x66\x9e\x81\xd1\xd6\x49\x94\x96\x97\xb3\x43\x02\xd8\x5d\xf3\x96\xef\x92\xb5\xbc\xd5\xbd\x45\xfd\xd9\x3d\x5b\xf9\x4e\xb9\xca\xd7\x65\x2a\x77\x3b\xe5\x4e\x5b\xf7\x1c\xce\x7b\xa4\xd8\xce\x3b\xa5\x79\xf5\x4f\xdd\x48\x09\x72\x47\x2d\x4b\x4f\x2b\x19\xd1\x25\x7d\xca\xd8\x17\x25\x14\x5e\x4f\x56\x55\x9d\xf3\xc1\x82\x91\xbc\xec\x69\xa8\x85\xc0\xf3\x4b\x83\xdd\x6a\xb9\x90\xce\xe2\x61\xf3\xe9\x22\x2e\x36\x9f\x76\x97\x81\xcd\xa7\xae\xb0\x45\x61\x49\x81\xe8\xc7\x5e\xfc\x00\x52\x23\x21\x67\x77\x75\x04\x47\xe4\xbd\x63\x0a\x88\x8c\x74\xac\x65\x56\x9a\x10\xc9\xb4\x82\x63\xc0\xa0\x3e\xc3\x37\x86\x94\xfa\x66\x11\xff\x00\xce\x89\x64\xb9\x2b\x2b\xc1\x67\xa7\x23\xde\xb5\xe6\xde\x4f\xd6\x99\x64\x0f\x18\x7a\x51\x62\x67\x38\xfa\x01\x42\xde\x09\xef\x4b\x5d\x93\x71\xc0\x93\xc4\x68\x14\xa0\xbc\xb8\xe2\x0a\x3d\x75\x5e\x62\x3b\xab\x8d\x9b\xab\x33\x4c\x9c\xdf\x5c\xef\xa4\x01\x44\xfd\xd7\xe8\x00\x71\x8b\x9f\xb0\x16\x70\x8d\x5a\x40\x5c\x76\xe7\xb2\x5a\xb9\x33\x29\x5b\xb2\xf3\xe2\xc5\xc8\xa5\x69\xbf\xb5\xc4\x32\x76\x3a\xad\xe7\xd0\x43\x63\x4f\x45\x56\xa3\xbc\x7b\xfe\xd6\x11\x0e\xf1\x4b\x17\x39\x9f\x50\x7c\x04\x78\x74\x2a\x97\xee\x9f\xe5\x6a\x76\xb0\x58\x72\x0b\xa5\x6d\x50\x1f\x8c\x14\xcb\x42\xa6\x6f\x5c\x29\x69\x21\x24\x16\x90\xd3\x03\xac\x8d\xa3\x07\xa8\x30\x5a\x29\x22\xba\x2b\x56\x91\xc9\x7d\x67\xb9\x61\xa7\x2a\x47\xfb\xd4\x39\xb2\x1b\x08\x2b\xbf\xe9\xba\x8b\x64\xcf\xb2\x45\x24\x62\x4d\xbb\x15\x42\xa9\xed\xa9\x1b\x29\xd4\x79\x4f\x66\x2c\xa7\x98\xc3\xcf\x2f\xcf\x52\x99\x07\xc5\x8d\x61\x98\x4b\x89\xa9\x5c\x13\x39\x19\xd4\xee\x0c\x8e\xe6\xaf\x8f\x76\x29\x07\xb3\x67\xc5\x1e\x52\xed\xc2\x01\x80\x71\x53\x13\xd9\x2c\x5e\x83\x2e\x91\x41\xe2\x4d\xd1\x30\x48\x58\x06\x33\x47\xe8\x3d\xf9\xc2\x0f\xa1\x47\xed\xaa\x3f\x0d\x82\xc0\xd0\xeb\x4f\xbd\xfe\x74\x10\xfd\x29\x62\x2c\x9e\xe0\xac\xd0\xa5\x62\x87\x61\xaf\x50\x55\x81\x4c\x51\x02\x1e\x8b\x9a\x5e\x95\x92\xaa\x6e\x71\xb3\xfa\xd0\xb1\x57\xb0\x1c\x1e\x97\x66\x32\xfc\x3d\x61\x22\x91\x29\x6e\xbe\x1d\x5f\x69\x03\xa2\x4d\xa5\x93\xc4\x73\xc9\xfd\xb7\x62\xab\x1d\x8c\xbd\xeb\xd6\xed\x44\x07\xfc\x55\xe0\xdb\x03\x31\xf8\x8a\xad\x87\x60\x62\x5f\x2b\xdb\xe7\x1a\x70\xfc\xbd\xba\x84\xc4\xb2\xd2\x80\xdc\xbe\x62\x2e\x39\xc1\x97\xa3\xa4\x28\x07\xae\xc1\x28\x67\xb9\x54\x8b\x41\x68\x64\x7f\xac\xf5\x72\x2d\x4e\x41\x26\x48\x4a\x65\x35\xc0\x6c\xf1\xa5\x4a\x07\x1e\x40\x4f\x2c\x1c\x84\x7d\xea\x56\x34\x28\x7e\xea\x28\x51\x25\x15\x03\xfd\xbe\x2a\xa2\x34\x09\x29\x0f\xf5\xa0\x52\x3b\xed\x5b\x26\xe6\x64\x4e\x55\x87\x2a\xe8\xf1\xb3\xa7\x3c\x90\xf2\x39\xd7\xbb\xd5\x3b\x6c\x2c\xfd\xd6\x31\x0d\xb4\xeb\xc8\xd2\x14\xa5\x71\x94\xd2\x9f\x0a\x1f\x32\x1f\x4e\x43\x43\x28\x7a\x7d\xb4\xd3\x34\xbe\x98\xfa\xc2\xf8\xec\x58\x65\x18\x9f\x7d\x6b\x0d\xd7\x47\xd9\x19\x6d\x0e\x5a\x39\xdc\x3f\x1e\x2d\x0e\x71\x0e\x2b\x16\x59\xe5\x79\xf0\xc2\xe9\x13\x1d\x34\x74\x37\xd9\xc9\x6e\xe3\x32\xd4\xaf\x36\xd9\xb8\x1f\x7f\xc2\xd6\x9a\xc3\xde\xd9\xba\xf8\xc2\x9f\xf9\x85\xed\xad\xab\x67\xd0\xdf\xd6\xb6\x42\xc1\xfe\xb6\xb6\xbf\xad\xed\x6f\x6b\x7b\x6b\x43\x6f\x6d\xe8\x6f\x6b\x49\x7f\x5b\x7b\x10\x18\x1e\xee\xb6\x16\x45\xbd\x55\x77\xb6\x4e\xd8\xab\x2e\x6c\x9f\xf4\xbe\xd6\x15\xee\x39\x4f\x12\x59\x0a\x73\x27\xef\x59\xeb\x4b\x87\x86\xfc\xbf\x34\x0e\x24\x40\x58\xa3\x0f\x2c\x37\x7e\x32\xe5\xa0\xbb\x54\xd2\x49\xb6\xd8\x45\xaa\xa0\x65\xca\xad\xe4\xbf\x33\x9a\xf9\x01\xe2\xe4\x44\x22\x65\x69\xf5\x83\x3b\xca\xc6\xc2\x7a\x44\xce\x89\x62\x09\x2f\xb8\x2b\x23\x4f\xf1\x3d\x22\x5e\xa8\x8d\xc0\x8d\x66\xd9\xc4\xe5\xa8\x17\x71\xad\x9f\x4a\x7e\x77\x74\x70\xe5\x67\x90\x43\x49\x9f\xc9\xdc\xd7\x42\x52\xec\x6f\x9e\xb5\xb9\xd9\xdc\xc5\x23\xc4\xe6\x15\x58\x4a\xad\xc4\x10\x7c\xac\xe0\x2e\xc0\xfa\xb1\x8f\x3f\xfb\x5c\x70\x05\xc8\x7b\xcb\x12\x29\xda\xd4\x54\x5d\xb3\x41\x4b\x23\x55\xfc\x09\x6c\xa3\x2c\x25\x69\xa9\x42\xcd\xd4\x39\xcd\x78\xca\xcd\x22\xdc\xda\xb9\xf2\x5a\x14\x4f\x4c\xd8\x46\x5d\x81\x91\xd0\xa2\x50\x92\x26\x33\xa6\xa3\xaf\xa1\x80\xe2\x82\xc8\x82\xef\x3b\x96\x80\x03\x19\x05\xfa\x58\x06\x99\x2d\x88\x92\xc6\x5f\xbc\xaf\xf9\xe0\x5d\x34\x18\x74\x47\x2e\x67\xd4\x02\x6e\xe7\x65\x3c\x04\xce\x8a\x4f\xe2\x3f\x34\x91\x59\xea\x53\x98\xfc\xfe\x95\x15\x0a\x13\x87\x83\x96\xf8\x41\x82\x0b\x23\x49\x66\x19\xb6\x25\x88\xeb\x3b\xff\xfa\x37\x64\x26\x4b\xa5\x47\x71\xd2\x81\xd7\xf0\x0e\xf5\x3b\x2f\x54\x1a\x92\x31\xaa\x0d\x79\xfd\x8a\xe4\x5c\x94\x96\x4f\x75\x46\x9b\xee\x72\x50\x24\x01\xfd\xf6\x37\xad\xfb\x75\x95\x7d\xd6\x4a\x3d\x05\xe6\x46\x76\xa2\x8f\x3b\x49\x18\x18\x87\x99\xc5\x1b\x82\x90\x23\xba\x31\xb4\x85\x91\x8f\x70\xbe\x7e\x2c\xe5\x78\x61\xba\x04\x51\xba\x1e\xf5\xe8\xc9\xff\x72\x2f\xdb\x24\x4f\xa9\x72\xa7\x6c\xfc\xe8\xa3\x54\xb8\x98\x72\x6d\xb6\xd4\xb7\xa8\xe2\x2b\x37\x36\x6b\xcf\x56\xa6\x56\x3b\xe8\x18\x2b\x03\x7d\xbc\x44\xec\x6d\x4b\x49\xc2\xb0\x98\xe5\x65\x55\x29\x49\x48\x6c\xbb\x75\xf8\x67\x4e\x38\xe6\x11\xe4\x00\x59\xd3\x5b\x2e\xb5\x9d\xd0\xe5\x51\xa2\xf3\x5a\xb1\x5b\xfd\x14\x68\x2e\xa6\x98\xe4\x3c\x2f\x33\xc3\x8b\xac\x5a\xf7\x47\xdf\xc1\x11\xf2\xd8\xe6\x46\x23\x33\x11\xc5\xc0\x62\xcc\x36\x05\xf6\xc9\x93\x30\x16\x13\x06\x73\x75\x2b\xcb\x0f\x0a\xaa\x68\x00\x1e\x54\xd2\xd5\xa7\xce\x7c\x47\xe1\x46\xd1\xa5\xc3\xb4\xbd\x68\x56\xcd\x38\xba\x45\x3a\x24\xd2\x18\x26\xa8\x68\x61\xaa\xae\xa7\xe7\x82\x4e\x44\x3e\x04\x67\x32\x2c\x83\xd2\xc0\x16\x27\xd4\x7c\x4d\x93\x7b\x26\x52\x2c\x1a\x05\xcb\x4e\x17\x82\xe6\x2e\xdb\x56\x54\x8f\xbb\xd1\x5f\x0f\x9c\x61\x02\xc3\xf7\x7c\x98\x31\x72\xdd\x43\xc2\xa0\xd4\x9d\x53\xd9\xd8\x2e\xdb\xce\xb9\x46\x93\x8d\xe2\xf3\x84\x79\xfe\x6f\xfb\x1d\x72\xea\xf3\x16\xb1\xf4\x4b\x93\xf7\xdb\x13\xe1\x2f\x90\xfb\x60\x39\x87\xa4\x5a\x34\xb3\x47\x7b\x11\x62\x46\x1b\x9b\x3b\x5e\x1c\xb6\xea\x8d\x1a\x77\x89\xfc\x3d\x56\xe3\xb4\x7e\x88\x3f\xd2\x54\x6a\xf2\x75\x26\x93\x7b\x72\xc9\x40\xe8\x7a\xcc\xf2\x2c\x6a\x9c\x3e\x67\x0a\xef\x9c\x4e\xb7\xdd\xb3\x0d\x49\x2e\x05\x37\x52\x6d\xa6\x17\x4f\x57\x76\xb2\x4f\xf7\xbc\x36\x43\x95\xc5\xe6\x97\x9c\xec\xd9\xa2\x5b\xd7\x8d\x87\x4e\x41\x3d\x83\xd3\x89\xaf\x5c\x15\xb0\x1d\xcf\xda\x2f\x66\xf2\x61\x68\xe4\xb0\xd4\x6c\xc8\x5b\x5c\xe8\x76\x58\xe6\x3d\x5b\xc0\x2d\x76\xc7\x85\xba\x6e\x35\x9d\xc1\x48\xb0\x40\xc1\x7b\xcb\xb9\x3f\x7e\x7d\xf9\x49\x33\x35\x8a\x65\xc0\x33\x66\x92\xb3\x84\x15\xb3\x33\x37\xc2\x8b\x04\x8a\x27\x22\x5d\xa1\xe2\xfb\x21\x9b\x49\x64\x96\xb9\xc0\x6c\x39\x21\x17\xac\x98\x85\x81\x9f\x7a\xd5\xcf\x97\x11\xb8\x90\xb2\x6b\x22\xd4\x63\xdb\xa7\x7e\x88\xe0\x0d\x9e\xa1\x08\x99\xd4\xb8\x5b\x11\x8a\xa7\x42\x9f\x17\x5d\x6a\xf3\x11\x81\xf3\xb8\xe9\x94\x8f\x6b\xf9\x94\x63\x7f\xcf\x7a\xb2\x64\xef\x31\x52\x23\x41\xd7\x13\x14\xba\x53\x96\x12\x39\x67\x4a\xf1\x94\x69\x12\x68\x50\xac\xa5\xf2\xec\xa9\xe1\xd6\xe7\x6d\x7e\xf6\xbc\xcd\x3b\xa8\x43\xc7\xa0\x0f\xd5\xc8\x14\xbc\x59\x22\x53\x34\xcd\xb9\x78\x71\x84\x4a\x27\x34\x63\xd7\xdf\x75\xd0\x3f\x5c\x8f\xba\x0a\x72\xeb\x5e\x46\xf9\xd3\xb6\x64\x25\xfb\x36\xe0\x0d\x11\x32\xdd\x66\x52\x7d\x04\x45\x62\x4a\x0d\x7b\xd8\xca\x0e\x87\x15\xa1\xda\xde\x12\x84\xd3\xe7\x54\x39\x5e\x44\x8e\xc0\x08\xe7\x31\xe9\xd9\x21\x99\xaa\xdb\xb5\xae\xc6\x49\xec\x15\xa7\xdf\x6d\x26\xdd\xf5\x18\x7c\x7e\x73\x4d\xbe\xc1\xe6\x87\xcd\x5e\xa8\xa4\x41\x31\xf0\x52\xe6\x94\x77\x2d\xb2\xd1\xec\xde\xcc\xbe\x1a\x2f\xe1\x26\xb4\x25\xae\x71\x54\xc0\x65\xc2\xa7\xa5\xd5\xe9\x9c\x1e\xf6\xa2\x12\xcc\x2d\x89\x2e\x2f\x37\xc1\xdc\xfe\xd5\x20\x22\x93\x93\xf7\x8b\xac\x24\x16\xbf\x95\xc0\x4a\xc2\x1d\x28\xd1\x4c\x68\x0e\x17\x32\xd1\xad\xb8\xab\xf4\x87\xa5\x25\xd1\x09\x12\x45\x9c\x01\x79\x27\xa7\x5c\xf8\xd3\x2b\xdd\x7d\xdd\x84\xf2\xac\x2d\x30\x7a\x99\xe4\xd9\x65\x12\xad\xb3\x2b\x41\xc7\x59\x1b\x77\x83\x3a\xaa\x85\x8e\xe4\x6d\x46\xa7\x84\xc1\x1f\x67\x29\xd7\xf6\xff\xe4\xf6\xf6\x1d\x18\xe1\x4b\xe1\x25\x66\x30\x50\x3b\xda\x17\x82\x14\xf0\x20\x1e\xf6\xec\x20\xe9\xd9\x21\xfb\x5f\xd4\x93\x70\x91\xda\x89\x47\xa5\xe0\xd0\x49\x0a\x5a\x60\x3e\xc4\xe0\xf3\x8b\x6e\x03\x63\x46\xee\x66\x3c\xb9\xbf\x89\xec\xee\x52\xd9\x77\x22\x7a\x55\x63\x60\xcd\xdf\x0e\x49\x2d\xdd\x54\x6f\xba\xab\xc6\x51\x4f\xcf\x07\x3c\xc1\xb8\x75\xeb\x87\xdf\xa8\xd6\x32\xe1\xd5\x9d\x0b\xd8\x68\x2a\xe6\x90\x02\x73\x38\xec\x9a\x40\x3c\xe8\xba\x1c\x94\x3f\x56\x70\x34\xbf\x9b\xbe\x3a\xae\x8e\x39\x18\x17\x7e\xd5\x07\x5d\x02\xe2\xcc\x0e\xa9\xd1\xab\x8e\xcb\xa9\xd1\xbd\x30\xdc\xb8\x58\xf0\x6e\xea\x6e\xf3\xbc\x20\xe6\x6b\x73\x2e\x6d\x5f\x48\x91\xee\x52\x13\x1e\x6c\xe1\x6d\xc2\x36\x56\xa9\xe1\x8d\xdb\x44\x7c\xe7\xae\x1a\xe0\xcc\x15\xb2\x28\x33\xf4\xe7\xd8\x3f\xbf\xbb\xb7\x19\xe3\x77\x0e\x74\xf5\xf0\x14\x59\x4b\x8f\x63\xc7\xde\xee\x9e\xce\x3f\x8d\xdc\xa5\x91\x70\xf7\xea\xb7\xbf\xf9\xcd\x97\x9e\xcd\xb4\xad\x0a\xfe\x18\xe9\x4c\x5b\x9a\x68\x57\xc4\x17\x5d\xf7\xf1\x45\x3f\xdf\xf8\xa2\xc7\xcf\x42\x7b\xe0\x08\xa2\x8e\xbe\xb9\xdd\xfc\x72\xdb\xc7\x08\xb5\xf6\xde\xed\xea\xb9\xdb\x21\x0a\xe8\xb0\xb1\x3f\x9d\x7d\x59\xbb\xc4\xf9\xf4\xd1\x3d\x3f\xd5\xe8\x9e\x5d\x7c\x59\xbb\x47\xf2\x74\xf1\x61\xfd\x29\x46\xed\x74\x38\x9c\xed\xa3\x4b\xf6\x8e\x29\xe9\x9e\x04\xb0\xbb\x3d\x6d\x97\x82\x54\x55\xcf\x95\x1a\xa4\x0f\x2a\xf7\xb9\xc7\x8e\x8f\x75\x94\x5a\xcc\x48\x7b\x02\x9f\x44\x21\x21\x1d\xb4\x31\x1c\x5e\x76\xa9\x0d\xe9\xfa\x7c\x77\xdb\xb8\x98\x09\xaf\x9f\xe7\x3e\xe6\xe7\x70\xe1\xd1\xd7\x74\xf9\x42\x4c\xee\xba\x96\xad\xc5\x5b\x2b\x80\x04\x00\x23\x97\xe3\x38\x4b\x64\x75\x74\xce\x6f\xae\xad\x0e\x0e\x61\x44\x34\xd3\x23\xb2\x82\xcf\x7b\x73\xa9\x93\x0b\x3c\x7f\xa7\xc6\xb0\xbc\x30\xed\x77\xbd\xb7\xb8\x3f\xbb\xc5\xfd\x80\x16\xc0\x59\x99\x53\x31\xb4\x27\x0a\x6c\xee\xb5\xdb\xba\x06\x65\x1e\x11\x77\x76\x90\x3d\x81\x05\x04\x82\x0b\xea\x85\x8d\x69\x54\xe6\xf2\x71\xcc\x9e\x30\xf6\xce\x2b\x47\xbe\xda\x38\x69\x89\x5c\x72\x78\x75\xcb\x09\x50\xf0\x87\x2a\x62\xce\x35\x35\xdc\xcc\x18\xf2\xf0\x1b\x08\xc8\xa9\x5a\xd5\x25\x69\x14\xa5\x69\x96\xc9\x07\xfc\x76\xcc\xd7\x2c\xf4\xed\x5c\x5c\xa4\xd9\x98\x91\x9c\x5b\x1d\xdd\x19\x58\xe3\xe9\xe0\x95\xa9\x95\xc8\x99\x42\x81\x57\xb9\xcb\xb6\x5b\x66\xdc\x46\xc1\x46\x5b\xfd\x56\xa0\x43\xb8\xfd\xb7\xf7\x2a\x82\x6f\x7b\x9a\x30\x66\x33\x3a\xe7\xb2\x54\xd8\xdb\x48\x72\xe4\x7e\x02\xde\xb0\x90\x65\xb0\x77\x61\x31\xcc\xb0\x3a\xbd\x02\x4e\x1f\xaa\x1f\x41\x15\x48\xa5\x37\x4d\x0c\xd9\x67\xae\xcd\xf2\x5a\x3c\x88\x7c\x1a\xbc\x43\xe1\xcd\x5c\x17\x96\x2d\x74\xae\x6a\x57\xeb\x57\x97\x57\xe6\xb7\xf0\xd3\x17\x54\xd3\x6e\x6b\x76\xd7\x27\x13\x81\x7e\x86\xe2\x4f\xb8\x09\xcb\x78\xb2\xe8\x5c\xee\xad\xd1\xdb\x13\x6d\x1d\xee\xd0\xec\x7b\xf2\x35\xd5\x2c\x25\xef\xa9\xa0\x53\xd4\xf7\x4e\x6e\x6f\xbe\x7e\x7f\x6a\xf7\x15\xf4\xc9\xeb\xcb\x95\x17\x6d\xb7\xf1\xe0\x1f\x0e\x19\x2f\xb2\xb4\xf0\x1d\x58\xd5\x52\xff\x1d\x17\x7f\xd0\x40\x18\x12\xf8\x50\xbb\x64\xbd\x2b\x58\xd0\x4d\x33\x84\xb5\x59\xf3\xb3\x41\x60\xe6\x79\xba\x67\x95\x4f\x2e\xb4\xa1\x59\x76\x93\x51\x71\x5e\x14\x4a\xce\x57\x6b\xe3\xb5\xb9\xfa\x86\x7e\xa6\xe8\xe6\xe1\x5f\x16\x08\x7a\xb8\xc2\x16\xe4\xba\x1a\x7f\x44\xae\x4d\xd0\xc2\xa5\x00\x96\x7a\x74\x5e\x1a\x99\x53\xc3\x93\x23\xab\xac\x1f\xbd\xa7\xa2\xa4\xd9\x4a\xa7\xab\x8d\xcb\x58\x27\x22\x6e\xec\xb4\x3e\x75\x5d\x8b\x6e\x1b\x65\x8d\xcd\xfd\x0d\x55\x96\x3a\x5d\xdc\x7e\xdf\xa9\xaf\x36\xd4\x94\x4b\x54\x78\x03\x67\x58\xcf\x0b\x86\x24\xa3\xda\x7c\x2a\x52\x7b\xe8\x1b\xbf\x6e\x22\xf8\x09\x35\x34\x93\xd3\x3f\x31\x9a\xad\xc6\xf0\x1a\x9e\x5c\xc4\xad\xbd\x01\xca\x5d\xf8\x97\xe3\xd0\xf0\x58\x13\x2b\x60\xfb\x18\x78\xc5\x32\x36\xa7\xc2\xf8\xee\x58\x5c\x5d\x1f\xbb\xf5\x03\x16\xf1\xca\xf8\x9a\x32\xc3\x54\xce\x45\x7d\xcc\x5b\x68\x7b\x21\x45\xca\xd1\xec\x08\x06\x35\xec\x51\x1f\x77\x3d\xaa\xad\xbb\x69\xd8\x70\xb7\x50\xcf\xae\x19\xcd\xa7\x0e\x0a\x6c\x36\x76\xf2\xe5\x0c\x5f\xc2\x4d\x7b\x6d\x6e\x4b\x90\x22\xf7\xc2\x0a\x86\x90\x47\x64\x35\xd9\xda\x2a\x27\x6c\x93\x0f\x86\x7e\x8f\x71\x0a\xeb\x1d\x47\x87\x6e\xde\xeb\xee\x20\x36\xa1\x18\x3e\xdb\x25\x8b\xe6\x54\xd6\xd3\xd4\x55\x78\x17\xba\x61\x24\x4b\xa3\x20\x7f\xad\xd1\x7a\x1e\xd0\x4a\xf0\x6a\x27\x23\xb5\xcd\x6a\x5f\xa7\xb5\x55\x0e\xf6\x25\x55\xb6\x85\xc4\xb8\x95\x69\xb5\x4c\x2e\x5f\x57\xac\xaf\x9d\xff\x9f\x72\xaa\x08\x25\x05\x67\x98\xfc\x84\x0a\x07\x2c\xe0\x2c\x8c\xa6\xee\xa5\xe5\x60\x56\x25\x84\xdf\x06\xee\x32\x1c\x8d\xcb\xce\xd7\xc2\x1b\xa8\x29\x26\xff\x80\x8b\x8b\xb3\x6f\xa4\x33\xf2\xba\x20\x5d\x4b\x03\x80\x93\x0f\x88\x2e\x93\x19\xa1\xda\x4e\xcd\x22\xb4\x3d\xf1\x6c\x94\x53\xc1\x27\x4c\x9b\x51\xc8\x12\xac\xff\xfc\xeb\xbf\x8c\xc8\x5b\xa9\x88\x73\x54\x1f\xf8\xac\x1a\x6e\x9e\x15\x5e\x70\x8d\x8b\x09\x7d\x2b\xad\xb5\x90\xa9\x9b\xf4\x03\x4c\xd6\xd0\x7b\xcb\xc3\x70\xb2\x25\x83\xab\x8b\x37\xe4\xc8\x8a\x89\xd1\xa7\xff\x61\xd9\xd2\xbf\x8e\xc8\xc9\x03\x30\xed\x23\xfb\xe7\x11\x7e\x30\xb8\x4d\xc6\x4a\x75\xf5\x61\x0c\x96\x54\x7c\x3a\x65\x0a\xd5\x47\x02\x41\x85\xa7\x2e\x2b\x88\x90\x51\x63\x7f\x29\x5d\xa9\x9b\xcd\x89\xfc\xf9\xd7\x7f\x39\x22\x27\xf5\x75\x11\x2e\x52\xf6\x99\xfc\x1a\xad\xcb\x5c\xdb\x35\x9e\xba\xcb\x1c\xbd\x10\x86\x7e\xb6\x63\x26\x33\xa9\x99\x40\x55\xde\x48\x32\xa3\x73\x46\xb4\xb4\x1a\x30\xcb\xb2\xa1\xb3\xa5\x93\x07\x0a\x99\x5a\x3c\x28\x21\xb0\x9e\x14\x54\x99\x1a\x4a\x8c\x9c\x85\x04\xbe\x66\xb7\x6d\x2a\xfc\xcd\xf4\x84\x0b\x77\x7f\xe5\x6e\xce\xec\x9e\x43\x60\x28\x6e\x92\x91\x24\x99\x51\x31\x0d\xb1\xe9\x93\xd2\x94\x8a\x6d\xb9\xfa\x69\x79\x06\xee\xb9\xe8\x14\xc2\xfc\x2d\x17\x4d\xa7\x82\xd5\x76\xa5\x29\x37\x3e\x2a\xc2\xf9\x2a\x9a\xc5\x99\xdd\x05\xc5\xc7\xa5\x91\x4a\x9f\xa5\x6c\xce\xb2\x33\xcd\xa7\x43\xaa\x92\x19\x37\x2c\xb1\xcb\x3a\xa3\x05\x1f\x26\x52\xd8\x1d\x87\xac\x0c\x79\xfa\x0b\x28\x6f\x3a\xb4\x53\xdd\x92\x75\xba\xe5\xa2\xb7\x1b\xd5\x9e\xd5\x98\x76\xb0\x35\xb6\xb0\x07\x2d\x2f\x14\x6d\x33\x4f\xb0\x5a\x30\x84\x9c\x1d\x64\xb1\x3e\x69\x72\x77\x1e\x73\xec\xf2\x80\x27\xcd\x31\xec\xb1\x43\x07\x12\x38\x95\x35\x4a\x99\xd3\x14\x49\x29\x15\x8b\x47\x47\x7e\x0b\x52\x48\x97\x9f\x2c\x86\x30\x84\xcc\x86\x54\xa4\xf6\xdf\x18\xb0\x93\x2c\x0e\x02\xc3\x92\x77\x22\x04\x9f\xae\x2f\x9f\xe6\x48\x94\xfc\x00\xa7\xde\xc9\x6b\x2d\x85\x28\x14\x55\xd1\x51\x43\x95\xcc\x33\xcd\xba\x80\xca\xb5\x1f\xf5\x3f\xdc\xfd\x4b\xc8\x76\xb6\x4d\xa4\xda\x7c\x6b\x12\xc9\x8e\x2d\xe7\xfb\xae\xea\x11\xdb\xe4\xc0\xf1\x8a\x6a\xe3\x52\x6b\xf9\x1c\x04\xb5\x65\x78\x05\x05\x18\xcc\xfa\x8b\xe1\x56\x38\xe4\xfd\x05\xec\x44\x86\x2b\x73\x2e\x25\x41\x29\xd9\xae\x40\x55\xfa\x4b\xad\x0e\x1a\x2e\xca\x30\x6d\x08\x9d\x53\x9e\x81\x75\x5e\x8e\x35\x53\x73\x2c\x48\xe5\x52\x0d\xd2\xa6\x9e\xe5\x6a\x4e\xa0\x18\xf5\x44\x9a\x8f\x5f\xc3\xf2\xae\x6c\x5a\x00\x68\x43\x8d\xd9\xaf\x9d\xf5\x41\xf4\x1e\x54\x2f\xd7\xfe\x6c\xbf\xb0\xa3\x1a\x63\xf1\xef\x4f\x8c\x2a\x33\x66\xd4\xdc\xf1\x4d\x7c\x77\x09\xa5\x6b\xfd\x42\x29\xf7\x80\xd0\x0f\x8c\x4c\xa5\xb1\x22\x56\x09\xb8\x8f\x32\x29\x26\xf5\x09\x88\xf6\xd8\x18\x5d\xad\xf2\x4e\x51\x08\xf1\x91\xa2\xe3\x32\xeb\x1d\x97\xd7\xe9\xa4\x63\x87\x49\x06\x5b\x63\x22\x0d\x29\x98\xdb\x3b\xbc\xcd\x00\x0a\xf4\x34\x4b\xce\x99\xd6\x1b\x13\x6c\xd4\xbd\x0b\xb1\x35\x1e\xe5\xc6\xd5\x5a\xee\x7f\xc3\xb0\x10\x2b\x40\xa7\xcc\x50\x9e\xf9\xa3\x8c\xa0\x08\x50\xda\x46\x5d\x37\x2e\x50\x31\xaa\x37\x09\x08\xb5\x59\x7f\x84\xc6\x38\x69\x29\xd8\xf0\x41\xaa\x94\x5c\xd0\x9c\x65\x17\x54\x33\x37\x56\x1c\xa2\x87\x7b\x74\xac\x0f\x3a\xe5\xd5\xb6\xaf\x35\x53\x46\xe3\x4f\x65\x12\x86\xbf\x2a\x15\x0b\x27\x38\xf0\x26\xc8\x3b\x55\xb2\x01\x79\x6b\xb9\xd7\x80\x7c\x12\xf7\x42\x3e\xec\x37\x57\xb3\xf1\x16\xa4\x36\xd3\xd8\xfd\xc3\xa7\xd5\xa9\x19\x7c\xc2\x74\x77\x9c\x91\x23\xf8\x6b\x4c\x8d\x75\x66\x13\x9a\xfa\x19\xd9\x7f\x2e\x99\xa0\xac\xa2\xa8\xe4\x54\x31\x8d\x99\x6b\x56\x26\x49\x6c\x6b\x72\xfe\x86\x09\x17\xdc\xb7\x75\x7a\xd7\xab\x7a\xf9\x99\x7a\xbe\x36\xad\x7e\x71\xfb\xed\x3e\x56\x64\x2b\x45\x8d\xcd\x1e\x81\xd1\x44\xd7\x18\x9f\xd6\xcd\x70\xb5\xd1\x29\xe2\x7a\x51\x5b\x14\x4a\x36\x59\x47\xfd\xea\x2e\x6e\xbf\x5f\x0f\xec\xb5\xbc\x6f\x1b\x7f\xda\x6e\x96\xda\xd7\x20\xb5\xf5\xcc\x6c\x35\x42\xf5\xe6\xa7\xde\xfc\xf4\x25\x99\x9f\xb6\x62\xfc\x26\x93\xd3\x97\x61\x6c\xda\xba\xc4\x4d\x06\xa6\x17\x69\x5a\x6a\xb5\xa2\x8d\xe6\xa4\x17\x6b\x48\xda\xba\xb4\x96\xc6\xa3\x9f\x8f\xd9\x68\x2b\xc4\x36\x98\x8a\x5e\xa0\x91\xa8\x8d\x40\xc6\xd2\x36\x62\xe2\x75\xd4\x38\x16\x14\xab\x72\x96\x61\x38\xef\x94\x13\x8b\x33\xbb\x4a\x8b\x56\x80\xdb\x3a\xb7\x63\x37\xb9\xf6\xb2\x97\x13\x18\x5d\xb1\xc7\xa5\xc9\x92\xcb\xab\x9b\x8f\x57\x17\xe7\x77\x57\x97\x4d\xf9\x6e\x15\xa4\xb7\x48\x62\x9b\x6d\x10\xc3\x48\x12\x5b\xd3\xc0\x12\xe4\x35\x3f\x59\x1c\x58\xf3\x53\x59\xf2\x55\xbd\xf6\x97\x0b\xf7\xe2\x72\x7b\xf1\x8f\xed\xa7\xb3\xed\xf1\xfc\x84\x8e\x53\xd4\xf9\x9c\x59\xb9\x67\x26\xb3\x54\x7b\xbf\xd5\xeb\xcb\x10\x49\xc5\x45\x92\x95\xa9\x15\x2e\x3e\x7d\xba\xbe\xd4\x23\x42\xbe\x66\x09\x2d\x35\x58\x61\x52\x29\x8e\x0d\xf9\xee\xc3\xbb\xff\x06\x7f\x6c\x68\x31\x08\x79\x4d\x20\x2b\x2f\xa7\x98\x58\xd8\x60\xba\x36\xf2\x35\x43\x41\x05\xbe\x9c\xd0\xc2\x52\x31\x8d\x95\x2b\x0c\xc8\x22\x33\x96\x15\x96\x62\xde\x33\x52\x65\x50\xb5\x03\x57\x15\xe6\xbd\xfb\xe4\x94\x19\x8c\xba\xda\xe4\x21\xb9\x11\x6a\x5b\x2c\xae\x7b\xd8\x5a\x6b\xea\xa3\xd3\xc6\x1f\xa8\x76\x16\xab\x95\xb3\xdd\xb2\xbf\xdb\xed\x33\xeb\x4d\x1c\x6b\x8c\x1b\x48\x9e\xe1\xaf\xa5\x39\xdb\xc9\x56\x76\x0c\x74\x22\xe1\xa6\xb5\x35\x75\xbd\x1b\xd0\xea\x3a\x00\x4b\xb6\x0c\xd6\x04\x72\xed\xc3\xc1\x23\x3b\x9a\x72\xbb\xb9\x40\x11\x91\xb4\x56\xfb\xd3\xf9\xcf\xd5\xdf\x95\xe3\x50\xfd\xb5\x9a\xaf\xb3\xc8\x90\x7f\xfc\xeb\xab\xff\x3f\x00\x00\xff\xff\x01\xa8\x18\xd1\x2e\x5c\x02\x00")
+var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xbd\x7b\x73\xe3\xb8\x95\x28\xfe\x7f\x3e\x05\xca\x49\x95\xed\xac\x24\x77\x67\x73\x93\xdc\xde\x54\xb6\x3c\xb6\x7b\xe2\x3b\xdd\x3d\xbe\xed\x9e\x99\xda\x5f\x92\xdf\x06\x22\x21\x09\x31\x09\x70\x00\x50\x6e\x25\x9b\xef\x7e\x0b\xe7\xe0\x45\xea\x45\xca\xf2\xa3\x27\xe2\x1f\x33\x6d\x0a\x00\x81\x83\x83\xf3\xc2\x79\xd0\x8a\x7f\xcf\x94\xe6\x52\xbc\x21\xb4\xe2\xec\xb3\x61\xc2\xfe\xa5\x47\x77\xbf\xd3\x23\x2e\xcf\xe6\xaf\x7f\x76\xc7\x45\xfe\x86\x5c\xd4\xda\xc8\xf2\x23\xd3\xb2\x56\x19\xbb\x64\x13\x2e\xb8\xe1\x52\xfc\xac\x64\x86\xe6\xd4\xd0\x37\x3f\x23\x84\x0a\x21\x0d\xb5\xaf\xb5\xfd\x93\x90\x4c\x0a\xa3\x64\x51\x30\x35\x9c\x32\x31\xba\xab\xc7\x6c\x5c\xf3\x22\x67\x0a\x06\xf7\x9f\x9e\xbf\x1a\xfd\xef\xd1\xab\x9f\x11\x92\x29\x06\xdd\x3f\xf1\x92\x69\x43\xcb\xea\x0d\x11\x75\x51\xfc\x8c\x10\x41\x4b\xf6\x86\xe8\x7a\xac\x33\xc5\x2b\xf8\xc4\x48\x56\x4c\x51\x23\x95\x1e\x65\x52\x31\x69\xff\x57\xfe\x4c\x57\x2c\xb3\x1f\x9f\x2a\x59\x57\x6f\xc8\xca\x36\x38\x9c\x9f\x23\x35\x6c\x2a\x15\xf7\x7f\x13\x32\x24\xb2\x28\xe1\xdf\xb8\xf6\xdb\xe4\xab\xf0\xba\xe0\xda\x7c\xb3\xf4\xd3\x3b\xae\x0d\xfc\x5c\x15\xb5\xa2\x45\x6b\xb6\xf0\x8b\x9e\x49\x65\x3e\xc4\x6f\xdb\x6f\xe9\x7a\x9c\xfe\xdb\x35\xe4\x62\x5a\x17\x54\x35\x07\xf9\x19\x21\x3a\x93\x15\x7b\x43\x60\x8c\x8a\x66\x2c\xff\x19\x21\x0e\x8e\x6e\xcc\x21\xa1\x79\x0e\x7b\x43\x8b\x1b\xc5\x85\x61\xea\x42\x16\x75\x29\xc2\x37\x6d\x9b\x9c\x85\x51\xdf\x90\x4f\x33\x46\x2a\x9a\xdd\xd1\x29\xf3\xdf\x1b\xb3\x9c\x18\x19\x3a\x10\xf2\x37\x2d\xc5\x0d\x35\xb3\x37\x64\x64\x41\x3c\xb2\x10\x4c\x7e\xc6\xfd\xb9\xc1\x41\x92\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x19\x35\xb4\x90\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\xcb\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\xe9\xb6\xfd\xba\xf3\x94\x66\x54\x08\x56\x10\x39\x21\x75\x95\x53\xc3\x34\x31\x32\xc2\x67\x33\x78\x5c\xe7\xa5\xd9\x5c\x2c\xbd\x5f\x31\x1d\x6c\x3a\x7f\x4d\x8b\x6a\x46\x5f\xbb\x97\x3a\x9b\xb1\x92\xc6\x3d\x94\x15\x13\xe7\x37\xd7\xdf\xff\xfb\x6d\xeb\x07\xd2\x5c\x4a\x8a\xa2\xe4\x8e\xb1\x4a\xc7\x43\x41\xea\xca\xae\xc9\x2e\x8e\x8c\x17\xc4\x28\x9a\xdd\x71\x31\x85\xa5\x4f\x71\xbd\x17\xb8\x31\x7a\xb4\x34\x65\x39\xfe\x1b\xcb\x4c\xf2\x5a\xb1\x1f\x6b\xae\x58\x9e\x4e\xc5\x42\xd6\x93\x88\xd6\x6b\x0b\xa7\xe4\x55\xa5\xec\xb4\x4c\x72\x0e\xf1\x49\x68\x54\xe3\x7d\x6b\x99\xc7\x16\x16\xd8\x8e\xe4\x96\x3c\xd9\xe9\xcf\x98\x3f\x1c\x2c\x77\x00\xb4\xdb\x69\x66\x5c\x13\xc5\x2a\xc5\x34\x13\x48\xb0\xec\x6b\x2a\xdc\x9a\x46\xe4\x96\x29\xdb\xd1\x1e\xd8\xba\xc8\x2d\x1d\x9b\x33\x65\x88\x62\x99\x9c\x0a\xfe\xf7\x30\x1a\x80\xc8\x7e\xa6\xb0\xf8\x61\x08\x1c\x37\x41\x0b\x32\xa7\x45\xcd\x06\x84\x8a\x9c\x94\x74\x41\x14\xb3\xe3\x92\x5a\x24\x23\x40\x13\x3d\x22\xef\xa5\x62\x84\x8b\x89\x7c\x43\x66\xc6\x54\xfa\xcd\xd9\xd9\x94\x1b\x4f\x81\x33\x59\x96\xb5\xe0\x66\x71\x06\xc4\x94\x8f\x6b\xbb\x71\x67\x39\x9b\xb3\xe2\x4c\xf3\xe9\x90\xaa\x6c\xc6\x0d\xcb\x4c\xad\xd8\x19\xad\xf8\x10\x26\x2b\x90\x44\x96\xf9\xcf\x95\xa3\xd9\xfa\xb8\x05\xbe\x95\xe7\x80\x78\xaa\xb7\x11\xd6\x96\xf8\x11\xae\x09\x75\xdd\x71\x2d\x11\xa4\xf6\x95\x85\xca\xc7\xab\xdb\x4f\xc4\x4f\x00\xc1\x8e\x10\x8e\x4d\x75\x04\xb6\x05\x14\x17\x13\xa6\xb0\xe5\x44\xc9\x12\x46\x61\x22\xaf\x24\x17\x06\xfe\xc8\x0a\xce\x84\xb1\xc7\xb0\xe4\x46\x03\xce\x31\x6d\xec\x3e\x8c\xc8\x05\x30\x20\x32\x66\xee\xc0\xe6\x23\x72\x2d\xc8\x05\x2d\x59\x71\x41\x35\x7b\x74\x50\x5b\x88\xea\xa1\x05\x5f\x77\x60\xa7\xfc\x73\xb9\xc3\xd2\x19\x23\xc4\x33\xb8\xb5\xbb\x93\x1e\xf8\xdb\x8a\x65\xe1\x38\x50\x41\xce\xab\xaa\xe0\x19\x62\xbc\x99\x51\x43\x32\x2a\x2c\xbc\xb8\xd0\x86\x16\x05\xb0\x93\x4e\xb3\x58\x77\xda\x09\x1c\xed\x16\x73\xf0\xaf\x97\x28\x74\xf3\x87\xc0\xd4\x5a\x2d\xd6\x51\x06\xfb\x38\x3a\xbb\xfc\xc3\x06\x90\x13\x94\x4c\x26\x7c\xba\xaa\xdb\x5a\x58\x5e\x40\x17\x90\x69\x28\x17\xda\x0d\x51\x2b\x84\x66\xe4\x54\x96\x77\xd1\x06\xdf\x1e\xad\x9d\xdd\x4a\xc8\x6e\x5b\xb3\x7d\xe8\x04\x24\xb0\xc5\xea\x5f\x5b\xab\xb8\x9e\xc4\xe9\x0d\x88\x9c\x33\xa5\x78\xee\xe8\x63\x25\xf3\x63\x0d\xd4\x2c\xaf\x0b\xa0\xfd\x52\x68\xa3\x28\x87\xa3\x29\x78\x61\x57\x32\xa4\x06\xcf\x03\xd3\xe4\x9e\x17\x05\xf9\xa5\x90\xe6\x97\x61\x24\x18\x48\x2a\x3e\xe5\x81\xf4\x69\xc2\x85\x1f\x1f\x38\xa2\x63\xe9\x52\xb3\xd6\x80\x23\xf2\x9d\x66\x84\x95\x95\x59\x78\xe2\x70\xf2\x8f\x7f\x9e\x5a\xc2\xca\x14\xd5\xc9\xc0\x8d\x7e\x9e\x7c\xae\x59\xff\x16\xf0\x76\x01\xb1\x7d\x84\xcc\xd9\xf9\x16\x50\x2f\x81\xfb\x92\xa1\x84\xa0\xa1\x7b\xd8\xaa\x14\xc8\xaa\x2e\x98\x0e\x52\x8e\x85\xd1\x86\xc1\x3b\xac\xa5\xeb\x7a\xb0\x1d\x9b\x30\xa5\x58\x7e\x59\xdb\xa3\x71\x1b\x66\x75\x3d\x15\x32\xbc\xbe\xfa\xcc\xb2\xda\xac\xe0\xba\x1b\x97\x6e\xe5\x26\xb7\x4c\xa6\x10\x55\xf0\x73\x20\x3a\xb9\x1f\xec\x7a\x81\x71\x5a\xf0\x68\xa4\x43\x9a\x1a\xae\x27\x0b\x00\x47\x00\x18\xfb\x6c\x99\x04\xc8\xb6\xc9\xf9\xb2\x82\x0a\xf0\x07\xce\x8a\x7c\x40\xc6\xb5\x21\xdc\x00\xf3\xc8\x66\xd2\xe2\x17\x45\xb8\xc3\xb8\x73\x2e\x81\x35\x13\x29\x2c\x26\x91\xd2\x72\x00\x10\x01\x58\x3a\xfc\x08\x66\x1e\xbb\x71\x4d\x4a\xa9\x4d\x84\x95\x7d\x03\x58\x2e\x18\xb9\xe7\x66\x06\x7f\x4c\xad\xba\x62\xd9\xbe\xae\x4b\x3b\xe8\x3d\xe3\xd3\x99\xd1\x03\xc2\x47\x6c\x04\xbb\xcb\x68\x36\x4b\x86\x2d\x19\x33\x9a\xd0\xa2\xf0\x53\x48\x51\x02\xe9\x69\x69\x79\x22\x39\x09\x4c\xd3\x31\xb8\x41\xa0\xb7\xed\x5d\x5b\x09\xae\x01\x61\x26\x1b\x9d\x0e\x48\x26\xcb\xca\x9e\x16\x0a\x73\x1c\x2f\x08\x37\x56\xf6\x43\x06\xad\x64\x3d\xc5\x95\xb0\xc2\x7d\xd8\x4b\x47\x00\x5c\x10\x5f\xac\x36\x21\xa6\xe4\x08\x17\x77\xe4\x05\x1e\x3b\x1c\xc7\x45\xc0\xfa\x4a\x6a\xb2\x99\xa3\x29\x99\x54\x8a\xe9\x4a\x0a\xe8\x09\xbf\x5c\xc5\xb9\xfd\x47\xe8\x74\xa2\x4f\x23\x30\x67\x7c\x3a\xf3\xb0\xa4\x0a\x69\x4a\x73\x0f\x36\x9d\x91\x78\x4e\xa8\x52\x74\xb1\xa5\x25\x37\xac\xdc\x72\x4a\x96\x50\xfb\x5c\x38\x22\x15\x71\x22\xd9\x3d\xc3\x54\x19\x60\x00\x1b\x0c\xc7\x55\xe3\xfa\x78\x69\xd9\x2e\x37\x0e\x43\xc8\x2b\x72\x02\x28\xc2\xcd\xb1\x06\x74\x1d\xca\xea\x74\x44\xce\x41\xdb\xed\xf0\x01\x21\xc3\xf8\x6e\x20\xfb\x51\x2d\xe3\x58\x5b\xd7\xd6\x91\xa8\xe0\xb3\x9e\xd7\x2f\x3f\x43\x37\x7f\x26\x56\xb0\xfa\x55\xcd\x11\x26\x5b\x9b\x76\x25\x6f\xbe\xb5\x9f\x43\x97\xd6\xed\xad\x46\x94\xd6\xac\x60\x99\xb1\x34\x9a\xa9\x72\x40\xa8\xd6\x32\xe3\x56\xac\x8c\x48\xdb\xc4\x74\x5c\xc9\x76\xd8\x93\xbe\xf0\x27\xbd\xd7\x6f\x9f\xf6\xc1\xeb\xda\x6f\x09\x1a\x05\xd7\xc6\x52\x86\x26\x54\x1a\x04\x6b\xbc\x80\x5f\x8f\x35\x29\xe8\x98\x15\x6b\xf9\xf2\xf2\xd3\xfd\xd4\xc6\xa7\xe3\xf9\x5d\xbb\xa0\xb5\x0b\x71\x4a\x4d\xd8\x78\x10\x91\xbd\xc0\x87\x12\xc7\x80\x50\x72\xc7\x16\xa8\xdb\x59\x95\xd1\x29\xd3\xd8\x58\x31\x64\x37\x16\x39\xee\xd8\x02\x1a\x6d\x96\x54\xd6\xc3\xa4\x07\x72\xe0\xd3\xe7\x98\xc6\x67\x68\x27\xda\xb3\x87\x5f\x74\x8f\x6e\xfd\xf1\x17\x9f\x3b\xb6\x51\xf2\x5a\xf5\x2c\x89\x24\x80\x93\xb0\x1f\xb0\x49\xc0\xbf\xfc\x1e\x53\xab\x12\x81\xad\xa3\xcf\x0e\x91\x6d\x0a\xc6\xa6\xc7\x43\xef\x41\xeb\xfa\x18\x34\x68\x44\xc8\x63\x8d\xc8\x67\x4f\xfa\x8c\x83\x5d\xc7\x62\x32\x1c\x5c\x6f\x6a\xf8\x9e\x16\x3c\x4f\xcc\x3f\x96\xcf\x5e\x8b\x01\xf9\x20\x8d\xfd\xdf\xd5\x67\xae\xad\xf8\x72\x29\x99\xfe\x20\x0d\xfc\x39\x22\x5f\x1b\xc4\xf5\x77\x1d\x29\xdb\x1e\x00\x84\xf3\x7d\x10\x78\xce\x05\xd2\x14\xbb\xfc\xd4\x48\xa1\x47\x56\x1d\x02\x51\xce\x1f\x5c\xae\xc9\xb5\xb0\xc2\xa1\x03\x03\x98\x8d\x50\x89\xc1\x21\xca\x5a\x83\x55\x41\x48\x31\x04\x19\x60\xe5\x18\x08\x3d\x3b\x4e\x0a\xbf\x0d\xc3\xad\x1f\xea\x6b\x63\x87\x79\xb7\xb6\xf3\x8c\xce\x41\xa4\xe3\x62\x5a\x04\xe1\x6d\x40\xee\x67\x3c\x9b\xa1\xd4\x0d\x3a\xbd\x61\xaa\x52\xcc\x32\x2c\x0a\xda\xbf\x7d\x33\x65\xca\x0a\xbb\xdc\x8f\x87\x96\xb0\x82\x66\x2c\x27\x39\x88\x96\x68\xd5\xa1\x86\x4d\x79\x46\x4a\xa6\xa6\x8c\x54\x96\x93\xec\xb6\xfb\xfd\x08\x3b\x3e\xbd\xc9\x7b\xfa\xc1\x5e\xe8\x06\x2c\xf2\xad\x95\x75\x9f\x88\x3b\x82\x5c\x7d\xe0\x8e\x07\xee\xd8\x7a\x0e\xdc\x31\x3c\x07\xee\xb8\xe5\x39\x70\xc7\x03\x77\x7c\x74\xee\x88\xba\xec\x0e\xca\xf3\x0f\x68\xe2\x68\x6b\xcb\xc0\x69\xfd\xbd\x50\x53\x6d\xb6\xfc\xe6\xd6\x11\x9c\x4f\xa0\x6a\x3b\xdb\xb1\xa2\x62\xca\xc8\xeb\xe1\xeb\x57\xaf\xfa\x28\xd5\x6e\x23\x3b\xf5\x98\x48\x55\x52\x03\x7d\xfe\xfd\x57\x1b\x7b\xac\xb3\xbf\xed\xc1\x6a\xea\x70\x3c\x18\xf2\x1a\xb2\xc3\x1a\xc3\x27\x50\x27\x21\x0d\x29\x99\x21\xd4\x34\x4c\x45\xbc\x64\x03\x6f\x58\x46\x84\x77\xd7\x62\xde\x02\x9b\x13\x29\x9c\x1d\xcf\x02\x7f\xb4\xdb\x0c\x32\x46\x35\xb3\x94\x74\xcc\xc2\x2c\x64\x69\xbf\xca\x85\xf1\xc7\xc5\x4e\x81\x79\xa8\x90\x13\x36\x9a\x8e\x48\x5e\x43\x37\x2a\xdc\x3d\xdd\x29\xce\x56\x2f\xb4\x61\x25\x58\x72\xa5\x82\xff\xd9\x69\x1b\xb5\x80\xbb\x80\x39\x13\xa6\xa6\x45\xb1\x20\x6c\xce\x33\x13\xd6\x07\xd7\x84\xdc\xa0\xb1\xbd\x9b\x89\xb0\x93\xe8\xd0\x5d\x5c\x18\x2e\x61\xb0\xde\xd2\xa7\x0f\xb7\x5f\x1a\xbb\xcb\x99\x6c\xf1\x42\x5c\xc9\x68\xad\xb0\x6a\xec\xb8\x68\x03\x87\x7f\x02\x72\x7d\xfb\x71\xbb\xc9\x95\xf4\xa6\x64\x3d\xa8\x57\x5b\x2c\xad\x8b\xc2\x22\x06\x5a\x61\x97\x17\xb0\xc2\x3a\x8a\x4b\x6a\x20\x33\x1a\xde\xd1\xc4\x7c\xfe\xe1\xd2\x42\xc5\xb6\xf9\x24\x2b\x59\xc8\xe9\x22\x85\x34\xac\x0c\x6c\xb7\xae\x2f\xde\xea\xa1\xd0\x60\xd1\xef\x43\x6b\x6b\x0e\x96\xbf\x83\xe5\xef\xa0\xdb\x2c\x3d\x07\xdd\x26\x3c\x07\xdd\x66\xcb\x73\xd0\x6d\x0e\xba\xcd\xc1\xf2\x47\x0e\xdc\x71\x03\x4c\x0e\xdc\x91\x1c\xb8\xe3\xda\x75\x1d\xb8\xe3\x46\xf0\x1c\xb8\xe3\x81\x3b\xae\x7a\x2a\x99\x3f\xc0\xd1\xb1\x92\xf9\x06\x3f\x47\xb4\xfa\x64\x72\x58\xc8\x8c\x1a\xe7\x08\x6e\xbb\x38\x3b\x9f\xa6\x25\x1a\xa2\x06\xe4\xef\x52\x30\x74\x5e\xb3\x7b\x03\xe6\x24\x69\x66\x4c\xd9\xe6\x27\xfa\x74\xa3\x63\xd3\xc1\x4f\xf2\xe0\x27\xf9\xe2\xfd\x24\x67\x54\xe3\xbe\x22\x51\x5a\xef\x36\x99\x1c\xc8\x4f\x4c\x95\x5f\xa8\xd7\xa4\x45\x17\xb7\xdd\x10\x62\x13\xb7\x14\x57\x9e\xbb\xfb\x02\x96\xdf\x34\xd7\xeb\xe4\x65\x58\x14\xcd\x73\x96\x93\x8a\xa9\x21\xa2\x88\x24\x13\x2e\xf2\x15\x6b\xf5\xf0\x79\x56\xef\xc7\xe6\x3a\x9e\xd1\x05\xb2\x39\x91\x1d\x6c\xae\xa9\xe1\xb8\x41\xe1\x5f\x84\x43\x64\x5f\xa9\x7e\x48\x8c\x33\xf2\x7e\xd3\x51\xae\xef\x2f\x9a\x83\x40\xed\x4d\xc2\xbb\xeb\x95\x20\x96\xff\x58\x33\xb5\x80\x18\x8b\x28\xb0\x86\x60\x2e\x77\x47\xc6\x35\xc9\xa8\x46\x4e\xd1\x57\xb5\xec\xa9\x46\xed\xa6\xa7\xec\x6e\x89\x26\x6d\xb8\xb4\x87\x42\x9d\xd4\xeb\xe0\x08\xb3\x95\x4a\xf8\x8a\x5b\x80\x68\xfd\xef\x35\x9f\x5d\x45\xb7\x9d\x04\xb7\x95\x48\xf1\x82\x95\x73\xb2\xbb\x82\x4e\x76\x56\xd2\xc9\x4e\x8a\x3a\xd9\x55\x59\x27\x0f\x50\xd8\xc9\x6e\x4a\x3b\x69\xa3\x82\xdd\x21\x27\x65\x3d\x8e\xfe\x4e\x1e\xa2\xa2\x92\x07\xe8\xf1\xa4\xbd\xd4\x80\xa6\xea\xb1\x94\x7a\xc0\xf5\x86\x5e\xff\xd4\xc0\xda\x4d\xa7\x27\x6d\x50\xf9\xa8\x3b\x50\x68\xbf\x10\x0d\xff\x49\xd4\x6d\xf2\x20\x95\x9b\xec\xae\x76\x93\xdd\x31\x03\x58\xdd\x3b\xb8\x4e\x7d\x28\xc3\xc4\x51\x90\x45\x94\xb4\xb2\x48\xf1\x0f\xcb\x09\x60\x5f\xfe\x49\x2a\xca\x95\xb6\xf2\x9d\xb3\x99\xa4\xbf\x39\xed\x3c\x1d\xc6\x8e\xc0\x35\xb1\xa4\x7a\x4e\x0b\xcb\x7b\xd0\x8f\xc3\xe9\x45\x76\xf4\x36\x9b\x1e\x90\x7b\x88\xfa\xb4\x54\x0a\xb5\x25\xae\xc9\xd1\x1d\x5b\x1c\x0d\x96\x10\xe9\xe8\x5a\x1c\x21\x8f\x5a\x42\x9d\xc0\xd0\xa4\x28\x16\xe4\x08\x7e\x3b\xda\x37\x67\xdf\x81\x71\xa5\xc9\x36\x76\xe5\x0b\x3b\x60\x89\xf0\xb1\xd2\xfb\x17\x36\x91\x8b\xe0\xc5\x86\xff\x8a\x8e\x0c\x06\x5c\x2d\x12\xe6\x12\xbc\x46\x00\xc7\xe0\x7d\xee\x95\xdf\x5a\xb8\xd4\x0a\xa0\xbb\xc6\xc1\x90\x49\x2d\xbb\x34\xb9\x8d\x97\x82\x69\x10\xec\x58\x30\x11\x25\x9d\xa1\xed\x08\xdd\x41\x22\xb7\x13\x79\xdb\x41\x24\xf6\x00\x19\xb1\x64\x54\x68\x72\xe4\x6d\x4f\xc7\x3a\xb6\x38\x1a\xc5\xe8\xbe\x30\x22\x04\x21\xa7\x11\x7d\x71\xc0\x83\xa4\x7d\x90\xb4\x0f\x92\x76\x8f\x5e\x07\x49\x7b\xfd\x73\x90\xb4\x7b\x3c\x07\x49\xfb\x20\x69\x6f\xfa\xf0\x41\xd2\x3e\x48\xda\xdb\x3f\xbe\x9b\xa4\xbd\xab\x9f\x50\x2a\xf7\xba\xcb\x39\xcc\x9c\x45\x0d\xcf\xa2\x0f\x91\x6f\x85\xff\xda\xaf\xbc\x9d\xca\xd2\xab\xa5\xed\x54\x22\x5f\xd2\x2d\x46\x5b\x44\xeb\x20\x7c\x2f\xf5\xdc\x2c\x75\xbf\x2c\x5f\xa8\x1d\x70\x23\xb9\x50\xd8\x11\x39\x3e\xf9\xab\x70\x97\x69\x6e\xcc\xe2\x3d\x79\x4e\x4e\xfc\x8d\xcb\xa9\x05\xbe\x90\xa6\xf9\xa3\x30\x7c\x18\x5b\x84\x3b\x18\xb8\x5e\x6c\xc4\xdb\x34\xae\x25\xc2\xad\x7b\xb8\x29\x8e\xfb\x69\x49\x08\x53\x8d\x39\x70\xed\x12\x88\x81\xb7\x84\xaa\x85\xb0\xa3\x4a\xe1\xaf\x8f\x91\xe6\x60\x02\x38\x87\x79\x28\x2c\xc1\x7c\x40\x62\x8a\x50\x4a\xee\x3b\xa9\xc1\x9c\x7b\xce\x95\x5f\x0a\x77\x23\x6a\xdf\xf8\x5b\x5f\x8f\x94\xb0\x22\x1e\xbe\x3e\x22\x57\x80\x87\xe9\xc0\x5c\x03\x7c\x68\x51\xc8\xfb\x3e\x24\xe9\xa9\xc2\xa2\xee\x7b\x87\x45\xb5\xee\xef\x0e\x51\x51\xff\x22\x51\x51\xf0\x23\x1e\xa1\xbd\x87\x47\x91\x1f\x66\x0c\xb0\x48\x31\x00\x55\x59\x17\x86\x57\xd1\x57\x4a\xe3\xa7\x0a\x94\x32\x27\xce\xf3\xa4\x89\x97\xf6\x6b\x34\x9b\xb5\xf1\x13\xc6\x03\xdf\x2a\x0d\x87\xd6\x79\x77\xd0\xa2\x70\x31\x45\x5e\x24\x45\x17\x16\xfe\xdc\x9e\x09\x97\x3e\x2b\xa2\xd7\x66\x80\xc8\x9c\x58\x5a\x58\x2c\x5c\xa6\xba\x0d\x44\x14\x95\xa2\x39\xf3\xac\x77\xca\xe7\x4c\x44\x4a\x7a\xa2\x4f\x4f\x3d\x0f\xdf\x2b\x85\x7f\x14\x0a\xfd\xfb\x84\x92\xfe\xa1\x0b\x8d\x86\x05\x05\x2a\x1d\xc1\x17\x69\xf4\x73\xba\x60\xf4\xb9\xe7\xef\x67\x63\xd8\xe1\x7e\xff\x09\xef\xf6\xbf\x9c\xc8\xb2\x67\xb6\x30\x3e\x87\x6f\xfd\x8b\xb7\x2a\x1e\x9c\xeb\xe3\xf3\x50\xe7\xfa\x47\xb7\x1c\x3e\xaf\x8f\xfd\x17\x60\x2d\x7c\x4e\x1f\xfb\x83\x85\x70\xe3\xa6\xbc\x34\xd7\xf7\xe6\xb3\x93\x45\xf0\x60\x0d\xdc\x99\x0b\xf7\x64\x38\x0f\xb5\x02\xf6\xc4\x88\x1d\xef\xd9\x0f\x77\xec\x4f\x73\xc7\x7e\x90\x78\x3b\x3e\x07\x89\x77\x2d\x50\x0e\x12\x2f\x39\x48\xbc\xdb\x96\x77\x90\x78\x37\x82\xe7\x20\xf1\x6e\xdc\x94\x83\xc4\x7b\x90\x78\xc9\x97\x26\xf1\xee\x92\xa5\xeb\x70\xd7\xfd\xa0\xbb\xee\xbe\xd4\xa2\x17\x8d\xe8\x89\x07\xbd\xef\xb6\x0f\xf7\xda\x2f\xe5\x5e\xbb\x73\xc0\xbf\x30\xfc\xa1\x41\xff\xe9\x5e\xad\x8b\xfc\xa7\x73\xc9\x73\x52\xd5\xc6\xc5\x53\x1f\xa2\xff\xf7\x11\xfd\xdf\x80\xfc\x21\x05\x40\xa7\x14\x00\xeb\x60\x76\xc8\x03\x70\xc8\x03\xb0\xe7\x4b\xe8\x43\x1e\x80\x43\x1e\x80\x43\x1e\x00\xff\x1c\xa2\x93\xc8\x21\x3a\xa9\xd3\x73\x88\x4e\x5a\xff\x1c\xa2\x93\x5e\xac\xf5\x95\x1c\xa2\x93\x5e\xb6\x25\x96\x1c\xa2\x93\x0e\xd6\xd9\x8e\x1b\xf5\x05\x46\x27\x1d\xf2\x00\xbc\x54\x1f\x05\x72\x90\xb4\x0f\x92\xf6\x41\xd2\x3e\x48\xda\x9b\x9f\x83\xa4\xdd\xe3\x39\x48\xda\x07\x49\x7b\xd3\x87\x0f\x92\xf6\x41\xd2\xde\xfe\xf1\x43\x1e\x80\x2f\xc8\x37\x82\x1c\xf2\x00\x1c\xfc\x25\x0e\x79\x00\xfe\x75\xf3\x00\x34\xee\xee\x9f\x2f\x19\x40\xff\x69\x1c\x32\x02\x1c\x32\x02\x1c\x32\x02\x1c\x32\x02\xf8\xe7\x90\x11\x00\x9f\x97\x64\x6b\x3c\xc4\x47\xad\x05\xca\x21\x3e\x8a\x1c\xe2\xa3\xb6\x2d\xef\x0b\xb0\x1b\x1e\xe2\xa3\x5e\xa0\xad\xf0\x10\x1f\x75\xb0\x0b\xb6\x37\xe7\x0b\x89\x8f\x3a\x64\x04\x78\x89\xb7\xed\x07\x89\xb7\xe3\x73\x90\x78\xd7\x02\xe5\x20\xf1\x92\x83\xc4\xbb\x6d\x79\x07\x89\x77\x23\x78\x0e\x12\xef\xc6\x4d\x39\x48\xbc\x07\x89\x97\x7c\x69\x12\xef\x21\x23\xc0\x21\x23\xc0\x21\x23\xc0\x97\x78\xc3\xbd\x75\xa7\x99\x98\xaf\xdb\xd3\xc6\x2e\x5e\x89\x79\x53\x4f\x61\x62\xce\x95\x14\x40\x81\xe7\x54\x71\x3a\x2e\xe0\xa4\x82\xc4\xe3\xe0\xef\xe8\x27\x53\x23\x72\x41\x85\xbb\x68\xc5\x9b\xcc\xb5\xf3\xdf\x8e\xf8\x5b\x50\xbd\x3d\xed\xef\x69\x53\x54\x13\x2b\xa7\x4e\x5c\x03\x3b\x75\x4a\x2e\xc2\xc4\xd7\x7e\xa6\x13\x01\xef\xa2\x1f\x0c\x01\x39\xd7\x36\xe8\x26\xc5\xdb\x21\x36\x9f\xcd\x06\x58\x3e\xd0\x32\x86\xf8\xaf\x80\xc6\x88\xbc\x77\x12\x12\x25\x17\xff\x7d\x7d\x79\xf5\xe1\xd3\xf5\xdb\xeb\xab\x8f\x9b\x91\xae\x23\x59\x81\x83\xd4\x63\xb2\xc7\xdf\xfb\x3d\x82\x30\x6f\x26\x2c\x05\xfe\xc5\xc9\xf7\xe7\x1f\xff\xfb\xc3\xf9\xfb\xab\x53\x60\xbf\xec\x73\x45\x45\xce\x72\x52\x6b\x4f\x12\x2a\xc5\xe6\x5c\xd6\xba\x58\x84\xe3\xbd\x1a\x69\xdb\xd8\xea\x14\xcd\x05\xd1\x4c\xcd\x79\xb6\x1a\x44\x28\xc5\xd2\x88\x40\x59\xc0\x70\xc5\xb4\x2c\xe6\x2c\x47\x59\x23\x4c\xda\x7f\x87\x8b\xaa\x36\x5e\x22\x06\x17\x04\x7b\x2a\x44\x36\xa3\x62\xca\xf2\x11\xb9\x94\xb5\x1d\xef\x17\xbf\x80\x85\x29\x96\xd7\x19\xf2\x3a\xea\x05\xa6\x5f\x0c\x3c\x25\xb1\xb4\x40\x63\x1a\x05\x9d\xd1\xca\x2f\x3d\x85\x8e\x5e\x08\x43\x3f\xbf\xc1\x3b\xf8\xa3\x5f\x24\x3f\x1d\xf9\x14\x14\xd2\x7e\x02\xe9\x11\xce\xaa\x80\xec\x07\x05\x39\x4a\x5b\x8f\xc8\x95\xfd\x06\xcb\xd3\x7d\x40\x17\x0a\x36\x67\x0a\xe4\x69\xb7\x0b\x03\xa2\xd8\x94\xaa\xbc\x60\x1a\x9c\x07\xee\x67\x0c\xd2\x79\xa0\x84\xe5\x00\xc6\x82\xb4\x2e\xa4\x19\x91\x4b\x36\xa1\x75\x61\x80\x86\x1c\x1d\x8d\x8e\xf7\x86\x6a\x6f\x95\xdc\x12\xfc\xde\x40\xb7\x5b\x4c\x2a\x31\x91\x6a\xed\xf1\x38\x76\xa6\x89\x06\x59\xd3\x96\x93\x38\x4d\xcf\xd3\x6a\xd4\x2f\x3a\xac\xa4\x83\x20\xd8\x5d\x9d\xcf\xa4\x98\xf0\xe9\x7b\x5a\x7d\xc3\x16\x1f\xd9\xa4\xa7\x37\x04\x32\x51\xa7\xd3\x02\x03\xb3\xe4\x10\x07\xdc\xce\x74\x1e\xf1\x2e\xbf\x8b\xd1\xa4\x9f\xcd\xa3\xb3\xa5\x63\x29\xa5\x05\x32\x7d\xc7\xbe\xf7\x98\x9c\x27\x3e\xdb\x29\xfa\xca\xc9\x1d\xa7\xa4\xdd\x9d\x53\x33\x22\xef\x25\xb8\xe4\x4c\xe4\x1b\x32\x33\xa6\xd2\x6f\xce\xce\xee\xea\x31\x53\x82\x19\xa6\x47\x5c\x9e\xe5\x32\xd3\x67\x99\x14\x19\xab\x8c\x3e\x93\x73\x4b\xf9\xd8\xfd\xd9\xbd\x54\x77\x5c\x4c\x87\x56\xd2\x19\xe2\xae\xea\x33\x10\xa6\xce\x7e\x8e\x12\xfb\xa7\x6f\x2f\xbf\x7d\x43\xce\xf3\xdc\x65\xec\xa9\x35\x9b\xd4\x85\xcb\xde\x31\x22\xb4\xe2\xdf\x33\x65\x95\xb2\x01\xb9\xe3\x22\x1f\x90\x9a\xe7\xff\xb9\xf9\x70\xef\x08\x31\x59\xa1\x6e\xb4\x03\xd4\x6e\x41\x50\x5c\x34\xe8\x54\x40\x7a\x4b\xa1\xb8\xd1\xb0\xe7\xde\x70\xe0\x18\x4a\x8f\x65\x8c\xa5\x2c\x18\x15\x5b\x7a\x00\xd8\xfa\x9f\xd9\xe3\x78\x68\x51\xcb\x71\x08\x50\xc9\xfc\x0d\xd1\x75\x55\x49\x65\x34\x29\x99\xa1\x39\x35\x74\x64\x77\x6e\xd0\xfc\x13\x84\xe3\x01\xf9\x6b\x78\x09\x12\xae\xfe\xd3\xf1\xf1\xef\xbf\xb9\xfa\xaf\x3f\x1c\x1f\xff\xe5\xaf\xe9\xaf\x40\xf6\xd0\xd4\xd5\x6c\x62\x45\xee\x91\x15\x77\x3f\xc0\x37\xe0\x4f\xc7\x46\xcf\xb3\x4c\xd6\xc2\xb8\x1f\x0c\x35\xb5\x1e\xcd\xa4\x36\xd7\x37\xe1\xcf\x4a\xe6\xed\xbf\xf4\x16\x4e\x40\x1e\x97\xe8\x00\x38\x6f\xa8\x99\xed\x99\xf4\xc4\x73\xb1\x03\xba\xba\x9e\x69\x86\xa4\x92\xc2\x3f\xdf\xfa\xe9\x5a\x0e\x74\xaf\xb8\x31\x4c\x80\xdc\x01\x7e\x77\x72\x32\xb0\x98\x1b\xd9\xec\xfc\x75\x2f\x75\xb4\xf3\x51\x0c\x50\xdb\x61\x71\x30\x7b\xb7\x32\x44\xe6\x40\x68\x97\xf5\xba\xf3\x9b\x6b\x32\x47\x68\xec\x7d\x21\xde\x0b\xeb\xed\x83\xcf\x64\xc8\x54\xe5\x96\x15\x24\xcd\x37\x68\x59\x0a\xfe\x5e\xa4\xe0\x25\x77\x06\x60\x97\xd5\x4a\x93\x13\x7c\x39\xca\xaa\x7a\xe0\x1a\x8c\x4a\x56\x4a\xb5\x08\x7f\xb2\x6a\xc6\x4a\x2b\xb1\x0d\xb5\x91\x8a\x4e\xd9\x20\x74\xc7\x6e\xe1\x2f\xec\xd8\xf8\xc0\x72\x6f\x14\xa9\xb3\x5a\x59\xe6\x51\x2c\x3c\x05\x61\xf9\xf3\x9e\x45\x0f\xa6\x3d\x1f\xc5\xb0\x1b\x1f\x76\x64\xb9\x41\x5b\x44\xa6\x1d\x56\x05\x32\xe4\x5c\x16\x75\xc9\xf4\x20\xb0\x27\x94\xd6\xc5\xdc\x4a\x93\xfa\x51\x18\x61\xce\xe7\x5c\xef\x74\x3f\x7d\x1b\x2c\x75\x60\x22\xab\x8d\xd5\x54\xd0\x19\x3c\xc9\x08\x27\x35\xe8\x00\xc1\x47\xb1\x41\x52\x5e\x1f\x75\xbb\x7d\xa5\xc6\x30\x25\xde\x90\xff\xff\xe4\xcf\xff\xf6\x3f\xc3\xd3\xff\x3c\x39\xf9\xd3\xab\xe1\xff\xfe\xcb\xbf\x9d\xfc\x79\x04\xff\xf8\xe5\xe9\x7f\x9e\xfe\x8f\xff\xe3\xdf\x4e\x4f\x4f\x4e\xfe\xf4\xcd\xfb\xaf\x3f\xdd\x5c\xfd\x85\x9f\xfe\xcf\x9f\x44\x5d\xde\xe1\x5f\xff\x73\xf2\x27\x76\xf5\x97\x8e\x83\x9c\x9e\xfe\xe7\x2f\x3a\x4d\x8f\x8a\xc5\xb7\x1d\x0e\x3c\x3e\xc3\x1d\x3c\xec\x63\xaf\x1e\x06\xfa\xcf\xc3\x28\xb4\x0d\xb9\x30\x43\xa9\x86\xd8\xfd\x0d\x31\xaa\xde\x7e\x30\x22\x51\xdb\x05\xcf\x7d\x3a\xb0\x37\x91\xa0\x05\xd2\xbc\x77\x44\xd6\x2c\x53\xcc\xec\x4b\x83\xc1\xd1\x3c\xff\x68\x99\x64\x0f\x4a\x4d\x54\x6a\x82\x5d\x12\xe0\x15\x39\xef\x44\xc9\x72\x44\x12\xb3\xd0\x1c\x6e\x32\x5d\xbb\x3b\xb6\x45\xcb\xf5\xcf\x41\x09\xfa\xb2\x94\xa0\x5b\xdc\xdf\x47\xd7\x80\x98\x98\x6f\x32\xd3\xb4\x6d\xba\x6f\x21\x94\x25\x35\x47\x7b\x01\xca\x48\x52\xc9\xaa\x2e\xa8\x59\x63\xb6\x5b\x61\x9b\x76\xb8\x1f\x6f\x01\xec\x46\x83\x1d\xd8\x51\xb9\x72\xb5\x31\x94\x9c\x17\x05\xe1\x02\x4f\x02\x0c\xe0\xad\x79\x8a\xa1\xbc\x44\x28\x1a\x9c\xe7\x76\x0a\xf7\x2e\xe0\x26\x31\x34\x72\x6d\x75\x1d\x65\xc0\xe2\x0f\x01\x39\x48\xb3\x9c\x69\x8c\x8b\x18\x96\x13\xb8\x6d\xb8\xa5\x5c\x99\x7f\xb1\xa0\xda\xf8\x69\xc3\x6c\x0c\xbd\x03\x53\x68\xc6\x72\x26\x32\x06\x2e\x08\x35\x8b\x6b\x1d\x5b\x61\x10\xcc\xfb\x30\x06\x25\x79\x5d\x15\x3c\xb3\xf0\xb3\x33\x59\x3d\xc6\x75\x59\xd6\x06\x0c\xc5\x4f\x65\xc5\xb7\x3b\x7e\xeb\xd3\xbd\x06\x63\x3e\x90\xaa\x20\x5a\x07\x6f\x8b\xa0\xba\xeb\x87\x99\xef\xbb\x11\xde\x60\x6e\xdb\xca\xa9\x96\x28\x6e\xb4\x31\x34\x29\xed\x53\x5b\x0c\xbb\xd1\xd9\x9f\x24\x8d\xed\x41\x5f\xbb\xd3\xd6\x1e\xc6\xa5\xbe\xf4\xb4\xab\x35\xa9\x52\x6c\xc2\x3f\xf7\xc0\xc7\x73\x11\x55\x14\x9e\x33\x61\xac\x22\x00\x99\xa9\x2b\xc5\x2a\x26\xf2\x10\xee\x07\x0e\x5e\xa2\xb9\x8e\x47\xbd\x31\x42\x29\xa3\xff\xf1\xba\x5d\x25\xc5\x1c\xce\xd6\x4f\xfc\x6c\xb9\x5d\xdf\xff\xc1\x12\x32\xdf\xea\xfc\xdd\xda\xc7\xa4\x47\xcb\xd3\xd5\xa5\xff\x76\x93\xb4\xda\x5b\xb8\x72\xaa\x64\x8e\x39\xae\x4d\x74\x42\x18\x91\xdb\x15\x3d\xc1\xd7\xc0\xb5\x38\x3e\xd6\xe8\x96\xa0\xdb\x03\xb5\xa2\x9b\xd1\x33\x01\x07\xed\x89\x52\xc8\xea\x6a\x05\x96\xdf\x33\xaa\x35\x9f\x8a\x61\x25\x73\xc8\xcb\x7d\xb6\x0e\x21\x3a\x1c\xaa\x7e\x9e\x4d\x5b\xf1\x2a\x18\x27\xba\x6d\xd3\xc7\x60\x7f\x4b\x64\x0b\x9f\x11\x5e\x25\x3f\x3a\xbb\x8e\xf7\xa3\x4f\x64\xc8\x28\x11\x3d\x0c\xa6\x25\x15\x74\xca\x86\xee\xe3\xc3\xf0\xf1\x61\xf8\xd6\x43\xc0\xdc\x85\x6a\x65\x05\xe5\x9b\x5d\x89\x1a\xc0\x3b\xba\x80\xf6\x2e\x50\x3c\x78\x60\xb5\xc2\x58\xbd\xb4\xc9\x05\x5e\x09\xf8\x9f\xb0\xf3\x00\x51\x92\x2a\x77\x8d\xba\x02\xbe\x7f\x16\xe8\x48\xe4\xfc\x4a\x8b\x6a\x46\x13\x87\x2e\xb7\x33\x9a\x30\x41\xc7\x85\xbf\x05\xbf\x5c\x08\x5a\xf2\xcc\xef\xee\x79\x01\x0e\x3f\x5c\x0a\x32\x61\xd4\xd4\x8a\x91\x29\x35\x2c\x8e\x1d\x3c\x05\x79\xdc\xcc\x6b\x43\x32\x2a\xd0\x4c\x3b\xc6\x48\x0d\x7b\xba\xc2\xcc\xf4\x68\x93\xbd\xab\x9b\x17\x57\x07\xdf\xad\x56\x5a\xf6\x04\x78\xe9\x65\xbc\x14\x56\xe9\x31\x0a\xd8\xf3\x8d\xcc\x2d\x75\x1c\x35\x5a\x6f\x71\x8a\xef\xcc\xfe\xba\x1a\x39\xb6\x38\xb7\x90\xc7\xe6\xa4\xc0\x48\x13\x52\xe9\xf1\xd3\xa2\x67\x03\x5a\x95\xcc\x47\x2b\x30\xd3\x33\xe1\x1b\x99\x3b\xbf\x31\xd3\xc0\x14\x8b\xae\x80\x24\x25\xbd\xf3\x3e\x5f\xc1\x38\x46\xe7\x94\x17\xe0\xea\xc0\x85\xe6\xb9\x15\x8d\xb2\xed\x8e\x45\xfe\xe9\xc8\x3c\x1b\x36\x41\x7b\x08\x87\x25\xad\x86\x56\x1b\xdd\x0c\xaa\xad\x3b\xb3\x3c\x30\xce\xa8\xa4\xd5\xda\x5e\x78\x1d\xd1\x99\x76\x1c\xbf\xc3\xeb\x8e\x3c\x94\x96\x41\xdf\xdf\xcf\xbc\xac\x4b\x42\x4b\x59\xa3\x7b\xef\x32\x29\xf6\x4e\x70\x7b\x21\xb6\x2b\x88\xac\x5e\x4b\x65\x49\xf7\x63\xd2\xdf\x5d\xf7\x85\x5a\xc5\x3b\x59\xc3\xfb\x59\xc1\x7b\x58\xbf\x77\xb6\x7a\xfb\x0b\xae\xee\xf8\xf8\xd1\xdf\xb9\xb5\x30\x92\x8b\xad\x18\xa9\x42\xad\x8c\xeb\x09\x09\xe3\x70\x4d\x64\xc9\x8d\x71\x97\x41\x09\x01\x18\x10\x6e\x1a\x37\x27\xee\x2c\x40\xad\x18\x2c\xaf\xc3\x3e\x57\x05\xcf\x38\xdc\xc0\xf9\x1b\xcf\x01\x4a\xe8\xf7\x1c\x33\xcb\x50\x41\x78\x59\xa1\x23\x3c\xe0\xf4\xd0\x73\x5a\xe7\xa0\x14\x66\xe2\xdc\xd3\xd8\xe7\x8c\xb1\xdc\x7d\xec\x70\x7c\x0e\xc7\x67\xf5\xf1\xd1\x7d\xd4\x9c\x54\xc3\x89\xce\xd1\x41\xd3\xb1\x88\xef\x6b\x5a\x81\xf3\x37\xe2\x90\x3d\x2a\x10\x9f\x63\xc5\xb5\x8f\x0c\x8c\x8e\xb7\xcc\x68\xe7\x6e\x0d\x3d\xac\x44\xb8\x14\xbd\xea\x8d\xac\xc1\x8b\x9f\x4e\x26\xcd\x16\x39\xab\x0a\xb9\x28\x41\x69\xbe\x36\x6d\xfe\x0f\x5a\x11\x2b\xab\x82\x1a\x16\x74\xa6\xcd\x86\xcc\x07\x0b\xd5\x7d\x42\x47\x9f\x37\x58\xf4\x71\x44\xd6\x17\x19\x02\xfa\x08\xd2\xee\xf6\xeb\xbc\x8e\xa1\x9c\xdd\xa5\xe2\x4e\xf7\x7d\x8f\x1d\xa0\xd9\xcb\xd2\xd3\x35\x08\xf3\xe5\x87\x5d\xf6\x58\x76\xd7\xd0\xca\x43\x30\xe5\x26\x50\x77\x0b\x88\xea\x1c\x0c\xd5\x69\xff\x3a\x06\x45\x1e\xc2\x20\x7b\xf0\x97\x47\x10\xfe\xb6\xee\xa5\x91\x05\x43\xc9\xb5\x9b\x59\xf0\x53\x6c\x1f\x4a\x2b\xa2\xe7\x48\x32\xd2\xd3\x5c\x80\x7e\xf2\x62\x8b\x3d\x5b\x71\x5e\x80\x5a\xc6\x50\xa8\xa3\x68\xa4\x9f\x97\xdd\x38\xb1\x20\x76\xcf\x8c\x2b\xaa\x99\x54\x99\x34\x0a\xee\x93\x7f\x1f\xb0\x6d\xc0\x40\x7e\xfa\x43\x12\x3a\x13\x42\xeb\x02\x86\xfc\xde\xff\xeb\x0f\x0f\x0c\x89\xea\xc6\xd8\x70\x4a\x3d\x04\x8c\x2b\xe8\x40\xb8\xc8\xe1\xee\xda\x2d\x15\x20\x80\x63\x59\xf8\xc0\xb2\x7c\x68\x1d\xc6\x68\x3a\x0b\x3a\x5c\x72\xc7\xc6\xda\xdd\xc6\x27\x6a\x97\xb3\x38\xc4\x93\xc1\xc8\x07\xe9\xf2\x9d\xb2\x01\xb9\x01\x33\x5c\x7c\x03\x27\xe9\x83\xc4\xcc\xa7\x6b\xaf\xc9\x53\xb8\x6d\xe5\x22\x5b\x19\x7d\x03\x20\xdf\x44\x26\x8f\x2b\x6b\x30\xf9\x88\xc1\x8d\x20\xdb\x4d\x90\xb9\x63\x8b\xc8\x6c\x9c\x08\x01\x24\x7f\x10\xb1\xc4\xb3\x02\xe4\x1d\xff\xe1\xad\xb8\xe5\x98\x0b\xfc\x18\x0e\xed\xb7\x02\x46\xf7\x00\xb5\x92\x5d\x51\xe0\x67\xf6\x01\xae\x6e\x72\x46\x03\x66\xdf\xf6\x90\x31\x02\x95\x5c\x2d\x5d\x24\x22\xc5\xd5\x8f\x35\x2d\x9a\xf1\x4d\xee\x95\x6b\xb4\x44\xd5\xef\x79\x91\x67\x54\x39\x07\x52\x38\xa3\x44\x4b\x67\x24\x07\x42\x90\x51\x11\x4e\x7b\xdc\x23\x2c\xb1\x4a\x2a\xaa\x0c\xcf\xea\x82\x2a\x62\xcf\xc2\x54\xaa\x4e\x31\x48\x5b\x21\x1a\x91\xe6\x96\x65\x52\xe4\x7d\x14\x80\x4f\xed\xbe\x6d\x37\x8e\x8a\x29\xee\x32\x89\xf2\x92\xb5\x91\xf4\xa4\x79\x5d\x26\x27\xfe\x54\x87\x23\xd6\x30\x8c\x34\xad\xf9\x98\x8a\xf8\x34\x21\x8f\xe1\x54\x8c\xc8\x57\x0b\x6f\x85\x01\x8b\x8c\x0b\xdc\xd2\xcc\xf8\x18\x3b\x8f\xb2\x0e\xd8\xf1\x40\x4d\xa4\x82\xb8\xb7\x93\x5c\x62\xb0\xd7\x9c\x67\xe6\x74\x44\xfe\x3f\xa6\x24\x06\x87\xb3\x29\x26\x86\x75\x28\x1e\x14\x57\xa8\x89\x0c\xce\x41\xaf\xc8\x09\x26\xe9\xe5\x65\xc9\x72\x4e\x0d\x2b\x16\xa7\xa8\xc7\xfa\x34\xbf\x5d\xb6\xae\x8b\xd1\x20\xc9\xe9\xfc\x9b\x5f\x6f\x68\xd9\x37\x3c\xf3\x7b\x1f\xf0\x16\x21\x83\xee\x49\xad\x2d\x0c\x3c\x48\x6e\x10\x37\x53\xf7\xa6\x18\x2f\xee\xc9\x4c\xd8\xe0\xbf\x59\x3c\xa0\x44\xb1\x29\x60\x39\x62\xee\x03\x71\x1c\x1d\xb5\xdf\xcb\x5a\xac\xb7\x18\x36\x16\xfe\xce\x29\xe1\xdf\x27\x1d\xd7\x06\x40\x3f\x89\x98\x90\xcc\x24\xb1\x60\x52\x02\x66\x4b\x60\xe7\x96\x3c\x60\xab\xe8\xe4\xd6\xe1\x4e\x62\x8f\xc1\xce\x30\x97\x2d\x01\x35\x7b\x09\x89\x0e\x1f\xea\x81\xcb\x10\x7b\xe2\x00\xd3\x0a\x09\x36\x8e\x1c\x00\x7e\x22\x04\x23\x82\xc2\xb7\x58\xee\x1d\x64\x31\x8d\x01\x74\x25\xc7\x6f\x8e\xf7\x42\x7c\x71\x39\x4a\x56\x74\x4a\xb7\xa7\x52\x6f\x2a\x23\xad\xae\x24\x67\x86\xa9\x12\x72\x5e\xcf\xe4\x3d\xfe\x8e\x6c\xab\x72\xad\x98\x4b\x17\x6e\x57\x3b\x93\x1a\xb8\x52\x33\x3e\x1a\xce\x2f\xf8\x5c\xdc\xd3\x05\xa1\x4a\xd6\x22\x77\x52\x53\x20\xa0\xef\x5b\x1f\xfe\x20\x05\x8b\xb7\x66\xcd\x3b\xd7\x31\x33\xd4\x1e\x9b\xd7\xa3\xd7\x5b\xd2\xda\x77\x04\x58\xcf\x90\x78\x98\x4d\xcb\x52\xe8\xdd\x70\xfc\x99\xd9\xcb\xbc\x14\xa3\xf9\xb7\xa2\xe8\x23\xcb\xbd\x47\xf4\x82\xae\x43\x50\xc2\xf8\x04\x6c\xb7\x03\x7c\x75\xaf\xb8\x61\x09\x79\x3c\x99\xd0\x42\x43\x2d\xff\x5a\x04\x11\xf6\xb4\x29\x82\x40\x93\x2e\x0b\xda\xee\x6a\xa6\xeb\xf1\x03\xcf\x99\x3b\x50\x80\x72\xf1\x98\x05\x84\x3b\xd6\x1b\x8e\x5c\x33\x6e\x9c\x9c\x60\x4b\x2b\xb1\x49\x69\x4e\xf7\xe3\x7f\x86\x0b\xb4\x9a\x75\x1f\x95\xc4\xa7\x24\xa8\xf6\xb8\xda\xaf\xd8\x8c\xce\x99\x26\x9a\x97\xbc\xa0\xaa\x80\x30\xe4\x5b\x9c\x1f\x19\xd7\x66\x75\x72\x8b\x7e\x89\x13\xd2\x99\x24\xc3\x6d\x05\xb5\x9f\x87\x85\x13\xd0\x08\x3f\x2f\xac\x2f\xe0\x8b\x12\x7c\xce\x8a\x5a\xf3\xf9\x43\x4f\x93\x0b\xac\xda\x81\x55\xb7\xb9\x74\xe5\x3c\x25\x9e\x90\x47\x37\x35\x0c\x4b\xaa\x72\xbf\xe9\xc0\x93\x51\xd9\x07\xcd\x1d\xfc\x4e\x68\x96\x31\xad\xbd\xbb\xf6\x22\x75\x21\x0f\x6b\xf8\x52\x72\x95\xd0\x7b\x7d\x55\x50\x6d\x78\xf6\x55\x21\xb3\xbb\x5b\x23\x55\xaf\x74\x20\xab\xfa\xb7\x32\xbc\x9c\xff\x70\x4b\x2e\xb9\xbe\x4b\x02\x95\xdc\x9d\x6a\x6a\x2e\xa1\xe4\xae\x1e\xb3\x82\x99\xe3\x63\x8d\x5c\xae\xa4\xd9\x8c\x0b\xe6\x19\x9c\x08\xd1\x6e\x4e\xe1\xb3\x50\xee\x7b\x67\xea\x62\x2a\xcf\x1c\xbe\xfe\x9c\xde\x6b\x86\xd3\x1f\xdb\xe9\xdb\x9f\x59\x97\x64\x17\x7b\xbd\xa7\xc0\xc9\x5c\x5f\xee\xe9\x0e\x62\xa2\x3f\xd9\x39\xf6\x33\x6e\x1f\x63\x2f\xaf\x3a\x4c\x78\xc1\x5c\x61\x13\xbb\x60\xef\x79\xe3\x4e\x05\xec\xdf\x42\xd6\xe4\x9e\xa2\x8e\x0c\x14\x71\x44\x3e\xf1\xea\x0d\xb9\x12\xba\x56\x2c\x5a\x37\xda\x43\x71\x1d\x43\x58\xbd\x72\x05\xfb\x8d\x0a\x88\xa5\x7b\x4e\xd7\x22\x57\x9f\x69\x59\x15\x4c\xbf\x21\x47\xec\xb3\xf9\xf5\xd1\x80\x1c\x7d\x9e\x68\xfb\x3f\x61\x26\xfa\x68\x44\xae\xcb\x70\x29\xcf\xc5\x84\x29\xc5\xbc\x8f\x25\x76\xb0\xac\x39\xe1\xba\x8f\x82\x2e\xce\x5f\xd7\xca\x6e\xb9\x24\xf7\x98\xea\xc6\x12\x7c\xa6\x94\x54\x21\xc4\x25\x01\x03\xf0\x9a\x4c\x96\x95\x92\x25\x4f\xcc\x7c\x80\xee\x7b\x75\xe4\x05\xe3\x43\x97\x5a\x3f\x6d\x6c\x08\x1d\x3d\x42\x24\x2f\x44\x17\x54\xb8\x9e\x78\x5f\x0b\xd4\x22\x9d\x5a\x0f\xc3\xb9\x46\x76\xf3\xdd\x28\x96\x90\xa5\xdb\xfd\x36\xc4\xea\x92\xb3\x9c\xcd\xcf\x74\x4e\x5f\x0f\xe0\x33\xda\xf9\x18\x37\xe7\x44\x35\x39\x7a\x7d\x34\x22\xb7\x9e\x11\x0f\xd2\x39\xc6\x76\x13\xa9\xc2\x80\x60\x67\x7f\x75\x44\x4e\xa4\x82\x91\x33\x2a\x48\xc1\xe8\xdc\xd9\x96\xf1\xb8\x2d\x50\xdd\x3d\xed\x1c\x6b\xdd\x35\xec\xb4\x7b\x51\xa7\xae\x42\xea\xf2\x26\xfa\x7e\xde\x04\xa0\x6a\x17\x86\x34\x91\xca\xa5\x18\x0a\x4d\x34\x33\x70\xf4\xb8\x68\xa8\xd0\xcf\x40\x60\x49\xcf\x2c\x1d\x9e\x7a\xf6\x85\x8e\xef\x07\x3a\x90\xe0\x3f\xd6\x8c\x5c\x5f\x86\x5c\x1d\x4c\x69\xae\x8d\x3d\xc6\x79\x83\x75\x71\xe4\x67\x27\xe7\x25\xfd\xbb\x14\xe4\xea\xab\x5b\x37\x81\xd3\x67\x05\xd5\x56\x6a\x40\xff\x5e\x2b\x66\xb9\x70\x0f\xe6\x1e\xfa\xb4\x19\xba\x7d\x4f\x2e\xa9\xa1\xc8\xd7\x9d\x23\x96\x88\xa4\xdc\xb2\xec\x31\x17\xb9\xfb\x29\x61\xd8\x4f\xcd\x5b\xed\xee\x7d\xd8\xe6\xf5\xea\x1b\x7e\xf7\xf1\x7a\x4f\x3c\x38\x03\x62\x3e\x7d\x2f\xf3\xde\x8c\x38\xe9\xea\x89\xef\x1f\x2d\x4c\x2f\xf0\x3d\x29\xed\x98\xc4\x6a\xef\x03\xf2\x91\xd1\x9c\xd8\xf3\xeb\xfe\xf9\x83\xd5\x3d\x3b\xd3\xaa\x4e\x2c\xc4\x03\xb0\xe7\x32\x7c\x37\xbf\x84\x34\x88\x26\xb7\x98\x03\xc7\xca\xf1\x92\x71\x21\xc7\xc4\x1d\x87\x7d\xcf\xfd\xbb\x8f\xd7\x3b\x4c\xfd\xbb\x8f\xd7\x7e\xe6\xf6\x9f\x72\xf2\x74\x93\xde\x49\x7c\x8b\xd2\xdb\xdb\x96\xb8\x15\x59\x72\x8c\x09\x6b\x8b\x64\xdd\xe5\xb1\xd1\xbe\x24\xb1\x7d\x42\xec\x8e\x8b\x0e\x01\xfe\xcd\x53\x66\xfb\x58\x85\x02\x7d\xd5\x92\x7b\xc4\xdb\x19\x85\xac\x0a\x21\xd6\x17\xf6\xd9\x6e\xbc\xb6\x5c\xc1\xef\xb8\x55\x02\x81\xb6\x91\x4b\x86\xb7\x9c\xf9\x1b\xef\x3b\x10\x7a\xac\xee\xf0\x1e\x3c\x35\x73\x47\x5f\x09\x3a\x6e\xe6\x09\x82\x9d\xa0\x55\x49\x84\x9f\x9c\xef\x3a\x2f\x38\x54\x69\xb0\xda\x7d\xea\xac\xaa\x61\xca\x7b\x3d\xf5\x3b\x8a\x1c\x41\x9c\x58\x32\x6e\x91\x13\xfb\xdb\x19\x18\xc7\x4e\x47\x40\xad\xa0\x21\xb8\xf1\xb7\x84\x92\x8f\xdb\x84\x92\xbd\xc9\x0f\xb0\x03\xf6\xc4\xf4\xe5\x8a\xb6\xcf\x4a\xae\x08\x3f\xdc\xba\x54\x95\x2f\x99\x31\x62\x18\x67\x27\xd6\x08\xf8\xb5\xb5\x65\x77\xe6\xf8\x50\xe4\xca\xbf\x0c\xe4\x22\x21\x58\x76\x07\xfe\x19\x3b\x7a\x3e\x14\x42\x65\x7c\x3a\x90\x86\x6b\x26\x62\xdf\xad\xa3\x35\x2e\xbb\x1b\x72\x5d\x8b\x73\x5d\x4a\x2e\xf6\xc9\x07\xe3\x31\xa2\xef\xaa\x7c\x3f\xbf\x28\x24\x81\xf0\x9a\x74\xc0\xc5\xce\x93\xcc\x58\x35\x9b\xf4\xb9\x12\xb7\x1d\xde\xde\x36\x2d\x81\x17\xac\x9a\x91\xb7\xb7\x2b\x8e\x31\xc0\x1e\x66\xad\xd1\x3e\x78\xac\x49\xc1\x27\xcc\xf0\x2d\x4b\x78\x84\x83\x5c\x4a\xc1\x8d\x54\xeb\xb3\x2b\x90\x5e\x87\xd3\x0f\xd7\x97\xa1\xfa\x7e\x76\x67\x63\x6e\xa2\xf7\xc9\x5b\x4a\x32\x59\x14\x2c\x33\x2e\x5b\x1e\x80\x37\x74\x5b\xa1\x3c\x31\x67\x0f\x18\xdd\xfd\x0e\xd4\x27\xa7\x28\x9d\xe1\xe6\x9e\x7d\xbc\x3a\xbf\x7c\x7f\x35\x2a\xf3\x9f\xcf\xe4\xfd\xd0\xc8\x61\xad\xd9\x90\x77\x48\x7e\xf4\x7c\xde\x8b\xf8\x54\x9d\x72\xf1\xb5\x0d\x32\x98\x46\xf0\x5b\x1f\x9a\x4d\xbe\xd3\xe8\xb5\x00\xb6\x23\x7f\x27\x25\xa5\x19\x10\x45\x5d\xf8\x35\x75\xa6\xa7\xba\x28\x10\xda\x46\x31\x36\x48\x6d\x31\x1b\x43\x43\x7a\x2f\xec\xc1\x86\x8a\xc6\x02\x1f\x57\x86\x78\x7a\x84\xeb\xc3\x31\xb6\xcb\x24\xcb\x50\x8c\x3d\x9b\x70\xbc\x6d\xbc\x47\xc3\x99\x99\x59\xa8\xde\xb1\x05\x01\x47\xe0\x89\x54\x16\x9f\x54\x13\x37\x98\xc9\x60\xe9\x67\xb5\x66\x6a\xe4\xd8\xce\x93\x83\xad\x47\x82\xb2\x1d\xf2\x42\x86\x8e\xab\x60\xe6\x5e\xc7\xa4\xe1\x4e\x5e\xa3\xb5\x99\x31\x61\xb8\x0b\x60\x76\x90\x59\x09\x44\xe7\x87\xfd\xe4\x50\xeb\x98\x1f\xad\x5f\x36\xb3\x43\x06\xb0\x3e\x38\x69\x4f\x4d\x5f\x74\xb4\x7d\x20\x4e\x31\x25\xf3\x21\x96\x4b\xd1\x5c\x82\xc3\x06\x26\xb7\x6c\x20\x1a\xcd\x4b\x2e\x5e\xe0\xe9\xcc\xb8\xc8\xb7\xc1\xa1\x65\x00\x83\x1e\x4d\x51\xcc\xbd\x73\x06\xfd\x70\x6f\x48\xbd\x26\x85\xb9\x34\xdc\x0d\x62\xf3\xfe\xb0\xd3\xe1\x2b\x17\xfa\xc7\x62\x88\x5f\x19\x56\x79\x84\xca\xe1\x32\x70\xf9\x06\x6f\xbf\x26\xa5\x27\xb8\xe2\xdb\xd3\x6e\x93\x27\x96\x86\x1e\x57\xcf\x7d\x12\x40\xf5\x91\x79\x1e\xca\xbd\x23\xcd\xac\x24\x77\xee\x9f\x21\xd9\x28\x9e\x51\xaf\x2f\x5b\x78\x54\x54\xd1\x92\x19\xa6\xd0\x05\xce\x39\xd5\x09\x17\x9d\xf0\x6d\xc5\xc4\xad\xa1\xd9\xdd\xbe\xb3\x2c\x1f\x38\xee\xe3\x71\xdc\x07\x5f\x05\x7a\x44\x70\x29\xd7\x16\xe9\x2d\x32\x17\x8e\x0b\xbd\x10\x12\x13\x32\x1d\xf6\xb1\x72\x84\x4c\x77\x4d\xee\x1a\x33\x1f\xa2\x61\x03\x3c\xdd\x42\xea\x4e\xf0\xe0\x47\x28\xec\x87\x1b\x76\x3f\x03\x8e\x04\xee\x72\x8f\x96\x74\x6d\x52\x87\xd2\xbe\x19\x73\x13\xcf\xbd\x66\x86\x54\x4c\x95\xdc\x85\x75\x4b\x41\x32\x17\x16\x00\x7c\xcd\xf2\x30\x37\x5c\xc2\xf3\x04\x91\x99\xa1\x2e\x66\x86\x8c\x99\xb9\x67\x4c\x90\x57\xaf\x5e\xbd\x02\xb9\xe4\xd5\x6f\x7f\xfb\x5b\x02\x69\x26\x72\x96\xf1\x72\xb9\x21\xb4\xfa\x5f\xaf\x5f\x8f\xc8\x7f\x9d\xbf\x7f\x07\x5e\x65\x95\xd1\x64\x2c\xcd\xcc\x8d\x6c\x1b\x34\x3a\xeb\x01\xf9\x3f\xb7\xdf\x7e\x88\x29\x96\x9a\xbf\x82\x0a\x12\x96\xd7\x74\x11\x7c\xf5\x9b\x5f\xff\x7a\x44\x2e\xb9\x82\x78\x62\x0e\x11\x10\xc1\x09\xb2\xf2\x8e\x81\x50\xd3\xac\x1d\xc1\xef\x38\x88\x73\x12\x2e\xf9\x74\x06\x00\xb0\x07\x42\x8a\x49\xc1\x33\x83\xe9\x4a\xf1\xe8\x23\xa0\x5d\xfa\x1d\xea\xc2\xbd\x9c\x14\x01\x93\x1b\x90\x82\xdf\x31\x32\xd1\x5f\x2b\x59\x57\x31\xcc\x51\x31\x6d\x65\xd9\x8c\x0a\x88\x2a\x81\xc1\xe2\x5e\x69\x66\x9e\xd5\x09\xa3\xa3\x21\xa8\x81\x83\xd0\xa7\x25\xa0\x0c\x42\xda\xc6\x21\xe2\x43\x45\x79\x70\x1c\x84\x3b\xf5\x46\xd1\x90\xa0\x7b\xe6\x49\x9a\x4a\x1f\xbb\x52\x29\xf9\x37\xdc\x2a\x2e\x7c\x14\x94\x93\x90\xb5\x93\xc9\x5c\xd0\xa9\x48\x6c\xae\x3e\x2a\xdf\xf2\x42\x17\xf1\x9f\xc4\x4f\x5d\x4f\xd2\x40\x3b\x08\x4b\xc7\xca\x8d\x8d\x9c\xba\x2b\xbe\x1c\xeb\x40\x58\x6c\xd2\xb8\xaf\xb5\x58\xea\xed\x4a\x34\x39\xf2\xe3\x0a\x77\xb9\x10\xb6\x38\x06\xba\xe2\xba\x00\xa0\xa4\x1c\x5c\x23\xcf\x65\xc3\xcb\x47\x33\x53\x3b\xd0\x80\xe7\x95\xfd\x36\xd3\xda\xc5\x11\x95\x54\xdd\x59\x25\xc1\x51\x81\x11\x78\x3d\xeb\x10\xc3\x84\x01\x65\x73\x34\x96\x97\x74\xd1\x88\x1a\xb0\x1f\x39\x1e\x8d\x8e\xf1\x98\x48\x85\x69\x82\x11\xe7\xed\xfb\x67\x8a\x97\x6e\x7a\xa5\xd3\x0a\x2b\x7a\x82\x3d\xc7\x55\x44\xa2\x0d\x6f\x67\xea\x20\xd5\x25\x39\x78\xcf\x8a\xa8\xfd\x4a\x6f\x77\x2f\xb9\x3d\x84\x05\x74\x68\xda\xb7\xbc\x76\x8f\xb2\xda\xeb\xb2\x35\x38\x18\xbb\x93\xd0\xb5\xd8\x6c\xef\x32\x03\x65\x27\xd6\xb7\x62\xaa\xc7\xa5\xe3\x7c\xdf\xf6\xe3\x7c\x2e\x5e\xaf\x51\x77\xf0\xe5\xb3\xba\xeb\x09\x46\xba\x34\x49\x97\x23\x0d\xa9\x28\x10\x6a\xfc\xc5\xb0\x97\x17\xcd\xd1\x52\xb4\xe9\x57\xd3\xa2\x0f\x77\xc3\xa7\xdb\xc5\x04\x3e\x0d\x5c\xf3\xb7\x13\xb8\x68\x47\x4a\xab\x46\xed\xa0\x02\xed\x06\x20\x63\xfa\xc3\x33\x22\xef\x1d\xa9\x45\x24\xa3\x63\x2d\x8b\xda\x60\xd7\xf8\x63\x4a\x87\x61\x50\x9f\x65\x01\x88\x6f\x68\x96\x50\x65\x13\xab\x27\x76\x23\xd0\xf8\xf4\x38\x9c\x87\x44\xc2\x8f\x98\x48\x38\xa4\xbe\xd6\x1d\x4b\xc1\xe9\x47\xcb\xdc\x9d\x69\xde\x47\xbf\xd2\x9c\x9c\xc4\x0a\x44\xfe\x3a\xfe\x5a\x18\xa6\x26\x34\x63\xa7\xa9\xde\x15\x2a\x3d\x05\x17\x21\x1f\x17\x31\xa3\x22\x2f\x50\x00\xcf\x98\x02\xdc\x67\x9f\x0d\x53\x16\x24\x17\xb7\xd7\x24\x57\x7c\xce\x94\x26\x27\x5f\x31\x2b\x2f\x62\xfe\xd4\x4e\xd1\x55\xfb\xf5\xad\x84\x69\xec\x4b\xd3\x83\xc1\xfa\xba\xea\x41\x27\x4f\x79\x44\x72\xbe\x22\x98\x10\xaa\x08\x52\x9d\xea\xb2\x23\x8b\x4a\x40\xa0\x81\x66\x2c\x64\xad\x9c\x15\xdd\xa7\x6c\xce\xa4\xb2\xea\x12\x0e\x4c\x35\x51\x6c\x6a\xa5\x59\xe5\xeb\x98\x33\x92\x15\xb5\x7d\xb1\x57\x77\xb6\x87\x38\x00\x46\xd3\xec\x26\x5f\xbd\x89\x93\xaa\xe5\x9c\xe7\x9e\x55\x62\x59\xf5\x50\x30\xb5\xa2\x3a\x09\xb5\x49\x8a\x5b\x24\x80\x45\x19\x1d\x18\x6a\x08\x62\x6d\x38\xfb\xa7\x46\x61\x09\xb9\x2d\x3a\x54\xa6\xe9\x43\x84\x65\xce\x6e\xea\x71\xc1\xf5\xec\x76\x47\x13\xe2\xaa\x21\xd0\x59\x61\xe9\xd6\x6f\xad\x25\x51\x33\xa1\x39\xb0\x3c\x4b\xc6\x2d\xd3\xe5\x56\x8e\x92\x00\x44\xdf\x3b\x45\x48\x09\xd1\x1f\x05\x73\x19\x0c\xec\x4f\x1f\xe2\x3c\x5c\x50\x1a\xe6\x2c\xc9\xd9\x77\xa2\x6a\xbc\xcf\x68\x51\xe8\x76\xc0\xae\xa7\x98\x28\x7b\xf8\x40\x35\xdc\x53\x6e\xb7\x3b\x14\x5d\x6a\x25\xc7\x5c\xbb\x30\x4d\x4a\x89\x61\x3c\x02\x92\xf3\x62\x23\x48\xbd\xe2\x3b\x24\x81\x8c\x10\xae\x0c\x28\xb3\xe7\xaa\xb4\x07\x73\xe9\xe3\x99\x4b\x1f\xea\x87\xa7\x43\x81\x3a\x9a\x44\x43\x37\xd2\x92\x06\x52\xea\x49\xee\x16\xa7\x8e\xbd\x5e\x2b\xe0\x37\xcf\x8d\x51\x7c\x5c\x9b\xfe\xf9\xde\x5a\xdd\x81\x4d\x5b\x45\x04\x4e\xf1\xd0\xad\x3e\x4b\x50\x34\x66\x4e\x6f\x92\xcf\x78\xf6\x23\xcf\x01\x76\x83\x2f\x8f\x35\xc9\x65\x56\x87\xb4\xb1\x00\xb4\x78\x81\xd6\x25\x7b\x22\xe9\x7b\xae\xfa\xa7\xf4\x4a\x3f\xb2\x15\xbd\x72\x79\x2f\xee\xa9\xca\xcf\x6f\xb6\x78\xdf\x37\xd9\x79\xec\x95\x0a\x4a\xfe\x35\x14\x18\xa5\x63\x59\x9b\x98\x3a\xf4\xa7\x63\xaf\x5e\xa5\xa6\x1b\x69\x49\x43\x47\x7b\x74\x5f\x45\xff\x60\xe2\x3e\x98\xb8\x1b\xcf\x2e\x26\xee\x6b\x34\x71\xa7\x79\x70\x1b\xc7\xd5\xa7\x57\xe0\x45\x57\xdf\xde\xc7\xb4\x92\x5e\x46\x02\x83\xd2\x54\xdb\x8f\xbf\x25\xc0\xe1\x11\x89\x7b\x9b\x08\x7d\x9e\x02\x01\xcf\x7e\x7e\x8b\xea\x23\xd9\x49\xbb\x97\x40\xc7\x67\x5d\x8d\xd2\x4d\x25\xd1\x41\x6a\x48\x6a\x98\x0f\x5c\x16\xe8\x81\xd3\xbb\x44\x1e\xab\x83\x62\x12\xea\x1e\x15\x90\xf1\xe9\x09\x7c\xd2\x7b\x03\x48\xcf\xfa\xe4\xf8\xf4\xdd\x0d\xb2\x43\xad\x72\x7c\x9e\xb9\x62\x39\x3e\xbd\x6d\xdf\xa4\x7f\xf5\xf2\x15\xcb\x7d\xdc\x1a\xe6\x3b\x2e\x6d\x77\xb3\xfe\xae\xe6\xfc\x41\xac\x9c\xf9\xf2\xd9\xfa\xc1\x9c\xbf\xf4\x3c\xa1\x39\x3f\x21\xdc\x9e\x18\xac\x30\xed\xa7\xe6\x36\x6f\xdf\x1f\x33\x2f\x56\x8e\x62\xf6\x35\x8b\x72\xde\xb2\x1f\xcb\x35\xe1\xb5\xea\xf1\x68\x74\x7c\xec\xed\xfd\x0e\x3f\x6b\x33\x19\xfe\x8e\x30\x91\xc9\x1c\x37\xd5\x8e\xaf\xb4\x01\xa6\x1f\xd5\xf4\x74\x2e\xa5\xff\x56\x7a\x35\x0b\x63\xf7\xdb\x92\x1e\x27\xd8\xa7\x04\x78\xfb\x20\x16\x19\x19\x63\x48\x31\xe0\x16\x18\xb2\x0a\x39\x0e\x19\xab\x9b\x60\x61\x9f\x50\x6b\x0b\x2a\x8a\x9c\xe0\xcb\x51\x56\xd5\x03\xd7\x60\x54\xb2\x52\xaa\xc5\x20\x34\xb2\x3f\x36\x7a\xb9\x16\x98\x7b\x2a\xab\x95\x62\x02\xea\x9b\xbc\x54\xfe\xea\x41\xf0\x88\xec\x35\x40\xbd\x5b\x74\x5b\x7c\x9a\xdb\x1a\xef\x00\xc0\x24\x15\xab\xd5\x4d\x42\x66\x13\x3d\x88\xf7\x1c\xf6\x2d\x13\x73\x32\xa7\x4a\x77\x85\x39\xd9\x95\xa3\xe6\x7c\xce\x75\x97\x94\xff\x6b\x16\x77\x1b\xcc\x3e\x90\x76\xb0\x36\x55\x6d\x1c\x75\xf2\xb8\xeb\x33\x35\x35\x8b\xce\x45\xc1\xe1\xf5\xa6\x3a\x6d\xed\xe7\x85\x16\x92\x69\x3e\x9d\xca\xca\x34\x9f\x7e\x45\x66\x56\xf7\xed\xb9\xf5\x0f\xa8\xdf\xd4\x7e\xfc\xd6\xee\x7e\x46\x22\x93\x89\x89\xc1\xbc\x60\xf6\x08\x87\x00\x8c\xe1\x97\xbc\x57\x28\x82\xef\xd3\x74\x97\x34\xac\xac\xa4\xa2\x6a\x41\x72\x67\x6b\x58\xac\x88\x08\x4d\x42\x42\x1f\x9c\x1a\x06\xe6\x91\x73\xb5\xa7\x68\x84\x1e\xd1\xa0\x2c\xe7\xf5\xda\x4a\xf0\xeb\xc0\x86\xbd\x52\xa0\xdd\x43\x36\x30\x97\x49\xcc\x5f\x77\xba\x66\x3e\xb1\x22\xcd\xee\x5c\xc5\x20\x0f\x55\xe4\xfd\x49\x90\xcb\xd1\x51\x2b\x0f\x34\x98\xc7\xe0\xee\xcf\x15\x5d\xf5\x8d\x71\xec\x86\x29\x0b\x6f\x43\x9c\x5b\xc0\x89\x6b\x78\x6a\x25\x92\xf7\xc0\x06\x9f\x68\x97\x48\xcf\xc8\x36\xfe\x77\x06\x05\xc2\x7a\xfb\xc6\xfb\x8e\x21\x1d\xb4\x04\xc9\x3c\x94\x4d\x2b\x64\x96\xdc\x3d\x37\x38\x14\x6c\xc3\x95\x47\x7e\x6f\xbb\xb7\x9b\x61\x47\x45\xf9\x02\x8c\x3e\x85\xc6\x7b\x3d\x9e\x41\x6a\x4b\x90\xe2\x01\x98\x61\x03\x3e\x25\x45\x04\x6b\x6d\xbf\x04\x99\xe7\x93\x36\xf1\x43\xf7\x3e\xc3\xa6\x49\xea\xbc\x35\x75\x0f\xfb\xcb\x6d\x58\x59\xd4\xdb\x20\x04\xc2\x0b\xea\xba\x06\x31\xd1\x7d\xc5\x89\x4b\x72\x02\x77\x57\xb1\x2c\x5a\x48\xee\xb8\x84\x66\x82\x17\x4d\x3c\xf3\xb9\xec\xc2\xc2\x6b\xe1\x1c\x0d\x9e\x10\x69\x5e\x30\x1f\xec\xcc\xfd\xfa\xf3\xbc\x9e\x9c\xee\x01\xfc\x2d\xf8\x63\xf4\xe0\x10\x47\xd1\x89\xa3\xc1\x22\xd2\xec\x78\x4d\x87\x0e\xea\x7d\x06\xc2\xc9\xf3\x37\x43\x9f\x82\x86\xeb\x58\x47\xb6\xc8\x5c\xcc\x2e\x6f\x64\xbd\xc4\x61\x11\x01\xc1\xbf\x75\x68\xff\xe3\x35\x61\x6f\xd6\x1f\xb3\x89\x8c\x85\x52\x50\x31\x72\x5e\xb9\x39\x2b\x98\x01\x27\x5b\x16\x12\x96\xe2\xcd\x70\x29\xe7\x16\xa7\xff\x2c\xc8\x77\x3e\x75\x3f\x9f\xbc\x21\xf4\xb4\x11\x09\xe1\x8a\xcf\x08\xc6\x72\x74\xd5\x2d\xe2\x77\x54\x2d\xf4\x80\x8c\x4f\xbd\x5b\x0a\x1c\x3c\x61\xa5\xc3\xc2\x0b\xbe\xa8\x5e\x2b\x66\x01\x00\xd1\xc7\x4a\x96\x44\x0b\x5a\xe9\x99\x34\xa0\x21\xd2\x8a\x66\xdc\x2c\x88\x51\x34\xbb\x83\x4a\x45\x8a\xb9\xcf\x0d\x48\x76\xea\xfc\xbb\x52\xf0\x35\xbd\x87\xcd\x4c\xc9\x7a\x3a\x03\x87\x58\x6c\x95\x15\x54\xfb\xd5\xaf\xec\xef\x94\x1e\x4d\x72\x2c\x54\x1c\x92\x07\x2a\x39\xe7\x9a\x4b\x67\xf4\xf5\xe3\xde\x84\x04\x71\x68\x48\xc6\xf2\xbf\x27\x9a\x31\x72\xe5\x51\x02\x7f\xb9\x45\xd1\x06\x0d\x1c\xaa\xe9\x23\x20\x43\x66\x73\xe1\xf2\x22\x44\x3a\x17\xee\xb0\x90\x6f\xda\x99\xaf\xfc\xe8\x69\xd8\xae\xd5\x73\x92\x0a\xee\xef\x7d\x06\x4f\x26\x72\x99\x5c\x5e\x9e\xdf\x5c\xeb\x54\x29\x41\xdc\x72\xe9\xef\xe0\x87\x42\x8a\x69\x9a\x4d\x20\x62\xa6\xa5\xa8\x02\xaa\xbc\xcc\x79\x5e\xd3\x02\x69\xa9\x9b\xcc\xc5\xed\x35\x76\xe7\xd3\x99\x19\xde\x33\x30\xca\x20\xcb\x89\x67\xc6\x7f\x94\x2f\x39\xed\x70\x0d\xb4\xd7\x38\xa3\x02\x1a\xb8\xec\xd4\xee\xe9\x02\xb2\xd7\x38\x4f\x93\xc6\xbd\xa9\xcf\x2f\x86\x43\xac\x82\x38\x4c\xef\x3c\x54\xed\xb0\xd2\x03\x58\xad\x2c\x88\x01\x53\x97\xe7\x66\x01\x9f\xa4\x03\x0c\xaf\x5d\x81\x36\x6a\x37\xc8\xca\x78\x9b\x55\x9a\x47\x90\xcd\xe6\x71\x93\x3f\xb9\x0a\x8a\x3d\x65\x84\xa3\x1f\x12\xeb\x59\x72\xdf\x61\x8f\x0d\x15\xf9\x90\x16\x16\x73\x6e\xbe\xbf\x70\x8e\xce\x78\x10\x1a\xf7\xf9\xbe\x18\x12\x17\x21\x7b\xb6\x15\x1d\x56\x1e\x01\x08\x87\x1f\xb3\x1c\x88\x46\x5a\x37\xf2\xde\x2a\xca\xbe\xb8\xf3\xf7\x17\x03\xc2\x47\x6c\xe4\xff\x0a\x4d\x3d\xd5\x32\x72\x8a\xde\x80\xc1\xd5\x13\xf0\x0e\xa6\x92\xda\xa4\xd2\xbe\x7f\xfd\xbd\x9d\xa4\xfd\xf5\x0f\xc3\xdf\x27\x49\x47\xff\xf0\x57\x57\x49\xfa\xaf\xad\xb7\xa9\x4b\x59\x48\xbe\xff\x57\x5f\xc6\xdb\xa5\xae\xfe\xab\xab\xc9\x05\x85\xab\x47\x50\x97\x7a\x4e\x0b\x9e\x23\x36\xc2\xb7\x15\xfb\x9b\xb7\x2f\x02\x98\x82\x6d\x27\xa3\x86\x09\x20\xd4\x3e\x36\x43\x48\x83\xdd\x5d\x75\x5a\x3b\xff\x13\xb0\x0c\x60\x6c\xd9\x80\x18\x29\xe1\x38\xe2\x91\x3f\x17\x84\xf9\x92\x9d\xb8\x56\x00\x07\x75\xfe\x6a\x9e\xf7\xd8\x61\x2d\x84\x43\x24\xae\x9d\x07\xcc\xed\x97\x42\x9a\x5f\x86\xed\xf7\x9e\x1a\xc0\x60\x24\xa1\x73\xc9\x7d\x1e\x72\x7b\x52\x04\x16\x76\x0c\x99\xb1\xc7\x0b\x52\x72\x6d\xe8\x1d\x1b\x91\x5b\xcb\x5b\xd2\x4b\x31\x84\x9e\x20\x90\xc8\x92\xe5\xa4\x16\x86\x17\xf0\x6b\x1c\xc7\x4e\x39\xe5\x39\xd7\x13\xa2\xeb\xcc\xd2\xd6\x4a\xb1\xa1\xe7\x62\xae\xd5\x12\x2d\x88\x6b\x19\x84\xcd\x9e\x51\x54\x09\xaa\x1c\xba\x02\x3c\xa8\x70\xe8\xb5\xe4\xce\x65\xe7\x29\x45\x16\x39\x17\x00\x53\x8f\xc8\x07\x60\x56\x85\xbf\x19\x46\xed\xc4\xd9\x31\x05\xcb\x98\xd6\x54\x2d\x06\x90\xdf\x9d\x87\x9c\xe0\xce\x83\x07\x38\x6a\x49\x05\x66\x57\x57\x2c\x93\x42\x1b\x55\x67\x06\xcb\xed\x8d\x95\xbc\x63\x22\x78\x0d\x2e\x17\xbb\x8f\x6e\x34\x70\xed\x25\x49\x36\xa3\x62\x9a\x94\xab\x29\x69\x0e\xb0\xff\x26\x48\x39\x7e\x3d\x16\x02\x74\x62\x05\x0b\x6e\x00\x14\x63\xcb\x47\x82\x35\xf6\xcf\x22\xa4\xe5\x19\x44\x73\xa9\x5d\x12\x2f\xb6\xd0\xae\x5e\xf4\x8b\xf4\xb4\xed\x0d\x81\x6d\xef\xd9\x0f\xac\x64\x86\xe6\xd4\xd0\x1d\x7c\xc1\xde\xc7\x1a\x7b\xee\x1e\xd2\xd5\x39\x0d\xf7\x93\x8e\x0f\x79\x71\x4b\x56\x3c\x0d\x83\x82\x93\x38\xf3\x90\x87\xc0\x6b\x63\x71\xca\xdd\x17\xa0\x8b\x17\xc8\x33\xbe\x88\x99\x1d\xde\x8f\x86\xe4\x22\x56\x68\x8c\xe4\xa4\xdb\x6d\x54\x4f\x43\xac\x05\xfd\x0e\x30\xfa\x14\xaf\xcc\xb2\xa6\x9b\xd7\x4a\x11\x04\xb9\x04\x13\x86\x2b\x96\x46\x9d\x39\xd0\xd5\x02\x91\xbc\x05\x44\x80\xf2\x94\x19\x1d\x1d\x55\x90\x0e\x5b\xe2\xe2\xf8\x9d\xd3\x49\x81\x48\x3b\xc0\x3a\xb5\x6e\xb5\x2c\x84\x60\xd7\xd2\xd1\x59\x4b\xf9\x1f\x05\xae\xbb\xd8\x9e\xb1\xaa\xc0\x7b\x99\xf7\x31\x57\xb7\x92\xf1\xc7\x21\xa2\x1b\x27\x3a\xe4\x6a\xd0\xed\xb1\x01\x5c\x5a\xe9\x46\xec\x1c\x12\xb9\x19\x9d\xef\x6e\xab\x8a\x32\xd2\x30\x64\x34\x86\xcf\x0d\xe1\x73\xc3\xd7\xdd\x6d\x7a\x7d\x1c\x41\xfc\xd3\xd9\x21\xa4\xf9\x91\x5e\x06\x54\x4b\x52\x6e\x7b\x5a\x3d\x5b\x41\xc9\x61\x04\x47\xf3\xdd\x65\x62\xb8\xc0\x75\x01\x0f\x8c\x5b\x6a\xf1\x86\xfc\xb2\xc1\xe5\x9d\x34\x15\x34\x25\x74\xd8\x3d\xf1\xaa\xd3\xc8\x6d\x85\x8f\x41\x6f\x36\x3f\x6d\x0d\x06\xe2\xc5\x6a\x8d\xc2\x3b\x06\x07\x91\xcf\x8a\x67\x0a\x6c\x68\x3e\x0c\xc1\xa2\x97\x92\x45\xc1\x14\x2c\xc1\x69\x4f\xad\xcb\x74\x48\x69\x8a\xa6\xdd\x41\x50\x51\x83\x8c\x29\xd8\x7d\x10\x26\xa8\xc6\x0c\x2e\xfe\xe2\x8b\xb9\xfa\x79\x6b\xc7\x73\xd5\x8d\xec\xef\xe7\x62\x81\x93\xbf\x4c\x80\x8b\xca\x27\x99\xda\x4f\x59\xb9\x53\xd0\x71\x61\x39\x5f\xb2\x01\xe1\x3b\x2d\x52\x6e\x64\xd2\xea\x23\x9b\x38\xad\x31\x7d\xd5\xad\x2f\xf2\x81\x46\xc7\x51\xf4\x64\xf1\xc5\xed\x62\xe6\x12\x07\xf5\x46\x93\xe6\x0d\x78\x6b\xb4\x46\x40\xed\xaa\x19\x74\xbe\xc0\xdb\xe9\x0a\x6f\x97\x4b\x3c\x88\xfe\xe4\xa2\x8b\xc7\x54\xec\xb0\xb1\xce\x49\xfb\xd9\xe5\xd6\x0f\xdc\x6a\xe0\xb6\xbf\xdf\x15\x4e\xb3\xac\xfa\xcd\x35\x0c\xe1\x75\x87\x29\xfc\xe1\x39\x63\xb8\xe3\x18\x33\x7b\xfa\x62\x5c\x37\xec\x7b\xda\x77\x85\xe3\x43\x3c\x02\xdf\x40\xf2\x58\x67\xd4\x0e\x85\xd1\x14\x03\xc7\x15\xf8\xe2\x08\xaa\x27\x50\xb1\x70\x12\x87\x99\x71\x95\x0f\x2b\xaa\xcc\x02\xd5\xdc\x41\xe3\x6b\x21\x1a\xa0\xd7\xc2\x77\xbc\x7d\xea\x96\xa9\x79\x2d\x84\x61\xf1\xde\x9a\xed\x2e\x13\xd6\xc2\xf5\x29\xd6\xd3\x3d\xde\x60\xe5\x7a\xd2\x4c\xa8\x5e\x73\x7d\xb6\xf5\x34\x28\xcb\xc3\xf9\x9b\x25\x4f\xba\x79\x53\x8c\xec\x2a\xad\xb4\x25\x53\xa7\xed\x20\x8d\x80\xe2\x66\x47\x1a\x58\x7d\x99\xc6\xd2\xe8\x89\x01\xd2\x49\x34\xde\xe5\xc7\x15\x66\xb2\x48\x9f\x7c\x25\xed\x1a\xce\x07\x39\x11\x52\xe0\x99\xc1\xb6\xa7\xe8\xeb\xb4\xc6\x7a\x06\x4d\x02\xb7\x49\x75\xb5\xe4\x8c\x7a\x36\xc6\x45\x6e\x37\x0d\xc8\x32\x68\x71\xba\xce\x32\xc6\x82\xde\x9f\xd6\xd2\x89\x67\xda\x4d\xd9\xd7\xe4\xd4\x12\xb2\xcd\x68\x43\x8b\x22\xea\xdb\x0e\x50\x12\x38\xb1\xb7\x51\x26\x0c\xba\x11\x11\xe4\x4c\x0f\x50\xed\x1d\xfd\x73\x6a\x91\xa1\xaf\x01\x37\x8b\x34\x0f\x7f\x43\x18\x01\x45\x47\xa3\x1a\xce\x27\x68\x19\x4b\x14\x96\x00\x4c\x20\x4a\xae\xd6\xfc\xcc\x57\x4c\x01\x29\xdc\x25\x91\xb0\x14\x68\x4c\xb3\xbb\x7b\xaa\x72\xa8\x39\x5c\x51\xc3\x31\x7f\xf9\x00\xb9\x62\xca\xe4\xc4\xf1\x71\x7a\x95\xc3\x45\x9b\xff\xa6\x13\x39\x49\x66\xbd\xc4\x97\x4f\x03\x3f\xd6\x2c\x64\xd7\x8e\x13\x23\xb4\x36\xb2\xa4\x86\x67\xa0\x9e\xf3\x49\x62\x19\x2d\x43\xb6\xc6\x56\x45\x45\xa0\xc8\xa1\x36\xff\x0f\xed\xc9\x6f\x9c\x78\x32\x57\xbf\xcc\xd5\xf3\x4a\x88\x7a\xa8\xdc\x0f\x37\x5a\x60\xc1\x57\x8c\x11\x5e\x5a\x01\x8b\x42\x41\x92\x49\x88\xbb\xf2\xe6\xe2\x4d\x40\xb1\x52\xe4\x0f\x60\xa3\x4f\x5a\xa1\x8d\xc1\x6a\xa0\x9a\x98\x7b\x19\xd4\xb9\x68\x09\x75\x81\x4b\x83\x96\xc8\xe1\xfa\xd8\xa3\x66\xc1\x92\x9c\xa3\x81\xc5\x9d\x7b\x56\x14\xf6\xff\x9b\x4e\x93\x1e\xad\x9a\x11\x56\x06\xd6\x24\xe7\xba\x55\xde\xfb\x24\x57\xb2\xaa\x9c\x7d\xa9\x3c\x6d\xcf\x08\xae\x5d\xd4\x9c\xe9\xa4\x82\x35\xca\x6c\x53\x26\x42\x09\x76\x97\x14\x04\x08\x4a\xfb\x13\x8d\x6d\x5c\x39\xb9\x14\x5c\x68\xc4\xde\x0c\x1e\xf7\x2b\xe8\xa2\x16\x52\x1e\x61\xf4\x08\x83\x76\x4f\xc9\x77\xae\xf0\x53\x38\xb3\xc1\x33\xb2\x93\x4c\x8b\xa6\x30\x27\xd6\x8e\xc8\xc9\x79\x51\xcd\x92\x51\x53\x29\x32\x78\x5c\x37\x67\xda\xf8\xde\x85\x92\x5a\x7f\xf0\x5d\xfa\x7c\xfa\x20\x61\x76\x7c\x0e\x12\xe6\x41\xc2\xfc\xd7\x96\x30\xfd\x7a\x80\xc6\x3c\x70\x51\x81\xfd\x36\x69\xdd\xa6\xe5\x91\x0f\xd2\xb8\x6b\x11\x10\x41\xe8\x5a\x4d\x9b\x02\xa1\xbb\xa7\x8b\x91\x60\xc6\x45\xf3\x7a\xa3\xca\x47\x3f\xde\xd7\xca\x32\x63\x27\xbb\x25\x68\xee\xcf\x8c\x8f\x23\x4e\xbe\x62\x24\xf2\x87\x78\x4b\x03\xef\x8f\xb5\xbb\xa3\xb0\xbf\x83\x2f\x7d\x3a\x40\xc6\x46\xe4\x96\xf9\xa4\x9e\x8d\x8f\x2f\x47\x8d\xe6\xcc\x50\x5e\xe8\xc8\x10\x3e\xad\x61\x30\xbb\x13\xfc\xc7\xc6\x92\xe0\x33\xba\xab\x0e\x12\x1d\xa5\x13\x97\x8c\xd4\xa3\x28\x36\x58\x67\x02\xbd\x9e\x90\x8f\x2c\x93\x73\xa6\x10\x32\x50\x3d\xd8\xca\xd9\x6f\x29\x2f\x2c\x5c\x3c\x7c\xa2\x69\x09\xd2\x32\x37\x0d\xfb\x89\x3d\x2f\x20\xa5\xdb\x84\xd2\x4d\xca\x85\x0b\xdb\xf6\xee\x8a\xbd\x52\x6c\xce\x65\xad\xbd\xdf\x53\x6d\x90\x18\x6b\xe3\x24\xdb\x19\x9f\x86\xec\xfe\xc1\x51\x42\xb1\x4c\xaa\x3c\x22\x9f\x36\xd4\xd4\xba\x19\x6c\x95\xa1\x2d\x7e\x7f\xe6\xdd\x00\xc7\x47\x96\x01\x76\xe3\xb7\xb0\xdc\x5e\x3d\xda\xb7\xe3\x20\xb3\x6a\x88\x6b\x4c\xe8\x4c\x4a\x63\xd0\xaf\x99\x0b\x04\xbc\xdd\xec\x91\xff\x09\x3b\x0f\xe2\x1e\xc7\x6b\x4b\xae\x93\x32\xff\xe1\x0e\x90\x83\x94\x4a\xed\xb1\x4d\xd4\xb1\x70\x68\x01\xcd\xbc\x70\x77\x89\xfa\xdf\x47\xf7\xad\xf3\xc2\xca\xa4\x48\x04\x92\x83\xbb\xe2\x7e\x91\x97\x65\x6d\x2c\xbe\x8e\xc8\x35\x46\xb2\x80\x64\xeb\x14\xa6\x49\x8c\xce\x60\x4a\x77\xb8\x15\x4c\x9f\x5d\x8c\xf6\x64\x17\xc3\xfd\xd2\x46\x7d\x4c\x41\x9e\x66\xa5\xb0\xda\x1d\xdc\xcd\xdb\xdd\xf1\x77\xf7\x8d\xd6\x1d\xc2\xea\x57\xad\xb2\x27\x02\xe3\xb3\x8b\x28\x8b\x4f\x4f\xf9\x14\x9f\xdd\x4e\x0d\x3e\xfd\xa5\x0e\x7c\x96\x65\x8f\x56\x11\x7f\x2f\x83\x34\x76\xa6\x92\xf9\x68\xc5\xd9\x09\x7e\x1c\x32\x77\x4e\x1a\x4d\xfb\x0b\x86\x7c\x5d\xdb\xe1\xef\xbc\xe3\x52\xa0\xb3\xae\x64\x5a\x01\x96\x14\x9e\x33\xcc\x72\xeb\xce\xdc\x0e\x2b\xdb\x51\xdc\x69\x39\x24\x5a\x52\x32\x2c\x69\x35\xbc\x63\x8b\xde\xdb\xb2\x03\x16\x2c\x7f\x1c\xd7\x51\xd2\xaa\xc7\x38\xe8\x40\xfb\x00\x4a\x7a\xfc\x0e\x5d\x70\xf1\xe5\xd8\x31\x5e\xef\x15\x1c\x3d\x92\x33\x59\x56\xb5\x61\x09\x83\x76\xac\xb4\x37\xd7\x6a\x24\x21\x39\xc3\x3a\x7a\xc3\x30\xec\x30\x12\xb9\x0e\x05\x70\xd2\x67\xe7\xe3\xbf\x6b\xbe\x8d\xf4\x79\xc1\x0e\xc0\xad\xc5\xf6\x0f\x86\x21\x0f\x0c\x88\x21\x0f\x09\x8a\x21\xfb\x0c\x8c\x21\x21\xbc\xee\x21\x27\xe6\xa3\x0f\xec\x6b\x9d\x19\x27\xc2\x6e\x3a\x33\x8d\xfc\x4e\x61\x1c\xae\x7d\x41\x6e\xe7\x5e\x16\xce\x00\x5c\xcd\xa6\xe1\x59\xee\xb4\x82\xcd\x1a\x7d\xc8\xd8\xe7\x50\x84\x21\x51\x93\x40\xfb\xbf\xe7\x1a\x15\x1b\x41\x78\x59\x61\x62\x46\x38\x75\x43\x2f\x19\x39\x9b\x70\x98\x49\x06\xbe\x34\x84\x7d\x06\xcb\x38\x7e\xec\x70\xc0\xc9\xe1\x80\x77\xee\xff\x9c\x07\x1c\xe3\xd3\xfa\x84\x4f\xb6\xea\x3a\x62\x77\x97\x32\x85\x8e\x59\x41\x7e\xac\x99\x5a\x10\xab\x6d\x46\x2f\x6c\x28\x46\x61\x05\x17\xf4\x63\x76\x37\x4b\xdd\x25\x97\x27\x54\xb4\x40\xba\xbb\xfa\x6c\x55\x6d\xc8\x3a\xf0\x00\xb2\xd7\x1e\xaa\x99\x58\x06\xa1\x15\x20\x98\xaa\xd2\xe8\x08\xd6\x50\xae\xad\xce\x75\xfe\xe1\x72\x37\x8b\xc5\x73\xa8\x31\xe7\x1b\x16\x88\x80\x08\xbf\x34\x6b\x7f\x86\x2b\x0f\x72\xc7\x16\x03\xe7\xae\xe8\x6a\xed\xf8\xc6\xe8\x75\xdb\x4c\x00\xdf\x35\xb1\xd8\x2a\x00\x3d\xb9\x06\xd4\x35\x65\x78\xb3\x97\x07\xc2\x13\xea\x4e\x3d\x52\x8b\xa7\xcf\xba\x34\xe3\x88\x13\x90\x2f\xd9\x47\xa1\x05\x34\x80\xc8\x3b\xa0\x16\x4f\xaa\xd2\x10\xc8\xec\x8b\x80\x7d\xf0\x52\x03\x9a\x36\xe2\xa7\xee\xd8\xe2\x58\xbb\x1c\x0f\x52\xe8\x19\xaf\x7c\x35\x1f\xa0\x04\x0e\x73\xc9\xf7\xe0\xc6\xe9\x87\xc0\x33\x7f\x2d\x06\xe4\x83\x34\xf6\x7f\x57\xe0\xd1\x0d\xb8\x7e\x29\x99\xfe\x20\x0d\xbc\x79\x72\x60\xe1\x74\x1f\x0c\x2a\x77\x1d\xea\x0c\x45\x10\x79\x00\xd1\xb4\xde\x53\x18\x40\xe2\x9c\xc8\x02\x58\xb9\x26\xd7\x82\x48\xe5\x61\x62\x7c\xa9\x07\xed\x86\xf0\x57\x3d\xc9\x25\xf7\x8a\x31\x1c\x28\xa5\x6a\x40\x72\xc3\x70\xe1\x1a\x9b\xfb\x5f\xc0\x46\x0e\x2e\x09\xc1\xbd\x19\x0a\x16\x50\xc3\xa6\x3c\x23\x25\x53\x53\xc8\xe6\x91\xcd\x76\xdf\xa0\xfe\x74\x1b\x9f\x9d\xa8\x77\xfa\xe1\xde\x98\x01\xac\xee\x1d\x38\x98\x3f\x94\x61\xe2\x28\xc8\x22\x4a\x5a\x59\xa4\xf8\x87\xe5\x04\xb0\x2f\xff\x84\x02\x23\x7a\x44\xce\x7d\x79\xfa\xf4\x37\x67\x2e\x4e\x87\xb1\x23\x58\x91\xff\xc7\x9a\xcf\x69\xc1\x30\xec\x82\x8a\x90\x74\x5d\x4e\x96\xd8\xf4\xc0\x55\x19\xb1\x54\x2a\x98\x67\x8e\xee\xd8\xe2\x68\xb0\x84\x48\x47\xd7\xe2\x28\xa6\xd4\x69\xa0\x4e\x60\x68\x60\x93\x3c\x82\xdf\x8e\xf6\xcd\xd9\x9f\x49\xb4\xdf\x01\x4b\x9c\xe5\xfd\xa2\xa0\x78\x53\xb3\xeb\x7d\x48\x7b\x9c\x55\xe9\xb2\x6f\x93\x36\xf1\x26\xcb\x05\xd9\xec\xfd\xe2\x00\x82\x31\xfb\x3b\x84\xf7\x82\xde\xdc\xd5\xba\xeb\x9e\x66\x6b\x65\xfa\x57\x48\x32\xe5\x43\x6d\x1b\x59\x0c\xa2\x2f\xda\x1a\x78\x7d\x0f\x17\x38\x72\x42\xde\xc6\x34\xd8\x60\x82\xb7\x4c\xdb\x05\xdf\x5a\x45\x98\x8b\xac\xa8\xdd\xdd\x0d\x74\xc5\x8b\x84\xc7\x07\xce\x03\x90\x2a\x0e\xe0\xb1\xc9\xfb\xbe\x2d\xc5\x59\xb5\x3d\x81\xc0\x31\x2c\xf8\xbe\x20\xac\xf6\xbd\xd6\xc9\x96\xa8\x96\x66\xea\xf4\xac\x29\x7b\xbc\xe5\x63\xc5\xc8\xc5\x8c\x0a\xc1\x8a\x24\x37\x89\xb3\x85\x84\xe2\xa3\x20\x90\xb8\x92\xa3\xc7\xcd\x9a\xa3\x9e\xbe\x89\x90\x09\x27\x06\x9d\xed\x29\x4d\xff\x4f\xa9\x04\xe8\xfa\x4c\xf5\x7d\x8b\x7f\x62\x62\xed\x99\xbc\x27\xb9\x24\xf7\x50\x65\x6a\x6e\x99\x16\x38\x7f\x69\xcf\xee\x92\x99\x82\x9f\x68\x26\xcb\x4a\xc9\x92\x07\xe7\x29\xb7\x8d\x7b\x4d\xe4\x51\xd4\x1d\x32\x36\x36\xf7\xa0\xa8\x45\xb3\x80\xcf\xdb\x0b\x62\xa8\x9a\x32\x63\x47\x23\xa2\x2e\xc7\xac\x73\xb6\x91\xc7\xc8\x18\xfb\x25\x15\x7c\xdf\x6f\xc9\x52\xdc\x86\x1f\x7e\xf8\xd0\x37\x61\xee\x71\xec\xb9\x6e\x6f\xef\xa5\x2a\xf2\x7b\x9e\xfb\x0b\xe7\x13\xdb\xf8\xb4\xeb\xfc\xf7\x9c\x3f\xb7\x07\x86\xdf\xdf\xf3\xbc\x37\x38\xa0\x53\x13\x0c\xde\x0d\xdc\x82\x81\x00\x1c\x5c\x3d\x4e\x0e\x45\x4f\xa0\xc7\x29\xb9\xe2\x18\x04\x0e\xfd\xe1\xe2\xba\x1c\x73\x11\x13\x01\x44\x30\x5b\x62\x6c\xcf\x8b\x57\x4d\x34\x33\x18\xbe\x0b\x91\x33\xd2\xcc\x88\xe6\x65\x5d\x18\x2a\x98\xac\x75\xb1\xe8\x8c\x2a\xcf\x03\xea\x49\xc1\x3e\x23\x66\xf7\x61\x72\xa1\x53\x93\xd9\x81\x8b\x6c\xcc\x76\xb1\xc4\xed\xa2\x87\x79\x7e\x16\x38\x5f\x88\x0a\x67\x9f\x59\xe6\x82\xb7\xaa\xa2\x9e\xf2\x2d\x51\xaa\xff\x62\x35\x68\x62\xb9\x8f\x5a\xb3\x98\x57\xa9\x6b\x15\xbe\x27\x2a\x19\xf3\xbc\x1c\xfe\xd3\xea\x72\x31\x39\xab\x98\xc8\x21\x81\xed\xdb\x88\xb9\x38\xf9\xbd\x42\xce\x25\x83\xed\x4b\xb5\x7c\x0e\xd9\x06\x05\x4f\xdc\x13\x66\xb2\xc8\x35\x61\x9f\x8d\xa2\x96\x30\x95\x96\x04\x85\x3e\x13\x42\x45\x77\x22\xf3\x32\x0a\x3a\x90\xbd\x73\xfb\xc7\xad\x6e\xfe\x12\x0b\x94\xc7\xb5\x37\x5e\xef\xb9\xd0\x10\x12\x62\x77\x56\x74\x33\x40\x6a\x45\x41\xa0\xe8\xc0\xba\x1c\x89\xba\x63\x61\x20\xbd\xa2\x04\x4a\x6b\x56\x87\xa2\xea\x5f\x44\x95\xa0\x09\xe4\x6f\xe9\x93\x32\xd3\xf5\x68\x69\xd4\xee\xa5\x2f\x4e\xdc\x41\x83\x76\x78\x9b\xf0\x01\x0b\x75\x3f\x90\x8b\x3e\x27\xda\xc2\x32\xba\x7a\xd7\x42\x6c\xa3\x62\x8f\x51\xf3\x85\x1a\xaa\x99\xe9\x66\x4d\x69\x8a\x0e\xb1\xa7\x3d\x80\x29\x7e\xb9\x9f\xb0\xe6\x10\x44\xe5\xf9\x9c\x26\x64\xf8\x07\x27\x65\x88\x46\x4b\x2b\x5f\x78\xf8\xf8\x94\x9a\x2c\xdc\x22\xe3\x18\xb9\xdd\x95\x8c\x9a\xce\x05\x12\x3b\xf1\x05\x37\x83\xef\xbe\xeb\x5d\x79\x3f\xe9\xe9\xe5\x10\xf8\x77\x13\x08\xa3\xe0\x20\x5b\x0b\xfe\x63\x9d\xaa\x03\x90\x83\x2c\x2c\xdb\xb5\xdf\xd7\xda\xa6\x19\x8b\xc6\xab\x4b\xae\xef\xfa\xa4\x8e\x5d\xea\xdc\x3c\x12\x5f\x5f\x5c\x11\xf7\xb6\x93\x7d\xa9\x8f\x81\xe9\xa1\x29\x29\xa7\x19\x8b\x46\xdb\x9c\xeb\xbb\x3d\xa5\x9d\xed\x2e\xd5\x57\xf9\x87\x6d\xae\x8e\x4f\x67\xff\x6a\x4b\xbd\x3e\x93\x5e\x92\xe2\x71\x21\x6b\x72\xef\x32\x54\x39\xa9\xf9\x13\xaf\xde\x90\x2b\xa1\x6b\xc5\xe2\xcd\x6d\x7b\x28\xcb\x75\x3b\xcb\xd0\x90\x04\x4c\xbf\xd9\x9b\xad\x6c\xdf\x58\xf2\x92\x8d\x6f\x15\x55\x06\xc4\xe3\xbe\x68\x10\x3a\x7a\xfa\x94\xbc\x10\x5d\xf0\xe0\x7a\xe2\xfd\xee\x06\x2e\x15\x4f\x48\x33\xeb\x1b\xd9\x9d\x4f\xb2\xcf\xa5\x7b\xfd\x36\x64\x66\x24\x67\x39\x9b\x9f\xe9\x9c\xbe\x1e\xc0\x67\x7c\x64\x49\x73\x4e\x54\x93\xa3\xd7\x47\x23\x72\xcb\x4b\x5e\x50\x55\x2c\x1a\x85\x33\x62\x3b\xcb\x2c\xfc\x80\x70\x2b\xf7\xea\x88\x9c\x48\x05\x23\x67\x54\x90\x82\xf9\xb0\x6e\x77\xce\x16\x28\x3b\x9e\x3e\x35\x71\x21\x8f\x6a\xbf\x44\x3a\xd3\x1b\x27\x72\xcf\xb1\x1d\x3f\x6a\x64\x1d\xbc\x8c\x24\x9d\x0b\x4b\xe7\x47\xe4\x3b\x47\xa0\x1d\xdf\xc2\x4d\x83\x23\xe3\x5b\x3c\x17\x50\x9f\x46\xef\xdb\x49\x83\x5b\x36\x07\x3f\x1f\x98\xb6\x6b\x89\x53\x6e\x3e\xb2\x4a\xf6\x92\x10\xb0\x4b\xcb\x1e\xc7\x8d\x7d\x21\x35\x87\xb4\xf2\xd4\x10\x8a\xc7\x36\xab\x0b\x6a\xc5\x6a\xb4\xc6\x8d\xc8\xe5\xd5\xcd\xc7\xab\x8b\xf3\x4f\x57\x97\x6f\xc8\xd7\x6e\x24\x9e\x4a\x78\x23\xf2\x29\x4d\xda\x99\x38\xfc\xba\xcc\x88\xe1\x5b\x03\x47\x86\xa8\x88\xa9\xb8\x21\x15\x1b\x15\xe4\x5a\x70\x13\x8b\x59\xa0\xdf\x59\x21\x05\xf3\xb5\xde\x2b\xe9\xac\x81\x53\x6e\x5c\x8a\x22\x1c\xcc\xfe\xdc\x1c\xcd\xc5\x72\x58\x51\x26\x86\x62\x3c\xb9\x68\x11\x81\xbb\x2f\xf1\xdf\x67\xab\xef\x2b\xfb\x86\xda\x01\x3e\xde\x18\xad\xff\xf1\x3d\x32\x83\x50\x46\xc7\x67\x25\x94\xaa\x51\xe5\x06\x6a\xe0\x5b\x36\x73\x3c\x3a\xf6\x02\x45\xb1\x54\x32\x29\x0c\x9a\x26\x5e\x6d\x22\xdb\x88\x90\x6f\xbd\x47\x37\x64\x5e\x59\x5d\x7d\x09\x93\x78\x25\x35\x7c\x5a\x28\xeb\x23\x10\xeb\x71\xfa\x51\x97\xa9\x75\xca\xe7\x2e\x7f\xc6\x5e\xad\x78\xf1\xf3\xbd\x6b\xd9\xc6\x79\x3b\xfd\xe3\xe3\xbb\xfd\xce\x0c\xcf\x5f\xef\x79\xb9\x63\xeb\x66\x95\xc9\xb2\xc4\xb4\x9e\xb3\x10\xef\x1f\x43\xf6\x03\x55\xd8\x9b\xe6\x83\x09\x4a\x27\x5b\x90\xbf\x45\xcf\x7c\xa7\x96\xa6\x13\x5e\xbb\x98\x05\x11\xc5\xdc\xfe\x55\x33\x5c\x2e\x5c\xed\xc3\xb1\x1d\x69\x3f\x0b\x1f\x3f\xfb\x78\x75\x7e\xf9\xfe\x6a\x54\xe6\x4f\x4e\x5a\x98\xc8\x2b\xc9\x85\xd1\xdb\xf5\x9b\x6d\x35\x02\xbb\x93\x9f\xf0\xd1\xbe\xdc\x39\x74\xf4\x38\xe6\x5f\x24\xe9\x83\x5d\x38\x79\xb2\x87\x46\x56\xb2\x90\xd3\xd5\xc5\x32\x7a\x6c\xce\xcf\x31\x0d\xe0\x90\x0e\xed\xae\xef\x57\xd4\xef\x52\xf5\xac\x2d\xe5\x63\x95\x33\x0b\x86\xb8\xd6\x20\x35\x43\x71\xb2\x17\xba\xdc\x47\x11\xce\x96\x60\x80\x8a\x24\x1c\x60\x9f\x59\x39\xa6\x2a\x4e\x2a\x0e\x76\x95\xda\x1e\x1b\x74\xdb\x05\x36\x4b\x7f\xb6\x97\x95\x6c\xc2\xcc\xf7\x69\x12\xb8\x4a\xb1\x61\xc8\xaa\x09\x85\xf0\xa4\x4a\x18\x6e\x4a\xef\xbc\xf5\xc6\xdb\x7a\xb0\x55\xb1\x68\x5b\x71\x92\xf0\x70\x6f\xfa\xc2\x5c\x46\x45\xb1\x88\xd9\xba\x9d\x16\x4d\xa7\x98\x2d\x53\x39\x33\x71\xa5\xf8\x9c\x17\x6c\x0a\x19\xf3\xb9\x98\x26\x79\x06\xd2\xcc\x04\x2e\xa5\x44\xd3\xe8\xfa\xde\xfe\x95\x94\x48\x01\xbc\xf8\xf0\xed\x27\x28\xbe\x00\x17\x5c\x0f\x16\xc2\xed\x07\xe1\xbc\x0d\x87\x43\x30\x19\x9c\xfc\xcd\xca\x93\x79\x71\x4a\x7e\x60\xee\x3b\x12\xaa\x43\x28\x28\xdc\x38\x93\x21\x55\x3f\xcc\x35\x42\x16\xd0\x11\xaf\xf7\x5d\xab\x33\xdb\xd2\xca\x4a\xc8\x6a\x1a\xed\xa1\x4e\x3d\x66\xd8\xc6\x3b\xa6\xa7\x97\x3d\xf7\x48\xf6\x77\xa6\x72\xde\xb4\xba\x0a\x3f\xc3\xc5\x8f\xa7\x87\x94\xe8\x45\x59\x70\x71\x17\xd3\xb7\x4e\xa4\xcb\x60\xc2\x88\xfd\xc1\x63\xac\x62\xb4\x58\x4f\x29\x77\xc1\x8f\xbd\x52\x49\xb3\x83\x05\x10\x2c\x74\xf6\x9c\xfd\xd1\x1f\x7b\x77\x0d\x9d\x92\xb8\xa3\xa3\x17\xb7\x5e\xae\x33\xcd\xfb\x90\x35\xe8\xd0\xa0\x69\x82\x5c\xdf\x5e\xdc\x5e\x3f\xa9\x85\x7a\x1d\x4b\x80\xd9\x3d\xa3\x54\xc7\x7f\xdc\x76\x3b\x3c\x24\x45\xbd\xbd\x0d\xaa\x77\x37\x52\x19\x5a\xec\x89\x08\x64\x33\x5a\x9d\xd7\x66\x76\xc9\x35\x24\xab\xe9\x2b\x04\x2c\xf5\x4f\x3c\x9d\xb1\xc4\x86\xcf\xeb\xcc\x3d\x3a\xb8\x76\x17\x7f\x3c\xbf\x21\xb4\xb6\xfb\x6b\x5c\x0e\xf8\xbd\x5e\xb8\xfb\x99\xdd\x62\x84\xc1\x8e\xeb\x72\xbd\xb7\xac\xca\xb7\x7a\xec\x35\x3d\x86\x1f\xee\xe1\x2e\x02\x68\x28\x52\xb0\x17\x7c\xff\xc0\x05\x37\x9c\x1a\xd9\xb1\xac\x6c\x03\x05\x1a\x7d\x83\x41\xa0\xd6\x46\x96\x0e\x83\xaf\x7d\x0b\xb8\x42\x06\x2e\xbe\xd4\x29\x5a\x0b\x40\x7a\x07\x88\x5d\x0b\x2b\x6b\xd3\x8c\xb5\x1c\x20\x07\x90\x9b\x1d\xc7\xe6\xa1\xcd\xef\x9d\x81\x0a\xf2\x90\x16\x7f\x78\xd3\xa8\x98\xb3\x54\x7e\xcc\x5b\x29\x62\x6d\xab\xbd\x5a\x7c\xf8\x8f\x7d\x89\x02\xff\x51\xb4\x2c\x6d\xb8\xc0\xff\x5b\xd3\x02\x01\xf3\x61\xdf\x66\xa9\x26\x90\xfb\xce\xb7\xb9\x43\x6e\xea\x71\x3b\x3e\x04\x2d\xbd\xd6\x98\xe1\x14\xd7\x63\x14\x15\xda\xee\x51\x53\x17\x3b\x76\x17\x4f\xc7\xe4\xc4\x64\xd5\xe9\x5e\xd7\xd9\xdf\xb5\xbd\xa8\x45\x2a\x70\xe0\xcc\x3f\xe1\xb6\xbc\x0b\xae\xed\x5d\x27\xf9\x28\x57\x43\x80\xe5\x7d\xad\x2a\xae\x57\xd8\xad\x74\x5d\xc8\xfa\xc9\x3b\xae\x8d\xaf\x9b\x05\x2f\xb8\x76\xe5\x1e\x40\xee\xba\xb1\x8a\x1c\xaf\xfe\x9b\xe6\xb9\x7a\x83\x5c\xca\xc9\xe4\xf0\x6f\x1d\x72\x6e\x52\x11\xee\x12\x4f\xcc\xa2\x72\x39\x8d\x3f\x5d\xdc\x10\xac\x63\xf7\xbb\xdf\x60\x9d\xfe\x7f\xff\xd5\x6f\x5e\x75\xde\xee\xe7\x73\x1e\xdf\xd1\x8e\xb1\xf7\x3b\xa6\x17\xe1\x37\xd8\xf0\x0f\x84\x74\x8d\x56\x36\xb9\x45\x77\x3c\x4b\x59\xdd\x51\x47\xc4\xb2\xbb\x1c\xe8\xfd\x6e\x12\xcc\xc1\xcf\xee\x59\xfd\xec\x48\x88\x28\x41\x22\xd1\x13\x5d\xd2\xae\x10\x62\xb8\x4c\x76\x90\xe2\xdc\xbc\x3c\x8a\xb3\x15\x36\xdb\xb1\xa8\x89\x3d\xe9\x65\xbc\xaf\x52\x18\x5d\xd8\x2f\x3f\xdc\xfe\xf7\xbb\xf3\xaf\xae\xde\xc1\x4c\xdd\xfd\xbd\x45\x0d\x2e\x76\xf6\x9f\xea\x8e\x6a\x5d\x94\xd7\xed\x00\xe9\x77\x2d\x23\x5a\x17\x32\x82\x7c\x78\x7b\xdb\xf7\x2e\xe6\xa1\x02\xba\x98\x74\x5a\xfb\xd3\x5a\xdb\xa0\xf8\x1c\x53\xfb\x8b\x1f\xd9\xd9\x28\x97\xe4\xd9\x6a\xe8\x5f\x76\xa7\x70\x86\x0f\x56\x91\xb6\xee\x00\x79\x01\xf7\x0e\x76\xbd\x08\x83\xbd\xdf\x38\x3c\x12\xac\xba\xca\x01\xaa\x7f\x60\xd1\x31\xf6\xf2\x22\x80\x3d\xa4\x48\xdb\x94\xa5\xd9\x96\x5a\x33\x1d\x92\x64\xbe\x50\x4c\xa9\x56\x95\x81\xe8\x43\xbd\x56\x0e\xd0\xa8\x2a\xdb\xb8\x8b\x69\xc4\x52\xac\xab\xe9\xe2\x3d\x14\x68\x99\xa4\x0e\xdf\x67\x7e\x83\xf8\x0a\xdf\x60\x2a\xe2\x27\x27\x80\xf0\xd9\x3d\x3a\xd2\x86\xf1\xfa\x22\x72\xe8\xd8\x8e\x92\xeb\xb5\x43\x84\x6a\xcf\xa2\x9d\xcf\x51\x1a\x4e\xf7\xcc\xdb\x47\x9e\x56\xdb\xf9\x61\x47\x45\x67\xdf\x4a\x4e\x35\x93\x46\x8a\x9d\xbd\xe4\x57\x75\x6f\x1e\xe8\x1b\x68\x71\x11\xab\x0d\x26\xa5\xb8\xc1\x83\x32\x5c\x46\x40\x0d\x1d\xc7\x2e\xa4\xf0\xd7\x12\xcd\x4b\x89\x27\x17\x41\xf2\xeb\xcb\x3d\x1d\xbe\x2f\x37\xc4\xb3\xaf\x31\x78\xaf\xce\x20\x79\xef\x98\x14\xdb\xc5\x43\xec\xfa\xd2\x89\x66\x3e\xe0\x44\x3b\x84\x24\xeb\x31\x72\x6f\xac\x53\x2a\x73\x2f\x55\xff\x50\xef\x66\xc7\x96\xaf\x82\xfb\x6d\x29\x14\xeb\x25\x9e\x1e\x9c\xe3\x33\x9f\xa0\x5b\x38\x41\xad\x4a\x12\xeb\x4e\xd2\x63\x1c\xa4\xe7\x3d\x40\x0f\x65\x54\x8f\x1b\xe5\xbb\x57\x21\xdd\xa3\x5b\xcf\xa5\xfa\x6e\xce\x98\x60\x37\x29\x52\x0b\x0a\x26\x97\xe4\xc4\xed\x8d\x3a\x28\x89\x95\xc2\xfb\x10\x06\xdf\x07\x0d\xb8\x98\x07\xba\x28\x2c\x54\xa5\x48\x33\x48\xbb\x30\xde\x01\xc1\x2c\xcb\x25\xad\x5c\x41\xb5\x5c\xde\x8b\x7b\xaa\x72\x72\x7e\x73\xbd\x1f\x6a\xd0\xc3\xcf\x1a\x31\xa9\x5b\x46\xaf\xa6\xa7\x75\xec\xe9\x0a\xea\x31\x28\x81\x4d\xc6\xdc\xe8\x58\x7a\x99\x99\x54\xaf\xb4\x54\x30\xdc\x65\xd9\xb3\x6c\xcf\xad\x1b\x29\x61\x98\x82\xc8\xcc\xd0\xc2\x57\x6b\x71\xe5\xf8\x5e\xbd\x7a\x85\xa6\xb0\x57\xbf\xfd\xed\x6f\xb1\xbc\x64\xce\x32\x5e\x2e\x37\x84\x56\xff\xeb\xf5\xeb\x11\xf9\xaf\xf3\xf7\xef\x5c\xf9\x1f\x8d\x59\x49\x70\x64\x80\x7b\xda\x59\x0f\xc8\xff\xb9\xfd\xf6\x43\x2c\x0d\xd2\xfc\x15\xb6\x35\x2c\x6f\x44\x2e\x13\xff\xa7\xd4\xd0\x45\xcd\xcc\x55\x75\x34\x84\x4e\x26\x88\x18\xbe\x3e\x89\x3b\x70\x3e\x7a\x9c\x4f\x67\xbe\x1c\x98\x45\x89\x02\x1c\xb3\xac\x4a\x8e\xa6\x41\x9f\xd9\x00\xfd\xcc\x60\xac\x40\x26\x61\x2a\x03\x52\xf0\x3b\x46\x26\x1a\x8a\x82\xc5\xf4\x7f\x8a\x69\x2b\x94\xba\x22\xd8\x38\x58\xdc\x19\xcd\x3a\xe7\x7a\x78\x8c\x1b\xa0\xce\x65\x88\x9a\xa6\x7b\x77\x86\x7c\xfa\x56\x97\xbb\xd8\xfb\x92\xe2\x11\xb4\xd0\x7a\x9e\x1b\x99\xc6\x5c\x6f\xc2\x6c\x70\xeb\x5c\x96\x80\x48\x27\x68\x21\xa1\x9c\x69\xd8\xe9\xc8\xc5\xbc\xcb\xc1\xa2\x62\xdb\x97\xd2\x3b\xf9\x62\xdf\x04\xbc\x48\xa8\xde\xd3\xce\xd5\xf5\x9a\xfe\x22\xbe\x77\x23\xaf\x02\x1d\xcb\xda\xf8\x3b\x6c\xf7\x3b\x04\x60\x1b\xe9\x41\xd4\xf1\x63\x3b\x64\x9e\xdc\x25\x03\x71\xef\x24\xa6\xcd\xfb\x66\xe0\x09\x4d\x51\x62\x40\x18\xcd\x66\xe4\x8e\x2d\x86\x48\xb7\x2a\x0a\xd1\x3c\x58\x84\xc8\xc2\xa2\x51\x61\x2a\xa9\xb5\x76\x11\x40\xe6\x1d\x03\x12\xee\xe3\xa3\x81\xbc\x10\xaa\x9d\xbc\xe4\xd2\x88\x8a\xc4\x52\xe0\x73\x55\xbb\x82\xeb\xfe\xb5\xab\x29\x70\xbd\x14\xa4\x62\xcf\x1b\xcb\x6d\x37\xbd\xe9\xcb\xd1\x1b\xc2\xd2\x41\xc7\xdd\x6a\xb1\xd4\xdb\xd5\x56\x77\xc2\x1f\x7c\x90\xfa\xec\xcc\x89\x47\x05\x54\x33\x76\x85\x15\x5d\x5b\x0f\xa5\x00\x88\x46\x10\x8d\x66\xa6\x76\xa0\xc1\xba\xa4\xb5\x28\x98\xd6\x84\xc3\x0a\x4b\xaa\xee\x98\x4f\x18\x43\x8b\x11\xb9\xb1\x93\x0c\xf9\xab\x30\x2d\xf2\xdc\x95\x8d\xa5\x8b\x46\x74\x90\xfd\xc8\xf1\x68\x74\x8c\x04\x7e\x45\xac\x50\x0f\xfc\xd8\x2d\xa7\xee\x0e\xb9\x74\x1b\x88\xf8\x9e\x56\x1a\x33\x03\x5b\x91\x0f\x32\x5f\x4b\x88\x82\x33\x33\xcf\xc0\x68\xe7\x24\x4a\xcb\xcb\xd9\x21\x01\xec\xae\x79\xcb\x77\xc9\x5a\xde\xe9\xde\xa2\xf9\xec\x9e\xad\x7c\xa7\x5c\xe5\xeb\x32\x95\xbb\x9d\x72\xa7\xad\x7f\x0e\xe7\x07\xa4\xd8\x2e\x7b\xa5\x79\xf5\x4f\xd3\x48\x09\x72\x47\x23\x4b\x4f\x27\x19\xd1\x25\x7d\x2a\xd8\x17\x25\x14\x5e\x4f\x56\x15\x81\xf5\xc1\x82\x89\xbc\xec\x69\x28\x16\xdb\x7a\x6e\x69\xb0\x5f\x2d\x17\xd2\x5b\x3c\x6c\x3f\x7d\xc4\xc5\xf6\xd3\xed\x32\xb0\xfd\x34\x15\xb6\x24\x2c\x29\x10\xfd\xd4\x8b\x1f\x40\x6a\x24\xe4\xec\x8e\x47\x70\x44\xde\x3b\xa6\x80\xc8\x48\xc7\x5a\x16\xb5\x09\x91\x4c\x2b\x38\x06\x0c\xea\x33\x7c\x63\x48\xa9\x6f\x96\xf0\x0f\xe0\x9c\x48\x96\xfb\xb2\x12\x7c\x76\x3a\xe2\x7d\x8b\xd1\xfd\x64\x9d\x49\x1e\x00\x43\x2f\x4a\xec\x0c\x47\x3f\x40\xc8\x3b\xe1\x7d\xa9\x1b\x32\x0e\x78\x92\x18\x8d\x02\x94\x17\x57\x5c\x1d\xa8\xde\x4b\xec\x66\xb5\x71\x73\x75\x86\x89\xf3\x9b\xeb\x9d\x34\x80\xa4\xff\x1a\x1d\x20\x6d\xf1\x13\xd6\x02\xae\x51\x0b\x48\xcb\xee\x5c\xc6\x95\x3b\x93\xb2\x25\x3b\x2f\x5e\x8c\x5c\x9a\xf6\x5b\x4b\x2c\x53\xa7\xd3\x66\x0e\x3d\x34\xf6\x44\xb2\x9a\xe4\xdd\xf3\xb7\x8e\x70\x88\x5f\xba\xc8\xf9\x84\xe2\x23\xc0\xa3\x93\x77\x63\xfb\x59\x2e\x76\x07\x8b\x25\xb7\x50\xda\x06\xf5\xc1\x44\xb1\xac\x64\xfe\x06\xab\x42\x40\xed\x38\x2c\x0a\x33\xc0\xda\x38\x7a\x80\x0a\xa3\x95\x22\x92\xbb\x62\x95\x98\xdc\x77\x96\x1b\x76\xaa\x72\xf4\x90\x3a\x47\x76\x03\x61\xe5\x37\x7d\x77\x91\x3c\xb0\x6c\x11\x49\x58\xd3\x6e\x85\x50\x1a\x7b\xea\x46\xf2\x1b\xa8\xb3\x19\x2b\x29\xe6\xf0\xf3\xcb\xb3\x54\xe6\x5e\x71\x63\x18\xe6\x52\x62\x0a\x6a\xbe\x0e\x1a\x77\x06\x47\xf3\xd7\x47\xbb\x94\x83\x79\x60\xc5\x1e\x12\x77\x61\x0f\xc0\xb8\x69\x88\x6c\x16\xaf\x41\x97\x28\x20\xf1\xa6\x68\x19\x24\x2c\x83\x99\x23\xf4\x9e\x7c\xe1\xfb\xd0\xa3\x76\xd5\x9f\x06\x41\x60\x38\xe8\x4f\x07\xfd\x69\x2f\xfa\x53\xc2\x58\x3c\xc1\x59\xa1\x4b\xa5\x0e\xc3\x5e\xa1\x8a\x81\x4c\x49\x02\x1e\x8b\x9a\x5e\x95\x8a\x95\xd2\xd1\xe2\x66\xf5\xa1\x63\xaf\x60\x39\x3c\xae\xcd\x64\xf8\x3b\xc2\x44\x26\x73\xdc\x7c\x3b\xbe\xd2\x06\x44\x9b\xa8\x93\xa4\x73\x29\xfd\xb7\x52\xab\x1d\x8c\xbd\xeb\xd6\xed\x44\x07\xfc\x55\xe0\xdb\x3d\x31\xf8\xc8\xd6\x43\x30\xb1\x5b\x7e\xc8\x35\xe0\xf8\x7b\xbc\x84\xc4\xaa\xd3\xa1\x08\x3e\x94\x8e\x3d\xc1\x97\xa3\xac\xaa\x07\xae\xc1\xa8\x64\xa5\x54\x8b\x41\x68\x64\x7f\x6c\xf4\x72\x2d\x4e\x41\x26\xc8\x6a\x65\x35\xc0\x62\xf1\xa5\x4a\x07\x1e\x40\x4f\x2c\x1c\x84\x7d\xea\x57\x34\x28\x7d\x9a\x28\x11\x93\x8a\x81\x7e\x1f\x8b\x28\x4d\x42\xca\x43\x3d\x88\x6a\xa7\x7d\xcb\xc4\x9c\xcc\xa9\xea\xe0\x89\xb7\xea\x79\xa0\x3c\x90\xf3\x39\xd7\xbb\xd5\x3b\x6c\x2d\xfd\xd6\x31\x0d\xb4\xeb\xc8\xda\x54\xb5\x71\x94\xd2\x9f\x0a\x1f\x32\x1f\x4e\x43\x4b\x28\x7a\x7d\xb4\xd3\x34\xbe\x98\xfa\xc2\xf8\xec\x58\x65\x18\x9f\x87\xd6\x1a\x6e\x8e\xb2\x33\xda\xec\xb5\xb0\xb8\x7f\x3c\x5a\xec\xe3\x1c\x46\x16\x19\xf3\x3c\x78\xe1\xf4\x89\x0e\x1a\xba\x9b\xec\x64\xb7\x71\x19\xea\x57\x9b\x6c\xdc\x8f\x3f\x61\x6b\xcd\x7e\xef\x6c\x5d\x7c\xe1\xbf\xf8\x85\xed\xad\xab\x67\x70\xb8\xad\xed\x84\x82\x87\xdb\xda\xc3\x6d\xed\xe1\xb6\xf6\x60\x6d\x38\x58\x1b\x0e\xb7\xb5\xe4\x70\x5b\xbb\x17\x18\xee\xef\xb6\x16\x45\xbd\x55\x77\xb6\x4e\xd8\x8b\x17\xb6\x4f\x7a\x5f\xeb\x0a\xf7\x9c\x67\x99\xac\x85\xf9\x24\xef\x58\xe7\x4b\x87\x96\xfc\xbf\x34\x0e\x24\x40\x58\xa3\x0f\x2c\x37\x7e\x32\xe5\xa0\xbf\x54\xd2\x4b\xb6\xd8\x45\xaa\xa0\x75\xce\xad\xe4\xbf\x33\x9a\xf9\x01\xd2\xe4\x44\x22\x67\x79\xfc\xc1\x1d\x65\x63\x61\x3d\x22\xe7\x44\xb1\x8c\x57\xdc\x95\x91\xa7\xf8\x1e\x11\x2f\xd4\x46\xe0\x46\xb3\x62\xe2\x72\xd4\x8b\xb4\xd6\x4f\x94\xdf\x1d\x1d\x5c\xf9\x19\xe4\x50\xd2\x67\x32\xf7\xb5\x90\x14\xfb\x9b\x67\x6d\x6e\x36\x9f\xd2\x11\x52\xf3\x0a\x2c\xa5\x51\x62\x08\x3e\x56\x71\x17\x60\xfd\xd8\xc7\x9f\x7d\xae\xb8\x02\xe4\xbd\x65\x99\x14\x5d\x6a\xaa\xae\xd9\xa0\xa5\x91\x22\x7f\x02\xdb\x28\xcb\x49\x5e\xab\x50\x33\x75\x4e\x0b\x9e\x73\xb3\x08\xb7\x76\xae\xbc\x16\xc5\x13\x13\xb6\x51\x47\x30\x12\x5a\x55\x4a\xd2\x6c\xc6\x74\xf2\x35\x14\x50\x5c\x10\x59\xf0\x7d\xc7\x12\x70\x20\xa3\x40\x1f\xcb\x20\x8b\x05\x51\xd2\xf8\x8b\xf7\x35\x1f\xfc\x94\x0c\x06\xdd\x91\xcb\x19\xb5\x80\xdb\x79\x99\x0e\x81\xb3\xe2\x93\xf4\x0f\x4d\x64\x91\xfb\x14\x26\xbf\x7b\x65\x85\xc2\xcc\xe1\xa0\x25\x7e\x90\xe0\xc2\x48\x52\x58\x86\x6d\x09\xe2\xfa\xce\xbf\xfa\x35\x99\xc9\x5a\xe9\x51\x9a\x74\xe0\x35\xbc\x43\xfd\xce\x0b\x95\x86\x14\x8c\x6a\x43\x5e\xbf\x22\x25\x17\xb5\xe5\x53\xbd\xd1\xa6\xbf\x1c\x94\x48\x40\xbf\xf9\x75\xe7\x7e\x7d\x65\x9f\xb5\x52\x4f\x85\xb9\x91\x9d\xe8\xe3\x4e\x12\x06\xc6\x61\x66\xf1\x96\x20\xe4\x88\x6e\x0a\x6d\x61\xe4\x23\x9c\xaf\x1f\x6b\x39\x5e\x98\x3e\x41\x94\xae\x47\x33\x7a\xf2\xff\xba\x97\x5d\x92\xa7\xc4\xdc\x29\x1b\x3f\xfa\x28\x15\x2e\xa6\x5c\x9b\x2d\xf5\x2d\x62\x7c\xe5\xc6\x66\xdd\xd9\xca\xd4\x6a\x07\x3d\x63\x65\xa0\x8f\x97\x88\xbd\x6d\x29\xcb\x18\x16\xb3\xbc\x8c\x95\x92\x84\xc4\xb6\x5b\x87\x7f\xe6\x84\x63\x1e\x41\xf6\x90\x35\xbd\xe3\x52\xbb\x09\x5d\x1e\x25\x7a\xaf\x15\xbb\x35\x4f\x81\xe6\x62\x8a\x49\xce\xcb\xba\x30\xbc\x2a\xe2\xba\x3f\xfa\x0e\x8e\x90\xa7\x36\x37\x9a\x98\x89\x28\x06\x16\x63\xb6\x29\xb0\x4f\x9e\x84\xb1\x98\x30\x98\xab\x5b\x59\x7e\x50\x51\x45\x03\xf0\xa0\x92\xae\x3e\x75\xe6\x3b\x0a\x37\x8a\x2e\x1d\xa6\xed\x45\x8b\x38\xe3\xe4\x16\x69\x9f\x48\x63\x98\xa0\xa2\x83\xa9\xba\x99\x9e\x0b\x3a\x11\x79\x1f\x9c\xc9\xb0\x0c\x4a\x0b\x5b\x9c\x50\xf3\x15\xcd\xee\x98\xc8\xb1\x68\x14\x2c\x3b\x5f\x08\x5a\xba\x6c\x5b\x49\x3d\xee\x56\x7f\x3d\x70\x86\x09\x0c\xdf\xf3\x61\xc6\xc8\x75\xf7\x09\x83\x5a\xf7\x4e\x65\x63\xbb\x6c\x3b\xe7\x1a\x4d\x36\x8a\xcf\x33\xe6\xf9\xbf\xed\xb7\xcf\xa9\xcf\x3b\xc4\xd2\x2f\x4d\xde\x6f\x4f\x82\xbf\x40\xee\x83\xe5\x1c\x92\x6a\xd1\xc2\x1e\xed\x45\x88\x19\x6d\x6d\xee\x78\xb1\xdf\xaa\x37\x6a\xdc\x27\xf2\xf7\x58\x8d\xf3\xe6\x21\xfe\x48\x73\xa9\xc9\x57\x85\xcc\xee\xc8\x25\x03\xa1\xeb\x31\xcb\xb3\xa8\x71\xfe\x9c\x29\xbc\x4b\x3a\xdd\x76\xcf\x36\x24\xa5\x14\xdc\x48\xb5\x99\x5e\x3c\x5d\xd9\xc9\x43\xba\xe7\xb5\x19\xaa\x2c\x36\xbf\xe4\x64\xcf\x16\xdd\xfa\x6e\x3c\x74\x0a\xea\x19\x9c\x4e\x7c\xe5\xaa\x80\xed\x78\xd6\x7e\x3e\x93\xf7\x43\x23\x87\xb5\x66\x43\xde\xe1\x42\xb7\xc7\x32\xef\xd8\x02\x6e\xb1\x7b\x2e\xd4\x75\x6b\xe8\x0c\x46\x82\x05\x0a\xde\x5b\xce\xfd\xf1\xab\xcb\xef\x34\x53\xa3\x54\x06\x3c\x63\x26\x3b\xcb\x58\x35\x3b\x73\x23\xbc\x48\xa0\x78\x22\xd2\x17\x2a\xbe\x1f\xb2\x99\x4c\x16\x85\x0b\xcc\x96\x13\x72\xc1\xaa\x59\x18\xf8\xa9\x57\xfd\x7c\x19\x81\x2b\x29\xfb\x26\x42\x3d\xb6\x7d\x9a\x87\x08\xde\xe0\x19\x4a\x90\x49\x8d\xfb\x15\xa1\x78\x2a\xf4\x79\xd1\xa5\x36\x1f\x11\x38\x8f\x9b\x4e\xf9\xb8\x91\x4f\x39\xf5\xf7\x6c\x26\x4b\xf6\x1e\x23\x0d\x12\x74\x3d\x41\xa1\x3b\x67\x39\x91\x73\xa6\x14\xcf\x99\x26\x81\x06\xa5\x5a\x2a\x2f\x9e\x1a\x6e\x87\xbc\xcd\xcf\x9e\xb7\x79\x07\x75\xe8\x18\xf4\xa1\x06\x99\x82\x37\x4b\x64\x8a\xe6\x25\x17\x2f\x8e\x50\xe9\x8c\x16\xec\xfa\xdb\x1e\xfa\x87\xeb\xd1\x54\x41\x6e\xdd\xcb\x24\x7f\xda\x96\xac\x64\xdf\x04\xbc\x21\x42\xe6\xdb\x4c\xaa\x8f\xa0\x48\x4c\xa9\x61\xf7\x5b\xd9\xe1\x30\x12\xaa\xed\x2d\x41\x38\x7d\x4e\x95\xe3\x45\xe4\x08\x4c\x70\x1e\x93\x9e\xed\x93\xa9\xba\x5d\xeb\x6b\x9c\xc4\x5e\x69\xfa\xdd\x76\xd2\x5d\x8f\xc1\xe7\x37\xd7\xe4\x6b\x6c\xbe\xdf\xec\x85\x4a\x1a\x14\x03\x2f\x65\x49\x79\xdf\x22\x1b\xed\xee\xed\xec\xab\xe9\x12\x6e\x42\x5b\xe2\x1a\x27\x05\x5c\x26\x7c\x5a\x5b\x9d\xce\xe9\x61\x2f\x2a\xc1\xdc\x92\xe8\xf2\x72\x13\xcc\x3d\xbc\x1a\x44\x62\x72\xf2\x7e\x91\x51\x62\xf1\x5b\x09\xac\x24\xdc\x81\x12\xcd\x84\xe6\x70\x21\x93\xdc\x8a\xbb\x4a\x7f\x58\x5a\x12\x9d\x20\x51\xc4\x19\x90\x77\x72\xca\x85\x3f\xbd\xd2\xdd\xd7\x4d\x28\x2f\xba\x02\xe3\x20\x93\x3c\xbb\x4c\xa2\x75\x71\x25\xe8\xb8\xe8\xe2\x6e\xd0\x44\xb5\xd0\x91\xbc\x2d\xe8\x94\x30\xf8\xe3\x2c\xe7\xda\xfe\x9f\xdc\xde\xbe\x03\x23\x7c\x2d\xbc\xc4\x0c\x06\x6a\x47\xfb\x42\x90\x02\x1e\xc4\xfd\x9e\x1d\x24\x3d\x3b\x64\xff\x4b\x7a\x12\x2e\x72\x3b\xf1\xa4\x14\x1c\x3a\x49\x41\x0b\xcc\x87\x18\x7c\x7e\xd1\x6d\x60\xcc\xc8\xa7\x19\xcf\xee\x6e\x12\xbb\xbb\x54\xf6\x9d\x48\x5e\x35\x18\x58\xfb\xb7\x7d\x52\x4b\x37\xd5\x9b\xfe\xaa\x71\xd2\xd3\xf3\x01\x4f\x30\x6e\xdd\xfa\xe1\x37\xaa\xb5\xcc\x78\xbc\x73\x01\x1b\x4d\x64\x0e\x39\x30\x87\xfd\xae\x09\xc4\x83\xbe\xcb\x41\xf9\x63\x05\x47\xf3\xbb\xe9\xab\xe3\xea\x94\x83\x71\xe1\x57\xbd\xd7\x25\x20\xce\xec\x90\x1a\x3d\x76\x5c\x4e\x8d\xee\x85\xe1\xd6\xc5\x82\x77\x53\x77\x9b\xe7\x05\x31\x5f\x9b\x73\x69\xfb\x42\x8a\x74\x97\x9a\x70\x6f\x0b\xef\x12\xb6\xb1\x4a\x0d\x6f\xdd\x26\xe2\x3b\x77\xd5\x00\x67\xae\x92\x55\x5d\xa0\x3f\xc7\xc3\xf3\xbb\x7b\x9b\x31\x7e\x67\x4f\x57\x0f\x4f\x91\xb5\xf4\x38\x75\xec\xed\xef\xe9\xfc\xd3\xc8\x5d\x9a\x08\x77\xaf\x7e\xf3\xeb\x5f\x7f\xe9\xd9\x4c\xbb\xaa\xe0\x8f\x91\xce\xb4\xa3\x89\x76\x45\x7c\xd1\xf5\x21\xbe\xe8\x5f\x37\xbe\xe8\xf1\xb3\xd0\xee\x39\x82\xa8\xa7\x6f\x6e\x3f\xbf\xdc\xee\x31\x42\x9d\xbd\x77\xfb\x7a\xee\xf6\x88\x02\xda\x6f\xec\x4f\x6f\x5f\xd6\x3e\x71\x3e\x87\xe8\x9e\x9f\x6a\x74\xcf\x2e\xbe\xac\xfd\x23\x79\xfa\xf8\xb0\xfe\x14\xa3\x76\x7a\x1c\xce\xee\xd1\x25\x0f\x8e\x29\xe9\x9f\x04\xb0\xbf\x3d\x6d\x97\x82\x54\xb1\xe7\x4a\x0d\xd2\x07\x95\xfb\xdc\x63\xc7\xc7\x3a\x49\x2d\x66\xa4\x3d\x81\x4f\xa2\x90\x90\x1e\xda\x18\x0e\x2f\xfb\xd4\x86\x74\x7d\xbe\xbd\x6d\x5d\xcc\x84\xd7\xcf\x73\x1f\xf3\xaf\x70\xe1\x71\xa8\xe9\xf2\x85\x98\xdc\x75\x23\x5b\x8b\xb7\x56\x00\x09\x00\x46\x2e\xc7\x69\x96\xc8\x78\x74\xce\x6f\xae\xad\x0e\x0e\x61\x44\xb4\xd0\x23\xb2\x82\xcf\x7b\x73\xa9\x93\x0b\x3c\x7f\xa7\xc6\xb0\xb2\x32\xdd\x77\xfd\x60\x71\x7f\x76\x8b\xfb\x1e\x2d\x80\xb3\xba\xa4\x62\x68\x4f\x14\xd8\xdc\x1b\xb7\x75\x2d\xca\x3c\x22\xee\xec\x20\x7b\x02\x0b\x08\x04\x17\x34\x0b\x1b\xd3\xa4\xcc\xe5\xe3\x98\x3d\x61\xec\x9d\x57\x8e\x7c\xb5\x75\xd2\x32\xb9\xe4\xf0\xea\x96\x13\xa0\xe0\x0f\x55\xc2\x9c\x1b\x6a\xb8\x99\x31\xe4\xe1\x37\x10\x90\x13\x5b\x35\x25\x69\x14\xa5\x69\x51\xc8\x7b\xfc\x76\xca\xd7\x2c\xf4\xed\x5c\x5c\xa4\xd9\x98\x91\x92\x5b\x1d\xdd\x19\x58\xd3\xe9\xe0\x95\xa9\x95\xc8\x99\x42\x81\x57\xb9\xcb\xb6\x5b\x66\xdc\x46\xc1\x46\x5b\xfd\x56\xa0\x43\xb8\xfd\xb7\xf7\x2a\x82\x6f\x7b\x9a\x30\x66\x33\x3a\xe7\xb2\x56\xd8\xdb\x48\x72\xe4\x7e\x02\xde\xb0\x90\x75\xb0\x77\x61\x31\xcc\xb0\x3a\xbd\x02\x4e\x1f\xe2\x8f\xa0\x0a\xe4\xd2\x9b\x26\x86\xec\x33\xd7\x66\x79\x2d\x1e\x44\x3e\x0d\xde\xbe\xf0\x66\xae\x2b\xcb\x16\x7a\x57\xb5\x6b\xf4\x6b\xca\x2b\xf3\x5b\xf8\xe9\x0b\xaa\x69\xb7\x35\xbb\xeb\x93\x89\x40\xff\x82\xe2\x4f\xb8\x09\x2b\x78\xb6\xe8\x5d\xee\xad\xd5\xdb\x13\x6d\x1d\xee\xd0\xec\x7b\xf2\x15\xd5\x2c\x27\xef\xa9\xa0\x53\xd4\xf7\x4e\x6e\x6f\xbe\x7a\x7f\x6a\xf7\x15\xf4\xc9\xeb\xcb\x95\x17\x6d\xb7\xe9\xe0\x1f\xf6\x19\x2f\xb2\xb4\xf0\x1d\x58\xd5\x52\xff\x1d\x17\xbf\xd7\x40\x18\x12\xf8\x50\xb7\x64\xbd\x2b\x58\xd0\x4d\x3b\x84\xb5\x5d\xf3\xb3\x45\x60\xe6\x65\xfe\xc0\x2a\x9f\x5c\x68\x43\x8b\xe2\xa6\xa0\xe2\xbc\xaa\x94\x9c\xaf\xd6\xc6\x1b\x73\xf5\x0d\xfd\x4c\xd1\xcd\xc3\xbf\xac\x10\xf4\x70\x85\x2d\xc8\x75\x1c\x7f\x44\xae\x4d\xd0\xc2\xa5\x00\x96\x7a\x74\x5e\x1b\x59\x52\xc3\xb3\x23\xab\xac\x1f\xbd\xa7\xa2\xa6\xc5\x4a\xa7\xab\x8d\xcb\x58\x27\x22\x6e\xec\xb4\x3e\x75\x5d\x87\x6e\x1b\x65\x8d\xcd\xfd\x0d\x55\x96\x3a\x5d\xdc\x7e\xdf\xab\xaf\x36\xd4\xd4\x4b\x54\x78\x03\x67\x58\xcf\x0b\x86\xa4\xa0\xda\x7c\x57\xe5\xf6\xd0\xb7\x7e\xdd\x44\xf0\x33\x6a\x68\x21\xa7\x7f\x64\xb4\x58\x8d\xe1\x0d\x3c\xb9\x48\x5b\x7b\x03\x94\xbb\xf0\xaf\xc7\xa1\xe1\xb1\x26\x56\xc0\xf6\x31\xf0\x8a\x15\x6c\x4e\x85\xf1\xdd\xb1\xb8\xba\x3e\x76\xeb\x07\x2c\xe2\xd1\xf8\x9a\x33\xc3\x54\xc9\x45\x73\xcc\x5b\x68\x7b\x21\x45\xce\xd1\xec\x08\x06\x35\xec\xd1\x1c\x77\x3d\xaa\xad\xbb\x69\xd8\x70\xb7\xd0\xcc\xae\x99\xcc\xa7\x09\x0a\x6c\x36\x76\xf2\xe5\x0c\x5f\xc2\x4d\x7b\x63\x6e\x4b\x90\x22\x77\xc2\x0a\x86\x90\x47\x64\x35\xd9\xda\x2a\x27\x6c\x93\x0f\x86\x7e\x8f\x71\x0a\xeb\x1d\x47\x87\x6e\xde\xeb\xee\x20\x36\xa1\x18\x3e\xdb\x25\x8b\xf6\x54\xd6\xd3\xd4\x55\x78\x17\xba\x61\x24\x4b\xab\x20\x7f\xa3\xd1\x7a\x1e\xd0\x49\xf0\xea\x26\x23\x75\xcd\x6a\xdf\xa4\xb5\x31\x07\xfb\x92\x2a\xdb\x41\x62\xdc\xca\xb4\x3a\x26\x97\x6f\x2a\xd6\xd7\xce\xff\x4f\x39\x55\x84\x92\x8a\x33\x4c\x7e\x42\x85\x03\x16\x70\x16\x46\x73\xf7\xd2\x72\x30\xab\x12\xc2\x6f\x03\x77\x19\x8e\xc6\x65\xe7\x6b\xe1\x0d\xd4\x14\x93\x7f\xc0\xc5\xc5\xd9\xd7\xd2\x19\x79\x5d\x90\xae\xa5\x01\xc0\xc9\x07\x44\xd7\xd9\x8c\x50\x6d\xa7\x66\x11\xda\x9e\x78\x36\x2a\xa9\xe0\x13\xa6\xcd\x28\x64\x09\xd6\x7f\xfa\xd5\x5f\x46\xe4\xad\x54\xc4\x39\xaa\x0f\x7c\x56\x0d\x37\xcf\x88\x17\x5c\xe3\x62\x42\xdf\xa8\xb5\x56\x32\x77\x93\xbe\x87\xc9\x1a\x7a\x67\x79\x18\x4e\xb6\x66\x70\x75\xf1\x86\x1c\x59\x31\x31\xf9\xf4\x3f\x2c\x5b\xfa\xe7\x11\x39\xb9\x07\xa6\x7d\x64\xff\x3c\xc2\x0f\x06\xb7\xc9\x54\xa9\x8e\x1f\xc6\x60\x49\xc5\xa7\x53\xa6\x50\x7d\x24\x10\x54\x78\xea\xb2\x82\x08\x99\x34\xf6\x97\xd2\x51\xdd\x6c\x4f\xe4\x4f\xbf\xfa\xcb\x11\x39\x69\xae\x8b\x70\x91\xb3\xcf\xe4\x57\x68\x5d\xe6\xda\xae\xf1\xd4\x5d\xe6\xe8\x85\x30\xf4\xb3\x1d\x33\x9b\x49\xcd\x04\xaa\xf2\x46\x92\x19\x9d\x33\xa2\xa5\xd5\x80\x59\x51\x0c\x9d\x2d\x9d\xdc\x53\xc8\xd4\xe2\x41\x09\x81\xf5\xa4\xa2\xca\x34\x50\x62\xe4\x2c\x24\xf0\x35\xbb\x6d\x53\xe1\x6f\xa6\x27\x5c\xb8\xfb\x2b\x77\x73\x66\xf7\x1c\x02\x43\x71\x93\x8c\x24\xd9\x8c\x8a\x69\x88\x4d\x9f\xd4\xa6\x56\x6c\xcb\xd5\x4f\xc7\x33\x70\xc7\x45\xaf\x10\xe6\x6f\xb8\x68\x3b\x15\xac\xb6\x2b\x4d\xb9\xf1\x51\x11\xce\x57\xd1\x2c\xce\xec\x2e\x28\x3e\xae\x8d\x54\xfa\x2c\x67\x73\x56\x9c\x69\x3e\x1d\x52\x95\xcd\xb8\x61\x99\x5d\xd6\x19\xad\xf8\x30\x93\xc2\xee\x38\x64\x65\x28\xf3\x9f\x43\x79\xd3\xa1\x9d\xea\x96\xac\xd3\x1d\x17\xbd\xdd\xa8\xf6\xac\xc6\xb4\xbd\xad\xb1\x83\x3d\x68\x79\xa1\x68\x9b\x79\x82\xd5\x82\x21\xe4\x6c\x2f\x8b\xf5\x49\x93\xfb\xf3\x98\x63\x97\x07\x3c\x6b\x8f\x61\x8f\x1d\x3a\x90\xc0\xa9\x6c\x50\xca\x92\xe6\x48\x4a\xa9\x58\x3c\x3a\xf2\x5b\x90\x42\xba\xfc\x6c\x31\x84\x21\x64\x31\xa4\x22\xb7\xff\xc6\x80\x9d\x6c\xb1\x17\x18\xd6\xbc\x17\x21\xf8\xee\xfa\xf2\x69\x8e\x44\xcd\xf7\x70\xea\x9d\xbc\xd6\x51\x88\x42\x51\x15\x1d\x35\x54\xcd\x3c\xd3\x6c\x0a\xa8\x5c\xfb\x51\xff\xc3\xdd\xbf\x84\x6c\x67\xdb\x44\xaa\xcd\xb7\x26\x89\xec\xd8\x71\xbe\xef\x62\x8f\xd4\x26\x07\x8e\x57\x54\x1b\x97\x5a\xcb\xe7\x20\x68\x2c\xc3\x2b\x28\xc0\x60\xd6\x5f\x0c\x77\xc2\x21\xef\x2f\x60\x27\x32\x5c\x99\x73\x29\x0b\x4a\xc9\x76\x05\x2a\xea\x2f\x8d\x3a\x68\xb8\x28\xc3\xb4\x21\x74\x4e\x79\x01\xd6\x79\x39\xd6\x4c\xcd\xb1\x20\x95\x4b\x35\x48\xdb\x7a\x96\xab\x39\x81\x62\xd4\x13\x69\x3e\x7e\x0d\xcb\xbb\xb2\x69\x01\xa0\x0d\xb5\x66\xbf\x76\xd6\x7b\xd1\x7b\x50\xbd\x5c\xfb\xb3\xfd\xc2\x8e\x6a\x8c\xc5\xbf\x3f\x32\xaa\xcc\x98\x51\xf3\x89\x6f\xe2\xbb\x4b\x28\xdd\xe8\x17\x4a\xb9\x07\x84\xbe\x67\x64\x2a\x8d\x15\xb1\x6a\xc0\x7d\x94\x49\x31\xa9\x4f\x40\xb4\xc7\xc6\xe8\xb8\xca\x4f\x8a\x42\x88\x8f\x14\x3d\x97\xd9\xec\xb8\xbc\x4e\x27\x1d\x3b\x4c\x32\xd8\x1a\x13\x69\x48\xc1\xdc\xde\xe1\x6d\x06\x50\xa0\xa7\x59\x72\xc9\xb4\xde\x98\x60\xa3\xe9\x5d\x88\xad\xf1\x28\xb7\xae\xd6\x4a\xff\x1b\x86\x85\x58\x01\x3a\x67\x86\xf2\xc2\x1f\x65\x04\x45\x80\xd2\x36\xea\xba\x71\x81\x8a\x51\xbd\x49\x40\x68\xcc\xfa\x23\x34\xc6\x49\x4b\xc1\x86\xf7\x52\xe5\xe4\x82\x96\xac\xb8\xa0\x9a\xb9\xb1\xd2\x10\x3d\xdc\xa3\x63\xbd\xd7\x29\xaf\xb6\x7d\xad\x99\x32\x1a\x7f\xa2\x49\x18\xfe\x8a\x2a\x16\x4e\x70\xe0\x4d\x90\x9f\x54\xcd\x06\xe4\xad\xe5\x5e\x03\xf2\x9d\xb8\x13\xf2\xfe\x61\x73\x35\x1b\x6f\x41\x1a\x33\x4d\xdd\x3f\x7c\x5a\x9d\x86\xc1\x27\x4c\x77\xc7\x19\x39\x82\xbf\xc6\xd4\xd8\x64\x36\xa1\xa9\x9f\x91\xfd\xe7\x92\x09\xca\x2a\x8a\x4a\x4e\x15\xd3\x98\xb9\x66\x65\x92\xc4\xae\x26\xe7\xaf\x99\x70\xc1\x7d\x5b\xa7\x77\xbd\xaa\x97\x9f\xa9\xe7\x6b\xd3\xf8\x8b\xdb\x6f\xf7\xb1\xaa\x58\x29\x6a\x6c\xf6\x08\x4c\x26\xba\xc6\xf8\xb4\x6e\x86\xab\x8d\x4e\x09\xd7\x4b\xda\xa2\x50\xb2\xc9\x3a\xea\x57\x77\x71\xfb\xfd\x7a\x60\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb3\xd4\x43\x0d\x52\x5b\xcf\xcc\x56\x23\xd4\xc1\xfc\x74\x30\x3f\x7d\x49\xe6\xa7\xad\x18\xbf\xc9\xe4\xf4\x65\x18\x9b\xb6\x2e\x71\x93\x81\xe9\x45\x9a\x96\x3a\xad\x68\xa3\x39\xe9\xc5\x1a\x92\xb6\x2e\xad\xa3\xf1\xe8\x5f\xc7\x6c\xb4\x15\x62\x1b\x4c\x45\x2f\xd0\x48\xd4\x45\x20\x63\x79\x17\x31\xf1\x3a\x69\x9c\x0a\x8a\xb1\x9c\x65\x18\xce\x3b\xe5\xa4\xe2\xcc\xae\xd2\xa2\x15\xe0\xb6\xce\xed\xd8\x4d\xae\xbb\xec\xe5\x04\x46\x57\xec\x71\x69\xb2\xe4\xf2\xea\xe6\xe3\xd5\xc5\xf9\xa7\xab\xcb\xb6\x7c\xb7\x0a\xd2\x5b\x24\xb1\xcd\x36\x88\x61\x22\x89\xad\x69\x60\x09\xf2\x9a\x9f\x2c\x0e\xac\xf9\xa9\xae\xf9\xaa\x5e\x0f\x97\x0b\x1f\xc4\xe5\x1e\xc4\x3f\xb6\x9f\xce\xae\xc7\xf3\x3b\x74\x9c\xa2\xce\xe7\xcc\xca\x3d\x33\x59\xe4\xda\xfb\xad\x5e\x5f\x86\x48\x2a\x2e\xb2\xa2\xce\xad\x70\xf1\xdd\x77\xd7\x97\x7a\x44\xc8\x57\x2c\xa3\xb5\x06\x2b\x4c\x2e\xc5\xb1\x21\xdf\x7e\x78\xf7\x5f\xe0\x8f\x0d\x2d\x06\x21\xaf\x09\x64\xe5\xe5\x14\x13\x0b\x1b\x4c\xd7\x46\xbe\x62\x28\xa8\xc0\x97\x33\x5a\x59\x2a\xa6\xb1\x72\x85\x01\x59\x64\xc6\x8a\xca\x52\xcc\x3b\x46\x62\x06\x55\x3b\x70\xac\x30\xef\xdd\x27\xa7\xcc\x60\xd4\xd5\x26\x0f\xc9\x8d\x50\xdb\x62\x71\x7d\x80\xad\xb5\xa1\x3e\x3a\x6d\xfc\x9e\x6a\x67\xb1\x5a\x39\xdb\x2d\xfb\xbb\xdd\x3e\xb3\xde\xc4\xb1\xc6\xb8\x81\xe4\x19\xfe\x5a\x9a\xb3\x9d\x6c\xb4\x63\xa0\x13\x09\x37\x9d\xad\xa9\xeb\xdd\x80\x56\xd7\x01\x58\xb2\x65\xb0\x36\x90\x1b\x1f\x0e\x1e\xd9\xc9\x94\xbb\xcd\x05\x8a\x88\xe4\x8d\xda\x9f\xce\x7f\xae\xf9\xae\x1e\x87\xea\xaf\x71\xbe\xce\x22\x43\xfe\xf1\xcf\x9f\xfd\xbf\x00\x00\x00\xff\xff\xab\xf2\x0f\xc7\x37\x6a\x02\x00")
func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) {
return bindataRead(
@@ -311,11 +311,13 @@ var _bindata = map[string]func() (*asset, error){
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
-// data/
-// foo.txt
-// img/
-// a.png
-// b.png
+//
+// data/
+// foo.txt
+// img/
+// a.png
+// b.png
+//
// then AssetDir("data") would return []string{"foo.txt", "img"}
// AssetDir("data/img") would return []string{"a.png", "b.png"}
// AssetDir("foo.txt") and AssetDir("notexist") would return an error
diff --git a/staging/api/go.mod b/staging/api/go.mod
index afa9ff25f9..4120ad8147 100644
--- a/staging/api/go.mod
+++ b/staging/api/go.mod
@@ -1,95 +1,95 @@
module github.com/operator-framework/api
-go 1.18
+go 1.19
require (
- github.com/blang/semver v3.5.1+incompatible
github.com/blang/semver/v4 v4.0.0
github.com/ghodss/yaml v1.0.0
github.com/go-bindata/go-bindata/v3 v3.1.3
- github.com/google/cel-go v0.10.1
- github.com/google/go-cmp v0.5.6 // indirect
- github.com/sirupsen/logrus v1.8.1
- github.com/spf13/cobra v1.4.0
- github.com/stretchr/testify v1.7.0
- google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368
- k8s.io/api v0.24.0
- k8s.io/apiextensions-apiserver v0.24.0
- k8s.io/apimachinery v0.24.0
- k8s.io/client-go v0.24.0
- sigs.k8s.io/controller-runtime v0.12.1
+ github.com/google/cel-go v0.15.3
+ github.com/sirupsen/logrus v1.9.2
+ github.com/spf13/cobra v1.7.0
+ github.com/stretchr/testify v1.8.3
+ google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6
+ k8s.io/api v0.27.2
+ k8s.io/apiextensions-apiserver v0.27.2
+ k8s.io/apimachinery v0.27.2
+ k8s.io/client-go v0.27.2
+ sigs.k8s.io/controller-runtime v0.15.0
)
require (
- github.com/PuerkitoBio/purell v1.1.1 // indirect
- github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
- github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e // indirect
+ github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/cespare/xxhash/v2 v2.1.2 // indirect
+ github.com/cenkalti/backoff/v4 v4.1.3 // indirect
+ github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/felixge/httpsnoop v1.0.1 // indirect
- github.com/go-logr/logr v1.2.0 // indirect
- github.com/go-openapi/jsonpointer v0.19.5 // indirect
- github.com/go-openapi/jsonreference v0.19.5 // indirect
- github.com/go-openapi/swag v0.19.14 // indirect
+ github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+ github.com/felixge/httpsnoop v1.0.3 // indirect
+ github.com/go-logr/logr v1.2.4 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-openapi/jsonpointer v0.19.6 // indirect
+ github.com/go-openapi/jsonreference v0.20.1 // indirect
+ github.com/go-openapi/swag v0.22.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/protobuf v1.5.2 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
+ github.com/google/go-cmp v0.5.9 // indirect
github.com/google/gofuzz v1.1.0 // indirect
- github.com/google/uuid v1.1.2 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
+ github.com/google/uuid v1.3.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
- github.com/inconshreveable/mousetrap v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kisielk/errcheck v1.5.0 // indirect
- github.com/mailru/easyjson v0.7.6 // indirect
- github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/client_golang v1.12.1 // indirect
- github.com/prometheus/client_model v0.2.0 // indirect
- github.com/prometheus/common v0.32.1 // indirect
- github.com/prometheus/procfs v0.7.3 // indirect
+ github.com/prometheus/client_golang v1.15.1 // indirect
+ github.com/prometheus/client_model v0.4.0 // indirect
+ github.com/prometheus/common v0.42.0 // indirect
+ github.com/prometheus/procfs v0.9.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stoewer/go-strcase v1.2.0 // indirect
- go.opentelemetry.io/contrib v0.20.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 // indirect
- go.opentelemetry.io/otel v0.20.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp v0.20.0 // indirect
- go.opentelemetry.io/otel/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/export/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/trace v0.20.0 // indirect
- go.opentelemetry.io/proto/otlp v0.7.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect
+ go.opentelemetry.io/otel v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect
+ go.opentelemetry.io/otel/metric v0.31.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.10.0 // indirect
+ go.opentelemetry.io/otel/trace v1.10.0 // indirect
+ go.opentelemetry.io/proto/otlp v0.19.0 // indirect
+ golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
- golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
- golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect
- golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
- golang.org/x/sys v0.0.0-20220209214540-3681064d5158 // indirect
- golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
- golang.org/x/text v0.3.7 // indirect
- golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
- golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717 // indirect
- golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
+ golang.org/x/mod v0.10.0 // indirect
+ golang.org/x/net v0.10.0 // indirect
+ golang.org/x/oauth2 v0.5.0 // indirect
+ golang.org/x/sys v0.8.0 // indirect
+ golang.org/x/term v0.8.0 // indirect
+ golang.org/x/text v0.9.0 // indirect
+ golang.org/x/time v0.3.0 // indirect
+ golang.org/x/tools v0.9.1 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/grpc v1.40.0 // indirect
- google.golang.org/protobuf v1.27.1 // indirect
+ google.golang.org/grpc v1.54.0 // indirect
+ google.golang.org/protobuf v1.30.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
- gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
- k8s.io/apiserver v0.24.0 // indirect
- k8s.io/component-base v0.24.0 // indirect
- k8s.io/klog/v2 v2.60.1 // indirect
- k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
- k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
- sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 // indirect
- sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
- sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+ k8s.io/apiserver v0.27.2 // indirect
+ k8s.io/component-base v0.27.2 // indirect
+ k8s.io/klog/v2 v2.90.1 // indirect
+ k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect
+ k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 // indirect
+ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+ sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
diff --git a/staging/api/go.sum b/staging/api/go.sum
index c5357c9828..a15d6312c8 100644
--- a/staging/api/go.sum
+++ b/staging/api/go.sum
@@ -13,11 +13,6 @@ 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.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/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=
@@ -26,7 +21,6 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
-cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
@@ -37,109 +31,53 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
-github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
-github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
-github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
-github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
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/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
-github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PuerkitoBio/purell v1.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/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/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e h1:GCzyKMDDjSGnlpl3clrdAK7I1AaVoaiKDOYkUzChZzg=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
-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-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
+github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18=
+github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
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/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
-github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
-github.com/benbjohnson/clock v1.1.0/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/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
-github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
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/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
-github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/cespare/xxhash v1.1.0/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 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/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/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
-github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
-github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
-github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
-github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-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/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-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+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.11/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/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 v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
-github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
-github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
-github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
-github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
-github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
-github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
+github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
+github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI=
@@ -147,36 +85,24 @@ github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7N
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-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 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 v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
-github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
-github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
-github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
-github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
-github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
-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.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+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/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
+github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -189,7 +115,6 @@ 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/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/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -205,15 +130,13 @@ 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/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/cel-go v0.10.1 h1:MQBGSZGnDwh7T/un+mzGKOMz3x+4E/GDPprWjDL+1Jg=
-github.com/google/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
-github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=
+github.com/google/cel-go v0.15.3 h1:W1wIeGuEs81+lBVU+cQRg1hkRT58Q6bNxvM5yn008S8=
+github.com/google/cel-go v0.15.3/go.mod h1:YzWEoI07MC/a/wj9in8GeVatqfypkldgBlwXh9bCwqY=
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -223,18 +146,15 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.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/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=
@@ -242,287 +162,126 @@ 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-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-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
-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/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/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
-github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
-github.com/hashicorp/errwrap v1.0.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-immutable-radix v1.0.0/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-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
-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.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/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/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/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
-github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
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.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
-github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
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/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.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 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
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/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
-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 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY=
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/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.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.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
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 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
-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 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
-github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
-github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
-github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-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/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
-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/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
-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/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+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/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-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=
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=
-github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-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/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=
-github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
-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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
-github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.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.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-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.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-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/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI=
+github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
+github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
-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=
-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
-github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
+github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
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/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=
-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.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
-github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-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/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+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.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
+github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
+github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
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/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
-github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-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.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/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/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
-github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
-github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+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/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.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
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/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+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.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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+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.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
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=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
-go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
-go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
-go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
-go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
-go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
go.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.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
-go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
-go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
-go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
-go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8=
-go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw=
-go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
-go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8=
-go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g=
-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 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8=
-go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
-go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw=
-go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
-go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 h1:sxoY9kG1s1WpSYNyzm24rlwH4lnRYFXUVVBmKMBfRgw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
+go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
+go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 h1:pDDYmo0QadUPal5fwXoY1pmMpFcdyhXOmL5drCrI3vU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 h1:KtiUEhQmj/Pa874bVYKGNVdq8NPKiacPbaRRtgXi+t4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
+go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
+go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
+go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
+go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
+go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
+go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-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=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
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-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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -533,6 +292,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0
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-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA=
+golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
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/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -545,7 +306,6 @@ 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 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=
@@ -556,18 +316,10 @@ 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.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.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
+golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -575,11 +327,9 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-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-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -590,40 +340,22 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
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=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-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-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
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/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
+golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
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=
@@ -633,32 +365,19 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
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-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-20190215142949-d0b11bdaac8a/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
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-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -670,56 +389,31 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-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-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-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-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-20210423082822-04245dca01da/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-20210603081109-ebe580a85c40/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-20210831042530-f4d43177bf5e/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-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-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-20220715151400-c0bba94af5f8/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/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.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
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/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.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
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-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
-golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
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=
@@ -727,19 +421,15 @@ 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=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
-golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -759,7 +449,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -767,21 +456,12 @@ 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-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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717 h1:hI3jKY4Hpf63ns040onEbB3dAkR/H/P83hw1TG8dD3Y=
-golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E=
+golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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=
@@ -799,11 +479,6 @@ 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/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=
@@ -833,7 +508,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
@@ -843,22 +517,10 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc
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-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/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-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368 h1:Et6SkiuvnBn+SgrSYXs/BrUpGB4mbdwt4R3vaPIlicA=
-google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6 h1:62QuyPXKEkZpjZesyj5K5jABl6MnSnWl+vNuT5oz90E=
+google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU=
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=
@@ -871,17 +533,12 @@ 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.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
-google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.54.0 h1:EhTqbhiYeixwWQtAEZAxmV9MGqcjEU2mFx52xCzNyag=
+google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g=
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=
@@ -894,40 +551,27 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
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 h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
-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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-gopkg.in/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/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=
-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=
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-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
-gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
+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=
@@ -935,42 +579,34 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
-k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
-k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY=
-k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM=
-k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=
-k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
-k8s.io/apiserver v0.24.0 h1:GR7kGsjOMfilRvlG3Stxv/3uz/ryvJ/aZXc5pqdsNV0=
-k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA=
-k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
-k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
-k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
-k8s.io/component-base v0.24.0 h1:h5jieHZQoHrY/lHG+HyrSbJeyfuitheBvqvKwKHVC0g=
-k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=
-k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
-k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=
-k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
-k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
-k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo=
+k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4=
+k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo=
+k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ=
+k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg=
+k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
+k8s.io/apiserver v0.27.2 h1:p+tjwrcQEZDrEorCZV2/qE8osGTINPuS5ZNqWAvKm5E=
+k8s.io/apiserver v0.27.2/go.mod h1:EsOf39d75rMivgvvwjJ3OW/u9n1/BmUMK5otEOJrb1Y=
+k8s.io/client-go v0.27.2 h1:vDLSeuYvCHKeoQRhCXjxXO45nHVv2Ip4Fe0MfioMrhE=
+k8s.io/client-go v0.27.2/go.mod h1:tY0gVmUsHrAmjzHX9zs7eCjxcBsf8IiNe7KQ52biTcQ=
+k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo=
+k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=
+k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 h1:dUk62HQ3ZFhD48Qr8MIXCiKA8wInBQCtuE4QGfFW7yA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
-sigs.k8s.io/controller-runtime v0.12.1 h1:4BJY01xe9zKQti8oRjj/NeHKRXthf1YkYJAgLONFFoI=
-sigs.k8s.io/controller-runtime v0.12.1/go.mod h1:BKhxlA4l7FPK4AQcsuL4X6vZeWnKDXez/vp1Y8dxTU0=
-sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
-sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
-sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
-sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0=
+sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU=
+sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk=
+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.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
diff --git a/staging/api/pkg/manifests/bundleloader.go b/staging/api/pkg/manifests/bundleloader.go
index 5d5bf2dc1a..94f14a22ac 100644
--- a/staging/api/pkg/manifests/bundleloader.go
+++ b/staging/api/pkg/manifests/bundleloader.go
@@ -51,6 +51,10 @@ func (b *bundleLoader) LoadBundle() error {
// Add values from the annotations when the values are not loaded
func (b *bundleLoader) addChannelsFromAnnotationsFile() {
+ if b.bundle == nil {
+ // None of this is relevant if the bundle was not found
+ return
+ }
// Note that they will not get load for Bundle Format directories
// and PackageManifest should not have the annotationsFile. However,
// the following check to ensure that channels and default channels
diff --git a/staging/api/pkg/operators/v1alpha1/catalogsource_types.go b/staging/api/pkg/operators/v1alpha1/catalogsource_types.go
index 020fecc0ec..c4c7662d37 100644
--- a/staging/api/pkg/operators/v1alpha1/catalogsource_types.go
+++ b/staging/api/pkg/operators/v1alpha1/catalogsource_types.go
@@ -89,6 +89,11 @@ type CatalogSourceSpec struct {
// +optional
Secrets []string `json:"secrets,omitempty"`
+ // RunAsRoot allows admins to indicate that they wish to run the CatalogSource pod in a privileged
+ // pod as root. This should only be enabled when running older catalog images which could not be run as non-root.
+ // +optional
+ RunAsRoot bool `json:"runAsRoot,omitempty"`
+
// Metadata
DisplayName string `json:"displayName,omitempty"`
Description string `json:"description,omitempty"`
@@ -114,6 +119,10 @@ type GrpcPodConfig struct {
// +optional
Tolerations []corev1.Toleration `json:"tolerations,omitempty"`
+ // Affinity is the catalog source's pod's affinity.
+ // +optional
+ Affinity *corev1.Affinity `json:"affinity,omitempty"`
+
// If specified, indicates the pod's priority.
// If not specified, the pod priority will be default or zero if there is no
// default.
diff --git a/staging/api/pkg/operators/v1alpha1/clusterserviceversion_types.go b/staging/api/pkg/operators/v1alpha1/clusterserviceversion_types.go
index eb4d1635ea..3e6d324803 100644
--- a/staging/api/pkg/operators/v1alpha1/clusterserviceversion_types.go
+++ b/staging/api/pkg/operators/v1alpha1/clusterserviceversion_types.go
@@ -145,11 +145,14 @@ type APIServiceDescription struct {
ActionDescriptor []ActionDescriptor `json:"actionDescriptors,omitempty"`
}
-// APIResourceReference is a Kubernetes resource type used by a custom resource
+// APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
// +k8s:openapi-gen=true
type APIResourceReference struct {
- Name string `json:"name"`
- Kind string `json:"kind"`
+ // Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
+ Name string `json:"name"`
+ // Kind of the referenced resource type.
+ Kind string `json:"kind"`
+ // API Version of the referenced resource type.
Version string `json:"version"`
}
@@ -279,13 +282,34 @@ type ClusterServiceVersionSpec struct {
WebhookDefinitions []WebhookDescription `json:"webhookdefinitions,omitempty"`
NativeAPIs []metav1.GroupVersionKind `json:"nativeAPIs,omitempty"`
MinKubeVersion string `json:"minKubeVersion,omitempty"`
- DisplayName string `json:"displayName"`
- Description string `json:"description,omitempty"`
- Keywords []string `json:"keywords,omitempty"`
- Maintainers []Maintainer `json:"maintainers,omitempty"`
- Provider AppLink `json:"provider,omitempty"`
- Links []AppLink `json:"links,omitempty"`
- Icon []Icon `json:"icon,omitempty"`
+
+ // The name of the operator in display format.
+ DisplayName string `json:"displayName"`
+
+ // Description of the operator. Can include the features, limitations or use-cases of the
+ // operator.
+ // +optional
+ Description string `json:"description,omitempty"`
+
+ // A list of keywords describing the operator.
+ // +optional
+ Keywords []string `json:"keywords,omitempty"`
+
+ // A list of organizational entities maintaining the operator.
+ // +optional
+ Maintainers []Maintainer `json:"maintainers,omitempty"`
+
+ // The publishing entity behind the operator.
+ // +optional
+ Provider AppLink `json:"provider,omitempty"`
+
+ // A list of links related to the operator.
+ // +optional
+ Links []AppLink `json:"links,omitempty"`
+
+ // The icon for this operator.
+ // +optional
+ Icon []Icon `json:"icon,omitempty"`
// InstallModes specify supported installation types
// +optional
diff --git a/staging/api/pkg/operators/v1alpha1/installplan_types.go b/staging/api/pkg/operators/v1alpha1/installplan_types.go
index 5210436d98..09deba525b 100644
--- a/staging/api/pkg/operators/v1alpha1/installplan_types.go
+++ b/staging/api/pkg/operators/v1alpha1/installplan_types.go
@@ -239,6 +239,9 @@ const (
// BundleLookupPending describes BundleLookups that are not complete.
BundleLookupPending BundleLookupConditionType = "BundleLookupPending"
+ // BundleLookupFailed describes conditions types for when BundleLookups fail
+ BundleLookupFailed BundleLookupConditionType = "BundleLookupFailed"
+
crdKind = "CustomResourceDefinition"
)
diff --git a/staging/api/pkg/operators/v1alpha1/subscription_types.go b/staging/api/pkg/operators/v1alpha1/subscription_types.go
index 900cc46577..2452f9a1cf 100644
--- a/staging/api/pkg/operators/v1alpha1/subscription_types.go
+++ b/staging/api/pkg/operators/v1alpha1/subscription_types.go
@@ -111,6 +111,12 @@ const (
// SubscriptionResolutionFailed indicates that the dependency resolution in the namespace in which the subscription is created has failed
SubscriptionResolutionFailed SubscriptionConditionType = "ResolutionFailed"
+
+ // SubscriptionBundleUnpacking indicates that the unpack job is currently running
+ SubscriptionBundleUnpacking SubscriptionConditionType = "BundleUnpacking"
+
+ // SubscriptionBundleUnpackFailed indicates that the unpack job failed
+ SubscriptionBundleUnpackFailed SubscriptionConditionType = "BundleUnpackFailed"
)
const (
diff --git a/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go b/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go
index e26ddea616..cf01001f5c 100644
--- a/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go
+++ b/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go
@@ -723,6 +723,11 @@ func (in *GrpcPodConfig) DeepCopyInto(out *GrpcPodConfig) {
(*in)[i].DeepCopyInto(&(*out)[i])
}
}
+ if in.Affinity != nil {
+ in, out := &in.Affinity, &out.Affinity
+ *out = new(v1.Affinity)
+ (*in).DeepCopyInto(*out)
+ }
if in.PriorityClassName != nil {
in, out := &in.PriorityClassName, &out.PriorityClassName
*out = new(string)
diff --git a/staging/api/pkg/validation/internal/annotations.go b/staging/api/pkg/validation/internal/annotations.go
index 2ab63aa9fb..715b04171f 100644
--- a/staging/api/pkg/validation/internal/annotations.go
+++ b/staging/api/pkg/validation/internal/annotations.go
@@ -30,13 +30,13 @@ which are known to be case sensitive. It also checks to see if the olm.propertie
annotation is defined in order to add a warning if present. This function can be
used anywhere annotations need to be checked for case sensitivity.
-Arguments
+# Arguments
• annotations: annotations map usually obtained from ObjectMeta.GetAnnotations()
• value: is the field or file that caused an error or warning
-Returns
+# Returns
• errs: Any errors that may have been detected with the annotation keys provided
*/
diff --git a/staging/api/pkg/validation/internal/community.go b/staging/api/pkg/validation/internal/community.go
index dfc7c4aabe..debaae2bab 100644
--- a/staging/api/pkg/validation/internal/community.go
+++ b/staging/api/pkg/validation/internal/community.go
@@ -7,7 +7,7 @@ import (
"os"
"strings"
- "github.com/blang/semver"
+ "github.com/blang/semver/v4"
"github.com/operator-framework/api/pkg/manifests"
"github.com/operator-framework/api/pkg/validation/errors"
diff --git a/staging/api/pkg/validation/internal/operatorhub.go b/staging/api/pkg/validation/internal/operatorhub.go
index ac9fd0cf53..f5da37a274 100644
--- a/staging/api/pkg/validation/internal/operatorhub.go
+++ b/staging/api/pkg/validation/internal/operatorhub.go
@@ -71,15 +71,15 @@ import (
// containing a list of categories will enable those categories to be used when comparing CSV categories for
// OperatorHub validation. The json file should be in the following format:
//
-// ```json
-// {
-// "categories":[
-// "Cloud Pak",
-// "Registry",
-// "MyCoolThing",
-// ]
-// }
-// ```
+// ```json
+// {
+// "categories":[
+// "Cloud Pak",
+// "Registry",
+// "MyCoolThing",
+// ]
+// }
+// ```
//
// - The `csv.Spec.Provider.Name` was provided
//
diff --git a/staging/api/pkg/validation/internal/removed_apis.go b/staging/api/pkg/validation/internal/removed_apis.go
index 44dee85d06..13feafb5d2 100644
--- a/staging/api/pkg/validation/internal/removed_apis.go
+++ b/staging/api/pkg/validation/internal/removed_apis.go
@@ -2,12 +2,17 @@ package internal
import (
"fmt"
- "github.com/blang/semver"
+ "sort"
+ "strings"
+
+ "github.com/blang/semver/v4"
"github.com/operator-framework/api/pkg/manifests"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/api/pkg/validation/errors"
interfaces "github.com/operator-framework/api/pkg/validation/interfaces"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
- "sort"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
)
// k8sVersionKey defines the key which can be used by its consumers
@@ -147,11 +152,12 @@ func checkRemovedAPIsForVersion(
errs []error, warns []error) ([]error, []error) {
found := map[string][]string{}
+ warnsFound := map[string][]string{}
switch k8sVersionToCheck.String() {
case "1.22.0":
found = getRemovedAPIsOn1_22From(bundle)
case "1.25.0":
- found = getRemovedAPIsOn1_25From(bundle)
+ found, warnsFound = getRemovedAPIsOn1_25From(bundle)
case "1.26.0":
found = getRemovedAPIsOn1_26From(bundle)
default:
@@ -172,6 +178,16 @@ func checkRemovedAPIsForVersion(
warns = append(warns, msg)
}
}
+
+ if len(warnsFound) > 0 {
+ deprecatedAPIsMessage := generateMessageWithDeprecatedAPIs(warnsFound)
+ msg := fmt.Errorf(DeprecateMessage,
+ k8sVersionToCheck.Major, k8sVersionToCheck.Minor,
+ k8sVersionToCheck.Major, k8sVersionToCheck.Minor,
+ deprecatedAPIsMessage)
+ warns = append(warns, msg)
+ }
+
return errs, warns
}
@@ -287,40 +303,115 @@ func getRemovedAPIsOn1_22From(bundle *manifests.Bundle) map[string][]string {
// add manifests on the bundle using these APIs. On top of that some Kinds such as the CronJob
// are not currently a valid/supported by OLM and never would to be added to bundle.
// See: https://github.com/operator-framework/operator-registry/blob/v1.19.5/pkg/lib/bundle/supported_resources.go#L3-L23
-func getRemovedAPIsOn1_25From(bundle *manifests.Bundle) map[string][]string {
+func getRemovedAPIsOn1_25From(bundle *manifests.Bundle) (map[string][]string, map[string][]string) {
deprecatedAPIs := make(map[string][]string)
+ warnDeprecatedAPIs := make(map[string][]string)
+
+ deprecatedGvk := map[schema.GroupVersionKind]struct{}{
+ {Group: "batch", Version: "v1beta1", Kind: "CronJob"}: {},
+ {Group: "discovery.k8s.io", Version: "v1beta1", Kind: "EndpointSlice"}: {},
+ {Group: "events.k8s.io", Version: "v1beta1", Kind: "Event"}: {},
+ {Group: "autoscaling", Version: "v2beta1", Kind: "HorizontalPodAutoscaler"}: {},
+ {Group: "policy", Version: "v1beta1", Kind: "PodDisruptionBudget"}: {},
+ {Group: "policy", Version: "v1beta1", Kind: "PodSecurityPolicy"}: {},
+ {Group: "node.k8s.io", Version: "v1beta1", Kind: "RuntimeClass"}: {},
+ }
+
+ addIfDeprecated := func(u *unstructured.Unstructured) {
+ if _, ok := deprecatedGvk[u.GetObjectKind().GroupVersionKind()]; ok {
+ deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], u.GetName())
+ }
+ }
+
+ deprecatedGroupResource := map[schema.GroupResource]struct{}{
+ {Group: "batch", Resource: "cronjobs"}: {},
+ {Group: "discovery.k8s.io", Resource: "endpointslices"}: {},
+ {Group: "events.k8s.io", Resource: "events"}: {},
+ {Group: "autoscaling", Resource: "horizontalpodautoscalers"}: {},
+ {Group: "policy", Resource: "poddisruptionbudgets"}: {},
+ {Group: "policy", Resource: "podsecuritypolicies"}: {},
+ {Group: "node.k8s.io", Resource: "runtimeclasses"}: {},
+ }
+
+ warnIfDeprecated := func(gr schema.GroupResource, msg string) {
+ if _, ok := deprecatedGroupResource[gr]; ok {
+ warnDeprecatedAPIs[gr.Resource] = append(warnDeprecatedAPIs[gr.Resource], msg)
+ }
+ }
+
for _, obj := range bundle.Objects {
switch u := obj.GetObjectKind().(type) {
case *unstructured.Unstructured:
switch u.GetAPIVersion() {
- case "batch/v1beta1":
- if u.GetKind() == "CronJob" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
- }
- case "discovery.k8s.io/v1beta1":
- if u.GetKind() == "EndpointSlice" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
- }
- case "events.k8s.io/v1beta1":
- if u.GetKind() == "Event" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
- }
- case "autoscaling/v2beta1":
- if u.GetKind() == "HorizontalPodAutoscaler" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
- }
- case "policy/v1beta1":
- if u.GetKind() == "PodDisruptionBudget" || u.GetKind() == "PodSecurityPolicy" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
- }
- case "node.k8s.io/v1beta1":
- if u.GetKind() == "RuntimeClass" {
- deprecatedAPIs[u.GetKind()] = append(deprecatedAPIs[u.GetKind()], obj.GetName())
+ case "operators.coreos.com/v1alpha1":
+ // Check a couple CSV fields for references to deprecated APIs
+ if u.GetKind() == "ClusterServiceVersion" {
+ resInCsvCrds := make(map[string]struct{})
+ csv := &v1alpha1.ClusterServiceVersion{}
+ err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.Object, csv)
+ if err != nil {
+ fmt.Println("failed to convert unstructured.Unstructed to v1alpha1.ClusterServiceVersion:", err)
+ }
+
+ // Loop through all the CRDDescriptions to see
+ // if there is any with an API Version & Kind that is deprecated
+ crdCheck := func(crdsField string, crdDescriptions []v1alpha1.CRDDescription) {
+ for i, desc := range crdDescriptions {
+ for j, res := range desc.Resources {
+ resFromKind := fmt.Sprintf("%ss", strings.ToLower(res.Kind))
+ resInCsvCrds[resFromKind] = struct{}{}
+ unstruct := &unstructured.Unstructured{
+ Object: map[string]interface{}{
+ "apiVersion": res.Version,
+ "kind": res.Kind,
+ "metadata": map[string]interface{}{
+ "name": fmt.Sprintf("ClusterServiceVersion.Spec.CustomResourceDefinitions.%s[%d].Resource[%d]", crdsField, i, j),
+ },
+ },
+ }
+ addIfDeprecated(unstruct)
+ }
+ }
+ }
+
+ // Check the Owned Resources
+ crdCheck("Owned", csv.Spec.CustomResourceDefinitions.Owned)
+
+ // Check the Required Resources
+ crdCheck("Required", csv.Spec.CustomResourceDefinitions.Required)
+
+ // Loop through all the StrategyDeploymentPermissions to see
+ // if the rbacv1.PolicyRule that is defined specifies a resource that
+ // *may* have a deprecated API then add it to the warnings.
+ // Only present a warning if the resource was NOT found as a resource
+ // in the ClusterServiceVersion.Spec.CustomResourceDefinitions fields
+ permCheck := func(permField string, perms []v1alpha1.StrategyDeploymentPermissions) {
+ for i, perm := range perms {
+ for j, rule := range perm.Rules {
+ for _, apiGroup := range rule.APIGroups {
+ for _, res := range rule.Resources {
+ if _, ok := resInCsvCrds[res]; ok {
+ continue
+ }
+ warnIfDeprecated(schema.GroupResource{Group: apiGroup, Resource: res}, fmt.Sprintf("ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.%s[%d].Rules[%d]", permField, i, j))
+ }
+ }
+ }
+ }
+ }
+
+ // Check the ClusterPermissions
+ permCheck("ClusterPermissions", csv.Spec.InstallStrategy.StrategySpec.ClusterPermissions)
+
+ // Check the Permissions
+ permCheck("Permissions", csv.Spec.InstallStrategy.StrategySpec.Permissions)
}
+ default:
+ addIfDeprecated(u)
}
}
}
- return deprecatedAPIs
+ return deprecatedAPIs, warnDeprecatedAPIs
}
// getRemovedAPIsOn1_26From return the list of resources which were deprecated
diff --git a/staging/api/pkg/validation/internal/removed_apis_test.go b/staging/api/pkg/validation/internal/removed_apis_test.go
index 60cc3a2ff8..ac238fabb7 100644
--- a/staging/api/pkg/validation/internal/removed_apis_test.go
+++ b/staging/api/pkg/validation/internal/removed_apis_test.go
@@ -72,27 +72,47 @@ func Test_GetRemovedAPIsOn1_25From(t *testing.T) {
mock["HorizontalPodAutoscaler"] = []string{"memcached-operator-hpa"}
mock["PodDisruptionBudget"] = []string{"memcached-operator-policy-manager"}
+ warnMock := make(map[string][]string)
+ warnMock["cronjobs"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.ClusterPermissions[0].Rules[7]"}
+ warnMock["endpointslices"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[3]"}
+ warnMock["events"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[2]"}
+ warnMock["horizontalpodautoscalers"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[4]"}
+ warnMock["poddisruptionbudgets"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[5]"}
+ warnMock["podsecuritypolicies"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[5]"}
+ warnMock["runtimeclasses"] = []string{"ClusterServiceVersion.Spec.InstallStrategy.StrategySpec.Permissions[0].Rules[6]"}
+
type args struct {
bundleDir string
}
tests := []struct {
- name string
- args args
- want map[string][]string
+ name string
+ args args
+ errWant map[string][]string
+ warnWant map[string][]string
}{
{
name: "should return an empty map when no deprecated apis are found",
args: args{
bundleDir: "./testdata/valid_bundle_v1",
},
- want: map[string][]string{},
+ errWant: map[string][]string{},
+ warnWant: map[string][]string{},
},
{
name: "should fail return the removed APIs in 1.25",
args: args{
bundleDir: "./testdata/removed_api_1_25",
},
- want: mock,
+ errWant: mock,
+ warnWant: map[string][]string{},
+ },
+ {
+ name: "should return warnings with all deprecated APIs in 1.25",
+ args: args{
+ bundleDir: "./testdata/deprecated_api_1_25",
+ },
+ errWant: mock,
+ warnWant: warnMock,
},
}
for _, tt := range tests {
@@ -102,8 +122,14 @@ func Test_GetRemovedAPIsOn1_25From(t *testing.T) {
bundle, err := manifests.GetBundleFromDir(tt.args.bundleDir)
require.NoError(t, err)
- if got := getRemovedAPIsOn1_25From(bundle); !reflect.DeepEqual(got, tt.want) {
- t.Errorf("getRemovedAPIsOn1_25From() = %v, want %v", got, tt.want)
+ errGot, warnGot := getRemovedAPIsOn1_25From(bundle)
+
+ if !reflect.DeepEqual(errGot, tt.errWant) {
+ t.Errorf("getRemovedAPIsOn1_25From() = %v, want %v", errGot, tt.errWant)
+ }
+
+ if !reflect.DeepEqual(warnGot, tt.warnWant) {
+ t.Errorf("getRemovedAPIsOn1_25From() = %v, want %v", warnGot, tt.warnWant)
}
})
}
@@ -252,8 +278,8 @@ func TestValidateDeprecatedAPIS(t *testing.T) {
wantWarning: true,
warnStrings: []string{"this bundle is using APIs which were deprecated and removed in v1.22. " +
"More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. " +
- "Migrate the API(s) for CRD: ([\"etcdbackups.etcd.database.coreos.com\"" +
- " \"etcdclusters.etcd.database.coreos.com\" \"etcdrestores.etcd.database.coreos.com\"])"},
+ "Migrate the API(s) for CRD: ([\"etcdbackups.etcd.database.coreos.com\" " +
+ "\"etcdclusters.etcd.database.coreos.com\" \"etcdrestores.etcd.database.coreos.com\"])"},
},
{
name: "should return an error when the csv.spec.minKubeVersion informed is invalid",
diff --git a/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/cache.example.com_memcacheds.yaml b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/cache.example.com_memcacheds.yaml
new file mode 100644
index 0000000000..a8ea3eb8d3
--- /dev/null
+++ b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/cache.example.com_memcacheds.yaml
@@ -0,0 +1,66 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ annotations:
+ controller-gen.kubebuilder.io/version: v0.4.1
+ creationTimestamp: null
+ name: memcacheds.cache.example.com
+spec:
+ group: cache.example.com
+ names:
+ kind: Memcached
+ listKind: MemcachedList
+ plural: memcacheds
+ singular: memcached
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ schema:
+ openAPIV3Schema:
+ description: Memcached is the Schema for the memcacheds API
+ properties:
+ apiVersion:
+ description: 'APIVersion defines the versioned schema of this representation
+ of an object. Servers should convert recognized schemas to the latest
+ internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
+ type: string
+ kind:
+ description: 'Kind is a string value representing the REST resource this
+ object represents. Servers may infer this from the endpoint the client
+ submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
+ type: string
+ metadata:
+ type: object
+ spec:
+ description: MemcachedSpec defines the desired state of Memcached
+ properties:
+ foo:
+ description: Foo is an example field of Memcached. Edit memcached_types.go
+ to remove/update
+ type: string
+ size:
+ description: Size defines the number of Memcached instances
+ format: int32
+ type: integer
+ type: object
+ status:
+ description: MemcachedStatus defines the observed state of Memcached
+ properties:
+ nodes:
+ description: Nodes store the name of the pods which are running Memcached
+ instances
+ items:
+ type: string
+ type: array
+ type: object
+ type: object
+ served: true
+ storage: true
+ subresources:
+ status: {}
+status:
+ acceptedNames:
+ kind: ""
+ plural: ""
+ conditions: []
+ storedVersions: []
diff --git a/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/horizontal-pod.yaml b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/horizontal-pod.yaml
new file mode 100644
index 0000000000..69f77b5f49
--- /dev/null
+++ b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/horizontal-pod.yaml
@@ -0,0 +1,18 @@
+apiVersion: autoscaling/v2beta1
+kind: HorizontalPodAutoscaler
+metadata:
+ name: memcached-operator-hpa
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: memcached-operator-controller-manager
+ minReplicas: 1
+ maxReplicas: 10
+ metrics:
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: 50
\ No newline at end of file
diff --git a/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/memcached-operator.clusterserviceversion.yaml b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/memcached-operator.clusterserviceversion.yaml
new file mode 100644
index 0000000000..a28ca3a117
--- /dev/null
+++ b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/memcached-operator.clusterserviceversion.yaml
@@ -0,0 +1,287 @@
+apiVersion: operators.coreos.com/v1alpha1
+kind: ClusterServiceVersion
+metadata:
+ annotations:
+ alm-examples: |-
+ [
+ {
+ "apiVersion": "cache.example.com/v1alpha1",
+ "kind": "Memcached",
+ "metadata": {
+ "name": "memcached-sample"
+ },
+ "spec": {
+ "size": 1
+ }
+ }
+ ]
+ capabilities: Basic Install
+ name: memcached-operator.v0.0.1
+ namespace: placeholder
+spec:
+ apiservicedefinitions: {}
+ customresourcedefinitions:
+ owned:
+ - description: Memcached is the Schema for the memcacheds API
+ displayName: Memcached
+ kind: Memcached
+ name: memcacheds.cache.example.com
+ version: v1alpha1
+ description: Memcached Operator description. TODO.
+ displayName: Memcached Operator
+ icon:
+ - base64data: ""
+ mediatype: ""
+ install:
+ spec:
+ clusterPermissions:
+ - rules:
+ - apiGroups:
+ - apps
+ resources:
+ - deployments
+ verbs:
+ - create
+ - delete
+ - get
+ - list
+ - patch
+ - update
+ - watch
+ - apiGroups:
+ - cache.example.com
+ resources:
+ - memcacheds
+ verbs:
+ - create
+ - delete
+ - get
+ - list
+ - patch
+ - update
+ - watch
+ - apiGroups:
+ - cache.example.com
+ resources:
+ - memcacheds/finalizers
+ verbs:
+ - update
+ - apiGroups:
+ - cache.example.com
+ resources:
+ - memcacheds/status
+ verbs:
+ - get
+ - patch
+ - update
+ - apiGroups:
+ - ""
+ resources:
+ - pods
+ verbs:
+ - get
+ - list
+ - watch
+ - apiGroups:
+ - authentication.k8s.io
+ resources:
+ - tokenreviews
+ verbs:
+ - create
+ - apiGroups:
+ - authorization.k8s.io
+ resources:
+ - subjectaccessreviews
+ verbs:
+ - create
+ - apiGroups:
+ - batch
+ resources:
+ - cronjobs
+ verbs:
+ - get
+ serviceAccountName: memcached-operator-controller-manager
+ deployments:
+ - name: memcached-operator-controller-manager
+ spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ control-plane: controller-manager
+ strategy: {}
+ template:
+ metadata:
+ labels:
+ control-plane: controller-manager
+ spec:
+ containers:
+ - args:
+ - --secure-listen-address=0.0.0.0:8443
+ - --upstream=http://127.0.0.1:8080/
+ - --logtostderr=true
+ - --v=10
+ image: gcr.io/kubebuilder/kube-rbac-proxy:v0.8.0
+ name: kube-rbac-proxy
+ ports:
+ - containerPort: 8443
+ name: https
+ resources: {}
+ - args:
+ - --health-probe-bind-address=:8081
+ - --metrics-bind-address=127.0.0.1:8080
+ - --leader-elect
+ command:
+ - /manager
+ image: quay.io/example/memcached-operator:v0.0.1
+ livenessProbe:
+ httpGet:
+ path: /healthz
+ port: 8081
+ initialDelaySeconds: 15
+ periodSeconds: 20
+ name: manager
+ ports:
+ - containerPort: 9443
+ name: webhook-server
+ protocol: TCP
+ readinessProbe:
+ httpGet:
+ path: /readyz
+ port: 8081
+ initialDelaySeconds: 5
+ periodSeconds: 10
+ securityContext:
+ allowPrivilegeEscalation: false
+ securityContext:
+ runAsNonRoot: true
+ serviceAccountName: memcached-operator-controller-manager
+ terminationGracePeriodSeconds: 10
+ permissions:
+ - rules:
+ - apiGroups:
+ - ""
+ resources:
+ - configmaps
+ verbs:
+ - get
+ - list
+ - watch
+ - create
+ - update
+ - patch
+ - delete
+ - apiGroups:
+ - coordination.k8s.io
+ resources:
+ - leases
+ verbs:
+ - get
+ - list
+ - watch
+ - create
+ - update
+ - patch
+ - delete
+ - apiGroups:
+ - events.k8s.io
+ resources:
+ - events
+ verbs:
+ - create
+ - patch
+ - apiGroups:
+ - discovery.k8s.io
+ resources:
+ - endpointslices
+ verbs:
+ - create
+ - patch
+ - apiGroups:
+ - autoscaling
+ resources:
+ - horizontalpodautoscalers
+ verbs:
+ - create
+ - patch
+ - apiGroups:
+ - policy
+ resources:
+ - poddisruptionbudgets
+ - podsecuritypolicies
+ verbs:
+ - create
+ - patch
+ - apiGroups:
+ - node.k8s.io
+ resources:
+ - runtimeclasses
+ verbs:
+ - create
+ - patch
+ serviceAccountName: memcached-operator-controller-manager
+ strategy: deployment
+ installModes:
+ - supported: false
+ type: OwnNamespace
+ - supported: false
+ type: SingleNamespace
+ - supported: false
+ type: MultiNamespace
+ - supported: true
+ type: AllNamespaces
+ keywords:
+ - memcached-operator
+ links:
+ - name: Memcached Operator
+ url: https://memcached-operator.domain
+ maintainers:
+ - email: your@email.com
+ name: Maintainer Name
+ maturity: alpha
+ provider:
+ name: Provider Name
+ url: https://your.domain
+ version: 0.0.1
+ webhookdefinitions:
+ - admissionReviewVersions:
+ - v1
+ - v1beta1
+ containerPort: 443
+ deploymentName: memcached-operator-controller-manager
+ failurePolicy: Fail
+ generateName: vmemcached.kb.io
+ rules:
+ - apiGroups:
+ - cache.example.com
+ apiVersions:
+ - v1alpha1
+ operations:
+ - CREATE
+ - UPDATE
+ resources:
+ - memcacheds
+ sideEffects: None
+ targetPort: 9443
+ type: ValidatingAdmissionWebhook
+ webhookPath: /validate-cache-example-com-v1alpha1-memcached
+ - admissionReviewVersions:
+ - v1
+ - v1beta1
+ containerPort: 443
+ deploymentName: memcached-operator-controller-manager
+ failurePolicy: Fail
+ generateName: mmemcached.kb.io
+ rules:
+ - apiGroups:
+ - cache.example.com
+ apiVersions:
+ - v1alpha1
+ operations:
+ - CREATE
+ - UPDATE
+ resources:
+ - memcacheds
+ sideEffects: None
+ targetPort: 9443
+ type: MutatingAdmissionWebhook
+ webhookPath: /mutate-cache-example-com-v1alpha1-memcached
diff --git a/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/policy.yaml b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/policy.yaml
new file mode 100644
index 0000000000..15714a60c3
--- /dev/null
+++ b/staging/api/pkg/validation/internal/testdata/deprecated_api_1_25/policy.yaml
@@ -0,0 +1,9 @@
+apiVersion: policy/v1beta1
+kind: PodDisruptionBudget
+metadata:
+ name: memcached-operator-policy-manager
+spec:
+ minAvailable: 2
+ selector:
+ matchLabels:
+ app: memcached-operator
\ No newline at end of file
diff --git a/staging/api/pkg/validation/internal/testdata/valid_bundle/etcdoperator.v0.9.4.clusterserviceversion.yaml b/staging/api/pkg/validation/internal/testdata/valid_bundle/etcdoperator.v0.9.4.clusterserviceversion.yaml
index f5ff405ebf..29d1f682ac 100644
--- a/staging/api/pkg/validation/internal/testdata/valid_bundle/etcdoperator.v0.9.4.clusterserviceversion.yaml
+++ b/staging/api/pkg/validation/internal/testdata/valid_bundle/etcdoperator.v0.9.4.clusterserviceversion.yaml
@@ -192,6 +192,22 @@ spec:
name: etcd-operator-alm-owned
name: etcd-operator-alm-owned
spec:
+ affinity:
+ nodeAffinity:
+ requiredDuringSchedulingIgnoredDuringExecution:
+ nodeSelectorTerms:
+ - matchExpressions:
+ - key: kubernetes.io/arch
+ operator: In
+ values:
+ - amd64
+ - arm64
+ - ppc64le
+ - s390x
+ - key: kubernetes.io/os
+ operator: In
+ values:
+ - linux
containers:
- command:
- etcd-operator
@@ -205,8 +221,8 @@ spec:
valueFrom:
fieldRef:
fieldPath: metadata.name
- image: quay.io/coreos/etcd-operator@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
- name: etcd-operator
+ image: quay.io/coreos/etcd-operator2@sha256:66a37fd61a06a43969854ee6d3e21087a98b93838e284a6086b13917f96b0d9b
+ name: manager
resources:
limits:
cpu: 500m
diff --git a/staging/api/pkg/validation/internal/testdata/valid_bundle_v1/memcached-operator.clusterserviceversion.yaml b/staging/api/pkg/validation/internal/testdata/valid_bundle_v1/memcached-operator.clusterserviceversion.yaml
index bddc807691..66794210ec 100644
--- a/staging/api/pkg/validation/internal/testdata/valid_bundle_v1/memcached-operator.clusterserviceversion.yaml
+++ b/staging/api/pkg/validation/internal/testdata/valid_bundle_v1/memcached-operator.clusterserviceversion.yaml
@@ -176,13 +176,6 @@ spec:
- update
- patch
- delete
- - apiGroups:
- - ""
- resources:
- - events
- verbs:
- - create
- - patch
serviceAccountName: memcached-operator-controller-manager
strategy: deployment
installModes:
diff --git a/staging/operator-lifecycle-manager/.github/workflows/build.yml b/staging/operator-lifecycle-manager/.github/workflows/build.yml
index 738064565b..b48d9e8939 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/build.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/build.yml
@@ -7,9 +7,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out the repo
- uses: actions/checkout@v1
+ uses: actions/checkout@v3
- name: Build the container image
- uses: docker/build-push-action@v2
+ uses: docker/build-push-action@v4
with:
context: .
file: Dockerfile
diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
index 55eea714ca..4d2c44370e 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml
@@ -15,15 +15,15 @@ jobs:
parallel-id: [0, 1, 2, 3]
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- run: mkdir -p artifacts
- run: make e2e-local E2E_TEST_CHUNK=${{ matrix.parallel-id }} E2E_TEST_NUM_CHUNKS=${{ strategy.job-total }} E2E_NODES=2 ARTIFACT_DIR=./artifacts/ SKIP='\[FLAKE\]'
- name: Archive Test Artifacts # test results, failed or not, are always uploaded.
if: ${{ always() }}
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
name: e2e-test-output-${{ (github.event.pull_request.head.sha || github.sha) }}-${{ github.run_id }}-${{ matrix.parallel-id }}
path: ${{ github.workspace }}/bin/artifacts/*
diff --git a/staging/operator-lifecycle-manager/.github/workflows/flaky-e2e.yml b/staging/operator-lifecycle-manager/.github/workflows/flaky-e2e.yml
index 2260a65346..1686f67c9c 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/flaky-e2e.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/flaky-e2e.yml
@@ -11,15 +11,15 @@ jobs:
flaky-e2e-tests:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- run: mkdir -p artifacts
- run: make e2e-local E2E_NODES=1 TEST='\[FLAKE\]' ARTIFACT_DIR=./artifacts/
- name: Archive Test Artifacts # test results, failed or not, are always uploaded.
if: ${{ always() }}
- uses: actions/upload-artifact@v2
+ uses: actions/upload-artifact@v3
with:
name: e2e-test-output-${{(github.event.pull_request.head.sha||github.sha)}}-${{ github.run_id }}
path: ${{ github.workspace }}/bin/artifacts/*
diff --git a/staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml b/staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
index c66e177213..8e39d47f80 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
+++ b/staging/operator-lifecycle-manager/.github/workflows/goreleaser.yaml
@@ -10,11 +10,11 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
- uses: actions/checkout@v1
+ uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Go
- uses: actions/setup-go@v3
+ uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
@@ -25,7 +25,10 @@ jobs:
if [[ $GITHUB_REF == refs/tags/* ]]; then
echo IMAGE_TAG="${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
fi
-
+
+ # TODO dtfranz
+ # This action uses node12 and the source repo is archived;
+ # we should remove it or find a suitable replacement before it becomes a blocker.
- name: Create a draft release
uses: actions/create-release@v1
id: release
@@ -37,8 +40,12 @@ jobs:
tag_name: ${{ github.ref }}
release_name: ${{ github.ref }}
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v2
+ if: startsWith(github.ref, 'refs/tags')
+
- name: Docker Login
- uses: docker/login-action@v1
+ uses: docker/login-action@v2
if: startsWith(github.ref, 'refs/tags')
with:
registry: quay.io
@@ -46,7 +53,7 @@ jobs:
password: ${{ secrets.QUAY_PASSWORD }}
- name: Run GoReleaser
- uses: goreleaser/goreleaser-action@v2
+ uses: goreleaser/goreleaser-action@v4
if: startsWith(github.ref, 'refs/tags')
with:
version: 0.177.0
diff --git a/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml b/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
index 9df3656a97..5a3334e9bf 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml
@@ -8,7 +8,7 @@ jobs:
install-quickstart:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
+ - uses: actions/checkout@v3
- run: |
curl -sLo kind "$(curl -sL https://api.github.com/repos/kubernetes-sigs/kind/releases/latest | jq -r '[.assets[] | select(.name == "kind-linux-amd64")] | first | .browser_download_url')"
chmod +x kind
diff --git a/staging/operator-lifecycle-manager/.github/workflows/run-kind-local.yml b/staging/operator-lifecycle-manager/.github/workflows/run-kind-local.yml
index 1b8455aa0f..d95962db58 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/run-kind-local.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/run-kind-local.yml
@@ -8,8 +8,8 @@ jobs:
e2e-kind:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- name: Install kind
diff --git a/staging/operator-lifecycle-manager/.github/workflows/run-minikube-local.yml b/staging/operator-lifecycle-manager/.github/workflows/run-minikube-local.yml
index 8da949402d..04aa0a4533 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/run-minikube-local.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/run-minikube-local.yml
@@ -8,8 +8,8 @@ jobs:
e2e-minikube:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- name: Install minikube
diff --git a/staging/operator-lifecycle-manager/.github/workflows/sanity.yaml b/staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
index 695c48f889..2c0a365c49 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
+++ b/staging/operator-lifecycle-manager/.github/workflows/sanity.yaml
@@ -9,8 +9,8 @@ jobs:
vendor:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- name: Run sanity checks
@@ -18,8 +18,11 @@ jobs:
lint:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
+ with:
+ go-version-file: "go.mod"
- name: Run linting checks
- uses: "golangci/golangci-lint-action@v2"
+ uses: "golangci/golangci-lint-action@v3"
with:
- version: "v1.46.0"
+ version: "v1.50.1"
diff --git a/staging/operator-lifecycle-manager/.github/workflows/unit.yml b/staging/operator-lifecycle-manager/.github/workflows/unit.yml
index d60d56ae1a..90ac078a90 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/unit.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/unit.yml
@@ -11,8 +11,8 @@ jobs:
unit:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
- name: Envtest setup
diff --git a/staging/operator-lifecycle-manager/.github/workflows/verify.yml b/staging/operator-lifecycle-manager/.github/workflows/verify.yml
index a4ffba7bf0..734ba2f4c7 100644
--- a/staging/operator-lifecycle-manager/.github/workflows/verify.yml
+++ b/staging/operator-lifecycle-manager/.github/workflows/verify.yml
@@ -9,8 +9,8 @@ jobs:
verify:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v1
- - uses: actions/setup-go@v3
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
go-version-file: "go.mod"
@@ -18,6 +18,4 @@ jobs:
# codegen script still relies on $GOPATH being set and will return an error otherwise.
# The setup-go action does not set this value for us: https://github.com/actions/setup-go/issues/14.
- name: Run the verify target
- run: |
- export GOPATH=$(go env GOPATH)
- make verify
+ run: GOPATH=$(go env GOPATH) make verify
diff --git a/staging/operator-lifecycle-manager/Dockerfile b/staging/operator-lifecycle-manager/Dockerfile
index 075a5dbd4e..72df7fa0fe 100644
--- a/staging/operator-lifecycle-manager/Dockerfile
+++ b/staging/operator-lifecycle-manager/Dockerfile
@@ -1,4 +1,4 @@
-FROM quay.io/fedora/fedora:34-x86_64 as builder
+FROM quay.io/fedora/fedora:37-x86_64 as builder
LABEL stage=builder
WORKDIR /build
diff --git a/staging/operator-lifecycle-manager/Dockerfile.goreleaser b/staging/operator-lifecycle-manager/Dockerfile.goreleaser
index a117f6623e..5308799547 100644
--- a/staging/operator-lifecycle-manager/Dockerfile.goreleaser
+++ b/staging/operator-lifecycle-manager/Dockerfile.goreleaser
@@ -1,4 +1,4 @@
-FROM --platform=$BUILDPLATFORM gcr.io/distroless/static:debug
+FROM gcr.io/distroless/static:debug
LABEL stage=olm
WORKDIR /
# bundle unpack Jobs require cp at /bin/cp
diff --git a/staging/operator-lifecycle-manager/Makefile b/staging/operator-lifecycle-manager/Makefile
index f892f12e95..ae104d6de2 100644
--- a/staging/operator-lifecycle-manager/Makefile
+++ b/staging/operator-lifecycle-manager/Makefile
@@ -29,7 +29,11 @@ GO := GO111MODULE=on GOFLAGS="$(MOD_FLAGS)" go
GINKGO := $(GO) run github.com/onsi/ginkgo/v2/ginkgo
BINDATA := $(GO) run github.com/go-bindata/go-bindata/v3/go-bindata
GIT_COMMIT := $(shell git rev-parse HEAD)
-
+ifeq ($(shell arch), arm64)
+ARCH := arm64
+else
+ARCH := 386
+endif
# Phony prerequisite for targets that rely on the go build cache to determine staleness.
.PHONY: build test clean vendor \
coverage coverage-html e2e \
@@ -82,15 +86,15 @@ build-coverage: build_cmd=test -c -covermode=count -coverpkg ./pkg/controller/..
build-coverage: clean $(CMDS)
build-linux: build_cmd=build
-build-linux: arch_flags=GOOS=linux GOARCH=386
+build-linux: arch_flags=GOOS=linux GOARCH=$(ARCH)
build-linux: clean $(CMDS)
build-wait: clean bin/wait
bin/wait: FORCE
- GOOS=linux GOARCH=386 go build $(MOD_FLAGS) -o $@ $(PKG)/test/e2e/wait
+ GOOS=linux GOARCH=$(ARCH) go build $(MOD_FLAGS) -o $@ $(PKG)/test/e2e/wait
-build-util-linux: arch_flags=GOOS=linux GOARCH=386
+build-util-linux: arch_flags=GOOS=linux GOARCH=$(ARCH)
build-util-linux: build-util
build-util: bin/cpb
diff --git a/staging/operator-lifecycle-manager/OWNERS b/staging/operator-lifecycle-manager/OWNERS
index b50656f1c4..1b8bbde740 100644
--- a/staging/operator-lifecycle-manager/OWNERS
+++ b/staging/operator-lifecycle-manager/OWNERS
@@ -7,8 +7,8 @@ approvers:
- benluddy
- awgreene
- dinhxuanvu
- - timflannagan
- perdasilva
+ - grokspawn
# review == this code is good /lgtm
reviewers:
- ecordell
@@ -22,7 +22,9 @@ reviewers:
- awgreene
- ankitathomas
- joelanford
- - timflannagan
- perdasilva
-# Bugzilla component
-component: "OLM"
+ - akihikokuroda
+ - oceanc80
+ - grokspawn
+ - dtfranz
+ - asmacdo
diff --git a/staging/operator-lifecycle-manager/cmd/catalog/main.go b/staging/operator-lifecycle-manager/cmd/catalog/main.go
index 20134d71d2..d282dfebb3 100644
--- a/staging/operator-lifecycle-manager/cmd/catalog/main.go
+++ b/staging/operator-lifecycle-manager/cmd/catalog/main.go
@@ -27,7 +27,7 @@ const (
defaultWakeupInterval = 15 * time.Minute
defaultCatalogNamespace = "olm"
defaultConfigMapServerImage = "quay.io/operator-framework/configmap-operator-registry:latest"
- defaultOPMImage = "quay.io/operator-framework/upstream-opm-builder:latest"
+ defaultOPMImage = "quay.io/operator-framework/opm:latest"
defaultUtilImage = "quay.io/operator-framework/olm:latest"
defaultOperatorName = ""
defaultWorkLoadUserID = int64(1001)
diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml
index 169e1e8149..321b99467b 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml
@@ -71,6 +71,467 @@ spec:
description: GrpcPodConfig exposes different overrides for the pod spec of the CatalogSource Pod. Only used when SourceType = SourceTypeGrpc and Image is set.
type: object
properties:
+ affinity:
+ description: Affinity is the catalog source's pod's affinity.
+ type: object
+ properties:
+ nodeAffinity:
+ description: Describes node affinity scheduling rules for the pod.
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op).
+ type: object
+ required:
+ - preference
+ - weight
+ properties:
+ preference:
+ description: A node selector term, associated with the corresponding weight.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ weight:
+ description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node.
+ type: object
+ required:
+ - nodeSelectorTerms
+ properties:
+ nodeSelectorTerms:
+ description: Required. A list of node selector terms. The terms are ORed.
+ type: array
+ items:
+ description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm.
+ type: object
+ properties:
+ matchExpressions:
+ description: A list of node selector requirements by node's labels.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchFields:
+ description: A list of node selector requirements by node's fields.
+ type: array
+ items:
+ description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: The label key that the selector applies to.
+ type: string
+ operator:
+ description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt.
+ type: string
+ values:
+ description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ podAffinity:
+ description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ podAntiAffinity:
+ description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)).
+ type: object
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.
+ type: array
+ items:
+ description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)
+ type: object
+ required:
+ - podAffinityTerm
+ - weight
+ properties:
+ podAffinityTerm:
+ description: Required. A pod affinity term, associated with the corresponding weight.
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
+ weight:
+ description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100.
+ type: integer
+ format: int32
+ requiredDuringSchedulingIgnoredDuringExecution:
+ description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied.
+ type: array
+ items:
+ description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running
+ type: object
+ required:
+ - topologyKey
+ properties:
+ labelSelector:
+ description: A label query over a set of resources, in this case pods.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaceSelector:
+ description: A label query over the set of namespaces that the term applies to. The term is applied to the union of the namespaces selected by this field and the ones listed in the namespaces field. null selector and null or empty namespaces list means "this pod's namespace". An empty selector ({}) matches all namespaces.
+ type: object
+ properties:
+ matchExpressions:
+ description: matchExpressions is a list of label selector requirements. The requirements are ANDed.
+ type: array
+ items:
+ description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values.
+ type: object
+ required:
+ - key
+ - operator
+ properties:
+ key:
+ description: key is the label key that the selector applies to.
+ type: string
+ operator:
+ description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist.
+ type: string
+ values:
+ description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch.
+ type: array
+ items:
+ type: string
+ matchLabels:
+ description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed.
+ type: object
+ additionalProperties:
+ type: string
+ namespaces:
+ description: namespaces specifies a static list of namespace names that the term applies to. The term is applied to the union of the namespaces listed in this field and the ones selected by namespaceSelector. null or empty namespaces list and null namespaceSelector means "this pod's namespace".
+ type: array
+ items:
+ type: string
+ topologyKey:
+ description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed.
+ type: string
nodeSelector:
description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node.
type: object
diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml
index 7eb672aa5f..77422915c5 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml
@@ -119,7 +119,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -127,10 +127,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -229,7 +232,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -237,10 +240,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -343,7 +349,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -351,10 +357,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -445,7 +454,7 @@ spec:
resources:
type: array
items:
- description: APIResourceReference is a Kubernetes resource type used by a custom resource
+ description: APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.
type: object
required:
- kind
@@ -453,10 +462,13 @@ spec:
- version
properties:
kind:
+ description: Kind of the referenced resource type.
type: string
name:
+ description: Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.
type: string
version:
+ description: API Version of the referenced resource type.
type: string
specDescriptors:
type: array
@@ -505,10 +517,13 @@ spec:
version:
type: string
description:
+ description: Description of the operator. Can include the features, limitations or use-cases of the operator.
type: string
displayName:
+ description: The name of the operator in display format.
type: string
icon:
+ description: The icon for this operator.
type: array
items:
type: object
@@ -1664,6 +1679,21 @@ spec:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -2476,6 +2506,21 @@ spec:
description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod.
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -3299,6 +3344,21 @@ spec:
description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -3617,6 +3677,31 @@ spec:
conditionType:
description: ConditionType refers to a condition in the pod's condition list with matching type.
type: string
+ resourceClaims:
+ description: "ResourceClaims defines which ResourceClaims must be allocated and reserved before the Pod is allowed to start. The resources will be made available to those containers which consume them by name. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: PodResourceClaim references exactly one ResourceClaim through a ClaimSource. It adds a name to it that uniquely identifies the ResourceClaim inside the Pod. Containers that need access to the ResourceClaim reference it with this name.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name uniquely identifies this resource claim inside the pod. This must be a DNS_LABEL.
+ type: string
+ source:
+ description: Source describes where to find the ResourceClaim.
+ type: object
+ properties:
+ resourceClaimName:
+ description: ResourceClaimName is the name of a ResourceClaim object in the same namespace as this pod.
+ type: string
+ resourceClaimTemplateName:
+ description: "ResourceClaimTemplateName is the name of a ResourceClaimTemplate object in the same namespace as this pod. \n The template will be used to create a new ResourceClaim, which will be bound to this pod. When this pod is deleted, the ResourceClaim will also be deleted. The name of the ResourceClaim will be -, where is the PodResourceClaim.Name. Pod validation will reject the pod if the concatenated name is not valid for a ResourceClaim (e.g. too long). \n An existing ResourceClaim with that name that is not owned by the pod will not be used for the pod to avoid using an unrelated resource by mistake. Scheduling and pod startup are then blocked until the unrelated ResourceClaim is removed. \n This field is immutable and no changes will be made to the corresponding ResourceClaim by the control plane after creating the ResourceClaim."
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
restartPolicy:
description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy'
type: string
@@ -3626,6 +3711,21 @@ spec:
schedulerName:
description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler.
type: string
+ schedulingGates:
+ description: "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. More info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness. \n This is an alpha-level feature enabled by PodSchedulingReadiness feature gate."
+ type: array
+ items:
+ description: PodSchedulingGate is associated to a Pod to guard its scheduling.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name of the scheduling gate. Each scheduling gate must have a unique name field.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
securityContext:
description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.'
type: object
@@ -3677,7 +3777,7 @@ spec:
description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied."
type: string
supplementalGroups:
- description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. Note that this field cannot be set when spec.os.name is windows.
+ description: A list of groups applied to the first process run in each container, in addition to the container's primary GID, the fsGroup (if specified), and group memberships defined in the container image for the uid of the container process. If unspecified, no additional groups are added to any container. Note that group memberships defined in the container image for the uid of the container process are still effective, even if they are not included in this list. Note that this field cannot be set when spec.os.name is windows.
type: array
items:
type: integer
@@ -3812,10 +3912,10 @@ spec:
type: integer
format: int32
nodeAffinityPolicy:
- description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. \n If this value is nil, the behavior is equivalent to the Honor policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ description: "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations. \n If this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
type: string
nodeTaintsPolicy:
- description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. \n If this value is nil, the behavior is equivalent to the Ignore policy. This is a alpha-level feature enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
+ description: "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included. \n If this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag."
type: string
topologyKey:
description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. We define a domain as a particular instance of a topology. Also, we define an eligible domain as a domain whose nodes meet the requirements of nodeAffinityPolicy and nodeTaintsPolicy. e.g. If TopologyKey is "kubernetes.io/hostname", each Node is a domain of that topology. And, if TopologyKey is "topology.kubernetes.io/zone", each zone is a domain of that topology. It's a required field.
@@ -4101,7 +4201,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -4117,7 +4217,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -4132,10 +4232,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -4805,6 +4923,7 @@ spec:
description: InstallModeType is a supported type of install mode for CSV installation
type: string
keywords:
+ description: A list of keywords describing the operator.
type: array
items:
type: string
@@ -4814,6 +4933,7 @@ spec:
additionalProperties:
type: string
links:
+ description: A list of links related to the operator.
type: array
items:
type: object
@@ -4823,6 +4943,7 @@ spec:
url:
type: string
maintainers:
+ description: A list of organizational entities maintaining the operator.
type: array
items:
type: object
@@ -4852,6 +4973,7 @@ spec:
version:
type: string
provider:
+ description: The publishing entity behind the operator.
type: object
properties:
name:
@@ -4990,22 +5112,26 @@ spec:
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
apiVersions:
description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required.
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
operations:
description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required.
type: array
items:
description: OperationType specifies an operation for a request.
type: string
+ x-kubernetes-list-type: atomic
resources:
description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required."
type: array
items:
type: string
+ x-kubernetes-list-type: atomic
scope:
description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*".
type: string
diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml
index 0ebb188ac0..02411590d9 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml
@@ -643,6 +643,21 @@ spec:
description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
@@ -1016,7 +1031,7 @@ spec:
items:
type: string
dataSource:
- description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. If the AnyVolumeDataSource feature gate is enabled, this field will always have the same contents as the DataSourceRef field.'
+ description: 'dataSource field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source. When the AnyVolumeDataSource feature gate is enabled, dataSource contents will be copied to dataSourceRef, and dataSourceRef contents will be copied to dataSource when dataSourceRef.namespace is not specified. If the namespace is specified, then dataSourceRef will not be copied to dataSource.'
type: object
required:
- kind
@@ -1032,7 +1047,7 @@ spec:
description: Name is the name of resource being referenced
type: string
dataSourceRef:
- description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any local object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the DataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, both fields (DataSource and DataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. There are two important differences between DataSource and DataSourceRef: * While DataSource only allows two specific types of objects, DataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While DataSource ignores disallowed values (dropping them), DataSourceRef preserves all values, and generates an error if a disallowed value is specified. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled.'
+ description: 'dataSourceRef specifies the object from which to populate the volume with data, if a non-empty volume is desired. This may be any object from a non-empty API group (non core object) or a PersistentVolumeClaim object. When this field is specified, volume binding will only succeed if the type of the specified object matches some installed volume populator or dynamic provisioner. This field will replace the functionality of the dataSource field and as such if both fields are non-empty, they must have the same value. For backwards compatibility, when namespace isn''t specified in dataSourceRef, both fields (dataSource and dataSourceRef) will be set to the same value automatically if one of them is empty and the other is non-empty. When namespace is specified in dataSourceRef, dataSource isn''t set to the same value and must be empty. There are three important differences between dataSource and dataSourceRef: * While dataSource only allows two specific types of objects, dataSourceRef allows any non-core object, as well as PersistentVolumeClaim objects. * While dataSource ignores disallowed values (dropping them), dataSourceRef preserves all values, and generates an error if a disallowed value is specified. * While dataSource only allows local objects, dataSourceRef allows objects in any namespaces. (Beta) Using this field requires the AnyVolumeDataSource feature gate to be enabled. (Alpha) Using the namespace field of dataSourceRef requires the CrossNamespaceVolumeDataSource feature gate to be enabled.'
type: object
required:
- kind
@@ -1047,10 +1062,28 @@ spec:
name:
description: Name is the name of resource being referenced
type: string
+ namespace:
+ description: Namespace is the namespace of resource being referenced Note that when a namespace is specified, a gateway.networking.k8s.io/ReferenceGrant object is required in the referent namespace to allow that namespace's owner to accept the reference. See the ReferenceGrant documentation for details. (Alpha) This field requires the CrossNamespaceVolumeDataSource feature gate to be enabled.
+ type: string
resources:
description: 'resources represents the minimum resources the volume should have. If RecoverVolumeExpansionFailure feature is enabled users are allowed to specify resource requirements that are lower than previous value but must still be higher than capacity recorded in the status field of the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources'
type: object
properties:
+ claims:
+ description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable."
+ type: array
+ items:
+ description: ResourceClaim references one entry in PodSpec.ResourceClaims.
+ type: object
+ required:
+ - name
+ properties:
+ name:
+ description: Name must match the name of one entry in pod.spec.resourceClaims of the Pod where this field is used. It makes that resource available inside a container.
+ type: string
+ x-kubernetes-list-map-keys:
+ - name
+ x-kubernetes-list-type: map
limits:
description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/'
type: object
diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_17-upstream-operators.catalogsource.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_17-upstream-operators.catalogsource.yaml
index 534a21c2c8..3a072034f0 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_17-upstream-operators.catalogsource.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_50_olm_17-upstream-operators.catalogsource.yaml
@@ -9,6 +9,8 @@ spec:
image: quay.io/operatorhubio/catalog:latest
displayName: Community Operators
publisher: OperatorHub.io
+ grpcPodConfig:
+ securityContextConfig: restricted
updateStrategy:
registryPoll:
interval: 60m
diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml
index 5497a8c1aa..6585bd609e 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_00-service-monitor.yaml
@@ -36,7 +36,6 @@ metadata:
labels:
app: catalog-operator
spec:
- jobLabel: k8s-app
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 30s
diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_01-prometheus-rule.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_01-prometheus-rule.yaml
index 42905bed82..c9039ae552 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_01-prometheus-rule.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/templates/0000_90_olm_01-prometheus-rule.yaml
@@ -29,7 +29,7 @@ spec:
namespace: "{{ "{{ $labels.namespace }}" }}"
annotations:
summary: CSV abnormal for over 30 minutes
- description: Fires whenever a CSV is in the Replacing, Pending, Deleting, or Unkown phase for more than 30 minutes.
+ description: Fires whenever a CSV is in the Replacing, Pending, Deleting, or Unknown phase for more than 30 minutes.
message: Failed to install Operator {{ printf "{{ $labels.name }}" }} version {{ printf "{{ $labels.version }}" }}. Phase-{{ printf "{{ $labels.phase }}" }} Reason-{{ printf "{{ $labels.reason }}" }}
- name: olm.installplan.rules
rules:
diff --git a/staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.deployment-spec.yaml b/staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.deployment-spec.yaml
index 75cdc5b508..43e9d33b0a 100644
--- a/staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.deployment-spec.yaml
+++ b/staging/operator-lifecycle-manager/deploy/chart/templates/_packageserver.deployment-spec.yaml
@@ -54,6 +54,7 @@ spec:
imagePullPolicy: {{ .Values.package.image.pullPolicy }}
ports:
- containerPort: {{ .Values.package.service.internalPort }}
+ protocol: TCP
livenessProbe:
httpGet:
scheme: HTTPS
diff --git a/staging/operator-lifecycle-manager/doc/design/building-your-csv.md b/staging/operator-lifecycle-manager/doc/design/building-your-csv.md
index 3a23b56a6f..4349c75bd5 100644
--- a/staging/operator-lifecycle-manager/doc/design/building-your-csv.md
+++ b/staging/operator-lifecycle-manager/doc/design/building-your-csv.md
@@ -247,7 +247,7 @@ The metadata section contains general metadata around the name, version and othe
**Version**: The semanic version of the Operator. This value should be incremented each time a new Operator image is published.
-**Icon**: a base64 encoded image of the Operator logo or the logo of the publisher. The `base64data` parameter contains the data and the `mediatype` specifies the type of image, eg. `image/png` or `image/svg`.
+**Icon**: a base64 encoded image of the Operator logo or the logo of the publisher. The `base64data` parameter contains the data and the `mediatype` specifies the type of image, eg. `image/png` or `image/svg+xml`.
**Links**: A list of relevant links for the Operator. Common links include documentation, how-to guides, blog posts, and the company homepage.
diff --git a/staging/operator-lifecycle-manager/doc/install/install.md b/staging/operator-lifecycle-manager/doc/install/install.md
index b842906146..4be3e31aba 100644
--- a/staging/operator-lifecycle-manager/doc/install/install.md
+++ b/staging/operator-lifecycle-manager/doc/install/install.md
@@ -25,7 +25,7 @@ This command starts minikube, builds the OLM containers locally with the minikub
$ make run-local
```
-You can verify that the OLM components have been successfully deployed by running `kubectl -n local get deployments`
+You can verify that the OLM components have been successfully deployed by running `kubectl -n olm get deployments`
**NOTE** It is recommended for development purposes and will use the source locally
diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod
index 0776678982..4537e757dd 100644
--- a/staging/operator-lifecycle-manager/go.mod
+++ b/staging/operator-lifecycle-manager/go.mod
@@ -7,122 +7,105 @@ require (
github.com/coreos/go-semver v0.3.0
github.com/davecgh/go-spew v1.1.1
github.com/distribution/distribution v2.7.1+incompatible
- github.com/fsnotify/fsnotify v1.5.4
+ github.com/fsnotify/fsnotify v1.6.0
github.com/ghodss/yaml v1.0.0
github.com/go-air/gini v1.0.4
github.com/go-bindata/go-bindata/v3 v3.1.3
github.com/go-logr/logr v1.2.3
github.com/golang/mock v1.6.0
- github.com/google/go-cmp v0.5.8
+ github.com/google/go-cmp v0.5.9
github.com/googleapis/gnostic v0.5.5
github.com/itchyny/gojq v0.11.0
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37
github.com/mitchellh/hashstructure v1.0.0
github.com/mitchellh/mapstructure v1.4.1
- github.com/onsi/ginkgo/v2 v2.1.6
- github.com/onsi/gomega v1.20.1
+ github.com/onsi/ginkgo/v2 v2.6.0
+ github.com/onsi/gomega v1.24.1
github.com/openshift/api v3.9.0+incompatible
github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a
- github.com/operator-framework/api v0.17.3
+ github.com/operator-framework/api v0.17.6
github.com/operator-framework/operator-registry v1.17.5
github.com/otiai10/copy v1.2.0
github.com/pkg/errors v0.9.1
- github.com/prometheus/client_golang v1.12.2
- github.com/prometheus/client_model v0.2.0
- github.com/prometheus/common v0.32.1
- github.com/sirupsen/logrus v1.8.1
- github.com/spf13/cobra v1.4.0
+ github.com/prometheus/client_golang v1.14.0
+ github.com/prometheus/client_model v0.3.0
+ github.com/prometheus/common v0.37.0
+ github.com/sirupsen/logrus v1.9.0
+ github.com/spf13/cobra v1.6.1
github.com/spf13/pflag v1.0.5
- github.com/stretchr/testify v1.8.0
- golang.org/x/net v0.0.0-20220909164309-bea034e7d591
- golang.org/x/time v0.0.0-20220609170525-579cf78fd858
- google.golang.org/grpc v1.47.0
+ github.com/stretchr/testify v1.8.2
+ golang.org/x/net v0.7.0
+ golang.org/x/time v0.3.0
+ google.golang.org/grpc v1.52.0
gopkg.in/yaml.v2 v2.4.0
- helm.sh/helm/v3 v3.9.0
- k8s.io/api v0.25.3
- k8s.io/apiextensions-apiserver v0.25.3
- k8s.io/apimachinery v0.25.3
- k8s.io/apiserver v0.25.3
- k8s.io/client-go v0.25.3
- k8s.io/code-generator v0.25.3
- k8s.io/component-base v0.25.3
+ helm.sh/helm/v3 v3.11.1
+ k8s.io/api v0.26.1
+ k8s.io/apiextensions-apiserver v0.26.1
+ k8s.io/apimachinery v0.26.1
+ k8s.io/apiserver v0.26.1
+ k8s.io/client-go v0.26.1
+ k8s.io/code-generator v0.26.1
+ k8s.io/component-base v0.26.1
k8s.io/klog v1.0.0
k8s.io/kube-aggregator v0.25.3
- k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1
- k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73
- sigs.k8s.io/controller-runtime v0.13.0
+ k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280
+ k8s.io/utils v0.0.0-20221128185143-99ec85e7a448
+ sigs.k8s.io/controller-runtime v0.14.5
sigs.k8s.io/controller-tools v0.8.0
sigs.k8s.io/kind v0.16.0
)
replace google.golang.org/grpc => google.golang.org/grpc v1.40.0
-replace (
- go.opentelemetry.io/contrib => go.opentelemetry.io/contrib v0.20.0
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp => go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0
- go.opentelemetry.io/otel/exporters/otlp => go.opentelemetry.io/otel/exporters/otlp v0.20.0
- go.opentelemetry.io/otel/metric => go.opentelemetry.io/otel/metric v0.20.0
- go.opentelemetry.io/otel/oteltest => go.opentelemetry.io/otel/oteltest v0.20.0
- go.opentelemetry.io/otel/sdk/export/metric => go.opentelemetry.io/otel/sdk/export/metric v0.20.0
- go.opentelemetry.io/otel/sdk/metric => go.opentelemetry.io/otel/sdk/metric v0.20.0
- go.opentelemetry.io/otel/trace => go.opentelemetry.io/otel/trace v0.20.0
- go.opentelemetry.io/proto/otlp => go.opentelemetry.io/proto/otlp v0.7.0
-)
-
require (
- cloud.google.com/go v0.99.0 // indirect
+ cloud.google.com/go/compute v1.10.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
- github.com/Azure/go-autorest v14.2.0+incompatible // indirect
- github.com/Azure/go-autorest/autorest v0.11.27 // indirect
- github.com/Azure/go-autorest/autorest/adal v0.9.20 // indirect
- github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
- github.com/Azure/go-autorest/logger v0.2.1 // indirect
- github.com/Azure/go-autorest/tracing v0.6.0 // indirect
- github.com/BurntSushi/toml v1.0.0 // indirect
- github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect
+ github.com/BurntSushi/toml v1.2.1 // indirect
+ github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
- github.com/Masterminds/semver/v3 v3.1.1 // indirect
- github.com/Masterminds/sprig/v3 v3.2.2 // indirect
- github.com/Masterminds/squirrel v1.5.2 // indirect
+ github.com/Masterminds/semver/v3 v3.2.0 // indirect
+ github.com/Masterminds/sprig/v3 v3.2.3 // indirect
+ github.com/Masterminds/squirrel v1.5.3 // indirect
github.com/Masterminds/vcs v1.13.3 // indirect
- github.com/Microsoft/go-winio v0.5.1 // indirect
- github.com/Microsoft/hcsshim v0.9.2 // indirect
+ github.com/Microsoft/go-winio v0.5.2 // indirect
+ github.com/Microsoft/hcsshim v0.9.6 // indirect
github.com/NYTimes/gziphandler v1.1.1 // indirect
- github.com/PuerkitoBio/purell v1.1.1 // indirect
- github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/alessio/shellescape v1.4.1 // indirect
- github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed // indirect
+ github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
+ github.com/cenkalti/backoff/v4 v4.2.0 // indirect
github.com/cespare/xxhash/v2 v2.1.2 // indirect
- github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 // indirect
- github.com/containerd/cgroups v1.0.3 // indirect
- github.com/containerd/containerd v1.6.3 // indirect
- github.com/containerd/continuity v0.2.2 // indirect
+ github.com/chai2010/gettext-go v1.0.2 // indirect
+ github.com/containerd/cgroups v1.0.4 // indirect
+ github.com/containerd/containerd v1.6.18 // indirect
+ github.com/containerd/continuity v0.3.0 // indirect
github.com/containerd/ttrpc v1.1.0 // indirect
github.com/coreos/go-systemd/v22 v22.3.2 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
github.com/cyphar/filepath-securejoin v0.2.3 // indirect
- github.com/docker/cli v20.10.11+incompatible // indirect
- github.com/docker/distribution v2.8.1+incompatible // indirect
- github.com/docker/docker v20.10.14+incompatible // indirect
- github.com/docker/docker-credential-helpers v0.6.4 // indirect
+ github.com/docker/cli v20.10.21+incompatible // indirect
+ github.com/docker/distribution v2.8.2+incompatible // indirect
+ github.com/docker/docker v20.10.24+incompatible // indirect
+ github.com/docker/docker-credential-helpers v0.7.0 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
github.com/docker/go-units v0.4.0 // indirect
- github.com/emicklei/go-restful/v3 v3.8.0 // indirect
- github.com/evanphx/json-patch v4.12.0+incompatible // indirect
+ github.com/emicklei/go-restful/v3 v3.9.0 // indirect
+ github.com/evanphx/json-patch v5.6.0+incompatible // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
github.com/fatih/color v1.13.0 // indirect
- github.com/felixge/httpsnoop v1.0.1 // indirect
+ github.com/felixge/httpsnoop v1.0.3 // indirect
+ github.com/fvbommel/sortorder v1.0.1 // indirect
github.com/go-errors/errors v1.0.1 // indirect
github.com/go-gorp/gorp/v3 v3.0.2 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-logr/zapr v1.2.3 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
- github.com/go-openapi/jsonreference v0.19.5 // indirect
+ github.com/go-openapi/jsonreference v0.20.0 // indirect
github.com/go-openapi/swag v0.19.14 // indirect
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
github.com/gobuffalo/flect v0.2.3 // indirect
@@ -130,29 +113,28 @@ require (
github.com/goccy/go-yaml v1.8.1 // indirect
github.com/gofrs/flock v0.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
- github.com/golang-jwt/jwt/v4 v4.2.0 // indirect
github.com/golang-migrate/migrate/v4 v4.6.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/google/btree v1.0.1 // indirect
- github.com/google/cel-go v0.12.5 // indirect
+ github.com/google/cel-go v0.12.6 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
- github.com/google/uuid v1.2.0 // indirect
+ github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/mux v1.8.0 // indirect
github.com/gosuri/uitable v0.0.4 // indirect
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
github.com/h2non/filetype v1.1.1 // indirect
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c // indirect
- github.com/huandu/xstrings v1.3.2 // indirect
+ github.com/huandu/xstrings v1.3.3 // indirect
github.com/imdario/mergo v0.3.12 // indirect
- github.com/inconshreveable/mousetrap v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 // indirect
- github.com/jmoiron/sqlx v1.3.4 // indirect
+ github.com/jmoiron/sqlx v1.3.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kisielk/errcheck v1.5.0 // indirect
@@ -161,35 +143,34 @@ require (
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/lestrrat-go/strftime v1.0.1 // indirect
- github.com/lib/pq v1.10.4 // indirect
+ github.com/lib/pq v1.10.7 // indirect
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect
github.com/mailru/easyjson v0.7.6 // indirect
github.com/mattn/go-colorable v0.1.12 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/mattn/go-runewidth v0.0.9 // indirect
- github.com/mattn/go-sqlite3 v1.14.6 // indirect
- github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+ github.com/mattn/go-sqlite3 v1.14.14 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/moby/locker v1.0.1 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/moby/sys/mountinfo v0.5.0 // indirect
- github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
+ github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
- github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect
+ github.com/opencontainers/image-spec v1.1.0-rc2 // indirect
github.com/pbnjay/strptime v0.0.0-20140226051138-5c05b0d668c9 // indirect
- github.com/pelletier/go-toml v1.9.4 // indirect
+ github.com/pelletier/go-toml v1.9.5 // indirect
github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/procfs v0.7.3 // indirect
- github.com/rubenv/sql-migrate v1.1.1 // indirect
- github.com/russross/blackfriday v1.5.2 // indirect
+ github.com/prometheus/procfs v0.8.0 // indirect
+ github.com/rubenv/sql-migrate v1.2.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
github.com/spf13/cast v1.4.1 // indirect
@@ -197,55 +178,55 @@ require (
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
- github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca // indirect
+ github.com/xlab/treeprint v1.1.0 // indirect
go.etcd.io/bbolt v1.3.6 // indirect
- go.etcd.io/etcd/api/v3 v3.5.4 // indirect
- go.etcd.io/etcd/client/pkg/v3 v3.5.4 // indirect
- go.etcd.io/etcd/client/v3 v3.5.4 // indirect
+ go.etcd.io/etcd/api/v3 v3.5.5 // indirect
+ go.etcd.io/etcd/client/pkg/v3 v3.5.5 // indirect
+ go.etcd.io/etcd/client/v3 v3.5.5 // indirect
go.opencensus.io v0.23.0 // indirect
- go.opentelemetry.io/contrib v1.3.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 // indirect
- go.opentelemetry.io/otel v1.3.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp v0.20.0 // indirect
- go.opentelemetry.io/otel/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk v1.3.0 // indirect
- go.opentelemetry.io/otel/sdk/export/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/trace v1.3.0 // indirect
- go.opentelemetry.io/proto/otlp v0.12.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 // indirect
+ go.opentelemetry.io/otel v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0 // indirect
+ go.opentelemetry.io/otel/metric v0.31.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.12.0 // indirect
+ go.opentelemetry.io/otel/trace v1.12.0 // indirect
+ go.opentelemetry.io/proto/otlp v0.19.0 // indirect
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 // indirect
go.uber.org/atomic v1.7.0 // indirect
go.uber.org/multierr v1.6.0 // indirect
- go.uber.org/zap v1.21.0 // indirect
- golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd // indirect
+ go.uber.org/zap v1.24.0 // indirect
+ golang.org/x/crypto v0.5.0 // indirect
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect
- golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
- golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect
- golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4 // indirect
- golang.org/x/sys v0.0.0-20220907062415-87db552b00fd // indirect
- golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
- golang.org/x/text v0.3.7 // indirect
- golang.org/x/tools v0.1.12 // indirect
- golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
+ golang.org/x/mod v0.6.0 // indirect
+ golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
+ golang.org/x/sync v0.1.0 // indirect
+ golang.org/x/sys v0.5.0 // indirect
+ golang.org/x/term v0.5.0 // indirect
+ golang.org/x/text v0.7.0 // indirect
+ golang.org/x/tools v0.2.0 // indirect
+ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect
- google.golang.org/protobuf v1.28.0 // indirect
+ google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 // indirect
+ google.golang.org/protobuf v1.28.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/cli-runtime v0.24.0 // indirect
- k8s.io/gengo v0.0.0-20211129171323-c02415ce4185 // indirect
+ k8s.io/cli-runtime v0.26.0 // indirect
+ k8s.io/gengo v0.0.0-20220902162205-c0856e24416d // indirect
k8s.io/klog/v2 v2.80.1 // indirect
- k8s.io/kubectl v0.24.0 // indirect
- oras.land/oras-go v1.1.0 // indirect
+ k8s.io/kms v0.26.1 // indirect
+ k8s.io/kubectl v0.26.0 // indirect
+ oras.land/oras-go v1.2.2 // indirect
rsc.io/letsencrypt v0.0.3 // indirect
- sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33 // indirect
+ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 // indirect
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 // indirect
- sigs.k8s.io/kustomize/api v0.11.4 // indirect
- sigs.k8s.io/kustomize/kyaml v0.13.6 // indirect
+ sigs.k8s.io/kustomize/api v0.12.1 // indirect
+ sigs.k8s.io/kustomize/kyaml v0.13.9 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
@@ -254,7 +235,4 @@ replace (
// controller runtime
github.com/openshift/api => github.com/openshift/api v0.0.0-20221021112143-4226c2167e40 // release-4.12
github.com/openshift/client-go => github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c // release-4.12
- go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc => go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0
- go.opentelemetry.io/otel => go.opentelemetry.io/otel v0.20.0
- go.opentelemetry.io/otel/sdk => go.opentelemetry.io/otel/sdk v0.20.0
)
diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum
index a0d4642a96..36b992be73 100644
--- a/staging/operator-lifecycle-manager/go.sum
+++ b/staging/operator-lifecycle-manager/go.sum
@@ -1,5 +1,4 @@
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
-bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
@@ -20,21 +19,14 @@ cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmW
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 h1:y/cM2iqGgGi5D5DQZl6D9STN/3dR/Vx5Mp8s752oJTY=
-cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
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/compute v1.10.0 h1:aoLIYaA1fX3ywihqpBk2APQKOo20nXsp1GEZQbx5Jk4=
+cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
@@ -53,54 +45,42 @@ github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
-github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
-github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=
-github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
-github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
-github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
-github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg=
-github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
-github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
-github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
-github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
-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/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v1.0.0 h1:dtDWrepsVPfW9H/4y7dDgFc2MBUSeJhlaDtK13CxFlU=
github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+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/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
-github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
+github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
+github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
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.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o=
-github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8=
-github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
-github.com/Masterminds/squirrel v1.5.2 h1:UiOEi2ZX4RCSkpiNDQN5kro/XIBpSRk9iTqdIRPzUXE=
-github.com/Masterminds/squirrel v1.5.2/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
+github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g=
+github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
+github.com/Masterminds/sprig/v3 v3.2.0/go.mod h1:tWhwTbUTndesPNeF0C900vKoq283u6zp4APT9vaF3SI=
+github.com/Masterminds/sprig/v3 v3.2.3 h1:eL2fZNezLomi0uOLqjQoN6BfsDD+fyLtgbJMAj9n6YA=
+github.com/Masterminds/sprig/v3 v3.2.3/go.mod h1:rXcFaZ2zZbLRJv/xSysmlgIM1u11eBaRMhvYXJNkGuM=
+github.com/Masterminds/squirrel v1.5.3 h1:YPpoceAcxuzIljlr5iWpNKaql7hLeG1KLSrhvdHpkZc=
+github.com/Masterminds/squirrel v1.5.3/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
github.com/Masterminds/vcs v1.13.3 h1:IIA2aBdXvfbIM+yl/eTnL4hb1XwdpvuQLglAix1gweE=
github.com/Masterminds/vcs v1.13.3/go.mod h1:TiE7xuEjl1N4j016moRd6vezp6e6Lz23gypeXfzXeW8=
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
@@ -111,8 +91,8 @@ github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugX
github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
-github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
-github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
+github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA=
+github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
@@ -121,8 +101,8 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2
github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
-github.com/Microsoft/hcsshim v0.9.2 h1:wB06W5aYFfUB3IvootYAY2WnOmIdgPGfqSI6tufQNnY=
-github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
+github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY=
+github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
@@ -132,10 +112,8 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
-github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
@@ -154,8 +132,8 @@ github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:C
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
+github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves=
+github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
@@ -169,7 +147,6 @@ github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 h1:4daAzAu0
github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -201,13 +178,16 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k
github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA=
github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4=
+github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
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/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5 h1:7aWHqerlJ41y6FOsEUvknqgXnGmJyJSbjhAWq5pO4F8=
github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
+github.com/chai2010/gettext-go v1.0.2 h1:1Lwwip6Q2QGsAdl/ZKPCwTe9fe0CjlUbqj5bFNSjIRk=
+github.com/chai2010/gettext-go v1.0.2/go.mod h1:y+wnP2cHYaVj19NZhYKAwEMH2CI1gNHeQQ+5AjwawxA=
github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -237,8 +217,8 @@ github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4S
github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
-github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
-github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
+github.com/containerd/cgroups v1.0.4 h1:jN/mbWBEaz+T1pi5OFtnkQ+8qnmEbAr1Oo1FRm5B0dA=
+github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA=
github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
@@ -259,8 +239,8 @@ github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09Zvgq
github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
-github.com/containerd/containerd v1.6.3 h1:JfgUEIAH07xDWk6kqz0P3ArZt+KJ9YeihSC9uyFtSKg=
-github.com/containerd/containerd v1.6.3/go.mod h1:gCVGrYRYFm2E8GmuUIbj/NGD7DLZQLzSJQazjVKDOig=
+github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns=
+github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw=
github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
@@ -269,8 +249,8 @@ github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cE
github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y=
github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ=
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
-github.com/containerd/continuity v0.2.2 h1:QSqfxcn8c+12slxwu00AtzXrsami0MJb/MQs9lOLHLA=
-github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk=
+github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
+github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
@@ -340,12 +320,12 @@ github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfc
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.1 h1:r/myEWzV9lfsM1tFLgDyu0atFtJ1fXn261LKYj/3DxU=
github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
+github.com/cpuguy83/go-md2man/v2 v2.0.2/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 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
-github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI=
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
@@ -363,7 +343,6 @@ github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1S
github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
-github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7hqDjlFjiygg=
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=
@@ -377,28 +356,28 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8
github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
github.com/distribution/distribution v2.7.1+incompatible h1:aGFx4EvJWKEh//lHPLwFhFgwFHKH06TzNVPamrMn04M=
github.com/distribution/distribution v2.7.1+incompatible/go.mod h1:EgLm2NgWtdKgzF9NpMzUKgzmR7AMmb0VQi2B+ZzDRjc=
-github.com/distribution/distribution/v3 v3.0.0-20211118083504-a29a3c99a684 h1:DBZ2sN7CK6dgvHVpQsQj4sRMCbWTmd17l+5SUCjnQSY=
+github.com/distribution/distribution/v3 v3.0.0-20221208165359-362910506bc2 h1:aBfCb7iqHmDEIp6fBvC/hQUddQfg+3qdYjwzaiP9Hnc=
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
-github.com/docker/cli v20.10.11+incompatible h1:tXU1ezXcruZQRrMP8RN2z9N91h+6egZTS1gsPsKantc=
-github.com/docker/cli v20.10.11+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
+github.com/docker/cli v20.10.21+incompatible h1:qVkgyYUnOLQ98LtXBrwd/duVqPT2X4SHndOuGsfwyhU=
+github.com/docker/cli v20.10.21+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
-github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
+github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/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 v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w=
-github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
+github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
-github.com/docker/docker-credential-helpers v0.6.4 h1:axCks+yV+2MR3/kZhAmy07yC56WZ2Pwu/fKWtKuZB0o=
-github.com/docker/docker-credential-helpers v0.6.4/go.mod h1:ofX3UI0Gz1TteYBjtgs07O36Pyasyp66D2uKT7H8W1c=
+github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A=
+github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
@@ -426,8 +405,8 @@ github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7fo
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.8.0 h1:eCZ8ulSerjdAiaNpF7GxXIE7ZCMo1moN1qX+S609eVw=
-github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
@@ -435,9 +414,8 @@ github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMi
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=
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
-github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U=
+github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch/v5 v5.2.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
@@ -450,24 +428,23 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
-github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ=
-github.com/felixge/httpsnoop v1.0.1/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/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
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 h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c=
-github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
-github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
+github.com/fvbommel/sortorder v1.0.1 h1:dSnXLt4mJYH25uDDGa3biZNQsozaUWDSWeKJ0qqFfzE=
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
-github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
@@ -497,9 +474,11 @@ github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I
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-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.5.1/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=
@@ -507,8 +486,9 @@ github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.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-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A=
github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4=
github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
@@ -531,8 +511,8 @@ github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3Hfo
github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
-github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
+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/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=
@@ -563,8 +543,9 @@ github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85n
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-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs=
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-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=
@@ -602,13 +583,12 @@ github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP
github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
-github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
-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-migrate/migrate/v4 v4.6.2 h1:LDDOHo/q1W5UDj6PbkxdCv7lv9yunyZHXvxuwDkGo3k=
github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0=
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
+github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -647,7 +627,6 @@ github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu
github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
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=
github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho=
github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8=
github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
@@ -656,8 +635,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
-github.com/google/cel-go v0.12.5 h1:DmzaiSgoaqGCjtpPQWl26/gND+yRpim56H1jCVev6d8=
-github.com/google/cel-go v0.12.5/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw=
+github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M=
+github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw=
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -672,8 +651,8 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.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-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
@@ -684,7 +663,6 @@ github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/
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/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=
@@ -696,8 +674,6 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe
github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/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 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
@@ -706,12 +682,11 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3
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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
github.com/google/uuid v1.2.0/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/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/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.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
@@ -747,6 +722,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.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-health-probe v0.3.2/go.mod h1:izVOQ4RWbjUR6lm4nn+VLJyQ+FyaiGmprEYgI04Gs7U=
github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4=
github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
@@ -770,6 +747,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
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/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=
@@ -779,8 +757,9 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hokaccha/go-prettyjson v0.0.0-20190818114111-108c894c2c0e/go.mod h1:pFlLw2CfqZiIBOx6BuCeRLCrfxBJipTY0nIOF/VbGcI=
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 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw=
github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
+github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
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.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
@@ -789,8 +768,9 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
+github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 h1:3gyXljUyTWWTv/NMFPvwgxJSdE9Mamg2r3x8HMBl+Uo=
github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645/go.mod h1:296z3W7Xsrp2mlIY88ruDKscuvrkL6zXCNRtaYVshzw=
github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA=
@@ -808,15 +788,14 @@ github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w=
-github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ=
+github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
+github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
-github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
@@ -876,8 +855,8 @@ github.com/lestrrat-go/strftime v1.0.1/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR7
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=
github.com/lib/pq v1.10.0/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.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
+github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0=
github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
@@ -918,7 +897,6 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-oci8 v0.1.1/go.mod h1:wjDx6Xm9q7dFtHJvIlrI99JytznLw5wQ4R+9mNXJwGI=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
-github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
@@ -926,11 +904,13 @@ github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vq
github.com/mattn/go-shellwords v1.0.12 h1:M2zGm7EW6UQJvDeQxo4T51eKPurbeFbe8WtebGE2xrk=
github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.14 h1:qZgc/Rwetq+MtyE18WhzjokPD93dNqLGNT3QJuLvBGw=
+github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
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/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE=
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@@ -939,7 +919,7 @@ github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 h1:lPmsut5Sk7eK2Bm
github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37/go.mod h1:dYWq+UWoFCDY1TndvFUQuhBbIYmZpjreC8adEAx93zE=
github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
-github.com/mitchellh/cli v1.1.2/go.mod h1:6iaV0fGdElS6dPBx0EApTxHrcWvmJphyh2n8YBLPPZ4=
+github.com/mitchellh/cli v1.1.4/go.mod h1:vTLESy5mRhKOs9KDp0/RATawxP1UqBmdrpVRMnpcvKQ=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
@@ -970,8 +950,8 @@ github.com/moby/sys/mountinfo v0.5.0 h1:2Ks8/r6lopsxWi9m58nlwjaeSzUX9iiL1vj5qB/9
github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
+github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA=
+github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
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=
@@ -998,7 +978,6 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
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.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -1010,11 +989,10 @@ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+
github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
-github.com/onsi/ginkgo v1.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.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo/v2 v2.1.6 h1:Fx2POJZfKRQcM1pH49qSZiYeu319wji004qX+GDovrU=
-github.com/onsi/ginkgo/v2 v2.1.6/go.mod h1:MEH45j8TBi6u9BMogfbp0stKC5cdGjumZj5Y7AG4VIk=
+github.com/onsi/ginkgo/v2 v2.6.0 h1:9t9b9vRUbFq3C4qKFCGkVuq/fIHji802N1nrtkh1mNc=
+github.com/onsi/ginkgo/v2 v2.6.0/go.mod h1:63DOGlLAH8+REH8jUGdL3YpCpu7JODesutUjdENfUAc=
github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
@@ -1026,8 +1004,8 @@ 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.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
-github.com/onsi/gomega v1.20.1 h1:PA/3qinGoukvymdIDV8pii6tiZgC8kbmJO6Z5+b002Q=
-github.com/onsi/gomega v1.20.1/go.mod h1:DtrZpjmvpn2mPm4YWQa0/ALMDj9v4YxLgojwPeREyVo=
+github.com/onsi/gomega v1.24.1 h1:KORJXNNTzJXzu4ScJWssJfJMnJ+2QJqhoQSRwNlze9E=
+github.com/onsi/gomega v1.24.1/go.mod h1:3AOiACssS3/MajrniINInwbfOOtfZvplPzuRSmvt1jM=
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
@@ -1037,8 +1015,8 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec=
-github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/opencontainers/image-spec v1.1.0-rc2 h1:2zx/Stx4Wc5pIPDvIxHXvXtQFW/7XWJGmnM7r3wg034=
+github.com/opencontainers/image-spec v1.1.0-rc2/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ=
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
@@ -1062,8 +1040,8 @@ github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c h1:CV76yFOTXmq
github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c/go.mod h1:lFMO8mLHXWFzSdYvGNo8ivF9SfF6zInA8ZGw4phRnUE=
github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
github.com/operator-framework/api v0.7.1/go.mod h1:L7IvLd/ckxJEJg/t4oTTlnHKAJIP/p51AvEslW3wYdY=
-github.com/operator-framework/api v0.17.3 h1:wddE1SLKTNiIzwt28DbBIO+vPG2GOV6dkB9xBkDfT3o=
-github.com/operator-framework/api v0.17.3/go.mod h1:34tb98EwTN5SZLkgoxwvRkhMJKLHUWHOrrcv1ZwvEeA=
+github.com/operator-framework/api v0.17.6 h1:E6+vlvYUKafvoXYtCuHlDZrXX4vl8AT+r93OxNlzjpU=
+github.com/operator-framework/api v0.17.6/go.mod h1:l/cuwtPxkVUY7fzYgdust2m9tlmb8I4pOvbsUufRb24=
github.com/operator-framework/operator-registry v1.17.5 h1:LR8m1rFz5Gcyje8WK6iYt+gIhtzqo52zMRALdmTYHT0=
github.com/operator-framework/operator-registry v1.17.5/go.mod h1:sRQIgDMZZdUcmHltzyCnM6RUoDF+WS8Arj1BQIARDS8=
github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
@@ -1080,12 +1058,13 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
+github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
-github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
+github.com/phayes/freeport v0.0.0-20220201140144-74d24b5ae9f5 h1:Ii+DKncOVM8Cu1Hc+ETb5K+23HdAMvESYE3ZJ5b5cMI=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
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=
@@ -1110,15 +1089,16 @@ github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP
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.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
+github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
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.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 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
+github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
@@ -1127,8 +1107,9 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
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.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.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE=
+github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA=
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
@@ -1141,17 +1122,17 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
-github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo=
+github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
-github.com/rubenv/sql-migrate v1.1.1 h1:haR5Hn8hbW9/SpAICrXoZqXnywS7Q5WijwkQENPeNWY=
-github.com/rubenv/sql-migrate v1.1.1/go.mod h1:/7TZymwxN8VWumcIxw1jjHEcR1djpdkMHQPT4FWdnbQ=
-github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
+github.com/rubenv/sql-migrate v1.2.0 h1:fOXMPLMd41sK7Tg75SXDec15k3zg5WNV6SjuDRiNfcU=
+github.com/rubenv/sql-migrate v1.2.0/go.mod h1:Z5uVnq7vrIrPmHbVFfR4YLHRZquxeHpckCnRq0P/K9Y=
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 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
@@ -1177,8 +1158,9 @@ 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/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.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
@@ -1187,7 +1169,6 @@ github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -1199,8 +1180,9 @@ github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tL
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.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
-github.com/spf13/cobra v1.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
+github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
+github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
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=
@@ -1220,8 +1202,9 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
-github.com/stretchr/objx v0.4.0 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/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
@@ -1231,8 +1214,9 @@ 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.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.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
@@ -1245,7 +1229,6 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV
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 h1:uruHq4dN7GR16kFc5fp3d1RIYzJW5onx8Ybykw2YQFA=
-github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
@@ -1274,8 +1257,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI=
-github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
+github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk=
+github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -1283,7 +1266,7 @@ 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.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/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U=
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
@@ -1305,18 +1288,18 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo=
go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/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.5 h1:BX4JIbQ7hl7+jL+g+2j5UAr0o1bctCm6/Ct+ArBGkf0=
+go.etcd.io/etcd/api/v3 v3.5.5/go.mod h1:KFtNaxGDw4Yx/BA4iPPwevUTAuqcsPxzyX8PHydchN8=
go.etcd.io/etcd/client/pkg/v3 v3.5.0/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.5 h1:9S0JUVvmrVl7wCF39iTQthdaaNIiAaQbmK75ogO6GU8=
+go.etcd.io/etcd/client/pkg/v3 v3.5.5/go.mod h1:ggrwbk069qxpKPq8/FKkQ3Xq9y39kbFR4LnKszpRXeQ=
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao=
-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/pkg/v3 v3.5.4 h1:V5Dvl7S39ZDwjkKqJG2BfXgxZ3QREqqKifWQgIw5IM0=
-go.etcd.io/etcd/raft/v3 v3.5.4 h1:YGrnAgRfgXloBNuqa+oBI/aRZMcK/1GS6trJePJ/Gqc=
-go.etcd.io/etcd/server/v3 v3.5.4 h1:CMAZd0g8Bn5NRhynW6pKhc4FRg41/0QYy3d7aNm9874=
+go.etcd.io/etcd/client/v2 v2.305.5 h1:DktRP60//JJpnPC0VBymAN/7V71GHMdjDCBt4ZPXDjI=
+go.etcd.io/etcd/client/v3 v3.5.5 h1:q++2WTJbUgpQu4B6hCuT7VkdwaTP7Qz6Daak3WzbrlI=
+go.etcd.io/etcd/client/v3 v3.5.5/go.mod h1:aApjR4WGlSumpnJ2kloS75h6aHUmAyaPLjHMxpc7E7c=
+go.etcd.io/etcd/pkg/v3 v3.5.5 h1:Ablg7T7OkR+AeeeU32kdVhw/AGDsitkKPl7aW73ssjU=
+go.etcd.io/etcd/raft/v3 v3.5.5 h1:Ibz6XyZ60OYyRopu73lLM/P+qco3YtlZMOhnXNS051I=
+go.etcd.io/etcd/server/v3 v3.5.5 h1:jNjYm/9s+f9A9r6+SC4RvNaz6AqixpOvhrFdT0PvIj0=
go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
@@ -1331,30 +1314,27 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
-go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
-go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
-go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
-go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8=
-go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw=
-go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
-go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8=
-go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g=
-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 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8=
-go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
-go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw=
-go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
-go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 h1:xFSRQBbXF6VvYRf2lqMJXxoB72XI1K/azav8TekHHSw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0/go.mod h1:h8TWwRAhQpOd0aM5nYsRD8+flnkj+526GEIVlarH7eY=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0 h1:Ajldaqhxqw/gNzQA45IKFWLdG7jZuXX/wBW1d5qvbUI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.0/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
+go.opentelemetry.io/otel v1.12.0 h1:IgfC7kqQrRccIKuB7Cl+SRUmsKbEwSGPr0Eu+/ht1SQ=
+go.opentelemetry.io/otel v1.12.0/go.mod h1:geaoz0L0r1BEOR81k7/n9W4TCXYCJ7bPO7K374jQHG0=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0 h1:UfDENi+LTcLjQ/JhaXimjlIgn7wWjwbEMmdREm2Gyng=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.12.0/go.mod h1:rqbht/LlhVBgn5+k3M5QK96K5Xb0DvXpMJ5SFQpY6uw=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0 h1:ZVqtSAxrR4+ofzayuww0/EKamCjjnwnXTMRZzMudJoU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.12.0/go.mod h1:IlaGLENJkAl9+Xoo3J0unkdOwtL+rmqZ3ryMjUtYA94=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0 h1:+tsVdWosoqDfX6cdHAeacZozjQS94ySBd+aUXFwnNKA=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.12.0/go.mod h1:jSqjV+Knu1Jyvh+l3fx7V210Ev3HHgNQAi8YqpXaQP8=
+go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
+go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
+go.opentelemetry.io/otel/sdk v1.12.0 h1:8npliVYV7qc0t1FKdpU08eMnOjgPFMnriPhn0HH4q3o=
+go.opentelemetry.io/otel/sdk v1.12.0/go.mod h1:WYcvtgquYvgODEvxOry5owO2y9MyciW7JqMz6cpXShE=
+go.opentelemetry.io/otel/trace v1.12.0 h1:p28in++7Kd0r2d8gSt931O57fdjUyWxkVbESuILAeUc=
+go.opentelemetry.io/otel/trace v1.12.0/go.mod h1:pHlgBynn6s25qJ2szD+Bv+iwKJttjHSI3lUAyf0GNuQ=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5 h1:+FNtrFTmVw0YZGpBGX56XDee331t6JAXeK2bcyhLOOc=
go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -1363,8 +1343,6 @@ go.uber.org/atomic v1.6.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/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-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.2.0 h1:xqgm/S+aQvhWFTtR0XK3Jvg7z8kGV8P4X14IzwN3Eqk=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
@@ -1376,8 +1354,8 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc=
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-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.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
+go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -1404,10 +1382,9 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/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-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-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38=
-golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
+golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
+golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1443,9 +1420,9 @@ 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.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.6.0 h1:b9gGHsz9/HhJ3HF5DHQytPpuwocVTChQJK3AvoLRD5I=
+golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
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=
@@ -1502,15 +1479,15 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-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-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220909164309-bea034e7d591 h1:D0B/7al0LLrVC8aWF4+oxpv/m8bc7ViFfVS8/gXGdqI=
-golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/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-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1525,12 +1502,10 @@ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
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-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-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-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 h1:nt+Q6cXKz4MosCSpnbMtqiQ8Oz0pxTef2B4Vca2lvfk=
+golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
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=
@@ -1542,8 +1517,9 @@ 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-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1640,29 +1616,27 @@ golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-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-20210809222454-d867a43fc93e/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-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/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/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-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220907062415-87db552b00fd h1:AZeIEzg+8RCELJYq8w+ODLVxFgLMMigSwO/ffKPEd9U=
-golang.org/x/sys v0.0.0-20220907062415-87db552b00fd/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-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-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
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=
@@ -1672,17 +1646,18 @@ 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.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
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-20200630173020-3af7569d3a1e/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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1751,18 +1726,16 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f
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.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
-golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/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.2.0 h1:G6AHpWxTMGY1KyEYoAQ5WTtIekUUvDNjan3ugu60JvE=
+golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk=
+golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=
gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
@@ -1791,15 +1764,6 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR
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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
-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.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
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=
@@ -1856,31 +1820,13 @@ google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6D
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-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-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-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6 h1:a2S6M0+660BgMNl++4JPlcAO/CjkqYItDEZwkoDQK7c=
+google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg=
google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
-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=
@@ -1894,8 +1840,8 @@ 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
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 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
+google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1949,8 +1895,8 @@ gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81
gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
-helm.sh/helm/v3 v3.9.0 h1:qDSWViuF6SzZX5s5AB/NVRGWmdao7T5j4S4ebIkMGag=
-helm.sh/helm/v3 v3.9.0/go.mod h1:fzZfyslcPAWwSdkXrXlpKexFeE2Dei8N27FFQWt+PN0=
+helm.sh/helm/v3 v3.11.1 h1:cmL9fFohOoNQf+wnp2Wa0OhNFH0KFnSzEkVxi3fcc3I=
+helm.sh/helm/v3 v3.11.1/go.mod h1:z/Bu/BylToGno/6dtNGuSmjRqxKq5gaH+FU0BPO+AQ8=
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=
@@ -1962,54 +1908,48 @@ k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78=
k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
-k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
-k8s.io/api v0.25.3 h1:Q1v5UFfYe87vi5H7NU0p4RXC26PPMT8KOpr1TLQbCMQ=
-k8s.io/api v0.25.3/go.mod h1:o42gKscFrEVjHdQnyRenACrMtbuJsVdP+WVjqejfzmI=
+k8s.io/api v0.26.1 h1:f+SWYiPd/GsiWwVRz+NbFyCgvv75Pk9NK6dlkZgpCRQ=
+k8s.io/api v0.26.1/go.mod h1:xd/GBNgR0f707+ATNyPmQ1oyKSgndzXij81FzWGsejg=
k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
k8s.io/apiextensions-apiserver v0.20.1/go.mod h1:ntnrZV+6a3dB504qwC5PN/Yg9PBiDNt1EVqbW2kORVk=
k8s.io/apiextensions-apiserver v0.20.6/go.mod h1:qO8YMqeMmZH+lV21LUNzV41vfpoE9QVAJRA+MNqj0mo=
-k8s.io/apiextensions-apiserver v0.25.3 h1:bfI4KS31w2f9WM1KLGwnwuVlW3RSRPuIsfNF/3HzR0k=
-k8s.io/apiextensions-apiserver v0.25.3/go.mod h1:ZJqwpCkxIx9itilmZek7JgfUAM0dnTsA48I4krPqRmo=
+k8s.io/apiextensions-apiserver v0.26.1 h1:cB8h1SRk6e/+i3NOrQgSFij1B2S0Y0wDoNl66bn8RMI=
+k8s.io/apiextensions-apiserver v0.26.1/go.mod h1:AptjOSXDGuE0JICx/Em15PaoO7buLwTs0dGleIHixSM=
k8s.io/apimachinery v0.18.2/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
-k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
-k8s.io/apimachinery v0.25.3 h1:7o9ium4uyUOM76t6aunP0nZuex7gDf8VGwkR5RcJnQc=
-k8s.io/apimachinery v0.25.3/go.mod h1:jaF9C/iPNM1FuLl7Zuy5b9v+n35HGSh6AQ4HYRkCqwo=
+k8s.io/apimachinery v0.26.1 h1:8EZ/eGJL+hY/MYCNwhmDzVqq2lPl3N3Bo8rvweJwXUQ=
+k8s.io/apimachinery v0.26.1/go.mod h1:tnPmbONNJ7ByJNz9+n9kMjNP8ON+1qoAIIC70lztu74=
k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
-k8s.io/apiserver v0.25.3 h1:m7+xGuG5+KYAnEsqaFtDyWMkmMMEOFYlu+NlWv5qSBI=
-k8s.io/apiserver v0.25.3/go.mod h1:9bT47iM2fzRuhICJpM/RcQR9sqDDfZ7Yw60h0p3JW08=
+k8s.io/apiserver v0.26.1 h1:6vmnAqCDO194SVCPU3MU8NcDgSqsUA62tBUSWrFXhsc=
+k8s.io/apiserver v0.26.1/go.mod h1:wr75z634Cv+sifswE9HlAo5FQ7UoUauIICRlOE+5dCg=
k8s.io/cli-runtime v0.20.6/go.mod h1:JVERW478qcxWrUjJuWQSqyJeiz9QC4T6jmBznHFBC8w=
-k8s.io/cli-runtime v0.24.0 h1:ot3Qf49T852uEyNApABO1UHHpFIckKK/NqpheZYN2gM=
-k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A=
+k8s.io/cli-runtime v0.26.0 h1:aQHa1SyUhpqxAw1fY21x2z2OS5RLtMJOCj7tN4oq8mw=
+k8s.io/cli-runtime v0.26.0/go.mod h1:o+4KmwHzO/UK0wepE1qpRk6l3o60/txUZ1fEXWGIKTY=
k8s.io/client-go v0.18.2/go.mod h1:Xcm5wVGXX9HAA2JJ2sSBUn3tCJ+4SVlCbl2MNNv+CIU=
k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
-k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
-k8s.io/client-go v0.25.3 h1:oB4Dyl8d6UbfDHD8Bv8evKylzs3BXzzufLiO27xuPs0=
-k8s.io/client-go v0.25.3/go.mod h1:t39LPczAIMwycjcXkVc+CB+PZV69jQuNx4um5ORDjQA=
+k8s.io/client-go v0.26.1 h1:87CXzYJnAMGaa/IDDfRdhTzxk/wzGZ+/HUQpqgVSZXU=
+k8s.io/client-go v0.26.1/go.mod h1:IWNSglg+rQ3OcvDkhY6+QLeasV4OYHDjdqeWkDQZwGE=
k8s.io/code-generator v0.18.2/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc=
k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
k8s.io/code-generator v0.20.1/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg=
k8s.io/code-generator v0.20.6/go.mod h1:i6FmG+QxaLxvJsezvZp0q/gAEzzOz3U53KFibghWToU=
-k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
-k8s.io/code-generator v0.25.3 h1:BEH+wDi90bGyrYcY4abGtUqaOX7G94RRrEu8l+SvIeo=
-k8s.io/code-generator v0.25.3/go.mod h1:9F5fuVZOMWRme7MYj2YT3L9ropPWPokd9VRhVyD3+0w=
+k8s.io/code-generator v0.26.1 h1:dusFDsnNSKlMFYhzIM0jAO1OlnTN5WYwQQ+Ai12IIlo=
+k8s.io/code-generator v0.26.1/go.mod h1:OMoJ5Dqx1wgaQzKgc+ZWaZPfGjdRq/Y3WubFrZmeI3I=
k8s.io/component-base v0.18.2/go.mod h1:kqLlMuhJNHQ9lz8Z7V5bxUUtjFZnrypArGl58gmDfUM=
k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
-k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=
-k8s.io/component-base v0.25.3 h1:UrsxciGdrCY03ULT1h/S/gXFCOPnLhUVwSyx+hM/zq4=
-k8s.io/component-base v0.25.3/go.mod h1:WYoS8L+IlTZgU7rhAl5Ctpw0WdMxDfCC5dkxcEFa/TI=
+k8s.io/component-base v0.26.1 h1:4ahudpeQXHZL5kko+iDHqLj/FSGAEUnSVO0EBbgDd+4=
+k8s.io/component-base v0.26.1/go.mod h1:VHrLR0b58oC035w6YQiBSbtsf0ThuSwXP+p5dD/kAWU=
k8s.io/component-helpers v0.20.6/go.mod h1:d4rFhZS/wxrZCxRiJJiWf1mVGVeMB5/ey3Yv8/rOp78=
-k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c=
k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
@@ -2019,9 +1959,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-20200428234225-8167cfdcfc14/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-20211129171323-c02415ce4185 h1:TT1WdmqqXareKxZ/oNXEUSwKlLiHzPMyB0t8BaFeBYI=
-k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
+k8s.io/gengo v0.0.0-20220902162205-c0856e24416d h1:U9tB195lKdzwqicbJvyJeOXV7Klv+wNAWENRnXEGi08=
+k8s.io/gengo v0.0.0-20220902162205-c0856e24416d/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
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 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
@@ -2029,32 +1968,28 @@ k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/klog/v2 v2.80.1 h1:atnLQ121W371wYYFawwYx1aEY2eUfs4l3J72wtgAwV4=
k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kms v0.26.1 h1:JE0n4J4+8/Z+egvXz2BTJeJ9ecsm4ZSLKF7ttVXXm/4=
+k8s.io/kms v0.26.1/go.mod h1:ReC1IEGuxgfN+PDCIpR6w8+XMmDE7uJhxcCwMZFdIYc=
k8s.io/kube-aggregator v0.25.3 h1:eOG9S4GPICAXWIFeQDHjnhqYaYPpgLIC1NunJu9pZCs=
k8s.io/kube-aggregator v0.25.3/go.mod h1:w87nqmzJMf7S73FRYcnexqfYW0AFiLJiCkvVCwM3feE=
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
-k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
-k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1 h1:MQ8BAZPZlWk3S9K4a9NCkIFQtZShWqoha7snGixVgEA=
-k8s.io/kube-openapi v0.0.0-20220803162953-67bda5d908f1/go.mod h1:C/N6wCaBHeBHkHUesQOQy2/MZqGgMAFPqGsGQLdbZBU=
+k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280 h1:+70TFaan3hfJzs+7VK2o+OGxg8HsuBr/5f6tVAjDu6E=
+k8s.io/kube-openapi v0.0.0-20221012153701-172d655c2280/go.mod h1:+Axhij7bCpeqhklhUTe3xmOn6bWxolyZEeyaFpjGtl4=
k8s.io/kubectl v0.20.6/go.mod h1:yTCGVrlkBuQhFbKA1R65+lQ9hH7XeyOqUd0FUPFicPg=
-k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo=
-k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0=
+k8s.io/kubectl v0.26.0 h1:xmrzoKR9CyNdzxBmXV7jW9Ln8WMrwRK6hGbbf69o4T0=
+k8s.io/kubectl v0.26.0/go.mod h1:eInP0b+U9XUJWSYeU9XZnTA+cVYuWyl3iYPGtru0qhQ=
k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
k8s.io/metrics v0.20.6/go.mod h1:d+OAIaXutom9kGWcBit/M8OkDpIzBKTsm47+KcUt7VI=
-k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI=
k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-k8s.io/utils v0.0.0-20210802155522-efc7438f0176/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-20220823124924-e9cbc92d1a73 h1:H9TCJUUx+2VA0ZiD9lvtaX8fthFsMoD+Izn93E/hm8U=
-k8s.io/utils v0.0.0-20220823124924-e9cbc92d1a73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
-oras.land/oras-go v1.1.0 h1:tfWM1RT7PzUwWphqHU6ptPU3ZhwVnSw/9nEGf519rYg=
-oras.land/oras-go v1.1.0/go.mod h1:1A7vR/0KknT2UkJVWh+xMi95I/AhK8ZrxrnUSmXN0bQ=
+k8s.io/utils v0.0.0-20221128185143-99ec85e7a448 h1:KTgPnR10d5zhztWptI952TNtt/4u5h3IzDXkdIMuo2Y=
+k8s.io/utils v0.0.0-20221128185143-99ec85e7a448/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+oras.land/oras-go v1.2.2 h1:0E9tOHUfrNH7TCDk5KU0jVBEzCqbfdyuVfGmJ7ZeRPE=
+oras.land/oras-go v1.2.2/go.mod h1:Apa81sKoZPpP7CDciE006tSZ0x3Q3+dOoBcMZ/aNxvw=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/letsencrypt v0.0.3 h1:H7xDfhkaFFSYEJlKeq38RwX2jYcnTeHuDQyT+mMNMwM=
rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY=
@@ -2063,33 +1998,29 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33 h1:LYqFq+6Cj2D0gFfrJvL7iElD4ET6ir3VDdhDdTK7rgc=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.33/go.mod h1:soWkSNf2tZC7aMibXEqVhCd73GOY5fJikn8qbdzemB0=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 h1:+xBL5uTc+BkPBwmMi3vYfUJjq+N3K+H6PXeETwf5cPI=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35/go.mod h1:WxjusMwXlKzfAs4p9km6XJRndVt2FROgMVCE4cdohFo=
sigs.k8s.io/controller-runtime v0.8.0/go.mod h1:v9Lbj5oX443uR7GXYY46E0EE2o7k2YxQ58GxVNeXSW4=
-sigs.k8s.io/controller-runtime v0.13.0 h1:iqa5RNciy7ADWnIc8QxCbOX5FEKVR3uxVxKHRMc2WIQ=
-sigs.k8s.io/controller-runtime v0.13.0/go.mod h1:Zbz+el8Yg31jubvAEyglRZGdLAjplZl+PgtYNI6WNTI=
+sigs.k8s.io/controller-runtime v0.14.5 h1:6xaWFqzT5KuAQ9ufgUaj1G/+C4Y1GRkhrxl+BJ9i+5s=
+sigs.k8s.io/controller-runtime v0.14.5/go.mod h1:WqIdsAY6JBsjfc/CqO0CORmNtoCtE4S6qbPc9s68h+0=
sigs.k8s.io/controller-tools v0.4.1/go.mod h1:G9rHdZMVlBDocIxGkK3jHLWqcTMNvveypYJwrvYKjWU=
sigs.k8s.io/controller-tools v0.8.0 h1:uUkfTGEwrguqYYfcI2RRGUnC8mYdCFDqfwPKUcNJh1o=
sigs.k8s.io/controller-tools v0.8.0/go.mod h1:qE2DXhVOiEq5ijmINcFbqi9GZrrUjzB1TuJU0xa6eoY=
-sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2 h1:iXTIw73aPyC+oRdyqqvVJuloN1p0AC/kzH07hu3NE+k=
sigs.k8s.io/json v0.0.0-20220713155537-f223a00ba0e2/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA=
sigs.k8s.io/kind v0.16.0 h1:GFXyyxtPnHFKqXr3ZG8/X0+0K9sl69lejStlPn2WQyM=
sigs.k8s.io/kind v0.16.0/go.mod h1:cKTqagdRyUQmihhBOd+7p43DpOPRn9rHsUC08K1Jbsk=
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
-sigs.k8s.io/kustomize/api v0.11.4 h1:/0Mr3kfBBNcNPOW5Qwk/3eb8zkswCwnqQxxKtmrTkRo=
-sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=
-sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=
-sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=
-sigs.k8s.io/kustomize/kyaml v0.13.6 h1:eF+wsn4J7GOAXlvajv6OknSunxpcOBQQqsnPxObtkGs=
-sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=
+sigs.k8s.io/kustomize/api v0.12.1 h1:7YM7gW3kYBwtKvoY216ZzY+8hM+lV53LUayghNRJ0vM=
+sigs.k8s.io/kustomize/api v0.12.1/go.mod h1:y3JUhimkZkR6sbLNwfJHxvo1TCLwuwm14sCYnkH6S1s=
+sigs.k8s.io/kustomize/kyaml v0.13.9 h1:Qz53EAaFFANyNgyOEJbT/yoIHygK40/ZcvU3rgry2Tk=
+sigs.k8s.io/kustomize/kyaml v0.13.9/go.mod h1:QsRbD0/KcU+wdk0/L0fIp2KLnohkVzs6fQ85/nOXac4=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
-sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
diff --git a/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/clientset.go b/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/clientset.go
index aa24543eef..6d1cbfb097 100644
--- a/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/clientset.go
+++ b/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/clientset.go
@@ -39,8 +39,7 @@ type Interface interface {
OperatorsV2() operatorsv2.OperatorsV2Interface
}
-// Clientset contains the clients for groups. Each group has exactly one
-// version included in a Clientset.
+// Clientset contains the clients for groups.
type Clientset struct {
*discovery.DiscoveryClient
operatorsV1alpha1 *operatorsv1alpha1.OperatorsV1alpha1Client
diff --git a/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake/decorator.go b/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake/decorator.go
index 1a90295744..154b595519 100644
--- a/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake/decorator.go
+++ b/staging/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake/decorator.go
@@ -5,7 +5,7 @@ Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
+ http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
diff --git a/staging/operator-lifecycle-manager/pkg/api/client/informers/externalversions/factory.go b/staging/operator-lifecycle-manager/pkg/api/client/informers/externalversions/factory.go
index f037340b49..3a265e8e4c 100644
--- a/staging/operator-lifecycle-manager/pkg/api/client/informers/externalversions/factory.go
+++ b/staging/operator-lifecycle-manager/pkg/api/client/informers/externalversions/factory.go
@@ -47,6 +47,11 @@ type sharedInformerFactory struct {
// startedInformers is used for tracking which informers have been started.
// This allows Start() to be called multiple times safely.
startedInformers map[reflect.Type]bool
+ // wg tracks how many goroutines were started.
+ wg sync.WaitGroup
+ // shuttingDown is true when Shutdown has been called. It may still be running
+ // because it needs to wait for goroutines.
+ shuttingDown bool
}
// WithCustomResyncConfig sets a custom resync period for the specified informer types.
@@ -107,20 +112,39 @@ func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResy
return factory
}
-// Start initializes all requested informers.
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
f.lock.Lock()
defer f.lock.Unlock()
+ if f.shuttingDown {
+ return
+ }
+
for informerType, informer := range f.informers {
if !f.startedInformers[informerType] {
- go informer.Run(stopCh)
+ f.wg.Add(1)
+ // We need a new variable in each loop iteration,
+ // otherwise the goroutine would use the loop variable
+ // and that keeps changing.
+ informer := informer
+ go func() {
+ defer f.wg.Done()
+ informer.Run(stopCh)
+ }()
f.startedInformers[informerType] = true
}
}
}
-// WaitForCacheSync waits for all started informers' cache were synced.
+func (f *sharedInformerFactory) Shutdown() {
+ f.lock.Lock()
+ f.shuttingDown = true
+ f.lock.Unlock()
+
+ // Will return immediately if there is nothing to wait for.
+ f.wg.Wait()
+}
+
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
informers := func() map[reflect.Type]cache.SharedIndexInformer {
f.lock.Lock()
@@ -167,11 +191,58 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal
// SharedInformerFactory provides shared informers for resources in all known
// API group versions.
+//
+// It is typically used like this:
+//
+// ctx, cancel := context.Background()
+// defer cancel()
+// factory := NewSharedInformerFactory(client, resyncPeriod)
+// defer factory.WaitForStop() // Returns immediately if nothing was started.
+// genericInformer := factory.ForResource(resource)
+// typedInformer := factory.SomeAPIGroup().V1().SomeType()
+// factory.Start(ctx.Done()) // Start processing these informers.
+// synced := factory.WaitForCacheSync(ctx.Done())
+// for v, ok := range synced {
+// if !ok {
+// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v)
+// return
+// }
+// }
+//
+// // Creating informers can also be created after Start, but then
+// // Start must be called again:
+// anotherGenericInformer := factory.ForResource(resource)
+// factory.Start(ctx.Done())
type SharedInformerFactory interface {
internalinterfaces.SharedInformerFactory
- ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // Start initializes all requested informers. They are handled in goroutines
+ // which run until the stop channel gets closed.
+ Start(stopCh <-chan struct{})
+
+ // Shutdown marks a factory as shutting down. At that point no new
+ // informers can be started anymore and Start will return without
+ // doing anything.
+ //
+ // In addition, Shutdown blocks until all goroutines have terminated. For that
+ // to happen, the close channel(s) that they were started with must be closed,
+ // either before Shutdown gets called or while it is waiting.
+ //
+ // Shutdown may be called multiple times, even concurrently. All such calls will
+ // block until all goroutines have terminated.
+ Shutdown()
+
+ // WaitForCacheSync blocks until all started informers' caches were synced
+ // or the stop channel gets closed.
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
+ // ForResource gives generic access to a shared informer of the matching type.
+ ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // InternalInformerFor returns the SharedIndexInformer for obj using an internal
+ // client.
+ InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer
+
Operators() operators.Interface
}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker.go b/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker.go
index 6abfc808ac..c7b71c0670 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker.go
@@ -26,6 +26,7 @@ import (
"github.com/operator-framework/api/pkg/operators/reference"
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
+ v1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1"
listersoperatorsv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection"
@@ -33,12 +34,8 @@ import (
)
const (
- // TODO: Move to operator-framework/api/pkg/operators/v1alpha1
- // BundleLookupFailed describes conditions types for when BundleLookups fail
- BundleLookupFailed operatorsv1alpha1.BundleLookupConditionType = "BundleLookupFailed"
-
// TODO: This can be a spec field
- // BundleUnpackTimeoutAnnotationKey allows setting a bundle unpack timeout per InstallPlan
+ // BundleUnpackTimeoutAnnotationKey allows setting a bundle unpack timeout per OperatorGroup
// and overrides the default specified by the --bundle-unpack-timeout flag
// The time duration should be in the same format as accepted by time.ParseDuration()
// e.g 1m30s
@@ -211,6 +208,9 @@ func (c *ConfigMapUnpacker) job(cmRef *corev1.ObjectReference, bundlePath string
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -422,7 +422,7 @@ func (c *ConfigMapUnpacker) UnpackBundle(lookup *operatorsv1alpha1.BundleLookup,
result = newBundleUnpackResult(lookup)
// if bundle lookup failed condition already present, then there is nothing more to do
- failedCond := result.GetCondition(BundleLookupFailed)
+ failedCond := result.GetCondition(operatorsv1alpha1.BundleLookupFailed)
if failedCond.Status == corev1.ConditionTrue {
return result, nil
}
@@ -768,3 +768,30 @@ func getCondition(job *batchv1.Job, conditionType batchv1.JobConditionType) (con
}
return
}
+
+// OperatorGroupBundleUnpackTimeout returns bundle timeout from annotation if specified.
+// If the timeout annotation is not set, return timeout < 0 which is subsequently ignored.
+// This is to overrides the --bundle-unpack-timeout flag value on per-OperatorGroup basis.
+func OperatorGroupBundleUnpackTimeout(ogLister v1listers.OperatorGroupNamespaceLister) (time.Duration, error) {
+ ignoreTimeout := -1 * time.Minute
+
+ ogs, err := ogLister.List(k8slabels.Everything())
+ if err != nil {
+ return ignoreTimeout, err
+ }
+ if len(ogs) != 1 {
+ return ignoreTimeout, fmt.Errorf("found %d operatorGroups, expected 1", len(ogs))
+ }
+
+ timeoutStr, ok := ogs[0].GetAnnotations()[BundleUnpackTimeoutAnnotationKey]
+ if !ok {
+ return ignoreTimeout, nil
+ }
+
+ d, err := time.ParseDuration(timeoutStr)
+ if err != nil {
+ return ignoreTimeout, fmt.Errorf("failed to parse unpack timeout annotation(%s: %s): %w", BundleUnpackTimeoutAnnotationKey, timeoutStr, err)
+ }
+
+ return d, nil
+}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker_test.go b/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker_test.go
index 8a4fc5c0a0..a9a7c61a3f 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/bundle/bundle_unpacker_test.go
@@ -2,10 +2,12 @@ package bundle
import (
"context"
+ "errors"
"fmt"
"testing"
"time"
+ "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
batchv1 "k8s.io/api/batch/v1"
corev1 "k8s.io/api/core/v1"
@@ -15,11 +17,14 @@ import (
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
k8sfake "k8s.io/client-go/kubernetes/fake"
+ "k8s.io/client-go/tools/cache"
"k8s.io/utils/pointer"
+ operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
crfake "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake"
crinformers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions"
+ v1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
"github.com/operator-framework/operator-registry/pkg/api"
"github.com/operator-framework/operator-registry/pkg/configmap"
@@ -329,6 +334,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -531,6 +539,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -774,6 +785,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -1011,6 +1025,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -1218,6 +1235,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -1298,7 +1318,7 @@ func TestConfigMapUnpacker(t *testing.T) {
LastTransitionTime: &start,
},
{
- Type: BundleLookupFailed,
+ Type: operatorsv1alpha1.BundleLookupFailed,
Status: corev1.ConditionTrue,
Reason: "DeadlineExceeded",
Message: "Job was active longer than specified deadline",
@@ -1436,6 +1456,9 @@ func TestConfigMapUnpacker(t *testing.T) {
},
},
},
+ NodeSelector: map[string]string{
+ "kubernetes.io/os": "linux",
+ },
},
},
},
@@ -1554,3 +1577,114 @@ func TestConfigMapUnpacker(t *testing.T) {
})
}
}
+
+func TestOperatorGroupBundleUnpackTimeout(t *testing.T) {
+ nsName := "fake-ns"
+
+ for _, tc := range []struct {
+ name string
+ operatorGroups []*operatorsv1.OperatorGroup
+ expectedTimeout time.Duration
+ expectedError error
+ }{
+ {
+ name: "No operator groups exist",
+ expectedTimeout: -1 * time.Minute,
+ expectedError: errors.New("found 0 operatorGroups, expected 1"),
+ },
+ {
+ name: "Multiple operator groups exist",
+ operatorGroups: []*operatorsv1.OperatorGroup{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: operatorsv1.OperatorGroupKind,
+ APIVersion: operatorsv1.GroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og1",
+ Namespace: nsName,
+ },
+ },
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: operatorsv1.OperatorGroupKind,
+ APIVersion: operatorsv1.GroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og2",
+ Namespace: nsName,
+ },
+ },
+ },
+ expectedTimeout: -1 * time.Minute,
+ expectedError: errors.New("found 2 operatorGroups, expected 1"),
+ },
+ {
+ name: "One operator group exists with valid timeout annotation",
+ operatorGroups: []*operatorsv1.OperatorGroup{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: operatorsv1.OperatorGroupKind,
+ APIVersion: operatorsv1.GroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: nsName,
+ Annotations: map[string]string{BundleUnpackTimeoutAnnotationKey: "1m"},
+ },
+ },
+ },
+ expectedTimeout: 1 * time.Minute,
+ expectedError: nil,
+ },
+ {
+ name: "One operator group exists with no timeout annotation",
+ operatorGroups: []*operatorsv1.OperatorGroup{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: operatorsv1.OperatorGroupKind,
+ APIVersion: operatorsv1.GroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: nsName,
+ },
+ },
+ },
+ expectedTimeout: -1 * time.Minute,
+ },
+ {
+ name: "One operator group exists with invalid timeout annotation",
+ operatorGroups: []*operatorsv1.OperatorGroup{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: operatorsv1.OperatorGroupKind,
+ APIVersion: operatorsv1.GroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: nsName,
+ Annotations: map[string]string{BundleUnpackTimeoutAnnotationKey: "invalid"},
+ },
+ },
+ },
+ expectedTimeout: -1 * time.Minute,
+ expectedError: fmt.Errorf("failed to parse unpack timeout annotation(operatorframework.io/bundle-unpack-timeout: invalid): %w", errors.New("time: invalid duration \"invalid\"")),
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ ogIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{})
+ ogLister := v1listers.NewOperatorGroupLister(ogIndexer).OperatorGroups(nsName)
+
+ for _, og := range tc.operatorGroups {
+ err := ogIndexer.Add(og)
+ assert.NoError(t, err)
+ }
+
+ timeout, err := OperatorGroupBundleUnpackTimeout(ogLister)
+
+ assert.Equal(t, tc.expectedTimeout, timeout)
+ assert.Equal(t, tc.expectedError, err)
+ })
+ }
+}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/install/deployment.go b/staging/operator-lifecycle-manager/pkg/controller/install/deployment.go
index 559520aad7..43aab8e1ce 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/install/deployment.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/install/deployment.go
@@ -175,7 +175,7 @@ func (i *StrategyDeploymentInstaller) deploymentForSpec(name string, spec appsv1
// By default, each deployment created by OLM could spawn up to 10 replicaSets.
// By setting the deployments revisionHistoryLimit to 1, OLM will only create up
// to 2 ReplicaSets per deployment it manages, saving memory.
- dep.Spec.RevisionHistoryLimit = pointer.Int32Ptr(1)
+ dep.Spec.RevisionHistoryLimit = pointer.Int32(1)
hash = HashDeploymentSpec(dep.Spec)
dep.Labels[DeploymentSpecHashLabelKey] = hash
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go
index 0c3531e780..0d24b363d3 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go
@@ -934,7 +934,13 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error {
return err
}
- failForwardEnabled, err := resolver.IsFailForwardEnabled(o.lister.OperatorsV1().OperatorGroupLister().OperatorGroups(namespace))
+ ogLister := o.lister.OperatorsV1().OperatorGroupLister().OperatorGroups(namespace)
+ failForwardEnabled, err := resolver.IsFailForwardEnabled(ogLister)
+ if err != nil {
+ return err
+ }
+
+ unpackTimeout, err := bundle.OperatorGroupBundleUnpackTimeout(ogLister)
if err != nil {
return err
}
@@ -1028,6 +1034,80 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error {
return err
}
+ // Attempt to unpack bundles before installing
+ // Note: This should probably use the attenuated client to prevent users from resolving resources they otherwise don't have access to.
+ if len(bundleLookups) > 0 {
+ logger.Debug("unpacking bundles")
+
+ var unpacked bool
+ unpacked, steps, bundleLookups, err = o.unpackBundles(namespace, steps, bundleLookups, unpackTimeout)
+ if err != nil {
+ // If the error was fatal capture and fail
+ if olmerrors.IsFatal(err) {
+ _, updateErr := o.updateSubscriptionStatuses(
+ o.setSubsCond(subs, v1alpha1.SubscriptionCondition{
+ Type: v1alpha1.SubscriptionBundleUnpackFailed,
+ Reason: "ErrorPreventedUnpacking",
+ Message: err.Error(),
+ Status: corev1.ConditionTrue,
+ }))
+ if updateErr != nil {
+ logger.WithError(updateErr).Debug("failed to update subs conditions")
+ return updateErr
+ }
+ return nil
+ }
+ // Retry sync if non-fatal error
+ return fmt.Errorf("bundle unpacking failed with an error: %w", err)
+ }
+
+ // Check BundleLookup status conditions to see if the BundleLookupFailed condtion is true
+ // which means bundle lookup has failed and subscriptions need to be updated
+ // with a condition indicating the failure.
+ isFailed, cond := hasBundleLookupFailureCondition(bundleLookups)
+ if isFailed {
+ err := fmt.Errorf("bundle unpacking failed. Reason: %v, and Message: %v", cond.Reason, cond.Message)
+ logger.Infof("%v", err)
+
+ _, updateErr := o.updateSubscriptionStatuses(
+ o.setSubsCond(subs, v1alpha1.SubscriptionCondition{
+ Type: v1alpha1.SubscriptionBundleUnpackFailed,
+ Reason: "BundleUnpackFailed",
+ Message: err.Error(),
+ Status: corev1.ConditionTrue,
+ }))
+ if updateErr != nil {
+ logger.WithError(updateErr).Debug("failed to update subs conditions")
+ return updateErr
+ }
+ // Since this is likely requires intervention we do not want to
+ // requeue too often. We return no error here and rely on a
+ // periodic resync which will help to automatically resolve
+ // some issues such as unreachable bundle images caused by
+ // bad catalog updates.
+ return nil
+ }
+
+ // This means that the unpack job is still running (most likely) or
+ // there was some issue which we did not handle above.
+ if !unpacked {
+ _, updateErr := o.updateSubscriptionStatuses(
+ o.setSubsCond(subs, v1alpha1.SubscriptionCondition{
+ Type: v1alpha1.SubscriptionBundleUnpacking,
+ Reason: "UnpackingInProgress",
+ Status: corev1.ConditionTrue,
+ }))
+ if updateErr != nil {
+ logger.WithError(updateErr).Debug("failed to update subs conditions")
+ return updateErr
+ }
+
+ logger.Debug("unpacking is not complete yet, requeueing")
+ o.nsResolveQueue.AddAfter(namespace, 5*time.Second)
+ return nil
+ }
+ }
+
// create installplan if anything updated
if len(updatedSubs) > 0 {
logger.Debug("resolution caused subscription changes, creating installplan")
@@ -1062,8 +1142,17 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error {
logger.Debugf("no subscriptions were updated")
}
+ // Make sure that we no longer indicate unpacking progress
+ subs = o.setSubsCond(subs, v1alpha1.SubscriptionCondition{
+ Type: v1alpha1.SubscriptionBundleUnpacking,
+ Status: corev1.ConditionFalse,
+ })
+
+ // Remove BundleUnpackFailed condition from subscriptions
+ o.removeSubsCond(subs, v1alpha1.SubscriptionBundleUnpackFailed)
+
// Remove resolutionfailed condition from subscriptions
- subs = o.removeSubsCond(subs, v1alpha1.SubscriptionResolutionFailed)
+ o.removeSubsCond(subs, v1alpha1.SubscriptionResolutionFailed)
newSub := true
for _, updatedSub := range updatedSubs {
updatedSub.Status.RemoveConditions(v1alpha1.SubscriptionResolutionFailed)
@@ -1408,35 +1497,30 @@ type UnpackedBundleReference struct {
Properties string `json:"properties"`
}
-func (o *Operator) unpackBundles(plan *v1alpha1.InstallPlan) (bool, *v1alpha1.InstallPlan, error) {
- out := plan.DeepCopy()
+func (o *Operator) unpackBundles(namespace string, installPlanSteps []*v1alpha1.Step, bundleLookups []v1alpha1.BundleLookup, unpackTimeout time.Duration) (bool, []*v1alpha1.Step, []v1alpha1.BundleLookup, error) {
unpacked := true
- // The bundle timeout annotation if specified overrides the --bundle-unpack-timeout flag value
- // If the timeout cannot be parsed it's set to < 0 and subsequently ignored
- unpackTimeout := -1 * time.Minute
- timeoutStr, ok := plan.GetAnnotations()[bundle.BundleUnpackTimeoutAnnotationKey]
- if ok {
- d, err := time.ParseDuration(timeoutStr)
- if err != nil {
- o.logger.Errorf("failed to parse unpack timeout annotation(%s: %s): %v", bundle.BundleUnpackTimeoutAnnotationKey, timeoutStr, err)
- } else {
- unpackTimeout = d
- }
+ outBundleLookups := make([]v1alpha1.BundleLookup, len(bundleLookups))
+ for i := range bundleLookups {
+ bundleLookups[i].DeepCopyInto(&outBundleLookups[i])
+ }
+ outInstallPlanSteps := make([]*v1alpha1.Step, len(installPlanSteps))
+ for i := range installPlanSteps {
+ outInstallPlanSteps[i] = installPlanSteps[i].DeepCopy()
}
var errs []error
- for i := 0; i < len(out.Status.BundleLookups); i++ {
- lookup := out.Status.BundleLookups[i]
+ for i := 0; i < len(outBundleLookups); i++ {
+ lookup := outBundleLookups[i]
res, err := o.bundleUnpacker.UnpackBundle(&lookup, unpackTimeout)
if err != nil {
errs = append(errs, err)
continue
}
- out.Status.BundleLookups[i] = *res.BundleLookup
+ outBundleLookups[i] = *res.BundleLookup
// if the failed condition is present it means the bundle unpacking has failed
- failedCondition := res.GetCondition(bundle.BundleLookupFailed)
+ failedCondition := res.GetCondition(v1alpha1.BundleLookupFailed)
if failedCondition.Status == corev1.ConditionTrue {
unpacked = false
continue
@@ -1455,11 +1539,11 @@ func (o *Operator) unpackBundles(plan *v1alpha1.InstallPlan) (bool, *v1alpha1.In
continue
}
- // Ensure that bundle can be applied by the current version of OLM by converting to steps
- steps, err := resolver.NewStepsFromBundle(res.Bundle(), out.GetNamespace(), res.Replaces, res.CatalogSourceRef.Name, res.CatalogSourceRef.Namespace)
+ // Ensure that bundle can be applied by the current version of OLM by converting to bundleSteps
+ bundleSteps, err := resolver.NewStepsFromBundle(res.Bundle(), namespace, res.Replaces, res.CatalogSourceRef.Name, res.CatalogSourceRef.Namespace)
if err != nil {
if fatal := olmerrors.IsFatal(err); fatal {
- return false, nil, err
+ return false, nil, nil, err
}
errs = append(errs, fmt.Errorf("failed to turn bundle into steps: %v", err))
@@ -1468,7 +1552,7 @@ func (o *Operator) unpackBundles(plan *v1alpha1.InstallPlan) (bool, *v1alpha1.In
}
// step manifests are replaced with references to the configmap containing them
- for i, s := range steps {
+ for i, s := range bundleSteps {
ref := UnpackedBundleReference{
Kind: "ConfigMap",
Namespace: res.CatalogSourceRef.Namespace,
@@ -1485,19 +1569,19 @@ func (o *Operator) unpackBundles(plan *v1alpha1.InstallPlan) (bool, *v1alpha1.In
continue
}
s.Resource.Manifest = string(r)
- steps[i] = s
+ bundleSteps[i] = s
}
res.RemoveCondition(resolver.BundleLookupConditionPacked)
- out.Status.BundleLookups[i] = *res.BundleLookup
- out.Status.Plan = append(out.Status.Plan, steps...)
+ outBundleLookups[i] = *res.BundleLookup
+ outInstallPlanSteps = append(outInstallPlanSteps, bundleSteps...)
}
if err := utilerrors.NewAggregate(errs); err != nil {
o.logger.Debugf("failed to unpack bundles: %v", err)
- return false, nil, err
+ return false, nil, nil, err
}
- return unpacked, out, nil
+ return unpacked, outInstallPlanSteps, outBundleLookups, nil
}
// gcInstallPlans garbage collects installplans that are too old
@@ -1599,7 +1683,6 @@ func (o *Operator) syncInstallPlans(obj interface{}) (syncError error) {
querier := o.serviceAccountQuerier.NamespaceQuerier(plan.GetNamespace())
ref, err := querier()
-
out := plan.DeepCopy()
if err != nil {
// Set status condition/message and retry sync if any error
@@ -1645,65 +1728,6 @@ func (o *Operator) syncInstallPlans(obj interface{}) (syncError error) {
}
}
- // Attempt to unpack bundles before installing
- // Note: This should probably use the attenuated client to prevent users from resolving resources they otherwise don't have access to.
- if len(plan.Status.BundleLookups) > 0 {
- unpacked, out, err := o.unpackBundles(plan)
- if err != nil {
- // If the error was fatal capture and fail
- if fatal := olmerrors.IsFatal(err); fatal {
- if err := o.transitionInstallPlanToFailed(plan, logger, v1alpha1.InstallPlanReasonInstallCheckFailed, err.Error()); err != nil {
- // retry for failure to update status
- syncError = err
- return
- }
- }
- // Retry sync if non-fatal error
- syncError = fmt.Errorf("bundle unpacking failed: %v", err)
- return
- }
-
- if !reflect.DeepEqual(plan.Status, out.Status) {
- logger.Warnf("status not equal, updating...")
- if _, err := o.client.OperatorsV1alpha1().InstallPlans(out.GetNamespace()).UpdateStatus(context.TODO(), out, metav1.UpdateOptions{}); err != nil {
- syncError = fmt.Errorf("failed to update installplan bundle lookups: %v", err)
- }
-
- return
- }
-
- // Check BundleLookup status conditions to see if the BundleLookupPending condtion is false
- // which means bundle lookup has failed and the InstallPlan should be failed as well
- isFailed, cond := hasBundleLookupFailureCondition(plan)
- if isFailed {
- err := fmt.Errorf("bundle unpacking failed. Reason: %v, and Message: %v", cond.Reason, cond.Message)
- // Mark the InstallPlan as failed for a fatal bundle unpack error
- logger.Infof("%v", err)
-
- if err := o.transitionInstallPlanToFailed(plan, logger, v1alpha1.InstallPlanReasonInstallCheckFailed, err.Error()); err != nil {
- // retry for failure to update status
- syncError = err
- return
- }
-
- // Requeue subscription to propagate SubscriptionInstallPlanFailed condtion to subscription
- o.requeueSubscriptionForInstallPlan(plan, logger)
- return
- }
-
- // TODO: Remove in favor of job and configmap informer requeuing
- if !unpacked {
- err := o.ipQueueSet.RequeueAfter(plan.GetNamespace(), plan.GetName(), 5*time.Second)
- if err != nil {
- syncError = err
- return
- }
- logger.Debug("install plan not yet populated from bundle image, requeueing")
-
- return
- }
- }
-
outInstallPlan, syncError := transitionInstallPlanState(logger.Logger, o, *plan, o.now(), o.installPlanTimeout)
if syncError != nil {
@@ -1731,10 +1755,10 @@ func (o *Operator) syncInstallPlans(obj interface{}) (syncError error) {
return
}
-func hasBundleLookupFailureCondition(plan *v1alpha1.InstallPlan) (bool, *v1alpha1.BundleLookupCondition) {
- for _, bundleLookup := range plan.Status.BundleLookups {
+func hasBundleLookupFailureCondition(bundleLookups []v1alpha1.BundleLookup) (bool, *v1alpha1.BundleLookupCondition) {
+ for _, bundleLookup := range bundleLookups {
for _, cond := range bundleLookup.Conditions {
- if cond.Type == bundle.BundleLookupFailed && cond.Status == corev1.ConditionTrue {
+ if cond.Type == v1alpha1.BundleLookupFailed && cond.Status == corev1.ConditionTrue {
return true, &cond
}
}
@@ -1742,27 +1766,6 @@ func hasBundleLookupFailureCondition(plan *v1alpha1.InstallPlan) (bool, *v1alpha
return false, nil
}
-func (o *Operator) transitionInstallPlanToFailed(plan *v1alpha1.InstallPlan, logger logrus.FieldLogger, reason v1alpha1.InstallPlanConditionReason, message string) error {
- now := o.now()
- out := plan.DeepCopy()
- out.Status.SetCondition(v1alpha1.ConditionFailed(v1alpha1.InstallPlanInstalled,
- reason, message, &now))
- out.Status.Phase = v1alpha1.InstallPlanPhaseFailed
-
- logger.Info("transitioning InstallPlan to failed")
- _, err := o.client.OperatorsV1alpha1().InstallPlans(plan.GetNamespace()).UpdateStatus(context.TODO(), out, metav1.UpdateOptions{})
- if err == nil {
- return nil
- }
-
- updateErr := errors.New("error updating InstallPlan status: " + err.Error())
- logger = logger.WithField("updateError", updateErr)
- logger.Errorf("error transitioning InstallPlan to failed")
-
- // retry sync with error to update InstallPlan status
- return fmt.Errorf("installplan failed: %s and error updating InstallPlan status as failed: %s", message, updateErr)
-}
-
func (o *Operator) requeueSubscriptionForInstallPlan(plan *v1alpha1.InstallPlan, logger *logrus.Entry) {
// Notify subscription loop of installplan changes
owners := ownerutil.GetOwnersByKind(plan, v1alpha1.SubscriptionKind)
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go
index 903be19679..cdf31e4d5a 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go
@@ -5,8 +5,8 @@ import (
"encoding/json"
"errors"
"fmt"
- "io/ioutil"
"math/rand"
+ "os"
"reflect"
"strings"
"testing"
@@ -49,6 +49,8 @@ import (
"github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake"
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions"
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle"
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle/bundlefakes"
olmerrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc"
@@ -1125,19 +1127,25 @@ func TestSyncCatalogSources(t *testing.T) {
func TestSyncResolvingNamespace(t *testing.T) {
clockFake := utilclocktesting.NewFakeClock(time.Date(2018, time.January, 26, 20, 40, 0, 0, time.UTC))
+ now := metav1.NewTime(clockFake.Now())
testNamespace := "testNamespace"
+ og := &operatorsv1.OperatorGroup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: testNamespace,
+ },
+ }
type fields struct {
- clientOptions []clientfake.Option
- sourcesLastUpdate metav1.Time
- resolveErr error
- existingOLMObjs []runtime.Object
- existingObjects []runtime.Object
+ clientOptions []clientfake.Option
+ resolveErr error
+ existingOLMObjs []runtime.Object
}
tests := []struct {
- name string
- fields fields
- wantErr error
+ name string
+ fields fields
+ wantSubscriptions []*v1alpha1.Subscription
+ wantErr error
}{
{
name: "NoError",
@@ -1164,6 +1172,33 @@ func TestSyncResolvingNamespace(t *testing.T) {
},
},
},
+ wantSubscriptions: []*v1alpha1.Subscription{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ Conditions: []v1alpha1.SubscriptionCondition{
+ {
+ Type: v1alpha1.SubscriptionBundleUnpacking,
+ Status: corev1.ConditionFalse,
+ },
+ },
+ LastUpdated: now,
+ },
+ },
+ },
},
{
name: "NotSatisfiableError",
@@ -1196,6 +1231,35 @@ func TestSyncResolvingNamespace(t *testing.T) {
},
},
},
+ wantSubscriptions: []*v1alpha1.Subscription{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ Conditions: []v1alpha1.SubscriptionCondition{
+ {
+ Type: v1alpha1.SubscriptionResolutionFailed,
+ Reason: "ConstraintsNotSatisfiable",
+ Message: "constraints not satisfiable: something",
+ Status: corev1.ConditionTrue,
+ },
+ },
+ LastUpdated: now,
+ },
+ },
+ },
},
{
name: "OtherError",
@@ -1232,6 +1296,35 @@ func TestSyncResolvingNamespace(t *testing.T) {
},
resolveErr: fmt.Errorf("some error"),
},
+ wantSubscriptions: []*v1alpha1.Subscription{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ Conditions: []v1alpha1.SubscriptionCondition{
+ {
+ Type: v1alpha1.SubscriptionResolutionFailed,
+ Reason: "ErrorPreventedResolution",
+ Message: "some error",
+ Status: corev1.ConditionTrue,
+ },
+ },
+ LastUpdated: now,
+ },
+ },
+ },
wantErr: fmt.Errorf("some error"),
},
}
@@ -1241,7 +1334,7 @@ func TestSyncResolvingNamespace(t *testing.T) {
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
- o, err := NewFakeOperator(ctx, testNamespace, []string{testNamespace}, withClock(clockFake), withClientObjs(tt.fields.existingOLMObjs...), withK8sObjs(tt.fields.existingObjects...), withFakeClientOptions(tt.fields.clientOptions...))
+ o, err := NewFakeOperator(ctx, testNamespace, []string{testNamespace}, withClock(clockFake), withClientObjs(append(tt.fields.existingOLMObjs, og)...), withFakeClientOptions(tt.fields.clientOptions...))
require.NoError(t, err)
o.reconciler = &fakes.FakeRegistryReconcilerFactory{
@@ -1254,7 +1347,6 @@ func TestSyncResolvingNamespace(t *testing.T) {
},
}
- o.sourcesLastUpdate.Set(tt.fields.sourcesLastUpdate.Time)
o.resolver = &fakes.FakeStepResolver{
ResolveStepsStub: func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) {
return nil, nil, nil, tt.fields.resolveErr
@@ -1273,6 +1365,12 @@ func TestSyncResolvingNamespace(t *testing.T) {
} else {
require.NoError(t, err)
}
+
+ for _, s := range tt.wantSubscriptions {
+ fetched, err := o.client.OperatorsV1alpha1().Subscriptions(testNamespace).Get(context.TODO(), s.GetName(), metav1.GetOptions{})
+ require.NoError(t, err)
+ require.Equal(t, s, fetched)
+ }
})
}
}
@@ -1333,7 +1431,8 @@ func TestCompetingCRDOwnersExist(t *testing.T) {
expectedResult: true,
},
}
- for _, tt := range tests {
+ for _, xt := range tests {
+ tt := xt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
@@ -1353,7 +1452,7 @@ func TestCompetingCRDOwnersExist(t *testing.T) {
func TestValidateExistingCRs(t *testing.T) {
unstructuredForFile := func(file string) *unstructured.Unstructured {
- data, err := ioutil.ReadFile(file)
+ data, err := os.ReadFile(file)
require.NoError(t, err)
dec := utilyaml.NewYAMLOrJSONDecoder(strings.NewReader(string(data)), 30)
k8sFile := &unstructured.Unstructured{}
@@ -1362,7 +1461,7 @@ func TestValidateExistingCRs(t *testing.T) {
}
unversionedCRDForV1beta1File := func(file string) *apiextensions.CustomResourceDefinition {
- data, err := ioutil.ReadFile(file)
+ data, err := os.ReadFile(file)
require.NoError(t, err)
dec := utilyaml.NewYAMLOrJSONDecoder(strings.NewReader(string(data)), 30)
k8sFile := &apiextensionsv1beta1.CustomResourceDefinition{}
@@ -1476,17 +1575,18 @@ func fakeConfigMapData() map[string]string {
// fakeOperatorConfig is the configuration for a fake operator.
type fakeOperatorConfig struct {
- clock utilclock.Clock
- clientObjs []runtime.Object
- k8sObjs []runtime.Object
- extObjs []runtime.Object
- regObjs []runtime.Object
- clientOptions []clientfake.Option
- logger *logrus.Logger
- resolver resolver.StepResolver
- recorder record.EventRecorder
- reconciler reconciler.RegistryReconcilerFactory
- sources []sourceAddress
+ clock utilclock.Clock
+ clientObjs []runtime.Object
+ k8sObjs []runtime.Object
+ extObjs []runtime.Object
+ regObjs []runtime.Object
+ clientOptions []clientfake.Option
+ logger *logrus.Logger
+ resolver resolver.StepResolver
+ recorder record.EventRecorder
+ reconciler reconciler.RegistryReconcilerFactory
+ bundleUnpacker bundle.Unpacker
+ sources []sourceAddress
}
// fakeOperatorOption applies an option to the given fake operator configuration.
@@ -1498,6 +1598,12 @@ func withResolver(res resolver.StepResolver) fakeOperatorOption {
}
}
+func withBundleUnpacker(bundleUnpacker bundle.Unpacker) fakeOperatorOption {
+ return func(config *fakeOperatorConfig) {
+ config.bundleUnpacker = bundleUnpacker
+ }
+}
+
func withSources(sources ...sourceAddress) fakeOperatorOption {
return func(config *fakeOperatorConfig) {
config.sources = sources
@@ -1543,10 +1649,11 @@ type sourceAddress struct {
func NewFakeOperator(ctx context.Context, namespace string, namespaces []string, fakeOptions ...fakeOperatorOption) (*Operator, error) {
// Apply options to default config
config := &fakeOperatorConfig{
- logger: logrus.StandardLogger(),
- clock: utilclock.RealClock{},
- resolver: &fakes.FakeStepResolver{},
- recorder: &record.FakeRecorder{},
+ logger: logrus.StandardLogger(),
+ clock: utilclock.RealClock{},
+ resolver: &fakes.FakeStepResolver{},
+ recorder: &record.FakeRecorder{},
+ bundleUnpacker: &bundlefakes.FakeUnpacker{},
}
for _, option := range fakeOptions {
option(config)
@@ -1585,12 +1692,14 @@ func NewFakeOperator(ctx context.Context, namespace string, namespaces []string,
subInformer := operatorsFactory.Operators().V1alpha1().Subscriptions()
ipInformer := operatorsFactory.Operators().V1alpha1().InstallPlans()
csvInformer := operatorsFactory.Operators().V1alpha1().ClusterServiceVersions()
- sharedInformers = append(sharedInformers, catsrcInformer.Informer(), subInformer.Informer(), ipInformer.Informer(), csvInformer.Informer())
+ ogInformer := operatorsFactory.Operators().V1().OperatorGroups()
+ sharedInformers = append(sharedInformers, catsrcInformer.Informer(), subInformer.Informer(), ipInformer.Informer(), csvInformer.Informer(), ogInformer.Informer())
lister.OperatorsV1alpha1().RegisterCatalogSourceLister(metav1.NamespaceAll, catsrcInformer.Lister())
lister.OperatorsV1alpha1().RegisterSubscriptionLister(metav1.NamespaceAll, subInformer.Lister())
lister.OperatorsV1alpha1().RegisterInstallPlanLister(metav1.NamespaceAll, ipInformer.Lister())
lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(metav1.NamespaceAll, csvInformer.Lister())
+ lister.OperatorsV1().RegisterOperatorGroupLister(metav1.NamespaceAll, ogInformer.Lister())
factory := informers.NewSharedInformerFactoryWithOptions(opClientFake.KubernetesInterface(), wakeupInterval, informers.WithNamespace(metav1.NamespaceAll))
roleInformer := factory.Rbac().V1().Roles()
@@ -1638,6 +1747,7 @@ func NewFakeOperator(ctx context.Context, namespace string, namespaces []string,
recorder: config.recorder,
clientAttenuator: scoped.NewClientAttenuator(logger, &rest.Config{}, opClientFake),
serviceAccountQuerier: scoped.NewUserDefinedServiceAccountQuerier(logger, clientFake),
+ bundleUnpacker: config.bundleUnpacker,
catsrcQueueSet: queueinformer.NewEmptyResourceQueueSet(),
clientFactory: &stubClientFactory{
operatorClient: opClientFake,
@@ -1792,7 +1902,7 @@ func objectReference(name string) *corev1.ObjectReference {
}
func yamlFromFilePath(t *testing.T, fileName string) string {
- yaml, err := ioutil.ReadFile(fileName)
+ yaml, err := os.ReadFile(fileName)
require.NoError(t, err)
return string(yaml)
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go
index 48d84e0b1a..b84d24c9e1 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go
@@ -2,6 +2,7 @@ package catalog
import (
"context"
+ "errors"
"fmt"
"testing"
"time"
@@ -10,9 +11,13 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/runtime"
+ utilerrors "k8s.io/apimachinery/pkg/util/errors"
utilclocktesting "k8s.io/utils/clock/testing"
+ operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
"github.com/operator-framework/api/pkg/operators/v1alpha1"
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle"
+ "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle/bundlefakes"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver"
"github.com/operator-framework/operator-lifecycle-manager/pkg/fakes"
@@ -23,16 +28,20 @@ func TestSyncSubscriptions(t *testing.T) {
clockFake := utilclocktesting.NewFakeClock(time.Date(2018, time.January, 26, 20, 40, 0, 0, time.UTC))
now := metav1.NewTime(clockFake.Now())
testNamespace := "testNamespace"
+ og := &operatorsv1.OperatorGroup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: testNamespace,
+ },
+ }
type fields struct {
- clientOptions []clientfake.Option
- sourcesLastUpdate metav1.Time
- resolveSteps []*v1alpha1.Step
- resolveSubs []*v1alpha1.Subscription
- bundleLookups []v1alpha1.BundleLookup
- resolveErr error
- existingOLMObjs []runtime.Object
- existingObjects []runtime.Object
+ clientOptions []clientfake.Option
+ resolveSteps []*v1alpha1.Step
+ resolveSubs []*v1alpha1.Subscription
+ resolveBundleLookups []v1alpha1.BundleLookup
+ unpackBundleErr error
+ existingOLMObjs []runtime.Object
}
type args struct {
obj interface{}
@@ -378,7 +387,7 @@ func TestSyncSubscriptions(t *testing.T) {
},
},
},
- bundleLookups: []v1alpha1.BundleLookup{
+ resolveBundleLookups: []v1alpha1.BundleLookup{
{
Path: "bundle-path-a",
Identifier: "bundle-a",
@@ -388,11 +397,10 @@ func TestSyncSubscriptions(t *testing.T) {
},
Conditions: []v1alpha1.BundleLookupCondition{
{
- Type: v1alpha1.BundleLookupPending,
- Status: corev1.ConditionTrue,
- Reason: "JobIncomplete",
- Message: "unpack job not completed",
- LastTransitionTime: &now,
+ Type: v1alpha1.BundleLookupPending,
+ Status: corev1.ConditionTrue,
+ Reason: "JobIncomplete",
+ Message: "unpack job not completed",
},
},
},
@@ -433,56 +441,203 @@ func TestSyncSubscriptions(t *testing.T) {
CatalogSourceNamespace: testNamespace,
},
Status: v1alpha1.SubscriptionStatus{
- CurrentCSV: "",
- State: v1alpha1.SubscriptionStateUpgradePending,
- Install: &v1alpha1.InstallPlanReference{
- Kind: v1alpha1.InstallPlanKind,
- APIVersion: v1alpha1.InstallPlanAPIVersion,
+ CurrentCSV: "",
+ State: "",
+ LastUpdated: now,
+ Conditions: []v1alpha1.SubscriptionCondition{
+ {
+ Type: v1alpha1.SubscriptionBundleUnpacking,
+ Status: corev1.ConditionTrue,
+ Reason: "UnpackingInProgress",
+ },
},
- InstallPlanRef: &corev1.ObjectReference{
- Namespace: testNamespace,
- Kind: v1alpha1.InstallPlanKind,
- APIVersion: v1alpha1.InstallPlanAPIVersion,
+ },
+ },
+ },
+ },
+ {
+ name: "NoStatus/NoCurrentCSV/BundleUnpackFailed",
+ fields: fields{
+ clientOptions: []clientfake.Option{clientfake.WithSelfLinks(t)},
+ existingOLMObjs: []runtime.Object{
+ &v1alpha1.Subscription{
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ },
+ },
+ },
+ resolveSubs: []*v1alpha1.Subscription{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: v1alpha1.SubscriptionStateUpgradePending,
+ },
+ },
+ },
+ resolveBundleLookups: []v1alpha1.BundleLookup{
+ {
+ Path: "bundle-path-a",
+ Identifier: "bundle-a",
+ CatalogSourceRef: &corev1.ObjectReference{
+ Namespace: testNamespace,
+ Name: "src",
+ },
+ Conditions: []v1alpha1.BundleLookupCondition{
+ {
+ Type: v1alpha1.BundleLookupFailed,
+ Status: corev1.ConditionTrue,
+ Reason: "JobFailed",
+ Message: "unpack job failed",
+ LastTransitionTime: &now,
+ },
},
- InstallPlanGeneration: 1,
- LastUpdated: now,
},
},
},
- wantInstallPlans: []v1alpha1.InstallPlan{
+ args: args{
+ obj: &v1alpha1.Subscription{
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ },
+ },
+ },
+ wantSubscriptions: []*v1alpha1.Subscription{
{
- Spec: v1alpha1.InstallPlanSpec{
- ClusterServiceVersionNames: []string{"bundle-a"},
- Approval: v1alpha1.ApprovalAutomatic,
- Approved: true,
- Generation: 1,
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SubscriptionCRDAPIVersion,
},
- Status: v1alpha1.InstallPlanStatus{
- Phase: v1alpha1.InstallPlanPhaseInstalling,
- CatalogSources: []string{},
- BundleLookups: []v1alpha1.BundleLookup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ LastUpdated: now,
+ Conditions: []v1alpha1.SubscriptionCondition{
{
- Path: "bundle-path-a",
- Identifier: "bundle-a",
- CatalogSourceRef: &corev1.ObjectReference{
- Namespace: testNamespace,
- Name: "src",
- },
- Conditions: []v1alpha1.BundleLookupCondition{
- {
- Type: v1alpha1.BundleLookupPending,
- Status: corev1.ConditionTrue,
- Reason: "JobIncomplete",
- Message: "unpack job not completed",
- LastTransitionTime: &now,
- },
- },
+ Type: v1alpha1.SubscriptionBundleUnpackFailed,
+ Reason: "BundleUnpackFailed",
+ Message: "bundle unpacking failed. Reason: JobFailed, and Message: unpack job failed",
+ Status: corev1.ConditionTrue,
},
},
},
},
},
},
+ {
+ name: "NoStatus/NoCurrentCSV/BundleLookupError",
+ fields: fields{
+ clientOptions: []clientfake.Option{clientfake.WithSelfLinks(t)},
+ existingOLMObjs: []runtime.Object{
+ &v1alpha1.Subscription{
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ },
+ },
+ },
+ resolveBundleLookups: []v1alpha1.BundleLookup{{}},
+ unpackBundleErr: errors.New("fake unpack error"),
+ },
+ args: args{
+ obj: &v1alpha1.Subscription{
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SchemeGroupVersion.String(),
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ },
+ },
+ },
+ wantSubscriptions: []*v1alpha1.Subscription{
+ {
+ TypeMeta: metav1.TypeMeta{
+ Kind: v1alpha1.SubscriptionKind,
+ APIVersion: v1alpha1.SubscriptionCRDAPIVersion,
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "sub",
+ Namespace: testNamespace,
+ },
+ Spec: &v1alpha1.SubscriptionSpec{
+ CatalogSource: "src",
+ CatalogSourceNamespace: testNamespace,
+ },
+ Status: v1alpha1.SubscriptionStatus{
+ CurrentCSV: "",
+ State: "",
+ },
+ },
+ },
+ wantErr: fmt.Errorf("bundle unpacking failed with an error: %w", utilerrors.NewAggregate([]error{errors.New("fake unpack error")})),
+ },
{
name: "Status/HaveCurrentCSV/UpdateFoundInCatalog",
fields: fields{
@@ -1016,7 +1171,12 @@ func TestSyncSubscriptions(t *testing.T) {
ctx, cancel := context.WithCancel(context.TODO())
defer cancel()
- o, err := NewFakeOperator(ctx, testNamespace, []string{testNamespace}, withClock(clockFake), withClientObjs(tt.fields.existingOLMObjs...), withK8sObjs(tt.fields.existingObjects...), withFakeClientOptions(tt.fields.clientOptions...))
+ fakeBundleUnpacker := &bundlefakes.FakeUnpacker{
+ UnpackBundleStub: func(lookup *v1alpha1.BundleLookup, timeout time.Duration) (*bundle.BundleUnpackResult, error) {
+ return &bundle.BundleUnpackResult{BundleLookup: lookup.DeepCopy()}, tt.fields.unpackBundleErr
+ },
+ }
+ o, err := NewFakeOperator(ctx, testNamespace, []string{testNamespace}, withClock(clockFake), withClientObjs(append(tt.fields.existingOLMObjs, og)...), withFakeClientOptions(tt.fields.clientOptions...), withBundleUnpacker(fakeBundleUnpacker))
require.NoError(t, err)
o.reconciler = &fakes.FakeRegistryReconcilerFactory{
@@ -1029,10 +1189,9 @@ func TestSyncSubscriptions(t *testing.T) {
},
}
- o.sourcesLastUpdate.Set(tt.fields.sourcesLastUpdate.Time)
o.resolver = &fakes.FakeStepResolver{
ResolveStepsStub: func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) {
- return tt.fields.resolveSteps, tt.fields.bundleLookups, tt.fields.resolveSubs, tt.fields.resolveErr
+ return tt.fields.resolveSteps, tt.fields.resolveBundleLookups, tt.fields.resolveSubs, nil
},
}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go
index 6964fe9917..18de7df998 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go
@@ -1246,7 +1246,7 @@ func (a *Operator) removeDanglingChildCSVs(csv *v1alpha1.ClusterServiceVersion)
func (a *Operator) deleteChild(csv *v1alpha1.ClusterServiceVersion, logger *logrus.Entry) error {
logger.Debug("gcing csv")
- return a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Delete(context.TODO(), csv.GetName(), *metav1.NewDeleteOptions(0))
+ return a.client.OperatorsV1alpha1().ClusterServiceVersions(csv.GetNamespace()).Delete(context.TODO(), csv.GetName(), metav1.DeleteOptions{})
}
// syncClusterServiceVersion is the method that gets called when we see a CSV event in the cluster
@@ -2287,7 +2287,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v
syncError = fmt.Errorf("marked as replacement, but no replacement CSV found in cluster")
}
case v1alpha1.CSVPhaseDeleting:
- syncError = a.client.OperatorsV1alpha1().ClusterServiceVersions(out.GetNamespace()).Delete(context.TODO(), out.GetName(), *metav1.NewDeleteOptions(0))
+ syncError = a.client.OperatorsV1alpha1().ClusterServiceVersions(out.GetNamespace()).Delete(context.TODO(), out.GetName(), metav1.DeleteOptions{})
if syncError != nil {
logger.Debugf("unable to get delete csv marked for deletion: %s", syncError.Error())
}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go
index f3fba8603f..8377073c23 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go
@@ -3852,7 +3852,8 @@ func TestUpdates(t *testing.T) {
in: []*v1alpha1.ClusterServiceVersion{c, a, b},
},
}
- for _, tt := range tests {
+ for _, xt := range tests {
+ tt := xt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
@@ -3923,9 +3924,10 @@ func TestUpdates(t *testing.T) {
simulateSuccessfulRollout(current, op.opClient)
}
for current.Status.Phase != e.whenIn.phase {
- fmt.Printf("waiting for (when) %s to be %s\n", e.whenIn.name, e.whenIn.phase)
csvsToSync = syncCSVs(csvsToSync, deletedCSVs(e.shouldBe))
current = csvsToSync[e.whenIn.name]
+ fmt.Printf("waiting for (when) %s to be %s\n", e.whenIn.name, e.whenIn.phase)
+ time.Sleep(1 * time.Millisecond)
}
// sync the other csvs until they're in the expected status
diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject/inject.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject/inject.go
index 50432767c9..8d105fbfa5 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject/inject.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/overrides/inject/inject.go
@@ -235,10 +235,12 @@ func InjectNodeSelectorIntoDeployment(podSpec *corev1.PodSpec, nodeSelector map[
// with the given corev1.Affinity. Any nil top-level sub-attributes (e.g. NodeAffinity, PodAffinity, and PodAntiAffinity)
// will be ignored. Hint: to overwrite those top-level attributes, empty them out. I.e. use the empty/default object ({})
// e.g. NodeAffinity{}. In yaml:
-// affinity:
-// nodeAffinity: {}
-// podAffinity: {}
-// podAntiAffinity: {}
+//
+// affinity:
+// nodeAffinity: {}
+// podAffinity: {}
+// podAntiAffinity: {}
+//
// will completely remove the deployment podSpec.affinity and is equivalent to
// affinity: {}
func OverrideDeploymentAffinity(podSpec *corev1.PodSpec, affinity *corev1.Affinity) error {
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go
index ebcbd86849..dfb7b87049 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go
@@ -214,6 +214,11 @@ func Pod(source *operatorsv1alpha1.CatalogSource, name string, img string, saNam
pod.Spec.Tolerations[index] = *toleration.DeepCopy()
}
}
+
+ // Override affinity
+ if grpcPodConfig.Affinity != nil {
+ pod.Spec.Affinity = grpcPodConfig.Affinity.DeepCopy()
+ }
}
// Set priorityclass if its annotation exists
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go
index cc6035fe7d..eafb629f48 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go
@@ -254,11 +254,33 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
}
+ var overriddenAffinity = &corev1.Affinity{
+ NodeAffinity: &corev1.NodeAffinity{
+ RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{
+ NodeSelectorTerms: []corev1.NodeSelectorTerm{
+ {
+ MatchExpressions: []corev1.NodeSelectorRequirement{
+ {
+ Key: "kubernetes.io/arch",
+ Operator: corev1.NodeSelectorOpIn,
+ Values: []string{
+ "amd64",
+ "arm",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+
testCases := []struct {
title string
catalogSource *v1alpha1.CatalogSource
expectedNodeSelectors map[string]string
expectedTolerations []corev1.Toleration
+ expectedAffinity *corev1.Affinity
expectedPriorityClassName string
annotations map[string]string
}{
@@ -275,6 +297,7 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: nil,
+ expectedAffinity: nil,
expectedPriorityClassName: defaultPriorityClassName,
expectedNodeSelectors: defaultNodeSelectors,
}, {
@@ -293,6 +316,7 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: nil,
+ expectedAffinity: nil,
expectedPriorityClassName: defaultPriorityClassName,
expectedNodeSelectors: overriddenNodeSelectors,
}, {
@@ -311,6 +335,7 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: nil,
+ expectedAffinity: nil,
expectedPriorityClassName: overriddenPriorityClassName,
expectedNodeSelectors: defaultNodeSelectors,
}, {
@@ -329,6 +354,7 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: nil,
+ expectedAffinity: nil,
expectedPriorityClassName: defaultPriorityClassName,
expectedNodeSelectors: defaultNodeSelectors,
}, {
@@ -347,6 +373,26 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: overriddenTolerations,
+ expectedAffinity: nil,
+ expectedPriorityClassName: defaultPriorityClassName,
+ expectedNodeSelectors: defaultNodeSelectors,
+ }, {
+ title: "Override affinity",
+ catalogSource: &v1alpha1.CatalogSource{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "test",
+ Namespace: "testns",
+ },
+ Spec: v1alpha1.CatalogSourceSpec{
+ SourceType: v1alpha1.SourceTypeGrpc,
+ Image: "repo/image:tag",
+ GrpcPodConfig: &v1alpha1.GrpcPodConfig{
+ Affinity: overriddenAffinity,
+ },
+ },
+ },
+ expectedTolerations: nil,
+ expectedAffinity: overriddenAffinity,
expectedPriorityClassName: defaultPriorityClassName,
expectedNodeSelectors: defaultNodeSelectors,
}, {
@@ -363,10 +409,12 @@ func TestPodSchedulingOverrides(t *testing.T) {
NodeSelector: overriddenNodeSelectors,
PriorityClassName: &overriddenPriorityClassName,
Tolerations: overriddenTolerations,
+ Affinity: overriddenAffinity,
},
},
},
expectedTolerations: overriddenTolerations,
+ expectedAffinity: overriddenAffinity,
expectedPriorityClassName: overriddenPriorityClassName,
expectedNodeSelectors: overriddenNodeSelectors,
}, {
@@ -385,6 +433,7 @@ func TestPodSchedulingOverrides(t *testing.T) {
},
},
expectedTolerations: nil,
+ expectedAffinity: nil,
annotations: map[string]string{
CatalogPriorityClassKey: "some-OTHER-prio-class",
},
@@ -398,5 +447,6 @@ func TestPodSchedulingOverrides(t *testing.T) {
require.Equal(t, testCase.expectedNodeSelectors, pod.Spec.NodeSelector)
require.Equal(t, testCase.expectedPriorityClassName, pod.Spec.PriorityClassName)
require.Equal(t, testCase.expectedTolerations, pod.Spec.Tolerations)
+ require.Equal(t, testCase.expectedAffinity, pod.Spec.Affinity)
}
}
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fail_forward.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fail_forward.go
index ba522ba9c3..fe1575c647 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fail_forward.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fail_forward.go
@@ -17,8 +17,8 @@ import (
// backwards compatible.
func IsFailForwardEnabled(ogLister v1listers.OperatorGroupNamespaceLister) (bool, error) {
ogs, err := ogLister.List(labels.Everything())
- if err != nil || len(ogs) == 0 {
- return false, nil
+ if err != nil {
+ return false, err
}
if len(ogs) != 1 {
return false, fmt.Errorf("found %d operatorGroups, expected 1", len(ogs))
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go
index 8c95fb5078..86bfaf282a 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go
@@ -12,8 +12,10 @@ import (
"github.com/sirupsen/logrus/hooks/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"github.com/operator-framework/api/pkg/constraints"
+ operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
"github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver"
@@ -1373,6 +1375,12 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) {
namespace := "olm"
catalog := cache.SourceKey{Name: "community", Namespace: namespace}
+ og := &operatorsv1.OperatorGroup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: namespace,
+ },
+ }
phases := []struct {
subs []*v1alpha1.Subscription
@@ -1442,7 +1450,7 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) {
key: cache.NewVirtualSourceKey(namespace),
csvLister: &csvs,
subLister: fakeSubscriptionLister(p.subs),
- ogLister: fakeOperatorGroupLister{},
+ ogLister: fakeOperatorGroupLister{og},
logger: logger,
},
}),
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_csvs_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_csvs_test.go
index 22d226669e..56ae33415d 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_csvs_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_csvs_test.go
@@ -467,6 +467,12 @@ func (f fakeOperatorGroupLister) Get(name string) (*operatorsv1.OperatorGroup, e
}
func TestPropertiesAnnotationHonored(t *testing.T) {
+ og := &operatorsv1.OperatorGroup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "og",
+ Namespace: "fake-ns",
+ },
+ }
src := &csvSource{
csvLister: fakeCSVLister{
&v1alpha1.ClusterServiceVersion{
@@ -478,7 +484,7 @@ func TestPropertiesAnnotationHonored(t *testing.T) {
},
},
subLister: fakeSubscriptionLister{},
- ogLister: fakeOperatorGroupLister{},
+ ogLister: fakeOperatorGroupLister{og},
}
ss, err := src.Snapshot(context.Background())
require.NoError(t, err)
diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go
index c75da4affc..528b163950 100644
--- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go
+++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go
@@ -335,6 +335,7 @@ func TestResolver(t *testing.T) {
name: "SubscriptionOmitsChannel",
clusterState: []runtime.Object{
newSub(namespace, "package", "", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -354,6 +355,7 @@ func TestResolver(t *testing.T) {
name: "SubscriptionWithNoCandidates/Error",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
out: resolverTestOut{
solverError: solver.NotSatisfiable{
@@ -372,6 +374,7 @@ func TestResolver(t *testing.T) {
name: "SubscriptionWithNoCandidatesInPackage/Error",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -395,6 +398,7 @@ func TestResolver(t *testing.T) {
name: "SubscriptionWithNoCandidatesInChannel/Error",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -418,6 +422,7 @@ func TestResolver(t *testing.T) {
name: "SubscriptionWithNoCandidatesWithStartingCSVName/Error",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog, withStartingCSV("notfound")),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -441,6 +446,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/NoDeps",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -460,6 +466,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/ResolveOne",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -482,6 +489,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/ResolveOne/BundlePath",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -528,6 +536,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/ResolveOne/AdditionalBundleObjects",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -550,6 +559,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/ResolveOne/AdditionalBundleObjects/Service",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -572,6 +582,7 @@ func TestResolver(t *testing.T) {
name: "SingleNewSubscription/DependencyMissing",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -606,6 +617,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -620,6 +632,7 @@ func TestResolver(t *testing.T) {
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingSub(namespace, "b.v1", "b", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -638,6 +651,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog),
newSub(namespace, "a", "beta", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -664,6 +678,7 @@ func TestResolver(t *testing.T) {
s.Name = s.Name + "-2"
return
}(),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -689,6 +704,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingOperator("ns1", "a.v1", "a", "alpha", "", nil, nil, nil, nil),
existingOperator("ns2", "a.v1", "a", "alpha", "", nil, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
out: nothing,
},
@@ -697,6 +713,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -718,6 +735,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
stripManifests(withBundlePath(bundle("a.v2", "a", "alpha", "a.v1", Provides1, nil, nil, nil), "quay.io/test/bundle@sha256:abcd"))},
@@ -759,6 +777,7 @@ func TestResolver(t *testing.T) {
name: "InstalledSub/NoRunningOperator",
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -778,6 +797,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -802,6 +822,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", nil, nil, Provides1, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -827,6 +848,7 @@ func TestResolver(t *testing.T) {
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
newSub(namespace, "b", "beta", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -851,6 +873,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
newSub(namespace, "b", "beta", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -873,6 +896,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
newSub(namespace, "b", "beta", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -898,6 +922,7 @@ func TestResolver(t *testing.T) {
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, Requires2, nil, nil),
existingSub(namespace, "b.v1", "b", "alpha", catalog),
existingOperator(namespace, "b.v1", "b", "alpha", "", Provides2, Requires1, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -924,6 +949,7 @@ func TestResolver(t *testing.T) {
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
existingSub(namespace, "b.v1", "b", "alpha", catalog),
existingOperator(namespace, "b.v1", "b", "alpha", "", nil, Requires1, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -946,6 +972,7 @@ func TestResolver(t *testing.T) {
name: "PicksOlderProvider",
clusterState: []runtime.Object{
newSub(namespace, "b", "alpha", catalog),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -970,6 +997,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v3", "a", "alpha", "a.v2", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")),
@@ -990,6 +1018,7 @@ func TestResolver(t *testing.T) {
existingSub(namespace, "b.v1", "b", "beta", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", nil, Requires1, nil, nil),
existingOperator(namespace, "b.v1", "b", "beta", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{
catalog: {
@@ -1015,6 +1044,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v2", "a", "alpha", "", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")),
@@ -1034,6 +1064,7 @@ func TestResolver(t *testing.T) {
name: "NewSub/StartingCSV",
clusterState: []runtime.Object{
newSub(namespace, "a", "alpha", catalog, withStartingCSV("a.v2")),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil),
@@ -1054,6 +1085,7 @@ func TestResolver(t *testing.T) {
clusterState: []runtime.Object{
existingSub(namespace, "a.v1", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v2", "a", "alpha", "", nil, nil, nil, nil, withVersion("1.0.0"), withSkips([]string{"a.v1"})),
@@ -1074,6 +1106,7 @@ func TestResolver(t *testing.T) {
existingSub(namespace, "a.v2", "a", "alpha", catalog),
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil, withPhase(v1alpha1.CSVPhaseReplacing)),
existingOperator(namespace, "a.v2", "a", "alpha", "a.v1", Provides1, nil, nil, nil, withPhase(v1alpha1.CSVPhaseFailed)),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil, withVersion("1.0.0")),
@@ -1121,6 +1154,7 @@ func TestResolver(t *testing.T) {
existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil, withPhase(v1alpha1.CSVPhaseReplacing)),
existingOperator(namespace, "a.v2", "a", "alpha", "a.v1", Provides1, nil, nil, nil, withPhase(v1alpha1.CSVPhaseReplacing)),
existingOperator(namespace, "a.v3", "a", "alpha", "a.v2", Provides1, nil, nil, nil, withPhase(v1alpha1.CSVPhaseFailed)),
+ newOperatorGroup("foo", namespace),
},
bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: {
bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil, withVersion("1.0.0")),
@@ -1182,7 +1216,7 @@ func TestResolver(t *testing.T) {
steps: [][]*v1alpha1.Step{},
subs: []*v1alpha1.Subscription{},
errAssert: func(t *testing.T, err error) {
- assert.Contains(t, err.Error(), "failed to populate resolver cache from source @existing/catsrc-namespace: csv catsrc-namespace/a.v1")
+ assert.Contains(t, err.Error(), "failed to populate resolver cache from source @existing/catsrc-namespace: csv")
assert.Contains(t, err.Error(), "in phase Failed instead of Replacing")
},
},
diff --git a/staging/operator-lifecycle-manager/pkg/lib/catalogsource/catalogsource_update.go b/staging/operator-lifecycle-manager/pkg/lib/catalogsource/catalogsource_update.go
index c8a58caaea..821ed00b96 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/catalogsource/catalogsource_update.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/catalogsource/catalogsource_update.go
@@ -12,7 +12,8 @@ import (
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
)
-/* UpdateStatus can be used to update the status of the provided catalog source. Note that
+/*
+UpdateStatus can be used to update the status of the provided catalog source. Note that
the caller is responsible for ensuring accurate status values in the catsrc argument (i.e.
the status is used as-is).
@@ -34,7 +35,8 @@ func UpdateStatus(logger *logrus.Entry, client versioned.Interface, catsrc *v1al
return nil
}
-/* UpdateStatusWithConditions can be used to update the status conditions for the provided catalog source.
+/*
+UpdateStatusWithConditions can be used to update the status conditions for the provided catalog source.
This function will make no changes to the other status fields (those fields will be used as-is).
If the provided conditions do not result in any status condition changes, then the API server will not be updated.
Note that the caller is responsible for ensuring accurate status values for all other fields.
@@ -71,7 +73,8 @@ func UpdateStatusWithConditions(logger *logrus.Entry, client versioned.Interface
return nil
}
-/* UpdateSpecAndStatusConditions can be used to update the catalog source with the provided status conditions.
+/*
+UpdateSpecAndStatusConditions can be used to update the catalog source with the provided status conditions.
This will update the spec and status portions of the catalog source. Calls to the API server will occur
even if the provided conditions result in no changes.
@@ -98,7 +101,8 @@ func UpdateSpecAndStatusConditions(logger *logrus.Entry, client versioned.Interf
return nil
}
-/* RemoveStatusConditions can be used to remove the status conditions for the provided catalog source.
+/*
+RemoveStatusConditions can be used to remove the status conditions for the provided catalog source.
This function will make no changes to the other status fields (those fields will be used as-is).
If the provided conditions do not result in any status condition changes, then the API server will not be updated.
Note that the caller is responsible for ensuring accurate status values for all other fields.
diff --git a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/fake_ssa.go b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/fake_ssa.go
index a7e04cb873..3044cd6d9b 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/fake_ssa.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/fake_ssa.go
@@ -35,8 +35,7 @@ type fakeStatusWriter struct {
k8scontrollerclient.StatusWriter
}
-func (c fakeStatusWriter) Patch(ctx context.Context, obj k8scontrollerclient.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.PatchOption) error {
- patch, opts = convertApplyToMergePatch(patch, opts...)
+func (c fakeStatusWriter) Patch(ctx context.Context, obj k8scontrollerclient.Object, patch k8scontrollerclient.Patch, opts ...k8scontrollerclient.SubResourcePatchOption) error {
return c.StatusWriter.Patch(ctx, obj, patch, opts...)
}
diff --git a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa.go b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa.go
index b13f923b3d..74eb4784e2 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/controller-runtime/client/ssa.go
@@ -87,13 +87,13 @@ type ServerSideApplier struct {
// The underlying value of the given resource pointer is updated to reflect the latest cluster state each time the closure is successfully invoked.
// Ex. Change the spec of an existing InstallPlan
//
-// plan := &InstallPlan{}
-// plan.SetNamespace("ns")
-// plan.SetName("install-123def")
-// Eventually(c.Apply(plan, func(p *v1alpha1.InstallPlan) error {
+// plan := &InstallPlan{}
+// plan.SetNamespace("ns")
+// plan.SetName("install-123def")
+// Eventually(c.Apply(plan, func(p *v1alpha1.InstallPlan) error {
// p.Spec.Approved = true
// return nil
-// })).Should(Succeed())
+// })).Should(Succeed())
func (c *ServerSideApplier) Apply(ctx context.Context, obj Object, changeFunc interface{}) func() error {
// Ensure given object is a pointer
objType := reflect.TypeOf(obj)
@@ -182,7 +182,10 @@ func (c *ServerSideApplier) Apply(ctx context.Context, obj Object, changeFunc in
return err
}
- if err := c.client.Status().Patch(ctx, cp, k8scontrollerclient.Apply, k8scontrollerclient.ForceOwnership, c.Owner); err != nil {
+ pos := &k8scontrollerclient.SubResourcePatchOptions{}
+ k8scontrollerclient.ForceOwnership.ApplyToPatch(&pos.PatchOptions)
+
+ if err := c.client.Status().Patch(ctx, cp, k8scontrollerclient.Apply, pos, c.Owner); err != nil {
fmt.Printf("second patch error: %s\n", err)
return err
}
diff --git a/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cabundle_updater.go b/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cabundle_updater.go
index 4fcee4e457..58f577ef45 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cabundle_updater.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cabundle_updater.go
@@ -2,7 +2,7 @@ package filemonitor
import (
"crypto/x509"
- "io/ioutil"
+ "os"
"sync"
"github.com/fsnotify/fsnotify"
@@ -16,7 +16,7 @@ type certPoolStore struct {
}
func NewCertPoolStore(clientCAPath string) (*certPoolStore, error) {
- pem, err := ioutil.ReadFile(clientCAPath)
+ pem, err := os.ReadFile(clientCAPath)
if err != nil {
return nil, err
}
@@ -31,7 +31,7 @@ func NewCertPoolStore(clientCAPath string) (*certPoolStore, error) {
}
func (c *certPoolStore) storeCABundle(clientCAPath string) error {
- pem, err := ioutil.ReadFile(clientCAPath)
+ pem, err := os.ReadFile(clientCAPath)
if err == nil {
c.mutex.Lock()
defer c.mutex.Unlock()
diff --git a/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cert_updater_test.go b/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cert_updater_test.go
index 022b22fc30..039e5ceac2 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cert_updater_test.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/filemonitor/cert_updater_test.go
@@ -6,7 +6,6 @@ import (
"crypto/x509"
"fmt"
"html"
- "io/ioutil"
"net"
"net/http"
"os"
@@ -88,7 +87,7 @@ func TestOLMGetCertRotationFn(t *testing.T) {
}
}()
- caCert, err := ioutil.ReadFile(caCrt)
+ caCert, err := os.ReadFile(caCrt)
require.NoError(t, err)
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
diff --git a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.conversion.go b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.conversion.go
index b3d5891bb7..04e9556e17 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.conversion.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.conversion.go
@@ -1,3 +1,4 @@
+//go:build !ignore_autogenerated
// +build !ignore_autogenerated
/*
diff --git a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.deepcopy.go b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.deepcopy.go
index 7bf8d13745..a4ff45d659 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.deepcopy.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.deepcopy.go
@@ -1,3 +1,4 @@
+//go:build !ignore_autogenerated
// +build !ignore_autogenerated
/*
diff --git a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.defaults.go b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.defaults.go
index f0d53c1721..ba7fdabd85 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.defaults.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/v1/zz_generated.defaults.go
@@ -1,3 +1,4 @@
+//go:build !ignore_autogenerated
// +build !ignore_autogenerated
/*
diff --git a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/zz_generated.deepcopy.go b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/zz_generated.deepcopy.go
index 33518a9868..0f7023a2db 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/zz_generated.deepcopy.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac/zz_generated.deepcopy.go
@@ -1,3 +1,4 @@
+//go:build !ignore_autogenerated
// +build !ignore_autogenerated
/*
diff --git a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/printers/tablegenerator.go b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/printers/tablegenerator.go
index add7c3896e..f96239dc0d 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/printers/tablegenerator.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/printers/tablegenerator.go
@@ -150,7 +150,9 @@ func (h *HumanReadableGenerator) TableHandler(columnDefinitions []metav1beta1.Ta
// ValidateRowPrintHandlerFunc validates print handler signature.
// printFunc is the function that will be called to print an object.
// It must be of the following type:
-// func printFunc(object ObjectType, options GenerateOptions) ([]metav1beta1.TableRow, error)
+//
+// func printFunc(object ObjectType, options GenerateOptions) ([]metav1beta1.TableRow, error)
+//
// where ObjectType is the type of the object that will be printed, and the first
// return value is an array of rows, with each row containing a number of cells that
// match the number of columns defined for that printer function.
diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go
index 99e41817da..0bf77a89e4 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/operatorlister/lister.go
@@ -28,6 +28,7 @@ import (
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ./operatorlisterfakes/fake_clusterserviceversion_v1alpha1_namespace_lister.go ../../api/client/listers/operators/v1alpha1.ClusterServiceVersionNamespaceLister
// OperatorLister is a union of versioned informer listers
+//
//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 . OperatorLister
type OperatorLister interface {
AppsV1() AppsV1Lister
diff --git a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/csv_handler.go b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/csv_handler.go
index eb8c57ab20..bf2b9b51b7 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/csv_handler.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/operatorstatus/csv_handler.go
@@ -86,8 +86,8 @@ type handler struct {
// OnAddOrUpdate is invoked when a CSV has been added or edited. We tap into
// this notification and do the following:
//
-// a. Make sure this is the CSV related to the cluster operator resource we are
-// tracking. Otherwise, do nothing.
+// a. Make sure this is the CSV related to the cluster operator resource we are tracking. Otherwise, do nothing.
+//
// b. If this is the right CSV then send it to the monitor.
func (h *handler) OnAddOrUpdate(in *v1alpha1.ClusterServiceVersion) {
h.onNotification(in, false)
@@ -96,8 +96,8 @@ func (h *handler) OnAddOrUpdate(in *v1alpha1.ClusterServiceVersion) {
// OnDelete is invoked when a CSV has been deleted. We tap into
// this notification and do the following:
//
-// a. Make sure this is the CSV related to the cluster operator resource we are
-// tracking. Otherwise, do nothing.
+// a. Make sure this is the CSV related to the cluster operator resource we are tracking. Otherwise, do nothing.
+//
// b. If this is the right CSV then send it to the monitor.
func (h *handler) OnDelete(in *v1alpha1.ClusterServiceVersion) {
h.onNotification(in, true)
diff --git a/staging/operator-lifecycle-manager/pkg/lib/proxy/overridden.go b/staging/operator-lifecycle-manager/pkg/lib/proxy/overridden.go
index 8ad45f1a78..42eec7acd6 100644
--- a/staging/operator-lifecycle-manager/pkg/lib/proxy/overridden.go
+++ b/staging/operator-lifecycle-manager/pkg/lib/proxy/overridden.go
@@ -6,8 +6,9 @@ import (
// IsOverridden returns true if the given container overrides proxy env variable(s).
// We apply the following rule:
-// If a container already defines any of the proxy env variable then it
-// overrides all of these.
+//
+// If a container already defines any of the proxy env variable then it
+// overrides all of these.
func IsOverridden(envVar []corev1.EnvVar) (overrides bool) {
for _, envVarName := range allProxyEnvVarNames {
_, found := find(envVar, envVarName)
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/internalversion/clientset.go b/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/internalversion/clientset.go
index c62d34765e..7869695b27 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/internalversion/clientset.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/internalversion/clientset.go
@@ -33,8 +33,7 @@ type Interface interface {
Operators() operatorsinternalversion.OperatorsInterface
}
-// Clientset contains the clients for groups. Each group has exactly one
-// version included in a Clientset.
+// Clientset contains the clients for groups.
type Clientset struct {
*discovery.DiscoveryClient
operators *operatorsinternalversion.OperatorsClient
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/versioned/clientset.go b/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/versioned/clientset.go
index b14e68fa0c..54c1733ce5 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/versioned/clientset.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/client/clientset/versioned/clientset.go
@@ -33,8 +33,7 @@ type Interface interface {
OperatorsV1() operatorsv1.OperatorsV1Interface
}
-// Clientset contains the clients for groups. Each group has exactly one
-// version included in a Clientset.
+// Clientset contains the clients for groups.
type Clientset struct {
*discovery.DiscoveryClient
operatorsV1 *operatorsv1.OperatorsV1Client
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/client/informers/externalversions/factory.go b/staging/operator-lifecycle-manager/pkg/package-server/client/informers/externalversions/factory.go
index 659f23161f..4a778610e6 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/client/informers/externalversions/factory.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/client/informers/externalversions/factory.go
@@ -47,6 +47,11 @@ type sharedInformerFactory struct {
// startedInformers is used for tracking which informers have been started.
// This allows Start() to be called multiple times safely.
startedInformers map[reflect.Type]bool
+ // wg tracks how many goroutines were started.
+ wg sync.WaitGroup
+ // shuttingDown is true when Shutdown has been called. It may still be running
+ // because it needs to wait for goroutines.
+ shuttingDown bool
}
// WithCustomResyncConfig sets a custom resync period for the specified informer types.
@@ -107,20 +112,39 @@ func NewSharedInformerFactoryWithOptions(client versioned.Interface, defaultResy
return factory
}
-// Start initializes all requested informers.
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
f.lock.Lock()
defer f.lock.Unlock()
+ if f.shuttingDown {
+ return
+ }
+
for informerType, informer := range f.informers {
if !f.startedInformers[informerType] {
- go informer.Run(stopCh)
+ f.wg.Add(1)
+ // We need a new variable in each loop iteration,
+ // otherwise the goroutine would use the loop variable
+ // and that keeps changing.
+ informer := informer
+ go func() {
+ defer f.wg.Done()
+ informer.Run(stopCh)
+ }()
f.startedInformers[informerType] = true
}
}
}
-// WaitForCacheSync waits for all started informers' cache were synced.
+func (f *sharedInformerFactory) Shutdown() {
+ f.lock.Lock()
+ f.shuttingDown = true
+ f.lock.Unlock()
+
+ // Will return immediately if there is nothing to wait for.
+ f.wg.Wait()
+}
+
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
informers := func() map[reflect.Type]cache.SharedIndexInformer {
f.lock.Lock()
@@ -167,11 +191,58 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal
// SharedInformerFactory provides shared informers for resources in all known
// API group versions.
+//
+// It is typically used like this:
+//
+// ctx, cancel := context.Background()
+// defer cancel()
+// factory := NewSharedInformerFactory(client, resyncPeriod)
+// defer factory.WaitForStop() // Returns immediately if nothing was started.
+// genericInformer := factory.ForResource(resource)
+// typedInformer := factory.SomeAPIGroup().V1().SomeType()
+// factory.Start(ctx.Done()) // Start processing these informers.
+// synced := factory.WaitForCacheSync(ctx.Done())
+// for v, ok := range synced {
+// if !ok {
+// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v)
+// return
+// }
+// }
+//
+// // Creating informers can also be created after Start, but then
+// // Start must be called again:
+// anotherGenericInformer := factory.ForResource(resource)
+// factory.Start(ctx.Done())
type SharedInformerFactory interface {
internalinterfaces.SharedInformerFactory
- ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // Start initializes all requested informers. They are handled in goroutines
+ // which run until the stop channel gets closed.
+ Start(stopCh <-chan struct{})
+
+ // Shutdown marks a factory as shutting down. At that point no new
+ // informers can be started anymore and Start will return without
+ // doing anything.
+ //
+ // In addition, Shutdown blocks until all goroutines have terminated. For that
+ // to happen, the close channel(s) that they were started with must be closed,
+ // either before Shutdown gets called or while it is waiting.
+ //
+ // Shutdown may be called multiple times, even concurrently. All such calls will
+ // block until all goroutines have terminated.
+ Shutdown()
+
+ // WaitForCacheSync blocks until all started informers' caches were synced
+ // or the stop channel gets closed.
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
+ // ForResource gives generic access to a shared informer of the matching type.
+ ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // InternalInformerFor returns the SharedIndexInformer for obj using an internal
+ // client.
+ InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer
+
Operators() operators.Interface
}
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/client/informers/internalversion/factory.go b/staging/operator-lifecycle-manager/pkg/package-server/client/informers/internalversion/factory.go
index bb656715a5..f984dc4e56 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/client/informers/internalversion/factory.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/client/informers/internalversion/factory.go
@@ -47,6 +47,11 @@ type sharedInformerFactory struct {
// startedInformers is used for tracking which informers have been started.
// This allows Start() to be called multiple times safely.
startedInformers map[reflect.Type]bool
+ // wg tracks how many goroutines were started.
+ wg sync.WaitGroup
+ // shuttingDown is true when Shutdown has been called. It may still be running
+ // because it needs to wait for goroutines.
+ shuttingDown bool
}
// WithCustomResyncConfig sets a custom resync period for the specified informer types.
@@ -107,20 +112,39 @@ func NewSharedInformerFactoryWithOptions(client internalversion.Interface, defau
return factory
}
-// Start initializes all requested informers.
func (f *sharedInformerFactory) Start(stopCh <-chan struct{}) {
f.lock.Lock()
defer f.lock.Unlock()
+ if f.shuttingDown {
+ return
+ }
+
for informerType, informer := range f.informers {
if !f.startedInformers[informerType] {
- go informer.Run(stopCh)
+ f.wg.Add(1)
+ // We need a new variable in each loop iteration,
+ // otherwise the goroutine would use the loop variable
+ // and that keeps changing.
+ informer := informer
+ go func() {
+ defer f.wg.Done()
+ informer.Run(stopCh)
+ }()
f.startedInformers[informerType] = true
}
}
}
-// WaitForCacheSync waits for all started informers' cache were synced.
+func (f *sharedInformerFactory) Shutdown() {
+ f.lock.Lock()
+ f.shuttingDown = true
+ f.lock.Unlock()
+
+ // Will return immediately if there is nothing to wait for.
+ f.wg.Wait()
+}
+
func (f *sharedInformerFactory) WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool {
informers := func() map[reflect.Type]cache.SharedIndexInformer {
f.lock.Lock()
@@ -167,11 +191,58 @@ func (f *sharedInformerFactory) InformerFor(obj runtime.Object, newFunc internal
// SharedInformerFactory provides shared informers for resources in all known
// API group versions.
+//
+// It is typically used like this:
+//
+// ctx, cancel := context.Background()
+// defer cancel()
+// factory := NewSharedInformerFactory(client, resyncPeriod)
+// defer factory.WaitForStop() // Returns immediately if nothing was started.
+// genericInformer := factory.ForResource(resource)
+// typedInformer := factory.SomeAPIGroup().V1().SomeType()
+// factory.Start(ctx.Done()) // Start processing these informers.
+// synced := factory.WaitForCacheSync(ctx.Done())
+// for v, ok := range synced {
+// if !ok {
+// fmt.Fprintf(os.Stderr, "caches failed to sync: %v", v)
+// return
+// }
+// }
+//
+// // Creating informers can also be created after Start, but then
+// // Start must be called again:
+// anotherGenericInformer := factory.ForResource(resource)
+// factory.Start(ctx.Done())
type SharedInformerFactory interface {
internalinterfaces.SharedInformerFactory
- ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // Start initializes all requested informers. They are handled in goroutines
+ // which run until the stop channel gets closed.
+ Start(stopCh <-chan struct{})
+
+ // Shutdown marks a factory as shutting down. At that point no new
+ // informers can be started anymore and Start will return without
+ // doing anything.
+ //
+ // In addition, Shutdown blocks until all goroutines have terminated. For that
+ // to happen, the close channel(s) that they were started with must be closed,
+ // either before Shutdown gets called or while it is waiting.
+ //
+ // Shutdown may be called multiple times, even concurrently. All such calls will
+ // block until all goroutines have terminated.
+ Shutdown()
+
+ // WaitForCacheSync blocks until all started informers' caches were synced
+ // or the stop channel gets closed.
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
+ // ForResource gives generic access to a shared informer of the matching type.
+ ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
+
+ // InternalInformerFor returns the SharedIndexInformer for obj using an internal
+ // client.
+ InformerFor(obj runtime.Object, newFunc internalinterfaces.NewInformerFunc) cache.SharedIndexInformer
+
Operators() operators.Interface
}
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/client/openapi/zz_generated.openapi.go b/staging/operator-lifecycle-manager/pkg/package-server/client/openapi/zz_generated.openapi.go
index e4fcd10386..2ef8406a65 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/client/openapi/zz_generated.openapi.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/client/openapi/zz_generated.openapi.go
@@ -141,28 +141,31 @@ func schema_api_pkg_operators_v1alpha1_APIResourceReference(ref common.Reference
return common.OpenAPIDefinition{
Schema: spec.Schema{
SchemaProps: spec.SchemaProps{
- Description: "APIResourceReference is a Kubernetes resource type used by a custom resource",
+ Description: "APIResourceReference is a reference to a Kubernetes resource type that the referrer utilizes.",
Type: []string{"object"},
Properties: map[string]spec.Schema{
"name": {
SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
+ Description: "Plural name of the referenced resource type (CustomResourceDefinition.Spec.Names[].Plural). Empty string if the referenced resource type is not a custom resource.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
},
},
"kind": {
SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
+ Description: "Kind of the referenced resource type.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
},
},
"version": {
SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
+ Description: "API Version of the referenced resource type.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
},
},
},
@@ -679,20 +682,23 @@ func schema_api_pkg_operators_v1alpha1_ClusterServiceVersionSpec(ref common.Refe
},
"displayName": {
SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
+ Description: "The name of the operator in display format.",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
},
},
"description": {
SchemaProps: spec.SchemaProps{
- Type: []string{"string"},
- Format: "",
+ Description: "Description of the operator. Can include the features, limitations or use-cases of the operator.",
+ Type: []string{"string"},
+ Format: "",
},
},
"keywords": {
SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
+ Description: "A list of keywords describing the operator.",
+ Type: []string{"array"},
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
@@ -706,7 +712,8 @@ func schema_api_pkg_operators_v1alpha1_ClusterServiceVersionSpec(ref common.Refe
},
"maintainers": {
SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
+ Description: "A list of organizational entities maintaining the operator.",
+ Type: []string{"array"},
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
@@ -719,13 +726,15 @@ func schema_api_pkg_operators_v1alpha1_ClusterServiceVersionSpec(ref common.Refe
},
"provider": {
SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.AppLink"),
+ Description: "The publishing entity behind the operator.",
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/operator-framework/api/pkg/operators/v1alpha1.AppLink"),
},
},
"links": {
SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
+ Description: "A list of links related to the operator.",
+ Type: []string{"array"},
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
@@ -738,7 +747,8 @@ func schema_api_pkg_operators_v1alpha1_ClusterServiceVersionSpec(ref common.Refe
},
"icon": {
SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
+ Description: "The icon for this operator.",
+ Type: []string{"array"},
Items: &spec.SchemaOrArray{
Schema: &spec.Schema{
SchemaProps: spec.SchemaProps{
diff --git a/staging/operator-lifecycle-manager/pkg/package-server/storage/subresources.go b/staging/operator-lifecycle-manager/pkg/package-server/storage/subresources.go
index a851ee215a..24bc799e69 100644
--- a/staging/operator-lifecycle-manager/pkg/package-server/storage/subresources.go
+++ b/staging/operator-lifecycle-manager/pkg/package-server/storage/subresources.go
@@ -3,7 +3,7 @@ package storage
import (
"context"
"encoding/base64"
- "io/ioutil"
+ "io"
"net/http"
"strconv"
"strings"
@@ -72,7 +72,7 @@ func (s *LogoStorage) Connect(ctx context.Context, name string, options runtime.
etag := `"` + strings.Join([]string{name, pkgChannel.Name, pkgChannel.CurrentCSV}, ".") + `"`
reader := base64.NewDecoder(base64.StdEncoding, strings.NewReader(data))
- imgBytes, _ := ioutil.ReadAll(reader)
+ imgBytes, _ := io.ReadAll(reader)
return imgBytes, mimeType, etag
}
diff --git a/staging/operator-lifecycle-manager/scripts/build_local.sh b/staging/operator-lifecycle-manager/scripts/build_local.sh
index 47fc6c926f..e30ea18a0e 100755
--- a/staging/operator-lifecycle-manager/scripts/build_local.sh
+++ b/staging/operator-lifecycle-manager/scripts/build_local.sh
@@ -22,7 +22,7 @@ if [ -n "$KIND" ]; then
# kind will use the cluster named kind by default, so if there is only one cluster, specify it
if [[ ${#CLUSTERS[@]} == 1 ]]; then
KIND_FLAGS="--name ${CLUSTERS[0]}"
- echo 'Use cluster ${CLUSTERS[0]}'
+ echo "Use cluster ${CLUSTERS[0]}"
fi
kind load docker-image quay.io/operator-framework/olm:local ${KIND_FLAGS}
diff --git a/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go
index b582f9ab68..41c6cca141 100644
--- a/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go
+++ b/staging/operator-lifecycle-manager/test/e2e/catalog_e2e_test.go
@@ -1010,7 +1010,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
catSrcImage := "quay.io/olmtest/busybox-dependencies-index"
- // Create gRPC CatalogSource
+ By("creating gRPC CatalogSource")
source := &v1alpha1.CatalogSource{
TypeMeta: metav1.TypeMeta{
Kind: v1alpha1.CatalogSourceKind,
@@ -1028,7 +1028,6 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
},
},
}
-
source, err := crc.OperatorsV1alpha1().CatalogSources(source.GetNamespace()).Create(context.Background(), source, metav1.CreateOptions{})
Expect(err).ShouldNot(HaveOccurred())
defer func() {
@@ -1036,22 +1035,22 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
Expect(err).ShouldNot(HaveOccurred())
}()
- // Wait for the CatalogSource to be ready
+ By("waiting for the CatalogSource to be ready")
_, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced)
Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready")
- // Create a Subscription for busybox
+ By("creating a Subscription for busybox")
subscriptionName := genName("sub-")
cleanupSubscription := createSubscriptionForCatalog(crc, source.GetNamespace(), subscriptionName, source.GetName(), packageName, channelName, "", v1alpha1.ApprovalAutomatic)
defer cleanupSubscription()
- // Wait for the Subscription to succeed
+ By("waiting for the Subscription to succeed")
subscription, err := fetchSubscription(crc, ns.GetName(), subscriptionName, subscriptionStateAtLatestChecker)
Expect(err).ShouldNot(HaveOccurred())
Expect(subscription).ShouldNot(BeNil())
Expect(subscription.Status.InstalledCSV).To(Equal("busybox.v1.0.0"))
- // Confirm that a subscription was created for busybox-dependency
+ By("confirming that a subscription was created for busybox-dependency")
subscriptionList, err := crc.OperatorsV1alpha1().Subscriptions(source.GetNamespace()).List(context.Background(), metav1.ListOptions{})
Expect(err).ShouldNot(HaveOccurred())
dependencySubscriptionName := ""
@@ -1062,13 +1061,13 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
}
Expect(dependencySubscriptionName).ToNot(BeEmpty())
- // Wait for the Subscription to succeed
+ By("waiting for the Subscription to succeed")
subscription, err = fetchSubscription(crc, ns.GetName(), dependencySubscriptionName, subscriptionStateAtLatestChecker)
Expect(err).ShouldNot(HaveOccurred())
Expect(subscription).ShouldNot(BeNil())
Expect(subscription.Status.InstalledCSV).To(Equal("busybox-dependency.v1.0.0"))
- // Update the catalog image
+ By("updating the catalog image")
Eventually(func() error {
existingSource, err := crc.OperatorsV1alpha1().CatalogSources(source.GetNamespace()).Get(context.Background(), sourceName, metav1.GetOptions{})
if err != nil {
@@ -1080,11 +1079,11 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
return err
}).Should(Succeed())
- // Wait for the CatalogSource to be ready
+ By("waiting for the CatalogSource to be ready")
_, err = fetchCatalogSourceOnStatus(crc, source.GetName(), source.GetNamespace(), catalogSourceRegistryPodSynced)
Expect(err).ToNot(HaveOccurred(), "catalog source did not become ready")
- // Wait for the busybox v2 Subscription to succeed
+ By("waiting for the busybox v2 Subscription to succeed")
subChecker := func(sub *v1alpha1.Subscription) bool {
return sub.Status.InstalledCSV == "busybox.v2.0.0"
}
@@ -1092,12 +1091,12 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
Expect(err).ShouldNot(HaveOccurred())
Expect(subscription).ShouldNot(BeNil())
- // Wait for busybox v2 csv to succeed and check the replaces field
+ By("waiting for busybox v2 csv to succeed and check the replaces field")
csv, err := fetchCSV(crc, subscription.Status.CurrentCSV, subscription.GetNamespace(), csvSucceededChecker)
Expect(err).ShouldNot(HaveOccurred())
Expect(csv.Spec.Replaces).To(Equal("busybox.v1.0.0"))
- // Wait for the busybox-dependency v2 Subscription to succeed
+ By("waiting for the busybox-dependency v2 Subscription to succeed")
subChecker = func(sub *v1alpha1.Subscription) bool {
return sub.Status.InstalledCSV == "busybox-dependency.v2.0.0"
}
@@ -1105,7 +1104,7 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
Expect(err).ShouldNot(HaveOccurred())
Expect(subscription).ShouldNot(BeNil())
- // Wait for busybox-dependency v2 csv to succeed and check the replaces field
+ By("waiting for busybox-dependency v2 csv to succeed and check the replaces field")
csv, err = fetchCSV(crc, subscription.Status.CurrentCSV, subscription.GetNamespace(), csvSucceededChecker)
Expect(err).ShouldNot(HaveOccurred())
Expect(csv.Spec.Replaces).To(Equal("busybox-dependency.v1.0.0"))
@@ -1403,21 +1402,15 @@ var _ = Describe("Starting CatalogSource e2e tests", func() {
Expect(c.Create(context.Background(), subscription)).To(BeNil())
})
- It("fails with a ResolutionFailed error condition, and a message that highlights the missing field in the CSV", func() {
-
- subscription, err := fetchSubscription(crc, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker)
- Expect(err).Should(BeNil())
- installPlanName := subscription.Status.Install.Name
-
- // ensure we wait for the installPlan to fail before moving forward then fetch the subscription again
- _, err = fetchInstallPlan(GinkgoT(), crc, installPlanName, subscription.GetNamespace(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed))
- Expect(err).To(BeNil())
- subscription, err = fetchSubscription(crc, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker)
- Expect(err).To(BeNil())
+ It("fails with a BundleUnpackFailed error condition, and a message that highlights the missing field in the CSV", func() {
+ Eventually(func(g Gomega) string {
+ fetchedSubscription, err := crc.OperatorsV1alpha1().Subscriptions(ns.GetName()).Get(context.Background(), subscription.GetName(), metav1.GetOptions{})
+ g.Expect(err).NotTo(HaveOccurred())
- // expect the message that API missing
- failingCondition := subscription.Status.GetCondition(operatorsv1alpha1.SubscriptionInstallPlanFailed)
- Expect(failingCondition.Message).To(ContainSubstring("missing APIVersion"))
+ // expect the message that API missing
+ failingCondition := fetchedSubscription.Status.GetCondition(v1alpha1.SubscriptionBundleUnpackFailed)
+ return failingCondition.Message
+ }).Should(ContainSubstring("missing APIVersion"))
})
})
})
diff --git a/staging/operator-lifecycle-manager/test/e2e/ctx/installer_helm.go b/staging/operator-lifecycle-manager/test/e2e/ctx/installer_helm.go
index 918995e2e5..3cc2a3d9fa 100644
--- a/staging/operator-lifecycle-manager/test/e2e/ctx/installer_helm.go
+++ b/staging/operator-lifecycle-manager/test/e2e/ctx/installer_helm.go
@@ -1,3 +1,4 @@
+//go:build helm
// +build helm
package ctx
diff --git a/staging/operator-lifecycle-manager/test/e2e/ctx/installer_none.go b/staging/operator-lifecycle-manager/test/e2e/ctx/installer_none.go
index e21484cd99..48375d6d1b 100644
--- a/staging/operator-lifecycle-manager/test/e2e/ctx/installer_none.go
+++ b/staging/operator-lifecycle-manager/test/e2e/ctx/installer_none.go
@@ -1,3 +1,4 @@
+//go:build !helm
// +build !helm
package ctx
diff --git a/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kind.go b/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kind.go
index 27f6d7c78c..6ac0ab976c 100644
--- a/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kind.go
+++ b/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kind.go
@@ -7,7 +7,6 @@ import (
"encoding/csv"
"flag"
"fmt"
- "io/ioutil"
"os"
"path/filepath"
"strings"
@@ -78,7 +77,7 @@ func (kl kindLogAdapter) V(level log.Level) log.InfoLogger {
}
func Provision(ctx *TestContext) (func(), error) {
- dir, err := ioutil.TempDir("", "kind.")
+ dir, err := os.MkdirTemp("", "kind.")
if err != nil {
return nil, fmt.Errorf("failed to create temporary directory: %s", err.Error())
}
diff --git a/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kubeconfig.go b/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kubeconfig.go
index fa3a6eec3a..1ce1980d71 100644
--- a/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kubeconfig.go
+++ b/staging/operator-lifecycle-manager/test/e2e/ctx/provisioner_kubeconfig.go
@@ -1,3 +1,4 @@
+//go:build !kind
// +build !kind
package ctx
diff --git a/staging/operator-lifecycle-manager/test/e2e/fail_forward_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/fail_forward_e2e_test.go
index be4575a6b0..3df0768f61 100644
--- a/staging/operator-lifecycle-manager/test/e2e/fail_forward_e2e_test.go
+++ b/staging/operator-lifecycle-manager/test/e2e/fail_forward_e2e_test.go
@@ -9,6 +9,7 @@ import (
. "github.com/onsi/gomega"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
@@ -27,6 +28,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
ns corev1.Namespace
crclient versioned.Interface
c client.Client
+ ogName string
)
BeforeEach(func() {
@@ -45,6 +47,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
},
}
ns = SetupGeneratedTestNamespaceWithOperatorGroup(namespaceName, og)
+ ogName = og.GetName()
})
AfterEach(func() {
@@ -55,15 +58,21 @@ var _ = Describe("Fail Forward Upgrades", func() {
When("an InstallPlan is reporting a failed state", func() {
var (
- magicCatalog *MagicCatalog
- catalogSourceName string
- subscription *operatorsv1alpha1.Subscription
+ magicCatalog *MagicCatalog
+ catalogSourceName string
+ subscription *operatorsv1alpha1.Subscription
+ originalInstallPlanRef *corev1.ObjectReference
+ failedInstallPlanRef *corev1.ObjectReference
)
BeforeEach(func() {
+ By("creating a service account with no permission")
+ saNameWithNoPerms := genName("scoped-sa-")
+ newServiceAccount(ctx.Ctx().KubeClient(), ns.GetName(), saNameWithNoPerms)
+
+ By("deploying the testing catalog")
provider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.1.0.yaml"))
Expect(err).To(BeNil())
-
catalogSourceName = genName("mc-ip-failed-")
magicCatalog = NewMagicCatalog(c, ns.GetName(), catalogSourceName, provider)
Expect(magicCatalog.DeployCatalog(context.Background())).To(BeNil())
@@ -87,16 +96,18 @@ var _ = Describe("Fail Forward Upgrades", func() {
subscription, err := fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker)
Expect(err).Should(BeNil())
- originalInstallPlanRef := subscription.Status.InstallPlanRef
+ originalInstallPlanRef = subscription.Status.InstallPlanRef
By("waiting for the v0.1.0 CSV to report a succeeded phase")
_, err = fetchCSV(crclient, subscription.Status.CurrentCSV, ns.GetName(), buildCSVConditionChecker(operatorsv1alpha1.CSVPhaseSucceeded))
Expect(err).ShouldNot(HaveOccurred())
- By("updating the catalog with a broken v0.2.0 bundle image")
+ By("updating the operator group to use the service account without required permissions to simulate InstallPlan failure")
+ Eventually(operatorGroupServiceAccountNameSetter(crclient, ns.GetName(), ogName, saNameWithNoPerms)).Should(Succeed())
+
+ By("updating the catalog with v0.2.0 bundle image")
brokenProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.2.0.yaml"))
Expect(err).To(BeNil())
-
err = magicCatalog.UpdateCatalog(context.Background(), brokenProvider)
Expect(err).To(BeNil())
@@ -104,91 +115,108 @@ var _ = Describe("Fail Forward Upgrades", func() {
subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanDifferentChecker(originalInstallPlanRef.Name))
Expect(err).Should(BeNil())
- By("patching the installplan to reduce the bundle unpacking timeout")
- addBundleUnpackTimeoutIPAnnotation(context.Background(), c, objectRefToNamespacedName(subscription.Status.InstallPlanRef), "1s")
-
By("waiting for the bad InstallPlan to report a failed installation state")
- ref := subscription.Status.InstallPlanRef
- _, err = fetchInstallPlan(GinkgoT(), crclient, ref.Name, ref.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed))
+ failedInstallPlanRef = subscription.Status.InstallPlanRef
+ _, err = fetchInstallPlan(GinkgoT(), crclient, failedInstallPlanRef.Name, failedInstallPlanRef.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed))
Expect(err).To(BeNil())
+ By("updating the operator group remove service account without permissions")
+ Eventually(operatorGroupServiceAccountNameSetter(crclient, ns.GetName(), ogName, "")).Should(Succeed())
})
AfterEach(func() {
By("removing the testing catalog resources")
Expect(magicCatalog.UndeployCatalog(context.Background())).To(BeNil())
})
It("eventually reports a successful state when multiple bad versions are rolled forward", func() {
- By("patching the catalog with another bad bundle version")
- badProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/multiple-bad-versions", "example-operator.v0.2.1.yaml"))
- Expect(err).To(BeNil())
+ By("patching the OperatorGroup to reduce the bundle unpacking timeout")
+ addBundleUnpackTimeoutOGAnnotation(context.Background(), c, types.NamespacedName{Name: ogName, Namespace: ns.GetName()}, "1s")
+ By("patching the catalog with a bad bundle version")
+ badProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/multiple-bad-versions", "example-operator.v0.2.1-non-existent-tag.yaml"))
+ Expect(err).To(BeNil())
err = magicCatalog.UpdateCatalog(context.Background(), badProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.2.1 status.updatedCSV")
- subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.2.1"))
- Expect(err).Should(BeNil())
-
- By("patching the installplan to reduce the bundle unpacking timeout")
- addBundleUnpackTimeoutIPAnnotation(context.Background(), c, objectRefToNamespacedName(subscription.Status.InstallPlanRef), "1s")
+ By("waiting for the subscription to maintain the example-operator.v0.2.0 status.currentCSV")
+ Consistently(subscriptionCurrentCSVGetter(crclient, subscription.GetNamespace(), subscription.GetName())).Should(Equal("example-operator.v0.2.0"))
- By("waiting for the bad v0.2.1 InstallPlan to report a failed installation state")
- ref := subscription.Status.InstallPlanRef
- _, err = fetchInstallPlan(GinkgoT(), crclient, ref.Name, ref.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed))
- Expect(err).To(BeNil())
+ By("patching the OperatorGroup to increase the bundle unpacking timeout")
+ addBundleUnpackTimeoutOGAnnotation(context.Background(), c, types.NamespacedName{Name: ogName, Namespace: ns.GetName()}, "5m")
By("patching the catalog with a fixed version")
fixedProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/multiple-bad-versions", "example-operator.v0.3.0.yaml"))
Expect(err).To(BeNil())
-
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
- subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
+ _, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
Expect(err).Should(BeNil())
+
+ By("verifying the subscription is referencing a new InstallPlan")
+ subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanDifferentChecker(originalInstallPlanRef.Name))
+ Expect(err).Should(BeNil())
+
+ By("waiting for the fixed v0.3.0 InstallPlan to report a successful state")
+ ref := subscription.Status.InstallPlanRef
+ _, err = fetchInstallPlan(GinkgoT(), crclient, ref.Name, ref.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete))
+ Expect(err).To(BeNil())
})
It("eventually reports a successful state when using skip ranges", func() {
By("patching the catalog with a fixed version")
fixedProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/skip-range", "example-operator.v0.3.0.yaml"))
Expect(err).To(BeNil())
-
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
- subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
+ _, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
+ Expect(err).Should(BeNil())
+
+ By("verifying the subscription is referencing a new InstallPlan")
+ subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanDifferentChecker(originalInstallPlanRef.Name))
Expect(err).Should(BeNil())
+
+ By("waiting for the fixed v0.3.0 InstallPlan to report a successful state")
+ ref := subscription.Status.InstallPlanRef
+ _, err = fetchInstallPlan(GinkgoT(), crclient, ref.Name, ref.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete))
+ Expect(err).To(BeNil())
})
It("eventually reports a successful state when using skips", func() {
By("patching the catalog with a fixed version")
fixedProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/skips", "example-operator.v0.3.0.yaml"))
Expect(err).To(BeNil())
-
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
- subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
+ _, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
Expect(err).Should(BeNil())
+
+ By("verifying the subscription is referencing a new InstallPlan")
+ subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanDifferentChecker(originalInstallPlanRef.Name))
+ Expect(err).Should(BeNil())
+
+ By("waiting for the fixed v0.3.0 InstallPlan to report a successful state")
+ ref := subscription.Status.InstallPlanRef
+ _, err = fetchInstallPlan(GinkgoT(), crclient, ref.Name, ref.Namespace, buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseComplete))
+ Expect(err).To(BeNil())
})
It("eventually reports a failed state when using replaces", func() {
By("patching the catalog with a fixed version")
fixedProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, "fail-forward/replaces", "example-operator.v0.3.0.yaml"))
Expect(err).To(BeNil())
-
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to maintain the example-operator.v0.2.0 status.updatedCSV")
- Consistently(func() string {
- subscription, err := crclient.OperatorsV1alpha1().Subscriptions(subscription.GetNamespace()).Get(context.Background(), subscription.GetName(), metav1.GetOptions{})
- if err != nil || subscription == nil {
- return ""
- }
- return subscription.Status.CurrentCSV
- }).Should(Equal("example-operator.v0.2.0"))
+ By("waiting for the subscription to maintain the example-operator.v0.2.0 status.currentCSV")
+ Consistently(subscriptionCurrentCSVGetter(crclient, subscription.GetNamespace(), subscription.GetName())).Should(Equal("example-operator.v0.2.0"))
+
+ By("verifying the subscription is referencing the same InstallPlan")
+ subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasInstallPlanChecker)
+ Expect(err).Should(BeNil())
+ Expect(subscription.Status.InstallPlanRef.Name).To(Equal(failedInstallPlanRef.Name))
})
})
When("a CSV resource is in a failed state", func() {
@@ -200,9 +228,9 @@ var _ = Describe("Fail Forward Upgrades", func() {
)
BeforeEach(func() {
+ By("deploying the testing catalog")
provider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.1.0.yaml"))
Expect(err).To(BeNil())
-
catalogSourceName = genName("mc-csv-failed-")
magicCatalog = NewMagicCatalog(c, ns.GetName(), catalogSourceName, provider)
Expect(magicCatalog.DeployCatalog(context.Background())).To(BeNil())
@@ -231,7 +259,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
Expect(err).ShouldNot(HaveOccurred())
By("updating the catalog with a broken v0.2.0 csv")
- brokenProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.2.0-2.yaml"))
+ brokenProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.2.0-invalid-csv.yaml"))
Expect(err).To(BeNil())
err = magicCatalog.UpdateCatalog(context.Background(), brokenProvider)
@@ -261,7 +289,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
Expect(err).Should(BeNil())
})
@@ -274,7 +302,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
Expect(err).Should(BeNil())
})
@@ -287,7 +315,7 @@ var _ = Describe("Fail Forward Upgrades", func() {
err = magicCatalog.UpdateCatalog(context.Background(), fixedProvider)
Expect(err).To(BeNil())
- By("waiting for the subscription to have the example-operator.v0.3.0 status.updatedCSV")
+ By("waiting for the subscription to have the example-operator.v0.3.0 status.currentCSV")
subscription, err = fetchSubscription(crclient, subscription.GetNamespace(), subscription.GetName(), subscriptionHasCurrentCSV("example-operator.v0.3.0"))
Expect(err).Should(BeNil())
})
diff --git a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go
index 244f01b2a3..92d2c4c3e0 100644
--- a/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go
+++ b/staging/operator-lifecycle-manager/test/e2e/installplan_e2e_test.go
@@ -41,7 +41,6 @@ import (
operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
- "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry"
"github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/apis/rbac"
@@ -3062,90 +3061,6 @@ var _ = Describe("Install Plan", func() {
require.Equal(GinkgoT(), operatorsv1alpha1.InstallPlanPhaseComplete, fetchedInstallPlan.Status.Phase)
})
- It("unpacks bundle image", func() {
- ns, err := c.KubernetesInterface().CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{
- ObjectMeta: metav1.ObjectMeta{
- Name: genName("ns-"),
- },
- }, metav1.CreateOptions{})
- require.NoError(GinkgoT(), err)
-
- og := &operatorsv1.OperatorGroup{}
- og.SetName("og")
- _, err = crc.OperatorsV1().OperatorGroups(ns.GetName()).Create(context.Background(), og, metav1.CreateOptions{})
- require.NoError(GinkgoT(), err)
-
- deleteOpts := &metav1.DeleteOptions{}
- defer func() {
- require.NoError(GinkgoT(), c.KubernetesInterface().CoreV1().Namespaces().Delete(context.Background(), ns.GetName(), *deleteOpts))
- }()
-
- catsrc := &operatorsv1alpha1.CatalogSource{
- ObjectMeta: metav1.ObjectMeta{
- Name: genName("kiali-"),
- Namespace: ns.GetName(),
- Labels: map[string]string{"olm.catalogSource": "kaili-catalog"},
- },
- Spec: operatorsv1alpha1.CatalogSourceSpec{
- Image: "quay.io/operator-framework/ci-index:latest",
- SourceType: operatorsv1alpha1.SourceTypeGrpc,
- GrpcPodConfig: &operatorsv1alpha1.GrpcPodConfig{
- SecurityContextConfig: operatorsv1alpha1.Restricted,
- },
- },
- }
- catsrc, err = crc.OperatorsV1alpha1().CatalogSources(catsrc.GetNamespace()).Create(context.Background(), catsrc, metav1.CreateOptions{})
- require.NoError(GinkgoT(), err)
- defer func() {
- Eventually(func() error {
- return client.IgnoreNotFound(ctx.Ctx().Client().Delete(context.Background(), catsrc))
- }).Should(Succeed())
- }()
-
- // Wait for the CatalogSource to be ready
- catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced)
- require.NoError(GinkgoT(), err)
-
- // Generate a Subscription
- subName := genName("kiali-")
- cleanUpSubscriptionFn := createSubscriptionForCatalog(crc, catsrc.GetNamespace(), subName, catsrc.GetName(), "kiali", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
- defer cleanUpSubscriptionFn()
-
- sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker)
- require.NoError(GinkgoT(), err)
-
- // Wait for the expected InstallPlan's execution to either fail or succeed
- ipName := sub.Status.InstallPlanRef.Name
- ip, err := waitForInstallPlan(crc, ipName, sub.GetNamespace(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed, operatorsv1alpha1.InstallPlanPhaseComplete))
- require.NoError(GinkgoT(), err)
- require.Equal(GinkgoT(), operatorsv1alpha1.InstallPlanPhaseComplete, ip.Status.Phase, "InstallPlan not complete")
-
- // Ensure the InstallPlan contains the steps resolved from the bundle image
- operatorName := "kiali-operator"
- expectedSteps := map[registry.ResourceKey]struct{}{
- {Name: operatorName, Kind: "ClusterServiceVersion"}: {},
- {Name: "kialis.kiali.io", Kind: "CustomResourceDefinition"}: {},
- {Name: "monitoringdashboards.monitoring.kiali.io", Kind: "CustomResourceDefinition"}: {},
- {Name: operatorName, Kind: "ServiceAccount"}: {},
- {Name: operatorName, Kind: "ClusterRole"}: {},
- {Name: operatorName, Kind: "ClusterRoleBinding"}: {},
- }
- require.Lenf(GinkgoT(), ip.Status.Plan, len(expectedSteps), "number of expected steps does not match installed: %v", ip.Status.Plan)
-
- for _, step := range ip.Status.Plan {
- key := registry.ResourceKey{
- Name: step.Resource.Name,
- Kind: step.Resource.Kind,
- }
- for expected := range expectedSteps {
- if strings.HasPrefix(key.Name, expected.Name) && key.Kind == expected.Kind {
- delete(expectedSteps, expected)
- }
- }
- }
- require.Lenf(GinkgoT(), expectedSteps, 0, "Actual resource steps do not match expected: %#v", expectedSteps)
- })
-
// This It spec verifies that, in cases where there are multiple options to fulfil a dependency
// across multiple catalogs, we only generate one installplan with one set of resolved resources.
//issue: https://github.com/operator-framework/operator-lifecycle-manager/issues/2633
@@ -3402,218 +3317,6 @@ var _ = Describe("Install Plan", func() {
})
})
- When("waiting on the bundle unpacking job", func() {
- var (
- ns *corev1.Namespace
- catsrcName string
- ip *operatorsv1alpha1.InstallPlan
- )
-
- BeforeEach(func() {
- ns = &corev1.Namespace{}
- ns.SetName(genName("ns-"))
- Eventually(func() error {
- return ctx.Ctx().Client().Create(context.Background(), ns)
- }, timeout, interval).Should(Succeed(), "could not create Namespace")
-
- // Create a dummy CatalogSource to bypass the bundle unpacker's check for a CatalogSource
- catsrc := &operatorsv1alpha1.CatalogSource{
- ObjectMeta: metav1.ObjectMeta{
- Name: genName("dummy-catsrc-"),
- Namespace: ns.GetName(),
- },
- Spec: operatorsv1alpha1.CatalogSourceSpec{
- Image: "localhost:0/not/exist:catsrc",
- SourceType: operatorsv1alpha1.SourceTypeGrpc,
- GrpcPodConfig: &operatorsv1alpha1.GrpcPodConfig{
- SecurityContextConfig: operatorsv1alpha1.Restricted,
- },
- },
- }
- Eventually(func() error {
- return ctx.Ctx().Client().Create(context.Background(), catsrc)
- }, timeout, interval).Should(Succeed(), "could not create CatalogSource")
-
- catsrcName = catsrc.GetName()
-
- // Create the OperatorGroup
- og := &operatorsv1.OperatorGroup{
- ObjectMeta: metav1.ObjectMeta{
- Name: "og",
- Namespace: ns.GetName(),
- },
- Spec: operatorsv1.OperatorGroupSpec{
- TargetNamespaces: []string{ns.GetName()},
- },
- }
- Eventually(func() error {
- return ctx.Ctx().Client().Create(context.Background(), og)
- }, timeout, interval).Should(Succeed(), "could not create OperatorGroup")
-
- // Wait for the OperatorGroup to be synced so the InstallPlan doesn't have to be resynced due to an invalid OperatorGroup
- Eventually(
- func() ([]string, error) {
- err := ctx.Ctx().Client().Get(context.Background(), client.ObjectKeyFromObject(og), og)
- ctx.Ctx().Logf("Waiting for OperatorGroup(%v) to be synced with status.namespaces: %v", og.Name, og.Status.Namespaces)
- return og.Status.Namespaces, err
- },
- 1*time.Minute,
- interval,
- ).Should(ContainElement(ns.GetName()))
-
- ip = &operatorsv1alpha1.InstallPlan{
- ObjectMeta: metav1.ObjectMeta{
- Name: "ip",
- Namespace: ns.GetName(),
- },
- Spec: operatorsv1alpha1.InstallPlanSpec{
- ClusterServiceVersionNames: []string{"foobar"},
- Approval: operatorsv1alpha1.ApprovalAutomatic,
- Approved: true,
- },
- }
- })
-
- AfterEach(func() {
- Eventually(func() error {
- return client.IgnoreNotFound(ctx.Ctx().Client().Delete(context.Background(), ns))
- }, timeout, interval).Should(Succeed(), "could not delete Namespace")
- Eventually(func() error {
- return client.IgnoreNotFound(ctx.Ctx().Client().Delete(context.Background(), ip))
- }, timeout, interval).Should(Succeed(), "could not delete Namespace")
- })
-
- It("should show an error on the bundlelookup condition for a non-existent bundle image", func() {
- // We wait for some time over the bundle unpack timeout (i.e ActiveDeadlineSeconds) so that the Job can eventually fail
- // Since the default --bundle-unpack-timeout=10m, we override with a shorter timeout via the
- // unpack timeout annotation on the InstallPlan
- annotations := make(map[string]string)
- annotations[bundle.BundleUnpackTimeoutAnnotationKey] = "1m"
- ip.SetAnnotations(annotations)
-
- Eventually(func() error {
- return ctx.Ctx().Client().Create(context.Background(), ip)
- }, timeout, interval).Should(Succeed(), "could not create InstallPlan")
-
- now := metav1.Now()
- // Create an InstallPlan status.bundleLookups.Path specified for a non-existent bundle image
- ip.Status = operatorsv1alpha1.InstallPlanStatus{
- Phase: operatorsv1alpha1.InstallPlanPhaseInstalling,
- CatalogSources: []string{},
- BundleLookups: []operatorsv1alpha1.BundleLookup{
- {
- Path: "localhost:0/not/exist:v0.0.1",
- Identifier: "foobar.v0.0.1",
- CatalogSourceRef: &corev1.ObjectReference{
- Namespace: ns.GetName(),
- Name: catsrcName,
- },
- Conditions: []operatorsv1alpha1.BundleLookupCondition{
- {
- Type: operatorsv1alpha1.BundleLookupPending,
- Status: corev1.ConditionTrue,
- Reason: "JobIncomplete",
- Message: "unpack job not completed",
- LastTransitionTime: &now,
- },
- },
- },
- },
- }
-
- // The status gets ignored on create so we need to update it else the InstallPlan sync ignores
- // InstallPlans without any steps or bundle lookups
- Eventually(func() error {
- return ctx.Ctx().Client().Status().Update(context.Background(), ip)
- }, timeout, interval).Should(Succeed(), "could not update InstallPlan status")
-
- // The InstallPlan's status.bundleLookup.conditions should have a BundleLookupPending condition
- // with the container status from unpack pod that mentions an image pull failure for the non-existent
- // image, e.g ErrImagePull or ImagePullBackOff
- Eventually(
- func() (string, error) {
- err := ctx.Ctx().Client().Get(context.Background(), client.ObjectKeyFromObject(ip), ip)
- if err != nil {
- return "", err
- }
- for _, bl := range ip.Status.BundleLookups {
- for _, cond := range bl.Conditions {
- if cond.Type != operatorsv1alpha1.BundleLookupPending {
- continue
- }
- return cond.Message, nil
- }
- }
- return "", fmt.Errorf("%s condition not found", operatorsv1alpha1.BundleLookupPending)
- },
- 1*time.Minute,
- interval,
- ).Should(ContainSubstring("ErrImagePull"))
-
- waitFor := 1*time.Minute + 30*time.Second
- // The InstallPlan should eventually fail due to the ActiveDeadlineSeconds limit
- Eventually(
- func() (*operatorsv1alpha1.InstallPlan, error) {
- err := ctx.Ctx().Client().Get(context.Background(), client.ObjectKeyFromObject(ip), ip)
- return ip, err
- },
- waitFor,
- interval,
- ).Should(HavePhase(operatorsv1alpha1.InstallPlanPhaseFailed))
- })
-
- It("should timeout and fail the InstallPlan for an invalid bundle image", func() {
- Eventually(func() error {
- return ctx.Ctx().Client().Create(context.Background(), ip)
- }, timeout, interval).Should(Succeed(), "could not create InstallPlan")
-
- // The status gets ignored on create so we need to update it else the InstallPlan sync ignores
- // InstallPlans without any steps or bundle lookups
- // Create an InstallPlan status.bundleLookups.Path specified for an invalid bundle image
- now := metav1.Now()
- ip.Status = operatorsv1alpha1.InstallPlanStatus{
- Phase: operatorsv1alpha1.InstallPlanPhaseInstalling,
- CatalogSources: []string{},
- BundleLookups: []operatorsv1alpha1.BundleLookup{
- {
- Path: "alpine:3.13",
- Identifier: "foobar.v0.0.1",
- CatalogSourceRef: &corev1.ObjectReference{
- Namespace: ns.GetName(),
- Name: catsrcName,
- },
- Conditions: []operatorsv1alpha1.BundleLookupCondition{
- {
- Type: operatorsv1alpha1.BundleLookupPending,
- Status: corev1.ConditionTrue,
- Reason: "JobIncomplete",
- Message: "unpack job not completed",
- LastTransitionTime: &now,
- },
- },
- },
- },
- }
-
- Eventually(func() error {
- return ctx.Ctx().Client().Status().Update(context.Background(), ip)
- }, timeout, interval).Should(Succeed(), "could not update InstallPlan status")
-
- // The InstallPlan should fail after the unpack pod keeps failing and exceeds the job's
- // BackoffLimit(set to 3), which for 4 failures is an exponential backoff (10s + 20s + 40s + 80s)= 2m30s
- // so we wait a little over that.
- Eventually(
- func() (*operatorsv1alpha1.InstallPlan, error) {
- err := ctx.Ctx().Client().Get(context.Background(), client.ObjectKeyFromObject(ip), ip)
- return ip, err
- },
- 5*time.Minute,
- interval,
- ).Should(HavePhase(operatorsv1alpha1.InstallPlanPhaseFailed))
- })
-
- })
-
It("compresses installplan step resource manifests to configmap references", func() {
// Test ensures that all steps for index-based catalogs are references to configmaps. This avoids the problem
// of installplans growing beyond the etcd size limit when manifests are written to the ip status.
diff --git a/staging/operator-lifecycle-manager/test/e2e/magic_catalog.go b/staging/operator-lifecycle-manager/test/e2e/magic_catalog.go
index 983340b083..c558506505 100644
--- a/staging/operator-lifecycle-manager/test/e2e/magic_catalog.go
+++ b/staging/operator-lifecycle-manager/test/e2e/magic_catalog.go
@@ -257,7 +257,7 @@ func (c *MagicCatalog) makeCatalogSource() *operatorsv1alpha1.CatalogSource {
func (c *MagicCatalog) makeCatalogSourcePod() *corev1.Pod {
const (
- image = "quay.io/operator-framework/upstream-opm-builder"
+ image = "quay.io/operator-framework/opm"
readinessDelay int32 = 5
livenessDelay int32 = 10
volumeMountName string = "fbc-catalog"
diff --git a/staging/operator-lifecycle-manager/test/e2e/setup_bare_test.go b/staging/operator-lifecycle-manager/test/e2e/setup_bare_test.go
index 354e41cf68..f21ae71a98 100644
--- a/staging/operator-lifecycle-manager/test/e2e/setup_bare_test.go
+++ b/staging/operator-lifecycle-manager/test/e2e/setup_bare_test.go
@@ -7,7 +7,6 @@ import (
"context"
"flag"
"io"
- "io/ioutil"
"os"
"strings"
"testing"
@@ -65,7 +64,7 @@ func TestMain(m *testing.M) {
testNamespace = *namespace
if testNamespace == "" {
- testNamespaceBytes, err := ioutil.ReadFile("e2e.namespace")
+ testNamespaceBytes, err := os.ReadFile("e2e.namespace")
if err != nil || testNamespaceBytes == nil {
panic("no namespace set")
}
diff --git a/staging/operator-lifecycle-manager/test/e2e/split/main.go b/staging/operator-lifecycle-manager/test/e2e/split/main.go
index 30745d0cab..1637fdb567 100644
--- a/staging/operator-lifecycle-manager/test/e2e/split/main.go
+++ b/staging/operator-lifecycle-manager/test/e2e/split/main.go
@@ -4,7 +4,6 @@ import (
"flag"
"fmt"
"io"
- "io/ioutil"
"log"
"math"
"os"
@@ -106,7 +105,7 @@ func findDescribes(logger logrus.FieldLogger, dir string) ([]string, error) {
return nil, err
}
for _, match := range matches {
- b, err := ioutil.ReadFile(match)
+ b, err := os.ReadFile(match)
if err != nil {
return nil, err
}
diff --git a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go
index 766c0a5317..0c968997fb 100644
--- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go
+++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go
@@ -4,6 +4,7 @@ import (
"context"
"encoding/json"
"fmt"
+ "path/filepath"
"reflect"
"strings"
"sync"
@@ -22,11 +23,14 @@ import (
apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/discovery"
"sigs.k8s.io/controller-runtime/pkg/client"
"github.com/operator-framework/api/pkg/lib/version"
+ operatorsv1 "github.com/operator-framework/api/pkg/operators/v1"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned"
"github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install"
@@ -50,6 +54,7 @@ const (
var _ = Describe("Subscription", func() {
var (
generatedNamespace corev1.Namespace
+ operatorGroup operatorsv1.OperatorGroup
c operatorclient.ClientInterface
crc versioned.Interface
)
@@ -57,7 +62,15 @@ var _ = Describe("Subscription", func() {
BeforeEach(func() {
c = ctx.Ctx().KubeClient()
crc = ctx.Ctx().OperatorClient()
- generatedNamespace = SetupGeneratedTestNamespace(genName("subscription-e2e-"))
+
+ nsName := genName("subscription-e2e-")
+ operatorGroup = operatorsv1.OperatorGroup{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: fmt.Sprintf("%s-operatorgroup", nsName),
+ Namespace: nsName,
+ },
+ }
+ generatedNamespace = SetupGeneratedTestNamespaceWithOperatorGroup(nsName, operatorGroup)
})
AfterEach(func() {
@@ -2329,6 +2342,186 @@ var _ = Describe("Subscription", func() {
)))
})
})
+
+ It("unpacks bundle image", func() {
+ catsrc := &operatorsv1alpha1.CatalogSource{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: genName("kiali-"),
+ Namespace: generatedNamespace.GetName(),
+ Labels: map[string]string{"olm.catalogSource": "kaili-catalog"},
+ },
+ Spec: operatorsv1alpha1.CatalogSourceSpec{
+ Image: "quay.io/operator-framework/ci-index:latest",
+ SourceType: operatorsv1alpha1.SourceTypeGrpc,
+ GrpcPodConfig: &operatorsv1alpha1.GrpcPodConfig{
+ SecurityContextConfig: operatorsv1alpha1.Restricted,
+ },
+ },
+ }
+ catsrc, err := crc.OperatorsV1alpha1().CatalogSources(catsrc.GetNamespace()).Create(context.Background(), catsrc, metav1.CreateOptions{})
+ require.NoError(GinkgoT(), err)
+ defer func() {
+ Eventually(func() error {
+ return client.IgnoreNotFound(ctx.Ctx().Client().Delete(context.Background(), catsrc))
+ }).Should(Succeed())
+ }()
+
+ By("waiting for the CatalogSource to be ready")
+ catsrc, err = fetchCatalogSourceOnStatus(crc, catsrc.GetName(), catsrc.GetNamespace(), catalogSourceRegistryPodSynced)
+ require.NoError(GinkgoT(), err)
+
+ By("generating a Subscription")
+ subName := genName("kiali-")
+ cleanUpSubscriptionFn := createSubscriptionForCatalog(crc, catsrc.GetNamespace(), subName, catsrc.GetName(), "kiali", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
+ defer cleanUpSubscriptionFn()
+
+ By("waiting for the InstallPlan to get created for the subscription")
+ sub, err := fetchSubscription(crc, catsrc.GetNamespace(), subName, subscriptionHasInstallPlanChecker)
+ require.NoError(GinkgoT(), err)
+
+ By("waiting for the expected InstallPlan's execution to either fail or succeed")
+ ipName := sub.Status.InstallPlanRef.Name
+ ip, err := waitForInstallPlan(crc, ipName, sub.GetNamespace(), buildInstallPlanPhaseCheckFunc(operatorsv1alpha1.InstallPlanPhaseFailed, operatorsv1alpha1.InstallPlanPhaseComplete))
+ require.NoError(GinkgoT(), err)
+ require.Equal(GinkgoT(), operatorsv1alpha1.InstallPlanPhaseComplete, ip.Status.Phase, "InstallPlan not complete")
+
+ By("ensuring the InstallPlan contains the steps resolved from the bundle image")
+ operatorName := "kiali-operator"
+ expectedSteps := map[registry.ResourceKey]struct{}{
+ {Name: operatorName, Kind: "ClusterServiceVersion"}: {},
+ {Name: "kialis.kiali.io", Kind: "CustomResourceDefinition"}: {},
+ {Name: "monitoringdashboards.monitoring.kiali.io", Kind: "CustomResourceDefinition"}: {},
+ {Name: operatorName, Kind: "ServiceAccount"}: {},
+ {Name: operatorName, Kind: "ClusterRole"}: {},
+ {Name: operatorName, Kind: "ClusterRoleBinding"}: {},
+ }
+ require.Lenf(GinkgoT(), ip.Status.Plan, len(expectedSteps), "number of expected steps does not match installed: %v", ip.Status.Plan)
+
+ for _, step := range ip.Status.Plan {
+ key := registry.ResourceKey{
+ Name: step.Resource.Name,
+ Kind: step.Resource.Kind,
+ }
+ for expected := range expectedSteps {
+ if strings.HasPrefix(key.Name, expected.Name) && key.Kind == expected.Kind {
+ delete(expectedSteps, expected)
+ }
+ }
+ }
+ require.Lenf(GinkgoT(), expectedSteps, 0, "Actual resource steps do not match expected: %#v", expectedSteps)
+ })
+
+ When("unpacking bundle", func() {
+ var (
+ magicCatalog *MagicCatalog
+ catalogSourceName string
+ subName string
+ )
+
+ BeforeEach(func() {
+ By("deploying the testing catalog")
+ provider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.1.0.yaml"))
+ Expect(err).To(BeNil())
+ catalogSourceName = fmt.Sprintf("%s-catsrc", generatedNamespace.GetName())
+ magicCatalog = NewMagicCatalog(ctx.Ctx().Client(), generatedNamespace.GetName(), catalogSourceName, provider)
+ Expect(magicCatalog.DeployCatalog(context.Background())).To(BeNil())
+
+ By("creating the testing subscription")
+ subName = fmt.Sprintf("%s-packagea-sub", generatedNamespace.GetName())
+ createSubscriptionForCatalog(crc, generatedNamespace.GetName(), subName, catalogSourceName, "packageA", stableChannel, "", operatorsv1alpha1.ApprovalAutomatic)
+
+ By("waiting until the subscription has an IP reference")
+ subscription, err := fetchSubscription(crc, generatedNamespace.GetName(), subName, subscriptionHasInstallPlanChecker)
+ Expect(err).Should(BeNil())
+
+ By("waiting for the v0.1.0 CSV to report a succeeded phase")
+ _, err = fetchCSV(crc, subscription.Status.CurrentCSV, generatedNamespace.GetName(), buildCSVConditionChecker(operatorsv1alpha1.CSVPhaseSucceeded))
+ Expect(err).ShouldNot(HaveOccurred())
+ })
+
+ It("should not report unpacking progress or errors after successfull unpacking", func() {
+ By("verifying that the subscription is not reporting unpacking progress")
+ Eventually(
+ func() (corev1.ConditionStatus, error) {
+ fetched, err := crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Get(context.Background(), subName, metav1.GetOptions{})
+ if err != nil {
+ return "", err
+ }
+ cond := fetched.Status.GetCondition(v1alpha1.SubscriptionBundleUnpacking)
+ return cond.Status, nil
+ },
+ 5*time.Minute,
+ interval,
+ ).Should(Equal(corev1.ConditionFalse))
+
+ By("verifying that the subscription is not reporting unpacking errors")
+ Eventually(
+ func() (corev1.ConditionStatus, error) {
+ fetched, err := crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Get(context.Background(), subName, metav1.GetOptions{})
+ if err != nil {
+ return "", err
+ }
+ cond := fetched.Status.GetCondition(v1alpha1.SubscriptionBundleUnpackFailed)
+ return cond.Status, nil
+ },
+ 5*time.Minute,
+ interval,
+ ).Should(Equal(corev1.ConditionUnknown))
+ })
+
+ Context("with bundle which OLM will fail to unpack", func() {
+ BeforeEach(func() {
+ By("patching the OperatorGroup to reduce the bundle unpacking timeout")
+ ogNN := types.NamespacedName{Name: operatorGroup.GetName(), Namespace: generatedNamespace.GetName()}
+ addBundleUnpackTimeoutOGAnnotation(context.Background(), ctx.Ctx().Client(), ogNN, "1s")
+
+ By("updating the catalog with a broken v0.2.0 bundle image")
+ brokenProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.2.0-non-existent-tag.yaml"))
+ Expect(err).To(BeNil())
+ err = magicCatalog.UpdateCatalog(context.Background(), brokenProvider)
+ Expect(err).To(BeNil())
+ })
+
+ It("should expose a condition indicating failure to unpack", func() {
+ By("verifying that the subscription is reporting bundle unpack failure condition")
+ Eventually(
+ func() (string, error) {
+ fetched, err := crc.OperatorsV1alpha1().Subscriptions(generatedNamespace.GetName()).Get(context.Background(), subName, metav1.GetOptions{})
+ if err != nil {
+ return "", err
+ }
+ cond := fetched.Status.GetCondition(v1alpha1.SubscriptionBundleUnpackFailed)
+ if cond.Status != corev1.ConditionTrue || cond.Reason != "BundleUnpackFailed" {
+ return "", fmt.Errorf("%s condition not found", v1alpha1.SubscriptionBundleUnpackFailed)
+ }
+
+ return cond.Message, nil
+ },
+ 5*time.Minute,
+ interval,
+ ).Should(ContainSubstring("bundle unpacking failed. Reason: DeadlineExceeded"))
+
+ By("waiting for the subscription to maintain the example-operator.v0.1.0 status.currentCSV")
+ Consistently(subscriptionCurrentCSVGetter(crc, generatedNamespace.GetName(), subName)).Should(Equal("example-operator.v0.1.0"))
+ })
+
+ It("should be able to recover when catalog gets updated with a fixed version", func() {
+ By("patching the OperatorGroup to reduce the bundle unpacking timeout")
+ ogNN := types.NamespacedName{Name: operatorGroup.GetName(), Namespace: generatedNamespace.GetName()}
+ addBundleUnpackTimeoutOGAnnotation(context.Background(), ctx.Ctx().Client(), ogNN, "5m")
+
+ By("updating the catalog with a fixed v0.2.0 bundle image")
+ brokenProvider, err := NewFileBasedFiledBasedCatalogProvider(filepath.Join(testdataDir, failForwardTestDataBaseDir, "example-operator.v0.2.0.yaml"))
+ Expect(err).To(BeNil())
+ err = magicCatalog.UpdateCatalog(context.Background(), brokenProvider)
+ Expect(err).To(BeNil())
+
+ By("waiting for the subscription to have v0.2.0 installed")
+ _, err = fetchSubscription(crc, generatedNamespace.GetName(), subName, subscriptionHasCurrentCSV("example-operator.v0.2.0"))
+ Expect(err).Should(BeNil())
+ })
+ })
+ })
})
const (
@@ -2951,3 +3144,25 @@ func updateCatSrcPriority(crClient versioned.Interface, namespace string, catsrc
_, err := crClient.OperatorsV1alpha1().CatalogSources(namespace).Update(context.Background(), catsrc, metav1.UpdateOptions{})
Expect(err).Should(BeNil())
}
+
+func subscriptionCurrentCSVGetter(crclient versioned.Interface, namespace, subName string) func() string {
+ return func() string {
+ subscription, err := crclient.OperatorsV1alpha1().Subscriptions(namespace).Get(context.Background(), subName, metav1.GetOptions{})
+ if err != nil || subscription == nil {
+ return ""
+ }
+ return subscription.Status.CurrentCSV
+ }
+}
+
+func operatorGroupServiceAccountNameSetter(crclient versioned.Interface, namespace, name, saName string) func() error {
+ return func() error {
+ toUpdate, err := crclient.OperatorsV1().OperatorGroups(namespace).Get(context.Background(), name, metav1.GetOptions{})
+ if err != nil {
+ return err
+ }
+ toUpdate.Spec.ServiceAccountName = saName
+ _, err = crclient.OperatorsV1().OperatorGroups(namespace).Update(context.Background(), toUpdate, metav1.UpdateOptions{})
+ return err
+ }
+}
diff --git a/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-2.yaml b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-invalid-csv.yaml
similarity index 100%
rename from staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-2.yaml
rename to staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-invalid-csv.yaml
diff --git a/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-non-existent-tag.yaml b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-non-existent-tag.yaml
new file mode 100644
index 0000000000..555242e536
--- /dev/null
+++ b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0-non-existent-tag.yaml
@@ -0,0 +1,26 @@
+---
+schema: olm.package
+name: packageA
+defaultChannel: stable
+---
+schema: olm.channel
+package: packageA
+name: stable
+entries:
+ - name: example-operator.v0.2.0
+ replaces: example-operator.v0.1.0
+---
+schema: olm.bundle
+name: example-operator.v0.2.0
+package: packageA
+image: quay.io/olmtest/example-operator-bundle:non-existent-tag
+properties:
+ - type: olm.gvk
+ value:
+ group: example.com
+ kind: TestA
+ version: v1alpha1
+ - type: olm.package
+ value:
+ packageName: packageA
+ version: 1.0.1
diff --git a/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0.yaml b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0.yaml
index 555242e536..3058376dd5 100644
--- a/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0.yaml
+++ b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/base/example-operator.v0.2.0.yaml
@@ -13,7 +13,7 @@ entries:
schema: olm.bundle
name: example-operator.v0.2.0
package: packageA
-image: quay.io/olmtest/example-operator-bundle:non-existent-tag
+image: quay.io/olmtest/example-operator-bundle:0.2.0
properties:
- type: olm.gvk
value:
diff --git a/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/multiple-bad-versions/example-operator.v0.2.1.yaml b/staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/multiple-bad-versions/example-operator.v0.2.1-non-existent-tag.yaml
similarity index 100%
rename from staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/multiple-bad-versions/example-operator.v0.2.1.yaml
rename to staging/operator-lifecycle-manager/test/e2e/testdata/fail-forward/multiple-bad-versions/example-operator.v0.2.1-non-existent-tag.yaml
diff --git a/staging/operator-lifecycle-manager/test/e2e/util.go b/staging/operator-lifecycle-manager/test/e2e/util.go
index 9b0943aaab..1764292bf6 100644
--- a/staging/operator-lifecycle-manager/test/e2e/util.go
+++ b/staging/operator-lifecycle-manager/test/e2e/util.go
@@ -89,21 +89,20 @@ func objectRefToNamespacedName(ip *corev1.ObjectReference) types.NamespacedName
}
}
-// addBundleUnpackTimeoutIPAnnotation is a helper function that's responsible for
-// adding the "operatorframework.io/bundle-unpack-timeout" annotation to an InstallPlan
-// resource. This allows you to have more control over the bundle unpack timeout when interacting
-// with test InstallPlan resources.
-func addBundleUnpackTimeoutIPAnnotation(ctx context.Context, c k8scontrollerclient.Client, ipNN types.NamespacedName, timeout string) {
+// addBundleUnpackTimeoutOGAnnotation is a helper function that's responsible for
+// adding the "operatorframework.io/bundle-unpack-timeout" annotation to an OperatorGroup
+// resource.
+func addBundleUnpackTimeoutOGAnnotation(ctx context.Context, c k8scontrollerclient.Client, ogNN types.NamespacedName, timeout string) {
Eventually(func() error {
- ip := &operatorsv1alpha1.InstallPlan{}
- if err := c.Get(ctx, ipNN, ip); err != nil {
+ og := &operatorsv1.OperatorGroup{}
+ if err := c.Get(ctx, ogNN, og); err != nil {
return err
}
- annotations := make(map[string]string)
+ annotations := og.GetAnnotations()
annotations[bundle.BundleUnpackTimeoutAnnotationKey] = timeout
- ip.SetAnnotations(annotations)
+ og.SetAnnotations(annotations)
- return c.Update(ctx, ip)
+ return c.Update(ctx, og)
}).Should(Succeed())
}
diff --git a/staging/operator-lifecycle-manager/test/e2e/util/resource_queue.go b/staging/operator-lifecycle-manager/test/e2e/util/resource_queue.go
index eabe5db77a..03eca665f6 100644
--- a/staging/operator-lifecycle-manager/test/e2e/util/resource_queue.go
+++ b/staging/operator-lifecycle-manager/test/e2e/util/resource_queue.go
@@ -79,7 +79,7 @@ func (q *ResourceQueue) DequeueHead() (k8scontrollerclient.Object, bool) {
func (q *ResourceQueue) DequeueTail() (k8scontrollerclient.Object, bool) {
q.lock.Lock()
defer q.lock.Unlock()
-
+
if len(q.queue) == 0 {
return nil, false
}
diff --git a/staging/operator-lifecycle-manager/util/cpb/main.go b/staging/operator-lifecycle-manager/util/cpb/main.go
index ae9912bf97..5b1769bb37 100644
--- a/staging/operator-lifecycle-manager/util/cpb/main.go
+++ b/staging/operator-lifecycle-manager/util/cpb/main.go
@@ -2,7 +2,6 @@ package main
import (
"fmt"
- "io/ioutil"
"os"
"path/filepath"
@@ -118,7 +117,7 @@ func getMetadata() (m *metadata, err error) {
m.annotationsFile = path
// Unmarshal metadata
- content, err := ioutil.ReadFile(path)
+ content, err := os.ReadFile(path)
if err != nil {
return fmt.Errorf("couldn't get content of annotations.yaml file: %s", path)
}
diff --git a/staging/operator-registry/.github/workflows/build.yaml b/staging/operator-registry/.github/workflows/build.yaml
index 80a591d3cd..345c8e9b64 100644
--- a/staging/operator-registry/.github/workflows/build.yaml
+++ b/staging/operator-registry/.github/workflows/build.yaml
@@ -12,8 +12,8 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-go@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
+ go-version-file: "go.mod"
- run: make build
diff --git a/staging/operator-registry/.github/workflows/codecov.sh b/staging/operator-registry/.github/workflows/codecov.sh
deleted file mode 100755
index 914a56277f..0000000000
--- a/staging/operator-registry/.github/workflows/codecov.sh
+++ /dev/null
@@ -1,1884 +0,0 @@
-#!/usr/bin/env bash
-
-# Apache License Version 2.0, January 2004
-# https://github.com/codecov/codecov-bash/blob/master/LICENSE
-
-set -e +o pipefail
-
-VERSION="1.0.1"
-
-codecov_flags=( )
-url="https://codecov.io"
-env="$CODECOV_ENV"
-service=""
-token=""
-search_in=""
-# shellcheck disable=SC2153
-flags="$CODECOV_FLAGS"
-exit_with=0
-curlargs=""
-curlawsargs=""
-dump="0"
-clean="0"
-curl_s="-s"
-name="$CODECOV_NAME"
-include_cov=""
-exclude_cov=""
-ddp="$HOME/Library/Developer/Xcode/DerivedData"
-xp=""
-files=""
-save_to=""
-direct_file_upload=""
-cacert="$CODECOV_CA_BUNDLE"
-gcov_ignore="-not -path './bower_components/**' -not -path './node_modules/**' -not -path './vendor/**'"
-gcov_include=""
-
-ft_gcov="1"
-ft_coveragepy="1"
-ft_fix="1"
-ft_search="1"
-ft_s3="1"
-ft_network="1"
-ft_xcodellvm="1"
-ft_xcodeplist="0"
-ft_gcovout="1"
-ft_html="0"
-ft_yaml="0"
-
-_git_root=$(git rev-parse --show-toplevel 2>/dev/null || hg root 2>/dev/null || echo "$PWD")
-git_root="$_git_root"
-remote_addr=""
-if [ "$git_root" = "$PWD" ];
-then
- git_root="."
-fi
-
-branch_o=""
-build_o=""
-commit_o=""
-pr_o=""
-prefix_o=""
-network_filter_o=""
-search_in_o=""
-slug_o=""
-tag_o=""
-url_o=""
-git_ls_files_recurse_submodules_o=""
-package="bash"
-
-commit="$VCS_COMMIT_ID"
-branch="$VCS_BRANCH_NAME"
-pr="$VCS_PULL_REQUEST"
-slug="$VCS_SLUG"
-tag="$VCS_TAG"
-build_url="$CI_BUILD_URL"
-build="$CI_BUILD_ID"
-job="$CI_JOB_ID"
-
-beta_xcode_partials=""
-
-proj_root="$git_root"
-gcov_exe="gcov"
-gcov_arg=""
-
-b="\033[0;36m"
-g="\033[0;32m"
-r="\033[0;31m"
-e="\033[0;90m"
-y="\033[0;33m"
-x="\033[0m"
-
-show_help() {
-cat << EOF
-
- Codecov Bash $VERSION
-
- Global report uploading tool for Codecov
- Documentation at https://docs.codecov.io/docs
- Contribute at https://github.com/codecov/codecov-bash
-
-
- -h Display this help and exit
- -f FILE Target file(s) to upload
-
- -f "path/to/file" only upload this file
- skips searching unless provided patterns below
-
- -f '!*.bar' ignore all files at pattern *.bar
- -f '*.foo' include all files at pattern *.foo
- Must use single quotes.
- This is non-exclusive, use -s "*.foo" to match specific paths.
-
- -s DIR Directory to search for coverage reports.
- Already searches project root and artifact folders.
- -t TOKEN Set the private repository token
- (option) set environment variable CODECOV_TOKEN=:uuid
-
- -t @/path/to/token_file
- -t uuid
-
- -n NAME Custom defined name of the upload. Visible in Codecov UI
-
- -e ENV Specify environment variables to be included with this build
- Also accepting environment variables: CODECOV_ENV=VAR,VAR2
-
- -e VAR,VAR2
-
- -k prefix Prefix filepaths to help resolve path fixing
-
- -i prefix Only include files in the network with a certain prefix. Useful for upload-specific path fixing
-
- -X feature Toggle functionalities
-
- -X gcov Disable gcov
- -X coveragepy Disable python coverage
- -X fix Disable report fixing
- -X search Disable searching for reports
- -X xcode Disable xcode processing
- -X network Disable uploading the file network
- -X gcovout Disable gcov output
- -X html Enable coverage for HTML files
- -X recursesubs Enable recurse submodules in git projects when searching for source files
- -X yaml Enable coverage for YAML files
-
- -N The commit SHA of the parent for which you are uploading coverage. If not present,
- the parent will be determined using the API of your repository provider.
- When using the repository provider's API, the parent is determined via finding
- the closest ancestor to the commit.
-
- -R root dir Used when not in git/hg project to identify project root directory
- -F flag Flag the upload to group coverage metrics
-
- -F unittests This upload is only unittests
- -F integration This upload is only integration tests
- -F ui,chrome This upload is Chrome - UI tests
-
- -c Move discovered coverage reports to the trash
- -z FILE Upload specified file directly to Codecov and bypass all report generation.
- This is inteded to be used only with a pre-formatted Codecov report and is not
- expected to work under any other circumstances.
- -Z Exit with 1 if not successful. Default will Exit with 0
-
- -- xcode --
- -D Custom Derived Data Path for Coverage.profdata and gcov processing
- Default '~/Library/Developer/Xcode/DerivedData'
- -J Specify packages to build coverage. Uploader will only build these packages.
- This can significantly reduces time to build coverage reports.
-
- -J 'MyAppName' Will match "MyAppName" and "MyAppNameTests"
- -J '^ExampleApp$' Will match only "ExampleApp" not "ExampleAppTests"
-
- -- gcov --
- -g GLOB Paths to ignore during gcov gathering
- -G GLOB Paths to include during gcov gathering
- -p dir Project root directory
- Also used when preparing gcov
- -x gcovexe gcov executable to run. Defaults to 'gcov'
- -a gcovargs extra arguments to pass to gcov
-
- -- Override CI Environment Variables --
- These variables are automatically detected by popular CI providers
-
- -B branch Specify the branch name
- -C sha Specify the commit sha
- -P pr Specify the pull request number
- -b build Specify the build number
- -T tag Specify the git tag
-
- -- Enterprise --
- -u URL Set the target url for Enterprise customers
- Not required when retrieving the bash uploader from your CCE
- (option) Set environment variable CODECOV_URL=https://my-hosted-codecov.com
- -r SLUG owner/repo slug used instead of the private repo token in Enterprise
- (option) set environment variable CODECOV_SLUG=:owner/:repo
- (option) set in your codecov.yml "codecov.slug"
- -S PATH File path to your cacert.pem file used to verify ssl with Codecov Enterprise (optional)
- (option) Set environment variable: CODECOV_CA_BUNDLE="/path/to/ca.pem"
- -U curlargs Extra curl arguments to communicate with Codecov. e.g., -U "--proxy http://http-proxy"
- -A curlargs Extra curl arguments to communicate with AWS.
-
- -- Debugging --
- -d Don't upload, but dump upload file to stdout
- -q PATH Write upload file to path
- -K Remove color from the output
- -v Verbose mode
-
-EOF
-}
-
-
-say() {
- echo -e "$1"
-}
-
-
-urlencode() {
- echo "$1" | curl -Gso /dev/null -w "%{url_effective}" --data-urlencode @- "" | cut -c 3- | sed -e 's/%0A//'
-}
-
-swiftcov() {
- _dir=$(dirname "$1" | sed 's/\(Build\).*/\1/g')
- for _type in app framework xctest
- do
- find "$_dir" -name "*.$_type" | while read -r f
- do
- _proj=${f##*/}
- _proj=${_proj%."$_type"}
- if [ "$2" = "" ] || [ "$(echo "$_proj" | grep -i "$2")" != "" ];
- then
- say " $g+$x Building reports for $_proj $_type"
- dest=$([ -f "$f/$_proj" ] && echo "$f/$_proj" || echo "$f/Contents/MacOS/$_proj")
- # shellcheck disable=SC2001
- _proj_name=$(echo "$_proj" | sed -e 's/[[:space:]]//g')
- # shellcheck disable=SC2086
- xcrun llvm-cov show $beta_xcode_partials -instr-profile "$1" "$dest" > "$_proj_name.$_type.coverage.txt" \
- || say " ${r}x>${x} llvm-cov failed to produce results for $dest"
- fi
- done
- done
-}
-
-
-# Credits to: https://gist.github.com/pkuczynski/8665367
-parse_yaml() {
- local prefix=$2
- local s='[[:space:]]*' w='[a-zA-Z0-9_]*'
- local fs
- fs=$(echo @|tr @ '\034')
- sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
- -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" "$1" |
- awk -F"$fs" '{
- indent = length($1)/2;
- vname[indent] = $2;
- for (i in vname) {if (i > indent) {delete vname[i]}}
- if (length($3) > 0) {
- vn=""; if (indent > 0) {vn=(vn)(vname[0])("_")}
- printf("%s%s%s=\"%s\"\n", "'"$prefix"'",vn, $2, $3);
- }
- }'
-}
-
-if [ $# != 0 ];
-then
- while getopts "a:A:b:B:cC:dD:e:f:F:g:G:hi:J:k:Kn:p:P:Q:q:r:R:s:S:t:T:u:U:vx:X:Zz:N:-" o
- do
- codecov_flags+=( "$o" )
- case "$o" in
- "-")
- echo -e "${r}Long options are not supported${x}"
- exit 2
- ;;
- "?")
- ;;
- "N")
- parent=$OPTARG
- ;;
- "a")
- gcov_arg=$OPTARG
- ;;
- "A")
- curlawsargs="$OPTARG"
- ;;
- "b")
- build_o="$OPTARG"
- ;;
- "B")
- branch_o="$OPTARG"
- ;;
- "c")
- clean="1"
- ;;
- "C")
- commit_o="$OPTARG"
- ;;
- "d")
- dump="1"
- ;;
- "D")
- ddp="$OPTARG"
- ;;
- "e")
- env="$env,$OPTARG"
- ;;
- "f")
- if [ "${OPTARG::1}" = "!" ];
- then
- exclude_cov="$exclude_cov -not -path '${OPTARG:1}'"
-
- elif [[ "$OPTARG" = *"*"* ]];
- then
- include_cov="$include_cov -or -path '$OPTARG'"
-
- else
- ft_search=0
- if [ "$files" = "" ];
- then
- files="$OPTARG"
- else
- files="$files
-$OPTARG"
- fi
- fi
- ;;
- "F")
- if [ "$flags" = "" ];
- then
- flags="$OPTARG"
- else
- flags="$flags,$OPTARG"
- fi
- ;;
- "g")
- gcov_ignore="$gcov_ignore -not -path '$OPTARG'"
- ;;
- "G")
- gcov_include="$gcov_include -path '$OPTARG'"
- ;;
- "h")
- show_help
- exit 0;
- ;;
- "i")
- network_filter_o="$OPTARG"
- ;;
- "J")
- ft_xcodellvm="1"
- ft_xcodeplist="0"
- if [ "$xp" = "" ];
- then
- xp="$OPTARG"
- else
- xp="$xp\|$OPTARG"
- fi
- ;;
- "k")
- prefix_o=$(echo "$OPTARG" | sed -e 's:^/*::' -e 's:/*$::')
- ;;
- "K")
- b=""
- g=""
- r=""
- e=""
- x=""
- ;;
- "n")
- name="$OPTARG"
- ;;
- "p")
- proj_root="$OPTARG"
- ;;
- "P")
- pr_o="$OPTARG"
- ;;
- "Q")
- # this is only meant for Codecov packages to overwrite
- package="$OPTARG"
- ;;
- "q")
- save_to="$OPTARG"
- ;;
- "r")
- slug_o="$OPTARG"
- ;;
- "R")
- git_root="$OPTARG"
- ;;
- "s")
- if [ "$search_in_o" = "" ];
- then
- search_in_o="$OPTARG"
- else
- search_in_o="$search_in_o $OPTARG"
- fi
- ;;
- "S")
- # shellcheck disable=SC2089
- cacert="--cacert \"$OPTARG\""
- ;;
- "t")
- if [ "${OPTARG::1}" = "@" ];
- then
- token=$(< "${OPTARG:1}" tr -d ' \n')
- else
- token="$OPTARG"
- fi
- ;;
- "T")
- tag_o="$OPTARG"
- ;;
- "u")
- url_o=$(echo "$OPTARG" | sed -e 's/\/$//')
- ;;
- "U")
- curlargs="$OPTARG"
- ;;
- "v")
- set -x
- curl_s=""
- ;;
- "x")
- gcov_exe=$OPTARG
- ;;
- "X")
- if [ "$OPTARG" = "gcov" ];
- then
- ft_gcov="0"
- elif [ "$OPTARG" = "coveragepy" ] || [ "$OPTARG" = "py" ];
- then
- ft_coveragepy="0"
- elif [ "$OPTARG" = "gcovout" ];
- then
- ft_gcovout="0"
- elif [ "$OPTARG" = "xcodellvm" ];
- then
- ft_xcodellvm="1"
- ft_xcodeplist="0"
- elif [ "$OPTARG" = "fix" ] || [ "$OPTARG" = "fixes" ];
- then
- ft_fix="0"
- elif [ "$OPTARG" = "xcode" ];
- then
- ft_xcodellvm="0"
- ft_xcodeplist="0"
- elif [ "$OPTARG" = "search" ];
- then
- ft_search="0"
- elif [ "$OPTARG" = "xcodepartials" ];
- then
- beta_xcode_partials="-use-color"
- elif [ "$OPTARG" = "network" ];
- then
- ft_network="0"
- elif [ "$OPTARG" = "s3" ];
- then
- ft_s3="0"
- elif [ "$OPTARG" = "html" ];
- then
- ft_html="1"
- elif [ "$OPTARG" = "recursesubs" ];
- then
- git_ls_files_recurse_submodules_o="--recurse-submodules"
- elif [ "$OPTARG" = "yaml" ];
- then
- ft_yaml="1"
- fi
- ;;
- "Z")
- exit_with=1
- ;;
- "z")
- direct_file_upload="$OPTARG"
- ft_gcov="0"
- ft_coveragepy="0"
- ft_fix="0"
- ft_search="0"
- ft_network="0"
- ft_xcodellvm="0"
- ft_gcovout="0"
- include_cov=""
- ;;
- *)
- echo -e "${r}Unexpected flag not supported${x}"
- ;;
- esac
- done
-fi
-
-say "
- _____ _
- / ____| | |
-| | ___ __| | ___ ___ _____ __
-| | / _ \\ / _\` |/ _ \\/ __/ _ \\ \\ / /
-| |___| (_) | (_| | __/ (_| (_) \\ V /
- \\_____\\___/ \\__,_|\\___|\\___\\___/ \\_/
- Bash-$VERSION
-
-"
-
-# check for installed tools
-# git/hg
-if [ "$direct_file_upload" = "" ];
-then
- if [ -x "$(command -v git)" ];
- then
- say "$b==>$x $(git --version) found"
- else
- say "$y==>$x git not installed, testing for mercurial"
- if [ -x "$(command -v hg)" ];
- then
- say "$b==>$x $(hg --version) found"
- else
- say "$r==>$x git nor mercurial are installed. Uploader may fail or have unintended consequences"
- fi
- fi
-fi
-# curl
-if [ -x "$(command -v curl)" ];
-then
- say "$b==>$x $(curl --version)"
-else
- say "$r==>$x curl not installed. Exiting."
- exit ${exit_with};
-fi
-
-search_in="$proj_root"
-
-#shellcheck disable=SC2154
-if [ "$JENKINS_URL" != "" ];
-then
- say "$e==>$x Jenkins CI detected."
- # https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
- # https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin#GitHubpullrequestbuilderplugin-EnvironmentVariables
- service="jenkins"
-
- # shellcheck disable=SC2154
- if [ "$ghprbSourceBranch" != "" ];
- then
- branch="$ghprbSourceBranch"
- elif [ "$GIT_BRANCH" != "" ];
- then
- branch="$GIT_BRANCH"
- elif [ "$BRANCH_NAME" != "" ];
- then
- branch="$BRANCH_NAME"
- fi
-
- # shellcheck disable=SC2154
- if [ "$ghprbActualCommit" != "" ];
- then
- commit="$ghprbActualCommit"
- elif [ "$GIT_COMMIT" != "" ];
- then
- commit="$GIT_COMMIT"
- fi
-
- # shellcheck disable=SC2154
- if [ "$ghprbPullId" != "" ];
- then
- pr="$ghprbPullId"
- elif [ "$CHANGE_ID" != "" ];
- then
- pr="$CHANGE_ID"
- fi
-
- build="$BUILD_NUMBER"
- # shellcheck disable=SC2153
- build_url=$(urlencode "$BUILD_URL")
-
-elif [ "$CI" = "true" ] && [ "$TRAVIS" = "true" ] && [ "$SHIPPABLE" != "true" ];
-then
- say "$e==>$x Travis CI detected."
- # https://docs.travis-ci.com/user/environment-variables/
- service="travis"
- commit="${TRAVIS_PULL_REQUEST_SHA:-$TRAVIS_COMMIT}"
- build="$TRAVIS_JOB_NUMBER"
- pr="$TRAVIS_PULL_REQUEST"
- job="$TRAVIS_JOB_ID"
- slug="$TRAVIS_REPO_SLUG"
- env="$env,TRAVIS_OS_NAME"
- tag="$TRAVIS_TAG"
- if [ "$TRAVIS_BRANCH" != "$TRAVIS_TAG" ];
- then
- branch="${TRAVIS_PULL_REQUEST_BRANCH:-$TRAVIS_BRANCH}"
- fi
-
- language=$(compgen -A variable | grep "^TRAVIS_.*_VERSION$" | head -1)
- if [ "$language" != "" ];
- then
- env="$env,${!language}"
- fi
-
-elif [ "$CODEBUILD_CI" = "true" ];
-then
- say "$e==>$x AWS Codebuild detected."
- # https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
- service="codebuild"
- commit="$CODEBUILD_RESOLVED_SOURCE_VERSION"
- build="$CODEBUILD_BUILD_ID"
- branch="$(echo "$CODEBUILD_WEBHOOK_HEAD_REF" | sed 's/^refs\/heads\///')"
- if [ "${CODEBUILD_SOURCE_VERSION/pr}" = "$CODEBUILD_SOURCE_VERSION" ] ; then
- pr="false"
- else
- pr="$(echo "$CODEBUILD_SOURCE_VERSION" | sed 's/^pr\///')"
- fi
- job="$CODEBUILD_BUILD_ID"
- slug="$(echo "$CODEBUILD_SOURCE_REPO_URL" | sed 's/^.*:\/\/[^\/]*\///' | sed 's/\.git$//')"
-
-elif [ "$CI" = "true" ] && [ "$CI_NAME" = "codeship" ];
-then
- say "$e==>$x Codeship CI detected."
- # https://www.codeship.io/documentation/continuous-integration/set-environment-variables/
- service="codeship"
- branch="$CI_BRANCH"
- build="$CI_BUILD_NUMBER"
- build_url=$(urlencode "$CI_BUILD_URL")
- commit="$CI_COMMIT_ID"
-
-elif [ -n "$CF_BUILD_URL" ] && [ -n "$CF_BUILD_ID" ];
-then
- say "$e==>$x Codefresh CI detected."
- # https://docs.codefresh.io/v1.0/docs/variables
- service="codefresh"
- branch="$CF_BRANCH"
- build="$CF_BUILD_ID"
- build_url=$(urlencode "$CF_BUILD_URL")
- commit="$CF_REVISION"
-
-elif [ "$TEAMCITY_VERSION" != "" ];
-then
- say "$e==>$x TeamCity CI detected."
- # https://confluence.jetbrains.com/display/TCD8/Predefined+Build+Parameters
- # https://confluence.jetbrains.com/plugins/servlet/mobile#content/view/74847298
- if [ "$TEAMCITY_BUILD_BRANCH" = '' ];
- then
- echo " Teamcity does not automatically make build parameters available as environment variables."
- echo " Add the following environment parameters to the build configuration"
- echo " env.TEAMCITY_BUILD_BRANCH = %teamcity.build.branch%"
- echo " env.TEAMCITY_BUILD_ID = %teamcity.build.id%"
- echo " env.TEAMCITY_BUILD_URL = %teamcity.serverUrl%/viewLog.html?buildId=%teamcity.build.id%"
- echo " env.TEAMCITY_BUILD_COMMIT = %system.build.vcs.number%"
- echo " env.TEAMCITY_BUILD_REPOSITORY = %vcsroot..url%"
- fi
- service="teamcity"
- branch="$TEAMCITY_BUILD_BRANCH"
- build="$TEAMCITY_BUILD_ID"
- build_url=$(urlencode "$TEAMCITY_BUILD_URL")
- if [ "$TEAMCITY_BUILD_COMMIT" != "" ];
- then
- commit="$TEAMCITY_BUILD_COMMIT"
- else
- commit="$BUILD_VCS_NUMBER"
- fi
- remote_addr="$TEAMCITY_BUILD_REPOSITORY"
-
-elif [ "$CI" = "true" ] && [ "$CIRCLECI" = "true" ];
-then
- say "$e==>$x Circle CI detected."
- # https://circleci.com/docs/environment-variables
- service="circleci"
- branch="$CIRCLE_BRANCH"
- build="$CIRCLE_BUILD_NUM"
- job="$CIRCLE_NODE_INDEX"
- if [ "$CIRCLE_PROJECT_REPONAME" != "" ];
- then
- slug="$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME"
- else
- # git@github.com:owner/repo.git
- slug="${CIRCLE_REPOSITORY_URL##*:}"
- # owner/repo.git
- slug="${slug%%.git}"
- fi
- pr="${CIRCLE_PULL_REQUEST##*/}"
- commit="$CIRCLE_SHA1"
- search_in="$search_in $CIRCLE_ARTIFACTS $CIRCLE_TEST_REPORTS"
-
-elif [ "$BUDDYBUILD_BRANCH" != "" ];
-then
- say "$e==>$x buddybuild detected"
- # http://docs.buddybuild.com/v6/docs/custom-prebuild-and-postbuild-steps
- service="buddybuild"
- branch="$BUDDYBUILD_BRANCH"
- build="$BUDDYBUILD_BUILD_NUMBER"
- build_url="https://dashboard.buddybuild.com/public/apps/$BUDDYBUILD_APP_ID/build/$BUDDYBUILD_BUILD_ID"
- # BUDDYBUILD_TRIGGERED_BY
- if [ "$ddp" = "$HOME/Library/Developer/Xcode/DerivedData" ];
- then
- ddp="/private/tmp/sandbox/${BUDDYBUILD_APP_ID}/bbtest"
- fi
-
-elif [ "${bamboo_planRepository_revision}" != "" ];
-then
- say "$e==>$x Bamboo detected"
- # https://confluence.atlassian.com/bamboo/bamboo-variables-289277087.html#Bamboovariables-Build-specificvariables
- service="bamboo"
- commit="${bamboo_planRepository_revision}"
- # shellcheck disable=SC2154
- branch="${bamboo_planRepository_branch}"
- # shellcheck disable=SC2154
- build="${bamboo_buildNumber}"
- # shellcheck disable=SC2154
- build_url="${bamboo_buildResultsUrl}"
- # shellcheck disable=SC2154
- remote_addr="${bamboo_planRepository_repositoryUrl}"
-
-elif [ "$CI" = "true" ] && [ "$BITRISE_IO" = "true" ];
-then
- # http://devcenter.bitrise.io/faq/available-environment-variables/
- say "$e==>$x Bitrise CI detected."
- service="bitrise"
- branch="$BITRISE_GIT_BRANCH"
- build="$BITRISE_BUILD_NUMBER"
- build_url=$(urlencode "$BITRISE_BUILD_URL")
- pr="$BITRISE_PULL_REQUEST"
- if [ "$GIT_CLONE_COMMIT_HASH" != "" ];
- then
- commit="$GIT_CLONE_COMMIT_HASH"
- fi
-
-elif [ "$CI" = "true" ] && [ "$SEMAPHORE" = "true" ];
-then
- say "$e==>$x Semaphore CI detected."
-# https://docs.semaphoreci.com/ci-cd-environment/environment-variables/#semaphore-related
- service="semaphore"
- branch="$SEMAPHORE_GIT_BRANCH"
- build="$SEMAPHORE_WORKFLOW_NUMBER"
- job="$SEMAPHORE_JOB_ID"
- pr="$PULL_REQUEST_NUMBER"
- slug="$SEMAPHORE_REPO_SLUG"
- commit="$REVISION"
- env="$env,SEMAPHORE_TRIGGER_SOURCE"
-
-elif [ "$CI" = "true" ] && [ "$BUILDKITE" = "true" ];
-then
- say "$e==>$x Buildkite CI detected."
- # https://buildkite.com/docs/guides/environment-variables
- service="buildkite"
- branch="$BUILDKITE_BRANCH"
- build="$BUILDKITE_BUILD_NUMBER"
- job="$BUILDKITE_JOB_ID"
- build_url=$(urlencode "$BUILDKITE_BUILD_URL")
- slug="$BUILDKITE_PROJECT_SLUG"
- commit="$BUILDKITE_COMMIT"
- if [[ "$BUILDKITE_PULL_REQUEST" != "false" ]]; then
- pr="$BUILDKITE_PULL_REQUEST"
- fi
- tag="$BUILDKITE_TAG"
-
-elif [ "$CI" = "drone" ] || [ "$DRONE" = "true" ];
-then
- say "$e==>$x Drone CI detected."
- # http://docs.drone.io/env.html
- # drone commits are not full shas
- service="drone.io"
- branch="$DRONE_BRANCH"
- build="$DRONE_BUILD_NUMBER"
- build_url=$(urlencode "${DRONE_BUILD_LINK}")
- pr="$DRONE_PULL_REQUEST"
- job="$DRONE_JOB_NUMBER"
- tag="$DRONE_TAG"
-
-elif [ "$CI" = "true" ] && [ "$HEROKU_TEST_RUN_BRANCH" != "" ];
-then
- say "$e==>$x Heroku CI detected."
- # https://devcenter.heroku.com/articles/heroku-ci#environment-variables
- service="heroku"
- branch="$HEROKU_TEST_RUN_BRANCH"
- build="$HEROKU_TEST_RUN_ID"
- commit="$HEROKU_TEST_RUN_COMMIT_VERSION"
-
-elif [[ "$CI" = "true" || "$CI" = "True" ]] && [[ "$APPVEYOR" = "true" || "$APPVEYOR" = "True" ]];
-then
- say "$e==>$x Appveyor CI detected."
- # http://www.appveyor.com/docs/environment-variables
- service="appveyor"
- branch="$APPVEYOR_REPO_BRANCH"
- build=$(urlencode "$APPVEYOR_JOB_ID")
- pr="$APPVEYOR_PULL_REQUEST_NUMBER"
- job="$APPVEYOR_ACCOUNT_NAME%2F$APPVEYOR_PROJECT_SLUG%2F$APPVEYOR_BUILD_VERSION"
- slug="$APPVEYOR_REPO_NAME"
- commit="$APPVEYOR_REPO_COMMIT"
- build_url=$(urlencode "${APPVEYOR_URL}/project/${APPVEYOR_REPO_NAME}/builds/$APPVEYOR_BUILD_ID/job/${APPVEYOR_JOB_ID}")
-
-elif [ "$CI" = "true" ] && [ "$WERCKER_GIT_BRANCH" != "" ];
-then
- say "$e==>$x Wercker CI detected."
- # http://devcenter.wercker.com/articles/steps/variables.html
- service="wercker"
- branch="$WERCKER_GIT_BRANCH"
- build="$WERCKER_MAIN_PIPELINE_STARTED"
- slug="$WERCKER_GIT_OWNER/$WERCKER_GIT_REPOSITORY"
- commit="$WERCKER_GIT_COMMIT"
-
-elif [ "$CI" = "true" ] && [ "$MAGNUM" = "true" ];
-then
- say "$e==>$x Magnum CI detected."
- # https://magnum-ci.com/docs/environment
- service="magnum"
- branch="$CI_BRANCH"
- build="$CI_BUILD_NUMBER"
- commit="$CI_COMMIT"
-
-elif [ "$SHIPPABLE" = "true" ];
-then
- say "$e==>$x Shippable CI detected."
- # http://docs.shippable.com/ci_configure/
- service="shippable"
- # shellcheck disable=SC2153
- branch=$([ "$HEAD_BRANCH" != "" ] && echo "$HEAD_BRANCH" || echo "$BRANCH")
- build="$BUILD_NUMBER"
- build_url=$(urlencode "$BUILD_URL")
- pr="$PULL_REQUEST"
- slug="$REPO_FULL_NAME"
- # shellcheck disable=SC2153
- commit="$COMMIT"
-
-elif [ "$TDDIUM" = "true" ];
-then
- say "Solano CI detected."
- # http://docs.solanolabs.com/Setup/tddium-set-environment-variables/
- service="solano"
- commit="$TDDIUM_CURRENT_COMMIT"
- branch="$TDDIUM_CURRENT_BRANCH"
- build="$TDDIUM_TID"
- pr="$TDDIUM_PR_ID"
-
-elif [ "$GREENHOUSE" = "true" ];
-then
- say "$e==>$x Greenhouse CI detected."
- # http://docs.greenhouseci.com/docs/environment-variables-files
- service="greenhouse"
- branch="$GREENHOUSE_BRANCH"
- build="$GREENHOUSE_BUILD_NUMBER"
- build_url=$(urlencode "$GREENHOUSE_BUILD_URL")
- pr="$GREENHOUSE_PULL_REQUEST"
- commit="$GREENHOUSE_COMMIT"
- search_in="$search_in $GREENHOUSE_EXPORT_DIR"
-
-elif [ "$GITLAB_CI" != "" ];
-then
- say "$e==>$x GitLab CI detected."
- # http://doc.gitlab.com/ce/ci/variables/README.html
- service="gitlab"
- branch="${CI_BUILD_REF_NAME:-$CI_COMMIT_REF_NAME}"
- build="${CI_BUILD_ID:-$CI_JOB_ID}"
- remote_addr="${CI_BUILD_REPO:-$CI_REPOSITORY_URL}"
- commit="${CI_BUILD_REF:-$CI_COMMIT_SHA}"
- slug="${CI_PROJECT_PATH}"
-
-elif [ "$GITHUB_ACTIONS" != "" ];
-then
- say "$e==>$x GitHub Actions detected."
- say " Env vars used:"
- say " -> GITHUB_ACTIONS: ${GITHUB_ACTIONS}"
- say " -> GITHUB_HEAD_REF: ${GITHUB_HEAD_REF}"
- say " -> GITHUB_REF: ${GITHUB_REF}"
- say " -> GITHUB_REPOSITORY: ${GITHUB_REPOSITORY}"
- say " -> GITHUB_RUN_ID: ${GITHUB_RUN_ID}"
- say " -> GITHUB_SHA: ${GITHUB_SHA}"
- say " -> GITHUB_WORKFLOW: ${GITHUB_WORKFLOW}"
-
- # https://github.com/features/actions
- service="github-actions"
-
- # https://help.github.com/en/articles/virtual-environments-for-github-actions#environment-variables
- branch="${GITHUB_REF#refs/heads/}"
- if [ "$GITHUB_HEAD_REF" != "" ];
- then
- # PR refs are in the format: refs/pull/7/merge
- pr="${GITHUB_REF#refs/pull/}"
- pr="${pr%/merge}"
- branch="${GITHUB_HEAD_REF}"
- fi
- commit="${GITHUB_SHA}"
- slug="${GITHUB_REPOSITORY}"
- build="${GITHUB_RUN_ID}"
- build_url=$(urlencode "http://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}")
- job="$(urlencode "${GITHUB_WORKFLOW}")"
-
- # actions/checkout runs in detached HEAD
- mc=
- if [ -n "$pr" ] && [ "$pr" != false ] && [ "$commit_o" == "" ];
- then
- mc=$(git show --no-patch --format="%P" 2>/dev/null || echo "")
-
- if [[ "$mc" =~ ^[a-z0-9]{40}[[:space:]][a-z0-9]{40}$ ]];
- then
- mc=$(echo "$mc" | cut -d' ' -f2)
- say " Fixing merge commit SHA $commit -> $mc"
- commit=$mc
- elif [[ "$mc" = "" ]];
- then
- say "$r-> Issue detecting commit SHA. Please run actions/checkout with fetch-depth > 1 or set to 0$x"
- fi
- fi
-
-elif [ "$SYSTEM_TEAMFOUNDATIONSERVERURI" != "" ];
-then
- say "$e==>$x Azure Pipelines detected."
- # https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=vsts
- # https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&viewFallbackFrom=vsts&tabs=yaml
- service="azure_pipelines"
- commit="$BUILD_SOURCEVERSION"
- build="$BUILD_BUILDNUMBER"
- if [ -z "$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER" ];
- then
- pr="$SYSTEM_PULLREQUEST_PULLREQUESTID"
- else
- pr="$SYSTEM_PULLREQUEST_PULLREQUESTNUMBER"
- fi
- project="${SYSTEM_TEAMPROJECT}"
- server_uri="${SYSTEM_TEAMFOUNDATIONSERVERURI}"
- job="${BUILD_BUILDID}"
- branch="${BUILD_SOURCEBRANCH#"refs/heads/"}"
- build_url=$(urlencode "${SYSTEM_TEAMFOUNDATIONSERVERURI}${SYSTEM_TEAMPROJECT}/_build/results?buildId=${BUILD_BUILDID}")
-
- # azure/pipelines runs in detached HEAD
- mc=
- if [ -n "$pr" ] && [ "$pr" != false ];
- then
- mc=$(git show --no-patch --format="%P" 2>/dev/null || echo "")
-
- if [[ "$mc" =~ ^[a-z0-9]{40}[[:space:]][a-z0-9]{40}$ ]];
- then
- mc=$(echo "$mc" | cut -d' ' -f2)
- say " Fixing merge commit SHA $commit -> $mc"
- commit=$mc
- fi
- fi
-
-elif [ "$CI" = "true" ] && [ "$BITBUCKET_BUILD_NUMBER" != "" ];
-then
- say "$e==>$x Bitbucket detected."
- # https://confluence.atlassian.com/bitbucket/variables-in-pipelines-794502608.html
- service="bitbucket"
- branch="$BITBUCKET_BRANCH"
- build="$BITBUCKET_BUILD_NUMBER"
- slug="$BITBUCKET_REPO_OWNER/$BITBUCKET_REPO_SLUG"
- job="$BITBUCKET_BUILD_NUMBER"
- pr="$BITBUCKET_PR_ID"
- commit="$BITBUCKET_COMMIT"
- # See https://jira.atlassian.com/browse/BCLOUD-19393
- if [ "${#commit}" = 12 ];
- then
- commit=$(git rev-parse "$BITBUCKET_COMMIT")
- fi
-
-elif [ "$CI" = "true" ] && [ "$BUDDY" = "true" ];
-then
- say "$e==>$x Buddy CI detected."
- # https://buddy.works/docs/pipelines/environment-variables
- service="buddy"
- branch="$BUDDY_EXECUTION_BRANCH"
- build="$BUDDY_EXECUTION_ID"
- build_url=$(urlencode "$BUDDY_EXECUTION_URL")
- commit="$BUDDY_EXECUTION_REVISION"
- pr="$BUDDY_EXECUTION_PULL_REQUEST_NO"
- tag="$BUDDY_EXECUTION_TAG"
- slug="$BUDDY_REPO_SLUG"
-
-elif [ "$CIRRUS_CI" != "" ];
-then
- say "$e==>$x Cirrus CI detected."
- # https://cirrus-ci.org/guide/writing-tasks/#environment-variables
- service="cirrus-ci"
- slug="$CIRRUS_REPO_FULL_NAME"
- branch="$CIRRUS_BRANCH"
- pr="$CIRRUS_PR"
- commit="$CIRRUS_CHANGE_IN_REPO"
- build="$CIRRUS_BUILD_ID"
- build_url=$(urlencode "https://cirrus-ci.com/task/$CIRRUS_TASK_ID")
- job="$CIRRUS_TASK_NAME"
-
-elif [ "$DOCKER_REPO" != "" ];
-then
- say "$e==>$x Docker detected."
- # https://docs.docker.com/docker-cloud/builds/advanced/
- service="docker"
- branch="$SOURCE_BRANCH"
- commit="$SOURCE_COMMIT"
- slug="$DOCKER_REPO"
- tag="$CACHE_TAG"
- env="$env,IMAGE_NAME"
-
-else
- say "${r}x>${x} No CI provider detected."
- say " Testing inside Docker? ${b}http://docs.codecov.io/docs/testing-with-docker${x}"
- say " Testing with Tox? ${b}https://docs.codecov.io/docs/python#section-testing-with-tox${x}"
-
-fi
-
-say " ${e}project root:${x} $git_root"
-
-# find branch, commit, repo from git command
-if [ "$GIT_BRANCH" != "" ];
-then
- branch="$GIT_BRANCH"
-
-elif [ "$branch" = "" ];
-then
- branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || hg branch 2>/dev/null || echo "")
- if [ "$branch" = "HEAD" ];
- then
- branch=""
- fi
-fi
-
-if [ "$commit_o" = "" ];
-then
- if [ "$GIT_COMMIT" != "" ];
- then
- commit="$GIT_COMMIT"
- elif [ "$commit" = "" ];
- then
- commit=$(git log -1 --format="%H" 2>/dev/null || hg id -i --debug 2>/dev/null | tr -d '+' || echo "")
- fi
-else
- commit="$commit_o"
-fi
-
-if [ "$CODECOV_TOKEN" != "" ] && [ "$token" = "" ];
-then
- say "${e}-->${x} token set from env"
- token="$CODECOV_TOKEN"
-fi
-
-if [ "$CODECOV_URL" != "" ] && [ "$url_o" = "" ];
-then
- say "${e}-->${x} url set from env"
- url_o=$(echo "$CODECOV_URL" | sed -e 's/\/$//')
-fi
-
-if [ "$CODECOV_SLUG" != "" ];
-then
- say "${e}-->${x} slug set from env"
- slug_o="$CODECOV_SLUG"
-
-elif [ "$slug" = "" ];
-then
- if [ "$remote_addr" = "" ];
- then
- remote_addr=$(git config --get remote.origin.url || hg paths default || echo '')
- fi
- if [ "$remote_addr" != "" ];
- then
- if echo "$remote_addr" | grep -q "//"; then
- # https
- slug=$(echo "$remote_addr" | cut -d / -f 4,5 | sed -e 's/\.git$//')
- else
- # ssh
- slug=$(echo "$remote_addr" | cut -d : -f 2 | sed -e 's/\.git$//')
- fi
- fi
- if [ "$slug" = "/" ];
- then
- slug=""
- fi
-fi
-
-yaml=$(cd "$git_root" && \
- git ls-files "*codecov.yml" "*codecov.yaml" 2>/dev/null \
- || hg locate "*codecov.yml" "*codecov.yaml" 2>/dev/null \
- || cd "$proj_root" && find . -maxdepth 1 -type f -name '*codecov.y*ml' 2>/dev/null \
- || echo '')
-yaml=$(echo "$yaml" | head -1)
-
-if [ "$yaml" != "" ];
-then
- say " ${e}Yaml found at:${x} $yaml"
- if [[ "$yaml" != /* ]]; then
- # relative path for yaml file given, assume relative to the repo root
- yaml="$git_root/$yaml"
- fi
- config=$(parse_yaml "$yaml" || echo '')
-
- # TODO validate the yaml here
-
- if [ "$(echo "$config" | grep 'codecov_token="')" != "" ] && [ "$token" = "" ];
- then
- say "${e}-->${x} token set from yaml"
- token="$(echo "$config" | grep 'codecov_token="' | sed -e 's/codecov_token="//' | sed -e 's/"\.*//')"
- fi
-
- if [ "$(echo "$config" | grep 'codecov_url="')" != "" ] && [ "$url_o" = "" ];
- then
- say "${e}-->${x} url set from yaml"
- url_o="$(echo "$config" | grep 'codecov_url="' | sed -e 's/codecov_url="//' | sed -e 's/"\.*//')"
- fi
-
- if [ "$(echo "$config" | grep 'codecov_slug="')" != "" ] && [ "$slug_o" = "" ];
- then
- say "${e}-->${x} slug set from yaml"
- slug_o="$(echo "$config" | grep 'codecov_slug="' | sed -e 's/codecov_slug="//' | sed -e 's/"\.*//')"
- fi
-else
- say " ${g}Yaml not found, that's ok! Learn more at${x} ${b}http://docs.codecov.io/docs/codecov-yaml${x}"
-fi
-
-if [ "$branch_o" != "" ];
-then
- branch=$(urlencode "$branch_o")
-else
- branch=$(urlencode "$branch")
-fi
-
-if [ "$slug_o" = "" ];
-then
- urlencoded_slug=$(urlencode "$slug")
-else
- urlencoded_slug=$(urlencode "$slug_o")
-fi
-
-query="branch=$branch\
- &commit=$commit\
- &build=$([ "$build_o" = "" ] && echo "$build" || echo "$build_o")\
- &build_url=$build_url\
- &name=$(urlencode "$name")\
- &tag=$([ "$tag_o" = "" ] && echo "$tag" || echo "$tag_o")\
- &slug=$urlencoded_slug\
- &service=$service\
- &flags=$flags\
- &pr=$([ "$pr_o" = "" ] && echo "${pr##\#}" || echo "${pr_o##\#}")\
- &job=$job\
- &cmd_args=$(IFS=,; echo "${codecov_flags[*]}")"
-
-if [ -n "$project" ] && [ -n "$server_uri" ];
-then
- query=$(echo "$query&project=$project&server_uri=$server_uri" | tr -d ' ')
-fi
-
-if [ "$parent" != "" ];
-then
- query=$(echo "parent=$parent&$query" | tr -d ' ')
-fi
-
-if [ "$ft_search" = "1" ];
-then
- # detect bower comoponents location
- bower_components="bower_components"
- bower_rc=$(cd "$git_root" && cat .bowerrc 2>/dev/null || echo "")
- if [ "$bower_rc" != "" ];
- then
- bower_components=$(echo "$bower_rc" | tr -d '\n' | grep '"directory"' | cut -d'"' -f4 | sed -e 's/\/$//')
- if [ "$bower_components" = "" ];
- then
- bower_components="bower_components"
- fi
- fi
-
- # Swift Coverage
- if [ "$ft_xcodellvm" = "1" ] && [ -d "$ddp" ];
- then
- say "${e}==>${x} Processing Xcode reports via llvm-cov"
- say " DerivedData folder: $ddp"
- profdata_files=$(find "$ddp" -name '*.profdata' 2>/dev/null || echo '')
- if [ "$profdata_files" != "" ];
- then
- # xcode via profdata
- if [ "$xp" = "" ];
- then
- # xp=$(xcodebuild -showBuildSettings 2>/dev/null | grep -i "^\s*PRODUCT_NAME" | sed -e 's/.*= \(.*\)/\1/')
- # say " ${e}->${x} Speed up Xcode processing by adding ${e}-J '$xp'${x}"
- say " ${g}hint${x} Speed up Swift processing by using use ${g}-J 'AppName'${x} (regexp accepted)"
- say " ${g}hint${x} This will remove Pods/ from your report. Also ${b}https://docs.codecov.io/docs/ignoring-paths${x}"
- fi
- while read -r profdata;
- do
- if [ "$profdata" != "" ];
- then
- swiftcov "$profdata" "$xp"
- fi
- done <<< "$profdata_files"
- else
- say " ${e}->${x} No Swift coverage found"
- fi
-
- # Obj-C Gcov Coverage
- if [ "$ft_gcov" = "1" ];
- then
- say " ${e}->${x} Running $gcov_exe for Obj-C"
- if [ "$ft_gcovout" = "0" ];
- then
- # suppress gcov output
- bash -c "find $ddp -type f -name '*.gcda' $gcov_include $gcov_ignore -exec $gcov_exe -p $gcov_arg {} +" >/dev/null 2>&1 || true
- else
- bash -c "find $ddp -type f -name '*.gcda' $gcov_include $gcov_ignore -exec $gcov_exe -p $gcov_arg {} +" || true
- fi
- fi
- fi
-
- if [ "$ft_xcodeplist" = "1" ] && [ -d "$ddp" ];
- then
- say "${e}==>${x} Processing Xcode plists"
- plists_files=$(find "$ddp" -name '*.xccoverage' 2>/dev/null || echo '')
- if [ "$plists_files" != "" ];
- then
- while read -r plist;
- do
- if [ "$plist" != "" ];
- then
- say " ${g}Found${x} plist file at $plist"
- plutil -convert xml1 -o "$(basename "$plist").plist" -- "$plist"
- fi
- done <<< "$plists_files"
- fi
- fi
-
- # Gcov Coverage
- if [ "$ft_gcov" = "1" ];
- then
- say "${e}==>${x} Running $gcov_exe in $proj_root ${e}(disable via -X gcov)${x}"
- if [ "$ft_gcovout" = "0" ];
- then
- # suppress gcov output
- bash -c "find $proj_root -type f -name '*.gcno' $gcov_include $gcov_ignore -exec $gcov_exe -pb $gcov_arg {} +" >/dev/null 2>&1 || true
- else
- bash -c "find $proj_root -type f -name '*.gcno' $gcov_include $gcov_ignore -exec $gcov_exe -pb $gcov_arg {} +" || true
- fi
- else
- say "${e}==>${x} gcov disabled"
- fi
-
- # Python Coverage
- if [ "$ft_coveragepy" = "1" ];
- then
- if [ ! -f coverage.xml ];
- then
- if command -v coverage >/dev/null 2>&1;
- then
- say "${e}==>${x} Python coveragepy exists ${e}disable via -X coveragepy${x}"
-
- dotcoverage=$(find "$git_root" -name '.coverage' -or -name '.coverage.*' | head -1 || echo '')
- if [ "$dotcoverage" != "" ];
- then
- cd "$(dirname "$dotcoverage")"
- if [ ! -f .coverage ];
- then
- say " ${e}->${x} Running coverage combine"
- coverage combine -a
- fi
- say " ${e}->${x} Running coverage xml"
- if [ "$(coverage xml -i)" != "No data to report." ];
- then
- files="$files
-$PWD/coverage.xml"
- else
- say " ${r}No data to report.${x}"
- fi
- cd "$proj_root"
- else
- say " ${r}No .coverage file found.${x}"
- fi
- else
- say "${e}==>${x} Python coveragepy not found"
- fi
- fi
- else
- say "${e}==>${x} Python coveragepy disabled"
- fi
-
- if [ "$search_in_o" != "" ];
- then
- # location override
- search_in="$search_in_o"
- fi
-
- say "$e==>$x Searching for coverage reports in:"
- for _path in $search_in
- do
- say " ${g}+${x} $_path"
- done
-
- patterns="find $search_in \( \
- -name vendor \
- -or -name '$bower_components' \
- -or -name '.egg-info*' \
- -or -name 'conftest_*.c.gcov' \
- -or -name .env \
- -or -name .envs \
- -or -name .git \
- -or -name .hg \
- -or -name .tox \
- -or -name .venv \
- -or -name .venvs \
- -or -name .virtualenv \
- -or -name .virtualenvs \
- -or -name .yarn-cache \
- -or -name __pycache__ \
- -or -name env \
- -or -name envs \
- -or -name htmlcov \
- -or -name js/generated/coverage \
- -or -name node_modules \
- -or -name venv \
- -or -name venvs \
- -or -name virtualenv \
- -or -name virtualenvs \
- \) -prune -or \
- -type f \( -name '*coverage*.*' \
- -or -name '*.clover' \
- -or -name '*.codecov.*' \
- -or -name '*.gcov' \
- -or -name '*.lcov' \
- -or -name '*.lst' \
- -or -name 'clover.xml' \
- -or -name 'cobertura.xml' \
- -or -name 'codecov.*' \
- -or -name 'cover.out' \
- -or -name 'codecov-result.json' \
- -or -name 'coverage-final.json' \
- -or -name 'excoveralls.json' \
- -or -name 'gcov.info' \
- -or -name 'jacoco*.xml' \
- -or -name '*Jacoco*.xml' \
- -or -name 'lcov.dat' \
- -or -name 'lcov.info' \
- -or -name 'luacov.report.out' \
- -or -name 'naxsi.info' \
- -or -name 'nosetests.xml' \
- -or -name 'report.xml' \
- $include_cov \) \
- $exclude_cov \
- -not -name '*.am' \
- -not -name '*.bash' \
- -not -name '*.bat' \
- -not -name '*.bw' \
- -not -name '*.cfg' \
- -not -name '*.class' \
- -not -name '*.cmake' \
- -not -name '*.cmake' \
- -not -name '*.conf' \
- -not -name '*.coverage' \
- -not -name '*.cp' \
- -not -name '*.cpp' \
- -not -name '*.crt' \
- -not -name '*.css' \
- -not -name '*.csv' \
- -not -name '*.csv' \
- -not -name '*.data' \
- -not -name '*.db' \
- -not -name '*.dox' \
- -not -name '*.ec' \
- -not -name '*.ec' \
- -not -name '*.egg' \
- -not -name '*.el' \
- -not -name '*.env' \
- -not -name '*.erb' \
- -not -name '*.exe' \
- -not -name '*.ftl' \
- -not -name '*.gif' \
- -not -name '*.gradle' \
- -not -name '*.gz' \
- -not -name '*.h' \
- -not -name '*.html' \
- -not -name '*.in' \
- -not -name '*.jade' \
- -not -name '*.jar*' \
- -not -name '*.jpeg' \
- -not -name '*.jpg' \
- -not -name '*.js' \
- -not -name '*.less' \
- -not -name '*.log' \
- -not -name '*.m4' \
- -not -name '*.mak*' \
- -not -name '*.md' \
- -not -name '*.o' \
- -not -name '*.p12' \
- -not -name '*.pem' \
- -not -name '*.png' \
- -not -name '*.pom*' \
- -not -name '*.profdata' \
- -not -name '*.proto' \
- -not -name '*.ps1' \
- -not -name '*.pth' \
- -not -name '*.py' \
- -not -name '*.pyc' \
- -not -name '*.pyo' \
- -not -name '*.rb' \
- -not -name '*.rsp' \
- -not -name '*.rst' \
- -not -name '*.ru' \
- -not -name '*.sbt' \
- -not -name '*.scss' \
- -not -name '*.scss' \
- -not -name '*.serialized' \
- -not -name '*.sh' \
- -not -name '*.snapshot' \
- -not -name '*.sql' \
- -not -name '*.svg' \
- -not -name '*.tar.tz' \
- -not -name '*.template' \
- -not -name '*.whl' \
- -not -name '*.xcconfig' \
- -not -name '*.xcoverage.*' \
- -not -name '*/classycle/report.xml' \
- -not -name '*codecov.yml' \
- -not -name '*~' \
- -not -name '.*coveragerc' \
- -not -name '.coverage*' \
- -not -name 'coverage-summary.json' \
- -not -name 'createdFiles.lst' \
- -not -name 'fullLocaleNames.lst' \
- -not -name 'include.lst' \
- -not -name 'inputFiles.lst' \
- -not -name 'phpunit-code-coverage.xml' \
- -not -name 'phpunit-coverage.xml' \
- -not -name 'remapInstanbul.coverage*.json' \
- -not -name 'scoverage.measurements.*' \
- -not -name 'test_*_coverage.txt' \
- -not -name 'testrunner-coverage*' \
- -print 2>/dev/null"
- files=$(eval "$patterns" || echo '')
-
-elif [ "$include_cov" != "" ];
-then
- files=$(eval "find $search_in -type f \( ${include_cov:5} \)$exclude_cov 2>/dev/null" || echo '')
-elif [ "$direct_file_upload" != "" ];
-then
- files=$direct_file_upload
-fi
-
-num_of_files=$(echo "$files" | wc -l | tr -d ' ')
-if [ "$num_of_files" != '' ] && [ "$files" != '' ];
-then
- say " ${e}->${x} Found $num_of_files reports"
-fi
-
-# no files found
-if [ "$files" = "" ];
-then
- say "${r}-->${x} No coverage report found."
- say " Please visit ${b}http://docs.codecov.io/docs/supported-languages${x}"
- exit ${exit_with};
-fi
-
-if [ "$ft_network" == "1" ];
-then
- say "${e}==>${x} Detecting git/mercurial file structure"
- network=$(cd "$git_root" && git ls-files $git_ls_files_recurse_submodules_o 2>/dev/null || hg locate 2>/dev/null || echo "")
- if [ "$network" = "" ];
- then
- network=$(find "$git_root" \( \
- -name virtualenv \
- -name .virtualenv \
- -name virtualenvs \
- -name .virtualenvs \
- -name '*.png' \
- -name '*.gif' \
- -name '*.jpg' \
- -name '*.jpeg' \
- -name '*.md' \
- -name .env \
- -name .envs \
- -name env \
- -name envs \
- -name .venv \
- -name .venvs \
- -name venv \
- -name venvs \
- -name .git \
- -name .egg-info \
- -name shunit2-2.1.6 \
- -name vendor \
- -name __pycache__ \
- -name node_modules \
- -path "*/$bower_components/*" \
- -path '*/target/delombok/*' \
- -path '*/build/lib/*' \
- -path '*/js/generated/coverage/*' \
- \) -prune -or \
- -type f -print 2>/dev/null || echo '')
- fi
-
- if [ "$network_filter_o" != "" ];
- then
- network=$(echo "$network" | grep -e "$network_filter_o/*")
- fi
- if [ "$prefix_o" != "" ];
- then
- network=$(echo "$network" | awk "{print \"$prefix_o/\"\$0}")
- fi
-fi
-
-upload_file=$(mktemp /tmp/codecov.XXXXXX)
-adjustments_file=$(mktemp /tmp/codecov.adjustments.XXXXXX)
-
-cleanup() {
- rm -f "$upload_file" "$adjustments_file" "$upload_file.gz"
-}
-
-trap cleanup INT ABRT TERM
-
-
-if [ "$env" != "" ];
-then
- inc_env=""
- say "${e}==>${x} Appending build variables"
- for varname in $(echo "$env" | tr ',' ' ')
- do
- if [ "$varname" != "" ];
- then
- say " ${g}+${x} $varname"
- inc_env="${inc_env}${varname}=$(eval echo "\$${varname}")
-"
- fi
- done
- echo "$inc_env<<<<<< ENV" >> "$upload_file"
-fi
-
-# Append git file list
-# write discovered yaml location
-if [ "$direct_file_upload" = "" ];
-then
- echo "$yaml" >> "$upload_file"
-fi
-
-if [ "$ft_network" == "1" ];
-then
- i="woff|eot|otf" # fonts
- i="$i|gif|png|jpg|jpeg|psd" # images
- i="$i|ptt|pptx|numbers|pages|md|txt|xlsx|docx|doc|pdf|csv" # docs
- i="$i|.gitignore" # supporting docs
-
- if [ "$ft_html" != "1" ];
- then
- i="$i|html"
- fi
-
- if [ "$ft_yaml" != "1" ];
- then
- i="$i|yml|yaml"
- fi
-
- echo "$network" | grep -vwE "($i)$" >> "$upload_file"
-fi
-echo "<<<<<< network" >> "$upload_file"
-
-if [ "$direct_file_upload" = "" ];
-then
- fr=0
- say "${e}==>${x} Reading reports"
- while IFS='' read -r file;
- do
- # read the coverage file
- if [ "$(echo "$file" | tr -d ' ')" != '' ];
- then
- if [ -f "$file" ];
- then
- report_len=$(wc -c < "$file")
- if [ "$report_len" -ne 0 ];
- then
- say " ${g}+${x} $file ${e}bytes=$(echo "$report_len" | tr -d ' ')${x}"
- # append to to upload
- _filename=$(basename "$file")
- if [ "${_filename##*.}" = 'gcov' ];
- then
- {
- echo "# path=$(echo "$file.reduced" | sed "s|^$git_root/||")";
- # get file name
- head -1 "$file";
- } >> "$upload_file"
- # 1. remove source code
- # 2. remove ending bracket lines
- # 3. remove whitespace
- # 4. remove contextual lines
- # 5. remove function names
- awk -F': *' '{print $1":"$2":"}' "$file" \
- | sed '\/: *} *$/d' \
- | sed 's/^ *//' \
- | sed '/^-/d' \
- | sed 's/^function.*/func/' >> "$upload_file"
- else
- {
- echo "# path=${file//^$git_root/||}";
- cat "$file";
- } >> "$upload_file"
- fi
- echo "<<<<<< EOF" >> "$upload_file"
- fr=1
- if [ "$clean" = "1" ];
- then
- rm "$file"
- fi
- else
- say " ${r}-${x} Skipping empty file $file"
- fi
- else
- say " ${r}-${x} file not found at $file"
- fi
- fi
- done <<< "$(echo -e "$files")"
-
- if [ "$fr" = "0" ];
- then
- say "${r}-->${x} No coverage data found."
- say " Please visit ${b}http://docs.codecov.io/docs/supported-languages${x}"
- say " search for your projects language to learn how to collect reports."
- exit ${exit_with};
- fi
-else
- cp "$direct_file_upload" "$upload_file"
- if [ "$clean" = "1" ];
- then
- rm "$direct_file_upload"
- fi
-fi
-
-if [ "$ft_fix" = "1" ];
-then
- say "${e}==>${x} Appending adjustments"
- say " ${b}https://docs.codecov.io/docs/fixing-reports${x}"
-
- empty_line='^[[:space:]]*$'
- # //
- syntax_comment='^[[:space:]]*//.*'
- # /* or */
- syntax_comment_block='^[[:space:]]*(\/\*|\*\/)[[:space:]]*$'
- # { or }
- syntax_bracket='^[[:space:]]*[\{\}][[:space:]]*(//.*)?$'
- # [ or ]
- syntax_list='^[[:space:]]*[][][[:space:]]*(//.*)?$'
- # func ... {
- syntax_go_func='^[[:space:]]*[func].*[\{][[:space:]]*$'
-
- # shellcheck disable=SC2089
- skip_dirs="-not -path '*/$bower_components/*' \
- -not -path '*/node_modules/*'"
-
- cut_and_join() {
- awk 'BEGIN { FS=":" }
- $3 ~ /\/\*/ || $3 ~ /\*\// { print $0 ; next }
- $1!=key { if (key!="") print out ; key=$1 ; out=$1":"$2 ; next }
- { out=out","$2 }
- END { print out }' 2>/dev/null
- }
-
- if echo "$network" | grep -m1 '.kt$' 1>/dev/null;
- then
- # skip brackets and comments
- cd "$git_root" && \
- find . -type f \
- -name '*.kt' \
- -exec \
- grep -nIHE -e "$syntax_bracket" \
- -e "$syntax_comment_block" {} \; \
- | cut_and_join \
- >> "$adjustments_file" \
- || echo ''
-
- # last line in file
- cd "$git_root" && \
- find . -type f \
- -name '*.kt' -exec \
- wc -l {} \; \
- | while read -r l; do echo "EOF: $l"; done \
- 2>/dev/null \
- >> "$adjustments_file" \
- || echo ''
- fi
-
- if echo "$network" | grep -m1 '.go$' 1>/dev/null;
- then
- # skip empty lines, comments, and brackets
- cd "$git_root" && \
- find . -type f \
- -not -path '*/vendor/*' \
- -not -path '*/caches/*' \
- -name '*.go' \
- -exec \
- grep -nIHE \
- -e "$empty_line" \
- -e "$syntax_comment" \
- -e "$syntax_comment_block" \
- -e "$syntax_bracket" \
- -e "$syntax_go_func" \
- {} \; \
- | cut_and_join \
- >> "$adjustments_file" \
- || echo ''
- fi
-
- if echo "$network" | grep -m1 '.dart$' 1>/dev/null;
- then
- # skip brackets
- cd "$git_root" && \
- find . -type f \
- -name '*.dart' \
- -exec \
- grep -nIHE \
- -e "$syntax_bracket" \
- {} \; \
- | cut_and_join \
- >> "$adjustments_file" \
- || echo ''
- fi
-
- if echo "$network" | grep -m1 '.php$' 1>/dev/null;
- then
- # skip empty lines, comments, and brackets
- cd "$git_root" && \
- find . -type f \
- -not -path "*/vendor/*" \
- -name '*.php' \
- -exec \
- grep -nIHE \
- -e "$syntax_list" \
- -e "$syntax_bracket" \
- -e '^[[:space:]]*\);[[:space:]]*(//.*)?$' \
- {} \; \
- | cut_and_join \
- >> "$adjustments_file" \
- || echo ''
- fi
-
- if echo "$network" | grep -m1 '\(.c\.cpp\|.cxx\|.h\|.hpp\|.m\|.swift\|.vala\)$' 1>/dev/null;
- then
- # skip brackets
- # shellcheck disable=SC2086,SC2090
- cd "$git_root" && \
- find . -type f \
- $skip_dirs \
- \( \
- -name '*.c' \
- -or -name '*.cpp' \
- -or -name '*.cxx' \
- -or -name '*.h' \
- -or -name '*.hpp' \
- -or -name '*.m' \
- -or -name '*.swift' \
- -or -name '*.vala' \
- \) -exec \
- grep -nIHE \
- -e "$empty_line" \
- -e "$syntax_bracket" \
- -e '// LCOV_EXCL' \
- {} \; \
- | cut_and_join \
- >> "$adjustments_file" \
- || echo ''
-
- # skip brackets
- # shellcheck disable=SC2086,SC2090
- cd "$git_root" && \
- find . -type f \
- $skip_dirs \
- \( \
- -name '*.c' \
- -or -name '*.cpp' \
- -or -name '*.cxx' \
- -or -name '*.h' \
- -or -name '*.hpp' \
- -or -name '*.m' \
- -or -name '*.swift' \
- -or -name '*.vala' \
- \) -exec \
- grep -nIH '// LCOV_EXCL' \
- {} \; \
- >> "$adjustments_file" \
- || echo ''
-
- fi
-
- found=$(< "$adjustments_file" tr -d ' ')
-
- if [ "$found" != "" ];
- then
- say " ${g}+${x} Found adjustments"
- {
- echo "# path=fixes";
- cat "$adjustments_file";
- echo "<<<<<< EOF";
- } >> "$upload_file"
- rm -rf "$adjustments_file"
- else
- say " ${e}->${x} No adjustments found"
- fi
-fi
-
-if [ "$url_o" != "" ];
-then
- url="$url_o"
-fi
-
-if [ "$dump" != "0" ];
-then
- # trim whitespace from query
- say " ${e}->${x} Dumping upload file (no upload)"
- echo "$url/upload/v4?$(echo "package=$package-$VERSION&token=$token&$query" | tr -d ' ')"
- cat "$upload_file"
-else
- if [ "$save_to" != "" ];
- then
- say "${e}==>${x} Copying upload file to ${save_to}"
- mkdir -p "$(dirname "$save_to")"
- cp "$upload_file" "$save_to"
- fi
-
- say "${e}==>${x} Gzipping contents"
- gzip -nf9 "$upload_file"
- say " $(du -h "$upload_file.gz")"
-
- query=$(echo "${query}" | tr -d ' ')
- say "${e}==>${x} Uploading reports"
- say " ${e}url:${x} $url"
- say " ${e}query:${x} $query"
-
- # Full query without token (to display on terminal output)
- queryNoToken=$(echo "package=$package-$VERSION&token=secret&$query" | tr -d ' ')
- # now add token to query
- query=$(echo "package=$package-$VERSION&token=$token&$query" | tr -d ' ')
-
- if [ "$ft_s3" = "1" ];
- then
- say "${e}->${x} Pinging Codecov"
- say "$url/upload/v4?$queryNoToken"
- # shellcheck disable=SC2086,2090
- res=$(curl $curl_s -X POST $cacert \
- --retry 5 --retry-delay 2 --connect-timeout 2 \
- -H 'X-Reduced-Redundancy: false' \
- -H 'X-Content-Type: application/x-gzip' \
- -H 'Content-Length: 0' \
- --write-out "\n%{response_code}\n" \
- $curlargs \
- "$url/upload/v4?$query" || true)
- # a good reply is "https://codecov.io" + "\n" + "https://storage.googleapis.com/codecov/..."
- s3target=$(echo "$res" | sed -n 2p)
- status=$(tail -n1 <<< "$res")
-
- if [ "$status" = "200" ] && [ "$s3target" != "" ];
- then
- say "${e}->${x} Uploading to"
- say "${s3target}"
-
- # shellcheck disable=SC2086
- s3=$(curl -fiX PUT \
- --data-binary @"$upload_file.gz" \
- -H 'Content-Type: application/x-gzip' \
- -H 'Content-Encoding: gzip' \
- $curlawsargs \
- "$s3target" || true)
-
- if [ "$s3" != "" ];
- then
- say " ${g}->${x} Reports have been successfully queued for processing at ${b}$(echo "$res" | sed -n 1p)${x}"
- exit 0
- else
- say " ${r}X>${x} Failed to upload"
- fi
- elif [ "$status" = "400" ];
- then
- # 400 Error
- say "${r}${res}${x}"
- exit ${exit_with}
- else
- say "${r}${res}${x}"
- fi
- fi
-
- say "${e}==>${x} Uploading to Codecov"
-
- # shellcheck disable=SC2086,2090
- res=$(curl -X POST $cacert \
- --data-binary @"$upload_file.gz" \
- --retry 5 --retry-delay 2 --connect-timeout 2 \
- -H 'Content-Type: text/plain' \
- -H 'Content-Encoding: gzip' \
- -H 'X-Content-Encoding: gzip' \
- -H 'Accept: text/plain' \
- $curlargs \
- "$url/upload/v2?$query&attempt=$i" || echo 'HTTP 500')
- # HTTP 200
- # http://....
- status=$(echo "$res" | head -1 | cut -d' ' -f2)
- if [ "$status" = "" ] || [ "$status" = "200" ];
- then
- say " Reports have been successfully queued for processing at ${b}$(echo "$res" | head -2 | tail -1)${x}"
- exit 0
- else
- say " ${g}${res}${x}"
- exit ${exit_with}
- fi
-
- say " ${r}X> Failed to upload coverage reports${x}"
-fi
-
-exit ${exit_with}
diff --git a/staging/operator-registry/.github/workflows/go-apidiff.yaml b/staging/operator-registry/.github/workflows/go-apidiff.yaml
index 4f1657eb16..e8f521db31 100644
--- a/staging/operator-registry/.github/workflows/go-apidiff.yaml
+++ b/staging/operator-registry/.github/workflows/go-apidiff.yaml
@@ -14,14 +14,14 @@ jobs:
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- - name: Set up Go
- uses: actions/setup-go@v2
- with:
- go-version: '~1.18'
- id: go
- name: Check out code into the Go module directory
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
fetch-depth: 0
+ - name: Set up Go
+ uses: actions/setup-go@v4
+ with:
+ go-version-file: 'go.mod'
+ id: go
- name: Run go-apidiff
uses: joelanford/go-apidiff@main
diff --git a/staging/operator-registry/.github/workflows/goreleaser.yaml b/staging/operator-registry/.github/workflows/goreleaser.yaml
index 5779f83015..b19cc5899d 100644
--- a/staging/operator-registry/.github/workflows/goreleaser.yaml
+++ b/staging/operator-registry/.github/workflows/goreleaser.yaml
@@ -18,8 +18,8 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/download-artifact@v2
+ - uses: actions/checkout@v3
+ - uses: actions/download-artifact@v3
- run: |
for dist in dist-*; do
@@ -48,15 +48,14 @@ jobs:
build-windows:
runs-on: windows-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
# GoReleaser requires fetch-depth: 0 to correctly
# run git describe
fetch-depth: 0
- - uses: actions/setup-go@v2
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
-
+ go-version-file: "go.mod"
- name: "Run GoReleaser"
run: make release
env:
@@ -72,16 +71,15 @@ jobs:
build-darwin:
runs-on: macos-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
# GoReleaser requires fetch-depth: 0 to correctly
# run git describe
fetch-depth: 0
- - uses: actions/setup-go@v2
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
-
+ go-version-file: "go.mod"
- name: "Run GoReleaser"
run: make release
env:
@@ -97,16 +95,15 @@ jobs:
build-linux:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
# GoReleaser requires fetch-depth: 0 to correctly
# run git describe
fetch-depth: 0
- - uses: actions/setup-go@v2
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
-
+ go-version-file: "go.mod"
- name: "Install linux cross-compilers"
run: |
sudo apt-get update
diff --git a/staging/operator-registry/.github/workflows/sanity.yaml b/staging/operator-registry/.github/workflows/sanity.yaml
index 8008817f8c..20f8edadd4 100644
--- a/staging/operator-registry/.github/workflows/sanity.yaml
+++ b/staging/operator-registry/.github/workflows/sanity.yaml
@@ -13,11 +13,11 @@ jobs:
sanity:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-go@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
+ go-version-file: "go.mod"
- name: Install goimports
run: go install golang.org/x/tools/cmd/goimports@latest
- name: Run sanity checks
- run: make vendor && make lint && git diff --exit-code
+ run: make lint && git diff --exit-code
diff --git a/staging/operator-registry/.github/workflows/test.yml b/staging/operator-registry/.github/workflows/test.yml
index 5d54944f0b..397db968cc 100644
--- a/staging/operator-registry/.github/workflows/test.yml
+++ b/staging/operator-registry/.github/workflows/test.yml
@@ -11,10 +11,10 @@ jobs:
e2e:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-go@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
+ go-version-file: 'go.mod'
- name: Install podman
run: |
. /etc/os-release
diff --git a/staging/operator-registry/.github/workflows/unit.yaml b/staging/operator-registry/.github/workflows/unit.yaml
index 4d5bcbc382..8ec90418b9 100644
--- a/staging/operator-registry/.github/workflows/unit.yaml
+++ b/staging/operator-registry/.github/workflows/unit.yaml
@@ -13,10 +13,14 @@ jobs:
unit:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
- - uses: actions/setup-go@v2
+ - uses: actions/checkout@v3
+ - uses: actions/setup-go@v4
with:
- go-version: '~1.18'
+ go-version-file: "go.mod"
- run: make unit
- run: sed -i'' "s:^github.com/$GITHUB_REPOSITORY/::" coverage.out
- - run: .github/workflows/codecov.sh -Z -f coverage.out
+ - uses: codecov/codecov-action@v3
+ with:
+ files: coverage.out
+ fail_ci_if_error: true
+ functionalities: fixes
diff --git a/staging/operator-registry/Dockerfile b/staging/operator-registry/Dockerfile
deleted file mode 100644
index a4e7fb317e..0000000000
--- a/staging/operator-registry/Dockerfile
+++ /dev/null
@@ -1,37 +0,0 @@
-FROM registry.ci.openshift.org/ocp/builder:rhel-8-golang-1.18-openshift-4.11 AS builder
-
-ENV GOPATH /go
-ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
-
-WORKDIR /src
-
-COPY . .
-RUN make build cross
-
-# copy and build vendored grpc_health_probe
-RUN CGO_ENABLED=0 go build -mod=vendor -tags netgo -ldflags "-w" ./vendor/github.com/grpc-ecosystem/grpc-health-probe/...
-
-FROM registry.ci.openshift.org/ocp/4.8:base
-
-COPY --from=builder /src/bin/* /bin/registry/
-COPY --from=builder /src/grpc-health-probe /bin/grpc_health_probe
-
-RUN ln -s /bin/registry/* /bin
-
-RUN mkdir /registry
-RUN chgrp -R 0 /registry && \
- chmod -R g+rwx /registry
-WORKDIR /registry
-
-# This image doesn't need to run as root user
-USER 1001
-
-EXPOSE 50051
-
-ENTRYPOINT ["/bin/registry-server"]
-CMD ["--database", "/bundles.db"]
-
-LABEL io.k8s.display-name="OpenShift Operator Registry" \
- io.k8s.description="This is a component of OpenShift Operator Lifecycle Manager and is the base for operator catalog API containers." \
- maintainer="Odin Team " \
- summary="Operator Registry runs in a Kubernetes or OpenShift cluster to provide operator catalog data to Operator Lifecycle Manager."
diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile
index 7ea7aef2ea..df4ac5072b 100644
--- a/staging/operator-registry/Makefile
+++ b/staging/operator-registry/Makefile
@@ -1,5 +1,5 @@
SHELL = /bin/bash
-GO := GOFLAGS="-mod=vendor" go
+GO := go
CMDS := $(addprefix bin/, $(shell ls ./cmd | grep -v opm))
OPM := $(addprefix bin/, opm)
SPECIFIC_UNIT_TEST := $(if $(TEST),-run $(TEST),)
@@ -74,23 +74,14 @@ sanity-check:
docker run --rm -it -v "$(shell pwd)"/pkg/lib/indexer/testdata/:/database sanity-container \
./bin/opm registry serve --database /database/bundles.db --timeout-seconds 1
-.PHONY: image
-image:
- docker build .
.PHONY: image-upstream
image-upstream:
docker build -f upstream-example.Dockerfile .
-.PHONY: vendor
-vendor:
- $(GO) mod tidy
- $(GO) mod vendor
- $(GO) mod verify
-
.PHONY: lint
lint:
- find . -name '*.go' -not -path "./vendor/*" | xargs goimports -w
+ find . -name '*.go' | xargs goimports -w
.PHONY: codegen
codegen:
@@ -99,13 +90,6 @@ codegen:
protoc -I pkg/api/grpc_health_v1 --go_out=pkg/api/grpc_health_v1 pkg/api/grpc_health_v1/*.proto
protoc -I pkg/api/grpc_health_v1 --go-grpc_out=pkg/api/grpc_health_v1 pkg/api/grpc_health_v1/*.proto
-.PHONY: container-codegen
-container-codegen:
- docker build -t operator-registry:codegen -f codegen.Dockerfile .
- docker run --name temp-codegen operator-registry:codegen /bin/true
- docker cp temp-codegen:/codegen/pkg/api/. ./pkg/api
- docker rm temp-codegen
-
.PHONY: generate-fakes
generate-fakes:
$(GO) generate ./...
diff --git a/staging/operator-registry/OWNERS b/staging/operator-registry/OWNERS
index c1c32e681c..67ce7f24c5 100644
--- a/staging/operator-registry/OWNERS
+++ b/staging/operator-registry/OWNERS
@@ -1,26 +1,32 @@
# approval == this is a good idea /approve
approvers:
- - ecordell
- - njhale
+ - awgreene
- dinhxuanvu
- - kevinrizza
- - benluddy
+ - grokspawn
- joelanford
+ - kevinrizza
+ - njhale
+ - oceanc80
+ - perdasilva
# review == this code is good /lgtm
reviewers:
- - ecordell
- - njhale
- - dinhxuanvu
- - kevinrizza
- - gallettilance
- anik120
- - exdx
+ - ankitathomas
- awgreene
- benluddy
- - hasbro17
- - ankitathomas
- - joelanford
+ - dinhxuanvu
+ - everettraven
+ - exdx
+ - gallettilance
+ - grokspawn
- jmrodri
- - timflannagan
+ - joelanford
+ - kevinrizza
+ - njhale
+ - oceanc80
+ - perdasilva
+ - rashmigottipati
+ - theishshah
+ - varshaprasad96
# Bugzilla component
component: "OLM"
diff --git a/staging/operator-registry/alpha/action/migrate.go b/staging/operator-registry/alpha/action/migrate.go
index 8cca8b8974..c5880f0006 100644
--- a/staging/operator-registry/alpha/action/migrate.go
+++ b/staging/operator-registry/alpha/action/migrate.go
@@ -1,13 +1,10 @@
package action
import (
- "bytes"
"context"
"fmt"
- "io"
"io/ioutil"
"os"
- "path/filepath"
"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/pkg/image"
@@ -17,13 +14,11 @@ type Migrate struct {
CatalogRef string
OutputDir string
- WriteFunc WriteFunc
+ WriteFunc declcfg.WriteFunc
FileExt string
Registry image.Registry
}
-type WriteFunc func(config declcfg.DeclarativeConfig, w io.Writer) error
-
func (m Migrate) Run(ctx context.Context) error {
entries, err := ioutil.ReadDir(m.OutputDir)
if err != nil && !os.IsNotExist(err) {
@@ -52,48 +47,5 @@ func (m Migrate) Run(ctx context.Context) error {
return fmt.Errorf("render catalog image: %w", err)
}
- return writeToFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt)
-}
-
-func writeToFS(cfg declcfg.DeclarativeConfig, rootDir string, writeFunc WriteFunc, fileExt string) error {
- channelsByPackage := map[string][]declcfg.Channel{}
- for _, c := range cfg.Channels {
- channelsByPackage[c.Package] = append(channelsByPackage[c.Package], c)
- }
- bundlesByPackage := map[string][]declcfg.Bundle{}
- for _, b := range cfg.Bundles {
- bundlesByPackage[b.Package] = append(bundlesByPackage[b.Package], b)
- }
-
- if err := os.MkdirAll(rootDir, 0777); err != nil {
- return err
- }
-
- for _, p := range cfg.Packages {
- fcfg := declcfg.DeclarativeConfig{
- Packages: []declcfg.Package{p},
- Channels: channelsByPackage[p.Name],
- Bundles: bundlesByPackage[p.Name],
- }
- pkgDir := filepath.Join(rootDir, p.Name)
- if err := os.MkdirAll(pkgDir, 0777); err != nil {
- return err
- }
- filename := filepath.Join(pkgDir, fmt.Sprintf("catalog%s", fileExt))
- if err := writeFile(fcfg, filename, writeFunc); err != nil {
- return err
- }
- }
- return nil
-}
-
-func writeFile(cfg declcfg.DeclarativeConfig, filename string, writeFunc WriteFunc) error {
- buf := &bytes.Buffer{}
- if err := writeFunc(cfg, buf); err != nil {
- return fmt.Errorf("write to buffer for %q: %v", filename, err)
- }
- if err := ioutil.WriteFile(filename, buf.Bytes(), 0666); err != nil {
- return fmt.Errorf("write file %q: %v", filename, err)
- }
- return nil
+ return declcfg.WriteFS(*cfg, m.OutputDir, m.WriteFunc, m.FileExt)
}
diff --git a/staging/operator-registry/alpha/action/migrate_test.go b/staging/operator-registry/alpha/action/migrate_test.go
index ecaa0b3675..5f6be7b95e 100644
--- a/staging/operator-registry/alpha/action/migrate_test.go
+++ b/staging/operator-registry/alpha/action/migrate_test.go
@@ -2,7 +2,6 @@ package action_test
import (
"context"
- "fmt"
"io/fs"
"os"
"path/filepath"
@@ -111,7 +110,6 @@ func TestMigrate(t *testing.T) {
path := filepath.Join(s.migrate.OutputDir, file)
actualData, err := os.ReadFile(path)
require.NoError(t, err)
- fmt.Println(string(actualData))
require.Equal(t, expectedData, string(actualData))
}
})
@@ -212,12 +210,18 @@ properties:
value:
packageName: bar
versionRange: <0.1.0
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMS4wIn0sIm5hbWUiOiJmb28udjAuMS4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
+ annotations:
+ olm.skipRange: <0.1.0
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: Foo
+ name: foos.test.foo
+ version: v1
+ displayName: Foo Operator
+ provider: {}
relatedImages:
- image: test.registry/foo-operator/foo-bundle:v0.1.0
name: ""
@@ -247,12 +251,18 @@ properties:
value:
packageName: bar
versionRange: <0.1.0
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19
+ annotations:
+ olm.skipRange: <0.2.0
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: Foo
+ name: foos.test.foo
+ version: v1
+ displayName: Foo Operator
+ provider: {}
relatedImages:
- image: test.registry/foo-operator/foo-2:v0.2.0
name: ""
@@ -299,12 +309,15 @@ properties:
value:
packageName: bar
version: 0.1.0
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhci52MC4xLjAifSwic3BlYyI6eyJjdXN0b21yZXNvdXJjZWRlZmluaXRpb25zIjp7Im93bmVkIjpbeyJncm91cCI6InRlc3QuYmFyIiwia2luZCI6IkJhciIsIm5hbWUiOiJiYXJzLnRlc3QuYmFyIiwidmVyc2lvbiI6InYxYWxwaGExIn1dfSwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Jhci1vcGVyYXRvci9iYXI6djAuMS4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJ2ZXJzaW9uIjoiMC4xLjAifX0=
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: Bar
+ name: bars.test.bar
+ version: v1alpha1
+ provider: {}
relatedImages:
- image: test.registry/bar-operator/bar-bundle:v0.1.0
name: ""
@@ -325,12 +338,17 @@ properties:
value:
packageName: bar
version: 0.2.0
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJiYXIudjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmJhciIsImtpbmQiOiJCYXIiLCJuYW1lIjoiYmFycy50ZXN0LmJhciIsInZlcnNpb24iOiJ2MWFscGhhMSJ9XX0sInJlbGF0ZWRJbWFnZXMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9iYXItb3BlcmF0b3IvYmFyOnYwLjIuMCIsIm5hbWUiOiJvcGVyYXRvciJ9XSwic2tpcHMiOlsiYmFyLnYwLjEuMCJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0=
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImJhcnMudGVzdC5iYXIifSwic3BlYyI6eyJncm91cCI6InRlc3QuYmFyIiwibmFtZXMiOnsia2luZCI6IkJhciIsInBsdXJhbCI6ImJhcnMifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MWFscGhhMSJ9XX19
+ annotations:
+ olm.skipRange: <0.2.0
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: Bar
+ name: bars.test.bar
+ version: v1alpha1
+ provider: {}
relatedImages:
- image: test.registry/bar-operator/bar-bundle:v0.2.0
name: ""
diff --git a/staging/operator-registry/alpha/action/render.go b/staging/operator-registry/alpha/action/render.go
index 3f38390a0e..b1e5bd7541 100644
--- a/staging/operator-registry/alpha/action/render.go
+++ b/staging/operator-registry/alpha/action/render.go
@@ -82,7 +82,7 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) {
if err != nil {
return nil, fmt.Errorf("render reference %q: %w", ref, err)
}
- renderBundleObjects(cfg)
+ moveBundleObjectsToEndOfPropertySlices(cfg)
for _, b := range cfg.Bundles {
sort.Slice(b.RelatedImages, func(i, j int) bool {
@@ -122,7 +122,7 @@ func (r Render) renderReference(ctx context.Context, ref string) (*declcfg.Decla
if !r.AllowedRefMask.Allowed(RefDCDir) {
return nil, fmt.Errorf("cannot render declarative config directory: %w", ErrNotAllowed)
}
- return declcfg.LoadFS(os.DirFS(ref))
+ return declcfg.LoadFS(ctx, os.DirFS(ref))
} else {
// The only supported file type is an sqlite DB file,
// since declarative configs will be in a directory.
@@ -169,7 +169,7 @@ func (r Render) imageToDeclcfg(ctx context.Context, imageRef string) (*declcfg.D
if !r.AllowedRefMask.Allowed(RefDCImage) {
return nil, fmt.Errorf("cannot render declarative config image: %w", ErrNotAllowed)
}
- cfg, err = declcfg.LoadFS(os.DirFS(filepath.Join(tmpDir, configsDir)))
+ cfg, err = declcfg.LoadFS(ctx, os.DirFS(filepath.Join(tmpDir, configsDir)))
if err != nil {
return nil, err
}
@@ -304,6 +304,7 @@ func bundleToDeclcfg(bundle *registry.Bundle) (*declcfg.DeclarativeConfig, error
if err != nil {
return nil, fmt.Errorf("get related images for bundle %q: %v", bundle.Name, err)
}
+
var csvJson []byte
for _, obj := range bundle.Objects {
if obj.GetKind() == "ClusterServiceVersion" {
@@ -376,19 +377,21 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) {
return relatedImages, nil
}
-func renderBundleObjects(cfg *declcfg.DeclarativeConfig) {
+func moveBundleObjectsToEndOfPropertySlices(cfg *declcfg.DeclarativeConfig) {
for bi, b := range cfg.Bundles {
- props := b.Properties[:0]
+ var (
+ others []property.Property
+ objs []property.Property
+ )
for _, p := range b.Properties {
- if p.Type != property.TypeBundleObject {
- props = append(props, p)
+ switch p.Type {
+ case property.TypeBundleObject, property.TypeCSVMetadata:
+ objs = append(objs, p)
+ default:
+ others = append(others, p)
}
}
-
- for _, obj := range b.Objects {
- props = append(props, property.MustBuildBundleObjectData([]byte(obj)))
- }
- cfg.Bundles[bi].Properties = props
+ cfg.Bundles[bi].Properties = append(others, objs...)
}
}
diff --git a/staging/operator-registry/alpha/action/render_test.go b/staging/operator-registry/alpha/action/render_test.go
index c3385dabd9..976da69220 100644
--- a/staging/operator-registry/alpha/action/render_test.go
+++ b/staging/operator-registry/alpha/action/render_test.go
@@ -1,16 +1,19 @@
package action_test
import (
+ "bytes"
"context"
"embed"
"encoding/json"
"errors"
+ "io"
"io/fs"
"os"
"path/filepath"
"testing"
"testing/fstest"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"k8s.io/apimachinery/pkg/util/yaml"
@@ -105,8 +108,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.1.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov1csv),
- property.MustBuildBundleObjectData(foov1crd),
+ mustBuildCSVMetadata(bytes.NewReader(foov1csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
@@ -130,8 +132,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov2csv),
- property.MustBuildBundleObjectData(foov2crd),
+ mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
@@ -197,8 +198,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.1.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov1csv),
- property.MustBuildBundleObjectData(foov1crd),
+ mustBuildCSVMetadata(bytes.NewReader(foov1csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
@@ -222,8 +222,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov2csv),
- property.MustBuildBundleObjectData(foov2crd),
+ mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
},
RelatedImages: []declcfg.RelatedImage{
{
@@ -468,8 +467,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov2csv),
- property.MustBuildBundleObjectData(foov2crd),
+ mustBuildCSVMetadata(bytes.NewReader(foov2csv)),
},
Objects: []string{string(foov2csv), string(foov2crd)},
CsvJSON: string(foov2csv),
@@ -518,8 +516,7 @@ func TestRender(t *testing.T) {
property.MustBuildGVKRequired("test.bar", "v1alpha1", "Bar"),
property.MustBuildPackage("foo", "0.2.0"),
property.MustBuildPackageRequired("bar", "<0.1.0"),
- property.MustBuildBundleObjectData(foov2csvNoRelatedImages),
- property.MustBuildBundleObjectData(foov2crdNoRelatedImages),
+ mustBuildCSVMetadata(bytes.NewReader(foov2csvNoRelatedImages)),
},
Objects: []string{string(foov2csvNoRelatedImages), string(foov2crdNoRelatedImages)},
CsvJSON: string(foov2csvNoRelatedImages),
@@ -551,7 +548,17 @@ func TestRender(t *testing.T) {
t.Run(s.name, func(t *testing.T) {
actualCfg, actualErr := s.render.Run(context.Background())
s.assertion(t, actualErr)
- require.Equal(t, s.expectCfg, actualCfg)
+ require.Equal(t, len(s.expectCfg.Packages), len(actualCfg.Packages))
+ require.Equal(t, s.expectCfg.Packages, actualCfg.Packages)
+ require.Equal(t, len(s.expectCfg.Channels), len(actualCfg.Channels))
+ require.Equal(t, s.expectCfg.Channels, actualCfg.Channels)
+ require.Equal(t, len(s.expectCfg.Bundles), len(actualCfg.Bundles))
+ for i := range s.expectCfg.Bundles {
+ actual, expected := actualCfg.Bundles[i], s.expectCfg.Bundles[i]
+ require.Equal(t, expected, actual, "bundle %d", i)
+ }
+ require.Equal(t, len(s.expectCfg.Others), len(actualCfg.Others))
+ require.Equal(t, s.expectCfg.Others, actualCfg.Others)
})
}
}
@@ -880,3 +887,11 @@ func generateSqliteFile(path string, imageMap map[image.Reference]string) error
}
return nil
}
+
+func mustBuildCSVMetadata(r io.Reader) property.Property {
+ var csv v1alpha1.ClusterServiceVersion
+ if err := json.NewDecoder(r).Decode(&csv); err != nil {
+ panic(err)
+ }
+ return property.MustBuildCSVMetadata(csv)
+}
diff --git a/staging/operator-registry/alpha/declcfg/declcfg.go b/staging/operator-registry/alpha/declcfg/declcfg.go
index a4169c28c5..994d47a0b7 100644
--- a/staging/operator-registry/alpha/declcfg/declcfg.go
+++ b/staging/operator-registry/alpha/declcfg/declcfg.go
@@ -1,7 +1,14 @@
package declcfg
import (
+ "bytes"
"encoding/json"
+ "errors"
+ "fmt"
+
+ "golang.org/x/text/cases"
+ utilerrors "k8s.io/apimachinery/pkg/util/errors"
+ "k8s.io/apimachinery/pkg/util/sets"
"github.com/operator-framework/operator-registry/alpha/property"
)
@@ -52,11 +59,11 @@ type ChannelEntry struct {
// Top-level fields are the source of truth, i.e. not CSV values.
//
// Notes:
-// - Any field slice type field or type containing a slice somewhere
-// where two types/fields are equal if their contents are equal regardless
-// of order must have a `hash:"set"` field tag for bundle comparison.
-// - Any fields that have a `json:"-"` tag must be included in the equality
-// evaluation in bundlesEqual().
+// - Any field slice type field or type containing a slice somewhere
+// where two types/fields are equal if their contents are equal regardless
+// of order must have a `hash:"set"` field tag for bundle comparison.
+// - Any fields that have a `json:"-"` tag must be included in the equality
+// evaluation in bundlesEqual().
type Bundle struct {
Schema string `json:"schema"`
Name string `json:"name"`
@@ -84,6 +91,7 @@ type RelatedImage struct {
type Meta struct {
Schema string
Package string
+ Name string
Blob json.RawMessage
}
@@ -93,17 +101,81 @@ func (m Meta) MarshalJSON() ([]byte, error) {
}
func (m *Meta) UnmarshalJSON(blob []byte) error {
- type tmp struct {
- Schema string `json:"schema"`
- Package string `json:"package,omitempty"`
- Properties []property.Property `json:"properties,omitempty"`
+ blobMap := map[string]interface{}{}
+ if err := json.Unmarshal(blob, &blobMap); err != nil {
+ // TODO: unfortunately, there are libraries between here and the original caller
+ // that eat our error type and return a generic error, such that we lose the
+ // ability to errors.As to get this error on the other side. For now, just return
+ // a string error that includes the pretty printed message.
+ return errors.New(newJSONUnmarshalError(blob, err).Pretty())
}
- var t tmp
- if err := json.Unmarshal(blob, &t); err != nil {
+
+ // TODO: this function ensures we do not break backwards compatibility with
+ // the documented examples of FBC templates, which use upper camel case
+ // for JSON field names. We need to decide if we want to continue supporting
+ // case insensitive JSON field names, or if we want to enforce a specific
+ // case-sensitive key value for each field.
+ if err := extractUniqueMetaKeys(blobMap, m); err != nil {
+ return err
+ }
+
+ buf := bytes.Buffer{}
+ enc := json.NewEncoder(&buf)
+ enc.SetEscapeHTML(false)
+ if err := enc.Encode(blobMap); err != nil {
return err
}
- m.Schema = t.Schema
- m.Package = t.Package
- m.Blob = blob
+ m.Blob = buf.Bytes()
+ return nil
+}
+
+// extractUniqueMetaKeys enables a case-insensitive key lookup for the schema, package, and name
+// fields of the Meta struct. If the blobMap contains duplicate keys (that is, keys have the same folded value),
+// an error is returned.
+func extractUniqueMetaKeys(blobMap map[string]any, m *Meta) error {
+ keySets := map[string]sets.Set[string]{}
+ folder := cases.Fold()
+ for key := range blobMap {
+ foldKey := folder.String(key)
+ if _, ok := keySets[foldKey]; !ok {
+ keySets[foldKey] = sets.New[string]()
+ }
+ keySets[foldKey].Insert(key)
+ }
+
+ dupErrs := []error{}
+ for foldedKey, keys := range keySets {
+ if len(keys) != 1 {
+ dupErrs = append(dupErrs, fmt.Errorf("duplicate keys for key %q: %v", foldedKey, sets.List(keys)))
+ }
+ }
+ if len(dupErrs) > 0 {
+ return utilerrors.NewAggregate(dupErrs)
+ }
+
+ metaMap := map[string]*string{
+ folder.String("schema"): &m.Schema,
+ folder.String("package"): &m.Package,
+ folder.String("name"): &m.Name,
+ }
+
+ for foldedKey, ptr := range metaMap {
+ // if the folded key doesn't exist in the key set derived from the blobMap, that means
+ // the key doesn't exist in the blobMap, so we can skip it
+ if _, ok := keySets[foldedKey]; !ok {
+ continue
+ }
+
+ // reset key to the unfolded key, which we know is the one that appears in the blobMap
+ key := keySets[foldedKey].UnsortedList()[0]
+ if _, ok := blobMap[key]; !ok {
+ continue
+ }
+ v, ok := blobMap[key].(string)
+ if !ok {
+ return fmt.Errorf("expected value for key %q to be a string, got %t: %v", key, blobMap[key], blobMap[key])
+ }
+ *ptr = v
+ }
return nil
}
diff --git a/staging/operator-registry/alpha/declcfg/errors.go b/staging/operator-registry/alpha/declcfg/errors.go
new file mode 100644
index 0000000000..f5ef115233
--- /dev/null
+++ b/staging/operator-registry/alpha/declcfg/errors.go
@@ -0,0 +1,93 @@
+package declcfg
+
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "strings"
+)
+
+type jsonUnmarshalError struct {
+ data []byte
+ offset int64
+ err error
+}
+
+func newJSONUnmarshalError(data []byte, err error) *jsonUnmarshalError {
+ var te *json.UnmarshalTypeError
+ if errors.As(err, &te) {
+ return &jsonUnmarshalError{data: data, offset: te.Offset, err: te}
+ }
+ var se *json.SyntaxError
+ if errors.As(err, &se) {
+ return &jsonUnmarshalError{data: data, offset: se.Offset, err: se}
+ }
+ return &jsonUnmarshalError{data: data, offset: -1, err: err}
+}
+
+func (e *jsonUnmarshalError) Error() string {
+ return e.err.Error()
+}
+
+func (e *jsonUnmarshalError) Pretty() string {
+ if len(e.data) == 0 || e.offset < 0 || e.offset > int64(len(e.data)) {
+ return e.err.Error()
+ }
+
+ const marker = " <=="
+
+ var sb strings.Builder
+ _, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by%s)\n", e.err.Error(), e.offset, marker))
+
+ prettyBuf := bytes.NewBuffer(make([]byte, 0, len(e.data)))
+ err := json.Indent(prettyBuf, e.data, "", " ")
+
+ // If there was an error indenting the JSON, just treat the original data as the pretty data.
+ if err != nil {
+ prettyBuf = bytes.NewBuffer(e.data)
+ }
+
+ // If the offset is at the end of the data, just print the pretty data and the marker at the end.
+ if int(e.offset) == len(e.data) {
+ _, _ = sb.WriteString(prettyBuf.String())
+ _, _ = sb.WriteString(marker)
+ return sb.String()
+ }
+
+ // If the offset is within the data, find the corresponding offset in the pretty data.
+ var (
+ pIndex int
+ pOffset int
+ )
+ pretty := prettyBuf.Bytes()
+ for dIndex, b := range e.data {
+ // If we've reached the offset, record it and break out of the loop
+ if dIndex == int(e.offset) {
+ pOffset = pIndex
+ break
+ }
+
+ // Fast-forward the pretty index until we find the byte in the pretty data
+ // that matches the byte in the original data.
+ for pretty[pIndex] != b {
+ pIndex++
+ if pIndex >= len(pretty) {
+ // Something went wrong. For example, if the pretty data somehow reordered
+ // the bytes or is missing a byte
+ return e.err.Error()
+ }
+ }
+
+ // We found the byte in the pretty data that matches the byte in the original data,
+ // so increment the pretty index.
+ pIndex++
+
+ }
+
+ _, _ = sb.Write(pretty[:pOffset])
+ _, _ = sb.WriteString(fmt.Sprintf("%s ", marker))
+ _, _ = sb.Write(pretty[pOffset:])
+
+ return sb.String()
+}
diff --git a/staging/operator-registry/alpha/declcfg/errors_test.go b/staging/operator-registry/alpha/declcfg/errors_test.go
new file mode 100644
index 0000000000..9da8f86b91
--- /dev/null
+++ b/staging/operator-registry/alpha/declcfg/errors_test.go
@@ -0,0 +1,154 @@
+package declcfg
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "reflect"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+)
+
+func TestJsonUnmarshalError(t *testing.T) {
+ type testCase struct {
+ name string
+ data []byte
+ inErr error
+ expectErrorString string
+ expectPrettyString string
+ }
+ validData := []byte(`{"messages": ["Hello", "world!"]}`)
+ invalidData := []byte(`{"messages": ["Hello", "world!"]`)
+ for _, tc := range []testCase{
+ {
+ name: "unknown error",
+ data: validData,
+ inErr: errors.New("unknown error"),
+ expectErrorString: "unknown error",
+ expectPrettyString: "unknown error",
+ },
+ {
+ name: "unmarshal type error: no data",
+ data: nil,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: 0},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: `json: cannot unmarshal foo into Go value of type string`,
+ },
+ {
+ name: "unmarshal type error: negative offset",
+ data: validData,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: -1},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: `json: cannot unmarshal foo into Go value of type string`,
+ },
+ {
+ name: "unmarshal type error: greater than length",
+ data: validData,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: int64(len(validData) + 1)},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: `json: cannot unmarshal foo into Go value of type string`,
+ },
+ {
+ name: "unmarshal type error: offset at beginning",
+ data: validData,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: 0},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: `json: cannot unmarshal foo into Go value of type string at offset 0 (indicated by <==)
+ <== {
+ "messages": [
+ "Hello",
+ "world!"
+ ]
+}`,
+ },
+ {
+ name: "unmarshal type error: offset at 1",
+ data: validData,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: 1},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: `json: cannot unmarshal foo into Go value of type string at offset 1 (indicated by <==)
+{ <==
+ "messages": [
+ "Hello",
+ "world!"
+ ]
+}`,
+ },
+ {
+ name: "unmarshal type error: offset at end",
+ data: validData,
+ inErr: &json.UnmarshalTypeError{Value: "foo", Type: reflect.TypeOf(""), Offset: int64(len(validData))},
+ expectErrorString: `json: cannot unmarshal foo into Go value of type string`,
+ expectPrettyString: fmt.Sprintf(`json: cannot unmarshal foo into Go value of type string at offset %d (indicated by <==)
+{
+ "messages": [
+ "Hello",
+ "world!"
+ ]
+} <==`, len(validData)),
+ },
+ {
+ name: "syntax error: no data",
+ data: nil,
+ inErr: json.Unmarshal(invalidData, nil),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: `unexpected end of JSON input`,
+ },
+ {
+ name: "syntax error: negative offset",
+ data: invalidData,
+ inErr: customOffsetSyntaxError(invalidData, -1),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: `unexpected end of JSON input`,
+ },
+ {
+ name: "syntax error: greater than length",
+ data: invalidData,
+ inErr: customOffsetSyntaxError(invalidData, int64(len(invalidData)+1)),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: `unexpected end of JSON input`,
+ },
+ {
+ name: "syntax error: offset at beginning",
+ data: invalidData,
+ inErr: customOffsetSyntaxError(invalidData, 0),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: `unexpected end of JSON input at offset 0 (indicated by <==)
+ <== {"messages": ["Hello", "world!"]`,
+ },
+ {
+ name: "syntax error: offset at 1",
+ data: invalidData,
+ inErr: customOffsetSyntaxError(invalidData, 1),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: `unexpected end of JSON input at offset 1 (indicated by <==)
+{ <== "messages": ["Hello", "world!"]`,
+ },
+ {
+ name: "syntax error: offset at end",
+ data: invalidData,
+ inErr: customOffsetSyntaxError(invalidData, int64(len(invalidData))),
+ expectErrorString: `unexpected end of JSON input`,
+ expectPrettyString: fmt.Sprintf(`unexpected end of JSON input at offset %d (indicated by <==)
+{"messages": ["Hello", "world!"] <==`, len(invalidData)),
+ },
+ } {
+ t.Run(tc.name, func(t *testing.T) {
+ actualErr := newJSONUnmarshalError(tc.data, tc.inErr)
+ assert.Equal(t, tc.expectErrorString, actualErr.Error())
+ assert.Equal(t, tc.expectPrettyString, actualErr.Pretty())
+ })
+ }
+}
+
+// customOffsetSyntaxError returns a json.SyntaxError with the given offset.
+// json.SyntaxError does not have a public constructor, so we have to use
+// json.Unmarshal to create one and then set the offset manually.
+//
+// If the data does not cause a syntax error, this function will panic.
+func customOffsetSyntaxError(data []byte, offset int64) *json.SyntaxError {
+ err := json.Unmarshal(data, nil).(*json.SyntaxError)
+ err.Offset = offset
+ return err
+}
diff --git a/staging/operator-registry/alpha/declcfg/load.go b/staging/operator-registry/alpha/declcfg/load.go
index 98b25da02a..43864f7921 100644
--- a/staging/operator-registry/alpha/declcfg/load.go
+++ b/staging/operator-registry/alpha/declcfg/load.go
@@ -1,17 +1,19 @@
package declcfg
import (
- "bytes"
+ "context"
"encoding/json"
"errors"
"fmt"
"io"
"io/fs"
"path/filepath"
- "strings"
+ "runtime"
+ "sync"
"github.com/joelanford/ignore"
"github.com/operator-framework/api/pkg/operators"
+ "golang.org/x/sync/errgroup"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/util/yaml"
@@ -22,6 +24,46 @@ const (
indexIgnoreFilename = ".indexignore"
)
+type WalkMetasFSFunc func(path string, meta *Meta, err error) error
+
+func WalkMetasFS(root fs.FS, walkFn WalkMetasFSFunc) error {
+ return walkFiles(root, func(root fs.FS, path string, err error) error {
+ if err != nil {
+ return walkFn(path, nil, err)
+ }
+
+ f, err := root.Open(path)
+ if err != nil {
+ return walkFn(path, nil, err)
+ }
+ defer f.Close()
+
+ return WalkMetasReader(f, func(meta *Meta, err error) error {
+ return walkFn(path, meta, err)
+ })
+ })
+}
+
+type WalkMetasReaderFunc func(meta *Meta, err error) error
+
+func WalkMetasReader(r io.Reader, walkFn WalkMetasReaderFunc) error {
+ dec := yaml.NewYAMLOrJSONDecoder(r, 4096)
+ for {
+ var in Meta
+ if err := dec.Decode(&in); err != nil {
+ if errors.Is(err, io.EOF) {
+ break
+ }
+ return walkFn(nil, err)
+ }
+
+ if err := walkFn(&in, nil); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error
// WalkFS walks root using a gitignore-style filename matcher to skip files
@@ -29,6 +71,21 @@ type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error
// It calls walkFn for each declarative config file it finds. If WalkFS encounters
// an error loading or parsing any file, the error will be immediately returned.
func WalkFS(root fs.FS, walkFn WalkFunc) error {
+ return walkFiles(root, func(root fs.FS, path string, err error) error {
+ if err != nil {
+ return walkFn(path, nil, err)
+ }
+
+ cfg, err := LoadFile(root, path)
+ if err != nil {
+ return walkFn(path, cfg, err)
+ }
+
+ return walkFn(path, cfg, nil)
+ })
+}
+
+func walkFiles(root fs.FS, fn func(root fs.FS, path string, err error) error) error {
if root == nil {
return fmt.Errorf("no declarative config filesystem provided")
}
@@ -40,7 +97,7 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error {
return fs.WalkDir(root, ".", func(path string, info fs.DirEntry, err error) error {
if err != nil {
- return walkFn(path, nil, err)
+ return fn(root, path, err)
}
// avoid validating a directory, an .indexignore file, or any file that matches
// an ignore pattern outlined in a .indexignore file.
@@ -48,35 +105,136 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error {
return nil
}
- cfg, err := LoadFile(root, path)
- if err != nil {
- return walkFn(path, cfg, err)
- }
-
- return walkFn(path, cfg, err)
+ return fn(root, path, nil)
})
}
+type LoadOptions struct {
+ concurrency int
+}
+
+type LoadOption func(*LoadOptions)
+
+func WithConcurrency(concurrency int) LoadOption {
+ return func(opts *LoadOptions) {
+ opts.concurrency = concurrency
+ }
+}
+
// LoadFS loads a declarative config from the provided root FS. LoadFS walks the
// filesystem from root and uses a gitignore-style filename matcher to skip files
// that match patterns found in .indexignore files found throughout the filesystem.
// If LoadFS encounters an error loading or parsing any file, the error will be
// immediately returned.
-func LoadFS(root fs.FS) (*DeclarativeConfig, error) {
- cfg := &DeclarativeConfig{}
- if err := WalkFS(root, func(path string, fcfg *DeclarativeConfig, err error) error {
+func LoadFS(ctx context.Context, root fs.FS, opts ...LoadOption) (*DeclarativeConfig, error) {
+ if root == nil {
+ return nil, fmt.Errorf("no declarative config filesystem provided")
+ }
+
+ options := LoadOptions{
+ concurrency: runtime.NumCPU(),
+ }
+ for _, opt := range opts {
+ opt(&options)
+ }
+
+ var (
+ fcfg = &DeclarativeConfig{}
+ pathChan = make(chan string, options.concurrency)
+ cfgChan = make(chan *DeclarativeConfig, options.concurrency)
+ )
+
+ // Create an errgroup to manage goroutines. The context is closed when any
+ // goroutine returns an error. Goroutines should check the context
+ // to see if they should return early (in the case of another goroutine
+ // returning an error).
+ eg, ctx := errgroup.WithContext(ctx)
+
+ // Walk the FS and send paths to a channel for parsing.
+ eg.Go(func() error {
+ return sendPaths(ctx, root, pathChan)
+ })
+
+ // Parse paths concurrently. The waitgroup ensures that all paths are parsed
+ // before the cfgChan is closed.
+ var wg sync.WaitGroup
+ for i := 0; i < options.concurrency; i++ {
+ wg.Add(1)
+ eg.Go(func() error {
+ defer wg.Done()
+ return parsePaths(ctx, root, pathChan, cfgChan)
+ })
+ }
+
+ // Merge parsed configs into a single config.
+ eg.Go(func() error {
+ return mergeCfgs(ctx, cfgChan, fcfg)
+ })
+
+ // Wait for all path parsing goroutines to finish before closing cfgChan.
+ wg.Wait()
+ close(cfgChan)
+
+ // Wait for all goroutines to finish.
+ if err := eg.Wait(); err != nil {
+ return nil, err
+ }
+ return fcfg, nil
+}
+
+func sendPaths(ctx context.Context, root fs.FS, pathChan chan<- string) error {
+ defer close(pathChan)
+ return walkFiles(root, func(_ fs.FS, path string, err error) error {
if err != nil {
return err
}
- cfg.Packages = append(cfg.Packages, fcfg.Packages...)
- cfg.Channels = append(cfg.Channels, fcfg.Channels...)
- cfg.Bundles = append(cfg.Bundles, fcfg.Bundles...)
- cfg.Others = append(cfg.Others, fcfg.Others...)
+ select {
+ case pathChan <- path:
+ case <-ctx.Done(): // don't block on sending to pathChan
+ return ctx.Err()
+ }
return nil
- }); err != nil {
- return nil, err
+ })
+}
+
+func parsePaths(ctx context.Context, root fs.FS, pathChan <-chan string, cfgChan chan<- *DeclarativeConfig) error {
+ for {
+ select {
+ case <-ctx.Done(): // don't block on receiving from pathChan
+ return ctx.Err()
+ case path, ok := <-pathChan:
+ if !ok {
+ return nil
+ }
+ cfg, err := LoadFile(root, path)
+ if err != nil {
+ return err
+ }
+ select {
+ case cfgChan <- cfg:
+ case <-ctx.Done(): // don't block on sending to cfgChan
+ return ctx.Err()
+ }
+ }
+ }
+}
+
+func mergeCfgs(ctx context.Context, cfgChan <-chan *DeclarativeConfig, fcfg *DeclarativeConfig) error {
+ for {
+ select {
+ case <-ctx.Done(): // don't block on receiving from cfgChan
+ return ctx.Err()
+ case cfg, ok := <-cfgChan:
+ if !ok {
+ return nil
+ }
+ fcfg.Packages = append(fcfg.Packages, cfg.Packages...)
+ fcfg.Channels = append(fcfg.Channels, cfg.Channels...)
+ fcfg.Bundles = append(fcfg.Bundles, cfg.Bundles...)
+ fcfg.Others = append(fcfg.Others, cfg.Others...)
+ }
+
}
- return cfg, nil
}
func readBundleObjects(bundles []Bundle, root fs.FS, path string) error {
@@ -123,46 +281,38 @@ func extractCSV(objs []string) string {
// Path references will not be de-referenced so callers are responsible for de-referencing if necessary.
func LoadReader(r io.Reader) (*DeclarativeConfig, error) {
cfg := &DeclarativeConfig{}
- dec := yaml.NewYAMLOrJSONDecoder(r, 4096)
- for {
- doc := json.RawMessage{}
- if err := dec.Decode(&doc); err != nil {
- if errors.Is(err, io.EOF) {
- break
- }
- return nil, err
- }
- doc = []byte(strings.NewReplacer(`\u003c`, "<", `\u003e`, ">", `\u0026`, "&").Replace(string(doc)))
- var in Meta
- if err := json.Unmarshal(doc, &in); err != nil {
- return nil, fmt.Errorf("unmarshal error: %s", resolveUnmarshalErr(doc, err))
+ if err := WalkMetasReader(r, func(in *Meta, err error) error {
+ if err != nil {
+ return err
}
-
switch in.Schema {
case SchemaPackage:
var p Package
- if err := json.Unmarshal(doc, &p); err != nil {
- return nil, fmt.Errorf("parse package: %v", err)
+ if err := json.Unmarshal(in.Blob, &p); err != nil {
+ return fmt.Errorf("parse package: %v", err)
}
cfg.Packages = append(cfg.Packages, p)
case SchemaChannel:
var c Channel
- if err := json.Unmarshal(doc, &c); err != nil {
- return nil, fmt.Errorf("parse channel: %v", err)
+ if err := json.Unmarshal(in.Blob, &c); err != nil {
+ return fmt.Errorf("parse channel: %v", err)
}
cfg.Channels = append(cfg.Channels, c)
case SchemaBundle:
var b Bundle
- if err := json.Unmarshal(doc, &b); err != nil {
- return nil, fmt.Errorf("parse bundle: %v", err)
+ if err := json.Unmarshal(in.Blob, &b); err != nil {
+ return fmt.Errorf("parse bundle: %v", err)
}
cfg.Bundles = append(cfg.Bundles, b)
case "":
- return nil, fmt.Errorf("object '%s' is missing root schema field", string(doc))
+ return fmt.Errorf("object '%s' is missing root schema field", string(in.Blob))
default:
- cfg.Others = append(cfg.Others, in)
+ cfg.Others = append(cfg.Others, *in)
}
+ return nil
+ }); err != nil {
+ return nil, err
}
return cfg, nil
}
@@ -187,47 +337,3 @@ func LoadFile(root fs.FS, path string) (*DeclarativeConfig, error) {
return cfg, nil
}
-
-func resolveUnmarshalErr(data []byte, err error) string {
- var te *json.UnmarshalTypeError
- if errors.As(err, &te) {
- return formatUnmarshallErrorString(data, te.Error(), te.Offset)
- }
- var se *json.SyntaxError
- if errors.As(err, &se) {
- return formatUnmarshallErrorString(data, se.Error(), se.Offset)
- }
- return err.Error()
-}
-
-func formatUnmarshallErrorString(data []byte, errmsg string, offset int64) string {
- sb := new(strings.Builder)
- _, _ = sb.WriteString(fmt.Sprintf("%s at offset %d (indicated by <==)\n ", errmsg, offset))
- // attempt to present the erroneous JSON in indented, human-readable format
- // errors result in presenting the original, unformatted output
- var pretty bytes.Buffer
- err := json.Indent(&pretty, data, "", " ")
- if err == nil {
- pString := pretty.String()
- // calc the prettified string offset which correlates to the original string offset
- var pOffset, origOffset int64
- origOffset = 0
- for origOffset = 0; origOffset < offset; {
- pOffset++
- if pString[pOffset] != '\n' && pString[pOffset] != ' ' {
- origOffset++
- }
- }
- _, _ = sb.WriteString(pString[:pOffset])
- _, _ = sb.WriteString(" <== ")
- _, _ = sb.WriteString(pString[pOffset:])
- } else {
- for i := int64(0); i < offset; i++ {
- _ = sb.WriteByte(data[i])
- }
- _, _ = sb.WriteString(" <== ")
- _, _ = sb.Write(data[offset:])
- }
-
- return sb.String()
-}
diff --git a/staging/operator-registry/alpha/declcfg/load_benchmark_test.go b/staging/operator-registry/alpha/declcfg/load_benchmark_test.go
new file mode 100644
index 0000000000..780620c5cb
--- /dev/null
+++ b/staging/operator-registry/alpha/declcfg/load_benchmark_test.go
@@ -0,0 +1,298 @@
+package declcfg_test
+
+import (
+ "context"
+ "encoding/base64"
+ "fmt"
+ "math/rand"
+ "os"
+ "runtime"
+ "testing"
+
+ "github.com/blang/semver/v4"
+ "github.com/operator-framework/api/pkg/lib/version"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+ "github.com/operator-framework/operator-registry/alpha/declcfg"
+ "github.com/operator-framework/operator-registry/alpha/property"
+)
+
+func BenchmarkLoadFS(b *testing.B) {
+ fbc := generateFBC(b, 300, 450, 3000)
+ b.ResetTimer()
+
+ for _, n := range []int{1, runtime.NumCPU(), 2 * runtime.NumCPU()} {
+ b.Run(fmt.Sprintf("%d routines", n), func(b *testing.B) {
+ for i := 0; i < b.N; i++ {
+ b.StopTimer()
+ tempDir := b.TempDir()
+ if err := declcfg.WriteFS(*fbc, tempDir, declcfg.WriteJSON, ".json"); err != nil {
+ b.Error(err)
+ }
+ b.StartTimer()
+
+ _, err := declcfg.LoadFS(context.Background(), os.DirFS(tempDir), declcfg.WithConcurrency(n))
+ if err != nil {
+ b.Error(err)
+ }
+ }
+ })
+ }
+}
+
+const randomPng = "iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAAAXNSR0IArs4c6QAAIABJREFUeF7t3dGR5UiupGGmMK3UlDCdLUxdpUaYXOu7r5v4xtqXVj0zf74yyUMiEAgPhwPx8TxfX8/19/lxXn4+79u/ft73f/zA/c99/x/P5/l+v+P6c//8/e3P83z8AfN8vvt+f3zcz9cH/P5zu//5gV+Qff8H9/8D1+Gez0/c//L7//Fjs+/n8/v5AZpf6+/LPzh/Mf+fdXzlX/IP3P/xscWnjzXAIP5+vhxfFD8ezV9N339u8VPzQ+//9YX1CePP52P90v1yH60/Xwg/HwEADsH5DxqAtydoAADjFwCYHDwAEAA4HSgAcAP0AEAMwOUhK0MRAAgAXBaIAdgYqhgA2C8AEAC4LCCKkhRiKYDTwQIAAYAAwGGBUgD3BFEKRfxRACAAEAD43gKlAMYdxJojLgWgEH5eLwVQCqAUwF+fQl+lAEoBlAI4LKAdRADg3mFAZFcKoBQAtqh/fXX7807NXzz9IxHgxNBIg5YIsCqAaYfH6PCyin5WiccAcAhPgIoqEabwqgKY7P9UBXDaryoA4IeqAGCBMQcmBFYKoBTAsgIowEljEwMQAxAD8L0FKgNEHwAFGAU37RA+n7uQXip59gEQB8IPuP9h/v2RQlOA5wKy5qiww14pvt8xflRpo85XIkr9Pt1HdeRrHfLbO0R9oAA0/Fv+Sw0CKGT1KeHnrX1MRv/j/H3Zf2QfbXB0v65z/N/uI6P4M/aBkf2+fpOF7uuKv+wDEAAIAJwWCACc5lkBiu5/nSJW/AkA3BvsAIA8aEpRaoMpEd66gVsZ4ABADMA0QbSD4g4iBuAOQCODpAV8piBjAO75g06lmnzaAHEBCgDIxAGAwwIxABDxrQiO3ok64vn3SwFMC/C6wJYC2FoVq1WpVOICsKSASwFMDJQYJMVH7WB1v65z/EsB3OOP+VEKQB4YALgtVApgCsAxADgrQ1UIAYDJ/wIA8L80AGqlBRECEFoiQCEQaBBw2EwpABwmhcOUEgHCP9MApAHYQlgpgFIA31ugKoAAwGWBUgA3wBFFq/nF2B4ACADQSf76P5QC+Ou2+/POqgBGEZc0cmkAwACNnb60Aw8ABABOD0wEeE9QHfeO9UcAc1u+nicAsFmQAODrCzIeiNT0A1/3ceb8Oom05IBSUVKEBBEiGORHvy8DyL66n3XQCgAKoLif448Mk85TVw6d9ln/Qe+vPlTj/BBA5edJw7Gm8ATAlWEUw6AP1PN1P36fAHTthDj2UdDnMUWIKgY9XyLQR51E1clTL4BW4msZHxk0vb++X/6HPgRafz4CABCBBACmHUQA4DYf7aMAty5wAQAMEBguNXoKANwG1AKoBVTzIwBwWigAABGdEF4MwL0CcYHTDhoEVQyAIiCuBwACAIcF5vmlMucAwOZ/MQD3Dl4USCkArMClALAFxOVSAJP92GdA+GdlSETBxgDcIxAA2BgQ+V8AIABweti4gK8aghiAUgA3B4kVPA3AaSBtYISP0gAgw/m5pYgfpTDEgAQA7gFIBIgpHgBQDNyuK4URAxADcFkAOWqJ6AIAmL5pANIAXBbQBEoDAAhaFcA9wQIAAYAAwPcW0A5YO2jB9wBAACAAcFigMkCFkGkBo0i0MsBJBMXBSwNwZwif2wETAf6HpwCez1tmIxGd6jgVAEXhsxEEGs3w/RVBRgSp3xcDIfswx64+DjpMYy1jEkUulb9+HzsINWrS8KsRkShaPV+nya292uV/er91frMNwMqQSGSm+SsRn+rg17NCUGbMHPKYQnjG+9WnhOMvlacYxt+Az7U+CICv8RONOrQ+cn4ixatW+x8BgHdzSArAAYA7xaDjWLVABQAYQu5/AMBSAOMCEAC47S8KfFzAAwCYHwEAGGgMENrhxgCgyuFtBKsduAJQDMCdgwMDEwOwBWgtcOzkFwNw+6922AB46vQp/9cGiwzF2/EzBuCewAGAscrhbQcOANwOLAoa61cpAEgARv8OAGwMp1JcXGADADeAgn3I35UCQABBjogGVg5xbMRQCqAUwK3S2lRs2iHR/0eGrxTAyyIyMXACqOP9AQDErxiAGIDLAgGAAEAA4HsLrCLXGIAYgMsCq3+JwfsKAAQAAgDfW0A5wESAMQBnBBl3uGkANo1FDEAMwJTjSAOQBuBE6NIgVAZ4zr9SAPcCFwAIACwA89+eAfj6eRdirh+oOlY9X3WMqhJYy8T0fCFg5VhJQekBKlORSlciK4nYUEet8dPnyf66X+Mv/9T9KoPT+xEAo058LXPU7wtAyP91v+yrMnGd566zLNTo5o9xgOm/ysHLgVRlM5ZZzvYFBa7Pe/s6GUhUgcwA8mUGS1UUHwEAiHR+3tcVAOXAAYDbQgygMvDaanQUwen1tACrFXUAABaGSjoAAIYEImcCrADAbeAAwJ1D0Q6SC8RIEev5AYBt/LRAyv66nztMNVoJANwpPjFMqsIRQBtPQ+MChR1eDMAIsAIAAYDLAqUAuIRNDiSAsjIQosAE4PT1AYCbgYoBGBeoAMAN8GIAbvusraRjALYdJBeIGIBbJJYG4F5BYgBiAIRSj+uMT2kABuvut6YBSAR4epEmsHbYctF1Bz536goABAAOC0jEJ//X/UzRlAJAkh6XEwHeAFaHkSUC3OocpbIuBSCIgOtVAUwLuPxTC9QoEn8SAcK/AwABgDFEninoAEBlgJeDxAAg/lQGOIWnAEAAYHKgygBH82GD+5/OAHxCJssFcDzNjBQhcmRS6X4+N8e9dppTDmkWwaEOXDvQNcUgkZ9aXa513Hp/1SmvC+z6/opO7JWvF8B56VLBq05Y70cGRQYYc+Ca/7/jA+jfakQ1nhUi89D/VxGaAAT8T/FN9uf4oQxb9hODJxEt1w9VOYDB0u2cX9IoYfw+AgCYAaOBNUHkwKoDDwDcFgwAIAIBQAQAEB8CALeGCg4UAMAKsJYpBwBiAAQyzhyZdhiCsGMOlzsglCkFAAIAk3/HAJzhQxucGABEXx31EQC4DSgESQpHEzwG4ByAUgALvHoe7bCVYhKFXwoAnTwFcBUfYgBiAC4LlAK4IU4agHsBKQUAEWIMAHIgMQAxAIcF0gCA4QCDPDKguj0NQCLA00HTAKQBuCNYACAAEAD4zgKJAKsCuFeQUgClAK74qVapyBCUAthSKEoBKgddFQAYtqoAXo1/MQA6LCQGIAZgWIATAcYAxADEAMQA/L8t8KcE5owQopgVYIXvdb+uK0fOHMoo4uH7oY71jx/o1QkDsk+DTmvDz2v8Nb7SeKgT5NqnQWX0aqWs71MrXN2v6/KvVeQq/9PzpQLX/Rpf2Vf20fzQ95NBGBkgjT+rYCRiRCMb+r9Oa4RKfR0/ja9ErvIv2Z/xiVt4/cJ9XSkK+adeLwAQAJgYBrl3AEAW2jQM6wKrBVDPDwBs46u7AwDYoXyik5+qODAAAQDZ/3PbwQrh6XoMAMqcYgDuKa7jOBUgYF8FeF2X/2uB1g4oAHDPH+2w1IlS46vrAQAtQAGAewcHjUcpABhoLTMrBXD7J1pJawFTq89SAHedVwAgAHBO0FIAp3nYB0UID9dLAYBhiAGIAcAMjQE4LBAACAAEAL63QCkAMTClAM75s4qQBCD1fIlwWIa2ZXieNAAawTQAlwXkv0qRaH4IAJUCgP8mAtwmeAzAvcJwguO0vKoAbg8LAGzzVwvU9vTnkf+nAcAOfkzBBQACAJcFSgHEAMQAHBaIAdggQABgY0hiANDrVyLYNAD/2RoAHQfMHYYKDdfT4NAoiDmatQ5W55WvpzlpfRgbIenxuq7x1/06rGYGCPA/imiwQ5R/8fuQQtH7yb4CCFSRQ+Sq+/V+qjOXfb8wf9XJj++H45BlX80Pvf/ayXC1r+yjMk8xJFoe9PuriFf+xd/HP2h86Z86jvs+ioCvr9//CADAhgEAOtn5D3LwFeAFAO4dCgKIytgCAEhRPjgsBgAmAKAVFtfBYAQA7h14AEAUWAAgAHBZQAAnBuD0HwXoeYcl740BuPH7c1NEMQA3BawdOBnEGIB7Bq8BRBTaEwBQCEWSdjsOmuMbAxADsHhoACAAMPjPDFC1gQgABAAuC4hCHHz7f29VjpPPl4OXAqAJTwICIlxR+KUAboCaBiAG4Jp/AQCpPBIBTgFeDEQAAJ3uUCYqlbgYCFJ4pQBKARwW0Pwlxf5yDjwR4B2+AwABgNtD0CiD6KAqgJviLgVQCoCT6PiHUgClAAb/CQAEAAIAJ0edBuBM4aiRFYKTKOpSADJgKYBz+iYCvAH2WqaqFOnbGoCvL1Rarip5zL+3KTC1+hzA3//eOlN0OE1OAX4+C0EGQCOQtY5dFLxeTxS9OnV9vNzqWO+/+qfsR/sogOm8ex3Hqj4cax8NNapBClLxR+On+fehQnYtAKN/6vc1P9ZOqqt9Ff/UR0QpVKn0f3kKBAyy4ofs9xEA0BS/rwcAtgilBUyjwwUODFUAAGVMAYDTBQMA9wwNACiC4XoAAAsMGAohpHF4YgBGCjsA8C6AIkCKAZhCQAAgAHBaQAyXvC8AEAC4fEQBiBSeHLAUwJ0DRBmjzLsCVAGoAMC7C5Tmnyj4tYpE/qXfLwVw54hKAaQBuClAHaenMp00AIphN8D+cU9gBbhSAKUAFgcMALwLsJTDTgOwnaabBmCZ/YkAn0SAmwPFAGw50CcRIBjoDSCTQXy5TDkAAID1IwBwWmgNsArviQDfzWHL/qS4EwHeKYw0AHKxRICXBQIAt/+kAdgoonWBDQBM8e3RDisGYLPv6p9pAGD/ygBvAKg+LmpkFgD4NwcAz12ouuZIReGo1/zXT7R6FQWi4zrxfC2Aso8asfAwIsS3D2gItDxxfNBrnvfD/hTZ/NwYBi2wAphrr3zVGa+dxKRx0PjTf2F+3j8eR/yoz4DmLxYoje/8+0hRrPbT+i0Kf2XQtAFYAapEkvJvjp/6VCj+okx21ShofdD4Kb5+fAUA7iF+ewJLZCkHDABMKaAAwO1g0riuC9jrC3AA4FURbQAA80dVQjptViJyiKADADEAp4dyBx8DcFOo2uH+CbGPvxgAINwYgI1iBoWvHaQYpgBAAGBbYMYFWhTvmmIoBbCpTGV/IVRRiKIA5R8xADEAdwADgFMK4m0GUSKzAMAEwBVfxGCVAtAOMgAgH7spvFIApQAGDyKFnwbgXkACAKd9BODFQKQBAAFUCgA71BFgxADEAJwUfimALUWynjWgBTgNQBqAIQUnbB0DoBReDMBtoUSA0w5CE7QUAHYQ2OEnAiwFcHlQGoA0AGkALoSp85wDAAGAwwIsI2QdWADgsoB2cCwjEwORBmBiIEoBvJwC+ISHq9c1EaBOixsbTWgCsw4fW0g9XztQXdcOS8eJq0709RQGREg6jET2UQCQyEYMgESK+n0uEOq0hyoB2Ucqbd0vDYCqRCSi1HGwer6u6/c1f+U/nD+coBoB7CAB8BR/t19/HuXw1+fz/vEwMq1fik/qQ/OMKSb5t67LfvLvjwAAEJZylBoBXA8AKId0Iww5eABgYwAUgLQABwC2ACGAFwC4c1gBAM7/u9BWBpQD6n51qloRVgwAHeD8B9ovBuC2XwzAliKEhkgAJAZgAyAxAAhwMQAbAgsAiCLAdWkIfnEOUhQbw9NnDMBlI+0QZd9SALCQ5k8pALnYdr0UwGQ/MaSlAGBe7SCm0XmepxRAKYDFhwIA9wZE81cBMg3AdhbH4tv/e28AYDKh/DsAEAAoBXBZAAxEIsB7gUgDMMXvRwBPKdjt1xMBJgKEil8OmAbgnoIxADEAS5DWAqFnlwIoBXBZIA1AGoBzhgQAFGIDAJOF0gDcDM3LfQCqAri9d9a4YHII4Cn+TnPviQGIAVjr+EcRjQ6LkYOrzlsTTCLFD/TiVw5G76/rKnPT/WRo7kZoj/oQyD56P1UhiGKWSpzr59inYn4/pajW0wbHMlf5t3q9a35z/uo8d4hkNX/WHbD8n/Yb44vsrwVO93P+olGSnr/6x/p+0iBQA6rDmvSCY/xRfJs1AFogZUAhaDmA7McAIgvpNK1xgur9dV0BTPcHAGChcQIGAG4EqfnN+RsAOB1YC2wAACs0NrABAAXIGACtwdP1AADKUCWyEEKXf6MOOAAQALgmeAzAu/6h4CoApA1sAEABMgAgH5yuBwACAOcCo0ZEpQDO+VcKQDlAaJxKAUzxnQw7NiAiuEsByEKlAG4HRo5VOVDNjjQAEKGlAZj8UwA6ABAAOB1M5hHDqACoDXYA4LYgc4gBAEB4eGgA4DRQKYB3Kd6vNABpALSIHtdLAYynAZKiKAUwuKdv1Q5GT0gEmAhQPjLlsH8EACb7jSLjRIBbiiINQGWAN8IeJ+gSfP+8NwCQBiANwGGBygBvBnvM0St+aYctgLJWiazv9x8PAL6+bh3jh3KMcCAacMxx6P3kQMrxaYHV/XJAnXbIOnvssNTnQJ3glIPX94kC1/1K4XB8UQUg/1kDmOwvFbHsJ/+TBkMqdI0P58dYhaFGN/p+vb/ik8qUlYKQf/H98A/yf82fR62u5xe8GSDNL42P/EOvzz4hesDbKdDf9AL3dQGsjwAAepn/wA7z53hYhkQccrAAwDkDNMEVoBWgNMECAJgfEEkpwAcA7jKOAMC9QCo+cPlVfAZDrOevAF3xKQCABZw7nADA6cPawWoCKIBpB6QJHgDQCNzXOT9iADYDxwDc8UUpathP8YGDFwAYOymVArh9TA4WAxADcFigFABC+ChSLgUghFIKgCDi+IcYAFDk2sFxhxgDcPpnGoAb4IpiKwVQCmBZAHSv4psYtDQAYwpXG7RSAHDhGIAYgMMCCmAKgKL4BCDTAJQCuCwQAxADcFlADJwAXgxADMDpI+sOtCqAjaJc7V8VAAAGcryJABMBahG9rmuDwGfHAKQBoJNc/1AVwGm+GICtCkU7kHWHkQgQKSKUUU+x43keMWCaP6UA/stTAM/nvQf5/NwCEB1cIhyMjwLYHABfXqA5AT+3HSoDtKoYxMDgMBlpCFQloE6FKhNTAFQA1Q5zZgAwQcjQvFwnLA3Dan/GB/yD3m+2n+a/PkC94NFLXikq/TztAwqK80NVHvJv9ZkZD7Pi641nvcj+uj7HR8RvxaePAACGSAFAFBBU+gEAAExQwOsCxAA3TjAFYAWIeQFTAB6rSFb76/t1Xfad7af5rxcMANwpzADAaR9ukMb4FADQDkoBIABwOvCMcAMAt33lvwGAzX6a/wEAWSAAcFhgjo8BgNv/SgGMKZxSAHcAG3fQip7zDjYAEAA4LKBWx2TIyLEjPscAxABcFlgDYAAgAHD5FwPciLBFUQcAZIH7uuy7xg+e1aHXLwUQAxADcFggEeAdQhIB3ggZKYJEgNiBjQxGGgBRLLieCPBmaBIBnvZZRcppAJRDVQ4wDUAagAvhP9oCYoEeq2C4QQ0A3CbS/KeBAwAnw1sKoBRAKYDDAjEAMQAXwBCA1QY1ABAAuMLPc9f5ro10VObITosqQ1aZf2WAdyGoVIofGoDfBZHv62sZxPbrz7OeR71S0Hr/lQJiDhwiH43/AwCj71OOV/er054CEJ+P89TVp4J9GmR/NZrB+6nPh75f9+v7VaesBWAkWB76B+Kb7KP4+YBB1PPX67K/ns/4MZ61Iv96/fpzL2D0T43vmAJXfNX4MAUgB9YCoPvlYAGA20IBgF9LsaqPgxbAAAAaXSEHHABQBEWKSX1K8HgtMIpP8v/XF3g0utMGLgAQA3BOETmQJpCmtyaYEL5+XxSfAKAQqr4vBuDmMMlgxADcLiYRXgwA4htSBDEAt//FAJQC0CJ4XQ8AxADcEfoWIWqHJd/U/WJABFC5w9o0lqUAYgCmDRz9sxSAQkgAYLFQACAAEAAYZlAMwGA8H0ak+FQKACkaiRihsRLDmwZA7g+KZq2D1gDp9TTBtMPS75cCUBL03oJqB6wASPsnAtQUKQVwWEDxQcZl/CgFUApATnRdTwR4Wy8AEAMQAzBEmBiAwXgxAKUAEgFOOSQhaM3OAEAAIACgWXJcDwAMxgsA/NsDgE/ItLnA/PP2H4mERHHKO8kQoI6a96PV7INGEuolLhX318+bYhaFJ4ChKgXZn9fHOnnZj78vEY4eMKaA5N/yP82ftcyW/rfW2Wl+yP66rk59b4sEx052Mq8O65F5VKY6V+moTFMviPFZU6xr/Hx7gad5pAHQA6AR+AgAbOfRBwDezZEHAG7/DADA/wIA2KGBAhHBFgCYcvxav3WYle4XwAsAwMK/xwDQxxYKWiK5AEAA4PSvGAAs8EBAa6fOAEAA4LKAKExRpFp9RKHq+bw/AKAhmAJQAOBe4DV/YgBiABYArh2iJj8pcj2gFMBpoRgAOBAX8DQAd3xAr2vNX15PA3CaSP4bAICHxQBMADwAMLailsYIGiLFzwBAAOBGiOjklQhQUwzXEwFuBkwEeNsPO+BEgGDIdFjPKKImwxEAAADFYQui6BV9tIPS83l/KQANwbQDKQVQCmBysBiAaf7FAMQAnBaoDBB1GNrhIECxDGtEsDEA0/IyHwe9AtBSAKUAJg9GCi4A8F8OAL5+3idis1UpdsjKYXAHKI0P+hBAAsDDQDT5tIDrfl5XDl11omp0MraS1fvL/vSP+zjuh/Yf7UcKdny+7Kcy04/V/wVglcPE/Xy/32iB+x/EAICiXePbWqcugP76BuzlVr0SqYqBJQBW/JN7rf6L+LT2eZB/yD4CeB8BAHkIUnhaQLfHP2rkoQX2hnfPvIDq8/R+AQBYcA1QCpABgHMAVAYcANjKVAMA9w4tABADcFpAC2wAAIf1YIGMAXgZoMQA3AAEO3QxLNohimEQQ6LnxwBIAxoA0CbyvK4JsC6QejlS0HqArq8UcymACUAFAAIAlwViAGIA7gUqAHAH4HEHEABAgA4ABAAuC5QCKAVwWCAG4I6vYjjSAIBiTQSIBTwG4AbY0mCM9osBiAGIAfjeAqUAlKOOAYgBEM1/XR8XsDQAaQBO94sBiAGIAfjWAmSYqwK4t/hUeZcCuOFBACAG4LAAA1RVAKf/iOKuCuDdRlVVAfzNRYAMMFrAUUcsivVLSRTtrtcyqhXhKQDr/XFal+wz21cagj+QI4N/KADLPLq+qpzXBUC//6jOfjut9VGA1ft9oNW07M/rY6Oat897p/3UB0UU3Pj9si/toz4Sin96ATHkSOHp/XVa6Ifik74PfSQ4PzS+sI9E7BShohMv+wAEAOTByPEEAKYd2BhfHi1wAiABgBGBaAAVIAWAx06Z6vUeANAAbtdVRRUAuO0bAJD/xQDcGgwxLDEAN4DBDlAAJAZgO69eC4R2aAEAMHjaISv+av8UA3DHZ2wgAwBywABAAOCwQAwANDylAM75I4ZIKTh1+lQrV4U/AqRSALcJSwFsOV7tcDRBlOPWBJh7qQsB6zjPUgClAC4LpAG4p3ApAIa46x8CACPDEQAIAJwWCADcDEMiwHsCBQACAJcFAICEDgIAAYDLAokAVwosABAAOCyQBgBLVCLACQAFAG4LVAWAFJ9OA6wKQCoWOGApgFIApQC+t0AAIABwWEAMRmWAW5+Gj6+vu1CVZTDjedLcIWH9lYjr81ESXxgaFBJU9GqEtP3686hOlBoLlFHJvuv7a/z1++v98g8exwn/0v2/YwBVJkX7a4HFA9jrXC+AHKo0Qiqj18/LftQYoQqG8RFVIuv3zd+P+a/xkQpd85PvD4ZWrYjfnl9vz29VqYjhkIg0ACAPVIAMAEwWVIAIAIx1+AGAO0U1lsEGAO4dqOa3gocY6ACAUmx3/AgAyAMDAKOF7tsVIAIAAYDFAWMAbv8hxQ6RagzA3WpwZSBiAEoB3DsYaAxKASBHNlL4awphDRBcHGMAYgCWHHsA4PSfUgBpAE4HSQMQA3BZIABAio0Y5/qHGIAYgMU/5HwBgABAAECz5LheCgBlOmiVStPHAMQAxAB8awEBRM2vAEAAIACgWRIA+NYCMQAxAMP04a1a4NIAbBqbAEAAIADAMPT9P8QAxABgiz541/NwAawK4LZvGoD/bA3A83xNEEgISCIp1eFSZepC+NvBp693bFKd5hda5eo0s9n+Ok4VdbiqM6WFQFGrDp1lWACofD/8g8ZHz5f/S0Mi95/PwpDIFNc1frKP1ue36+hX/5J/aP6KIVrfT1U2it8aPzIMeADfD+fda35ofeH3K34hvqvPguyr+KAyyY8AgEy8XQ8AwH6aQOjjtAbAbXSfRwFezw8ACGG9myLQ+Kz+Jf8IANwjEAC47RMAEMRDr/63dxABgADAZYEAQADgskAMwNbqVstDDEApAG0CpusBgABAAGCYQr8YwMcAbK3USwHA93UaqPAxUnClAH5xAAkABAACAAGA7yxQCqAUwDA7nlIA4ngCAKd/CaGrF3ciwE1FWgpAW5w0AJcFVoaCOfbxMDXFFy1+fL9EgKcJYwACAAEARZnhukReenQAIACQBuB7CwQAEgGeFpBI5leXEZUCKAVQCkAw6Lj+iwH8usMWQCwFUApgmB17CuDruXXwPEzmCzNU54H/Aw6AJIcoDmcI3u2VrSqDGSCgTl99BtY6VH3fDMDgPwqwD8oM5T8CmGujGeXwVEfPBUrn0Sv6/MQO5Mc9f7jAqU8DRFKMTzquWw48lqlqftP/ZB8RKG/38RC+f3BanvwT/ieGQO69NiLj87UAafxu8z2KD4pPf3YaP2cwJ1gA4B5CpIgVILSAK0ev+wMAOM8cE1gTbKb41z4ICrCKYAGAO4WG8dH8DgBAxh4A2PwPZ4kEALADoIhFZRwBgAkgPTEAp/1iAMDgxQDc8+9zE7EKP5IBEkANAAQALgsIQYuBIcOBVrncQQcAAgBXintspRsACABcE0wM4VzFUwpg06iVAkgDcIrEdFZAGgDscG6NigBkGoA0AOf8LAVwOkgMABB+ACAAEAA4LFAKoBTAxaDyks8mAAAgAElEQVQohVcKoBTAYYFEgIkA7xxLKYCNwl/LuAIAAYAAgFLt314vBXCbLgAQAAgA/OXw8sB7nqcywBsBVQYIirQywGV2PgGAAMCpEfkcVSDKkUrFLe/+1Q6s99P1L5RJSsSl86hVZqYyZ73/+n6qw1cdq96P11cGAvevp4mxygR9MgSwBDBoP6nEVSev89DHPiB6f84fzE+VedK/X/7+Nf6qj4b8U3X40tho+VF8W+ef/Efjq/fX/SrTln3FYDyYXx8BALrA9A8BgHsFDQAAYQQApvkXALjNFwCAewHgBgBUZ6dOgLB/DMAtMxZCjgGAg6kMOgYAIjIAvJd3wEIHAYAAgHzkvB4AQA4lAHBrCEoB3PbZjhv33C4FYBtd/1EK4G8NgEoB3BoSAUBOjgBAAIBOcvxDKYBSAJf/KMeqHF4aAKzPOM5W8zMNwD1/laNOA7AxZLJvGgDtUJbV+//DvQowq8iuFIBySKUAJjfW/EoEeDNcL6dAYgBiAE4HTAQ4hb/55gBADEAMwGGBqgDOGKMNQgAgABAAmJfp9x4QAAgABAACAN9aYARAAYAAwAQAvn7iOGCc960cpspMWCe5isRGFffvL59WpRzOnAMSQ67xHeukmaLQ++mwHFxf64RXAKfxXXP8+r63/VfQWd9P/8b84/f/vB1Ev6/v03WJ0N7ula8qKmm41yoi2UcaC60vGj/ZX+uPNAy6rjJBfR/jg6rslAIIAOA8+ADAOYc5gaVSCwDcFvibA1gF+ADAvYMJAOA0R7RiDwBgBgYAbgNxBxEACAAcFmCOFjtQIvwAwJ0jx/xcAYgAjq5rBxoACAAsFD477QYAAgCXBZSiEQUeAwAGKQBwL+A/NgaOAL4UwGn/UgDbceGlAEDRaIFRDmZuFfs330GtOxTdrx2KxicAgDpoNNvn+IytfrkAvsxgyb/0/aJwpWHg9wcAAgCXBVDGqgVe19MAQGQWANhESgqwCtABALRaHjs5cnwCAKeLBgCgcv0JCck/7+sxADEAZxKGC0QMwEZxjjsULjAS2VUFcO+QAgDCkPcCvvp3VQC3/QMAp32kwdAGVDt8XY8BiAF4N0AqxxwAmAKEUiCJAG8HE0AtBfDHxIA8AYBpfgcAvu5KTwY4cEgft39zdyGEpQDDOtixVae+bz3vmQbCP6wIWL/P8Xk5B63xf37oC0Chjn0IIBF4RMF+oBBbdcRi8BQAVw2O5od2SBq9uc8E7EuVvgfw/AT6x9oHRRsAxGfO73EDovFllcz4ffx9/YNaZfN+iNTwfPmnxu/jKwBwD5HKKDCBAgBbDpM7RAWgAMDt3+rlPy5AAYARYI721/qj8dECQgCuF9B1aWQCADcD8nnH3wBADICm4ORgEnGJwgwAbHXSMQBYgGMAtvktAD5Fl+eJAbjnfwwAHLAUALYQOu9aKQYgzADAbUAzyAGAy4KlALYVNgZgs9+awlIKTs8PAAQAbgSP89DpgAGA0wJcwFcNQRqA2/5rq+kYgBiABQOkAUCOIRHg6V6iuBff/PPeRICbBSnSwgI/3x8ACABsLnzeHQMwGjcAEAA4KUpoDAIA9wSUfShCSgR4GzgRIBg0lOmRAoIGQQxRIsBphRbAmR7+vzusO0XH5ysFWxXA1ms9DUAaAE7C4x/mHbwCvBiEGIAYgMWBca8WyKoAlAP9dwcAjyIMDKDziHE7d3hC2JoceD+ppCkywvhrgglBrr8v84wpVHnPo+evde76PgJA4KO3Dztae9nP3w+GivMDnRL5fh+bypkiU70AGunodqrUx/go/+X7YQepRleav/z9X92oSPFfrZLFwKCMH6vroz47AmCyv8rQ/5x+kBkHALAFmXJsAYBN5a4JoACqRjcBAIxPAOB2wQDAHR+1AIMh0wKr43LX+ECAhA1iAEDHgcYA3AFmZKDowFph9ftAyDEAW4pLw8MAFwMgE97X1agmABAAOCwQAAgAbDlOLcAKb6KwdL9+PwBwWrAUQCmAy0EE4DQ9yTCKwVnjQymAe/5DZFQKIAYgBoBR7vt/UAAtBXAbNw0AnC8G4DZQACAAcFkgEaAkGIDg2oFr8VwRvn4/BiAG4LCANBbqdJYIEBM8EeCWgkgECAcbc1wBgADA5WE67Y74RiKjqgDuAInjvKkixwAFAMDAwH/l/6UANvuKIaSGKhHgPQABgABAAOB7C7DRkRZYAaBEgFxDz38oBVAK4AxgWP9+tQbgExCRAQgTQCrH9fmqs5eIghSiKG4FYNQ5r734ifB/3hw8c+RjJ0OO7xZ+eVqYdpiyv3YA8j9JWGYRIDodro2MdFqj/EfDK/sqfqytrhkfcNYINzA6qwQMC1Mg4/tpfDR/9f16vsaPfVDwA5pf+n3ZX/6j+Cz7iAGlRkfxPwCgVm0aIlBMAYDNgLobADQAcBtQACUAcMcHLYBaQBXAtQDp+Xo/Ta+3n68FOACADZxSdAEA1Fk/AYCTwYoBuHPkOOxKC6x2KArATwzAvYah17p2cLK/FljdHwC4RTgBgADAFIA5wQMAp33VSnINgNqB8HoMwD0/hG/VaW0s49L4lQIY+yCUAjhdTABbDIQYGK0vpQCQhBRCVq9t5WA1QGkAQBHHAEwANAYA/oUqjDQAOI0wABAAOCxADUEaAG2RtIdJA3BZgABvM28iwFIApQAOC4ih0/TT/F2frx14KYBSANMOLAagKoDTgZAjFkUtBioGIAbgskAagDQApwZLIr5EgNgAfCYCPAPQWCeuHYB2ENqB8HoagDQAlwUSAXIKLQye5r9+PAYAAPltAPD1dR+oqDIq5RhWB5EDcYEBRSqRCDUCEkkJoaGVlN6PE2g87IOn9eH5aw5X/iUVvOyn8dX3yz91XZ30NP8oUnqww5J/qNMn5pe+n30KoEHR+Gv8ZH91eqN/jTl6zu91gdAHqg8K/EPx/3dRZPK/cQOg+cP3g4PP8W+Mr4xvAYCRIQgA3CIcdbrSAoUApwWAARpVIFpAtMDpuhagAAAsKA0EDoyX/bU+0r8CAOcAcoENAEzxNQAQAwCVoi6jVfGIUNcdTgDgVonTvjEAmgB3AAaAFEOpHTLHLwbgToGhEVsMQCmAG6GqT0AMwIRQ1wAXAAgAnBqXGIBzflJlXwpAJN678W/cYMUAxABMOxxR4KJQ5xxYKYBz/LSDIcCKAZjmRymA23xiOEoBbBodxdcAQABgCnABAG2Bpg3CIwCVBiANwGUBiWRVZhgDgEZLEikmArzrzIUAt/D5PMqxvU0R87CUqgCwgwUCjgGIAbgskAjwzoGP8QcZlOepCqAUwGWBAABEdJUB3jnKAEAAIADwrQViAEBwJgK8AeLXgz4AgIDMQaIRjxgWUtCjClbvzxzKKDJiJznUQes8dtmXCP8meB7mQCWiBMMuCvxZG72MZYD0H50Hr0ZM6JWvMjXOHz0AIlcyeC/3CVCnT72f7tf8kf/r93WdOfJxfur3dZ3xUZ3Wx7NG3ta4vJ1CYXzDADD+KL4FAJADkgEDAKeLKkAIgHCCBABuhC//DADcDBQWsADAbaC10ZMY5ADAuH4FAEYDKsBCZR0DsFF4MQDSeG4pKGlctEOUBkf3awHRDl7P1/0xALcFBfA1futx4wGAcf0KAIwGDADEABwWkEiVKZxSALcGAinGAAAoDBkI1wMAyMGsKc5SANjBpAGYKExR8GKIRYEqQOj3SwEgAiD+pAG47RcDsCEAze8YgJHhDAAEAC4f4A5SGwCVuY8iIwWIAMA9w3UcsQBaACAAsC3xpQAuC6x9FLjBCQAEAAIAhwUSASYCHFa4GIDBeM/zCODHAMQATBQ1dzClACb7ageuHWYpAGhIKgOcVhgtIFrA9eO6PxFgDMB/NAPwPF/nFlutStUJiipgUdAvHwcpFbkCgBZQUTxq5EH7IcJxgcYCpQA618mOhympDlbvLxWx7hcFuC5gEhE+OA9dAE7+y/tlIPURUCc/1ZGPZXrcwUrkCwO9Pv6yHwdYAzheXxk6BOC1F/5sHmlwlIKFebX+yL80eh8BgHsENQByoAAAZkgA4JyjAQBoJAIAUwpIC8R8PQAwmVDrTwAAOyAtwDEAG0SNAbgBjiaoKOgAQADgtEAMwA2gx06kXL1jAGAitQItBXAbUPYrBcA5ev1DKQCYDwGOxi8FcJpoBoABgAAAJ+H3/1AKABSVKJhSAO92mhPDkAZgXMAFwAMAp4F/uQYkABAACAAcCAenQZUCKAUwzJ/nly8AiQDP4aMIdj3rIxHgPX3SACzh5dEGVClG/XgMQAyAfOQWGa3njScCvHcwqtIIAAQADguojHqa/P/KzQGAf8VK3/5PAKAywMmBuAPSAiOGOQBwAyQQLHMOOAAQAAgAfGsBlXkqhcvg++8uAvx8Ps8soERSqmNXDpd9BpSD1GELd58Wju/8D7d5H30/TwvcGPxHp7293mp4BXgY37dPG5s1CDrMBv6jFJb8lzsMRUgxaDrMSC84tqJm/MJpnexzovdXjl59Dn7DD+D53ACMKRB9vubH73JA/AD7AIx9BPR9us7vU/zT9/+4HUi//xEA0BCO1wMAtwE1AVTmGQCYHFTxlxRyAOC2fwDgTnHJAbUAIgmuBVAAYppcf7ZK1vcp/un7AwC3hbSDXgeY9wcAAgCHBZQCAEH3xADcO6AYAOwQYwAYwpd/CAAoRywKrhTA6X8CmHReifD+eT+Bv68yMyHgGIB7ALAD1/hr/GIAZMGNopeKWykstQovBXADoBiANADjDMftMQAxADEAf32OpQGYUgwBgADA5UBpAP56aPrX7gwABAACAP/aXPl//VcAIABwWEA7eFHwuv+vO+7/vVO/v4pM/0gDcA9RGgC4cCmA00DKIUvlrACSBgAWCgAEAAIA31ogAFAZoNaY+3oAIABwWCANwDa9lKNPA7DVMWsHrx247h9H/+/PAHz9RKHvWsaiOmCIwNRHQDswnabGOnfU4a7vt+4w5eA6z505wrGOlu+nGSYRqA6b0fN12BIA5hpA1KhEC4Q+TyI/lfmLQfvC/Ob943G+mj9q1cw+GBAxqwpDDI+uqwqE3yeCZe1DoEZUiu8QGcs+HP+fOK1T46sJtopw1ecBvz8zAAGA28JS4QYAtkYUml8CMArgfH4A4DQRF/AAwM0godGTFrgAwFjmGQC453cAIABwWUA7eO2AdT8X6BgAmuj6hxgAOJBSYNohjr3uAwC3e8s+MQDbBuwjABAACAAcFigFcE6QUgA3wOACNraCLgVwU1Brq3qi71IAWEDTALwqMuMOe1RR6/kxAJuIKQ3AHT+kUeEOUDmkGIAb4ClHnQaAGOFk6GTfNAD3FiwRIBagAMA9hdIApAE4LCCNTyJArFCJADeAFQAIACwUvTZA2mHFAGCHOsr0YwBiAG6K8I5/pQBKASzrQxoA9bqvDPCMT6UASgFcDsIqgsoAoYILAFwGYgqoKoCb4eNxwBCpSATEVoe/uM+AGnX86h2yFlhOgPGwJW1wqTJXjlUAbFtfH9W5yz9XClgJQs6fsQpC7/8l/9AH6P1eFlFKZCf7fnxggYV9dL9SBCzz0/iAYled+Go/uYfm1zNqCBS/Gb+gUWP81fqoHL9SkOpzIvthgHwWgD5wFPm9PYB0QAxAAAAiTy3QAYBJRa8UjvogBABu/9UCLoCk+wMAWIG0gOm00Jc3kAGAAMDpwW/nyOmAD3Jg2kFgB0cEHQDgJuhUAQtAa4ctgLUex62v0/vFAGwUv+ZvDIAo7gmAM/5qfYwBQAR5GcHFAGiFxw5JrUIDAFoipwAUA4D1UwFYnQpLAWz+Ke/XDj4G4LZgKQBQ0NpByQFLAWwIOgCgELgFWO2wYwAm+4rCLwUwuffDDVgAIABwWYAUdADgDoCiEEUQxABgC6oVegSwenwAIABwWCAR4Db/SgGMFBsRYCmA00PpgGkAMMOxg1GjkrEXvPZPUqmXAigFcFogDcDGYFYF8HnKdOYykZGCjwEYT8OKAbhXkACAMApEIrg9ESAQzFaGqA1WDEAMABj2GwCoUxmjx0hRqtXvrwYoqjNnI5RVJYoBYBnjcwOMD30gDsNQnwC+nx6g7weCVB8F+Z/mx/p9ylGrzEzmW99P839msMZGLszh/4EvuMPjw+dDZCj7cXzH+KH5ze9b7QeKSxtA9lEYn6/5o/C4AjTFF5UBCwCyDwBfQB4cALhzlOMElvkZ4AMApwkDAFJ53h4YAAAFogksgD3GjwAAGAK5v4Z3TNFw/cX6GgB4WSQoBBgDgAUCAER9FhQ/1wUoAKAIGAA4KdYYgHsDNO7QYwAw/36A4VUrYCIQReAYgBiAwwJkKMjBvbsABQACAJeHkSIPAAQArviHBZrrbwzAHaCosh5FijEAd52a1u8AABC6FhBRxONhO7+agflKA/DqBqIUQCmAM4tBBBIDcFqgFEApgMsCWmATAd4Acz3rQPOTFPN6WJDipwBeGoBXGQZtYLQBTARYCuBVBK/4wR12IsBEgIcFBFDof2MVRgwAGLYAQABgSDFUBVAK4GYwBHG1Q/k3p6DTAKQBSAPwvQVmBiUR4Bl/ycCvGoDn+boLGRDgtQNgDl4PGFuh6rxpqcS5A3q5kQwpKDEs/7wNrD4KcsCVYeDwr62I8QN6f/UJ0A6V34fx0fyh/4rhkX11mA7qwOW/aw6anRJVpiX/YCH6Nr/kH7r+un3H+CYAre9T/FWK7EsOMsZPzU99n95f9yv+fCC+fAQA7ggoB1SORzlKNvrQBmx04ADA2GkRIjVNYE1QBZgAACwcALgpcnUKDQDc9lOZOdwzAMAIiX8Yj0tkABXEHidIAOAeX23ANDxyrxiA20ICIKKANT4xAPJQjA82CLN9x/gWA4D4piof4VtVycQA3BYMAIABAYWsBVQpBIW/AMDov6UA5GLndcUHPVwMm+7X9dcBVgAgBkBOeF3XDoLPTgNwm6gUAF3o+gcBmDQA2MGkATgNFADQYQG3fykFKwo9DQDmbxqANACXi2gHrwVU92v1jgGIATgtoA1CGoB7B5sG4HavUaTL+FYKACbSBE8DMDmwdihawAMAclAg8DHAiKLW+BFgVQWgGB4DcFggDQDmfwAgAHCmUKoCuHcwsg/cSwCmFEApgAUBCGAvz/7z3jQAN8VTCgDz9+u5O72sKlKphNlqU2VWPzCFxkYJv/9Er3bt4MZOXesCJQTO7/uBCSYVqu4XBTlGSO6QHUFvhkV19AIoYrAEYHCYCBcgnHcv/9Hzv+T/wv+YX3QPfJ/uX+uspYGif64i3NG/dd48y1g1/v/YAKb8T/FN46/jdMmwoZGa5pfeTxsUVZn9SUCcET4AEAA4GYoAwMZQBACmFJYCpDYYuj8AMKawAgB3iujZRJIBgBiAycGEkNXIiAEyBuCOoAGAAMBhAe0wxRBKRa9GeTEAW5m0NtAxAKDotMA8AYAAwGEBUqwjRUoRXSkAbbIDAAGAby2gFHIpAKh00cq/FAByqNwhpwG4A3gMQAzAAAGUY+aj0wCAw980VBofakDSANCFr38oBRADEAMQA/CtBbRDUo5cFKWezwUA4U8LDKNnACAAQCf5/h8SAULF+AUVtygcBaBSANthNQrgZDi0g08EmAjwsEAA4F59mKKqCuDe4HwiR48qLmGDAEAAYMpRMgCCwZDIRxRQAGDs9Ig+P2kAbvvS/2MATgskArwdRAyUNjj/9QDgE1twGlAUPFpxiiF4O4DMdbprnwAdJ4nDOIhQ1/dbTxujzBhTUK1cV/uMh+UogMi/5P8KcLoujSPwvT7v4fCOZ1Xo/aWyFkPpDwSDjk5uAuAC8Hx/NaIc549E1tygYIcu/1UVg84CUB285iePe5cGbIzvq38+0lgEAEaKbl1gRwcJAGD8JPIMAGwxRgtQAAAanTsABADQh0WtdKGCDwDEAJwTlDm6AMCdA+cWMQbgVPmOOyjtoGMARvwTAzDl6GMANv/j3TEAt4mEAAMAEhGPvbjlwSOFSYYkBkAjIAe4r8cAxAAcFggAbNOPdwcAAgCXBVRmpR0kc7AxAKcDpgHA/Fw1KC+fNaEcdBoAVDFJxY8AJPunAQB+TwOQBuCyQACAGPtOgYzH6WqHpOsav1IA2/hqAQoABABOD4OIefPO50kEOKo0SwGIAS4FcAKoAMDNgGh+xgBoAoJCwRKiBWgtUx41LFUBjBCgFEApgFIA31tAddaq89f0lMakFEApgBNAKoWhKoxRQ1MZIPCXAOxY5aX4wusCAF9fOA4YpxWKglQfAZ02xw/EP3wpB60+BSozwe+LAhTCVR0q7QMHIMMx5uBUxqQFUN/3OsWNHdKsocAOVwBC7i0AQ/uNIj52+tQHwAH0ffKf9brin67LPnP80AcKQIynVYqCVvxRnwR9nuKP3E99DhS/lSJ6u9Ot1tePAAAQXgDgpnBhH03AAMDGUCmAaYEMAGgJua9rgdf1AMDW6lyjp/ij+RMAiAGQj53XZwSvHJ3eLgZAFrqvxwDcABAUqBY4MnQxAKcFtAOl88cAnCYKAAQAOIeufwgA3BEmBiAGYJlgYjiWZ/8r92qHr+sCSHP80EcEAAIAlwUUoOXgaQBuBEUEHwNwTlBS2BJBKUDGAMQAHBZQ/NP1AEApgHOC6awdaXRwmmsagESAE8VIkct6XDQW6AAANCwSGeL6owBTCuBOAaIMLgAQAAgAaBc2XGeOMQAQALgsEAMQAxAD8Ncj8KhBqgoAphdAjwFAkisAEAAIAHxvAQWYGIAYgMsCAYA7hfkT69MvTwGMZXDqxSxoyTpoPEAahq/f8AA4sMpI9H2iWFVHSwoeL6he/nx/HbcJ+6pO9W0GhyKr8bCgOUXxMgNB/9P8EgDA/cqRs1ETehmrDEx16NToIH5LRa759baGSv6vHbjsq/ir8dd12U/XFf8Vn7S+zfMf/iURrNZPawACAEiyysU2CicA8C6DowDIBWjNsUukGAC4UxABgCkAyf8DAJig2gBJY6P5HwCY/PsRAhUC1AIcA3B7qOwrhB0DAPypVqQKQGOnN3VC1OzVDo8ALAAgE98piueuUgoABAAmBxNFooeLwtD9AQDU4a/HwQkBlwK4XVQ7gBiAGIDDAgLQio8xAADYENFpfSsFgAVCDhoAgIOqFW8agGkHxB1oKQBN4dv+Og9eGowYgM3+MQA3wAwAaIsilY9aTWGDpNOUJFJCJ0NR1KUAtvGVfbWDKQVQCuCygESsEqklAiwFcPpXACAAAA5yQuBUYes4xxiAe3hgH1GgMQAbANHkSANwW6gqAIlY5GHYYI4pylIAsn8pgNtCEmEFAKYcusokAwCawAGAZQNQGeDtPwKAur557/OsDOW/PQB4PjcVmAz4x48bwWmHpQEmBSiZ/toIaAU4I8BVgJGKV/blAvnz/gCqxD/vAVh/f/Y/+MdKIQugiMJ+JBIEhanzyNcUjfxznf9i0Oh/ynCpla8mEK5rh0//hcqMImjEn3X8VKeuVsj0T1XBqM8LGu1ofeHwY314G+Ao/n8EALDDUR+EAMC9QVKjmADAab8AAELs2qkwAHBaIADwbgo8AACVrxCWENrbIjJRQHp/longAZqgQoB6v3UHzh1YACAAICe8rgcAbgAuEXQMADI8AYA7QIFiIYUVAFjC3xMAuCPY7H+lAO75jxSb/LMUwOi/pQCm9ekpBZAG4PIg5WhjANIAXP6jXvLyr1IApQAm/4oBuB0oABAACAB8b4FSAHf8SAR49/mIAbj9JxHgTbElApwI4kcp4ESAVQGcHhYACABcFpDGJgAQALgDTABgW+LvuwMAlQFO/hUACAAEAKYpdN4cAxAAeM+7HjMAXz+RAkAjGq2vqtNlq11YZ61zVQKEOVoZQCLSrVPyQ/vKfmOduJxXdeS6XzlwUvDqU6Dv1/hKhf7y82U/iSC1QyAAlAht7FRJ/1Z8kv+rzBf3i6LW+EiEJgZFz9f4rvNLZWy8/my93sVAve4/0FhofHjWDfp8cP3UccIBgHuIAgAbQgkAYIczAgwFmADANr9l3wDALQIOANweFABYEfyoco0B2Cg4BcgAQABgSSG8voOLATinsBg2LvDopCiGQvElBkAUFwBwDMC2Q6ADlgLQHD6vrxSlcqwCKBzfUgDn+M0M2nhWhpxP76f7YwBiAOQjJwBWBqQUABboGIDF/x4ugD9LAZwGDgAEAJYZiDr0NACg0NcU2ssMtFyjFMDLA8BWu2MZIHeIMQCaAzEAlwW0A4Z10wBsDJ+cNwYgBkA+EgNwWSAAsPhPVQA4bqwUAAI0VNhVAWAHOjJkVQGIA48BOC2g9bMqAKyvMQD3DnwMcEoxCP2kAZCF7usxADEA5w70C50cAbATAW7z85enAD5xIDN3UON5zDotTgZaRTxv73B0VoC+j+e967jdzT8fpVB4GiMCDPs46DxvIGCqmMc6ZJn3bf8SBS0AoPmt+6Xi5vePh4HJ/vRPAFx9v35/PewI66/nJ0770/xWlZRS8KriYPzX/B97+dM/aSAAcDGU6qMhjdt4GN9HAOC28HqYSwDg3mEEAHCYkhrpjAtYAAA74B9YQYEAAgBgYMYNpFIoAoABgBiA00MDAJjA2CKIwg8ABAC0i16uawFYGRS9WwAgAHBZgOtLDMC7ObwVATIF8XnvMEoBQOQjCrAUwGlAUdgxADEAtwgIEEdVwiqTjQE4DbxukDT/SwE8pQBOkRAYUO6w0gC8yjCtO9gAQAAgAPC9BbRDFwMkDZKeHwBAlQh34BihGADswAMAmuPn9bf9KwAwpqhGDYWcoxRAKYBSAIcFqAINANwUUVUANwWuMqaqAKYUQlUA9wIXAAgABAACAN9aIA1AGoDLAmK4YgBiAE7/qQzwVYZODNDfPgXwPF9nKxwFGJZhyAEh8iJDoCodteKVxkUqTP3+2MpV5z0rR7Q26pCD67p+XzkwTSDtQNWqWb3WtYNbNU5bs9gAACAASURBVBD6PtlX9pN/oAhIP8/rih+a33o/ja/q6PUB9N+fdwCQCEvPX79/rePn/MD3r+uDvp8ptnF8NL/Up0XfP9tXDqz1LQCAHUQAYHIxBThNMC2QAQCUEcJ/FWCnwX+eJwCw9crX+AgABQA2gKb4FABQJ6YYgC2GosxNOzwtwLq+vfzz6PmaYAEA5JjHTmJaYNbxDwAEAJYUhfwzBmCboR8xADEAmwvddwcAtl7rGhsBKAFEBVj9vq4HAAIAAYDvLVAKIA3AHUNjACDiuctERJFyAqJXfRqA230DAAGAAEAA4FsLfAUAAgCHBUoBlAK4LCCAlwjQKrDrPwiQEwHeBkaKfLavKDgPf1UAJ0JNBDi5WCmAUgDn/FIfi8+7jCcAgF68qoLC7fMCNWrElKJKAzCF5z8PcwwABAA2J7ruDgAEAAIA31tA80MLoABQVQBVAZzz7+vn7SKs08XaQQcf1561DGzN4er136aw9fv8PhzoLQqVjYx0WAgpKuwA0cpVdbj6PtmX36/v03G/OEtB7ycRoN6f9699MLBD5PeNVUbyD+6AdV78/9xfoPiq8cH0fd72b/mHxo8AZ5zfBEB8QU3g+zr952WNkcbnIwCABWYMwAGAbYYRwIwB4u0Aqa9np7/R/xQAtMDw/gDAPcQBgNs+SvGM8zsAAAAaAAgAnBSRdlg4q0E7FC6QmMFSmWuHFwBAgHhbAxMDcA6AAJrm19v+LYCo+R0DgEZein/jaasxAKOB5eAxALIQFiCNz7hDeDtA6utjAGQh+IcAKqqMBBBJ4ZYC2AYwBuC0HxnQAMBWB74aWN4fAJCFAgCXBb5KAdwBMgAw2UezUwxEDEAagNMCiQDRCATH0VLlS43Ku2VUChCiKBWACNBiAO4FQBS+jtvW/WkA0gBoEl/XYwBiACb/GRdQLjDjDiwGYBnd5+H4BAACAIcF1GisFMA9PwXwYwBiAGIADgsEAAIAlwXSAIz+UQqgFMCZQ9v8i3evjZT+7mWA63nWRJCog9YArBT58xM56B8jha46lE940EiRqc6Y9lWrZtiHz9cOHg+Qf+r3f9cE1AIDCl0AUL8v99H3aYemFB3fT+MD++owI6WQxBDJPuokJ/vour5P/qHnU0UvBnMtUxxTQIpP0li+Hb8pAkUrZMWndX7J/+XfrALQB8hBAwDoxRkAUIw+r8s/9XBNQFUJyL8V4PX7AQAA9NFACpCKb7oeAMD4oRV0AGDzf/l3ACAG4PQw5VA/YgBugAIEEQDAFhIEmXZAAoAKkFrgdT0AEAC4LMD5DweW/8u/AwABgADAYYEYAHG8d4QihaotXgDgNrBShKUA7viGHBP9txTAHSBEkUoEJQSfBuCOkMqx0b5pAO4AkgbgZkDSAEwMkRiGNADvargCAD9Qx/4ZALhcUBTNkwZAGCQNwGChRIDYQD93owMtwLpeCqAUQCmAi2KtCmCj+KCijwG4zascXCmAUgCXBwUAgE6VYk0EOMB790lJAyDzykErAzwtmAgQOfBEgKeBtEOuDBAALA3AFJ+UQv6vTwE8/9AKOl7XefGootOvU2MACl4q+Lft83cvI5N9xEBwBwWRDcd/rVJYRULIgauKTeMv+ylHrBSUNXrjaZqoQ397fsl/CEDUJ0JFDrp/PW1TGxztwF/WAGmH+qlOr2BAVSbM58sBYN+3f38FKKwCeH0CBgAmkZAobC0wCoDKIQcA7gi+jk8AQB768nVVIWgBDwCcAxQA2A6zCwBg/scAbAEyAHCvAJyAMQC3A8YAnPZRFZU2qOyUFwNw218GjgHYFhjZd97BSmRYCuDOoek0OFGECDCisH8vBXDvoFCFUwrg3fhEkWgMQAzAYYE1BcENCOJnKYAAQADgsMAsEooBiAE4LEAAkQbg3qGnAbhFtgGArRe/ctxvaySUA15zzNoflQIoBXD5iPpcfI2d6N6eX/J/MZRcwGMAYgBiAC4IjClYFcCN8MYdpgJgACAAEAD43gIBgC1AJwJMBHivQZt/PYkAtcTf1wMAAYAAQADgOwusfUACAL8YADzP17jEYv0eKcC1jnKtc6YIUWWMWn9HFakaqSiFIBEe68BVBqUcJuyj92cKRHXQa58A+DfffzxMhCKiMUcq/yJFjgk0ayxG+8l/lOLQ9Fb80f2an3z/l+enNlhf8D99vwCG/EfjxxSVXhBVLFq/5vmlRp1oFPURABhTEAGAW6QTAJhEOgogAYA7Asp+XEC5A0D80Fkfuh1VHnz/AMAdn7RBDQDIAjEAk4ViAE7zcQctDUQMwG1fHPY171BiAKbwEAOATpOgoGIAbvvFAIhCUYIkBiAG4LAAAcxIYccAxACcGo0YgBiAwwIBgADAPUHeLmNKAzDt0AMAAYAAwCHSFANVCiAR4L0CYoWKAYgBiAH41gKkYNfDlkYGhTn0NADn/E4EeK8P1KBQZX0/X2Wo6gQaAxADEAMwZGmlIi4FsOVw11anDMDQkAjA0HUSAdJEJ4Px8nHsmr98+aoAEgHSSa5/SASYCPBiECDSKwVQCqAUQCmAby3AMsDPjeNSq1ydB8/TrrS66jSxH3iARH7j73MH8jKFqdPA9HkaP6qU1+/TYUDr+I7+IwpO8+PB+887ULk/cqCieNXIRRQ7/XMcXzIwL1eRyD6af6rC0Pjo+doBz43AsIOXfeg/ytCK4cUCqT4DWj05PuNZNFpftEH4eAIAmiP39ZUCWhfIMYDp4wMAWw4uAIAIDAZMAEkBOACwMbQBAIi8sIEMAOi86bFRzDPu4BRAtEDq94XQdNwt7w8AIMJhBEf/iQG4z4vmDi4AcDpoDIC28BtAl0guBkAU4ngefCmAd3OYpFhFoQHAlQIA/sD80A63FIAC0H09BiAG4LRAKYBtDyyKUxRyACAAcE1QMSRaQOndMQBnfBSFOedwYwBiAA4LkEHSBkYEQgCAIfI0cQAAOxC1Wk0DcAfARIDMQi3/QBHYx53kDABs9tHYlQLQCl4K4LJAIsBRRawJmgbgnqDawVPjEACgCy7/EADYRIo6rU4ASWMXAAgAXD6i+BkACAAoxtwUcBqA2z7qtZ4G4Pa/UgClAEoBfGsBMewzAPj6iRSA6pQVAEeVv3KQq0pTq6PKYCSC03WpUPV+Om+bDoLjRtWpUiJD7ZC0AxXDIg0AVfrwT42/xkfX5R/Kger79PsKMBo/7XD1fevv8/vQalj3077IIT/qBIj7ZV+9/2z/cQPA93vuCaj4rk6R+n3NL90//z4CLEWsYkj/gRRJAAAGuqucHk0wXQ8AoM72bZFeAOBmOMZGLvL/AMC7GoLZ/gGAc34EAGIATgfRBAwABAAuB9IOhTtUbGHWBVg7VPn/+vvaoWkHqftp3xgAmfCOjzEAN8CAA0pj9cQATP75iAJWgNP1AEAAIADwvQWUgtDsDgDcOzQCsBiAGIDLAkLIa51/GoA7xKUBQApnZKgEALUA6boAYgzAdlhHACAAsABszd9SAGOAlYEDAAGA0wIvi1QDAFuOWgCHO1BoEBQ/AgABgADAwbAlAkwEeFmgKgAtMdt1LZAxADEAi4fJvwjASgGUAigF8L0FNMF0PQ1AGoBlh6IUnBYPLgBVAdwmTAQoF0sEeFhAjZ7eLwP8uvsAiAJdA4jqZLmATu73PKuKUj+vFIZU1HIQPV/2FQDR+6nTlOyj6+wTgAfIf/X9/H3gFy3Q1MigDJJnbagRkVTCKIPl+2N8FODkH2JIlKNVfFF80/vpusZP/qnnc/6iD4jso/i5fp/mn+Y3318UJ+Y3+6CMDIriv9pc6DCxj68AwD2HECA1AbVAa4LKAfT8AABGSIeBfGmFRwpp1cgEAE4DBwBAUDw3gtMCqesBAMz/AAByeOiUJQfUAqzrcmDVUer5WqADALcFtQOg/bGD1Q6Lvy98EAC4c6iiSDDAAYAAwGUBrR/aYGmHHQMAipF1vAGAe4cDikoAIwYgBuC0QCmA0zylALbDvkoBAKAhBbMClFIA2kGMvZS5A12PUw0AyMTndeUIYwBAYaYBmPxPN68LpJ4vhlE7ZF0Xg7p+nxg4zW++fxqARIDLDkkTUDt0TVAhQD0/BiAGYPFvBdhEgIoAW45YAFW/rviiBVLXAwDb+NK+I0CJAYgBAAc1NnpBL28FKF3XDkD3awFTgOXvpwHQEKQBOCyw7pBl/AAAUhjjApsGIA3ATUGXAlCMunOwUuHj6QEAGCgNQBqAwwLcoSKFugIcAXDNb77/fzsA+MQWiHXeEPGJIhSFrV73Wl3++LEhQNUpy8HsX9sOXN+vFMKj43axQNA+YAjWHYpEWhp/+bdayUrELv+Qip07DDTq0fyRSFfjQwpY7yeANzIstP+oAVrjF/0TIjH5v+LDukAzxYgX4Pu/3Op7jV8CKHq+5s86fvL/jwDADRA0gDJwAOD304e1wNC+YKAYYMfjSAMA9/wRwFAAVRnWbP8AwJQiDADcCFXrRwAAFLl2MEJIWgC0Q9YAcoFCHbhEGlog9f36vhiAG6DEANxlAApgAQAsEGAoGV/U6VEpMjSqkUYmABAAuHNod3x9VgpNC2AAAAikFMDtv9iCzjvQB+PzEypjUew/7wClBVoANABwp/C0gVF8CgDA/8dGW9zgiSFECkvP1/zR+qYUjvynFAA4eg2gDFwKoBTANYnTACjJvy0Amp8MwBJJjgxmAABLXBqAW2Q+thoOAAQA7hmYCPCegNiBcAGKAcAKHwC4LEARXSmA0wLc4MUAgMOvCuCmkNMAJAI8LBADEANwTRAByADAjXBUhRYAqAxwQ4gq0wkABAACAN9aoCqAO0AEADYGKACAKp3n824FrBz2fffzzAhrFGFJRLE6CHdweoG3RV6jylciJn0eT1PEBlDnuev3NT56/pojZpWFPgA5UL0/FxAQfGsZnj5PKvO1CmOd37If3x8iTNlnFXnJf/V8ft/Yx0Hfr/VF80vfp/FlFdUYv/T78l/NT8WHjwDA7YICMFpg6OABgJuBUY4cBtb4aIIogBLgqMpCDhIAmDQYCqCa3wrQXCADAPJwcPi4HfMrABADcOfosQNSgNACQ+8PAAQALgsEAAIAhwUEUARgtUAS4MQATPFL4ycAGwOAHLsWYBk4AACOSwZGFcHqwPp5AbQYAFhQGr1x/nGBGVOA6/xWgOb7xwBoisYAHBaQ/67xsxRADMDNkIwBjBT5mENTdAkA3Cv0GmDUCEnjwwU0AHCaUAAlBuD2QNpPIrgxfun31/mpDU4AIAAQADgsoABKgJMGABEYnfQCAAGAywJpAKYURAAgABAACAB8b4FSABuAGRk05ei1gxSA1fPJ0KQBmBZgjV8MwLgDEAUpA6cBSANw+pA0DjEA2wI6zv91fitAc4EMACgEpwH4lRqAr5+stLwRDk6z0ujrPHbdrzp1Ilz8gAIA60RHikqdvtRLXPZ7+/31+0qxPaiSeKCS5/1awPEBBIj4wPkwrLFXOsdHfQLwgI/7MMFHC6hOm5P/KAdK/x8ZEAEQ2Z/XBTDHVt7S0LytAdH3K/4rRSf/lH8pvig+r+uf5ofm10cA4GWRSADgTjFIRR4AuB00ADBRsAGAewIGAABBEJ8CANph47CFFQHGANwWZAAcAQzHLwCwaTACAAGAywIxAKd/xACUAjgdpBTAvYSvAGul2EoBYHwEsIDQVgpbAVYUpShO+U8pgHuAmcJCJ85SALAvUuSlAGIA7h3gb5uDaQceAyALjQE0DQBybHcZYAAA/pkG4DYQGBABVAHMNACJAG8HHCn0RIAIgIkAb4ozBuC0DwFwIsBX/YsMkBgqVVkEAO7xSwSIDQqO+2UACQDcDIcWqESAt4OmAUgDkAbgewsEAAIAC8mbBiANwGUB5lBLAZQCWAKQ7i0FUArgssDnnWL7+Pra+gDoMAI9XXXQ8v8vdaLCA/T7Oo98FRlpAREAIYX2eXOYynF9YAA/n7vQm53IftwOqudLRKM6YYkYJYJb/YfzA3X06/txfmmCI4Wv89r1+yqjWhk41Ynr/fh92oF+bP6v95N93vZfxTfFB42Pcviyj1KsH4hPfP44f2Q//b7iYwAAEzAAsAUoTXBNsADAPcUDAMghjTtkBdgAwG0hLWCKDwEA5UhBsEFkHwAIANw5ohiA2z6j/8QAYAGByFg73HWBDgBABQkGKADwrv3knzEApQBOC5QCeHeHLQYpABAAOFO4SLFpARBAKgUAjVMpAK2guA6EKAeUg6cBeLeOOg0AAkQMwG0gUfCY4GkAdJjCbcAAAAA++qwoRcn1KQ3AFkBp4ESASAIlArwMlAgQAXIMYKTgAwCnBaSBUXwMAAQAzvhXFcC9gxaFWxVAVQDXBJP/lAIoBVAK4LCAqig2guSpCqAywDtHjh1QACAAEAA4LFAK4IwvSoHGAIBBDgCAQbrP8/4zg6kt8JbjU6tWUYA4jELHVWqBFoUmFaXqzNcyFpV56f1XFa4ocvUheHsH/Pbvr/ZbDyta7S//oP++PH/1fuv8o4ZgPewGjVZ0loH6fIjCl/1UJ68d8Oq/ul+HCck++v7VfsqA6SwAzl98gL5f17V+BAA0AKijZAAdKSwNoCbAuoDRgREAAwAYIbQ6Xu0v/6D/BgCgsdlEuArg6wIWANjq6AMAa6evlwNIDAByqIDYasSxLkABgACAQMidA78pTAGYGIBNBKcdvHbAuj8GAPgSZ9EIQGoDGQMQA3DnKP8pAymDtDXC0A6mFIAQOhYAnab2MoAXOCgFsO1gNX9KAcADEb4EgLiBUngNANwTIAYgBuCywMpArCkU7YDmAKIcNAKMdtB8/1HDEwBAfFOnLq1fOksCdfAc//G0zhiAGIDTAhLxBQACAAEALaPfXw8A3AuwFigxUIkAb9+UfUVxy/NXDUUaADGMKvN5mUIMAAQAAgAKgwGA7yyg+KEFKgAA30P8l30DADdAlX3SAKDMR6FzzUFWBpgG4PSxqgBO86zzLxFgIkDF+FsEhbvX+ft31wCIghcC0XVRNBSxQCOzIsx1hyCRzdxrGiIuiVA0PmsA5vd93gBB7yf/0eRnjv/tHOwtcn9EQa7zU/ah/X+CQoeIdH2+ctSyz+o/sh9bIYsh1QKDw2p4Vgrw+Rw/4R+0H8qoad+xDFv+yfioCfyrx1eNgDSBaCCoGDUBAwBA8AEAxpDrHwIAmwhpLSNV/NDzAwCowtFZKQGAm4GSCl99YgIAm8o1ABAAuCwgACl0EAAIAMhHpuurRupX7xDBsM4ATsaNATgtNDM8MQBbmaEoslIAf+9OaQGAAIDWoOl6AGAynzRUpQBE4dzmZyOgUgBbmVAAIABwTUGpdMUgrvNT0Xnd4a0alFIACOBpAG4DpQG4NY4xADEAl4dQ5CINAgLUr66TjgGIARAImq7HAEzmiwF4WeMRAAgABAC+t8CqMaCGpSqAc4GIAYgBOC0ggBUDEANwLnCqUhiPCy0FUAqgFMD3FlhTDFUBvLxDTAR4LqBkSJXD+9UiTzEAD+K3djhrpyzyR+iF/vnczbAVgLSA8/3GOl82MkGdusZHZe7KMev7uYMGguf3rwBNZ61ogo517qv/qc/CrBKGfeQ/jB9/qpCOP85flGHpfvmvArxSWIp/PKsCL/gBA6vV8zq/eJaFNAo6jArfz/dXnwqlKPH7q305/8EQKr7LvykC5ATGYROaAJxA+oIAwE3x6DAQBPgAACjYAMBtIG0gAgCKcPf8DgBMKSQBaA1OACAAcPtIDMBtnxiA0z5ioBTAYgAUoG73jAHADkEMWQzAzXAhBa0qoRiAGIAYgMMC7NNQCuD2n1IAQAiow0Z8KgUA+5UCmOK7GIxSAEJgOi9bFo4BiAG4ctyj/8UA3EnSNAD3Asscug5TiwE445vsmwYAh8FofZXGQAGAAxAA4BBc/5AIcDzOE/4XAAgAXPNvzVHrMLREgBvA4vqTCBDrTymAiSKSijsRYCLAc4FRCiUR4K3xUJkYwl9VAOjjUhXAvT5UBng7kERY3B6XAigFUArgWwt8VAXAEHL9QwAgALA40McnOHRRQHJAlfmtO1BSKC+XuUklTJEPcmhqdEKR29hpTs9XCkbOKZW6WvVq/HVdKQr9vr5Pz5eKVwBUvfalItZhKkwxoI5bOVDFF5Uh6/01f8RwcX7ruF3t4FGkQP9Fjp7fJw2KGB7FL53mJ5EfA9D9gNm/xvfT74+f96zrZwBAIhdlIF4+D1oBTA7EBUCHSSkAIAWjBTIAcFsoAAAPUitYMHBcIDW/AwD3AAUAbgpe8RXuHwAYEawCgBYw7hCU4xOCRgALAGwiO+3QYwDQajYGQCFi0ujEAGwrpHbgZJhiAHAcriwIlf+KYDRB1udrdgcAoPISgsUOSguwxl/XAwAQOY6NXEoBwL6lAE4Daf4rPgcAeJz9zeHKgGkA7iR7GgBQ3AGA00ClAEoBXBZQfBbDKYCsDZTKAHmc77jDDgDcFtD4pwFIA7DlqNIAnPYTw5AIUK0GAwABAC3z318XQBKBrV8WQ6HfVwpXvy+AFgCoCgAcJC4rBRcACAAcFigFUApAi9h1XQusnq0FOABQGaB86LyeBiANwLlDW49rVidAnEbIKhCo6CsDRIqvKoA7flYFsDGsWJ1mBoCNgPAC0gAwB67ld1tfHonwhQBF0fL1xzp85djWOnB9n3KEui776Lpy4NxhaoboLBL5n8oodVwrHFQUoeyjMlJRhBofjb8AiHZ4SqGs81vfpz4DAkjqg8LfH/9B9tfjFR/m56MRlOyn6a34OcePsQxV81vjo/knBsSHAQUANAbndU4QLUA6bGPcAWqCy8F0fTLe8zxa4OYJLPsHAG4GTGW4AMABgHWG3Pcz/ii+o0phfn4AYHIAxd8AwBjgtUBq9DhB9H4BgNPEAQB44NgIR/6tACT/DwDIwtt12V9PV/ybnx8A0BBMADwAoAVWh5UAAWv0OEH0fgGAAMBhATEkpQA0Q3F91EiIwh7fjrcz/sQAnBZgCqoUADqFMUkHDxQFqymgBTYAMCFM7QA1PLquBS4GIAbgzsHJwwIAlwViAFAGFQAIAFwTiAhcACUGIAYgBuB7C2j+rBuIGIAbX0nkLIahFMCEULUBKwUwBgghYI1eAEAWuq/HAGz2KQWw+V9VAPC/AMBtoPEsF3lvAEAWCgCcFhLAkYPpuoZH1wMAAYDbgV9OIcYAxABcFvh3TwF8ohGQGt0ogOu6joPVAqU6UPYpwGlm2kHp+1jniU566qOwPl/vr+ufz62SFEDQAk/7rxTvy3X8qkOWfefrYyOWD1C09E/0QZD/SISlKgLZj/65ljH+RA4ZO8S5T8nb8QUGln05PjqOWX00xj4cej/Nb/WJ0PonCZ3WN70/zwIIAMiE9/V1gWaAfblVr75eAVwBIAAgC4/XAwCnAemfAYDJAWVfPVzrD+NjAOAm0GIAsAUUQocHBwBuhBIAUAgcrwcAAgCHBbiAaoMRA3AvsDpOW62kR4ZS0SMGoBSAfOQOoKUAbvuhimMy/r9ycwAgABAA+NYCAkCcYqrSCgDcJlQOJA3ADQFXhoEOLoQfAAgAHBZQjlIppDQASDGqUVkagNOAAYBEgPcMKwUQAzDsoCQSWgEY748BiAEY/JcbDG0QcFaE/DcNAACgVKIwcCmAUgCagwGAIYAGAO4yjRgATL+1U2kMQAzAxdAlAkwEuCAABXCpgBMBLtb/F+6NAYgBGABsDADm2L+7BuDr6+YQVGf7O+pc2at9vF8UkRYovb9CrOo8df8XGIgPHPer5yPD89A+zy0DVoBYF3g+Hypl5aBlP+UI9X4CQPLf9TAZ2h8AYdbgYHz0foofsu/bfUI4P7ED5/i+fD/n/xifFV9X+2l+an4rPvD5o8hX64fWB/ZJEUAJAGx1LhpAOaAGmBNEP4AAwgAQADgtHABAjjIAcBvoEwxkAOBVCj8AEAOgJfReAFDmoYcHAMYFJAbgDpC/wQNjAG77rQzdywv4yiBwAxADcE+gGIA7AovCE0Wk+0Whrg6uBTwG4LaQKF5RWNphrxSvxlcUoN5PFLX8lwFeGrIAwA3g1SkuAHDaT/FZ8Z0M5yhi1PyOAYgBkI/EABwW0AIYALgBcgDgnn5aYASwVoA4M3QxAHf8lMYpAHBPEJWppwG4O2UIoQodxADEAFwW0AIVAAgAnBZ4GUCsDKkAmuJrDMBd5ykAKgZVZcgfiQATAV4B6PdEgIkADwtwh50IMBHgxSDGAEwalAAAjotcEW4MQGWAlw8oBRIDsDFE2mHKvgQoaQDOAdIOXuOj+2MA/uYMgOqANQG1gK7X9ftfOM5T36c6ep1loO/T7/P9cV47AdC6wx+PS+X4YQf5B95fFPtqH/4+WqFqfJ//gQeNKn75pxZQfb8YJP0+KUwdtgIRnxYw+Y/e/+34MMen8bS59fvk30yxvlxGqfiksyrkH4r/+n35p8aHKYD1BWWA9boMpACr75snGD5Qv8/3DwDcKdSVIQLA0AK4+qcC5BMAmCjUAMAdoKiS13G2CvAAuAGATUQcAIgBuCm+GIDJPgGAO0DFAGCLPW4Q5g1KDMC9gQCDFwMwnvYkgKjr6w5LO/B5go0TPAbgNiAX4BgATaF7Bz2mYAIAAYDTwWIAJgBSCmDMsQYARpFfGoBpAgvglQIARZ0G4AZwouhjAKb5GwMQAzDtsARAtEB8pAFIA3BYQP4l500ECIQLAyoHK/tz/NQoJwBwmxgiQjHMAYAAgObweV0TPABQCuC0QCLARICHBQhAYgBiAC4LaIESQppWx3/hZv0+F9C7UeCTBuAeBNlXx0lz/MYctHJklQFifEf7pwFIA5AG4HsLrOur4psAIMsAlYNUmYYOU6GISzl+nQanTmRrgANHKope9lEdtMrAHsWfuw/Fsy7gwnA8KwA7XL0fFyB8v8ZP36fDfNbv1/spAKz20/ylffAPbCSznsYpilwfbaUdcwAABE9JREFUABGbygzlnyrDE4AVwNYGZ32+Ukj6vrfnD9c3dCqUfXVd7qX75T9aPwIAAYDTB7VAyEHl4OsCqPfjBAkAnEMk+wUAkKL6sZVJaoFcF+gAwD1+6lSo+Kfrio+6X/MzABADAI4XAQy9buWgcvAAACykHD9EoDEAcP8YgDsH/tw5Us3/GIDtrBnZNwBQCgAQFgtMKYDTQKLYBXDepjD1fgGAAMC9wt8BYGUYAgABgJtiVi/3NAB3BMMOMQ2AKCDgJ+ywAwBbgJP90gC8u0CXAigFcHvY2KlJIjflEEWBEGEq/qcBSANwWEA7bC1gMQC00K1B+IlGVYkA7w2+yrTRRyAG4PZfrU+6rtmh+0sBlAIoBXBYgBMkEWAiQEXh63pVAKf1uEHDccxvA+iqAL4wAjEAd4CsDHAJn08iwESAlwVKAZQCuPxjjR//9QDgU0kgxCdRFEKAAoBaXVQGpvu1Q4QI/tH3K4A9P7SBvwPAF8471/ezThkUrO7X77OV5tqpTCIIMAC6XWU2+n710XidglWK7Lf7CzT+6/gqPihFI/tp/q/jqz4dagTDBU4O9os1Qop/KrNTozF9vhZ4+a+ez+8bz6rQ78u/9P0fAYDtMJwAwCYCWxcI1UlLg6IFJgAQAGAQvv5BZZzoRBoAmKz/aAEMAMQAnB4WA3Av8PMEEkUUAzCJvGjeGIB7hfk5LkABgDu+otNeDMCWIhQAigFAGWIAIABwTsFxgSgFgAA3ijRLAcC+L7cKJ0UeANgQplI80vCVAigFsIiwYgC2+RsACABMIje5nxaIAIAseF4nwEkDsE1wjU4iQM3gMYebCPBVijgAsMWHRIAjRazwMXYK5QIZA6Al7r4ugBcDcNtPKuBSAKUASgF8bwExQKvIUyLNAEAA4LTA2KdBqzMBTgzAhvA1ADEAgvAxAKcFKgO8zVMZoELQtEOrDPA2XyLAEeCJAXg+b4ytMrfP5/fzDSnCUavPkSLSBFu/T52q+PzxrAPWKYsiUngTvhhFWrKfilTUB2HdoQpgcgcg/1UVJUSG+j75n8rMlKKQ/VnnDYCh35f7qgyUZaTraYF4wTU+yf9m/5B/4vvU6l3vL/9hfHh5/OR/ih+cn7I/4oPs9xEAuC0sgKMFTAOs6yrjCgDcCEUBUBS1JvAawNbx1ffRv8YFOACgJeC+HgCACBsAOgAA/4L9AgDYgQcAthSOcrQCUJzg6ISoBTIAgAAy5jC1A1kZCC2/MQDY4KwMZAzAaQFtIAjQYwC2HNGKsAMAAYDLAjEANwMTAIgBeHP+cINQCuB0wBiAGABEqADAmwGsFMDGQMQAbFU68w40BiAG4LJAIsCXKTh1oksEeE7QUgDbApwGQBAkBuBNAB0DkAbgpjhw2IYQcCmAGIA3A1gMwAZAtPymAXh5AxIDEAMQA/C9BQgwVhFODMA9AX/cATAGYFuAYwAEQWIA3gTQMQAbA/B/AM2Qn43fOboKAAAAAElFTkSuQmCC"
+
+func generateFBC(b *testing.B, numPackages, numChannels, numBundles int) *declcfg.DeclarativeConfig {
+ pngData, err := base64.StdEncoding.DecodeString(randomPng)
+ if err != nil {
+ b.Error(err)
+ }
+
+ fbc := &declcfg.DeclarativeConfig{}
+
+ for i := 0; i < numPackages; i++ {
+ pkgName := fmt.Sprintf("pkg-%d", i)
+ fbc.Packages = append(fbc.Packages, declcfg.Package{
+ Schema: declcfg.SchemaPackage,
+ Name: pkgName,
+ Description: fmt.Sprintf("%s description", pkgName),
+ Icon: &declcfg.Icon{
+ Data: pngData,
+ MediaType: "image/png",
+ },
+ })
+ }
+ for i := 0; i < numChannels; i++ {
+ pkgName := fbc.Packages[rand.Intn(numPackages)].Name
+ channelName := fmt.Sprintf("channel-%d", i)
+ fbc.Channels = append(fbc.Channels, declcfg.Channel{
+ Schema: declcfg.SchemaChannel,
+ Package: pkgName,
+ Name: channelName,
+ })
+ }
+ for i := 0; i < numBundles; i++ {
+ pkgName := fbc.Packages[rand.Intn(numPackages)].Name
+ bundleName := fmt.Sprintf("bundle-%d", i)
+ version := fmt.Sprintf("0.%d.0", i)
+ bundle := declcfg.Bundle{
+ Schema: declcfg.SchemaBundle,
+ Package: pkgName,
+ Image: fmt.Sprintf("bundles/%s", bundleName),
+ Properties: []property.Property{
+ property.MustBuildPackage(pkgName, version),
+ property.MustBuildGVK("apps", "Deployment", "v1"),
+ property.MustBuildGVK("apps", "DaemonSet", "v1"),
+ property.MustBuildGVKRequired("", "Service", "v1"),
+ property.MustBuildPackageRequired("foo", "0.0.1"),
+ },
+ }
+
+ csv := genCsv(pkgName, version)
+ bundle.Properties = append(bundle.Properties, property.MustBuildCSVMetadata(csv))
+ fbc.Bundles = append(fbc.Bundles, bundle)
+
+ chIdx := rand.Intn(numChannels)
+ ch := fbc.Channels[chIdx]
+ replaces := ""
+ if len(ch.Entries) > 0 {
+ replaces = ch.Entries[len(ch.Entries)-1].Name
+ }
+ ch.Entries = append(ch.Entries, declcfg.ChannelEntry{
+ Name: bundleName,
+ Replaces: replaces,
+ })
+ fbc.Channels[chIdx] = ch
+ }
+
+ return fbc
+}
+
+func genCsv(pkgName, ver string) v1alpha1.ClusterServiceVersion {
+ csv := v1alpha1.ClusterServiceVersion{
+ TypeMeta: metav1.TypeMeta{
+ Kind: "ClusterServiceVersion",
+ APIVersion: "operators.coreos.com/v1alpha1",
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Name: fmt.Sprintf("%s.v%s", pkgName, ver),
+ Annotations: map[string]string{
+ "alm-examples": `[
+ {
+ "apiVersion": "example.com/v1alpha1",
+ "kind": "Example",
+ "metadata": {
+ "name": "example-sample"
+ },
+ "spec": {
+ "image":{
+ "repository":"example/example",
+ "tag":"v0.0.1",
+ "pullPolicy":"IfNotPresent",
+ "credentials":{}
+ },
+ "labels":{},
+ "conf":{
+ "log":{"enabled":false,"config":{}},
+ "logtostderr":"INFO",
+ "port":26257,
+ "http-port":8080,
+ "store":{"enabled":false,"type":null,"size":null,"attrs":null}},
+ "statefulset":{
+ "replicas":3,
+ "updateStrategy":{"type":"RollingUpdate"},
+ "podManagementPolicy":"Parallel",
+ "budget":{"maxUnavailable":1},
+ "args":[],
+ "env":[],
+ "secretMounts":[],
+ "labels":{"app.kubernetes.io/component":"example"},
+ "annotations":{},
+ "nodeAffinity":{},
+ "podAffinity":{},
+ "podAntiAffinity":{"topologyKey":"kubernetes.io/hostname","type":"soft","weight":100},
+ "nodeSelector":{},
+ "priorityClassName":"",
+ "tolerations":[],
+ "topologySpreadConstraints":{"maxSkew":1,"topologyKey":"topology.kubernetes.io/zone","whenUnsatisfiable":"ScheduleAnyway"},
+ "resources":{},
+ "customLivenessProbe":{},
+ "customReadinessProbe":{}
+ },
+ "ingress":{"enabled":false,"labels":{},"annotations":{},"paths":["/"],"hosts":[],"tls":[]},
+ "prometheus":{"enabled":true},
+ "serviceMonitor":{"enabled":false,"labels":{},"annotations":{},"interval":"10s","namespaced":false},
+ "storage":{"hostPath":"","persistentVolume":{"enabled":true,"size":"100Gi","storageClass":"","labels":{},"annotations":{}}}
+ }
+ }
+ }
+ ]`,
+ "capabilities": "Basic Install",
+ "categories": "Application",
+ "certified": "false",
+ "containerImage": "quay.io/example/example:v0.0.1",
+ "createdAt": "1970-01-01T00-00-00Z",
+ "description": "Example Operator",
+ "operators.operatorframework.io/builder": "operator-sdk-v1.0.0",
+ "operators.operatorframework.io/project_layout": "go.sdk.operatorframework.io/v3",
+ "repository": "https://github.com/example/example",
+ "support": "Example, Inc.",
+ "olm.skipRange": "<0.0.1",
+ },
+ },
+ Spec: v1alpha1.ClusterServiceVersionSpec{
+ Icon: []v1alpha1.Icon{
+ {
+ Data: randomPng,
+ MediaType: "image/png",
+ },
+ },
+ CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{
+ Owned: []v1alpha1.CRDDescription{
+ {
+ Description: "Represents an Example instance",
+ DisplayName: "Example",
+ Kind: "Example",
+ Version: "v1alpha1",
+ Name: "examples.example.com",
+ Resources: []v1alpha1.APIResourceReference{
+ {
+ Kind: "Deployment",
+ Version: "apps/v1",
+ },
+ {
+ Kind: "Service",
+ Version: "v1",
+ },
+ {
+ Kind: "ReplicaSet",
+ Version: "apps/v1",
+ },
+ {
+ Kind: "Pod",
+ Version: "v1",
+ },
+ {
+ Kind: "Secret",
+ Version: "v1",
+ },
+ {
+ Kind: "ConfigMap",
+ Version: "v1",
+ },
+ {
+ Kind: "PresistentVolumeClaim",
+ Version: "v1",
+ },
+ {
+ Kind: "StatefulSet",
+ Version: "apps/v1",
+ },
+ {
+ Kind: "Job",
+ Version: "batch/v1",
+ },
+ },
+ },
+ },
+ },
+ DisplayName: "Example Operator",
+ InstallModes: []v1alpha1.InstallMode{
+ {
+ Type: v1alpha1.InstallModeTypeOwnNamespace,
+ Supported: false,
+ },
+ {
+ Type: v1alpha1.InstallModeTypeSingleNamespace,
+ Supported: false,
+ },
+ {
+ Type: v1alpha1.InstallModeTypeMultiNamespace,
+ Supported: false,
+ },
+ {
+ Type: v1alpha1.InstallModeTypeAllNamespaces,
+ Supported: true,
+ },
+ },
+ Keywords: []string{"example", "application", "sample", "foobar"},
+ Links: []v1alpha1.AppLink{
+ {
+ Name: "Example Operator",
+ URL: "https://www.example.com/operator",
+ },
+ {
+ Name: "Example Operator Documentation",
+ URL: "https://www.example.com/operator/docs",
+ },
+ {
+ Name: "Example Operator Support",
+ URL: "https://www.example.com/operator/support",
+ },
+ {
+ Name: "Example Operator Source Code",
+ URL: "https://github.com/example/operator",
+ },
+ },
+ Maintainers: []v1alpha1.Maintainer{
+ {
+ Email: "janedoe@example.com",
+ Name: "Jane Doe",
+ },
+ {
+ Email: "johndoe@example.com",
+ Name: "John Doe",
+ },
+ },
+ Maturity: "alpha",
+ MinKubeVersion: "1.21.0",
+ Provider: v1alpha1.AppLink{
+ Name: "Example, Inc.",
+ URL: "https://www.example.com",
+ },
+ Version: version.OperatorVersion{Version: semver.MustParse(ver)},
+ },
+ }
+ return csv
+}
diff --git a/staging/operator-registry/alpha/declcfg/load_test.go b/staging/operator-registry/alpha/declcfg/load_test.go
index 301002f164..c3f769c9b5 100644
--- a/staging/operator-registry/alpha/declcfg/load_test.go
+++ b/staging/operator-registry/alpha/declcfg/load_test.go
@@ -1,6 +1,7 @@
package declcfg
import (
+ "context"
"encoding/json"
"io/fs"
"os"
@@ -92,6 +93,73 @@ func TestLoadReader(t *testing.T) {
}
}
+func TestWalkMetasFS(t *testing.T) {
+ type spec struct {
+ name string
+ fsys fs.FS
+ assertion require.ErrorAssertionFunc
+ expectNumPackages int
+ expectNumChannels int
+ expectNumBundles int
+ expectNumOthers int
+ }
+ specs := []spec{
+ {
+ name: "Error/NilFS",
+ fsys: nil,
+ assertion: require.Error,
+ },
+ {
+ name: "Error/NonExistentDir",
+ fsys: os.DirFS("non/existent/dir/"),
+ assertion: require.Error,
+ },
+ {
+ name: "Error/Invalid",
+ fsys: invalidFS,
+ assertion: require.Error,
+ },
+ {
+ name: "Success/ValidDir",
+ fsys: validFS,
+ assertion: require.NoError,
+ expectNumPackages: 3,
+ expectNumChannels: 0,
+ expectNumBundles: 12,
+ expectNumOthers: 1,
+ },
+ }
+
+ for _, s := range specs {
+ t.Run(s.name, func(t *testing.T) {
+ numPackages, numChannels, numBundles, numOthers := 0, 0, 0, 0
+ err := WalkMetasFS(s.fsys, func(path string, meta *Meta, err error) error {
+ if err != nil {
+ return err
+ }
+ switch meta.Schema {
+ case SchemaPackage:
+ numPackages++
+ case SchemaChannel:
+ numChannels++
+ case SchemaBundle:
+ numBundles++
+ default:
+ numOthers++
+ }
+ return nil
+ })
+ s.assertion(t, err)
+ if err == nil {
+ assert.Equal(t, s.expectNumPackages, numPackages, "unexpected package count")
+ assert.Equal(t, s.expectNumChannels, numChannels, "unexpected channel count")
+ assert.Equal(t, s.expectNumBundles, numBundles, "unexpected bundle count")
+ assert.Equal(t, s.expectNumOthers, numOthers, "unexpected others count")
+ }
+ })
+ }
+}
+
func TestLoadFS(t *testing.T) {
type spec struct {
name string
@@ -271,7 +339,7 @@ func TestLoadFS(t *testing.T) {
for _, s := range specs {
t.Run(s.name, func(t *testing.T) {
- cfg, err := LoadFS(s.fsys)
+ cfg, err := LoadFS(context.Background(), s.fsys)
s.assertion(t, err)
if err == nil {
require.NotNil(t, cfg)
diff --git a/staging/operator-registry/alpha/declcfg/write.go b/staging/operator-registry/alpha/declcfg/write.go
index 96e132bc29..2f149e5afd 100644
--- a/staging/operator-registry/alpha/declcfg/write.go
+++ b/staging/operator-registry/alpha/declcfg/write.go
@@ -6,13 +6,15 @@ import (
"fmt"
"io"
"os"
+ "path/filepath"
"sort"
"strings"
"github.com/blang/semver/v4"
- "github.com/operator-framework/operator-registry/alpha/property"
"k8s.io/apimachinery/pkg/util/sets"
"sigs.k8s.io/yaml"
+
+ "github.com/operator-framework/operator-registry/alpha/property"
)
type MermaidWriter struct {
@@ -124,12 +126,12 @@ func (writer *MermaidWriter) WriteChannels(cfg DeclarativeConfig, out io.Writer)
if len(ce.Replaces) > 0 {
replacesId := fmt.Sprintf("%s-%s", channelID, ce.Replaces)
- pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- %s --> %s[%q]\n", entryId, ce.Name, "replaces", replacesId, ce.Replaces))
+ pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- %s --> %s[%q]\n", replacesId, ce.Replaces, "replace", entryId, ce.Name))
}
if len(ce.Skips) > 0 {
for _, s := range ce.Skips {
skipsId := fmt.Sprintf("%s-%s", channelID, s)
- pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- %s --> %s[%q]\n", entryId, ce.Name, "skips", skipsId, s))
+ pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- %s --> %s[%q]\n", skipsId, s, "skip", entryId, ce.Name))
}
}
if len(ce.SkipRange) > 0 {
@@ -138,7 +140,7 @@ func (writer *MermaidWriter) WriteChannels(cfg DeclarativeConfig, out io.Writer)
for _, edgeName := range filteredChannel.Entries {
if skipRange(versionMap[edgeName.Name]) {
skipRangeId := fmt.Sprintf("%s-%s", channelID, edgeName.Name)
- pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- \"%s(%s)\" --> %s[%q]\n", entryId, ce.Name, "skipRange", ce.SkipRange, skipRangeId, edgeName.Name))
+ pkgBuilder.WriteString(fmt.Sprintf(" %s[%q]-- \"%s(%s)\" --> %s[%q]\n", skipRangeId, edgeName.Name, "skipRange", ce.SkipRange, entryId, ce.Name))
}
}
} else {
@@ -425,3 +427,48 @@ func writeToEncoder(cfg DeclarativeConfig, enc encoder) error {
}
return nil
}
+
+type WriteFunc func(config DeclarativeConfig, w io.Writer) error
+
+func WriteFS(cfg DeclarativeConfig, rootDir string, writeFunc WriteFunc, fileExt string) error {
+ channelsByPackage := map[string][]Channel{}
+ for _, c := range cfg.Channels {
+ channelsByPackage[c.Package] = append(channelsByPackage[c.Package], c)
+ }
+ bundlesByPackage := map[string][]Bundle{}
+ for _, b := range cfg.Bundles {
+ bundlesByPackage[b.Package] = append(bundlesByPackage[b.Package], b)
+ }
+
+ if err := os.MkdirAll(rootDir, 0777); err != nil {
+ return err
+ }
+
+ for _, p := range cfg.Packages {
+ fcfg := DeclarativeConfig{
+ Packages: []Package{p},
+ Channels: channelsByPackage[p.Name],
+ Bundles: bundlesByPackage[p.Name],
+ }
+ pkgDir := filepath.Join(rootDir, p.Name)
+ if err := os.MkdirAll(pkgDir, 0777); err != nil {
+ return err
+ }
+ filename := filepath.Join(pkgDir, fmt.Sprintf("catalog%s", fileExt))
+ if err := writeFile(fcfg, filename, writeFunc); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func writeFile(cfg DeclarativeConfig, filename string, writeFunc WriteFunc) error {
+ buf := &bytes.Buffer{}
+ if err := writeFunc(cfg, buf); err != nil {
+ return fmt.Errorf("write to buffer for %q: %v", filename, err)
+ }
+ if err := os.WriteFile(filename, buf.Bytes(), 0666); err != nil {
+ return fmt.Errorf("write file %q: %v", filename, err)
+ }
+ return nil
+}
diff --git a/staging/operator-registry/alpha/declcfg/write_test.go b/staging/operator-registry/alpha/declcfg/write_test.go
index 46f6d68f8d..bbbd3482bf 100644
--- a/staging/operator-registry/alpha/declcfg/write_test.go
+++ b/staging/operator-registry/alpha/declcfg/write_test.go
@@ -491,16 +491,16 @@ func TestWriteMermaidChannels(t *testing.T) {
subgraph anakin-dark["dark"]
anakin-dark-anakin.v0.0.1["anakin.v0.0.1"]
anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]
- anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]-- replaces --> anakin-dark-anakin.v0.0.1["anakin.v0.0.1"]
+ anakin-dark-anakin.v0.0.1["anakin.v0.0.1"]-- replace --> anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]
anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]
- anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]-- replaces --> anakin-dark-anakin.v0.0.1["anakin.v0.0.1"]
- anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]-- skips --> anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]
+ anakin-dark-anakin.v0.0.1["anakin.v0.0.1"]-- replace --> anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]
+ anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]-- skip --> anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]
end
%% channel "light"
subgraph anakin-light["light"]
anakin-light-anakin.v0.0.1["anakin.v0.0.1"]
anakin-light-anakin.v0.1.0["anakin.v0.1.0"]
- anakin-light-anakin.v0.1.0["anakin.v0.1.0"]-- replaces --> anakin-light-anakin.v0.0.1["anakin.v0.0.1"]
+ anakin-light-anakin.v0.0.1["anakin.v0.0.1"]-- replace --> anakin-light-anakin.v0.1.0["anakin.v0.1.0"]
end
end
%% package "boba-fett"
@@ -509,7 +509,7 @@ func TestWriteMermaidChannels(t *testing.T) {
subgraph boba-fett-mando["mando"]
boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]
boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]
- boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]-- replaces --> boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]
+ boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]-- replace --> boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]
end
end
`,
@@ -526,7 +526,7 @@ func TestWriteMermaidChannels(t *testing.T) {
subgraph anakin-dark["dark"]
anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]
anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]
- anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]-- skips --> anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]
+ anakin-dark-anakin.v0.1.0["anakin.v0.1.0"]-- skip --> anakin-dark-anakin.v0.1.1["anakin.v0.1.1"]
end
%% channel "light"
subgraph anakin-light["light"]
@@ -547,7 +547,7 @@ func TestWriteMermaidChannels(t *testing.T) {
subgraph boba-fett-mando["mando"]
boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]
boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]
- boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]-- replaces --> boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]
+ boba-fett-mando-boba-fett.v1.0.0["boba-fett.v1.0.0"]-- replace --> boba-fett-mando-boba-fett.v2.0.0["boba-fett.v2.0.0"]
end
end
`,
diff --git a/staging/operator-registry/alpha/model/model.go b/staging/operator-registry/alpha/model/model.go
index a6ca060420..48861e49cd 100644
--- a/staging/operator-registry/alpha/model/model.go
+++ b/staging/operator-registry/alpha/model/model.go
@@ -141,8 +141,9 @@ type Channel struct {
}
// TODO(joelanford): This function determines the channel head by finding the bundle that has 0
-// incoming edges, based on replaces and skips. It also expects to find exactly one such bundle.
-// Is this the correct algorithm?
+//
+// incoming edges, based on replaces and skips. It also expects to find exactly one such bundle.
+// Is this the correct algorithm?
func (c Channel) Head() (*Bundle, error) {
incoming := map[string]int{}
for _, b := range c.Bundles {
@@ -210,11 +211,11 @@ func (c *Channel) Validate() error {
// validateReplacesChain checks the replaces chain of a channel.
// Specifically the following rules must be followed:
-// 1. There must be exactly 1 channel head.
-// 2. Beginning at the head, the replaces chain must reach all non-skipped entries.
-// Non-skipped entries are defined as entries that are not skipped by any other entry in the channel.
-// 3. There must be no cycles in the replaces chain.
-// 4. The tail entry in the replaces chain is permitted to replace a non-existent entry.
+// 1. There must be exactly 1 channel head.
+// 2. Beginning at the head, the replaces chain must reach all non-skipped entries.
+// Non-skipped entries are defined as entries that are not skipped by any other entry in the channel.
+// 3. There must be no cycles in the replaces chain.
+// 4. The tail entry in the replaces chain is permitted to replace a non-existent entry.
func (c *Channel) validateReplacesChain() error {
head, err := c.Head()
if err != nil {
diff --git a/staging/operator-registry/alpha/property/property.go b/staging/operator-registry/alpha/property/property.go
index 695bfd6da8..5cb876846b 100644
--- a/staging/operator-registry/alpha/property/property.go
+++ b/staging/operator-registry/alpha/property/property.go
@@ -9,6 +9,9 @@ import (
"io/ioutil"
"path/filepath"
"reflect"
+
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
type Property struct {
@@ -40,8 +43,9 @@ type Package struct {
}
// NOTICE: The Channel properties are for internal use only.
-// DO NOT use it for any public-facing functionalities.
-// This API is in alpha stage and it is subject to change.
+//
+// DO NOT use it for any public-facing functionalities.
+// This API is in alpha stage and it is subject to change.
type Channel struct {
ChannelName string `json:"channelName"`
//Priority string `json:"priority"`
@@ -69,6 +73,23 @@ type BundleObject struct {
File `json:",inline"`
}
+type CSVMetadata struct {
+ Annotations map[string]string `json:"annotations,omitempty"`
+ APIServiceDefinitions v1alpha1.APIServiceDefinitions `json:"apiServiceDefinitions,omitempty"`
+ CustomResourceDefinitions v1alpha1.CustomResourceDefinitions `json:"crdDescriptions,omitempty"`
+ Description string `json:"description,omitempty"`
+ DisplayName string `json:"displayName,omitempty"`
+ InstallModes []v1alpha1.InstallMode `json:"installModes,omitempty"`
+ Keywords []string `json:"keywords,omitempty"`
+ Labels map[string]string `json:"labels,omitempty"`
+ Links []v1alpha1.AppLink `json:"links,omitempty"`
+ Maintainers []v1alpha1.Maintainer `json:"maintainers,omitempty"`
+ Maturity string `json:"maturity,omitempty"`
+ MinKubeVersion string `json:"minKubeVersion,omitempty"`
+ NativeAPIs []metav1.GroupVersionKind `json:"nativeAPIs,omitempty"`
+ Provider v1alpha1.AppLink `json:"provider,omitempty"`
+}
+
type File struct {
ref string
data []byte
@@ -128,6 +149,7 @@ type Properties struct {
GVKsRequired []GVKRequired `hash:"set"`
BundleObjects []BundleObject `hash:"set"`
Channels []Channel `hash:"set"`
+ CSVMetadatas []CSVMetadata `hash:"set"`
Others []Property `hash:"set"`
}
@@ -138,6 +160,7 @@ const (
TypeGVK = "olm.gvk"
TypeGVKRequired = "olm.gvk.required"
TypeBundleObject = "olm.bundle.object"
+ TypeCSVMetadata = "olm.csv.metadata"
TypeChannel = "olm.channel"
)
@@ -175,6 +198,12 @@ func Parse(in []Property) (*Properties, error) {
return nil, ParseError{Idx: i, Typ: prop.Type, Err: err}
}
out.BundleObjects = append(out.BundleObjects, p)
+ case TypeCSVMetadata:
+ var p CSVMetadata
+ if err := json.Unmarshal(prop.Value, &p); err != nil {
+ return nil, ParseError{Idx: i, Typ: prop.Type, Err: err}
+ }
+ out.CSVMetadatas = append(out.CSVMetadatas, p)
// NOTICE: The Channel properties are for internal use only.
// DO NOT use it for any public-facing functionalities.
// This API is in alpha stage and it is subject to change.
@@ -286,9 +315,29 @@ func MustBuildBundleObjectData(data []byte) Property {
return MustBuild(&BundleObject{File: File{data: data}})
}
+func MustBuildCSVMetadata(csv v1alpha1.ClusterServiceVersion) Property {
+ return MustBuild(&CSVMetadata{
+ Annotations: csv.GetAnnotations(),
+ APIServiceDefinitions: csv.Spec.APIServiceDefinitions,
+ CustomResourceDefinitions: csv.Spec.CustomResourceDefinitions,
+ Description: csv.Spec.Description,
+ DisplayName: csv.Spec.DisplayName,
+ InstallModes: csv.Spec.InstallModes,
+ Keywords: csv.Spec.Keywords,
+ Labels: csv.GetLabels(),
+ Links: csv.Spec.Links,
+ Maintainers: csv.Spec.Maintainers,
+ Maturity: csv.Spec.Maturity,
+ MinKubeVersion: csv.Spec.MinKubeVersion,
+ NativeAPIs: csv.Spec.NativeAPIs,
+ Provider: csv.Spec.Provider,
+ })
+}
+
// NOTICE: The Channel properties are for internal use only.
-// DO NOT use it for any public-facing functionalities.
-// This API is in alpha stage and it is subject to change.
+//
+// DO NOT use it for any public-facing functionalities.
+// This API is in alpha stage and it is subject to change.
func MustBuildChannelPriority(name string, priority int) Property {
return MustBuild(&Channel{ChannelName: name, Priority: priority})
}
diff --git a/staging/operator-registry/alpha/property/scheme.go b/staging/operator-registry/alpha/property/scheme.go
index 28d8a5d147..ab176856fa 100644
--- a/staging/operator-registry/alpha/property/scheme.go
+++ b/staging/operator-registry/alpha/property/scheme.go
@@ -12,6 +12,7 @@ func init() {
reflect.TypeOf(&GVK{}): TypeGVK,
reflect.TypeOf(&GVKRequired{}): TypeGVKRequired,
reflect.TypeOf(&BundleObject{}): TypeBundleObject,
+ reflect.TypeOf(&CSVMetadata{}): TypeCSVMetadata,
// NOTICE: The Channel properties are for internal use only.
// DO NOT use it for any public-facing functionalities.
// This API is in alpha stage and it is subject to change.
diff --git a/staging/operator-registry/alpha/template/composite/builder.go b/staging/operator-registry/alpha/template/composite/builder.go
index 3d1f7af95d..953868f3e7 100644
--- a/staging/operator-registry/alpha/template/composite/builder.go
+++ b/staging/operator-registry/alpha/template/composite/builder.go
@@ -27,21 +27,14 @@ const (
CustomBuilderSchema = "olm.builder.custom"
)
-type ContainerConfig struct {
- ContainerTool string
- BaseImage string
- WorkingDir string
-}
-
type BuilderConfig struct {
- ContainerCfg ContainerConfig
- OutputType string
- InputDirectory string
+ WorkingDir string
+ OutputType string
}
type Builder interface {
Build(ctx context.Context, reg image.Registry, dir string, td TemplateDefinition) error
- Validate(dir string) error
+ Validate(ctx context.Context, dir string) error
}
type BasicBuilder struct {
@@ -96,13 +89,13 @@ func (bb *BasicBuilder) Build(ctx context.Context, reg image.Registry, dir strin
return fmt.Errorf("error rendering basic template: %v", err)
}
- destPath := path.Join(bb.builderCfg.ContainerCfg.WorkingDir, dir, basicConfig.Output)
+ destPath := path.Join(bb.builderCfg.WorkingDir, dir, basicConfig.Output)
return build(dcfg, destPath, bb.builderCfg.OutputType)
}
-func (bb *BasicBuilder) Validate(dir string) error {
- return validate(bb.builderCfg.ContainerCfg, dir)
+func (bb *BasicBuilder) Validate(ctx context.Context, dir string) error {
+ return validate(ctx, bb.builderCfg, dir)
}
type SemverBuilder struct {
@@ -158,13 +151,13 @@ func (sb *SemverBuilder) Build(ctx context.Context, reg image.Registry, dir stri
return fmt.Errorf("error rendering semver template: %v", err)
}
- destPath := path.Join(sb.builderCfg.ContainerCfg.WorkingDir, dir, semverConfig.Output)
+ destPath := path.Join(sb.builderCfg.WorkingDir, dir, semverConfig.Output)
return build(dcfg, destPath, sb.builderCfg.OutputType)
}
-func (sb *SemverBuilder) Validate(dir string) error {
- return validate(sb.builderCfg.ContainerCfg, dir)
+func (sb *SemverBuilder) Validate(ctx context.Context, dir string) error {
+ return validate(ctx, sb.builderCfg, dir)
}
type RawBuilder struct {
@@ -218,13 +211,13 @@ func (rb *RawBuilder) Build(ctx context.Context, _ image.Registry, dir string, t
return fmt.Errorf("error parsing raw input file: %s, %v", rawConfig.Input, err)
}
- destPath := path.Join(rb.builderCfg.ContainerCfg.WorkingDir, dir, rawConfig.Output)
+ destPath := path.Join(rb.builderCfg.WorkingDir, dir, rawConfig.Output)
return build(dcfg, destPath, rb.builderCfg.OutputType)
}
-func (rb *RawBuilder) Validate(dir string) error {
- return validate(rb.builderCfg.ContainerCfg, dir)
+func (rb *RawBuilder) Validate(ctx context.Context, dir string) error {
+ return validate(ctx, rb.builderCfg, dir)
}
type CustomBuilder struct {
@@ -268,13 +261,12 @@ func (cb *CustomBuilder) Build(ctx context.Context, reg image.Registry, dir stri
}
// build the command to execute
cmd := exec.Command(customConfig.Command, customConfig.Args...)
- cmd.Dir = cb.builderCfg.ContainerCfg.WorkingDir
// custom template should output a valid FBC to STDOUT so we can
// build the FBC just like all the other templates.
v, err := cmd.Output()
if err != nil {
- return fmt.Errorf("running command %q: %v", cmd.String(), err)
+ return fmt.Errorf("running command %q: %v: %v", cmd.String(), err, v)
}
reader := bytes.NewReader(v)
@@ -286,15 +278,15 @@ func (cb *CustomBuilder) Build(ctx context.Context, reg image.Registry, dir stri
return fmt.Errorf("error parsing custom command output: %s, %v", strings.Join(cmdString, "'"), err)
}
- destPath := path.Join(cb.builderCfg.ContainerCfg.WorkingDir, dir, customConfig.Output)
+ destPath := path.Join(cb.builderCfg.WorkingDir, dir, customConfig.Output)
// custom template should output a valid FBC to STDOUT so we can
// build the FBC just like all the other templates.
return build(dcfg, destPath, cb.builderCfg.OutputType)
}
-func (cb *CustomBuilder) Validate(dir string) error {
- return validate(cb.builderCfg.ContainerCfg, dir)
+func (cb *CustomBuilder) Validate(ctx context.Context, dir string) error {
+ return validate(ctx, cb.builderCfg, dir)
}
func writeDeclCfg(dcfg declcfg.DeclarativeConfig, w io.Writer, output string) error {
@@ -308,18 +300,18 @@ func writeDeclCfg(dcfg declcfg.DeclarativeConfig, w io.Writer, output string) er
}
}
-func validate(containerCfg ContainerConfig, dir string) error {
+func validate(ctx context.Context, builderCfg BuilderConfig, dir string) error {
- path := path.Join(containerCfg.WorkingDir, dir)
+ path := path.Join(builderCfg.WorkingDir, dir)
s, err := os.Stat(path)
if err != nil {
- return fmt.Errorf("directory not found. validation path needs to be composed of ContainerConfig.WorkingDir+Component[].Destination.Path: %q: %v", path, err)
+ return fmt.Errorf("directory not found. validation path needs to be composed of BuilderConfig.WorkingDir+Component[].Destination.Path: %q: %v", path, err)
}
if !s.IsDir() {
return fmt.Errorf("%q is not a directory", path)
}
- if err := config.Validate(os.DirFS(path)); err != nil {
+ if err := config.Validate(ctx, os.DirFS(path)); err != nil {
return fmt.Errorf("validation failure in path %q: %v", path, err)
}
return nil
diff --git a/staging/operator-registry/alpha/template/composite/builder_test.go b/staging/operator-registry/alpha/template/composite/builder_test.go
index af7850b076..63a127a974 100644
--- a/staging/operator-registry/alpha/template/composite/builder_test.go
+++ b/staging/operator-registry/alpha/template/composite/builder_test.go
@@ -8,8 +8,9 @@ import (
"path"
"testing"
- "github.com/operator-framework/operator-registry/pkg/image/containerdregistry"
"github.com/stretchr/testify/require"
+
+ "github.com/operator-framework/operator-registry/pkg/image/containerdregistry"
)
// TODO: Should we consolidate all these tests into a singular test function?
@@ -36,11 +37,7 @@ func TestBasicBuilder(t *testing.T) {
name: "successful basic build yaml output",
validate: true,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -71,11 +68,7 @@ func TestBasicBuilder(t *testing.T) {
name: "successful basic build json output",
validate: true,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "json",
}),
templateDefinition: TemplateDefinition{
@@ -106,11 +99,7 @@ func TestBasicBuilder(t *testing.T) {
name: "invalid template configuration",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -129,11 +118,7 @@ func TestBasicBuilder(t *testing.T) {
name: "invalid output type",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "invalid",
}),
templateDefinition: TemplateDefinition{
@@ -152,11 +137,7 @@ func TestBasicBuilder(t *testing.T) {
name: "invalid schema",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -172,11 +153,7 @@ func TestBasicBuilder(t *testing.T) {
name: "template config has empty input",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -197,11 +174,7 @@ func TestBasicBuilder(t *testing.T) {
name: "template config has empty output",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -222,11 +195,7 @@ func TestBasicBuilder(t *testing.T) {
name: "template config has empty input & output",
validate: false,
basicBuilder: NewBasicBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -244,7 +213,6 @@ func TestBasicBuilder(t *testing.T) {
}
for i, tc := range testCases {
- tc.basicBuilder.builderCfg.InputDirectory = testDir
t.Run(tc.name, func(t *testing.T) {
outDir := fmt.Sprintf("basic-%d", i)
outPath := path.Join(testDir, outDir)
@@ -274,7 +242,7 @@ func TestBasicBuilder(t *testing.T) {
tc.buildAssertions(t, outPath, buildErr)
if tc.validate {
- validateErr := tc.basicBuilder.Validate(outDir)
+ validateErr := tc.basicBuilder.Validate(context.Background(), outDir)
tc.validateAssertions(t, validateErr)
}
})
@@ -326,15 +294,55 @@ properties:
value:
packageName: webhook-operator
version: 0.0.1
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWJldGExIiwia2luZCI6IkNsdXN0ZXJSb2xlIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLW1ldHJpY3MtcmVhZGVyIn0sInJ1bGVzIjpbeyJub25SZXNvdXJjZVVSTHMiOlsiL21ldHJpY3MiXSwidmVyYnMiOlsiZ2V0Il19XX0=
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvL3YxXCIsXG4gICAgXCJraW5kXCI6IFwiV2ViaG9va1Rlc3RcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIndlYmhvb2t0ZXN0LXNhbXBsZVwiLFxuICAgICAgXCJuYW1lc3BhY2VcIjogXCJ3ZWJob29rLW9wZXJhdG9yLXN5c3RlbVwiXG4gICAgfSxcbiAgICBcInNwZWNcIjoge1xuICAgICAgXCJ2YWxpZFwiOiB0cnVlXG4gICAgfVxuICB9XG5dIiwiY2FwYWJpbGl0aWVzIjoiQmFzaWMgSW5zdGFsbCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjAuMCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9wcm9qZWN0X2xheW91dCI6ImdvIn0sIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLnYwLjAuMSIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IldlYmhvb2tUZXN0IiwibmFtZSI6IndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iLCJ2ZXJzaW9uIjoidjEifV19LCJkZXNjcmlwdGlvbiI6IldlYmhvb2sgT3BlcmF0b3IgZGVzY3JpcHRpb24uIFRPRE8uIiwiZGlzcGxheU5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwiaWNvbiI6W3siYmFzZTY0ZGF0YSI6IiIsIm1lZGlhdHlwZSI6IiJ9XSwiaW5zdGFsbCI6eyJzcGVjIjp7ImNsdXN0ZXJQZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0IiwicGF0Y2giLCJ1cGRhdGUiXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJkZWZhdWx0In1dLCJkZXBsb3ltZW50cyI6W3sibmFtZSI6IndlYmhvb2stb3BlcmF0b3Itd2ViaG9vayIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLXNlY3VyZS1saXN0ZW4tYWRkcmVzcz0wLjAuMC4wOjg0NDMiLCItLXVwc3RyZWFtPWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC8iLCItLWxvZ3Rvc3RkZXJyPXRydWUiLCItLXY9MTAiXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWJ1aWxkZXIva3ViZS1yYmFjLXByb3h5OnYwLjUuMCIsIm5hbWUiOiJrdWJlLXJiYWMtcHJveHkiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6ODQ0MywibmFtZSI6Imh0dHBzIn1dLCJyZXNvdXJjZXMiOnt9fSx7ImFyZ3MiOlsiLS1tZXRyaWNzLWFkZHI9MTI3LjAuMC4xOjgwODAiLCItLWVuYWJsZS1sZWFkZXItZWxlY3Rpb24iXSwiY29tbWFuZCI6WyIvbWFuYWdlciJdLCJpbWFnZSI6InF1YXkuaW8vb2xtdGVzdC93ZWJob29rLW9wZXJhdG9yOjAuMC4zIiwibmFtZSI6Im1hbmFnZXIiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6OTQ0MywibmFtZSI6IndlYmhvb2stc2VydmVyIiwicHJvdG9jb2wiOiJUQ1AifV0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjMwTWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjIwTWkifX19XSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMvc3RhdHVzIl0sInZlcmJzIjpbImdldCIsInVwZGF0ZSIsInBhdGNoIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6ImRlZmF1bHQifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIndlYmhvb2stb3BlcmF0b3IiXSwibGlua3MiOlt7Im5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly93ZWJob29rLW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoieW91ckBlbWFpbC5jb20iLCJuYW1lIjoiTWFpbnRhaW5lciBOYW1lIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6IlByb3ZpZGVyIE5hbWUiLCJ1cmwiOiJodHRwczovL3lvdXIuZG9tYWluIn0sInZlcnNpb24iOiIwLjAuMSIsIndlYmhvb2tkZWZpbml0aW9ucyI6W3siYWRtaXNzaW9uUmV2aWV3VmVyc2lvbnMiOlsidjFiZXRhMSIsInYxIl0sImNvbnRhaW5lclBvcnQiOjQ0MywiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6InZ3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiVmFsaWRhdGluZ0FkbWlzc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii92YWxpZGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImRlcGxveW1lbnROYW1lIjoid2ViaG9vay1vcGVyYXRvci13ZWJob29rIiwiZmFpbHVyZVBvbGljeSI6IkZhaWwiLCJnZW5lcmF0ZU5hbWUiOiJtd2ViaG9va3Rlc3Qua2IuaW8iLCJydWxlcyI6W3siYXBpR3JvdXBzIjpbIndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJdLCJhcGlWZXJzaW9ucyI6WyJ2MSJdLCJvcGVyYXRpb25zIjpbIkNSRUFURSIsIlVQREFURSJdLCJyZXNvdXJjZXMiOlsid2ViaG9va3Rlc3RzIl19XSwic2lkZUVmZmVjdHMiOiJOb25lIiwidGFyZ2V0UG9ydCI6NDM0MywidHlwZSI6Ik11dGF0aW5nQWRtaXNzaW9uV2ViaG9vayIsIndlYmhvb2tQYXRoIjoiL211dGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImNvbnZlcnNpb25DUkRzIjpbIndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6ImN3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiQ29udmVyc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii9jb252ZXJ0In1dfX0=
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFiZXRhMSIsImtpbmQiOiJDdXN0b21SZXNvdXJjZURlZmluaXRpb24iLCJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJjb250cm9sbGVyLWdlbi5rdWJlYnVpbGRlci5pby92ZXJzaW9uIjoidjAuMy4wIn0sImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJuYW1lIjoid2ViaG9va3Rlc3RzLndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJ9LCJzcGVjIjp7Imdyb3VwIjoid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIiwibmFtZXMiOnsia2luZCI6IldlYmhvb2tUZXN0IiwibGlzdEtpbmQiOiJXZWJob29rVGVzdExpc3QiLCJwbHVyYWwiOiJ3ZWJob29rdGVzdHMiLCJzaW5ndWxhciI6IndlYmhvb2t0ZXN0In0sInByZXNlcnZlVW5rbm93bkZpZWxkcyI6ZmFsc2UsInNjb3BlIjoiTmFtZXNwYWNlZCIsInZlcnNpb24iOiJ2MSIsInZlcnNpb25zIjpbeyJuYW1lIjoidjEiLCJzY2hlbWEiOnsib3BlbkFQSVYzU2NoZW1hIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3QgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHdlYmhvb2t0ZXN0cyBBUEkiLCJwcm9wZXJ0aWVzIjp7ImFwaVZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJBUElWZXJzaW9uIGRlZmluZXMgdGhlIHZlcnNpb25lZCBzY2hlbWEgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFNlcnZlcnMgc2hvdWxkIGNvbnZlcnQgcmVjb2duaXplZCBzY2hlbWFzIHRvIHRoZSBsYXRlc3QgaW50ZXJuYWwgdmFsdWUsIGFuZCBtYXkgcmVqZWN0IHVucmVjb2duaXplZCB2YWx1ZXMuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjcmVzb3VyY2VzIiwidHlwZSI6InN0cmluZyJ9LCJraW5kIjp7ImRlc2NyaXB0aW9uIjoiS2luZCBpcyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIFJFU1QgcmVzb3VyY2UgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4gU2VydmVycyBtYXkgaW5mZXIgdGhpcyBmcm9tIHRoZSBlbmRwb2ludCB0aGUgY2xpZW50IHN1Ym1pdHMgcmVxdWVzdHMgdG8uIENhbm5vdCBiZSB1cGRhdGVkLiBJbiBDYW1lbENhc2UuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHMiLCJ0eXBlIjoic3RyaW5nIn0sIm1ldGFkYXRhIjp7InR5cGUiOiJvYmplY3QifSwic3BlYyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwicHJvcGVydGllcyI6eyJtdXRhdGUiOnsiZGVzY3JpcHRpb24iOiJNdXRhdGUgaXMgYSBmaWVsZCB0aGF0IHdpbGwgYmUgc2V0IHRvIHRydWUgYnkgdGhlIG11dGF0aW5nIHdlYmhvb2suIiwidHlwZSI6ImJvb2xlYW4ifSwidmFsaWQiOnsiZGVzY3JpcHRpb24iOiJWYWxpZCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIHRoZSB2YWxpZGF0aW9uIHdlYmhvb2sgd2lsbCByZWplY3QgdGhlIHJlc291cmNlLiIsInR5cGUiOiJib29sZWFuIn19LCJyZXF1aXJlZCI6WyJ2YWxpZCJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjp0cnVlfSx7Im5hbWUiOiJ2MiIsInNjaGVtYSI6eyJvcGVuQVBJVjNTY2hlbWEiOnsiZGVzY3JpcHRpb24iOiJXZWJob29rVGVzdCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgd2ViaG9va3Rlc3RzIEFQSSIsInByb3BlcnRpZXMiOnsiYXBpVmVyc2lvbiI6eyJkZXNjcmlwdGlvbiI6IkFQSVZlcnNpb24gZGVmaW5lcyB0aGUgdmVyc2lvbmVkIHNjaGVtYSBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gU2VydmVycyBzaG91bGQgY29udmVydCByZWNvZ25pemVkIHNjaGVtYXMgdG8gdGhlIGxhdGVzdCBpbnRlcm5hbCB2YWx1ZSwgYW5kIG1heSByZWplY3QgdW5yZWNvZ25pemVkIHZhbHVlcy4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCNyZXNvdXJjZXMiLCJ0eXBlIjoic3RyaW5nIn0sImtpbmQiOnsiZGVzY3JpcHRpb24iOiJLaW5kIGlzIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgUkVTVCByZXNvdXJjZSB0aGlzIG9iamVjdCByZXByZXNlbnRzLiBTZXJ2ZXJzIG1heSBpbmZlciB0aGlzIGZyb20gdGhlIGVuZHBvaW50IHRoZSBjbGllbnQgc3VibWl0cyByZXF1ZXN0cyB0by4gQ2Fubm90IGJlIHVwZGF0ZWQuIEluIENhbWVsQ2FzZS4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCN0eXBlcy1raW5kcyIsInR5cGUiOiJzdHJpbmcifSwibWV0YWRhdGEiOnsidHlwZSI6Im9iamVjdCJ9LCJzcGVjIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3RTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgV2ViaG9va1Rlc3QiLCJwcm9wZXJ0aWVzIjp7ImNvbnZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJDb252ZXJzaW9uIGlzIGFuIGV4YW1wbGUgZmllbGQgb2YgV2ViaG9va1Rlc3QuIEVkaXQgV2ViaG9va1Rlc3RfdHlwZXMuZ28gdG8gcmVtb3ZlL3VwZGF0ZSIsInByb3BlcnRpZXMiOnsibXV0YXRlIjp7ImRlc2NyaXB0aW9uIjoiTXV0YXRlIGlzIGEgZmllbGQgdGhhdCB3aWxsIGJlIHNldCB0byB0cnVlIGJ5IHRoZSBtdXRhdGluZyB3ZWJob29rLiIsInR5cGUiOiJib29sZWFuIn0sInZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiVmFsaWQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciB0aGUgdmFsaWRhdGlvbiB3ZWJob29rIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS4iLCJ0eXBlIjoiYm9vbGVhbiJ9fSwicmVxdWlyZWQiOlsidmFsaWQiXSwidHlwZSI6Im9iamVjdCJ9fSwicmVxdWlyZWQiOlsiY29udmVyc2lvbiJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjpmYWxzZX1dfSwic3RhdHVzIjp7ImFjY2VwdGVkTmFtZXMiOnsia2luZCI6IiIsInBsdXJhbCI6IiJ9LCJjb25kaXRpb25zIjpbXSwic3RvcmVkVmVyc2lvbnMiOltdfX0=
+ annotations:
+ alm-examples: |-
+ [
+ {
+ "apiVersion": "webhook.operators.coreos.io/v1",
+ "kind": "WebhookTest",
+ "metadata": {
+ "name": "webhooktest-sample",
+ "namespace": "webhook-operator-system"
+ },
+ "spec": {
+ "valid": true
+ }
+ }
+ ]
+ capabilities: Basic Install
+ operators.operatorframework.io/builder: operator-sdk-v1.0.0
+ operators.operatorframework.io/project_layout: go
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: WebhookTest
+ name: webhooktests.webhook.operators.coreos.io
+ version: v1
+ description: Webhook Operator description. TODO.
+ displayName: Webhook Operator
+ installModes:
+ - supported: false
+ type: OwnNamespace
+ - supported: false
+ type: SingleNamespace
+ - supported: false
+ type: MultiNamespace
+ - supported: true
+ type: AllNamespaces
+ keywords:
+ - webhook-operator
+ links:
+ - name: Webhook Operator
+ url: https://webhook-operator.domain
+ maintainers:
+ - email: your@email.com
+ name: Maintainer Name
+ maturity: alpha
+ provider:
+ name: Provider Name
+ url: https://your.domain
relatedImages:
- image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
name: ""
@@ -390,21 +398,64 @@ const basicBuiltFbcJson = `{
}
},
{
- "type": "olm.bundle.object",
- "value": {
- "data": "eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWJldGExIiwia2luZCI6IkNsdXN0ZXJSb2xlIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLW1ldHJpY3MtcmVhZGVyIn0sInJ1bGVzIjpbeyJub25SZXNvdXJjZVVSTHMiOlsiL21ldHJpY3MiXSwidmVyYnMiOlsiZ2V0Il19XX0="
- }
- },
- {
- "type": "olm.bundle.object",
+ "type": "olm.csv.metadata",
"value": {
- "data": "eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvL3YxXCIsXG4gICAgXCJraW5kXCI6IFwiV2ViaG9va1Rlc3RcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIndlYmhvb2t0ZXN0LXNhbXBsZVwiLFxuICAgICAgXCJuYW1lc3BhY2VcIjogXCJ3ZWJob29rLW9wZXJhdG9yLXN5c3RlbVwiXG4gICAgfSxcbiAgICBcInNwZWNcIjoge1xuICAgICAgXCJ2YWxpZFwiOiB0cnVlXG4gICAgfVxuICB9XG5dIiwiY2FwYWJpbGl0aWVzIjoiQmFzaWMgSW5zdGFsbCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjAuMCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9wcm9qZWN0X2xheW91dCI6ImdvIn0sIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLnYwLjAuMSIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IldlYmhvb2tUZXN0IiwibmFtZSI6IndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iLCJ2ZXJzaW9uIjoidjEifV19LCJkZXNjcmlwdGlvbiI6IldlYmhvb2sgT3BlcmF0b3IgZGVzY3JpcHRpb24uIFRPRE8uIiwiZGlzcGxheU5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwiaWNvbiI6W3siYmFzZTY0ZGF0YSI6IiIsIm1lZGlhdHlwZSI6IiJ9XSwiaW5zdGFsbCI6eyJzcGVjIjp7ImNsdXN0ZXJQZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0IiwicGF0Y2giLCJ1cGRhdGUiXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJkZWZhdWx0In1dLCJkZXBsb3ltZW50cyI6W3sibmFtZSI6IndlYmhvb2stb3BlcmF0b3Itd2ViaG9vayIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLXNlY3VyZS1saXN0ZW4tYWRkcmVzcz0wLjAuMC4wOjg0NDMiLCItLXVwc3RyZWFtPWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC8iLCItLWxvZ3Rvc3RkZXJyPXRydWUiLCItLXY9MTAiXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWJ1aWxkZXIva3ViZS1yYmFjLXByb3h5OnYwLjUuMCIsIm5hbWUiOiJrdWJlLXJiYWMtcHJveHkiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6ODQ0MywibmFtZSI6Imh0dHBzIn1dLCJyZXNvdXJjZXMiOnt9fSx7ImFyZ3MiOlsiLS1tZXRyaWNzLWFkZHI9MTI3LjAuMC4xOjgwODAiLCItLWVuYWJsZS1sZWFkZXItZWxlY3Rpb24iXSwiY29tbWFuZCI6WyIvbWFuYWdlciJdLCJpbWFnZSI6InF1YXkuaW8vb2xtdGVzdC93ZWJob29rLW9wZXJhdG9yOjAuMC4zIiwibmFtZSI6Im1hbmFnZXIiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6OTQ0MywibmFtZSI6IndlYmhvb2stc2VydmVyIiwicHJvdG9jb2wiOiJUQ1AifV0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjMwTWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjIwTWkifX19XSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMvc3RhdHVzIl0sInZlcmJzIjpbImdldCIsInVwZGF0ZSIsInBhdGNoIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6ImRlZmF1bHQifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIndlYmhvb2stb3BlcmF0b3IiXSwibGlua3MiOlt7Im5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly93ZWJob29rLW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoieW91ckBlbWFpbC5jb20iLCJuYW1lIjoiTWFpbnRhaW5lciBOYW1lIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6IlByb3ZpZGVyIE5hbWUiLCJ1cmwiOiJodHRwczovL3lvdXIuZG9tYWluIn0sInZlcnNpb24iOiIwLjAuMSIsIndlYmhvb2tkZWZpbml0aW9ucyI6W3siYWRtaXNzaW9uUmV2aWV3VmVyc2lvbnMiOlsidjFiZXRhMSIsInYxIl0sImNvbnRhaW5lclBvcnQiOjQ0MywiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6InZ3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiVmFsaWRhdGluZ0FkbWlzc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii92YWxpZGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImRlcGxveW1lbnROYW1lIjoid2ViaG9vay1vcGVyYXRvci13ZWJob29rIiwiZmFpbHVyZVBvbGljeSI6IkZhaWwiLCJnZW5lcmF0ZU5hbWUiOiJtd2ViaG9va3Rlc3Qua2IuaW8iLCJydWxlcyI6W3siYXBpR3JvdXBzIjpbIndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJdLCJhcGlWZXJzaW9ucyI6WyJ2MSJdLCJvcGVyYXRpb25zIjpbIkNSRUFURSIsIlVQREFURSJdLCJyZXNvdXJjZXMiOlsid2ViaG9va3Rlc3RzIl19XSwic2lkZUVmZmVjdHMiOiJOb25lIiwidGFyZ2V0UG9ydCI6NDM0MywidHlwZSI6Ik11dGF0aW5nQWRtaXNzaW9uV2ViaG9vayIsIndlYmhvb2tQYXRoIjoiL211dGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImNvbnZlcnNpb25DUkRzIjpbIndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6ImN3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiQ29udmVyc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii9jb252ZXJ0In1dfX0="
- }
- },
- {
- "type": "olm.bundle.object",
- "value": {
- "data": "eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFiZXRhMSIsImtpbmQiOiJDdXN0b21SZXNvdXJjZURlZmluaXRpb24iLCJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJjb250cm9sbGVyLWdlbi5rdWJlYnVpbGRlci5pby92ZXJzaW9uIjoidjAuMy4wIn0sImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJuYW1lIjoid2ViaG9va3Rlc3RzLndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJ9LCJzcGVjIjp7Imdyb3VwIjoid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIiwibmFtZXMiOnsia2luZCI6IldlYmhvb2tUZXN0IiwibGlzdEtpbmQiOiJXZWJob29rVGVzdExpc3QiLCJwbHVyYWwiOiJ3ZWJob29rdGVzdHMiLCJzaW5ndWxhciI6IndlYmhvb2t0ZXN0In0sInByZXNlcnZlVW5rbm93bkZpZWxkcyI6ZmFsc2UsInNjb3BlIjoiTmFtZXNwYWNlZCIsInZlcnNpb24iOiJ2MSIsInZlcnNpb25zIjpbeyJuYW1lIjoidjEiLCJzY2hlbWEiOnsib3BlbkFQSVYzU2NoZW1hIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3QgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHdlYmhvb2t0ZXN0cyBBUEkiLCJwcm9wZXJ0aWVzIjp7ImFwaVZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJBUElWZXJzaW9uIGRlZmluZXMgdGhlIHZlcnNpb25lZCBzY2hlbWEgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFNlcnZlcnMgc2hvdWxkIGNvbnZlcnQgcmVjb2duaXplZCBzY2hlbWFzIHRvIHRoZSBsYXRlc3QgaW50ZXJuYWwgdmFsdWUsIGFuZCBtYXkgcmVqZWN0IHVucmVjb2duaXplZCB2YWx1ZXMuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjcmVzb3VyY2VzIiwidHlwZSI6InN0cmluZyJ9LCJraW5kIjp7ImRlc2NyaXB0aW9uIjoiS2luZCBpcyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIFJFU1QgcmVzb3VyY2UgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4gU2VydmVycyBtYXkgaW5mZXIgdGhpcyBmcm9tIHRoZSBlbmRwb2ludCB0aGUgY2xpZW50IHN1Ym1pdHMgcmVxdWVzdHMgdG8uIENhbm5vdCBiZSB1cGRhdGVkLiBJbiBDYW1lbENhc2UuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHMiLCJ0eXBlIjoic3RyaW5nIn0sIm1ldGFkYXRhIjp7InR5cGUiOiJvYmplY3QifSwic3BlYyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwicHJvcGVydGllcyI6eyJtdXRhdGUiOnsiZGVzY3JpcHRpb24iOiJNdXRhdGUgaXMgYSBmaWVsZCB0aGF0IHdpbGwgYmUgc2V0IHRvIHRydWUgYnkgdGhlIG11dGF0aW5nIHdlYmhvb2suIiwidHlwZSI6ImJvb2xlYW4ifSwidmFsaWQiOnsiZGVzY3JpcHRpb24iOiJWYWxpZCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIHRoZSB2YWxpZGF0aW9uIHdlYmhvb2sgd2lsbCByZWplY3QgdGhlIHJlc291cmNlLiIsInR5cGUiOiJib29sZWFuIn19LCJyZXF1aXJlZCI6WyJ2YWxpZCJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjp0cnVlfSx7Im5hbWUiOiJ2MiIsInNjaGVtYSI6eyJvcGVuQVBJVjNTY2hlbWEiOnsiZGVzY3JpcHRpb24iOiJXZWJob29rVGVzdCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgd2ViaG9va3Rlc3RzIEFQSSIsInByb3BlcnRpZXMiOnsiYXBpVmVyc2lvbiI6eyJkZXNjcmlwdGlvbiI6IkFQSVZlcnNpb24gZGVmaW5lcyB0aGUgdmVyc2lvbmVkIHNjaGVtYSBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gU2VydmVycyBzaG91bGQgY29udmVydCByZWNvZ25pemVkIHNjaGVtYXMgdG8gdGhlIGxhdGVzdCBpbnRlcm5hbCB2YWx1ZSwgYW5kIG1heSByZWplY3QgdW5yZWNvZ25pemVkIHZhbHVlcy4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCNyZXNvdXJjZXMiLCJ0eXBlIjoic3RyaW5nIn0sImtpbmQiOnsiZGVzY3JpcHRpb24iOiJLaW5kIGlzIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgUkVTVCByZXNvdXJjZSB0aGlzIG9iamVjdCByZXByZXNlbnRzLiBTZXJ2ZXJzIG1heSBpbmZlciB0aGlzIGZyb20gdGhlIGVuZHBvaW50IHRoZSBjbGllbnQgc3VibWl0cyByZXF1ZXN0cyB0by4gQ2Fubm90IGJlIHVwZGF0ZWQuIEluIENhbWVsQ2FzZS4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCN0eXBlcy1raW5kcyIsInR5cGUiOiJzdHJpbmcifSwibWV0YWRhdGEiOnsidHlwZSI6Im9iamVjdCJ9LCJzcGVjIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3RTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgV2ViaG9va1Rlc3QiLCJwcm9wZXJ0aWVzIjp7ImNvbnZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJDb252ZXJzaW9uIGlzIGFuIGV4YW1wbGUgZmllbGQgb2YgV2ViaG9va1Rlc3QuIEVkaXQgV2ViaG9va1Rlc3RfdHlwZXMuZ28gdG8gcmVtb3ZlL3VwZGF0ZSIsInByb3BlcnRpZXMiOnsibXV0YXRlIjp7ImRlc2NyaXB0aW9uIjoiTXV0YXRlIGlzIGEgZmllbGQgdGhhdCB3aWxsIGJlIHNldCB0byB0cnVlIGJ5IHRoZSBtdXRhdGluZyB3ZWJob29rLiIsInR5cGUiOiJib29sZWFuIn0sInZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiVmFsaWQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciB0aGUgdmFsaWRhdGlvbiB3ZWJob29rIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS4iLCJ0eXBlIjoiYm9vbGVhbiJ9fSwicmVxdWlyZWQiOlsidmFsaWQiXSwidHlwZSI6Im9iamVjdCJ9fSwicmVxdWlyZWQiOlsiY29udmVyc2lvbiJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjpmYWxzZX1dfSwic3RhdHVzIjp7ImFjY2VwdGVkTmFtZXMiOnsia2luZCI6IiIsInBsdXJhbCI6IiJ9LCJjb25kaXRpb25zIjpbXSwic3RvcmVkVmVyc2lvbnMiOltdfX0="
+ "annotations": {
+ "alm-examples": "[\n {\n \"apiVersion\": \"webhook.operators.coreos.io/v1\",\n \"kind\": \"WebhookTest\",\n \"metadata\": {\n \"name\": \"webhooktest-sample\",\n \"namespace\": \"webhook-operator-system\"\n },\n \"spec\": {\n \"valid\": true\n }\n }\n]",
+ "capabilities": "Basic Install",
+ "operators.operatorframework.io/builder": "operator-sdk-v1.0.0",
+ "operators.operatorframework.io/project_layout": "go"
+ },
+ "apiServiceDefinitions": {},
+ "crdDescriptions": {
+ "owned": [
+ {
+ "name": "webhooktests.webhook.operators.coreos.io",
+ "version": "v1",
+ "kind": "WebhookTest"
+ }
+ ]
+ },
+ "description": "Webhook Operator description. TODO.",
+ "displayName": "Webhook Operator",
+ "installModes": [
+ {
+ "type": "OwnNamespace",
+ "supported": false
+ },
+ {
+ "type": "SingleNamespace",
+ "supported": false
+ },
+ {
+ "type": "MultiNamespace",
+ "supported": false
+ },
+ {
+ "type": "AllNamespaces",
+ "supported": true
+ }
+ ],
+ "keywords": [
+ "webhook-operator"
+ ],
+ "links": [
+ {
+ "name": "Webhook Operator",
+ "url": "https://webhook-operator.domain"
+ }
+ ],
+ "maintainers": [
+ {
+ "name": "Maintainer Name",
+ "email": "your@email.com"
+ }
+ ],
+ "maturity": "alpha",
+ "provider": {
+ "name": "Provider Name",
+ "url": "https://your.domain"
+ }
}
}
],
@@ -447,11 +498,7 @@ func TestSemverBuilder(t *testing.T) {
name: "successful semver build yaml output",
validate: true,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -472,7 +519,7 @@ func TestSemverBuilder(t *testing.T) {
defer file.Close()
fileData, err := io.ReadAll(file)
require.NoError(t, err)
- require.Equal(t, string(fileData), semverBuiltFbcYaml)
+ require.Equal(t, semverBuiltFbcYaml, string(fileData))
},
validateAssertions: func(t *testing.T, validateErr error) {
require.NoError(t, validateErr)
@@ -482,11 +529,7 @@ func TestSemverBuilder(t *testing.T) {
name: "successful semver build json output",
validate: true,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "json",
}),
templateDefinition: TemplateDefinition{
@@ -507,7 +550,7 @@ func TestSemverBuilder(t *testing.T) {
defer file.Close()
fileData, err := io.ReadAll(file)
require.NoError(t, err)
- require.Equal(t, string(fileData), semverBuiltFbcJson)
+ require.Equal(t, semverBuiltFbcJson, string(fileData))
},
validateAssertions: func(t *testing.T, validateErr error) {
require.NoError(t, validateErr)
@@ -517,11 +560,7 @@ func TestSemverBuilder(t *testing.T) {
name: "invalid template configuration",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -540,11 +579,7 @@ func TestSemverBuilder(t *testing.T) {
name: "invalid output type",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "invalid",
}),
templateDefinition: TemplateDefinition{
@@ -563,11 +598,7 @@ func TestSemverBuilder(t *testing.T) {
name: "invalid schema",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -584,11 +615,7 @@ func TestSemverBuilder(t *testing.T) {
name: "template config has empty input",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -609,11 +636,7 @@ func TestSemverBuilder(t *testing.T) {
name: "template config has empty output",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -626,19 +649,15 @@ func TestSemverBuilder(t *testing.T) {
buildAssertions: func(t *testing.T, dir string, buildErr error) {
require.Error(t, buildErr)
require.Equal(t,
- buildErr.Error(),
- "semver template configuration is invalid: semver template config must have a non-empty output (templateDefinition.config.output)")
+ "semver template configuration is invalid: semver template config must have a non-empty output (templateDefinition.config.output)",
+ buildErr.Error())
},
},
{
name: "template config has empty input & output",
validate: false,
semverBuilder: NewSemverBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -649,14 +668,14 @@ func TestSemverBuilder(t *testing.T) {
buildAssertions: func(t *testing.T, dir string, buildErr error) {
require.Error(t, buildErr)
require.Equal(t,
+ "semver template configuration is invalid: semver template config must have a non-empty input (templateDefinition.config.input),semver template config must have a non-empty output (templateDefinition.config.output)",
buildErr.Error(),
- "semver template configuration is invalid: semver template config must have a non-empty input (templateDefinition.config.input),semver template config must have a non-empty output (templateDefinition.config.output)")
+ )
},
},
}
for i, tc := range testCases {
- tc.semverBuilder.builderCfg.InputDirectory = testDir
t.Run(tc.name, func(t *testing.T) {
outDir := fmt.Sprintf("semver-%d", i)
outPath := path.Join(testDir, outDir)
@@ -687,7 +706,7 @@ func TestSemverBuilder(t *testing.T) {
tc.buildAssertions(t, outPath, buildErr)
if tc.validate {
- validateErr := tc.semverBuilder.Validate(outDir)
+ validateErr := tc.semverBuilder.Validate(context.Background(), outDir)
tc.validateAssertions(t, validateErr)
}
})
@@ -704,7 +723,7 @@ Stable:
`
const semverBuiltFbcYaml = `---
-defaultChannel: stable-v0
+defaultChannel: stable-v0.0
name: webhook-operator
schema: olm.package
---
@@ -738,15 +757,55 @@ properties:
value:
packageName: webhook-operator
version: 0.0.1
-- type: olm.bundle.object
+- type: olm.csv.metadata
value:
- data: eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWJldGExIiwia2luZCI6IkNsdXN0ZXJSb2xlIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLW1ldHJpY3MtcmVhZGVyIn0sInJ1bGVzIjpbeyJub25SZXNvdXJjZVVSTHMiOlsiL21ldHJpY3MiXSwidmVyYnMiOlsiZ2V0Il19XX0=
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvL3YxXCIsXG4gICAgXCJraW5kXCI6IFwiV2ViaG9va1Rlc3RcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIndlYmhvb2t0ZXN0LXNhbXBsZVwiLFxuICAgICAgXCJuYW1lc3BhY2VcIjogXCJ3ZWJob29rLW9wZXJhdG9yLXN5c3RlbVwiXG4gICAgfSxcbiAgICBcInNwZWNcIjoge1xuICAgICAgXCJ2YWxpZFwiOiB0cnVlXG4gICAgfVxuICB9XG5dIiwiY2FwYWJpbGl0aWVzIjoiQmFzaWMgSW5zdGFsbCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjAuMCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9wcm9qZWN0X2xheW91dCI6ImdvIn0sIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLnYwLjAuMSIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IldlYmhvb2tUZXN0IiwibmFtZSI6IndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iLCJ2ZXJzaW9uIjoidjEifV19LCJkZXNjcmlwdGlvbiI6IldlYmhvb2sgT3BlcmF0b3IgZGVzY3JpcHRpb24uIFRPRE8uIiwiZGlzcGxheU5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwiaWNvbiI6W3siYmFzZTY0ZGF0YSI6IiIsIm1lZGlhdHlwZSI6IiJ9XSwiaW5zdGFsbCI6eyJzcGVjIjp7ImNsdXN0ZXJQZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0IiwicGF0Y2giLCJ1cGRhdGUiXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJkZWZhdWx0In1dLCJkZXBsb3ltZW50cyI6W3sibmFtZSI6IndlYmhvb2stb3BlcmF0b3Itd2ViaG9vayIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLXNlY3VyZS1saXN0ZW4tYWRkcmVzcz0wLjAuMC4wOjg0NDMiLCItLXVwc3RyZWFtPWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC8iLCItLWxvZ3Rvc3RkZXJyPXRydWUiLCItLXY9MTAiXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWJ1aWxkZXIva3ViZS1yYmFjLXByb3h5OnYwLjUuMCIsIm5hbWUiOiJrdWJlLXJiYWMtcHJveHkiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6ODQ0MywibmFtZSI6Imh0dHBzIn1dLCJyZXNvdXJjZXMiOnt9fSx7ImFyZ3MiOlsiLS1tZXRyaWNzLWFkZHI9MTI3LjAuMC4xOjgwODAiLCItLWVuYWJsZS1sZWFkZXItZWxlY3Rpb24iXSwiY29tbWFuZCI6WyIvbWFuYWdlciJdLCJpbWFnZSI6InF1YXkuaW8vb2xtdGVzdC93ZWJob29rLW9wZXJhdG9yOjAuMC4zIiwibmFtZSI6Im1hbmFnZXIiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6OTQ0MywibmFtZSI6IndlYmhvb2stc2VydmVyIiwicHJvdG9jb2wiOiJUQ1AifV0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjMwTWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjIwTWkifX19XSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMvc3RhdHVzIl0sInZlcmJzIjpbImdldCIsInVwZGF0ZSIsInBhdGNoIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6ImRlZmF1bHQifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIndlYmhvb2stb3BlcmF0b3IiXSwibGlua3MiOlt7Im5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly93ZWJob29rLW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoieW91ckBlbWFpbC5jb20iLCJuYW1lIjoiTWFpbnRhaW5lciBOYW1lIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6IlByb3ZpZGVyIE5hbWUiLCJ1cmwiOiJodHRwczovL3lvdXIuZG9tYWluIn0sInZlcnNpb24iOiIwLjAuMSIsIndlYmhvb2tkZWZpbml0aW9ucyI6W3siYWRtaXNzaW9uUmV2aWV3VmVyc2lvbnMiOlsidjFiZXRhMSIsInYxIl0sImNvbnRhaW5lclBvcnQiOjQ0MywiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6InZ3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiVmFsaWRhdGluZ0FkbWlzc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii92YWxpZGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImRlcGxveW1lbnROYW1lIjoid2ViaG9vay1vcGVyYXRvci13ZWJob29rIiwiZmFpbHVyZVBvbGljeSI6IkZhaWwiLCJnZW5lcmF0ZU5hbWUiOiJtd2ViaG9va3Rlc3Qua2IuaW8iLCJydWxlcyI6W3siYXBpR3JvdXBzIjpbIndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJdLCJhcGlWZXJzaW9ucyI6WyJ2MSJdLCJvcGVyYXRpb25zIjpbIkNSRUFURSIsIlVQREFURSJdLCJyZXNvdXJjZXMiOlsid2ViaG9va3Rlc3RzIl19XSwic2lkZUVmZmVjdHMiOiJOb25lIiwidGFyZ2V0UG9ydCI6NDM0MywidHlwZSI6Ik11dGF0aW5nQWRtaXNzaW9uV2ViaG9vayIsIndlYmhvb2tQYXRoIjoiL211dGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImNvbnZlcnNpb25DUkRzIjpbIndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6ImN3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiQ29udmVyc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii9jb252ZXJ0In1dfX0=
-- type: olm.bundle.object
- value:
- data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFiZXRhMSIsImtpbmQiOiJDdXN0b21SZXNvdXJjZURlZmluaXRpb24iLCJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJjb250cm9sbGVyLWdlbi5rdWJlYnVpbGRlci5pby92ZXJzaW9uIjoidjAuMy4wIn0sImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJuYW1lIjoid2ViaG9va3Rlc3RzLndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJ9LCJzcGVjIjp7Imdyb3VwIjoid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIiwibmFtZXMiOnsia2luZCI6IldlYmhvb2tUZXN0IiwibGlzdEtpbmQiOiJXZWJob29rVGVzdExpc3QiLCJwbHVyYWwiOiJ3ZWJob29rdGVzdHMiLCJzaW5ndWxhciI6IndlYmhvb2t0ZXN0In0sInByZXNlcnZlVW5rbm93bkZpZWxkcyI6ZmFsc2UsInNjb3BlIjoiTmFtZXNwYWNlZCIsInZlcnNpb24iOiJ2MSIsInZlcnNpb25zIjpbeyJuYW1lIjoidjEiLCJzY2hlbWEiOnsib3BlbkFQSVYzU2NoZW1hIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3QgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHdlYmhvb2t0ZXN0cyBBUEkiLCJwcm9wZXJ0aWVzIjp7ImFwaVZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJBUElWZXJzaW9uIGRlZmluZXMgdGhlIHZlcnNpb25lZCBzY2hlbWEgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFNlcnZlcnMgc2hvdWxkIGNvbnZlcnQgcmVjb2duaXplZCBzY2hlbWFzIHRvIHRoZSBsYXRlc3QgaW50ZXJuYWwgdmFsdWUsIGFuZCBtYXkgcmVqZWN0IHVucmVjb2duaXplZCB2YWx1ZXMuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjcmVzb3VyY2VzIiwidHlwZSI6InN0cmluZyJ9LCJraW5kIjp7ImRlc2NyaXB0aW9uIjoiS2luZCBpcyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIFJFU1QgcmVzb3VyY2UgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4gU2VydmVycyBtYXkgaW5mZXIgdGhpcyBmcm9tIHRoZSBlbmRwb2ludCB0aGUgY2xpZW50IHN1Ym1pdHMgcmVxdWVzdHMgdG8uIENhbm5vdCBiZSB1cGRhdGVkLiBJbiBDYW1lbENhc2UuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHMiLCJ0eXBlIjoic3RyaW5nIn0sIm1ldGFkYXRhIjp7InR5cGUiOiJvYmplY3QifSwic3BlYyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwicHJvcGVydGllcyI6eyJtdXRhdGUiOnsiZGVzY3JpcHRpb24iOiJNdXRhdGUgaXMgYSBmaWVsZCB0aGF0IHdpbGwgYmUgc2V0IHRvIHRydWUgYnkgdGhlIG11dGF0aW5nIHdlYmhvb2suIiwidHlwZSI6ImJvb2xlYW4ifSwidmFsaWQiOnsiZGVzY3JpcHRpb24iOiJWYWxpZCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIHRoZSB2YWxpZGF0aW9uIHdlYmhvb2sgd2lsbCByZWplY3QgdGhlIHJlc291cmNlLiIsInR5cGUiOiJib29sZWFuIn19LCJyZXF1aXJlZCI6WyJ2YWxpZCJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjp0cnVlfSx7Im5hbWUiOiJ2MiIsInNjaGVtYSI6eyJvcGVuQVBJVjNTY2hlbWEiOnsiZGVzY3JpcHRpb24iOiJXZWJob29rVGVzdCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgd2ViaG9va3Rlc3RzIEFQSSIsInByb3BlcnRpZXMiOnsiYXBpVmVyc2lvbiI6eyJkZXNjcmlwdGlvbiI6IkFQSVZlcnNpb24gZGVmaW5lcyB0aGUgdmVyc2lvbmVkIHNjaGVtYSBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gU2VydmVycyBzaG91bGQgY29udmVydCByZWNvZ25pemVkIHNjaGVtYXMgdG8gdGhlIGxhdGVzdCBpbnRlcm5hbCB2YWx1ZSwgYW5kIG1heSByZWplY3QgdW5yZWNvZ25pemVkIHZhbHVlcy4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCNyZXNvdXJjZXMiLCJ0eXBlIjoic3RyaW5nIn0sImtpbmQiOnsiZGVzY3JpcHRpb24iOiJLaW5kIGlzIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgUkVTVCByZXNvdXJjZSB0aGlzIG9iamVjdCByZXByZXNlbnRzLiBTZXJ2ZXJzIG1heSBpbmZlciB0aGlzIGZyb20gdGhlIGVuZHBvaW50IHRoZSBjbGllbnQgc3VibWl0cyByZXF1ZXN0cyB0by4gQ2Fubm90IGJlIHVwZGF0ZWQuIEluIENhbWVsQ2FzZS4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCN0eXBlcy1raW5kcyIsInR5cGUiOiJzdHJpbmcifSwibWV0YWRhdGEiOnsidHlwZSI6Im9iamVjdCJ9LCJzcGVjIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3RTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgV2ViaG9va1Rlc3QiLCJwcm9wZXJ0aWVzIjp7ImNvbnZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJDb252ZXJzaW9uIGlzIGFuIGV4YW1wbGUgZmllbGQgb2YgV2ViaG9va1Rlc3QuIEVkaXQgV2ViaG9va1Rlc3RfdHlwZXMuZ28gdG8gcmVtb3ZlL3VwZGF0ZSIsInByb3BlcnRpZXMiOnsibXV0YXRlIjp7ImRlc2NyaXB0aW9uIjoiTXV0YXRlIGlzIGEgZmllbGQgdGhhdCB3aWxsIGJlIHNldCB0byB0cnVlIGJ5IHRoZSBtdXRhdGluZyB3ZWJob29rLiIsInR5cGUiOiJib29sZWFuIn0sInZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiVmFsaWQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciB0aGUgdmFsaWRhdGlvbiB3ZWJob29rIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS4iLCJ0eXBlIjoiYm9vbGVhbiJ9fSwicmVxdWlyZWQiOlsidmFsaWQiXSwidHlwZSI6Im9iamVjdCJ9fSwicmVxdWlyZWQiOlsiY29udmVyc2lvbiJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjpmYWxzZX1dfSwic3RhdHVzIjp7ImFjY2VwdGVkTmFtZXMiOnsia2luZCI6IiIsInBsdXJhbCI6IiJ9LCJjb25kaXRpb25zIjpbXSwic3RvcmVkVmVyc2lvbnMiOltdfX0=
+ annotations:
+ alm-examples: |-
+ [
+ {
+ "apiVersion": "webhook.operators.coreos.io/v1",
+ "kind": "WebhookTest",
+ "metadata": {
+ "name": "webhooktest-sample",
+ "namespace": "webhook-operator-system"
+ },
+ "spec": {
+ "valid": true
+ }
+ }
+ ]
+ capabilities: Basic Install
+ operators.operatorframework.io/builder: operator-sdk-v1.0.0
+ operators.operatorframework.io/project_layout: go
+ apiServiceDefinitions: {}
+ crdDescriptions:
+ owned:
+ - kind: WebhookTest
+ name: webhooktests.webhook.operators.coreos.io
+ version: v1
+ description: Webhook Operator description. TODO.
+ displayName: Webhook Operator
+ installModes:
+ - supported: false
+ type: OwnNamespace
+ - supported: false
+ type: SingleNamespace
+ - supported: false
+ type: MultiNamespace
+ - supported: true
+ type: AllNamespaces
+ keywords:
+ - webhook-operator
+ links:
+ - name: Webhook Operator
+ url: https://webhook-operator.domain
+ maintainers:
+ - email: your@email.com
+ name: Maintainer Name
+ maturity: alpha
+ provider:
+ name: Provider Name
+ url: https://your.domain
relatedImages:
- image: gcr.io/kubebuilder/kube-rbac-proxy:v0.5.0
name: ""
@@ -760,7 +819,7 @@ schema: olm.bundle
const semverBuiltFbcJson = `{
"schema": "olm.package",
"name": "webhook-operator",
- "defaultChannel": "stable-v0"
+ "defaultChannel": "stable-v0.0"
}
{
"schema": "olm.channel",
@@ -812,21 +871,64 @@ const semverBuiltFbcJson = `{
}
},
{
- "type": "olm.bundle.object",
+ "type": "olm.csv.metadata",
"value": {
- "data": "eyJhcGlWZXJzaW9uIjoicmJhYy5hdXRob3JpemF0aW9uLms4cy5pby92MWJldGExIiwia2luZCI6IkNsdXN0ZXJSb2xlIiwibWV0YWRhdGEiOnsiY3JlYXRpb25UaW1lc3RhbXAiOm51bGwsIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLW1ldHJpY3MtcmVhZGVyIn0sInJ1bGVzIjpbeyJub25SZXNvdXJjZVVSTHMiOlsiL21ldHJpY3MiXSwidmVyYnMiOlsiZ2V0Il19XX0="
- }
- },
- {
- "type": "olm.bundle.object",
- "value": {
- "data": "eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsiYWxtLWV4YW1wbGVzIjoiW1xuICB7XG4gICAgXCJhcGlWZXJzaW9uXCI6IFwid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvL3YxXCIsXG4gICAgXCJraW5kXCI6IFwiV2ViaG9va1Rlc3RcIixcbiAgICBcIm1ldGFkYXRhXCI6IHtcbiAgICAgIFwibmFtZVwiOiBcIndlYmhvb2t0ZXN0LXNhbXBsZVwiLFxuICAgICAgXCJuYW1lc3BhY2VcIjogXCJ3ZWJob29rLW9wZXJhdG9yLXN5c3RlbVwiXG4gICAgfSxcbiAgICBcInNwZWNcIjoge1xuICAgICAgXCJ2YWxpZFwiOiB0cnVlXG4gICAgfVxuICB9XG5dIiwiY2FwYWJpbGl0aWVzIjoiQmFzaWMgSW5zdGFsbCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9idWlsZGVyIjoib3BlcmF0b3Itc2RrLXYxLjAuMCIsIm9wZXJhdG9ycy5vcGVyYXRvcmZyYW1ld29yay5pby9wcm9qZWN0X2xheW91dCI6ImdvIn0sIm5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLnYwLjAuMSIsIm5hbWVzcGFjZSI6InBsYWNlaG9sZGVyIn0sInNwZWMiOnsiYXBpc2VydmljZWRlZmluaXRpb25zIjp7fSwiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3sia2luZCI6IldlYmhvb2tUZXN0IiwibmFtZSI6IndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iLCJ2ZXJzaW9uIjoidjEifV19LCJkZXNjcmlwdGlvbiI6IldlYmhvb2sgT3BlcmF0b3IgZGVzY3JpcHRpb24uIFRPRE8uIiwiZGlzcGxheU5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwiaWNvbiI6W3siYmFzZTY0ZGF0YSI6IiIsIm1lZGlhdHlwZSI6IiJ9XSwiaW5zdGFsbCI6eyJzcGVjIjp7ImNsdXN0ZXJQZXJtaXNzaW9ucyI6W3sicnVsZXMiOlt7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cyJdLCJ2ZXJicyI6WyJjcmVhdGUiLCJkZWxldGUiLCJnZXQiLCJsaXN0IiwicGF0Y2giLCJ1cGRhdGUiLCJ3YXRjaCJdfSx7ImFwaUdyb3VwcyI6WyJ3ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwicmVzb3VyY2VzIjpbIndlYmhvb2t0ZXN0cy9zdGF0dXMiXSwidmVyYnMiOlsiZ2V0IiwicGF0Y2giLCJ1cGRhdGUiXX0seyJhcGlHcm91cHMiOlsiYXV0aGVudGljYXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJ0b2tlbnJldmlld3MiXSwidmVyYnMiOlsiY3JlYXRlIl19LHsiYXBpR3JvdXBzIjpbImF1dGhvcml6YXRpb24uazhzLmlvIl0sInJlc291cmNlcyI6WyJzdWJqZWN0YWNjZXNzcmV2aWV3cyJdLCJ2ZXJicyI6WyJjcmVhdGUiXX1dLCJzZXJ2aWNlQWNjb3VudE5hbWUiOiJkZWZhdWx0In1dLCJkZXBsb3ltZW50cyI6W3sibmFtZSI6IndlYmhvb2stb3BlcmF0b3Itd2ViaG9vayIsInNwZWMiOnsicmVwbGljYXMiOjEsInNlbGVjdG9yIjp7Im1hdGNoTGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInN0cmF0ZWd5Ijp7fSwidGVtcGxhdGUiOnsibWV0YWRhdGEiOnsibGFiZWxzIjp7ImNvbnRyb2wtcGxhbmUiOiJjb250cm9sbGVyLW1hbmFnZXIifX0sInNwZWMiOnsiY29udGFpbmVycyI6W3siYXJncyI6WyItLXNlY3VyZS1saXN0ZW4tYWRkcmVzcz0wLjAuMC4wOjg0NDMiLCItLXVwc3RyZWFtPWh0dHA6Ly8xMjcuMC4wLjE6ODA4MC8iLCItLWxvZ3Rvc3RkZXJyPXRydWUiLCItLXY9MTAiXSwiaW1hZ2UiOiJnY3IuaW8va3ViZWJ1aWxkZXIva3ViZS1yYmFjLXByb3h5OnYwLjUuMCIsIm5hbWUiOiJrdWJlLXJiYWMtcHJveHkiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6ODQ0MywibmFtZSI6Imh0dHBzIn1dLCJyZXNvdXJjZXMiOnt9fSx7ImFyZ3MiOlsiLS1tZXRyaWNzLWFkZHI9MTI3LjAuMC4xOjgwODAiLCItLWVuYWJsZS1sZWFkZXItZWxlY3Rpb24iXSwiY29tbWFuZCI6WyIvbWFuYWdlciJdLCJpbWFnZSI6InF1YXkuaW8vb2xtdGVzdC93ZWJob29rLW9wZXJhdG9yOjAuMC4zIiwibmFtZSI6Im1hbmFnZXIiLCJwb3J0cyI6W3siY29udGFpbmVyUG9ydCI6OTQ0MywibmFtZSI6IndlYmhvb2stc2VydmVyIiwicHJvdG9jb2wiOiJUQ1AifV0sInJlc291cmNlcyI6eyJsaW1pdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjMwTWkifSwicmVxdWVzdHMiOnsiY3B1IjoiMTAwbSIsIm1lbW9yeSI6IjIwTWkifX19XSwidGVybWluYXRpb25HcmFjZVBlcmlvZFNlY29uZHMiOjEwfX19fV0sInBlcm1pc3Npb25zIjpbeyJydWxlcyI6W3siYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiY29uZmlnbWFwcyJdLCJ2ZXJicyI6WyJnZXQiLCJsaXN0Iiwid2F0Y2giLCJjcmVhdGUiLCJ1cGRhdGUiLCJwYXRjaCIsImRlbGV0ZSJdfSx7ImFwaUdyb3VwcyI6WyIiXSwicmVzb3VyY2VzIjpbImNvbmZpZ21hcHMvc3RhdHVzIl0sInZlcmJzIjpbImdldCIsInVwZGF0ZSIsInBhdGNoIl19LHsiYXBpR3JvdXBzIjpbIiJdLCJyZXNvdXJjZXMiOlsiZXZlbnRzIl0sInZlcmJzIjpbImNyZWF0ZSJdfV0sInNlcnZpY2VBY2NvdW50TmFtZSI6ImRlZmF1bHQifV19LCJzdHJhdGVneSI6ImRlcGxveW1lbnQifSwiaW5zdGFsbE1vZGVzIjpbeyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiT3duTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiU2luZ2xlTmFtZXNwYWNlIn0seyJzdXBwb3J0ZWQiOmZhbHNlLCJ0eXBlIjoiTXVsdGlOYW1lc3BhY2UifSx7InN1cHBvcnRlZCI6dHJ1ZSwidHlwZSI6IkFsbE5hbWVzcGFjZXMifV0sImtleXdvcmRzIjpbIndlYmhvb2stb3BlcmF0b3IiXSwibGlua3MiOlt7Im5hbWUiOiJXZWJob29rIE9wZXJhdG9yIiwidXJsIjoiaHR0cHM6Ly93ZWJob29rLW9wZXJhdG9yLmRvbWFpbiJ9XSwibWFpbnRhaW5lcnMiOlt7ImVtYWlsIjoieW91ckBlbWFpbC5jb20iLCJuYW1lIjoiTWFpbnRhaW5lciBOYW1lIn1dLCJtYXR1cml0eSI6ImFscGhhIiwicHJvdmlkZXIiOnsibmFtZSI6IlByb3ZpZGVyIE5hbWUiLCJ1cmwiOiJodHRwczovL3lvdXIuZG9tYWluIn0sInZlcnNpb24iOiIwLjAuMSIsIndlYmhvb2tkZWZpbml0aW9ucyI6W3siYWRtaXNzaW9uUmV2aWV3VmVyc2lvbnMiOlsidjFiZXRhMSIsInYxIl0sImNvbnRhaW5lclBvcnQiOjQ0MywiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6InZ3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiVmFsaWRhdGluZ0FkbWlzc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii92YWxpZGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImRlcGxveW1lbnROYW1lIjoid2ViaG9vay1vcGVyYXRvci13ZWJob29rIiwiZmFpbHVyZVBvbGljeSI6IkZhaWwiLCJnZW5lcmF0ZU5hbWUiOiJtd2ViaG9va3Rlc3Qua2IuaW8iLCJydWxlcyI6W3siYXBpR3JvdXBzIjpbIndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJdLCJhcGlWZXJzaW9ucyI6WyJ2MSJdLCJvcGVyYXRpb25zIjpbIkNSRUFURSIsIlVQREFURSJdLCJyZXNvdXJjZXMiOlsid2ViaG9va3Rlc3RzIl19XSwic2lkZUVmZmVjdHMiOiJOb25lIiwidGFyZ2V0UG9ydCI6NDM0MywidHlwZSI6Ik11dGF0aW5nQWRtaXNzaW9uV2ViaG9vayIsIndlYmhvb2tQYXRoIjoiL211dGF0ZS13ZWJob29rLW9wZXJhdG9ycy1jb3Jlb3MtaW8tdjEtd2ViaG9va3Rlc3QifSx7ImFkbWlzc2lvblJldmlld1ZlcnNpb25zIjpbInYxYmV0YTEiLCJ2MSJdLCJjb250YWluZXJQb3J0Ijo0NDMsImNvbnZlcnNpb25DUkRzIjpbIndlYmhvb2t0ZXN0cy53ZWJob29rLm9wZXJhdG9ycy5jb3Jlb3MuaW8iXSwiZGVwbG95bWVudE5hbWUiOiJ3ZWJob29rLW9wZXJhdG9yLXdlYmhvb2siLCJmYWlsdXJlUG9saWN5IjoiRmFpbCIsImdlbmVyYXRlTmFtZSI6ImN3ZWJob29rdGVzdC5rYi5pbyIsInJ1bGVzIjpbeyJhcGlHcm91cHMiOlsid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIl0sImFwaVZlcnNpb25zIjpbInYxIl0sIm9wZXJhdGlvbnMiOlsiQ1JFQVRFIiwiVVBEQVRFIl0sInJlc291cmNlcyI6WyJ3ZWJob29rdGVzdHMiXX1dLCJzaWRlRWZmZWN0cyI6Ik5vbmUiLCJ0YXJnZXRQb3J0Ijo0MzQzLCJ0eXBlIjoiQ29udmVyc2lvbldlYmhvb2siLCJ3ZWJob29rUGF0aCI6Ii9jb252ZXJ0In1dfX0="
- }
- },
- {
- "type": "olm.bundle.object",
- "value": {
- "data": "eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjFiZXRhMSIsImtpbmQiOiJDdXN0b21SZXNvdXJjZURlZmluaXRpb24iLCJtZXRhZGF0YSI6eyJhbm5vdGF0aW9ucyI6eyJjb250cm9sbGVyLWdlbi5rdWJlYnVpbGRlci5pby92ZXJzaW9uIjoidjAuMy4wIn0sImNyZWF0aW9uVGltZXN0YW1wIjpudWxsLCJuYW1lIjoid2ViaG9va3Rlc3RzLndlYmhvb2sub3BlcmF0b3JzLmNvcmVvcy5pbyJ9LCJzcGVjIjp7Imdyb3VwIjoid2ViaG9vay5vcGVyYXRvcnMuY29yZW9zLmlvIiwibmFtZXMiOnsia2luZCI6IldlYmhvb2tUZXN0IiwibGlzdEtpbmQiOiJXZWJob29rVGVzdExpc3QiLCJwbHVyYWwiOiJ3ZWJob29rdGVzdHMiLCJzaW5ndWxhciI6IndlYmhvb2t0ZXN0In0sInByZXNlcnZlVW5rbm93bkZpZWxkcyI6ZmFsc2UsInNjb3BlIjoiTmFtZXNwYWNlZCIsInZlcnNpb24iOiJ2MSIsInZlcnNpb25zIjpbeyJuYW1lIjoidjEiLCJzY2hlbWEiOnsib3BlbkFQSVYzU2NoZW1hIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3QgaXMgdGhlIFNjaGVtYSBmb3IgdGhlIHdlYmhvb2t0ZXN0cyBBUEkiLCJwcm9wZXJ0aWVzIjp7ImFwaVZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJBUElWZXJzaW9uIGRlZmluZXMgdGhlIHZlcnNpb25lZCBzY2hlbWEgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuIFNlcnZlcnMgc2hvdWxkIGNvbnZlcnQgcmVjb2duaXplZCBzY2hlbWFzIHRvIHRoZSBsYXRlc3QgaW50ZXJuYWwgdmFsdWUsIGFuZCBtYXkgcmVqZWN0IHVucmVjb2duaXplZCB2YWx1ZXMuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjcmVzb3VyY2VzIiwidHlwZSI6InN0cmluZyJ9LCJraW5kIjp7ImRlc2NyaXB0aW9uIjoiS2luZCBpcyBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIFJFU1QgcmVzb3VyY2UgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4gU2VydmVycyBtYXkgaW5mZXIgdGhpcyBmcm9tIHRoZSBlbmRwb2ludCB0aGUgY2xpZW50IHN1Ym1pdHMgcmVxdWVzdHMgdG8uIENhbm5vdCBiZSB1cGRhdGVkLiBJbiBDYW1lbENhc2UuIE1vcmUgaW5mbzogaHR0cHM6Ly9naXQuazhzLmlvL2NvbW11bml0eS9jb250cmlidXRvcnMvZGV2ZWwvc2lnLWFyY2hpdGVjdHVyZS9hcGktY29udmVudGlvbnMubWQjdHlwZXMta2luZHMiLCJ0eXBlIjoic3RyaW5nIn0sIm1ldGFkYXRhIjp7InR5cGUiOiJvYmplY3QifSwic3BlYyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3BlYyBkZWZpbmVzIHRoZSBkZXNpcmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwicHJvcGVydGllcyI6eyJtdXRhdGUiOnsiZGVzY3JpcHRpb24iOiJNdXRhdGUgaXMgYSBmaWVsZCB0aGF0IHdpbGwgYmUgc2V0IHRvIHRydWUgYnkgdGhlIG11dGF0aW5nIHdlYmhvb2suIiwidHlwZSI6ImJvb2xlYW4ifSwidmFsaWQiOnsiZGVzY3JpcHRpb24iOiJWYWxpZCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIHRoZSB2YWxpZGF0aW9uIHdlYmhvb2sgd2lsbCByZWplY3QgdGhlIHJlc291cmNlLiIsInR5cGUiOiJib29sZWFuIn19LCJyZXF1aXJlZCI6WyJ2YWxpZCJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjp0cnVlfSx7Im5hbWUiOiJ2MiIsInNjaGVtYSI6eyJvcGVuQVBJVjNTY2hlbWEiOnsiZGVzY3JpcHRpb24iOiJXZWJob29rVGVzdCBpcyB0aGUgU2NoZW1hIGZvciB0aGUgd2ViaG9va3Rlc3RzIEFQSSIsInByb3BlcnRpZXMiOnsiYXBpVmVyc2lvbiI6eyJkZXNjcmlwdGlvbiI6IkFQSVZlcnNpb24gZGVmaW5lcyB0aGUgdmVyc2lvbmVkIHNjaGVtYSBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gU2VydmVycyBzaG91bGQgY29udmVydCByZWNvZ25pemVkIHNjaGVtYXMgdG8gdGhlIGxhdGVzdCBpbnRlcm5hbCB2YWx1ZSwgYW5kIG1heSByZWplY3QgdW5yZWNvZ25pemVkIHZhbHVlcy4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCNyZXNvdXJjZXMiLCJ0eXBlIjoic3RyaW5nIn0sImtpbmQiOnsiZGVzY3JpcHRpb24iOiJLaW5kIGlzIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgUkVTVCByZXNvdXJjZSB0aGlzIG9iamVjdCByZXByZXNlbnRzLiBTZXJ2ZXJzIG1heSBpbmZlciB0aGlzIGZyb20gdGhlIGVuZHBvaW50IHRoZSBjbGllbnQgc3VibWl0cyByZXF1ZXN0cyB0by4gQ2Fubm90IGJlIHVwZGF0ZWQuIEluIENhbWVsQ2FzZS4gTW9yZSBpbmZvOiBodHRwczovL2dpdC5rOHMuaW8vY29tbXVuaXR5L2NvbnRyaWJ1dG9ycy9kZXZlbC9zaWctYXJjaGl0ZWN0dXJlL2FwaS1jb252ZW50aW9ucy5tZCN0eXBlcy1raW5kcyIsInR5cGUiOiJzdHJpbmcifSwibWV0YWRhdGEiOnsidHlwZSI6Im9iamVjdCJ9LCJzcGVjIjp7ImRlc2NyaXB0aW9uIjoiV2ViaG9va1Rlc3RTcGVjIGRlZmluZXMgdGhlIGRlc2lyZWQgc3RhdGUgb2YgV2ViaG9va1Rlc3QiLCJwcm9wZXJ0aWVzIjp7ImNvbnZlcnNpb24iOnsiZGVzY3JpcHRpb24iOiJDb252ZXJzaW9uIGlzIGFuIGV4YW1wbGUgZmllbGQgb2YgV2ViaG9va1Rlc3QuIEVkaXQgV2ViaG9va1Rlc3RfdHlwZXMuZ28gdG8gcmVtb3ZlL3VwZGF0ZSIsInByb3BlcnRpZXMiOnsibXV0YXRlIjp7ImRlc2NyaXB0aW9uIjoiTXV0YXRlIGlzIGEgZmllbGQgdGhhdCB3aWxsIGJlIHNldCB0byB0cnVlIGJ5IHRoZSBtdXRhdGluZyB3ZWJob29rLiIsInR5cGUiOiJib29sZWFuIn0sInZhbGlkIjp7ImRlc2NyaXB0aW9uIjoiVmFsaWQgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciB0aGUgdmFsaWRhdGlvbiB3ZWJob29rIHdpbGwgcmVqZWN0IHRoZSByZXNvdXJjZS4iLCJ0eXBlIjoiYm9vbGVhbiJ9fSwicmVxdWlyZWQiOlsidmFsaWQiXSwidHlwZSI6Im9iamVjdCJ9fSwicmVxdWlyZWQiOlsiY29udmVyc2lvbiJdLCJ0eXBlIjoib2JqZWN0In0sInN0YXR1cyI6eyJkZXNjcmlwdGlvbiI6IldlYmhvb2tUZXN0U3RhdHVzIGRlZmluZXMgdGhlIG9ic2VydmVkIHN0YXRlIG9mIFdlYmhvb2tUZXN0IiwidHlwZSI6Im9iamVjdCJ9fSwidHlwZSI6Im9iamVjdCJ9fSwic2VydmVkIjp0cnVlLCJzdG9yYWdlIjpmYWxzZX1dfSwic3RhdHVzIjp7ImFjY2VwdGVkTmFtZXMiOnsia2luZCI6IiIsInBsdXJhbCI6IiJ9LCJjb25kaXRpb25zIjpbXSwic3RvcmVkVmVyc2lvbnMiOltdfX0="
+ "annotations": {
+ "alm-examples": "[\n {\n \"apiVersion\": \"webhook.operators.coreos.io/v1\",\n \"kind\": \"WebhookTest\",\n \"metadata\": {\n \"name\": \"webhooktest-sample\",\n \"namespace\": \"webhook-operator-system\"\n },\n \"spec\": {\n \"valid\": true\n }\n }\n]",
+ "capabilities": "Basic Install",
+ "operators.operatorframework.io/builder": "operator-sdk-v1.0.0",
+ "operators.operatorframework.io/project_layout": "go"
+ },
+ "apiServiceDefinitions": {},
+ "crdDescriptions": {
+ "owned": [
+ {
+ "name": "webhooktests.webhook.operators.coreos.io",
+ "version": "v1",
+ "kind": "WebhookTest"
+ }
+ ]
+ },
+ "description": "Webhook Operator description. TODO.",
+ "displayName": "Webhook Operator",
+ "installModes": [
+ {
+ "type": "OwnNamespace",
+ "supported": false
+ },
+ {
+ "type": "SingleNamespace",
+ "supported": false
+ },
+ {
+ "type": "MultiNamespace",
+ "supported": false
+ },
+ {
+ "type": "AllNamespaces",
+ "supported": true
+ }
+ ],
+ "keywords": [
+ "webhook-operator"
+ ],
+ "links": [
+ {
+ "name": "Webhook Operator",
+ "url": "https://webhook-operator.domain"
+ }
+ ],
+ "maintainers": [
+ {
+ "name": "Maintainer Name",
+ "email": "your@email.com"
+ }
+ ],
+ "maturity": "alpha",
+ "provider": {
+ "name": "Provider Name",
+ "url": "https://your.domain"
+ }
}
}
],
@@ -869,11 +971,7 @@ func TestRawBuilder(t *testing.T) {
name: "successful raw build yaml output",
validate: true,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -904,11 +1002,7 @@ func TestRawBuilder(t *testing.T) {
name: "successful raw build json output",
validate: true,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "json",
}),
templateDefinition: TemplateDefinition{
@@ -939,11 +1033,7 @@ func TestRawBuilder(t *testing.T) {
name: "invalid template configuration",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -962,11 +1052,7 @@ func TestRawBuilder(t *testing.T) {
name: "invalid output type",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "invalid",
}),
templateDefinition: TemplateDefinition{
@@ -985,11 +1071,7 @@ func TestRawBuilder(t *testing.T) {
name: "invalid schema",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1005,11 +1087,7 @@ func TestRawBuilder(t *testing.T) {
name: "template config has empty input",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1030,11 +1108,7 @@ func TestRawBuilder(t *testing.T) {
name: "template config has empty output",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1055,11 +1129,7 @@ func TestRawBuilder(t *testing.T) {
name: "template config has empty input & output",
validate: false,
rawBuilder: NewRawBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1077,7 +1147,6 @@ func TestRawBuilder(t *testing.T) {
}
for i, tc := range testCases {
- tc.rawBuilder.builderCfg.InputDirectory = testDir
t.Run(tc.name, func(t *testing.T) {
outDir := fmt.Sprintf("raw-%d", i)
outPath := path.Join(testDir, outDir)
@@ -1107,7 +1176,7 @@ func TestRawBuilder(t *testing.T) {
tc.buildAssertions(t, outPath, buildErr)
if tc.validate {
- validateErr := tc.rawBuilder.Validate(outDir)
+ validateErr := tc.rawBuilder.Validate(context.Background(), outDir)
tc.validateAssertions(t, validateErr)
}
})
@@ -1313,11 +1382,7 @@ func TestCustomBuilder(t *testing.T) {
name: "successful custom build yaml output",
validate: true,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1348,11 +1413,7 @@ func TestCustomBuilder(t *testing.T) {
name: "successful custom build json output",
validate: true,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "json",
}),
templateDefinition: TemplateDefinition{
@@ -1383,11 +1444,7 @@ func TestCustomBuilder(t *testing.T) {
name: "invalid template configuration",
validate: false,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1406,11 +1463,7 @@ func TestCustomBuilder(t *testing.T) {
name: "invalid schema",
validate: false,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1430,11 +1483,7 @@ func TestCustomBuilder(t *testing.T) {
name: "template config has empty command",
validate: false,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1456,11 +1505,7 @@ func TestCustomBuilder(t *testing.T) {
name: "template config has empty output",
validate: false,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1482,11 +1527,7 @@ func TestCustomBuilder(t *testing.T) {
name: "template config has empty command & output",
validate: false,
customBuilder: NewCustomBuilder(BuilderConfig{
- ContainerCfg: ContainerConfig{
- ContainerTool: "docker",
- BaseImage: "quay.io/operator-framework/opm:latest",
- WorkingDir: testDir,
- },
+ WorkingDir: testDir,
OutputType: "yaml",
}),
templateDefinition: TemplateDefinition{
@@ -1505,7 +1546,6 @@ func TestCustomBuilder(t *testing.T) {
}
for i, tc := range testCases {
- tc.customBuilder.builderCfg.InputDirectory = testDir
t.Run(tc.name, func(t *testing.T) {
outDir := fmt.Sprintf("custom-%d", i)
outPath := path.Join(testDir, outDir)
@@ -1535,7 +1575,7 @@ func TestCustomBuilder(t *testing.T) {
tc.buildAssertions(t, outPath, buildErr)
if tc.validate {
- validateErr := tc.customBuilder.Validate(outDir)
+ validateErr := tc.customBuilder.Validate(context.Background(), outDir)
tc.validateAssertions(t, validateErr)
}
})
@@ -1719,7 +1759,7 @@ const customBuiltFbcJson = `{
`
func TestValidateFailure(t *testing.T) {
- err := validate(ContainerConfig{}, "")
+ err := validate(context.Background(), BuilderConfig{}, "")
require.Error(t, err)
require.Contains(t, err.Error(), "no such file or directory")
}
diff --git a/staging/operator-registry/alpha/template/composite/composite.go b/staging/operator-registry/alpha/template/composite/composite.go
index 422017c974..68d261994b 100644
--- a/staging/operator-registry/alpha/template/composite/composite.go
+++ b/staging/operator-registry/alpha/template/composite/composite.go
@@ -2,35 +2,139 @@ package composite
import (
"context"
+ "encoding/json"
"fmt"
+ "io"
+ "net/http"
+ "net/url"
+ "os"
"github.com/operator-framework/operator-registry/pkg/image"
+ "k8s.io/apimachinery/pkg/util/yaml"
)
type BuilderMap map[string]Builder
type CatalogBuilderMap map[string]BuilderMap
+type builderFunc func(BuilderConfig) Builder
+
type Template struct {
- CatalogBuilders CatalogBuilderMap
- Registry image.Registry
+ catalogFile io.Reader
+ contributionFile io.Reader
+ validate bool
+ outputType string
+ registry image.Registry
+ registeredBuilders map[string]builderFunc
+}
+
+type TemplateOption func(t *Template)
+
+func WithCatalogFile(catalogFile io.Reader) TemplateOption {
+ return func(t *Template) {
+ t.catalogFile = catalogFile
+ }
+}
+
+func WithContributionFile(contribFile io.Reader) TemplateOption {
+ return func(t *Template) {
+ t.contributionFile = contribFile
+ }
+}
+
+func WithOutputType(outputType string) TemplateOption {
+ return func(t *Template) {
+ t.outputType = outputType
+ }
+}
+
+func WithRegistry(reg image.Registry) TemplateOption {
+ return func(t *Template) {
+ t.registry = reg
+ }
+}
+
+func WithValidate(validate bool) TemplateOption {
+ return func(t *Template) {
+ t.validate = validate
+ }
+}
+
+func NewTemplate(opts ...TemplateOption) *Template {
+ temp := &Template{
+ // Default registered builders when creating a new Template
+ registeredBuilders: map[string]builderFunc{
+ BasicBuilderSchema: func(bc BuilderConfig) Builder { return NewBasicBuilder(bc) },
+ SemverBuilderSchema: func(bc BuilderConfig) Builder { return NewSemverBuilder(bc) },
+ RawBuilderSchema: func(bc BuilderConfig) Builder { return NewRawBuilder(bc) },
+ CustomBuilderSchema: func(bc BuilderConfig) Builder { return NewCustomBuilder(bc) },
+ },
+ }
+
+ for _, opt := range opts {
+ opt(temp)
+ }
+
+ return temp
+}
+
+type HttpGetter interface {
+ Get(url string) (*http.Response, error)
+}
+
+// FetchCatalogConfig will fetch the catalog configuration file from the given path.
+// The path can be a local file path OR a URL that returns the raw contents of the catalog
+// configuration file.
+func FetchCatalogConfig(path string, httpGetter HttpGetter) (io.ReadCloser, error) {
+ var tempCatalog io.ReadCloser
+ catalogURI, err := url.ParseRequestURI(path)
+ if err != nil {
+ tempCatalog, err = os.Open(path)
+ if err != nil {
+ return nil, fmt.Errorf("opening catalog config file %q: %v", path, err)
+ }
+ } else {
+ tempResp, err := httpGetter.Get(catalogURI.String())
+ if err != nil {
+ return nil, fmt.Errorf("fetching remote catalog config file %q: %v", path, err)
+ }
+ tempCatalog = tempResp.Body
+ }
+
+ return tempCatalog, nil
}
// TODO(everettraven): do we need the context here? If so, how should it be used?
-func (t *Template) Render(ctx context.Context, config *CompositeConfig, validate bool) error {
+func (t *Template) Render(ctx context.Context, validate bool) error {
+
+ catalogFile, err := t.parseCatalogsSpec()
+ if err != nil {
+ return err
+ }
+
+ contributionFile, err := t.parseContributionSpec()
+ if err != nil {
+ return err
+ }
+
+ catalogBuilderMap, err := t.newCatalogBuilderMap(catalogFile.Catalogs, t.outputType)
+ if err != nil {
+ return err
+ }
+
// TODO(everettraven): should we return aggregated errors?
- for _, component := range config.Components {
- if builderMap, ok := t.CatalogBuilders[component.Name]; ok {
+ for _, component := range contributionFile.Components {
+ if builderMap, ok := (*catalogBuilderMap)[component.Name]; ok {
if builder, ok := builderMap[component.Strategy.Template.Schema]; ok {
// run the builder corresponding to the schema
- err := builder.Build(ctx, t.Registry, component.Destination.Path, component.Strategy.Template)
+ err := builder.Build(ctx, t.registry, component.Destination.Path, component.Strategy.Template)
if err != nil {
return fmt.Errorf("building component %q: %w", component.Name, err)
}
if validate {
// run the validation for the builder
- err = builder.Validate(component.Destination.Path)
+ err = builder.Validate(ctx, component.Destination.Path)
if err != nil {
return fmt.Errorf("validating component %q: %w", component.Name, err)
}
@@ -40,7 +144,7 @@ func (t *Template) Render(ctx context.Context, config *CompositeConfig, validate
}
} else {
allowedComponents := []string{}
- for k := range t.CatalogBuilders {
+ for k := range *catalogBuilderMap {
allowedComponents = append(allowedComponents, k)
}
return fmt.Errorf("building component %q: component does not exist in the catalog configuration. Available components are: %s", component.Name, allowedComponents)
@@ -48,3 +152,111 @@ func (t *Template) Render(ctx context.Context, config *CompositeConfig, validate
}
return nil
}
+
+func (t *Template) builderForSchema(schema string, builderCfg BuilderConfig) (Builder, error) {
+ builderFunc, ok := t.registeredBuilders[schema]
+ if !ok {
+ return nil, fmt.Errorf("unknown schema %q", schema)
+ }
+
+ return builderFunc(builderCfg), nil
+}
+
+func (t *Template) parseCatalogsSpec() (*CatalogConfig, error) {
+
+ // get catalog configurations
+ catalogConfig := &CatalogConfig{}
+ catalogDoc := json.RawMessage{}
+ catalogDecoder := yaml.NewYAMLOrJSONDecoder(t.catalogFile, 4096)
+ err := catalogDecoder.Decode(&catalogDoc)
+ if err != nil {
+ return nil, fmt.Errorf("decoding catalog config: %v", err)
+ }
+ err = json.Unmarshal(catalogDoc, catalogConfig)
+ if err != nil {
+ return nil, fmt.Errorf("unmarshalling catalog config: %v", err)
+ }
+
+ if catalogConfig.Schema != CatalogSchema {
+ return nil, fmt.Errorf("catalog configuration file has unknown schema, should be %q", CatalogSchema)
+ }
+
+ return catalogConfig, nil
+}
+
+func (t *Template) parseContributionSpec() (*CompositeConfig, error) {
+
+ // parse data to composite config
+ compositeConfig := &CompositeConfig{}
+ compositeDoc := json.RawMessage{}
+ compositeDecoder := yaml.NewYAMLOrJSONDecoder(t.contributionFile, 4096)
+ err := compositeDecoder.Decode(&compositeDoc)
+ if err != nil {
+ return nil, fmt.Errorf("decoding composite config: %v", err)
+ }
+ err = json.Unmarshal(compositeDoc, compositeConfig)
+ if err != nil {
+ return nil, fmt.Errorf("unmarshalling composite config: %v", err)
+ }
+
+ if compositeConfig.Schema != CompositeSchema {
+ return nil, fmt.Errorf("composite configuration file has unknown schema, should be %q", CompositeSchema)
+ }
+
+ return compositeConfig, nil
+}
+
+func (t *Template) newCatalogBuilderMap(catalogs []Catalog, outputType string) (*CatalogBuilderMap, error) {
+
+ catalogBuilderMap := make(CatalogBuilderMap)
+
+ // setup the builders for each catalog
+ setupFailed := false
+ setupErrors := map[string][]string{}
+ for _, catalog := range catalogs {
+ errs := []string{}
+ // if catalog.Destination.BaseImage == "" {
+ // errs = append(errs, "destination.baseImage must not be an empty string")
+ // }
+
+ if catalog.Destination.WorkingDir == "" {
+ errs = append(errs, "destination.workingDir must not be an empty string")
+ }
+
+ // check for validation errors and skip builder creation if there are any errors
+ if len(errs) > 0 {
+ setupFailed = true
+ setupErrors[catalog.Name] = errs
+ continue
+ }
+
+ if _, ok := catalogBuilderMap[catalog.Name]; !ok {
+ builderMap := make(BuilderMap)
+ for _, schema := range catalog.Builders {
+ builder, err := t.builderForSchema(schema, BuilderConfig{
+ OutputType: outputType,
+ })
+ if err != nil {
+ return nil, fmt.Errorf("getting builder %q for catalog %q: %v", schema, catalog.Name, err)
+ }
+ builderMap[schema] = builder
+ }
+ catalogBuilderMap[catalog.Name] = builderMap
+ }
+ }
+
+ // if there were errors validating the catalog configuration then exit
+ if setupFailed {
+ //build the error message
+ var errMsg string
+ for cat, errs := range setupErrors {
+ errMsg += fmt.Sprintf("\nCatalog %v:\n", cat)
+ for _, err := range errs {
+ errMsg += fmt.Sprintf(" - %v\n", err)
+ }
+ }
+ return nil, fmt.Errorf("catalog configuration file field validation failed: %s", errMsg)
+ }
+
+ return &catalogBuilderMap, nil
+}
diff --git a/staging/operator-registry/alpha/template/composite/composite_test.go b/staging/operator-registry/alpha/template/composite/composite_test.go
index c2b28fac7b..fb0212c414 100644
--- a/staging/operator-registry/alpha/template/composite/composite_test.go
+++ b/staging/operator-registry/alpha/template/composite/composite_test.go
@@ -2,44 +2,100 @@ package composite
import (
"context"
- "encoding/json"
- "errors"
"fmt"
+ "io"
+ "net/http"
+ "os"
+ "path"
+ "strings"
"testing"
"github.com/operator-framework/operator-registry/pkg/image"
"github.com/stretchr/testify/require"
)
-type TestBuilder struct {
- buildError bool
- validateError bool
-}
+var _ Builder = &TestBuilder{}
-const buildErr = "TestBuilder Build() error"
-const validateErr = "TestBuilder Validate() error"
+var TestBuilderSchema = "olm.builder.test"
-var _ Builder = &TestBuilder{}
+type TestBuilder struct {
+ buildShouldError bool
+ validateShouldError bool
+}
-func (tb *TestBuilder) Build(ctx context.Context, reg image.Registry, dir string, vd TemplateDefinition) error {
- if tb.buildError {
- return errors.New(buildErr)
+func (tb *TestBuilder) Build(ctx context.Context, reg image.Registry, dir string, td TemplateDefinition) error {
+ if tb.buildShouldError {
+ return fmt.Errorf("build error!")
}
return nil
}
-func (tb *TestBuilder) Validate(dir string) error {
- if tb.validateError {
- return errors.New(validateErr)
+func (tb *TestBuilder) Validate(ctx context.Context, dir string) error {
+ if tb.validateShouldError {
+ return fmt.Errorf("validate error!")
}
return nil
}
+var renderValidCatalog = `
+schema: olm.composite.catalogs
+catalogs:
+ - name: first-catalog
+ destination:
+ workingDir: contributions/first-catalog
+ builders:
+ - olm.builder.test
+`
+
+var renderValidComposite = `
+schema: olm.composite
+components:
+ - name: first-catalog
+ destination:
+ path: my-operator
+ strategy:
+ name: test
+ template:
+ schema: olm.builder.test
+ config:
+ input: components/contribution1.yaml
+ output: catalog.yaml
+`
+
+var renderInvalidComponentComposite = `
+schema: olm.composite
+components:
+ - name: missing-catalog
+ destination:
+ path: my-operator
+ strategy:
+ name: test
+ template:
+ schema: olm.builder.test
+ config:
+ input: components/contribution1.yaml
+ output: catalog.yaml
+`
+
+var renderInvalidBuilderComposite = `
+schema: olm.composite
+components:
+ - name: first-catalog
+ destination:
+ path: my-operator
+ strategy:
+ name: test
+ template:
+ schema: olm.builder.invalid
+ config:
+ input: components/contribution1.yaml
+ output: catalog.yaml
+`
+
func TestCompositeRender(t *testing.T) {
type testCase struct {
name string
compositeTemplate Template
- compositeCfg CompositeConfig
validate bool
assertions func(t *testing.T, err error)
}
@@ -49,28 +105,10 @@ func TestCompositeRender(t *testing.T) {
name: "successful render",
validate: true,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{},
- },
- },
- },
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "testcatalog",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.test",
- Config: json.RawMessage{},
- },
- },
- },
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderValidComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{} },
},
},
assertions: func(t *testing.T, err error) {
@@ -78,181 +116,499 @@ func TestCompositeRender(t *testing.T) {
},
},
{
- name: "component not in catalog config",
+ name: "Component build failure",
validate: true,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{},
- },
- },
- },
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "invalid",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.test",
- Config: json.RawMessage{},
- },
- },
- },
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderValidComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{buildShouldError: true} },
},
},
assertions: func(t *testing.T, err error) {
require.Error(t, err)
- expectedErr := fmt.Sprintf("building component %q: component does not exist in the catalog configuration. Available components are: %s", "invalid", []string{"testcatalog"})
- require.Equal(t, expectedErr, err.Error())
+ require.Equal(t, "building component \"first-catalog\": build error!", err.Error())
},
},
{
- name: "builder not in catalog config",
+ name: "Component validate failure",
validate: true,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{},
- },
- },
- },
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "testcatalog",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.invalid",
- Config: json.RawMessage{},
- },
- },
- },
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderValidComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{validateShouldError: true} },
},
},
assertions: func(t *testing.T, err error) {
require.Error(t, err)
- expectedErr := fmt.Sprintf("building component %q: no builder found for template schema %q", "testcatalog", "olm.builder.invalid")
- require.Equal(t, expectedErr, err.Error())
+ require.Equal(t, "validating component \"first-catalog\": validate error!", err.Error())
},
},
{
- name: "build step error",
- validate: true,
+ name: "Skipping validation",
+ validate: false,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{buildError: true},
- },
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderValidComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{validateShouldError: true} },
},
},
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "testcatalog",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.test",
- Config: json.RawMessage{},
- },
- },
- },
+ assertions: func(t *testing.T, err error) {
+ // We are skipping validation so we shouldn't receive
+ // the validation error from the TestBuilder
+ require.NoError(t, err)
+ },
+ },
+ {
+ name: "component not in catalog config",
+ validate: true,
+ compositeTemplate: Template{
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderInvalidComponentComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{} },
},
},
assertions: func(t *testing.T, err error) {
require.Error(t, err)
- expectedErr := fmt.Sprintf("building component %q: %s", "testcatalog", buildErr)
+ expectedErr := fmt.Sprintf("building component %q: component does not exist in the catalog configuration. Available components are: %s", "missing-catalog", []string{"first-catalog"})
require.Equal(t, expectedErr, err.Error())
},
},
{
- name: "validate step error",
+ name: "builder not in catalog config",
validate: true,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{validateError: true},
- },
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(renderInvalidBuilderComposite),
+ registeredBuilders: map[string]builderFunc{
+ TestBuilderSchema: func(bc BuilderConfig) Builder { return &TestBuilder{} },
},
},
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "testcatalog",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.test",
- Config: json.RawMessage{},
- },
- },
- },
- },
+ assertions: func(t *testing.T, err error) {
+ require.Error(t, err)
+ require.Equal(t, "building component \"first-catalog\": no builder found for template schema \"olm.builder.invalid\"", err.Error())
+ },
+ },
+ {
+ name: "error parsing catalog spec",
+ validate: true,
+ compositeTemplate: Template{
+ catalogFile: strings.NewReader(invalidSchemaCatalog),
},
assertions: func(t *testing.T, err error) {
require.Error(t, err)
- expectedErr := fmt.Sprintf("validating component %q: %s", "testcatalog", validateErr)
- require.Equal(t, expectedErr, err.Error())
+ require.Equal(t, "catalog configuration file has unknown schema, should be \"olm.composite.catalogs\"", err.Error())
},
},
{
- name: "validation step skipped",
- validate: false,
+ name: "error parsing contribution spec",
+ validate: true,
compositeTemplate: Template{
- CatalogBuilders: CatalogBuilderMap{
- "testcatalog": BuilderMap{
- "olm.builder.test": &TestBuilder{validateError: true},
+ catalogFile: strings.NewReader(renderValidCatalog),
+ contributionFile: strings.NewReader(invalidSchemaComposite),
+ },
+ assertions: func(t *testing.T, err error) {
+ require.Error(t, err)
+ require.Equal(t, "composite configuration file has unknown schema, should be \"olm.composite\"", err.Error())
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ err := tc.compositeTemplate.Render(context.Background(), tc.validate)
+ tc.assertions(t, err)
+ })
+ }
+}
+
+func TestBuilderForSchema(t *testing.T) {
+ type testCase struct {
+ name string
+ builderSchema string
+ builderCfg BuilderConfig
+ assertions func(t *testing.T, builder Builder, err error)
+ }
+
+ testCases := []testCase{
+ {
+ name: "Basic Builder Schema",
+ builderSchema: BasicBuilderSchema,
+ builderCfg: BuilderConfig{},
+ assertions: func(t *testing.T, builder Builder, err error) {
+ require.NoError(t, err)
+ require.IsType(t, &BasicBuilder{}, builder)
+ },
+ },
+ {
+ name: "Semver Builder Schema",
+ builderSchema: SemverBuilderSchema,
+ builderCfg: BuilderConfig{},
+ assertions: func(t *testing.T, builder Builder, err error) {
+ require.NoError(t, err)
+ require.IsType(t, &SemverBuilder{}, builder)
+ },
+ },
+ {
+ name: "Raw Builder Schema",
+ builderSchema: RawBuilderSchema,
+ builderCfg: BuilderConfig{},
+ assertions: func(t *testing.T, builder Builder, err error) {
+ require.NoError(t, err)
+ require.IsType(t, &RawBuilder{}, builder)
+ },
+ },
+ {
+ name: "Custom Builder Schema",
+ builderSchema: CustomBuilderSchema,
+ builderCfg: BuilderConfig{},
+ assertions: func(t *testing.T, builder Builder, err error) {
+ require.NoError(t, err)
+ require.IsType(t, &CustomBuilder{}, builder)
+ },
+ },
+ {
+ name: "Invalid Builder Schema",
+ builderSchema: "invalid",
+ builderCfg: BuilderConfig{},
+ assertions: func(t *testing.T, builder Builder, err error) {
+ require.Error(t, err)
+ require.Equal(t, fmt.Sprintf("unknown schema %q", "invalid"), err.Error())
+ require.Nil(t, builder)
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ template := NewTemplate()
+ builder, err := template.builderForSchema(tc.builderSchema, tc.builderCfg)
+ tc.assertions(t, builder, err)
+ })
+ }
+
+}
+
+var validCatalog = `
+schema: olm.composite.catalogs
+catalogs:
+ - name: first-catalog
+ destination:
+ workingDir: contributions/first-catalog
+ builders:
+ - olm.builder.semver
+ - olm.builder.basic
+ - name: second-catalog
+ destination:
+ workingDir: contributions/second-catalog
+ builders:
+ - olm.builder.semver
+ - name: test-catalog
+ destination:
+ workingDir: contributions/test-catalog
+ builders:
+ - olm.builder.custom`
+
+var unmarshalFail = `
+invalid
+`
+
+var invalidSchemaCatalog = `
+schema: invalid
+catalogs:
+ - name: first-catalog
+ destination:
+ workingDir: contributions/first-catalog
+ builders:
+ - olm.builder.semver
+ - olm.builder.basic
+`
+
+func TestParseCatalogSpec(t *testing.T) {
+ type testCase struct {
+ name string
+ catalog string
+ assertions func(t *testing.T, catalog *CatalogConfig, err error)
+ }
+
+ testCases := []testCase{
+ {
+ name: "Valid catalog configuration",
+ catalog: validCatalog,
+ assertions: func(t *testing.T, catalog *CatalogConfig, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 3, len(catalog.Catalogs))
+ },
+ },
+ {
+ name: "Unmarshal failure",
+ catalog: unmarshalFail,
+ assertions: func(t *testing.T, catalog *CatalogConfig, err error) {
+ require.Error(t, err)
+ require.Equal(t, "unmarshalling catalog config: json: cannot unmarshal string into Go value of type composite.CatalogConfig", err.Error())
+ },
+ },
+ {
+ name: "Invalid schema",
+ catalog: invalidSchemaCatalog,
+ assertions: func(t *testing.T, catalog *CatalogConfig, err error) {
+ require.Error(t, err)
+ require.Equal(t, fmt.Sprintf("catalog configuration file has unknown schema, should be %q", CatalogSchema), err.Error())
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ template := NewTemplate(WithCatalogFile(strings.NewReader(tc.catalog)))
+ catalog, err := template.parseCatalogsSpec()
+ tc.assertions(t, catalog, err)
+ })
+ }
+}
+
+var validComposite = `
+schema: olm.composite
+components:
+ - name: first-catalog
+ destination:
+ path: my-operator
+ strategy:
+ name: semver
+ template:
+ schema: olm.builder.semver
+ config:
+ input: components/contribution1.yaml
+ output: catalog.yaml
+`
+
+var invalidSchemaComposite = `
+schema: invalid
+components:
+ - name: first-catalog
+ destination:
+ path: my-operator
+ strategy:
+ name: semver
+ template:
+ schema: olm.builder.semver
+ config:
+ input: components/contribution1.yaml
+ output: catalog.yaml
+`
+
+func TestParseContributionSpec(t *testing.T) {
+ type testCase struct {
+ name string
+ composite string
+ assertions func(t *testing.T, composite *CompositeConfig, err error)
+ }
+
+ testCases := []testCase{
+ {
+ name: "Valid composite",
+ composite: validComposite,
+ assertions: func(t *testing.T, composite *CompositeConfig, err error) {
+ require.NoError(t, err)
+ require.Equal(t, 1, len(composite.Components))
+ },
+ },
+ {
+ name: "Unmarshal failure",
+ composite: unmarshalFail,
+ assertions: func(t *testing.T, composite *CompositeConfig, err error) {
+ require.Error(t, err)
+ require.Equal(t, "unmarshalling composite config: json: cannot unmarshal string into Go value of type composite.CompositeConfig", err.Error())
+ },
+ },
+ {
+ name: "Invalid schema",
+ composite: invalidSchemaComposite,
+ assertions: func(t *testing.T, composite *CompositeConfig, err error) {
+ require.Error(t, err)
+ require.Equal(t, fmt.Sprintf("composite configuration file has unknown schema, should be %q", CompositeSchema), err.Error())
+ },
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ template := NewTemplate(WithContributionFile(strings.NewReader(tc.composite)))
+ contrib, err := template.parseContributionSpec()
+ tc.assertions(t, contrib, err)
+ })
+ }
+}
+
+func TestNewCatalogBuilderMap(t *testing.T) {
+ type testCase struct {
+ name string
+ catalogs []Catalog
+ assertions func(t *testing.T, builderMap *CatalogBuilderMap, err error)
+ }
+
+ testCases := []testCase{
+ {
+ name: "Valid Catalogs",
+ catalogs: []Catalog{
+ {
+ Name: "test-catalog",
+ Destination: CatalogDestination{
+ WorkingDir: "/",
+ // BaseImage: "base",
+ },
+ Builders: []string{
+ BasicBuilderSchema,
},
},
},
- compositeCfg: CompositeConfig{
- Schema: CompositeSchema,
- Components: []Component{
- {
- Name: "testcatalog",
- Destination: ComponentDestination{
- Path: "testcatalog/mypackage",
- },
- Strategy: BuildStrategy{
- Name: "testbuild",
- Template: TemplateDefinition{
- Schema: "olm.builder.test",
- Config: json.RawMessage{},
- },
- },
+ assertions: func(t *testing.T, builderMap *CatalogBuilderMap, err error) {
+ require.NoError(t, err)
+ //TODO: More assertions here
+ },
+ },
+ {
+ name: "Invalid Builder",
+ catalogs: []Catalog{
+ {
+ Name: "test-catalog",
+ Destination: CatalogDestination{
+ WorkingDir: "/",
+ // BaseImage: "base",
+ },
+ Builders: []string{
+ "invalid",
},
},
},
- assertions: func(t *testing.T, err error) {
- // the validate step would error but since
- // we are skipping it we expect no error to occur
+ assertions: func(t *testing.T, builderMap *CatalogBuilderMap, err error) {
+ require.Error(t, err)
+ require.Equal(t, "getting builder \"invalid\" for catalog \"test-catalog\": unknown schema \"invalid\"", err.Error())
+ },
+ },
+ // {
+ // name: "BaseImage+WorkingDir invalid",
+ // catalogs: []Catalog{
+ // {
+ // Name: "test-catalog",
+ // Destination: CatalogDestination{},
+ // Builders: []string{
+ // BasicBuilderSchema,
+ // },
+ // },
+ // },
+ // assertions: func(t *testing.T, builderMap *CatalogBuilderMap, err error) {
+ // require.Error(t, err)
+ // require.Equal(t, "catalog configuration file field validation failed: \nCatalog test-catalog:\n - destination.baseImage must not be an empty string\n - destination.workingDir must not be an empty string\n", err.Error())
+ // },
+ // },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ template := NewTemplate()
+ builderMap, err := template.newCatalogBuilderMap(tc.catalogs, "yaml")
+ tc.assertions(t, builderMap, err)
+ })
+ }
+}
+
+type fakeGetter struct {
+ catalog string
+ shouldError bool
+}
+
+func (fg *fakeGetter) Get(url string) (*http.Response, error) {
+ if fg.shouldError {
+ return nil, fmt.Errorf("error!")
+ }
+
+ return &http.Response{
+ Body: io.NopCloser(strings.NewReader(fg.catalog)),
+ }, nil
+}
+
+func TestFetchCatalogConfig(t *testing.T) {
+ type testCase struct {
+ name string
+ fakeGetter *fakeGetter
+ path string
+ createFile bool
+ assertions func(t *testing.T, rc io.ReadCloser, err error)
+ }
+
+ testCases := []testCase{
+ {
+ name: "Successful HTTP fetch",
+ path: "http://some-path.com",
+ fakeGetter: &fakeGetter{
+ catalog: validCatalog,
+ },
+ assertions: func(t *testing.T, rc io.ReadCloser, err error) {
+ require.NoError(t, err)
+ require.NotNil(t, rc)
+ },
+ },
+ {
+ name: "Failed HTTP fetch",
+ path: "http://some-path.com",
+ fakeGetter: &fakeGetter{
+ catalog: validCatalog,
+ shouldError: true,
+ },
+ assertions: func(t *testing.T, rc io.ReadCloser, err error) {
+ require.Error(t, err)
+ require.Equal(t, "fetching remote catalog config file \"http://some-path.com\": error!", err.Error())
+ },
+ },
+ // TODO: for some reason this is triggering the fakeGetter.Get() function instead of using os.Open()
+ {
+ name: "Successful file fetch",
+ path: "file/test.yaml",
+ fakeGetter: &fakeGetter{
+ catalog: validCatalog,
+ },
+ createFile: true,
+ assertions: func(t *testing.T, rc io.ReadCloser, err error) {
require.NoError(t, err)
+ require.NotNil(t, rc)
+ },
+ },
+ {
+ name: "Failed file fetch",
+ path: "file/test.yaml",
+ fakeGetter: &fakeGetter{
+ catalog: validCatalog,
+ },
+ createFile: false,
+ assertions: func(t *testing.T, rc io.ReadCloser, err error) {
+ require.Error(t, err)
+ require.Equal(t, "opening catalog config file \"file/test.yaml\": open file/test.yaml: no such file or directory", err.Error())
},
},
}
+ testDir := t.TempDir()
+
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
- err := tc.compositeTemplate.Render(context.Background(), &tc.compositeCfg, tc.validate)
- tc.assertions(t, err)
+ filepath := tc.path
+ if tc.createFile {
+ err := os.MkdirAll(path.Join(testDir, path.Dir(tc.path)), 0o777)
+ require.NoError(t, err)
+ file, err := os.Create(path.Join(testDir, tc.path))
+ require.NoError(t, err)
+ _, err = file.WriteString(tc.fakeGetter.catalog)
+ require.NoError(t, err)
+
+ filepath = path.Join(testDir, tc.path)
+ }
+
+ rc, err := FetchCatalogConfig(filepath, tc.fakeGetter)
+ tc.assertions(t, rc, err)
})
}
}
diff --git a/staging/operator-registry/alpha/template/composite/config.go b/staging/operator-registry/alpha/template/composite/config.go
index 70a480d4e8..21d4ac5ee0 100644
--- a/staging/operator-registry/alpha/template/composite/config.go
+++ b/staging/operator-registry/alpha/template/composite/config.go
@@ -37,6 +37,6 @@ type Catalog struct {
}
type CatalogDestination struct {
- BaseImage string
+ // BaseImage string
WorkingDir string
}
diff --git a/staging/operator-registry/alpha/template/semver/semver.go b/staging/operator-registry/alpha/template/semver/semver.go
index 8cf2412874..ec6b6829e7 100644
--- a/staging/operator-registry/alpha/template/semver/semver.go
+++ b/staging/operator-registry/alpha/template/semver/semver.go
@@ -74,17 +74,42 @@ func readFile(reader io.Reader) (*semverTemplate, error) {
return nil, err
}
- // default behavior is to generate only minor channels
- sv := semverTemplate{
- GenerateMajorChannels: false,
- GenerateMinorChannels: true,
- }
+ sv := semverTemplate{}
if err := yaml.UnmarshalStrict(data, &sv); err != nil {
return nil, err
}
+
if sv.Schema != schema {
return nil, fmt.Errorf("readFile: input file has unknown schema, should be %q", schema)
}
+
+ // if no generate option is selected, default to GenerateMinorChannels
+ if !sv.GenerateMajorChannels && !sv.GenerateMinorChannels {
+ sv.GenerateMinorChannels = true
+ }
+
+ // for default channel preference,
+ // if un-set, default to align to the selected generate option
+ // if set, error out if we mismatch the two
+ switch sv.DefaultChannelTypePreference {
+ case defaultStreamType:
+ if sv.GenerateMinorChannels {
+ sv.DefaultChannelTypePreference = minorStreamType
+ } else if sv.GenerateMajorChannels {
+ sv.DefaultChannelTypePreference = majorStreamType
+ }
+ case minorStreamType:
+ if !sv.GenerateMinorChannels {
+ return nil, fmt.Errorf("schema attribute mismatch: DefaultChannelTypePreference set to 'minor' doesn't make sense if not generating minor-version channels")
+ }
+ case majorStreamType:
+ if !sv.GenerateMajorChannels {
+ return nil, fmt.Errorf("schema attribute mismatch: DefaultChannelTypePreference set to 'major' doesn't make sense if not generating major-version channels")
+ }
+ default:
+ return nil, fmt.Errorf("unknown DefaultChannelTypePreference: %q\nValid values are 'major' or 'minor'", sv.DefaultChannelTypePreference)
+ }
+
return &sv, nil
}
@@ -240,8 +265,8 @@ func (sv *semverTemplate) generateChannels(semverChannels *bundleVersions) []dec
unlinkedChannels[cName] = ch
- hwcCandidate := highwaterChannel{archetype: archetype, version: bundles[bundleName], name: cName}
- if hwcCandidate.gt(&hwc) {
+ hwcCandidate := highwaterChannel{archetype: archetype, kind: cKey, version: bundles[bundleName], name: cName}
+ if hwcCandidate.gt(&hwc, sv.DefaultChannelTypePreference) {
hwc = hwcCandidate
}
}
@@ -419,3 +444,31 @@ func stripBuildMetadata(v semver.Version) string {
v.Build = nil
return v.String()
}
+
+// prefer (in descending order of preference):
+// - higher-rank archetype,
+// - semver version,
+// - a channel type matching the set preference, or
+// - a 'better' (higher value) channel type
+func (h *highwaterChannel) gt(ih *highwaterChannel, pref streamType) bool {
+ if channelPriorities[h.archetype] != channelPriorities[ih.archetype] {
+ return channelPriorities[h.archetype] > channelPriorities[ih.archetype]
+ }
+ if h.version.NE(ih.version) {
+ return h.version.GT(ih.version)
+ }
+ if h.kind != ih.kind {
+ if h.kind == pref {
+ return true
+ }
+ if ih.kind == pref {
+ return false
+ }
+ return h.kind.gt((*ih).kind)
+ }
+ return false
+}
+
+func (t streamType) gt(in streamType) bool {
+ return streamTypePriorities[t] > streamTypePriorities[in]
+}
diff --git a/staging/operator-registry/alpha/template/semver/semver_test.go b/staging/operator-registry/alpha/template/semver/semver_test.go
index 9d55579c31..8fe470b6e2 100644
--- a/staging/operator-registry/alpha/template/semver/semver_test.go
+++ b/staging/operator-registry/alpha/template/semver/semver_test.go
@@ -1,13 +1,15 @@
package semver
import (
+ "fmt"
"strings"
"testing"
"github.com/blang/semver/v4"
+ "github.com/stretchr/testify/require"
+
"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/alpha/property"
- "github.com/stretchr/testify/require"
)
func TestLinkChannels(t *testing.T) {
@@ -143,97 +145,195 @@ func TestGenerateChannels(t *testing.T) {
},
}
+ majorLinkedChannels := []declcfg.Channel{
+ {
+ Schema: "olm.channel",
+ Name: "stable-v0",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v0.1.0", Replaces: ""},
+ {Name: "a-v0.1.1", Replaces: "", Skips: []string{"a-v0.1.0"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v1",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v1.1.0", Replaces: "", Skips: []string{}},
+ {Name: "a-v1.2.1", Replaces: "a-v1.1.0", Skips: []string{}},
+ {Name: "a-v1.3.1-alpha", Replaces: ""},
+ {Name: "a-v1.3.1-beta", Replaces: ""},
+ {Name: "a-v1.3.1", Replaces: "a-v1.2.1", Skips: []string{"a-v1.1.0", "a-v1.3.1-alpha", "a-v1.3.1-beta"}},
+ {Name: "a-v1.4.1-beta1", Replaces: ""},
+ {Name: "a-v1.4.1-beta2", Replaces: ""},
+ {Name: "a-v1.4.1", Replaces: "a-v1.3.1", Skips: []string{"a-v1.1.0", "a-v1.2.1", "a-v1.3.1-alpha", "a-v1.3.1-beta", "a-v1.4.1-beta1", "a-v1.4.1-beta2"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v2",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v2.1.0", Replaces: ""},
+ {Name: "a-v2.1.1", Replaces: "", Skips: []string{"a-v2.1.0"}},
+ {Name: "a-v2.3.1", Replaces: ""},
+ {Name: "a-v2.3.2", Replaces: "a-v2.1.1", Skips: []string{"a-v2.1.0", "a-v2.3.1"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v3",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v3.1.0", Replaces: ""},
+ {Name: "a-v3.1.1", Replaces: "", Skips: []string{"a-v3.1.0"}},
+ },
+ },
+ }
+
+ minorLinkedChannels := []declcfg.Channel{
+ {
+ Schema: "olm.channel",
+ Name: "stable-v0.1",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v0.1.0", Replaces: ""},
+ {Name: "a-v0.1.1", Replaces: "", Skips: []string{"a-v0.1.0"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v1.1",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v1.1.0", Replaces: "", Skips: []string{}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v1.2",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v1.2.1", Replaces: "a-v1.1.0", Skips: []string{}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v1.3",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v1.3.1-alpha", Replaces: ""},
+ {Name: "a-v1.3.1-beta", Replaces: ""},
+ {Name: "a-v1.3.1", Replaces: "a-v1.2.1", Skips: []string{"a-v1.1.0", "a-v1.3.1-alpha", "a-v1.3.1-beta"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v1.4",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v1.4.1-beta1", Replaces: ""},
+ {Name: "a-v1.4.1-beta2", Replaces: ""},
+ {Name: "a-v1.4.1", Replaces: "a-v1.3.1", Skips: []string{"a-v1.1.0", "a-v1.2.1", "a-v1.3.1-alpha", "a-v1.3.1-beta", "a-v1.4.1-beta1", "a-v1.4.1-beta2"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v2.1",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v2.1.0", Replaces: ""},
+ {Name: "a-v2.1.1", Replaces: "", Skips: []string{"a-v2.1.0"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v2.3",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v2.3.1", Replaces: ""},
+ {Name: "a-v2.3.2", Replaces: "a-v2.1.1", Skips: []string{"a-v2.1.0", "a-v2.3.1"}},
+ },
+ },
+ {
+ Schema: "olm.channel",
+ Name: "stable-v3.1",
+ Package: "a",
+ Entries: []declcfg.ChannelEntry{
+ {Name: "a-v3.1.0", Replaces: ""},
+ {Name: "a-v3.1.1", Replaces: "", Skips: []string{"a-v3.1.0"}},
+ },
+ },
+ }
+
+ var combinedLinkedChannels []declcfg.Channel
+ combinedLinkedChannels = append(combinedLinkedChannels, minorLinkedChannels...)
+ combinedLinkedChannels = append(combinedLinkedChannels, majorLinkedChannels...)
+
tests := []struct {
name string
generateMinorChannels bool
generateMajorChannels bool
+ defaultChannel string
+ channelTypePreference streamType
out []declcfg.Channel
}{
{
name: "Edges between minor channels",
generateMinorChannels: true,
generateMajorChannels: false,
- out: []declcfg.Channel{
- {
- Schema: "olm.channel",
- Name: "stable-v0.1",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v0.1.0", Replaces: ""},
- {Name: "a-v0.1.1", Replaces: "", Skips: []string{"a-v0.1.0"}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v1.1",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v1.1.0", Replaces: "", Skips: []string{}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v1.2",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v1.2.1", Replaces: "a-v1.1.0", Skips: []string{}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v1.3",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v1.3.1-alpha", Replaces: ""},
- {Name: "a-v1.3.1-beta", Replaces: ""},
- {Name: "a-v1.3.1", Replaces: "a-v1.2.1", Skips: []string{"a-v1.1.0", "a-v1.3.1-alpha", "a-v1.3.1-beta"}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v1.4",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v1.4.1-beta1", Replaces: ""},
- {Name: "a-v1.4.1-beta2", Replaces: ""},
- {Name: "a-v1.4.1", Replaces: "a-v1.3.1", Skips: []string{"a-v1.1.0", "a-v1.2.1", "a-v1.3.1-alpha", "a-v1.3.1-beta", "a-v1.4.1-beta1", "a-v1.4.1-beta2"}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v2.1",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v2.1.0", Replaces: ""},
- {Name: "a-v2.1.1", Replaces: "", Skips: []string{"a-v2.1.0"}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v2.3",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v2.3.1", Replaces: ""},
- {Name: "a-v2.3.2", Replaces: "a-v2.1.1", Skips: []string{"a-v2.1.0", "a-v2.3.1"}},
- },
- },
- {
- Schema: "olm.channel",
- Name: "stable-v3.1",
- Package: "a",
- Entries: []declcfg.ChannelEntry{
- {Name: "a-v3.1.0", Replaces: ""},
- {Name: "a-v3.1.1", Replaces: "", Skips: []string{"a-v3.1.0"}},
- },
- },
- },
+ defaultChannel: "stable-v3.1",
+ channelTypePreference: minorStreamType,
+ out: minorLinkedChannels,
+ },
+ {
+ name: "No edges between major channels",
+ generateMinorChannels: false,
+ generateMajorChannels: true,
+ defaultChannel: "stable-v3",
+ channelTypePreference: majorStreamType,
+ out: majorLinkedChannels,
+ },
+ {
+ name: "Preference for minor default channel",
+ generateMinorChannels: true,
+ generateMajorChannels: true,
+ defaultChannel: "stable-v3.1",
+ channelTypePreference: minorStreamType,
+ out: combinedLinkedChannels,
+ },
+ {
+ name: "Preference for major default channel",
+ generateMinorChannels: true,
+ generateMajorChannels: true,
+ defaultChannel: "stable-v3",
+ channelTypePreference: majorStreamType,
+ out: combinedLinkedChannels,
+ },
+ {
+ name: "Mismatch generate/preference minor/major default channel",
+ generateMinorChannels: true,
+ generateMajorChannels: false,
+ defaultChannel: "stable-v3.1",
+ channelTypePreference: majorStreamType,
+ out: minorLinkedChannels,
+ },
+ {
+ name: "Mismatch generate/preference major/minor default channel",
+ generateMinorChannels: false,
+ generateMajorChannels: true,
+ defaultChannel: "stable-v3",
+ channelTypePreference: minorStreamType,
+ out: majorLinkedChannels,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- sv := &semverTemplate{GenerateMajorChannels: tt.generateMajorChannels, GenerateMinorChannels: tt.generateMinorChannels, pkg: "a"}
+ sv := &semverTemplate{GenerateMajorChannels: tt.generateMajorChannels, GenerateMinorChannels: tt.generateMinorChannels, pkg: "a", DefaultChannelTypePreference: tt.channelTypePreference}
require.ElementsMatch(t, tt.out, sv.generateChannels(&channelOperatorVersions))
+ require.Equal(t, tt.defaultChannel, sv.defaultChannel)
})
}
}
@@ -363,18 +463,12 @@ func TestBailOnVersionBuildMetadata(t *testing.T) {
}
func TestReadFile(t *testing.T) {
- type testCase struct {
- name string
- input string
- assertions func(*testing.T, *semverTemplate, error)
- }
- testCases := []testCase{
- {
- name: "valid",
- input: `---
+
+ templateFstr := `---
schema: olm.semver
-generateMajorChannels: true
-generateMinorChannels: true
+generateMajorChannels: %s
+generateMinorChannels: %s
+defaultChannelTypePreference: %s
candidate:
bundles:
- image: quay.io/foo/olm:testoperator.v0.1.0
@@ -398,7 +492,17 @@ fast:
stable:
bundles:
- image: quay.io/foo/olm:testoperator.v1.0.1
-`,
+`
+
+ type testCase struct {
+ name string
+ input string
+ assertions func(*testing.T, *semverTemplate, error)
+ }
+ testCases := []testCase{
+ {
+ name: "valid",
+ input: fmt.Sprintf(templateFstr, "true", "true", "minor"),
assertions: func(t *testing.T, template *semverTemplate, err error) {
require.NotNil(t, template)
require.NoError(t, err)
@@ -442,6 +546,30 @@ invalid:
require.EqualError(t, err, `error unmarshaling JSON: while decoding JSON: json: unknown field "invalid"`)
},
},
+ {
+ name: "generate/default mismatch, minor/major",
+ input: fmt.Sprintf(templateFstr, "true", "false", "minor"),
+ assertions: func(t *testing.T, template *semverTemplate, err error) {
+ require.Nil(t, template)
+ require.ErrorContains(t, err, "schema attribute mismatch")
+ },
+ },
+ {
+ name: "generate/default mismatch, major/minor",
+ input: fmt.Sprintf(templateFstr, "false", "true", "major"),
+ assertions: func(t *testing.T, template *semverTemplate, err error) {
+ require.Nil(t, template)
+ require.ErrorContains(t, err, "schema attribute mismatch")
+ },
+ },
+ {
+ name: "unknown defaultchanneltypepreference",
+ input: fmt.Sprintf(templateFstr, "false", "true", "foo"),
+ assertions: func(t *testing.T, template *semverTemplate, err error) {
+ require.Nil(t, template)
+ require.ErrorContains(t, err, "unknown DefaultChannelTypePreference")
+ },
+ },
}
for _, tc := range testCases {
diff --git a/staging/operator-registry/alpha/template/semver/types.go b/staging/operator-registry/alpha/template/semver/types.go
index de948f3723..de68504c65 100644
--- a/staging/operator-registry/alpha/template/semver/types.go
+++ b/staging/operator-registry/alpha/template/semver/types.go
@@ -24,12 +24,13 @@ type semverTemplateChannelBundles struct {
}
type semverTemplate struct {
- Schema string `json:"schema"`
- GenerateMajorChannels bool `json:"generateMajorChannels,omitempty"`
- GenerateMinorChannels bool `json:"generateMinorChannels,omitempty"`
- Candidate semverTemplateChannelBundles `json:"candidate,omitempty"`
- Fast semverTemplateChannelBundles `json:"fast,omitempty"`
- Stable semverTemplateChannelBundles `json:"stable,omitempty"`
+ Schema string `json:"schema"`
+ GenerateMajorChannels bool `json:"generateMajorChannels,omitempty"`
+ GenerateMinorChannels bool `json:"generateMinorChannels,omitempty"`
+ DefaultChannelTypePreference streamType `json:"defaultChannelTypePreference,omitempty"`
+ Candidate semverTemplateChannelBundles `json:"candidate,omitempty"`
+ Fast semverTemplateChannelBundles `json:"fast,omitempty"`
+ Stable semverTemplateChannelBundles `json:"stable,omitempty"`
pkg string `json:"-"` // the derived package name
defaultChannel string `json:"-"` // detected "most stable" channel head
@@ -62,10 +63,12 @@ func (b byChannelPriority) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
type streamType string
+const defaultStreamType streamType = ""
const minorStreamType streamType = "minor"
const majorStreamType streamType = "major"
-var streamTypePriorities = map[streamType]int{minorStreamType: 0, majorStreamType: 1}
+// general preference for minor channels
+var streamTypePriorities = map[streamType]int{minorStreamType: 2, majorStreamType: 1, defaultStreamType: 0}
// map of archetypes --> bundles --> bundle-version from the input file
type bundleVersions map[channelArchetype]map[string]semver.Version // e.g. srcv["stable"]["example-operator.v1.0.0"] = 1.0.0
@@ -74,14 +77,11 @@ type bundleVersions map[channelArchetype]map[string]semver.Version // e.g. srcv[
// later as the package's defaultChannel attribute
type highwaterChannel struct {
archetype channelArchetype
+ kind streamType
version semver.Version
name string
}
-func (h *highwaterChannel) gt(ih *highwaterChannel) bool {
- return (channelPriorities[h.archetype] > channelPriorities[ih.archetype]) || (h.version.GT(ih.version))
-}
-
type entryTuple struct {
arch channelArchetype
kind streamType
diff --git a/staging/operator-registry/cmd/opm/alpha/template/composite.go b/staging/operator-registry/cmd/opm/alpha/template/composite.go
index 1d8b9df0cb..df44998766 100644
--- a/staging/operator-registry/cmd/opm/alpha/template/composite.go
+++ b/staging/operator-registry/cmd/opm/alpha/template/composite.go
@@ -1,13 +1,11 @@
package template
import (
- "encoding/json"
- "fmt"
"log"
+ "net/http"
"os"
"github.com/spf13/cobra"
- "k8s.io/apimachinery/pkg/util/yaml"
"github.com/operator-framework/operator-registry/alpha/template/composite"
"github.com/operator-framework/operator-registry/cmd/opm/internal/util"
@@ -15,9 +13,7 @@ import (
func newCompositeTemplateCmd() *cobra.Command {
var (
- template composite.Template
output string
- containerTool string
validate bool
compositeFile string
catalogFile string
@@ -30,154 +26,52 @@ and a 'composite template' file`,
and a 'composite template' file`,
Args: cobra.MaximumNArgs(0),
Run: func(cmd *cobra.Command, args []string) {
- containerTool = "docker"
- catalogData, err := os.Open(catalogFile)
- if err != nil {
- log.Fatalf("opening catalog config file %q: %s", catalogFile, err)
- }
- defer catalogData.Close()
-
- // get catalog configurations
- catalogConfig := &composite.CatalogConfig{}
- catalogDoc := json.RawMessage{}
- catalogDecoder := yaml.NewYAMLOrJSONDecoder(catalogData, 4096)
- err = catalogDecoder.Decode(&catalogDoc)
- if err != nil {
- log.Fatalf("decoding catalog config: %s", err)
- }
- err = json.Unmarshal(catalogDoc, catalogConfig)
- if err != nil {
- log.Fatalf("unmarshalling catalog config: %s", err)
- }
- if catalogConfig.Schema != composite.CatalogSchema {
- log.Fatalf("catalog configuration file has unknown schema, should be %q", composite.CatalogSchema)
+ switch output {
+ case "yaml":
+ // do nothing
+ case "json":
+ // do nothing
+ default:
+ log.Fatalf("invalid --output value %q, expected (json|yaml)", output)
}
- catalogBuilderMap := make(composite.CatalogBuilderMap)
-
- wd, err := os.Getwd()
- if err != nil {
- log.Fatalf("getting current working directory: %s", err)
- }
-
- // setup the builders for each catalog
- setupFailed := false
- setupErrors := map[string][]string{}
- for _, catalog := range catalogConfig.Catalogs {
- errs := []string{}
- if catalog.Destination.BaseImage == "" {
- errs = append(errs, "destination.baseImage must not be an empty string")
- }
-
- if catalog.Destination.WorkingDir == "" {
- errs = append(errs, "destination.workingDir must not be an empty string")
- }
-
- // check for validation errors and skip builder creation if there are any errors
- if len(errs) > 0 {
- setupFailed = true
- setupErrors[catalog.Name] = errs
- continue
- }
-
- if _, ok := catalogBuilderMap[catalog.Name]; !ok {
- builderMap := make(composite.BuilderMap)
- for _, schema := range catalog.Builders {
- builder, err := builderForSchema(schema, composite.BuilderConfig{
- ContainerCfg: composite.ContainerConfig{
- ContainerTool: containerTool,
- BaseImage: catalog.Destination.BaseImage,
- WorkingDir: catalog.Destination.WorkingDir,
- },
- OutputType: output,
- // BUGBUG: JEK: This is a strong assumption that input is always local to execution which we need to eliminate in a later PR
- InputDirectory: wd,
- })
- if err != nil {
- log.Fatalf("getting builder %q for catalog %q: %s", schema, catalog.Name, err)
- }
- builderMap[schema] = builder
- }
- catalogBuilderMap[catalog.Name] = builderMap
- }
- }
-
- // if there were errors validating the catalog configuration then exit
- if setupFailed {
- //build the error message
- var errMsg string
- for cat, errs := range setupErrors {
- errMsg += fmt.Sprintf("\nCatalog %s:\n", cat)
- for _, err := range errs {
- errMsg += fmt.Sprintf(" - %s\n", err)
- }
- }
- log.Fatalf("catalog configuration file field validation failed: %s", errMsg)
- }
-
- template.CatalogBuilders = catalogBuilderMap
-
reg, err := util.CreateCLIRegistry(cmd)
if err != nil {
log.Fatalf("creating containerd registry: %v", err)
}
defer reg.Destroy()
- template.Registry = reg
-
- compositeData, err := os.Open(compositeFile)
+ // operator author's 'composite.yaml' file
+ compositeReader, err := os.Open(compositeFile)
if err != nil {
- log.Fatalf("opening composite config file %q: %s", compositeFile, err)
+ log.Fatalf("opening composite config file %q: %v", compositeFile, err)
}
- defer compositeData.Close()
+ defer compositeReader.Close()
- // parse data to composite config
- compositeConfig := &composite.CompositeConfig{}
- compositeDoc := json.RawMessage{}
- compositeDecoder := yaml.NewYAMLOrJSONDecoder(compositeData, 4096)
- err = compositeDecoder.Decode(&compositeDoc)
+ // catalog maintainer's 'catalogs.yaml' file
+ tempCatalog, err := composite.FetchCatalogConfig(catalogFile, http.DefaultClient)
if err != nil {
- log.Fatalf("decoding composite config: %s", err)
- }
- err = json.Unmarshal(compositeDoc, compositeConfig)
- if err != nil {
- log.Fatalf("unmarshalling composite config: %s", err)
+ log.Fatalf(err.Error())
}
+ defer tempCatalog.Close()
- if compositeConfig.Schema != composite.CompositeSchema {
- log.Fatalf("%q has unknown schema, should be %q", compositeFile, composite.CompositeSchema)
- }
+ template := composite.NewTemplate(
+ composite.WithCatalogFile(tempCatalog),
+ composite.WithContributionFile(compositeReader),
+ composite.WithOutputType(output),
+ composite.WithRegistry(reg),
+ )
- err = template.Render(cmd.Context(), compositeConfig, validate)
+ err = template.Render(cmd.Context(), validate)
if err != nil {
- log.Fatalf("rendering the composite template: %s", err)
+ log.Fatalf("rendering the composite template: %v", err)
}
},
}
cmd.Flags().StringVarP(&output, "output", "o", "json", "Output format (json|yaml)")
- // TODO: Investigate ways to do this without using a cli tool like docker/podman
- // cmd.Flags().StringVar(&containerTool, "container-tool", "docker", "container tool to be used when rendering templates (should be an equivalent replacement to docker - similar to podman)")
cmd.Flags().BoolVar(&validate, "validate", true, "whether or not the created FBC should be validated (i.e 'opm validate')")
- cmd.Flags().StringVarP(&compositeFile, "composite-config", "c", "catalog/config.yaml", "File to use as the composite configuration file")
+ cmd.Flags().StringVarP(&compositeFile, "composite-config", "c", "composite.yaml", "File to use as the composite configuration file")
cmd.Flags().StringVarP(&catalogFile, "catalog-config", "f", "catalogs.yaml", "File to use as the catalog configuration file")
return cmd
}
-
-func builderForSchema(schema string, builderCfg composite.BuilderConfig) (composite.Builder, error) {
- var builder composite.Builder
- switch schema {
- case composite.BasicBuilderSchema:
- builder = composite.NewBasicBuilder(builderCfg)
- case composite.SemverBuilderSchema:
- builder = composite.NewSemverBuilder(builderCfg)
- case composite.RawBuilderSchema:
- builder = composite.NewRawBuilder(builderCfg)
- case composite.CustomBuilderSchema:
- builder = composite.NewCustomBuilder(builderCfg)
- default:
- return nil, fmt.Errorf("unknown schema %q", schema)
- }
-
- return builder, nil
-}
diff --git a/staging/operator-registry/cmd/opm/migrate/cmd.go b/staging/operator-registry/cmd/opm/migrate/cmd.go
index 6405060b0a..36c73abc7a 100644
--- a/staging/operator-registry/cmd/opm/migrate/cmd.go
+++ b/staging/operator-registry/cmd/opm/migrate/cmd.go
@@ -21,6 +21,10 @@ func NewCmd() *cobra.Command {
Short: "Migrate a sqlite-based index image or database file to a file-based catalog",
Long: `Migrate a sqlite-based index image or database file to a file-based catalog.
+NOTE: the --output=json format produces streamable, concatenated JSON files.
+These are suitable to opm and jq, but may not be supported by arbitrary JSON
+parsers that assume that a file contains exactly one valid JSON object.
+
` + sqlite.DeprecationMessage,
Args: cobra.ExactArgs(2),
PersistentPreRun: func(_ *cobra.Command, _ []string) {
diff --git a/staging/operator-registry/cmd/opm/render/cmd.go b/staging/operator-registry/cmd/opm/render/cmd.go
index 448097a73a..03cdbcbd3e 100644
--- a/staging/operator-registry/cmd/opm/render/cmd.go
+++ b/staging/operator-registry/cmd/opm/render/cmd.go
@@ -22,8 +22,10 @@ func NewCmd() *cobra.Command {
)
cmd := &cobra.Command{
Use: "render [index-image | bundle-image | sqlite-file]...",
- Short: "Generate a declarative config blob from catalogs and bundles",
- Long: `Generate a declarative config blob from the provided index images, bundle images, and sqlite database files
+ Short: "Generate a stream of file-based catalog objects from catalogs and bundles",
+ Long: `Generate a stream of file-based catalog objects to stdout from the provided
+catalog images, file-based catalog directories, bundle images, and sqlite
+database files.
` + sqlite.DeprecationMessage,
Args: cobra.MinimumNArgs(1),
@@ -63,7 +65,7 @@ func NewCmd() *cobra.Command {
}
},
}
- cmd.Flags().StringVarP(&output, "output", "o", "json", "Output format (json|yaml)")
+ cmd.Flags().StringVarP(&output, "output", "o", "json", "Output format of the streamed file-based catalog objects (json|yaml)")
return cmd
}
diff --git a/staging/operator-registry/cmd/opm/serve/serve.go b/staging/operator-registry/cmd/opm/serve/serve.go
index 8b7d280764..fc3c482ff8 100644
--- a/staging/operator-registry/cmd/opm/serve/serve.go
+++ b/staging/operator-registry/cmd/opm/serve/serve.go
@@ -136,7 +136,7 @@ func (s *serve) run(ctx context.Context) error {
return err
}
} else {
- if err := cache.LoadOrRebuild(store, os.DirFS(s.configDir)); err != nil {
+ if err := cache.LoadOrRebuild(ctx, store, os.DirFS(s.configDir)); err != nil {
return err
}
}
diff --git a/staging/operator-registry/cmd/opm/validate/validate.go b/staging/operator-registry/cmd/opm/validate/validate.go
index 9132ce578e..4579f5e120 100644
--- a/staging/operator-registry/cmd/opm/validate/validate.go
+++ b/staging/operator-registry/cmd/opm/validate/validate.go
@@ -17,7 +17,7 @@ func NewCmd() *cobra.Command {
Short: "Validate the declarative index config",
Long: "Validate the declarative config JSON file(s) in a given directory",
Args: cobra.ExactArgs(1),
- RunE: func(_ *cobra.Command, args []string) error {
+ RunE: func(c *cobra.Command, args []string) error {
directory := args[0]
s, err := os.Stat(directory)
if err != nil {
@@ -27,7 +27,7 @@ func NewCmd() *cobra.Command {
return fmt.Errorf("%q is not a directory", directory)
}
- if err := config.Validate(os.DirFS(directory)); err != nil {
+ if err := config.Validate(c.Context(), os.DirFS(directory)); err != nil {
logger.Fatal(err)
}
return nil
diff --git a/staging/operator-registry/codegen.Dockerfile b/staging/operator-registry/codegen.Dockerfile
deleted file mode 100644
index 38bbfb429c..0000000000
--- a/staging/operator-registry/codegen.Dockerfile
+++ /dev/null
@@ -1,19 +0,0 @@
-FROM golang:1.18-alpine
-
-RUN apk update && \
- apk add make git protobuf
-
-ENV MODULE google.golang.org
-ENV SRC ${GOPATH}/src/${MODULE}
-COPY vendor/${MODULE} ${SRC}
-RUN echo $(ls ${SRC})
-RUN go install ${SRC}/protobuf/proto ${SRC}/protobuf/cmd/protoc-gen-go ${SRC}/grpc/cmd/protoc-gen-go-grpc
-
-
-WORKDIR /codegen
-
-COPY pkg pkg
-COPY Makefile Makefile
-RUN make codegen
-
-LABEL maintainer="Odin Team "
diff --git a/staging/operator-registry/docs/contributors/e2e_tests.md b/staging/operator-registry/docs/contributors/e2e_tests.md
index 5fb48b4d6e..6ff63fa832 100644
--- a/staging/operator-registry/docs/contributors/e2e_tests.md
+++ b/staging/operator-registry/docs/contributors/e2e_tests.md
@@ -32,7 +32,7 @@ running even after the test suite has completed.
make file and use `--dry-run` with `--focus` and see if the regex would trigger your specific test(s).
```bash
- GOFLAGS="-mod=vendor" go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1,kind ./test/e2e
+ go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1,kind ./test/e2e
```
## Kind with SSL
@@ -59,7 +59,7 @@ make file and use `--dry-run` with `--focus` and see if the regex would trigger
make file and use `--dry-run` with `--focus` and see if the regex would trigger your specific test(s).
```bash
- GOFLAGS="-mod=vendor" go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1,kind ./test/e2e
+ go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1,kind ./test/e2e
```
## Minikube (or other type) using kubeconfig without SSL
@@ -94,7 +94,7 @@ make file and use `--dry-run` with `--focus` and see if the regex would trigger
make file and use `--dry-run` with `--focus` and see if the regex would trigger your specific test(s).
```bash
- GOFLAGS="-mod=vendor" go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1 ./test/e2e
+ go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1 ./test/e2e
```
TIP: use a non-dynamic `kind` server by using `kind get kubeconfig --name "kind" > /tmp/kindconfig` and set `KUBECONFIG="/tmp/kindconfig"`
@@ -131,7 +131,7 @@ TIP: use a non-dynamic `kind` server by using `kind get kubeconfig --name "kind"
make file and use `--dry-run` with `--focus` and see if the regex would trigger your specific test(s).
```bash
- GOFLAGS="-mod=vendor" go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1 ./test/e2e
+ go run github.com/onsi/ginkgo/v2/ginkgo --v --randomize-all --randomize-suites --race --dry-run --focus 'builds and manipulates bundle and index images' -tags=json1 ./test/e2e
```
TIP: use a non-dynamic `kind` server by using `kind get kubeconfig --name "kind" > /tmp/kindconfig` and set `KUBECONFIG="/tmp/kindconfig"`
diff --git a/staging/operator-registry/go.mod b/staging/operator-registry/go.mod
index c6f9412fe9..9c8af7e0c8 100644
--- a/staging/operator-registry/go.mod
+++ b/staging/operator-registry/go.mod
@@ -1,134 +1,133 @@
module github.com/operator-framework/operator-registry
-go 1.18
+go 1.19
require (
github.com/adrg/xdg v0.4.0
github.com/blang/semver/v4 v4.0.0
- github.com/containerd/containerd v1.5.13
+ github.com/containerd/containerd v1.5.18
github.com/docker/cli v20.10.12+incompatible
- github.com/docker/distribution v2.8.1+incompatible
- github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce
+ github.com/docker/distribution v2.8.2+incompatible
+ github.com/docker/docker v20.10.24+incompatible
github.com/ghodss/yaml v1.0.0
- github.com/golang-migrate/migrate/v4 v4.6.2
+ github.com/golang-migrate/migrate/v4 v4.16.1
github.com/golang/mock v1.5.0
- github.com/google/go-cmp v0.5.6
+ github.com/google/go-cmp v0.5.9
github.com/grpc-ecosystem/grpc-health-probe v0.4.11
github.com/h2non/filetype v1.1.1
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d
- github.com/mattn/go-sqlite3 v1.14.10
+ github.com/mattn/go-sqlite3 v1.14.16
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2
- github.com/onsi/ginkgo/v2 v2.1.3
- github.com/onsi/gomega v1.18.1
+ github.com/onsi/ginkgo/v2 v2.9.5
+ github.com/onsi/gomega v1.27.7
github.com/opencontainers/go-digest v1.0.0
github.com/opencontainers/image-spec v1.0.2
- github.com/operator-framework/api v0.15.0
+ github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42
github.com/otiai10/copy v1.2.0
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
github.com/pkg/errors v0.9.1
- github.com/sirupsen/logrus v1.8.1
- github.com/spf13/cobra v1.4.0
- github.com/stretchr/testify v1.7.0
+ github.com/sirupsen/logrus v1.9.2
+ github.com/spf13/cobra v1.6.0
+ github.com/stretchr/testify v1.8.1
go.etcd.io/bbolt v1.3.6
- golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
- golang.org/x/net v0.4.0
- golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4
- golang.org/x/sys v0.3.0
- google.golang.org/grpc v1.47.0
+ golang.org/x/mod v0.10.0
+ golang.org/x/net v0.10.0
+ golang.org/x/sync v0.2.0
+ golang.org/x/sys v0.8.0
+ golang.org/x/text v0.9.0
+ google.golang.org/grpc v1.51.0
google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e
- google.golang.org/protobuf v1.28.0
+ google.golang.org/protobuf v1.30.0
gopkg.in/yaml.v2 v2.4.0
- k8s.io/api v0.24.0
- k8s.io/apiextensions-apiserver v0.24.0
- k8s.io/apimachinery v0.24.0
- k8s.io/client-go v0.24.0
- k8s.io/kubectl v0.24.0
- sigs.k8s.io/controller-runtime v0.12.1
+ k8s.io/api v0.27.2
+ k8s.io/apiextensions-apiserver v0.27.2
+ k8s.io/apimachinery v0.27.2
+ k8s.io/client-go v0.27.2
+ k8s.io/kubectl v0.27.1
+ sigs.k8s.io/controller-runtime v0.15.0
sigs.k8s.io/kind v0.11.1
sigs.k8s.io/yaml v1.3.0
)
require (
- github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
+ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/BurntSushi/toml v0.3.1 // indirect
- github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd // indirect
- github.com/Microsoft/go-winio v0.4.17 // indirect
- github.com/Microsoft/hcsshim v0.8.24 // indirect
- github.com/PuerkitoBio/purell v1.1.1 // indirect
- github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
+ github.com/MakeNowJust/heredoc v1.0.0 // indirect
+ github.com/Microsoft/go-winio v0.6.1 // indirect
+ github.com/Microsoft/hcsshim v0.8.25 // indirect
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d // indirect
github.com/alessio/shellescape v1.4.1 // indirect
- github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed // indirect
+ github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
github.com/beorn7/perks v1.0.1 // indirect
- github.com/blang/semver v3.5.1+incompatible // indirect
github.com/bshuster-repo/logrus-logstash-hook v0.4.1 // indirect
github.com/bugsnag/bugsnag-go v1.5.3 // indirect
github.com/bugsnag/panicwrap v1.2.0 // indirect
- github.com/cespare/xxhash/v2 v2.1.2 // indirect
+ github.com/cenkalti/backoff/v4 v4.1.3 // indirect
+ github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/containerd/cgroups v1.0.3 // indirect
- github.com/containerd/continuity v0.1.0 // indirect
+ github.com/containerd/continuity v0.3.0 // indirect
github.com/containerd/ttrpc v1.1.0 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/docker/docker-credential-helpers v0.6.3 // indirect
github.com/docker/go-connections v0.4.0 // indirect
github.com/docker/go-metrics v0.0.1 // indirect
- github.com/docker/go-units v0.4.0 // indirect
+ github.com/docker/go-units v0.5.0 // indirect
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
- github.com/emicklei/go-restful v2.9.5+incompatible // indirect
+ github.com/emicklei/go-restful/v3 v3.9.0 // indirect
github.com/evanphx/json-patch v4.12.0+incompatible // indirect
- github.com/evanphx/json-patch/v5 v5.2.0 // indirect
- github.com/felixge/httpsnoop v1.0.1 // indirect
+ github.com/evanphx/json-patch/v5 v5.6.0 // indirect
+ github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/garyburd/redigo v1.6.0 // indirect
github.com/go-git/gcfg v1.5.0 // indirect
github.com/go-git/go-billy/v5 v5.1.0 // indirect
github.com/go-git/go-git/v5 v5.3.0 // indirect
- github.com/go-logr/logr v1.2.0 // indirect
- github.com/go-openapi/jsonpointer v0.19.5 // indirect
- github.com/go-openapi/jsonreference v0.19.5 // indirect
- github.com/go-openapi/swag v0.19.14 // indirect
- github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
+ github.com/go-logr/logr v1.2.4 // indirect
+ github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-openapi/jsonpointer v0.19.6 // indirect
+ github.com/go-openapi/jsonreference v0.20.1 // indirect
+ github.com/go-openapi/swag v0.22.3 // indirect
+ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/gofrs/uuid v3.3.0+incompatible // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
- github.com/golang/protobuf v1.5.2 // indirect
- github.com/golang/snappy v0.0.3 // indirect
- github.com/google/cel-go v0.12.4 // indirect
+ github.com/golang/protobuf v1.5.3 // indirect
+ github.com/google/cel-go v0.12.6 // indirect
github.com/google/gnostic v0.5.7-v3refs // indirect
github.com/google/gofuzz v1.1.0 // indirect
- github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38 // indirect
- github.com/google/uuid v1.2.0 // indirect
+ github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect
+ github.com/google/uuid v1.3.0 // indirect
github.com/gorilla/handlers v1.4.2 // indirect
github.com/gorilla/mux v1.8.0 // indirect
- github.com/grpc-ecosystem/grpc-gateway v1.16.0 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
github.com/imdario/mergo v0.3.12 // indirect
- github.com/inconshreveable/mousetrap v1.0.0 // indirect
+ github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
- github.com/klauspost/compress v1.12.3 // indirect
- github.com/mailru/easyjson v0.7.6 // indirect
+ github.com/klauspost/compress v1.13.6 // indirect
+ github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.12 // indirect
- github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
github.com/mitchellh/mapstructure v1.4.1 // indirect
github.com/moby/locker v1.0.1 // indirect
github.com/moby/spdystream v0.2.0 // indirect
github.com/moby/sys/mountinfo v0.4.1 // indirect
- github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
+ github.com/moby/term v0.5.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
- github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c // indirect
+ github.com/morikuni/aec v1.0.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/pelletier/go-toml v1.9.3 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
- github.com/prometheus/client_golang v1.12.1 // indirect
- github.com/prometheus/client_model v0.2.0 // indirect
- github.com/prometheus/common v0.32.1 // indirect
- github.com/prometheus/procfs v0.7.3 // indirect
- github.com/russross/blackfriday v1.5.2 // indirect
+ github.com/prometheus/client_golang v1.15.1 // indirect
+ github.com/prometheus/client_model v0.4.0 // indirect
+ github.com/prometheus/common v0.42.0 // indirect
+ github.com/prometheus/procfs v0.9.0 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/spiffe/go-spiffe/v2 v2.0.0 // indirect
github.com/stoewer/go-strcase v1.2.0 // indirect
@@ -136,38 +135,35 @@ require (
github.com/yvasiyarov/gorelic v0.0.7 // indirect
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9 // indirect
github.com/zeebo/errs v1.3.0 // indirect
- go.opencensus.io v0.23.0 // indirect
- go.opentelemetry.io/contrib v0.20.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 // indirect
- go.opentelemetry.io/otel v0.20.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp v0.20.0 // indirect
- go.opentelemetry.io/otel/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/export/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v0.20.0 // indirect
- go.opentelemetry.io/otel/trace v0.20.0 // indirect
- go.opentelemetry.io/proto/otlp v0.7.0 // indirect
- golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect
- golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
- golang.org/x/term v0.3.0 // indirect
- golang.org/x/text v0.5.0 // indirect
- golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
- golang.org/x/tools v0.1.12 // indirect
- golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
+ go.opencensus.io v0.24.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect
+ go.opentelemetry.io/otel v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect
+ go.opentelemetry.io/otel/metric v0.31.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.10.0 // indirect
+ go.opentelemetry.io/otel/trace v1.10.0 // indirect
+ go.opentelemetry.io/proto/otlp v0.19.0 // indirect
+ golang.org/x/crypto v0.7.0 // indirect
+ golang.org/x/oauth2 v0.5.0 // indirect
+ golang.org/x/term v0.8.0 // indirect
+ golang.org/x/time v0.3.0 // indirect
+ golang.org/x/tools v0.9.1 // indirect
google.golang.org/appengine v1.6.7 // indirect
- google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 // indirect
+ google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/square/go-jose.v2 v2.6.0 // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
- gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
- k8s.io/apiserver v0.24.0 // indirect
- k8s.io/component-base v0.24.0 // indirect
- k8s.io/klog/v2 v2.60.1 // indirect
- k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
- k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
- sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 // indirect
- sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
- sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+ k8s.io/apiserver v0.27.2 // indirect
+ k8s.io/component-base v0.27.2 // indirect
+ k8s.io/klog/v2 v2.90.1 // indirect
+ k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f // indirect
+ k8s.io/utils v0.0.0-20230209194617-a36077c30491 // indirect
+ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 // indirect
+ sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
+ sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
)
// latest tag resolves to a very old version. this is only used for spinning up local test registries
diff --git a/staging/operator-registry/go.sum b/staging/operator-registry/go.sum
index 938204fd83..eed9c7da5c 100644
--- a/staging/operator-registry/go.sum
+++ b/staging/operator-registry/go.sum
@@ -1,7 +1,6 @@
bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
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.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
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=
@@ -15,11 +14,6 @@ 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.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/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=
@@ -40,57 +34,38 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
-github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
-github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
+github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
-github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
-github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
-github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
-github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
-github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
-github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
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/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd h1:sjQovDkwrZp8u+gxLtPgKGjk5hCxuy2hrRejBTA9xFU=
-github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
-github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
+github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
+github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
-github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w=
github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
-github.com/Microsoft/hcsshim v0.8.24 h1:jP+GMeRXIR1sH1kG4lJr9ShmSjVrua5jmFZDtfYGkn4=
-github.com/Microsoft/hcsshim v0.8.24/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
+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/Microsoft/hcsshim v0.8.25 h1:fRMwXiwk3qDwc0P05eHnh+y2v07JdtsfQ1fuAc69m9g=
+github.com/Microsoft/hcsshim v0.8.25/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
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/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-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/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs=
github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls=
github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E=
github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs=
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/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c=
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/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed h1:ue9pVfIcP+QMEjfgo/Ez4ZjNZfonGgR6NgjMaJMu1Cg=
-github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20220418222510-f25a4f6275ed/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves=
+github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
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=
@@ -100,23 +75,15 @@ github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkY
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/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
-github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
-github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
-github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
-github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bitly/go-simplejson v0.5.0 h1:6IH+V8/tVMab511d5bn4M7EwGXZf9Hj6i2xSwkNEM+Y=
github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
-github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
-github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
-github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
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/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
@@ -130,43 +97,36 @@ github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3k
github.com/bugsnag/panicwrap v1.2.0 h1:OzrKrRvXis8qEvOkfcxNcYbOd2O7xXS2nnKMEMABFQA=
github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
+github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
+github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
-github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
-github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
github.com/cespare/xxhash v1.1.0/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/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw=
+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/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
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/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/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=
-github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
-github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
-github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
github.com/containerd/cgroups v1.0.3 h1:ADZftAkglvCiD44c77s5YmMqaP2pzVCFZvBmAlBdAP4=
github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
-github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
-github.com/containerd/containerd v1.5.13 h1:XqvKw9i4P7/mFrC3TSM7yV5cwFZ9avXe6M3YANKnzEE=
-github.com/containerd/containerd v1.5.13/go.mod h1:3AlCrzKROjIuP3JALsY14n8YtntaUDBu7vek+rPN5Vc=
-github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8=
+github.com/containerd/containerd v1.5.18 h1:doHr6cNxfOLTotWmZs6aZF6LrfJFcjmYFcWlRmQgYPM=
+github.com/containerd/containerd v1.5.18/go.mod h1:7IN9MtIzTZH4WPEmD1gNH8bbTQXVX68yd3ZXxSHYCis=
github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
+github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg=
+github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM=
github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
github.com/containerd/ttrpc v1.1.0 h1:GbtyLRxb0gOLR0TYQWt3O6B0NvT8tMdorEHqIQo/lWI=
@@ -176,7 +136,6 @@ github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcD
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
-github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
@@ -185,39 +144,23 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/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/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
-github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
-github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07/go.mod h1:URriBxXwVq5ijiJ12C7iIZqlA69nTlI+LgI6/pwftG8=
-github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f/go.mod h1:8S58EK26zhXSxzv7NQFpnliaOQsmDUxvoQO3rt154Vg=
-github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc=
-github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4=
-github.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A=
-github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
-github.com/cznic/ql v1.2.0/go.mod h1:FbpzhyZrqr0PVlK6ury+PoW3T0ODUV22OeWIxcaOrSE=
-github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ=
-github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc=
-github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc/go.mod h1:Y1SNZ4dRUOKXshKUbwUapqNncRrho4mkjQebgEHZLj8=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
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/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE=
-github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
-github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
github.com/docker/cli v20.10.12+incompatible h1:lZlz0uzG+GH+c0plStMUdF/qk3ppmgnswpR5EbqzVGA=
github.com/docker/cli v20.10.12+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
github.com/docker/distribution v0.0.0-20191216044856-a8371794149d h1:jC8tT/S0OGx2cswpeUTn4gOIea8P08lD3VFQT0cOZ50=
github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
-github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce h1:KXS1Jg+ddGcWA8e1N7cupxaHHZhit5rB9tfDU+mfjyY=
-github.com/docker/docker v1.4.2-0.20200203170920-46ec8731fbce/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v20.10.24+incompatible h1:Ugvxm7a8+Gz6vqQYQQ2W7GYq5EUPaAiuPgIfVyI3dYE=
+github.com/docker/docker v20.10.24+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ=
github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
@@ -225,64 +168,48 @@ github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5Xh
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
-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/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
-github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc=
github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
-github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE=
+github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o=
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.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
-github.com/evanphx/json-patch/v5 v5.2.0 h1:8ozOH5xxoMYDt5/u+yMTsVXydVCbTORFnOOoq2lumco=
github.com/evanphx/json-patch/v5 v5.2.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
-github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4=
-github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
+github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
+github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
-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.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
+github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
-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/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
-github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
-github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
-github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/garyburd/redigo v1.6.0 h1:0VruCpn7yAIIu7pWVClQC8wxCJEcG3nyzpMSHKi1PQc=
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
-github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
-github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0=
-github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
@@ -296,48 +223,46 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
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 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 v1.2.0 h1:QK40JKJyMdUDz+h+xvCsru/bJhvG0UxvePV0ufL/AcE=
github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/zapr v1.2.0 h1:n4JnPI1T3Qq1SFEi/F8rwLrZERp2bso19PJZDB9dayk=
-github.com/go-logr/zapr v1.2.0/go.mod h1:Qa4Bsj2Vb+FAVeAKsLD8RLQ+YRJB8YDmOAKxaBQf7Ro=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
+github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+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 v1.2.4 h1:QHVo+6stLbfJmYGkQ7uGHUCu5hnAFAj6mDe6Ea0SeOo=
github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
-github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
-github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
+github.com/go-openapi/jsonpointer v0.19.6 h1:eCs3fxoIi3Wh6vtgmLTOjdhSpiqphQ+DaPn38N2ZdrE=
+github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs=
github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
-github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM=
-github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
+github.com/go-openapi/jsonreference v0.20.1 h1:FBLnyygC4/IZZr893oiomc9XaghoveYTrLC1F86HID8=
+github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k=
github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
-github.com/go-openapi/swag v0.19.14 h1:gm3vOOXfiuw5i9p5N9xJvfjvuofpyvLA9Wr6QfK5Fng=
-github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-openapi/swag v0.22.3 h1:yMBqmnQ0gyZvEb/+KzuWZOXgllrXT4SADYbvDaXHv/g=
+github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14=
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/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4/go.mod h1:4Fw1eo5iaEhDUs8XyuhSVCVy52Jq3L+/3GJgYkwc+/0=
+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/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofrs/uuid v3.3.0+incompatible h1:8K4tyRfvU1CYPgJsveYFQMhpFd/wXNM7iK6rR7UHz84=
github.com/gofrs/uuid v3.3.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.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.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-migrate/migrate/v4 v4.6.2 h1:LDDOHo/q1W5UDj6PbkxdCv7lv9yunyZHXvxuwDkGo3k=
-github.com/golang-migrate/migrate/v4 v4.6.2/go.mod h1:JYi6reN3+Z734VZ0akNuyOJNcrg45ZL7LDBMW3WGJL0=
+github.com/golang-migrate/migrate/v4 v4.16.1 h1:O+0C55RbMN66pWm5MjO6mw0px6usGpY0+bkSGW9zCo0=
+github.com/golang-migrate/migrate/v4 v4.16.1/go.mod h1:qXiwa/3Zeqaltm1MxOCZDYysW/F6folYiBgBG03l9hc=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -369,22 +294,13 @@ 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/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-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 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
-github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk=
+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/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/cel-go v0.10.1/go.mod h1:U7ayypeSkw23szu4GaQTPJGx66c20mx8JklMSxrmI1w=
-github.com/google/cel-go v0.12.4 h1:YINKfuHZ8n72tPOqSPZBwGiDpew2CJS48mdM5W8LZQU=
-github.com/google/cel-go v0.12.4/go.mod h1:Av7CU6r6X3YmcHR9GXqVDaEJYfEtSxl6wvIjUQTriCw=
-github.com/google/cel-spec v0.6.0/go.mod h1:Nwjgxy5CbjlPrtCWjeDjUyKMl8w41YBYGjsyDdqk0xA=
+github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M=
+github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw=
github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -398,16 +314,14 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
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 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
-github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
github.com/google/gofuzz v1.1.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/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=
@@ -415,55 +329,46 @@ 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-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-20210407192527-94a9f03dee38 h1:yAJXTCF9TqKcTiHJAE8dj7HMvPfh66eeA2JYW7eFpSE=
-github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec=
+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/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
-github.com/google/uuid v1.2.0/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/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/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
-github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg=
github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/gorilla/mux v1.7.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-health-probe v0.4.11 h1:eKVQDIIJhRkfJHjQzTmu+RangfB8/MyrthCCnsvne/s=
github.com/grpc-ecosystem/grpc-health-probe v0.4.11/go.mod h1:Ew6du240dK067iM38yVbni1pLpWUFnuyc0PefrB81Uc=
github.com/h2non/filetype v1.1.1 h1:xvOwnXKAckvtLWsN398qS9QhlxlnVXBjXBydK2/UFB4=
github.com/h2non/filetype v1.1.1/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c h1:fEE5/5VNnYUoBOj2I9TP8Jc+a7lge3QWn9DKE7NCwfc=
github.com/h2non/go-is-svg v0.0.0-20160927212452-35e8c4b0612c/go.mod h1:ObS/W+h8RYb1Y7fYivughjxojTmIu5iAIjSrSLCLeqE=
-github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
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/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-immutable-radix v1.0.0/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-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
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=
@@ -480,40 +385,33 @@ github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/J
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
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.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
-github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
-github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
+github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
-github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/joefitzgerald/rainbow-reporter v0.1.0 h1:AuMG652zjdzI0YCCnXAqATtRBpGXMcAnrajcaTrSeuo=
github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d h1:A2/B900ip/Z20TzkLeGRNy1s6J2HmH9AmGt+dHyqb4I=
github.com/joelanford/ignore v0.0.0-20210607151042-0d25dc18b62d/go.mod h1:7HQupe4vyNxMKXmM5DFuwXHsqwMyglcYmZBtlDPIcZ8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
-github.com/jpillora/backoff v1.0.0/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.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 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
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/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
@@ -521,46 +419,36 @@ github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvW
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.12.3 h1:G5AfA94pHPysR56qqrkO2pxEexdDzrpFJ6yt/VqWxVU=
-github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
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 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE=
-github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc=
+github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
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/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
-github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
-github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
-github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/mattn/go-sqlite3 v1.14.10 h1:MLn+5bFRlWMGoSRmJour3CL1w/qL96mvipqpwQW/Sfk=
-github.com/mattn/go-sqlite3 v1.14.10/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
+github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
+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 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
+github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 h1:g+4J5sZg6osfvEfkRZxJ1em0VT95/UOZgi/l7zi1/oE=
github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@@ -583,8 +471,8 @@ github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM=
github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
-github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
+github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
+github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
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=
@@ -592,59 +480,38 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
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/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4=
-github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c h1:nXxl5PrvVm2L/wCy8dQu6DMTwH4oIuGN8GJDAlqDdVE=
-github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
+github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+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=
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=
github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
-github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
-github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
-github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
-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=
-github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo v1.11.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.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
-github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
-github.com/onsi/ginkgo/v2 v2.0.0/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
-github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc=
-github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
+github.com/onsi/ginkgo/v2 v2.9.5 h1:+6Hr4uxzP4XIUyAkg61dWBw8lb/gc4/X5luuxN/EC+Q=
+github.com/onsi/ginkgo/v2 v2.9.5/go.mod h1:tvAoo1QUJwNEU2ITftXTpR7R1RbCzoZUOs3RonqW57k=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
-github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
-github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
-github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
-github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
+github.com/onsi/gomega v1.27.7/go.mod h1:1p8OOlwo2iUUDsHnOrjE5UKYJ+e3W8eQ3qSlRahPmr4=
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
-github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
github.com/opencontainers/image-spec v1.0.2 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/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 h1:3snG66yBm59tKhhSPQrQ/0bCrv1LQbKt40LnUPiUxdc=
-github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/operator-framework/api v0.15.0 h1:4f9i0drtqHj7ykLoHxv92GR43S7MmQHhmFQkfm5YaGI=
-github.com/operator-framework/api v0.15.0/go.mod h1:scnY9xqSeCsOdtJtNoHIXd7OtHZ14gj1hkDA4+DlgLY=
+github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42 h1:d/Pnr19TnmIq3zQ6ebewC+5jt5zqYbRkvYd37YZENQY=
+github.com/operator-framework/api v0.17.4-0.20230223191600-0131a6301e42/go.mod h1:l/cuwtPxkVUY7fzYgdust2m9tlmb8I4pOvbsUufRb24=
github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
@@ -657,64 +524,50 @@ github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/9
github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
-github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1/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/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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
-github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
-github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
-github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
-github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
+github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
+github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
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.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-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
-github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
-github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
-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.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
+github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-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.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
+github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
-github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
@@ -722,43 +575,33 @@ github.com/sclevine/spec v1.2.0 h1:1Jwdf9jSfDl9NVmt8ndHqbTZ7XCCPbh1jI3hkDBHVYA=
github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
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.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.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y=
+github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
-github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
-github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
-github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
-github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
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.4.0 h1:y+wJpx64xcgO1V+RcnwW0LEHxTKRi2ZDPSBjWnrg88Q=
-github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
+github.com/spf13/cobra v1.6.0 h1:42a0n6jwCot1pUmomAp4T7DeMD+20LFv4Q54pxLf2LI=
+github.com/spf13/cobra v1.6.0/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
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=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
github.com/spiffe/go-spiffe/v2 v2.0.0 h1:y6N7BZAxgaFZYELyrIdxSMm2e2tWpzgQewUts9h1hfM=
github.com/spiffe/go-spiffe/v2 v2.0.0/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk=
github.com/stoewer/go-strcase v1.2.0 h1:Z2iHWqGXH00XYgqDmNgQbIBxf3wrNq0F3feEy0ainaU=
@@ -766,32 +609,30 @@ github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag
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 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
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.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
-github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=
github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0=
-github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
-github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
-github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
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/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940 h1:p7OofyZ509h8DmPLh8Hn+EIIZm/xYhdZHJ9GnXHdr6U=
github.com/yvasiyarov/go-metrics v0.0.0-20150112132944-c25f46c4b940/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
@@ -804,85 +645,55 @@ github.com/yvasiyarov/newrelic_platform_go v0.0.0-20160601141957-9c099fbc30e9/go
github.com/zeebo/errs v1.2.2/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
github.com/zeebo/errs v1.3.0 h1:hmiaKqgYZzcVgRL1Vkc1Mn2914BbzB0IBxs+ebeutGs=
github.com/zeebo/errs v1.3.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
-gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
-go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
-go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
-go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
-go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
-go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q=
-go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
-go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
-go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
-go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
-go.opencensus.io v0.20.1/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=
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 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
-go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
-go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
-go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
-go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0 h1:Q3C9yzW6I9jqEc8sawxzxZmY48fs9u220KXq6d5s3XU=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
-go.opentelemetry.io/otel v0.20.0 h1:eaP0Fqu7SXHwvjiqDq83zImeehOHX8doTvU9AwXON8g=
-go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
-go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
-go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8=
-go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
-go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw=
-go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
-go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8=
-go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
-go.opentelemetry.io/otel/sdk/export/metric v0.20.0 h1:c5VRjxCXdQlx1HjzwGdQHzZaVI82b5EbBgOu2ljD92g=
-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 h1:7ao1wpzHRVKf0OQ7GIxiQJA6X7DLX9o14gmVon7mMK8=
-go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
-go.opentelemetry.io/otel/trace v0.20.0 h1:1DL6EXUdcg95gukhuRRvLDO/4X5THh/5dIV52lqtnbw=
-go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
-go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8=
+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 h1:sxoY9kG1s1WpSYNyzm24rlwH4lnRYFXUVVBmKMBfRgw=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1/go.mod h1:9NiG9I2aHTKkcxqCILhjtyNA1QEiCjdBACv4IvrFQ+c=
+go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
+go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 h1:TaB+1rQhddO1sF71MpZOZAuSPW1klK2M8XxfrBMfK7Y=
+go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0/go.mod h1:78XhIg8Ht9vR4tbLNUhXsiOnE2HOuSeKAiAcoVQEpOY=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 h1:pDDYmo0QadUPal5fwXoY1pmMpFcdyhXOmL5drCrI3vU=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0/go.mod h1:Krqnjl22jUJ0HgMzw5eveuCvFDXY4nSYb4F8t5gdrag=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 h1:KtiUEhQmj/Pa874bVYKGNVdq8NPKiacPbaRRtgXi+t4=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0/go.mod h1:OfUCyyIiDvNXHWpcWgbF+MWvqPZiNa3YDEnivcnYsV0=
+go.opentelemetry.io/otel/metric v0.31.0 h1:6SiklT+gfWAwWUR0meEMxQBtihpiEs4c+vL9spDTqUs=
+go.opentelemetry.io/otel/metric v0.31.0/go.mod h1:ohmwj9KTSIeBnDBm/ZwH2PSZxZzoOaG2xZeekTRzL5A=
+go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
+go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
+go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
+go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
-go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o=
+go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw=
+go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
-go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
-go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
-go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
-go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
-go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
-go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI=
+go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
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-20190219172222-a4c6cb3142f2/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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-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-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/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-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM=
-golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A=
+golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -905,8 +716,6 @@ 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=
@@ -915,26 +724,20 @@ 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.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.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
+golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181108082009-03003ca0c849/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=
-golang.org/x/net v0.0.0-20190424112056-4829fb13d2c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
@@ -955,46 +758,25 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/
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=
-golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-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-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
-golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU=
-golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
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/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/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-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
+golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
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=
@@ -1006,8 +788,8 @@ 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-20220722155255-886fb9371eb4 h1:uVc8UZUe6tr40fFVnUP5Oj+veunVezqYl9z7DYw9xzw=
-golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1015,13 +797,10 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h
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-20190102155601-82a175fd1598/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=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1031,16 +810,12 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-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=
-golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/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-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -1053,47 +828,27 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-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-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-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-20210112080510-489259a85091/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-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/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-20210603081109-ebe580a85c40/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-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ=
-golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/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/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.3.0 h1:qoo4akIqOcDME5bhc/NgxUdovd6BSS2uMsVjB56q1xI=
-golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
+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/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=
@@ -1101,19 +856,14 @@ 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/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM=
-golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
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-20210220033141-f8bda1e9f3ba/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.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
+golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -1123,7 +873,6 @@ golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3
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-20190425222832-ad9eeb80039a/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=
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
@@ -1135,7 +884,6 @@ golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDq
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
@@ -1156,7 +904,6 @@ golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjs
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
-golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
@@ -1164,28 +911,16 @@ 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-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.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
-golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
-golang.org/x/tools v0.1.10-0.20220218145154-897bd77cd717/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.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
+golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY=
+gomodules.xyz/jsonpatch/v2 v2.3.0 h1:8NFhfS6gzxNqjLIYnZxg319wZ5Qjnx4m/CcX+Klzazc=
google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/api v0.3.2/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=
@@ -1202,14 +937,7 @@ 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.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
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=
@@ -1220,7 +948,6 @@ google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -1240,7 +967,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
-google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
@@ -1251,25 +977,11 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/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-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
-google.golang.org/genproto v0.0.0-20201102152239-715cce707fb0/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-20210222152913-aa3ee6e6a81c/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-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
-google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
-google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
-google.golang.org/genproto v0.0.0-20220107163113-42d7afdf6368/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21 h1:hrbNEivu7Zn1pxvHk6MBrq9iE22woVILTHqexqBxe6I=
-google.golang.org/genproto v0.0.0-20220502173005-c8bf987b8c21/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f h1:BWUVssLB0HVOSY78gIdvk1dTVYtT1y8SBWtPYuTJ/6w=
+google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
@@ -1283,19 +995,13 @@ 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.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
-google.golang.org/grpc v1.46.0/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.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
+google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e h1:4BwkYybqoRhPKm97iNO3ACkxj26G0hC18CaO9QXOxto=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200709232328-d8193ee9cc3e/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/grpc/examples v0.0.0-20201130180447-c456688b1860/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
@@ -1312,8 +1018,8 @@ 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/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
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.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
+google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1327,14 +1033,10 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/square/go-jose.v2 v2.4.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI=
gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
-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 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
@@ -1343,21 +1045,17 @@ 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=
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=
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-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
-gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
-gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
+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.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
-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=
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
@@ -1365,58 +1063,45 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
-k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
-k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
-k8s.io/apiextensions-apiserver v0.24.0 h1:JfgFqbA8gKJ/uDT++feAqk9jBIwNnL9YGdQvaI9DLtY=
-k8s.io/apiextensions-apiserver v0.24.0/go.mod h1:iuVe4aEpe6827lvO6yWQVxiPSpPoSKVjkq+MIdg84cM=
+k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo=
+k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4=
+k8s.io/apiextensions-apiserver v0.27.2 h1:iwhyoeS4xj9Y7v8YExhUwbVuBhMr3Q4bd/laClBV6Bo=
+k8s.io/apiextensions-apiserver v0.27.2/go.mod h1:Oz9UdvGguL3ULgRdY9QMUzL2RZImotgxvGjdWRq6ZXQ=
k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
-k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=
-k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
-k8s.io/apiserver v0.24.0 h1:GR7kGsjOMfilRvlG3Stxv/3uz/ryvJ/aZXc5pqdsNV0=
-k8s.io/apiserver v0.24.0/go.mod h1:WFx2yiOMawnogNToVvUYT9nn1jaIkMKj41ZYCVycsBA=
-k8s.io/cli-runtime v0.24.0/go.mod h1:9XxoZDsEkRFUThnwqNviqzljtT/LdHtNWvcNFrAXl0A=
-k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
-k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
-k8s.io/code-generator v0.24.0/go.mod h1:dpVhs00hTuTdTY6jvVxvTFCk6gSMrtfRydbhZwHI15w=
-k8s.io/component-base v0.24.0 h1:h5jieHZQoHrY/lHG+HyrSbJeyfuitheBvqvKwKHVC0g=
-k8s.io/component-base v0.24.0/go.mod h1:Dgazgon0i7KYUsS8krG8muGiMVtUZxG037l1MKyXgrA=
-k8s.io/component-helpers v0.24.0/go.mod h1:Q2SlLm4h6g6lPTC9GMMfzdywfLSvJT2f1hOnnjaWD8c=
+k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg=
+k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
+k8s.io/apiserver v0.27.2 h1:p+tjwrcQEZDrEorCZV2/qE8osGTINPuS5ZNqWAvKm5E=
+k8s.io/apiserver v0.27.2/go.mod h1:EsOf39d75rMivgvvwjJ3OW/u9n1/BmUMK5otEOJrb1Y=
+k8s.io/client-go v0.27.2 h1:vDLSeuYvCHKeoQRhCXjxXO45nHVv2Ip4Fe0MfioMrhE=
+k8s.io/client-go v0.27.2/go.mod h1:tY0gVmUsHrAmjzHX9zs7eCjxcBsf8IiNe7KQ52biTcQ=
+k8s.io/component-base v0.27.2 h1:neju+7s/r5O4x4/txeUONNTS9r1HsPbyoPBAtHsDCpo=
+k8s.io/component-base v0.27.2/go.mod h1:5UPk7EjfgrfgRIuDBFtsEFAe4DAvP3U+M8RTzoSJkpo=
k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
-k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
-k8s.io/gengo v0.0.0-20211129171323-c02415ce4185/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
-k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
-k8s.io/klog/v2 v2.60.1 h1:VW25q3bZx9uE3vvdL6M8ezOX79vA2Aq1nEWLqNQclHc=
-k8s.io/klog/v2 v2.60.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw=
+k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
-k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
-k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
-k8s.io/kubectl v0.24.0 h1:nA+WtMLVdXUs4wLogGd1mPTAesnLdBpCVgCmz3I7dXo=
-k8s.io/kubectl v0.24.0/go.mod h1:pdXkmCyHiRTqjYfyUJiXtbVNURhv0/Q1TyRhy2d5ic0=
-k8s.io/metrics v0.24.0/go.mod h1:jrLlFGdKl3X+szubOXPG0Lf2aVxuV3QJcbsgVRAM6fI=
-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/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg=
+k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg=
+k8s.io/kubectl v0.27.1 h1:9T5c5KdpburYiW8XKQSH0Uly1kMNE90aGSnbYUZNdcA=
+k8s.io/kubectl v0.27.1/go.mod h1:QsAkSmrRsKTPlAFzF8kODGDl4p35BIwQnc9XFhkcsy8=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491 h1:r0BAOLElQnnFhE/ApUsg3iHdVYYPBjNSSOMowRZxxsY=
+k8s.io/utils v0.0.0-20230209194617-a36077c30491/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30 h1:dUk62HQ3ZFhD48Qr8MIXCiKA8wInBQCtuE4QGfFW7yA=
-sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.30/go.mod h1:fEO7lRTdivWO2qYVCVG7dEADOMo/MLDCVr8So2g88Uw=
-sigs.k8s.io/controller-runtime v0.12.1 h1:4BJY01xe9zKQti8oRjj/NeHKRXthf1YkYJAgLONFFoI=
-sigs.k8s.io/controller-runtime v0.12.1/go.mod h1:BKhxlA4l7FPK4AQcsuL4X6vZeWnKDXez/vp1Y8dxTU0=
-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/apiserver-network-proxy/konnectivity-client v0.1.2 h1:trsWhjU5jZrx6UvFu4WzQDrN7Pga4a7Qg+zcfcj64PA=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2/go.mod h1:+qG7ISXqCDVVcyO8hLn12AKVYYUjM7ftlqsqmrhMZE0=
+sigs.k8s.io/controller-runtime v0.15.0 h1:ML+5Adt3qZnMSYxZ7gAverBLNPSMQEibtzAgp0UPojU=
+sigs.k8s.io/controller-runtime v0.15.0/go.mod h1:7ngYvp1MLT+9GeZ+6lH3LOlcHkp/+tzA/fmHa4iq9kk=
+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/kind v0.11.1 h1:pVzOkhUwMBrCB0Q/WllQDO3v14Y+o2V0tFgjTqIUjwA=
sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA=
-sigs.k8s.io/kustomize/api v0.11.4/go.mod h1:k+8RsqYbgpkIrJ4p9jcdPqe8DprLxFUUO0yNOq8C+xI=
-sigs.k8s.io/kustomize/cmd/config v0.10.6/go.mod h1:/S4A4nUANUa4bZJ/Edt7ZQTyKOY9WCER0uBS1SW2Rco=
-sigs.k8s.io/kustomize/kustomize/v4 v4.5.4/go.mod h1:Zo/Xc5FKD6sHl0lilbrieeGeZHVYCA4BzxeAaLI05Bg=
-sigs.k8s.io/kustomize/kyaml v0.13.6/go.mod h1:yHP031rn1QX1lr/Xd934Ri/xdVNG8BE2ECa78Ht/kEg=
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.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE=
+sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E=
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/staging/operator-registry/pkg/api/api_to_model.go b/staging/operator-registry/pkg/api/api_to_model.go
index d203f40b4a..06645f7c6b 100644
--- a/staging/operator-registry/pkg/api/api_to_model.go
+++ b/staging/operator-registry/pkg/api/api_to_model.go
@@ -5,6 +5,8 @@ import (
"fmt"
"sort"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
+
"github.com/operator-framework/operator-registry/alpha/model"
"github.com/operator-framework/operator-registry/alpha/property"
)
@@ -106,8 +108,17 @@ func convertAPIBundleToModelProperties(b *Bundle) ([]property.Property, error) {
out = append(out, property.MustBuildGVKRequired(p.Group, p.Version, p.Kind))
}
- for _, obj := range b.Object {
- out = append(out, property.MustBuildBundleObjectData([]byte(obj)))
+ // If there is a bundle image reference and a valid CSV, create an
+ // olm.csv.metadata property. Otherwise, create a bundle object property for
+ // each object in the bundle.
+ var csv v1alpha1.ClusterServiceVersion
+ csvErr := json.Unmarshal([]byte(b.CsvJson), &csv)
+ if csvErr == nil && b.BundlePath != "" {
+ out = append(out, property.MustBuildCSVMetadata(csv))
+ } else {
+ for _, obj := range b.Object {
+ out = append(out, property.MustBuildBundleObjectData([]byte(obj)))
+ }
}
sort.Slice(out, func(i, j int) bool {
diff --git a/staging/operator-registry/pkg/api/conversion_test.go b/staging/operator-registry/pkg/api/conversion_test.go
index 0a332b91a4..55dc94904e 100644
--- a/staging/operator-registry/pkg/api/conversion_test.go
+++ b/staging/operator-registry/pkg/api/conversion_test.go
@@ -1,8 +1,10 @@
package api
import (
+ "encoding/json"
"testing"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -12,7 +14,7 @@ import (
func TestConvertAPIBundleToModelBundle(t *testing.T) {
apiBundle := testAPIBundle()
- expected := testModelBundle()
+ expected := testModelBundle(t)
actual, err := ConvertAPIBundleToModelBundle(&apiBundle)
require.NoError(t, err)
@@ -20,7 +22,7 @@ func TestConvertAPIBundleToModelBundle(t *testing.T) {
}
func TestConvertModelBundleToAPIBundle(t *testing.T) {
- modelBundle := testModelBundle()
+ modelBundle := testModelBundle(t)
modelBundle.Package = &model.Package{Name: "etcd"}
modelBundle.Channel = &model.Channel{Name: "singlenamespace-alpha"}
expected := testAPIBundle()
@@ -41,7 +43,12 @@ const (
crdrestores = `{"apiVersion":"apiextensions.k8s.io/v1beta1","kind":"CustomResourceDefinition","metadata":{"name":"etcdrestores.etcd.database.coreos.com"},"spec":{"group":"etcd.database.coreos.com","names":{"kind":"EtcdRestore","listKind":"EtcdRestoreList","plural":"etcdrestores","singular":"etcdrestore"},"scope":"Namespaced","version":"v1beta2"}}`
)
-func testModelBundle() model.Bundle {
+func testModelBundle(t *testing.T) model.Bundle {
+ t.Helper()
+ var csv v1alpha1.ClusterServiceVersion
+ if err := json.Unmarshal([]byte(csvJson), &csv); err != nil {
+ t.Fatalf("failed to unmarshal csv json: %v", err)
+ }
b := model.Bundle{
Name: "etcdoperator.v0.9.4",
Image: "quay.io/operatorhubio/etcd:v0.9.4",
@@ -52,10 +59,7 @@ func testModelBundle() model.Bundle {
property.MustBuildPackageRequired("test", ">=1.2.3 <2.0.0-0"),
property.MustBuildGVKRequired("testapi.coreos.com", "v1", "Testapi"),
property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"),
- property.MustBuildBundleObjectData([]byte(crdbackups)),
- property.MustBuildBundleObjectData([]byte(crdclusters)),
- property.MustBuildBundleObjectData([]byte(csvJson)),
- property.MustBuildBundleObjectData([]byte(crdrestores)),
+ property.MustBuildCSVMetadata(csv),
},
CsvJSON: csvJson,
Objects: []string{
diff --git a/staging/operator-registry/pkg/api/model_to_api.go b/staging/operator-registry/pkg/api/model_to_api.go
index 26f8b745c3..1abe1cf6be 100644
--- a/staging/operator-registry/pkg/api/model_to_api.go
+++ b/staging/operator-registry/pkg/api/model_to_api.go
@@ -1,9 +1,15 @@
package api
import (
+ "encoding/base64"
"encoding/json"
"fmt"
+ "github.com/operator-framework/api/pkg/lib/version"
+ "github.com/operator-framework/api/pkg/operators"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
"github.com/operator-framework/operator-registry/alpha/model"
"github.com/operator-framework/operator-registry/alpha/property"
)
@@ -14,6 +20,38 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) {
return nil, fmt.Errorf("parse properties: %v", err)
}
+ csvJson := b.CsvJSON
+ if csvJson == "" && len(props.CSVMetadatas) == 1 {
+ var icons []v1alpha1.Icon
+ if b.Package.Icon != nil {
+ icons = []v1alpha1.Icon{{
+ Data: base64.StdEncoding.EncodeToString(b.Package.Icon.Data),
+ MediaType: b.Package.Icon.MediaType,
+ }}
+ }
+ csv := csvMetadataToCsv(props.CSVMetadatas[0])
+ csv.Name = b.Name
+ csv.Spec.Icon = icons
+ csv.Spec.InstallStrategy = v1alpha1.NamedInstallStrategy{
+ // This stub is required to avoid a panic in OLM's package server that results in
+ // attemptint to write to a nil map.
+ StrategyName: "deployment",
+ }
+ csv.Spec.Version = version.OperatorVersion{b.Version}
+ csv.Spec.RelatedImages = convertModelRelatedImagesToCSVRelatedImages(b.RelatedImages)
+ if csv.Spec.Description == "" {
+ csv.Spec.Description = b.Package.Description
+ }
+ csvData, err := json.Marshal(csv)
+ if err != nil {
+ return nil, err
+ }
+ csvJson = string(csvData)
+ if len(b.Objects) == 0 {
+ b.Objects = []string{csvJson}
+ }
+ }
+
apiDeps, err := convertModelPropertiesToAPIDependencies(b.Properties)
if err != nil {
return nil, fmt.Errorf("convert model properties to api dependencies: %v", err)
@@ -31,7 +69,7 @@ func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) {
Properties: convertModelPropertiesToAPIProperties(b.Properties),
Replaces: b.Replaces,
Skips: b.Skips,
- CsvJson: b.CsvJSON,
+ CsvJson: csvJson,
Object: b.Objects,
}, nil
}
@@ -46,9 +84,40 @@ func parseProperties(in []property.Property) (*property.Properties, error) {
return nil, fmt.Errorf("expected exactly 1 property of type %q, found %d", property.TypePackage, len(props.Packages))
}
+ if len(props.CSVMetadatas) > 1 {
+ return nil, fmt.Errorf("expected at most 1 property of type %q, found %d", property.TypeCSVMetadata, len(props.CSVMetadatas))
+ }
+
return props, nil
}
+func csvMetadataToCsv(m property.CSVMetadata) v1alpha1.ClusterServiceVersion {
+ return v1alpha1.ClusterServiceVersion{
+ TypeMeta: metav1.TypeMeta{
+ Kind: operators.ClusterServiceVersionKind,
+ APIVersion: v1alpha1.ClusterServiceVersionAPIVersion,
+ },
+ ObjectMeta: metav1.ObjectMeta{
+ Annotations: m.Annotations,
+ Labels: m.Labels,
+ },
+ Spec: v1alpha1.ClusterServiceVersionSpec{
+ APIServiceDefinitions: m.APIServiceDefinitions,
+ CustomResourceDefinitions: m.CustomResourceDefinitions,
+ Description: m.Description,
+ DisplayName: m.DisplayName,
+ InstallModes: m.InstallModes,
+ Keywords: m.Keywords,
+ Links: m.Links,
+ Maintainers: m.Maintainers,
+ Maturity: m.Maturity,
+ MinKubeVersion: m.MinKubeVersion,
+ NativeAPIs: m.NativeAPIs,
+ Provider: m.Provider,
+ },
+ }
+}
+
func gvksProvidedtoAPIGVKs(in []property.GVK) []*GroupVersionKind {
var out []*GroupVersionKind
for _, gvk := range in {
@@ -82,7 +151,7 @@ func convertModelPropertiesToAPIProperties(props []property.Property) []*Propert
// in its `Data` field, this CSV annotation projection would cause the size of the on-cluster
// CSV to at least double, which is untenable since CSVs already have known issues running up
// against etcd size constraints.
- if prop.Type == property.TypeBundleObject {
+ if prop.Type == property.TypeBundleObject || prop.Type == property.TypeCSVMetadata {
continue
}
@@ -117,3 +186,14 @@ func convertModelPropertiesToAPIDependencies(props []property.Property) ([]*Depe
}
return out, nil
}
+
+func convertModelRelatedImagesToCSVRelatedImages(in []model.RelatedImage) []v1alpha1.RelatedImage {
+ var out []v1alpha1.RelatedImage
+ for _, ri := range in {
+ out = append(out, v1alpha1.RelatedImage{
+ Name: ri.Name,
+ Image: ri.Image,
+ })
+ }
+ return out
+}
diff --git a/staging/operator-registry/pkg/cache/cache.go b/staging/operator-registry/pkg/cache/cache.go
index 7df08d6f50..faf65d9934 100644
--- a/staging/operator-registry/pkg/cache/cache.go
+++ b/staging/operator-registry/pkg/cache/cache.go
@@ -18,13 +18,13 @@ type Cache interface {
registry.GRPCQuery
CheckIntegrity(fbc fs.FS) error
- Build(fbc fs.FS) error
+ Build(ctx context.Context, fbc fs.FS) error
Load() error
}
-func LoadOrRebuild(c Cache, fbc fs.FS) error {
+func LoadOrRebuild(ctx context.Context, c Cache, fbc fs.FS) error {
if err := c.CheckIntegrity(fbc); err != nil {
- if err := c.Build(fbc); err != nil {
+ if err := c.Build(ctx, fbc); err != nil {
return err
}
}
diff --git a/staging/operator-registry/pkg/cache/cache_test.go b/staging/operator-registry/pkg/cache/cache_test.go
index a7140d6111..07a2edf20c 100644
--- a/staging/operator-registry/pkg/cache/cache_test.go
+++ b/staging/operator-registry/pkg/cache/cache_test.go
@@ -205,7 +205,7 @@ func genTestCaches(t *testing.T, fbcFS fs.FS) []Cache {
}
for _, c := range caches {
- err := c.Build(fbcFS)
+ err := c.Build(context.Background(), fbcFS)
require.NoError(t, err)
err = c.Load()
require.NoError(t, err)
diff --git a/staging/operator-registry/pkg/cache/json.go b/staging/operator-registry/pkg/cache/json.go
index 47a54952ba..0899a6f4f8 100644
--- a/staging/operator-registry/pkg/cache/json.go
+++ b/staging/operator-registry/pkg/cache/json.go
@@ -14,6 +14,7 @@ import (
"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/pkg/api"
"github.com/operator-framework/operator-registry/pkg/registry"
+ "k8s.io/apimachinery/pkg/util/sets"
)
var _ Cache = &JSON{}
@@ -58,8 +59,13 @@ func (q *JSON) ListBundles(ctx context.Context) ([]*api.Bundle, error) {
func (q *JSON) SendBundles(_ context.Context, s registry.BundleSender) error {
for _, pkg := range q.packageIndex {
- for _, ch := range pkg.Channels {
- for _, b := range ch.Bundles {
+ channels := sets.KeySet(pkg.Channels)
+ for _, chName := range sets.List(channels) {
+ ch := pkg.Channels[chName]
+
+ bundles := sets.KeySet(ch.Bundles)
+ for _, bName := range sets.List(bundles) {
+ b := ch.Bundles[bName]
apiBundle, err := q.loadAPIBundle(apiBundleKey{pkg.Name, ch.Name, b.Name})
if err != nil {
return fmt.Errorf("convert bundle %q: %v", b.Name, err)
@@ -172,7 +178,7 @@ func (q *JSON) computeDigest(fbcFsys fs.FS) (string, error) {
return fmt.Sprintf("%x", computedHasher.Sum(nil)), nil
}
-func (q *JSON) Build(fbcFsys fs.FS) error {
+func (q *JSON) Build(ctx context.Context, fbcFsys fs.FS) error {
// ensure that generated cache is available to all future users
oldUmask := umask(000)
defer umask(oldUmask)
@@ -184,7 +190,7 @@ func (q *JSON) Build(fbcFsys fs.FS) error {
return fmt.Errorf("ensure clean base directory: %v", err)
}
- fbc, err := declcfg.LoadFS(fbcFsys)
+ fbc, err := declcfg.LoadFS(ctx, fbcFsys)
if err != nil {
return err
}
diff --git a/staging/operator-registry/pkg/cache/json_test.go b/staging/operator-registry/pkg/cache/json_test.go
index dee58bacda..af8282646d 100644
--- a/staging/operator-registry/pkg/cache/json_test.go
+++ b/staging/operator-registry/pkg/cache/json_test.go
@@ -1,6 +1,7 @@
package cache
import (
+ "context"
"io/fs"
"os"
"path/filepath"
@@ -12,7 +13,7 @@ import (
func TestJSON_StableDigest(t *testing.T) {
cacheDir := t.TempDir()
c := NewJSON(cacheDir)
- require.NoError(t, c.Build(validFS))
+ require.NoError(t, c.Build(context.Background(), validFS))
actualDigest, err := c.existingDigest()
require.NoError(t, err)
@@ -96,7 +97,7 @@ func TestJSON_CheckIntegrity(t *testing.T) {
c := NewJSON(cacheDir)
if tc.build {
- require.NoError(t, c.Build(tc.fbcFS))
+ require.NoError(t, c.Build(context.Background(), tc.fbcFS))
}
if tc.mod != nil {
require.NoError(t, tc.mod(&tc, cacheDir))
diff --git a/staging/operator-registry/pkg/cache/pkgs.go b/staging/operator-registry/pkg/cache/pkgs.go
index d387ddbd09..af24c397c9 100644
--- a/staging/operator-registry/pkg/cache/pkgs.go
+++ b/staging/operator-registry/pkg/cache/pkgs.go
@@ -4,6 +4,7 @@ import (
"context"
"fmt"
"sort"
+ "strings"
"github.com/operator-framework/operator-registry/alpha/declcfg"
"github.com/operator-framework/operator-registry/alpha/model"
@@ -34,6 +35,7 @@ func (pkgs packageIndex) GetPackage(_ context.Context, name string) (*registry.P
CurrentCSVName: ch.Head,
})
}
+ sort.Slice(channels, func(i, j int) bool { return strings.Compare(channels[i].Name, channels[j].Name) < 0 })
return ®istry.PackageManifest{
PackageName: pkg.Name,
Channels: channels,
diff --git a/staging/operator-registry/pkg/lib/config/validate.go b/staging/operator-registry/pkg/lib/config/validate.go
index 5017d3da71..34f2bf0411 100644
--- a/staging/operator-registry/pkg/lib/config/validate.go
+++ b/staging/operator-registry/pkg/lib/config/validate.go
@@ -1,6 +1,7 @@
package config
import (
+ "context"
"io/fs"
"github.com/operator-framework/operator-registry/alpha/declcfg"
@@ -13,9 +14,9 @@ import (
// directory: a filesystem where declarative config file(s) exist
// Outputs:
// error: a wrapped error that contains a tree of error strings
-func Validate(root fs.FS) error {
+func Validate(ctx context.Context, root fs.FS) error {
// Load config files and convert them to declcfg objects
- cfg, err := declcfg.LoadFS(root)
+ cfg, err := declcfg.LoadFS(ctx, root)
if err != nil {
return err
}
diff --git a/staging/operator-registry/pkg/lib/indexer/interfaces.go b/staging/operator-registry/pkg/lib/indexer/interfaces.go
index df9e6e47a2..5ebefdd1e3 100644
--- a/staging/operator-registry/pkg/lib/indexer/interfaces.go
+++ b/staging/operator-registry/pkg/lib/indexer/interfaces.go
@@ -9,6 +9,7 @@ import (
// IndexAdder allows the creation of index container images from scratch or
// based on previous index images
+//
//counterfeiter:generate . IndexAdder
type IndexAdder interface {
AddToIndex(AddToIndexRequest) error
@@ -29,6 +30,7 @@ func NewIndexAdder(buildTool, pullTool containertools.ContainerTool, logger *log
// IndexDeleter takes indexes and deletes all references to an operator
// from them
+//
//counterfeiter:generate . IndexDeleter
type IndexDeleter interface {
DeleteFromIndex(DeleteFromIndexRequest) error
diff --git a/staging/operator-registry/pkg/lib/log/writerhook.go b/staging/operator-registry/pkg/lib/log/writerhook.go
index aa51229bc6..7609ae27f7 100644
--- a/staging/operator-registry/pkg/lib/log/writerhook.go
+++ b/staging/operator-registry/pkg/lib/log/writerhook.go
@@ -44,7 +44,7 @@ func AddHooks(hooks ...*WriterHook) {
}
func AddDefaultWriterHooks(terminationLogPath string) error {
- terminationLogFile, err := os.OpenFile(terminationLogPath, os.O_WRONLY|os.O_CREATE, 0755)
+ terminationLogFile, err := os.OpenFile(terminationLogPath, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return err
}
diff --git a/staging/operator-registry/pkg/lib/registry/registry_test.go b/staging/operator-registry/pkg/lib/registry/registry_test.go
index 4b74a671b8..43f4d3998f 100644
--- a/staging/operator-registry/pkg/lib/registry/registry_test.go
+++ b/staging/operator-registry/pkg/lib/registry/registry_test.go
@@ -102,7 +102,7 @@ func newCache(t *testing.T, bundles []*model.Bundle) cache.Cache {
reg, err := cache.New(cacheDir)
require.NoError(t, err)
- require.NoError(t, reg.Build(os.DirFS(fbcDir)))
+ require.NoError(t, reg.Build(context.Background(), os.DirFS(fbcDir)))
require.NoError(t, reg.Load())
return reg
diff --git a/staging/operator-registry/pkg/registry/registry_to_model.go b/staging/operator-registry/pkg/registry/registry_to_model.go
index 14b6e7b004..869b8a5c7a 100644
--- a/staging/operator-registry/pkg/registry/registry_to_model.go
+++ b/staging/operator-registry/pkg/registry/registry_to_model.go
@@ -5,6 +5,9 @@ import (
"fmt"
"sort"
+ "github.com/operator-framework/api/pkg/operators"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
+
"github.com/operator-framework/operator-registry/alpha/property"
)
@@ -99,8 +102,21 @@ func ObjectsAndPropertiesFromBundle(b *Bundle) ([]string, []property.Property, e
if err != nil {
return nil, nil, fmt.Errorf("marshal object %s/%s (%s) to json: %v", obj.GetName(), obj.GetNamespace(), obj.GroupVersionKind(), err)
}
- props = append(props, property.MustBuildBundleObjectData(objData))
objects = append(objects, string(objData))
+
+ // Make an olm.bundle.object property if there is no bundle image set.
+ // Otherwise, make a olm.csv.metadata property if the object is a CSV
+ // (and fallback to olm.bundle.object if parsing the CSV fails).
+ if b.BundleImage == "" {
+ props = append(props, property.MustBuildBundleObjectData(objData))
+ } else if obj.GetKind() == operators.ClusterServiceVersionKind {
+ var csv v1alpha1.ClusterServiceVersion
+ if err := json.Unmarshal(objData, &csv); err != nil {
+ props = append(props, property.MustBuildBundleObjectData(objData))
+ } else {
+ props = append(props, property.MustBuildCSVMetadata(csv))
+ }
+ }
}
if packageProvidedProperty == nil {
diff --git a/staging/operator-registry/pkg/registry/registry_to_model_test.go b/staging/operator-registry/pkg/registry/registry_to_model_test.go
index 8d9f7dcb95..264507fd76 100644
--- a/staging/operator-registry/pkg/registry/registry_to_model_test.go
+++ b/staging/operator-registry/pkg/registry/registry_to_model_test.go
@@ -4,6 +4,7 @@ import (
"encoding/json"
"testing"
+ "github.com/operator-framework/api/pkg/operators/v1alpha1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -17,7 +18,7 @@ func TestObjectsAndPropertiesFromBundle(t *testing.T) {
actualObjs, actualProps, err := ObjectsAndPropertiesFromBundle(registryBundle)
require.NoError(t, err)
assert.ElementsMatch(t, testExpectedObjects(), actualObjs)
- assert.ElementsMatch(t, testExpectedProperties(), actualProps)
+ assert.ElementsMatch(t, testExpectedProperties(t), actualProps)
}
const testBundleDir = "../../bundles/etcd.0.9.2"
@@ -28,16 +29,23 @@ func testRegistryBundle(t *testing.T) *Bundle {
return input.Bundle
}
+const expectedCSV = "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"skips\":[\"etcdoperator.v0.9.1\"],\"version\":\"0.9.2\"}}"
+
func testExpectedObjects() []string {
return []string{
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
- "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"skips\":[\"etcdoperator.v0.9.1\"],\"version\":\"0.9.2\"}}",
+ expectedCSV,
"{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
}
}
-func testExpectedProperties() []property.Property {
+func testExpectedProperties(t *testing.T) []property.Property {
+ t.Helper()
+ var csv v1alpha1.ClusterServiceVersion
+ if err := json.Unmarshal([]byte(expectedCSV), &csv); err != nil {
+ t.Fatalf("failed to unmarshal CSV: %v", err)
+ }
props := []property.Property{
property.MustBuildPackage("etcd", "0.9.2"),
property.MustBuildGVKRequired("etcd.database.coreos.com", "v1beta2", "EtcdCluster"),
@@ -49,10 +57,7 @@ func testExpectedProperties() []property.Property {
Type: "olm.constraint",
Value: json.RawMessage(`{"cel":{"rule":"properties.exists(p, p.type == \"certified\")"},"failureMessage":"require to have \"certified\""}`),
},
- }
-
- for _, obj := range testExpectedObjects() {
- props = append(props, property.MustBuildBundleObjectData([]byte(obj)))
+ property.MustBuildCSVMetadata(csv),
}
return props
}
diff --git a/staging/operator-registry/pkg/registry/tar.go b/staging/operator-registry/pkg/registry/tar.go
new file mode 100644
index 0000000000..f62a15da85
--- /dev/null
+++ b/staging/operator-registry/pkg/registry/tar.go
@@ -0,0 +1,66 @@
+package registry
+
+import (
+ "archive/tar"
+ "fmt"
+ "io"
+ "io/fs"
+ "os"
+ "time"
+)
+
+// fsToTar writes the filesystem represented by fsys to w as a tar archive.
+// This function unsets user and group information in the tar archive so that readers
+// of archives produced by this function do not need to account for differences in
+// permissions between source and destination filesystems.
+func fsToTar(w io.Writer, fsys fs.FS) error {
+ tw := tar.NewWriter(w)
+ if err := fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
+ if err != nil {
+ return err
+ }
+
+ if d.Type()&os.ModeSymlink != 0 {
+ return nil
+ }
+ info, err := d.Info()
+ if err != nil {
+ return fmt.Errorf("get file info for %q: %v", path, err)
+ }
+
+ h, err := tar.FileInfoHeader(info, "")
+ if err != nil {
+ return fmt.Errorf("build tar file info header for %q: %v", path, err)
+ }
+ h.Uid = 0
+ h.Gid = 0
+ h.Uname = ""
+ h.Gname = ""
+ h.AccessTime = time.Time{}
+ h.ChangeTime = time.Time{}
+ h.ModTime = time.Time{}
+ h.Name = path
+
+ if err := tw.WriteHeader(h); err != nil {
+ return fmt.Errorf("write tar header for %q: %v", path, err)
+ }
+ if d.IsDir() {
+ return nil
+ }
+ f, err := fsys.Open(path)
+ if err != nil {
+ return fmt.Errorf("open file %q: %v", path, err)
+ }
+ defer f.Close()
+ if _, err := io.Copy(tw, f); err != nil {
+ return fmt.Errorf("write tar data for %q: %v", path, err)
+ }
+ return nil
+ }); err != nil {
+ return fmt.Errorf("write tar: %w", err)
+ }
+ if err := tw.Close(); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/staging/operator-registry/pkg/server/server_test.go b/staging/operator-registry/pkg/server/server_test.go
index a3f001d123..03cf206462 100644
--- a/staging/operator-registry/pkg/server/server_test.go
+++ b/staging/operator-registry/pkg/server/server_test.go
@@ -1,6 +1,7 @@
package server
import (
+ "fmt"
"io"
"net"
"os"
@@ -50,10 +51,13 @@ func createDBStore(dbPath string) *sqlite.SQLQuerier {
if err := loader.Populate(); err != nil {
logrus.Fatal(err)
}
+ if _, err := db.Exec("UPDATE operatorbundle SET bundlepath = 'fake/etcd-operator:v0.9.2' WHERE name = 'etcdoperator.v0.9.2'"); err != nil {
+ logrus.Fatal(err)
+ }
if err := db.Close(); err != nil {
logrus.Fatal(err)
}
- store, err := sqlite.NewSQLLiteQuerier(dbPath)
+ store, err := sqlite.NewSQLLiteQuerier(dbPath, sqlite.OmitManifests(true))
if err != nil {
logrus.Fatal(err)
}
@@ -62,7 +66,7 @@ func createDBStore(dbPath string) *sqlite.SQLQuerier {
func fbcJsonCache(catalogDir, cacheDir string) (cache2.Cache, error) {
store := cache2.NewJSON(cacheDir)
- if err := store.Build(os.DirFS(catalogDir)); err != nil {
+ if err := store.Build(context.Background(), os.DirFS(catalogDir)); err != nil {
return nil, err
}
if err := store.Load(); err != nil {
@@ -217,8 +221,8 @@ func testGetPackage(addr string) func(*testing.T) {
}
func TestGetBundle(t *testing.T) {
- t.Run("Sqlite", testGetBundle(dbAddress, etcdoperator_v0_9_2("alpha", false, false)))
- t.Run("FBCJsonCache", testGetBundle(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true)))
+ t.Run("Sqlite", testGetBundle(dbAddress, etcdoperator_v0_9_2("alpha", false, false, includeManifestsAll)))
+ t.Run("FBCJsonCache", testGetBundle(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true, includeManifestsCSVOnly)))
}
func testGetBundle(addr string, expected *api.Bundle) func(*testing.T) {
@@ -235,13 +239,13 @@ func testGetBundle(addr string, expected *api.Bundle) func(*testing.T) {
func TestGetBundleForChannel(t *testing.T) {
{
- b := etcdoperator_v0_9_2("alpha", false, false)
+ b := etcdoperator_v0_9_2("alpha", false, false, includeManifestsAll)
t.Run("Sqlite", testGetBundleForChannel(dbAddress, &api.Bundle{
CsvName: b.CsvName,
CsvJson: b.CsvJson + "\n",
}))
}
- t.Run("FBCJsonCache", testGetBundleForChannel(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true)))
+ t.Run("FBCJsonCache", testGetBundleForChannel(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true, includeManifestsCSVOnly)))
}
func testGetBundleForChannel(addr string, expected *api.Bundle) func(*testing.T) {
@@ -332,8 +336,8 @@ func testGetChannelEntriesThatReplace(addr string) func(*testing.T) {
}
func TestGetBundleThatReplaces(t *testing.T) {
- t.Run("Sqlite", testGetBundleThatReplaces(dbAddress, etcdoperator_v0_9_2("alpha", false, false)))
- t.Run("FBCJsonCache", testGetBundleThatReplaces(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true)))
+ t.Run("Sqlite", testGetBundleThatReplaces(dbAddress, etcdoperator_v0_9_2("alpha", false, false, includeManifestsAll)))
+ t.Run("FBCJsonCache", testGetBundleThatReplaces(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true, includeManifestsCSVOnly)))
}
func testGetBundleThatReplaces(addr string, expected *api.Bundle) func(*testing.T) {
@@ -348,8 +352,8 @@ func testGetBundleThatReplaces(addr string, expected *api.Bundle) func(*testing.
}
func TestGetBundleThatReplacesSynthetic(t *testing.T) {
- t.Run("Sqlite", testGetBundleThatReplacesSynthetic(dbAddress, etcdoperator_v0_9_2("alpha", false, false)))
- t.Run("FBCJsonCache", testGetBundleThatReplacesSynthetic(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true)))
+ t.Run("Sqlite", testGetBundleThatReplacesSynthetic(dbAddress, etcdoperator_v0_9_2("alpha", false, false, includeManifestsAll)))
+ t.Run("FBCJsonCache", testGetBundleThatReplacesSynthetic(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true, includeManifestsCSVOnly)))
}
func testGetBundleThatReplacesSynthetic(addr string, expected *api.Bundle) func(*testing.T) {
@@ -558,8 +562,8 @@ func testGetLatestChannelEntriesThatProvide(addr string) func(t *testing.T) {
}
func TestGetDefaultBundleThatProvides(t *testing.T) {
- t.Run("Sqlite", testGetDefaultBundleThatProvides(dbAddress, etcdoperator_v0_9_2("alpha", false, false)))
- t.Run("FBCJsonCache", testGetDefaultBundleThatProvides(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true)))
+ t.Run("Sqlite", testGetDefaultBundleThatProvides(dbAddress, etcdoperator_v0_9_2("alpha", false, false, includeManifestsAll)))
+ t.Run("FBCJsonCache", testGetDefaultBundleThatProvides(jsonCacheAddress, etcdoperator_v0_9_2("alpha", false, true, includeManifestsCSVOnly)))
}
func testGetDefaultBundleThatProvides(addr string, expected *api.Bundle) func(*testing.T) {
@@ -575,11 +579,11 @@ func testGetDefaultBundleThatProvides(addr string, expected *api.Bundle) func(*t
func TestListBundles(t *testing.T) {
t.Run("Sqlite", testListBundles(dbAddress,
- etcdoperator_v0_9_2("alpha", true, false),
- etcdoperator_v0_9_2("stable", true, false)))
+ etcdoperator_v0_9_2("alpha", true, false, includeManifestsNone),
+ etcdoperator_v0_9_2("stable", true, false, includeManifestsNone)))
t.Run("FBCJsonCache", testListBundles(jsonCacheAddress,
- etcdoperator_v0_9_2("alpha", true, true),
- etcdoperator_v0_9_2("stable", true, true)))
+ etcdoperator_v0_9_2("alpha", true, true, includeManifestsNone),
+ etcdoperator_v0_9_2("stable", true, true, includeManifestsNone)))
}
func testListBundles(addr string, etcdAlpha *api.Bundle, etcdStable *api.Bundle) func(*testing.T) {
@@ -695,19 +699,20 @@ func stripPlural(gvks []*api.GroupVersionKind) {
}
}
-func etcdoperator_v0_9_2(channel string, addSkipsReplaces, addExtraProperties bool) *api.Bundle {
+type includeManifests string
+
+const (
+ includeManifestsAll includeManifests = "all"
+ includeManifestsNone includeManifests = "none"
+ includeManifestsCSVOnly includeManifests = "csvOnly"
+)
+
+func etcdoperator_v0_9_2(channel string, addSkipsReplaces, addExtraProperties bool, includeManifests includeManifests) *api.Bundle {
b := &api.Bundle{
CsvName: "etcdoperator.v0.9.2",
PackageName: "etcd",
ChannelName: channel,
- CsvJson: "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.properties\":\"[{\\\"type\\\":\\\"other\\\",\\\"value\\\":{\\\"its\\\":\\\"notdefined\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel1\\\"}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"relatedImages\":[{\"image\":\"quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84\",\"name\":\"etcd-v3.4.0\"},{\"image\":\"quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f\",\"name\":\"etcd-3.4.1\"}],\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"skips\":[\"etcdoperator.v0.9.1\"],\"version\":\"0.9.2\"}}",
- Object: []string{
- "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
- "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
- "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.properties\":\"[{\\\"type\\\":\\\"other\\\",\\\"value\\\":{\\\"its\\\":\\\"notdefined\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel1\\\"}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"relatedImages\":[{\"image\":\"quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84\",\"name\":\"etcd-v3.4.0\"},{\"image\":\"quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f\",\"name\":\"etcd-3.4.1\"}],\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"skips\":[\"etcdoperator.v0.9.1\"],\"version\":\"0.9.2\"}}",
- "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
- },
- BundlePath: "",
+ BundlePath: "fake/etcd-operator:v0.9.2",
Dependencies: []*api.Dependency{
{
Type: "olm.gvk",
@@ -764,5 +769,21 @@ func etcdoperator_v0_9_2(channel string, addSkipsReplaces, addExtraProperties bo
{Type: "olm.gvk.required", Value: `{"group":"etcd.database.coreos.com","kind":"EtcdCluster","version":"v1beta2"}`},
}...)
}
+ switch includeManifests {
+ case includeManifestsAll:
+ b.CsvJson = "{\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"kind\":\"ClusterServiceVersion\",\"metadata\":{\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.properties\":\"[{\\\"type\\\":\\\"other\\\",\\\"value\\\":{\\\"its\\\":\\\"notdefined\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel1\\\"}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"},\"name\":\"etcdoperator.v0.9.2\",\"namespace\":\"placeholder\"},\"spec\":{\"customresourcedefinitions\":{\"owned\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"displayName\":\"Resource Requirements\",\"path\":\"pod.resources\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}],\"statusDescriptors\":[{\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"displayName\":\"Member Status\",\"path\":\"members\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"description\":\"The service at which the running etcd cluster can be accessed.\",\"displayName\":\"Service\",\"path\":\"serviceName\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"description\":\"The current size of the etcd cluster.\",\"displayName\":\"Cluster Size\",\"path\":\"size\"},{\"description\":\"The current version of the etcd cluster.\",\"displayName\":\"Current Version\",\"path\":\"currentVersion\"},{\"description\":\"The target version of the etcd cluster, after upgrading.\",\"displayName\":\"Target Version\",\"path\":\"targetVersion\"},{\"description\":\"The current status of the etcd cluster.\",\"displayName\":\"Status\",\"path\":\"phase\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"description\":\"Explanation for the current status of the cluster.\",\"displayName\":\"Status Details\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to backup an etcd cluster.\",\"displayName\":\"etcd Backup\",\"kind\":\"EtcdBackup\",\"name\":\"etcdbackups.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"Specifies the endpoints of an etcd cluster.\",\"displayName\":\"etcd Endpoint(s)\",\"path\":\"etcdEndpoints\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the backup was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any backup related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"},{\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"displayName\":\"etcd Restore\",\"kind\":\"EtcdRestore\",\"name\":\"etcdrestores.etcd.database.coreos.com\",\"specDescriptors\":[{\"description\":\"References the EtcdCluster which should be restored,\",\"displayName\":\"etcd Cluster\",\"path\":\"etcdCluster.name\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"description\":\"The full AWS S3 path where the backup is saved.\",\"displayName\":\"S3 Path\",\"path\":\"s3.path\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"displayName\":\"AWS Secret\",\"path\":\"s3.awsSecret\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}],\"statusDescriptors\":[{\"description\":\"Indicates if the restore was successful.\",\"displayName\":\"Succeeded\",\"path\":\"succeeded\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"description\":\"Indicates the reason for any restore related failures.\",\"displayName\":\"Reason\",\"path\":\"reason\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"version\":\"v1beta2\"}],\"required\":[{\"description\":\"Represents a cluster of etcd nodes.\",\"displayName\":\"etcd Cluster\",\"kind\":\"EtcdCluster\",\"name\":\"etcdclusters.etcd.database.coreos.com\",\"resources\":[{\"kind\":\"Service\",\"version\":\"v1\"},{\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"description\":\"The desired number of member Pods for the etcd cluster.\",\"displayName\":\"Size\",\"path\":\"size\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}],\"version\":\"v1beta2\"}]},\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"displayName\":\"etcd\",\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"install\":{\"spec\":{\"deployments\":[{\"name\":\"etcd-operator\",\"spec\":{\"replicas\":1,\"selector\":{\"matchLabels\":{\"name\":\"etcd-operator-alm-owned\"}},\"template\":{\"metadata\":{\"labels\":{\"name\":\"etcd-operator-alm-owned\"},\"name\":\"etcd-operator-alm-owned\"},\"spec\":{\"containers\":[{\"command\":[\"etcd-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-operator\"},{\"command\":[\"etcd-backup-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-backup-operator\"},{\"command\":[\"etcd-restore-operator\",\"--create-crd=false\"],\"env\":[{\"name\":\"MY_POD_NAMESPACE\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.namespace\"}}},{\"name\":\"MY_POD_NAME\",\"valueFrom\":{\"fieldRef\":{\"fieldPath\":\"metadata.name\"}}}],\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\",\"name\":\"etcd-restore-operator\"}],\"serviceAccountName\":\"etcd-operator\"}}}}],\"permissions\":[{\"rules\":[{\"apiGroups\":[\"etcd.database.coreos.com\"],\"resources\":[\"etcdclusters\",\"etcdbackups\",\"etcdrestores\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"pods\",\"services\",\"endpoints\",\"persistentvolumeclaims\",\"events\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"apps\"],\"resources\":[\"deployments\"],\"verbs\":[\"*\"]},{\"apiGroups\":[\"\"],\"resources\":[\"secrets\"],\"verbs\":[\"get\"]}],\"serviceAccountName\":\"etcd-operator\"}]},\"strategy\":\"deployment\"},\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"labels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"maintainers\":[{\"email\":\"support@coreos.com\",\"name\":\"CoreOS, Inc\"}],\"maturity\":\"alpha\",\"provider\":{\"name\":\"CoreOS, Inc\"},\"relatedImages\":[{\"image\":\"quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84\",\"name\":\"etcd-v3.4.0\"},{\"image\":\"quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f\",\"name\":\"etcd-3.4.1\"}],\"replaces\":\"etcdoperator.v0.9.0\",\"selector\":{\"matchLabels\":{\"alm-owner-etcd\":\"etcdoperator\",\"operated-by\":\"etcdoperator\"}},\"skips\":[\"etcdoperator.v0.9.1\"],\"version\":\"0.9.2\"}}"
+ b.Object = []string{
+ "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdbackups.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdBackup\",\"listKind\":\"EtcdBackupList\",\"plural\":\"etcdbackups\",\"singular\":\"etcdbackup\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
+ "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdclusters.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdCluster\",\"listKind\":\"EtcdClusterList\",\"plural\":\"etcdclusters\",\"shortNames\":[\"etcdclus\",\"etcd\"],\"singular\":\"etcdcluster\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
+ b.CsvJson,
+ "{\"apiVersion\":\"apiextensions.k8s.io/v1beta1\",\"kind\":\"CustomResourceDefinition\",\"metadata\":{\"name\":\"etcdrestores.etcd.database.coreos.com\"},\"spec\":{\"group\":\"etcd.database.coreos.com\",\"names\":{\"kind\":\"EtcdRestore\",\"listKind\":\"EtcdRestoreList\",\"plural\":\"etcdrestores\",\"singular\":\"etcdrestore\"},\"scope\":\"Namespaced\",\"version\":\"v1beta2\"}}",
+ }
+ case includeManifestsNone:
+ case includeManifestsCSVOnly:
+ b.CsvJson = "{\"kind\":\"ClusterServiceVersion\",\"apiVersion\":\"operators.coreos.com/v1alpha1\",\"metadata\":{\"name\":\"etcdoperator.v0.9.2\",\"creationTimestamp\":null,\"annotations\":{\"alm-examples\":\"[{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdCluster\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example\\\",\\\"namespace\\\":\\\"default\\\"},\\\"spec\\\":{\\\"size\\\":3,\\\"version\\\":\\\"3.2.13\\\"}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdRestore\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"spec\\\":{\\\"etcdCluster\\\":{\\\"name\\\":\\\"example-etcd-cluster\\\"},\\\"backupStorageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}},{\\\"apiVersion\\\":\\\"etcd.database.coreos.com/v1beta2\\\",\\\"kind\\\":\\\"EtcdBackup\\\",\\\"metadata\\\":{\\\"name\\\":\\\"example-etcd-cluster-backup\\\"},\\\"spec\\\":{\\\"etcdEndpoints\\\":[\\\"\\u003cetcd-cluster-endpoints\\u003e\\\"],\\\"storageType\\\":\\\"S3\\\",\\\"s3\\\":{\\\"path\\\":\\\"\\u003cfull-s3-path\\u003e\\\",\\\"awsSecret\\\":\\\"\\u003caws-secret\\u003e\\\"}}}]\",\"olm.properties\":\"[{\\\"type\\\":\\\"other\\\",\\\"value\\\":{\\\"its\\\":\\\"notdefined\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel\\\"}},{\\\"type\\\":\\\"olm.label\\\",\\\"value\\\":{\\\"label\\\":\\\"testlabel1\\\"}}]\",\"olm.skipRange\":\"\\u003c 0.6.0\",\"tectonic-visibility\":\"ocs\"}},\"spec\":{\"install\":{\"strategy\":\"deployment\",\"spec\":{\"deployments\":null}},\"version\":\"0.9.2\",\"maturity\":\"alpha\",\"customresourcedefinitions\":{\"owned\":[{\"name\":\"etcdclusters.etcd.database.coreos.com\",\"version\":\"v1beta2\",\"kind\":\"EtcdCluster\",\"displayName\":\"etcd Cluster\",\"description\":\"Represents a cluster of etcd nodes.\",\"resources\":[{\"name\":\"\",\"kind\":\"Service\",\"version\":\"v1\"},{\"name\":\"\",\"kind\":\"Pod\",\"version\":\"v1\"}],\"statusDescriptors\":[{\"path\":\"members\",\"displayName\":\"Member Status\",\"description\":\"The status of each of the member Pods for the etcd cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podStatuses\"]},{\"path\":\"serviceName\",\"displayName\":\"Service\",\"description\":\"The service at which the running etcd cluster can be accessed.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Service\"]},{\"path\":\"size\",\"displayName\":\"Cluster Size\",\"description\":\"The current size of the etcd cluster.\"},{\"path\":\"currentVersion\",\"displayName\":\"Current Version\",\"description\":\"The current version of the etcd cluster.\"},{\"path\":\"targetVersion\",\"displayName\":\"Target Version\",\"description\":\"The target version of the etcd cluster, after upgrading.\"},{\"path\":\"phase\",\"displayName\":\"Status\",\"description\":\"The current status of the etcd cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase\"]},{\"path\":\"reason\",\"displayName\":\"Status Details\",\"description\":\"Explanation for the current status of the cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"specDescriptors\":[{\"path\":\"size\",\"displayName\":\"Size\",\"description\":\"The desired number of member Pods for the etcd cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]},{\"path\":\"pod.resources\",\"displayName\":\"Resource Requirements\",\"description\":\"Limits describes the minimum/maximum amount of compute resources required/allowed\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:resourceRequirements\"]}]},{\"name\":\"etcdbackups.etcd.database.coreos.com\",\"version\":\"v1beta2\",\"kind\":\"EtcdBackup\",\"displayName\":\"etcd Backup\",\"description\":\"Represents the intent to backup an etcd cluster.\",\"statusDescriptors\":[{\"path\":\"succeeded\",\"displayName\":\"Succeeded\",\"description\":\"Indicates if the backup was successful.\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"path\":\"reason\",\"displayName\":\"Reason\",\"description\":\"Indicates the reason for any backup related failures.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"specDescriptors\":[{\"path\":\"etcdEndpoints\",\"displayName\":\"etcd Endpoint(s)\",\"description\":\"Specifies the endpoints of an etcd cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:etcd:endpoint\"]},{\"path\":\"s3.path\",\"displayName\":\"S3 Path\",\"description\":\"The full AWS S3 path where the backup is saved.\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"path\":\"s3.awsSecret\",\"displayName\":\"AWS Secret\",\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}]},{\"name\":\"etcdrestores.etcd.database.coreos.com\",\"version\":\"v1beta2\",\"kind\":\"EtcdRestore\",\"displayName\":\"etcd Restore\",\"description\":\"Represents the intent to restore an etcd cluster from a backup.\",\"statusDescriptors\":[{\"path\":\"succeeded\",\"displayName\":\"Succeeded\",\"description\":\"Indicates if the restore was successful.\",\"x-descriptors\":[\"urn:alm:descriptor:text\"]},{\"path\":\"reason\",\"displayName\":\"Reason\",\"description\":\"Indicates the reason for any restore related failures.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes.phase:reason\"]}],\"specDescriptors\":[{\"path\":\"etcdCluster.name\",\"displayName\":\"etcd Cluster\",\"description\":\"References the EtcdCluster which should be restored,\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:EtcdCluster\",\"urn:alm:descriptor:text\"]},{\"path\":\"s3.path\",\"displayName\":\"S3 Path\",\"description\":\"The full AWS S3 path where the backup is saved.\",\"x-descriptors\":[\"urn:alm:descriptor:aws:s3:path\"]},{\"path\":\"s3.awsSecret\",\"displayName\":\"AWS Secret\",\"description\":\"The name of the secret object that stores the AWS credential and config files.\",\"x-descriptors\":[\"urn:alm:descriptor:io.kubernetes:Secret\"]}]}],\"required\":[{\"name\":\"etcdclusters.etcd.database.coreos.com\",\"version\":\"v1beta2\",\"kind\":\"EtcdCluster\",\"displayName\":\"etcd Cluster\",\"description\":\"Represents a cluster of etcd nodes.\",\"resources\":[{\"name\":\"\",\"kind\":\"Service\",\"version\":\"v1\"},{\"name\":\"\",\"kind\":\"Pod\",\"version\":\"v1\"}],\"specDescriptors\":[{\"path\":\"size\",\"displayName\":\"Size\",\"description\":\"The desired number of member Pods for the etcd cluster.\",\"x-descriptors\":[\"urn:alm:descriptor:com.tectonic.ui:podCount\"]}]}]},\"apiservicedefinitions\":{},\"displayName\":\"etcd\",\"description\":\"etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd.\\nA simple use-case is to store database connection details or feature flags within etcd as key value pairs. These values can be watched, allowing your app to reconfigure itself when they change. Advanced uses take advantage of the consistency guarantees to implement database leader elections or do distributed locking across a cluster of workers.\\n\\n_The etcd Open Cloud Service is Public Alpha. The goal before Beta is to fully implement backup features._\\n\\n### Reading and writing to etcd\\n\\nCommunicate with etcd though its command line utility `etcdctl` or with the API using the automatically generated Kubernetes Service.\\n\\n[Read the complete guide to using the etcd Open Cloud Service](https://coreos.com/tectonic/docs/latest/alm/etcd-ocs.html)\\n\\n### Supported Features\\n\\n\\n**High availability**\\n\\n\\nMultiple instances of etcd are networked together and secured. Individual failures or networking issues are transparently handled to keep your cluster up and running.\\n\\n\\n**Automated updates**\\n\\n\\nRolling out a new etcd version works like all Kubernetes rolling updates. Simply declare the desired version, and the etcd service starts a safe rolling update to the new version automatically.\\n\\n\\n**Backups included**\\n\\n\\nComing soon, the ability to schedule backups to happen on or off cluster.\\n\",\"keywords\":[\"etcd\",\"key value\",\"database\",\"coreos\",\"open source\"],\"maintainers\":[{\"name\":\"CoreOS, Inc\",\"email\":\"support@coreos.com\"}],\"provider\":{\"name\":\"CoreOS, Inc\"},\"links\":[{\"name\":\"Blog\",\"url\":\"https://coreos.com/etcd\"},{\"name\":\"Documentation\",\"url\":\"https://coreos.com/operators/etcd/docs/latest/\"},{\"name\":\"etcd Operator Source Code\",\"url\":\"https://github.com/coreos/etcd-operator\"}],\"icon\":[{\"base64data\":\"iVBORw0KGgoAAAANSUhEUgAAAOEAAADZCAYAAADWmle6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEKlJREFUeNrsndt1GzkShmEev4sTgeiHfRYdgVqbgOgITEVgOgLTEQydwIiKwFQCayoCU6+7DyYjsBiBFyVVz7RkXvqCSxXw/+f04XjGQ6IL+FBVuL769euXgZ7r39f/G9iP0X+u/jWDNZzZdGI/Ftama1jjuV4BwmcNpbAf1Fgu+V/9YRvNAyzT2a59+/GT/3hnn5m16wKWedJrmOCxkYztx9Q+py/+E0GJxtJdReWfz+mxNt+QzS2Mc0AI+HbBBwj9QViKbH5t64DsP2fvmGXUkWU4WgO+Uve2YQzBUGd7r+zH2ZG/tiUQc4QxKwgbwFfVGwwmdLL5wH78aPC/ZBem9jJpCAX3xtcNASSNgJLzUPSQyjB1zQNl8IQJ9MIU4lx2+Jo72ysXYKl1HSzN02BMa/vbZ5xyNJIshJzwf3L0dQhJw4Sih/SFw9Tk8sVeghVPoefaIYCkMZCKbrcP9lnZuk0uPUjGE/KE8JQry7W2tgfuC3vXgvNV+qSQbyFtAtyWk7zWiYevvuUQ9QEQCvJ+5mmu6dTjz1zFHLFj8Eb87MtxaZh/IQFIHom+9vgTWwZxAQjT9X4vtbEVPojwjiV471s00mhAckpwGuCn1HtFtRDaSh6y9zsL+LNBvCG/24ThcxHObdlWc1v+VQJe8LcO0jwtuF8BwnAAUgP9M8JPU2Me+Oh12auPGT6fHuTePE3bLDy+x9pTLnhMn+07TQGh//Bz1iI0c6kvtqInjvPZcYR3KsPVmUsPYt9nFig9SCY8VQNhpPBzn952bbgcsk2EvM89wzh3UEffBbyPqvBUBYQ8ODGPFOLsa7RF096WJ69L+E4EmnpjWu5o4ChlKaRTKT39RMMaVPEQRsz/nIWlDN80chjdJlSd1l0pJCAMVZsniobQVuxceMM9OFoaMd9zqZtjMEYYDW38Drb8Y0DYPLShxn0pvIFuOSxd7YCPet9zk452wsh54FJoeN05hcgSQoG5RR0Qh9Q4E4VvL4wcZq8UACgaRFEQKgSwWrkr5WFnGxiHSutqJGlXjBgIOayhwYBTA0ER0oisIVSUV0AAMT0IASCUO4hRIQSAEECMCCEPwqyQA0JCQBzEGjWNAqHiUVAoXUWbvggOIQCEAOJzxTjoaQ4AIaE64/aZridUsBYUgkhB15oGg1DBIl8IqirYwV6hPSGBSFteMCUBSVXwfYixBmamRubeMyjzMJQBDDowE3OesDD+zwqFoDqiEwXoXJpljB+PvWJGy75BKF1FPxhKygJuqUdYQGlLxNEXkrYyjQ0GbaAwEnUIlLRNvVjQDYUAsJB0HKLE4y0AIpQNgCIhBIhQTgCKhZBBpAN/v6LtQI50JfUgYOnnjmLUFHKhjxbAmdTCaTiBm3ovLPqG2urWAij6im0Nd9aTN9ygLUEt9LgSRnohxUPIKxlGaE+/6Y7znFf0yX+GnkvFFWmarkab2o9PmTeq8sbd2a7DaysXz7i64VeznN4jCQhN9gdDbRiuWrfrsq0mHIrlaq+hlotCtd3Um9u0BYWY8y5D67wccJoZjFca7iUs9VqZcfsZwTd1sbWGG+OcYaTnPAP7rTQVVlM4Sg3oGvB1tmNh0t/HKXZ1jFoIMwCQjtqbhNxUmkGYqgZEDZP11HN/S3gAYRozf0l8C5kKEKUvW0t1IfeWG/5MwgheZTT1E0AEhDkAePQO+Ig2H3DncAkQM4cwUQCD530dU4B5Yvmi2LlDqXfWrxMCcMth51RToRMNUXFnfc2KJ0+Ryl0VNOUwlhh6NoxK5gnViTgQpUG4SqSyt5z3zRJpuKmt3Q1614QaCBPaN6je+2XiFcWAKOXcUfIYKRyL/1lb7pe5VxSxxjQ6hImshqGRt5GWZVKO6q2wHwujfwDtIvaIdexj8Cm8+a68EqMfox6x/voMouZF4dHnEGNeCDMwT6vdNfekH1MafMk4PI06YtqLVGl95aEM9Z5vAeCTOA++YLtoVJRrsqNCaJ6WRmkdYaNec5BT/lcTRMqrhmwfjbpkj55+OKp8IEbU/JLgPJE6Wa3TTe9sHS+ShVD5QIyqIxMEwKh12olC6mHIed5ewEop80CNlfIOADYOT2nd6ZXCop+Ebqchc0JqxKcKASxChycJgUh1rnHA5ow9eTrhqNI7JWiAYYwBGGdpyNLoGw0Pkh96h1BpHihyywtATDM/7Hk2fN9EnH8BgKJCU4ooBkbXFMZJiPbrOyecGl3zgQDQL4hk10IZiOe+5w99Q/gBAEIJgPhJM4QAEEoFREAIAAEiIASAkD8Qt4AQAEIAERAGFlX4CACKAXGVM4ivMwWwCLFAlyeoaa70QePKm5Dlp+/n+ye/5dYgva6YsUaVeMa+tzNFeJtWwc+udbJ0Fg399kLielQJ5Ze61c2+7ytA6EZetiPxZC6tj22yJCv6jUwOyj/zcbqAxOMyAKEbfeHtNa7DtYXptjsk2kJxR+eIeim/tHNofUKYy8DMrQcAKWz6brpvzyIAlpwPhQ49l6b7skJf5Z+YTOYQc4FwLDxvoTDwaygQK+U/kVr+ytSFBG01Q3gnJJR4cNiAhx4HDub8/b5DULXlj6SVZghFiE+LdvE9vo/o8Lp1RmH5hzm0T6wdbZ6n+D6i44zDRc3ln6CpAEJfXiRU45oqLz8gFAThWsh7ughrRibc0QynHgZpNJa/ENJ+loCwu/qOGnFIjYR/n7TfgycULhcQhu6VC+HfF+L3BoAQ4WiZTw1M+FPCnA2gKC6/FAhXgDC+ojQGh3NuWsvfF1L/D5ohlCKtl1j2ldu9a/nPAKFwN56Bst10zCG0CPleXN/zXPgHQZXaZaBgrbzyY5V/mUA+6F0hwtGN9rwu5DVZPuwWqfxdFz1LWbJ2lwKEa+0Qsm4Dl3fp+Pu0lV97PgwIPfSsS+UQhj5Oo+vvFULazRIQyvGEcxPuNLCth2MvFsrKn8UOilAQShkh7TTczYNMoS6OdP47msrPi82lXKGWhCdMZYS0bFy+vcnGAjP1CIfvgbKNA9glecEH9RD6Ol4wRuWyN/G9MHnksS6o/GPf5XcwNSUlHzQhDuAKtWJmkwKElU7lylP5rgIcsquh/FI8YZCDpkJBuE4FQm7Icw8N+SrUGaQKyi8FwiDt1ve5o+Vu7qYHy/psgK8cvh+FTYuO77bhEC7GuaPiys/L1X4IgXDL+e3M5+ovLxBy5VLuIebw1oqcHoPfoaMJUsHays878r8KbDc3xtPx/84gZPBG/JwaufrsY/SRG/OY3//8QMNdsvdZCFtbW6f8pFuf5bflILAlX7O+4fdfugKyFYS8T2zAsXthdG0VurPGKwI06oF5vkBgHWkNp6ry29+lsPZMU3vijnXFNmoclr+6+Ou/FIb8yb30sS8YGjmTqCLyQsi5N/6ZwKs0Yenj68pfPjF6N782Dp2FzV9CTyoSeY8mLK16qGxIkLI8oa1n8tz9juP40DlK0epxYEbojbq+9QfurBeVIlCO9D2396bxiV4lkYQ3hOAFw2pbhqMGISkkQOMcQ9EqhDmGZZdo92JC0YHRNTfoSg+5e0IT+opqCKHoIU+4ztQIgBD1EFNrQAgIpYSil9lDmPHqkROPt+JC6AgPquSuumJmg0YARVCuneDfvPVeJokZ6pIXDkNxQtGzTF9/BQjRG0tQznfb74RwCQghpALBtIQnfK4zhxdyQvVCUeknMIT3hLyY+T5jo0yABqKPQNpUNw/09tGZod5jgCaYFxyYvJcNPkv9eof+I3pnCFEHIETjSM8L9tHZHYCQT9PaZGycU6yg8S4akDnJ+P03L0+t23XGzCLzRgII/Wqa+fv/xlfvmKvMUOcOrlCDdoei1MGdZm6G5VEIfRzzjd4aQs69n699Rx7ewhvCGzr2gmTPs8zNsJOrXt24FbkhhOjCfT4ICA/rPbyhUy94Dks0gJCX1NzCZui9YUd3oei+c257TalFbgg19ILHrlrL2gvWgXAL26EX76gZTNASQnad8Ibwhl284NhgXpB0c+jKhWO3Ms1hP9ihJYB9eMF6qd1BCPk0qA1s+LimFIu7m4nsdQIzPK4VbQ8hYvrnuSH2G9b2ggP78QmWqBdF9Vx8SSY6QYdUW7BTA1schZATyhvY8lHvcRbNUS9YGFy2U+qmzh2YPVc0I7yAOFyHfRpyUwtCSzOdPXMHmz7qDIM0e0V2wZTEk+6Ym6N63eBLp/b5Bts+2cKCSJ/LuoZO3ANSiE5hKAZjnvNSS4931jcw9jpwT0feV/qSJ1pVtCyfHKDkvK8Ejx7pUxGh2xFNSwx8QTi2H9ceC0/nni64MS/5N5dG39pDqvRV+WgGk71c9VFXF9b+xYvOw/d61iv7m3MvEHryhvecwC52jSSx4VIIgwnMNT/UsTxIgpPt3K/ARj15CptwL3Zd/ceDSATj2DGQjbxgWwhdeMMte7zpy5On9vymRm/YxBYljGVjKWF9VJf7I1+sex3wY8w/V1QPTborW/72gkdsRDaZMJBdbdHIC7aCkAu9atlLbtnrzerMnyToDaGwelOnk3/hHSem/ZK7e/t7jeeR20LYBgqa8J80gS8jbwi5F02Uj1u2NYJxap8PLkJfLxA2hIJyvnHX/AfeEPLpBfe0uSFHbnXaea3Qd5d6HcpYZ8L6M7lnFwMQ3MNg+RxUR1+6AshtbsVgfXTEg1sIGax9UND2p7f270wdG3eK9gXVGHdw2k5sOyZv+Nbs39Z308XR9DqWb2J+PwKDhuKHPobfuXf7gnYGHdCs7bhDDadD4entDug7LWNsnRNW4mYqwJ9dk+GGSTPBiA2j0G8RWNM5upZtcG4/3vMfP7KnbK2egx6CCnDPhRn7NgD3cghLIad5WcM2SO38iqHvvMOosyeMpQ5zlVCaaj06GVs9xUbHdiKoqrHWgquFEFMWUEWfXUxJAML23hAHFOctmjZQffKD2pywkhtSGHKNtpitLroscAeE7kCkSsC60vxEl6yMtL9EL5HKGCMszU5bk8gdkklAyEn5FO0yK419rIxBOIqwFMooDE0tHEVYijAUECIshRCGIhxFWIowFJ5QkEYIS5PTJrUwNGlPyN6QQPyKtpuM1E/K5+YJDV/MiA3AaehzqgAm7QnZG9IGYKo8bHnSK7VblLL3hOwNHziPuEGOqE5brrdR6i+atCfckyeWD47HkAkepRGLY/e8A8J0gCwYSNypF08bBm+e6zVz2UL4AshhBUjML/rXLefqC82bcQFhGC9JDwZ1uuu+At0S5gCETYHsV4DUeD9fDN2Zfy5OXaW2zAwQygCzBLJ8cvaW5OXKC1FxfTggFAHmoAJnSiOw2wps9KwRWgJCLaEswaj5NqkLwAYIU4BxqTSXbHXpJdRMPZgAOiAMqABCNGYIEEJutEK5IUAIwYMDQgiCACEEAcJs1Vda7gGqDhCmoiEghAAhBAHCrKXVo2C1DCBMRlp37uMIEECoX7xrX3P5C9QiINSuIcoPAUI0YkAICLNWgfJDh4T9hH7zqYH9+JHAq7zBqWjwhPAicTVCVQJCNF50JghHocahKK0X/ZnQKyEkhSdUpzG8OgQI42qC94EQjsYLRSmH+pbgq73L6bYkeEJ4DYTYmeg1TOBFc/usTTp3V9DdEuXJ2xDCUbXhaXk0/kAYmBvuMB4qkC35E5e5AMKkwSQgyxufyuPy6fMMgAFCSI73LFXU/N8AmEL9X4ABACNSKMHAgb34AAAAAElFTkSuQmCC\",\"mediatype\":\"image/png\"}],\"cleanup\":{\"enabled\":false},\"relatedImages\":[{\"name\":\"\",\"image\":\"quay.io/coreos/etcd-operator@sha256:c0301e4686c3ed4206e370b42de5a3bd2229b9fb4906cf85f3f30650424abec2\"},{\"name\":\"etcd-v3.4.0\",\"image\":\"quay.io/coreos/etcd@sha256:3816b6daf9b66d6ced6f0f966314e2d4f894982c6b1493061502f8c2bf86ac84\"},{\"name\":\"etcd-3.4.1\",\"image\":\"quay.io/coreos/etcd@sha256:49d3d4a81e0d030d3f689e7167f23e120abf955f7d08dbedf3ea246485acee9f\"}]},\"status\":{\"cleanup\":{}}}"
+ b.Object = []string{b.CsvJson}
+ default:
+ panic(fmt.Sprintf("unexpected includeManifests value: %q", includeManifests))
+ }
return b
}
diff --git a/staging/operator-registry/registry.Dockerfile b/staging/operator-registry/registry.Dockerfile
index e87459c1af..f87672614b 100644
--- a/staging/operator-registry/registry.Dockerfile
+++ b/staging/operator-registry/registry.Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.18-alpine as builder
+FROM golang:1.19-alpine as builder
RUN apk update && apk add sqlite build-base git mercurial bash
WORKDIR /build
diff --git a/staging/operator-registry/test/e2e/bundle_image_test.go b/staging/operator-registry/test/e2e/bundle_image_test.go
index 1088d38f29..c72359087b 100644
--- a/staging/operator-registry/test/e2e/bundle_image_test.go
+++ b/staging/operator-registry/test/e2e/bundle_image_test.go
@@ -84,12 +84,12 @@ func buildContainer(tag, dockerfilePath, dockerContext string, w io.Writer) {
var _ = Describe("Launch bundle", func() {
namespace := "default"
- initImage := dockerHost + "/olmtest/init-operator-manifest:test"
Context("Deploy bundle job", func() {
DescribeTable("should populate specified configmap", func(bundleName, bundleDirectory string, gzip bool) {
// these permissions are only necessary for the e2e (and not OLM using the feature)
By("configuring configmap service account")
+ initImage := imageRegistry + "/init-operator-manifest:test"
kubeclient, err := kubernetes.NewForConfig(ctx.Ctx().RESTConfig())
Expect(err).NotTo(HaveOccurred())
@@ -133,7 +133,7 @@ var _ = Describe("Launch bundle", func() {
Expect(err).NotTo(HaveOccurred())
By("building required images")
- bundleImage := dockerHost + "/olmtest/" + bundleName + ":test"
+ bundleImage := imageRegistry + "/" + bundleName + ":test"
buildContainer(initImage, imageDirectory+"serve.Dockerfile", "../../bin", GinkgoWriter)
buildContainer(bundleImage, imageDirectory+"bundle.Dockerfile", bundleDirectory, GinkgoWriter)
diff --git a/staging/operator-registry/test/e2e/e2e_suite_test.go b/staging/operator-registry/test/e2e/e2e_suite_test.go
index 6f2bdf91cd..a7a6e69ce7 100644
--- a/staging/operator-registry/test/e2e/e2e_suite_test.go
+++ b/staging/operator-registry/test/e2e/e2e_suite_test.go
@@ -24,6 +24,10 @@ var (
dockerPassword = os.Getenv("DOCKER_PASSWORD")
dockerHost = os.Getenv("DOCKER_REGISTRY_HOST") // 'DOCKER_HOST' is reserved for the docker daemon
+ // default domain name of the test image (overwritten by "IMAGE_DOMAIN" env variable)
+ imageDomain = "olmtest"
+ imageRegistry = dockerHost + "/" + imageDomain
+
// opm command under test.
opm *cobra.Command
@@ -42,6 +46,13 @@ var deprovision func() = func() {}
var _ = BeforeSuite(func() {
// Configure test registry (hostnames, credentials, etc.)
configureRegistry()
+
+ val, ok := os.LookupEnv("IMAGE_DOMAIN")
+ if ok {
+ imageDomain = val
+ imageRegistry = dockerHost + "/" + imageDomain
+ }
+
deprovision = ctx.MustProvision(ctx.Ctx())
opm = opmroot.NewCmd() // Creating multiple instances would cause flag registration conflicts
@@ -60,6 +71,7 @@ func configureRegistry() {
case dockerHost == "" && dockerUsername != "" && dockerPassword != "":
// Set host to default registry
dockerHost = defaultRegistry
+ imageRegistry = dockerHost + "/" + imageDomain
}
// FIXME: Since podman login doesn't work with daemonless image pulling, we need to login with docker first so podman tests don't fail.
diff --git a/staging/operator-registry/test/e2e/opm_bundle_test.go b/staging/operator-registry/test/e2e/opm_bundle_test.go
index c9406dfa6a..d129d31924 100644
--- a/staging/operator-registry/test/e2e/opm_bundle_test.go
+++ b/staging/operator-registry/test/e2e/opm_bundle_test.go
@@ -53,7 +53,7 @@ var _ = Describe("opm alpha bundle", func() {
Expect(err).ToNot(HaveOccurred())
// Create a bundle ref using the local registry host name and the namespace/name of a bundle we already know the content of
- bundleRef = host + "/olmtest/kiali@sha256:a1bec450c104ceddbb25b252275eb59f1f1e6ca68e0ced76462042f72f7057d8"
+ bundleRef = host + "/" + imageDomain + "/kiali@sha256:a1bec450c104ceddbb25b252275eb59f1f1e6ca68e0ced76462042f72f7057d8"
// Generate a checksum of the expected content for the bundle under test
bundleChecksum, err = dirhash.HashDir(filepath.Join(goldenFiles, "bundles/kiali"), "", dirhash.DefaultHash)
diff --git a/staging/operator-registry/test/e2e/opm_test.go b/staging/operator-registry/test/e2e/opm_test.go
index 5531c7dd0e..ad39e461b1 100644
--- a/staging/operator-registry/test/e2e/opm_test.go
+++ b/staging/operator-registry/test/e2e/opm_test.go
@@ -43,11 +43,11 @@ var (
indexTag2 = rand.String(6)
indexTag3 = rand.String(6)
- bundleImage = dockerHost + "/olmtest/e2e-bundle"
- indexImage = dockerHost + "/olmtest/e2e-index"
- indexImage1 = dockerHost + "/olmtest/e2e-index:" + indexTag1
- indexImage2 = dockerHost + "/olmtest/e2e-index:" + indexTag2
- indexImage3 = dockerHost + "/olmtest/e2e-index:" + indexTag3
+ bundleImage string
+ indexImage string
+ indexImage1 string
+ indexImage2 string
+ indexImage3 string
fbcIndexImageTag = dockerHost + "/olmtest/e2e-fbc"
fbcPackageName = "webhook-operator"
@@ -270,6 +270,15 @@ func initialize() error {
return loader.Populate()
}
+var _ = BeforeEach(func() {
+ bundleImage = imageRegistry + "/e2e-bundle"
+ indexImage = imageRegistry + "/e2e-index"
+ indexImage1 = imageRegistry + "/e2e-index:" + indexTag1
+ indexImage2 = imageRegistry + "/e2e-index:" + indexTag2
+ indexImage3 = imageRegistry + "/e2e-index:" + indexTag3
+
+})
+
var _ = Describe("opm", func() {
IncludeSharedSpecs := func(containerTool string) {
It("builds and validates a bundle image", func() {
diff --git a/staging/operator-registry/upstream-builder.Dockerfile b/staging/operator-registry/upstream-builder.Dockerfile
index 20fc9b9d50..687ab3520c 100644
--- a/staging/operator-registry/upstream-builder.Dockerfile
+++ b/staging/operator-registry/upstream-builder.Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.18-alpine as builder
+FROM golang:1.19-alpine as builder
RUN apk update && apk add sqlite build-base git mercurial bash
WORKDIR /build
diff --git a/staging/operator-registry/upstream-opm-builder.Dockerfile b/staging/operator-registry/upstream-opm-builder.Dockerfile
index 9951433bdd..9d7ad9b4fe 100644
--- a/staging/operator-registry/upstream-opm-builder.Dockerfile
+++ b/staging/operator-registry/upstream-opm-builder.Dockerfile
@@ -3,7 +3,7 @@
## GoReleaser to build and push multi-arch images for opm
##
-FROM golang:1.18-alpine AS builder
+FROM golang:1.19-alpine AS builder
RUN apk update && apk add ca-certificates
COPY ["nsswitch.conf", "/etc/nsswitch.conf"]
diff --git a/vendor/cloud.google.com/go/LICENSE b/vendor/cloud.google.com/go/LICENSE
deleted file mode 100644
index d645695673..0000000000
--- a/vendor/cloud.google.com/go/LICENSE
+++ /dev/null
@@ -1,202 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go
deleted file mode 100644
index 5dbe77cc79..0000000000
--- a/vendor/cloud.google.com/go/compute/metadata/metadata.go
+++ /dev/null
@@ -1,536 +0,0 @@
-// Copyright 2014 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// Package metadata provides access to Google Compute Engine (GCE)
-// metadata and API service accounts.
-//
-// This package is a wrapper around the GCE metadata service,
-// as documented at https://developers.google.com/compute/docs/metadata.
-package metadata // import "cloud.google.com/go/compute/metadata"
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net"
- "net/http"
- "net/url"
- "os"
- "runtime"
- "strings"
- "sync"
- "time"
-)
-
-const (
- // metadataIP is the documented metadata server IP address.
- metadataIP = "169.254.169.254"
-
- // metadataHostEnv is the environment variable specifying the
- // GCE metadata hostname. If empty, the default value of
- // metadataIP ("169.254.169.254") is used instead.
- // This is variable name is not defined by any spec, as far as
- // I know; it was made up for the Go package.
- metadataHostEnv = "GCE_METADATA_HOST"
-
- userAgent = "gcloud-golang/0.1"
-)
-
-type cachedValue struct {
- k string
- trim bool
- mu sync.Mutex
- v string
-}
-
-var (
- projID = &cachedValue{k: "project/project-id", trim: true}
- projNum = &cachedValue{k: "project/numeric-project-id", trim: true}
- instID = &cachedValue{k: "instance/id", trim: true}
-)
-
-var defaultClient = &Client{hc: &http.Client{
- Transport: &http.Transport{
- Dial: (&net.Dialer{
- Timeout: 2 * time.Second,
- KeepAlive: 30 * time.Second,
- }).Dial,
- },
-}}
-
-// NotDefinedError is returned when requested metadata is not defined.
-//
-// The underlying string is the suffix after "/computeMetadata/v1/".
-//
-// This error is not returned if the value is defined to be the empty
-// string.
-type NotDefinedError string
-
-func (suffix NotDefinedError) Error() string {
- return fmt.Sprintf("metadata: GCE metadata %q not defined", string(suffix))
-}
-
-func (c *cachedValue) get(cl *Client) (v string, err error) {
- defer c.mu.Unlock()
- c.mu.Lock()
- if c.v != "" {
- return c.v, nil
- }
- if c.trim {
- v, err = cl.getTrimmed(c.k)
- } else {
- v, err = cl.Get(c.k)
- }
- if err == nil {
- c.v = v
- }
- return
-}
-
-var (
- onGCEOnce sync.Once
- onGCE bool
-)
-
-// OnGCE reports whether this process is running on Google Compute Engine.
-func OnGCE() bool {
- onGCEOnce.Do(initOnGCE)
- return onGCE
-}
-
-func initOnGCE() {
- onGCE = testOnGCE()
-}
-
-func testOnGCE() bool {
- // The user explicitly said they're on GCE, so trust them.
- if os.Getenv(metadataHostEnv) != "" {
- return true
- }
-
- ctx, cancel := context.WithCancel(context.Background())
- defer cancel()
-
- resc := make(chan bool, 2)
-
- // Try two strategies in parallel.
- // See https://github.com/googleapis/google-cloud-go/issues/194
- go func() {
- req, _ := http.NewRequest("GET", "http://"+metadataIP, nil)
- req.Header.Set("User-Agent", userAgent)
- res, err := defaultClient.hc.Do(req.WithContext(ctx))
- if err != nil {
- resc <- false
- return
- }
- defer res.Body.Close()
- resc <- res.Header.Get("Metadata-Flavor") == "Google"
- }()
-
- go func() {
- addrs, err := net.DefaultResolver.LookupHost(ctx, "metadata.google.internal")
- if err != nil || len(addrs) == 0 {
- resc <- false
- return
- }
- resc <- strsContains(addrs, metadataIP)
- }()
-
- tryHarder := systemInfoSuggestsGCE()
- if tryHarder {
- res := <-resc
- if res {
- // The first strategy succeeded, so let's use it.
- return true
- }
- // Wait for either the DNS or metadata server probe to
- // contradict the other one and say we are running on
- // GCE. Give it a lot of time to do so, since the system
- // info already suggests we're running on a GCE BIOS.
- timer := time.NewTimer(5 * time.Second)
- defer timer.Stop()
- select {
- case res = <-resc:
- return res
- case <-timer.C:
- // Too slow. Who knows what this system is.
- return false
- }
- }
-
- // There's no hint from the system info that we're running on
- // GCE, so use the first probe's result as truth, whether it's
- // true or false. The goal here is to optimize for speed for
- // users who are NOT running on GCE. We can't assume that
- // either a DNS lookup or an HTTP request to a blackholed IP
- // address is fast. Worst case this should return when the
- // metaClient's Transport.ResponseHeaderTimeout or
- // Transport.Dial.Timeout fires (in two seconds).
- return <-resc
-}
-
-// systemInfoSuggestsGCE reports whether the local system (without
-// doing network requests) suggests that we're running on GCE. If this
-// returns true, testOnGCE tries a bit harder to reach its metadata
-// server.
-func systemInfoSuggestsGCE() bool {
- if runtime.GOOS != "linux" {
- // We don't have any non-Linux clues available, at least yet.
- return false
- }
- slurp, _ := ioutil.ReadFile("/sys/class/dmi/id/product_name")
- name := strings.TrimSpace(string(slurp))
- return name == "Google" || name == "Google Compute Engine"
-}
-
-// Subscribe calls Client.Subscribe on the default client.
-func Subscribe(suffix string, fn func(v string, ok bool) error) error {
- return defaultClient.Subscribe(suffix, fn)
-}
-
-// Get calls Client.Get on the default client.
-func Get(suffix string) (string, error) { return defaultClient.Get(suffix) }
-
-// ProjectID returns the current instance's project ID string.
-func ProjectID() (string, error) { return defaultClient.ProjectID() }
-
-// NumericProjectID returns the current instance's numeric project ID.
-func NumericProjectID() (string, error) { return defaultClient.NumericProjectID() }
-
-// InternalIP returns the instance's primary internal IP address.
-func InternalIP() (string, error) { return defaultClient.InternalIP() }
-
-// ExternalIP returns the instance's primary external (public) IP address.
-func ExternalIP() (string, error) { return defaultClient.ExternalIP() }
-
-// Email calls Client.Email on the default client.
-func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) }
-
-// Hostname returns the instance's hostname. This will be of the form
-// ".c..internal".
-func Hostname() (string, error) { return defaultClient.Hostname() }
-
-// InstanceTags returns the list of user-defined instance tags,
-// assigned when initially creating a GCE instance.
-func InstanceTags() ([]string, error) { return defaultClient.InstanceTags() }
-
-// InstanceID returns the current VM's numeric instance ID.
-func InstanceID() (string, error) { return defaultClient.InstanceID() }
-
-// InstanceName returns the current VM's instance ID string.
-func InstanceName() (string, error) { return defaultClient.InstanceName() }
-
-// Zone returns the current VM's zone, such as "us-central1-b".
-func Zone() (string, error) { return defaultClient.Zone() }
-
-// InstanceAttributes calls Client.InstanceAttributes on the default client.
-func InstanceAttributes() ([]string, error) { return defaultClient.InstanceAttributes() }
-
-// ProjectAttributes calls Client.ProjectAttributes on the default client.
-func ProjectAttributes() ([]string, error) { return defaultClient.ProjectAttributes() }
-
-// InstanceAttributeValue calls Client.InstanceAttributeValue on the default client.
-func InstanceAttributeValue(attr string) (string, error) {
- return defaultClient.InstanceAttributeValue(attr)
-}
-
-// ProjectAttributeValue calls Client.ProjectAttributeValue on the default client.
-func ProjectAttributeValue(attr string) (string, error) {
- return defaultClient.ProjectAttributeValue(attr)
-}
-
-// Scopes calls Client.Scopes on the default client.
-func Scopes(serviceAccount string) ([]string, error) { return defaultClient.Scopes(serviceAccount) }
-
-func strsContains(ss []string, s string) bool {
- for _, v := range ss {
- if v == s {
- return true
- }
- }
- return false
-}
-
-// A Client provides metadata.
-type Client struct {
- hc *http.Client
-}
-
-// NewClient returns a Client that can be used to fetch metadata.
-// Returns the client that uses the specified http.Client for HTTP requests.
-// If nil is specified, returns the default client.
-func NewClient(c *http.Client) *Client {
- if c == nil {
- return defaultClient
- }
-
- return &Client{hc: c}
-}
-
-// getETag returns a value from the metadata service as well as the associated ETag.
-// This func is otherwise equivalent to Get.
-func (c *Client) getETag(suffix string) (value, etag string, err error) {
- ctx := context.TODO()
- // Using a fixed IP makes it very difficult to spoof the metadata service in
- // a container, which is an important use-case for local testing of cloud
- // deployments. To enable spoofing of the metadata service, the environment
- // variable GCE_METADATA_HOST is first inspected to decide where metadata
- // requests shall go.
- host := os.Getenv(metadataHostEnv)
- if host == "" {
- // Using 169.254.169.254 instead of "metadata" here because Go
- // binaries built with the "netgo" tag and without cgo won't
- // know the search suffix for "metadata" is
- // ".google.internal", and this IP address is documented as
- // being stable anyway.
- host = metadataIP
- }
- suffix = strings.TrimLeft(suffix, "/")
- u := "http://" + host + "/computeMetadata/v1/" + suffix
- req, err := http.NewRequest("GET", u, nil)
- if err != nil {
- return "", "", err
- }
- req.Header.Set("Metadata-Flavor", "Google")
- req.Header.Set("User-Agent", userAgent)
- var res *http.Response
- var reqErr error
- retryer := newRetryer()
- for {
- res, reqErr = c.hc.Do(req)
- var code int
- if res != nil {
- code = res.StatusCode
- }
- if delay, shouldRetry := retryer.Retry(code, reqErr); shouldRetry {
- if err := sleep(ctx, delay); err != nil {
- return "", "", err
- }
- continue
- }
- break
- }
- if reqErr != nil {
- return "", "", reqErr
- }
- defer res.Body.Close()
- if res.StatusCode == http.StatusNotFound {
- return "", "", NotDefinedError(suffix)
- }
- all, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return "", "", err
- }
- if res.StatusCode != 200 {
- return "", "", &Error{Code: res.StatusCode, Message: string(all)}
- }
- return string(all), res.Header.Get("Etag"), nil
-}
-
-// Get returns a value from the metadata service.
-// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/".
-//
-// If the GCE_METADATA_HOST environment variable is not defined, a default of
-// 169.254.169.254 will be used instead.
-//
-// If the requested metadata is not defined, the returned error will
-// be of type NotDefinedError.
-func (c *Client) Get(suffix string) (string, error) {
- val, _, err := c.getETag(suffix)
- return val, err
-}
-
-func (c *Client) getTrimmed(suffix string) (s string, err error) {
- s, err = c.Get(suffix)
- s = strings.TrimSpace(s)
- return
-}
-
-func (c *Client) lines(suffix string) ([]string, error) {
- j, err := c.Get(suffix)
- if err != nil {
- return nil, err
- }
- s := strings.Split(strings.TrimSpace(j), "\n")
- for i := range s {
- s[i] = strings.TrimSpace(s[i])
- }
- return s, nil
-}
-
-// ProjectID returns the current instance's project ID string.
-func (c *Client) ProjectID() (string, error) { return projID.get(c) }
-
-// NumericProjectID returns the current instance's numeric project ID.
-func (c *Client) NumericProjectID() (string, error) { return projNum.get(c) }
-
-// InstanceID returns the current VM's numeric instance ID.
-func (c *Client) InstanceID() (string, error) { return instID.get(c) }
-
-// InternalIP returns the instance's primary internal IP address.
-func (c *Client) InternalIP() (string, error) {
- return c.getTrimmed("instance/network-interfaces/0/ip")
-}
-
-// Email returns the email address associated with the service account.
-// The account may be empty or the string "default" to use the instance's
-// main account.
-func (c *Client) Email(serviceAccount string) (string, error) {
- if serviceAccount == "" {
- serviceAccount = "default"
- }
- return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email")
-}
-
-// ExternalIP returns the instance's primary external (public) IP address.
-func (c *Client) ExternalIP() (string, error) {
- return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip")
-}
-
-// Hostname returns the instance's hostname. This will be of the form
-// ".c..internal".
-func (c *Client) Hostname() (string, error) {
- return c.getTrimmed("instance/hostname")
-}
-
-// InstanceTags returns the list of user-defined instance tags,
-// assigned when initially creating a GCE instance.
-func (c *Client) InstanceTags() ([]string, error) {
- var s []string
- j, err := c.Get("instance/tags")
- if err != nil {
- return nil, err
- }
- if err := json.NewDecoder(strings.NewReader(j)).Decode(&s); err != nil {
- return nil, err
- }
- return s, nil
-}
-
-// InstanceName returns the current VM's instance ID string.
-func (c *Client) InstanceName() (string, error) {
- return c.getTrimmed("instance/name")
-}
-
-// Zone returns the current VM's zone, such as "us-central1-b".
-func (c *Client) Zone() (string, error) {
- zone, err := c.getTrimmed("instance/zone")
- // zone is of the form "projects//zones/".
- if err != nil {
- return "", err
- }
- return zone[strings.LastIndex(zone, "/")+1:], nil
-}
-
-// InstanceAttributes returns the list of user-defined attributes,
-// assigned when initially creating a GCE VM instance. The value of an
-// attribute can be obtained with InstanceAttributeValue.
-func (c *Client) InstanceAttributes() ([]string, error) { return c.lines("instance/attributes/") }
-
-// ProjectAttributes returns the list of user-defined attributes
-// applying to the project as a whole, not just this VM. The value of
-// an attribute can be obtained with ProjectAttributeValue.
-func (c *Client) ProjectAttributes() ([]string, error) { return c.lines("project/attributes/") }
-
-// InstanceAttributeValue returns the value of the provided VM
-// instance attribute.
-//
-// If the requested attribute is not defined, the returned error will
-// be of type NotDefinedError.
-//
-// InstanceAttributeValue may return ("", nil) if the attribute was
-// defined to be the empty string.
-func (c *Client) InstanceAttributeValue(attr string) (string, error) {
- return c.Get("instance/attributes/" + attr)
-}
-
-// ProjectAttributeValue returns the value of the provided
-// project attribute.
-//
-// If the requested attribute is not defined, the returned error will
-// be of type NotDefinedError.
-//
-// ProjectAttributeValue may return ("", nil) if the attribute was
-// defined to be the empty string.
-func (c *Client) ProjectAttributeValue(attr string) (string, error) {
- return c.Get("project/attributes/" + attr)
-}
-
-// Scopes returns the service account scopes for the given account.
-// The account may be empty or the string "default" to use the instance's
-// main account.
-func (c *Client) Scopes(serviceAccount string) ([]string, error) {
- if serviceAccount == "" {
- serviceAccount = "default"
- }
- return c.lines("instance/service-accounts/" + serviceAccount + "/scopes")
-}
-
-// Subscribe subscribes to a value from the metadata service.
-// The suffix is appended to "http://${GCE_METADATA_HOST}/computeMetadata/v1/".
-// The suffix may contain query parameters.
-//
-// Subscribe calls fn with the latest metadata value indicated by the provided
-// suffix. If the metadata value is deleted, fn is called with the empty string
-// and ok false. Subscribe blocks until fn returns a non-nil error or the value
-// is deleted. Subscribe returns the error value returned from the last call to
-// fn, which may be nil when ok == false.
-func (c *Client) Subscribe(suffix string, fn func(v string, ok bool) error) error {
- const failedSubscribeSleep = time.Second * 5
-
- // First check to see if the metadata value exists at all.
- val, lastETag, err := c.getETag(suffix)
- if err != nil {
- return err
- }
-
- if err := fn(val, true); err != nil {
- return err
- }
-
- ok := true
- if strings.ContainsRune(suffix, '?') {
- suffix += "&wait_for_change=true&last_etag="
- } else {
- suffix += "?wait_for_change=true&last_etag="
- }
- for {
- val, etag, err := c.getETag(suffix + url.QueryEscape(lastETag))
- if err != nil {
- if _, deleted := err.(NotDefinedError); !deleted {
- time.Sleep(failedSubscribeSleep)
- continue // Retry on other errors.
- }
- ok = false
- }
- lastETag = etag
-
- if err := fn(val, ok); err != nil || !ok {
- return err
- }
- }
-}
-
-// Error contains an error response from the server.
-type Error struct {
- // Code is the HTTP response status code.
- Code int
- // Message is the server response message.
- Message string
-}
-
-func (e *Error) Error() string {
- return fmt.Sprintf("compute: Received %d `%s`", e.Code, e.Message)
-}
diff --git a/vendor/cloud.google.com/go/compute/metadata/retry.go b/vendor/cloud.google.com/go/compute/metadata/retry.go
deleted file mode 100644
index 0f18f3cda1..0000000000
--- a/vendor/cloud.google.com/go/compute/metadata/retry.go
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package metadata
-
-import (
- "context"
- "io"
- "math/rand"
- "net/http"
- "time"
-)
-
-const (
- maxRetryAttempts = 5
-)
-
-var (
- syscallRetryable = func(err error) bool { return false }
-)
-
-// defaultBackoff is basically equivalent to gax.Backoff without the need for
-// the dependency.
-type defaultBackoff struct {
- max time.Duration
- mul float64
- cur time.Duration
-}
-
-func (b *defaultBackoff) Pause() time.Duration {
- d := time.Duration(1 + rand.Int63n(int64(b.cur)))
- b.cur = time.Duration(float64(b.cur) * b.mul)
- if b.cur > b.max {
- b.cur = b.max
- }
- return d
-}
-
-// sleep is the equivalent of gax.Sleep without the need for the dependency.
-func sleep(ctx context.Context, d time.Duration) error {
- t := time.NewTimer(d)
- select {
- case <-ctx.Done():
- t.Stop()
- return ctx.Err()
- case <-t.C:
- return nil
- }
-}
-
-func newRetryer() *metadataRetryer {
- return &metadataRetryer{bo: &defaultBackoff{
- cur: 100 * time.Millisecond,
- max: 30 * time.Second,
- mul: 2,
- }}
-}
-
-type backoff interface {
- Pause() time.Duration
-}
-
-type metadataRetryer struct {
- bo backoff
- attempts int
-}
-
-func (r *metadataRetryer) Retry(status int, err error) (time.Duration, bool) {
- if status == http.StatusOK {
- return 0, false
- }
- retryOk := shouldRetry(status, err)
- if !retryOk {
- return 0, false
- }
- if r.attempts == maxRetryAttempts {
- return 0, false
- }
- r.attempts++
- return r.bo.Pause(), true
-}
-
-func shouldRetry(status int, err error) bool {
- if 500 <= status && status <= 599 {
- return true
- }
- if err == io.ErrUnexpectedEOF {
- return true
- }
- // Transient network errors should be retried.
- if syscallRetryable(err) {
- return true
- }
- if err, ok := err.(interface{ Temporary() bool }); ok {
- if err.Temporary() {
- return true
- }
- }
- if err, ok := err.(interface{ Unwrap() error }); ok {
- return shouldRetry(status, err.Unwrap())
- }
- return false
-}
diff --git a/vendor/cloud.google.com/go/compute/metadata/retry_linux.go b/vendor/cloud.google.com/go/compute/metadata/retry_linux.go
deleted file mode 100644
index bb412f8917..0000000000
--- a/vendor/cloud.google.com/go/compute/metadata/retry_linux.go
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2021 Google LLC
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-//go:build linux
-// +build linux
-
-package metadata
-
-import "syscall"
-
-func init() {
- // Initialize syscallRetryable to return true on transient socket-level
- // errors. These errors are specific to Linux.
- syscallRetryable = func(err error) bool { return err == syscall.ECONNRESET || err == syscall.ECONNREFUSED }
-}
diff --git a/vendor/github.com/Azure/go-ansiterm/SECURITY.md b/vendor/github.com/Azure/go-ansiterm/SECURITY.md
new file mode 100644
index 0000000000..e138ec5d6a
--- /dev/null
+++ b/vendor/github.com/Azure/go-ansiterm/SECURITY.md
@@ -0,0 +1,41 @@
+
+
+## Security
+
+Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
+
+If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
+
+## Reporting Security Issues
+
+**Please do not report security vulnerabilities through public GitHub issues.**
+
+Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
+
+If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
+
+You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
+
+Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
+
+ * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
+ * Full paths of source file(s) related to the manifestation of the issue
+ * The location of the affected source code (tag/branch/commit or direct URL)
+ * Any special configuration required to reproduce the issue
+ * Step-by-step instructions to reproduce the issue
+ * Proof-of-concept or exploit code (if possible)
+ * Impact of the issue, including how an attacker might exploit the issue
+
+This information will help us triage your report more quickly.
+
+If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
+
+## Preferred Languages
+
+We prefer all communications to be in English.
+
+## Policy
+
+Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
+
+
diff --git a/vendor/github.com/Azure/go-autorest/.gitignore b/vendor/github.com/Azure/go-autorest/.gitignore
deleted file mode 100644
index 3350aaf706..0000000000
--- a/vendor/github.com/Azure/go-autorest/.gitignore
+++ /dev/null
@@ -1,32 +0,0 @@
-# The standard Go .gitignore file follows. (Sourced from: github.com/github/gitignore/master/Go.gitignore)
-# Compiled Object files, Static and Dynamic libs (Shared Objects)
-*.o
-*.a
-*.so
-
-# Folders
-_obj
-_test
-.DS_Store
-.idea/
-.vscode/
-
-# Architecture specific extensions/prefixes
-*.[568vq]
-[568vq].out
-
-*.cgo1.go
-*.cgo2.c
-_cgo_defun.c
-_cgo_gotypes.go
-_cgo_export.*
-
-_testmain.go
-
-*.exe
-*.test
-*.prof
-
-# go-autorest specific
-vendor/
-autorest/azure/example/example
diff --git a/vendor/github.com/Azure/go-autorest/CHANGELOG.md b/vendor/github.com/Azure/go-autorest/CHANGELOG.md
deleted file mode 100644
index d1f596bfc9..0000000000
--- a/vendor/github.com/Azure/go-autorest/CHANGELOG.md
+++ /dev/null
@@ -1,1004 +0,0 @@
-# CHANGELOG
-
-## v14.2.0
-
-- Added package comment to make `github.com/Azure/go-autorest` importable.
-
-## v14.1.1
-
-### Bug Fixes
-
-- Change `x-ms-authorization-auxiliary` header value separator to comma.
-
-## v14.1.0
-
-### New Features
-
-- Added `azure.SetEnvironment()` that will update the global environments map with the specified values.
-
-## v14.0.1
-
-### Bug Fixes
-
-- Fix race condition when refreshing token.
-- Fixed some tests to work with Go 1.14.
-
-## v14.0.0
-
-## Breaking Changes
-
-- By default, the `DoRetryForStatusCodes` functions will no longer infinitely retry a request when the response returns an HTTP status code of 429 (StatusTooManyRequests). To opt in to the old behavior set `autorest.Count429AsRetry` to `false`.
-
-## New Features
-
-- Variable `autorest.Max429Delay` can be used to control the maximum delay between retries when a 429 is received with no `Retry-After` header. The default is zero which means there is no cap.
-
-## v13.4.0
-
-## New Features
-
-- Added field `SendDecorators` to the `Client` type. This can be used to specify a custom chain of SendDecorators per client.
-- Added method `Client.Send()` which includes logic for selecting the preferred chain of SendDecorators.
-
-## v13.3.3
-
-### Bug Fixes
-
-- Fixed connection leak when retrying requests.
-- Enabled exponential back-off with a 2-minute cap when retrying on 429.
-- Fixed some cases where errors were inadvertently dropped.
-
-## v13.3.2
-
-### Bug Fixes
-
-- Updated `autorest.AsStringSlice()` to convert slice elements to their string representation.
-
-## v13.3.1
-
-- Updated external dependencies.
-
-### Bug Fixes
-
-## v13.3.0
-
-### New Features
-
-- Added support for shared key and shared access signature token authorization.
- - `autorest.NewSharedKeyAuthorizer()` and dependent types.
- - `autorest.NewSASTokenAuthorizer()` and dependent types.
-- Added `ServicePrincipalToken.SetCustomRefresh()` so a custom refresh function can be invoked when a token has expired.
-
-### Bug Fixes
-
-- Fixed `cli.AccessTokensPath()` to respect `AZURE_CONFIG_DIR` when set.
-- Support parsing error messages in XML responses.
-
-## v13.2.0
-
-### New Features
-
-- Added the following functions to replace their versions that don't take a context.
- - `adal.InitiateDeviceAuthWithContext()`
- - `adal.CheckForUserCompletionWithContext()`
- - `adal.WaitForUserCompletionWithContext()`
-
-## v13.1.0
-
-### New Features
-
-- Added support for MSI authentication on Azure App Service and Azure Functions.
-
-## v13.0.2
-
-### Bug Fixes
-
-- Always retry a request even if the sender returns a non-nil error.
-
-## v13.0.1
-
-## Bug Fixes
-
-- Fixed `autorest.WithQueryParameters()` so that it properly encodes multi-value query parameters.
-
-## v13.0.0
-
-## Breaking Changes
-
-The `tracing` package has been rewritten to provide a common interface for consumers to wire in the tracing package of their choice.
-What this means is that by default no tracing provider will be compiled into your program and setting the `AZURE_SDK_TRACING_ENABLED`
-environment variable will have no effect. To enable this previous behavior you must now add the following import to your source file.
-```go
- import _ "github.com/Azure/go-autorest/tracing/opencensus"
-```
-The APIs required by autorest-generated code have remained but some APIs have been removed and new ones added.
-The following APIs and variables have been removed (the majority of them were moved to the `opencensus` package).
-- tracing.Transport
-- tracing.Enable()
-- tracing.EnableWithAIForwarding()
-- tracing.Disable()
-
-The following APIs and types have been added
-- tracing.Tracer
-- tracing.Register()
-
-To hook up a tracer simply call `tracing.Register()` passing in a type that satisfies the `tracing.Tracer` interface.
-
-## v12.4.3
-
-### Bug Fixes
-
-- `autorest.MultiTenantServicePrincipalTokenAuthorizer` will now properly add its auxiliary bearer tokens.
-
-## v12.4.2
-
-### Bug Fixes
-
-- Improvements to the fixes made in v12.4.1.
- - Remove `override` stanza from Gopkg.toml and `replace` directive from go.mod as they don't apply when being consumed as a dependency.
- - Switched to latest version of `ocagent` that still depends on protobuf v1.2.
- - Add indirect dependencies to the `required` clause with matching `constraint` stanzas so that `dep` dependencies match go.sum.
-
-## v12.4.1
-
-### Bug Fixes
-
-- Updated OpenCensus and OCAgent versions to versions that don't depend on v1.3+ of protobuf as it was breaking kubernetes.
-- Pinned opencensus-proto to a version that's compatible with our versions of OpenCensus and OCAgent.
-
-## v12.4.0
-
-### New Features
-
-- Added `autorest.WithPrepareDecorators` and `autorest.GetPrepareDecorators` for adding and retrieving a custom chain of PrepareDecorators to the provided context.
-
-## v12.3.0
-
-### New Features
-
-- Support for multi-tenant via x-ms-authorization-auxiliary header has been added for client credentials with
- secret scenario; this basically bundles multiple OAuthConfig and ServicePrincipalToken types into corresponding
- MultiTenant* types along with a new authorizer that adds the primary and auxiliary token headers to the reqest.
- The authenticaion helpers have been updated to support this scenario; if environment var AZURE_AUXILIARY_TENANT_IDS
- is set with a semicolon delimited list of tenants the multi-tenant codepath will kick in to create the appropriate authorizer.
- See `adal.NewMultiTenantOAuthConfig`, `adal.NewMultiTenantServicePrincipalToken` and `autorest.NewMultiTenantServicePrincipalTokenAuthorizer`
- along with their supporting types and methods.
-- Added `autorest.WithSendDecorators` and `autorest.GetSendDecorators` for adding and retrieving a custom chain of SendDecorators to the provided context.
-- Added `autorest.DoRetryForStatusCodesWithCap` and `autorest.DelayForBackoffWithCap` to enforce an upper bound on the duration between retries.
-
-## v12.2.0
-
-### New Features
-
-- Added `autorest.WithXML`, `autorest.AsMerge`, `autorest.WithBytes` preparer decorators.
-- Added `autorest.ByUnmarshallingBytes` response decorator.
-- Added `Response.IsHTTPStatus` and `Response.HasHTTPStatus` helper methods for inspecting HTTP status code in `autorest.Response` types.
-
-### Bug Fixes
-
-- `autorest.DelayWithRetryAfter` now supports HTTP-Dates in the `Retry-After` header and is not limited to just 429 status codes.
-
-## v12.1.0
-
-### New Features
-
-- Added `to.ByteSlicePtr()`.
-- Added blob/queue storage resource ID to `azure.ResourceIdentifier`.
-
-## v12.0.0
-
-### Breaking Changes
-
-In preparation for modules the following deprecated content has been removed.
-
- - async.NewFuture()
- - async.Future.Done()
- - async.Future.WaitForCompletion()
- - async.DoPollForAsynchronous()
- - The `utils` package
- - validation.NewErrorWithValidationError()
- - The `version` package
-
-## v11.9.0
-
-### New Features
-
-- Add `ResourceIdentifiers` field to `azure.Environment` containing resource IDs for public and sovereign clouds.
-
-## v11.8.0
-
-### New Features
-
-- Added `autorest.NewClientWithOptions()` to support endpoints that require free renegotiation.
-
-## v11.7.1
-
-### Bug Fixes
-
-- Fix missing support for http(s) proxy when using the default sender.
-
-## v11.7.0
-
-### New Features
-
-- Added methods to obtain a ServicePrincipalToken on the various credential configuration types in the `auth` package.
-
-## v11.6.1
-
-### Bug Fixes
-
-- Fix ACR DNS endpoint for government clouds.
-- Add Cosmos DB DNS endpoints.
-- Update dependencies to resolve build breaks in OpenCensus.
-
-## v11.6.0
-
-### New Features
-
-- Added type `autorest.BasicAuthorizer` to support Basic authentication.
-
-## v11.5.2
-
-### Bug Fixes
-
-- Fixed `GetTokenFromCLI` did not work with zsh.
-
-## v11.5.1
-
-### Bug Fixes
-
-- In `Client.sender()` set the minimum TLS version on HTTP clients to 1.2.
-
-## v11.5.0
-
-### New Features
-
-- The `auth` package has been refactored so that the environment and file settings are now available.
-- The methods used in `auth.NewAuthorizerFromEnvironment()` are now exported so that custom authorization chains can be created.
-- Added support for certificate authorization for file-based config.
-
-## v11.4.0
-
-### New Features
-
-- Added `adal.AddToUserAgent()` so callers can append custom data to the user-agent header used for ADAL requests.
-- Exported `adal.UserAgent()` for parity with `autorest.Client`.
-
-## v11.3.2
-
-### Bug Fixes
-
-- In `Future.WaitForCompletionRef()` if the provided context has a deadline don't add the default deadline.
-
-## v11.3.1
-
-### Bug Fixes
-
-- For an LRO PUT operation the final GET URL was incorrectly set to the Location polling header in some cases.
-
-## v11.3.0
-
-### New Features
-
-- Added method `ServicePrincipalToken()` to `DeviceFlowConfig` type.
-
-## v11.2.8
-
-### Bug Fixes
-
-- Deprecate content in the `version` package. The functionality has been superseded by content in the `autorest` package.
-
-## v11.2.7
-
-### Bug Fixes
-
-- Fix environment variable name for enabling tracing from `AZURE_SDK_TRACING_ENABELD` to `AZURE_SDK_TRACING_ENABLED`.
- Note that for backward compatibility reasons, both will work until the next major version release of the package.
-
-## v11.2.6
-
-### Bug Fixes
-
-- If zero bytes are read from a polling response body don't attempt to unmarshal them.
-
-## v11.2.5
-
-### Bug Fixes
-
-- Removed race condition in `autorest.DoRetryForStatusCodes`.
-
-## v11.2.4
-
-### Bug Fixes
-
-- Function `cli.ProfilePath` now respects environment `AZURE_CONFIG_DIR` if available.
-
-## v11.2.1
-
-NOTE: Versions of Go prior to 1.10 have been removed from CI as they no
-longer work with golint.
-
-### Bug Fixes
-
-- Method `MSIConfig.Authorizer` now supports user-assigned identities.
-- The adal package now reports its own user-agent string.
-
-## v11.2.0
-
-### New Features
-
-- Added `tracing` package that enables instrumentation of HTTP and API calls.
- Setting the env variable `AZURE_SDK_TRACING_ENABLED` or calling `tracing.Enable`
- will start instrumenting the code for metrics and traces.
- Additionally, setting the env variable `OCAGENT_TRACE_EXPORTER_ENDPOINT` or
- calling `tracing.EnableWithAIForwarding` will start the instrumentation and connect to an
- App Insights Local Forwarder that is needs to be running. Note that if the
- AI Local Forwarder is not running tracking will still be enabled.
- By default, instrumentation is disabled. Once enabled, instrumentation can also
- be programatically disabled by calling `Disable`.
-- Added `DoneWithContext` call for checking LRO status. `Done` has been deprecated.
-
-### Bug Fixes
-
-- Don't use the initial request's context for LRO polling.
-- Don't override the `refreshLock` and the `http.Client` when unmarshalling `ServicePrincipalToken` if
- it is already set.
-
-## v11.1.1
-
-### Bug Fixes
-
-- When creating a future always include the polling tracker even if there's a failure; this allows the underlying response to be obtained by the caller.
-
-## v11.1.0
-
-### New Features
-
-- Added `auth.NewAuthorizerFromCLI` to create an authorizer configured from the Azure 2.0 CLI.
-- Added `adal.NewOAuthConfigWithAPIVersion` to create an OAuthConfig with the specified API version.
-
-## v11.0.1
-
-### New Features
-
-- Added `x5c` header to client assertion for certificate Issuer+Subject Name authentication.
-
-## v11.0.0
-
-### Breaking Changes
-
-- To handle differences between ADFS and AAD the following fields have had their types changed from `string` to `json.Number`
- - ExpiresIn
- - ExpiresOn
- - NotBefore
-
-### New Features
-
-- Added `auth.NewAuthorizerFromFileWithResource` to create an authorizer from the config file with the specified resource.
-- Setting a client's `PollingDuration` to zero will use the provided context to control a LRO's polling duration.
-
-## v10.15.5
-
-### Bug Fixes
-
-- In `DoRetryForStatusCodes`, if a request's context is cancelled return the last response.
-
-## v10.15.4
-
-### Bug Fixes
-
-- If a polling operation returns a failure status code return the associated error.
-
-## v10.15.3
-
-### Bug Fixes
-
-- Initialize the polling URL and method for an LRO tracker on each iteration, favoring the Azure-AsyncOperation header.
-
-## v10.15.2
-
-### Bug Fixes
-
-- Use fmt.Fprint when printing request/response so that any escape sequences aren't treated as format specifiers.
-
-## v10.15.1
-
-### Bug Fixes
-
-- If an LRO API returns a `Failed` provisioning state in the initial response return an error at that point so the caller doesn't have to poll.
-- For failed LROs without an OData v4 error include the response body in the error's `AdditionalInfo` field to aid in diagnosing the failure.
-
-## v10.15.0
-
-### New Features
-
-- Add initial support for request/response logging via setting environment variables.
- Setting `AZURE_GO_SDK_LOG_LEVEL` to `LogInfo` will log request/response
- without their bodies. To include the bodies set the log level to `LogDebug`.
- By default the logger writes to strerr, however it can also write to stdout or a file
- if specified in `AZURE_GO_SDK_LOG_FILE`. Note that if the specified file
- already exists it will be truncated.
- IMPORTANT: by default the logger will redact the Authorization and Ocp-Apim-Subscription-Key
- headers. Any other secrets will _not_ be redacted.
-
-## v10.14.0
-
-### New Features
-
-- Added package version that contains version constants and user-agent data.
-
-### Bug Fixes
-
-- Add the user-agent to token requests.
-
-## v10.13.0
-
-- Added support for additionalInfo in ServiceError type.
-
-## v10.12.0
-
-### New Features
-
-- Added field ServicePrincipalToken.MaxMSIRefreshAttempts to configure the maximun number of attempts to refresh an MSI token.
-
-## v10.11.4
-
-### Bug Fixes
-
-- If an LRO returns http.StatusOK on the initial response with no async headers return the response body from Future.GetResult().
-- If there is no "final GET URL" return an error from Future.GetResult().
-
-## v10.11.3
-
-### Bug Fixes
-
-- In IMDS retry logic, if we don't receive a response don't retry.
- - Renamed the retry function so it's clear it's meant for IMDS only.
-- For error response bodies that aren't OData-v4 compliant stick the raw JSON in the ServiceError.Details field so the information isn't lost.
- - Also add the raw HTTP response to the DetailedResponse.
-- Removed superfluous wrapping of response error in azure.DoRetryWithRegistration().
-
-## v10.11.2
-
-### Bug Fixes
-
-- Validation for integers handles int and int64 types.
-
-## v10.11.1
-
-### Bug Fixes
-
-- Adding User information to authorization config as parsed from CLI cache.
-
-## v10.11.0
-
-### New Features
-
-- Added NewServicePrincipalTokenFromManualTokenSecret for creating a new SPT using a manual token and secret
-- Added method ServicePrincipalToken.MarshalTokenJSON() to marshall the inner Token
-
-## v10.10.0
-
-### New Features
-
-- Most ServicePrincipalTokens can now be marshalled/unmarshall to/from JSON (ServicePrincipalCertificateSecret and ServicePrincipalMSISecret are not supported).
-- Added method ServicePrincipalToken.SetRefreshCallbacks().
-
-## v10.9.2
-
-### Bug Fixes
-
-- Refreshing a refresh token obtained from a web app authorization code now works.
-
-## v10.9.1
-
-### Bug Fixes
-
-- The retry logic for MSI token requests now uses exponential backoff per the guidelines.
-- IsTemporaryNetworkError() will return true for errors that don't implement the net.Error interface.
-
-## v10.9.0
-
-### Deprecated Methods
-
-| Old Method | New Method |
-| -------------------------: | :---------------------------: |
-| azure.NewFuture() | azure.NewFutureFromResponse() |
-| Future.WaitForCompletion() | Future.WaitForCompletionRef() |
-
-### New Features
-
-- Added azure.NewFutureFromResponse() for creating a Future from the initial response from an async operation.
-- Added Future.GetResult() for making the final GET call to retrieve the result from an async operation.
-
-### Bug Fixes
-
-- Some futures failed to return their results, this should now be fixed.
-
-## v10.8.2
-
-### Bug Fixes
-
-- Add nil-gaurd to token retry logic.
-
-## v10.8.1
-
-### Bug Fixes
-
-- Return a TokenRefreshError if the sender fails on the initial request.
-- Don't retry on non-temporary network errors.
-
-## v10.8.0
-
-- Added NewAuthorizerFromEnvironmentWithResource() helper function.
-
-## v10.7.0
-
-### New Features
-
-- Added \*WithContext() methods to ADAL token refresh operations.
-
-## v10.6.2
-
-- Fixed a bug on device authentication.
-
-## v10.6.1
-
-- Added retries to MSI token get request.
-
-## v10.6.0
-
-- Changed MSI token implementation. Now, the token endpoint is the IMDS endpoint.
-
-## v10.5.1
-
-### Bug Fixes
-
-- `DeviceFlowConfig.Authorizer()` now prints the device code message when running `go test`. `-v` flag is required.
-
-## v10.5.0
-
-### New Features
-
-- Added NewPollingRequestWithContext() for use with polling asynchronous operations.
-
-### Bug Fixes
-
-- Make retry logic use the request's context instead of the deprecated Cancel object.
-
-## v10.4.0
-
-### New Features
-
-- Added helper for parsing Azure Resource ID's.
-- Added deprecation message to utils.GetEnvVarOrExit()
-
-## v10.3.0
-
-### New Features
-
-- Added EnvironmentFromURL method to load an Environment from a given URL. This function is particularly useful in the private and hybrid Cloud model, where one may define their own endpoints
-- Added TokenAudience endpoint to Environment structure. This is useful in private and hybrid cloud models where TokenAudience endpoint can be different from ResourceManagerEndpoint
-
-## v10.2.0
-
-### New Features
-
-- Added endpoints for batch management.
-
-## v10.1.3
-
-### Bug Fixes
-
-- In Client.Do() invoke WithInspection() last so that it will inspect WithAuthorization().
-- Fixed authorization methods to invoke p.Prepare() first, aligning them with the other preparers.
-
-## v10.1.2
-
-- Corrected comment for auth.NewAuthorizerFromFile() function.
-
-## v10.1.1
-
-- Updated version number to match current release.
-
-## v10.1.0
-
-### New Features
-
-- Expose the polling URL for futures.
-
-### Bug Fixes
-
-- Add validation.NewErrorWithValidationError back to prevent breaking changes (it is deprecated).
-
-## v10.0.0
-
-### New Features
-
-- Added target and innererror fields to ServiceError to comply with OData v4 spec.
-- The Done() method on futures will now return a ServiceError object when available (it used to return a partial value of such errors).
-- Added helper methods for obtaining authorizers.
-- Expose the polling URL for futures.
-
-### Bug Fixes
-
-- Switched from glide to dep for dependency management.
-- Fixed unmarshaling of ServiceError for JSON bodies that don't conform to the OData spec.
-- Fixed a race condition in token refresh.
-
-### Breaking Changes
-
-- The ServiceError.Details field type has been changed to match the OData v4 spec.
-- Go v1.7 has been dropped from CI.
-- API parameter validation failures will now return a unique error type validation.Error.
-- The adal.Token type has been decomposed from adal.ServicePrincipalToken (this was necessary in order to fix the token refresh race).
-
-## v9.10.0
-
-- Fix the Service Bus suffix in Azure public env
-- Add Service Bus Endpoint (AAD ResourceURI) for use in [Azure Service Bus RBAC Preview](https://docs.microsoft.com/en-us/azure/service-bus-messaging/service-bus-role-based-access-control)
-
-## v9.9.0
-
-### New Features
-
-- Added EventGridKeyAuthorizer for key authorization with event grid topics.
-
-### Bug Fixes
-
-- Fixed race condition when auto-refreshing service principal tokens.
-
-## v9.8.1
-
-### Bug Fixes
-
-- Added http.StatusNoContent (204) to the list of expected status codes for long-running operations.
-- Updated runtime version info so it's current.
-
-## v9.8.0
-
-### New Features
-
-- Added type azure.AsyncOpIncompleteError to be returned from a future's Result() method when the operation has not completed.
-
-## v9.7.1
-
-### Bug Fixes
-
-- Use correct AAD and Graph endpoints for US Gov environment.
-
-## v9.7.0
-
-### New Features
-
-- Added support for application/octet-stream MIME types.
-
-## v9.6.1
-
-### Bug Fixes
-
-- Ensure Authorization header is added to request when polling for registration status.
-
-## v9.6.0
-
-### New Features
-
-- Added support for acquiring tokens via MSI with a user assigned identity.
-
-## v9.5.3
-
-### Bug Fixes
-
-- Don't remove encoding of existing URL Query parameters when calling autorest.WithQueryParameters.
-- Set correct Content Type when using autorest.WithFormData.
-
-## v9.5.2
-
-### Bug Fixes
-
-- Check for nil \*http.Response before dereferencing it.
-
-## v9.5.1
-
-### Bug Fixes
-
-- Don't count http.StatusTooManyRequests (429) against the retry cap.
-- Use retry logic when SkipResourceProviderRegistration is set to true.
-
-## v9.5.0
-
-### New Features
-
-- Added support for username + password, API key, authoriazation code and cognitive services authentication.
-- Added field SkipResourceProviderRegistration to clients to provide a way to skip auto-registration of RPs.
-- Added utility function AsStringSlice() to convert its parameters to a string slice.
-
-### Bug Fixes
-
-- When checking for authentication failures look at the error type not the status code as it could vary.
-
-## v9.4.2
-
-### Bug Fixes
-
-- Validate parameters when creating credentials.
-- Don't retry requests if the returned status is a 401 (http.StatusUnauthorized) as it will never succeed.
-
-## v9.4.1
-
-### Bug Fixes
-
-- Update the AccessTokensPath() to read access tokens path through AZURE_ACCESS_TOKEN_FILE. If this
- environment variable is not set, it will fall back to use default path set by Azure CLI.
-- Use case-insensitive string comparison for polling states.
-
-## v9.4.0
-
-### New Features
-
-- Added WaitForCompletion() to Future as a default polling implementation.
-
-### Bug Fixes
-
-- Method Future.Done() shouldn't update polling status for unexpected HTTP status codes.
-
-## v9.3.1
-
-### Bug Fixes
-
-- DoRetryForStatusCodes will retry if sender.Do returns a non-nil error.
-
-## v9.3.0
-
-### New Features
-
-- Added PollingMethod() to Future so callers know what kind of polling mechanism is used.
-- Added azure.ChangeToGet() which transforms an http.Request into a GET (to be used with LROs).
-
-## v9.2.0
-
-### New Features
-
-- Added support for custom Azure Stack endpoints.
-- Added type azure.Future used to track the status of long-running operations.
-
-### Bug Fixes
-
-- Preserve the original error in DoRetryWithRegistration when registration fails.
-
-## v9.1.1
-
-- Fixes a bug regarding the cookie jar on `autorest.Client.Sender`.
-
-## v9.1.0
-
-### New Features
-
-- In cases where there is a non-empty error from the service, attempt to unmarshal it instead of uniformly calling it an "Unknown" error.
-- Support for loading Azure CLI Authentication files.
-- Automatically register your subscription with the Azure Resource Provider if it hadn't been previously.
-
-### Bug Fixes
-
-- RetriableRequest can now tolerate a ReadSeekable body being read but not reset.
-- Adding missing Apache Headers
-
-## v9.0.0
-
-> **IMPORTANT:** This release was intially labeled incorrectly as `v8.4.0`. From the time it was released, it should have been marked `v9.0.0` because it contains breaking changes to the MSI packages. We appologize for any inconvenience this causes.
-
-Adding MSI Endpoint Support and CLI token rehydration.
-
-## v8.3.1
-
-Pick up bug fix in adal for MSI support.
-
-## v8.3.0
-
-Updates to Error string formats for clarity. Also, adding a copy of the http.Response to errors for an improved debugging experience.
-
-## v8.2.0
-
-### New Features
-
-- Add support for bearer authentication callbacks
-- Support 429 response codes that include "Retry-After" header
-- Support validation constraint "Pattern" for map keys
-
-### Bug Fixes
-
-- Make RetriableRequest work with multiple versions of Go
-
-## v8.1.1
-
-Updates the RetriableRequest to take advantage of GetBody() added in Go 1.8.
-
-## v8.1.0
-
-Adds RetriableRequest type for more efficient handling of retrying HTTP requests.
-
-## v8.0.0
-
-ADAL refactored into its own package.
-Support for UNIX time.
-
-## v7.3.1
-
-- Version Testing now removed from production bits that are shipped with the library.
-
-## v7.3.0
-
-- Exposing new `RespondDecorator`, `ByDiscardingBody`. This allows operations
- to acknowledge that they do not need either the entire or a trailing portion
- of accepts response body. In doing so, Go's http library can reuse HTTP
- connections more readily.
-- Adding `PrepareDecorator` to target custom BaseURLs.
-- Adding ACR suffix to public cloud environment.
-- Updating Glide dependencies.
-
-## v7.2.5
-
-- Fixed the Active Directory endpoint for the China cloud.
-- Removes UTF-8 BOM if present in response payload.
-- Added telemetry.
-
-## v7.2.3
-
-- Fixing bug in calls to `DelayForBackoff` that caused doubling of delay
- duration.
-
-## v7.2.2
-
-- autorest/azure: added ASM and ARM VM DNS suffixes.
-
-## v7.2.1
-
-- fixed parsing of UTC times that are not RFC3339 conformant.
-
-## v7.2.0
-
-- autorest/validation: Reformat validation error for better error message.
-
-## v7.1.0
-
-- preparer: Added support for multipart formdata - WithMultiPartFormdata()
-- preparer: Added support for sending file in request body - WithFile
-- client: Added RetryDuration parameter.
-- autorest/validation: new package for validation code for Azure Go SDK.
-
-## v7.0.7
-
-- Add trailing / to endpoint
-- azure: add EnvironmentFromName
-
-## v7.0.6
-
-- Add retry logic for 408, 500, 502, 503 and 504 status codes.
-- Change url path and query encoding logic.
-- Fix DelayForBackoff for proper exponential delay.
-- Add CookieJar in Client.
-
-## v7.0.5
-
-- Add check to start polling only when status is in [200,201,202].
-- Refactoring for unchecked errors.
-- azure/persist changes.
-- Fix 'file in use' issue in renewing token in deviceflow.
-- Store header RetryAfter for subsequent requests in polling.
-- Add attribute details in service error.
-
-## v7.0.4
-
-- Better error messages for long running operation failures
-
-## v7.0.3
-
-- Corrected DoPollForAsynchronous to properly handle the initial response
-
-## v7.0.2
-
-- Corrected DoPollForAsynchronous to continue using the polling method first discovered
-
-## v7.0.1
-
-- Fixed empty JSON input error in ByUnmarshallingJSON
-- Fixed polling support for GET calls
-- Changed format name from TimeRfc1123 to TimeRFC1123
-
-## v7.0.0
-
-- Added ByCopying responder with supporting TeeReadCloser
-- Rewrote Azure asynchronous handling
-- Reverted to only unmarshalling JSON
-- Corrected handling of RFC3339 time strings and added support for Rfc1123 time format
-
-The `json.Decoder` does not catch bad data as thoroughly as `json.Unmarshal`. Since
-`encoding/json` successfully deserializes all core types, and extended types normally provide
-their custom JSON serialization handlers, the code has been reverted back to using
-`json.Unmarshal`. The original change to use `json.Decode` was made to reduce duplicate
-code; there is no loss of function, and there is a gain in accuracy, by reverting.
-
-Additionally, Azure services indicate requests to be polled by multiple means. The existing code
-only checked for one of those (that is, the presence of the `Azure-AsyncOperation` header).
-The new code correctly covers all cases and aligns with the other Azure SDKs.
-
-## v6.1.0
-
-- Introduced `date.ByUnmarshallingJSONDate` and `date.ByUnmarshallingJSONTime` to enable JSON encoded values.
-
-## v6.0.0
-
-- Completely reworked the handling of polled and asynchronous requests
-- Removed unnecessary routines
-- Reworked `mocks.Sender` to replay a series of `http.Response` objects
-- Added `PrepareDecorators` for primitive types (e.g., bool, int32)
-
-Handling polled and asynchronous requests is no longer part of `Client#Send`. Instead new
-`SendDecorators` implement different styles of polled behavior. See`autorest.DoPollForStatusCodes`
-and `azure.DoPollForAsynchronous` for examples.
-
-## v5.0.0
-
-- Added new RespondDecorators unmarshalling primitive types
-- Corrected application of inspection and authorization PrependDecorators
-
-## v4.0.0
-
-- Added support for Azure long-running operations.
-- Added cancelation support to all decorators and functions that may delay.
-- Breaking: `DelayForBackoff` now accepts a channel, which may be nil.
-
-## v3.1.0
-
-- Add support for OAuth Device Flow authorization.
-- Add support for ServicePrincipalTokens that are backed by an existing token, rather than other secret material.
-- Add helpers for persisting and restoring Tokens.
-- Increased code coverage in the github.com/Azure/autorest/azure package
-
-## v3.0.0
-
-- Breaking: `NewErrorWithError` no longer takes `statusCode int`.
-- Breaking: `NewErrorWithStatusCode` is replaced with `NewErrorWithResponse`.
-- Breaking: `Client#Send()` no longer takes `codes ...int` argument.
-- Add: XML unmarshaling support with `ByUnmarshallingXML()`
-- Stopped vending dependencies locally and switched to [Glide](https://github.com/Masterminds/glide).
- Applications using this library should either use Glide or vendor dependencies locally some other way.
-- Add: `azure.WithErrorUnlessStatusCode()` decorator to handle Azure errors.
-- Fix: use `net/http.DefaultClient` as base client.
-- Fix: Missing inspection for polling responses added.
-- Add: CopyAndDecode helpers.
-- Improved `./autorest/to` with `[]string` helpers.
-- Removed golint suppressions in .travis.yml.
-
-## v2.1.0
-
-- Added `StatusCode` to `Error` for more easily obtaining the HTTP Reponse StatusCode (if any)
-
-## v2.0.0
-
-- Changed `to.StringMapPtr` method signature to return a pointer
-- Changed `ServicePrincipalCertificateSecret` and `NewServicePrincipalTokenFromCertificate` to support generic certificate and private keys
-
-## v1.0.0
-
-- Added Logging inspectors to trace http.Request / Response
-- Added support for User-Agent header
-- Changed WithHeader PrepareDecorator to use set vs. add
-- Added JSON to error when unmarshalling fails
-- Added Client#Send method
-- Corrected case of "Azure" in package paths
-- Added "to" helpers, Azure helpers, and improved ease-of-use
-- Corrected golint issues
-
-## v1.0.1
-
-- Added CHANGELOG.md
-
-## v1.1.0
-
-- Added mechanism to retrieve a ServicePrincipalToken using a certificate-signed JWT
-- Added an example of creating a certificate-based ServicePrincipal and retrieving an OAuth token using the certificate
-
-## v1.1.1
-
-- Introduce godeps and vendor dependencies introduced in v1.1.1
diff --git a/vendor/github.com/Azure/go-autorest/GNUmakefile b/vendor/github.com/Azure/go-autorest/GNUmakefile
deleted file mode 100644
index a434e73ac4..0000000000
--- a/vendor/github.com/Azure/go-autorest/GNUmakefile
+++ /dev/null
@@ -1,23 +0,0 @@
-DIR?=./autorest/
-
-default: build
-
-build: fmt
- go install $(DIR)
-
-test:
- go test $(DIR) || exit 1
-
-vet:
- @echo "go vet ."
- @go vet $(DIR)... ; if [ $$? -eq 1 ]; then \
- echo ""; \
- echo "Vet found suspicious constructs. Please check the reported constructs"; \
- echo "and fix them if necessary before submitting the code for review."; \
- exit 1; \
- fi
-
-fmt:
- gofmt -w $(DIR)
-
-.PHONY: build test vet fmt
diff --git a/vendor/github.com/Azure/go-autorest/Gopkg.lock b/vendor/github.com/Azure/go-autorest/Gopkg.lock
deleted file mode 100644
index dc6e3e633e..0000000000
--- a/vendor/github.com/Azure/go-autorest/Gopkg.lock
+++ /dev/null
@@ -1,324 +0,0 @@
-# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
-
-
-[[projects]]
- digest = "1:892e39e5c083d0943f1e80ab8351690f183c6a5ab24e1d280adcad424c26255e"
- name = "contrib.go.opencensus.io/exporter/ocagent"
- packages = ["."]
- pruneopts = "UT"
- revision = "a8a6f458bbc1d5042322ad1f9b65eeb0b69be9ea"
- version = "v0.6.0"
-
-[[projects]]
- digest = "1:8f5acd4d4462b5136af644d25101f0968a7a94ee90fcb2059cec5b7cc42e0b20"
- name = "github.com/census-instrumentation/opencensus-proto"
- packages = [
- "gen-go/agent/common/v1",
- "gen-go/agent/metrics/v1",
- "gen-go/agent/trace/v1",
- "gen-go/metrics/v1",
- "gen-go/resource/v1",
- "gen-go/trace/v1",
- ]
- pruneopts = "UT"
- revision = "d89fa54de508111353cb0b06403c00569be780d8"
- version = "v0.2.1"
-
-[[projects]]
- digest = "1:ffe9824d294da03b391f44e1ae8281281b4afc1bdaa9588c9097785e3af10cec"
- name = "github.com/davecgh/go-spew"
- packages = ["spew"]
- pruneopts = "UT"
- revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
- version = "v1.1.1"
-
-[[projects]]
- digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55"
- name = "github.com/dgrijalva/jwt-go"
- packages = ["."]
- pruneopts = "UT"
- revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
- version = "v3.2.0"
-
-[[projects]]
- digest = "1:cf0d2e435fd4ce45b789e93ef24b5f08e86be0e9807a16beb3694e2d8c9af965"
- name = "github.com/dimchansky/utfbom"
- packages = ["."]
- pruneopts = "UT"
- revision = "d2133a1ce379ef6fa992b0514a77146c60db9d1c"
- version = "v1.1.0"
-
-[[projects]]
- branch = "master"
- digest = "1:b7cb6054d3dff43b38ad2e92492f220f57ae6087ee797dca298139776749ace8"
- name = "github.com/golang/groupcache"
- packages = ["lru"]
- pruneopts = "UT"
- revision = "611e8accdfc92c4187d399e95ce826046d4c8d73"
-
-[[projects]]
- digest = "1:e3839df32927e8d3403cd5aa7253d966e8ff80fc8f10e2e35d146461cd83fcfa"
- name = "github.com/golang/protobuf"
- packages = [
- "descriptor",
- "jsonpb",
- "proto",
- "protoc-gen-go/descriptor",
- "ptypes",
- "ptypes/any",
- "ptypes/duration",
- "ptypes/struct",
- "ptypes/timestamp",
- "ptypes/wrappers",
- ]
- pruneopts = "UT"
- revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7"
- version = "v1.3.2"
-
-[[projects]]
- digest = "1:c560cd79300fac84f124b96225181a637a70b60155919a3c36db50b7cca6b806"
- name = "github.com/grpc-ecosystem/grpc-gateway"
- packages = [
- "internal",
- "runtime",
- "utilities",
- ]
- pruneopts = "UT"
- revision = "f7120437bb4f6c71f7f5076ad65a45310de2c009"
- version = "v1.12.1"
-
-[[projects]]
- digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79"
- name = "github.com/mitchellh/go-homedir"
- packages = ["."]
- pruneopts = "UT"
- revision = "af06845cf3004701891bf4fdb884bfe4920b3727"
- version = "v1.1.0"
-
-[[projects]]
- digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe"
- name = "github.com/pmezard/go-difflib"
- packages = ["difflib"]
- pruneopts = "UT"
- revision = "792786c7400a136282c1664665ae0a8db921c6c2"
- version = "v1.0.0"
-
-[[projects]]
- digest = "1:99d32780e5238c2621fff621123997c3e3cca96db8be13179013aea77dfab551"
- name = "github.com/stretchr/testify"
- packages = [
- "assert",
- "require",
- ]
- pruneopts = "UT"
- revision = "221dbe5ed46703ee255b1da0dec05086f5035f62"
- version = "v1.4.0"
-
-[[projects]]
- digest = "1:7c5e00383399fe13de0b4b65c9fdde16275407ce8ac02d867eafeaa916edcc71"
- name = "go.opencensus.io"
- packages = [
- ".",
- "internal",
- "internal/tagencoding",
- "metric/metricdata",
- "metric/metricproducer",
- "plugin/ocgrpc",
- "plugin/ochttp",
- "plugin/ochttp/propagation/b3",
- "plugin/ochttp/propagation/tracecontext",
- "resource",
- "stats",
- "stats/internal",
- "stats/view",
- "tag",
- "trace",
- "trace/internal",
- "trace/propagation",
- "trace/tracestate",
- ]
- pruneopts = "UT"
- revision = "aad2c527c5defcf89b5afab7f37274304195a6b2"
- version = "v0.22.2"
-
-[[projects]]
- branch = "master"
- digest = "1:f604f5e2ee721b6757d962dfe7bab4f28aae50c456e39cfb2f3819762a44a6ae"
- name = "golang.org/x/crypto"
- packages = [
- "pkcs12",
- "pkcs12/internal/rc2",
- ]
- pruneopts = "UT"
- revision = "e9b2fee46413994441b28dfca259d911d963dfed"
-
-[[projects]]
- branch = "master"
- digest = "1:334b27eac455cb6567ea28cd424230b07b1a64334a2f861a8075ac26ce10af43"
- name = "golang.org/x/lint"
- packages = [
- ".",
- "golint",
- ]
- pruneopts = "UT"
- revision = "fdd1cda4f05fd1fd86124f0ef9ce31a0b72c8448"
-
-[[projects]]
- branch = "master"
- digest = "1:257a75d024975428ab9192bfc334c3490882f8cb21322ea5784ca8eca000a910"
- name = "golang.org/x/net"
- packages = [
- "http/httpguts",
- "http2",
- "http2/hpack",
- "idna",
- "internal/timeseries",
- "trace",
- ]
- pruneopts = "UT"
- revision = "1ddd1de85cb0337b623b740a609d35817d516a8d"
-
-[[projects]]
- branch = "master"
- digest = "1:382bb5a7fb4034db3b6a2d19e5a4a6bcf52f4750530603c01ca18a172fa3089b"
- name = "golang.org/x/sync"
- packages = ["semaphore"]
- pruneopts = "UT"
- revision = "cd5d95a43a6e21273425c7ae415d3df9ea832eeb"
-
-[[projects]]
- branch = "master"
- digest = "1:4da420ceda5f68e8d748aa2169d0ed44ffadb1bbd6537cf778a49563104189b8"
- name = "golang.org/x/sys"
- packages = ["unix"]
- pruneopts = "UT"
- revision = "ce4227a45e2eb77e5c847278dcc6a626742e2945"
-
-[[projects]]
- digest = "1:8d8faad6b12a3a4c819a3f9618cb6ee1fa1cfc33253abeeea8b55336721e3405"
- name = "golang.org/x/text"
- packages = [
- "collate",
- "collate/build",
- "internal/colltab",
- "internal/gen",
- "internal/language",
- "internal/language/compact",
- "internal/tag",
- "internal/triegen",
- "internal/ucd",
- "language",
- "secure/bidirule",
- "transform",
- "unicode/bidi",
- "unicode/cldr",
- "unicode/norm",
- "unicode/rangetable",
- ]
- pruneopts = "UT"
- revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475"
- version = "v0.3.2"
-
-[[projects]]
- branch = "master"
- digest = "1:4eb5ea8395fb60212dd58b92c9db80bab59d5e99c7435f9a6a0a528c373b60e7"
- name = "golang.org/x/tools"
- packages = [
- "go/ast/astutil",
- "go/gcexportdata",
- "go/internal/gcimporter",
- "go/types/typeutil",
- ]
- pruneopts = "UT"
- revision = "259af5ff87bdcd4abf2ecda8edc3f13f04f26a42"
-
-[[projects]]
- digest = "1:964bb30febc27fabfbec4759fa530c6ec35e77a7c85fed90b9317ea39a054877"
- name = "google.golang.org/api"
- packages = ["support/bundler"]
- pruneopts = "UT"
- revision = "8a410c21381766a810817fd6200fce8838ecb277"
- version = "v0.14.0"
-
-[[projects]]
- branch = "master"
- digest = "1:a8d5c2c6e746b3485e36908ab2a9e3d77b86b81f8156d88403c7d2b462431dfd"
- name = "google.golang.org/genproto"
- packages = [
- "googleapis/api/httpbody",
- "googleapis/rpc/status",
- "protobuf/field_mask",
- ]
- pruneopts = "UT"
- revision = "51378566eb590fa106d1025ea12835a4416dda84"
-
-[[projects]]
- digest = "1:b59ce3ddb11daeeccccc9cb3183b58ebf8e9a779f1c853308cd91612e817a301"
- name = "google.golang.org/grpc"
- packages = [
- ".",
- "backoff",
- "balancer",
- "balancer/base",
- "balancer/roundrobin",
- "binarylog/grpc_binarylog_v1",
- "codes",
- "connectivity",
- "credentials",
- "credentials/internal",
- "encoding",
- "encoding/proto",
- "grpclog",
- "internal",
- "internal/backoff",
- "internal/balancerload",
- "internal/binarylog",
- "internal/buffer",
- "internal/channelz",
- "internal/envconfig",
- "internal/grpcrand",
- "internal/grpcsync",
- "internal/resolver/dns",
- "internal/resolver/passthrough",
- "internal/syscall",
- "internal/transport",
- "keepalive",
- "metadata",
- "naming",
- "peer",
- "resolver",
- "serviceconfig",
- "stats",
- "status",
- "tap",
- ]
- pruneopts = "UT"
- revision = "1a3960e4bd028ac0cec0a2afd27d7d8e67c11514"
- version = "v1.25.1"
-
-[[projects]]
- digest = "1:b75b3deb2bce8bc079e16bb2aecfe01eb80098f5650f9e93e5643ca8b7b73737"
- name = "gopkg.in/yaml.v2"
- packages = ["."]
- pruneopts = "UT"
- revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce"
- version = "v2.2.7"
-
-[solve-meta]
- analyzer-name = "dep"
- analyzer-version = 1
- input-imports = [
- "contrib.go.opencensus.io/exporter/ocagent",
- "github.com/dgrijalva/jwt-go",
- "github.com/dimchansky/utfbom",
- "github.com/mitchellh/go-homedir",
- "github.com/stretchr/testify/require",
- "go.opencensus.io/plugin/ochttp",
- "go.opencensus.io/plugin/ochttp/propagation/tracecontext",
- "go.opencensus.io/stats/view",
- "go.opencensus.io/trace",
- "golang.org/x/crypto/pkcs12",
- "golang.org/x/lint/golint",
- ]
- solver-name = "gps-cdcl"
- solver-version = 1
diff --git a/vendor/github.com/Azure/go-autorest/Gopkg.toml b/vendor/github.com/Azure/go-autorest/Gopkg.toml
deleted file mode 100644
index 1fc2865969..0000000000
--- a/vendor/github.com/Azure/go-autorest/Gopkg.toml
+++ /dev/null
@@ -1,59 +0,0 @@
-# Gopkg.toml example
-#
-# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
-# for detailed Gopkg.toml documentation.
-#
-# required = ["github.com/user/thing/cmd/thing"]
-# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
-#
-# [[constraint]]
-# name = "github.com/user/project"
-# version = "1.0.0"
-#
-# [[constraint]]
-# name = "github.com/user/project2"
-# branch = "dev"
-# source = "github.com/myfork/project2"
-#
-# [[override]]
-# name = "github.com/x/y"
-# version = "2.4.0"
-#
-# [prune]
-# non-go = false
-# go-tests = true
-# unused-packages = true
-
-required = ["golang.org/x/lint/golint"]
-
-[prune]
- go-tests = true
- unused-packages = true
-
-[[constraint]]
- name = "contrib.go.opencensus.io/exporter/ocagent"
- version = "0.6.0"
-
-[[constraint]]
- name = "github.com/dgrijalva/jwt-go"
- version = "3.2.0"
-
-[[constraint]]
- name = "github.com/dimchansky/utfbom"
- version = "1.1.0"
-
-[[constraint]]
- name = "github.com/mitchellh/go-homedir"
- version = "1.1.0"
-
-[[constraint]]
- name = "github.com/stretchr/testify"
- version = "1.3.0"
-
-[[constraint]]
- name = "go.opencensus.io"
- version = "0.22.0"
-
-[[constraint]]
- branch = "master"
- name = "golang.org/x/crypto"
diff --git a/vendor/github.com/Azure/go-autorest/LICENSE b/vendor/github.com/Azure/go-autorest/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/README.md b/vendor/github.com/Azure/go-autorest/README.md
deleted file mode 100644
index de1e19a44d..0000000000
--- a/vendor/github.com/Azure/go-autorest/README.md
+++ /dev/null
@@ -1,165 +0,0 @@
-# go-autorest
-
-[](https://godoc.org/github.com/Azure/go-autorest/autorest)
-[](https://dev.azure.com/azure-sdk/public/_build/latest?definitionId=625&branchName=master)
-[](https://goreportcard.com/report/Azure/go-autorest)
-
-Package go-autorest provides an HTTP request client for use with [Autorest](https://github.com/Azure/autorest.go)-generated API client packages.
-
-An authentication client tested with Azure Active Directory (AAD) is also
-provided in this repo in the package
-`github.com/Azure/go-autorest/autorest/adal`. Despite its name, this package
-is maintained only as part of the Azure Go SDK and is not related to other
-"ADAL" libraries in [github.com/AzureAD](https://github.com/AzureAD).
-
-## Overview
-
-Package go-autorest implements an HTTP request pipeline suitable for use across
-multiple goroutines and provides the shared routines used by packages generated
-by [Autorest](https://github.com/Azure/autorest.go).
-
-The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending,
-and Responding. A typical pattern is:
-
-```go
- req, err := Prepare(&http.Request{},
- token.WithAuthorization())
-
- resp, err := Send(req,
- WithLogging(logger),
- DoErrorIfStatusCode(http.StatusInternalServerError),
- DoCloseIfError(),
- DoRetryForAttempts(5, time.Second))
-
- err = Respond(resp,
- ByDiscardingBody(),
- ByClosing())
-```
-
-Each phase relies on decorators to modify and / or manage processing. Decorators may first modify
-and then pass the data along, pass the data first and then modify the result, or wrap themselves
-around passing the data (such as a logger might do). Decorators run in the order provided. For
-example, the following:
-
-```go
- req, err := Prepare(&http.Request{},
- WithBaseURL("https://microsoft.com/"),
- WithPath("a"),
- WithPath("b"),
- WithPath("c"))
-```
-
-will set the URL to:
-
-```
- https://microsoft.com/a/b/c
-```
-
-Preparers and Responders may be shared and re-used (assuming the underlying decorators support
-sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders
-shared among multiple go-routines, and a single Sender shared among multiple sending go-routines,
-all bound together by means of input / output channels.
-
-Decorators hold their passed state within a closure (such as the path components in the example
-above). Be careful to share Preparers and Responders only in a context where such held state
-applies. For example, it may not make sense to share a Preparer that applies a query string from a
-fixed set of values. Similarly, sharing a Responder that reads the response body into a passed
-struct (e.g., `ByUnmarshallingJson`) is likely incorrect.
-
-Errors raised by autorest objects and methods will conform to the `autorest.Error` interface.
-
-See the included examples for more detail. For details on the suggested use of this package by
-generated clients, see the Client described below.
-
-## Helpers
-
-### Handling Swagger Dates
-
-The Swagger specification (https://swagger.io) that drives AutoRest
-(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The
-github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure correct
-parsing and formatting.
-
-### Handling Empty Values
-
-In JSON, missing values have different semantics than empty values. This is especially true for
-services using the HTTP PATCH verb. The JSON submitted with a PATCH request generally contains
-only those values to modify. Missing values are to be left unchanged. Developers, then, require a
-means to both specify an empty value and to leave the value out of the submitted JSON.
-
-The Go JSON package (`encoding/json`) supports the `omitempty` tag. When specified, it omits
-empty values from the rendered JSON. Since Go defines default values for all base types (such as ""
-for string and 0 for int) and provides no means to mark a value as actually empty, the JSON package
-treats default values as meaning empty, omitting them from the rendered JSON. This means that, using
-the Go base types encoded through the default JSON package, it is not possible to create JSON to
-clear a value at the server.
-
-The workaround within the Go community is to use pointers to base types in lieu of base types within
-structures that map to JSON. For example, instead of a value of type `string`, the workaround uses
-`*string`. While this enables distinguishing empty values from those to be unchanged, creating
-pointers to a base type (notably constant, in-line values) requires additional variables. This, for
-example,
-
-```go
- s := struct {
- S *string
- }{ S: &"foo" }
-```
-fails, while, this
-
-```go
- v := "foo"
- s := struct {
- S *string
- }{ S: &v }
-```
-succeeds.
-
-To ease using pointers, the subpackage `to` contains helpers that convert to and from pointers for
-Go base types which have Swagger analogs. It also provides a helper that converts between
-`map[string]string` and `map[string]*string`, enabling the JSON to specify that the value
-associated with a key should be cleared. With the helpers, the previous example becomes
-
-```go
- s := struct {
- S *string
- }{ S: to.StringPtr("foo") }
-```
-
-## Install
-
-```bash
-go get github.com/Azure/go-autorest/autorest
-go get github.com/Azure/go-autorest/autorest/azure
-go get github.com/Azure/go-autorest/autorest/date
-go get github.com/Azure/go-autorest/autorest/to
-```
-
-### Using with Go Modules
-In [v12.0.1](https://github.com/Azure/go-autorest/pull/386), this repository introduced the following modules.
-
-- autorest/adal
-- autorest/azure/auth
-- autorest/azure/cli
-- autorest/date
-- autorest/mocks
-- autorest/to
-- autorest/validation
-- autorest
-- logger
-- tracing
-
-Tagging cumulative SDK releases as a whole (e.g. `v12.3.0`) is still enabled to support consumers of this repo that have not yet migrated to modules.
-
-## License
-
-See LICENSE file.
-
------
-
-This project has adopted the [Microsoft Open Source Code of
-Conduct](https://opensource.microsoft.com/codeofconduct/). For more information
-see the [Code of Conduct
-FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact
-[opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional
-questions or comments.
diff --git a/vendor/github.com/Azure/go-autorest/autorest/LICENSE b/vendor/github.com/Azure/go-autorest/autorest/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE b/vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/README.md b/vendor/github.com/Azure/go-autorest/autorest/adal/README.md
deleted file mode 100644
index b11eb07884..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/README.md
+++ /dev/null
@@ -1,294 +0,0 @@
-# NOTE: This module will go out of support by March 31, 2023. For authenticating with Azure AD, use module [azidentity](https://pkg.go.dev/github.com/Azure/azure-sdk-for-go/sdk/azidentity) instead. For help migrating from `adal` to `azidentiy` please consult the [migration guide](https://aka.ms/azsdk/go/identity/migration). General information about the retirement of this and other legacy modules can be found [here](https://azure.microsoft.com/updates/support-for-azure-sdk-libraries-that-do-not-conform-to-our-current-azure-sdk-guidelines-will-be-retired-as-of-31-march-2023/).
-
-# Azure Active Directory authentication for Go
-
-This is a standalone package for authenticating with Azure Active
-Directory from other Go libraries and applications, in particular the [Azure SDK
-for Go](https://github.com/Azure/azure-sdk-for-go).
-
-Note: Despite the package's name it is not related to other "ADAL" libraries
-maintained in the [github.com/AzureAD](https://github.com/AzureAD) org. Issues
-should be opened in [this repo's](https://github.com/Azure/go-autorest/issues)
-or [the SDK's](https://github.com/Azure/azure-sdk-for-go/issues) issue
-trackers.
-
-## Install
-
-```bash
-go get -u github.com/Azure/go-autorest/autorest/adal
-```
-
-## Usage
-
-An Active Directory application is required in order to use this library. An application can be registered in the [Azure Portal](https://portal.azure.com/) by following these [guidelines](https://docs.microsoft.com/azure/active-directory/develop/active-directory-integrating-applications) or using the [Azure CLI](https://github.com/Azure/azure-cli).
-
-### Register an Azure AD Application with secret
-
-
-1. Register a new application with a `secret` credential
-
- ```
- az ad app create \
- --display-name example-app \
- --homepage https://example-app/home \
- --identifier-uris https://example-app/app \
- --password secret
- ```
-
-2. Create a service principal using the `Application ID` from previous step
-
- ```
- az ad sp create --id "Application ID"
- ```
-
- * Replace `Application ID` with `appId` from step 1.
-
-### Register an Azure AD Application with certificate
-
-1. Create a private key
-
- ```
- openssl genrsa -out "example-app.key" 2048
- ```
-
-2. Create the certificate
-
- ```
- openssl req -new -key "example-app.key" -subj "/CN=example-app" -out "example-app.csr"
- openssl x509 -req -in "example-app.csr" -signkey "example-app.key" -out "example-app.crt" -days 10000
- ```
-
-3. Create the PKCS12 version of the certificate containing also the private key
-
- ```
- openssl pkcs12 -export -out "example-app.pfx" -inkey "example-app.key" -in "example-app.crt" -passout pass:
-
- ```
-
-4. Register a new application with the certificate content form `example-app.crt`
-
- ```
- certificateContents="$(tail -n+2 "example-app.crt" | head -n-1)"
-
- az ad app create \
- --display-name example-app \
- --homepage https://example-app/home \
- --identifier-uris https://example-app/app \
- --key-usage Verify --end-date 2018-01-01 \
- --key-value "${certificateContents}"
- ```
-
-5. Create a service principal using the `Application ID` from previous step
-
- ```
- az ad sp create --id "APPLICATION_ID"
- ```
-
- * Replace `APPLICATION_ID` with `appId` from step 4.
-
-
-### Grant the necessary permissions
-
-Azure relies on a Role-Based Access Control (RBAC) model to manage the access to resources at a fine-grained
-level. There is a set of [pre-defined roles](https://docs.microsoft.com/azure/active-directory/role-based-access-built-in-roles)
-which can be assigned to a service principal of an Azure AD application depending of your needs.
-
-```
-az role assignment create --assigner "SERVICE_PRINCIPAL_ID" --role "ROLE_NAME"
-```
-
-* Replace the `SERVICE_PRINCIPAL_ID` with the `appId` from previous step.
-* Replace the `ROLE_NAME` with a role name of your choice.
-
-It is also possible to define custom role definitions.
-
-```
-az role definition create --role-definition role-definition.json
-```
-
-* Check [custom roles](https://docs.microsoft.com/azure/active-directory/role-based-access-control-custom-roles) for more details regarding the content of `role-definition.json` file.
-
-
-### Acquire Access Token
-
-The common configuration used by all flows:
-
-```Go
-const activeDirectoryEndpoint = "https://login.microsoftonline.com/"
-tenantID := "TENANT_ID"
-oauthConfig, err := adal.NewOAuthConfig(activeDirectoryEndpoint, tenantID)
-
-applicationID := "APPLICATION_ID"
-
-callback := func(token adal.Token) error {
- // This is called after the token is acquired
-}
-
-// The resource for which the token is acquired
-resource := "https://management.core.windows.net/"
-```
-
-* Replace the `TENANT_ID` with your tenant ID.
-* Replace the `APPLICATION_ID` with the value from previous section.
-
-#### Client Credentials
-
-```Go
-applicationSecret := "APPLICATION_SECRET"
-
-spt, err := adal.NewServicePrincipalToken(
- *oauthConfig,
- appliationID,
- applicationSecret,
- resource,
- callbacks...)
-if err != nil {
- return nil, err
-}
-
-// Acquire a new access token
-err = spt.Refresh()
-if (err == nil) {
- token := spt.Token
-}
-```
-
-* Replace the `APPLICATION_SECRET` with the `password` value from previous section.
-
-#### Client Certificate
-
-```Go
-certificatePath := "./example-app.pfx"
-
-certData, err := ioutil.ReadFile(certificatePath)
-if err != nil {
- return nil, fmt.Errorf("failed to read the certificate file (%s): %v", certificatePath, err)
-}
-
-// Get the certificate and private key from pfx file
-certificate, rsaPrivateKey, err := decodePkcs12(certData, "")
-if err != nil {
- return nil, fmt.Errorf("failed to decode pkcs12 certificate while creating spt: %v", err)
-}
-
-spt, err := adal.NewServicePrincipalTokenFromCertificate(
- *oauthConfig,
- applicationID,
- certificate,
- rsaPrivateKey,
- resource,
- callbacks...)
-
-// Acquire a new access token
-err = spt.Refresh()
-if (err == nil) {
- token := spt.Token
-}
-```
-
-* Update the certificate path to point to the example-app.pfx file which was created in previous section.
-
-
-#### Device Code
-
-```Go
-oauthClient := &http.Client{}
-
-// Acquire the device code
-deviceCode, err := adal.InitiateDeviceAuth(
- oauthClient,
- *oauthConfig,
- applicationID,
- resource)
-if err != nil {
- return nil, fmt.Errorf("Failed to start device auth flow: %s", err)
-}
-
-// Display the authentication message
-fmt.Println(*deviceCode.Message)
-
-// Wait here until the user is authenticated
-token, err := adal.WaitForUserCompletion(oauthClient, deviceCode)
-if err != nil {
- return nil, fmt.Errorf("Failed to finish device auth flow: %s", err)
-}
-
-spt, err := adal.NewServicePrincipalTokenFromManualToken(
- *oauthConfig,
- applicationID,
- resource,
- *token,
- callbacks...)
-
-if (err == nil) {
- token := spt.Token
-}
-```
-
-#### Username password authenticate
-
-```Go
-spt, err := adal.NewServicePrincipalTokenFromUsernamePassword(
- *oauthConfig,
- applicationID,
- username,
- password,
- resource,
- callbacks...)
-
-if (err == nil) {
- token := spt.Token
-}
-```
-
-#### Authorization code authenticate
-
-``` Go
-spt, err := adal.NewServicePrincipalTokenFromAuthorizationCode(
- *oauthConfig,
- applicationID,
- clientSecret,
- authorizationCode,
- redirectURI,
- resource,
- callbacks...)
-
-err = spt.Refresh()
-if (err == nil) {
- token := spt.Token
-}
-```
-
-### Command Line Tool
-
-A command line tool is available in `cmd/adal.go` that can acquire a token for a given resource. It supports all flows mentioned above.
-
-```
-adal -h
-
-Usage of ./adal:
- -applicationId string
- application id
- -certificatePath string
- path to pk12/PFC application certificate
- -mode string
- authentication mode (device, secret, cert, refresh) (default "device")
- -resource string
- resource for which the token is requested
- -secret string
- application secret
- -tenantId string
- tenant id
- -tokenCachePath string
- location of oath token cache (default "/home/cgc/.adal/accessToken.json")
-```
-
-Example acquire a token for `https://management.core.windows.net/` using device code flow:
-
-```
-adal -mode device \
- -applicationId "APPLICATION_ID" \
- -tenantId "TENANT_ID" \
- -resource https://management.core.windows.net/
-
-```
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/config.go b/vendor/github.com/Azure/go-autorest/autorest/adal/config.go
deleted file mode 100644
index fa5964742f..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/config.go
+++ /dev/null
@@ -1,151 +0,0 @@
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "errors"
- "fmt"
- "net/url"
-)
-
-const (
- activeDirectoryEndpointTemplate = "%s/oauth2/%s%s"
-)
-
-// OAuthConfig represents the endpoints needed
-// in OAuth operations
-type OAuthConfig struct {
- AuthorityEndpoint url.URL `json:"authorityEndpoint"`
- AuthorizeEndpoint url.URL `json:"authorizeEndpoint"`
- TokenEndpoint url.URL `json:"tokenEndpoint"`
- DeviceCodeEndpoint url.URL `json:"deviceCodeEndpoint"`
-}
-
-// IsZero returns true if the OAuthConfig object is zero-initialized.
-func (oac OAuthConfig) IsZero() bool {
- return oac == OAuthConfig{}
-}
-
-func validateStringParam(param, name string) error {
- if len(param) == 0 {
- return fmt.Errorf("parameter '" + name + "' cannot be empty")
- }
- return nil
-}
-
-// NewOAuthConfig returns an OAuthConfig with tenant specific urls
-func NewOAuthConfig(activeDirectoryEndpoint, tenantID string) (*OAuthConfig, error) {
- apiVer := "1.0"
- return NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID, &apiVer)
-}
-
-// NewOAuthConfigWithAPIVersion returns an OAuthConfig with tenant specific urls.
-// If apiVersion is not nil the "api-version" query parameter will be appended to the endpoint URLs with the specified value.
-func NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, tenantID string, apiVersion *string) (*OAuthConfig, error) {
- if err := validateStringParam(activeDirectoryEndpoint, "activeDirectoryEndpoint"); err != nil {
- return nil, err
- }
- api := ""
- // it's legal for tenantID to be empty so don't validate it
- if apiVersion != nil {
- if err := validateStringParam(*apiVersion, "apiVersion"); err != nil {
- return nil, err
- }
- api = fmt.Sprintf("?api-version=%s", *apiVersion)
- }
- u, err := url.Parse(activeDirectoryEndpoint)
- if err != nil {
- return nil, err
- }
- authorityURL, err := u.Parse(tenantID)
- if err != nil {
- return nil, err
- }
- authorizeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "authorize", api))
- if err != nil {
- return nil, err
- }
- tokenURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "token", api))
- if err != nil {
- return nil, err
- }
- deviceCodeURL, err := u.Parse(fmt.Sprintf(activeDirectoryEndpointTemplate, tenantID, "devicecode", api))
- if err != nil {
- return nil, err
- }
-
- return &OAuthConfig{
- AuthorityEndpoint: *authorityURL,
- AuthorizeEndpoint: *authorizeURL,
- TokenEndpoint: *tokenURL,
- DeviceCodeEndpoint: *deviceCodeURL,
- }, nil
-}
-
-// MultiTenantOAuthConfig provides endpoints for primary and aulixiary tenant IDs.
-type MultiTenantOAuthConfig interface {
- PrimaryTenant() *OAuthConfig
- AuxiliaryTenants() []*OAuthConfig
-}
-
-// OAuthOptions contains optional OAuthConfig creation arguments.
-type OAuthOptions struct {
- APIVersion string
-}
-
-func (c OAuthOptions) apiVersion() string {
- if c.APIVersion != "" {
- return fmt.Sprintf("?api-version=%s", c.APIVersion)
- }
- return "1.0"
-}
-
-// NewMultiTenantOAuthConfig creates an object that support multitenant OAuth configuration.
-// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/authenticate-multi-tenant for more information.
-func NewMultiTenantOAuthConfig(activeDirectoryEndpoint, primaryTenantID string, auxiliaryTenantIDs []string, options OAuthOptions) (MultiTenantOAuthConfig, error) {
- if len(auxiliaryTenantIDs) == 0 || len(auxiliaryTenantIDs) > 3 {
- return nil, errors.New("must specify one to three auxiliary tenants")
- }
- mtCfg := multiTenantOAuthConfig{
- cfgs: make([]*OAuthConfig, len(auxiliaryTenantIDs)+1),
- }
- apiVer := options.apiVersion()
- pri, err := NewOAuthConfigWithAPIVersion(activeDirectoryEndpoint, primaryTenantID, &apiVer)
- if err != nil {
- return nil, fmt.Errorf("failed to create OAuthConfig for primary tenant: %v", err)
- }
- mtCfg.cfgs[0] = pri
- for i := range auxiliaryTenantIDs {
- aux, err := NewOAuthConfig(activeDirectoryEndpoint, auxiliaryTenantIDs[i])
- if err != nil {
- return nil, fmt.Errorf("failed to create OAuthConfig for tenant '%s': %v", auxiliaryTenantIDs[i], err)
- }
- mtCfg.cfgs[i+1] = aux
- }
- return mtCfg, nil
-}
-
-type multiTenantOAuthConfig struct {
- // first config in the slice is the primary tenant
- cfgs []*OAuthConfig
-}
-
-func (m multiTenantOAuthConfig) PrimaryTenant() *OAuthConfig {
- return m.cfgs[0]
-}
-
-func (m multiTenantOAuthConfig) AuxiliaryTenants() []*OAuthConfig {
- return m.cfgs[1:]
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go b/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
deleted file mode 100644
index 9daa4b58b8..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/devicetoken.go
+++ /dev/null
@@ -1,273 +0,0 @@
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/*
- This file is largely based on rjw57/oauth2device's code, with the follow differences:
- * scope -> resource, and only allow a single one
- * receive "Message" in the DeviceCode struct and show it to users as the prompt
- * azure-xplat-cli has the following behavior that this emulates:
- - does not send client_secret during the token exchange
- - sends resource again in the token exchange request
-*/
-
-import (
- "context"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "net/url"
- "strings"
- "time"
-)
-
-const (
- logPrefix = "autorest/adal/devicetoken:"
-)
-
-var (
- // ErrDeviceGeneric represents an unknown error from the token endpoint when using device flow
- ErrDeviceGeneric = fmt.Errorf("%s Error while retrieving OAuth token: Unknown Error", logPrefix)
-
- // ErrDeviceAccessDenied represents an access denied error from the token endpoint when using device flow
- ErrDeviceAccessDenied = fmt.Errorf("%s Error while retrieving OAuth token: Access Denied", logPrefix)
-
- // ErrDeviceAuthorizationPending represents the server waiting on the user to complete the device flow
- ErrDeviceAuthorizationPending = fmt.Errorf("%s Error while retrieving OAuth token: Authorization Pending", logPrefix)
-
- // ErrDeviceCodeExpired represents the server timing out and expiring the code during device flow
- ErrDeviceCodeExpired = fmt.Errorf("%s Error while retrieving OAuth token: Code Expired", logPrefix)
-
- // ErrDeviceSlowDown represents the service telling us we're polling too often during device flow
- ErrDeviceSlowDown = fmt.Errorf("%s Error while retrieving OAuth token: Slow Down", logPrefix)
-
- // ErrDeviceCodeEmpty represents an empty device code from the device endpoint while using device flow
- ErrDeviceCodeEmpty = fmt.Errorf("%s Error while retrieving device code: Device Code Empty", logPrefix)
-
- // ErrOAuthTokenEmpty represents an empty OAuth token from the token endpoint when using device flow
- ErrOAuthTokenEmpty = fmt.Errorf("%s Error while retrieving OAuth token: Token Empty", logPrefix)
-
- errCodeSendingFails = "Error occurred while sending request for Device Authorization Code"
- errCodeHandlingFails = "Error occurred while handling response from the Device Endpoint"
- errTokenSendingFails = "Error occurred while sending request with device code for a token"
- errTokenHandlingFails = "Error occurred while handling response from the Token Endpoint (during device flow)"
- errStatusNotOK = "Error HTTP status != 200"
-)
-
-// DeviceCode is the object returned by the device auth endpoint
-// It contains information to instruct the user to complete the auth flow
-type DeviceCode struct {
- DeviceCode *string `json:"device_code,omitempty"`
- UserCode *string `json:"user_code,omitempty"`
- VerificationURL *string `json:"verification_url,omitempty"`
- ExpiresIn *int64 `json:"expires_in,string,omitempty"`
- Interval *int64 `json:"interval,string,omitempty"`
-
- Message *string `json:"message"` // Azure specific
- Resource string // store the following, stored when initiating, used when exchanging
- OAuthConfig OAuthConfig
- ClientID string
-}
-
-// TokenError is the object returned by the token exchange endpoint
-// when something is amiss
-type TokenError struct {
- Error *string `json:"error,omitempty"`
- ErrorCodes []int `json:"error_codes,omitempty"`
- ErrorDescription *string `json:"error_description,omitempty"`
- Timestamp *string `json:"timestamp,omitempty"`
- TraceID *string `json:"trace_id,omitempty"`
-}
-
-// DeviceToken is the object return by the token exchange endpoint
-// It can either look like a Token or an ErrorToken, so put both here
-// and check for presence of "Error" to know if we are in error state
-type deviceToken struct {
- Token
- TokenError
-}
-
-// InitiateDeviceAuth initiates a device auth flow. It returns a DeviceCode
-// that can be used with CheckForUserCompletion or WaitForUserCompletion.
-// Deprecated: use InitiateDeviceAuthWithContext() instead.
-func InitiateDeviceAuth(sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) {
- return InitiateDeviceAuthWithContext(context.Background(), sender, oauthConfig, clientID, resource)
-}
-
-// InitiateDeviceAuthWithContext initiates a device auth flow. It returns a DeviceCode
-// that can be used with CheckForUserCompletion or WaitForUserCompletion.
-func InitiateDeviceAuthWithContext(ctx context.Context, sender Sender, oauthConfig OAuthConfig, clientID, resource string) (*DeviceCode, error) {
- v := url.Values{
- "client_id": []string{clientID},
- "resource": []string{resource},
- }
-
- s := v.Encode()
- body := ioutil.NopCloser(strings.NewReader(s))
-
- req, err := http.NewRequest(http.MethodPost, oauthConfig.DeviceCodeEndpoint.String(), body)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error())
- }
-
- req.ContentLength = int64(len(s))
- req.Header.Set(contentType, mimeTypeFormPost)
- resp, err := sender.Do(req.WithContext(ctx))
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeSendingFails, err.Error())
- }
- defer resp.Body.Close()
-
- rb, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, err.Error())
- }
-
- if resp.StatusCode != http.StatusOK {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, errStatusNotOK)
- }
-
- if len(strings.Trim(string(rb), " ")) == 0 {
- return nil, ErrDeviceCodeEmpty
- }
-
- var code DeviceCode
- err = json.Unmarshal(rb, &code)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errCodeHandlingFails, err.Error())
- }
-
- code.ClientID = clientID
- code.Resource = resource
- code.OAuthConfig = oauthConfig
-
- return &code, nil
-}
-
-// CheckForUserCompletion takes a DeviceCode and checks with the Azure AD OAuth endpoint
-// to see if the device flow has: been completed, timed out, or otherwise failed
-// Deprecated: use CheckForUserCompletionWithContext() instead.
-func CheckForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
- return CheckForUserCompletionWithContext(context.Background(), sender, code)
-}
-
-// CheckForUserCompletionWithContext takes a DeviceCode and checks with the Azure AD OAuth endpoint
-// to see if the device flow has: been completed, timed out, or otherwise failed
-func CheckForUserCompletionWithContext(ctx context.Context, sender Sender, code *DeviceCode) (*Token, error) {
- v := url.Values{
- "client_id": []string{code.ClientID},
- "code": []string{*code.DeviceCode},
- "grant_type": []string{OAuthGrantTypeDeviceCode},
- "resource": []string{code.Resource},
- }
-
- s := v.Encode()
- body := ioutil.NopCloser(strings.NewReader(s))
-
- req, err := http.NewRequest(http.MethodPost, code.OAuthConfig.TokenEndpoint.String(), body)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error())
- }
-
- req.ContentLength = int64(len(s))
- req.Header.Set(contentType, mimeTypeFormPost)
- resp, err := sender.Do(req.WithContext(ctx))
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenSendingFails, err.Error())
- }
- defer resp.Body.Close()
-
- rb, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, err.Error())
- }
-
- if resp.StatusCode != http.StatusOK && len(strings.Trim(string(rb), " ")) == 0 {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, errStatusNotOK)
- }
- if len(strings.Trim(string(rb), " ")) == 0 {
- return nil, ErrOAuthTokenEmpty
- }
-
- var token deviceToken
- err = json.Unmarshal(rb, &token)
- if err != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, errTokenHandlingFails, err.Error())
- }
-
- if token.Error == nil {
- return &token.Token, nil
- }
-
- switch *token.Error {
- case "authorization_pending":
- return nil, ErrDeviceAuthorizationPending
- case "slow_down":
- return nil, ErrDeviceSlowDown
- case "access_denied":
- return nil, ErrDeviceAccessDenied
- case "code_expired":
- return nil, ErrDeviceCodeExpired
- default:
- // return a more meaningful error message if available
- if token.ErrorDescription != nil {
- return nil, fmt.Errorf("%s %s: %s", logPrefix, *token.Error, *token.ErrorDescription)
- }
- return nil, ErrDeviceGeneric
- }
-}
-
-// WaitForUserCompletion calls CheckForUserCompletion repeatedly until a token is granted or an error state occurs.
-// This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'.
-// Deprecated: use WaitForUserCompletionWithContext() instead.
-func WaitForUserCompletion(sender Sender, code *DeviceCode) (*Token, error) {
- return WaitForUserCompletionWithContext(context.Background(), sender, code)
-}
-
-// WaitForUserCompletionWithContext calls CheckForUserCompletion repeatedly until a token is granted or an error
-// state occurs. This prevents the user from looping and checking against 'ErrDeviceAuthorizationPending'.
-func WaitForUserCompletionWithContext(ctx context.Context, sender Sender, code *DeviceCode) (*Token, error) {
- intervalDuration := time.Duration(*code.Interval) * time.Second
- waitDuration := intervalDuration
-
- for {
- token, err := CheckForUserCompletionWithContext(ctx, sender, code)
-
- if err == nil {
- return token, nil
- }
-
- switch err {
- case ErrDeviceSlowDown:
- waitDuration += waitDuration
- case ErrDeviceAuthorizationPending:
- // noop
- default: // everything else is "fatal" to us
- return nil, err
- }
-
- if waitDuration > (intervalDuration * 3) {
- return nil, fmt.Errorf("%s Error waiting for user to complete device flow. Server told us to slow_down too much", logPrefix)
- }
-
- select {
- case <-time.After(waitDuration):
- // noop
- case <-ctx.Done():
- return nil, ctx.Err()
- }
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go
deleted file mode 100644
index 647a61bb8c..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/go_mod_tidy_hack.go
+++ /dev/null
@@ -1,25 +0,0 @@
-//go:build modhack
-// +build modhack
-
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file, and the github.com/Azure/go-autorest import, won't actually become part of
-// the resultant binary.
-
-// Necessary for safely adding multi-module repo.
-// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
-import _ "github.com/Azure/go-autorest"
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go b/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
deleted file mode 100644
index 2a974a39b3..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/persist.go
+++ /dev/null
@@ -1,135 +0,0 @@
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "crypto/rsa"
- "crypto/x509"
- "encoding/json"
- "errors"
- "fmt"
- "io/ioutil"
- "os"
- "path/filepath"
-
- "golang.org/x/crypto/pkcs12"
-)
-
-var (
- // ErrMissingCertificate is returned when no local certificate is found in the provided PFX data.
- ErrMissingCertificate = errors.New("adal: certificate missing")
-
- // ErrMissingPrivateKey is returned when no private key is found in the provided PFX data.
- ErrMissingPrivateKey = errors.New("adal: private key missing")
-)
-
-// LoadToken restores a Token object from a file located at 'path'.
-func LoadToken(path string) (*Token, error) {
- file, err := os.Open(path)
- if err != nil {
- return nil, fmt.Errorf("failed to open file (%s) while loading token: %v", path, err)
- }
- defer file.Close()
-
- var token Token
-
- dec := json.NewDecoder(file)
- if err = dec.Decode(&token); err != nil {
- return nil, fmt.Errorf("failed to decode contents of file (%s) into Token representation: %v", path, err)
- }
- return &token, nil
-}
-
-// SaveToken persists an oauth token at the given location on disk.
-// It moves the new file into place so it can safely be used to replace an existing file
-// that maybe accessed by multiple processes.
-func SaveToken(path string, mode os.FileMode, token Token) error {
- dir := filepath.Dir(path)
- err := os.MkdirAll(dir, os.ModePerm)
- if err != nil {
- return fmt.Errorf("failed to create directory (%s) to store token in: %v", dir, err)
- }
-
- newFile, err := ioutil.TempFile(dir, "token")
- if err != nil {
- return fmt.Errorf("failed to create the temp file to write the token: %v", err)
- }
- tempPath := newFile.Name()
-
- if err := json.NewEncoder(newFile).Encode(token); err != nil {
- return fmt.Errorf("failed to encode token to file (%s) while saving token: %v", tempPath, err)
- }
- if err := newFile.Close(); err != nil {
- return fmt.Errorf("failed to close temp file %s: %v", tempPath, err)
- }
-
- // Atomic replace to avoid multi-writer file corruptions
- if err := os.Rename(tempPath, path); err != nil {
- return fmt.Errorf("failed to move temporary token to desired output location. src=%s dst=%s: %v", tempPath, path, err)
- }
- if err := os.Chmod(path, mode); err != nil {
- return fmt.Errorf("failed to chmod the token file %s: %v", path, err)
- }
- return nil
-}
-
-// DecodePfxCertificateData extracts the x509 certificate and RSA private key from the provided PFX data.
-// The PFX data must contain a private key along with a certificate whose public key matches that of the
-// private key or an error is returned.
-// If the private key is not password protected pass the empty string for password.
-func DecodePfxCertificateData(pfxData []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) {
- blocks, err := pkcs12.ToPEM(pfxData, password)
- if err != nil {
- return nil, nil, err
- }
- // first extract the private key
- var priv *rsa.PrivateKey
- for _, block := range blocks {
- if block.Type == "PRIVATE KEY" {
- priv, err = x509.ParsePKCS1PrivateKey(block.Bytes)
- if err != nil {
- return nil, nil, err
- }
- break
- }
- }
- if priv == nil {
- return nil, nil, ErrMissingPrivateKey
- }
- // now find the certificate with the matching public key of our private key
- var cert *x509.Certificate
- for _, block := range blocks {
- if block.Type == "CERTIFICATE" {
- pcert, err := x509.ParseCertificate(block.Bytes)
- if err != nil {
- return nil, nil, err
- }
- certKey, ok := pcert.PublicKey.(*rsa.PublicKey)
- if !ok {
- // keep looking
- continue
- }
- if priv.E == certKey.E && priv.N.Cmp(certKey.N) == 0 {
- // found a match
- cert = pcert
- break
- }
- }
- }
- if cert == nil {
- return nil, nil, ErrMissingCertificate
- }
- return cert, priv, nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go b/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
deleted file mode 100644
index eb649bce9f..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/sender.go
+++ /dev/null
@@ -1,101 +0,0 @@
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "crypto/tls"
- "net"
- "net/http"
- "net/http/cookiejar"
- "sync"
- "time"
-
- "github.com/Azure/go-autorest/tracing"
-)
-
-const (
- contentType = "Content-Type"
- mimeTypeFormPost = "application/x-www-form-urlencoded"
-)
-
-// DO NOT ACCESS THIS DIRECTLY. go through sender()
-var defaultSender Sender
-var defaultSenderInit = &sync.Once{}
-
-// Sender is the interface that wraps the Do method to send HTTP requests.
-//
-// The standard http.Client conforms to this interface.
-type Sender interface {
- Do(*http.Request) (*http.Response, error)
-}
-
-// SenderFunc is a method that implements the Sender interface.
-type SenderFunc func(*http.Request) (*http.Response, error)
-
-// Do implements the Sender interface on SenderFunc.
-func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
- return sf(r)
-}
-
-// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
-// http.Request and pass it along or, first, pass the http.Request along then react to the
-// http.Response result.
-type SendDecorator func(Sender) Sender
-
-// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
-func CreateSender(decorators ...SendDecorator) Sender {
- return DecorateSender(sender(), decorators...)
-}
-
-// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
-// the Sender. Decorators are applied in the order received, but their affect upon the request
-// depends on whether they are a pre-decorator (change the http.Request and then pass it along) or a
-// post-decorator (pass the http.Request along and react to the results in http.Response).
-func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
- for _, decorate := range decorators {
- s = decorate(s)
- }
- return s
-}
-
-func sender() Sender {
- // note that we can't init defaultSender in init() since it will
- // execute before calling code has had a chance to enable tracing
- defaultSenderInit.Do(func() {
- // copied from http.DefaultTransport with a TLS minimum version.
- transport := &http.Transport{
- Proxy: http.ProxyFromEnvironment,
- DialContext: (&net.Dialer{
- Timeout: 30 * time.Second,
- KeepAlive: 30 * time.Second,
- }).DialContext,
- ForceAttemptHTTP2: true,
- MaxIdleConns: 100,
- IdleConnTimeout: 90 * time.Second,
- TLSHandshakeTimeout: 10 * time.Second,
- ExpectContinueTimeout: 1 * time.Second,
- TLSClientConfig: &tls.Config{
- MinVersion: tls.VersionTLS12,
- },
- }
- var roundTripper http.RoundTripper = transport
- if tracing.IsEnabled() {
- roundTripper = tracing.NewTransport(transport)
- }
- j, _ := cookiejar.New(nil)
- defaultSender = &http.Client{Jar: j, Transport: roundTripper}
- })
- return defaultSender
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token.go
deleted file mode 100644
index 1a9c8ab537..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/token.go
+++ /dev/null
@@ -1,1396 +0,0 @@
-package adal
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "context"
- "crypto/rand"
- "crypto/rsa"
- "crypto/sha1"
- "crypto/x509"
- "encoding/base64"
- "encoding/json"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "math"
- "net/http"
- "net/url"
- "os"
- "strconv"
- "strings"
- "sync"
- "time"
-
- "github.com/Azure/go-autorest/autorest/date"
- "github.com/Azure/go-autorest/logger"
- "github.com/golang-jwt/jwt/v4"
-)
-
-const (
- defaultRefresh = 5 * time.Minute
-
- // OAuthGrantTypeDeviceCode is the "grant_type" identifier used in device flow
- OAuthGrantTypeDeviceCode = "device_code"
-
- // OAuthGrantTypeClientCredentials is the "grant_type" identifier used in credential flows
- OAuthGrantTypeClientCredentials = "client_credentials"
-
- // OAuthGrantTypeUserPass is the "grant_type" identifier used in username and password auth flows
- OAuthGrantTypeUserPass = "password"
-
- // OAuthGrantTypeRefreshToken is the "grant_type" identifier used in refresh token flows
- OAuthGrantTypeRefreshToken = "refresh_token"
-
- // OAuthGrantTypeAuthorizationCode is the "grant_type" identifier used in authorization code flows
- OAuthGrantTypeAuthorizationCode = "authorization_code"
-
- // metadataHeader is the header required by MSI extension
- metadataHeader = "Metadata"
-
- // msiEndpoint is the well known endpoint for getting MSI authentications tokens
- msiEndpoint = "http://169.254.169.254/metadata/identity/oauth2/token"
-
- // the API version to use for the MSI endpoint
- msiAPIVersion = "2018-02-01"
-
- // the default number of attempts to refresh an MSI authentication token
- defaultMaxMSIRefreshAttempts = 5
-
- // asMSIEndpointEnv is the environment variable used to store the endpoint on App Service and Functions
- msiEndpointEnv = "MSI_ENDPOINT"
-
- // asMSISecretEnv is the environment variable used to store the request secret on App Service and Functions
- msiSecretEnv = "MSI_SECRET"
-
- // the API version to use for the legacy App Service MSI endpoint
- appServiceAPIVersion2017 = "2017-09-01"
-
- // secret header used when authenticating against app service MSI endpoint
- secretHeader = "Secret"
-
- // the format for expires_on in UTC with AM/PM
- expiresOnDateFormatPM = "1/2/2006 15:04:05 PM +00:00"
-
- // the format for expires_on in UTC without AM/PM
- expiresOnDateFormat = "1/2/2006 15:04:05 +00:00"
-)
-
-// OAuthTokenProvider is an interface which should be implemented by an access token retriever
-type OAuthTokenProvider interface {
- OAuthToken() string
-}
-
-// MultitenantOAuthTokenProvider provides tokens used for multi-tenant authorization.
-type MultitenantOAuthTokenProvider interface {
- PrimaryOAuthToken() string
- AuxiliaryOAuthTokens() []string
-}
-
-// TokenRefreshError is an interface used by errors returned during token refresh.
-type TokenRefreshError interface {
- error
- Response() *http.Response
-}
-
-// Refresher is an interface for token refresh functionality
-type Refresher interface {
- Refresh() error
- RefreshExchange(resource string) error
- EnsureFresh() error
-}
-
-// RefresherWithContext is an interface for token refresh functionality
-type RefresherWithContext interface {
- RefreshWithContext(ctx context.Context) error
- RefreshExchangeWithContext(ctx context.Context, resource string) error
- EnsureFreshWithContext(ctx context.Context) error
-}
-
-// TokenRefreshCallback is the type representing callbacks that will be called after
-// a successful token refresh
-type TokenRefreshCallback func(Token) error
-
-// TokenRefresh is a type representing a custom callback to refresh a token
-type TokenRefresh func(ctx context.Context, resource string) (*Token, error)
-
-// Token encapsulates the access token used to authorize Azure requests.
-// https://docs.microsoft.com/en-us/azure/active-directory/develop/v1-oauth2-client-creds-grant-flow#service-to-service-access-token-response
-type Token struct {
- AccessToken string `json:"access_token"`
- RefreshToken string `json:"refresh_token"`
-
- ExpiresIn json.Number `json:"expires_in"`
- ExpiresOn json.Number `json:"expires_on"`
- NotBefore json.Number `json:"not_before"`
-
- Resource string `json:"resource"`
- Type string `json:"token_type"`
-}
-
-func newToken() Token {
- return Token{
- ExpiresIn: "0",
- ExpiresOn: "0",
- NotBefore: "0",
- }
-}
-
-// IsZero returns true if the token object is zero-initialized.
-func (t Token) IsZero() bool {
- return t == Token{}
-}
-
-// Expires returns the time.Time when the Token expires.
-func (t Token) Expires() time.Time {
- s, err := t.ExpiresOn.Float64()
- if err != nil {
- s = -3600
- }
-
- expiration := date.NewUnixTimeFromSeconds(s)
-
- return time.Time(expiration).UTC()
-}
-
-// IsExpired returns true if the Token is expired, false otherwise.
-func (t Token) IsExpired() bool {
- return t.WillExpireIn(0)
-}
-
-// WillExpireIn returns true if the Token will expire after the passed time.Duration interval
-// from now, false otherwise.
-func (t Token) WillExpireIn(d time.Duration) bool {
- return !t.Expires().After(time.Now().Add(d))
-}
-
-//OAuthToken return the current access token
-func (t *Token) OAuthToken() string {
- return t.AccessToken
-}
-
-// ServicePrincipalSecret is an interface that allows various secret mechanism to fill the form
-// that is submitted when acquiring an oAuth token.
-type ServicePrincipalSecret interface {
- SetAuthenticationValues(spt *ServicePrincipalToken, values *url.Values) error
-}
-
-// ServicePrincipalNoSecret represents a secret type that contains no secret
-// meaning it is not valid for fetching a fresh token. This is used by Manual
-type ServicePrincipalNoSecret struct {
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret
-// It only returns an error for the ServicePrincipalNoSecret type
-func (noSecret *ServicePrincipalNoSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- return fmt.Errorf("Manually created ServicePrincipalToken does not contain secret material to retrieve a new access token")
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (noSecret ServicePrincipalNoSecret) MarshalJSON() ([]byte, error) {
- type tokenType struct {
- Type string `json:"type"`
- }
- return json.Marshal(tokenType{
- Type: "ServicePrincipalNoSecret",
- })
-}
-
-// ServicePrincipalTokenSecret implements ServicePrincipalSecret for client_secret type authorization.
-type ServicePrincipalTokenSecret struct {
- ClientSecret string `json:"value"`
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-// It will populate the form submitted during oAuth Token Acquisition using the client_secret.
-func (tokenSecret *ServicePrincipalTokenSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- v.Set("client_secret", tokenSecret.ClientSecret)
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (tokenSecret ServicePrincipalTokenSecret) MarshalJSON() ([]byte, error) {
- type tokenType struct {
- Type string `json:"type"`
- Value string `json:"value"`
- }
- return json.Marshal(tokenType{
- Type: "ServicePrincipalTokenSecret",
- Value: tokenSecret.ClientSecret,
- })
-}
-
-// ServicePrincipalCertificateSecret implements ServicePrincipalSecret for generic RSA cert auth with signed JWTs.
-type ServicePrincipalCertificateSecret struct {
- Certificate *x509.Certificate
- PrivateKey *rsa.PrivateKey
-}
-
-// SignJwt returns the JWT signed with the certificate's private key.
-func (secret *ServicePrincipalCertificateSecret) SignJwt(spt *ServicePrincipalToken) (string, error) {
- hasher := sha1.New()
- _, err := hasher.Write(secret.Certificate.Raw)
- if err != nil {
- return "", err
- }
-
- thumbprint := base64.URLEncoding.EncodeToString(hasher.Sum(nil))
-
- // The jti (JWT ID) claim provides a unique identifier for the JWT.
- jti := make([]byte, 20)
- _, err = rand.Read(jti)
- if err != nil {
- return "", err
- }
-
- token := jwt.New(jwt.SigningMethodRS256)
- token.Header["x5t"] = thumbprint
- x5c := []string{base64.StdEncoding.EncodeToString(secret.Certificate.Raw)}
- token.Header["x5c"] = x5c
- token.Claims = jwt.MapClaims{
- "aud": spt.inner.OauthConfig.TokenEndpoint.String(),
- "iss": spt.inner.ClientID,
- "sub": spt.inner.ClientID,
- "jti": base64.URLEncoding.EncodeToString(jti),
- "nbf": time.Now().Unix(),
- "exp": time.Now().Add(24 * time.Hour).Unix(),
- }
-
- signedString, err := token.SignedString(secret.PrivateKey)
- return signedString, err
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-// It will populate the form submitted during oAuth Token Acquisition using a JWT signed with a certificate.
-func (secret *ServicePrincipalCertificateSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- jwt, err := secret.SignJwt(spt)
- if err != nil {
- return err
- }
-
- v.Set("client_assertion", jwt)
- v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer")
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (secret ServicePrincipalCertificateSecret) MarshalJSON() ([]byte, error) {
- return nil, errors.New("marshalling ServicePrincipalCertificateSecret is not supported")
-}
-
-// ServicePrincipalMSISecret implements ServicePrincipalSecret for machines running the MSI Extension.
-type ServicePrincipalMSISecret struct {
- msiType msiType
- clientResourceID string
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-func (msiSecret *ServicePrincipalMSISecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (msiSecret ServicePrincipalMSISecret) MarshalJSON() ([]byte, error) {
- return nil, errors.New("marshalling ServicePrincipalMSISecret is not supported")
-}
-
-// ServicePrincipalUsernamePasswordSecret implements ServicePrincipalSecret for username and password auth.
-type ServicePrincipalUsernamePasswordSecret struct {
- Username string `json:"username"`
- Password string `json:"password"`
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-func (secret *ServicePrincipalUsernamePasswordSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- v.Set("username", secret.Username)
- v.Set("password", secret.Password)
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (secret ServicePrincipalUsernamePasswordSecret) MarshalJSON() ([]byte, error) {
- type tokenType struct {
- Type string `json:"type"`
- Username string `json:"username"`
- Password string `json:"password"`
- }
- return json.Marshal(tokenType{
- Type: "ServicePrincipalUsernamePasswordSecret",
- Username: secret.Username,
- Password: secret.Password,
- })
-}
-
-// ServicePrincipalAuthorizationCodeSecret implements ServicePrincipalSecret for authorization code auth.
-type ServicePrincipalAuthorizationCodeSecret struct {
- ClientSecret string `json:"value"`
- AuthorizationCode string `json:"authCode"`
- RedirectURI string `json:"redirect"`
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-func (secret *ServicePrincipalAuthorizationCodeSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
- v.Set("code", secret.AuthorizationCode)
- v.Set("client_secret", secret.ClientSecret)
- v.Set("redirect_uri", secret.RedirectURI)
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (secret ServicePrincipalAuthorizationCodeSecret) MarshalJSON() ([]byte, error) {
- type tokenType struct {
- Type string `json:"type"`
- Value string `json:"value"`
- AuthCode string `json:"authCode"`
- Redirect string `json:"redirect"`
- }
- return json.Marshal(tokenType{
- Type: "ServicePrincipalAuthorizationCodeSecret",
- Value: secret.ClientSecret,
- AuthCode: secret.AuthorizationCode,
- Redirect: secret.RedirectURI,
- })
-}
-
-// ServicePrincipalFederatedSecret implements ServicePrincipalSecret for Federated JWTs.
-type ServicePrincipalFederatedSecret struct {
- jwt string
-}
-
-// SetAuthenticationValues is a method of the interface ServicePrincipalSecret.
-// It will populate the form submitted during OAuth Token Acquisition using a JWT signed by an OIDC issuer.
-func (secret *ServicePrincipalFederatedSecret) SetAuthenticationValues(spt *ServicePrincipalToken, v *url.Values) error {
-
- v.Set("client_assertion", secret.jwt)
- v.Set("client_assertion_type", "urn:ietf:params:oauth:client-assertion-type:jwt-bearer")
- return nil
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (secret ServicePrincipalFederatedSecret) MarshalJSON() ([]byte, error) {
- return nil, errors.New("marshalling ServicePrincipalFederatedSecret is not supported")
-}
-
-// ServicePrincipalToken encapsulates a Token created for a Service Principal.
-type ServicePrincipalToken struct {
- inner servicePrincipalToken
- refreshLock *sync.RWMutex
- sender Sender
- customRefreshFunc TokenRefresh
- refreshCallbacks []TokenRefreshCallback
- // MaxMSIRefreshAttempts is the maximum number of attempts to refresh an MSI token.
- // Settings this to a value less than 1 will use the default value.
- MaxMSIRefreshAttempts int
-}
-
-// MarshalTokenJSON returns the marshalled inner token.
-func (spt ServicePrincipalToken) MarshalTokenJSON() ([]byte, error) {
- return json.Marshal(spt.inner.Token)
-}
-
-// SetRefreshCallbacks replaces any existing refresh callbacks with the specified callbacks.
-func (spt *ServicePrincipalToken) SetRefreshCallbacks(callbacks []TokenRefreshCallback) {
- spt.refreshCallbacks = callbacks
-}
-
-// SetCustomRefreshFunc sets a custom refresh function used to refresh the token.
-func (spt *ServicePrincipalToken) SetCustomRefreshFunc(customRefreshFunc TokenRefresh) {
- spt.customRefreshFunc = customRefreshFunc
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (spt ServicePrincipalToken) MarshalJSON() ([]byte, error) {
- return json.Marshal(spt.inner)
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface.
-func (spt *ServicePrincipalToken) UnmarshalJSON(data []byte) error {
- // need to determine the token type
- raw := map[string]interface{}{}
- err := json.Unmarshal(data, &raw)
- if err != nil {
- return err
- }
- secret := raw["secret"].(map[string]interface{})
- switch secret["type"] {
- case "ServicePrincipalNoSecret":
- spt.inner.Secret = &ServicePrincipalNoSecret{}
- case "ServicePrincipalTokenSecret":
- spt.inner.Secret = &ServicePrincipalTokenSecret{}
- case "ServicePrincipalCertificateSecret":
- return errors.New("unmarshalling ServicePrincipalCertificateSecret is not supported")
- case "ServicePrincipalMSISecret":
- return errors.New("unmarshalling ServicePrincipalMSISecret is not supported")
- case "ServicePrincipalUsernamePasswordSecret":
- spt.inner.Secret = &ServicePrincipalUsernamePasswordSecret{}
- case "ServicePrincipalAuthorizationCodeSecret":
- spt.inner.Secret = &ServicePrincipalAuthorizationCodeSecret{}
- case "ServicePrincipalFederatedSecret":
- return errors.New("unmarshalling ServicePrincipalFederatedSecret is not supported")
- default:
- return fmt.Errorf("unrecognized token type '%s'", secret["type"])
- }
- err = json.Unmarshal(data, &spt.inner)
- if err != nil {
- return err
- }
- // Don't override the refreshLock or the sender if those have been already set.
- if spt.refreshLock == nil {
- spt.refreshLock = &sync.RWMutex{}
- }
- if spt.sender == nil {
- spt.sender = sender()
- }
- return nil
-}
-
-// internal type used for marshalling/unmarshalling
-type servicePrincipalToken struct {
- Token Token `json:"token"`
- Secret ServicePrincipalSecret `json:"secret"`
- OauthConfig OAuthConfig `json:"oauth"`
- ClientID string `json:"clientID"`
- Resource string `json:"resource"`
- AutoRefresh bool `json:"autoRefresh"`
- RefreshWithin time.Duration `json:"refreshWithin"`
-}
-
-func validateOAuthConfig(oac OAuthConfig) error {
- if oac.IsZero() {
- return fmt.Errorf("parameter 'oauthConfig' cannot be zero-initialized")
- }
- return nil
-}
-
-// NewServicePrincipalTokenWithSecret create a ServicePrincipalToken using the supplied ServicePrincipalSecret implementation.
-func NewServicePrincipalTokenWithSecret(oauthConfig OAuthConfig, id string, resource string, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(id, "id"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if secret == nil {
- return nil, fmt.Errorf("parameter 'secret' cannot be nil")
- }
- spt := &ServicePrincipalToken{
- inner: servicePrincipalToken{
- Token: newToken(),
- OauthConfig: oauthConfig,
- Secret: secret,
- ClientID: id,
- Resource: resource,
- AutoRefresh: true,
- RefreshWithin: defaultRefresh,
- },
- refreshLock: &sync.RWMutex{},
- sender: sender(),
- refreshCallbacks: callbacks,
- }
- return spt, nil
-}
-
-// NewServicePrincipalTokenFromManualToken creates a ServicePrincipalToken using the supplied token
-func NewServicePrincipalTokenFromManualToken(oauthConfig OAuthConfig, clientID string, resource string, token Token, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if token.IsZero() {
- return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized")
- }
- spt, err := NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalNoSecret{},
- callbacks...)
- if err != nil {
- return nil, err
- }
-
- spt.inner.Token = token
-
- return spt, nil
-}
-
-// NewServicePrincipalTokenFromManualTokenSecret creates a ServicePrincipalToken using the supplied token and secret
-func NewServicePrincipalTokenFromManualTokenSecret(oauthConfig OAuthConfig, clientID string, resource string, token Token, secret ServicePrincipalSecret, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if secret == nil {
- return nil, fmt.Errorf("parameter 'secret' cannot be nil")
- }
- if token.IsZero() {
- return nil, fmt.Errorf("parameter 'token' cannot be zero-initialized")
- }
- spt, err := NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- secret,
- callbacks...)
- if err != nil {
- return nil, err
- }
-
- spt.inner.Token = token
-
- return spt, nil
-}
-
-// NewServicePrincipalToken creates a ServicePrincipalToken from the supplied Service Principal
-// credentials scoped to the named resource.
-func NewServicePrincipalToken(oauthConfig OAuthConfig, clientID string, secret string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(secret, "secret"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- return NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalTokenSecret{
- ClientSecret: secret,
- },
- callbacks...,
- )
-}
-
-// NewServicePrincipalTokenFromCertificate creates a ServicePrincipalToken from the supplied pkcs12 bytes.
-func NewServicePrincipalTokenFromCertificate(oauthConfig OAuthConfig, clientID string, certificate *x509.Certificate, privateKey *rsa.PrivateKey, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if certificate == nil {
- return nil, fmt.Errorf("parameter 'certificate' cannot be nil")
- }
- if privateKey == nil {
- return nil, fmt.Errorf("parameter 'privateKey' cannot be nil")
- }
- return NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalCertificateSecret{
- PrivateKey: privateKey,
- Certificate: certificate,
- },
- callbacks...,
- )
-}
-
-// NewServicePrincipalTokenFromUsernamePassword creates a ServicePrincipalToken from the username and password.
-func NewServicePrincipalTokenFromUsernamePassword(oauthConfig OAuthConfig, clientID string, username string, password string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(username, "username"); err != nil {
- return nil, err
- }
- if err := validateStringParam(password, "password"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- return NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalUsernamePasswordSecret{
- Username: username,
- Password: password,
- },
- callbacks...,
- )
-}
-
-// NewServicePrincipalTokenFromAuthorizationCode creates a ServicePrincipalToken from the
-func NewServicePrincipalTokenFromAuthorizationCode(oauthConfig OAuthConfig, clientID string, clientSecret string, authorizationCode string, redirectURI string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
-
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientSecret, "clientSecret"); err != nil {
- return nil, err
- }
- if err := validateStringParam(authorizationCode, "authorizationCode"); err != nil {
- return nil, err
- }
- if err := validateStringParam(redirectURI, "redirectURI"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
-
- return NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalAuthorizationCodeSecret{
- ClientSecret: clientSecret,
- AuthorizationCode: authorizationCode,
- RedirectURI: redirectURI,
- },
- callbacks...,
- )
-}
-
-// NewServicePrincipalTokenFromFederatedToken creates a ServicePrincipalToken from the supplied federated OIDC JWT.
-func NewServicePrincipalTokenFromFederatedToken(oauthConfig OAuthConfig, clientID string, jwt string, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateOAuthConfig(oauthConfig); err != nil {
- return nil, err
- }
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if jwt == "" {
- return nil, fmt.Errorf("parameter 'jwt' cannot be empty")
- }
- return NewServicePrincipalTokenWithSecret(
- oauthConfig,
- clientID,
- resource,
- &ServicePrincipalFederatedSecret{
- jwt: jwt,
- },
- callbacks...,
- )
-}
-
-type msiType int
-
-const (
- msiTypeUnavailable msiType = iota
- msiTypeAppServiceV20170901
- msiTypeCloudShell
- msiTypeIMDS
-)
-
-func (m msiType) String() string {
- switch m {
- case msiTypeAppServiceV20170901:
- return "AppServiceV20170901"
- case msiTypeCloudShell:
- return "CloudShell"
- case msiTypeIMDS:
- return "IMDS"
- default:
- return fmt.Sprintf("unhandled MSI type %d", m)
- }
-}
-
-// returns the MSI type and endpoint, or an error
-func getMSIType() (msiType, string, error) {
- if endpointEnvVar := os.Getenv(msiEndpointEnv); endpointEnvVar != "" {
- // if the env var MSI_ENDPOINT is set
- if secretEnvVar := os.Getenv(msiSecretEnv); secretEnvVar != "" {
- // if BOTH the env vars MSI_ENDPOINT and MSI_SECRET are set the msiType is AppService
- return msiTypeAppServiceV20170901, endpointEnvVar, nil
- }
- // if ONLY the env var MSI_ENDPOINT is set the msiType is CloudShell
- return msiTypeCloudShell, endpointEnvVar, nil
- }
- // if MSI_ENDPOINT is NOT set assume the msiType is IMDS
- return msiTypeIMDS, msiEndpoint, nil
-}
-
-// GetMSIVMEndpoint gets the MSI endpoint on Virtual Machines.
-// NOTE: this always returns the IMDS endpoint, it does not work for app services or cloud shell.
-// Deprecated: NewServicePrincipalTokenFromMSI() and variants will automatically detect the endpoint.
-func GetMSIVMEndpoint() (string, error) {
- return msiEndpoint, nil
-}
-
-// GetMSIAppServiceEndpoint get the MSI endpoint for App Service and Functions.
-// It will return an error when not running in an app service/functions environment.
-// Deprecated: NewServicePrincipalTokenFromMSI() and variants will automatically detect the endpoint.
-func GetMSIAppServiceEndpoint() (string, error) {
- msiType, endpoint, err := getMSIType()
- if err != nil {
- return "", err
- }
- switch msiType {
- case msiTypeAppServiceV20170901:
- return endpoint, nil
- default:
- return "", fmt.Errorf("%s is not app service environment", msiType)
- }
-}
-
-// GetMSIEndpoint get the appropriate MSI endpoint depending on the runtime environment
-// Deprecated: NewServicePrincipalTokenFromMSI() and variants will automatically detect the endpoint.
-func GetMSIEndpoint() (string, error) {
- _, endpoint, err := getMSIType()
- return endpoint, err
-}
-
-// NewServicePrincipalTokenFromMSI creates a ServicePrincipalToken via the MSI VM Extension.
-// It will use the system assigned identity when creating the token.
-// msiEndpoint - empty string, or pass a non-empty string to override the default value.
-// Deprecated: use NewServicePrincipalTokenFromManagedIdentity() instead.
-func NewServicePrincipalTokenFromMSI(msiEndpoint, resource string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- return newServicePrincipalTokenFromMSI(msiEndpoint, resource, "", "", callbacks...)
-}
-
-// NewServicePrincipalTokenFromMSIWithUserAssignedID creates a ServicePrincipalToken via the MSI VM Extension.
-// It will use the clientID of specified user assigned identity when creating the token.
-// msiEndpoint - empty string, or pass a non-empty string to override the default value.
-// Deprecated: use NewServicePrincipalTokenFromManagedIdentity() instead.
-func NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource string, userAssignedID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateStringParam(userAssignedID, "userAssignedID"); err != nil {
- return nil, err
- }
- return newServicePrincipalTokenFromMSI(msiEndpoint, resource, userAssignedID, "", callbacks...)
-}
-
-// NewServicePrincipalTokenFromMSIWithIdentityResourceID creates a ServicePrincipalToken via the MSI VM Extension.
-// It will use the azure resource id of user assigned identity when creating the token.
-// msiEndpoint - empty string, or pass a non-empty string to override the default value.
-// Deprecated: use NewServicePrincipalTokenFromManagedIdentity() instead.
-func NewServicePrincipalTokenFromMSIWithIdentityResourceID(msiEndpoint, resource string, identityResourceID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateStringParam(identityResourceID, "identityResourceID"); err != nil {
- return nil, err
- }
- return newServicePrincipalTokenFromMSI(msiEndpoint, resource, "", identityResourceID, callbacks...)
-}
-
-// ManagedIdentityOptions contains optional values for configuring managed identity authentication.
-type ManagedIdentityOptions struct {
- // ClientID is the user-assigned identity to use during authentication.
- // It is mutually exclusive with IdentityResourceID.
- ClientID string
-
- // IdentityResourceID is the resource ID of the user-assigned identity to use during authentication.
- // It is mutually exclusive with ClientID.
- IdentityResourceID string
-}
-
-// NewServicePrincipalTokenFromManagedIdentity creates a ServicePrincipalToken using a managed identity.
-// It supports the following managed identity environments.
-// - App Service Environment (API version 2017-09-01 only)
-// - Cloud shell
-// - IMDS with a system or user assigned identity
-func NewServicePrincipalTokenFromManagedIdentity(resource string, options *ManagedIdentityOptions, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if options == nil {
- options = &ManagedIdentityOptions{}
- }
- return newServicePrincipalTokenFromMSI("", resource, options.ClientID, options.IdentityResourceID, callbacks...)
-}
-
-func newServicePrincipalTokenFromMSI(msiEndpoint, resource, userAssignedID, identityResourceID string, callbacks ...TokenRefreshCallback) (*ServicePrincipalToken, error) {
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if userAssignedID != "" && identityResourceID != "" {
- return nil, errors.New("cannot specify userAssignedID and identityResourceID")
- }
- msiType, endpoint, err := getMSIType()
- if err != nil {
- logger.Instance.Writef(logger.LogError, "Error determining managed identity environment: %v\n", err)
- return nil, err
- }
- logger.Instance.Writef(logger.LogInfo, "Managed identity environment is %s, endpoint is %s\n", msiType, endpoint)
- if msiEndpoint != "" {
- endpoint = msiEndpoint
- logger.Instance.Writef(logger.LogInfo, "Managed identity custom endpoint is %s\n", endpoint)
- }
- msiEndpointURL, err := url.Parse(endpoint)
- if err != nil {
- return nil, err
- }
- // cloud shell sends its data in the request body
- if msiType != msiTypeCloudShell {
- v := url.Values{}
- v.Set("resource", resource)
- clientIDParam := "client_id"
- switch msiType {
- case msiTypeAppServiceV20170901:
- clientIDParam = "clientid"
- v.Set("api-version", appServiceAPIVersion2017)
- break
- case msiTypeIMDS:
- v.Set("api-version", msiAPIVersion)
- }
- if userAssignedID != "" {
- v.Set(clientIDParam, userAssignedID)
- } else if identityResourceID != "" {
- v.Set("mi_res_id", identityResourceID)
- }
- msiEndpointURL.RawQuery = v.Encode()
- }
-
- spt := &ServicePrincipalToken{
- inner: servicePrincipalToken{
- Token: newToken(),
- OauthConfig: OAuthConfig{
- TokenEndpoint: *msiEndpointURL,
- },
- Secret: &ServicePrincipalMSISecret{
- msiType: msiType,
- clientResourceID: identityResourceID,
- },
- Resource: resource,
- AutoRefresh: true,
- RefreshWithin: defaultRefresh,
- ClientID: userAssignedID,
- },
- refreshLock: &sync.RWMutex{},
- sender: sender(),
- refreshCallbacks: callbacks,
- MaxMSIRefreshAttempts: defaultMaxMSIRefreshAttempts,
- }
-
- return spt, nil
-}
-
-// internal type that implements TokenRefreshError
-type tokenRefreshError struct {
- message string
- resp *http.Response
-}
-
-// Error implements the error interface which is part of the TokenRefreshError interface.
-func (tre tokenRefreshError) Error() string {
- return tre.message
-}
-
-// Response implements the TokenRefreshError interface, it returns the raw HTTP response from the refresh operation.
-func (tre tokenRefreshError) Response() *http.Response {
- return tre.resp
-}
-
-func newTokenRefreshError(message string, resp *http.Response) TokenRefreshError {
- return tokenRefreshError{message: message, resp: resp}
-}
-
-// EnsureFresh will refresh the token if it will expire within the refresh window (as set by
-// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) EnsureFresh() error {
- return spt.EnsureFreshWithContext(context.Background())
-}
-
-// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
-// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
- // must take the read lock when initially checking the token's expiration
- if spt.inner.AutoRefresh && spt.Token().WillExpireIn(spt.inner.RefreshWithin) {
- // take the write lock then check again to see if the token was already refreshed
- spt.refreshLock.Lock()
- defer spt.refreshLock.Unlock()
- if spt.inner.Token.WillExpireIn(spt.inner.RefreshWithin) {
- return spt.refreshInternal(ctx, spt.inner.Resource)
- }
- }
- return nil
-}
-
-// InvokeRefreshCallbacks calls any TokenRefreshCallbacks that were added to the SPT during initialization
-func (spt *ServicePrincipalToken) InvokeRefreshCallbacks(token Token) error {
- if spt.refreshCallbacks != nil {
- for _, callback := range spt.refreshCallbacks {
- err := callback(spt.inner.Token)
- if err != nil {
- return fmt.Errorf("adal: TokenRefreshCallback handler failed. Error = '%v'", err)
- }
- }
- }
- return nil
-}
-
-// Refresh obtains a fresh token for the Service Principal.
-// This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) Refresh() error {
- return spt.RefreshWithContext(context.Background())
-}
-
-// RefreshWithContext obtains a fresh token for the Service Principal.
-// This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
- spt.refreshLock.Lock()
- defer spt.refreshLock.Unlock()
- return spt.refreshInternal(ctx, spt.inner.Resource)
-}
-
-// RefreshExchange refreshes the token, but for a different resource.
-// This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) RefreshExchange(resource string) error {
- return spt.RefreshExchangeWithContext(context.Background(), resource)
-}
-
-// RefreshExchangeWithContext refreshes the token, but for a different resource.
-// This method is safe for concurrent use.
-func (spt *ServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
- spt.refreshLock.Lock()
- defer spt.refreshLock.Unlock()
- return spt.refreshInternal(ctx, resource)
-}
-
-func (spt *ServicePrincipalToken) getGrantType() string {
- switch spt.inner.Secret.(type) {
- case *ServicePrincipalUsernamePasswordSecret:
- return OAuthGrantTypeUserPass
- case *ServicePrincipalAuthorizationCodeSecret:
- return OAuthGrantTypeAuthorizationCode
- default:
- return OAuthGrantTypeClientCredentials
- }
-}
-
-func (spt *ServicePrincipalToken) refreshInternal(ctx context.Context, resource string) error {
- if spt.customRefreshFunc != nil {
- token, err := spt.customRefreshFunc(ctx, resource)
- if err != nil {
- return err
- }
- spt.inner.Token = *token
- return spt.InvokeRefreshCallbacks(spt.inner.Token)
- }
- req, err := http.NewRequest(http.MethodPost, spt.inner.OauthConfig.TokenEndpoint.String(), nil)
- if err != nil {
- return fmt.Errorf("adal: Failed to build the refresh request. Error = '%v'", err)
- }
- req.Header.Add("User-Agent", UserAgent())
- req = req.WithContext(ctx)
- var resp *http.Response
- authBodyFilter := func(b []byte) []byte {
- if logger.Level() != logger.LogAuth {
- return []byte("**REDACTED** authentication body")
- }
- return b
- }
- if msiSecret, ok := spt.inner.Secret.(*ServicePrincipalMSISecret); ok {
- switch msiSecret.msiType {
- case msiTypeAppServiceV20170901:
- req.Method = http.MethodGet
- req.Header.Set("secret", os.Getenv(msiSecretEnv))
- break
- case msiTypeCloudShell:
- req.Header.Set("Metadata", "true")
- data := url.Values{}
- data.Set("resource", spt.inner.Resource)
- if spt.inner.ClientID != "" {
- data.Set("client_id", spt.inner.ClientID)
- } else if msiSecret.clientResourceID != "" {
- data.Set("msi_res_id", msiSecret.clientResourceID)
- }
- req.Body = ioutil.NopCloser(strings.NewReader(data.Encode()))
- req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
- break
- case msiTypeIMDS:
- req.Method = http.MethodGet
- req.Header.Set("Metadata", "true")
- break
- }
- logger.Instance.WriteRequest(req, logger.Filter{Body: authBodyFilter})
- resp, err = retryForIMDS(spt.sender, req, spt.MaxMSIRefreshAttempts)
- } else {
- v := url.Values{}
- v.Set("client_id", spt.inner.ClientID)
- v.Set("resource", resource)
-
- if spt.inner.Token.RefreshToken != "" {
- v.Set("grant_type", OAuthGrantTypeRefreshToken)
- v.Set("refresh_token", spt.inner.Token.RefreshToken)
- // web apps must specify client_secret when refreshing tokens
- // see https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code#refreshing-the-access-tokens
- if spt.getGrantType() == OAuthGrantTypeAuthorizationCode {
- err := spt.inner.Secret.SetAuthenticationValues(spt, &v)
- if err != nil {
- return err
- }
- }
- } else {
- v.Set("grant_type", spt.getGrantType())
- err := spt.inner.Secret.SetAuthenticationValues(spt, &v)
- if err != nil {
- return err
- }
- }
-
- s := v.Encode()
- body := ioutil.NopCloser(strings.NewReader(s))
- req.ContentLength = int64(len(s))
- req.Header.Set(contentType, mimeTypeFormPost)
- req.Body = body
- logger.Instance.WriteRequest(req, logger.Filter{Body: authBodyFilter})
- resp, err = spt.sender.Do(req)
- }
-
- // don't return a TokenRefreshError here; this will allow retry logic to apply
- if err != nil {
- return fmt.Errorf("adal: Failed to execute the refresh request. Error = '%v'", err)
- } else if resp == nil {
- return fmt.Errorf("adal: received nil response and error")
- }
-
- logger.Instance.WriteResponse(resp, logger.Filter{Body: authBodyFilter})
- defer resp.Body.Close()
- rb, err := ioutil.ReadAll(resp.Body)
-
- if resp.StatusCode != http.StatusOK {
- if err != nil {
- return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Failed reading response body: %v Endpoint %s", resp.StatusCode, err, req.URL.String()), resp)
- }
- return newTokenRefreshError(fmt.Sprintf("adal: Refresh request failed. Status Code = '%d'. Response body: %s Endpoint %s", resp.StatusCode, string(rb), req.URL.String()), resp)
- }
-
- // for the following error cases don't return a TokenRefreshError. the operation succeeded
- // but some transient failure happened during deserialization. by returning a generic error
- // the retry logic will kick in (we don't retry on TokenRefreshError).
-
- if err != nil {
- return fmt.Errorf("adal: Failed to read a new service principal token during refresh. Error = '%v'", err)
- }
- if len(strings.Trim(string(rb), " ")) == 0 {
- return fmt.Errorf("adal: Empty service principal token received during refresh")
- }
- token := struct {
- AccessToken string `json:"access_token"`
- RefreshToken string `json:"refresh_token"`
-
- // AAD returns expires_in as a string, ADFS returns it as an int
- ExpiresIn json.Number `json:"expires_in"`
- // expires_on can be in three formats, a UTC time stamp, or the number of seconds as a string *or* int.
- ExpiresOn interface{} `json:"expires_on"`
- NotBefore json.Number `json:"not_before"`
-
- Resource string `json:"resource"`
- Type string `json:"token_type"`
- }{}
- // return a TokenRefreshError in the follow error cases as the token is in an unexpected format
- err = json.Unmarshal(rb, &token)
- if err != nil {
- return newTokenRefreshError(fmt.Sprintf("adal: Failed to unmarshal the service principal token during refresh. Error = '%v' JSON = '%s'", err, string(rb)), resp)
- }
- expiresOn := json.Number("")
- // ADFS doesn't include the expires_on field
- if token.ExpiresOn != nil {
- if expiresOn, err = parseExpiresOn(token.ExpiresOn); err != nil {
- return newTokenRefreshError(fmt.Sprintf("adal: failed to parse expires_on: %v value '%s'", err, token.ExpiresOn), resp)
- }
- }
- spt.inner.Token.AccessToken = token.AccessToken
- spt.inner.Token.RefreshToken = token.RefreshToken
- spt.inner.Token.ExpiresIn = token.ExpiresIn
- spt.inner.Token.ExpiresOn = expiresOn
- spt.inner.Token.NotBefore = token.NotBefore
- spt.inner.Token.Resource = token.Resource
- spt.inner.Token.Type = token.Type
-
- return spt.InvokeRefreshCallbacks(spt.inner.Token)
-}
-
-// converts expires_on to the number of seconds
-func parseExpiresOn(s interface{}) (json.Number, error) {
- // the JSON unmarshaler treats JSON numbers unmarshaled into an interface{} as float64
- asFloat64, ok := s.(float64)
- if ok {
- // this is the number of seconds as int case
- return json.Number(strconv.FormatInt(int64(asFloat64), 10)), nil
- }
- asStr, ok := s.(string)
- if !ok {
- return "", fmt.Errorf("unexpected expires_on type %T", s)
- }
- // convert the expiration date to the number of seconds from the unix epoch
- timeToDuration := func(t time.Time) json.Number {
- return json.Number(strconv.FormatInt(t.UTC().Unix(), 10))
- }
- if _, err := json.Number(asStr).Int64(); err == nil {
- // this is the number of seconds case, no conversion required
- return json.Number(asStr), nil
- } else if eo, err := time.Parse(expiresOnDateFormatPM, asStr); err == nil {
- return timeToDuration(eo), nil
- } else if eo, err := time.Parse(expiresOnDateFormat, asStr); err == nil {
- return timeToDuration(eo), nil
- } else {
- // unknown format
- return json.Number(""), err
- }
-}
-
-// retry logic specific to retrieving a token from the IMDS endpoint
-func retryForIMDS(sender Sender, req *http.Request, maxAttempts int) (resp *http.Response, err error) {
- // copied from client.go due to circular dependency
- retries := []int{
- http.StatusRequestTimeout, // 408
- http.StatusTooManyRequests, // 429
- http.StatusInternalServerError, // 500
- http.StatusBadGateway, // 502
- http.StatusServiceUnavailable, // 503
- http.StatusGatewayTimeout, // 504
- }
- // extra retry status codes specific to IMDS
- retries = append(retries,
- http.StatusNotFound,
- http.StatusGone,
- // all remaining 5xx
- http.StatusNotImplemented,
- http.StatusHTTPVersionNotSupported,
- http.StatusVariantAlsoNegotiates,
- http.StatusInsufficientStorage,
- http.StatusLoopDetected,
- http.StatusNotExtended,
- http.StatusNetworkAuthenticationRequired)
-
- // see https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/how-to-use-vm-token#retry-guidance
-
- const maxDelay time.Duration = 60 * time.Second
-
- attempt := 0
- delay := time.Duration(0)
-
- // maxAttempts is user-specified, ensure that its value is greater than zero else no request will be made
- if maxAttempts < 1 {
- maxAttempts = defaultMaxMSIRefreshAttempts
- }
-
- for attempt < maxAttempts {
- if resp != nil && resp.Body != nil {
- io.Copy(ioutil.Discard, resp.Body)
- resp.Body.Close()
- }
- resp, err = sender.Do(req)
- // we want to retry if err is not nil or the status code is in the list of retry codes
- if err == nil && !responseHasStatusCode(resp, retries...) {
- return
- }
-
- // perform exponential backoff with a cap.
- // must increment attempt before calculating delay.
- attempt++
- // the base value of 2 is the "delta backoff" as specified in the guidance doc
- delay += (time.Duration(math.Pow(2, float64(attempt))) * time.Second)
- if delay > maxDelay {
- delay = maxDelay
- }
-
- select {
- case <-time.After(delay):
- // intentionally left blank
- case <-req.Context().Done():
- err = req.Context().Err()
- return
- }
- }
- return
-}
-
-func responseHasStatusCode(resp *http.Response, codes ...int) bool {
- if resp != nil {
- for _, i := range codes {
- if i == resp.StatusCode {
- return true
- }
- }
- }
- return false
-}
-
-// SetAutoRefresh enables or disables automatic refreshing of stale tokens.
-func (spt *ServicePrincipalToken) SetAutoRefresh(autoRefresh bool) {
- spt.inner.AutoRefresh = autoRefresh
-}
-
-// SetRefreshWithin sets the interval within which if the token will expire, EnsureFresh will
-// refresh the token.
-func (spt *ServicePrincipalToken) SetRefreshWithin(d time.Duration) {
- spt.inner.RefreshWithin = d
- return
-}
-
-// SetSender sets the http.Client used when obtaining the Service Principal token. An
-// undecorated http.Client is used by default.
-func (spt *ServicePrincipalToken) SetSender(s Sender) { spt.sender = s }
-
-// OAuthToken implements the OAuthTokenProvider interface. It returns the current access token.
-func (spt *ServicePrincipalToken) OAuthToken() string {
- spt.refreshLock.RLock()
- defer spt.refreshLock.RUnlock()
- return spt.inner.Token.OAuthToken()
-}
-
-// Token returns a copy of the current token.
-func (spt *ServicePrincipalToken) Token() Token {
- spt.refreshLock.RLock()
- defer spt.refreshLock.RUnlock()
- return spt.inner.Token
-}
-
-// MultiTenantServicePrincipalToken contains tokens for multi-tenant authorization.
-type MultiTenantServicePrincipalToken struct {
- PrimaryToken *ServicePrincipalToken
- AuxiliaryTokens []*ServicePrincipalToken
-}
-
-// PrimaryOAuthToken returns the primary authorization token.
-func (mt *MultiTenantServicePrincipalToken) PrimaryOAuthToken() string {
- return mt.PrimaryToken.OAuthToken()
-}
-
-// AuxiliaryOAuthTokens returns one to three auxiliary authorization tokens.
-func (mt *MultiTenantServicePrincipalToken) AuxiliaryOAuthTokens() []string {
- tokens := make([]string, len(mt.AuxiliaryTokens))
- for i := range mt.AuxiliaryTokens {
- tokens[i] = mt.AuxiliaryTokens[i].OAuthToken()
- }
- return tokens
-}
-
-// NewMultiTenantServicePrincipalToken creates a new MultiTenantServicePrincipalToken with the specified credentials and resource.
-func NewMultiTenantServicePrincipalToken(multiTenantCfg MultiTenantOAuthConfig, clientID string, secret string, resource string) (*MultiTenantServicePrincipalToken, error) {
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(secret, "secret"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- auxTenants := multiTenantCfg.AuxiliaryTenants()
- m := MultiTenantServicePrincipalToken{
- AuxiliaryTokens: make([]*ServicePrincipalToken, len(auxTenants)),
- }
- primary, err := NewServicePrincipalToken(*multiTenantCfg.PrimaryTenant(), clientID, secret, resource)
- if err != nil {
- return nil, fmt.Errorf("failed to create SPT for primary tenant: %v", err)
- }
- m.PrimaryToken = primary
- for i := range auxTenants {
- aux, err := NewServicePrincipalToken(*auxTenants[i], clientID, secret, resource)
- if err != nil {
- return nil, fmt.Errorf("failed to create SPT for auxiliary tenant: %v", err)
- }
- m.AuxiliaryTokens[i] = aux
- }
- return &m, nil
-}
-
-// NewMultiTenantServicePrincipalTokenFromCertificate creates a new MultiTenantServicePrincipalToken with the specified certificate credentials and resource.
-func NewMultiTenantServicePrincipalTokenFromCertificate(multiTenantCfg MultiTenantOAuthConfig, clientID string, certificate *x509.Certificate, privateKey *rsa.PrivateKey, resource string) (*MultiTenantServicePrincipalToken, error) {
- if err := validateStringParam(clientID, "clientID"); err != nil {
- return nil, err
- }
- if err := validateStringParam(resource, "resource"); err != nil {
- return nil, err
- }
- if certificate == nil {
- return nil, fmt.Errorf("parameter 'certificate' cannot be nil")
- }
- if privateKey == nil {
- return nil, fmt.Errorf("parameter 'privateKey' cannot be nil")
- }
- auxTenants := multiTenantCfg.AuxiliaryTenants()
- m := MultiTenantServicePrincipalToken{
- AuxiliaryTokens: make([]*ServicePrincipalToken, len(auxTenants)),
- }
- primary, err := NewServicePrincipalTokenWithSecret(
- *multiTenantCfg.PrimaryTenant(),
- clientID,
- resource,
- &ServicePrincipalCertificateSecret{
- PrivateKey: privateKey,
- Certificate: certificate,
- },
- )
- if err != nil {
- return nil, fmt.Errorf("failed to create SPT for primary tenant: %v", err)
- }
- m.PrimaryToken = primary
- for i := range auxTenants {
- aux, err := NewServicePrincipalTokenWithSecret(
- *auxTenants[i],
- clientID,
- resource,
- &ServicePrincipalCertificateSecret{
- PrivateKey: privateKey,
- Certificate: certificate,
- },
- )
- if err != nil {
- return nil, fmt.Errorf("failed to create SPT for auxiliary tenant: %v", err)
- }
- m.AuxiliaryTokens[i] = aux
- }
- return &m, nil
-}
-
-// MSIAvailable returns true if the MSI endpoint is available for authentication.
-func MSIAvailable(ctx context.Context, s Sender) bool {
- msiType, _, err := getMSIType()
-
- if err != nil {
- return false
- }
-
- if msiType != msiTypeIMDS {
- return true
- }
-
- if s == nil {
- s = sender()
- }
-
- resp, err := getMSIEndpoint(ctx, s)
-
- if err == nil {
- resp.Body.Close()
- }
-
- return err == nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go
deleted file mode 100644
index 89190a4213..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/token_1.13.go
+++ /dev/null
@@ -1,76 +0,0 @@
-//go:build go1.13
-// +build go1.13
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package adal
-
-import (
- "context"
- "fmt"
- "net/http"
- "time"
-)
-
-func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) {
- tempCtx, cancel := context.WithTimeout(ctx, 2*time.Second)
- defer cancel()
- // http.NewRequestWithContext() was added in Go 1.13
- req, _ := http.NewRequestWithContext(tempCtx, http.MethodGet, msiEndpoint, nil)
- q := req.URL.Query()
- q.Add("api-version", msiAPIVersion)
- req.URL.RawQuery = q.Encode()
- return sender.Do(req)
-}
-
-// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
-// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
-func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
- if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
- return fmt.Errorf("failed to refresh primary token: %w", err)
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.EnsureFreshWithContext(ctx); err != nil {
- return fmt.Errorf("failed to refresh auxiliary token: %w", err)
- }
- }
- return nil
-}
-
-// RefreshWithContext obtains a fresh token for the Service Principal.
-func (mt *MultiTenantServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
- if err := mt.PrimaryToken.RefreshWithContext(ctx); err != nil {
- return fmt.Errorf("failed to refresh primary token: %w", err)
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.RefreshWithContext(ctx); err != nil {
- return fmt.Errorf("failed to refresh auxiliary token: %w", err)
- }
- }
- return nil
-}
-
-// RefreshExchangeWithContext refreshes the token, but for a different resource.
-func (mt *MultiTenantServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
- if err := mt.PrimaryToken.RefreshExchangeWithContext(ctx, resource); err != nil {
- return fmt.Errorf("failed to refresh primary token: %w", err)
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.RefreshExchangeWithContext(ctx, resource); err != nil {
- return fmt.Errorf("failed to refresh auxiliary token: %w", err)
- }
- }
- return nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go b/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go
deleted file mode 100644
index 27ec4efad7..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/token_legacy.go
+++ /dev/null
@@ -1,75 +0,0 @@
-//go:build !go1.13
-// +build !go1.13
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package adal
-
-import (
- "context"
- "net/http"
- "time"
-)
-
-func getMSIEndpoint(ctx context.Context, sender Sender) (*http.Response, error) {
- tempCtx, cancel := context.WithTimeout(ctx, 2*time.Second)
- defer cancel()
- req, _ := http.NewRequest(http.MethodGet, msiEndpoint, nil)
- req = req.WithContext(tempCtx)
- q := req.URL.Query()
- q.Add("api-version", msiAPIVersion)
- req.URL.RawQuery = q.Encode()
- return sender.Do(req)
-}
-
-// EnsureFreshWithContext will refresh the token if it will expire within the refresh window (as set by
-// RefreshWithin) and autoRefresh flag is on. This method is safe for concurrent use.
-func (mt *MultiTenantServicePrincipalToken) EnsureFreshWithContext(ctx context.Context) error {
- if err := mt.PrimaryToken.EnsureFreshWithContext(ctx); err != nil {
- return err
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.EnsureFreshWithContext(ctx); err != nil {
- return err
- }
- }
- return nil
-}
-
-// RefreshWithContext obtains a fresh token for the Service Principal.
-func (mt *MultiTenantServicePrincipalToken) RefreshWithContext(ctx context.Context) error {
- if err := mt.PrimaryToken.RefreshWithContext(ctx); err != nil {
- return err
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.RefreshWithContext(ctx); err != nil {
- return err
- }
- }
- return nil
-}
-
-// RefreshExchangeWithContext refreshes the token, but for a different resource.
-func (mt *MultiTenantServicePrincipalToken) RefreshExchangeWithContext(ctx context.Context, resource string) error {
- if err := mt.PrimaryToken.RefreshExchangeWithContext(ctx, resource); err != nil {
- return err
- }
- for _, aux := range mt.AuxiliaryTokens {
- if err := aux.RefreshExchangeWithContext(ctx, resource); err != nil {
- return err
- }
- }
- return nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/adal/version.go b/vendor/github.com/Azure/go-autorest/autorest/adal/version.go
deleted file mode 100644
index c867b34843..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/adal/version.go
+++ /dev/null
@@ -1,45 +0,0 @@
-package adal
-
-import (
- "fmt"
- "runtime"
-)
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-const number = "v1.0.0"
-
-var (
- ua = fmt.Sprintf("Go/%s (%s-%s) go-autorest/adal/%s",
- runtime.Version(),
- runtime.GOARCH,
- runtime.GOOS,
- number,
- )
-)
-
-// UserAgent returns a string containing the Go version, system architecture and OS, and the adal version.
-func UserAgent() string {
- return ua
-}
-
-// AddToUserAgent adds an extension to the current user agent
-func AddToUserAgent(extension string) error {
- if extension != "" {
- ua = fmt.Sprintf("%s %s", ua, extension)
- return nil
- }
- return fmt.Errorf("Extension was empty, User Agent remained as '%s'", ua)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization.go b/vendor/github.com/Azure/go-autorest/autorest/authorization.go
deleted file mode 100644
index 1226c41115..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/authorization.go
+++ /dev/null
@@ -1,353 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "crypto/tls"
- "encoding/base64"
- "fmt"
- "net/http"
- "net/url"
- "strings"
-
- "github.com/Azure/go-autorest/autorest/adal"
-)
-
-const (
- bearerChallengeHeader = "Www-Authenticate"
- bearer = "Bearer"
- tenantID = "tenantID"
- apiKeyAuthorizerHeader = "Ocp-Apim-Subscription-Key"
- bingAPISdkHeader = "X-BingApis-SDK-Client"
- golangBingAPISdkHeaderValue = "Go-SDK"
- authorization = "Authorization"
- basic = "Basic"
-)
-
-// Authorizer is the interface that provides a PrepareDecorator used to supply request
-// authorization. Most often, the Authorizer decorator runs last so it has access to the full
-// state of the formed HTTP request.
-type Authorizer interface {
- WithAuthorization() PrepareDecorator
-}
-
-// NullAuthorizer implements a default, "do nothing" Authorizer.
-type NullAuthorizer struct{}
-
-// WithAuthorization returns a PrepareDecorator that does nothing.
-func (na NullAuthorizer) WithAuthorization() PrepareDecorator {
- return WithNothing()
-}
-
-// APIKeyAuthorizer implements API Key authorization.
-type APIKeyAuthorizer struct {
- headers map[string]interface{}
- queryParameters map[string]interface{}
-}
-
-// NewAPIKeyAuthorizerWithHeaders creates an ApiKeyAuthorizer with headers.
-func NewAPIKeyAuthorizerWithHeaders(headers map[string]interface{}) *APIKeyAuthorizer {
- return NewAPIKeyAuthorizer(headers, nil)
-}
-
-// NewAPIKeyAuthorizerWithQueryParameters creates an ApiKeyAuthorizer with query parameters.
-func NewAPIKeyAuthorizerWithQueryParameters(queryParameters map[string]interface{}) *APIKeyAuthorizer {
- return NewAPIKeyAuthorizer(nil, queryParameters)
-}
-
-// NewAPIKeyAuthorizer creates an ApiKeyAuthorizer with headers.
-func NewAPIKeyAuthorizer(headers map[string]interface{}, queryParameters map[string]interface{}) *APIKeyAuthorizer {
- return &APIKeyAuthorizer{headers: headers, queryParameters: queryParameters}
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP headers and Query Parameters.
-func (aka *APIKeyAuthorizer) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return DecoratePreparer(p, WithHeaders(aka.headers), WithQueryParameters(aka.queryParameters))
- }
-}
-
-// CognitiveServicesAuthorizer implements authorization for Cognitive Services.
-type CognitiveServicesAuthorizer struct {
- subscriptionKey string
-}
-
-// NewCognitiveServicesAuthorizer is
-func NewCognitiveServicesAuthorizer(subscriptionKey string) *CognitiveServicesAuthorizer {
- return &CognitiveServicesAuthorizer{subscriptionKey: subscriptionKey}
-}
-
-// WithAuthorization is
-func (csa *CognitiveServicesAuthorizer) WithAuthorization() PrepareDecorator {
- headers := make(map[string]interface{})
- headers[apiKeyAuthorizerHeader] = csa.subscriptionKey
- headers[bingAPISdkHeader] = golangBingAPISdkHeaderValue
-
- return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
-}
-
-// BearerAuthorizer implements the bearer authorization
-type BearerAuthorizer struct {
- tokenProvider adal.OAuthTokenProvider
-}
-
-// NewBearerAuthorizer crates a BearerAuthorizer using the given token provider
-func NewBearerAuthorizer(tp adal.OAuthTokenProvider) *BearerAuthorizer {
- return &BearerAuthorizer{tokenProvider: tp}
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
-// value is "Bearer " followed by the token.
-//
-// By default, the token will be automatically refreshed through the Refresher interface.
-func (ba *BearerAuthorizer) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- // the ordering is important here, prefer RefresherWithContext if available
- if refresher, ok := ba.tokenProvider.(adal.RefresherWithContext); ok {
- err = refresher.EnsureFreshWithContext(r.Context())
- } else if refresher, ok := ba.tokenProvider.(adal.Refresher); ok {
- err = refresher.EnsureFresh()
- }
- if err != nil {
- var resp *http.Response
- if tokError, ok := err.(adal.TokenRefreshError); ok {
- resp = tokError.Response()
- }
- return r, NewErrorWithError(err, "azure.BearerAuthorizer", "WithAuthorization", resp,
- "Failed to refresh the Token for request to %s", r.URL)
- }
- return Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", ba.tokenProvider.OAuthToken())))
- }
- return r, err
- })
- }
-}
-
-// TokenProvider returns OAuthTokenProvider so that it can be used for authorization outside the REST.
-func (ba *BearerAuthorizer) TokenProvider() adal.OAuthTokenProvider {
- return ba.tokenProvider
-}
-
-// BearerAuthorizerCallbackFunc is the authentication callback signature.
-type BearerAuthorizerCallbackFunc func(tenantID, resource string) (*BearerAuthorizer, error)
-
-// BearerAuthorizerCallback implements bearer authorization via a callback.
-type BearerAuthorizerCallback struct {
- sender Sender
- callback BearerAuthorizerCallbackFunc
-}
-
-// NewBearerAuthorizerCallback creates a bearer authorization callback. The callback
-// is invoked when the HTTP request is submitted.
-func NewBearerAuthorizerCallback(s Sender, callback BearerAuthorizerCallbackFunc) *BearerAuthorizerCallback {
- if s == nil {
- s = sender(tls.RenegotiateNever)
- }
- return &BearerAuthorizerCallback{sender: s, callback: callback}
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose value
-// is "Bearer " followed by the token. The BearerAuthorizer is obtained via a user-supplied callback.
-//
-// By default, the token will be automatically refreshed through the Refresher interface.
-func (bacb *BearerAuthorizerCallback) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- // make a copy of the request and remove the body as it's not
- // required and avoids us having to create a copy of it.
- rCopy := *r
- removeRequestBody(&rCopy)
-
- resp, err := bacb.sender.Do(&rCopy)
- if err != nil {
- return r, err
- }
- DrainResponseBody(resp)
- if resp.StatusCode == 401 && hasBearerChallenge(resp.Header) {
- bc, err := newBearerChallenge(resp.Header)
- if err != nil {
- return r, err
- }
- if bacb.callback != nil {
- ba, err := bacb.callback(bc.values[tenantID], bc.values["resource"])
- if err != nil {
- return r, err
- }
- return Prepare(r, ba.WithAuthorization())
- }
- }
- }
- return r, err
- })
- }
-}
-
-// returns true if the HTTP response contains a bearer challenge
-func hasBearerChallenge(header http.Header) bool {
- authHeader := header.Get(bearerChallengeHeader)
- if len(authHeader) == 0 || strings.Index(authHeader, bearer) < 0 {
- return false
- }
- return true
-}
-
-type bearerChallenge struct {
- values map[string]string
-}
-
-func newBearerChallenge(header http.Header) (bc bearerChallenge, err error) {
- challenge := strings.TrimSpace(header.Get(bearerChallengeHeader))
- trimmedChallenge := challenge[len(bearer)+1:]
-
- // challenge is a set of key=value pairs that are comma delimited
- pairs := strings.Split(trimmedChallenge, ",")
- if len(pairs) < 1 {
- err = fmt.Errorf("challenge '%s' contains no pairs", challenge)
- return bc, err
- }
-
- bc.values = make(map[string]string)
- for i := range pairs {
- trimmedPair := strings.TrimSpace(pairs[i])
- pair := strings.Split(trimmedPair, "=")
- if len(pair) == 2 {
- // remove the enclosing quotes
- key := strings.Trim(pair[0], "\"")
- value := strings.Trim(pair[1], "\"")
-
- switch key {
- case "authorization", "authorization_uri":
- // strip the tenant ID from the authorization URL
- asURL, err := url.Parse(value)
- if err != nil {
- return bc, err
- }
- bc.values[tenantID] = asURL.Path[1:]
- default:
- bc.values[key] = value
- }
- }
- }
-
- return bc, err
-}
-
-// EventGridKeyAuthorizer implements authorization for event grid using key authentication.
-type EventGridKeyAuthorizer struct {
- topicKey string
-}
-
-// NewEventGridKeyAuthorizer creates a new EventGridKeyAuthorizer
-// with the specified topic key.
-func NewEventGridKeyAuthorizer(topicKey string) EventGridKeyAuthorizer {
- return EventGridKeyAuthorizer{topicKey: topicKey}
-}
-
-// WithAuthorization returns a PrepareDecorator that adds the aeg-sas-key authentication header.
-func (egta EventGridKeyAuthorizer) WithAuthorization() PrepareDecorator {
- headers := map[string]interface{}{
- "aeg-sas-key": egta.topicKey,
- }
- return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
-}
-
-// BasicAuthorizer implements basic HTTP authorization by adding the Authorization HTTP header
-// with the value "Basic " where is a base64-encoded username:password tuple.
-type BasicAuthorizer struct {
- userName string
- password string
-}
-
-// NewBasicAuthorizer creates a new BasicAuthorizer with the specified username and password.
-func NewBasicAuthorizer(userName, password string) *BasicAuthorizer {
- return &BasicAuthorizer{
- userName: userName,
- password: password,
- }
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
-// value is "Basic " followed by the base64-encoded username:password tuple.
-func (ba *BasicAuthorizer) WithAuthorization() PrepareDecorator {
- headers := make(map[string]interface{})
- headers[authorization] = basic + " " + base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s:%s", ba.userName, ba.password)))
-
- return NewAPIKeyAuthorizerWithHeaders(headers).WithAuthorization()
-}
-
-// MultiTenantServicePrincipalTokenAuthorizer provides authentication across tenants.
-type MultiTenantServicePrincipalTokenAuthorizer interface {
- WithAuthorization() PrepareDecorator
-}
-
-// NewMultiTenantServicePrincipalTokenAuthorizer crates a BearerAuthorizer using the given token provider
-func NewMultiTenantServicePrincipalTokenAuthorizer(tp adal.MultitenantOAuthTokenProvider) MultiTenantServicePrincipalTokenAuthorizer {
- return NewMultiTenantBearerAuthorizer(tp)
-}
-
-// MultiTenantBearerAuthorizer implements bearer authorization across multiple tenants.
-type MultiTenantBearerAuthorizer struct {
- tp adal.MultitenantOAuthTokenProvider
-}
-
-// NewMultiTenantBearerAuthorizer creates a MultiTenantBearerAuthorizer using the given token provider.
-func NewMultiTenantBearerAuthorizer(tp adal.MultitenantOAuthTokenProvider) *MultiTenantBearerAuthorizer {
- return &MultiTenantBearerAuthorizer{tp: tp}
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header using the
-// primary token along with the auxiliary authorization header using the auxiliary tokens.
-//
-// By default, the token will be automatically refreshed through the Refresher interface.
-func (mt *MultiTenantBearerAuthorizer) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err != nil {
- return r, err
- }
- if refresher, ok := mt.tp.(adal.RefresherWithContext); ok {
- err = refresher.EnsureFreshWithContext(r.Context())
- if err != nil {
- var resp *http.Response
- if tokError, ok := err.(adal.TokenRefreshError); ok {
- resp = tokError.Response()
- }
- return r, NewErrorWithError(err, "azure.multiTenantSPTAuthorizer", "WithAuthorization", resp,
- "Failed to refresh one or more Tokens for request to %s", r.URL)
- }
- }
- r, err = Prepare(r, WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", mt.tp.PrimaryOAuthToken())))
- if err != nil {
- return r, err
- }
- auxTokens := mt.tp.AuxiliaryOAuthTokens()
- for i := range auxTokens {
- auxTokens[i] = fmt.Sprintf("Bearer %s", auxTokens[i])
- }
- return Prepare(r, WithHeader(headerAuxAuthorization, strings.Join(auxTokens, ", ")))
- })
- }
-}
-
-// TokenProvider returns the underlying MultitenantOAuthTokenProvider for this authorizer.
-func (mt *MultiTenantBearerAuthorizer) TokenProvider() adal.MultitenantOAuthTokenProvider {
- return mt.tp
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go b/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go
deleted file mode 100644
index 66501493bd..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go
+++ /dev/null
@@ -1,66 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "fmt"
- "net/http"
- "strings"
-)
-
-// SASTokenAuthorizer implements an authorization for SAS Token Authentication
-// this can be used for interaction with Blob Storage Endpoints
-type SASTokenAuthorizer struct {
- sasToken string
-}
-
-// NewSASTokenAuthorizer creates a SASTokenAuthorizer using the given credentials
-func NewSASTokenAuthorizer(sasToken string) (*SASTokenAuthorizer, error) {
- if strings.TrimSpace(sasToken) == "" {
- return nil, fmt.Errorf("sasToken cannot be empty")
- }
-
- token := sasToken
- if strings.HasPrefix(sasToken, "?") {
- token = strings.TrimPrefix(sasToken, "?")
- }
-
- return &SASTokenAuthorizer{
- sasToken: token,
- }, nil
-}
-
-// WithAuthorization returns a PrepareDecorator that adds a shared access signature token to the
-// URI's query parameters. This can be used for the Blob, Queue, and File Services.
-//
-// See https://docs.microsoft.com/en-us/rest/api/storageservices/delegate-access-with-shared-access-signature
-func (sas *SASTokenAuthorizer) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err != nil {
- return r, err
- }
-
- if r.URL.RawQuery == "" {
- r.URL.RawQuery = sas.sasToken
- } else if !strings.Contains(r.URL.RawQuery, sas.sasToken) {
- r.URL.RawQuery = fmt.Sprintf("%s&%s", r.URL.RawQuery, sas.sasToken)
- }
-
- return Prepare(r)
- })
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go b/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go
deleted file mode 100644
index 2af5030a1c..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/authorization_storage.go
+++ /dev/null
@@ -1,307 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "crypto/hmac"
- "crypto/sha256"
- "encoding/base64"
- "fmt"
- "net/http"
- "net/url"
- "sort"
- "strings"
- "time"
-)
-
-// SharedKeyType defines the enumeration for the various shared key types.
-// See https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key for details on the shared key types.
-type SharedKeyType string
-
-const (
- // SharedKey is used to authorize against blobs, files and queues services.
- SharedKey SharedKeyType = "sharedKey"
-
- // SharedKeyForTable is used to authorize against the table service.
- SharedKeyForTable SharedKeyType = "sharedKeyTable"
-
- // SharedKeyLite is used to authorize against blobs, files and queues services. It's provided for
- // backwards compatibility with API versions before 2009-09-19. Prefer SharedKey instead.
- SharedKeyLite SharedKeyType = "sharedKeyLite"
-
- // SharedKeyLiteForTable is used to authorize against the table service. It's provided for
- // backwards compatibility with older table API versions. Prefer SharedKeyForTable instead.
- SharedKeyLiteForTable SharedKeyType = "sharedKeyLiteTable"
-)
-
-const (
- headerAccept = "Accept"
- headerAcceptCharset = "Accept-Charset"
- headerContentEncoding = "Content-Encoding"
- headerContentLength = "Content-Length"
- headerContentMD5 = "Content-MD5"
- headerContentLanguage = "Content-Language"
- headerIfModifiedSince = "If-Modified-Since"
- headerIfMatch = "If-Match"
- headerIfNoneMatch = "If-None-Match"
- headerIfUnmodifiedSince = "If-Unmodified-Since"
- headerDate = "Date"
- headerXMSDate = "X-Ms-Date"
- headerXMSVersion = "x-ms-version"
- headerRange = "Range"
-)
-
-const storageEmulatorAccountName = "devstoreaccount1"
-
-// SharedKeyAuthorizer implements an authorization for Shared Key
-// this can be used for interaction with Blob, File and Queue Storage Endpoints
-type SharedKeyAuthorizer struct {
- accountName string
- accountKey []byte
- keyType SharedKeyType
-}
-
-// NewSharedKeyAuthorizer creates a SharedKeyAuthorizer using the provided credentials and shared key type.
-func NewSharedKeyAuthorizer(accountName, accountKey string, keyType SharedKeyType) (*SharedKeyAuthorizer, error) {
- key, err := base64.StdEncoding.DecodeString(accountKey)
- if err != nil {
- return nil, fmt.Errorf("malformed storage account key: %v", err)
- }
- return &SharedKeyAuthorizer{
- accountName: accountName,
- accountKey: key,
- keyType: keyType,
- }, nil
-}
-
-// WithAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
-// value is " " followed by the computed key.
-// This can be used for the Blob, Queue, and File Services
-//
-// from: https://docs.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key
-// You may use Shared Key authorization to authorize a request made against the
-// 2009-09-19 version and later of the Blob and Queue services,
-// and version 2014-02-14 and later of the File services.
-func (sk *SharedKeyAuthorizer) WithAuthorization() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err != nil {
- return r, err
- }
-
- sk, err := buildSharedKey(sk.accountName, sk.accountKey, r, sk.keyType)
- if err != nil {
- return r, err
- }
- return Prepare(r, WithHeader(headerAuthorization, sk))
- })
- }
-}
-
-func buildSharedKey(accName string, accKey []byte, req *http.Request, keyType SharedKeyType) (string, error) {
- canRes, err := buildCanonicalizedResource(accName, req.URL.String(), keyType)
- if err != nil {
- return "", err
- }
-
- if req.Header == nil {
- req.Header = http.Header{}
- }
-
- // ensure date is set
- if req.Header.Get(headerDate) == "" && req.Header.Get(headerXMSDate) == "" {
- date := time.Now().UTC().Format(http.TimeFormat)
- req.Header.Set(headerXMSDate, date)
- }
- canString, err := buildCanonicalizedString(req.Method, req.Header, canRes, keyType)
- if err != nil {
- return "", err
- }
- return createAuthorizationHeader(accName, accKey, canString, keyType), nil
-}
-
-func buildCanonicalizedResource(accountName, uri string, keyType SharedKeyType) (string, error) {
- errMsg := "buildCanonicalizedResource error: %s"
- u, err := url.Parse(uri)
- if err != nil {
- return "", fmt.Errorf(errMsg, err.Error())
- }
-
- cr := bytes.NewBufferString("")
- if accountName != storageEmulatorAccountName {
- cr.WriteString("/")
- cr.WriteString(getCanonicalizedAccountName(accountName))
- }
-
- if len(u.Path) > 0 {
- // Any portion of the CanonicalizedResource string that is derived from
- // the resource's URI should be encoded exactly as it is in the URI.
- // -- https://msdn.microsoft.com/en-gb/library/azure/dd179428.aspx
- cr.WriteString(u.EscapedPath())
- } else {
- // a slash is required to indicate the root path
- cr.WriteString("/")
- }
-
- params, err := url.ParseQuery(u.RawQuery)
- if err != nil {
- return "", fmt.Errorf(errMsg, err.Error())
- }
-
- // See https://github.com/Azure/azure-storage-net/blob/master/Lib/Common/Core/Util/AuthenticationUtility.cs#L277
- if keyType == SharedKey {
- if len(params) > 0 {
- cr.WriteString("\n")
-
- keys := []string{}
- for key := range params {
- keys = append(keys, key)
- }
- sort.Strings(keys)
-
- completeParams := []string{}
- for _, key := range keys {
- if len(params[key]) > 1 {
- sort.Strings(params[key])
- }
-
- completeParams = append(completeParams, fmt.Sprintf("%s:%s", key, strings.Join(params[key], ",")))
- }
- cr.WriteString(strings.Join(completeParams, "\n"))
- }
- } else {
- // search for "comp" parameter, if exists then add it to canonicalizedresource
- if v, ok := params["comp"]; ok {
- cr.WriteString("?comp=" + v[0])
- }
- }
-
- return string(cr.Bytes()), nil
-}
-
-func getCanonicalizedAccountName(accountName string) string {
- // since we may be trying to access a secondary storage account, we need to
- // remove the -secondary part of the storage name
- return strings.TrimSuffix(accountName, "-secondary")
-}
-
-func buildCanonicalizedString(verb string, headers http.Header, canonicalizedResource string, keyType SharedKeyType) (string, error) {
- contentLength := headers.Get(headerContentLength)
- if contentLength == "0" {
- contentLength = ""
- }
- date := headers.Get(headerDate)
- if v := headers.Get(headerXMSDate); v != "" {
- if keyType == SharedKey || keyType == SharedKeyLite {
- date = ""
- } else {
- date = v
- }
- }
- var canString string
- switch keyType {
- case SharedKey:
- canString = strings.Join([]string{
- verb,
- headers.Get(headerContentEncoding),
- headers.Get(headerContentLanguage),
- contentLength,
- headers.Get(headerContentMD5),
- headers.Get(headerContentType),
- date,
- headers.Get(headerIfModifiedSince),
- headers.Get(headerIfMatch),
- headers.Get(headerIfNoneMatch),
- headers.Get(headerIfUnmodifiedSince),
- headers.Get(headerRange),
- buildCanonicalizedHeader(headers),
- canonicalizedResource,
- }, "\n")
- case SharedKeyForTable:
- canString = strings.Join([]string{
- verb,
- headers.Get(headerContentMD5),
- headers.Get(headerContentType),
- date,
- canonicalizedResource,
- }, "\n")
- case SharedKeyLite:
- canString = strings.Join([]string{
- verb,
- headers.Get(headerContentMD5),
- headers.Get(headerContentType),
- date,
- buildCanonicalizedHeader(headers),
- canonicalizedResource,
- }, "\n")
- case SharedKeyLiteForTable:
- canString = strings.Join([]string{
- date,
- canonicalizedResource,
- }, "\n")
- default:
- return "", fmt.Errorf("key type '%s' is not supported", keyType)
- }
- return canString, nil
-}
-
-func buildCanonicalizedHeader(headers http.Header) string {
- cm := make(map[string]string)
-
- for k := range headers {
- headerName := strings.TrimSpace(strings.ToLower(k))
- if strings.HasPrefix(headerName, "x-ms-") {
- cm[headerName] = headers.Get(k)
- }
- }
-
- if len(cm) == 0 {
- return ""
- }
-
- keys := []string{}
- for key := range cm {
- keys = append(keys, key)
- }
-
- sort.Strings(keys)
-
- ch := bytes.NewBufferString("")
-
- for _, key := range keys {
- ch.WriteString(key)
- ch.WriteRune(':')
- ch.WriteString(cm[key])
- ch.WriteRune('\n')
- }
-
- return strings.TrimSuffix(string(ch.Bytes()), "\n")
-}
-
-func createAuthorizationHeader(accountName string, accountKey []byte, canonicalizedString string, keyType SharedKeyType) string {
- h := hmac.New(sha256.New, accountKey)
- h.Write([]byte(canonicalizedString))
- signature := base64.StdEncoding.EncodeToString(h.Sum(nil))
- var key string
- switch keyType {
- case SharedKey, SharedKeyForTable:
- key = "SharedKey"
- case SharedKeyLite, SharedKeyLiteForTable:
- key = "SharedKeyLite"
- }
- return fmt.Sprintf("%s %s:%s", key, getCanonicalizedAccountName(accountName), signature)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/autorest.go b/vendor/github.com/Azure/go-autorest/autorest/autorest.go
deleted file mode 100644
index aafdf021fd..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/autorest.go
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
-Package autorest implements an HTTP request pipeline suitable for use across multiple go-routines
-and provides the shared routines relied on by AutoRest (see https://github.com/Azure/autorest/)
-generated Go code.
-
-The package breaks sending and responding to HTTP requests into three phases: Preparing, Sending,
-and Responding. A typical pattern is:
-
- req, err := Prepare(&http.Request{},
- token.WithAuthorization())
-
- resp, err := Send(req,
- WithLogging(logger),
- DoErrorIfStatusCode(http.StatusInternalServerError),
- DoCloseIfError(),
- DoRetryForAttempts(5, time.Second))
-
- err = Respond(resp,
- ByDiscardingBody(),
- ByClosing())
-
-Each phase relies on decorators to modify and / or manage processing. Decorators may first modify
-and then pass the data along, pass the data first and then modify the result, or wrap themselves
-around passing the data (such as a logger might do). Decorators run in the order provided. For
-example, the following:
-
- req, err := Prepare(&http.Request{},
- WithBaseURL("https://microsoft.com/"),
- WithPath("a"),
- WithPath("b"),
- WithPath("c"))
-
-will set the URL to:
-
- https://microsoft.com/a/b/c
-
-Preparers and Responders may be shared and re-used (assuming the underlying decorators support
-sharing and re-use). Performant use is obtained by creating one or more Preparers and Responders
-shared among multiple go-routines, and a single Sender shared among multiple sending go-routines,
-all bound together by means of input / output channels.
-
-Decorators hold their passed state within a closure (such as the path components in the example
-above). Be careful to share Preparers and Responders only in a context where such held state
-applies. For example, it may not make sense to share a Preparer that applies a query string from a
-fixed set of values. Similarly, sharing a Responder that reads the response body into a passed
-struct (e.g., ByUnmarshallingJson) is likely incorrect.
-
-Lastly, the Swagger specification (https://swagger.io) that drives AutoRest
-(https://github.com/Azure/autorest/) precisely defines two date forms: date and date-time. The
-github.com/Azure/go-autorest/autorest/date package provides time.Time derivations to ensure
-correct parsing and formatting.
-
-Errors raised by autorest objects and methods will conform to the autorest.Error interface.
-
-See the included examples for more detail. For details on the suggested use of this package by
-generated clients, see the Client described below.
-*/
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "context"
- "net/http"
- "time"
-)
-
-const (
- // HeaderLocation specifies the HTTP Location header.
- HeaderLocation = "Location"
-
- // HeaderRetryAfter specifies the HTTP Retry-After header.
- HeaderRetryAfter = "Retry-After"
-)
-
-// ResponseHasStatusCode returns true if the status code in the HTTP Response is in the passed set
-// and false otherwise.
-func ResponseHasStatusCode(resp *http.Response, codes ...int) bool {
- if resp == nil {
- return false
- }
- return containsInt(codes, resp.StatusCode)
-}
-
-// GetLocation retrieves the URL from the Location header of the passed response.
-func GetLocation(resp *http.Response) string {
- return resp.Header.Get(HeaderLocation)
-}
-
-// GetRetryAfter extracts the retry delay from the Retry-After header of the passed response. If
-// the header is absent or is malformed, it will return the supplied default delay time.Duration.
-func GetRetryAfter(resp *http.Response, defaultDelay time.Duration) time.Duration {
- retry := resp.Header.Get(HeaderRetryAfter)
- if retry == "" {
- return defaultDelay
- }
-
- d, err := time.ParseDuration(retry + "s")
- if err != nil {
- return defaultDelay
- }
-
- return d
-}
-
-// NewPollingRequest allocates and returns a new http.Request to poll for the passed response.
-func NewPollingRequest(resp *http.Response, cancel <-chan struct{}) (*http.Request, error) {
- location := GetLocation(resp)
- if location == "" {
- return nil, NewErrorWithResponse("autorest", "NewPollingRequest", resp, "Location header missing from response that requires polling")
- }
-
- req, err := Prepare(&http.Request{Cancel: cancel},
- AsGet(),
- WithBaseURL(location))
- if err != nil {
- return nil, NewErrorWithError(err, "autorest", "NewPollingRequest", nil, "Failure creating poll request to %s", location)
- }
-
- return req, nil
-}
-
-// NewPollingRequestWithContext allocates and returns a new http.Request with the specified context to poll for the passed response.
-func NewPollingRequestWithContext(ctx context.Context, resp *http.Response) (*http.Request, error) {
- location := GetLocation(resp)
- if location == "" {
- return nil, NewErrorWithResponse("autorest", "NewPollingRequestWithContext", resp, "Location header missing from response that requires polling")
- }
-
- req, err := Prepare((&http.Request{}).WithContext(ctx),
- AsGet(),
- WithBaseURL(location))
- if err != nil {
- return nil, NewErrorWithError(err, "autorest", "NewPollingRequestWithContext", nil, "Failure creating poll request to %s", location)
- }
-
- return req, nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go b/vendor/github.com/Azure/go-autorest/autorest/azure/async.go
deleted file mode 100644
index 45575eedbf..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/azure/async.go
+++ /dev/null
@@ -1,995 +0,0 @@
-package azure
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "context"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "net/url"
- "strings"
- "time"
-
- "github.com/Azure/go-autorest/autorest"
- "github.com/Azure/go-autorest/logger"
- "github.com/Azure/go-autorest/tracing"
-)
-
-const (
- headerAsyncOperation = "Azure-AsyncOperation"
-)
-
-const (
- operationInProgress string = "InProgress"
- operationCanceled string = "Canceled"
- operationFailed string = "Failed"
- operationSucceeded string = "Succeeded"
-)
-
-var pollingCodes = [...]int{http.StatusNoContent, http.StatusAccepted, http.StatusCreated, http.StatusOK}
-
-// FutureAPI contains the set of methods on the Future type.
-type FutureAPI interface {
- // Response returns the last HTTP response.
- Response() *http.Response
-
- // Status returns the last status message of the operation.
- Status() string
-
- // PollingMethod returns the method used to monitor the status of the asynchronous operation.
- PollingMethod() PollingMethodType
-
- // DoneWithContext queries the service to see if the operation has completed.
- DoneWithContext(context.Context, autorest.Sender) (bool, error)
-
- // GetPollingDelay returns a duration the application should wait before checking
- // the status of the asynchronous request and true; this value is returned from
- // the service via the Retry-After response header. If the header wasn't returned
- // then the function returns the zero-value time.Duration and false.
- GetPollingDelay() (time.Duration, bool)
-
- // WaitForCompletionRef will return when one of the following conditions is met: the long
- // running operation has completed, the provided context is cancelled, or the client's
- // polling duration has been exceeded. It will retry failed polling attempts based on
- // the retry value defined in the client up to the maximum retry attempts.
- // If no deadline is specified in the context then the client.PollingDuration will be
- // used to determine if a default deadline should be used.
- // If PollingDuration is greater than zero the value will be used as the context's timeout.
- // If PollingDuration is zero then no default deadline will be used.
- WaitForCompletionRef(context.Context, autorest.Client) error
-
- // MarshalJSON implements the json.Marshaler interface.
- MarshalJSON() ([]byte, error)
-
- // MarshalJSON implements the json.Unmarshaler interface.
- UnmarshalJSON([]byte) error
-
- // PollingURL returns the URL used for retrieving the status of the long-running operation.
- PollingURL() string
-
- // GetResult should be called once polling has completed successfully.
- // It makes the final GET call to retrieve the resultant payload.
- GetResult(autorest.Sender) (*http.Response, error)
-}
-
-var _ FutureAPI = (*Future)(nil)
-
-// Future provides a mechanism to access the status and results of an asynchronous request.
-// Since futures are stateful they should be passed by value to avoid race conditions.
-type Future struct {
- pt pollingTracker
-}
-
-// NewFutureFromResponse returns a new Future object initialized
-// with the initial response from an asynchronous operation.
-func NewFutureFromResponse(resp *http.Response) (Future, error) {
- pt, err := createPollingTracker(resp)
- return Future{pt: pt}, err
-}
-
-// Response returns the last HTTP response.
-func (f Future) Response() *http.Response {
- if f.pt == nil {
- return nil
- }
- return f.pt.latestResponse()
-}
-
-// Status returns the last status message of the operation.
-func (f Future) Status() string {
- if f.pt == nil {
- return ""
- }
- return f.pt.pollingStatus()
-}
-
-// PollingMethod returns the method used to monitor the status of the asynchronous operation.
-func (f Future) PollingMethod() PollingMethodType {
- if f.pt == nil {
- return PollingUnknown
- }
- return f.pt.pollingMethod()
-}
-
-// DoneWithContext queries the service to see if the operation has completed.
-func (f *Future) DoneWithContext(ctx context.Context, sender autorest.Sender) (done bool, err error) {
- ctx = tracing.StartSpan(ctx, "github.com/Azure/go-autorest/autorest/azure/async.DoneWithContext")
- defer func() {
- sc := -1
- resp := f.Response()
- if resp != nil {
- sc = resp.StatusCode
- }
- tracing.EndSpan(ctx, sc, err)
- }()
-
- if f.pt == nil {
- return false, autorest.NewError("Future", "Done", "future is not initialized")
- }
- if f.pt.hasTerminated() {
- return true, f.pt.pollingError()
- }
- if err := f.pt.pollForStatus(ctx, sender); err != nil {
- return false, err
- }
- if err := f.pt.checkForErrors(); err != nil {
- return f.pt.hasTerminated(), err
- }
- if err := f.pt.updatePollingState(f.pt.provisioningStateApplicable()); err != nil {
- return false, err
- }
- if err := f.pt.initPollingMethod(); err != nil {
- return false, err
- }
- if err := f.pt.updatePollingMethod(); err != nil {
- return false, err
- }
- return f.pt.hasTerminated(), f.pt.pollingError()
-}
-
-// GetPollingDelay returns a duration the application should wait before checking
-// the status of the asynchronous request and true; this value is returned from
-// the service via the Retry-After response header. If the header wasn't returned
-// then the function returns the zero-value time.Duration and false.
-func (f Future) GetPollingDelay() (time.Duration, bool) {
- if f.pt == nil {
- return 0, false
- }
- resp := f.pt.latestResponse()
- if resp == nil {
- return 0, false
- }
-
- retry := resp.Header.Get(autorest.HeaderRetryAfter)
- if retry == "" {
- return 0, false
- }
-
- d, err := time.ParseDuration(retry + "s")
- if err != nil {
- panic(err)
- }
-
- return d, true
-}
-
-// WaitForCompletionRef will return when one of the following conditions is met: the long
-// running operation has completed, the provided context is cancelled, or the client's
-// polling duration has been exceeded. It will retry failed polling attempts based on
-// the retry value defined in the client up to the maximum retry attempts.
-// If no deadline is specified in the context then the client.PollingDuration will be
-// used to determine if a default deadline should be used.
-// If PollingDuration is greater than zero the value will be used as the context's timeout.
-// If PollingDuration is zero then no default deadline will be used.
-func (f *Future) WaitForCompletionRef(ctx context.Context, client autorest.Client) (err error) {
- ctx = tracing.StartSpan(ctx, "github.com/Azure/go-autorest/autorest/azure/async.WaitForCompletionRef")
- defer func() {
- sc := -1
- resp := f.Response()
- if resp != nil {
- sc = resp.StatusCode
- }
- tracing.EndSpan(ctx, sc, err)
- }()
- cancelCtx := ctx
- // if the provided context already has a deadline don't override it
- _, hasDeadline := ctx.Deadline()
- if d := client.PollingDuration; !hasDeadline && d != 0 {
- var cancel context.CancelFunc
- cancelCtx, cancel = context.WithTimeout(ctx, d)
- defer cancel()
- }
- // if the initial response has a Retry-After, sleep for the specified amount of time before starting to poll
- if delay, ok := f.GetPollingDelay(); ok {
- logger.Instance.Writeln(logger.LogInfo, "WaitForCompletionRef: initial polling delay")
- if delayElapsed := autorest.DelayForBackoff(delay, 0, cancelCtx.Done()); !delayElapsed {
- err = cancelCtx.Err()
- return
- }
- }
- done, err := f.DoneWithContext(ctx, client)
- for attempts := 0; !done; done, err = f.DoneWithContext(ctx, client) {
- if attempts >= client.RetryAttempts {
- return autorest.NewErrorWithError(err, "Future", "WaitForCompletion", f.pt.latestResponse(), "the number of retries has been exceeded")
- }
- // we want delayAttempt to be zero in the non-error case so
- // that DelayForBackoff doesn't perform exponential back-off
- var delayAttempt int
- var delay time.Duration
- if err == nil {
- // check for Retry-After delay, if not present use the client's polling delay
- var ok bool
- delay, ok = f.GetPollingDelay()
- if !ok {
- logger.Instance.Writeln(logger.LogInfo, "WaitForCompletionRef: Using client polling delay")
- delay = client.PollingDelay
- }
- } else {
- // there was an error polling for status so perform exponential
- // back-off based on the number of attempts using the client's retry
- // duration. update attempts after delayAttempt to avoid off-by-one.
- logger.Instance.Writef(logger.LogError, "WaitForCompletionRef: %s\n", err)
- delayAttempt = attempts
- delay = client.RetryDuration
- attempts++
- }
- // wait until the delay elapses or the context is cancelled
- delayElapsed := autorest.DelayForBackoff(delay, delayAttempt, cancelCtx.Done())
- if !delayElapsed {
- return autorest.NewErrorWithError(cancelCtx.Err(), "Future", "WaitForCompletion", f.pt.latestResponse(), "context has been cancelled")
- }
- }
- return
-}
-
-// MarshalJSON implements the json.Marshaler interface.
-func (f Future) MarshalJSON() ([]byte, error) {
- return json.Marshal(f.pt)
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface.
-func (f *Future) UnmarshalJSON(data []byte) error {
- // unmarshal into JSON object to determine the tracker type
- obj := map[string]interface{}{}
- err := json.Unmarshal(data, &obj)
- if err != nil {
- return err
- }
- if obj["method"] == nil {
- return autorest.NewError("Future", "UnmarshalJSON", "missing 'method' property")
- }
- method := obj["method"].(string)
- switch strings.ToUpper(method) {
- case http.MethodDelete:
- f.pt = &pollingTrackerDelete{}
- case http.MethodPatch:
- f.pt = &pollingTrackerPatch{}
- case http.MethodPost:
- f.pt = &pollingTrackerPost{}
- case http.MethodPut:
- f.pt = &pollingTrackerPut{}
- default:
- return autorest.NewError("Future", "UnmarshalJSON", "unsupoorted method '%s'", method)
- }
- // now unmarshal into the tracker
- return json.Unmarshal(data, &f.pt)
-}
-
-// PollingURL returns the URL used for retrieving the status of the long-running operation.
-func (f Future) PollingURL() string {
- if f.pt == nil {
- return ""
- }
- return f.pt.pollingURL()
-}
-
-// GetResult should be called once polling has completed successfully.
-// It makes the final GET call to retrieve the resultant payload.
-func (f Future) GetResult(sender autorest.Sender) (*http.Response, error) {
- if f.pt.finalGetURL() == "" {
- // we can end up in this situation if the async operation returns a 200
- // with no polling URLs. in that case return the response which should
- // contain the JSON payload (only do this for successful terminal cases).
- if lr := f.pt.latestResponse(); lr != nil && f.pt.hasSucceeded() {
- return lr, nil
- }
- return nil, autorest.NewError("Future", "GetResult", "missing URL for retrieving result")
- }
- req, err := http.NewRequest(http.MethodGet, f.pt.finalGetURL(), nil)
- if err != nil {
- return nil, err
- }
- resp, err := sender.Do(req)
- if err == nil && resp.Body != nil {
- // copy the body and close it so callers don't have to
- defer resp.Body.Close()
- b, err := ioutil.ReadAll(resp.Body)
- if err != nil {
- return resp, err
- }
- resp.Body = ioutil.NopCloser(bytes.NewReader(b))
- }
- return resp, err
-}
-
-type pollingTracker interface {
- // these methods can differ per tracker
-
- // checks the response headers and status code to determine the polling mechanism
- updatePollingMethod() error
-
- // checks the response for tracker-specific error conditions
- checkForErrors() error
-
- // returns true if provisioning state should be checked
- provisioningStateApplicable() bool
-
- // methods common to all trackers
-
- // initializes a tracker's polling URL and method, called for each iteration.
- // these values can be overridden by each polling tracker as required.
- initPollingMethod() error
-
- // initializes the tracker's internal state, call this when the tracker is created
- initializeState() error
-
- // makes an HTTP request to check the status of the LRO
- pollForStatus(ctx context.Context, sender autorest.Sender) error
-
- // updates internal tracker state, call this after each call to pollForStatus
- updatePollingState(provStateApl bool) error
-
- // returns the error response from the service, can be nil
- pollingError() error
-
- // returns the polling method being used
- pollingMethod() PollingMethodType
-
- // returns the state of the LRO as returned from the service
- pollingStatus() string
-
- // returns the URL used for polling status
- pollingURL() string
-
- // returns the URL used for the final GET to retrieve the resource
- finalGetURL() string
-
- // returns true if the LRO is in a terminal state
- hasTerminated() bool
-
- // returns true if the LRO is in a failed terminal state
- hasFailed() bool
-
- // returns true if the LRO is in a successful terminal state
- hasSucceeded() bool
-
- // returns the cached HTTP response after a call to pollForStatus(), can be nil
- latestResponse() *http.Response
-}
-
-type pollingTrackerBase struct {
- // resp is the last response, either from the submission of the LRO or from polling
- resp *http.Response
-
- // method is the HTTP verb, this is needed for deserialization
- Method string `json:"method"`
-
- // rawBody is the raw JSON response body
- rawBody map[string]interface{}
-
- // denotes if polling is using async-operation or location header
- Pm PollingMethodType `json:"pollingMethod"`
-
- // the URL to poll for status
- URI string `json:"pollingURI"`
-
- // the state of the LRO as returned from the service
- State string `json:"lroState"`
-
- // the URL to GET for the final result
- FinalGetURI string `json:"resultURI"`
-
- // used to hold an error object returned from the service
- Err *ServiceError `json:"error,omitempty"`
-}
-
-func (pt *pollingTrackerBase) initializeState() error {
- // determine the initial polling state based on response body and/or HTTP status
- // code. this is applicable to the initial LRO response, not polling responses!
- pt.Method = pt.resp.Request.Method
- if err := pt.updateRawBody(); err != nil {
- return err
- }
- switch pt.resp.StatusCode {
- case http.StatusOK:
- if ps := pt.getProvisioningState(); ps != nil {
- pt.State = *ps
- if pt.hasFailed() {
- pt.updateErrorFromResponse()
- return pt.pollingError()
- }
- } else {
- pt.State = operationSucceeded
- }
- case http.StatusCreated:
- if ps := pt.getProvisioningState(); ps != nil {
- pt.State = *ps
- } else {
- pt.State = operationInProgress
- }
- case http.StatusAccepted:
- pt.State = operationInProgress
- case http.StatusNoContent:
- pt.State = operationSucceeded
- default:
- pt.State = operationFailed
- pt.updateErrorFromResponse()
- return pt.pollingError()
- }
- return pt.initPollingMethod()
-}
-
-func (pt pollingTrackerBase) getProvisioningState() *string {
- if pt.rawBody != nil && pt.rawBody["properties"] != nil {
- p := pt.rawBody["properties"].(map[string]interface{})
- if ps := p["provisioningState"]; ps != nil {
- s := ps.(string)
- return &s
- }
- }
- return nil
-}
-
-func (pt *pollingTrackerBase) updateRawBody() error {
- pt.rawBody = map[string]interface{}{}
- if pt.resp.ContentLength != 0 {
- defer pt.resp.Body.Close()
- b, err := ioutil.ReadAll(pt.resp.Body)
- if err != nil {
- return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to read response body")
- }
- // put the body back so it's available to other callers
- pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b))
- // observed in 204 responses over HTTP/2.0; the content length is -1 but body is empty
- if len(b) == 0 {
- return nil
- }
- if err = json.Unmarshal(b, &pt.rawBody); err != nil {
- return autorest.NewErrorWithError(err, "pollingTrackerBase", "updateRawBody", nil, "failed to unmarshal response body")
- }
- }
- return nil
-}
-
-func (pt *pollingTrackerBase) pollForStatus(ctx context.Context, sender autorest.Sender) error {
- req, err := http.NewRequest(http.MethodGet, pt.URI, nil)
- if err != nil {
- return autorest.NewErrorWithError(err, "pollingTrackerBase", "pollForStatus", nil, "failed to create HTTP request")
- }
-
- req = req.WithContext(ctx)
- preparer := autorest.CreatePreparer(autorest.GetPrepareDecorators(ctx)...)
- req, err = preparer.Prepare(req)
- if err != nil {
- return autorest.NewErrorWithError(err, "pollingTrackerBase", "pollForStatus", nil, "failed preparing HTTP request")
- }
- pt.resp, err = sender.Do(req)
- if err != nil {
- return autorest.NewErrorWithError(err, "pollingTrackerBase", "pollForStatus", nil, "failed to send HTTP request")
- }
- if autorest.ResponseHasStatusCode(pt.resp, pollingCodes[:]...) {
- // reset the service error on success case
- pt.Err = nil
- err = pt.updateRawBody()
- } else {
- // check response body for error content
- pt.updateErrorFromResponse()
- err = pt.pollingError()
- }
- return err
-}
-
-// attempts to unmarshal a ServiceError type from the response body.
-// if that fails then make a best attempt at creating something meaningful.
-// NOTE: this assumes that the async operation has failed.
-func (pt *pollingTrackerBase) updateErrorFromResponse() {
- var err error
- if pt.resp.ContentLength != 0 {
- type respErr struct {
- ServiceError *ServiceError `json:"error"`
- }
- re := respErr{}
- defer pt.resp.Body.Close()
- var b []byte
- if b, err = ioutil.ReadAll(pt.resp.Body); err != nil {
- goto Default
- }
- // put the body back so it's available to other callers
- pt.resp.Body = ioutil.NopCloser(bytes.NewReader(b))
- if len(b) == 0 {
- goto Default
- }
- if err = json.Unmarshal(b, &re); err != nil {
- goto Default
- }
- // unmarshalling the error didn't yield anything, try unwrapped error
- if re.ServiceError == nil {
- err = json.Unmarshal(b, &re.ServiceError)
- if err != nil {
- goto Default
- }
- }
- // the unmarshaller will ensure re.ServiceError is non-nil
- // even if there was no content unmarshalled so check the code.
- if re.ServiceError.Code != "" {
- pt.Err = re.ServiceError
- return
- }
- }
-Default:
- se := &ServiceError{
- Code: pt.pollingStatus(),
- Message: "The async operation failed.",
- }
- if err != nil {
- se.InnerError = make(map[string]interface{})
- se.InnerError["unmarshalError"] = err.Error()
- }
- // stick the response body into the error object in hopes
- // it contains something useful to help diagnose the failure.
- if len(pt.rawBody) > 0 {
- se.AdditionalInfo = []map[string]interface{}{
- pt.rawBody,
- }
- }
- pt.Err = se
-}
-
-func (pt *pollingTrackerBase) updatePollingState(provStateApl bool) error {
- if pt.Pm == PollingAsyncOperation && pt.rawBody["status"] != nil {
- pt.State = pt.rawBody["status"].(string)
- } else {
- if pt.resp.StatusCode == http.StatusAccepted {
- pt.State = operationInProgress
- } else if provStateApl {
- if ps := pt.getProvisioningState(); ps != nil {
- pt.State = *ps
- } else {
- pt.State = operationSucceeded
- }
- } else {
- return autorest.NewError("pollingTrackerBase", "updatePollingState", "the response from the async operation has an invalid status code")
- }
- }
- // if the operation has failed update the error state
- if pt.hasFailed() {
- pt.updateErrorFromResponse()
- }
- return nil
-}
-
-func (pt pollingTrackerBase) pollingError() error {
- if pt.Err == nil {
- return nil
- }
- return pt.Err
-}
-
-func (pt pollingTrackerBase) pollingMethod() PollingMethodType {
- return pt.Pm
-}
-
-func (pt pollingTrackerBase) pollingStatus() string {
- return pt.State
-}
-
-func (pt pollingTrackerBase) pollingURL() string {
- return pt.URI
-}
-
-func (pt pollingTrackerBase) finalGetURL() string {
- return pt.FinalGetURI
-}
-
-func (pt pollingTrackerBase) hasTerminated() bool {
- return strings.EqualFold(pt.State, operationCanceled) || strings.EqualFold(pt.State, operationFailed) || strings.EqualFold(pt.State, operationSucceeded)
-}
-
-func (pt pollingTrackerBase) hasFailed() bool {
- return strings.EqualFold(pt.State, operationCanceled) || strings.EqualFold(pt.State, operationFailed)
-}
-
-func (pt pollingTrackerBase) hasSucceeded() bool {
- return strings.EqualFold(pt.State, operationSucceeded)
-}
-
-func (pt pollingTrackerBase) latestResponse() *http.Response {
- return pt.resp
-}
-
-// error checking common to all trackers
-func (pt pollingTrackerBase) baseCheckForErrors() error {
- // for Azure-AsyncOperations the response body cannot be nil or empty
- if pt.Pm == PollingAsyncOperation {
- if pt.resp.Body == nil || pt.resp.ContentLength == 0 {
- return autorest.NewError("pollingTrackerBase", "baseCheckForErrors", "for Azure-AsyncOperation response body cannot be nil")
- }
- if pt.rawBody["status"] == nil {
- return autorest.NewError("pollingTrackerBase", "baseCheckForErrors", "missing status property in Azure-AsyncOperation response body")
- }
- }
- return nil
-}
-
-// default initialization of polling URL/method. each verb tracker will update this as required.
-func (pt *pollingTrackerBase) initPollingMethod() error {
- if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- return nil
- }
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil {
- return err
- } else if lh != "" {
- pt.URI = lh
- pt.Pm = PollingLocation
- return nil
- }
- // it's ok if we didn't find a polling header, this will be handled elsewhere
- return nil
-}
-
-// DELETE
-
-type pollingTrackerDelete struct {
- pollingTrackerBase
-}
-
-func (pt *pollingTrackerDelete) updatePollingMethod() error {
- // for 201 the Location header is required
- if pt.resp.StatusCode == http.StatusCreated {
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil {
- return err
- } else if lh == "" {
- return autorest.NewError("pollingTrackerDelete", "updateHeaders", "missing Location header in 201 response")
- } else {
- pt.URI = lh
- }
- pt.Pm = PollingLocation
- pt.FinalGetURI = pt.URI
- }
- // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary
- if pt.resp.StatusCode == http.StatusAccepted {
- ao, err := getURLFromAsyncOpHeader(pt.resp)
- if err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- // if the Location header is invalid and we already have a polling URL
- // then we don't care if the Location header URL is malformed.
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" {
- return err
- } else if lh != "" {
- if ao == "" {
- pt.URI = lh
- pt.Pm = PollingLocation
- }
- // when both headers are returned we use the value in the Location header for the final GET
- pt.FinalGetURI = lh
- }
- // make sure a polling URL was found
- if pt.URI == "" {
- return autorest.NewError("pollingTrackerPost", "updateHeaders", "didn't get any suitable polling URLs in 202 response")
- }
- }
- return nil
-}
-
-func (pt pollingTrackerDelete) checkForErrors() error {
- return pt.baseCheckForErrors()
-}
-
-func (pt pollingTrackerDelete) provisioningStateApplicable() bool {
- return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusNoContent
-}
-
-// PATCH
-
-type pollingTrackerPatch struct {
- pollingTrackerBase
-}
-
-func (pt *pollingTrackerPatch) updatePollingMethod() error {
- // by default we can use the original URL for polling and final GET
- if pt.URI == "" {
- pt.URI = pt.resp.Request.URL.String()
- }
- if pt.FinalGetURI == "" {
- pt.FinalGetURI = pt.resp.Request.URL.String()
- }
- if pt.Pm == PollingUnknown {
- pt.Pm = PollingRequestURI
- }
- // for 201 it's permissible for no headers to be returned
- if pt.resp.StatusCode == http.StatusCreated {
- if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- }
- // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary
- // note the absence of the "final GET" mechanism for PATCH
- if pt.resp.StatusCode == http.StatusAccepted {
- ao, err := getURLFromAsyncOpHeader(pt.resp)
- if err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- if ao == "" {
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil {
- return err
- } else if lh == "" {
- return autorest.NewError("pollingTrackerPatch", "updateHeaders", "didn't get any suitable polling URLs in 202 response")
- } else {
- pt.URI = lh
- pt.Pm = PollingLocation
- }
- }
- }
- return nil
-}
-
-func (pt pollingTrackerPatch) checkForErrors() error {
- return pt.baseCheckForErrors()
-}
-
-func (pt pollingTrackerPatch) provisioningStateApplicable() bool {
- return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusCreated
-}
-
-// POST
-
-type pollingTrackerPost struct {
- pollingTrackerBase
-}
-
-func (pt *pollingTrackerPost) updatePollingMethod() error {
- // 201 requires Location header
- if pt.resp.StatusCode == http.StatusCreated {
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil {
- return err
- } else if lh == "" {
- return autorest.NewError("pollingTrackerPost", "updateHeaders", "missing Location header in 201 response")
- } else {
- pt.URI = lh
- pt.FinalGetURI = lh
- pt.Pm = PollingLocation
- }
- }
- // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary
- if pt.resp.StatusCode == http.StatusAccepted {
- ao, err := getURLFromAsyncOpHeader(pt.resp)
- if err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- // if the Location header is invalid and we already have a polling URL
- // then we don't care if the Location header URL is malformed.
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" {
- return err
- } else if lh != "" {
- if ao == "" {
- pt.URI = lh
- pt.Pm = PollingLocation
- }
- // when both headers are returned we use the value in the Location header for the final GET
- pt.FinalGetURI = lh
- }
- // make sure a polling URL was found
- if pt.URI == "" {
- return autorest.NewError("pollingTrackerPost", "updateHeaders", "didn't get any suitable polling URLs in 202 response")
- }
- }
- return nil
-}
-
-func (pt pollingTrackerPost) checkForErrors() error {
- return pt.baseCheckForErrors()
-}
-
-func (pt pollingTrackerPost) provisioningStateApplicable() bool {
- return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusNoContent
-}
-
-// PUT
-
-type pollingTrackerPut struct {
- pollingTrackerBase
-}
-
-func (pt *pollingTrackerPut) updatePollingMethod() error {
- // by default we can use the original URL for polling and final GET
- if pt.URI == "" {
- pt.URI = pt.resp.Request.URL.String()
- }
- if pt.FinalGetURI == "" {
- pt.FinalGetURI = pt.resp.Request.URL.String()
- }
- if pt.Pm == PollingUnknown {
- pt.Pm = PollingRequestURI
- }
- // for 201 it's permissible for no headers to be returned
- if pt.resp.StatusCode == http.StatusCreated {
- if ao, err := getURLFromAsyncOpHeader(pt.resp); err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- }
- // for 202 prefer the Azure-AsyncOperation header but fall back to Location if necessary
- if pt.resp.StatusCode == http.StatusAccepted {
- ao, err := getURLFromAsyncOpHeader(pt.resp)
- if err != nil {
- return err
- } else if ao != "" {
- pt.URI = ao
- pt.Pm = PollingAsyncOperation
- }
- // if the Location header is invalid and we already have a polling URL
- // then we don't care if the Location header URL is malformed.
- if lh, err := getURLFromLocationHeader(pt.resp); err != nil && pt.URI == "" {
- return err
- } else if lh != "" {
- if ao == "" {
- pt.URI = lh
- pt.Pm = PollingLocation
- }
- }
- // make sure a polling URL was found
- if pt.URI == "" {
- return autorest.NewError("pollingTrackerPut", "updateHeaders", "didn't get any suitable polling URLs in 202 response")
- }
- }
- return nil
-}
-
-func (pt pollingTrackerPut) checkForErrors() error {
- err := pt.baseCheckForErrors()
- if err != nil {
- return err
- }
- // if there are no LRO headers then the body cannot be empty
- ao, err := getURLFromAsyncOpHeader(pt.resp)
- if err != nil {
- return err
- }
- lh, err := getURLFromLocationHeader(pt.resp)
- if err != nil {
- return err
- }
- if ao == "" && lh == "" && len(pt.rawBody) == 0 {
- return autorest.NewError("pollingTrackerPut", "checkForErrors", "the response did not contain a body")
- }
- return nil
-}
-
-func (pt pollingTrackerPut) provisioningStateApplicable() bool {
- return pt.resp.StatusCode == http.StatusOK || pt.resp.StatusCode == http.StatusCreated
-}
-
-// creates a polling tracker based on the verb of the original request
-func createPollingTracker(resp *http.Response) (pollingTracker, error) {
- var pt pollingTracker
- switch strings.ToUpper(resp.Request.Method) {
- case http.MethodDelete:
- pt = &pollingTrackerDelete{pollingTrackerBase: pollingTrackerBase{resp: resp}}
- case http.MethodPatch:
- pt = &pollingTrackerPatch{pollingTrackerBase: pollingTrackerBase{resp: resp}}
- case http.MethodPost:
- pt = &pollingTrackerPost{pollingTrackerBase: pollingTrackerBase{resp: resp}}
- case http.MethodPut:
- pt = &pollingTrackerPut{pollingTrackerBase: pollingTrackerBase{resp: resp}}
- default:
- return nil, autorest.NewError("azure", "createPollingTracker", "unsupported HTTP method %s", resp.Request.Method)
- }
- if err := pt.initializeState(); err != nil {
- return pt, err
- }
- // this initializes the polling header values, we do this during creation in case the
- // initial response send us invalid values; this way the API call will return a non-nil
- // error (not doing this means the error shows up in Future.Done)
- return pt, pt.updatePollingMethod()
-}
-
-// gets the polling URL from the Azure-AsyncOperation header.
-// ensures the URL is well-formed and absolute.
-func getURLFromAsyncOpHeader(resp *http.Response) (string, error) {
- s := resp.Header.Get(http.CanonicalHeaderKey(headerAsyncOperation))
- if s == "" {
- return "", nil
- }
- if !isValidURL(s) {
- return "", autorest.NewError("azure", "getURLFromAsyncOpHeader", "invalid polling URL '%s'", s)
- }
- return s, nil
-}
-
-// gets the polling URL from the Location header.
-// ensures the URL is well-formed and absolute.
-func getURLFromLocationHeader(resp *http.Response) (string, error) {
- s := resp.Header.Get(http.CanonicalHeaderKey(autorest.HeaderLocation))
- if s == "" {
- return "", nil
- }
- if !isValidURL(s) {
- return "", autorest.NewError("azure", "getURLFromLocationHeader", "invalid polling URL '%s'", s)
- }
- return s, nil
-}
-
-// verify that the URL is valid and absolute
-func isValidURL(s string) bool {
- u, err := url.Parse(s)
- return err == nil && u.IsAbs()
-}
-
-// PollingMethodType defines a type used for enumerating polling mechanisms.
-type PollingMethodType string
-
-const (
- // PollingAsyncOperation indicates the polling method uses the Azure-AsyncOperation header.
- PollingAsyncOperation PollingMethodType = "AsyncOperation"
-
- // PollingLocation indicates the polling method uses the Location header.
- PollingLocation PollingMethodType = "Location"
-
- // PollingRequestURI indicates the polling method uses the original request URI.
- PollingRequestURI PollingMethodType = "RequestURI"
-
- // PollingUnknown indicates an unknown polling method and is the default value.
- PollingUnknown PollingMethodType = ""
-)
-
-// AsyncOpIncompleteError is the type that's returned from a future that has not completed.
-type AsyncOpIncompleteError struct {
- // FutureType is the name of the type composed of a azure.Future.
- FutureType string
-}
-
-// Error returns an error message including the originating type name of the error.
-func (e AsyncOpIncompleteError) Error() string {
- return fmt.Sprintf("%s: asynchronous operation has not completed", e.FutureType)
-}
-
-// NewAsyncOpIncompleteError creates a new AsyncOpIncompleteError with the specified parameters.
-func NewAsyncOpIncompleteError(futureType string) AsyncOpIncompleteError {
- return AsyncOpIncompleteError{
- FutureType: futureType,
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go b/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
deleted file mode 100644
index 1328f1764c..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/azure/azure.go
+++ /dev/null
@@ -1,388 +0,0 @@
-// Package azure provides Azure-specific implementations used with AutoRest.
-// See the included examples for more detail.
-package azure
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "regexp"
- "strconv"
- "strings"
-
- "github.com/Azure/go-autorest/autorest"
-)
-
-const (
- // HeaderClientID is the Azure extension header to set a user-specified request ID.
- HeaderClientID = "x-ms-client-request-id"
-
- // HeaderReturnClientID is the Azure extension header to set if the user-specified request ID
- // should be included in the response.
- HeaderReturnClientID = "x-ms-return-client-request-id"
-
- // HeaderContentType is the type of the content in the HTTP response.
- HeaderContentType = "Content-Type"
-
- // HeaderRequestID is the Azure extension header of the service generated request ID returned
- // in the response.
- HeaderRequestID = "x-ms-request-id"
-)
-
-// ServiceError encapsulates the error response from an Azure service.
-// It adhears to the OData v4 specification for error responses.
-type ServiceError struct {
- Code string `json:"code"`
- Message string `json:"message"`
- Target *string `json:"target"`
- Details []map[string]interface{} `json:"details"`
- InnerError map[string]interface{} `json:"innererror"`
- AdditionalInfo []map[string]interface{} `json:"additionalInfo"`
-}
-
-func (se ServiceError) Error() string {
- result := fmt.Sprintf("Code=%q Message=%q", se.Code, se.Message)
-
- if se.Target != nil {
- result += fmt.Sprintf(" Target=%q", *se.Target)
- }
-
- if se.Details != nil {
- d, err := json.Marshal(se.Details)
- if err != nil {
- result += fmt.Sprintf(" Details=%v", se.Details)
- }
- result += fmt.Sprintf(" Details=%s", d)
- }
-
- if se.InnerError != nil {
- d, err := json.Marshal(se.InnerError)
- if err != nil {
- result += fmt.Sprintf(" InnerError=%v", se.InnerError)
- }
- result += fmt.Sprintf(" InnerError=%s", d)
- }
-
- if se.AdditionalInfo != nil {
- d, err := json.Marshal(se.AdditionalInfo)
- if err != nil {
- result += fmt.Sprintf(" AdditionalInfo=%v", se.AdditionalInfo)
- }
- result += fmt.Sprintf(" AdditionalInfo=%s", d)
- }
-
- return result
-}
-
-// UnmarshalJSON implements the json.Unmarshaler interface for the ServiceError type.
-func (se *ServiceError) UnmarshalJSON(b []byte) error {
- // http://docs.oasis-open.org/odata/odata-json-format/v4.0/os/odata-json-format-v4.0-os.html#_Toc372793091
-
- type serviceErrorInternal struct {
- Code string `json:"code"`
- Message string `json:"message"`
- Target *string `json:"target,omitempty"`
- AdditionalInfo []map[string]interface{} `json:"additionalInfo,omitempty"`
- // not all services conform to the OData v4 spec.
- // the following fields are where we've seen discrepancies
-
- // spec calls for []map[string]interface{} but have seen map[string]interface{}
- Details interface{} `json:"details,omitempty"`
-
- // spec calls for map[string]interface{} but have seen []map[string]interface{} and string
- InnerError interface{} `json:"innererror,omitempty"`
- }
-
- sei := serviceErrorInternal{}
- if err := json.Unmarshal(b, &sei); err != nil {
- return err
- }
-
- // copy the fields we know to be correct
- se.AdditionalInfo = sei.AdditionalInfo
- se.Code = sei.Code
- se.Message = sei.Message
- se.Target = sei.Target
-
- // converts an []interface{} to []map[string]interface{}
- arrayOfObjs := func(v interface{}) ([]map[string]interface{}, bool) {
- arrayOf, ok := v.([]interface{})
- if !ok {
- return nil, false
- }
- final := []map[string]interface{}{}
- for _, item := range arrayOf {
- as, ok := item.(map[string]interface{})
- if !ok {
- return nil, false
- }
- final = append(final, as)
- }
- return final, true
- }
-
- // convert the remaining fields, falling back to raw JSON if necessary
-
- if c, ok := arrayOfObjs(sei.Details); ok {
- se.Details = c
- } else if c, ok := sei.Details.(map[string]interface{}); ok {
- se.Details = []map[string]interface{}{c}
- } else if sei.Details != nil {
- // stuff into Details
- se.Details = []map[string]interface{}{
- {"raw": sei.Details},
- }
- }
-
- if c, ok := sei.InnerError.(map[string]interface{}); ok {
- se.InnerError = c
- } else if c, ok := arrayOfObjs(sei.InnerError); ok {
- // if there's only one error extract it
- if len(c) == 1 {
- se.InnerError = c[0]
- } else {
- // multiple errors, stuff them into the value
- se.InnerError = map[string]interface{}{
- "multi": c,
- }
- }
- } else if c, ok := sei.InnerError.(string); ok {
- se.InnerError = map[string]interface{}{"error": c}
- } else if sei.InnerError != nil {
- // stuff into InnerError
- se.InnerError = map[string]interface{}{
- "raw": sei.InnerError,
- }
- }
- return nil
-}
-
-// RequestError describes an error response returned by Azure service.
-type RequestError struct {
- autorest.DetailedError
-
- // The error returned by the Azure service.
- ServiceError *ServiceError `json:"error" xml:"Error"`
-
- // The request id (from the x-ms-request-id-header) of the request.
- RequestID string
-}
-
-// Error returns a human-friendly error message from service error.
-func (e RequestError) Error() string {
- return fmt.Sprintf("autorest/azure: Service returned an error. Status=%v %v",
- e.StatusCode, e.ServiceError)
-}
-
-// IsAzureError returns true if the passed error is an Azure Service error; false otherwise.
-func IsAzureError(e error) bool {
- _, ok := e.(*RequestError)
- return ok
-}
-
-// Resource contains details about an Azure resource.
-type Resource struct {
- SubscriptionID string
- ResourceGroup string
- Provider string
- ResourceType string
- ResourceName string
-}
-
-// String function returns a string in form of azureResourceID
-func (r Resource) String() string {
- return fmt.Sprintf("/subscriptions/%s/resourceGroups/%s/providers/%s/%s/%s", r.SubscriptionID, r.ResourceGroup, r.Provider, r.ResourceType, r.ResourceName)
-}
-
-// ParseResourceID parses a resource ID into a ResourceDetails struct.
-// See https://docs.microsoft.com/en-us/azure/azure-resource-manager/templates/template-functions-resource?tabs=json#resourceid.
-func ParseResourceID(resourceID string) (Resource, error) {
-
- const resourceIDPatternText = `(?i)subscriptions/(.+)/resourceGroups/(.+)/providers/(.+?)/(.+?)/(.+)`
- resourceIDPattern := regexp.MustCompile(resourceIDPatternText)
- match := resourceIDPattern.FindStringSubmatch(resourceID)
-
- if len(match) == 0 {
- return Resource{}, fmt.Errorf("parsing failed for %s. Invalid resource Id format", resourceID)
- }
-
- v := strings.Split(match[5], "/")
- resourceName := v[len(v)-1]
-
- result := Resource{
- SubscriptionID: match[1],
- ResourceGroup: match[2],
- Provider: match[3],
- ResourceType: match[4],
- ResourceName: resourceName,
- }
-
- return result, nil
-}
-
-// NewErrorWithError creates a new Error conforming object from the
-// passed packageType, method, statusCode of the given resp (UndefinedStatusCode
-// if resp is nil), message, and original error. message is treated as a format
-// string to which the optional args apply.
-func NewErrorWithError(original error, packageType string, method string, resp *http.Response, message string, args ...interface{}) RequestError {
- if v, ok := original.(*RequestError); ok {
- return *v
- }
-
- statusCode := autorest.UndefinedStatusCode
- if resp != nil {
- statusCode = resp.StatusCode
- }
- return RequestError{
- DetailedError: autorest.DetailedError{
- Original: original,
- PackageType: packageType,
- Method: method,
- StatusCode: statusCode,
- Message: fmt.Sprintf(message, args...),
- },
- }
-}
-
-// WithReturningClientID returns a PrepareDecorator that adds an HTTP extension header of
-// x-ms-client-request-id whose value is the passed, undecorated UUID (e.g.,
-// "0F39878C-5F76-4DB8-A25D-61D2C193C3CA"). It also sets the x-ms-return-client-request-id
-// header to true such that UUID accompanies the http.Response.
-func WithReturningClientID(uuid string) autorest.PrepareDecorator {
- preparer := autorest.CreatePreparer(
- WithClientID(uuid),
- WithReturnClientID(true))
-
- return func(p autorest.Preparer) autorest.Preparer {
- return autorest.PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err != nil {
- return r, err
- }
- return preparer.Prepare(r)
- })
- }
-}
-
-// WithClientID returns a PrepareDecorator that adds an HTTP extension header of
-// x-ms-client-request-id whose value is passed, undecorated UUID (e.g.,
-// "0F39878C-5F76-4DB8-A25D-61D2C193C3CA").
-func WithClientID(uuid string) autorest.PrepareDecorator {
- return autorest.WithHeader(HeaderClientID, uuid)
-}
-
-// WithReturnClientID returns a PrepareDecorator that adds an HTTP extension header of
-// x-ms-return-client-request-id whose boolean value indicates if the value of the
-// x-ms-client-request-id header should be included in the http.Response.
-func WithReturnClientID(b bool) autorest.PrepareDecorator {
- return autorest.WithHeader(HeaderReturnClientID, strconv.FormatBool(b))
-}
-
-// ExtractClientID extracts the client identifier from the x-ms-client-request-id header set on the
-// http.Request sent to the service (and returned in the http.Response)
-func ExtractClientID(resp *http.Response) string {
- return autorest.ExtractHeaderValue(HeaderClientID, resp)
-}
-
-// ExtractRequestID extracts the Azure server generated request identifier from the
-// x-ms-request-id header.
-func ExtractRequestID(resp *http.Response) string {
- return autorest.ExtractHeaderValue(HeaderRequestID, resp)
-}
-
-// WithErrorUnlessStatusCode returns a RespondDecorator that emits an
-// azure.RequestError by reading the response body unless the response HTTP status code
-// is among the set passed.
-//
-// If there is a chance service may return responses other than the Azure error
-// format and the response cannot be parsed into an error, a decoding error will
-// be returned containing the response body. In any case, the Responder will
-// return an error if the status code is not satisfied.
-//
-// If this Responder returns an error, the response body will be replaced with
-// an in-memory reader, which needs no further closing.
-func WithErrorUnlessStatusCode(codes ...int) autorest.RespondDecorator {
- return func(r autorest.Responder) autorest.Responder {
- return autorest.ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil && !autorest.ResponseHasStatusCode(resp, codes...) {
- var e RequestError
- defer resp.Body.Close()
-
- encodedAs := autorest.EncodedAsJSON
- if strings.Contains(resp.Header.Get("Content-Type"), "xml") {
- encodedAs = autorest.EncodedAsXML
- }
-
- // Copy and replace the Body in case it does not contain an error object.
- // This will leave the Body available to the caller.
- b, decodeErr := autorest.CopyAndDecode(encodedAs, resp.Body, &e)
- resp.Body = ioutil.NopCloser(&b)
- if decodeErr != nil {
- return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, decodeErr)
- }
- if e.ServiceError == nil {
- // Check if error is unwrapped ServiceError
- decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes()))
- if err := decoder.Decode(&e.ServiceError); err != nil {
- return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, err)
- }
-
- // for example, should the API return the literal value `null` as the response
- if e.ServiceError == nil {
- e.ServiceError = &ServiceError{
- Code: "Unknown",
- Message: "Unknown service error",
- Details: []map[string]interface{}{
- {
- "HttpResponse.Body": b.String(),
- },
- },
- }
- }
- }
-
- if e.ServiceError != nil && e.ServiceError.Message == "" {
- // if we're here it means the returned error wasn't OData v4 compliant.
- // try to unmarshal the body in hopes of getting something.
- rawBody := map[string]interface{}{}
- decoder := autorest.NewDecoder(encodedAs, bytes.NewReader(b.Bytes()))
- if err := decoder.Decode(&rawBody); err != nil {
- return fmt.Errorf("autorest/azure: error response cannot be parsed: %q error: %v", b, err)
- }
-
- e.ServiceError = &ServiceError{
- Code: "Unknown",
- Message: "Unknown service error",
- }
- if len(rawBody) > 0 {
- e.ServiceError.Details = []map[string]interface{}{rawBody}
- }
- }
- e.Response = resp
- e.RequestID = ExtractRequestID(resp)
- if e.StatusCode == nil {
- e.StatusCode = resp.StatusCode
- }
- err = &e
- }
- return err
- })
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go b/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
deleted file mode 100644
index b0a53769f2..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/azure/environments.go
+++ /dev/null
@@ -1,331 +0,0 @@
-package azure
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "os"
- "strings"
-)
-
-const (
- // EnvironmentFilepathName captures the name of the environment variable containing the path to the file
- // to be used while populating the Azure Environment.
- EnvironmentFilepathName = "AZURE_ENVIRONMENT_FILEPATH"
-
- // NotAvailable is used for endpoints and resource IDs that are not available for a given cloud.
- NotAvailable = "N/A"
-)
-
-var environments = map[string]Environment{
- "AZURECHINACLOUD": ChinaCloud,
- "AZUREGERMANCLOUD": GermanCloud,
- "AZURECLOUD": PublicCloud,
- "AZUREPUBLICCLOUD": PublicCloud,
- "AZUREUSGOVERNMENT": USGovernmentCloud,
- "AZUREUSGOVERNMENTCLOUD": USGovernmentCloud, //TODO: deprecate
-}
-
-// ResourceIdentifier contains a set of Azure resource IDs.
-type ResourceIdentifier struct {
- Graph string `json:"graph"`
- KeyVault string `json:"keyVault"`
- Datalake string `json:"datalake"`
- Batch string `json:"batch"`
- OperationalInsights string `json:"operationalInsights"`
- OSSRDBMS string `json:"ossRDBMS"`
- Storage string `json:"storage"`
- Synapse string `json:"synapse"`
- ServiceBus string `json:"serviceBus"`
- SQLDatabase string `json:"sqlDatabase"`
- CosmosDB string `json:"cosmosDB"`
- ManagedHSM string `json:"managedHSM"`
- MicrosoftGraph string `json:"microsoftGraph"`
-}
-
-// Environment represents a set of endpoints for each of Azure's Clouds.
-type Environment struct {
- Name string `json:"name"`
- ManagementPortalURL string `json:"managementPortalURL"`
- PublishSettingsURL string `json:"publishSettingsURL"`
- ServiceManagementEndpoint string `json:"serviceManagementEndpoint"`
- ResourceManagerEndpoint string `json:"resourceManagerEndpoint"`
- ActiveDirectoryEndpoint string `json:"activeDirectoryEndpoint"`
- GalleryEndpoint string `json:"galleryEndpoint"`
- KeyVaultEndpoint string `json:"keyVaultEndpoint"`
- ManagedHSMEndpoint string `json:"managedHSMEndpoint"`
- GraphEndpoint string `json:"graphEndpoint"`
- ServiceBusEndpoint string `json:"serviceBusEndpoint"`
- BatchManagementEndpoint string `json:"batchManagementEndpoint"`
- MicrosoftGraphEndpoint string `json:"microsoftGraphEndpoint"`
- StorageEndpointSuffix string `json:"storageEndpointSuffix"`
- CosmosDBDNSSuffix string `json:"cosmosDBDNSSuffix"`
- MariaDBDNSSuffix string `json:"mariaDBDNSSuffix"`
- MySQLDatabaseDNSSuffix string `json:"mySqlDatabaseDNSSuffix"`
- PostgresqlDatabaseDNSSuffix string `json:"postgresqlDatabaseDNSSuffix"`
- SQLDatabaseDNSSuffix string `json:"sqlDatabaseDNSSuffix"`
- TrafficManagerDNSSuffix string `json:"trafficManagerDNSSuffix"`
- KeyVaultDNSSuffix string `json:"keyVaultDNSSuffix"`
- ManagedHSMDNSSuffix string `json:"managedHSMDNSSuffix"`
- ServiceBusEndpointSuffix string `json:"serviceBusEndpointSuffix"`
- ServiceManagementVMDNSSuffix string `json:"serviceManagementVMDNSSuffix"`
- ResourceManagerVMDNSSuffix string `json:"resourceManagerVMDNSSuffix"`
- ContainerRegistryDNSSuffix string `json:"containerRegistryDNSSuffix"`
- TokenAudience string `json:"tokenAudience"`
- APIManagementHostNameSuffix string `json:"apiManagementHostNameSuffix"`
- SynapseEndpointSuffix string `json:"synapseEndpointSuffix"`
- DatalakeSuffix string `json:"datalakeSuffix"`
- ResourceIdentifiers ResourceIdentifier `json:"resourceIdentifiers"`
-}
-
-var (
- // PublicCloud is the default public Azure cloud environment
- PublicCloud = Environment{
- Name: "AzurePublicCloud",
- ManagementPortalURL: "https://manage.windowsazure.com/",
- PublishSettingsURL: "https://manage.windowsazure.com/publishsettings/index",
- ServiceManagementEndpoint: "https://management.core.windows.net/",
- ResourceManagerEndpoint: "https://management.azure.com/",
- ActiveDirectoryEndpoint: "https://login.microsoftonline.com/",
- GalleryEndpoint: "https://gallery.azure.com/",
- KeyVaultEndpoint: "https://vault.azure.net/",
- ManagedHSMEndpoint: "https://managedhsm.azure.net/",
- GraphEndpoint: "https://graph.windows.net/",
- ServiceBusEndpoint: "https://servicebus.windows.net/",
- BatchManagementEndpoint: "https://batch.core.windows.net/",
- MicrosoftGraphEndpoint: "https://graph.microsoft.com/",
- StorageEndpointSuffix: "core.windows.net",
- CosmosDBDNSSuffix: "documents.azure.com",
- MariaDBDNSSuffix: "mariadb.database.azure.com",
- MySQLDatabaseDNSSuffix: "mysql.database.azure.com",
- PostgresqlDatabaseDNSSuffix: "postgres.database.azure.com",
- SQLDatabaseDNSSuffix: "database.windows.net",
- TrafficManagerDNSSuffix: "trafficmanager.net",
- KeyVaultDNSSuffix: "vault.azure.net",
- ManagedHSMDNSSuffix: "managedhsm.azure.net",
- ServiceBusEndpointSuffix: "servicebus.windows.net",
- ServiceManagementVMDNSSuffix: "cloudapp.net",
- ResourceManagerVMDNSSuffix: "cloudapp.azure.com",
- ContainerRegistryDNSSuffix: "azurecr.io",
- TokenAudience: "https://management.azure.com/",
- APIManagementHostNameSuffix: "azure-api.net",
- SynapseEndpointSuffix: "dev.azuresynapse.net",
- DatalakeSuffix: "azuredatalakestore.net",
- ResourceIdentifiers: ResourceIdentifier{
- Graph: "https://graph.windows.net/",
- KeyVault: "https://vault.azure.net",
- Datalake: "https://datalake.azure.net/",
- Batch: "https://batch.core.windows.net/",
- OperationalInsights: "https://api.loganalytics.io",
- OSSRDBMS: "https://ossrdbms-aad.database.windows.net",
- Storage: "https://storage.azure.com/",
- Synapse: "https://dev.azuresynapse.net",
- ServiceBus: "https://servicebus.azure.net/",
- SQLDatabase: "https://database.windows.net/",
- CosmosDB: "https://cosmos.azure.com",
- ManagedHSM: "https://managedhsm.azure.net",
- MicrosoftGraph: "https://graph.microsoft.com/",
- },
- }
-
- // USGovernmentCloud is the cloud environment for the US Government
- USGovernmentCloud = Environment{
- Name: "AzureUSGovernmentCloud",
- ManagementPortalURL: "https://manage.windowsazure.us/",
- PublishSettingsURL: "https://manage.windowsazure.us/publishsettings/index",
- ServiceManagementEndpoint: "https://management.core.usgovcloudapi.net/",
- ResourceManagerEndpoint: "https://management.usgovcloudapi.net/",
- ActiveDirectoryEndpoint: "https://login.microsoftonline.us/",
- GalleryEndpoint: "https://gallery.usgovcloudapi.net/",
- KeyVaultEndpoint: "https://vault.usgovcloudapi.net/",
- ManagedHSMEndpoint: NotAvailable,
- GraphEndpoint: "https://graph.windows.net/",
- ServiceBusEndpoint: "https://servicebus.usgovcloudapi.net/",
- BatchManagementEndpoint: "https://batch.core.usgovcloudapi.net/",
- MicrosoftGraphEndpoint: "https://graph.microsoft.us/",
- StorageEndpointSuffix: "core.usgovcloudapi.net",
- CosmosDBDNSSuffix: "documents.azure.us",
- MariaDBDNSSuffix: "mariadb.database.usgovcloudapi.net",
- MySQLDatabaseDNSSuffix: "mysql.database.usgovcloudapi.net",
- PostgresqlDatabaseDNSSuffix: "postgres.database.usgovcloudapi.net",
- SQLDatabaseDNSSuffix: "database.usgovcloudapi.net",
- TrafficManagerDNSSuffix: "usgovtrafficmanager.net",
- KeyVaultDNSSuffix: "vault.usgovcloudapi.net",
- ManagedHSMDNSSuffix: NotAvailable,
- ServiceBusEndpointSuffix: "servicebus.usgovcloudapi.net",
- ServiceManagementVMDNSSuffix: "usgovcloudapp.net",
- ResourceManagerVMDNSSuffix: "cloudapp.usgovcloudapi.net",
- ContainerRegistryDNSSuffix: "azurecr.us",
- TokenAudience: "https://management.usgovcloudapi.net/",
- APIManagementHostNameSuffix: "azure-api.us",
- SynapseEndpointSuffix: "dev.azuresynapse.usgovcloudapi.net",
- DatalakeSuffix: NotAvailable,
- ResourceIdentifiers: ResourceIdentifier{
- Graph: "https://graph.windows.net/",
- KeyVault: "https://vault.usgovcloudapi.net",
- Datalake: NotAvailable,
- Batch: "https://batch.core.usgovcloudapi.net/",
- OperationalInsights: "https://api.loganalytics.us",
- OSSRDBMS: "https://ossrdbms-aad.database.usgovcloudapi.net",
- Storage: "https://storage.azure.com/",
- Synapse: "https://dev.azuresynapse.usgovcloudapi.net",
- ServiceBus: "https://servicebus.azure.net/",
- SQLDatabase: "https://database.usgovcloudapi.net/",
- CosmosDB: "https://cosmos.azure.com",
- ManagedHSM: NotAvailable,
- MicrosoftGraph: "https://graph.microsoft.us/",
- },
- }
-
- // ChinaCloud is the cloud environment operated in China
- ChinaCloud = Environment{
- Name: "AzureChinaCloud",
- ManagementPortalURL: "https://manage.chinacloudapi.com/",
- PublishSettingsURL: "https://manage.chinacloudapi.com/publishsettings/index",
- ServiceManagementEndpoint: "https://management.core.chinacloudapi.cn/",
- ResourceManagerEndpoint: "https://management.chinacloudapi.cn/",
- ActiveDirectoryEndpoint: "https://login.chinacloudapi.cn/",
- GalleryEndpoint: "https://gallery.chinacloudapi.cn/",
- KeyVaultEndpoint: "https://vault.azure.cn/",
- ManagedHSMEndpoint: NotAvailable,
- GraphEndpoint: "https://graph.chinacloudapi.cn/",
- ServiceBusEndpoint: "https://servicebus.chinacloudapi.cn/",
- BatchManagementEndpoint: "https://batch.chinacloudapi.cn/",
- MicrosoftGraphEndpoint: "https://microsoftgraph.chinacloudapi.cn/",
- StorageEndpointSuffix: "core.chinacloudapi.cn",
- CosmosDBDNSSuffix: "documents.azure.cn",
- MariaDBDNSSuffix: "mariadb.database.chinacloudapi.cn",
- MySQLDatabaseDNSSuffix: "mysql.database.chinacloudapi.cn",
- PostgresqlDatabaseDNSSuffix: "postgres.database.chinacloudapi.cn",
- SQLDatabaseDNSSuffix: "database.chinacloudapi.cn",
- TrafficManagerDNSSuffix: "trafficmanager.cn",
- KeyVaultDNSSuffix: "vault.azure.cn",
- ManagedHSMDNSSuffix: NotAvailable,
- ServiceBusEndpointSuffix: "servicebus.chinacloudapi.cn",
- ServiceManagementVMDNSSuffix: "chinacloudapp.cn",
- ResourceManagerVMDNSSuffix: "cloudapp.chinacloudapi.cn",
- ContainerRegistryDNSSuffix: "azurecr.cn",
- TokenAudience: "https://management.chinacloudapi.cn/",
- APIManagementHostNameSuffix: "azure-api.cn",
- SynapseEndpointSuffix: "dev.azuresynapse.azure.cn",
- DatalakeSuffix: NotAvailable,
- ResourceIdentifiers: ResourceIdentifier{
- Graph: "https://graph.chinacloudapi.cn/",
- KeyVault: "https://vault.azure.cn",
- Datalake: NotAvailable,
- Batch: "https://batch.chinacloudapi.cn/",
- OperationalInsights: NotAvailable,
- OSSRDBMS: "https://ossrdbms-aad.database.chinacloudapi.cn",
- Storage: "https://storage.azure.com/",
- Synapse: "https://dev.azuresynapse.net",
- ServiceBus: "https://servicebus.azure.net/",
- SQLDatabase: "https://database.chinacloudapi.cn/",
- CosmosDB: "https://cosmos.azure.com",
- ManagedHSM: NotAvailable,
- MicrosoftGraph: "https://microsoftgraph.chinacloudapi.cn",
- },
- }
-
- // GermanCloud is the cloud environment operated in Germany
- GermanCloud = Environment{
- Name: "AzureGermanCloud",
- ManagementPortalURL: "http://portal.microsoftazure.de/",
- PublishSettingsURL: "https://manage.microsoftazure.de/publishsettings/index",
- ServiceManagementEndpoint: "https://management.core.cloudapi.de/",
- ResourceManagerEndpoint: "https://management.microsoftazure.de/",
- ActiveDirectoryEndpoint: "https://login.microsoftonline.de/",
- GalleryEndpoint: "https://gallery.cloudapi.de/",
- KeyVaultEndpoint: "https://vault.microsoftazure.de/",
- ManagedHSMEndpoint: NotAvailable,
- GraphEndpoint: "https://graph.cloudapi.de/",
- ServiceBusEndpoint: "https://servicebus.cloudapi.de/",
- BatchManagementEndpoint: "https://batch.cloudapi.de/",
- MicrosoftGraphEndpoint: NotAvailable,
- StorageEndpointSuffix: "core.cloudapi.de",
- CosmosDBDNSSuffix: "documents.microsoftazure.de",
- MariaDBDNSSuffix: "mariadb.database.cloudapi.de",
- MySQLDatabaseDNSSuffix: "mysql.database.cloudapi.de",
- PostgresqlDatabaseDNSSuffix: "postgres.database.cloudapi.de",
- SQLDatabaseDNSSuffix: "database.cloudapi.de",
- TrafficManagerDNSSuffix: "azuretrafficmanager.de",
- KeyVaultDNSSuffix: "vault.microsoftazure.de",
- ManagedHSMDNSSuffix: NotAvailable,
- ServiceBusEndpointSuffix: "servicebus.cloudapi.de",
- ServiceManagementVMDNSSuffix: "azurecloudapp.de",
- ResourceManagerVMDNSSuffix: "cloudapp.microsoftazure.de",
- ContainerRegistryDNSSuffix: NotAvailable,
- TokenAudience: "https://management.microsoftazure.de/",
- APIManagementHostNameSuffix: NotAvailable,
- SynapseEndpointSuffix: NotAvailable,
- DatalakeSuffix: NotAvailable,
- ResourceIdentifiers: ResourceIdentifier{
- Graph: "https://graph.cloudapi.de/",
- KeyVault: "https://vault.microsoftazure.de",
- Datalake: NotAvailable,
- Batch: "https://batch.cloudapi.de/",
- OperationalInsights: NotAvailable,
- OSSRDBMS: "https://ossrdbms-aad.database.cloudapi.de",
- Storage: "https://storage.azure.com/",
- Synapse: NotAvailable,
- ServiceBus: "https://servicebus.azure.net/",
- SQLDatabase: "https://database.cloudapi.de/",
- CosmosDB: "https://cosmos.azure.com",
- ManagedHSM: NotAvailable,
- MicrosoftGraph: NotAvailable,
- },
- }
-)
-
-// EnvironmentFromName returns an Environment based on the common name specified.
-func EnvironmentFromName(name string) (Environment, error) {
- // IMPORTANT
- // As per @radhikagupta5:
- // This is technical debt, fundamentally here because Kubernetes is not currently accepting
- // contributions to the providers. Once that is an option, the provider should be updated to
- // directly call `EnvironmentFromFile`. Until then, we rely on dispatching Azure Stack environment creation
- // from this method based on the name that is provided to us.
- if strings.EqualFold(name, "AZURESTACKCLOUD") {
- return EnvironmentFromFile(os.Getenv(EnvironmentFilepathName))
- }
-
- name = strings.ToUpper(name)
- env, ok := environments[name]
- if !ok {
- return env, fmt.Errorf("autorest/azure: There is no cloud environment matching the name %q", name)
- }
-
- return env, nil
-}
-
-// EnvironmentFromFile loads an Environment from a configuration file available on disk.
-// This function is particularly useful in the Hybrid Cloud model, where one must define their own
-// endpoints.
-func EnvironmentFromFile(location string) (unmarshaled Environment, err error) {
- fileContents, err := ioutil.ReadFile(location)
- if err != nil {
- return
- }
-
- err = json.Unmarshal(fileContents, &unmarshaled)
-
- return
-}
-
-// SetEnvironment updates the environment map with the specified values.
-func SetEnvironment(name string, env Environment) {
- environments[strings.ToUpper(name)] = env
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go b/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go
deleted file mode 100644
index 507f9e95cf..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/azure/metadata_environment.go
+++ /dev/null
@@ -1,245 +0,0 @@
-package azure
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "net/http"
- "strings"
-
- "github.com/Azure/go-autorest/autorest"
-)
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-type audience []string
-
-type authentication struct {
- LoginEndpoint string `json:"loginEndpoint"`
- Audiences audience `json:"audiences"`
-}
-
-type environmentMetadataInfo struct {
- GalleryEndpoint string `json:"galleryEndpoint"`
- GraphEndpoint string `json:"graphEndpoint"`
- PortalEndpoint string `json:"portalEndpoint"`
- Authentication authentication `json:"authentication"`
-}
-
-// EnvironmentProperty represent property names that clients can override
-type EnvironmentProperty string
-
-const (
- // EnvironmentName ...
- EnvironmentName EnvironmentProperty = "name"
- // EnvironmentManagementPortalURL ..
- EnvironmentManagementPortalURL EnvironmentProperty = "managementPortalURL"
- // EnvironmentPublishSettingsURL ...
- EnvironmentPublishSettingsURL EnvironmentProperty = "publishSettingsURL"
- // EnvironmentServiceManagementEndpoint ...
- EnvironmentServiceManagementEndpoint EnvironmentProperty = "serviceManagementEndpoint"
- // EnvironmentResourceManagerEndpoint ...
- EnvironmentResourceManagerEndpoint EnvironmentProperty = "resourceManagerEndpoint"
- // EnvironmentActiveDirectoryEndpoint ...
- EnvironmentActiveDirectoryEndpoint EnvironmentProperty = "activeDirectoryEndpoint"
- // EnvironmentGalleryEndpoint ...
- EnvironmentGalleryEndpoint EnvironmentProperty = "galleryEndpoint"
- // EnvironmentKeyVaultEndpoint ...
- EnvironmentKeyVaultEndpoint EnvironmentProperty = "keyVaultEndpoint"
- // EnvironmentGraphEndpoint ...
- EnvironmentGraphEndpoint EnvironmentProperty = "graphEndpoint"
- // EnvironmentServiceBusEndpoint ...
- EnvironmentServiceBusEndpoint EnvironmentProperty = "serviceBusEndpoint"
- // EnvironmentBatchManagementEndpoint ...
- EnvironmentBatchManagementEndpoint EnvironmentProperty = "batchManagementEndpoint"
- // EnvironmentStorageEndpointSuffix ...
- EnvironmentStorageEndpointSuffix EnvironmentProperty = "storageEndpointSuffix"
- // EnvironmentSQLDatabaseDNSSuffix ...
- EnvironmentSQLDatabaseDNSSuffix EnvironmentProperty = "sqlDatabaseDNSSuffix"
- // EnvironmentTrafficManagerDNSSuffix ...
- EnvironmentTrafficManagerDNSSuffix EnvironmentProperty = "trafficManagerDNSSuffix"
- // EnvironmentKeyVaultDNSSuffix ...
- EnvironmentKeyVaultDNSSuffix EnvironmentProperty = "keyVaultDNSSuffix"
- // EnvironmentServiceBusEndpointSuffix ...
- EnvironmentServiceBusEndpointSuffix EnvironmentProperty = "serviceBusEndpointSuffix"
- // EnvironmentServiceManagementVMDNSSuffix ...
- EnvironmentServiceManagementVMDNSSuffix EnvironmentProperty = "serviceManagementVMDNSSuffix"
- // EnvironmentResourceManagerVMDNSSuffix ...
- EnvironmentResourceManagerVMDNSSuffix EnvironmentProperty = "resourceManagerVMDNSSuffix"
- // EnvironmentContainerRegistryDNSSuffix ...
- EnvironmentContainerRegistryDNSSuffix EnvironmentProperty = "containerRegistryDNSSuffix"
- // EnvironmentTokenAudience ...
- EnvironmentTokenAudience EnvironmentProperty = "tokenAudience"
-)
-
-// OverrideProperty represents property name and value that clients can override
-type OverrideProperty struct {
- Key EnvironmentProperty
- Value string
-}
-
-// EnvironmentFromURL loads an Environment from a URL
-// This function is particularly useful in the Hybrid Cloud model, where one may define their own
-// endpoints.
-func EnvironmentFromURL(resourceManagerEndpoint string, properties ...OverrideProperty) (environment Environment, err error) {
- var metadataEnvProperties environmentMetadataInfo
-
- if resourceManagerEndpoint == "" {
- return environment, fmt.Errorf("Metadata resource manager endpoint is empty")
- }
-
- if metadataEnvProperties, err = retrieveMetadataEnvironment(resourceManagerEndpoint); err != nil {
- return environment, err
- }
-
- // Give priority to user's override values
- overrideProperties(&environment, properties)
-
- if environment.Name == "" {
- environment.Name = "HybridEnvironment"
- }
- stampDNSSuffix := environment.StorageEndpointSuffix
- if stampDNSSuffix == "" {
- stampDNSSuffix = strings.TrimSuffix(strings.TrimPrefix(strings.Replace(resourceManagerEndpoint, strings.Split(resourceManagerEndpoint, ".")[0], "", 1), "."), "/")
- environment.StorageEndpointSuffix = stampDNSSuffix
- }
- if environment.KeyVaultDNSSuffix == "" {
- environment.KeyVaultDNSSuffix = fmt.Sprintf("%s.%s", "vault", stampDNSSuffix)
- }
- if environment.KeyVaultEndpoint == "" {
- environment.KeyVaultEndpoint = fmt.Sprintf("%s%s", "https://", environment.KeyVaultDNSSuffix)
- }
- if environment.TokenAudience == "" {
- environment.TokenAudience = metadataEnvProperties.Authentication.Audiences[0]
- }
- if environment.ActiveDirectoryEndpoint == "" {
- environment.ActiveDirectoryEndpoint = metadataEnvProperties.Authentication.LoginEndpoint
- }
- if environment.ResourceManagerEndpoint == "" {
- environment.ResourceManagerEndpoint = resourceManagerEndpoint
- }
- if environment.GalleryEndpoint == "" {
- environment.GalleryEndpoint = metadataEnvProperties.GalleryEndpoint
- }
- if environment.GraphEndpoint == "" {
- environment.GraphEndpoint = metadataEnvProperties.GraphEndpoint
- }
-
- return environment, nil
-}
-
-func overrideProperties(environment *Environment, properties []OverrideProperty) {
- for _, property := range properties {
- switch property.Key {
- case EnvironmentName:
- {
- environment.Name = property.Value
- }
- case EnvironmentManagementPortalURL:
- {
- environment.ManagementPortalURL = property.Value
- }
- case EnvironmentPublishSettingsURL:
- {
- environment.PublishSettingsURL = property.Value
- }
- case EnvironmentServiceManagementEndpoint:
- {
- environment.ServiceManagementEndpoint = property.Value
- }
- case EnvironmentResourceManagerEndpoint:
- {
- environment.ResourceManagerEndpoint = property.Value
- }
- case EnvironmentActiveDirectoryEndpoint:
- {
- environment.ActiveDirectoryEndpoint = property.Value
- }
- case EnvironmentGalleryEndpoint:
- {
- environment.GalleryEndpoint = property.Value
- }
- case EnvironmentKeyVaultEndpoint:
- {
- environment.KeyVaultEndpoint = property.Value
- }
- case EnvironmentGraphEndpoint:
- {
- environment.GraphEndpoint = property.Value
- }
- case EnvironmentServiceBusEndpoint:
- {
- environment.ServiceBusEndpoint = property.Value
- }
- case EnvironmentBatchManagementEndpoint:
- {
- environment.BatchManagementEndpoint = property.Value
- }
- case EnvironmentStorageEndpointSuffix:
- {
- environment.StorageEndpointSuffix = property.Value
- }
- case EnvironmentSQLDatabaseDNSSuffix:
- {
- environment.SQLDatabaseDNSSuffix = property.Value
- }
- case EnvironmentTrafficManagerDNSSuffix:
- {
- environment.TrafficManagerDNSSuffix = property.Value
- }
- case EnvironmentKeyVaultDNSSuffix:
- {
- environment.KeyVaultDNSSuffix = property.Value
- }
- case EnvironmentServiceBusEndpointSuffix:
- {
- environment.ServiceBusEndpointSuffix = property.Value
- }
- case EnvironmentServiceManagementVMDNSSuffix:
- {
- environment.ServiceManagementVMDNSSuffix = property.Value
- }
- case EnvironmentResourceManagerVMDNSSuffix:
- {
- environment.ResourceManagerVMDNSSuffix = property.Value
- }
- case EnvironmentContainerRegistryDNSSuffix:
- {
- environment.ContainerRegistryDNSSuffix = property.Value
- }
- case EnvironmentTokenAudience:
- {
- environment.TokenAudience = property.Value
- }
- }
- }
-}
-
-func retrieveMetadataEnvironment(endpoint string) (environment environmentMetadataInfo, err error) {
- client := autorest.NewClientWithUserAgent("")
- managementEndpoint := fmt.Sprintf("%s%s", strings.TrimSuffix(endpoint, "/"), "/metadata/endpoints?api-version=1.0")
- req, _ := http.NewRequest("GET", managementEndpoint, nil)
- response, err := client.Do(req)
- if err != nil {
- return environment, err
- }
- defer response.Body.Close()
- jsonResponse, err := ioutil.ReadAll(response.Body)
- if err != nil {
- return environment, err
- }
- err = json.Unmarshal(jsonResponse, &environment)
- return environment, err
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go b/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
deleted file mode 100644
index 5b52357f95..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/azure/rp.go
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package azure
-
-import (
- "errors"
- "fmt"
- "net/http"
- "net/url"
- "strings"
- "time"
-
- "github.com/Azure/go-autorest/autorest"
-)
-
-// DoRetryWithRegistration tries to register the resource provider in case it is unregistered.
-// It also handles request retries
-func DoRetryWithRegistration(client autorest.Client) autorest.SendDecorator {
- return func(s autorest.Sender) autorest.Sender {
- return autorest.SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
- rr := autorest.NewRetriableRequest(r)
- for currentAttempt := 0; currentAttempt < client.RetryAttempts; currentAttempt++ {
- err = rr.Prepare()
- if err != nil {
- return resp, err
- }
-
- resp, err = autorest.SendWithSender(s, rr.Request(),
- autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
- )
- if err != nil {
- return resp, err
- }
-
- if resp.StatusCode != http.StatusConflict || client.SkipResourceProviderRegistration {
- return resp, err
- }
-
- var re RequestError
- if strings.Contains(r.Header.Get("Content-Type"), "xml") {
- // XML errors (e.g. Storage Data Plane) only return the inner object
- err = autorest.Respond(resp, autorest.ByUnmarshallingXML(&re.ServiceError))
- } else {
- err = autorest.Respond(resp, autorest.ByUnmarshallingJSON(&re))
- }
-
- if err != nil {
- return resp, err
- }
- err = re
-
- if re.ServiceError != nil && re.ServiceError.Code == "MissingSubscriptionRegistration" {
- regErr := register(client, r, re)
- if regErr != nil {
- return resp, fmt.Errorf("failed auto registering Resource Provider: %s. Original error: %w", regErr, err)
- }
- }
- }
- return resp, err
- })
- }
-}
-
-func getProvider(re RequestError) (string, error) {
- if re.ServiceError != nil && len(re.ServiceError.Details) > 0 {
- return re.ServiceError.Details[0]["target"].(string), nil
- }
- return "", errors.New("provider was not found in the response")
-}
-
-func register(client autorest.Client, originalReq *http.Request, re RequestError) error {
- subID := getSubscription(originalReq.URL.Path)
- if subID == "" {
- return errors.New("missing parameter subscriptionID to register resource provider")
- }
- providerName, err := getProvider(re)
- if err != nil {
- return fmt.Errorf("missing parameter provider to register resource provider: %s", err)
- }
- newURL := url.URL{
- Scheme: originalReq.URL.Scheme,
- Host: originalReq.URL.Host,
- }
-
- // taken from the resources SDK
- // with almost identical code, this sections are easier to mantain
- // It is also not a good idea to import the SDK here
- // https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L252
- pathParameters := map[string]interface{}{
- "resourceProviderNamespace": autorest.Encode("path", providerName),
- "subscriptionId": autorest.Encode("path", subID),
- }
-
- const APIVersion = "2016-09-01"
- queryParameters := map[string]interface{}{
- "api-version": APIVersion,
- }
-
- preparer := autorest.CreatePreparer(
- autorest.AsPost(),
- autorest.WithBaseURL(newURL.String()),
- autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}/register", pathParameters),
- autorest.WithQueryParameters(queryParameters),
- )
-
- req, err := preparer.Prepare(&http.Request{})
- if err != nil {
- return err
- }
- req = req.WithContext(originalReq.Context())
-
- resp, err := autorest.SendWithSender(client, req,
- autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
- )
- if err != nil {
- return err
- }
-
- type Provider struct {
- RegistrationState *string `json:"registrationState,omitempty"`
- }
- var provider Provider
-
- err = autorest.Respond(
- resp,
- WithErrorUnlessStatusCode(http.StatusOK),
- autorest.ByUnmarshallingJSON(&provider),
- autorest.ByClosing(),
- )
- if err != nil {
- return err
- }
-
- // poll for registered provisioning state
- registrationStartTime := time.Now()
- for err == nil && (client.PollingDuration == 0 || (client.PollingDuration != 0 && time.Since(registrationStartTime) < client.PollingDuration)) {
- // taken from the resources SDK
- // https://github.com/Azure/azure-sdk-for-go/blob/9f366792afa3e0ddaecdc860e793ba9d75e76c27/arm/resources/resources/providers.go#L45
- preparer := autorest.CreatePreparer(
- autorest.AsGet(),
- autorest.WithBaseURL(newURL.String()),
- autorest.WithPathParameters("/subscriptions/{subscriptionId}/providers/{resourceProviderNamespace}", pathParameters),
- autorest.WithQueryParameters(queryParameters),
- )
- req, err = preparer.Prepare(&http.Request{})
- if err != nil {
- return err
- }
- req = req.WithContext(originalReq.Context())
-
- resp, err := autorest.SendWithSender(client, req,
- autorest.DoRetryForStatusCodes(client.RetryAttempts, client.RetryDuration, autorest.StatusCodesForRetry...),
- )
- if err != nil {
- return err
- }
-
- err = autorest.Respond(
- resp,
- WithErrorUnlessStatusCode(http.StatusOK),
- autorest.ByUnmarshallingJSON(&provider),
- autorest.ByClosing(),
- )
- if err != nil {
- return err
- }
-
- if provider.RegistrationState != nil &&
- *provider.RegistrationState == "Registered" {
- break
- }
-
- delayed := autorest.DelayWithRetryAfter(resp, originalReq.Context().Done())
- if !delayed && !autorest.DelayForBackoff(client.PollingDelay, 0, originalReq.Context().Done()) {
- return originalReq.Context().Err()
- }
- }
- if client.PollingDuration != 0 && !(time.Since(registrationStartTime) < client.PollingDuration) {
- return errors.New("polling for resource provider registration has exceeded the polling duration")
- }
- return err
-}
-
-func getSubscription(path string) string {
- parts := strings.Split(path, "/")
- for i, v := range parts {
- if v == "subscriptions" && (i+1) < len(parts) {
- return parts[i+1]
- }
- }
- return ""
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/client.go b/vendor/github.com/Azure/go-autorest/autorest/client.go
deleted file mode 100644
index bb5f9396e9..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/client.go
+++ /dev/null
@@ -1,328 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "crypto/tls"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "log"
- "net/http"
- "strings"
- "time"
-
- "github.com/Azure/go-autorest/logger"
-)
-
-const (
- // DefaultPollingDelay is a reasonable delay between polling requests.
- DefaultPollingDelay = 30 * time.Second
-
- // DefaultPollingDuration is a reasonable total polling duration.
- DefaultPollingDuration = 15 * time.Minute
-
- // DefaultRetryAttempts is number of attempts for retry status codes (5xx).
- DefaultRetryAttempts = 3
-
- // DefaultRetryDuration is the duration to wait between retries.
- DefaultRetryDuration = 30 * time.Second
-)
-
-var (
- // StatusCodesForRetry are a defined group of status code for which the client will retry
- StatusCodesForRetry = []int{
- http.StatusRequestTimeout, // 408
- http.StatusTooManyRequests, // 429
- http.StatusInternalServerError, // 500
- http.StatusBadGateway, // 502
- http.StatusServiceUnavailable, // 503
- http.StatusGatewayTimeout, // 504
- }
-)
-
-const (
- requestFormat = `HTTP Request Begin ===================================================
-%s
-===================================================== HTTP Request End
-`
- responseFormat = `HTTP Response Begin ===================================================
-%s
-===================================================== HTTP Response End
-`
-)
-
-// Response serves as the base for all responses from generated clients. It provides access to the
-// last http.Response.
-type Response struct {
- *http.Response `json:"-"`
-}
-
-// IsHTTPStatus returns true if the returned HTTP status code matches the provided status code.
-// If there was no response (i.e. the underlying http.Response is nil) the return value is false.
-func (r Response) IsHTTPStatus(statusCode int) bool {
- if r.Response == nil {
- return false
- }
- return r.Response.StatusCode == statusCode
-}
-
-// HasHTTPStatus returns true if the returned HTTP status code matches one of the provided status codes.
-// If there was no response (i.e. the underlying http.Response is nil) or not status codes are provided
-// the return value is false.
-func (r Response) HasHTTPStatus(statusCodes ...int) bool {
- return ResponseHasStatusCode(r.Response, statusCodes...)
-}
-
-// LoggingInspector implements request and response inspectors that log the full request and
-// response to a supplied log.
-type LoggingInspector struct {
- Logger *log.Logger
-}
-
-// WithInspection returns a PrepareDecorator that emits the http.Request to the supplied logger. The
-// body is restored after being emitted.
-//
-// Note: Since it reads the entire Body, this decorator should not be used where body streaming is
-// important. It is best used to trace JSON or similar body values.
-func (li LoggingInspector) WithInspection() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- var body, b bytes.Buffer
-
- defer r.Body.Close()
-
- r.Body = ioutil.NopCloser(io.TeeReader(r.Body, &body))
- if err := r.Write(&b); err != nil {
- return nil, fmt.Errorf("Failed to write response: %v", err)
- }
-
- li.Logger.Printf(requestFormat, b.String())
-
- r.Body = ioutil.NopCloser(&body)
- return p.Prepare(r)
- })
- }
-}
-
-// ByInspecting returns a RespondDecorator that emits the http.Response to the supplied logger. The
-// body is restored after being emitted.
-//
-// Note: Since it reads the entire Body, this decorator should not be used where body streaming is
-// important. It is best used to trace JSON or similar body values.
-func (li LoggingInspector) ByInspecting() RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- var body, b bytes.Buffer
- defer resp.Body.Close()
- resp.Body = ioutil.NopCloser(io.TeeReader(resp.Body, &body))
- if err := resp.Write(&b); err != nil {
- return fmt.Errorf("Failed to write response: %v", err)
- }
-
- li.Logger.Printf(responseFormat, b.String())
-
- resp.Body = ioutil.NopCloser(&body)
- return r.Respond(resp)
- })
- }
-}
-
-// Client is the base for autorest generated clients. It provides default, "do nothing"
-// implementations of an Authorizer, RequestInspector, and ResponseInspector. It also returns the
-// standard, undecorated http.Client as a default Sender.
-//
-// Generated clients should also use Error (see NewError and NewErrorWithError) for errors and
-// return responses that compose with Response.
-//
-// Most customization of generated clients is best achieved by supplying a custom Authorizer, custom
-// RequestInspector, and / or custom ResponseInspector. Users may log requests, implement circuit
-// breakers (see https://msdn.microsoft.com/en-us/library/dn589784.aspx) or otherwise influence
-// sending the request by providing a decorated Sender.
-type Client struct {
- Authorizer Authorizer
- Sender Sender
- RequestInspector PrepareDecorator
- ResponseInspector RespondDecorator
-
- // PollingDelay sets the polling frequency used in absence of a Retry-After HTTP header
- PollingDelay time.Duration
-
- // PollingDuration sets the maximum polling time after which an error is returned.
- // Setting this to zero will use the provided context to control the duration.
- PollingDuration time.Duration
-
- // RetryAttempts sets the total number of times the client will attempt to make an HTTP request.
- // Set the value to 1 to disable retries. DO NOT set the value to less than 1.
- RetryAttempts int
-
- // RetryDuration sets the delay duration for retries.
- RetryDuration time.Duration
-
- // UserAgent, if not empty, will be set as the HTTP User-Agent header on all requests sent
- // through the Do method.
- UserAgent string
-
- Jar http.CookieJar
-
- // Set to true to skip attempted registration of resource providers (false by default).
- SkipResourceProviderRegistration bool
-
- // SendDecorators can be used to override the default chain of SendDecorators.
- // This can be used to specify things like a custom retry SendDecorator.
- // Set this to an empty slice to use no SendDecorators.
- SendDecorators []SendDecorator
-}
-
-// NewClientWithUserAgent returns an instance of a Client with the UserAgent set to the passed
-// string.
-func NewClientWithUserAgent(ua string) Client {
- return newClient(ua, tls.RenegotiateNever)
-}
-
-// ClientOptions contains various Client configuration options.
-type ClientOptions struct {
- // UserAgent is an optional user-agent string to append to the default user agent.
- UserAgent string
-
- // Renegotiation is an optional setting to control client-side TLS renegotiation.
- Renegotiation tls.RenegotiationSupport
-}
-
-// NewClientWithOptions returns an instance of a Client with the specified values.
-func NewClientWithOptions(options ClientOptions) Client {
- return newClient(options.UserAgent, options.Renegotiation)
-}
-
-func newClient(ua string, renegotiation tls.RenegotiationSupport) Client {
- c := Client{
- PollingDelay: DefaultPollingDelay,
- PollingDuration: DefaultPollingDuration,
- RetryAttempts: DefaultRetryAttempts,
- RetryDuration: DefaultRetryDuration,
- UserAgent: UserAgent(),
- }
- c.Sender = c.sender(renegotiation)
- c.AddToUserAgent(ua)
- return c
-}
-
-// AddToUserAgent adds an extension to the current user agent
-func (c *Client) AddToUserAgent(extension string) error {
- if extension != "" {
- c.UserAgent = fmt.Sprintf("%s %s", c.UserAgent, extension)
- return nil
- }
- return fmt.Errorf("Extension was empty, User Agent stayed as %s", c.UserAgent)
-}
-
-// Do implements the Sender interface by invoking the active Sender after applying authorization.
-// If Sender is not set, it uses a new instance of http.Client. In both cases it will, if UserAgent
-// is set, apply set the User-Agent header.
-func (c Client) Do(r *http.Request) (*http.Response, error) {
- if r.UserAgent() == "" {
- r, _ = Prepare(r,
- WithUserAgent(c.UserAgent))
- }
- // NOTE: c.WithInspection() must be last in the list so that it can inspect all preceding operations
- r, err := Prepare(r,
- c.WithAuthorization(),
- c.WithInspection())
- if err != nil {
- var resp *http.Response
- if detErr, ok := err.(DetailedError); ok {
- // if the authorization failed (e.g. invalid credentials) there will
- // be a response associated with the error, be sure to return it.
- resp = detErr.Response
- }
- return resp, NewErrorWithError(err, "autorest/Client", "Do", nil, "Preparing request failed")
- }
- logger.Instance.WriteRequest(r, logger.Filter{
- Header: func(k string, v []string) (bool, []string) {
- // remove the auth token from the log
- if strings.EqualFold(k, "Authorization") || strings.EqualFold(k, "Ocp-Apim-Subscription-Key") {
- v = []string{"**REDACTED**"}
- }
- return true, v
- },
- })
- resp, err := SendWithSender(c.sender(tls.RenegotiateNever), r)
- if resp == nil && err == nil {
- err = errors.New("autorest: received nil response and error")
- }
- logger.Instance.WriteResponse(resp, logger.Filter{})
- Respond(resp, c.ByInspecting())
- return resp, err
-}
-
-// sender returns the Sender to which to send requests.
-func (c Client) sender(renengotiation tls.RenegotiationSupport) Sender {
- if c.Sender == nil {
- return sender(renengotiation)
- }
- return c.Sender
-}
-
-// WithAuthorization is a convenience method that returns the WithAuthorization PrepareDecorator
-// from the current Authorizer. If not Authorizer is set, it uses the NullAuthorizer.
-func (c Client) WithAuthorization() PrepareDecorator {
- return c.authorizer().WithAuthorization()
-}
-
-// authorizer returns the Authorizer to use.
-func (c Client) authorizer() Authorizer {
- if c.Authorizer == nil {
- return NullAuthorizer{}
- }
- return c.Authorizer
-}
-
-// WithInspection is a convenience method that passes the request to the supplied RequestInspector,
-// if present, or returns the WithNothing PrepareDecorator otherwise.
-func (c Client) WithInspection() PrepareDecorator {
- if c.RequestInspector == nil {
- return WithNothing()
- }
- return c.RequestInspector
-}
-
-// ByInspecting is a convenience method that passes the response to the supplied ResponseInspector,
-// if present, or returns the ByIgnoring RespondDecorator otherwise.
-func (c Client) ByInspecting() RespondDecorator {
- if c.ResponseInspector == nil {
- return ByIgnoring()
- }
- return c.ResponseInspector
-}
-
-// Send sends the provided http.Request using the client's Sender or the default sender.
-// It returns the http.Response and possible error. It also accepts a, possibly empty,
-// default set of SendDecorators used when sending the request.
-// SendDecorators have the following precedence:
-// 1. In a request's context via WithSendDecorators()
-// 2. Specified on the client in SendDecorators
-// 3. The default values specified in this method
-func (c Client) Send(req *http.Request, decorators ...SendDecorator) (*http.Response, error) {
- if c.SendDecorators != nil {
- decorators = c.SendDecorators
- }
- inCtx := req.Context().Value(ctxSendDecorators{})
- if sd, ok := inCtx.([]SendDecorator); ok {
- decorators = sd
- }
- return SendWithSender(c, req, decorators...)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/LICENSE b/vendor/github.com/Azure/go-autorest/autorest/date/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/date.go b/vendor/github.com/Azure/go-autorest/autorest/date/date.go
deleted file mode 100644
index c457106568..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/date.go
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
-Package date provides time.Time derivatives that conform to the Swagger.io (https://swagger.io/)
-defined date formats: Date and DateTime. Both types may, in most cases, be used in lieu of
-time.Time types. And both convert to time.Time through a ToTime method.
-*/
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "fmt"
- "time"
-)
-
-const (
- fullDate = "2006-01-02"
- fullDateJSON = `"2006-01-02"`
- dateFormat = "%04d-%02d-%02d"
- jsonFormat = `"%04d-%02d-%02d"`
-)
-
-// Date defines a type similar to time.Time but assumes a layout of RFC3339 full-date (i.e.,
-// 2006-01-02).
-type Date struct {
- time.Time
-}
-
-// ParseDate create a new Date from the passed string.
-func ParseDate(date string) (d Date, err error) {
- return parseDate(date, fullDate)
-}
-
-func parseDate(date string, format string) (Date, error) {
- d, err := time.Parse(format, date)
- return Date{Time: d}, err
-}
-
-// MarshalBinary preserves the Date as a byte array conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d Date) MarshalBinary() ([]byte, error) {
- return d.MarshalText()
-}
-
-// UnmarshalBinary reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d *Date) UnmarshalBinary(data []byte) error {
- return d.UnmarshalText(data)
-}
-
-// MarshalJSON preserves the Date as a JSON string conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d Date) MarshalJSON() (json []byte, err error) {
- return []byte(fmt.Sprintf(jsonFormat, d.Year(), d.Month(), d.Day())), nil
-}
-
-// UnmarshalJSON reconstitutes the Date from a JSON string conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d *Date) UnmarshalJSON(data []byte) (err error) {
- d.Time, err = time.Parse(fullDateJSON, string(data))
- return err
-}
-
-// MarshalText preserves the Date as a byte array conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d Date) MarshalText() (text []byte, err error) {
- return []byte(fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())), nil
-}
-
-// UnmarshalText reconstitutes a Date saved as a byte array conforming to RFC3339 full-date (i.e.,
-// 2006-01-02).
-func (d *Date) UnmarshalText(data []byte) (err error) {
- d.Time, err = time.Parse(fullDate, string(data))
- return err
-}
-
-// String returns the Date formatted as an RFC3339 full-date string (i.e., 2006-01-02).
-func (d Date) String() string {
- return fmt.Sprintf(dateFormat, d.Year(), d.Month(), d.Day())
-}
-
-// ToTime returns a Date as a time.Time
-func (d Date) ToTime() time.Time {
- return d.Time
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go
deleted file mode 100644
index 4e05432071..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/go_mod_tidy_hack.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build modhack
-
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file, and the github.com/Azure/go-autorest import, won't actually become part of
-// the resultant binary.
-
-// Necessary for safely adding multi-module repo.
-// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
-import _ "github.com/Azure/go-autorest"
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/time.go b/vendor/github.com/Azure/go-autorest/autorest/date/time.go
deleted file mode 100644
index b453fad049..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/time.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "regexp"
- "time"
-)
-
-// Azure reports time in UTC but it doesn't include the 'Z' time zone suffix in some cases.
-const (
- azureUtcFormatJSON = `"2006-01-02T15:04:05.999999999"`
- azureUtcFormat = "2006-01-02T15:04:05.999999999"
- rfc3339JSON = `"` + time.RFC3339Nano + `"`
- rfc3339 = time.RFC3339Nano
- tzOffsetRegex = `(Z|z|\+|-)(\d+:\d+)*"*$`
-)
-
-// Time defines a type similar to time.Time but assumes a layout of RFC3339 date-time (i.e.,
-// 2006-01-02T15:04:05Z).
-type Time struct {
- time.Time
-}
-
-// MarshalBinary preserves the Time as a byte array conforming to RFC3339 date-time (i.e.,
-// 2006-01-02T15:04:05Z).
-func (t Time) MarshalBinary() ([]byte, error) {
- return t.Time.MarshalText()
-}
-
-// UnmarshalBinary reconstitutes a Time saved as a byte array conforming to RFC3339 date-time
-// (i.e., 2006-01-02T15:04:05Z).
-func (t *Time) UnmarshalBinary(data []byte) error {
- return t.UnmarshalText(data)
-}
-
-// MarshalJSON preserves the Time as a JSON string conforming to RFC3339 date-time (i.e.,
-// 2006-01-02T15:04:05Z).
-func (t Time) MarshalJSON() (json []byte, err error) {
- return t.Time.MarshalJSON()
-}
-
-// UnmarshalJSON reconstitutes the Time from a JSON string conforming to RFC3339 date-time
-// (i.e., 2006-01-02T15:04:05Z).
-func (t *Time) UnmarshalJSON(data []byte) (err error) {
- timeFormat := azureUtcFormatJSON
- match, err := regexp.Match(tzOffsetRegex, data)
- if err != nil {
- return err
- } else if match {
- timeFormat = rfc3339JSON
- }
- t.Time, err = ParseTime(timeFormat, string(data))
- return err
-}
-
-// MarshalText preserves the Time as a byte array conforming to RFC3339 date-time (i.e.,
-// 2006-01-02T15:04:05Z).
-func (t Time) MarshalText() (text []byte, err error) {
- return t.Time.MarshalText()
-}
-
-// UnmarshalText reconstitutes a Time saved as a byte array conforming to RFC3339 date-time
-// (i.e., 2006-01-02T15:04:05Z).
-func (t *Time) UnmarshalText(data []byte) (err error) {
- timeFormat := azureUtcFormat
- match, err := regexp.Match(tzOffsetRegex, data)
- if err != nil {
- return err
- } else if match {
- timeFormat = rfc3339
- }
- t.Time, err = ParseTime(timeFormat, string(data))
- return err
-}
-
-// String returns the Time formatted as an RFC3339 date-time string (i.e.,
-// 2006-01-02T15:04:05Z).
-func (t Time) String() string {
- // Note: time.Time.String does not return an RFC3339 compliant string, time.Time.MarshalText does.
- b, err := t.MarshalText()
- if err != nil {
- return ""
- }
- return string(b)
-}
-
-// ToTime returns a Time as a time.Time
-func (t Time) ToTime() time.Time {
- return t.Time
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go b/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go
deleted file mode 100644
index 48fb39ba9b..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/timerfc1123.go
+++ /dev/null
@@ -1,100 +0,0 @@
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "errors"
- "time"
-)
-
-const (
- rfc1123JSON = `"` + time.RFC1123 + `"`
- rfc1123 = time.RFC1123
-)
-
-// TimeRFC1123 defines a type similar to time.Time but assumes a layout of RFC1123 date-time (i.e.,
-// Mon, 02 Jan 2006 15:04:05 MST).
-type TimeRFC1123 struct {
- time.Time
-}
-
-// UnmarshalJSON reconstitutes the Time from a JSON string conforming to RFC1123 date-time
-// (i.e., Mon, 02 Jan 2006 15:04:05 MST).
-func (t *TimeRFC1123) UnmarshalJSON(data []byte) (err error) {
- t.Time, err = ParseTime(rfc1123JSON, string(data))
- if err != nil {
- return err
- }
- return nil
-}
-
-// MarshalJSON preserves the Time as a JSON string conforming to RFC1123 date-time (i.e.,
-// Mon, 02 Jan 2006 15:04:05 MST).
-func (t TimeRFC1123) MarshalJSON() ([]byte, error) {
- if y := t.Year(); y < 0 || y >= 10000 {
- return nil, errors.New("Time.MarshalJSON: year outside of range [0,9999]")
- }
- b := []byte(t.Format(rfc1123JSON))
- return b, nil
-}
-
-// MarshalText preserves the Time as a byte array conforming to RFC1123 date-time (i.e.,
-// Mon, 02 Jan 2006 15:04:05 MST).
-func (t TimeRFC1123) MarshalText() ([]byte, error) {
- if y := t.Year(); y < 0 || y >= 10000 {
- return nil, errors.New("Time.MarshalText: year outside of range [0,9999]")
- }
-
- b := []byte(t.Format(rfc1123))
- return b, nil
-}
-
-// UnmarshalText reconstitutes a Time saved as a byte array conforming to RFC1123 date-time
-// (i.e., Mon, 02 Jan 2006 15:04:05 MST).
-func (t *TimeRFC1123) UnmarshalText(data []byte) (err error) {
- t.Time, err = ParseTime(rfc1123, string(data))
- if err != nil {
- return err
- }
- return nil
-}
-
-// MarshalBinary preserves the Time as a byte array conforming to RFC1123 date-time (i.e.,
-// Mon, 02 Jan 2006 15:04:05 MST).
-func (t TimeRFC1123) MarshalBinary() ([]byte, error) {
- return t.MarshalText()
-}
-
-// UnmarshalBinary reconstitutes a Time saved as a byte array conforming to RFC1123 date-time
-// (i.e., Mon, 02 Jan 2006 15:04:05 MST).
-func (t *TimeRFC1123) UnmarshalBinary(data []byte) error {
- return t.UnmarshalText(data)
-}
-
-// ToTime returns a Time as a time.Time
-func (t TimeRFC1123) ToTime() time.Time {
- return t.Time
-}
-
-// String returns the Time formatted as an RFC1123 date-time string (i.e.,
-// Mon, 02 Jan 2006 15:04:05 MST).
-func (t TimeRFC1123) String() string {
- // Note: time.Time.String does not return an RFC1123 compliant string, time.Time.MarshalText does.
- b, err := t.MarshalText()
- if err != nil {
- return ""
- }
- return string(b)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go b/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go
deleted file mode 100644
index 7073959b2a..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/unixtime.go
+++ /dev/null
@@ -1,123 +0,0 @@
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "encoding/binary"
- "encoding/json"
- "time"
-)
-
-// unixEpoch is the moment in time that should be treated as timestamp 0.
-var unixEpoch = time.Date(1970, time.January, 1, 0, 0, 0, 0, time.UTC)
-
-// UnixTime marshals and unmarshals a time that is represented as the number
-// of seconds (ignoring skip-seconds) since the Unix Epoch.
-type UnixTime time.Time
-
-// Duration returns the time as a Duration since the UnixEpoch.
-func (t UnixTime) Duration() time.Duration {
- return time.Time(t).Sub(unixEpoch)
-}
-
-// NewUnixTimeFromSeconds creates a UnixTime as a number of seconds from the UnixEpoch.
-func NewUnixTimeFromSeconds(seconds float64) UnixTime {
- return NewUnixTimeFromDuration(time.Duration(seconds * float64(time.Second)))
-}
-
-// NewUnixTimeFromNanoseconds creates a UnixTime as a number of nanoseconds from the UnixEpoch.
-func NewUnixTimeFromNanoseconds(nanoseconds int64) UnixTime {
- return NewUnixTimeFromDuration(time.Duration(nanoseconds))
-}
-
-// NewUnixTimeFromDuration creates a UnixTime as a duration of time since the UnixEpoch.
-func NewUnixTimeFromDuration(dur time.Duration) UnixTime {
- return UnixTime(unixEpoch.Add(dur))
-}
-
-// UnixEpoch retreives the moment considered the Unix Epoch. I.e. The time represented by '0'
-func UnixEpoch() time.Time {
- return unixEpoch
-}
-
-// MarshalJSON preserves the UnixTime as a JSON number conforming to Unix Timestamp requirements.
-// (i.e. the number of seconds since midnight January 1st, 1970 not considering leap seconds.)
-func (t UnixTime) MarshalJSON() ([]byte, error) {
- buffer := &bytes.Buffer{}
- enc := json.NewEncoder(buffer)
- err := enc.Encode(float64(time.Time(t).UnixNano()) / 1e9)
- if err != nil {
- return nil, err
- }
- return buffer.Bytes(), nil
-}
-
-// UnmarshalJSON reconstitures a UnixTime saved as a JSON number of the number of seconds since
-// midnight January 1st, 1970.
-func (t *UnixTime) UnmarshalJSON(text []byte) error {
- dec := json.NewDecoder(bytes.NewReader(text))
-
- var secondsSinceEpoch float64
- if err := dec.Decode(&secondsSinceEpoch); err != nil {
- return err
- }
-
- *t = NewUnixTimeFromSeconds(secondsSinceEpoch)
-
- return nil
-}
-
-// MarshalText stores the number of seconds since the Unix Epoch as a textual floating point number.
-func (t UnixTime) MarshalText() ([]byte, error) {
- cast := time.Time(t)
- return cast.MarshalText()
-}
-
-// UnmarshalText populates a UnixTime with a value stored textually as a floating point number of seconds since the Unix Epoch.
-func (t *UnixTime) UnmarshalText(raw []byte) error {
- var unmarshaled time.Time
-
- if err := unmarshaled.UnmarshalText(raw); err != nil {
- return err
- }
-
- *t = UnixTime(unmarshaled)
- return nil
-}
-
-// MarshalBinary converts a UnixTime into a binary.LittleEndian float64 of nanoseconds since the epoch.
-func (t UnixTime) MarshalBinary() ([]byte, error) {
- buf := &bytes.Buffer{}
-
- payload := int64(t.Duration())
-
- if err := binary.Write(buf, binary.LittleEndian, &payload); err != nil {
- return nil, err
- }
-
- return buf.Bytes(), nil
-}
-
-// UnmarshalBinary converts a from a binary.LittleEndian float64 of nanoseconds since the epoch into a UnixTime.
-func (t *UnixTime) UnmarshalBinary(raw []byte) error {
- var nanosecondsSinceEpoch int64
-
- if err := binary.Read(bytes.NewReader(raw), binary.LittleEndian, &nanosecondsSinceEpoch); err != nil {
- return err
- }
- *t = NewUnixTimeFromNanoseconds(nanosecondsSinceEpoch)
- return nil
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/date/utility.go b/vendor/github.com/Azure/go-autorest/autorest/date/utility.go
deleted file mode 100644
index 12addf0ebb..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/date/utility.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package date
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "strings"
- "time"
-)
-
-// ParseTime to parse Time string to specified format.
-func ParseTime(format string, t string) (d time.Time, err error) {
- return time.Parse(format, strings.ToUpper(t))
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/error.go b/vendor/github.com/Azure/go-autorest/autorest/error.go
deleted file mode 100644
index 35098eda8e..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/error.go
+++ /dev/null
@@ -1,103 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "fmt"
- "net/http"
-)
-
-const (
- // UndefinedStatusCode is used when HTTP status code is not available for an error.
- UndefinedStatusCode = 0
-)
-
-// DetailedError encloses a error with details of the package, method, and associated HTTP
-// status code (if any).
-type DetailedError struct {
- Original error
-
- // PackageType is the package type of the object emitting the error. For types, the value
- // matches that produced the the '%T' format specifier of the fmt package. For other elements,
- // such as functions, it is just the package name (e.g., "autorest").
- PackageType string
-
- // Method is the name of the method raising the error.
- Method string
-
- // StatusCode is the HTTP Response StatusCode (if non-zero) that led to the error.
- StatusCode interface{}
-
- // Message is the error message.
- Message string
-
- // Service Error is the response body of failed API in bytes
- ServiceError []byte
-
- // Response is the response object that was returned during failure if applicable.
- Response *http.Response
-}
-
-// NewError creates a new Error conforming object from the passed packageType, method, and
-// message. message is treated as a format string to which the optional args apply.
-func NewError(packageType string, method string, message string, args ...interface{}) DetailedError {
- return NewErrorWithError(nil, packageType, method, nil, message, args...)
-}
-
-// NewErrorWithResponse creates a new Error conforming object from the passed
-// packageType, method, statusCode of the given resp (UndefinedStatusCode if
-// resp is nil), and message. message is treated as a format string to which the
-// optional args apply.
-func NewErrorWithResponse(packageType string, method string, resp *http.Response, message string, args ...interface{}) DetailedError {
- return NewErrorWithError(nil, packageType, method, resp, message, args...)
-}
-
-// NewErrorWithError creates a new Error conforming object from the
-// passed packageType, method, statusCode of the given resp (UndefinedStatusCode
-// if resp is nil), message, and original error. message is treated as a format
-// string to which the optional args apply.
-func NewErrorWithError(original error, packageType string, method string, resp *http.Response, message string, args ...interface{}) DetailedError {
- if v, ok := original.(DetailedError); ok {
- return v
- }
-
- statusCode := UndefinedStatusCode
- if resp != nil {
- statusCode = resp.StatusCode
- }
-
- return DetailedError{
- Original: original,
- PackageType: packageType,
- Method: method,
- StatusCode: statusCode,
- Message: fmt.Sprintf(message, args...),
- Response: resp,
- }
-}
-
-// Error returns a formatted containing all available details (i.e., PackageType, Method,
-// StatusCode, Message, and original error (if any)).
-func (e DetailedError) Error() string {
- if e.Original == nil {
- return fmt.Sprintf("%s#%s: %s: StatusCode=%d", e.PackageType, e.Method, e.Message, e.StatusCode)
- }
- return fmt.Sprintf("%s#%s: %s: StatusCode=%d -- Original Error: %v", e.PackageType, e.Method, e.Message, e.StatusCode, e.Original)
-}
-
-// Unwrap returns the original error.
-func (e DetailedError) Unwrap() error {
- return e.Original
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go
deleted file mode 100644
index 792f82d4b6..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/go_mod_tidy_hack.go
+++ /dev/null
@@ -1,25 +0,0 @@
-//go:build modhack
-// +build modhack
-
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file, and the github.com/Azure/go-autorest import, won't actually become part of
-// the resultant binary.
-
-// Necessary for safely adding multi-module repo.
-// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
-import _ "github.com/Azure/go-autorest"
diff --git a/vendor/github.com/Azure/go-autorest/autorest/preparer.go b/vendor/github.com/Azure/go-autorest/autorest/preparer.go
deleted file mode 100644
index 121a66fa88..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/preparer.go
+++ /dev/null
@@ -1,549 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "context"
- "encoding/json"
- "encoding/xml"
- "fmt"
- "io"
- "io/ioutil"
- "mime/multipart"
- "net/http"
- "net/url"
- "strings"
-)
-
-const (
- mimeTypeJSON = "application/json"
- mimeTypeOctetStream = "application/octet-stream"
- mimeTypeFormPost = "application/x-www-form-urlencoded"
-
- headerAuthorization = "Authorization"
- headerAuxAuthorization = "x-ms-authorization-auxiliary"
- headerContentType = "Content-Type"
- headerUserAgent = "User-Agent"
-)
-
-// used as a key type in context.WithValue()
-type ctxPrepareDecorators struct{}
-
-// WithPrepareDecorators adds the specified PrepareDecorators to the provided context.
-// If no PrepareDecorators are provided the context is unchanged.
-func WithPrepareDecorators(ctx context.Context, prepareDecorator []PrepareDecorator) context.Context {
- if len(prepareDecorator) == 0 {
- return ctx
- }
- return context.WithValue(ctx, ctxPrepareDecorators{}, prepareDecorator)
-}
-
-// GetPrepareDecorators returns the PrepareDecorators in the provided context or the provided default PrepareDecorators.
-func GetPrepareDecorators(ctx context.Context, defaultPrepareDecorators ...PrepareDecorator) []PrepareDecorator {
- inCtx := ctx.Value(ctxPrepareDecorators{})
- if pd, ok := inCtx.([]PrepareDecorator); ok {
- return pd
- }
- return defaultPrepareDecorators
-}
-
-// Preparer is the interface that wraps the Prepare method.
-//
-// Prepare accepts and possibly modifies an http.Request (e.g., adding Headers). Implementations
-// must ensure to not share or hold per-invocation state since Preparers may be shared and re-used.
-type Preparer interface {
- Prepare(*http.Request) (*http.Request, error)
-}
-
-// PreparerFunc is a method that implements the Preparer interface.
-type PreparerFunc func(*http.Request) (*http.Request, error)
-
-// Prepare implements the Preparer interface on PreparerFunc.
-func (pf PreparerFunc) Prepare(r *http.Request) (*http.Request, error) {
- return pf(r)
-}
-
-// PrepareDecorator takes and possibly decorates, by wrapping, a Preparer. Decorators may affect the
-// http.Request and pass it along or, first, pass the http.Request along then affect the result.
-type PrepareDecorator func(Preparer) Preparer
-
-// CreatePreparer creates, decorates, and returns a Preparer.
-// Without decorators, the returned Preparer returns the passed http.Request unmodified.
-// Preparers are safe to share and re-use.
-func CreatePreparer(decorators ...PrepareDecorator) Preparer {
- return DecoratePreparer(
- Preparer(PreparerFunc(func(r *http.Request) (*http.Request, error) { return r, nil })),
- decorators...)
-}
-
-// DecoratePreparer accepts a Preparer and a, possibly empty, set of PrepareDecorators, which it
-// applies to the Preparer. Decorators are applied in the order received, but their affect upon the
-// request depends on whether they are a pre-decorator (change the http.Request and then pass it
-// along) or a post-decorator (pass the http.Request along and alter it on return).
-func DecoratePreparer(p Preparer, decorators ...PrepareDecorator) Preparer {
- for _, decorate := range decorators {
- p = decorate(p)
- }
- return p
-}
-
-// Prepare accepts an http.Request and a, possibly empty, set of PrepareDecorators.
-// It creates a Preparer from the decorators which it then applies to the passed http.Request.
-func Prepare(r *http.Request, decorators ...PrepareDecorator) (*http.Request, error) {
- if r == nil {
- return nil, NewError("autorest", "Prepare", "Invoked without an http.Request")
- }
- return CreatePreparer(decorators...).Prepare(r)
-}
-
-// WithNothing returns a "do nothing" PrepareDecorator that makes no changes to the passed
-// http.Request.
-func WithNothing() PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- return p.Prepare(r)
- })
- }
-}
-
-// WithHeader returns a PrepareDecorator that sets the specified HTTP header of the http.Request to
-// the passed value. It canonicalizes the passed header name (via http.CanonicalHeaderKey) before
-// adding the header.
-func WithHeader(header string, value string) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- setHeader(r, http.CanonicalHeaderKey(header), value)
- }
- return r, err
- })
- }
-}
-
-// WithHeaders returns a PrepareDecorator that sets the specified HTTP headers of the http.Request to
-// the passed value. It canonicalizes the passed headers name (via http.CanonicalHeaderKey) before
-// adding them.
-func WithHeaders(headers map[string]interface{}) PrepareDecorator {
- h := ensureValueStrings(headers)
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if r.Header == nil {
- r.Header = make(http.Header)
- }
-
- for name, value := range h {
- r.Header.Set(http.CanonicalHeaderKey(name), value)
- }
- }
- return r, err
- })
- }
-}
-
-// WithBearerAuthorization returns a PrepareDecorator that adds an HTTP Authorization header whose
-// value is "Bearer " followed by the supplied token.
-func WithBearerAuthorization(token string) PrepareDecorator {
- return WithHeader(headerAuthorization, fmt.Sprintf("Bearer %s", token))
-}
-
-// AsContentType returns a PrepareDecorator that adds an HTTP Content-Type header whose value
-// is the passed contentType.
-func AsContentType(contentType string) PrepareDecorator {
- return WithHeader(headerContentType, contentType)
-}
-
-// WithUserAgent returns a PrepareDecorator that adds an HTTP User-Agent header whose value is the
-// passed string.
-func WithUserAgent(ua string) PrepareDecorator {
- return WithHeader(headerUserAgent, ua)
-}
-
-// AsFormURLEncoded returns a PrepareDecorator that adds an HTTP Content-Type header whose value is
-// "application/x-www-form-urlencoded".
-func AsFormURLEncoded() PrepareDecorator {
- return AsContentType(mimeTypeFormPost)
-}
-
-// AsJSON returns a PrepareDecorator that adds an HTTP Content-Type header whose value is
-// "application/json".
-func AsJSON() PrepareDecorator {
- return AsContentType(mimeTypeJSON)
-}
-
-// AsOctetStream returns a PrepareDecorator that adds the "application/octet-stream" Content-Type header.
-func AsOctetStream() PrepareDecorator {
- return AsContentType(mimeTypeOctetStream)
-}
-
-// WithMethod returns a PrepareDecorator that sets the HTTP method of the passed request. The
-// decorator does not validate that the passed method string is a known HTTP method.
-func WithMethod(method string) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r.Method = method
- return p.Prepare(r)
- })
- }
-}
-
-// AsDelete returns a PrepareDecorator that sets the HTTP method to DELETE.
-func AsDelete() PrepareDecorator { return WithMethod("DELETE") }
-
-// AsGet returns a PrepareDecorator that sets the HTTP method to GET.
-func AsGet() PrepareDecorator { return WithMethod("GET") }
-
-// AsHead returns a PrepareDecorator that sets the HTTP method to HEAD.
-func AsHead() PrepareDecorator { return WithMethod("HEAD") }
-
-// AsMerge returns a PrepareDecorator that sets the HTTP method to MERGE.
-func AsMerge() PrepareDecorator { return WithMethod("MERGE") }
-
-// AsOptions returns a PrepareDecorator that sets the HTTP method to OPTIONS.
-func AsOptions() PrepareDecorator { return WithMethod("OPTIONS") }
-
-// AsPatch returns a PrepareDecorator that sets the HTTP method to PATCH.
-func AsPatch() PrepareDecorator { return WithMethod("PATCH") }
-
-// AsPost returns a PrepareDecorator that sets the HTTP method to POST.
-func AsPost() PrepareDecorator { return WithMethod("POST") }
-
-// AsPut returns a PrepareDecorator that sets the HTTP method to PUT.
-func AsPut() PrepareDecorator { return WithMethod("PUT") }
-
-// WithBaseURL returns a PrepareDecorator that populates the http.Request with a url.URL constructed
-// from the supplied baseUrl. Query parameters will be encoded as required.
-func WithBaseURL(baseURL string) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- var u *url.URL
- if u, err = url.Parse(baseURL); err != nil {
- return r, err
- }
- if u.Scheme == "" {
- return r, fmt.Errorf("autorest: No scheme detected in URL %s", baseURL)
- }
- if u.RawQuery != "" {
- // handle unencoded semicolons (ideally the server would send them already encoded)
- u.RawQuery = strings.Replace(u.RawQuery, ";", "%3B", -1)
- q, err := url.ParseQuery(u.RawQuery)
- if err != nil {
- return r, err
- }
- u.RawQuery = q.Encode()
- }
- r.URL = u
- }
- return r, err
- })
- }
-}
-
-// WithBytes returns a PrepareDecorator that takes a list of bytes
-// which passes the bytes directly to the body
-func WithBytes(input *[]byte) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if input == nil {
- return r, fmt.Errorf("Input Bytes was nil")
- }
-
- r.ContentLength = int64(len(*input))
- r.Body = ioutil.NopCloser(bytes.NewReader(*input))
- }
- return r, err
- })
- }
-}
-
-// WithCustomBaseURL returns a PrepareDecorator that replaces brace-enclosed keys within the
-// request base URL (i.e., http.Request.URL) with the corresponding values from the passed map.
-func WithCustomBaseURL(baseURL string, urlParameters map[string]interface{}) PrepareDecorator {
- parameters := ensureValueStrings(urlParameters)
- for key, value := range parameters {
- baseURL = strings.Replace(baseURL, "{"+key+"}", value, -1)
- }
- return WithBaseURL(baseURL)
-}
-
-// WithFormData returns a PrepareDecoratore that "URL encodes" (e.g., bar=baz&foo=quux) into the
-// http.Request body.
-func WithFormData(v url.Values) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- s := v.Encode()
-
- setHeader(r, http.CanonicalHeaderKey(headerContentType), mimeTypeFormPost)
- r.ContentLength = int64(len(s))
- r.Body = ioutil.NopCloser(strings.NewReader(s))
- }
- return r, err
- })
- }
-}
-
-// WithMultiPartFormData returns a PrepareDecoratore that "URL encodes" (e.g., bar=baz&foo=quux) form parameters
-// into the http.Request body.
-func WithMultiPartFormData(formDataParameters map[string]interface{}) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- var body bytes.Buffer
- writer := multipart.NewWriter(&body)
- for key, value := range formDataParameters {
- if rc, ok := value.(io.ReadCloser); ok {
- var fd io.Writer
- if fd, err = writer.CreateFormFile(key, key); err != nil {
- return r, err
- }
- if _, err = io.Copy(fd, rc); err != nil {
- return r, err
- }
- } else {
- if err = writer.WriteField(key, ensureValueString(value)); err != nil {
- return r, err
- }
- }
- }
- if err = writer.Close(); err != nil {
- return r, err
- }
- setHeader(r, http.CanonicalHeaderKey(headerContentType), writer.FormDataContentType())
- r.Body = ioutil.NopCloser(bytes.NewReader(body.Bytes()))
- r.ContentLength = int64(body.Len())
- return r, err
- }
- return r, err
- })
- }
-}
-
-// WithFile returns a PrepareDecorator that sends file in request body.
-func WithFile(f io.ReadCloser) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- b, err := ioutil.ReadAll(f)
- if err != nil {
- return r, err
- }
- r.Body = ioutil.NopCloser(bytes.NewReader(b))
- r.ContentLength = int64(len(b))
- }
- return r, err
- })
- }
-}
-
-// WithBool returns a PrepareDecorator that encodes the passed bool into the body of the request
-// and sets the Content-Length header.
-func WithBool(v bool) PrepareDecorator {
- return WithString(fmt.Sprintf("%v", v))
-}
-
-// WithFloat32 returns a PrepareDecorator that encodes the passed float32 into the body of the
-// request and sets the Content-Length header.
-func WithFloat32(v float32) PrepareDecorator {
- return WithString(fmt.Sprintf("%v", v))
-}
-
-// WithFloat64 returns a PrepareDecorator that encodes the passed float64 into the body of the
-// request and sets the Content-Length header.
-func WithFloat64(v float64) PrepareDecorator {
- return WithString(fmt.Sprintf("%v", v))
-}
-
-// WithInt32 returns a PrepareDecorator that encodes the passed int32 into the body of the request
-// and sets the Content-Length header.
-func WithInt32(v int32) PrepareDecorator {
- return WithString(fmt.Sprintf("%v", v))
-}
-
-// WithInt64 returns a PrepareDecorator that encodes the passed int64 into the body of the request
-// and sets the Content-Length header.
-func WithInt64(v int64) PrepareDecorator {
- return WithString(fmt.Sprintf("%v", v))
-}
-
-// WithString returns a PrepareDecorator that encodes the passed string into the body of the request
-// and sets the Content-Length header.
-func WithString(v string) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- r.ContentLength = int64(len(v))
- r.Body = ioutil.NopCloser(strings.NewReader(v))
- }
- return r, err
- })
- }
-}
-
-// WithJSON returns a PrepareDecorator that encodes the data passed as JSON into the body of the
-// request and sets the Content-Length header.
-func WithJSON(v interface{}) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- b, err := json.Marshal(v)
- if err == nil {
- r.ContentLength = int64(len(b))
- r.Body = ioutil.NopCloser(bytes.NewReader(b))
- }
- }
- return r, err
- })
- }
-}
-
-// WithXML returns a PrepareDecorator that encodes the data passed as XML into the body of the
-// request and sets the Content-Length header.
-func WithXML(v interface{}) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- b, err := xml.Marshal(v)
- if err == nil {
- // we have to tack on an XML header
- withHeader := xml.Header + string(b)
- bytesWithHeader := []byte(withHeader)
-
- r.ContentLength = int64(len(bytesWithHeader))
- setHeader(r, headerContentLength, fmt.Sprintf("%d", len(bytesWithHeader)))
- r.Body = ioutil.NopCloser(bytes.NewReader(bytesWithHeader))
- }
- }
- return r, err
- })
- }
-}
-
-// WithPath returns a PrepareDecorator that adds the supplied path to the request URL. If the path
-// is absolute (that is, it begins with a "/"), it replaces the existing path.
-func WithPath(path string) PrepareDecorator {
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if r.URL == nil {
- return r, NewError("autorest", "WithPath", "Invoked with a nil URL")
- }
- if r.URL, err = parseURL(r.URL, path); err != nil {
- return r, err
- }
- }
- return r, err
- })
- }
-}
-
-// WithEscapedPathParameters returns a PrepareDecorator that replaces brace-enclosed keys within the
-// request path (i.e., http.Request.URL.Path) with the corresponding values from the passed map. The
-// values will be escaped (aka URL encoded) before insertion into the path.
-func WithEscapedPathParameters(path string, pathParameters map[string]interface{}) PrepareDecorator {
- parameters := escapeValueStrings(ensureValueStrings(pathParameters))
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if r.URL == nil {
- return r, NewError("autorest", "WithEscapedPathParameters", "Invoked with a nil URL")
- }
- for key, value := range parameters {
- path = strings.Replace(path, "{"+key+"}", value, -1)
- }
- if r.URL, err = parseURL(r.URL, path); err != nil {
- return r, err
- }
- }
- return r, err
- })
- }
-}
-
-// WithPathParameters returns a PrepareDecorator that replaces brace-enclosed keys within the
-// request path (i.e., http.Request.URL.Path) with the corresponding values from the passed map.
-func WithPathParameters(path string, pathParameters map[string]interface{}) PrepareDecorator {
- parameters := ensureValueStrings(pathParameters)
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if r.URL == nil {
- return r, NewError("autorest", "WithPathParameters", "Invoked with a nil URL")
- }
- for key, value := range parameters {
- path = strings.Replace(path, "{"+key+"}", value, -1)
- }
-
- if r.URL, err = parseURL(r.URL, path); err != nil {
- return r, err
- }
- }
- return r, err
- })
- }
-}
-
-func parseURL(u *url.URL, path string) (*url.URL, error) {
- p := strings.TrimRight(u.String(), "/")
- if !strings.HasPrefix(path, "/") {
- path = "/" + path
- }
- return url.Parse(p + path)
-}
-
-// WithQueryParameters returns a PrepareDecorators that encodes and applies the query parameters
-// given in the supplied map (i.e., key=value).
-func WithQueryParameters(queryParameters map[string]interface{}) PrepareDecorator {
- parameters := MapToValues(queryParameters)
- return func(p Preparer) Preparer {
- return PreparerFunc(func(r *http.Request) (*http.Request, error) {
- r, err := p.Prepare(r)
- if err == nil {
- if r.URL == nil {
- return r, NewError("autorest", "WithQueryParameters", "Invoked with a nil URL")
- }
- v := r.URL.Query()
- for key, value := range parameters {
- for i := range value {
- d, err := url.QueryUnescape(value[i])
- if err != nil {
- return r, err
- }
- value[i] = d
- }
- v[key] = value
- }
- r.URL.RawQuery = v.Encode()
- }
- return r, err
- })
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/responder.go b/vendor/github.com/Azure/go-autorest/autorest/responder.go
deleted file mode 100644
index 349e1963a2..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/responder.go
+++ /dev/null
@@ -1,269 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "encoding/json"
- "encoding/xml"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "strings"
-)
-
-// Responder is the interface that wraps the Respond method.
-//
-// Respond accepts and reacts to an http.Response. Implementations must ensure to not share or hold
-// state since Responders may be shared and re-used.
-type Responder interface {
- Respond(*http.Response) error
-}
-
-// ResponderFunc is a method that implements the Responder interface.
-type ResponderFunc func(*http.Response) error
-
-// Respond implements the Responder interface on ResponderFunc.
-func (rf ResponderFunc) Respond(r *http.Response) error {
- return rf(r)
-}
-
-// RespondDecorator takes and possibly decorates, by wrapping, a Responder. Decorators may react to
-// the http.Response and pass it along or, first, pass the http.Response along then react.
-type RespondDecorator func(Responder) Responder
-
-// CreateResponder creates, decorates, and returns a Responder. Without decorators, the returned
-// Responder returns the passed http.Response unmodified. Responders may or may not be safe to share
-// and re-used: It depends on the applied decorators. For example, a standard decorator that closes
-// the response body is fine to share whereas a decorator that reads the body into a passed struct
-// is not.
-//
-// To prevent memory leaks, ensure that at least one Responder closes the response body.
-func CreateResponder(decorators ...RespondDecorator) Responder {
- return DecorateResponder(
- Responder(ResponderFunc(func(r *http.Response) error { return nil })),
- decorators...)
-}
-
-// DecorateResponder accepts a Responder and a, possibly empty, set of RespondDecorators, which it
-// applies to the Responder. Decorators are applied in the order received, but their affect upon the
-// request depends on whether they are a pre-decorator (react to the http.Response and then pass it
-// along) or a post-decorator (pass the http.Response along and then react).
-func DecorateResponder(r Responder, decorators ...RespondDecorator) Responder {
- for _, decorate := range decorators {
- r = decorate(r)
- }
- return r
-}
-
-// Respond accepts an http.Response and a, possibly empty, set of RespondDecorators.
-// It creates a Responder from the decorators it then applies to the passed http.Response.
-func Respond(r *http.Response, decorators ...RespondDecorator) error {
- if r == nil {
- return nil
- }
- return CreateResponder(decorators...).Respond(r)
-}
-
-// ByIgnoring returns a RespondDecorator that ignores the passed http.Response passing it unexamined
-// to the next RespondDecorator.
-func ByIgnoring() RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- return r.Respond(resp)
- })
- }
-}
-
-// ByCopying copies the contents of the http.Response Body into the passed bytes.Buffer as
-// the Body is read.
-func ByCopying(b *bytes.Buffer) RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil && resp != nil && resp.Body != nil {
- resp.Body = TeeReadCloser(resp.Body, b)
- }
- return err
- })
- }
-}
-
-// ByDiscardingBody returns a RespondDecorator that first invokes the passed Responder after which
-// it copies the remaining bytes (if any) in the response body to ioutil.Discard. Since the passed
-// Responder is invoked prior to discarding the response body, the decorator may occur anywhere
-// within the set.
-func ByDiscardingBody() RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil && resp != nil && resp.Body != nil {
- if _, err := io.Copy(ioutil.Discard, resp.Body); err != nil {
- return fmt.Errorf("Error discarding the response body: %v", err)
- }
- }
- return err
- })
- }
-}
-
-// ByClosing returns a RespondDecorator that first invokes the passed Responder after which it
-// closes the response body. Since the passed Responder is invoked prior to closing the response
-// body, the decorator may occur anywhere within the set.
-func ByClosing() RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if resp != nil && resp.Body != nil {
- if err := resp.Body.Close(); err != nil {
- return fmt.Errorf("Error closing the response body: %v", err)
- }
- }
- return err
- })
- }
-}
-
-// ByClosingIfError returns a RespondDecorator that first invokes the passed Responder after which
-// it closes the response if the passed Responder returns an error and the response body exists.
-func ByClosingIfError() RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err != nil && resp != nil && resp.Body != nil {
- if err := resp.Body.Close(); err != nil {
- return fmt.Errorf("Error closing the response body: %v", err)
- }
- }
- return err
- })
- }
-}
-
-// ByUnmarshallingBytes returns a RespondDecorator that copies the Bytes returned in the
-// response Body into the value pointed to by v.
-func ByUnmarshallingBytes(v *[]byte) RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil {
- bytes, errInner := ioutil.ReadAll(resp.Body)
- if errInner != nil {
- err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner)
- } else {
- *v = bytes
- }
- }
- return err
- })
- }
-}
-
-// ByUnmarshallingJSON returns a RespondDecorator that decodes a JSON document returned in the
-// response Body into the value pointed to by v.
-func ByUnmarshallingJSON(v interface{}) RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil {
- b, errInner := ioutil.ReadAll(resp.Body)
- // Some responses might include a BOM, remove for successful unmarshalling
- b = bytes.TrimPrefix(b, []byte("\xef\xbb\xbf"))
- if errInner != nil {
- err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner)
- } else if len(strings.Trim(string(b), " ")) > 0 {
- errInner = json.Unmarshal(b, v)
- if errInner != nil {
- err = fmt.Errorf("Error occurred unmarshalling JSON - Error = '%v' JSON = '%s'", errInner, string(b))
- }
- }
- }
- return err
- })
- }
-}
-
-// ByUnmarshallingXML returns a RespondDecorator that decodes a XML document returned in the
-// response Body into the value pointed to by v.
-func ByUnmarshallingXML(v interface{}) RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil {
- b, errInner := ioutil.ReadAll(resp.Body)
- if errInner != nil {
- err = fmt.Errorf("Error occurred reading http.Response#Body - Error = '%v'", errInner)
- } else {
- errInner = xml.Unmarshal(b, v)
- if errInner != nil {
- err = fmt.Errorf("Error occurred unmarshalling Xml - Error = '%v' Xml = '%s'", errInner, string(b))
- }
- }
- }
- return err
- })
- }
-}
-
-// WithErrorUnlessStatusCode returns a RespondDecorator that emits an error unless the response
-// StatusCode is among the set passed. On error, response body is fully read into a buffer and
-// presented in the returned error, as well as in the response body.
-func WithErrorUnlessStatusCode(codes ...int) RespondDecorator {
- return func(r Responder) Responder {
- return ResponderFunc(func(resp *http.Response) error {
- err := r.Respond(resp)
- if err == nil && !ResponseHasStatusCode(resp, codes...) {
- derr := NewErrorWithResponse("autorest", "WithErrorUnlessStatusCode", resp, "%v %v failed with %s",
- resp.Request.Method,
- resp.Request.URL,
- resp.Status)
- if resp.Body != nil {
- defer resp.Body.Close()
- b, _ := ioutil.ReadAll(resp.Body)
- derr.ServiceError = b
- resp.Body = ioutil.NopCloser(bytes.NewReader(b))
- }
- err = derr
- }
- return err
- })
- }
-}
-
-// WithErrorUnlessOK returns a RespondDecorator that emits an error if the response StatusCode is
-// anything other than HTTP 200.
-func WithErrorUnlessOK() RespondDecorator {
- return WithErrorUnlessStatusCode(http.StatusOK)
-}
-
-// ExtractHeader extracts all values of the specified header from the http.Response. It returns an
-// empty string slice if the passed http.Response is nil or the header does not exist.
-func ExtractHeader(header string, resp *http.Response) []string {
- if resp != nil && resp.Header != nil {
- return resp.Header[http.CanonicalHeaderKey(header)]
- }
- return nil
-}
-
-// ExtractHeaderValue extracts the first value of the specified header from the http.Response. It
-// returns an empty string if the passed http.Response is nil or the header does not exist.
-func ExtractHeaderValue(header string, resp *http.Response) string {
- h := ExtractHeader(header, resp)
- if len(h) > 0 {
- return h[0]
- }
- return ""
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go
deleted file mode 100644
index fa11dbed79..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest.go
+++ /dev/null
@@ -1,52 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "io"
- "io/ioutil"
- "net/http"
-)
-
-// NewRetriableRequest returns a wrapper around an HTTP request that support retry logic.
-func NewRetriableRequest(req *http.Request) *RetriableRequest {
- return &RetriableRequest{req: req}
-}
-
-// Request returns the wrapped HTTP request.
-func (rr *RetriableRequest) Request() *http.Request {
- return rr.req
-}
-
-func (rr *RetriableRequest) prepareFromByteReader() (err error) {
- // fall back to making a copy (only do this once)
- b := []byte{}
- if rr.req.ContentLength > 0 {
- b = make([]byte, rr.req.ContentLength)
- _, err = io.ReadFull(rr.req.Body, b)
- if err != nil {
- return err
- }
- } else {
- b, err = ioutil.ReadAll(rr.req.Body)
- if err != nil {
- return err
- }
- }
- rr.br = bytes.NewReader(b)
- rr.req.Body = ioutil.NopCloser(rr.br)
- return err
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
deleted file mode 100644
index 4c87030e81..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.7.go
+++ /dev/null
@@ -1,55 +0,0 @@
-//go:build !go1.8
-// +build !go1.8
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package autorest
-
-import (
- "bytes"
- "io/ioutil"
- "net/http"
-)
-
-// RetriableRequest provides facilities for retrying an HTTP request.
-type RetriableRequest struct {
- req *http.Request
- br *bytes.Reader
-}
-
-// Prepare signals that the request is about to be sent.
-func (rr *RetriableRequest) Prepare() (err error) {
- // preserve the request body; this is to support retry logic as
- // the underlying transport will always close the reqeust body
- if rr.req.Body != nil {
- if rr.br != nil {
- _, err = rr.br.Seek(0, 0 /*io.SeekStart*/)
- rr.req.Body = ioutil.NopCloser(rr.br)
- }
- if err != nil {
- return err
- }
- if rr.br == nil {
- // fall back to making a copy (only do this once)
- err = rr.prepareFromByteReader()
- }
- }
- return err
-}
-
-func removeRequestBody(req *http.Request) {
- req.Body = nil
- req.ContentLength = 0
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go b/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
deleted file mode 100644
index 05847c08ba..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/retriablerequest_1.8.go
+++ /dev/null
@@ -1,67 +0,0 @@
-//go:build go1.8
-// +build go1.8
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package autorest
-
-import (
- "bytes"
- "io"
- "io/ioutil"
- "net/http"
-)
-
-// RetriableRequest provides facilities for retrying an HTTP request.
-type RetriableRequest struct {
- req *http.Request
- rc io.ReadCloser
- br *bytes.Reader
-}
-
-// Prepare signals that the request is about to be sent.
-func (rr *RetriableRequest) Prepare() (err error) {
- // preserve the request body; this is to support retry logic as
- // the underlying transport will always close the reqeust body
- if rr.req.Body != nil {
- if rr.rc != nil {
- rr.req.Body = rr.rc
- } else if rr.br != nil {
- _, err = rr.br.Seek(0, io.SeekStart)
- rr.req.Body = ioutil.NopCloser(rr.br)
- }
- if err != nil {
- return err
- }
- if rr.req.GetBody != nil {
- // this will allow us to preserve the body without having to
- // make a copy. note we need to do this on each iteration
- rr.rc, err = rr.req.GetBody()
- if err != nil {
- return err
- }
- } else if rr.br == nil {
- // fall back to making a copy (only do this once)
- err = rr.prepareFromByteReader()
- }
- }
- return err
-}
-
-func removeRequestBody(req *http.Request) {
- req.Body = nil
- req.GetBody = nil
- req.ContentLength = 0
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/sender.go b/vendor/github.com/Azure/go-autorest/autorest/sender.go
deleted file mode 100644
index 118de81411..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/sender.go
+++ /dev/null
@@ -1,458 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "context"
- "crypto/tls"
- "fmt"
- "log"
- "math"
- "net"
- "net/http"
- "net/http/cookiejar"
- "strconv"
- "sync"
- "time"
-
- "github.com/Azure/go-autorest/logger"
- "github.com/Azure/go-autorest/tracing"
-)
-
-// there is one sender per TLS renegotiation type, i.e. count of tls.RenegotiationSupport enums
-const defaultSendersCount = 3
-
-type defaultSender struct {
- sender Sender
- init *sync.Once
-}
-
-// each type of sender will be created on demand in sender()
-var defaultSenders [defaultSendersCount]defaultSender
-
-func init() {
- for i := 0; i < defaultSendersCount; i++ {
- defaultSenders[i].init = &sync.Once{}
- }
-}
-
-// used as a key type in context.WithValue()
-type ctxSendDecorators struct{}
-
-// WithSendDecorators adds the specified SendDecorators to the provided context.
-// If no SendDecorators are provided the context is unchanged.
-func WithSendDecorators(ctx context.Context, sendDecorator []SendDecorator) context.Context {
- if len(sendDecorator) == 0 {
- return ctx
- }
- return context.WithValue(ctx, ctxSendDecorators{}, sendDecorator)
-}
-
-// GetSendDecorators returns the SendDecorators in the provided context or the provided default SendDecorators.
-func GetSendDecorators(ctx context.Context, defaultSendDecorators ...SendDecorator) []SendDecorator {
- inCtx := ctx.Value(ctxSendDecorators{})
- if sd, ok := inCtx.([]SendDecorator); ok {
- return sd
- }
- return defaultSendDecorators
-}
-
-// Sender is the interface that wraps the Do method to send HTTP requests.
-//
-// The standard http.Client conforms to this interface.
-type Sender interface {
- Do(*http.Request) (*http.Response, error)
-}
-
-// SenderFunc is a method that implements the Sender interface.
-type SenderFunc func(*http.Request) (*http.Response, error)
-
-// Do implements the Sender interface on SenderFunc.
-func (sf SenderFunc) Do(r *http.Request) (*http.Response, error) {
- return sf(r)
-}
-
-// SendDecorator takes and possibly decorates, by wrapping, a Sender. Decorators may affect the
-// http.Request and pass it along or, first, pass the http.Request along then react to the
-// http.Response result.
-type SendDecorator func(Sender) Sender
-
-// CreateSender creates, decorates, and returns, as a Sender, the default http.Client.
-func CreateSender(decorators ...SendDecorator) Sender {
- return DecorateSender(sender(tls.RenegotiateNever), decorators...)
-}
-
-// DecorateSender accepts a Sender and a, possibly empty, set of SendDecorators, which is applies to
-// the Sender. Decorators are applied in the order received, but their affect upon the request
-// depends on whether they are a pre-decorator (change the http.Request and then pass it along) or a
-// post-decorator (pass the http.Request along and react to the results in http.Response).
-func DecorateSender(s Sender, decorators ...SendDecorator) Sender {
- for _, decorate := range decorators {
- s = decorate(s)
- }
- return s
-}
-
-// Send sends, by means of the default http.Client, the passed http.Request, returning the
-// http.Response and possible error. It also accepts a, possibly empty, set of SendDecorators which
-// it will apply the http.Client before invoking the Do method.
-//
-// Send is a convenience method and not recommended for production. Advanced users should use
-// SendWithSender, passing and sharing their own Sender (e.g., instance of http.Client).
-//
-// Send will not poll or retry requests.
-func Send(r *http.Request, decorators ...SendDecorator) (*http.Response, error) {
- return SendWithSender(sender(tls.RenegotiateNever), r, decorators...)
-}
-
-// SendWithSender sends the passed http.Request, through the provided Sender, returning the
-// http.Response and possible error. It also accepts a, possibly empty, set of SendDecorators which
-// it will apply the http.Client before invoking the Do method.
-//
-// SendWithSender will not poll or retry requests.
-func SendWithSender(s Sender, r *http.Request, decorators ...SendDecorator) (*http.Response, error) {
- return DecorateSender(s, decorators...).Do(r)
-}
-
-func sender(renengotiation tls.RenegotiationSupport) Sender {
- // note that we can't init defaultSenders in init() since it will
- // execute before calling code has had a chance to enable tracing
- defaultSenders[renengotiation].init.Do(func() {
- // copied from http.DefaultTransport with a TLS minimum version.
- transport := &http.Transport{
- Proxy: http.ProxyFromEnvironment,
- DialContext: (&net.Dialer{
- Timeout: 30 * time.Second,
- KeepAlive: 30 * time.Second,
- }).DialContext,
- ForceAttemptHTTP2: true,
- MaxIdleConns: 100,
- IdleConnTimeout: 90 * time.Second,
- TLSHandshakeTimeout: 10 * time.Second,
- ExpectContinueTimeout: 1 * time.Second,
- TLSClientConfig: &tls.Config{
- MinVersion: tls.VersionTLS12,
- Renegotiation: renengotiation,
- },
- }
- var roundTripper http.RoundTripper = transport
- if tracing.IsEnabled() {
- roundTripper = tracing.NewTransport(transport)
- }
- j, _ := cookiejar.New(nil)
- defaultSenders[renengotiation].sender = &http.Client{Jar: j, Transport: roundTripper}
- })
- return defaultSenders[renengotiation].sender
-}
-
-// AfterDelay returns a SendDecorator that delays for the passed time.Duration before
-// invoking the Sender. The delay may be terminated by closing the optional channel on the
-// http.Request. If canceled, no further Senders are invoked.
-func AfterDelay(d time.Duration) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- if !DelayForBackoff(d, 0, r.Context().Done()) {
- return nil, fmt.Errorf("autorest: AfterDelay canceled before full delay")
- }
- return s.Do(r)
- })
- }
-}
-
-// AsIs returns a SendDecorator that invokes the passed Sender without modifying the http.Request.
-func AsIs() SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- return s.Do(r)
- })
- }
-}
-
-// DoCloseIfError returns a SendDecorator that first invokes the passed Sender after which
-// it closes the response if the passed Sender returns an error and the response body exists.
-func DoCloseIfError() SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- resp, err := s.Do(r)
- if err != nil {
- Respond(resp, ByDiscardingBody(), ByClosing())
- }
- return resp, err
- })
- }
-}
-
-// DoErrorIfStatusCode returns a SendDecorator that emits an error if the response StatusCode is
-// among the set passed. Since these are artificial errors, the response body may still require
-// closing.
-func DoErrorIfStatusCode(codes ...int) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- resp, err := s.Do(r)
- if err == nil && ResponseHasStatusCode(resp, codes...) {
- err = NewErrorWithResponse("autorest", "DoErrorIfStatusCode", resp, "%v %v failed with %s",
- resp.Request.Method,
- resp.Request.URL,
- resp.Status)
- }
- return resp, err
- })
- }
-}
-
-// DoErrorUnlessStatusCode returns a SendDecorator that emits an error unless the response
-// StatusCode is among the set passed. Since these are artificial errors, the response body
-// may still require closing.
-func DoErrorUnlessStatusCode(codes ...int) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- resp, err := s.Do(r)
- if err == nil && !ResponseHasStatusCode(resp, codes...) {
- err = NewErrorWithResponse("autorest", "DoErrorUnlessStatusCode", resp, "%v %v failed with %s",
- resp.Request.Method,
- resp.Request.URL,
- resp.Status)
- }
- return resp, err
- })
- }
-}
-
-// DoPollForStatusCodes returns a SendDecorator that polls if the http.Response contains one of the
-// passed status codes. It expects the http.Response to contain a Location header providing the
-// URL at which to poll (using GET) and will poll until the time passed is equal to or greater than
-// the supplied duration. It will delay between requests for the duration specified in the
-// RetryAfter header or, if the header is absent, the passed delay. Polling may be canceled by
-// closing the optional channel on the http.Request.
-func DoPollForStatusCodes(duration time.Duration, delay time.Duration, codes ...int) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
- resp, err = s.Do(r)
-
- if err == nil && ResponseHasStatusCode(resp, codes...) {
- r, err = NewPollingRequestWithContext(r.Context(), resp)
-
- for err == nil && ResponseHasStatusCode(resp, codes...) {
- Respond(resp,
- ByDiscardingBody(),
- ByClosing())
- resp, err = SendWithSender(s, r,
- AfterDelay(GetRetryAfter(resp, delay)))
- }
- }
-
- return resp, err
- })
- }
-}
-
-// DoRetryForAttempts returns a SendDecorator that retries a failed request for up to the specified
-// number of attempts, exponentially backing off between requests using the supplied backoff
-// time.Duration (which may be zero). Retrying may be canceled by closing the optional channel on
-// the http.Request.
-func DoRetryForAttempts(attempts int, backoff time.Duration) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
- rr := NewRetriableRequest(r)
- for attempt := 0; attempt < attempts; attempt++ {
- err = rr.Prepare()
- if err != nil {
- return resp, err
- }
- DrainResponseBody(resp)
- resp, err = s.Do(rr.Request())
- if err == nil {
- return resp, err
- }
- logger.Instance.Writef(logger.LogError, "DoRetryForAttempts: received error for attempt %d: %v\n", attempt+1, err)
- if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
- return nil, r.Context().Err()
- }
- }
- return resp, err
- })
- }
-}
-
-// Count429AsRetry indicates that a 429 response should be included as a retry attempt.
-var Count429AsRetry = true
-
-// Max429Delay is the maximum duration to wait between retries on a 429 if no Retry-After header was received.
-var Max429Delay time.Duration
-
-// DoRetryForStatusCodes returns a SendDecorator that retries for specified statusCodes for up to the specified
-// number of attempts, exponentially backing off between requests using the supplied backoff
-// time.Duration (which may be zero). Retrying may be canceled by cancelling the context on the http.Request.
-// NOTE: Code http.StatusTooManyRequests (429) will *not* be counted against the number of attempts.
-func DoRetryForStatusCodes(attempts int, backoff time.Duration, codes ...int) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, 0, codes...)
- })
- }
-}
-
-// DoRetryForStatusCodesWithCap returns a SendDecorator that retries for specified statusCodes for up to the
-// specified number of attempts, exponentially backing off between requests using the supplied backoff
-// time.Duration (which may be zero). To cap the maximum possible delay between iterations specify a value greater
-// than zero for cap. Retrying may be canceled by cancelling the context on the http.Request.
-func DoRetryForStatusCodesWithCap(attempts int, backoff, cap time.Duration, codes ...int) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- return doRetryForStatusCodesImpl(s, r, Count429AsRetry, attempts, backoff, cap, codes...)
- })
- }
-}
-
-func doRetryForStatusCodesImpl(s Sender, r *http.Request, count429 bool, attempts int, backoff, cap time.Duration, codes ...int) (resp *http.Response, err error) {
- rr := NewRetriableRequest(r)
- // Increment to add the first call (attempts denotes number of retries)
- for attempt, delayCount := 0, 0; attempt < attempts+1; {
- err = rr.Prepare()
- if err != nil {
- return
- }
- DrainResponseBody(resp)
- resp, err = s.Do(rr.Request())
- // we want to retry if err is not nil (e.g. transient network failure). note that for failed authentication
- // resp and err will both have a value, so in this case we don't want to retry as it will never succeed.
- if err == nil && !ResponseHasStatusCode(resp, codes...) || IsTokenRefreshError(err) {
- return resp, err
- }
- if err != nil {
- logger.Instance.Writef(logger.LogError, "DoRetryForStatusCodes: received error for attempt %d: %v\n", attempt+1, err)
- }
- delayed := DelayWithRetryAfter(resp, r.Context().Done())
- // if this was a 429 set the delay cap as specified.
- // applicable only in the absence of a retry-after header.
- if resp != nil && resp.StatusCode == http.StatusTooManyRequests {
- cap = Max429Delay
- }
- if !delayed && !DelayForBackoffWithCap(backoff, cap, delayCount, r.Context().Done()) {
- return resp, r.Context().Err()
- }
- // when count429 == false don't count a 429 against the number
- // of attempts so that we continue to retry until it succeeds
- if count429 || (resp == nil || resp.StatusCode != http.StatusTooManyRequests) {
- attempt++
- }
- // delay count is tracked separately from attempts to
- // ensure that 429 participates in exponential back-off
- delayCount++
- }
- return resp, err
-}
-
-// DelayWithRetryAfter invokes time.After for the duration specified in the "Retry-After" header.
-// The value of Retry-After can be either the number of seconds or a date in RFC1123 format.
-// The function returns true after successfully waiting for the specified duration. If there is
-// no Retry-After header or the wait is cancelled the return value is false.
-func DelayWithRetryAfter(resp *http.Response, cancel <-chan struct{}) bool {
- if resp == nil {
- return false
- }
- var dur time.Duration
- ra := resp.Header.Get("Retry-After")
- if retryAfter, _ := strconv.Atoi(ra); retryAfter > 0 {
- dur = time.Duration(retryAfter) * time.Second
- } else if t, err := time.Parse(time.RFC1123, ra); err == nil {
- dur = t.Sub(time.Now())
- }
- if dur > 0 {
- select {
- case <-time.After(dur):
- return true
- case <-cancel:
- return false
- }
- }
- return false
-}
-
-// DoRetryForDuration returns a SendDecorator that retries the request until the total time is equal
-// to or greater than the specified duration, exponentially backing off between requests using the
-// supplied backoff time.Duration (which may be zero). Retrying may be canceled by closing the
-// optional channel on the http.Request.
-func DoRetryForDuration(d time.Duration, backoff time.Duration) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (resp *http.Response, err error) {
- rr := NewRetriableRequest(r)
- end := time.Now().Add(d)
- for attempt := 0; time.Now().Before(end); attempt++ {
- err = rr.Prepare()
- if err != nil {
- return resp, err
- }
- DrainResponseBody(resp)
- resp, err = s.Do(rr.Request())
- if err == nil {
- return resp, err
- }
- logger.Instance.Writef(logger.LogError, "DoRetryForDuration: received error for attempt %d: %v\n", attempt+1, err)
- if !DelayForBackoff(backoff, attempt, r.Context().Done()) {
- return nil, r.Context().Err()
- }
- }
- return resp, err
- })
- }
-}
-
-// WithLogging returns a SendDecorator that implements simple before and after logging of the
-// request.
-func WithLogging(logger *log.Logger) SendDecorator {
- return func(s Sender) Sender {
- return SenderFunc(func(r *http.Request) (*http.Response, error) {
- logger.Printf("Sending %s %s", r.Method, r.URL)
- resp, err := s.Do(r)
- if err != nil {
- logger.Printf("%s %s received error '%v'", r.Method, r.URL, err)
- } else {
- logger.Printf("%s %s received %s", r.Method, r.URL, resp.Status)
- }
- return resp, err
- })
- }
-}
-
-// DelayForBackoff invokes time.After for the supplied backoff duration raised to the power of
-// passed attempt (i.e., an exponential backoff delay). Backoff duration is in seconds and can set
-// to zero for no delay. The delay may be canceled by closing the passed channel. If terminated early,
-// returns false.
-// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
-// count.
-func DelayForBackoff(backoff time.Duration, attempt int, cancel <-chan struct{}) bool {
- return DelayForBackoffWithCap(backoff, 0, attempt, cancel)
-}
-
-// DelayForBackoffWithCap invokes time.After for the supplied backoff duration raised to the power of
-// passed attempt (i.e., an exponential backoff delay). Backoff duration is in seconds and can set
-// to zero for no delay. To cap the maximum possible delay specify a value greater than zero for cap.
-// The delay may be canceled by closing the passed channel. If terminated early, returns false.
-// Note: Passing attempt 1 will result in doubling "backoff" duration. Treat this as a zero-based attempt
-// count.
-func DelayForBackoffWithCap(backoff, cap time.Duration, attempt int, cancel <-chan struct{}) bool {
- d := time.Duration(backoff.Seconds()*math.Pow(2, float64(attempt))) * time.Second
- if cap > 0 && d > cap {
- d = cap
- }
- logger.Instance.Writef(logger.LogInfo, "DelayForBackoffWithCap: sleeping for %s\n", d)
- select {
- case <-time.After(d):
- return true
- case <-cancel:
- return false
- }
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility.go b/vendor/github.com/Azure/go-autorest/autorest/utility.go
deleted file mode 100644
index 3467b8fa60..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/utility.go
+++ /dev/null
@@ -1,232 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "encoding/json"
- "encoding/xml"
- "fmt"
- "io"
- "io/ioutil"
- "net"
- "net/http"
- "net/url"
- "reflect"
- "strings"
-)
-
-// EncodedAs is a series of constants specifying various data encodings
-type EncodedAs string
-
-const (
- // EncodedAsJSON states that data is encoded as JSON
- EncodedAsJSON EncodedAs = "JSON"
-
- // EncodedAsXML states that data is encoded as Xml
- EncodedAsXML EncodedAs = "XML"
-)
-
-// Decoder defines the decoding method json.Decoder and xml.Decoder share
-type Decoder interface {
- Decode(v interface{}) error
-}
-
-// NewDecoder creates a new decoder appropriate to the passed encoding.
-// encodedAs specifies the type of encoding and r supplies the io.Reader containing the
-// encoded data.
-func NewDecoder(encodedAs EncodedAs, r io.Reader) Decoder {
- if encodedAs == EncodedAsJSON {
- return json.NewDecoder(r)
- } else if encodedAs == EncodedAsXML {
- return xml.NewDecoder(r)
- }
- return nil
-}
-
-// CopyAndDecode decodes the data from the passed io.Reader while making a copy. Having a copy
-// is especially useful if there is a chance the data will fail to decode.
-// encodedAs specifies the expected encoding, r provides the io.Reader to the data, and v
-// is the decoding destination.
-func CopyAndDecode(encodedAs EncodedAs, r io.Reader, v interface{}) (bytes.Buffer, error) {
- b := bytes.Buffer{}
- return b, NewDecoder(encodedAs, io.TeeReader(r, &b)).Decode(v)
-}
-
-// TeeReadCloser returns a ReadCloser that writes to w what it reads from rc.
-// It utilizes io.TeeReader to copy the data read and has the same behavior when reading.
-// Further, when it is closed, it ensures that rc is closed as well.
-func TeeReadCloser(rc io.ReadCloser, w io.Writer) io.ReadCloser {
- return &teeReadCloser{rc, io.TeeReader(rc, w)}
-}
-
-type teeReadCloser struct {
- rc io.ReadCloser
- r io.Reader
-}
-
-func (t *teeReadCloser) Read(p []byte) (int, error) {
- return t.r.Read(p)
-}
-
-func (t *teeReadCloser) Close() error {
- return t.rc.Close()
-}
-
-func containsInt(ints []int, n int) bool {
- for _, i := range ints {
- if i == n {
- return true
- }
- }
- return false
-}
-
-func escapeValueStrings(m map[string]string) map[string]string {
- for key, value := range m {
- m[key] = url.QueryEscape(value)
- }
- return m
-}
-
-func ensureValueStrings(mapOfInterface map[string]interface{}) map[string]string {
- mapOfStrings := make(map[string]string)
- for key, value := range mapOfInterface {
- mapOfStrings[key] = ensureValueString(value)
- }
- return mapOfStrings
-}
-
-func ensureValueString(value interface{}) string {
- if value == nil {
- return ""
- }
- switch v := value.(type) {
- case string:
- return v
- case []byte:
- return string(v)
- default:
- return fmt.Sprintf("%v", v)
- }
-}
-
-// MapToValues method converts map[string]interface{} to url.Values.
-func MapToValues(m map[string]interface{}) url.Values {
- v := url.Values{}
- for key, value := range m {
- x := reflect.ValueOf(value)
- if x.Kind() == reflect.Array || x.Kind() == reflect.Slice {
- for i := 0; i < x.Len(); i++ {
- v.Add(key, ensureValueString(x.Index(i)))
- }
- } else {
- v.Add(key, ensureValueString(value))
- }
- }
- return v
-}
-
-// AsStringSlice method converts interface{} to []string.
-// s must be of type slice or array or an error is returned.
-// Each element of s will be converted to its string representation.
-func AsStringSlice(s interface{}) ([]string, error) {
- v := reflect.ValueOf(s)
- if v.Kind() != reflect.Slice && v.Kind() != reflect.Array {
- return nil, NewError("autorest", "AsStringSlice", "the value's type is not a slice or array.")
- }
- stringSlice := make([]string, 0, v.Len())
-
- for i := 0; i < v.Len(); i++ {
- stringSlice = append(stringSlice, fmt.Sprintf("%v", v.Index(i)))
- }
- return stringSlice, nil
-}
-
-// String method converts interface v to string. If interface is a list, it
-// joins list elements using the separator. Note that only sep[0] will be used for
-// joining if any separator is specified.
-func String(v interface{}, sep ...string) string {
- if len(sep) == 0 {
- return ensureValueString(v)
- }
- stringSlice, ok := v.([]string)
- if ok == false {
- var err error
- stringSlice, err = AsStringSlice(v)
- if err != nil {
- panic(fmt.Sprintf("autorest: Couldn't convert value to a string %s.", err))
- }
- }
- return ensureValueString(strings.Join(stringSlice, sep[0]))
-}
-
-// Encode method encodes url path and query parameters.
-func Encode(location string, v interface{}, sep ...string) string {
- s := String(v, sep...)
- switch strings.ToLower(location) {
- case "path":
- return pathEscape(s)
- case "query":
- return queryEscape(s)
- default:
- return s
- }
-}
-
-func pathEscape(s string) string {
- return strings.Replace(url.QueryEscape(s), "+", "%20", -1)
-}
-
-func queryEscape(s string) string {
- return url.QueryEscape(s)
-}
-
-// ChangeToGet turns the specified http.Request into a GET (it assumes it wasn't).
-// This is mainly useful for long-running operations that use the Azure-AsyncOperation
-// header, so we change the initial PUT into a GET to retrieve the final result.
-func ChangeToGet(req *http.Request) *http.Request {
- req.Method = "GET"
- req.Body = nil
- req.ContentLength = 0
- req.Header.Del("Content-Length")
- return req
-}
-
-// IsTemporaryNetworkError returns true if the specified error is a temporary network error or false
-// if it's not. If the error doesn't implement the net.Error interface the return value is true.
-func IsTemporaryNetworkError(err error) bool {
- if netErr, ok := err.(net.Error); !ok || (ok && netErr.Temporary()) {
- return true
- }
- return false
-}
-
-// DrainResponseBody reads the response body then closes it.
-func DrainResponseBody(resp *http.Response) error {
- if resp != nil && resp.Body != nil {
- _, err := io.Copy(ioutil.Discard, resp.Body)
- resp.Body.Close()
- return err
- }
- return nil
-}
-
-func setHeader(r *http.Request, key, value string) {
- if r.Header == nil {
- r.Header = make(http.Header)
- }
- r.Header.Set(key, value)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility_1.13.go b/vendor/github.com/Azure/go-autorest/autorest/utility_1.13.go
deleted file mode 100644
index 3133fcc08e..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/utility_1.13.go
+++ /dev/null
@@ -1,30 +0,0 @@
-//go:build go1.13
-// +build go1.13
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package autorest
-
-import (
- "errors"
-
- "github.com/Azure/go-autorest/autorest/adal"
-)
-
-// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError interface.
-func IsTokenRefreshError(err error) bool {
- var tre adal.TokenRefreshError
- return errors.As(err, &tre)
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/utility_legacy.go b/vendor/github.com/Azure/go-autorest/autorest/utility_legacy.go
deleted file mode 100644
index 851e152db4..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/utility_legacy.go
+++ /dev/null
@@ -1,32 +0,0 @@
-//go:build !go1.13
-// +build !go1.13
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package autorest
-
-import "github.com/Azure/go-autorest/autorest/adal"
-
-// IsTokenRefreshError returns true if the specified error implements the TokenRefreshError
-// interface. If err is a DetailedError it will walk the chain of Original errors.
-func IsTokenRefreshError(err error) bool {
- if _, ok := err.(adal.TokenRefreshError); ok {
- return true
- }
- if de, ok := err.(DetailedError); ok {
- return IsTokenRefreshError(de.Original)
- }
- return false
-}
diff --git a/vendor/github.com/Azure/go-autorest/autorest/version.go b/vendor/github.com/Azure/go-autorest/autorest/version.go
deleted file mode 100644
index 713e23581d..0000000000
--- a/vendor/github.com/Azure/go-autorest/autorest/version.go
+++ /dev/null
@@ -1,41 +0,0 @@
-package autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "fmt"
- "runtime"
-)
-
-const number = "v14.2.1"
-
-var (
- userAgent = fmt.Sprintf("Go/%s (%s-%s) go-autorest/%s",
- runtime.Version(),
- runtime.GOARCH,
- runtime.GOOS,
- number,
- )
-)
-
-// UserAgent returns a string containing the Go version, system architecture and OS, and the go-autorest version.
-func UserAgent() string {
- return userAgent
-}
-
-// Version returns the semantic version (see http://semver.org).
-func Version() string {
- return number
-}
diff --git a/vendor/github.com/Azure/go-autorest/azure-pipelines.yml b/vendor/github.com/Azure/go-autorest/azure-pipelines.yml
deleted file mode 100644
index 6fb8404fd0..0000000000
--- a/vendor/github.com/Azure/go-autorest/azure-pipelines.yml
+++ /dev/null
@@ -1,105 +0,0 @@
-variables:
- GOPATH: '$(system.defaultWorkingDirectory)/work'
- sdkPath: '$(GOPATH)/src/github.com/$(build.repository.name)'
-
-jobs:
- - job: 'goautorest'
- displayName: 'Run go-autorest CI Checks'
-
- strategy:
- matrix:
- Linux_Go113:
- vm.image: 'ubuntu-18.04'
- go.version: '1.13'
- Linux_Go114:
- vm.image: 'ubuntu-18.04'
- go.version: '1.14'
-
- pool:
- vmImage: '$(vm.image)'
-
- steps:
- - task: GoTool@0
- inputs:
- version: '$(go.version)'
- displayName: "Select Go Version"
-
- - script: |
- set -e
- mkdir -p '$(GOPATH)/bin'
- mkdir -p '$(sdkPath)'
- shopt -s extglob
- mv !(work) '$(sdkPath)'
- echo '##vso[task.prependpath]$(GOPATH)/bin'
- displayName: 'Create Go Workspace'
-
- - script: |
- set -e
- curl -sSL https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
- dep ensure -v
- go install ./vendor/golang.org/x/lint/golint
- go get github.com/jstemmer/go-junit-report
- go get github.com/axw/gocov/gocov
- go get github.com/AlekSi/gocov-xml
- go get -u github.com/matm/gocov-html
- workingDirectory: '$(sdkPath)'
- displayName: 'Install Dependencies'
-
- - script: |
- go vet ./autorest/...
- go vet ./logger/...
- go vet ./tracing/...
- workingDirectory: '$(sdkPath)'
- displayName: 'Vet'
-
- - script: |
- go build -v ./autorest/...
- go build -v ./logger/...
- go build -v ./tracing/...
- workingDirectory: '$(sdkPath)'
- displayName: 'Build'
-
- - script: |
- set -e
- go test -race -v -coverprofile=coverage.txt -covermode atomic ./autorest/... ./logger/... ./tracing/... 2>&1 | go-junit-report > report.xml
- gocov convert coverage.txt > coverage.json
- gocov-xml < coverage.json > coverage.xml
- gocov-html < coverage.json > coverage.html
- workingDirectory: '$(sdkPath)'
- displayName: 'Run Tests'
-
- - script: grep -L -r --include *.go --exclude-dir vendor -P "Copyright (\d{4}|\(c\)) Microsoft" ./ | tee >&2
- workingDirectory: '$(sdkPath)'
- displayName: 'Copyright Header Check'
- failOnStderr: true
- condition: succeededOrFailed()
-
- - script: |
- gofmt -s -l -w ./autorest/. >&2
- gofmt -s -l -w ./logger/. >&2
- gofmt -s -l -w ./tracing/. >&2
- workingDirectory: '$(sdkPath)'
- displayName: 'Format Check'
- failOnStderr: true
- condition: succeededOrFailed()
-
- - script: |
- golint ./autorest/... >&2
- golint ./logger/... >&2
- golint ./tracing/... >&2
- workingDirectory: '$(sdkPath)'
- displayName: 'Linter Check'
- failOnStderr: true
- condition: succeededOrFailed()
-
- - task: PublishTestResults@2
- inputs:
- testRunner: JUnit
- testResultsFiles: $(sdkPath)/report.xml
- failTaskOnFailedTests: true
-
- - task: PublishCodeCoverageResults@1
- inputs:
- codeCoverageTool: Cobertura
- summaryFileLocation: $(sdkPath)/coverage.xml
- additionalCodeCoverageFiles: $(sdkPath)/coverage.html
diff --git a/vendor/github.com/Azure/go-autorest/doc.go b/vendor/github.com/Azure/go-autorest/doc.go
deleted file mode 100644
index 99ae6ca988..0000000000
--- a/vendor/github.com/Azure/go-autorest/doc.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
-Package go-autorest provides an HTTP request client for use with Autorest-generated API client packages.
-*/
-package go_autorest
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/logger/LICENSE b/vendor/github.com/Azure/go-autorest/logger/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/logger/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go
deleted file mode 100644
index 0aa27680db..0000000000
--- a/vendor/github.com/Azure/go-autorest/logger/go_mod_tidy_hack.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build modhack
-
-package logger
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file, and the github.com/Azure/go-autorest import, won't actually become part of
-// the resultant binary.
-
-// Necessary for safely adding multi-module repo.
-// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
-import _ "github.com/Azure/go-autorest"
diff --git a/vendor/github.com/Azure/go-autorest/logger/logger.go b/vendor/github.com/Azure/go-autorest/logger/logger.go
deleted file mode 100644
index 2f5d8cc1a1..0000000000
--- a/vendor/github.com/Azure/go-autorest/logger/logger.go
+++ /dev/null
@@ -1,337 +0,0 @@
-package logger
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "net/http"
- "net/url"
- "os"
- "strings"
- "sync"
- "time"
-)
-
-// LevelType tells a logger the minimum level to log. When code reports a log entry,
-// the LogLevel indicates the level of the log entry. The logger only records entries
-// whose level is at least the level it was told to log. See the Log* constants.
-// For example, if a logger is configured with LogError, then LogError, LogPanic,
-// and LogFatal entries will be logged; lower level entries are ignored.
-type LevelType uint32
-
-const (
- // LogNone tells a logger not to log any entries passed to it.
- LogNone LevelType = iota
-
- // LogFatal tells a logger to log all LogFatal entries passed to it.
- LogFatal
-
- // LogPanic tells a logger to log all LogPanic and LogFatal entries passed to it.
- LogPanic
-
- // LogError tells a logger to log all LogError, LogPanic and LogFatal entries passed to it.
- LogError
-
- // LogWarning tells a logger to log all LogWarning, LogError, LogPanic and LogFatal entries passed to it.
- LogWarning
-
- // LogInfo tells a logger to log all LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
- LogInfo
-
- // LogDebug tells a logger to log all LogDebug, LogInfo, LogWarning, LogError, LogPanic and LogFatal entries passed to it.
- LogDebug
-
- // LogAuth is a special case of LogDebug, it tells a logger to also log the body of an authentication request and response.
- // NOTE: this can disclose sensitive information, use with care.
- LogAuth
-)
-
-const (
- logNone = "NONE"
- logFatal = "FATAL"
- logPanic = "PANIC"
- logError = "ERROR"
- logWarning = "WARNING"
- logInfo = "INFO"
- logDebug = "DEBUG"
- logAuth = "AUTH"
- logUnknown = "UNKNOWN"
-)
-
-// ParseLevel converts the specified string into the corresponding LevelType.
-func ParseLevel(s string) (lt LevelType, err error) {
- switch strings.ToUpper(s) {
- case logFatal:
- lt = LogFatal
- case logPanic:
- lt = LogPanic
- case logError:
- lt = LogError
- case logWarning:
- lt = LogWarning
- case logInfo:
- lt = LogInfo
- case logDebug:
- lt = LogDebug
- case logAuth:
- lt = LogAuth
- default:
- err = fmt.Errorf("bad log level '%s'", s)
- }
- return
-}
-
-// String implements the stringer interface for LevelType.
-func (lt LevelType) String() string {
- switch lt {
- case LogNone:
- return logNone
- case LogFatal:
- return logFatal
- case LogPanic:
- return logPanic
- case LogError:
- return logError
- case LogWarning:
- return logWarning
- case LogInfo:
- return logInfo
- case LogDebug:
- return logDebug
- case LogAuth:
- return logAuth
- default:
- return logUnknown
- }
-}
-
-// Filter defines functions for filtering HTTP request/response content.
-type Filter struct {
- // URL returns a potentially modified string representation of a request URL.
- URL func(u *url.URL) string
-
- // Header returns a potentially modified set of values for the specified key.
- // To completely exclude the header key/values return false.
- Header func(key string, val []string) (bool, []string)
-
- // Body returns a potentially modified request/response body.
- Body func(b []byte) []byte
-}
-
-func (f Filter) processURL(u *url.URL) string {
- if f.URL == nil {
- return u.String()
- }
- return f.URL(u)
-}
-
-func (f Filter) processHeader(k string, val []string) (bool, []string) {
- if f.Header == nil {
- return true, val
- }
- return f.Header(k, val)
-}
-
-func (f Filter) processBody(b []byte) []byte {
- if f.Body == nil {
- return b
- }
- return f.Body(b)
-}
-
-// Writer defines methods for writing to a logging facility.
-type Writer interface {
- // Writeln writes the specified message with the standard log entry header and new-line character.
- Writeln(level LevelType, message string)
-
- // Writef writes the specified format specifier with the standard log entry header and no new-line character.
- Writef(level LevelType, format string, a ...interface{})
-
- // WriteRequest writes the specified HTTP request to the logger if the log level is greater than
- // or equal to LogInfo. The request body, if set, is logged at level LogDebug or higher.
- // Custom filters can be specified to exclude URL, header, and/or body content from the log.
- // By default no request content is excluded.
- WriteRequest(req *http.Request, filter Filter)
-
- // WriteResponse writes the specified HTTP response to the logger if the log level is greater than
- // or equal to LogInfo. The response body, if set, is logged at level LogDebug or higher.
- // Custom filters can be specified to exclude URL, header, and/or body content from the log.
- // By default no response content is excluded.
- WriteResponse(resp *http.Response, filter Filter)
-}
-
-// Instance is the default log writer initialized during package init.
-// This can be replaced with a custom implementation as required.
-var Instance Writer
-
-// default log level
-var logLevel = LogNone
-
-// Level returns the value specified in AZURE_GO_AUTOREST_LOG_LEVEL.
-// If no value was specified the default value is LogNone.
-// Custom loggers can call this to retrieve the configured log level.
-func Level() LevelType {
- return logLevel
-}
-
-func init() {
- // separated for testing purposes
- initDefaultLogger()
-}
-
-func initDefaultLogger() {
- // init with nilLogger so callers don't have to do a nil check on Default
- Instance = nilLogger{}
- llStr := strings.ToLower(os.Getenv("AZURE_GO_SDK_LOG_LEVEL"))
- if llStr == "" {
- return
- }
- var err error
- logLevel, err = ParseLevel(llStr)
- if err != nil {
- fmt.Fprintf(os.Stderr, "go-autorest: failed to parse log level: %s\n", err.Error())
- return
- }
- if logLevel == LogNone {
- return
- }
- // default to stderr
- dest := os.Stderr
- lfStr := os.Getenv("AZURE_GO_SDK_LOG_FILE")
- if strings.EqualFold(lfStr, "stdout") {
- dest = os.Stdout
- } else if lfStr != "" {
- lf, err := os.Create(lfStr)
- if err == nil {
- dest = lf
- } else {
- fmt.Fprintf(os.Stderr, "go-autorest: failed to create log file, using stderr: %s\n", err.Error())
- }
- }
- Instance = fileLogger{
- logLevel: logLevel,
- mu: &sync.Mutex{},
- logFile: dest,
- }
-}
-
-// the nil logger does nothing
-type nilLogger struct{}
-
-func (nilLogger) Writeln(LevelType, string) {}
-
-func (nilLogger) Writef(LevelType, string, ...interface{}) {}
-
-func (nilLogger) WriteRequest(*http.Request, Filter) {}
-
-func (nilLogger) WriteResponse(*http.Response, Filter) {}
-
-// A File is used instead of a Logger so the stream can be flushed after every write.
-type fileLogger struct {
- logLevel LevelType
- mu *sync.Mutex // for synchronizing writes to logFile
- logFile *os.File
-}
-
-func (fl fileLogger) Writeln(level LevelType, message string) {
- fl.Writef(level, "%s\n", message)
-}
-
-func (fl fileLogger) Writef(level LevelType, format string, a ...interface{}) {
- if fl.logLevel >= level {
- fl.mu.Lock()
- defer fl.mu.Unlock()
- fmt.Fprintf(fl.logFile, "%s %s", entryHeader(level), fmt.Sprintf(format, a...))
- fl.logFile.Sync()
- }
-}
-
-func (fl fileLogger) WriteRequest(req *http.Request, filter Filter) {
- if req == nil || fl.logLevel < LogInfo {
- return
- }
- b := &bytes.Buffer{}
- fmt.Fprintf(b, "%s REQUEST: %s %s\n", entryHeader(LogInfo), req.Method, filter.processURL(req.URL))
- // dump headers
- for k, v := range req.Header {
- if ok, mv := filter.processHeader(k, v); ok {
- fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
- }
- }
- if fl.shouldLogBody(req.Header, req.Body) {
- // dump body
- body, err := ioutil.ReadAll(req.Body)
- if err == nil {
- fmt.Fprintln(b, string(filter.processBody(body)))
- if nc, ok := req.Body.(io.Seeker); ok {
- // rewind to the beginning
- nc.Seek(0, io.SeekStart)
- } else {
- // recreate the body
- req.Body = ioutil.NopCloser(bytes.NewReader(body))
- }
- } else {
- fmt.Fprintf(b, "failed to read body: %v\n", err)
- }
- }
- fl.mu.Lock()
- defer fl.mu.Unlock()
- fmt.Fprint(fl.logFile, b.String())
- fl.logFile.Sync()
-}
-
-func (fl fileLogger) WriteResponse(resp *http.Response, filter Filter) {
- if resp == nil || fl.logLevel < LogInfo {
- return
- }
- b := &bytes.Buffer{}
- fmt.Fprintf(b, "%s RESPONSE: %d %s\n", entryHeader(LogInfo), resp.StatusCode, filter.processURL(resp.Request.URL))
- // dump headers
- for k, v := range resp.Header {
- if ok, mv := filter.processHeader(k, v); ok {
- fmt.Fprintf(b, "%s: %s\n", k, strings.Join(mv, ","))
- }
- }
- if fl.shouldLogBody(resp.Header, resp.Body) {
- // dump body
- defer resp.Body.Close()
- body, err := ioutil.ReadAll(resp.Body)
- if err == nil {
- fmt.Fprintln(b, string(filter.processBody(body)))
- resp.Body = ioutil.NopCloser(bytes.NewReader(body))
- } else {
- fmt.Fprintf(b, "failed to read body: %v\n", err)
- }
- }
- fl.mu.Lock()
- defer fl.mu.Unlock()
- fmt.Fprint(fl.logFile, b.String())
- fl.logFile.Sync()
-}
-
-// returns true if the provided body should be included in the log
-func (fl fileLogger) shouldLogBody(header http.Header, body io.ReadCloser) bool {
- ct := header.Get("Content-Type")
- return fl.logLevel >= LogDebug && body != nil && !strings.Contains(ct, "application/octet-stream")
-}
-
-// creates standard header for log entries, it contains a timestamp and the log level
-func entryHeader(level LevelType) string {
- // this format provides a fixed number of digits so the size of the timestamp is constant
- return fmt.Sprintf("(%s) %s:", time.Now().Format("2006-01-02T15:04:05.0000000Z07:00"), level.String())
-}
diff --git a/vendor/github.com/Azure/go-autorest/tracing/LICENSE b/vendor/github.com/Azure/go-autorest/tracing/LICENSE
deleted file mode 100644
index b9d6a27ea9..0000000000
--- a/vendor/github.com/Azure/go-autorest/tracing/LICENSE
+++ /dev/null
@@ -1,191 +0,0 @@
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- Copyright 2015 Microsoft Corporation
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go b/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go
deleted file mode 100644
index e163975cd4..0000000000
--- a/vendor/github.com/Azure/go-autorest/tracing/go_mod_tidy_hack.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// +build modhack
-
-package tracing
-
-// Copyright 2017 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-// This file, and the github.com/Azure/go-autorest import, won't actually become part of
-// the resultant binary.
-
-// Necessary for safely adding multi-module repo.
-// See: https://github.com/golang/go/wiki/Modules#is-it-possible-to-add-a-module-to-a-multi-module-repository
-import _ "github.com/Azure/go-autorest"
diff --git a/vendor/github.com/Azure/go-autorest/tracing/tracing.go b/vendor/github.com/Azure/go-autorest/tracing/tracing.go
deleted file mode 100644
index 0e7a6e9625..0000000000
--- a/vendor/github.com/Azure/go-autorest/tracing/tracing.go
+++ /dev/null
@@ -1,67 +0,0 @@
-package tracing
-
-// Copyright 2018 Microsoft Corporation
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-import (
- "context"
- "net/http"
-)
-
-// Tracer represents an HTTP tracing facility.
-type Tracer interface {
- NewTransport(base *http.Transport) http.RoundTripper
- StartSpan(ctx context.Context, name string) context.Context
- EndSpan(ctx context.Context, httpStatusCode int, err error)
-}
-
-var (
- tracer Tracer
-)
-
-// Register will register the provided Tracer. Pass nil to unregister a Tracer.
-func Register(t Tracer) {
- tracer = t
-}
-
-// IsEnabled returns true if a Tracer has been registered.
-func IsEnabled() bool {
- return tracer != nil
-}
-
-// NewTransport creates a new instrumenting http.RoundTripper for the
-// registered Tracer. If no Tracer has been registered it returns nil.
-func NewTransport(base *http.Transport) http.RoundTripper {
- if tracer != nil {
- return tracer.NewTransport(base)
- }
- return nil
-}
-
-// StartSpan starts a trace span with the specified name, associating it with the
-// provided context. Has no effect if a Tracer has not been registered.
-func StartSpan(ctx context.Context, name string) context.Context {
- if tracer != nil {
- return tracer.StartSpan(ctx, name)
- }
- return ctx
-}
-
-// EndSpan ends a previously started span stored in the context.
-// Has no effect if a Tracer has not been registered.
-func EndSpan(ctx context.Context, httpStatusCode int, err error) {
- if tracer != nil {
- tracer.EndSpan(ctx, httpStatusCode, err)
- }
-}
diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore
index cd11be9653..fe79e3adda 100644
--- a/vendor/github.com/BurntSushi/toml/.gitignore
+++ b/vendor/github.com/BurntSushi/toml/.gitignore
@@ -1,2 +1,2 @@
-toml.test
+/toml.test
/toml-test
diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE
deleted file mode 100644
index f621b01196..0000000000
--- a/vendor/github.com/BurntSushi/toml/COMPATIBLE
+++ /dev/null
@@ -1 +0,0 @@
-Compatible with TOML version [v1.0.0](https://toml.io/en/v1.0.0).
diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md
index cc13f8667f..3651cfa960 100644
--- a/vendor/github.com/BurntSushi/toml/README.md
+++ b/vendor/github.com/BurntSushi/toml/README.md
@@ -1,6 +1,5 @@
TOML stands for Tom's Obvious, Minimal Language. This Go package provides a
-reflection interface similar to Go's standard library `json` and `xml`
-packages.
+reflection interface similar to Go's standard library `json` and `xml` packages.
Compatible with TOML version [v1.0.0](https://toml.io/en/v1.0.0).
@@ -10,7 +9,7 @@ See the [releases page](https://github.com/BurntSushi/toml/releases) for a
changelog; this information is also in the git tag annotations (e.g. `git show
v0.4.0`).
-This library requires Go 1.13 or newer; install it with:
+This library requires Go 1.13 or newer; add it to your go.mod with:
% go get github.com/BurntSushi/toml@latest
@@ -19,16 +18,7 @@ It also comes with a TOML validator CLI tool:
% go install github.com/BurntSushi/toml/cmd/tomlv@latest
% tomlv some-toml-file.toml
-### Testing
-This package passes all tests in [toml-test] for both the decoder and the
-encoder.
-
-[toml-test]: https://github.com/BurntSushi/toml-test
-
### Examples
-This package works similar to how the Go standard library handles XML and JSON.
-Namely, data is loaded into Go values via reflection.
-
For the simplest example, consider some TOML file as just a list of keys and
values:
@@ -40,7 +30,7 @@ Perfection = [ 6, 28, 496, 8128 ]
DOB = 1987-07-05T05:45:00Z
```
-Which could be defined in Go as:
+Which can be decoded with:
```go
type Config struct {
@@ -48,20 +38,15 @@ type Config struct {
Cats []string
Pi float64
Perfection []int
- DOB time.Time // requires `import time`
+ DOB time.Time
}
-```
-
-And then decoded with:
-```go
var conf Config
-err := toml.Decode(tomlData, &conf)
-// handle error
+_, err := toml.Decode(tomlData, &conf)
```
-You can also use struct tags if your struct field name doesn't map to a TOML
-key value directly:
+You can also use struct tags if your struct field name doesn't map to a TOML key
+value directly:
```toml
some_key_NAME = "wat"
@@ -73,139 +58,63 @@ type TOML struct {
}
```
-Beware that like other most other decoders **only exported fields** are
-considered when encoding and decoding; private fields are silently ignored.
+Beware that like other decoders **only exported fields** are considered when
+encoding and decoding; private fields are silently ignored.
### Using the `Marshaler` and `encoding.TextUnmarshaler` interfaces
-Here's an example that automatically parses duration strings into
-`time.Duration` values:
+Here's an example that automatically parses values in a `mail.Address`:
```toml
-[[song]]
-name = "Thunder Road"
-duration = "4m49s"
-
-[[song]]
-name = "Stairway to Heaven"
-duration = "8m03s"
-```
-
-Which can be decoded with:
-
-```go
-type song struct {
- Name string
- Duration duration
-}
-type songs struct {
- Song []song
-}
-var favorites songs
-if _, err := toml.Decode(blob, &favorites); err != nil {
- log.Fatal(err)
-}
-
-for _, s := range favorites.Song {
- fmt.Printf("%s (%s)\n", s.Name, s.Duration)
-}
+contacts = [
+ "Donald Duck ",
+ "Scrooge McDuck ",
+]
```
-And you'll also need a `duration` type that satisfies the
-`encoding.TextUnmarshaler` interface:
+Can be decoded with:
```go
-type duration struct {
- time.Duration
+// Create address type which satisfies the encoding.TextUnmarshaler interface.
+type address struct {
+ *mail.Address
}
-func (d *duration) UnmarshalText(text []byte) error {
+func (a *address) UnmarshalText(text []byte) error {
var err error
- d.Duration, err = time.ParseDuration(string(text))
+ a.Address, err = mail.ParseAddress(string(text))
return err
}
+
+// Decode it.
+func decode() {
+ blob := `
+ contacts = [
+ "Donald Duck ",
+ "Scrooge McDuck ",
+ ]
+ `
+
+ var contacts struct {
+ Contacts []address
+ }
+
+ _, err := toml.Decode(blob, &contacts)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ for _, c := range contacts.Contacts {
+ fmt.Printf("%#v\n", c.Address)
+ }
+
+ // Output:
+ // &mail.Address{Name:"Donald Duck", Address:"donald@duckburg.com"}
+ // &mail.Address{Name:"Scrooge McDuck", Address:"scrooge@duckburg.com"}
+}
```
To target TOML specifically you can implement `UnmarshalTOML` TOML interface in
a similar way.
### More complex usage
-Here's an example of how to load the example from the official spec page:
-
-```toml
-# This is a TOML document. Boom.
-
-title = "TOML Example"
-
-[owner]
-name = "Tom Preston-Werner"
-organization = "GitHub"
-bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
-dob = 1979-05-27T07:32:00Z # First class dates? Why not?
-
-[database]
-server = "192.168.1.1"
-ports = [ 8001, 8001, 8002 ]
-connection_max = 5000
-enabled = true
-
-[servers]
-
- # You can indent as you please. Tabs or spaces. TOML don't care.
- [servers.alpha]
- ip = "10.0.0.1"
- dc = "eqdc10"
-
- [servers.beta]
- ip = "10.0.0.2"
- dc = "eqdc10"
-
-[clients]
-data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
-
-# Line breaks are OK when inside arrays
-hosts = [
- "alpha",
- "omega"
-]
-```
-
-And the corresponding Go types are:
-
-```go
-type tomlConfig struct {
- Title string
- Owner ownerInfo
- DB database `toml:"database"`
- Servers map[string]server
- Clients clients
-}
-
-type ownerInfo struct {
- Name string
- Org string `toml:"organization"`
- Bio string
- DOB time.Time
-}
-
-type database struct {
- Server string
- Ports []int
- ConnMax int `toml:"connection_max"`
- Enabled bool
-}
-
-type server struct {
- IP string
- DC string
-}
-
-type clients struct {
- Data [][]interface{}
- Hosts []string
-}
-```
-
-Note that a case insensitive match will be tried if an exact match can't be
-found.
-
-A working example of the above can be found in `_example/example.{go,toml}`.
+See the [`_example/`](/_example) directory for a more complex example.
diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go
index e24f0c5d5c..0ca1dc4fee 100644
--- a/vendor/github.com/BurntSushi/toml/decode.go
+++ b/vendor/github.com/BurntSushi/toml/decode.go
@@ -1,14 +1,18 @@
package toml
import (
+ "bytes"
"encoding"
+ "encoding/json"
"fmt"
"io"
"io/ioutil"
"math"
"os"
"reflect"
+ "strconv"
"strings"
+ "time"
)
// Unmarshaler is the interface implemented by objects that can unmarshal a
@@ -17,16 +21,35 @@ type Unmarshaler interface {
UnmarshalTOML(interface{}) error
}
-// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`.
-func Unmarshal(p []byte, v interface{}) error {
- _, err := Decode(string(p), v)
+// Unmarshal decodes the contents of data in TOML format into a pointer v.
+//
+// See [Decoder] for a description of the decoding process.
+func Unmarshal(data []byte, v interface{}) error {
+ _, err := NewDecoder(bytes.NewReader(data)).Decode(v)
return err
}
+// Decode the TOML data in to the pointer v.
+//
+// See [Decoder] for a description of the decoding process.
+func Decode(data string, v interface{}) (MetaData, error) {
+ return NewDecoder(strings.NewReader(data)).Decode(v)
+}
+
+// DecodeFile reads the contents of a file and decodes it with [Decode].
+func DecodeFile(path string, v interface{}) (MetaData, error) {
+ fp, err := os.Open(path)
+ if err != nil {
+ return MetaData{}, err
+ }
+ defer fp.Close()
+ return NewDecoder(fp).Decode(v)
+}
+
// Primitive is a TOML value that hasn't been decoded into a Go value.
//
// This type can be used for any value, which will cause decoding to be delayed.
-// You can use the PrimitiveDecode() function to "manually" decode these values.
+// You can use [PrimitiveDecode] to "manually" decode these values.
//
// NOTE: The underlying representation of a `Primitive` value is subject to
// change. Do not rely on it.
@@ -42,36 +65,22 @@ type Primitive struct {
// The significand precision for float32 and float64 is 24 and 53 bits; this is
// the range a natural number can be stored in a float without loss of data.
const (
- maxSafeFloat32Int = 16777215 // 2^24-1
- maxSafeFloat64Int = 9007199254740991 // 2^53-1
+ maxSafeFloat32Int = 16777215 // 2^24-1
+ maxSafeFloat64Int = int64(9007199254740991) // 2^53-1
)
-// PrimitiveDecode is just like the other `Decode*` functions, except it
-// decodes a TOML value that has already been parsed. Valid primitive values
-// can *only* be obtained from values filled by the decoder functions,
-// including this method. (i.e., `v` may contain more `Primitive`
-// values.)
-//
-// Meta data for primitive values is included in the meta data returned by
-// the `Decode*` functions with one exception: keys returned by the Undecoded
-// method will only reflect keys that were decoded. Namely, any keys hidden
-// behind a Primitive will be considered undecoded. Executing this method will
-// update the undecoded keys in the meta data. (See the example.)
-func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
- md.context = primValue.context
- defer func() { md.context = nil }()
- return md.unify(primValue.undecoded, rvalue(v))
-}
-
// Decoder decodes TOML data.
//
-// TOML tables correspond to Go structs or maps (dealer's choice – they can be
-// used interchangeably).
+// TOML tables correspond to Go structs or maps; they can be used
+// interchangeably, but structs offer better type safety.
//
// TOML table arrays correspond to either a slice of structs or a slice of maps.
//
-// TOML datetimes correspond to Go time.Time values. Local datetimes are parsed
-// in the local timezone.
+// TOML datetimes correspond to [time.Time]. Local datetimes are parsed in the
+// local timezone.
+//
+// [time.Duration] types are treated as nanoseconds if the TOML value is an
+// integer, or they're parsed with time.ParseDuration() if they're strings.
//
// All other TOML types (float, string, int, bool and array) correspond to the
// obvious Go types.
@@ -80,9 +89,9 @@ func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
// interface, in which case any primitive TOML value (floats, strings, integers,
// booleans, datetimes) will be converted to a []byte and given to the value's
// UnmarshalText method. See the Unmarshaler example for a demonstration with
-// time duration strings.
+// email addresses.
//
-// Key mapping
+// ### Key mapping
//
// TOML keys can map to either keys in a Go map or field names in a Go struct.
// The special `toml` struct tag can be used to map TOML keys to struct fields
@@ -109,6 +118,7 @@ func NewDecoder(r io.Reader) *Decoder {
var (
unmarshalToml = reflect.TypeOf((*Unmarshaler)(nil)).Elem()
unmarshalText = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem()
+ primitiveType = reflect.TypeOf((*Primitive)(nil)).Elem()
)
// Decode TOML data in to the pointer `v`.
@@ -120,10 +130,10 @@ func (dec *Decoder) Decode(v interface{}) (MetaData, error) {
s = "%v"
}
- return MetaData{}, e("cannot decode to non-pointer "+s, reflect.TypeOf(v))
+ return MetaData{}, fmt.Errorf("toml: cannot decode to non-pointer "+s, reflect.TypeOf(v))
}
if rv.IsNil() {
- return MetaData{}, e("cannot decode to nil value of %q", reflect.TypeOf(v))
+ return MetaData{}, fmt.Errorf("toml: cannot decode to nil value of %q", reflect.TypeOf(v))
}
// Check if this is a supported type: struct, map, interface{}, or something
@@ -133,7 +143,7 @@ func (dec *Decoder) Decode(v interface{}) (MetaData, error) {
if rv.Kind() != reflect.Struct && rv.Kind() != reflect.Map &&
!(rv.Kind() == reflect.Interface && rv.NumMethod() == 0) &&
!rt.Implements(unmarshalToml) && !rt.Implements(unmarshalText) {
- return MetaData{}, e("cannot decode to type %s", rt)
+ return MetaData{}, fmt.Errorf("toml: cannot decode to type %s", rt)
}
// TODO: parser should read from io.Reader? Or at the very least, make it
@@ -150,30 +160,29 @@ func (dec *Decoder) Decode(v interface{}) (MetaData, error) {
md := MetaData{
mapping: p.mapping,
- types: p.types,
+ keyInfo: p.keyInfo,
keys: p.ordered,
decoded: make(map[string]struct{}, len(p.ordered)),
context: nil,
+ data: data,
}
return md, md.unify(p.mapping, rv)
}
-// Decode the TOML data in to the pointer v.
+// PrimitiveDecode is just like the other Decode* functions, except it decodes a
+// TOML value that has already been parsed. Valid primitive values can *only* be
+// obtained from values filled by the decoder functions, including this method.
+// (i.e., v may contain more [Primitive] values.)
//
-// See the documentation on Decoder for a description of the decoding process.
-func Decode(data string, v interface{}) (MetaData, error) {
- return NewDecoder(strings.NewReader(data)).Decode(v)
-}
-
-// DecodeFile is just like Decode, except it will automatically read the
-// contents of the file at path and decode it for you.
-func DecodeFile(path string, v interface{}) (MetaData, error) {
- fp, err := os.Open(path)
- if err != nil {
- return MetaData{}, err
- }
- defer fp.Close()
- return NewDecoder(fp).Decode(v)
+// Meta data for primitive values is included in the meta data returned by the
+// Decode* functions with one exception: keys returned by the Undecoded method
+// will only reflect keys that were decoded. Namely, any keys hidden behind a
+// Primitive will be considered undecoded. Executing this method will update the
+// undecoded keys in the meta data. (See the example.)
+func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
+ md.context = primValue.context
+ defer func() { md.context = nil }()
+ return md.unify(primValue.undecoded, rvalue(v))
}
// unify performs a sort of type unification based on the structure of `rv`,
@@ -184,7 +193,7 @@ func DecodeFile(path string, v interface{}) (MetaData, error) {
func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
// Special case. Look for a `Primitive` value.
// TODO: #76 would make this superfluous after implemented.
- if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() {
+ if rv.Type() == primitiveType {
// Save the undecoded data and the key context into the primitive
// value.
context := make(Key, len(md.context))
@@ -196,17 +205,14 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
return nil
}
- // Special case. Unmarshaler Interface support.
- if rv.CanAddr() {
- if v, ok := rv.Addr().Interface().(Unmarshaler); ok {
- return v.UnmarshalTOML(data)
- }
+ rvi := rv.Interface()
+ if v, ok := rvi.(Unmarshaler); ok {
+ return v.UnmarshalTOML(data)
}
-
- // Special case. Look for a value satisfying the TextUnmarshaler interface.
- if v, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
+ if v, ok := rvi.(encoding.TextUnmarshaler); ok {
return md.unifyText(data, v)
}
+
// TODO:
// The behavior here is incorrect whenever a Go type satisfies the
// encoding.TextUnmarshaler interface but also corresponds to a TOML hash or
@@ -217,7 +223,6 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
k := rv.Kind()
- // laziness
if k >= reflect.Int && k <= reflect.Uint64 {
return md.unifyInt(data, rv)
}
@@ -243,15 +248,14 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
case reflect.Bool:
return md.unifyBool(data, rv)
case reflect.Interface:
- // we only support empty interfaces.
- if rv.NumMethod() > 0 {
- return e("unsupported type %s", rv.Type())
+ if rv.NumMethod() > 0 { // Only support empty interfaces are supported.
+ return md.e("unsupported type %s", rv.Type())
}
return md.unifyAnything(data, rv)
case reflect.Float32, reflect.Float64:
return md.unifyFloat64(data, rv)
}
- return e("unsupported type %s", rv.Kind())
+ return md.e("unsupported type %s", rv.Kind())
}
func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
@@ -260,7 +264,7 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
if mapping == nil {
return nil
}
- return e("type mismatch for %s: expected table but found %T",
+ return md.e("type mismatch for %s: expected table but found %T",
rv.Type().String(), mapping)
}
@@ -286,13 +290,14 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
if isUnifiable(subv) {
md.decoded[md.context.add(key).String()] = struct{}{}
md.context = append(md.context, key)
+
err := md.unify(datum, subv)
if err != nil {
return err
}
md.context = md.context[0 : len(md.context)-1]
} else if f.name != "" {
- return e("cannot write unexported field %s.%s", rv.Type().String(), f.name)
+ return md.e("cannot write unexported field %s.%s", rv.Type().String(), f.name)
}
}
}
@@ -300,10 +305,10 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
}
func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
- if k := rv.Type().Key().Kind(); k != reflect.String {
- return fmt.Errorf(
- "toml: cannot decode to a map with non-string key type (%s in %q)",
- k, rv.Type())
+ keyType := rv.Type().Key().Kind()
+ if keyType != reflect.String && keyType != reflect.Interface {
+ return fmt.Errorf("toml: cannot decode to a map with non-string key type (%s in %q)",
+ keyType, rv.Type())
}
tmap, ok := mapping.(map[string]interface{})
@@ -321,13 +326,22 @@ func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
md.context = append(md.context, k)
rvval := reflect.Indirect(reflect.New(rv.Type().Elem()))
- if err := md.unify(v, rvval); err != nil {
+
+ err := md.unify(v, indirect(rvval))
+ if err != nil {
return err
}
md.context = md.context[0 : len(md.context)-1]
rvkey := indirect(reflect.New(rv.Type().Key()))
- rvkey.SetString(k)
+
+ switch keyType {
+ case reflect.Interface:
+ rvkey.Set(reflect.ValueOf(k))
+ case reflect.String:
+ rvkey.SetString(k)
+ }
+
rv.SetMapIndex(rvkey, rvval)
}
return nil
@@ -342,7 +356,7 @@ func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
return md.badtype("slice", data)
}
if l := datav.Len(); l != rv.Len() {
- return e("expected array length %d; got TOML array of length %d", rv.Len(), l)
+ return md.e("expected array length %d; got TOML array of length %d", rv.Len(), l)
}
return md.unifySliceArray(datav, rv)
}
@@ -375,6 +389,18 @@ func (md *MetaData) unifySliceArray(data, rv reflect.Value) error {
}
func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error {
+ _, ok := rv.Interface().(json.Number)
+ if ok {
+ if i, ok := data.(int64); ok {
+ rv.SetString(strconv.FormatInt(i, 10))
+ } else if f, ok := data.(float64); ok {
+ rv.SetString(strconv.FormatFloat(f, 'f', -1, 64))
+ } else {
+ return md.badtype("string", data)
+ }
+ return nil
+ }
+
if s, ok := data.(string); ok {
rv.SetString(s)
return nil
@@ -383,11 +409,13 @@ func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error {
}
func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
+ rvk := rv.Kind()
+
if num, ok := data.(float64); ok {
- switch rv.Kind() {
+ switch rvk {
case reflect.Float32:
if num < -math.MaxFloat32 || num > math.MaxFloat32 {
- return e("value %f is out of range for float32", num)
+ return md.parseErr(errParseRange{i: num, size: rvk.String()})
}
fallthrough
case reflect.Float64:
@@ -399,20 +427,11 @@ func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
}
if num, ok := data.(int64); ok {
- switch rv.Kind() {
- case reflect.Float32:
- if num < -maxSafeFloat32Int || num > maxSafeFloat32Int {
- return e("value %d is out of range for float32", num)
- }
- fallthrough
- case reflect.Float64:
- if num < -maxSafeFloat64Int || num > maxSafeFloat64Int {
- return e("value %d is out of range for float64", num)
- }
- rv.SetFloat(float64(num))
- default:
- panic("bug")
+ if (rvk == reflect.Float32 && (num < -maxSafeFloat32Int || num > maxSafeFloat32Int)) ||
+ (rvk == reflect.Float64 && (num < -maxSafeFloat64Int || num > maxSafeFloat64Int)) {
+ return md.parseErr(errParseRange{i: num, size: rvk.String()})
}
+ rv.SetFloat(float64(num))
return nil
}
@@ -420,50 +439,46 @@ func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
}
func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
- if num, ok := data.(int64); ok {
- if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 {
- switch rv.Kind() {
- case reflect.Int, reflect.Int64:
- // No bounds checking necessary.
- case reflect.Int8:
- if num < math.MinInt8 || num > math.MaxInt8 {
- return e("value %d is out of range for int8", num)
- }
- case reflect.Int16:
- if num < math.MinInt16 || num > math.MaxInt16 {
- return e("value %d is out of range for int16", num)
- }
- case reflect.Int32:
- if num < math.MinInt32 || num > math.MaxInt32 {
- return e("value %d is out of range for int32", num)
- }
+ _, ok := rv.Interface().(time.Duration)
+ if ok {
+ // Parse as string duration, and fall back to regular integer parsing
+ // (as nanosecond) if this is not a string.
+ if s, ok := data.(string); ok {
+ dur, err := time.ParseDuration(s)
+ if err != nil {
+ return md.parseErr(errParseDuration{s})
}
- rv.SetInt(num)
- } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 {
- unum := uint64(num)
- switch rv.Kind() {
- case reflect.Uint, reflect.Uint64:
- // No bounds checking necessary.
- case reflect.Uint8:
- if num < 0 || unum > math.MaxUint8 {
- return e("value %d is out of range for uint8", num)
- }
- case reflect.Uint16:
- if num < 0 || unum > math.MaxUint16 {
- return e("value %d is out of range for uint16", num)
- }
- case reflect.Uint32:
- if num < 0 || unum > math.MaxUint32 {
- return e("value %d is out of range for uint32", num)
- }
- }
- rv.SetUint(unum)
- } else {
- panic("unreachable")
+ rv.SetInt(int64(dur))
+ return nil
}
- return nil
}
- return md.badtype("integer", data)
+
+ num, ok := data.(int64)
+ if !ok {
+ return md.badtype("integer", data)
+ }
+
+ rvk := rv.Kind()
+ switch {
+ case rvk >= reflect.Int && rvk <= reflect.Int64:
+ if (rvk == reflect.Int8 && (num < math.MinInt8 || num > math.MaxInt8)) ||
+ (rvk == reflect.Int16 && (num < math.MinInt16 || num > math.MaxInt16)) ||
+ (rvk == reflect.Int32 && (num < math.MinInt32 || num > math.MaxInt32)) {
+ return md.parseErr(errParseRange{i: num, size: rvk.String()})
+ }
+ rv.SetInt(num)
+ case rvk >= reflect.Uint && rvk <= reflect.Uint64:
+ unum := uint64(num)
+ if rvk == reflect.Uint8 && (num < 0 || unum > math.MaxUint8) ||
+ rvk == reflect.Uint16 && (num < 0 || unum > math.MaxUint16) ||
+ rvk == reflect.Uint32 && (num < 0 || unum > math.MaxUint32) {
+ return md.parseErr(errParseRange{i: num, size: rvk.String()})
+ }
+ rv.SetUint(unum)
+ default:
+ panic("unreachable")
+ }
+ return nil
}
func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error {
@@ -488,7 +503,7 @@ func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) erro
return err
}
s = string(text)
- case TextMarshaler:
+ case encoding.TextMarshaler:
text, err := sdata.MarshalText()
if err != nil {
return err
@@ -514,7 +529,30 @@ func (md *MetaData) unifyText(data interface{}, v encoding.TextUnmarshaler) erro
}
func (md *MetaData) badtype(dst string, data interface{}) error {
- return e("incompatible types: TOML key %q has type %T; destination has type %s", md.context, data, dst)
+ return md.e("incompatible types: TOML value has type %T; destination has type %s", data, dst)
+}
+
+func (md *MetaData) parseErr(err error) error {
+ k := md.context.String()
+ return ParseError{
+ LastKey: k,
+ Position: md.keyInfo[k].pos,
+ Line: md.keyInfo[k].pos.Line,
+ err: err,
+ input: string(md.data),
+ }
+}
+
+func (md *MetaData) e(format string, args ...interface{}) error {
+ f := "toml: "
+ if len(md.context) > 0 {
+ f = fmt.Sprintf("toml: (last key %q): ", md.context)
+ p := md.keyInfo[md.context.String()].pos
+ if p.Line > 0 {
+ f = fmt.Sprintf("toml: line %d (last key %q): ", p.Line, md.context)
+ }
+ }
+ return fmt.Errorf(f+format, args...)
}
// rvalue returns a reflect.Value of `v`. All pointers are resolved.
@@ -533,7 +571,11 @@ func indirect(v reflect.Value) reflect.Value {
if v.Kind() != reflect.Ptr {
if v.CanSet() {
pv := v.Addr()
- if _, ok := pv.Interface().(encoding.TextUnmarshaler); ok {
+ pvi := pv.Interface()
+ if _, ok := pvi.(encoding.TextUnmarshaler); ok {
+ return pv
+ }
+ if _, ok := pvi.(Unmarshaler); ok {
return pv
}
}
@@ -549,12 +591,12 @@ func isUnifiable(rv reflect.Value) bool {
if rv.CanSet() {
return true
}
- if _, ok := rv.Interface().(encoding.TextUnmarshaler); ok {
+ rvi := rv.Interface()
+ if _, ok := rvi.(encoding.TextUnmarshaler); ok {
+ return true
+ }
+ if _, ok := rvi.(Unmarshaler); ok {
return true
}
return false
}
-
-func e(format string, args ...interface{}) error {
- return fmt.Errorf("toml: "+format, args...)
-}
diff --git a/vendor/github.com/BurntSushi/toml/decode_go116.go b/vendor/github.com/BurntSushi/toml/decode_go116.go
index eddfb641b8..086d0b6866 100644
--- a/vendor/github.com/BurntSushi/toml/decode_go116.go
+++ b/vendor/github.com/BurntSushi/toml/decode_go116.go
@@ -7,8 +7,8 @@ import (
"io/fs"
)
-// DecodeFS is just like Decode, except it will automatically read the contents
-// of the file at `path` from a fs.FS instance.
+// DecodeFS reads the contents of a file from [fs.FS] and decodes it with
+// [Decode].
func DecodeFS(fsys fs.FS, path string, v interface{}) (MetaData, error) {
fp, err := fsys.Open(path)
if err != nil {
diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go
index 099c4a77d2..81a7c0fe9f 100644
--- a/vendor/github.com/BurntSushi/toml/doc.go
+++ b/vendor/github.com/BurntSushi/toml/doc.go
@@ -1,13 +1,11 @@
-/*
-Package toml implements decoding and encoding of TOML files.
-
-This package supports TOML v1.0.0, as listed on https://toml.io
-
-There is also support for delaying decoding with the Primitive type, and
-querying the set of keys in a TOML document with the MetaData type.
-
-The github.com/BurntSushi/toml/cmd/tomlv package implements a TOML validator,
-and can be used to verify if TOML document is valid. It can also be used to
-print the type of each key.
-*/
+// Package toml implements decoding and encoding of TOML files.
+//
+// This package supports TOML v1.0.0, as specified at https://toml.io
+//
+// There is also support for delaying decoding with the Primitive type, and
+// querying the set of keys in a TOML document with the MetaData type.
+//
+// The github.com/BurntSushi/toml/cmd/tomlv package implements a TOML validator,
+// and can be used to verify if TOML document is valid. It can also be used to
+// print the type of each key.
package toml
diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go
index dee4e6d319..930e1d521a 100644
--- a/vendor/github.com/BurntSushi/toml/encode.go
+++ b/vendor/github.com/BurntSushi/toml/encode.go
@@ -3,6 +3,7 @@ package toml
import (
"bufio"
"encoding"
+ "encoding/json"
"errors"
"fmt"
"io"
@@ -63,6 +64,12 @@ var dblQuotedReplacer = strings.NewReplacer(
"\x7f", `\u007f`,
)
+var (
+ marshalToml = reflect.TypeOf((*Marshaler)(nil)).Elem()
+ marshalText = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
+ timeType = reflect.TypeOf((*time.Time)(nil)).Elem()
+)
+
// Marshaler is the interface implemented by types that can marshal themselves
// into valid TOML.
type Marshaler interface {
@@ -72,9 +79,12 @@ type Marshaler interface {
// Encoder encodes a Go to a TOML document.
//
// The mapping between Go values and TOML values should be precisely the same as
-// for the Decode* functions.
+// for [Decode].
//
-// The toml.Marshaler and encoder.TextMarshaler interfaces are supported to
+// time.Time is encoded as a RFC 3339 string, and time.Duration as its string
+// representation.
+//
+// The [Marshaler] and [encoding.TextMarshaler] interfaces are supported to
// encoding the value as custom TOML.
//
// If you want to write arbitrary binary data then you will need to use
@@ -85,6 +95,17 @@ type Marshaler interface {
//
// Go maps will be sorted alphabetically by key for deterministic output.
//
+// The toml struct tag can be used to provide the key name; if omitted the
+// struct field name will be used. If the "omitempty" option is present the
+// following value will be skipped:
+//
+// - arrays, slices, maps, and string with len of 0
+// - struct with all zero values
+// - bool false
+//
+// If omitzero is given all int and float types with a value of 0 will be
+// skipped.
+//
// Encoding Go values without a corresponding TOML representation will return an
// error. Examples of this includes maps with non-string keys, slices with nil
// elements, embedded non-struct types, and nested slices containing maps or
@@ -109,7 +130,7 @@ func NewEncoder(w io.Writer) *Encoder {
}
}
-// Encode writes a TOML representation of the Go value to the Encoder's writer.
+// Encode writes a TOML representation of the Go value to the [Encoder]'s writer.
//
// An error is returned if the value given cannot be encoded to a valid TOML
// document.
@@ -136,18 +157,15 @@ func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) {
}
func (enc *Encoder) encode(key Key, rv reflect.Value) {
- // Special case: time needs to be in ISO8601 format.
- //
- // Special case: if we can marshal the type to text, then we used that. This
- // prevents the encoder for handling these types as generic structs (or
- // whatever the underlying type of a TextMarshaler is).
- switch t := rv.Interface().(type) {
- case time.Time, encoding.TextMarshaler, Marshaler:
+ // If we can marshal the type to text, then we use that. This prevents the
+ // encoder for handling these types as generic structs (or whatever the
+ // underlying type of a TextMarshaler is).
+ switch {
+ case isMarshaler(rv):
enc.writeKeyValue(key, rv, false)
return
- // TODO: #76 would make this superfluous after implemented.
- case Primitive:
- enc.encode(key, reflect.ValueOf(t.undecoded))
+ case rv.Type() == primitiveType: // TODO: #76 would make this superfluous after implemented.
+ enc.encode(key, reflect.ValueOf(rv.Interface().(Primitive).undecoded))
return
}
@@ -212,18 +230,44 @@ func (enc *Encoder) eElement(rv reflect.Value) {
if err != nil {
encPanic(err)
}
- enc.writeQuoted(string(s))
+ if s == nil {
+ encPanic(errors.New("MarshalTOML returned nil and no error"))
+ }
+ enc.w.Write(s)
return
case encoding.TextMarshaler:
s, err := v.MarshalText()
if err != nil {
encPanic(err)
}
+ if s == nil {
+ encPanic(errors.New("MarshalText returned nil and no error"))
+ }
enc.writeQuoted(string(s))
return
+ case time.Duration:
+ enc.writeQuoted(v.String())
+ return
+ case json.Number:
+ n, _ := rv.Interface().(json.Number)
+
+ if n == "" { /// Useful zero value.
+ enc.w.WriteByte('0')
+ return
+ } else if v, err := n.Int64(); err == nil {
+ enc.eElement(reflect.ValueOf(v))
+ return
+ } else if v, err := n.Float64(); err == nil {
+ enc.eElement(reflect.ValueOf(v))
+ return
+ }
+ encPanic(fmt.Errorf("unable to convert %q to int64 or float64", n))
}
switch rv.Kind() {
+ case reflect.Ptr:
+ enc.eElement(rv.Elem())
+ return
case reflect.String:
enc.writeQuoted(rv.String())
case reflect.Bool:
@@ -259,7 +303,7 @@ func (enc *Encoder) eElement(rv reflect.Value) {
case reflect.Interface:
enc.eElement(rv.Elem())
default:
- encPanic(fmt.Errorf("unexpected primitive type: %T", rv.Interface()))
+ encPanic(fmt.Errorf("unexpected type: %T", rv.Interface()))
}
}
@@ -280,7 +324,7 @@ func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) {
length := rv.Len()
enc.wf("[")
for i := 0; i < length; i++ {
- elem := rv.Index(i)
+ elem := eindirect(rv.Index(i))
enc.eElement(elem)
if i != length-1 {
enc.wf(", ")
@@ -294,7 +338,7 @@ func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) {
encPanic(errNoKey)
}
for i := 0; i < rv.Len(); i++ {
- trv := rv.Index(i)
+ trv := eindirect(rv.Index(i))
if isNil(trv) {
continue
}
@@ -319,7 +363,7 @@ func (enc *Encoder) eTable(key Key, rv reflect.Value) {
}
func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value, inline bool) {
- switch rv := eindirect(rv); rv.Kind() {
+ switch rv.Kind() {
case reflect.Map:
enc.eMap(key, rv, inline)
case reflect.Struct:
@@ -341,7 +385,7 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
var mapKeysDirect, mapKeysSub []string
for _, mapKey := range rv.MapKeys() {
k := mapKey.String()
- if typeIsTable(tomlTypeOfGo(rv.MapIndex(mapKey))) {
+ if typeIsTable(tomlTypeOfGo(eindirect(rv.MapIndex(mapKey)))) {
mapKeysSub = append(mapKeysSub, k)
} else {
mapKeysDirect = append(mapKeysDirect, k)
@@ -351,7 +395,7 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
var writeMapKeys = func(mapKeys []string, trailC bool) {
sort.Strings(mapKeys)
for i, mapKey := range mapKeys {
- val := rv.MapIndex(reflect.ValueOf(mapKey))
+ val := eindirect(rv.MapIndex(reflect.ValueOf(mapKey)))
if isNil(val) {
continue
}
@@ -379,6 +423,13 @@ func (enc *Encoder) eMap(key Key, rv reflect.Value, inline bool) {
const is32Bit = (32 << (^uint(0) >> 63)) == 32
+func pointerTo(t reflect.Type) reflect.Type {
+ if t.Kind() == reflect.Ptr {
+ return pointerTo(t.Elem())
+ }
+ return t
+}
+
func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
// Write keys for fields directly under this key first, because if we write
// a field that creates a new table then all keys under it will be in that
@@ -395,31 +446,25 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
addFields = func(rt reflect.Type, rv reflect.Value, start []int) {
for i := 0; i < rt.NumField(); i++ {
f := rt.Field(i)
- if f.PkgPath != "" && !f.Anonymous { /// Skip unexported fields.
+ isEmbed := f.Anonymous && pointerTo(f.Type).Kind() == reflect.Struct
+ if f.PkgPath != "" && !isEmbed { /// Skip unexported fields.
+ continue
+ }
+ opts := getOptions(f.Tag)
+ if opts.skip {
continue
}
- frv := rv.Field(i)
+ frv := eindirect(rv.Field(i))
// Treat anonymous struct fields with tag names as though they are
// not anonymous, like encoding/json does.
//
// Non-struct anonymous fields use the normal encoding logic.
- if f.Anonymous {
- t := f.Type
- switch t.Kind() {
- case reflect.Struct:
- if getOptions(f.Tag).name == "" {
- addFields(t, frv, append(start, f.Index...))
- continue
- }
- case reflect.Ptr:
- if t.Elem().Kind() == reflect.Struct && getOptions(f.Tag).name == "" {
- if !frv.IsNil() {
- addFields(t.Elem(), frv.Elem(), append(start, f.Index...))
- }
- continue
- }
+ if isEmbed {
+ if getOptions(f.Tag).name == "" && frv.Kind() == reflect.Struct {
+ addFields(frv.Type(), frv, append(start, f.Index...))
+ continue
}
}
@@ -445,7 +490,7 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
writeFields := func(fields [][]int) {
for _, fieldIndex := range fields {
fieldType := rt.FieldByIndex(fieldIndex)
- fieldVal := rv.FieldByIndex(fieldIndex)
+ fieldVal := eindirect(rv.FieldByIndex(fieldIndex))
if isNil(fieldVal) { /// Don't write anything for nil fields.
continue
@@ -459,7 +504,8 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value, inline bool) {
if opts.name != "" {
keyName = opts.name
}
- if opts.omitempty && isEmpty(fieldVal) {
+
+ if opts.omitempty && enc.isEmpty(fieldVal) {
continue
}
if opts.omitzero && isZero(fieldVal) {
@@ -498,6 +544,21 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
if isNil(rv) || !rv.IsValid() {
return nil
}
+
+ if rv.Kind() == reflect.Struct {
+ if rv.Type() == timeType {
+ return tomlDatetime
+ }
+ if isMarshaler(rv) {
+ return tomlString
+ }
+ return tomlHash
+ }
+
+ if isMarshaler(rv) {
+ return tomlString
+ }
+
switch rv.Kind() {
case reflect.Bool:
return tomlBool
@@ -509,7 +570,7 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
case reflect.Float32, reflect.Float64:
return tomlFloat
case reflect.Array, reflect.Slice:
- if typeEqual(tomlHash, tomlArrayType(rv)) {
+ if isTableArray(rv) {
return tomlArrayHash
}
return tomlArray
@@ -519,67 +580,35 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
return tomlString
case reflect.Map:
return tomlHash
- case reflect.Struct:
- if _, ok := rv.Interface().(time.Time); ok {
- return tomlDatetime
- }
- if isMarshaler(rv) {
- return tomlString
- }
- return tomlHash
default:
- if isMarshaler(rv) {
- return tomlString
- }
-
encPanic(errors.New("unsupported type: " + rv.Kind().String()))
panic("unreachable")
}
}
func isMarshaler(rv reflect.Value) bool {
- switch rv.Interface().(type) {
- case encoding.TextMarshaler:
- return true
- case Marshaler:
- return true
- }
-
- // Someone used a pointer receiver: we can make it work for pointer values.
- if rv.CanAddr() {
- if _, ok := rv.Addr().Interface().(encoding.TextMarshaler); ok {
- return true
- }
- if _, ok := rv.Addr().Interface().(Marshaler); ok {
- return true
- }
- }
- return false
+ return rv.Type().Implements(marshalText) || rv.Type().Implements(marshalToml)
}
-// tomlArrayType returns the element type of a TOML array. The type returned
-// may be nil if it cannot be determined (e.g., a nil slice or a zero length
-// slize). This function may also panic if it finds a type that cannot be
-// expressed in TOML (such as nil elements, heterogeneous arrays or directly
-// nested arrays of tables).
-func tomlArrayType(rv reflect.Value) tomlType {
- if isNil(rv) || !rv.IsValid() || rv.Len() == 0 {
- return nil
+// isTableArray reports if all entries in the array or slice are a table.
+func isTableArray(arr reflect.Value) bool {
+ if isNil(arr) || !arr.IsValid() || arr.Len() == 0 {
+ return false
}
- /// Don't allow nil.
- rvlen := rv.Len()
- for i := 1; i < rvlen; i++ {
- if tomlTypeOfGo(rv.Index(i)) == nil {
+ ret := true
+ for i := 0; i < arr.Len(); i++ {
+ tt := tomlTypeOfGo(eindirect(arr.Index(i)))
+ // Don't allow nil.
+ if tt == nil {
encPanic(errArrayNilElement)
}
- }
- firstType := tomlTypeOfGo(rv.Index(0))
- if firstType == nil {
- encPanic(errArrayNilElement)
+ if ret && !typeEqual(tomlHash, tt) {
+ ret = false
+ }
}
- return firstType
+ return ret
}
type tagOptions struct {
@@ -620,10 +649,26 @@ func isZero(rv reflect.Value) bool {
return false
}
-func isEmpty(rv reflect.Value) bool {
+func (enc *Encoder) isEmpty(rv reflect.Value) bool {
switch rv.Kind() {
case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
return rv.Len() == 0
+ case reflect.Struct:
+ if rv.Type().Comparable() {
+ return reflect.Zero(rv.Type()).Interface() == rv.Interface()
+ }
+ // Need to also check if all the fields are empty, otherwise something
+ // like this with uncomparable types will always return true:
+ //
+ // type a struct{ field b }
+ // type b struct{ s []string }
+ // s := a{field: b{s: []string{"AAA"}}}
+ for i := 0; i < rv.NumField(); i++ {
+ if !enc.isEmpty(rv.Field(i)) {
+ return false
+ }
+ }
+ return true
case reflect.Bool:
return !rv.Bool()
}
@@ -638,16 +683,15 @@ func (enc *Encoder) newline() {
// Write a key/value pair:
//
-// key =
+// key =
//
// This is also used for "k = v" in inline tables; so something like this will
// be written in three calls:
//
-// ┌────────────────────┐
-// │ ┌───┐ ┌─────┐│
-// v v v v vv
-// key = {k = v, k2 = v2}
-//
+// ┌───────────────────┐
+// │ ┌───┐ ┌────┐│
+// v v v v vv
+// key = {k = 1, k2 = 2}
func (enc *Encoder) writeKeyValue(key Key, val reflect.Value, inline bool) {
if len(key) == 0 {
encPanic(errNoKey)
@@ -675,13 +719,25 @@ func encPanic(err error) {
panic(tomlEncodeError{err})
}
+// Resolve any level of pointers to the actual value (e.g. **string → string).
func eindirect(v reflect.Value) reflect.Value {
- switch v.Kind() {
- case reflect.Ptr, reflect.Interface:
- return eindirect(v.Elem())
- default:
+ if v.Kind() != reflect.Ptr && v.Kind() != reflect.Interface {
+ if isMarshaler(v) {
+ return v
+ }
+ if v.CanAddr() { /// Special case for marshalers; see #358.
+ if pv := v.Addr(); isMarshaler(pv) {
+ return pv
+ }
+ }
return v
}
+
+ if v.IsNil() {
+ return v
+ }
+
+ return eindirect(v.Elem())
}
func isNil(rv reflect.Value) bool {
diff --git a/vendor/github.com/BurntSushi/toml/error.go b/vendor/github.com/BurntSushi/toml/error.go
index 36edc46554..f4f390e647 100644
--- a/vendor/github.com/BurntSushi/toml/error.go
+++ b/vendor/github.com/BurntSushi/toml/error.go
@@ -5,57 +5,60 @@ import (
"strings"
)
-// ParseError is returned when there is an error parsing the TOML syntax.
-//
-// For example invalid syntax, duplicate keys, etc.
+// ParseError is returned when there is an error parsing the TOML syntax such as
+// invalid syntax, duplicate keys, etc.
//
// In addition to the error message itself, you can also print detailed location
-// information with context by using ErrorWithLocation():
+// information with context by using [ErrorWithPosition]:
//
-// toml: error: Key 'fruit' was already created and cannot be used as an array.
+// toml: error: Key 'fruit' was already created and cannot be used as an array.
//
-// At line 4, column 2-7:
+// At line 4, column 2-7:
//
-// 2 | fruit = []
-// 3 |
-// 4 | [[fruit]] # Not allowed
-// ^^^^^
+// 2 | fruit = []
+// 3 |
+// 4 | [[fruit]] # Not allowed
+// ^^^^^
//
-// Furthermore, the ErrorWithUsage() can be used to print the above with some
-// more detailed usage guidance:
+// [ErrorWithUsage] can be used to print the above with some more detailed usage
+// guidance:
//
-// toml: error: newlines not allowed within inline tables
+// toml: error: newlines not allowed within inline tables
//
-// At line 1, column 18:
+// At line 1, column 18:
//
-// 1 | x = [{ key = 42 #
-// ^
+// 1 | x = [{ key = 42 #
+// ^
//
-// Error help:
+// Error help:
//
-// Inline tables must always be on a single line:
+// Inline tables must always be on a single line:
//
-// table = {key = 42, second = 43}
+// table = {key = 42, second = 43}
//
-// It is invalid to split them over multiple lines like so:
+// It is invalid to split them over multiple lines like so:
//
-// # INVALID
-// table = {
-// key = 42,
-// second = 43
-// }
+// # INVALID
+// table = {
+// key = 42,
+// second = 43
+// }
//
-// Use regular for this:
+// Use regular for this:
//
-// [table]
-// key = 42
-// second = 43
+// [table]
+// key = 42
+// second = 43
type ParseError struct {
Message string // Short technical message.
Usage string // Longer message with usage guidance; may be blank.
Position Position // Position of the error
LastKey string // Last parsed key, may be blank.
- Line int // Line the error occurred. Deprecated: use Position.
+
+ // Line the error occurred.
+ //
+ // Deprecated: use [Position].
+ Line int
err error
input string
@@ -83,7 +86,7 @@ func (pe ParseError) Error() string {
// ErrorWithUsage() returns the error with detailed location context.
//
-// See the documentation on ParseError.
+// See the documentation on [ParseError].
func (pe ParseError) ErrorWithPosition() string {
if pe.input == "" { // Should never happen, but just in case.
return pe.Error()
@@ -124,13 +127,17 @@ func (pe ParseError) ErrorWithPosition() string {
// ErrorWithUsage() returns the error with detailed location context and usage
// guidance.
//
-// See the documentation on ParseError.
+// See the documentation on [ParseError].
func (pe ParseError) ErrorWithUsage() string {
m := pe.ErrorWithPosition()
if u, ok := pe.err.(interface{ Usage() string }); ok && u.Usage() != "" {
- return m + "Error help:\n\n " +
- strings.ReplaceAll(strings.TrimSpace(u.Usage()), "\n", "\n ") +
- "\n"
+ lines := strings.Split(strings.TrimSpace(u.Usage()), "\n")
+ for i := range lines {
+ if lines[i] != "" {
+ lines[i] = " " + lines[i]
+ }
+ }
+ return m + "Error help:\n\n" + strings.Join(lines, "\n") + "\n"
}
return m
}
@@ -160,6 +167,11 @@ type (
errLexInvalidDate struct{ v string }
errLexInlineTableNL struct{}
errLexStringNL struct{}
+ errParseRange struct {
+ i interface{} // int or float
+ size string // "int64", "uint16", etc.
+ }
+ errParseDuration struct{ d string }
)
func (e errLexControl) Error() string {
@@ -179,6 +191,10 @@ func (e errLexInlineTableNL) Error() string { return "newlines not allowed withi
func (e errLexInlineTableNL) Usage() string { return usageInlineNewline }
func (e errLexStringNL) Error() string { return "strings cannot contain newlines" }
func (e errLexStringNL) Usage() string { return usageStringNewline }
+func (e errParseRange) Error() string { return fmt.Sprintf("%v is out of range for %s", e.i, e.size) }
+func (e errParseRange) Usage() string { return usageIntOverflow }
+func (e errParseDuration) Error() string { return fmt.Sprintf("invalid duration: %q", e.d) }
+func (e errParseDuration) Usage() string { return usageDuration }
const usageEscape = `
A '\' inside a "-delimited string is interpreted as an escape character.
@@ -227,3 +243,37 @@ Instead use """ or ''' to split strings over multiple lines:
string = """Hello,
world!"""
`
+
+const usageIntOverflow = `
+This number is too large; this may be an error in the TOML, but it can also be a
+bug in the program that uses too small of an integer.
+
+The maximum and minimum values are:
+
+ size │ lowest │ highest
+ ───────┼────────────────┼──────────
+ int8 │ -128 │ 127
+ int16 │ -32,768 │ 32,767
+ int32 │ -2,147,483,648 │ 2,147,483,647
+ int64 │ -9.2 × 10¹⁷ │ 9.2 × 10¹⁷
+ uint8 │ 0 │ 255
+ uint16 │ 0 │ 65535
+ uint32 │ 0 │ 4294967295
+ uint64 │ 0 │ 1.8 × 10¹⁸
+
+int refers to int32 on 32-bit systems and int64 on 64-bit systems.
+`
+
+const usageDuration = `
+A duration must be as "number", without any spaces. Valid units are:
+
+ ns nanoseconds (billionth of a second)
+ us, µs microseconds (millionth of a second)
+ ms milliseconds (thousands of a second)
+ s seconds
+ m minutes
+ h hours
+
+You can combine multiple units; for example "5m10s" for 5 minutes and 10
+seconds.
+`
diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go
index 63ef20f474..d4d70871d8 100644
--- a/vendor/github.com/BurntSushi/toml/lex.go
+++ b/vendor/github.com/BurntSushi/toml/lex.go
@@ -82,7 +82,7 @@ func (lx *lexer) nextItem() item {
return item
default:
lx.state = lx.state(lx)
- //fmt.Printf(" STATE %-24s current: %-10q stack: %s\n", lx.state, lx.current(), lx.stack)
+ //fmt.Printf(" STATE %-24s current: %-10s stack: %s\n", lx.state, lx.current(), lx.stack)
}
}
}
@@ -128,6 +128,11 @@ func (lx lexer) getPos() Position {
}
func (lx *lexer) emit(typ itemType) {
+ // Needed for multiline strings ending with an incomplete UTF-8 sequence.
+ if lx.start > lx.pos {
+ lx.error(errLexUTF8{lx.input[lx.pos]})
+ return
+ }
lx.items <- item{typ: typ, pos: lx.getPos(), val: lx.current()}
lx.start = lx.pos
}
@@ -711,7 +716,17 @@ func lexMultilineString(lx *lexer) stateFn {
if lx.peek() == '"' {
/// Check if we already lexed 5 's; if so we have 6 now, and
/// that's just too many man!
- if strings.HasSuffix(lx.current(), `"""""`) {
+ ///
+ /// Second check is for the edge case:
+ ///
+ /// two quotes allowed.
+ /// vv
+ /// """lol \""""""
+ /// ^^ ^^^---- closing three
+ /// escaped
+ ///
+ /// But ugly, but it works
+ if strings.HasSuffix(lx.current(), `"""""`) && !strings.HasSuffix(lx.current(), `\"""""`) {
return lx.errorf(`unexpected '""""""'`)
}
lx.backup()
@@ -756,7 +771,7 @@ func lexRawString(lx *lexer) stateFn {
}
// lexMultilineRawString consumes a raw string. Nothing can be escaped in such
-// a string. It assumes that the beginning "'''" has already been consumed and
+// a string. It assumes that the beginning ''' has already been consumed and
// ignored.
func lexMultilineRawString(lx *lexer) stateFn {
r := lx.next()
@@ -802,8 +817,7 @@ func lexMultilineRawString(lx *lexer) stateFn {
// lexMultilineStringEscape consumes an escaped character. It assumes that the
// preceding '\\' has already been consumed.
func lexMultilineStringEscape(lx *lexer) stateFn {
- // Handle the special case first:
- if isNL(lx.next()) {
+ if isNL(lx.next()) { /// \ escaping newline.
return lexMultilineString
}
lx.backup()
diff --git a/vendor/github.com/BurntSushi/toml/meta.go b/vendor/github.com/BurntSushi/toml/meta.go
index 868619fb97..71847a0415 100644
--- a/vendor/github.com/BurntSushi/toml/meta.go
+++ b/vendor/github.com/BurntSushi/toml/meta.go
@@ -12,10 +12,11 @@ import (
type MetaData struct {
context Key // Used only during decoding.
+ keyInfo map[string]keyInfo
mapping map[string]interface{}
- types map[string]tomlType
keys []Key
decoded map[string]struct{}
+ data []byte // Input file; for errors.
}
// IsDefined reports if the key exists in the TOML data.
@@ -50,8 +51,8 @@ func (md *MetaData) IsDefined(key ...string) bool {
// Type will return the empty string if given an empty key or a key that does
// not exist. Keys are case sensitive.
func (md *MetaData) Type(key ...string) string {
- if typ, ok := md.types[Key(key).String()]; ok {
- return typ.typeString()
+ if ki, ok := md.keyInfo[Key(key).String()]; ok {
+ return ki.tomlType.typeString()
}
return ""
}
@@ -70,7 +71,7 @@ func (md *MetaData) Keys() []Key {
// Undecoded returns all keys that have not been decoded in the order in which
// they appear in the original TOML document.
//
-// This includes keys that haven't been decoded because of a Primitive value.
+// This includes keys that haven't been decoded because of a [Primitive] value.
// Once the Primitive value is decoded, the keys will be considered decoded.
//
// Also note that decoding into an empty interface will result in no decoding,
@@ -88,7 +89,7 @@ func (md *MetaData) Undecoded() []Key {
return undecoded
}
-// Key represents any TOML key, including key groups. Use (MetaData).Keys to get
+// Key represents any TOML key, including key groups. Use [MetaData.Keys] to get
// values of this type.
type Key []string
diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go
index 8269cca170..d2542d6f92 100644
--- a/vendor/github.com/BurntSushi/toml/parse.go
+++ b/vendor/github.com/BurntSushi/toml/parse.go
@@ -16,12 +16,18 @@ type parser struct {
currentKey string // Base key name for everything except hashes.
pos Position // Current position in the TOML file.
- ordered []Key // List of keys in the order that they appear in the TOML data.
+ ordered []Key // List of keys in the order that they appear in the TOML data.
+
+ keyInfo map[string]keyInfo // Map keyname → info about the TOML key.
mapping map[string]interface{} // Map keyname → key value.
- types map[string]tomlType // Map keyname → TOML type.
implicits map[string]struct{} // Record implicit keys (e.g. "key.group.names").
}
+type keyInfo struct {
+ pos Position
+ tomlType tomlType
+}
+
func parse(data string) (p *parser, err error) {
defer func() {
if r := recover(); r != nil {
@@ -57,8 +63,8 @@ func parse(data string) (p *parser, err error) {
}
p = &parser{
+ keyInfo: make(map[string]keyInfo),
mapping: make(map[string]interface{}),
- types: make(map[string]tomlType),
lx: lex(data),
ordered: make([]Key, 0),
implicits: make(map[string]struct{}),
@@ -74,6 +80,15 @@ func parse(data string) (p *parser, err error) {
return p, nil
}
+func (p *parser) panicErr(it item, err error) {
+ panic(ParseError{
+ err: err,
+ Position: it.pos,
+ Line: it.pos.Len,
+ LastKey: p.current(),
+ })
+}
+
func (p *parser) panicItemf(it item, format string, v ...interface{}) {
panic(ParseError{
Message: fmt.Sprintf(format, v...),
@@ -94,7 +109,7 @@ func (p *parser) panicf(format string, v ...interface{}) {
func (p *parser) next() item {
it := p.lx.nextItem()
- //fmt.Printf("ITEM %-18s line %-3d │ %q\n", it.typ, it.line, it.val)
+ //fmt.Printf("ITEM %-18s line %-3d │ %q\n", it.typ, it.pos.Line, it.val)
if it.typ == itemError {
if it.err != nil {
panic(ParseError{
@@ -146,7 +161,7 @@ func (p *parser) topLevel(item item) {
p.assertEqual(itemTableEnd, name.typ)
p.addContext(key, false)
- p.setType("", tomlHash)
+ p.setType("", tomlHash, item.pos)
p.ordered = append(p.ordered, key)
case itemArrayTableStart: // [[ .. ]]
name := p.nextPos()
@@ -158,7 +173,7 @@ func (p *parser) topLevel(item item) {
p.assertEqual(itemArrayTableEnd, name.typ)
p.addContext(key, true)
- p.setType("", tomlArrayHash)
+ p.setType("", tomlArrayHash, item.pos)
p.ordered = append(p.ordered, key)
case itemKeyStart: // key = ..
outerContext := p.context
@@ -181,8 +196,9 @@ func (p *parser) topLevel(item item) {
}
/// Set value.
- val, typ := p.value(p.next(), false)
- p.set(p.currentKey, val, typ)
+ vItem := p.next()
+ val, typ := p.value(vItem, false)
+ p.set(p.currentKey, val, typ, vItem.pos)
p.ordered = append(p.ordered, p.context.add(p.currentKey))
/// Remove the context we added (preserving any context from [tbl] lines).
@@ -220,7 +236,7 @@ func (p *parser) value(it item, parentIsArray bool) (interface{}, tomlType) {
case itemString:
return p.replaceEscapes(it, it.val), p.typeOfPrimitive(it)
case itemMultilineString:
- return p.replaceEscapes(it, stripFirstNewline(stripEscapedNewlines(it.val))), p.typeOfPrimitive(it)
+ return p.replaceEscapes(it, stripFirstNewline(p.stripEscapedNewlines(it.val))), p.typeOfPrimitive(it)
case itemRawString:
return it.val, p.typeOfPrimitive(it)
case itemRawMultilineString:
@@ -266,7 +282,7 @@ func (p *parser) valueInteger(it item) (interface{}, tomlType) {
// So mark the former as a bug but the latter as a legitimate user
// error.
if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange {
- p.panicItemf(it, "Integer '%s' is out of the range of 64-bit signed integers.", it.val)
+ p.panicErr(it, errParseRange{i: it.val, size: "int64"})
} else {
p.bug("Expected integer value, but got '%s'.", it.val)
}
@@ -304,7 +320,7 @@ func (p *parser) valueFloat(it item) (interface{}, tomlType) {
num, err := strconv.ParseFloat(val, 64)
if err != nil {
if e, ok := err.(*strconv.NumError); ok && e.Err == strconv.ErrRange {
- p.panicItemf(it, "Float '%s' is out of the range of 64-bit IEEE-754 floating-point numbers.", it.val)
+ p.panicErr(it, errParseRange{i: it.val, size: "float64"})
} else {
p.panicItemf(it, "Invalid float value: %q", it.val)
}
@@ -343,9 +359,8 @@ func (p *parser) valueDatetime(it item) (interface{}, tomlType) {
}
func (p *parser) valueArray(it item) (interface{}, tomlType) {
- p.setType(p.currentKey, tomlArray)
+ p.setType(p.currentKey, tomlArray, it.pos)
- // p.setType(p.currentKey, typ)
var (
types []tomlType
@@ -414,7 +429,7 @@ func (p *parser) valueInlineTable(it item, parentIsArray bool) (interface{}, tom
/// Set the value.
val, typ := p.value(p.next(), false)
- p.set(p.currentKey, val, typ)
+ p.set(p.currentKey, val, typ, it.pos)
p.ordered = append(p.ordered, p.context.add(p.currentKey))
hash[p.currentKey] = val
@@ -533,9 +548,10 @@ func (p *parser) addContext(key Key, array bool) {
}
// set calls setValue and setType.
-func (p *parser) set(key string, val interface{}, typ tomlType) {
+func (p *parser) set(key string, val interface{}, typ tomlType, pos Position) {
p.setValue(key, val)
- p.setType(key, typ)
+ p.setType(key, typ, pos)
+
}
// setValue sets the given key to the given value in the current context.
@@ -599,7 +615,7 @@ func (p *parser) setValue(key string, value interface{}) {
//
// Note that if `key` is empty, then the type given will be applied to the
// current context (which is either a table or an array of tables).
-func (p *parser) setType(key string, typ tomlType) {
+func (p *parser) setType(key string, typ tomlType, pos Position) {
keyContext := make(Key, 0, len(p.context)+1)
keyContext = append(keyContext, p.context...)
if len(key) > 0 { // allow type setting for hashes
@@ -611,7 +627,7 @@ func (p *parser) setType(key string, typ tomlType) {
if len(keyContext) == 0 {
keyContext = Key{""}
}
- p.types[keyContext.String()] = typ
+ p.keyInfo[keyContext.String()] = keyInfo{tomlType: typ, pos: pos}
}
// Implicit keys need to be created when tables are implied in "a.b.c.d = 1" and
@@ -619,7 +635,7 @@ func (p *parser) setType(key string, typ tomlType) {
func (p *parser) addImplicit(key Key) { p.implicits[key.String()] = struct{}{} }
func (p *parser) removeImplicit(key Key) { delete(p.implicits, key.String()) }
func (p *parser) isImplicit(key Key) bool { _, ok := p.implicits[key.String()]; return ok }
-func (p *parser) isArray(key Key) bool { return p.types[key.String()] == tomlArray }
+func (p *parser) isArray(key Key) bool { return p.keyInfo[key.String()].tomlType == tomlArray }
func (p *parser) addImplicitContext(key Key) {
p.addImplicit(key)
p.addContext(key, false)
@@ -647,7 +663,7 @@ func stripFirstNewline(s string) string {
}
// Remove newlines inside triple-quoted strings if a line ends with "\".
-func stripEscapedNewlines(s string) string {
+func (p *parser) stripEscapedNewlines(s string) string {
split := strings.Split(s, "\n")
if len(split) < 1 {
return s
@@ -679,6 +695,10 @@ func stripEscapedNewlines(s string) string {
continue
}
+ if i == len(split)-1 {
+ p.panicf("invalid escape: '\\ '")
+ }
+
split[i] = line[:len(line)-1] // Remove \
if len(split)-1 > i {
split[i+1] = strings.TrimLeft(split[i+1], " \t\r")
@@ -706,10 +726,8 @@ func (p *parser) replaceEscapes(it item, str string) string {
switch s[r] {
default:
p.bug("Expected valid escape code after \\, but got %q.", s[r])
- return ""
case ' ', '\t':
p.panicItemf(it, "invalid escape: '\\%c'", s[r])
- return ""
case 'b':
replaced = append(replaced, rune(0x0008))
r += 1
diff --git a/vendor/github.com/MakeNowJust/heredoc/LICENSE b/vendor/github.com/MakeNowJust/heredoc/LICENSE
index 8a58c22208..6d0eb9d5d6 100644
--- a/vendor/github.com/MakeNowJust/heredoc/LICENSE
+++ b/vendor/github.com/MakeNowJust/heredoc/LICENSE
@@ -1,6 +1,6 @@
The MIT License (MIT)
-Copyright (c) 2014-2017 TSUYUSATO Kitsune
+Copyright (c) 2014-2019 TSUYUSATO Kitsune
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/github.com/MakeNowJust/heredoc/README.md b/vendor/github.com/MakeNowJust/heredoc/README.md
index a3a65faba1..e9924d2974 100644
--- a/vendor/github.com/MakeNowJust/heredoc/README.md
+++ b/vendor/github.com/MakeNowJust/heredoc/README.md
@@ -1,4 +1,6 @@
-# heredoc [](https://circleci.com/gh/MakeNowJust/heredoc) [](https://gowalker.org/github.com/MakeNowJust/heredoc)
+# heredoc
+
+[](https://circleci.com/gh/MakeNowJust/heredoc) [](https://godoc.org/github.com/MakeNowJust/heredoc)
## About
@@ -15,8 +17,6 @@ $ go get github.com/MakeNowJust/heredoc
```go
// usual
import "github.com/MakeNowJust/heredoc"
-// shortcuts
-import . "github.com/MakeNowJust/heredoc/dot"
```
## Example
@@ -26,11 +26,11 @@ package main
import (
"fmt"
- . "github.com/MakeNowJust/heredoc/dot"
+ "github.com/MakeNowJust/heredoc"
)
func main() {
- fmt.Println(D(`
+ fmt.Println(heredoc.Doc(`
Lorem ipsum dolor sit amet, consectetur adipisicing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, ...
@@ -45,8 +45,7 @@ func main() {
## API Document
- - [Go Walker - github.com/MakeNowJust/heredoc](https://gowalker.org/github.com/MakeNowJust/heredoc)
- - [Go Walker - github.com/MakeNowJust/heredoc/dot](https://gowalker.org/github.com/MakeNowJust/heredoc/dot)
+ - [heredoc - GoDoc](https://godoc.org/github.com/MakeNowJust/heredoc)
## License
diff --git a/vendor/github.com/MakeNowJust/heredoc/heredoc.go b/vendor/github.com/MakeNowJust/heredoc/heredoc.go
index fea12e622f..1fc0469555 100644
--- a/vendor/github.com/MakeNowJust/heredoc/heredoc.go
+++ b/vendor/github.com/MakeNowJust/heredoc/heredoc.go
@@ -1,24 +1,31 @@
-// Copyright (c) 2014-2017 TSUYUSATO Kitsune
+// Copyright (c) 2014-2019 TSUYUSATO Kitsune
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// Package heredoc provides creation of here-documents from raw strings.
//
// Golang supports raw-string syntax.
+//
// doc := `
// Foo
// Bar
// `
+//
// But raw-string cannot recognize indentation. Thus such content is an indented string, equivalent to
+//
// "\n\tFoo\n\tBar\n"
+//
// I dont't want this!
//
// However this problem is solved by package heredoc.
+//
// doc := heredoc.Doc(`
// Foo
// Bar
// `)
+//
// Is equivalent to
+//
// "Foo\nBar\n"
package heredoc
@@ -33,7 +40,7 @@ const maxInt = int(^uint(0) >> 1)
// Doc returns un-indented string as here-document.
func Doc(raw string) string {
skipFirstLine := false
- if raw[0] == '\n' {
+ if len(raw) > 0 && raw[0] == '\n' {
raw = raw[1:]
} else {
skipFirstLine = true
diff --git a/vendor/github.com/Masterminds/semver/v3/.golangci.yml b/vendor/github.com/Masterminds/semver/v3/.golangci.yml
index fdbdf1448c..c87d1c4b90 100644
--- a/vendor/github.com/Masterminds/semver/v3/.golangci.yml
+++ b/vendor/github.com/Masterminds/semver/v3/.golangci.yml
@@ -4,23 +4,27 @@ run:
linters:
disable-all: true
enable:
+ - misspell
+ - structcheck
+ - govet
+ - staticcheck
- deadcode
- - dupl
- errcheck
- - gofmt
- - goimports
- - golint
- - gosimple
- - govet
+ - varcheck
+ - unparam
- ineffassign
- - misspell
- nakedret
- - structcheck
+ - gocyclo
+ - dupl
+ - goimports
+ - revive
+ - gosec
+ - gosimple
+ - typecheck
- unused
- - varcheck
linters-settings:
gofmt:
simplify: true
dupl:
- threshold: 400
+ threshold: 600
diff --git a/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
index 1f90c38d26..f12626423a 100644
--- a/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
+++ b/vendor/github.com/Masterminds/semver/v3/CHANGELOG.md
@@ -1,5 +1,25 @@
# Changelog
+## 3.2.0 (2022-11-28)
+
+### Added
+
+- #190: Added text marshaling and unmarshaling
+- #167: Added JSON marshalling for constraints (thanks @SimonTheLeg)
+- #173: Implement encoding.TextMarshaler and encoding.TextUnmarshaler on Version (thanks @MarkRosemaker)
+- #179: Added New() version constructor (thanks @kazhuravlev)
+
+### Changed
+
+- #182/#183: Updated CI testing setup
+
+### Fixed
+
+- #186: Fixing issue where validation of constraint section gave false positives
+- #176: Fix constraints check with *-0 (thanks @mtt0)
+- #181: Fixed Caret operator (^) gives unexpected results when the minor version in constraint is 0 (thanks @arshchimni)
+- #161: Fixed godoc (thanks @afirth)
+
## 3.1.1 (2020-11-23)
### Fixed
diff --git a/vendor/github.com/Masterminds/semver/v3/constraints.go b/vendor/github.com/Masterminds/semver/v3/constraints.go
index 547613f044..203072e464 100644
--- a/vendor/github.com/Masterminds/semver/v3/constraints.go
+++ b/vendor/github.com/Masterminds/semver/v3/constraints.go
@@ -134,6 +134,23 @@ func (cs Constraints) String() string {
return strings.Join(buf, " || ")
}
+// UnmarshalText implements the encoding.TextUnmarshaler interface.
+func (cs *Constraints) UnmarshalText(text []byte) error {
+ temp, err := NewConstraint(string(text))
+ if err != nil {
+ return err
+ }
+
+ *cs = *temp
+
+ return nil
+}
+
+// MarshalText implements the encoding.TextMarshaler interface.
+func (cs Constraints) MarshalText() ([]byte, error) {
+ return []byte(cs.String()), nil
+}
+
var constraintOps map[string]cfunc
var constraintRegex *regexp.Regexp
var constraintRangeRegex *regexp.Regexp
@@ -180,8 +197,13 @@ func init() {
ops,
cvRegex))
+ // The first time a constraint shows up will look slightly different from
+ // future times it shows up due to a leading space or comma in a given
+ // string.
validConstraintRegex = regexp.MustCompile(fmt.Sprintf(
- `^(\s*(%s)\s*(%s)\s*\,?)+$`,
+ `^(\s*(%s)\s*(%s)\s*)((?:\s+|,\s*)(%s)\s*(%s)\s*)*$`,
+ ops,
+ cvRegex,
ops,
cvRegex))
}
@@ -233,7 +255,7 @@ func parseConstraint(c string) (*constraint, error) {
patchDirty := false
dirty := false
if isX(m[3]) || m[3] == "" {
- ver = "0.0.0"
+ ver = fmt.Sprintf("0.0.0%s", m[6])
dirty = true
} else if isX(strings.TrimPrefix(m[4], ".")) || m[4] == "" {
minorDirty = true
@@ -534,6 +556,10 @@ func constraintCaret(v *Version, c *constraint) (bool, error) {
}
return false, fmt.Errorf("%s does not have same minor version as %s. Expected minor versions to match when constraint major version is 0", v, c.orig)
}
+ // ^ when the minor is 0 and minor > 0 is =0.0.z
+ if c.con.Minor() == 0 && v.Minor() > 0 {
+ return false, fmt.Errorf("%s does not have same minor version as %s", v, c.orig)
+ }
// At this point the major is 0 and the minor is 0 and not dirty. The patch
// is not dirty so we need to check if they are equal. If they are not equal
diff --git a/vendor/github.com/Masterminds/semver/v3/doc.go b/vendor/github.com/Masterminds/semver/v3/doc.go
index 391aa46b76..74f97caa57 100644
--- a/vendor/github.com/Masterminds/semver/v3/doc.go
+++ b/vendor/github.com/Masterminds/semver/v3/doc.go
@@ -3,12 +3,12 @@ Package semver provides the ability to work with Semantic Versions (http://semve
Specifically it provides the ability to:
- * Parse semantic versions
- * Sort semantic versions
- * Check if a semantic version fits within a set of constraints
- * Optionally work with a `v` prefix
+ - Parse semantic versions
+ - Sort semantic versions
+ - Check if a semantic version fits within a set of constraints
+ - Optionally work with a `v` prefix
-Parsing Semantic Versions
+# Parsing Semantic Versions
There are two functions that can parse semantic versions. The `StrictNewVersion`
function only parses valid version 2 semantic versions as outlined in the
@@ -21,48 +21,48 @@ that can be sorted, compared, and used in constraints.
When parsing a version an optional error can be returned if there is an issue
parsing the version. For example,
- v, err := semver.NewVersion("1.2.3-beta.1+b345")
+ v, err := semver.NewVersion("1.2.3-beta.1+b345")
The version object has methods to get the parts of the version, compare it to
other versions, convert the version back into a string, and get the original
string. For more details please see the documentation
at https://godoc.org/github.com/Masterminds/semver.
-Sorting Semantic Versions
+# Sorting Semantic Versions
A set of versions can be sorted using the `sort` package from the standard library.
For example,
- raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",}
- vs := make([]*semver.Version, len(raw))
- for i, r := range raw {
- v, err := semver.NewVersion(r)
- if err != nil {
- t.Errorf("Error parsing version: %s", err)
- }
+ raw := []string{"1.2.3", "1.0", "1.3", "2", "0.4.2",}
+ vs := make([]*semver.Version, len(raw))
+ for i, r := range raw {
+ v, err := semver.NewVersion(r)
+ if err != nil {
+ t.Errorf("Error parsing version: %s", err)
+ }
- vs[i] = v
- }
+ vs[i] = v
+ }
- sort.Sort(semver.Collection(vs))
+ sort.Sort(semver.Collection(vs))
-Checking Version Constraints and Comparing Versions
+# Checking Version Constraints and Comparing Versions
There are two methods for comparing versions. One uses comparison methods on
`Version` instances and the other is using Constraints. There are some important
differences to notes between these two methods of comparison.
-1. When two versions are compared using functions such as `Compare`, `LessThan`,
- and others it will follow the specification and always include prereleases
- within the comparison. It will provide an answer valid with the comparison
- spec section at https://semver.org/#spec-item-11
-2. When constraint checking is used for checks or validation it will follow a
- different set of rules that are common for ranges with tools like npm/js
- and Rust/Cargo. This includes considering prereleases to be invalid if the
- ranges does not include on. If you want to have it include pre-releases a
- simple solution is to include `-0` in your range.
-3. Constraint ranges can have some complex rules including the shorthard use of
- ~ and ^. For more details on those see the options below.
+ 1. When two versions are compared using functions such as `Compare`, `LessThan`,
+ and others it will follow the specification and always include prereleases
+ within the comparison. It will provide an answer valid with the comparison
+ spec section at https://semver.org/#spec-item-11
+ 2. When constraint checking is used for checks or validation it will follow a
+ different set of rules that are common for ranges with tools like npm/js
+ and Rust/Cargo. This includes considering prereleases to be invalid if the
+ ranges does not include on. If you want to have it include pre-releases a
+ simple solution is to include `-0` in your range.
+ 3. Constraint ranges can have some complex rules including the shorthard use of
+ ~ and ^. For more details on those see the options below.
There are differences between the two methods or checking versions because the
comparison methods on `Version` follow the specification while comparison ranges
@@ -76,19 +76,19 @@ patters with their versions.
Checking a version against version constraints is one of the most featureful
parts of the package.
- c, err := semver.NewConstraint(">= 1.2.3")
- if err != nil {
- // Handle constraint not being parsable.
- }
+ c, err := semver.NewConstraint(">= 1.2.3")
+ if err != nil {
+ // Handle constraint not being parsable.
+ }
- v, err := semver.NewVersion("1.3")
- if err != nil {
- // Handle version not being parsable.
- }
- // Check if the version meets the constraints. The a variable will be true.
- a := c.Check(v)
+ v, err := semver.NewVersion("1.3")
+ if err != nil {
+ // Handle version not being parsable.
+ }
+ // Check if the version meets the constraints. The a variable will be true.
+ a := c.Check(v)
-Basic Comparisons
+# Basic Comparisons
There are two elements to the comparisons. First, a comparison string is a list
of comma or space separated AND comparisons. These are then separated by || (OR)
@@ -99,31 +99,31 @@ greater than or equal to 4.2.3. This can also be written as
The basic comparisons are:
- * `=`: equal (aliased to no operator)
- * `!=`: not equal
- * `>`: greater than
- * `<`: less than
- * `>=`: greater than or equal to
- * `<=`: less than or equal to
+ - `=`: equal (aliased to no operator)
+ - `!=`: not equal
+ - `>`: greater than
+ - `<`: less than
+ - `>=`: greater than or equal to
+ - `<=`: less than or equal to
-Hyphen Range Comparisons
+# Hyphen Range Comparisons
There are multiple methods to handle ranges and the first is hyphens ranges.
These look like:
- * `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5`
- * `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5`
+ - `1.2 - 1.4.5` which is equivalent to `>= 1.2, <= 1.4.5`
+ - `2.3.4 - 4.5` which is equivalent to `>= 2.3.4 <= 4.5`
-Wildcards In Comparisons
+# Wildcards In Comparisons
The `x`, `X`, and `*` characters can be used as a wildcard character. This works
for all comparison operators. When used on the `=` operator it falls
back to the tilde operation. For example,
- * `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0`
- * `>= 1.2.x` is equivalent to `>= 1.2.0`
- * `<= 2.x` is equivalent to `<= 3`
- * `*` is equivalent to `>= 0.0.0`
+ - `1.2.x` is equivalent to `>= 1.2.0 < 1.3.0`
+ - `>= 1.2.x` is equivalent to `>= 1.2.0`
+ - `<= 2.x` is equivalent to `<= 3`
+ - `*` is equivalent to `>= 0.0.0`
Tilde Range Comparisons (Patch)
@@ -131,11 +131,11 @@ The tilde (`~`) comparison operator is for patch level ranges when a minor
version is specified and major level changes when the minor number is missing.
For example,
- * `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0`
- * `~1` is equivalent to `>= 1, < 2`
- * `~2.3` is equivalent to `>= 2.3 < 2.4`
- * `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0`
- * `~1.x` is equivalent to `>= 1 < 2`
+ - `~1.2.3` is equivalent to `>= 1.2.3 < 1.3.0`
+ - `~1` is equivalent to `>= 1, < 2`
+ - `~2.3` is equivalent to `>= 2.3 < 2.4`
+ - `~1.2.x` is equivalent to `>= 1.2.0 < 1.3.0`
+ - `~1.x` is equivalent to `>= 1 < 2`
Caret Range Comparisons (Major)
@@ -144,41 +144,41 @@ The caret (`^`) comparison operator is for major level changes once a stable
as the API stability level. This is useful when comparisons of API versions as a
major change is API breaking. For example,
- * `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0`
- * `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0`
- * `^2.3` is equivalent to `>= 2.3, < 3`
- * `^2.x` is equivalent to `>= 2.0.0, < 3`
- * `^0.2.3` is equivalent to `>=0.2.3 <0.3.0`
- * `^0.2` is equivalent to `>=0.2.0 <0.3.0`
- * `^0.0.3` is equivalent to `>=0.0.3 <0.0.4`
- * `^0.0` is equivalent to `>=0.0.0 <0.1.0`
- * `^0` is equivalent to `>=0.0.0 <1.0.0`
+ - `^1.2.3` is equivalent to `>= 1.2.3, < 2.0.0`
+ - `^1.2.x` is equivalent to `>= 1.2.0, < 2.0.0`
+ - `^2.3` is equivalent to `>= 2.3, < 3`
+ - `^2.x` is equivalent to `>= 2.0.0, < 3`
+ - `^0.2.3` is equivalent to `>=0.2.3 <0.3.0`
+ - `^0.2` is equivalent to `>=0.2.0 <0.3.0`
+ - `^0.0.3` is equivalent to `>=0.0.3 <0.0.4`
+ - `^0.0` is equivalent to `>=0.0.0 <0.1.0`
+ - `^0` is equivalent to `>=0.0.0 <1.0.0`
-Validation
+# Validation
In addition to testing a version against a constraint, a version can be validated
against a constraint. When validation fails a slice of errors containing why a
version didn't meet the constraint is returned. For example,
- c, err := semver.NewConstraint("<= 1.2.3, >= 1.4")
- if err != nil {
- // Handle constraint not being parseable.
- }
-
- v, _ := semver.NewVersion("1.3")
- if err != nil {
- // Handle version not being parseable.
- }
-
- // Validate a version against a constraint.
- a, msgs := c.Validate(v)
- // a is false
- for _, m := range msgs {
- fmt.Println(m)
-
- // Loops over the errors which would read
- // "1.3 is greater than 1.2.3"
- // "1.3 is less than 1.4"
- }
+ c, err := semver.NewConstraint("<= 1.2.3, >= 1.4")
+ if err != nil {
+ // Handle constraint not being parseable.
+ }
+
+ v, _ := semver.NewVersion("1.3")
+ if err != nil {
+ // Handle version not being parseable.
+ }
+
+ // Validate a version against a constraint.
+ a, msgs := c.Validate(v)
+ // a is false
+ for _, m := range msgs {
+ fmt.Println(m)
+
+ // Loops over the errors which would read
+ // "1.3 is greater than 1.2.3"
+ // "1.3 is less than 1.4"
+ }
*/
package semver
diff --git a/vendor/github.com/Masterminds/semver/v3/version.go b/vendor/github.com/Masterminds/semver/v3/version.go
index d6b9cda3ee..7c4bed3347 100644
--- a/vendor/github.com/Masterminds/semver/v3/version.go
+++ b/vendor/github.com/Masterminds/semver/v3/version.go
@@ -55,14 +55,16 @@ func init() {
versionRegex = regexp.MustCompile("^" + semVerRegex + "$")
}
-const num string = "0123456789"
-const allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num
+const (
+ num string = "0123456789"
+ allowed string = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-" + num
+)
// StrictNewVersion parses a given version and returns an instance of Version or
// an error if unable to parse the version. Only parses valid semantic versions.
// Performs checking that can find errors within the version.
-// If you want to coerce a version, such as 1 or 1.2, and perse that as the 1.x
-// releases of semver provided use the NewSemver() function.
+// If you want to coerce a version such as 1 or 1.2 and parse it as the 1.x
+// releases of semver did, use the NewVersion() function.
func StrictNewVersion(v string) (*Version, error) {
// Parsing here does not use RegEx in order to increase performance and reduce
// allocations.
@@ -207,6 +209,23 @@ func NewVersion(v string) (*Version, error) {
return sv, nil
}
+// New creates a new instance of Version with each of the parts passed in as
+// arguments instead of parsing a version string.
+func New(major, minor, patch uint64, pre, metadata string) *Version {
+ v := Version{
+ major: major,
+ minor: minor,
+ patch: patch,
+ pre: pre,
+ metadata: metadata,
+ original: "",
+ }
+
+ v.original = v.String()
+
+ return &v
+}
+
// MustParse parses a given version and panics on error.
func MustParse(v string) *Version {
sv, err := NewVersion(v)
@@ -267,7 +286,6 @@ func (v Version) Metadata() string {
// originalVPrefix returns the original 'v' prefix if any.
func (v Version) originalVPrefix() string {
-
// Note, only lowercase v is supported as a prefix by the parser.
if v.original != "" && v.original[:1] == "v" {
return v.original[:1]
@@ -436,6 +454,23 @@ func (v Version) MarshalJSON() ([]byte, error) {
return json.Marshal(v.String())
}
+// UnmarshalText implements the encoding.TextUnmarshaler interface.
+func (v *Version) UnmarshalText(text []byte) error {
+ temp, err := NewVersion(string(text))
+ if err != nil {
+ return err
+ }
+
+ *v = *temp
+
+ return nil
+}
+
+// MarshalText implements the encoding.TextMarshaler interface.
+func (v Version) MarshalText() ([]byte, error) {
+ return []byte(v.String()), nil
+}
+
// Scan implements the SQL.Scanner interface.
func (v *Version) Scan(value interface{}) error {
var s string
@@ -470,7 +505,6 @@ func compareSegment(v, o uint64) int {
}
func comparePrerelease(v, o string) int {
-
// split the prelease versions by their part. The separator, per the spec,
// is a .
sparts := strings.Split(v, ".")
@@ -562,7 +596,6 @@ func comparePrePart(s, o string) int {
return 1
}
return -1
-
}
// Like strings.ContainsAny but does an only instead of any.
diff --git a/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md b/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md
index fcdd4e88ae..2ce45dd4ec 100644
--- a/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md
+++ b/vendor/github.com/Masterminds/sprig/v3/CHANGELOG.md
@@ -1,8 +1,21 @@
# Changelog
+## Release 3.2.3 (2022-11-29)
+
+### Changed
+
+- Updated docs (thanks @book987 @aJetHorn @neelayu @pellizzetti @apricote @SaigyoujiYuyuko233 @AlekSi)
+- #348: Updated huandu/xstrings which fixed a snake case bug (thanks @yxxhero)
+- #353: Updated masterminds/semver which included bug fixes
+- #354: Updated golang.org/x/crypto which included bug fixes
+
+## Release 3.2.2 (2021-02-04)
+
+This is a re-release of 3.2.1 to satisfy something with the Go module system.
+
## Release 3.2.1 (2021-02-04)
-### Changed
+### Changed
- Upgraded `Masterminds/goutils` to `v1.1.1`. see the [Security Advisory](https://github.com/Masterminds/goutils/security/advisories/GHSA-xg2h-wx96-xgxr)
diff --git a/vendor/github.com/Masterminds/sprig/v3/README.md b/vendor/github.com/Masterminds/sprig/v3/README.md
index c37ba01c21..3e22c60e1a 100644
--- a/vendor/github.com/Masterminds/sprig/v3/README.md
+++ b/vendor/github.com/Masterminds/sprig/v3/README.md
@@ -17,10 +17,9 @@ JavaScript libraries, such as [underscore.js](http://underscorejs.org/).
## IMPORTANT NOTES
Sprig leverages [mergo](https://github.com/imdario/mergo) to handle merges. In
-its v0.3.9 release there was a behavior change that impacts merging template
-functions in sprig. It is currently recommended to use v0.3.8 of that package.
-Using v0.3.9 will cause sprig tests to fail. The issue in mergo is tracked at
-https://github.com/imdario/mergo/issues/139.
+its v0.3.9 release, there was a behavior change that impacts merging template
+functions in sprig. It is currently recommended to use v0.3.10 or later of that package.
+Using v0.3.9 will cause sprig tests to fail.
## Package Versions
@@ -51,7 +50,7 @@ To load the Sprig `FuncMap`:
```go
import (
- "github.com/Masterminds/sprig"
+ "github.com/Masterminds/sprig/v3"
"html/template"
)
diff --git a/vendor/github.com/Masterminds/squirrel/part.go b/vendor/github.com/Masterminds/squirrel/part.go
index f3a7b1545a..c58f68f1a4 100644
--- a/vendor/github.com/Masterminds/squirrel/part.go
+++ b/vendor/github.com/Masterminds/squirrel/part.go
@@ -19,7 +19,7 @@ func (p part) ToSql() (sql string, args []interface{}, err error) {
case nil:
// no-op
case Sqlizer:
- sql, args, err = pred.ToSql()
+ sql, args, err = nestedToSql(pred)
case string:
sql = pred
args = p.args
diff --git a/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go b/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go
index 504e763d2e..c20148ad33 100644
--- a/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go
+++ b/vendor/github.com/Masterminds/squirrel/squirrel_ctx.go
@@ -32,7 +32,7 @@ type QueryRowerContext interface {
QueryRowContext(ctx context.Context, query string, args ...interface{}) RowScanner
}
-// RunnerContext groups the Runner interface, along with the Contect versions of each of
+// RunnerContext groups the Runner interface, along with the Context versions of each of
// its methods
type RunnerContext interface {
Runner
diff --git a/vendor/github.com/Microsoft/go-winio/.gitattributes b/vendor/github.com/Microsoft/go-winio/.gitattributes
new file mode 100644
index 0000000000..94f480de94
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/.gitattributes
@@ -0,0 +1 @@
+* text=auto eol=lf
\ No newline at end of file
diff --git a/vendor/github.com/Microsoft/go-winio/.gitignore b/vendor/github.com/Microsoft/go-winio/.gitignore
index b883f1fdc6..815e20660e 100644
--- a/vendor/github.com/Microsoft/go-winio/.gitignore
+++ b/vendor/github.com/Microsoft/go-winio/.gitignore
@@ -1 +1,10 @@
+.vscode/
+
*.exe
+
+# testing
+testdata
+
+# go workspaces
+go.work
+go.work.sum
diff --git a/vendor/github.com/Microsoft/go-winio/.golangci.yml b/vendor/github.com/Microsoft/go-winio/.golangci.yml
new file mode 100644
index 0000000000..7b503d26a3
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/.golangci.yml
@@ -0,0 +1,149 @@
+run:
+ skip-dirs:
+ - pkg/etw/sample
+
+linters:
+ enable:
+ # style
+ - containedctx # struct contains a context
+ - dupl # duplicate code
+ - errname # erorrs are named correctly
+ - nolintlint # "//nolint" directives are properly explained
+ - revive # golint replacement
+ - unconvert # unnecessary conversions
+ - wastedassign
+
+ # bugs, performance, unused, etc ...
+ - contextcheck # function uses a non-inherited context
+ - errorlint # errors not wrapped for 1.13
+ - exhaustive # check exhaustiveness of enum switch statements
+ - gofmt # files are gofmt'ed
+ - gosec # security
+ - nilerr # returns nil even with non-nil error
+ - unparam # unused function params
+
+issues:
+ exclude-rules:
+ # err is very often shadowed in nested scopes
+ - linters:
+ - govet
+ text: '^shadow: declaration of "err" shadows declaration'
+
+ # ignore long lines for skip autogen directives
+ - linters:
+ - revive
+ text: "^line-length-limit: "
+ source: "^//(go:generate|sys) "
+
+ #TODO: remove after upgrading to go1.18
+ # ignore comment spacing for nolint and sys directives
+ - linters:
+ - revive
+ text: "^comment-spacings: no space between comment delimiter and comment text"
+ source: "//(cspell:|nolint:|sys |todo)"
+
+ # not on go 1.18 yet, so no any
+ - linters:
+ - revive
+ text: "^use-any: since GO 1.18 'interface{}' can be replaced by 'any'"
+
+ # allow unjustified ignores of error checks in defer statements
+ - linters:
+ - nolintlint
+ text: "^directive `//nolint:errcheck` should provide explanation"
+ source: '^\s*defer '
+
+ # allow unjustified ignores of error lints for io.EOF
+ - linters:
+ - nolintlint
+ text: "^directive `//nolint:errorlint` should provide explanation"
+ source: '[=|!]= io.EOF'
+
+
+linters-settings:
+ exhaustive:
+ default-signifies-exhaustive: true
+ govet:
+ enable-all: true
+ disable:
+ # struct order is often for Win32 compat
+ # also, ignore pointer bytes/GC issues for now until performance becomes an issue
+ - fieldalignment
+ check-shadowing: true
+ nolintlint:
+ allow-leading-space: false
+ require-explanation: true
+ require-specific: true
+ revive:
+ # revive is more configurable than static check, so likely the preferred alternative to static-check
+ # (once the perf issue is solved: https://github.com/golangci/golangci-lint/issues/2997)
+ enable-all-rules:
+ true
+ # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md
+ rules:
+ # rules with required arguments
+ - name: argument-limit
+ disabled: true
+ - name: banned-characters
+ disabled: true
+ - name: cognitive-complexity
+ disabled: true
+ - name: cyclomatic
+ disabled: true
+ - name: file-header
+ disabled: true
+ - name: function-length
+ disabled: true
+ - name: function-result-limit
+ disabled: true
+ - name: max-public-structs
+ disabled: true
+ # geneally annoying rules
+ - name: add-constant # complains about any and all strings and integers
+ disabled: true
+ - name: confusing-naming # we frequently use "Foo()" and "foo()" together
+ disabled: true
+ - name: flag-parameter # excessive, and a common idiom we use
+ disabled: true
+ - name: unhandled-error # warns over common fmt.Print* and io.Close; rely on errcheck instead
+ disabled: true
+ # general config
+ - name: line-length-limit
+ arguments:
+ - 140
+ - name: var-naming
+ arguments:
+ - []
+ - - CID
+ - CRI
+ - CTRD
+ - DACL
+ - DLL
+ - DOS
+ - ETW
+ - FSCTL
+ - GCS
+ - GMSA
+ - HCS
+ - HV
+ - IO
+ - LCOW
+ - LDAP
+ - LPAC
+ - LTSC
+ - MMIO
+ - NT
+ - OCI
+ - PMEM
+ - PWSH
+ - RX
+ - SACl
+ - SID
+ - SMB
+ - TX
+ - VHD
+ - VHDX
+ - VMID
+ - VPCI
+ - WCOW
+ - WIM
diff --git a/vendor/github.com/Microsoft/go-winio/README.md b/vendor/github.com/Microsoft/go-winio/README.md
index 683be1dcf9..7474b4f0b6 100644
--- a/vendor/github.com/Microsoft/go-winio/README.md
+++ b/vendor/github.com/Microsoft/go-winio/README.md
@@ -13,16 +13,60 @@ Please see the LICENSE file for licensing information.
## Contributing
-This project welcomes contributions and suggestions. Most contributions require you to agree to a Contributor License Agreement (CLA)
-declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.
+This project welcomes contributions and suggestions.
+Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that
+you have the right to, and actually do, grant us the rights to use your contribution.
+For details, visit [Microsoft CLA](https://cla.microsoft.com).
-When you submit a pull request, a CLA-bot will automatically determine whether you need to provide a CLA and decorate the PR
-appropriately (e.g., label, comment). Simply follow the instructions provided by the bot. You will only need to do this once across all repos using our CLA.
+When you submit a pull request, a CLA-bot will automatically determine whether you need to
+provide a CLA and decorate the PR appropriately (e.g., label, comment).
+Simply follow the instructions provided by the bot.
+You will only need to do this once across all repos using our CLA.
-We also require that contributors sign their commits using git commit -s or git commit --signoff to certify they either authored the work themselves
-or otherwise have permission to use it in this project. Please see https://developercertificate.org/ for more info, as well as to make sure that you can
-attest to the rules listed. Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off.
+Additionally, the pull request pipeline requires the following steps to be performed before
+mergining.
+### Code Sign-Off
+
+We require that contributors sign their commits using [`git commit --signoff`][git-commit-s]
+to certify they either authored the work themselves or otherwise have permission to use it in this project.
+
+A range of commits can be signed off using [`git rebase --signoff`][git-rebase-s].
+
+Please see [the developer certificate](https://developercertificate.org) for more info,
+as well as to make sure that you can attest to the rules listed.
+Our CI uses the DCO Github app to ensure that all commits in a given PR are signed-off.
+
+### Linting
+
+Code must pass a linting stage, which uses [`golangci-lint`][lint].
+The linting settings are stored in [`.golangci.yaml`](./.golangci.yaml), and can be run
+automatically with VSCode by adding the following to your workspace or folder settings:
+
+```json
+ "go.lintTool": "golangci-lint",
+ "go.lintOnSave": "package",
+```
+
+Additional editor [integrations options are also available][lint-ide].
+
+Alternatively, `golangci-lint` can be [installed locally][lint-install] and run from the repo root:
+
+```shell
+# use . or specify a path to only lint a package
+# to show all lint errors, use flags "--max-issues-per-linter=0 --max-same-issues=0"
+> golangci-lint run ./...
+```
+
+### Go Generate
+
+The pipeline checks that auto-generated code, via `go generate`, are up to date.
+
+This can be done for the entire repo:
+
+```shell
+> go generate ./...
+```
## Code of Conduct
@@ -30,8 +74,16 @@ This project has adopted the [Microsoft Open Source Code of Conduct](https://ope
For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
+## Special Thanks
+Thanks to [natefinch][natefinch] for the inspiration for this library.
+See [npipe](https://github.com/natefinch/npipe) for another named pipe implementation.
-## Special Thanks
-Thanks to natefinch for the inspiration for this library. See https://github.com/natefinch/npipe
-for another named pipe implementation.
+[lint]: https://golangci-lint.run/
+[lint-ide]: https://golangci-lint.run/usage/integrations/#editor-integration
+[lint-install]: https://golangci-lint.run/usage/install/#local-installation
+
+[git-commit-s]: https://git-scm.com/docs/git-commit#Documentation/git-commit.txt--s
+[git-rebase-s]: https://git-scm.com/docs/git-rebase#Documentation/git-rebase.txt---signoff
+
+[natefinch]: https://github.com/natefinch
diff --git a/vendor/github.com/Microsoft/go-winio/SECURITY.md b/vendor/github.com/Microsoft/go-winio/SECURITY.md
new file mode 100644
index 0000000000..869fdfe2b2
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/SECURITY.md
@@ -0,0 +1,41 @@
+
+
+## Security
+
+Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).
+
+If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below.
+
+## Reporting Security Issues
+
+**Please do not report security vulnerabilities through public GitHub issues.**
+
+Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report).
+
+If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey).
+
+You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc).
+
+Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:
+
+ * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)
+ * Full paths of source file(s) related to the manifestation of the issue
+ * The location of the affected source code (tag/branch/commit or direct URL)
+ * Any special configuration required to reproduce the issue
+ * Step-by-step instructions to reproduce the issue
+ * Proof-of-concept or exploit code (if possible)
+ * Impact of the issue, including how an attacker might exploit the issue
+
+This information will help us triage your report more quickly.
+
+If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs.
+
+## Preferred Languages
+
+We prefer all communications to be in English.
+
+## Policy
+
+Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd).
+
+
diff --git a/vendor/github.com/Microsoft/go-winio/backup.go b/vendor/github.com/Microsoft/go-winio/backup.go
index 2be34af431..09621c8846 100644
--- a/vendor/github.com/Microsoft/go-winio/backup.go
+++ b/vendor/github.com/Microsoft/go-winio/backup.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package winio
@@ -7,11 +8,12 @@ import (
"errors"
"fmt"
"io"
- "io/ioutil"
"os"
"runtime"
"syscall"
"unicode/utf16"
+
+ "golang.org/x/sys/windows"
)
//sys backupRead(h syscall.Handle, b []byte, bytesRead *uint32, abort bool, processSecurity bool, context *uintptr) (err error) = BackupRead
@@ -24,7 +26,7 @@ const (
BackupAlternateData
BackupLink
BackupPropertyData
- BackupObjectId
+ BackupObjectId //revive:disable-line:var-naming ID, not Id
BackupReparseData
BackupSparseBlock
BackupTxfsData
@@ -34,14 +36,16 @@ const (
StreamSparseAttributes = uint32(8)
)
+//nolint:revive // var-naming: ALL_CAPS
const (
- WRITE_DAC = 0x40000
- WRITE_OWNER = 0x80000
- ACCESS_SYSTEM_SECURITY = 0x1000000
+ WRITE_DAC = windows.WRITE_DAC
+ WRITE_OWNER = windows.WRITE_OWNER
+ ACCESS_SYSTEM_SECURITY = windows.ACCESS_SYSTEM_SECURITY
)
// BackupHeader represents a backup stream of a file.
type BackupHeader struct {
+ //revive:disable-next-line:var-naming ID, not Id
Id uint32 // The backup stream ID
Attributes uint32 // Stream attributes
Size int64 // The size of the stream in bytes
@@ -49,8 +53,8 @@ type BackupHeader struct {
Offset int64 // The offset of the stream in the file (for BackupSparseBlock only).
}
-type win32StreamId struct {
- StreamId uint32
+type win32StreamID struct {
+ StreamID uint32
Attributes uint32
Size uint64
NameSize uint32
@@ -71,7 +75,7 @@ func NewBackupStreamReader(r io.Reader) *BackupStreamReader {
// Next returns the next backup stream and prepares for calls to Read(). It skips the remainder of the current stream if
// it was not completely read.
func (r *BackupStreamReader) Next() (*BackupHeader, error) {
- if r.bytesLeft > 0 {
+ if r.bytesLeft > 0 { //nolint:nestif // todo: flatten this
if s, ok := r.r.(io.Seeker); ok {
// Make sure Seek on io.SeekCurrent sometimes succeeds
// before trying the actual seek.
@@ -82,16 +86,16 @@ func (r *BackupStreamReader) Next() (*BackupHeader, error) {
r.bytesLeft = 0
}
}
- if _, err := io.Copy(ioutil.Discard, r); err != nil {
+ if _, err := io.Copy(io.Discard, r); err != nil {
return nil, err
}
}
- var wsi win32StreamId
+ var wsi win32StreamID
if err := binary.Read(r.r, binary.LittleEndian, &wsi); err != nil {
return nil, err
}
hdr := &BackupHeader{
- Id: wsi.StreamId,
+ Id: wsi.StreamID,
Attributes: wsi.Attributes,
Size: int64(wsi.Size),
}
@@ -102,7 +106,7 @@ func (r *BackupStreamReader) Next() (*BackupHeader, error) {
}
hdr.Name = syscall.UTF16ToString(name)
}
- if wsi.StreamId == BackupSparseBlock {
+ if wsi.StreamID == BackupSparseBlock {
if err := binary.Read(r.r, binary.LittleEndian, &hdr.Offset); err != nil {
return nil, err
}
@@ -147,8 +151,8 @@ func (w *BackupStreamWriter) WriteHeader(hdr *BackupHeader) error {
return fmt.Errorf("missing %d bytes", w.bytesLeft)
}
name := utf16.Encode([]rune(hdr.Name))
- wsi := win32StreamId{
- StreamId: hdr.Id,
+ wsi := win32StreamID{
+ StreamID: hdr.Id,
Attributes: hdr.Attributes,
Size: uint64(hdr.Size),
NameSize: uint32(len(name) * 2),
@@ -203,7 +207,7 @@ func (r *BackupFileReader) Read(b []byte) (int, error) {
var bytesRead uint32
err := backupRead(syscall.Handle(r.f.Fd()), b, &bytesRead, false, r.includeSecurity, &r.ctx)
if err != nil {
- return 0, &os.PathError{"BackupRead", r.f.Name(), err}
+ return 0, &os.PathError{Op: "BackupRead", Path: r.f.Name(), Err: err}
}
runtime.KeepAlive(r.f)
if bytesRead == 0 {
@@ -216,7 +220,7 @@ func (r *BackupFileReader) Read(b []byte) (int, error) {
// the underlying file.
func (r *BackupFileReader) Close() error {
if r.ctx != 0 {
- backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)
+ _ = backupRead(syscall.Handle(r.f.Fd()), nil, nil, true, false, &r.ctx)
runtime.KeepAlive(r.f)
r.ctx = 0
}
@@ -242,7 +246,7 @@ func (w *BackupFileWriter) Write(b []byte) (int, error) {
var bytesWritten uint32
err := backupWrite(syscall.Handle(w.f.Fd()), b, &bytesWritten, false, w.includeSecurity, &w.ctx)
if err != nil {
- return 0, &os.PathError{"BackupWrite", w.f.Name(), err}
+ return 0, &os.PathError{Op: "BackupWrite", Path: w.f.Name(), Err: err}
}
runtime.KeepAlive(w.f)
if int(bytesWritten) != len(b) {
@@ -255,7 +259,7 @@ func (w *BackupFileWriter) Write(b []byte) (int, error) {
// close the underlying file.
func (w *BackupFileWriter) Close() error {
if w.ctx != 0 {
- backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)
+ _ = backupWrite(syscall.Handle(w.f.Fd()), nil, nil, true, false, &w.ctx)
runtime.KeepAlive(w.f)
w.ctx = 0
}
@@ -271,7 +275,13 @@ func OpenForBackup(path string, access uint32, share uint32, createmode uint32)
if err != nil {
return nil, err
}
- h, err := syscall.CreateFile(&winPath[0], access, share, nil, createmode, syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT, 0)
+ h, err := syscall.CreateFile(&winPath[0],
+ access,
+ share,
+ nil,
+ createmode,
+ syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OPEN_REPARSE_POINT,
+ 0)
if err != nil {
err = &os.PathError{Op: "open", Path: path, Err: err}
return nil, err
diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/doc.go b/vendor/github.com/Microsoft/go-winio/backuptar/doc.go
new file mode 100644
index 0000000000..965d52ab04
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/backuptar/doc.go
@@ -0,0 +1,3 @@
+// This file only exists to allow go get on non-Windows platforms.
+
+package backuptar
diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/noop.go b/vendor/github.com/Microsoft/go-winio/backuptar/noop.go
deleted file mode 100644
index d39eccf023..0000000000
--- a/vendor/github.com/Microsoft/go-winio/backuptar/noop.go
+++ /dev/null
@@ -1,4 +0,0 @@
-// +build !windows
-// This file only exists to allow go get on non-Windows platforms.
-
-package backuptar
diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/strconv.go b/vendor/github.com/Microsoft/go-winio/backuptar/strconv.go
index 3416096639..455fd798eb 100644
--- a/vendor/github.com/Microsoft/go-winio/backuptar/strconv.go
+++ b/vendor/github.com/Microsoft/go-winio/backuptar/strconv.go
@@ -1,3 +1,5 @@
+//go:build windows
+
package backuptar
import (
diff --git a/vendor/github.com/Microsoft/go-winio/backuptar/tar.go b/vendor/github.com/Microsoft/go-winio/backuptar/tar.go
index 689e4da6bd..6b3b0cd519 100644
--- a/vendor/github.com/Microsoft/go-winio/backuptar/tar.go
+++ b/vendor/github.com/Microsoft/go-winio/backuptar/tar.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package backuptar
@@ -7,7 +8,6 @@ import (
"encoding/base64"
"fmt"
"io"
- "io/ioutil"
"path/filepath"
"strconv"
"strings"
@@ -18,17 +18,18 @@ import (
"golang.org/x/sys/windows"
)
+//nolint:deadcode,varcheck // keep unused constants for potential future use
const (
- c_ISUID = 04000 // Set uid
- c_ISGID = 02000 // Set gid
- c_ISVTX = 01000 // Save text (sticky bit)
- c_ISDIR = 040000 // Directory
- c_ISFIFO = 010000 // FIFO
- c_ISREG = 0100000 // Regular file
- c_ISLNK = 0120000 // Symbolic link
- c_ISBLK = 060000 // Block special file
- c_ISCHR = 020000 // Character special file
- c_ISSOCK = 0140000 // Socket
+ cISUID = 0004000 // Set uid
+ cISGID = 0002000 // Set gid
+ cISVTX = 0001000 // Save text (sticky bit)
+ cISDIR = 0040000 // Directory
+ cISFIFO = 0010000 // FIFO
+ cISREG = 0100000 // Regular file
+ cISLNK = 0120000 // Symbolic link
+ cISBLK = 0060000 // Block special file
+ cISCHR = 0020000 // Character special file
+ cISSOCK = 0140000 // Socket
)
const (
@@ -44,7 +45,7 @@ const (
// zeroReader is an io.Reader that always returns 0s.
type zeroReader struct{}
-func (zr zeroReader) Read(b []byte) (int, error) {
+func (zeroReader) Read(b []byte) (int, error) {
for i := range b {
b[i] = 0
}
@@ -55,7 +56,7 @@ func copySparse(t *tar.Writer, br *winio.BackupStreamReader) error {
curOffset := int64(0)
for {
bhdr, err := br.Next()
- if err == io.EOF {
+ if err == io.EOF { //nolint:errorlint
err = io.ErrUnexpectedEOF
}
if err != nil {
@@ -71,8 +72,8 @@ func copySparse(t *tar.Writer, br *winio.BackupStreamReader) error {
}
// archive/tar does not support writing sparse files
// so just write zeroes to catch up to the current offset.
- if _, err := io.CopyN(t, zeroReader{}, bhdr.Offset-curOffset); err != nil {
- return fmt.Errorf("seek to offset %d: %s", bhdr.Offset, err)
+ if _, err = io.CopyN(t, zeroReader{}, bhdr.Offset-curOffset); err != nil {
+ return fmt.Errorf("seek to offset %d: %w", bhdr.Offset, err)
}
if bhdr.Size == 0 {
// A sparse block with size = 0 is used to mark the end of the sparse blocks.
@@ -106,24 +107,84 @@ func BasicInfoHeader(name string, size int64, fileInfo *winio.FileBasicInfo) *ta
hdr.PAXRecords[hdrCreationTime] = formatPAXTime(time.Unix(0, fileInfo.CreationTime.Nanoseconds()))
if (fileInfo.FileAttributes & syscall.FILE_ATTRIBUTE_DIRECTORY) != 0 {
- hdr.Mode |= c_ISDIR
+ hdr.Mode |= cISDIR
hdr.Size = 0
hdr.Typeflag = tar.TypeDir
}
return hdr
}
+// SecurityDescriptorFromTarHeader reads the SDDL associated with the header of the current file
+// from the tar header and returns the security descriptor into a byte slice.
+func SecurityDescriptorFromTarHeader(hdr *tar.Header) ([]byte, error) {
+ if sdraw, ok := hdr.PAXRecords[hdrRawSecurityDescriptor]; ok {
+ sd, err := base64.StdEncoding.DecodeString(sdraw)
+ if err != nil {
+ // Not returning sd as-is in the error-case, as base64.DecodeString
+ // may return partially decoded data (not nil or empty slice) in case
+ // of a failure: https://github.com/golang/go/blob/go1.17.7/src/encoding/base64/base64.go#L382-L387
+ return nil, err
+ }
+ return sd, nil
+ }
+ // Maintaining old SDDL-based behavior for backward compatibility. All new
+ // tar headers written by this library will have raw binary for the security
+ // descriptor.
+ if sddl, ok := hdr.PAXRecords[hdrSecurityDescriptor]; ok {
+ return winio.SddlToSecurityDescriptor(sddl)
+ }
+ return nil, nil
+}
+
+// ExtendedAttributesFromTarHeader reads the EAs associated with the header of the
+// current file from the tar header and returns it as a byte slice.
+func ExtendedAttributesFromTarHeader(hdr *tar.Header) ([]byte, error) {
+ var eas []winio.ExtendedAttribute //nolint:prealloc // len(eas) <= len(hdr.PAXRecords); prealloc is wasteful
+ for k, v := range hdr.PAXRecords {
+ if !strings.HasPrefix(k, hdrEaPrefix) {
+ continue
+ }
+ data, err := base64.StdEncoding.DecodeString(v)
+ if err != nil {
+ return nil, err
+ }
+ eas = append(eas, winio.ExtendedAttribute{
+ Name: k[len(hdrEaPrefix):],
+ Value: data,
+ })
+ }
+ var eaData []byte
+ var err error
+ if len(eas) != 0 {
+ eaData, err = winio.EncodeExtendedAttributes(eas)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return eaData, nil
+}
+
+// EncodeReparsePointFromTarHeader reads the ReparsePoint structure from the tar header
+// and encodes it into a byte slice. The file for which this function is called must be a
+// symlink.
+func EncodeReparsePointFromTarHeader(hdr *tar.Header) []byte {
+ _, isMountPoint := hdr.PAXRecords[hdrMountPoint]
+ rp := winio.ReparsePoint{
+ Target: filepath.FromSlash(hdr.Linkname),
+ IsMountPoint: isMountPoint,
+ }
+ return winio.EncodeReparsePoint(&rp)
+}
+
// WriteTarFileFromBackupStream writes a file to a tar writer using data from a Win32 backup stream.
//
// This encodes Win32 metadata as tar pax vendor extensions starting with MSWINDOWS.
//
// The additional Win32 metadata is:
//
-// MSWINDOWS.fileattr: The Win32 file attributes, as a decimal value
-//
-// MSWINDOWS.rawsd: The Win32 security descriptor, in raw binary format
-//
-// MSWINDOWS.mountpoint: If present, this is a mount point and not a symlink, even though the type is '2' (symlink)
+// - MSWINDOWS.fileattr: The Win32 file attributes, as a decimal value
+// - MSWINDOWS.rawsd: The Win32 security descriptor, in raw binary format
+// - MSWINDOWS.mountpoint: If present, this is a mount point and not a symlink, even though the type is '2' (symlink)
func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size int64, fileInfo *winio.FileBasicInfo) error {
name = filepath.ToSlash(name)
hdr := BasicInfoHeader(name, size, fileInfo)
@@ -146,7 +207,7 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
var dataHdr *winio.BackupHeader
for dataHdr == nil {
bhdr, err := br.Next()
- if err == io.EOF {
+ if err == io.EOF { //nolint:errorlint
break
}
if err != nil {
@@ -154,21 +215,21 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
}
switch bhdr.Id {
case winio.BackupData:
- hdr.Mode |= c_ISREG
+ hdr.Mode |= cISREG
if !readTwice {
dataHdr = bhdr
}
case winio.BackupSecurity:
- sd, err := ioutil.ReadAll(br)
+ sd, err := io.ReadAll(br)
if err != nil {
return err
}
hdr.PAXRecords[hdrRawSecurityDescriptor] = base64.StdEncoding.EncodeToString(sd)
case winio.BackupReparseData:
- hdr.Mode |= c_ISLNK
+ hdr.Mode |= cISLNK
hdr.Typeflag = tar.TypeSymlink
- reparseBuffer, err := ioutil.ReadAll(br)
+ reparseBuffer, _ := io.ReadAll(br)
rp, err := winio.DecodeReparsePoint(reparseBuffer)
if err != nil {
return err
@@ -179,7 +240,7 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
hdr.Linkname = rp.Target
case winio.BackupEaData:
- eab, err := ioutil.ReadAll(br)
+ eab, err := io.ReadAll(br)
if err != nil {
return err
}
@@ -213,7 +274,7 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
}
for dataHdr == nil {
bhdr, err := br.Next()
- if err == io.EOF {
+ if err == io.EOF { //nolint:errorlint
break
}
if err != nil {
@@ -248,7 +309,7 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
// range of the file containing the range contents. Finally there is a sparse block stream with
// size = 0 and offset = .
- if dataHdr != nil {
+ if dataHdr != nil { //nolint:nestif // todo: reduce nesting complexity
// A data stream was found. Copy the data.
// We assume that we will either have a data stream size > 0 XOR have sparse block streams.
if dataHdr.Size > 0 || (dataHdr.Attributes&winio.StreamSparseAttributes) == 0 {
@@ -256,13 +317,13 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
return fmt.Errorf("%s: mismatch between file size %d and header size %d", name, size, dataHdr.Size)
}
if _, err = io.Copy(t, br); err != nil {
- return fmt.Errorf("%s: copying contents from data stream: %s", name, err)
+ return fmt.Errorf("%s: copying contents from data stream: %w", name, err)
}
} else if size > 0 {
// As of a recent OS change, BackupRead now returns a data stream for empty sparse files.
// These files have no sparse block streams, so skip the copySparse call if file size = 0.
if err = copySparse(t, br); err != nil {
- return fmt.Errorf("%s: copying contents from sparse block stream: %s", name, err)
+ return fmt.Errorf("%s: copying contents from sparse block stream: %w", name, err)
}
}
}
@@ -272,7 +333,7 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
// been written. In practice, this means that we don't get EA or TXF metadata.
for {
bhdr, err := br.Next()
- if err == io.EOF {
+ if err == io.EOF { //nolint:errorlint
break
}
if err != nil {
@@ -280,35 +341,30 @@ func WriteTarFileFromBackupStream(t *tar.Writer, r io.Reader, name string, size
}
switch bhdr.Id {
case winio.BackupAlternateData:
- altName := bhdr.Name
- if strings.HasSuffix(altName, ":$DATA") {
- altName = altName[:len(altName)-len(":$DATA")]
- }
- if (bhdr.Attributes & winio.StreamSparseAttributes) == 0 {
- hdr = &tar.Header{
- Format: hdr.Format,
- Name: name + altName,
- Mode: hdr.Mode,
- Typeflag: tar.TypeReg,
- Size: bhdr.Size,
- ModTime: hdr.ModTime,
- AccessTime: hdr.AccessTime,
- ChangeTime: hdr.ChangeTime,
- }
- err = t.WriteHeader(hdr)
- if err != nil {
- return err
- }
- _, err = io.Copy(t, br)
- if err != nil {
- return err
- }
-
- } else {
+ if (bhdr.Attributes & winio.StreamSparseAttributes) != 0 {
// Unsupported for now, since the size of the alternate stream is not present
// in the backup stream until after the data has been read.
return fmt.Errorf("%s: tar of sparse alternate data streams is unsupported", name)
}
+ altName := strings.TrimSuffix(bhdr.Name, ":$DATA")
+ hdr = &tar.Header{
+ Format: hdr.Format,
+ Name: name + altName,
+ Mode: hdr.Mode,
+ Typeflag: tar.TypeReg,
+ Size: bhdr.Size,
+ ModTime: hdr.ModTime,
+ AccessTime: hdr.AccessTime,
+ ChangeTime: hdr.ChangeTime,
+ }
+ err = t.WriteHeader(hdr)
+ if err != nil {
+ return err
+ }
+ _, err = io.Copy(t, br)
+ if err != nil {
+ return err
+ }
case winio.BackupEaData, winio.BackupLink, winio.BackupPropertyData, winio.BackupObjectId, winio.BackupTxfsData:
// ignore these streams
default:
@@ -350,7 +406,7 @@ func FileInfoFromHeader(hdr *tar.Header) (name string, size int64, fileInfo *win
}
fileInfo.CreationTime = windows.NsecToFiletime(creationTime.UnixNano())
}
- return
+ return name, size, fileInfo, err
}
// WriteBackupStreamFromTarFile writes a Win32 backup stream from the current tar file. Since this function may process multiple
@@ -358,21 +414,10 @@ func FileInfoFromHeader(hdr *tar.Header) (name string, size int64, fileInfo *win
// tar file that was not processed, or io.EOF is there are no more.
func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (*tar.Header, error) {
bw := winio.NewBackupStreamWriter(w)
- var sd []byte
- var err error
- // Maintaining old SDDL-based behavior for backward compatibility. All new tar headers written
- // by this library will have raw binary for the security descriptor.
- if sddl, ok := hdr.PAXRecords[hdrSecurityDescriptor]; ok {
- sd, err = winio.SddlToSecurityDescriptor(sddl)
- if err != nil {
- return nil, err
- }
- }
- if sdraw, ok := hdr.PAXRecords[hdrRawSecurityDescriptor]; ok {
- sd, err = base64.StdEncoding.DecodeString(sdraw)
- if err != nil {
- return nil, err
- }
+
+ sd, err := SecurityDescriptorFromTarHeader(hdr)
+ if err != nil {
+ return nil, err
}
if len(sd) != 0 {
bhdr := winio.BackupHeader{
@@ -388,25 +433,12 @@ func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (
return nil, err
}
}
- var eas []winio.ExtendedAttribute
- for k, v := range hdr.PAXRecords {
- if !strings.HasPrefix(k, hdrEaPrefix) {
- continue
- }
- data, err := base64.StdEncoding.DecodeString(v)
- if err != nil {
- return nil, err
- }
- eas = append(eas, winio.ExtendedAttribute{
- Name: k[len(hdrEaPrefix):],
- Value: data,
- })
+
+ eadata, err := ExtendedAttributesFromTarHeader(hdr)
+ if err != nil {
+ return nil, err
}
- if len(eas) != 0 {
- eadata, err := winio.EncodeExtendedAttributes(eas)
- if err != nil {
- return nil, err
- }
+ if len(eadata) != 0 {
bhdr := winio.BackupHeader{
Id: winio.BackupEaData,
Size: int64(len(eadata)),
@@ -420,13 +452,9 @@ func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (
return nil, err
}
}
+
if hdr.Typeflag == tar.TypeSymlink {
- _, isMountPoint := hdr.PAXRecords[hdrMountPoint]
- rp := winio.ReparsePoint{
- Target: filepath.FromSlash(hdr.Linkname),
- IsMountPoint: isMountPoint,
- }
- reparse := winio.EncodeReparsePoint(&rp)
+ reparse := EncodeReparsePointFromTarHeader(hdr)
bhdr := winio.BackupHeader{
Id: winio.BackupReparseData,
Size: int64(len(reparse)),
@@ -440,6 +468,7 @@ func WriteBackupStreamFromTarFile(w io.Writer, t *tar.Reader, hdr *tar.Header) (
return nil, err
}
}
+
if hdr.Typeflag == tar.TypeReg || hdr.Typeflag == tar.TypeRegA {
bhdr := winio.BackupHeader{
Id: winio.BackupData,
diff --git a/vendor/github.com/Microsoft/go-winio/doc.go b/vendor/github.com/Microsoft/go-winio/doc.go
new file mode 100644
index 0000000000..1f5bfe2d54
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/doc.go
@@ -0,0 +1,22 @@
+// This package provides utilities for efficiently performing Win32 IO operations in Go.
+// Currently, this package is provides support for genreal IO and management of
+// - named pipes
+// - files
+// - [Hyper-V sockets]
+//
+// This code is similar to Go's [net] package, and uses IO completion ports to avoid
+// blocking IO on system threads, allowing Go to reuse the thread to schedule other goroutines.
+//
+// This limits support to Windows Vista and newer operating systems.
+//
+// Additionally, this package provides support for:
+// - creating and managing GUIDs
+// - writing to [ETW]
+// - opening and manageing VHDs
+// - parsing [Windows Image files]
+// - auto-generating Win32 API code
+//
+// [Hyper-V sockets]: https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service
+// [ETW]: https://docs.microsoft.com/en-us/windows-hardware/drivers/devtest/event-tracing-for-windows--etw-
+// [Windows Image files]: https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/work-with-windows-images
+package winio
diff --git a/vendor/github.com/Microsoft/go-winio/ea.go b/vendor/github.com/Microsoft/go-winio/ea.go
index 4051c1b33b..e104dbdfdf 100644
--- a/vendor/github.com/Microsoft/go-winio/ea.go
+++ b/vendor/github.com/Microsoft/go-winio/ea.go
@@ -33,7 +33,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
err = binary.Read(bytes.NewReader(b), binary.LittleEndian, &info)
if err != nil {
err = errInvalidEaBuffer
- return
+ return ea, nb, err
}
nameOffset := fileFullEaInformationSize
@@ -43,7 +43,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
nextOffset := int(info.NextEntryOffset)
if valueLen+valueOffset > len(b) || nextOffset < 0 || nextOffset > len(b) {
err = errInvalidEaBuffer
- return
+ return ea, nb, err
}
ea.Name = string(b[nameOffset : nameOffset+nameLen])
@@ -52,7 +52,7 @@ func parseEa(b []byte) (ea ExtendedAttribute, nb []byte, err error) {
if info.NextEntryOffset != 0 {
nb = b[info.NextEntryOffset:]
}
- return
+ return ea, nb, err
}
// DecodeExtendedAttributes decodes a list of EAs from a FILE_FULL_EA_INFORMATION
@@ -67,7 +67,7 @@ func DecodeExtendedAttributes(b []byte) (eas []ExtendedAttribute, err error) {
eas = append(eas, ea)
b = nb
}
- return
+ return eas, err
}
func writeEa(buf *bytes.Buffer, ea *ExtendedAttribute, last bool) error {
diff --git a/vendor/github.com/Microsoft/go-winio/file.go b/vendor/github.com/Microsoft/go-winio/file.go
index 0385e41081..175a99d3f4 100644
--- a/vendor/github.com/Microsoft/go-winio/file.go
+++ b/vendor/github.com/Microsoft/go-winio/file.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package winio
@@ -10,6 +11,8 @@ import (
"sync/atomic"
"syscall"
"time"
+
+ "golang.org/x/sys/windows"
)
//sys cancelIoEx(file syscall.Handle, o *syscall.Overlapped) (err error) = CancelIoEx
@@ -23,6 +26,8 @@ type atomicBool int32
func (b *atomicBool) isSet() bool { return atomic.LoadInt32((*int32)(b)) != 0 }
func (b *atomicBool) setFalse() { atomic.StoreInt32((*int32)(b), 0) }
func (b *atomicBool) setTrue() { atomic.StoreInt32((*int32)(b), 1) }
+
+//revive:disable-next-line:predeclared Keep "new" to maintain consistency with "atomic" pkg
func (b *atomicBool) swap(new bool) bool {
var newInt int32
if new {
@@ -31,11 +36,6 @@ func (b *atomicBool) swap(new bool) bool {
return atomic.SwapInt32((*int32)(b), newInt) == 1
}
-const (
- cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
- cFILE_SKIP_SET_EVENT_ON_HANDLE = 2
-)
-
var (
ErrFileClosed = errors.New("file has already been closed")
ErrTimeout = &timeoutError{}
@@ -43,28 +43,28 @@ var (
type timeoutError struct{}
-func (e *timeoutError) Error() string { return "i/o timeout" }
-func (e *timeoutError) Timeout() bool { return true }
-func (e *timeoutError) Temporary() bool { return true }
+func (*timeoutError) Error() string { return "i/o timeout" }
+func (*timeoutError) Timeout() bool { return true }
+func (*timeoutError) Temporary() bool { return true }
type timeoutChan chan struct{}
var ioInitOnce sync.Once
var ioCompletionPort syscall.Handle
-// ioResult contains the result of an asynchronous IO operation
+// ioResult contains the result of an asynchronous IO operation.
type ioResult struct {
bytes uint32
err error
}
-// ioOperation represents an outstanding asynchronous Win32 IO
+// ioOperation represents an outstanding asynchronous Win32 IO.
type ioOperation struct {
o syscall.Overlapped
ch chan ioResult
}
-func initIo() {
+func initIO() {
h, err := createIoCompletionPort(syscall.InvalidHandle, 0, 0, 0xffffffff)
if err != nil {
panic(err)
@@ -93,15 +93,15 @@ type deadlineHandler struct {
timedout atomicBool
}
-// makeWin32File makes a new win32File from an existing file handle
+// makeWin32File makes a new win32File from an existing file handle.
func makeWin32File(h syscall.Handle) (*win32File, error) {
f := &win32File{handle: h}
- ioInitOnce.Do(initIo)
+ ioInitOnce.Do(initIO)
_, err := createIoCompletionPort(h, ioCompletionPort, 0, 0xffffffff)
if err != nil {
return nil, err
}
- err = setFileCompletionNotificationModes(h, cFILE_SKIP_COMPLETION_PORT_ON_SUCCESS|cFILE_SKIP_SET_EVENT_ON_HANDLE)
+ err = setFileCompletionNotificationModes(h, windows.FILE_SKIP_COMPLETION_PORT_ON_SUCCESS|windows.FILE_SKIP_SET_EVENT_ON_HANDLE)
if err != nil {
return nil, err
}
@@ -120,14 +120,14 @@ func MakeOpenFile(h syscall.Handle) (io.ReadWriteCloser, error) {
return f, nil
}
-// closeHandle closes the resources associated with a Win32 handle
+// closeHandle closes the resources associated with a Win32 handle.
func (f *win32File) closeHandle() {
f.wgLock.Lock()
// Atomically set that we are closing, releasing the resources only once.
if !f.closing.swap(true) {
f.wgLock.Unlock()
// cancel all IO and wait for it to complete
- cancelIoEx(f.handle, nil)
+ _ = cancelIoEx(f.handle, nil)
f.wg.Wait()
// at this point, no new IO can start
syscall.Close(f.handle)
@@ -143,9 +143,14 @@ func (f *win32File) Close() error {
return nil
}
-// prepareIo prepares for a new IO operation.
+// IsClosed checks if the file has been closed.
+func (f *win32File) IsClosed() bool {
+ return f.closing.isSet()
+}
+
+// prepareIO prepares for a new IO operation.
// The caller must call f.wg.Done() when the IO is finished, prior to Close() returning.
-func (f *win32File) prepareIo() (*ioOperation, error) {
+func (f *win32File) prepareIO() (*ioOperation, error) {
f.wgLock.RLock()
if f.closing.isSet() {
f.wgLock.RUnlock()
@@ -158,7 +163,7 @@ func (f *win32File) prepareIo() (*ioOperation, error) {
return c, nil
}
-// ioCompletionProcessor processes completed async IOs forever
+// ioCompletionProcessor processes completed async IOs forever.
func ioCompletionProcessor(h syscall.Handle) {
for {
var bytes uint32
@@ -172,15 +177,17 @@ func ioCompletionProcessor(h syscall.Handle) {
}
}
-// asyncIo processes the return value from ReadFile or WriteFile, blocking until
+// todo: helsaawy - create an asyncIO version that takes a context
+
+// asyncIO processes the return value from ReadFile or WriteFile, blocking until
// the operation has actually completed.
-func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {
- if err != syscall.ERROR_IO_PENDING {
+func (f *win32File) asyncIO(c *ioOperation, d *deadlineHandler, bytes uint32, err error) (int, error) {
+ if err != syscall.ERROR_IO_PENDING { //nolint:errorlint // err is Errno
return int(bytes), err
}
if f.closing.isSet() {
- cancelIoEx(f.handle, &c.o)
+ _ = cancelIoEx(f.handle, &c.o)
}
var timeout timeoutChan
@@ -194,7 +201,7 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
select {
case r = <-c.ch:
err = r.err
- if err == syscall.ERROR_OPERATION_ABORTED {
+ if err == syscall.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno
if f.closing.isSet() {
err = ErrFileClosed
}
@@ -204,10 +211,10 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
err = wsaGetOverlappedResult(f.handle, &c.o, &bytes, false, &flags)
}
case <-timeout:
- cancelIoEx(f.handle, &c.o)
+ _ = cancelIoEx(f.handle, &c.o)
r = <-c.ch
err = r.err
- if err == syscall.ERROR_OPERATION_ABORTED {
+ if err == syscall.ERROR_OPERATION_ABORTED { //nolint:errorlint // err is Errno
err = ErrTimeout
}
}
@@ -215,13 +222,14 @@ func (f *win32File) asyncIo(c *ioOperation, d *deadlineHandler, bytes uint32, er
// runtime.KeepAlive is needed, as c is passed via native
// code to ioCompletionProcessor, c must remain alive
// until the channel read is complete.
+ // todo: (de)allocate *ioOperation via win32 heap functions, instead of needing to KeepAlive?
runtime.KeepAlive(c)
return int(r.bytes), err
}
// Read reads from a file handle.
func (f *win32File) Read(b []byte) (int, error) {
- c, err := f.prepareIo()
+ c, err := f.prepareIO()
if err != nil {
return 0, err
}
@@ -233,13 +241,13 @@ func (f *win32File) Read(b []byte) (int, error) {
var bytes uint32
err = syscall.ReadFile(f.handle, b, &bytes, &c.o)
- n, err := f.asyncIo(c, &f.readDeadline, bytes, err)
+ n, err := f.asyncIO(c, &f.readDeadline, bytes, err)
runtime.KeepAlive(b)
// Handle EOF conditions.
if err == nil && n == 0 && len(b) != 0 {
return 0, io.EOF
- } else if err == syscall.ERROR_BROKEN_PIPE {
+ } else if err == syscall.ERROR_BROKEN_PIPE { //nolint:errorlint // err is Errno
return 0, io.EOF
} else {
return n, err
@@ -248,7 +256,7 @@ func (f *win32File) Read(b []byte) (int, error) {
// Write writes to a file handle.
func (f *win32File) Write(b []byte) (int, error) {
- c, err := f.prepareIo()
+ c, err := f.prepareIO()
if err != nil {
return 0, err
}
@@ -260,7 +268,7 @@ func (f *win32File) Write(b []byte) (int, error) {
var bytes uint32
err = syscall.WriteFile(f.handle, b, &bytes, &c.o)
- n, err := f.asyncIo(c, &f.writeDeadline, bytes, err)
+ n, err := f.asyncIO(c, &f.writeDeadline, bytes, err)
runtime.KeepAlive(b)
return n, err
}
diff --git a/vendor/github.com/Microsoft/go-winio/fileinfo.go b/vendor/github.com/Microsoft/go-winio/fileinfo.go
index 3ab6bff69c..702950e72a 100644
--- a/vendor/github.com/Microsoft/go-winio/fileinfo.go
+++ b/vendor/github.com/Microsoft/go-winio/fileinfo.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package winio
@@ -14,13 +15,18 @@ import (
type FileBasicInfo struct {
CreationTime, LastAccessTime, LastWriteTime, ChangeTime windows.Filetime
FileAttributes uint32
- pad uint32 // padding
+ _ uint32 // padding
}
// GetFileBasicInfo retrieves times and attributes for a file.
func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
bi := &FileBasicInfo{}
- if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
+ if err := windows.GetFileInformationByHandleEx(
+ windows.Handle(f.Fd()),
+ windows.FileBasicInfo,
+ (*byte)(unsafe.Pointer(bi)),
+ uint32(unsafe.Sizeof(*bi)),
+ ); err != nil {
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
}
runtime.KeepAlive(f)
@@ -29,7 +35,12 @@ func GetFileBasicInfo(f *os.File) (*FileBasicInfo, error) {
// SetFileBasicInfo sets times and attributes for a file.
func SetFileBasicInfo(f *os.File, bi *FileBasicInfo) error {
- if err := windows.SetFileInformationByHandle(windows.Handle(f.Fd()), windows.FileBasicInfo, (*byte)(unsafe.Pointer(bi)), uint32(unsafe.Sizeof(*bi))); err != nil {
+ if err := windows.SetFileInformationByHandle(
+ windows.Handle(f.Fd()),
+ windows.FileBasicInfo,
+ (*byte)(unsafe.Pointer(bi)),
+ uint32(unsafe.Sizeof(*bi)),
+ ); err != nil {
return &os.PathError{Op: "SetFileInformationByHandle", Path: f.Name(), Err: err}
}
runtime.KeepAlive(f)
@@ -48,7 +59,10 @@ type FileStandardInfo struct {
// GetFileStandardInfo retrieves ended information for the file.
func GetFileStandardInfo(f *os.File) (*FileStandardInfo, error) {
si := &FileStandardInfo{}
- if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileStandardInfo, (*byte)(unsafe.Pointer(si)), uint32(unsafe.Sizeof(*si))); err != nil {
+ if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()),
+ windows.FileStandardInfo,
+ (*byte)(unsafe.Pointer(si)),
+ uint32(unsafe.Sizeof(*si))); err != nil {
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
}
runtime.KeepAlive(f)
@@ -65,7 +79,12 @@ type FileIDInfo struct {
// GetFileID retrieves the unique (volume, file ID) pair for a file.
func GetFileID(f *os.File) (*FileIDInfo, error) {
fileID := &FileIDInfo{}
- if err := windows.GetFileInformationByHandleEx(windows.Handle(f.Fd()), windows.FileIdInfo, (*byte)(unsafe.Pointer(fileID)), uint32(unsafe.Sizeof(*fileID))); err != nil {
+ if err := windows.GetFileInformationByHandleEx(
+ windows.Handle(f.Fd()),
+ windows.FileIdInfo,
+ (*byte)(unsafe.Pointer(fileID)),
+ uint32(unsafe.Sizeof(*fileID)),
+ ); err != nil {
return nil, &os.PathError{Op: "GetFileInformationByHandleEx", Path: f.Name(), Err: err}
}
runtime.KeepAlive(f)
diff --git a/vendor/github.com/Microsoft/go-winio/hvsock.go b/vendor/github.com/Microsoft/go-winio/hvsock.go
index b632f8f8bb..c881916583 100644
--- a/vendor/github.com/Microsoft/go-winio/hvsock.go
+++ b/vendor/github.com/Microsoft/go-winio/hvsock.go
@@ -1,8 +1,11 @@
+//go:build windows
// +build windows
package winio
import (
+ "context"
+ "errors"
"fmt"
"io"
"net"
@@ -11,16 +14,87 @@ import (
"time"
"unsafe"
+ "golang.org/x/sys/windows"
+
+ "github.com/Microsoft/go-winio/internal/socket"
"github.com/Microsoft/go-winio/pkg/guid"
)
-//sys bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind
+const afHVSock = 34 // AF_HYPERV
-const (
- afHvSock = 34 // AF_HYPERV
+// Well known Service and VM IDs
+// https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/make-integration-service#vmid-wildcards
- socketError = ^uintptr(0)
-)
+// HvsockGUIDWildcard is the wildcard VmId for accepting connections from all partitions.
+func HvsockGUIDWildcard() guid.GUID { // 00000000-0000-0000-0000-000000000000
+ return guid.GUID{}
+}
+
+// HvsockGUIDBroadcast is the wildcard VmId for broadcasting sends to all partitions.
+func HvsockGUIDBroadcast() guid.GUID { // ffffffff-ffff-ffff-ffff-ffffffffffff
+ return guid.GUID{
+ Data1: 0xffffffff,
+ Data2: 0xffff,
+ Data3: 0xffff,
+ Data4: [8]uint8{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
+ }
+}
+
+// HvsockGUIDLoopback is the Loopback VmId for accepting connections to the same partition as the connector.
+func HvsockGUIDLoopback() guid.GUID { // e0e16197-dd56-4a10-9195-5ee7a155a838
+ return guid.GUID{
+ Data1: 0xe0e16197,
+ Data2: 0xdd56,
+ Data3: 0x4a10,
+ Data4: [8]uint8{0x91, 0x95, 0x5e, 0xe7, 0xa1, 0x55, 0xa8, 0x38},
+ }
+}
+
+// HvsockGUIDSiloHost is the address of a silo's host partition:
+// - The silo host of a hosted silo is the utility VM.
+// - The silo host of a silo on a physical host is the physical host.
+func HvsockGUIDSiloHost() guid.GUID { // 36bd0c5c-7276-4223-88ba-7d03b654c568
+ return guid.GUID{
+ Data1: 0x36bd0c5c,
+ Data2: 0x7276,
+ Data3: 0x4223,
+ Data4: [8]byte{0x88, 0xba, 0x7d, 0x03, 0xb6, 0x54, 0xc5, 0x68},
+ }
+}
+
+// HvsockGUIDChildren is the wildcard VmId for accepting connections from the connector's child partitions.
+func HvsockGUIDChildren() guid.GUID { // 90db8b89-0d35-4f79-8ce9-49ea0ac8b7cd
+ return guid.GUID{
+ Data1: 0x90db8b89,
+ Data2: 0xd35,
+ Data3: 0x4f79,
+ Data4: [8]uint8{0x8c, 0xe9, 0x49, 0xea, 0xa, 0xc8, 0xb7, 0xcd},
+ }
+}
+
+// HvsockGUIDParent is the wildcard VmId for accepting connections from the connector's parent partition.
+// Listening on this VmId accepts connection from:
+// - Inside silos: silo host partition.
+// - Inside hosted silo: host of the VM.
+// - Inside VM: VM host.
+// - Physical host: Not supported.
+func HvsockGUIDParent() guid.GUID { // a42e7cda-d03f-480c-9cc2-a4de20abb878
+ return guid.GUID{
+ Data1: 0xa42e7cda,
+ Data2: 0xd03f,
+ Data3: 0x480c,
+ Data4: [8]uint8{0x9c, 0xc2, 0xa4, 0xde, 0x20, 0xab, 0xb8, 0x78},
+ }
+}
+
+// hvsockVsockServiceTemplate is the Service GUID used for the VSOCK protocol.
+func hvsockVsockServiceTemplate() guid.GUID { // 00000000-facb-11e6-bd58-64006a7986d3
+ return guid.GUID{
+ Data2: 0xfacb,
+ Data3: 0x11e6,
+ Data4: [8]uint8{0xbd, 0x58, 0x64, 0x00, 0x6a, 0x79, 0x86, 0xd3},
+ }
+}
// An HvsockAddr is an address for a AF_HYPERV socket.
type HvsockAddr struct {
@@ -35,8 +109,10 @@ type rawHvsockAddr struct {
ServiceID guid.GUID
}
+var _ socket.RawSockaddr = &rawHvsockAddr{}
+
// Network returns the address's network name, "hvsock".
-func (addr *HvsockAddr) Network() string {
+func (*HvsockAddr) Network() string {
return "hvsock"
}
@@ -46,14 +122,14 @@ func (addr *HvsockAddr) String() string {
// VsockServiceID returns an hvsock service ID corresponding to the specified AF_VSOCK port.
func VsockServiceID(port uint32) guid.GUID {
- g, _ := guid.FromString("00000000-facb-11e6-bd58-64006a7986d3")
+ g := hvsockVsockServiceTemplate() // make a copy
g.Data1 = port
return g
}
func (addr *HvsockAddr) raw() rawHvsockAddr {
return rawHvsockAddr{
- Family: afHvSock,
+ Family: afHVSock,
VMID: addr.VMID,
ServiceID: addr.ServiceID,
}
@@ -64,20 +140,48 @@ func (addr *HvsockAddr) fromRaw(raw *rawHvsockAddr) {
addr.ServiceID = raw.ServiceID
}
+// Sockaddr returns a pointer to and the size of this struct.
+//
+// Implements the [socket.RawSockaddr] interface, and allows use in
+// [socket.Bind] and [socket.ConnectEx].
+func (r *rawHvsockAddr) Sockaddr() (unsafe.Pointer, int32, error) {
+ return unsafe.Pointer(r), int32(unsafe.Sizeof(rawHvsockAddr{})), nil
+}
+
+// Sockaddr interface allows use with `sockets.Bind()` and `.ConnectEx()`.
+func (r *rawHvsockAddr) FromBytes(b []byte) error {
+ n := int(unsafe.Sizeof(rawHvsockAddr{}))
+
+ if len(b) < n {
+ return fmt.Errorf("got %d, want %d: %w", len(b), n, socket.ErrBufferSize)
+ }
+
+ copy(unsafe.Slice((*byte)(unsafe.Pointer(r)), n), b[:n])
+ if r.Family != afHVSock {
+ return fmt.Errorf("got %d, want %d: %w", r.Family, afHVSock, socket.ErrAddrFamily)
+ }
+
+ return nil
+}
+
// HvsockListener is a socket listener for the AF_HYPERV address family.
type HvsockListener struct {
sock *win32File
addr HvsockAddr
}
+var _ net.Listener = &HvsockListener{}
+
// HvsockConn is a connected socket of the AF_HYPERV address family.
type HvsockConn struct {
sock *win32File
local, remote HvsockAddr
}
-func newHvSocket() (*win32File, error) {
- fd, err := syscall.Socket(afHvSock, syscall.SOCK_STREAM, 1)
+var _ net.Conn = &HvsockConn{}
+
+func newHVSocket() (*win32File, error) {
+ fd, err := syscall.Socket(afHVSock, syscall.SOCK_STREAM, 1)
if err != nil {
return nil, os.NewSyscallError("socket", err)
}
@@ -93,12 +197,12 @@ func newHvSocket() (*win32File, error) {
// ListenHvsock listens for connections on the specified hvsock address.
func ListenHvsock(addr *HvsockAddr) (_ *HvsockListener, err error) {
l := &HvsockListener{addr: *addr}
- sock, err := newHvSocket()
+ sock, err := newHVSocket()
if err != nil {
return nil, l.opErr("listen", err)
}
sa := addr.raw()
- err = bind(sock.handle, unsafe.Pointer(&sa), int32(unsafe.Sizeof(sa)))
+ err = socket.Bind(windows.Handle(sock.handle), &sa)
if err != nil {
return nil, l.opErr("listen", os.NewSyscallError("socket", err))
}
@@ -120,7 +224,7 @@ func (l *HvsockListener) Addr() net.Addr {
// Accept waits for the next connection and returns it.
func (l *HvsockListener) Accept() (_ net.Conn, err error) {
- sock, err := newHvSocket()
+ sock, err := newHVSocket()
if err != nil {
return nil, l.opErr("accept", err)
}
@@ -129,27 +233,42 @@ func (l *HvsockListener) Accept() (_ net.Conn, err error) {
sock.Close()
}
}()
- c, err := l.sock.prepareIo()
+ c, err := l.sock.prepareIO()
if err != nil {
return nil, l.opErr("accept", err)
}
defer l.sock.wg.Done()
// AcceptEx, per documentation, requires an extra 16 bytes per address.
+ //
+ // https://docs.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex
const addrlen = uint32(16 + unsafe.Sizeof(rawHvsockAddr{}))
var addrbuf [addrlen * 2]byte
var bytes uint32
- err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0, addrlen, addrlen, &bytes, &c.o)
- _, err = l.sock.asyncIo(c, nil, bytes, err)
- if err != nil {
+ err = syscall.AcceptEx(l.sock.handle, sock.handle, &addrbuf[0], 0 /* rxdatalen */, addrlen, addrlen, &bytes, &c.o)
+ if _, err = l.sock.asyncIO(c, nil, bytes, err); err != nil {
return nil, l.opErr("accept", os.NewSyscallError("acceptex", err))
}
+
conn := &HvsockConn{
sock: sock,
}
+ // The local address returned in the AcceptEx buffer is the same as the Listener socket's
+ // address. However, the service GUID reported by GetSockName is different from the Listeners
+ // socket, and is sometimes the same as the local address of the socket that dialed the
+ // address, with the service GUID.Data1 incremented, but othertimes is different.
+ // todo: does the local address matter? is the listener's address or the actual address appropriate?
conn.local.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[0])))
conn.remote.fromRaw((*rawHvsockAddr)(unsafe.Pointer(&addrbuf[addrlen])))
+
+ // initialize the accepted socket and update its properties with those of the listening socket
+ if err = windows.Setsockopt(windows.Handle(sock.handle),
+ windows.SOL_SOCKET, windows.SO_UPDATE_ACCEPT_CONTEXT,
+ (*byte)(unsafe.Pointer(&l.sock.handle)), int32(unsafe.Sizeof(l.sock.handle))); err != nil {
+ return nil, conn.opErr("accept", os.NewSyscallError("setsockopt", err))
+ }
+
sock = nil
return conn, nil
}
@@ -159,43 +278,171 @@ func (l *HvsockListener) Close() error {
return l.sock.Close()
}
-/* Need to finish ConnectEx handling
-func DialHvsock(ctx context.Context, addr *HvsockAddr) (*HvsockConn, error) {
- sock, err := newHvSocket()
+// HvsockDialer configures and dials a Hyper-V Socket (ie, [HvsockConn]).
+type HvsockDialer struct {
+ // Deadline is the time the Dial operation must connect before erroring.
+ Deadline time.Time
+
+ // Retries is the number of additional connects to try if the connection times out, is refused,
+ // or the host is unreachable
+ Retries uint
+
+ // RetryWait is the time to wait after a connection error to retry
+ RetryWait time.Duration
+
+ rt *time.Timer // redial wait timer
+}
+
+// Dial the Hyper-V socket at addr.
+//
+// See [HvsockDialer.Dial] for more information.
+func Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {
+ return (&HvsockDialer{}).Dial(ctx, addr)
+}
+
+// Dial attempts to connect to the Hyper-V socket at addr, and returns a connection if successful.
+// Will attempt (HvsockDialer).Retries if dialing fails, waiting (HvsockDialer).RetryWait between
+// retries.
+//
+// Dialing can be cancelled either by providing (HvsockDialer).Deadline, or cancelling ctx.
+func (d *HvsockDialer) Dial(ctx context.Context, addr *HvsockAddr) (conn *HvsockConn, err error) {
+ op := "dial"
+ // create the conn early to use opErr()
+ conn = &HvsockConn{
+ remote: *addr,
+ }
+
+ if !d.Deadline.IsZero() {
+ var cancel context.CancelFunc
+ ctx, cancel = context.WithDeadline(ctx, d.Deadline)
+ defer cancel()
+ }
+
+ // preemptive timeout/cancellation check
+ if err = ctx.Err(); err != nil {
+ return nil, conn.opErr(op, err)
+ }
+
+ sock, err := newHVSocket()
if err != nil {
- return nil, err
+ return nil, conn.opErr(op, err)
}
defer func() {
if sock != nil {
sock.Close()
}
}()
- c, err := sock.prepareIo()
+
+ sa := addr.raw()
+ err = socket.Bind(windows.Handle(sock.handle), &sa)
if err != nil {
- return nil, err
+ return nil, conn.opErr(op, os.NewSyscallError("bind", err))
+ }
+
+ c, err := sock.prepareIO()
+ if err != nil {
+ return nil, conn.opErr(op, err)
}
defer sock.wg.Done()
var bytes uint32
- err = windows.ConnectEx(windows.Handle(sock.handle), sa, nil, 0, &bytes, &c.o)
- _, err = sock.asyncIo(ctx, c, nil, bytes, err)
+ for i := uint(0); i <= d.Retries; i++ {
+ err = socket.ConnectEx(
+ windows.Handle(sock.handle),
+ &sa,
+ nil, // sendBuf
+ 0, // sendDataLen
+ &bytes,
+ (*windows.Overlapped)(unsafe.Pointer(&c.o)))
+ _, err = sock.asyncIO(c, nil, bytes, err)
+ if i < d.Retries && canRedial(err) {
+ if err = d.redialWait(ctx); err == nil {
+ continue
+ }
+ }
+ break
+ }
if err != nil {
- return nil, err
+ return nil, conn.opErr(op, os.NewSyscallError("connectex", err))
}
- conn := &HvsockConn{
- sock: sock,
- remote: *addr,
+
+ // update the connection properties, so shutdown can be used
+ if err = windows.Setsockopt(
+ windows.Handle(sock.handle),
+ windows.SOL_SOCKET,
+ windows.SO_UPDATE_CONNECT_CONTEXT,
+ nil, // optvalue
+ 0, // optlen
+ ); err != nil {
+ return nil, conn.opErr(op, os.NewSyscallError("setsockopt", err))
+ }
+
+ // get the local name
+ var sal rawHvsockAddr
+ err = socket.GetSockName(windows.Handle(sock.handle), &sal)
+ if err != nil {
+ return nil, conn.opErr(op, os.NewSyscallError("getsockname", err))
+ }
+ conn.local.fromRaw(&sal)
+
+ // one last check for timeout, since asyncIO doesn't check the context
+ if err = ctx.Err(); err != nil {
+ return nil, conn.opErr(op, err)
}
+
+ conn.sock = sock
sock = nil
+
return conn, nil
}
-*/
+
+// redialWait waits before attempting to redial, resetting the timer as appropriate.
+func (d *HvsockDialer) redialWait(ctx context.Context) (err error) {
+ if d.RetryWait == 0 {
+ return nil
+ }
+
+ if d.rt == nil {
+ d.rt = time.NewTimer(d.RetryWait)
+ } else {
+ // should already be stopped and drained
+ d.rt.Reset(d.RetryWait)
+ }
+
+ select {
+ case <-ctx.Done():
+ case <-d.rt.C:
+ return nil
+ }
+
+ // stop and drain the timer
+ if !d.rt.Stop() {
+ <-d.rt.C
+ }
+ return ctx.Err()
+}
+
+// assumes error is a plain, unwrapped syscall.Errno provided by direct syscall.
+func canRedial(err error) bool {
+ //nolint:errorlint // guaranteed to be an Errno
+ switch err {
+ case windows.WSAECONNREFUSED, windows.WSAENETUNREACH, windows.WSAETIMEDOUT,
+ windows.ERROR_CONNECTION_REFUSED, windows.ERROR_CONNECTION_UNAVAIL:
+ return true
+ default:
+ return false
+ }
+}
func (conn *HvsockConn) opErr(op string, err error) error {
+ // translate from "file closed" to "socket closed"
+ if errors.Is(err, ErrFileClosed) {
+ err = socket.ErrSocketClosed
+ }
return &net.OpError{Op: op, Net: "hvsock", Source: &conn.local, Addr: &conn.remote, Err: err}
}
func (conn *HvsockConn) Read(b []byte) (int, error) {
- c, err := conn.sock.prepareIo()
+ c, err := conn.sock.prepareIO()
if err != nil {
return 0, conn.opErr("read", err)
}
@@ -203,10 +450,11 @@ func (conn *HvsockConn) Read(b []byte) (int, error) {
buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))}
var flags, bytes uint32
err = syscall.WSARecv(conn.sock.handle, &buf, 1, &bytes, &flags, &c.o, nil)
- n, err := conn.sock.asyncIo(c, &conn.sock.readDeadline, bytes, err)
+ n, err := conn.sock.asyncIO(c, &conn.sock.readDeadline, bytes, err)
if err != nil {
- if _, ok := err.(syscall.Errno); ok {
- err = os.NewSyscallError("wsarecv", err)
+ var eno windows.Errno
+ if errors.As(err, &eno) {
+ err = os.NewSyscallError("wsarecv", eno)
}
return 0, conn.opErr("read", err)
} else if n == 0 {
@@ -229,7 +477,7 @@ func (conn *HvsockConn) Write(b []byte) (int, error) {
}
func (conn *HvsockConn) write(b []byte) (int, error) {
- c, err := conn.sock.prepareIo()
+ c, err := conn.sock.prepareIO()
if err != nil {
return 0, conn.opErr("write", err)
}
@@ -237,10 +485,11 @@ func (conn *HvsockConn) write(b []byte) (int, error) {
buf := syscall.WSABuf{Buf: &b[0], Len: uint32(len(b))}
var bytes uint32
err = syscall.WSASend(conn.sock.handle, &buf, 1, &bytes, 0, &c.o, nil)
- n, err := conn.sock.asyncIo(c, &conn.sock.writeDeadline, bytes, err)
+ n, err := conn.sock.asyncIO(c, &conn.sock.writeDeadline, bytes, err)
if err != nil {
- if _, ok := err.(syscall.Errno); ok {
- err = os.NewSyscallError("wsasend", err)
+ var eno windows.Errno
+ if errors.As(err, &eno) {
+ err = os.NewSyscallError("wsasend", eno)
}
return 0, conn.opErr("write", err)
}
@@ -252,29 +501,43 @@ func (conn *HvsockConn) Close() error {
return conn.sock.Close()
}
+func (conn *HvsockConn) IsClosed() bool {
+ return conn.sock.IsClosed()
+}
+
+// shutdown disables sending or receiving on a socket.
func (conn *HvsockConn) shutdown(how int) error {
- err := syscall.Shutdown(conn.sock.handle, syscall.SHUT_RD)
+ if conn.IsClosed() {
+ return socket.ErrSocketClosed
+ }
+
+ err := syscall.Shutdown(conn.sock.handle, how)
if err != nil {
+ // If the connection was closed, shutdowns fail with "not connected"
+ if errors.Is(err, windows.WSAENOTCONN) ||
+ errors.Is(err, windows.WSAESHUTDOWN) {
+ err = socket.ErrSocketClosed
+ }
return os.NewSyscallError("shutdown", err)
}
return nil
}
-// CloseRead shuts down the read end of the socket.
+// CloseRead shuts down the read end of the socket, preventing future read operations.
func (conn *HvsockConn) CloseRead() error {
err := conn.shutdown(syscall.SHUT_RD)
if err != nil {
- return conn.opErr("close", err)
+ return conn.opErr("closeread", err)
}
return nil
}
-// CloseWrite shuts down the write end of the socket, notifying the other endpoint that
-// no more data will be written.
+// CloseWrite shuts down the write end of the socket, preventing future write operations and
+// notifying the other endpoint that no more data will be written.
func (conn *HvsockConn) CloseWrite() error {
err := conn.shutdown(syscall.SHUT_WR)
if err != nil {
- return conn.opErr("close", err)
+ return conn.opErr("closewrite", err)
}
return nil
}
@@ -291,8 +554,13 @@ func (conn *HvsockConn) RemoteAddr() net.Addr {
// SetDeadline implements the net.Conn SetDeadline method.
func (conn *HvsockConn) SetDeadline(t time.Time) error {
- conn.SetReadDeadline(t)
- conn.SetWriteDeadline(t)
+ // todo: implement `SetDeadline` for `win32File`
+ if err := conn.SetReadDeadline(t); err != nil {
+ return fmt.Errorf("set read deadline: %w", err)
+ }
+ if err := conn.SetWriteDeadline(t); err != nil {
+ return fmt.Errorf("set write deadline: %w", err)
+ }
return nil
}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go b/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go
new file mode 100644
index 0000000000..1f65388178
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/fs/doc.go
@@ -0,0 +1,2 @@
+// This package contains Win32 filesystem functionality.
+package fs
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go b/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
new file mode 100644
index 0000000000..509b3ec641
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/fs/fs.go
@@ -0,0 +1,202 @@
+//go:build windows
+
+package fs
+
+import (
+ "golang.org/x/sys/windows"
+
+ "github.com/Microsoft/go-winio/internal/stringbuffer"
+)
+
+//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go fs.go
+
+// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew
+//sys CreateFile(name string, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) [failretval==windows.InvalidHandle] = CreateFileW
+
+const NullHandle windows.Handle = 0
+
+// AccessMask defines standard, specific, and generic rights.
+//
+// Bitmask:
+// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
+// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+// +---------------+---------------+-------------------------------+
+// |G|G|G|G|Resvd|A| StandardRights| SpecificRights |
+// |R|W|E|A| |S| | |
+// +-+-------------+---------------+-------------------------------+
+//
+// GR Generic Read
+// GW Generic Write
+// GE Generic Exectue
+// GA Generic All
+// Resvd Reserved
+// AS Access Security System
+//
+// https://learn.microsoft.com/en-us/windows/win32/secauthz/access-mask
+//
+// https://learn.microsoft.com/en-us/windows/win32/secauthz/generic-access-rights
+//
+// https://learn.microsoft.com/en-us/windows/win32/fileio/file-access-rights-constants
+type AccessMask = windows.ACCESS_MASK
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const (
+ // Not actually any.
+ //
+ // For CreateFile: "query certain metadata such as file, directory, or device attributes without accessing that file or device"
+ // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#parameters
+ FILE_ANY_ACCESS AccessMask = 0
+
+ // Specific Object Access
+ // from ntioapi.h
+
+ FILE_READ_DATA AccessMask = (0x0001) // file & pipe
+ FILE_LIST_DIRECTORY AccessMask = (0x0001) // directory
+
+ FILE_WRITE_DATA AccessMask = (0x0002) // file & pipe
+ FILE_ADD_FILE AccessMask = (0x0002) // directory
+
+ FILE_APPEND_DATA AccessMask = (0x0004) // file
+ FILE_ADD_SUBDIRECTORY AccessMask = (0x0004) // directory
+ FILE_CREATE_PIPE_INSTANCE AccessMask = (0x0004) // named pipe
+
+ FILE_READ_EA AccessMask = (0x0008) // file & directory
+ FILE_READ_PROPERTIES AccessMask = FILE_READ_EA
+
+ FILE_WRITE_EA AccessMask = (0x0010) // file & directory
+ FILE_WRITE_PROPERTIES AccessMask = FILE_WRITE_EA
+
+ FILE_EXECUTE AccessMask = (0x0020) // file
+ FILE_TRAVERSE AccessMask = (0x0020) // directory
+
+ FILE_DELETE_CHILD AccessMask = (0x0040) // directory
+
+ FILE_READ_ATTRIBUTES AccessMask = (0x0080) // all
+
+ FILE_WRITE_ATTRIBUTES AccessMask = (0x0100) // all
+
+ FILE_ALL_ACCESS AccessMask = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0x1FF)
+ FILE_GENERIC_READ AccessMask = (STANDARD_RIGHTS_READ | FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_READ_EA | SYNCHRONIZE)
+ FILE_GENERIC_WRITE AccessMask = (STANDARD_RIGHTS_WRITE | FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_WRITE_EA | FILE_APPEND_DATA | SYNCHRONIZE)
+ FILE_GENERIC_EXECUTE AccessMask = (STANDARD_RIGHTS_EXECUTE | FILE_READ_ATTRIBUTES | FILE_EXECUTE | SYNCHRONIZE)
+
+ SPECIFIC_RIGHTS_ALL AccessMask = 0x0000FFFF
+
+ // Standard Access
+ // from ntseapi.h
+
+ DELETE AccessMask = 0x0001_0000
+ READ_CONTROL AccessMask = 0x0002_0000
+ WRITE_DAC AccessMask = 0x0004_0000
+ WRITE_OWNER AccessMask = 0x0008_0000
+ SYNCHRONIZE AccessMask = 0x0010_0000
+
+ STANDARD_RIGHTS_REQUIRED AccessMask = 0x000F_0000
+
+ STANDARD_RIGHTS_READ AccessMask = READ_CONTROL
+ STANDARD_RIGHTS_WRITE AccessMask = READ_CONTROL
+ STANDARD_RIGHTS_EXECUTE AccessMask = READ_CONTROL
+
+ STANDARD_RIGHTS_ALL AccessMask = 0x001F_0000
+)
+
+type FileShareMode uint32
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const (
+ FILE_SHARE_NONE FileShareMode = 0x00
+ FILE_SHARE_READ FileShareMode = 0x01
+ FILE_SHARE_WRITE FileShareMode = 0x02
+ FILE_SHARE_DELETE FileShareMode = 0x04
+ FILE_SHARE_VALID_FLAGS FileShareMode = 0x07
+)
+
+type FileCreationDisposition uint32
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const (
+ // from winbase.h
+
+ CREATE_NEW FileCreationDisposition = 0x01
+ CREATE_ALWAYS FileCreationDisposition = 0x02
+ OPEN_EXISTING FileCreationDisposition = 0x03
+ OPEN_ALWAYS FileCreationDisposition = 0x04
+ TRUNCATE_EXISTING FileCreationDisposition = 0x05
+)
+
+// CreateFile and co. take flags or attributes together as one parameter.
+// Define alias until we can use generics to allow both
+
+// https://learn.microsoft.com/en-us/windows/win32/fileio/file-attribute-constants
+type FileFlagOrAttribute uint32
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const ( // from winnt.h
+ FILE_FLAG_WRITE_THROUGH FileFlagOrAttribute = 0x8000_0000
+ FILE_FLAG_OVERLAPPED FileFlagOrAttribute = 0x4000_0000
+ FILE_FLAG_NO_BUFFERING FileFlagOrAttribute = 0x2000_0000
+ FILE_FLAG_RANDOM_ACCESS FileFlagOrAttribute = 0x1000_0000
+ FILE_FLAG_SEQUENTIAL_SCAN FileFlagOrAttribute = 0x0800_0000
+ FILE_FLAG_DELETE_ON_CLOSE FileFlagOrAttribute = 0x0400_0000
+ FILE_FLAG_BACKUP_SEMANTICS FileFlagOrAttribute = 0x0200_0000
+ FILE_FLAG_POSIX_SEMANTICS FileFlagOrAttribute = 0x0100_0000
+ FILE_FLAG_OPEN_REPARSE_POINT FileFlagOrAttribute = 0x0020_0000
+ FILE_FLAG_OPEN_NO_RECALL FileFlagOrAttribute = 0x0010_0000
+ FILE_FLAG_FIRST_PIPE_INSTANCE FileFlagOrAttribute = 0x0008_0000
+)
+
+type FileSQSFlag = FileFlagOrAttribute
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const ( // from winbase.h
+ SECURITY_ANONYMOUS FileSQSFlag = FileSQSFlag(SecurityAnonymous << 16)
+ SECURITY_IDENTIFICATION FileSQSFlag = FileSQSFlag(SecurityIdentification << 16)
+ SECURITY_IMPERSONATION FileSQSFlag = FileSQSFlag(SecurityImpersonation << 16)
+ SECURITY_DELEGATION FileSQSFlag = FileSQSFlag(SecurityDelegation << 16)
+
+ SECURITY_SQOS_PRESENT FileSQSFlag = 0x00100000
+ SECURITY_VALID_SQOS_FLAGS FileSQSFlag = 0x001F0000
+)
+
+// GetFinalPathNameByHandle flags
+//
+// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew#parameters
+type GetFinalPathFlag uint32
+
+//nolint:revive // SNAKE_CASE is not idiomatic in Go, but aligned with Win32 API.
+const (
+ GetFinalPathDefaultFlag GetFinalPathFlag = 0x0
+
+ FILE_NAME_NORMALIZED GetFinalPathFlag = 0x0
+ FILE_NAME_OPENED GetFinalPathFlag = 0x8
+
+ VOLUME_NAME_DOS GetFinalPathFlag = 0x0
+ VOLUME_NAME_GUID GetFinalPathFlag = 0x1
+ VOLUME_NAME_NT GetFinalPathFlag = 0x2
+ VOLUME_NAME_NONE GetFinalPathFlag = 0x4
+)
+
+// getFinalPathNameByHandle facilitates calling the Windows API GetFinalPathNameByHandle
+// with the given handle and flags. It transparently takes care of creating a buffer of the
+// correct size for the call.
+//
+// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-getfinalpathnamebyhandlew
+func GetFinalPathNameByHandle(h windows.Handle, flags GetFinalPathFlag) (string, error) {
+ b := stringbuffer.NewWString()
+ //TODO: can loop infinitely if Win32 keeps returning the same (or a larger) n?
+ for {
+ n, err := windows.GetFinalPathNameByHandle(h, b.Pointer(), b.Cap(), uint32(flags))
+ if err != nil {
+ return "", err
+ }
+ // If the buffer wasn't large enough, n will be the total size needed (including null terminator).
+ // Resize and try again.
+ if n > b.Cap() {
+ b.ResizeTo(n)
+ continue
+ }
+ // If the buffer is large enough, n will be the size not including the null terminator.
+ // Convert to a Go string and return.
+ return b.String(), nil
+ }
+}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/security.go b/vendor/github.com/Microsoft/go-winio/internal/fs/security.go
new file mode 100644
index 0000000000..81760ac67e
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/fs/security.go
@@ -0,0 +1,12 @@
+package fs
+
+// https://learn.microsoft.com/en-us/windows/win32/api/winnt/ne-winnt-security_impersonation_level
+type SecurityImpersonationLevel int32 // C default enums underlying type is `int`, which is Go `int32`
+
+// Impersonation levels
+const (
+ SecurityAnonymous SecurityImpersonationLevel = 0
+ SecurityIdentification SecurityImpersonationLevel = 1
+ SecurityImpersonation SecurityImpersonationLevel = 2
+ SecurityDelegation SecurityImpersonationLevel = 3
+)
diff --git a/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
new file mode 100644
index 0000000000..e2f7bb24e5
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/fs/zsyscall_windows.go
@@ -0,0 +1,64 @@
+//go:build windows
+
+// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
+
+package fs
+
+import (
+ "syscall"
+ "unsafe"
+
+ "golang.org/x/sys/windows"
+)
+
+var _ unsafe.Pointer
+
+// Do the interface allocations only once for common
+// Errno values.
+const (
+ errnoERROR_IO_PENDING = 997
+)
+
+var (
+ errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
+ errERROR_EINVAL error = syscall.EINVAL
+)
+
+// errnoErr returns common boxed Errno values, to prevent
+// allocations at runtime.
+func errnoErr(e syscall.Errno) error {
+ switch e {
+ case 0:
+ return errERROR_EINVAL
+ case errnoERROR_IO_PENDING:
+ return errERROR_IO_PENDING
+ }
+ // TODO: add more here, after collecting data on the common
+ // error values see on Windows. (perhaps when running
+ // all.bat?)
+ return e
+}
+
+var (
+ modkernel32 = windows.NewLazySystemDLL("kernel32.dll")
+
+ procCreateFileW = modkernel32.NewProc("CreateFileW")
+)
+
+func CreateFile(name string, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(name)
+ if err != nil {
+ return
+ }
+ return _CreateFile(_p0, access, mode, sa, createmode, attrs, templatefile)
+}
+
+func _CreateFile(name *uint16, access AccessMask, mode FileShareMode, sa *syscall.SecurityAttributes, createmode FileCreationDisposition, attrs FileFlagOrAttribute, templatefile windows.Handle) (handle windows.Handle, err error) {
+ r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
+ handle = windows.Handle(r0)
+ if handle == windows.InvalidHandle {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go b/vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
new file mode 100644
index 0000000000..7e82f9afa9
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/socket/rawaddr.go
@@ -0,0 +1,20 @@
+package socket
+
+import (
+ "unsafe"
+)
+
+// RawSockaddr allows structs to be used with [Bind] and [ConnectEx]. The
+// struct must meet the Win32 sockaddr requirements specified here:
+// https://docs.microsoft.com/en-us/windows/win32/winsock/sockaddr-2
+//
+// Specifically, the struct size must be least larger than an int16 (unsigned short)
+// for the address family.
+type RawSockaddr interface {
+ // Sockaddr returns a pointer to the RawSockaddr and its struct size, allowing
+ // for the RawSockaddr's data to be overwritten by syscalls (if necessary).
+ //
+ // It is the callers responsibility to validate that the values are valid; invalid
+ // pointers or size can cause a panic.
+ Sockaddr() (unsafe.Pointer, int32, error)
+}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
new file mode 100644
index 0000000000..aeb7b7250f
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/socket/socket.go
@@ -0,0 +1,179 @@
+//go:build windows
+
+package socket
+
+import (
+ "errors"
+ "fmt"
+ "net"
+ "sync"
+ "syscall"
+ "unsafe"
+
+ "github.com/Microsoft/go-winio/pkg/guid"
+ "golang.org/x/sys/windows"
+)
+
+//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go socket.go
+
+//sys getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getsockname
+//sys getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) [failretval==socketError] = ws2_32.getpeername
+//sys bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socketError] = ws2_32.bind
+
+const socketError = uintptr(^uint32(0))
+
+var (
+ // todo(helsaawy): create custom error types to store the desired vs actual size and addr family?
+
+ ErrBufferSize = errors.New("buffer size")
+ ErrAddrFamily = errors.New("address family")
+ ErrInvalidPointer = errors.New("invalid pointer")
+ ErrSocketClosed = fmt.Errorf("socket closed: %w", net.ErrClosed)
+)
+
+// todo(helsaawy): replace these with generics, ie: GetSockName[S RawSockaddr](s windows.Handle) (S, error)
+
+// GetSockName writes the local address of socket s to the [RawSockaddr] rsa.
+// If rsa is not large enough, the [windows.WSAEFAULT] is returned.
+func GetSockName(s windows.Handle, rsa RawSockaddr) error {
+ ptr, l, err := rsa.Sockaddr()
+ if err != nil {
+ return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
+ }
+
+ // although getsockname returns WSAEFAULT if the buffer is too small, it does not set
+ // &l to the correct size, so--apart from doubling the buffer repeatedly--there is no remedy
+ return getsockname(s, ptr, &l)
+}
+
+// GetPeerName returns the remote address the socket is connected to.
+//
+// See [GetSockName] for more information.
+func GetPeerName(s windows.Handle, rsa RawSockaddr) error {
+ ptr, l, err := rsa.Sockaddr()
+ if err != nil {
+ return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
+ }
+
+ return getpeername(s, ptr, &l)
+}
+
+func Bind(s windows.Handle, rsa RawSockaddr) (err error) {
+ ptr, l, err := rsa.Sockaddr()
+ if err != nil {
+ return fmt.Errorf("could not retrieve socket pointer and size: %w", err)
+ }
+
+ return bind(s, ptr, l)
+}
+
+// "golang.org/x/sys/windows".ConnectEx and .Bind only accept internal implementations of the
+// their sockaddr interface, so they cannot be used with HvsockAddr
+// Replicate functionality here from
+// https://cs.opensource.google/go/x/sys/+/master:windows/syscall_windows.go
+
+// The function pointers to `AcceptEx`, `ConnectEx` and `GetAcceptExSockaddrs` must be loaded at
+// runtime via a WSAIoctl call:
+// https://docs.microsoft.com/en-us/windows/win32/api/Mswsock/nc-mswsock-lpfn_connectex#remarks
+
+type runtimeFunc struct {
+ id guid.GUID
+ once sync.Once
+ addr uintptr
+ err error
+}
+
+func (f *runtimeFunc) Load() error {
+ f.once.Do(func() {
+ var s windows.Handle
+ s, f.err = windows.Socket(windows.AF_INET, windows.SOCK_STREAM, windows.IPPROTO_TCP)
+ if f.err != nil {
+ return
+ }
+ defer windows.CloseHandle(s) //nolint:errcheck
+
+ var n uint32
+ f.err = windows.WSAIoctl(s,
+ windows.SIO_GET_EXTENSION_FUNCTION_POINTER,
+ (*byte)(unsafe.Pointer(&f.id)),
+ uint32(unsafe.Sizeof(f.id)),
+ (*byte)(unsafe.Pointer(&f.addr)),
+ uint32(unsafe.Sizeof(f.addr)),
+ &n,
+ nil, // overlapped
+ 0, // completionRoutine
+ )
+ })
+ return f.err
+}
+
+var (
+ // todo: add `AcceptEx` and `GetAcceptExSockaddrs`
+ WSAID_CONNECTEX = guid.GUID{ //revive:disable-line:var-naming ALL_CAPS
+ Data1: 0x25a207b9,
+ Data2: 0xddf3,
+ Data3: 0x4660,
+ Data4: [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
+ }
+
+ connectExFunc = runtimeFunc{id: WSAID_CONNECTEX}
+)
+
+func ConnectEx(
+ fd windows.Handle,
+ rsa RawSockaddr,
+ sendBuf *byte,
+ sendDataLen uint32,
+ bytesSent *uint32,
+ overlapped *windows.Overlapped,
+) error {
+ if err := connectExFunc.Load(); err != nil {
+ return fmt.Errorf("failed to load ConnectEx function pointer: %w", err)
+ }
+ ptr, n, err := rsa.Sockaddr()
+ if err != nil {
+ return err
+ }
+ return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
+}
+
+// BOOL LpfnConnectex(
+// [in] SOCKET s,
+// [in] const sockaddr *name,
+// [in] int namelen,
+// [in, optional] PVOID lpSendBuffer,
+// [in] DWORD dwSendDataLength,
+// [out] LPDWORD lpdwBytesSent,
+// [in] LPOVERLAPPED lpOverlapped
+// )
+
+func connectEx(
+ s windows.Handle,
+ name unsafe.Pointer,
+ namelen int32,
+ sendBuf *byte,
+ sendDataLen uint32,
+ bytesSent *uint32,
+ overlapped *windows.Overlapped,
+) (err error) {
+ // todo: after upgrading to 1.18, switch from syscall.Syscall9 to syscall.SyscallN
+ r1, _, e1 := syscall.Syscall9(connectExFunc.addr,
+ 7,
+ uintptr(s),
+ uintptr(name),
+ uintptr(namelen),
+ uintptr(unsafe.Pointer(sendBuf)),
+ uintptr(sendDataLen),
+ uintptr(unsafe.Pointer(bytesSent)),
+ uintptr(unsafe.Pointer(overlapped)),
+ 0,
+ 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return err
+}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
new file mode 100644
index 0000000000..6d2e1a9e44
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/socket/zsyscall_windows.go
@@ -0,0 +1,72 @@
+//go:build windows
+
+// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
+
+package socket
+
+import (
+ "syscall"
+ "unsafe"
+
+ "golang.org/x/sys/windows"
+)
+
+var _ unsafe.Pointer
+
+// Do the interface allocations only once for common
+// Errno values.
+const (
+ errnoERROR_IO_PENDING = 997
+)
+
+var (
+ errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
+ errERROR_EINVAL error = syscall.EINVAL
+)
+
+// errnoErr returns common boxed Errno values, to prevent
+// allocations at runtime.
+func errnoErr(e syscall.Errno) error {
+ switch e {
+ case 0:
+ return errERROR_EINVAL
+ case errnoERROR_IO_PENDING:
+ return errERROR_IO_PENDING
+ }
+ // TODO: add more here, after collecting data on the common
+ // error values see on Windows. (perhaps when running
+ // all.bat?)
+ return e
+}
+
+var (
+ modws2_32 = windows.NewLazySystemDLL("ws2_32.dll")
+
+ procbind = modws2_32.NewProc("bind")
+ procgetpeername = modws2_32.NewProc("getpeername")
+ procgetsockname = modws2_32.NewProc("getsockname")
+)
+
+func bind(s windows.Handle, name unsafe.Pointer, namelen int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
+ if r1 == socketError {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+func getpeername(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
+ if r1 == socketError {
+ err = errnoErr(e1)
+ }
+ return
+}
+
+func getsockname(s windows.Handle, name unsafe.Pointer, namelen *int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(name), uintptr(unsafe.Pointer(namelen)))
+ if r1 == socketError {
+ err = errnoErr(e1)
+ }
+ return
+}
diff --git a/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go b/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
new file mode 100644
index 0000000000..7ad5057024
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/internal/stringbuffer/wstring.go
@@ -0,0 +1,132 @@
+package stringbuffer
+
+import (
+ "sync"
+ "unicode/utf16"
+)
+
+// TODO: worth exporting and using in mkwinsyscall?
+
+// Uint16BufferSize is the buffer size in the pool, chosen somewhat arbitrarily to accommodate
+// large path strings:
+// MAX_PATH (260) + size of volume GUID prefix (49) + null terminator = 310.
+const MinWStringCap = 310
+
+// use *[]uint16 since []uint16 creates an extra allocation where the slice header
+// is copied to heap and then referenced via pointer in the interface header that sync.Pool
+// stores.
+var pathPool = sync.Pool{ // if go1.18+ adds Pool[T], use that to store []uint16 directly
+ New: func() interface{} {
+ b := make([]uint16, MinWStringCap)
+ return &b
+ },
+}
+
+func newBuffer() []uint16 { return *(pathPool.Get().(*[]uint16)) }
+
+// freeBuffer copies the slice header data, and puts a pointer to that in the pool.
+// This avoids taking a pointer to the slice header in WString, which can be set to nil.
+func freeBuffer(b []uint16) { pathPool.Put(&b) }
+
+// WString is a wide string buffer ([]uint16) meant for storing UTF-16 encoded strings
+// for interacting with Win32 APIs.
+// Sizes are specified as uint32 and not int.
+//
+// It is not thread safe.
+type WString struct {
+ // type-def allows casting to []uint16 directly, use struct to prevent that and allow adding fields in the future.
+
+ // raw buffer
+ b []uint16
+}
+
+// NewWString returns a [WString] allocated from a shared pool with an
+// initial capacity of at least [MinWStringCap].
+// Since the buffer may have been previously used, its contents are not guaranteed to be empty.
+//
+// The buffer should be freed via [WString.Free]
+func NewWString() *WString {
+ return &WString{
+ b: newBuffer(),
+ }
+}
+
+func (b *WString) Free() {
+ if b.empty() {
+ return
+ }
+ freeBuffer(b.b)
+ b.b = nil
+}
+
+// ResizeTo grows the buffer to at least c and returns the new capacity, freeing the
+// previous buffer back into pool.
+func (b *WString) ResizeTo(c uint32) uint32 {
+ // allready sufficient (or n is 0)
+ if c <= b.Cap() {
+ return b.Cap()
+ }
+
+ if c <= MinWStringCap {
+ c = MinWStringCap
+ }
+ // allocate at-least double buffer size, as is done in [bytes.Buffer] and other places
+ if c <= 2*b.Cap() {
+ c = 2 * b.Cap()
+ }
+
+ b2 := make([]uint16, c)
+ if !b.empty() {
+ copy(b2, b.b)
+ freeBuffer(b.b)
+ }
+ b.b = b2
+ return c
+}
+
+// Buffer returns the underlying []uint16 buffer.
+func (b *WString) Buffer() []uint16 {
+ if b.empty() {
+ return nil
+ }
+ return b.b
+}
+
+// Pointer returns a pointer to the first uint16 in the buffer.
+// If the [WString.Free] has already been called, the pointer will be nil.
+func (b *WString) Pointer() *uint16 {
+ if b.empty() {
+ return nil
+ }
+ return &b.b[0]
+}
+
+// String returns the returns the UTF-8 encoding of the UTF-16 string in the buffer.
+//
+// It assumes that the data is null-terminated.
+func (b *WString) String() string {
+ // Using [windows.UTF16ToString] would require importing "golang.org/x/sys/windows"
+ // and would make this code Windows-only, which makes no sense.
+ // So copy UTF16ToString code into here.
+ // If other windows-specific code is added, switch to [windows.UTF16ToString]
+
+ s := b.b
+ for i, v := range s {
+ if v == 0 {
+ s = s[:i]
+ break
+ }
+ }
+ return string(utf16.Decode(s))
+}
+
+// Cap returns the underlying buffer capacity.
+func (b *WString) Cap() uint32 {
+ if b.empty() {
+ return 0
+ }
+ return b.cap()
+}
+
+func (b *WString) cap() uint32 { return uint32(cap(b.b)) }
+func (b *WString) empty() bool { return b == nil || b.cap() == 0 }
diff --git a/vendor/github.com/Microsoft/go-winio/pipe.go b/vendor/github.com/Microsoft/go-winio/pipe.go
index 96700a73de..25cc811031 100644
--- a/vendor/github.com/Microsoft/go-winio/pipe.go
+++ b/vendor/github.com/Microsoft/go-winio/pipe.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package winio
@@ -13,18 +14,21 @@ import (
"syscall"
"time"
"unsafe"
+
+ "golang.org/x/sys/windows"
+
+ "github.com/Microsoft/go-winio/internal/fs"
)
//sys connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) = ConnectNamedPipe
//sys createNamedPipe(name string, flags uint32, pipeMode uint32, maxInstances uint32, outSize uint32, inSize uint32, defaultTimeout uint32, sa *syscall.SecurityAttributes) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateNamedPipeW
-//sys createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) [failretval==syscall.InvalidHandle] = CreateFileW
//sys getNamedPipeInfo(pipe syscall.Handle, flags *uint32, outSize *uint32, inSize *uint32, maxInstances *uint32) (err error) = GetNamedPipeInfo
//sys getNamedPipeHandleState(pipe syscall.Handle, state *uint32, curInstances *uint32, maxCollectionCount *uint32, collectDataTimeout *uint32, userName *uint16, maxUserNameSize uint32) (err error) = GetNamedPipeHandleStateW
//sys localAlloc(uFlags uint32, length uint32) (ptr uintptr) = LocalAlloc
-//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) = ntdll.NtCreateNamedPipeFile
-//sys rtlNtStatusToDosError(status ntstatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb
-//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) = ntdll.RtlDosPathNameToNtPathName_U
-//sys rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) = ntdll.RtlDefaultNpAcl
+//sys ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) = ntdll.NtCreateNamedPipeFile
+//sys rtlNtStatusToDosError(status ntStatus) (winerr error) = ntdll.RtlNtStatusToDosErrorNoTeb
+//sys rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) = ntdll.RtlDosPathNameToNtPathName_U
+//sys rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) = ntdll.RtlDefaultNpAcl
type ioStatusBlock struct {
Status, Information uintptr
@@ -51,45 +55,22 @@ type securityDescriptor struct {
Control uint16
Owner uintptr
Group uintptr
- Sacl uintptr
- Dacl uintptr
+ Sacl uintptr //revive:disable-line:var-naming SACL, not Sacl
+ Dacl uintptr //revive:disable-line:var-naming DACL, not Dacl
}
-type ntstatus int32
+type ntStatus int32
-func (status ntstatus) Err() error {
+func (status ntStatus) Err() error {
if status >= 0 {
return nil
}
return rtlNtStatusToDosError(status)
}
-const (
- cERROR_PIPE_BUSY = syscall.Errno(231)
- cERROR_NO_DATA = syscall.Errno(232)
- cERROR_PIPE_CONNECTED = syscall.Errno(535)
- cERROR_SEM_TIMEOUT = syscall.Errno(121)
-
- cSECURITY_SQOS_PRESENT = 0x100000
- cSECURITY_ANONYMOUS = 0
-
- cPIPE_TYPE_MESSAGE = 4
-
- cPIPE_READMODE_MESSAGE = 2
-
- cFILE_OPEN = 1
- cFILE_CREATE = 2
-
- cFILE_PIPE_MESSAGE_TYPE = 1
- cFILE_PIPE_REJECT_REMOTE_CLIENTS = 2
-
- cSE_DACL_PRESENT = 4
-)
-
var (
// ErrPipeListenerClosed is returned for pipe operations on listeners that have been closed.
- // This error should match net.errClosing since docker takes a dependency on its text.
- ErrPipeListenerClosed = errors.New("use of closed network connection")
+ ErrPipeListenerClosed = net.ErrClosed
errPipeWriteClosed = errors.New("pipe has been closed for write")
)
@@ -116,9 +97,10 @@ func (f *win32Pipe) RemoteAddr() net.Addr {
}
func (f *win32Pipe) SetDeadline(t time.Time) error {
- f.SetReadDeadline(t)
- f.SetWriteDeadline(t)
- return nil
+ if err := f.SetReadDeadline(t); err != nil {
+ return err
+ }
+ return f.SetWriteDeadline(t)
}
// CloseWrite closes the write side of a message pipe in byte mode.
@@ -157,14 +139,14 @@ func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
return 0, io.EOF
}
n, err := f.win32File.Read(b)
- if err == io.EOF {
+ if err == io.EOF { //nolint:errorlint
// If this was the result of a zero-byte read, then
// it is possible that the read was due to a zero-size
// message. Since we are simulating CloseWrite with a
// zero-byte message, ensure that all future Read() calls
// also return EOF.
f.readEOF = true
- } else if err == syscall.ERROR_MORE_DATA {
+ } else if err == syscall.ERROR_MORE_DATA { //nolint:errorlint // err is Errno
// ERROR_MORE_DATA indicates that the pipe's read mode is message mode
// and the message still has more bytes. Treat this as a success, since
// this package presents all named pipes as byte streams.
@@ -173,7 +155,7 @@ func (f *win32MessageBytePipe) Read(b []byte) (int, error) {
return n, err
}
-func (s pipeAddress) Network() string {
+func (pipeAddress) Network() string {
return "pipe"
}
@@ -182,18 +164,25 @@ func (s pipeAddress) String() string {
}
// tryDialPipe attempts to dial the pipe at `path` until `ctx` cancellation or timeout.
-func tryDialPipe(ctx context.Context, path *string, access uint32) (syscall.Handle, error) {
+func tryDialPipe(ctx context.Context, path *string, access fs.AccessMask) (syscall.Handle, error) {
for {
-
select {
case <-ctx.Done():
return syscall.Handle(0), ctx.Err()
default:
- h, err := createFile(*path, access, 0, nil, syscall.OPEN_EXISTING, syscall.FILE_FLAG_OVERLAPPED|cSECURITY_SQOS_PRESENT|cSECURITY_ANONYMOUS, 0)
+ wh, err := fs.CreateFile(*path,
+ access,
+ 0, // mode
+ nil, // security attributes
+ fs.OPEN_EXISTING,
+ fs.FILE_FLAG_OVERLAPPED|fs.SECURITY_SQOS_PRESENT|fs.SECURITY_ANONYMOUS,
+ 0, // template file handle
+ )
+ h := syscall.Handle(wh)
if err == nil {
return h, nil
}
- if err != cERROR_PIPE_BUSY {
+ if err != windows.ERROR_PIPE_BUSY { //nolint:errorlint // err is Errno
return h, &os.PathError{Err: err, Op: "open", Path: *path}
}
// Wait 10 msec and try again. This is a rather simplistic
@@ -213,9 +202,10 @@ func DialPipe(path string, timeout *time.Duration) (net.Conn, error) {
} else {
absTimeout = time.Now().Add(2 * time.Second)
}
- ctx, _ := context.WithDeadline(context.Background(), absTimeout)
+ ctx, cancel := context.WithDeadline(context.Background(), absTimeout)
+ defer cancel()
conn, err := DialPipeContext(ctx, path)
- if err == context.DeadlineExceeded {
+ if errors.Is(err, context.DeadlineExceeded) {
return nil, ErrTimeout
}
return conn, err
@@ -232,7 +222,7 @@ func DialPipeContext(ctx context.Context, path string) (net.Conn, error) {
func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn, error) {
var err error
var h syscall.Handle
- h, err = tryDialPipe(ctx, &path, access)
+ h, err = tryDialPipe(ctx, &path, fs.AccessMask(access))
if err != nil {
return nil, err
}
@@ -251,7 +241,7 @@ func DialPipeAccess(ctx context.Context, path string, access uint32) (net.Conn,
// If the pipe is in message mode, return a message byte pipe, which
// supports CloseWrite().
- if flags&cPIPE_TYPE_MESSAGE != 0 {
+ if flags&windows.PIPE_TYPE_MESSAGE != 0 {
return &win32MessageBytePipe{
win32Pipe: win32Pipe{win32File: f, path: path},
}, nil
@@ -283,17 +273,22 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
oa.Length = unsafe.Sizeof(oa)
var ntPath unicodeString
- if err := rtlDosPathNameToNtPathName(&path16[0], &ntPath, 0, 0).Err(); err != nil {
+ if err := rtlDosPathNameToNtPathName(&path16[0],
+ &ntPath,
+ 0,
+ 0,
+ ).Err(); err != nil {
return 0, &os.PathError{Op: "open", Path: path, Err: err}
}
defer localFree(ntPath.Buffer)
oa.ObjectName = &ntPath
+ oa.Attributes = windows.OBJ_CASE_INSENSITIVE
// The security descriptor is only needed for the first pipe.
if first {
if sd != nil {
- len := uint32(len(sd))
- sdb := localAlloc(0, len)
+ l := uint32(len(sd))
+ sdb := localAlloc(0, l)
defer localFree(sdb)
copy((*[0xffff]byte)(unsafe.Pointer(sdb))[:], sd)
oa.SecurityDescriptor = (*securityDescriptor)(unsafe.Pointer(sdb))
@@ -301,28 +296,28 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
// Construct the default named pipe security descriptor.
var dacl uintptr
if err := rtlDefaultNpAcl(&dacl).Err(); err != nil {
- return 0, fmt.Errorf("getting default named pipe ACL: %s", err)
+ return 0, fmt.Errorf("getting default named pipe ACL: %w", err)
}
defer localFree(dacl)
sdb := &securityDescriptor{
Revision: 1,
- Control: cSE_DACL_PRESENT,
+ Control: windows.SE_DACL_PRESENT,
Dacl: dacl,
}
oa.SecurityDescriptor = sdb
}
}
- typ := uint32(cFILE_PIPE_REJECT_REMOTE_CLIENTS)
+ typ := uint32(windows.FILE_PIPE_REJECT_REMOTE_CLIENTS)
if c.MessageMode {
- typ |= cFILE_PIPE_MESSAGE_TYPE
+ typ |= windows.FILE_PIPE_MESSAGE_TYPE
}
- disposition := uint32(cFILE_OPEN)
+ disposition := uint32(windows.FILE_OPEN)
access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE | syscall.SYNCHRONIZE)
if first {
- disposition = cFILE_CREATE
+ disposition = windows.FILE_CREATE
// By not asking for read or write access, the named pipe file system
// will put this pipe into an initially disconnected state, blocking
// client connections until the next call with first == false.
@@ -335,7 +330,20 @@ func makeServerPipeHandle(path string, sd []byte, c *PipeConfig, first bool) (sy
h syscall.Handle
iosb ioStatusBlock
)
- err = ntCreateNamedPipeFile(&h, access, &oa, &iosb, syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE, disposition, 0, typ, 0, 0, 0xffffffff, uint32(c.InputBufferSize), uint32(c.OutputBufferSize), &timeout).Err()
+ err = ntCreateNamedPipeFile(&h,
+ access,
+ &oa,
+ &iosb,
+ syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE,
+ disposition,
+ 0,
+ typ,
+ 0,
+ 0,
+ 0xffffffff,
+ uint32(c.InputBufferSize),
+ uint32(c.OutputBufferSize),
+ &timeout).Err()
if err != nil {
return 0, &os.PathError{Op: "open", Path: path, Err: err}
}
@@ -380,7 +388,7 @@ func (l *win32PipeListener) makeConnectedServerPipe() (*win32File, error) {
p.Close()
p = nil
err = <-ch
- if err == nil || err == ErrFileClosed {
+ if err == nil || err == ErrFileClosed { //nolint:errorlint // err is Errno
err = ErrPipeListenerClosed
}
}
@@ -402,12 +410,12 @@ func (l *win32PipeListener) listenerRoutine() {
p, err = l.makeConnectedServerPipe()
// If the connection was immediately closed by the client, try
// again.
- if err != cERROR_NO_DATA {
+ if err != windows.ERROR_NO_DATA { //nolint:errorlint // err is Errno
break
}
}
responseCh <- acceptResponse{p, err}
- closed = err == ErrPipeListenerClosed
+ closed = err == ErrPipeListenerClosed //nolint:errorlint // err is Errno
}
}
syscall.Close(l.firstHandle)
@@ -469,15 +477,15 @@ func ListenPipe(path string, c *PipeConfig) (net.Listener, error) {
}
func connectPipe(p *win32File) error {
- c, err := p.prepareIo()
+ c, err := p.prepareIO()
if err != nil {
return err
}
defer p.wg.Done()
err = connectNamedPipe(p.handle, &c.o)
- _, err = p.asyncIo(c, nil, 0, err)
- if err != nil && err != cERROR_PIPE_CONNECTED {
+ _, err = p.asyncIO(c, nil, 0, err)
+ if err != nil && err != windows.ERROR_PIPE_CONNECTED { //nolint:errorlint // err is Errno
return err
}
return nil
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
index f497c0e391..48ce4e9243 100644
--- a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
+++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid.go
@@ -1,5 +1,3 @@
-// +build windows
-
// Package guid provides a GUID type. The backing structure for a GUID is
// identical to that used by the golang.org/x/sys/windows GUID type.
// There are two main binary encodings used for a GUID, the big-endian encoding,
@@ -9,26 +7,26 @@ package guid
import (
"crypto/rand"
- "crypto/sha1"
+ "crypto/sha1" //nolint:gosec // not used for secure application
"encoding"
"encoding/binary"
"fmt"
"strconv"
-
- "golang.org/x/sys/windows"
)
+//go:generate go run golang.org/x/tools/cmd/stringer -type=Variant -trimprefix=Variant -linecomment
+
// Variant specifies which GUID variant (or "type") of the GUID. It determines
// how the entirety of the rest of the GUID is interpreted.
type Variant uint8
-// The variants specified by RFC 4122.
+// The variants specified by RFC 4122 section 4.1.1.
const (
// VariantUnknown specifies a GUID variant which does not conform to one of
// the variant encodings specified in RFC 4122.
VariantUnknown Variant = iota
VariantNCS
- VariantRFC4122
+ VariantRFC4122 // RFC 4122
VariantMicrosoft
VariantFuture
)
@@ -38,16 +36,13 @@ const (
// hash of an input string.
type Version uint8
+func (v Version) String() string {
+ return strconv.FormatUint(uint64(v), 10)
+}
+
var _ = (encoding.TextMarshaler)(GUID{})
var _ = (encoding.TextUnmarshaler)(&GUID{})
-// GUID represents a GUID/UUID. It has the same structure as
-// golang.org/x/sys/windows.GUID so that it can be used with functions expecting
-// that type. It is defined as its own type so that stringification and
-// marshaling can be supported. The representation matches that used by native
-// Windows code.
-type GUID windows.GUID
-
// NewV4 returns a new version 4 (pseudorandom) GUID, as defined by RFC 4122.
func NewV4() (GUID, error) {
var b [16]byte
@@ -70,7 +65,7 @@ func NewV4() (GUID, error) {
// big-endian UTF16 stream of bytes. If that is desired, the string can be
// encoded as such before being passed to this function.
func NewV5(namespace GUID, name []byte) (GUID, error) {
- b := sha1.New()
+ b := sha1.New() //nolint:gosec // not used for secure application
namespaceBytes := namespace.ToArray()
b.Write(namespaceBytes[:])
b.Write(name)
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
new file mode 100644
index 0000000000..805bd35484
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_nonwindows.go
@@ -0,0 +1,16 @@
+//go:build !windows
+// +build !windows
+
+package guid
+
+// GUID represents a GUID/UUID. It has the same structure as
+// golang.org/x/sys/windows.GUID so that it can be used with functions expecting
+// that type. It is defined as its own type as that is only available to builds
+// targeted at `windows`. The representation matches that used by native Windows
+// code.
+type GUID struct {
+ Data1 uint32
+ Data2 uint16
+ Data3 uint16
+ Data4 [8]byte
+}
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
new file mode 100644
index 0000000000..27e45ee5cc
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/guid_windows.go
@@ -0,0 +1,13 @@
+//go:build windows
+// +build windows
+
+package guid
+
+import "golang.org/x/sys/windows"
+
+// GUID represents a GUID/UUID. It has the same structure as
+// golang.org/x/sys/windows.GUID so that it can be used with functions expecting
+// that type. It is defined as its own type so that stringification and
+// marshaling can be supported. The representation matches that used by native
+// Windows code.
+type GUID windows.GUID
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go b/vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
new file mode 100644
index 0000000000..4076d3132f
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/pkg/guid/variant_string.go
@@ -0,0 +1,27 @@
+// Code generated by "stringer -type=Variant -trimprefix=Variant -linecomment"; DO NOT EDIT.
+
+package guid
+
+import "strconv"
+
+func _() {
+ // An "invalid array index" compiler error signifies that the constant values have changed.
+ // Re-run the stringer command to generate them again.
+ var x [1]struct{}
+ _ = x[VariantUnknown-0]
+ _ = x[VariantNCS-1]
+ _ = x[VariantRFC4122-2]
+ _ = x[VariantMicrosoft-3]
+ _ = x[VariantFuture-4]
+}
+
+const _Variant_name = "UnknownNCSRFC 4122MicrosoftFuture"
+
+var _Variant_index = [...]uint8{0, 7, 10, 18, 27, 33}
+
+func (i Variant) String() string {
+ if i >= Variant(len(_Variant_index)-1) {
+ return "Variant(" + strconv.FormatInt(int64(i), 10) + ")"
+ }
+ return _Variant_name[_Variant_index[i]:_Variant_index[i+1]]
+}
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go b/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go
index fca241590c..bb276fff2f 100644
--- a/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go
+++ b/vendor/github.com/Microsoft/go-winio/pkg/security/grantvmgroupaccess.go
@@ -1,13 +1,13 @@
+//go:build windows
// +build windows
package security
import (
+ "fmt"
"os"
"syscall"
"unsafe"
-
- "github.com/pkg/errors"
)
type (
@@ -45,6 +45,7 @@ const (
desiredAccessReadControl desiredAccess = 0x20000
desiredAccessWriteDac desiredAccess = 0x40000
+ //cspell:disable-next-line
gvmga = "GrantVmGroupAccess:"
inheritModeNoInheritance inheritMode = 0x0
@@ -57,9 +58,9 @@ const (
shareModeRead shareMode = 0x1
shareModeWrite shareMode = 0x2
- sidVmGroup = "S-1-5-83-0"
+ sidVMGroup = "S-1-5-83-0"
- trusteeFormIsSid trusteeForm = 0
+ trusteeFormIsSID trusteeForm = 0
trusteeTypeWellKnownGroup trusteeType = 5
)
@@ -68,11 +69,13 @@ const (
// include Grant ACE entries for the VM Group SID. This is a golang re-
// implementation of the same function in vmcompute, just not exported in
// RS5. Which kind of sucks. Sucks a lot :/
+//
+//revive:disable-next-line:var-naming VM, not Vm
func GrantVmGroupAccess(name string) error {
// Stat (to determine if `name` is a directory).
s, err := os.Stat(name)
if err != nil {
- return errors.Wrapf(err, "%s os.Stat %s", gvmga, name)
+ return fmt.Errorf("%s os.Stat %s: %w", gvmga, name, err)
}
// Get a handle to the file/directory. Must defer Close on success.
@@ -80,7 +83,7 @@ func GrantVmGroupAccess(name string) error {
if err != nil {
return err // Already wrapped
}
- defer syscall.CloseHandle(fd)
+ defer syscall.CloseHandle(fd) //nolint:errcheck
// Get the current DACL and Security Descriptor. Must defer LocalFree on success.
ot := objectTypeFileObject
@@ -88,9 +91,9 @@ func GrantVmGroupAccess(name string) error {
sd := uintptr(0)
origDACL := uintptr(0)
if err := getSecurityInfo(fd, uint32(ot), uint32(si), nil, nil, &origDACL, nil, &sd); err != nil {
- return errors.Wrapf(err, "%s GetSecurityInfo %s", gvmga, name)
+ return fmt.Errorf("%s GetSecurityInfo %s: %w", gvmga, name, err)
}
- defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd)))
+ defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(sd))) //nolint:errcheck
// Generate a new DACL which is the current DACL with the required ACEs added.
// Must defer LocalFree on success.
@@ -98,11 +101,11 @@ func GrantVmGroupAccess(name string) error {
if err != nil {
return err // Already wrapped
}
- defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL)))
+ defer syscall.LocalFree((syscall.Handle)(unsafe.Pointer(newDACL))) //nolint:errcheck
// And finally use SetSecurityInfo to apply the updated DACL.
if err := setSecurityInfo(fd, uint32(ot), uint32(si), uintptr(0), uintptr(0), newDACL, uintptr(0)); err != nil {
- return errors.Wrapf(err, "%s SetSecurityInfo %s", gvmga, name)
+ return fmt.Errorf("%s SetSecurityInfo %s: %w", gvmga, name, err)
}
return nil
@@ -111,16 +114,19 @@ func GrantVmGroupAccess(name string) error {
// createFile is a helper function to call [Nt]CreateFile to get a handle to
// the file or directory.
func createFile(name string, isDir bool) (syscall.Handle, error) {
- namep := syscall.StringToUTF16(name)
+ namep, err := syscall.UTF16FromString(name)
+ if err != nil {
+ return syscall.InvalidHandle, fmt.Errorf("could not convernt name to UTF-16: %w", err)
+ }
da := uint32(desiredAccessReadControl | desiredAccessWriteDac)
sm := uint32(shareModeRead | shareModeWrite)
fa := uint32(syscall.FILE_ATTRIBUTE_NORMAL)
if isDir {
- fa = uint32(fa | syscall.FILE_FLAG_BACKUP_SEMANTICS)
+ fa |= syscall.FILE_FLAG_BACKUP_SEMANTICS
}
fd, err := syscall.CreateFile(&namep[0], da, sm, nil, syscall.OPEN_EXISTING, fa, 0)
if err != nil {
- return 0, errors.Wrapf(err, "%s syscall.CreateFile %s", gvmga, name)
+ return syscall.InvalidHandle, fmt.Errorf("%s syscall.CreateFile %s: %w", gvmga, name, err)
}
return fd, nil
}
@@ -129,9 +135,9 @@ func createFile(name string, isDir bool) (syscall.Handle, error) {
// The caller is responsible for LocalFree of the returned DACL on success.
func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintptr, error) {
// Generate pointers to the SIDs based on the string SIDs
- sid, err := syscall.StringToSid(sidVmGroup)
+ sid, err := syscall.StringToSid(sidVMGroup)
if err != nil {
- return 0, errors.Wrapf(err, "%s syscall.StringToSid %s %s", gvmga, name, sidVmGroup)
+ return 0, fmt.Errorf("%s syscall.StringToSid %s %s: %w", gvmga, name, sidVMGroup, err)
}
inheritance := inheritModeNoInheritance
@@ -140,12 +146,12 @@ func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintp
}
eaArray := []explicitAccess{
- explicitAccess{
+ {
accessPermissions: accessMaskDesiredPermission,
accessMode: accessModeGrant,
inheritance: inheritance,
trustee: trustee{
- trusteeForm: trusteeFormIsSid,
+ trusteeForm: trusteeFormIsSID,
trusteeType: trusteeTypeWellKnownGroup,
name: uintptr(unsafe.Pointer(sid)),
},
@@ -154,7 +160,7 @@ func generateDACLWithAcesAdded(name string, isDir bool, origDACL uintptr) (uintp
modifiedDACL := uintptr(0)
if err := setEntriesInAcl(uintptr(uint32(1)), uintptr(unsafe.Pointer(&eaArray[0])), origDACL, &modifiedDACL); err != nil {
- return 0, errors.Wrapf(err, "%s SetEntriesInAcl %s", gvmga, name)
+ return 0, fmt.Errorf("%s SetEntriesInAcl %s: %w", gvmga, name, err)
}
return modifiedDACL, nil
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go
index d7096716ce..71326e4e46 100644
--- a/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go
+++ b/vendor/github.com/Microsoft/go-winio/pkg/security/syscall_windows.go
@@ -1,6 +1,6 @@
package security
-//go:generate go run mksyscall_windows.go -output zsyscall_windows.go syscall_windows.go
+//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go syscall_windows.go
//sys getSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, ppsidOwner **uintptr, ppsidGroup **uintptr, ppDacl *uintptr, ppSacl *uintptr, ppSecurityDescriptor *uintptr) (win32err error) = advapi32.GetSecurityInfo
//sys setSecurityInfo(handle syscall.Handle, objectType uint32, si uint32, psidOwner uintptr, psidGroup uintptr, pDacl uintptr, pSacl uintptr) (win32err error) = advapi32.SetSecurityInfo
diff --git a/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go
index 4084680e0f..26c986b88f 100644
--- a/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go
+++ b/vendor/github.com/Microsoft/go-winio/pkg/security/zsyscall_windows.go
@@ -1,4 +1,6 @@
-// Code generated by 'go generate'; DO NOT EDIT.
+//go:build windows
+
+// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
package security
diff --git a/vendor/github.com/Microsoft/go-winio/privilege.go b/vendor/github.com/Microsoft/go-winio/privilege.go
index c3dd7c2176..0ff9dac906 100644
--- a/vendor/github.com/Microsoft/go-winio/privilege.go
+++ b/vendor/github.com/Microsoft/go-winio/privilege.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package winio
@@ -24,22 +25,17 @@ import (
//sys lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) = advapi32.LookupPrivilegeDisplayNameW
const (
- SE_PRIVILEGE_ENABLED = 2
+ //revive:disable-next-line:var-naming ALL_CAPS
+ SE_PRIVILEGE_ENABLED = windows.SE_PRIVILEGE_ENABLED
- ERROR_NOT_ALL_ASSIGNED syscall.Errno = 1300
+ //revive:disable-next-line:var-naming ALL_CAPS
+ ERROR_NOT_ALL_ASSIGNED syscall.Errno = windows.ERROR_NOT_ALL_ASSIGNED
SeBackupPrivilege = "SeBackupPrivilege"
SeRestorePrivilege = "SeRestorePrivilege"
SeSecurityPrivilege = "SeSecurityPrivilege"
)
-const (
- securityAnonymous = iota
- securityIdentification
- securityImpersonation
- securityDelegation
-)
-
var (
privNames = make(map[string]uint64)
privNameMutex sync.Mutex
@@ -51,11 +47,9 @@ type PrivilegeError struct {
}
func (e *PrivilegeError) Error() string {
- s := ""
+ s := "Could not enable privilege "
if len(e.privileges) > 1 {
s = "Could not enable privileges "
- } else {
- s = "Could not enable privilege "
}
for i, p := range e.privileges {
if i != 0 {
@@ -94,7 +88,7 @@ func RunWithPrivileges(names []string, fn func() error) error {
}
func mapPrivileges(names []string) ([]uint64, error) {
- var privileges []uint64
+ privileges := make([]uint64, 0, len(names))
privNameMutex.Lock()
defer privNameMutex.Unlock()
for _, name := range names {
@@ -127,7 +121,7 @@ func enableDisableProcessPrivilege(names []string, action uint32) error {
return err
}
- p, _ := windows.GetCurrentProcess()
+ p := windows.CurrentProcess()
var token windows.Token
err = windows.OpenProcessToken(p, windows.TOKEN_ADJUST_PRIVILEGES|windows.TOKEN_QUERY, &token)
if err != nil {
@@ -140,10 +134,10 @@ func enableDisableProcessPrivilege(names []string, action uint32) error {
func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) error {
var b bytes.Buffer
- binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))
+ _ = binary.Write(&b, binary.LittleEndian, uint32(len(privileges)))
for _, p := range privileges {
- binary.Write(&b, binary.LittleEndian, p)
- binary.Write(&b, binary.LittleEndian, action)
+ _ = binary.Write(&b, binary.LittleEndian, p)
+ _ = binary.Write(&b, binary.LittleEndian, action)
}
prevState := make([]byte, b.Len())
reqSize := uint32(0)
@@ -151,7 +145,7 @@ func adjustPrivileges(token windows.Token, privileges []uint64, action uint32) e
if !success {
return err
}
- if err == ERROR_NOT_ALL_ASSIGNED {
+ if err == ERROR_NOT_ALL_ASSIGNED { //nolint:errorlint // err is Errno
return &PrivilegeError{privileges}
}
return nil
@@ -177,7 +171,7 @@ func getPrivilegeName(luid uint64) string {
}
func newThreadToken() (windows.Token, error) {
- err := impersonateSelf(securityImpersonation)
+ err := impersonateSelf(windows.SecurityImpersonation)
if err != nil {
return 0, err
}
diff --git a/vendor/github.com/Microsoft/go-winio/reparse.go b/vendor/github.com/Microsoft/go-winio/reparse.go
index fc1ee4d3a3..67d1a104a6 100644
--- a/vendor/github.com/Microsoft/go-winio/reparse.go
+++ b/vendor/github.com/Microsoft/go-winio/reparse.go
@@ -1,3 +1,6 @@
+//go:build windows
+// +build windows
+
package winio
import (
@@ -113,16 +116,16 @@ func EncodeReparsePoint(rp *ReparsePoint) []byte {
}
var b bytes.Buffer
- binary.Write(&b, binary.LittleEndian, &data)
+ _ = binary.Write(&b, binary.LittleEndian, &data)
if !rp.IsMountPoint {
flags := uint32(0)
if relative {
flags |= 1
}
- binary.Write(&b, binary.LittleEndian, flags)
+ _ = binary.Write(&b, binary.LittleEndian, flags)
}
- binary.Write(&b, binary.LittleEndian, ntTarget16)
- binary.Write(&b, binary.LittleEndian, target16)
+ _ = binary.Write(&b, binary.LittleEndian, ntTarget16)
+ _ = binary.Write(&b, binary.LittleEndian, target16)
return b.Bytes()
}
diff --git a/vendor/github.com/Microsoft/go-winio/sd.go b/vendor/github.com/Microsoft/go-winio/sd.go
index db1b370a1b..5550ef6b61 100644
--- a/vendor/github.com/Microsoft/go-winio/sd.go
+++ b/vendor/github.com/Microsoft/go-winio/sd.go
@@ -1,23 +1,25 @@
+//go:build windows
// +build windows
package winio
import (
+ "errors"
"syscall"
"unsafe"
+
+ "golang.org/x/sys/windows"
)
//sys lookupAccountName(systemName *uint16, accountName string, sid *byte, sidSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountNameW
+//sys lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) = advapi32.LookupAccountSidW
//sys convertSidToStringSid(sid *byte, str **uint16) (err error) = advapi32.ConvertSidToStringSidW
+//sys convertStringSidToSid(str *uint16, sid **byte) (err error) = advapi32.ConvertStringSidToSidW
//sys convertStringSecurityDescriptorToSecurityDescriptor(str string, revision uint32, sd *uintptr, size *uint32) (err error) = advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW
//sys convertSecurityDescriptorToStringSecurityDescriptor(sd *byte, revision uint32, secInfo uint32, sddl **uint16, sddlSize *uint32) (err error) = advapi32.ConvertSecurityDescriptorToStringSecurityDescriptorW
//sys localFree(mem uintptr) = LocalFree
//sys getSecurityDescriptorLength(sd uintptr) (len uint32) = advapi32.GetSecurityDescriptorLength
-const (
- cERROR_NONE_MAPPED = syscall.Errno(1332)
-)
-
type AccountLookupError struct {
Name string
Err error
@@ -28,8 +30,10 @@ func (e *AccountLookupError) Error() string {
return "lookup account: empty account name specified"
}
var s string
- switch e.Err {
- case cERROR_NONE_MAPPED:
+ switch {
+ case errors.Is(e.Err, windows.ERROR_INVALID_SID):
+ s = "the security ID structure is invalid"
+ case errors.Is(e.Err, windows.ERROR_NONE_MAPPED):
s = "not found"
default:
s = e.Err.Error()
@@ -37,6 +41,8 @@ func (e *AccountLookupError) Error() string {
return "lookup account " + e.Name + ": " + s
}
+func (e *AccountLookupError) Unwrap() error { return e.Err }
+
type SddlConversionError struct {
Sddl string
Err error
@@ -46,15 +52,19 @@ func (e *SddlConversionError) Error() string {
return "convert " + e.Sddl + ": " + e.Err.Error()
}
+func (e *SddlConversionError) Unwrap() error { return e.Err }
+
// LookupSidByName looks up the SID of an account by name
+//
+//revive:disable-next-line:var-naming SID, not Sid
func LookupSidByName(name string) (sid string, err error) {
if name == "" {
- return "", &AccountLookupError{name, cERROR_NONE_MAPPED}
+ return "", &AccountLookupError{name, windows.ERROR_NONE_MAPPED}
}
var sidSize, sidNameUse, refDomainSize uint32
err = lookupAccountName(nil, name, nil, &sidSize, nil, &refDomainSize, &sidNameUse)
- if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER {
+ if err != nil && err != syscall.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno
return "", &AccountLookupError{name, err}
}
sidBuffer := make([]byte, sidSize)
@@ -73,6 +83,42 @@ func LookupSidByName(name string) (sid string, err error) {
return sid, nil
}
+// LookupNameBySid looks up the name of an account by SID
+//
+//revive:disable-next-line:var-naming SID, not Sid
+func LookupNameBySid(sid string) (name string, err error) {
+ if sid == "" {
+ return "", &AccountLookupError{sid, windows.ERROR_NONE_MAPPED}
+ }
+
+ sidBuffer, err := windows.UTF16PtrFromString(sid)
+ if err != nil {
+ return "", &AccountLookupError{sid, err}
+ }
+
+ var sidPtr *byte
+ if err = convertStringSidToSid(sidBuffer, &sidPtr); err != nil {
+ return "", &AccountLookupError{sid, err}
+ }
+ defer localFree(uintptr(unsafe.Pointer(sidPtr)))
+
+ var nameSize, refDomainSize, sidNameUse uint32
+ err = lookupAccountSid(nil, sidPtr, nil, &nameSize, nil, &refDomainSize, &sidNameUse)
+ if err != nil && err != windows.ERROR_INSUFFICIENT_BUFFER { //nolint:errorlint // err is Errno
+ return "", &AccountLookupError{sid, err}
+ }
+
+ nameBuffer := make([]uint16, nameSize)
+ refDomainBuffer := make([]uint16, refDomainSize)
+ err = lookupAccountSid(nil, sidPtr, &nameBuffer[0], &nameSize, &refDomainBuffer[0], &refDomainSize, &sidNameUse)
+ if err != nil {
+ return "", &AccountLookupError{sid, err}
+ }
+
+ name = windows.UTF16ToString(nameBuffer)
+ return name, nil
+}
+
func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
var sdBuffer uintptr
err := convertStringSecurityDescriptorToSecurityDescriptor(sddl, 1, &sdBuffer, nil)
@@ -87,7 +133,7 @@ func SddlToSecurityDescriptor(sddl string) ([]byte, error) {
func SecurityDescriptorToSddl(sd []byte) (string, error) {
var sddl *uint16
- // The returned string length seems to including an aribtrary number of terminating NULs.
+ // The returned string length seems to include an arbitrary number of terminating NULs.
// Don't use it.
err := convertSecurityDescriptorToStringSecurityDescriptor(&sd[0], 1, 0xff, &sddl, nil)
if err != nil {
diff --git a/vendor/github.com/Microsoft/go-winio/syscall.go b/vendor/github.com/Microsoft/go-winio/syscall.go
index 5955c99fde..a6ca111b39 100644
--- a/vendor/github.com/Microsoft/go-winio/syscall.go
+++ b/vendor/github.com/Microsoft/go-winio/syscall.go
@@ -1,3 +1,5 @@
+//go:build windows
+
package winio
-//go:generate go run golang.org/x/sys/windows/mkwinsyscall -output zsyscall_windows.go file.go pipe.go sd.go fileinfo.go privilege.go backup.go hvsock.go
+//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go ./*.go
diff --git a/vendor/github.com/Microsoft/go-winio/tools.go b/vendor/github.com/Microsoft/go-winio/tools.go
new file mode 100644
index 0000000000..2aa045843e
--- /dev/null
+++ b/vendor/github.com/Microsoft/go-winio/tools.go
@@ -0,0 +1,5 @@
+//go:build tools
+
+package winio
+
+import _ "golang.org/x/tools/cmd/stringer"
diff --git a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
index a33a36c0ff..b54cad1127 100644
--- a/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
+++ b/vendor/github.com/Microsoft/go-winio/vhd/vhd.go
@@ -1,3 +1,4 @@
+//go:build windows
// +build windows
package vhd
@@ -7,14 +8,13 @@ import (
"syscall"
"github.com/Microsoft/go-winio/pkg/guid"
- "github.com/pkg/errors"
"golang.org/x/sys/windows"
)
-//go:generate go run mksyscall_windows.go -output zvhd_windows.go vhd.go
+//go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zvhd_windows.go vhd.go
//sys createVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, securityDescriptor *uintptr, createVirtualDiskFlags uint32, providerSpecificFlags uint32, parameters *CreateVirtualDiskParameters, overlapped *syscall.Overlapped, handle *syscall.Handle) (win32err error) = virtdisk.CreateVirtualDisk
-//sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (win32err error) = virtdisk.OpenVirtualDisk
+//sys openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) = virtdisk.OpenVirtualDisk
//sys attachVirtualDisk(handle syscall.Handle, securityDescriptor *uintptr, attachVirtualDiskFlag uint32, providerSpecificFlags uint32, parameters *AttachVirtualDiskParameters, overlapped *syscall.Overlapped) (win32err error) = virtdisk.AttachVirtualDisk
//sys detachVirtualDisk(handle syscall.Handle, detachVirtualDiskFlags uint32, providerSpecificFlags uint32) (win32err error) = virtdisk.DetachVirtualDisk
//sys getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint32, buffer *uint16) (win32err error) = virtdisk.GetVirtualDiskPhysicalPath
@@ -62,20 +62,35 @@ type OpenVirtualDiskParameters struct {
Version2 OpenVersion2
}
+// The higher level `OpenVersion2` struct uses `bool`s to refer to `GetInfoOnly` and `ReadOnly` for ease of use. However,
+// the internal windows structure uses `BOOL`s aka int32s for these types. `openVersion2` is used for translating
+// `OpenVersion2` fields to the correct windows internal field types on the `Open____` methods.
+type openVersion2 struct {
+ getInfoOnly int32
+ readOnly int32
+ resiliencyGUID guid.GUID
+}
+
+type openVirtualDiskParameters struct {
+ version uint32
+ version2 openVersion2
+}
+
type AttachVersion2 struct {
RestrictedOffset uint64
RestrictedLength uint64
}
type AttachVirtualDiskParameters struct {
- Version uint32 // Must always be set to 2
+ Version uint32
Version2 AttachVersion2
}
const (
+ //revive:disable-next-line:var-naming ALL_CAPS
VIRTUAL_STORAGE_TYPE_DEVICE_VHDX = 0x3
- // Access Mask for opening a VHD
+ // Access Mask for opening a VHD.
VirtualDiskAccessNone VirtualDiskAccessMask = 0x00000000
VirtualDiskAccessAttachRO VirtualDiskAccessMask = 0x00010000
VirtualDiskAccessAttachRW VirtualDiskAccessMask = 0x00020000
@@ -87,7 +102,7 @@ const (
VirtualDiskAccessAll VirtualDiskAccessMask = 0x003f0000
VirtualDiskAccessWritable VirtualDiskAccessMask = 0x00320000
- // Flags for creating a VHD
+ // Flags for creating a VHD.
CreateVirtualDiskFlagNone CreateVirtualDiskFlag = 0x0
CreateVirtualDiskFlagFullPhysicalAllocation CreateVirtualDiskFlag = 0x1
CreateVirtualDiskFlagPreventWritesToSourceDisk CreateVirtualDiskFlag = 0x2
@@ -95,12 +110,12 @@ const (
CreateVirtualDiskFlagCreateBackingStorage CreateVirtualDiskFlag = 0x8
CreateVirtualDiskFlagUseChangeTrackingSourceLimit CreateVirtualDiskFlag = 0x10
CreateVirtualDiskFlagPreserveParentChangeTrackingState CreateVirtualDiskFlag = 0x20
- CreateVirtualDiskFlagVhdSetUseOriginalBackingStorage CreateVirtualDiskFlag = 0x40
+ CreateVirtualDiskFlagVhdSetUseOriginalBackingStorage CreateVirtualDiskFlag = 0x40 //revive:disable-line:var-naming VHD, not Vhd
CreateVirtualDiskFlagSparseFile CreateVirtualDiskFlag = 0x80
- CreateVirtualDiskFlagPmemCompatible CreateVirtualDiskFlag = 0x100
+ CreateVirtualDiskFlagPmemCompatible CreateVirtualDiskFlag = 0x100 //revive:disable-line:var-naming PMEM, not Pmem
CreateVirtualDiskFlagSupportCompressedVolumes CreateVirtualDiskFlag = 0x200
- // Flags for opening a VHD
+ // Flags for opening a VHD.
OpenVirtualDiskFlagNone VirtualDiskFlag = 0x00000000
OpenVirtualDiskFlagNoParents VirtualDiskFlag = 0x00000001
OpenVirtualDiskFlagBlankFile VirtualDiskFlag = 0x00000002
@@ -113,7 +128,7 @@ const (
OpenVirtualDiskFlagNoWriteHardening VirtualDiskFlag = 0x00000100
OpenVirtualDiskFlagSupportCompressedVolumes VirtualDiskFlag = 0x00000200
- // Flags for attaching a VHD
+ // Flags for attaching a VHD.
AttachVirtualDiskFlagNone AttachVirtualDiskFlag = 0x00000000
AttachVirtualDiskFlagReadOnly AttachVirtualDiskFlag = 0x00000001
AttachVirtualDiskFlagNoDriveLetter AttachVirtualDiskFlag = 0x00000002
@@ -126,12 +141,14 @@ const (
AttachVirtualDiskFlagSinglePartition AttachVirtualDiskFlag = 0x00000100
AttachVirtualDiskFlagRegisterVolume AttachVirtualDiskFlag = 0x00000200
- // Flags for detaching a VHD
+ // Flags for detaching a VHD.
DetachVirtualDiskFlagNone DetachVirtualDiskFlag = 0x0
)
// CreateVhdx is a helper function to create a simple vhdx file at the given path using
// default values.
+//
+//revive:disable-next-line:var-naming VHDX, not Vhdx
func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {
params := CreateVirtualDiskParameters{
Version: 2,
@@ -146,21 +163,20 @@ func CreateVhdx(path string, maxSizeInGb, blockSizeInMb uint32) error {
return err
}
- if err := syscall.CloseHandle(handle); err != nil {
- return err
- }
- return nil
+ return syscall.CloseHandle(handle)
}
// DetachVirtualDisk detaches a virtual hard disk by handle.
func DetachVirtualDisk(handle syscall.Handle) (err error) {
if err := detachVirtualDisk(handle, 0, 0); err != nil {
- return errors.Wrap(err, "failed to detach virtual disk")
+ return fmt.Errorf("failed to detach virtual disk: %w", err)
}
return nil
}
// DetachVhd detaches a vhd found at `path`.
+//
+//revive:disable-next-line:var-naming VHD, not Vhd
func DetachVhd(path string) error {
handle, err := OpenVirtualDisk(
path,
@@ -170,12 +186,16 @@ func DetachVhd(path string) error {
if err != nil {
return err
}
- defer syscall.CloseHandle(handle)
+ defer syscall.CloseHandle(handle) //nolint:errcheck
return DetachVirtualDisk(handle)
}
// AttachVirtualDisk attaches a virtual hard disk for use.
-func AttachVirtualDisk(handle syscall.Handle, attachVirtualDiskFlag AttachVirtualDiskFlag, parameters *AttachVirtualDiskParameters) (err error) {
+func AttachVirtualDisk(
+ handle syscall.Handle,
+ attachVirtualDiskFlag AttachVirtualDiskFlag,
+ parameters *AttachVirtualDiskParameters,
+) (err error) {
// Supports both version 1 and 2 of the attach parameters as version 2 wasn't present in RS5.
if err := attachVirtualDisk(
handle,
@@ -185,13 +205,15 @@ func AttachVirtualDisk(handle syscall.Handle, attachVirtualDiskFlag AttachVirtua
parameters,
nil,
); err != nil {
- return errors.Wrap(err, "failed to attach virtual disk")
+ return fmt.Errorf("failed to attach virtual disk: %w", err)
}
return nil
}
// AttachVhd attaches a virtual hard disk at `path` for use. Attaches using version 2
// of the ATTACH_VIRTUAL_DISK_PARAMETERS.
+//
+//revive:disable-next-line:var-naming VHD, not Vhd
func AttachVhd(path string) (err error) {
handle, err := OpenVirtualDisk(
path,
@@ -202,20 +224,24 @@ func AttachVhd(path string) (err error) {
return err
}
- defer syscall.CloseHandle(handle)
+ defer syscall.CloseHandle(handle) //nolint:errcheck
params := AttachVirtualDiskParameters{Version: 2}
if err := AttachVirtualDisk(
handle,
AttachVirtualDiskFlagNone,
¶ms,
); err != nil {
- return errors.Wrap(err, "failed to attach virtual disk")
+ return fmt.Errorf("failed to attach virtual disk: %w", err)
}
return nil
}
// OpenVirtualDisk obtains a handle to a VHD opened with supplied access mask and flags.
-func OpenVirtualDisk(vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag) (syscall.Handle, error) {
+func OpenVirtualDisk(
+ vhdPath string,
+ virtualDiskAccessMask VirtualDiskAccessMask,
+ openVirtualDiskFlags VirtualDiskFlag,
+) (syscall.Handle, error) {
parameters := OpenVirtualDiskParameters{Version: 2}
handle, err := OpenVirtualDiskWithParameters(
vhdPath,
@@ -230,29 +256,55 @@ func OpenVirtualDisk(vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask
}
// OpenVirtualDiskWithParameters obtains a handle to a VHD opened with supplied access mask, flags and parameters.
-func OpenVirtualDiskWithParameters(vhdPath string, virtualDiskAccessMask VirtualDiskAccessMask, openVirtualDiskFlags VirtualDiskFlag, parameters *OpenVirtualDiskParameters) (syscall.Handle, error) {
+func OpenVirtualDiskWithParameters(
+ vhdPath string,
+ virtualDiskAccessMask VirtualDiskAccessMask,
+ openVirtualDiskFlags VirtualDiskFlag,
+ parameters *OpenVirtualDiskParameters,
+) (syscall.Handle, error) {
var (
handle syscall.Handle
defaultType VirtualStorageType
+ getInfoOnly int32
+ readOnly int32
)
if parameters.Version != 2 {
return handle, fmt.Errorf("only version 2 VHDs are supported, found version: %d", parameters.Version)
}
+ if parameters.Version2.GetInfoOnly {
+ getInfoOnly = 1
+ }
+ if parameters.Version2.ReadOnly {
+ readOnly = 1
+ }
+ params := &openVirtualDiskParameters{
+ version: parameters.Version,
+ version2: openVersion2{
+ getInfoOnly,
+ readOnly,
+ parameters.Version2.ResiliencyGUID,
+ },
+ }
if err := openVirtualDisk(
&defaultType,
vhdPath,
uint32(virtualDiskAccessMask),
uint32(openVirtualDiskFlags),
- parameters,
+ params,
&handle,
); err != nil {
- return 0, errors.Wrap(err, "failed to open virtual disk")
+ return 0, fmt.Errorf("failed to open virtual disk: %w", err)
}
return handle, nil
}
// CreateVirtualDisk creates a virtual harddisk and returns a handle to the disk.
-func CreateVirtualDisk(path string, virtualDiskAccessMask VirtualDiskAccessMask, createVirtualDiskFlags CreateVirtualDiskFlag, parameters *CreateVirtualDiskParameters) (syscall.Handle, error) {
+func CreateVirtualDisk(
+ path string,
+ virtualDiskAccessMask VirtualDiskAccessMask,
+ createVirtualDiskFlags CreateVirtualDiskFlag,
+ parameters *CreateVirtualDiskParameters,
+) (syscall.Handle, error) {
var (
handle syscall.Handle
defaultType VirtualStorageType
@@ -272,7 +324,7 @@ func CreateVirtualDisk(path string, virtualDiskAccessMask VirtualDiskAccessMask,
nil,
&handle,
); err != nil {
- return handle, errors.Wrap(err, "failed to create virtual disk")
+ return handle, fmt.Errorf("failed to create virtual disk: %w", err)
}
return handle, nil
}
@@ -290,12 +342,14 @@ func GetVirtualDiskPhysicalPath(handle syscall.Handle) (_ string, err error) {
&diskPathSizeInBytes,
&diskPhysicalPathBuf[0],
); err != nil {
- return "", errors.Wrap(err, "failed to get disk physical path")
+ return "", fmt.Errorf("failed to get disk physical path: %w", err)
}
return windows.UTF16ToString(diskPhysicalPathBuf[:]), nil
}
// CreateDiffVhd is a helper function to create a differencing virtual disk.
+//
+//revive:disable-next-line:var-naming VHD, not Vhd
func CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error {
// Setting `ParentPath` is how to signal to create a differencing disk.
createParams := &CreateVirtualDiskParameters{
@@ -314,10 +368,10 @@ func CreateDiffVhd(diffVhdPath, baseVhdPath string, blockSizeInMB uint32) error
createParams,
)
if err != nil {
- return fmt.Errorf("failed to create differencing vhd: %s", err)
+ return fmt.Errorf("failed to create differencing vhd: %w", err)
}
if err := syscall.CloseHandle(vhdHandle); err != nil {
- return fmt.Errorf("failed to close differencing vhd handle: %s", err)
+ return fmt.Errorf("failed to close differencing vhd handle: %w", err)
}
return nil
}
diff --git a/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go b/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go
index 7fb5f3651b..d0e917d2be 100644
--- a/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go
+++ b/vendor/github.com/Microsoft/go-winio/vhd/zvhd_windows.go
@@ -1,4 +1,6 @@
-// Code generated by 'go generate'; DO NOT EDIT.
+//go:build windows
+
+// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
package vhd
@@ -88,7 +90,7 @@ func getVirtualDiskPhysicalPath(handle syscall.Handle, diskPathSizeInBytes *uint
return
}
-func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (win32err error) {
+func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) {
var _p0 *uint16
_p0, win32err = syscall.UTF16PtrFromString(path)
if win32err != nil {
@@ -97,7 +99,7 @@ func openVirtualDisk(virtualStorageType *VirtualStorageType, path string, virtua
return _openVirtualDisk(virtualStorageType, _p0, virtualDiskAccessMask, openVirtualDiskFlags, parameters, handle)
}
-func _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *OpenVirtualDiskParameters, handle *syscall.Handle) (win32err error) {
+func _openVirtualDisk(virtualStorageType *VirtualStorageType, path *uint16, virtualDiskAccessMask uint32, openVirtualDiskFlags uint32, parameters *openVirtualDiskParameters, handle *syscall.Handle) (win32err error) {
r0, _, _ := syscall.Syscall6(procOpenVirtualDisk.Addr(), 6, uintptr(unsafe.Pointer(virtualStorageType)), uintptr(unsafe.Pointer(path)), uintptr(virtualDiskAccessMask), uintptr(openVirtualDiskFlags), uintptr(unsafe.Pointer(parameters)), uintptr(unsafe.Pointer(handle)))
if r0 != 0 {
win32err = syscall.Errno(r0)
diff --git a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
index 176ff75e32..469b16f639 100644
--- a/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
+++ b/vendor/github.com/Microsoft/go-winio/zsyscall_windows.go
@@ -1,4 +1,6 @@
-// Code generated by 'go generate'; DO NOT EDIT.
+//go:build windows
+
+// Code generated by 'go generate' using "github.com/Microsoft/go-winio/tools/mkwinsyscall"; DO NOT EDIT.
package winio
@@ -47,9 +49,11 @@ var (
procConvertSecurityDescriptorToStringSecurityDescriptorW = modadvapi32.NewProc("ConvertSecurityDescriptorToStringSecurityDescriptorW")
procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW")
procConvertStringSecurityDescriptorToSecurityDescriptorW = modadvapi32.NewProc("ConvertStringSecurityDescriptorToSecurityDescriptorW")
+ procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW")
procGetSecurityDescriptorLength = modadvapi32.NewProc("GetSecurityDescriptorLength")
procImpersonateSelf = modadvapi32.NewProc("ImpersonateSelf")
procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW")
+ procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW")
procLookupPrivilegeDisplayNameW = modadvapi32.NewProc("LookupPrivilegeDisplayNameW")
procLookupPrivilegeNameW = modadvapi32.NewProc("LookupPrivilegeNameW")
procLookupPrivilegeValueW = modadvapi32.NewProc("LookupPrivilegeValueW")
@@ -59,7 +63,6 @@ var (
procBackupWrite = modkernel32.NewProc("BackupWrite")
procCancelIoEx = modkernel32.NewProc("CancelIoEx")
procConnectNamedPipe = modkernel32.NewProc("ConnectNamedPipe")
- procCreateFileW = modkernel32.NewProc("CreateFileW")
procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort")
procCreateNamedPipeW = modkernel32.NewProc("CreateNamedPipeW")
procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
@@ -74,7 +77,6 @@ var (
procRtlDosPathNameToNtPathName_U = modntdll.NewProc("RtlDosPathNameToNtPathName_U")
procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb")
procWSAGetOverlappedResult = modws2_32.NewProc("WSAGetOverlappedResult")
- procbind = modws2_32.NewProc("bind")
)
func adjustTokenPrivileges(token windows.Token, releaseAll bool, input *byte, outputSize uint32, output *byte, requiredSize *uint32) (success bool, err error) {
@@ -123,6 +125,14 @@ func _convertStringSecurityDescriptorToSecurityDescriptor(str *uint16, revision
return
}
+func convertStringSidToSid(str *uint16, sid **byte) (err error) {
+ r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(str)), uintptr(unsafe.Pointer(sid)), 0)
+ if r1 == 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
func getSecurityDescriptorLength(sd uintptr) (len uint32) {
r0, _, _ := syscall.Syscall(procGetSecurityDescriptorLength.Addr(), 1, uintptr(sd), 0, 0)
len = uint32(r0)
@@ -154,6 +164,14 @@ func _lookupAccountName(systemName *uint16, accountName *uint16, sid *byte, sidS
return
}
+func lookupAccountSid(systemName *uint16, sid *byte, name *uint16, nameSize *uint32, refDomain *uint16, refDomainSize *uint32, sidNameUse *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameSize)), uintptr(unsafe.Pointer(refDomain)), uintptr(unsafe.Pointer(refDomainSize)), uintptr(unsafe.Pointer(sidNameUse)), 0, 0)
+ if r1 == 0 {
+ err = errnoErr(e1)
+ }
+ return
+}
+
func lookupPrivilegeDisplayName(systemName string, name *uint16, buffer *uint16, size *uint32, languageId *uint32) (err error) {
var _p0 *uint16
_p0, err = syscall.UTF16PtrFromString(systemName)
@@ -286,24 +304,6 @@ func connectNamedPipe(pipe syscall.Handle, o *syscall.Overlapped) (err error) {
return
}
-func createFile(name string, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) {
- var _p0 *uint16
- _p0, err = syscall.UTF16PtrFromString(name)
- if err != nil {
- return
- }
- return _createFile(_p0, access, mode, sa, createmode, attrs, templatefile)
-}
-
-func _createFile(name *uint16, access uint32, mode uint32, sa *syscall.SecurityAttributes, createmode uint32, attrs uint32, templatefile syscall.Handle) (handle syscall.Handle, err error) {
- r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
- handle = syscall.Handle(r0)
- if handle == syscall.InvalidHandle {
- err = errnoErr(e1)
- }
- return
-}
-
func createIoCompletionPort(file syscall.Handle, port syscall.Handle, key uintptr, threadCount uint32) (newport syscall.Handle, err error) {
r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(file), uintptr(port), uintptr(key), uintptr(threadCount), 0, 0)
newport = syscall.Handle(r0)
@@ -380,25 +380,25 @@ func setFileCompletionNotificationModes(h syscall.Handle, flags uint8) (err erro
return
}
-func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntstatus) {
+func ntCreateNamedPipeFile(pipe *syscall.Handle, access uint32, oa *objectAttributes, iosb *ioStatusBlock, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (status ntStatus) {
r0, _, _ := syscall.Syscall15(procNtCreateNamedPipeFile.Addr(), 14, uintptr(unsafe.Pointer(pipe)), uintptr(access), uintptr(unsafe.Pointer(oa)), uintptr(unsafe.Pointer(iosb)), uintptr(share), uintptr(disposition), uintptr(options), uintptr(typ), uintptr(readMode), uintptr(completionMode), uintptr(maxInstances), uintptr(inboundQuota), uintptr(outputQuota), uintptr(unsafe.Pointer(timeout)), 0)
- status = ntstatus(r0)
+ status = ntStatus(r0)
return
}
-func rtlDefaultNpAcl(dacl *uintptr) (status ntstatus) {
+func rtlDefaultNpAcl(dacl *uintptr) (status ntStatus) {
r0, _, _ := syscall.Syscall(procRtlDefaultNpAcl.Addr(), 1, uintptr(unsafe.Pointer(dacl)), 0, 0)
- status = ntstatus(r0)
+ status = ntStatus(r0)
return
}
-func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntstatus) {
+func rtlDosPathNameToNtPathName(name *uint16, ntName *unicodeString, filePart uintptr, reserved uintptr) (status ntStatus) {
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U.Addr(), 4, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(ntName)), uintptr(filePart), uintptr(reserved), 0, 0)
- status = ntstatus(r0)
+ status = ntStatus(r0)
return
}
-func rtlNtStatusToDosError(status ntstatus) (winerr error) {
+func rtlNtStatusToDosError(status ntStatus) (winerr error) {
r0, _, _ := syscall.Syscall(procRtlNtStatusToDosErrorNoTeb.Addr(), 1, uintptr(status), 0, 0)
if r0 != 0 {
winerr = syscall.Errno(r0)
@@ -417,11 +417,3 @@ func wsaGetOverlappedResult(h syscall.Handle, o *syscall.Overlapped, bytes *uint
}
return
}
-
-func bind(s syscall.Handle, name unsafe.Pointer, namelen int32) (err error) {
- r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
- if r1 == socketError {
- err = errnoErr(e1)
- }
- return
-}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go b/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go
index 27a62a7238..f46af33bb6 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/cow/cow.go
@@ -86,6 +86,12 @@ type Container interface {
// container to be terminated by some error condition (including calling
// Close).
Wait() error
+ // WaitChannel returns the wait channel of the container
+ WaitChannel() <-chan struct{}
+ // WaitError returns the container termination error.
+ // This function should only be called after the channel in WaitChannel()
+ // is closed. Otherwise it is not thread safe.
+ WaitError() error
// Modify sends a request to modify container resources
Modify(ctx context.Context, config interface{}) error
}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
index e21354ffd6..295d4b849c 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/errors.go
@@ -154,7 +154,7 @@ func (e *HcsError) Error() string {
func (e *HcsError) Temporary() bool {
err, ok := e.Err.(net.Error)
- return ok && err.Temporary()
+ return ok && err.Temporary() //nolint:staticcheck
}
func (e *HcsError) Timeout() bool {
@@ -193,7 +193,7 @@ func (e *SystemError) Error() string {
func (e *SystemError) Temporary() bool {
err, ok := e.Err.(net.Error)
- return ok && err.Temporary()
+ return ok && err.Temporary() //nolint:staticcheck
}
func (e *SystemError) Timeout() bool {
@@ -224,7 +224,7 @@ func (e *ProcessError) Error() string {
func (e *ProcessError) Temporary() bool {
err, ok := e.Err.(net.Error)
- return ok && err.Temporary()
+ return ok && err.Temporary() //nolint:staticcheck
}
func (e *ProcessError) Timeout() bool {
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go b/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
index 75499c967f..a76f6b253e 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/hcs/system.go
@@ -4,17 +4,22 @@ import (
"context"
"encoding/json"
"errors"
+ "fmt"
"strings"
"sync"
"syscall"
+ "time"
"github.com/Microsoft/hcsshim/internal/cow"
"github.com/Microsoft/hcsshim/internal/hcs/schema1"
hcsschema "github.com/Microsoft/hcsshim/internal/hcs/schema2"
+ "github.com/Microsoft/hcsshim/internal/jobobject"
"github.com/Microsoft/hcsshim/internal/log"
+ "github.com/Microsoft/hcsshim/internal/logfields"
"github.com/Microsoft/hcsshim/internal/oc"
"github.com/Microsoft/hcsshim/internal/timeout"
"github.com/Microsoft/hcsshim/internal/vmcompute"
+ "github.com/sirupsen/logrus"
"go.opencensus.io/trace"
)
@@ -28,7 +33,8 @@ type System struct {
waitBlock chan struct{}
waitError error
exitError error
- os, typ string
+ os, typ, owner string
+ startTime time.Time
}
func newSystem(id string) *System {
@@ -38,6 +44,11 @@ func newSystem(id string) *System {
}
}
+// Implementation detail for silo naming, this should NOT be relied upon very heavily.
+func siloNameFmt(containerID string) string {
+ return fmt.Sprintf(`\Container_%s`, containerID)
+}
+
// CreateComputeSystem creates a new compute system with the given configuration but does not start it.
func CreateComputeSystem(ctx context.Context, id string, hcsDocumentInterface interface{}) (_ *System, err error) {
operation := "hcs::CreateComputeSystem"
@@ -127,6 +138,7 @@ func (computeSystem *System) getCachedProperties(ctx context.Context) error {
}
computeSystem.typ = strings.ToLower(props.SystemType)
computeSystem.os = strings.ToLower(props.RuntimeOSType)
+ computeSystem.owner = strings.ToLower(props.Owner)
if computeSystem.os == "" && computeSystem.typ == "container" {
// Pre-RS5 HCS did not return the OS, but it only supported containers
// that ran Windows.
@@ -195,7 +207,7 @@ func (computeSystem *System) Start(ctx context.Context) (err error) {
if err != nil {
return makeSystemError(computeSystem, operation, err, events)
}
-
+ computeSystem.startTime = time.Now()
return nil
}
@@ -275,11 +287,19 @@ func (computeSystem *System) waitBackground() {
oc.SetSpanStatus(span, err)
}
+func (computeSystem *System) WaitChannel() <-chan struct{} {
+ return computeSystem.waitBlock
+}
+
+func (computeSystem *System) WaitError() error {
+ return computeSystem.waitError
+}
+
// Wait synchronously waits for the compute system to shutdown or terminate. If
// the compute system has already exited returns the previous error (if any).
func (computeSystem *System) Wait() error {
- <-computeSystem.waitBlock
- return computeSystem.waitError
+ <-computeSystem.WaitChannel()
+ return computeSystem.WaitError()
}
// ExitError returns an error describing the reason the compute system terminated.
@@ -324,11 +344,115 @@ func (computeSystem *System) Properties(ctx context.Context, types ...schema1.Pr
return properties, nil
}
-// PropertiesV2 returns the requested container properties targeting a V2 schema container.
-func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (*hcsschema.Properties, error) {
- computeSystem.handleLock.RLock()
- defer computeSystem.handleLock.RUnlock()
+// queryInProc handles querying for container properties without reaching out to HCS. `props`
+// will be updated to contain any data returned from the queries present in `types`. If any properties
+// failed to be queried they will be tallied up and returned in as the first return value. Failures on
+// query are NOT considered errors; the only failure case for this method is if the containers job object
+// cannot be opened.
+func (computeSystem *System) queryInProc(ctx context.Context, props *hcsschema.Properties, types []hcsschema.PropertyType) ([]hcsschema.PropertyType, error) {
+ // In the future we can make use of some new functionality in the HCS that allows you
+ // to pass a job object for HCS to use for the container. Currently, the only way we'll
+ // be able to open the job/silo is if we're running as SYSTEM.
+ jobOptions := &jobobject.Options{
+ UseNTVariant: true,
+ Name: siloNameFmt(computeSystem.id),
+ }
+ job, err := jobobject.Open(ctx, jobOptions)
+ if err != nil {
+ return nil, err
+ }
+ defer job.Close()
+
+ var fallbackQueryTypes []hcsschema.PropertyType
+ for _, propType := range types {
+ switch propType {
+ case hcsschema.PTStatistics:
+ // Handle a bad caller asking for the same type twice. No use in re-querying if this is
+ // filled in already.
+ if props.Statistics == nil {
+ props.Statistics, err = computeSystem.statisticsInProc(job)
+ if err != nil {
+ log.G(ctx).WithError(err).Warn("failed to get statistics in-proc")
+
+ fallbackQueryTypes = append(fallbackQueryTypes, propType)
+ }
+ }
+ default:
+ fallbackQueryTypes = append(fallbackQueryTypes, propType)
+ }
+ }
+
+ return fallbackQueryTypes, nil
+}
+
+// statisticsInProc emulates what HCS does to grab statistics for a given container with a small
+// change to make grabbing the private working set total much more efficient.
+func (computeSystem *System) statisticsInProc(job *jobobject.JobObject) (*hcsschema.Statistics, error) {
+ // Start timestamp for these stats before we grab them to match HCS
+ timestamp := time.Now()
+
+ memInfo, err := job.QueryMemoryStats()
+ if err != nil {
+ return nil, err
+ }
+
+ processorInfo, err := job.QueryProcessorStats()
+ if err != nil {
+ return nil, err
+ }
+
+ storageInfo, err := job.QueryStorageStats()
+ if err != nil {
+ return nil, err
+ }
+
+ // This calculates the private working set more efficiently than HCS does. HCS calls NtQuerySystemInformation
+ // with the class SystemProcessInformation which returns an array containing system information for *every*
+ // process running on the machine. They then grab the pids that are running in the container and filter down
+ // the entries in the array to only what's running in that silo and start tallying up the total. This doesn't
+ // work well as performance should get worse if more processess are running on the machine in general and not
+ // just in the container. All of the additional information besides the WorkingSetPrivateSize field is ignored
+ // as well which isn't great and is wasted work to fetch.
+ //
+ // HCS only let's you grab statistics in an all or nothing fashion, so we can't just grab the private
+ // working set ourselves and ask for everything else seperately. The optimization we can make here is
+ // to open the silo ourselves and do the same queries for the rest of the info, as well as calculating
+ // the private working set in a more efficient manner by:
+ //
+ // 1. Find the pids running in the silo
+ // 2. Get a process handle for every process (only need PROCESS_QUERY_LIMITED_INFORMATION access)
+ // 3. Call NtQueryInformationProcess on each process with the class ProcessVmCounters
+ // 4. Tally up the total using the field PrivateWorkingSetSize in VM_COUNTERS_EX2.
+ privateWorkingSet, err := job.QueryPrivateWorkingSet()
+ if err != nil {
+ return nil, err
+ }
+
+ return &hcsschema.Statistics{
+ Timestamp: timestamp,
+ ContainerStartTime: computeSystem.startTime,
+ Uptime100ns: uint64(time.Since(computeSystem.startTime).Nanoseconds()) / 100,
+ Memory: &hcsschema.MemoryStats{
+ MemoryUsageCommitBytes: memInfo.JobMemory,
+ MemoryUsageCommitPeakBytes: memInfo.PeakJobMemoryUsed,
+ MemoryUsagePrivateWorkingSetBytes: privateWorkingSet,
+ },
+ Processor: &hcsschema.ProcessorStats{
+ RuntimeKernel100ns: uint64(processorInfo.TotalKernelTime),
+ RuntimeUser100ns: uint64(processorInfo.TotalUserTime),
+ TotalRuntime100ns: uint64(processorInfo.TotalKernelTime + processorInfo.TotalUserTime),
+ },
+ Storage: &hcsschema.StorageStats{
+ ReadCountNormalized: uint64(storageInfo.ReadStats.IoCount),
+ ReadSizeBytes: storageInfo.ReadStats.TotalSize,
+ WriteCountNormalized: uint64(storageInfo.WriteStats.IoCount),
+ WriteSizeBytes: storageInfo.WriteStats.TotalSize,
+ },
+ }, nil
+}
+// hcsPropertiesV2Query is a helper to make a HcsGetComputeSystemProperties call using the V2 schema property types.
+func (computeSystem *System) hcsPropertiesV2Query(ctx context.Context, types []hcsschema.PropertyType) (*hcsschema.Properties, error) {
operation := "hcs::System::PropertiesV2"
queryBytes, err := json.Marshal(hcsschema.PropertyQuery{PropertyTypes: types})
@@ -345,12 +469,66 @@ func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschem
if propertiesJSON == "" {
return nil, ErrUnexpectedValue
}
- properties := &hcsschema.Properties{}
- if err := json.Unmarshal([]byte(propertiesJSON), properties); err != nil {
+ props := &hcsschema.Properties{}
+ if err := json.Unmarshal([]byte(propertiesJSON), props); err != nil {
return nil, makeSystemError(computeSystem, operation, err, nil)
}
- return properties, nil
+ return props, nil
+}
+
+// PropertiesV2 returns the requested compute systems properties targeting a V2 schema compute system.
+func (computeSystem *System) PropertiesV2(ctx context.Context, types ...hcsschema.PropertyType) (_ *hcsschema.Properties, err error) {
+ computeSystem.handleLock.RLock()
+ defer computeSystem.handleLock.RUnlock()
+
+ // Let HCS tally up the total for VM based queries instead of querying ourselves.
+ if computeSystem.typ != "container" {
+ return computeSystem.hcsPropertiesV2Query(ctx, types)
+ }
+
+ // Define a starter Properties struct with the default fields returned from every
+ // query. Owner is only returned from Statistics but it's harmless to include.
+ properties := &hcsschema.Properties{
+ Id: computeSystem.id,
+ SystemType: computeSystem.typ,
+ RuntimeOsType: computeSystem.os,
+ Owner: computeSystem.owner,
+ }
+
+ logEntry := log.G(ctx)
+ // First lets try and query ourselves without reaching to HCS. If any of the queries fail
+ // we'll take note and fallback to querying HCS for any of the failed types.
+ fallbackTypes, err := computeSystem.queryInProc(ctx, properties, types)
+ if err == nil && len(fallbackTypes) == 0 {
+ return properties, nil
+ } else if err != nil {
+ logEntry.WithError(fmt.Errorf("failed to query compute system properties in-proc: %w", err))
+ fallbackTypes = types
+ }
+
+ logEntry.WithFields(logrus.Fields{
+ logfields.ContainerID: computeSystem.id,
+ "propertyTypes": fallbackTypes,
+ }).Info("falling back to HCS for property type queries")
+
+ hcsProperties, err := computeSystem.hcsPropertiesV2Query(ctx, fallbackTypes)
+ if err != nil {
+ return nil, err
+ }
+
+ // Now add in anything that we might have successfully queried in process.
+ if properties.Statistics != nil {
+ hcsProperties.Statistics = properties.Statistics
+ hcsProperties.Owner = properties.Owner
+ }
+
+ // For future support for querying processlist in-proc as well.
+ if properties.ProcessList != nil {
+ hcsProperties.ProcessList = properties.ProcessList
+ }
+
+ return hcsProperties, nil
}
// Pause pauses the execution of the computeSystem. This feature is not enabled in TP5.
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
index 591a2631e4..84b3682184 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/hns/hnspolicy.go
@@ -21,10 +21,11 @@ const (
)
type NatPolicy struct {
- Type PolicyType `json:"Type"`
- Protocol string `json:",omitempty"`
- InternalPort uint16 `json:",omitempty"`
- ExternalPort uint16 `json:",omitempty"`
+ Type PolicyType `json:"Type"`
+ Protocol string `json:",omitempty"`
+ InternalPort uint16 `json:",omitempty"`
+ ExternalPort uint16 `json:",omitempty"`
+ ExternalPortReserved bool `json:",omitempty"`
}
type QosPolicy struct {
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go
new file mode 100644
index 0000000000..5d6acd69e6
--- /dev/null
+++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/iocp.go
@@ -0,0 +1,111 @@
+package jobobject
+
+import (
+ "context"
+ "fmt"
+ "sync"
+ "unsafe"
+
+ "github.com/Microsoft/hcsshim/internal/log"
+ "github.com/Microsoft/hcsshim/internal/queue"
+ "github.com/Microsoft/hcsshim/internal/winapi"
+ "github.com/sirupsen/logrus"
+ "golang.org/x/sys/windows"
+)
+
+var (
+ ioInitOnce sync.Once
+ initIOErr error
+ // Global iocp handle that will be re-used for every job object
+ ioCompletionPort windows.Handle
+ // Mapping of job handle to queue to place notifications in.
+ jobMap sync.Map
+)
+
+// MsgAllProcessesExited is a type representing a message that every process in a job has exited.
+type MsgAllProcessesExited struct{}
+
+// MsgUnimplemented represents a message that we are aware of, but that isn't implemented currently.
+// This should not be treated as an error.
+type MsgUnimplemented struct{}
+
+// pollIOCP polls the io completion port forever.
+func pollIOCP(ctx context.Context, iocpHandle windows.Handle) {
+ var (
+ overlapped uintptr
+ code uint32
+ key uintptr
+ )
+
+ for {
+ err := windows.GetQueuedCompletionStatus(iocpHandle, &code, &key, (**windows.Overlapped)(unsafe.Pointer(&overlapped)), windows.INFINITE)
+ if err != nil {
+ log.G(ctx).WithError(err).Error("failed to poll for job object message")
+ continue
+ }
+ if val, ok := jobMap.Load(key); ok {
+ msq, ok := val.(*queue.MessageQueue)
+ if !ok {
+ log.G(ctx).WithField("value", msq).Warn("encountered non queue type in job map")
+ continue
+ }
+ notification, err := parseMessage(code, overlapped)
+ if err != nil {
+ log.G(ctx).WithFields(logrus.Fields{
+ "code": code,
+ "overlapped": overlapped,
+ }).Warn("failed to parse job object message")
+ continue
+ }
+ if err := msq.Enqueue(notification); err == queue.ErrQueueClosed {
+ // Write will only return an error when the queue is closed.
+ // The only time a queue would ever be closed is when we call `Close` on
+ // the job it belongs to which also removes it from the jobMap, so something
+ // went wrong here. We can't return as this is reading messages for all jobs
+ // so just log it and move on.
+ log.G(ctx).WithFields(logrus.Fields{
+ "code": code,
+ "overlapped": overlapped,
+ }).Warn("tried to write to a closed queue")
+ continue
+ }
+ } else {
+ log.G(ctx).Warn("received a message for a job not present in the mapping")
+ }
+ }
+}
+
+func parseMessage(code uint32, overlapped uintptr) (interface{}, error) {
+ // Check code and parse out relevant information related to that notification
+ // that we care about. For now all we handle is the message that all processes
+ // in the job have exited.
+ switch code {
+ case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
+ return MsgAllProcessesExited{}, nil
+ // Other messages for completeness and a check to make sure that if we fall
+ // into the default case that this is a code we don't know how to handle.
+ case winapi.JOB_OBJECT_MSG_END_OF_JOB_TIME:
+ case winapi.JOB_OBJECT_MSG_END_OF_PROCESS_TIME:
+ case winapi.JOB_OBJECT_MSG_ACTIVE_PROCESS_LIMIT:
+ case winapi.JOB_OBJECT_MSG_NEW_PROCESS:
+ case winapi.JOB_OBJECT_MSG_EXIT_PROCESS:
+ case winapi.JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:
+ case winapi.JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
+ case winapi.JOB_OBJECT_MSG_JOB_MEMORY_LIMIT:
+ case winapi.JOB_OBJECT_MSG_NOTIFICATION_LIMIT:
+ default:
+ return nil, fmt.Errorf("unknown job notification type: %d", code)
+ }
+ return MsgUnimplemented{}, nil
+}
+
+// Assigns an IO completion port to get notified of events for the registered job
+// object.
+func attachIOCP(job windows.Handle, iocp windows.Handle) error {
+ info := winapi.JOBOBJECT_ASSOCIATE_COMPLETION_PORT{
+ CompletionKey: job,
+ CompletionPort: iocp,
+ }
+ _, err := windows.SetInformationJobObject(job, windows.JobObjectAssociateCompletionPortInformation, uintptr(unsafe.Pointer(&info)), uint32(unsafe.Sizeof(info)))
+ return err
+}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go
new file mode 100644
index 0000000000..c9fdd921a7
--- /dev/null
+++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/jobobject.go
@@ -0,0 +1,538 @@
+package jobobject
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "sync"
+ "unsafe"
+
+ "github.com/Microsoft/hcsshim/internal/queue"
+ "github.com/Microsoft/hcsshim/internal/winapi"
+ "golang.org/x/sys/windows"
+)
+
+// This file provides higher level constructs for the win32 job object API.
+// Most of the core creation and management functions are already present in "golang.org/x/sys/windows"
+// (CreateJobObject, AssignProcessToJobObject, etc.) as well as most of the limit information
+// structs and associated limit flags. Whatever is not present from the job object API
+// in golang.org/x/sys/windows is located in /internal/winapi.
+//
+// https://docs.microsoft.com/en-us/windows/win32/procthread/job-objects
+
+// JobObject is a high level wrapper around a Windows job object. Holds a handle to
+// the job, a queue to receive iocp notifications about the lifecycle
+// of the job and a mutex for synchronized handle access.
+type JobObject struct {
+ handle windows.Handle
+ mq *queue.MessageQueue
+ handleLock sync.RWMutex
+}
+
+// JobLimits represents the resource constraints that can be applied to a job object.
+type JobLimits struct {
+ CPULimit uint32
+ CPUWeight uint32
+ MemoryLimitInBytes uint64
+ MaxIOPS int64
+ MaxBandwidth int64
+}
+
+type CPURateControlType uint32
+
+const (
+ WeightBased CPURateControlType = iota
+ RateBased
+)
+
+// Processor resource controls
+const (
+ cpuLimitMin = 1
+ cpuLimitMax = 10000
+ cpuWeightMin = 1
+ cpuWeightMax = 9
+)
+
+var (
+ ErrAlreadyClosed = errors.New("the handle has already been closed")
+ ErrNotRegistered = errors.New("job is not registered to receive notifications")
+)
+
+// Options represents the set of configurable options when making or opening a job object.
+type Options struct {
+ // `Name` specifies the name of the job object if a named job object is desired.
+ Name string
+ // `Notifications` specifies if the job will be registered to receive notifications.
+ // Defaults to false.
+ Notifications bool
+ // `UseNTVariant` specifies if we should use the `Nt` variant of Open/CreateJobObject.
+ // Defaults to false.
+ UseNTVariant bool
+ // `IOTracking` enables tracking I/O statistics on the job object. More specifically this
+ // calls SetInformationJobObject with the JobObjectIoAttribution class.
+ EnableIOTracking bool
+}
+
+// Create creates a job object.
+//
+// If options.Name is an empty string, the job will not be assigned a name.
+//
+// If options.Notifications are not enabled `PollNotifications` will return immediately with error `errNotRegistered`.
+//
+// If `options` is nil, use default option values.
+//
+// Returns a JobObject structure and an error if there is one.
+func Create(ctx context.Context, options *Options) (_ *JobObject, err error) {
+ if options == nil {
+ options = &Options{}
+ }
+
+ var jobName *winapi.UnicodeString
+ if options.Name != "" {
+ jobName, err = winapi.NewUnicodeString(options.Name)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var jobHandle windows.Handle
+ if options.UseNTVariant {
+ oa := winapi.ObjectAttributes{
+ Length: unsafe.Sizeof(winapi.ObjectAttributes{}),
+ ObjectName: jobName,
+ Attributes: 0,
+ }
+ status := winapi.NtCreateJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)
+ if status != 0 {
+ return nil, winapi.RtlNtStatusToDosError(status)
+ }
+ } else {
+ var jobNameBuf *uint16
+ if jobName != nil && jobName.Buffer != nil {
+ jobNameBuf = jobName.Buffer
+ }
+ jobHandle, err = windows.CreateJobObject(nil, jobNameBuf)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ defer func() {
+ if err != nil {
+ windows.Close(jobHandle)
+ }
+ }()
+
+ job := &JobObject{
+ handle: jobHandle,
+ }
+
+ // If the IOCP we'll be using to receive messages for all jobs hasn't been
+ // created, create it and start polling.
+ if options.Notifications {
+ mq, err := setupNotifications(ctx, job)
+ if err != nil {
+ return nil, err
+ }
+ job.mq = mq
+ }
+
+ if options.EnableIOTracking {
+ if err := enableIOTracking(jobHandle); err != nil {
+ return nil, err
+ }
+ }
+
+ return job, nil
+}
+
+// Open opens an existing job object with name provided in `options`. If no name is provided
+// return an error since we need to know what job object to open.
+//
+// If options.Notifications is false `PollNotifications` will return immediately with error `errNotRegistered`.
+//
+// Returns a JobObject structure and an error if there is one.
+func Open(ctx context.Context, options *Options) (_ *JobObject, err error) {
+ if options == nil || (options != nil && options.Name == "") {
+ return nil, errors.New("no job object name specified to open")
+ }
+
+ unicodeJobName, err := winapi.NewUnicodeString(options.Name)
+ if err != nil {
+ return nil, err
+ }
+
+ var jobHandle windows.Handle
+ if options != nil && options.UseNTVariant {
+ oa := winapi.ObjectAttributes{
+ Length: unsafe.Sizeof(winapi.ObjectAttributes{}),
+ ObjectName: unicodeJobName,
+ Attributes: 0,
+ }
+ status := winapi.NtOpenJobObject(&jobHandle, winapi.JOB_OBJECT_ALL_ACCESS, &oa)
+ if status != 0 {
+ return nil, winapi.RtlNtStatusToDosError(status)
+ }
+ } else {
+ jobHandle, err = winapi.OpenJobObject(winapi.JOB_OBJECT_ALL_ACCESS, false, unicodeJobName.Buffer)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ defer func() {
+ if err != nil {
+ windows.Close(jobHandle)
+ }
+ }()
+
+ job := &JobObject{
+ handle: jobHandle,
+ }
+
+ // If the IOCP we'll be using to receive messages for all jobs hasn't been
+ // created, create it and start polling.
+ if options != nil && options.Notifications {
+ mq, err := setupNotifications(ctx, job)
+ if err != nil {
+ return nil, err
+ }
+ job.mq = mq
+ }
+
+ return job, nil
+}
+
+// helper function to setup notifications for creating/opening a job object
+func setupNotifications(ctx context.Context, job *JobObject) (*queue.MessageQueue, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ ioInitOnce.Do(func() {
+ h, err := windows.CreateIoCompletionPort(windows.InvalidHandle, 0, 0, 0xffffffff)
+ if err != nil {
+ initIOErr = err
+ return
+ }
+ ioCompletionPort = h
+ go pollIOCP(ctx, h)
+ })
+
+ if initIOErr != nil {
+ return nil, initIOErr
+ }
+
+ mq := queue.NewMessageQueue()
+ jobMap.Store(uintptr(job.handle), mq)
+ if err := attachIOCP(job.handle, ioCompletionPort); err != nil {
+ jobMap.Delete(uintptr(job.handle))
+ return nil, fmt.Errorf("failed to attach job to IO completion port: %w", err)
+ }
+ return mq, nil
+}
+
+// PollNotification will poll for a job object notification. This call should only be called once
+// per job (ideally in a goroutine loop) and will block if there is not a notification ready.
+// This call will return immediately with error `ErrNotRegistered` if the job was not registered
+// to receive notifications during `Create`. Internally, messages will be queued and there
+// is no worry of messages being dropped.
+func (job *JobObject) PollNotification() (interface{}, error) {
+ if job.mq == nil {
+ return nil, ErrNotRegistered
+ }
+ return job.mq.Dequeue()
+}
+
+// UpdateProcThreadAttribute updates the passed in ProcThreadAttributeList to contain what is necessary to
+// launch a process in a job at creation time. This can be used to avoid having to call Assign() after a process
+// has already started running.
+func (job *JobObject) UpdateProcThreadAttribute(attrList *windows.ProcThreadAttributeListContainer) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ if err := attrList.Update(
+ winapi.PROC_THREAD_ATTRIBUTE_JOB_LIST,
+ unsafe.Pointer(&job.handle),
+ unsafe.Sizeof(job.handle),
+ ); err != nil {
+ return fmt.Errorf("failed to update proc thread attributes for job object: %w", err)
+ }
+
+ return nil
+}
+
+// Close closes the job object handle.
+func (job *JobObject) Close() error {
+ job.handleLock.Lock()
+ defer job.handleLock.Unlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ if err := windows.Close(job.handle); err != nil {
+ return err
+ }
+
+ if job.mq != nil {
+ job.mq.Close()
+ }
+ // Handles now invalid so if the map entry to receive notifications for this job still
+ // exists remove it so we can stop receiving notifications.
+ if _, ok := jobMap.Load(uintptr(job.handle)); ok {
+ jobMap.Delete(uintptr(job.handle))
+ }
+
+ job.handle = 0
+ return nil
+}
+
+// Assign assigns a process to the job object.
+func (job *JobObject) Assign(pid uint32) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ if pid == 0 {
+ return errors.New("invalid pid: 0")
+ }
+ hProc, err := windows.OpenProcess(winapi.PROCESS_ALL_ACCESS, true, pid)
+ if err != nil {
+ return err
+ }
+ defer windows.Close(hProc)
+ return windows.AssignProcessToJobObject(job.handle, hProc)
+}
+
+// Terminate terminates the job, essentially calls TerminateProcess on every process in the
+// job.
+func (job *JobObject) Terminate(exitCode uint32) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+ return windows.TerminateJobObject(job.handle, exitCode)
+}
+
+// Pids returns all of the process IDs in the job object.
+func (job *JobObject) Pids() ([]uint32, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST{}
+ err := winapi.QueryInformationJobObject(
+ job.handle,
+ winapi.JobObjectBasicProcessIdList,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ )
+
+ // This is either the case where there is only one process or no processes in
+ // the job. Any other case will result in ERROR_MORE_DATA. Check if info.NumberOfProcessIdsInList
+ // is 1 and just return this, otherwise return an empty slice.
+ if err == nil {
+ if info.NumberOfProcessIdsInList == 1 {
+ return []uint32{uint32(info.ProcessIdList[0])}, nil
+ }
+ // Return empty slice instead of nil to play well with the caller of this.
+ // Do not return an error if no processes are running inside the job
+ return []uint32{}, nil
+ }
+
+ if err != winapi.ERROR_MORE_DATA {
+ return nil, fmt.Errorf("failed initial query for PIDs in job object: %w", err)
+ }
+
+ jobBasicProcessIDListSize := unsafe.Sizeof(info) + (unsafe.Sizeof(info.ProcessIdList[0]) * uintptr(info.NumberOfAssignedProcesses-1))
+ buf := make([]byte, jobBasicProcessIDListSize)
+ if err = winapi.QueryInformationJobObject(
+ job.handle,
+ winapi.JobObjectBasicProcessIdList,
+ unsafe.Pointer(&buf[0]),
+ uint32(len(buf)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("failed to query for PIDs in job object: %w", err)
+ }
+
+ bufInfo := (*winapi.JOBOBJECT_BASIC_PROCESS_ID_LIST)(unsafe.Pointer(&buf[0]))
+ pids := make([]uint32, bufInfo.NumberOfProcessIdsInList)
+ for i, bufPid := range bufInfo.AllPids() {
+ pids[i] = uint32(bufPid)
+ }
+ return pids, nil
+}
+
+// QueryMemoryStats gets the memory stats for the job object.
+func (job *JobObject) QueryMemoryStats() (*winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := winapi.JOBOBJECT_MEMORY_USAGE_INFORMATION{}
+ if err := winapi.QueryInformationJobObject(
+ job.handle,
+ winapi.JobObjectMemoryUsageInformation,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("failed to query for job object memory stats: %w", err)
+ }
+ return &info, nil
+}
+
+// QueryProcessorStats gets the processor stats for the job object.
+func (job *JobObject) QueryProcessorStats() (*winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := winapi.JOBOBJECT_BASIC_ACCOUNTING_INFORMATION{}
+ if err := winapi.QueryInformationJobObject(
+ job.handle,
+ winapi.JobObjectBasicAccountingInformation,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("failed to query for job object process stats: %w", err)
+ }
+ return &info, nil
+}
+
+// QueryStorageStats gets the storage (I/O) stats for the job object. This call will error
+// if either `EnableIOTracking` wasn't set to true on creation of the job, or SetIOTracking()
+// hasn't been called since creation of the job.
+func (job *JobObject) QueryStorageStats() (*winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{
+ ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,
+ }
+ if err := winapi.QueryInformationJobObject(
+ job.handle,
+ winapi.JobObjectIoAttribution,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("failed to query for job object storage stats: %w", err)
+ }
+ return &info, nil
+}
+
+// QueryPrivateWorkingSet returns the private working set size for the job. This is calculated by adding up the
+// private working set for every process running in the job.
+func (job *JobObject) QueryPrivateWorkingSet() (uint64, error) {
+ pids, err := job.Pids()
+ if err != nil {
+ return 0, err
+ }
+
+ openAndQueryWorkingSet := func(pid uint32) (uint64, error) {
+ h, err := windows.OpenProcess(windows.PROCESS_QUERY_LIMITED_INFORMATION, false, pid)
+ if err != nil {
+ // Continue to the next if OpenProcess doesn't return a valid handle (fails). Handles a
+ // case where one of the pids in the job exited before we open.
+ return 0, nil
+ }
+ defer func() {
+ _ = windows.Close(h)
+ }()
+ // Check if the process is actually running in the job still. There's a small chance
+ // that the process could have exited and had its pid re-used between grabbing the pids
+ // in the job and opening the handle to it above.
+ var inJob int32
+ if err := winapi.IsProcessInJob(h, job.handle, &inJob); err != nil {
+ // This shouldn't fail unless we have incorrect access rights which we control
+ // here so probably best to error out if this failed.
+ return 0, err
+ }
+ // Don't report stats for this process as it's not running in the job. This shouldn't be
+ // an error condition though.
+ if inJob == 0 {
+ return 0, nil
+ }
+
+ var vmCounters winapi.VM_COUNTERS_EX2
+ status := winapi.NtQueryInformationProcess(
+ h,
+ winapi.ProcessVmCounters,
+ unsafe.Pointer(&vmCounters),
+ uint32(unsafe.Sizeof(vmCounters)),
+ nil,
+ )
+ if !winapi.NTSuccess(status) {
+ return 0, fmt.Errorf("failed to query information for process: %w", winapi.RtlNtStatusToDosError(status))
+ }
+ return uint64(vmCounters.PrivateWorkingSetSize), nil
+ }
+
+ var jobWorkingSetSize uint64
+ for _, pid := range pids {
+ workingSet, err := openAndQueryWorkingSet(pid)
+ if err != nil {
+ return 0, err
+ }
+ jobWorkingSetSize += workingSet
+ }
+
+ return jobWorkingSetSize, nil
+}
+
+// SetIOTracking enables IO tracking for processes in the job object.
+// This enables use of the QueryStorageStats method.
+func (job *JobObject) SetIOTracking() error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ return enableIOTracking(job.handle)
+}
+
+func enableIOTracking(job windows.Handle) error {
+ info := winapi.JOBOBJECT_IO_ATTRIBUTION_INFORMATION{
+ ControlFlags: winapi.JOBOBJECT_IO_ATTRIBUTION_CONTROL_ENABLE,
+ }
+ if _, err := windows.SetInformationJobObject(
+ job,
+ winapi.JobObjectIoAttribution,
+ uintptr(unsafe.Pointer(&info)),
+ uint32(unsafe.Sizeof(info)),
+ ); err != nil {
+ return fmt.Errorf("failed to enable IO tracking on job object: %w", err)
+ }
+ return nil
+}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go
new file mode 100644
index 0000000000..4efde292c4
--- /dev/null
+++ b/vendor/github.com/Microsoft/hcsshim/internal/jobobject/limits.go
@@ -0,0 +1,315 @@
+package jobobject
+
+import (
+ "errors"
+ "fmt"
+ "unsafe"
+
+ "github.com/Microsoft/hcsshim/internal/winapi"
+ "golang.org/x/sys/windows"
+)
+
+const (
+ memoryLimitMax uint64 = 0xffffffffffffffff
+)
+
+func isFlagSet(flag, controlFlags uint32) bool {
+ return (flag & controlFlags) == flag
+}
+
+// SetResourceLimits sets resource limits on the job object (cpu, memory, storage).
+func (job *JobObject) SetResourceLimits(limits *JobLimits) error {
+ // Go through and check what limits were specified and apply them to the job.
+ if limits.MemoryLimitInBytes != 0 {
+ if err := job.SetMemoryLimit(limits.MemoryLimitInBytes); err != nil {
+ return fmt.Errorf("failed to set job object memory limit: %w", err)
+ }
+ }
+
+ if limits.CPULimit != 0 {
+ if err := job.SetCPULimit(RateBased, limits.CPULimit); err != nil {
+ return fmt.Errorf("failed to set job object cpu limit: %w", err)
+ }
+ } else if limits.CPUWeight != 0 {
+ if err := job.SetCPULimit(WeightBased, limits.CPUWeight); err != nil {
+ return fmt.Errorf("failed to set job object cpu limit: %w", err)
+ }
+ }
+
+ if limits.MaxBandwidth != 0 || limits.MaxIOPS != 0 {
+ if err := job.SetIOLimit(limits.MaxBandwidth, limits.MaxIOPS); err != nil {
+ return fmt.Errorf("failed to set io limit on job object: %w", err)
+ }
+ }
+ return nil
+}
+
+// SetTerminateOnLastHandleClose sets the job object flag that specifies that the job should terminate
+// all processes in the job on the last open handle being closed.
+func (job *JobObject) SetTerminateOnLastHandleClose() error {
+ info, err := job.getExtendedInformation()
+ if err != nil {
+ return err
+ }
+ info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE
+ return job.setExtendedInformation(info)
+}
+
+// SetMemoryLimit sets the memory limit of the job object based on the given `memoryLimitInBytes`.
+func (job *JobObject) SetMemoryLimit(memoryLimitInBytes uint64) error {
+ if memoryLimitInBytes >= memoryLimitMax {
+ return errors.New("memory limit specified exceeds the max size")
+ }
+
+ info, err := job.getExtendedInformation()
+ if err != nil {
+ return err
+ }
+
+ info.JobMemoryLimit = uintptr(memoryLimitInBytes)
+ info.BasicLimitInformation.LimitFlags |= windows.JOB_OBJECT_LIMIT_JOB_MEMORY
+ return job.setExtendedInformation(info)
+}
+
+// GetMemoryLimit gets the memory limit in bytes of the job object.
+func (job *JobObject) GetMemoryLimit() (uint64, error) {
+ info, err := job.getExtendedInformation()
+ if err != nil {
+ return 0, err
+ }
+ return uint64(info.JobMemoryLimit), nil
+}
+
+// SetCPULimit sets the CPU limit depending on the specified `CPURateControlType` to
+// `rateControlValue` for the job object.
+func (job *JobObject) SetCPULimit(rateControlType CPURateControlType, rateControlValue uint32) error {
+ cpuInfo, err := job.getCPURateControlInformation()
+ if err != nil {
+ return err
+ }
+ switch rateControlType {
+ case WeightBased:
+ if rateControlValue < cpuWeightMin || rateControlValue > cpuWeightMax {
+ return fmt.Errorf("processor weight value of `%d` is invalid", rateControlValue)
+ }
+ cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED
+ cpuInfo.Value = rateControlValue
+ case RateBased:
+ if rateControlValue < cpuLimitMin || rateControlValue > cpuLimitMax {
+ return fmt.Errorf("processor rate of `%d` is invalid", rateControlValue)
+ }
+ cpuInfo.ControlFlags |= winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
+ cpuInfo.Value = rateControlValue
+ default:
+ return errors.New("invalid job object cpu rate control type")
+ }
+ return job.setCPURateControlInfo(cpuInfo)
+}
+
+// GetCPULimit gets the cpu limits for the job object.
+// `rateControlType` is used to indicate what type of cpu limit to query for.
+func (job *JobObject) GetCPULimit(rateControlType CPURateControlType) (uint32, error) {
+ info, err := job.getCPURateControlInformation()
+ if err != nil {
+ return 0, err
+ }
+
+ if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE, info.ControlFlags) {
+ return 0, errors.New("the job does not have cpu rate control enabled")
+ }
+
+ switch rateControlType {
+ case WeightBased:
+ if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED, info.ControlFlags) {
+ return 0, errors.New("cannot get cpu weight for job object without cpu weight option set")
+ }
+ case RateBased:
+ if !isFlagSet(winapi.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP, info.ControlFlags) {
+ return 0, errors.New("cannot get cpu rate hard cap for job object without cpu rate hard cap option set")
+ }
+ default:
+ return 0, errors.New("invalid job object cpu rate control type")
+ }
+ return info.Value, nil
+}
+
+// SetCPUAffinity sets the processor affinity for the job object.
+// The affinity is passed in as a bitmask.
+func (job *JobObject) SetCPUAffinity(affinityBitMask uint64) error {
+ info, err := job.getExtendedInformation()
+ if err != nil {
+ return err
+ }
+ info.BasicLimitInformation.LimitFlags |= uint32(windows.JOB_OBJECT_LIMIT_AFFINITY)
+ info.BasicLimitInformation.Affinity = uintptr(affinityBitMask)
+ return job.setExtendedInformation(info)
+}
+
+// GetCPUAffinity gets the processor affinity for the job object.
+// The returned affinity is a bitmask.
+func (job *JobObject) GetCPUAffinity() (uint64, error) {
+ info, err := job.getExtendedInformation()
+ if err != nil {
+ return 0, err
+ }
+ return uint64(info.BasicLimitInformation.Affinity), nil
+}
+
+// SetIOLimit sets the IO limits specified on the job object.
+func (job *JobObject) SetIOLimit(maxBandwidth, maxIOPS int64) error {
+ ioInfo, err := job.getIOLimit()
+ if err != nil {
+ return err
+ }
+ ioInfo.ControlFlags |= winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE
+ if maxBandwidth != 0 {
+ ioInfo.MaxBandwidth = maxBandwidth
+ }
+ if maxIOPS != 0 {
+ ioInfo.MaxIops = maxIOPS
+ }
+ return job.setIORateControlInfo(ioInfo)
+}
+
+// GetIOMaxBandwidthLimit gets the max bandwidth for the job object.
+func (job *JobObject) GetIOMaxBandwidthLimit() (int64, error) {
+ info, err := job.getIOLimit()
+ if err != nil {
+ return 0, err
+ }
+ return info.MaxBandwidth, nil
+}
+
+// GetIOMaxIopsLimit gets the max iops for the job object.
+func (job *JobObject) GetIOMaxIopsLimit() (int64, error) {
+ info, err := job.getIOLimit()
+ if err != nil {
+ return 0, err
+ }
+ return info.MaxIops, nil
+}
+
+// Helper function for getting a job object's extended information.
+func (job *JobObject) getExtendedInformation() (*windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION{}
+ if err := winapi.QueryInformationJobObject(
+ job.handle,
+ windows.JobObjectExtendedLimitInformation,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("query %v returned error: %w", info, err)
+ }
+ return &info, nil
+}
+
+// Helper function for getting a job object's CPU rate control information.
+func (job *JobObject) getCPURateControlInformation() (*winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ info := winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION{}
+ if err := winapi.QueryInformationJobObject(
+ job.handle,
+ windows.JobObjectCpuRateControlInformation,
+ unsafe.Pointer(&info),
+ uint32(unsafe.Sizeof(info)),
+ nil,
+ ); err != nil {
+ return nil, fmt.Errorf("query %v returned error: %w", info, err)
+ }
+ return &info, nil
+}
+
+// Helper function for setting a job object's extended information.
+func (job *JobObject) setExtendedInformation(info *windows.JOBOBJECT_EXTENDED_LIMIT_INFORMATION) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ if _, err := windows.SetInformationJobObject(
+ job.handle,
+ windows.JobObjectExtendedLimitInformation,
+ uintptr(unsafe.Pointer(info)),
+ uint32(unsafe.Sizeof(*info)),
+ ); err != nil {
+ return fmt.Errorf("failed to set Extended info %v on job object: %w", info, err)
+ }
+ return nil
+}
+
+// Helper function for querying job handle for IO limit information.
+func (job *JobObject) getIOLimit() (*winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION, error) {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return nil, ErrAlreadyClosed
+ }
+
+ ioInfo := &winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION{}
+ var blockCount uint32 = 1
+
+ if _, err := winapi.QueryIoRateControlInformationJobObject(
+ job.handle,
+ nil,
+ &ioInfo,
+ &blockCount,
+ ); err != nil {
+ return nil, fmt.Errorf("query %v returned error: %w", ioInfo, err)
+ }
+
+ if !isFlagSet(winapi.JOB_OBJECT_IO_RATE_CONTROL_ENABLE, ioInfo.ControlFlags) {
+ return nil, fmt.Errorf("query %v cannot get IO limits for job object without IO rate control option set", ioInfo)
+ }
+ return ioInfo, nil
+}
+
+// Helper function for setting a job object's IO rate control information.
+func (job *JobObject) setIORateControlInfo(ioInfo *winapi.JOBOBJECT_IO_RATE_CONTROL_INFORMATION) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+
+ if _, err := winapi.SetIoRateControlInformationJobObject(job.handle, ioInfo); err != nil {
+ return fmt.Errorf("failed to set IO limit info %v on job object: %w", ioInfo, err)
+ }
+ return nil
+}
+
+// Helper function for setting a job object's CPU rate control information.
+func (job *JobObject) setCPURateControlInfo(cpuInfo *winapi.JOBOBJECT_CPU_RATE_CONTROL_INFORMATION) error {
+ job.handleLock.RLock()
+ defer job.handleLock.RUnlock()
+
+ if job.handle == 0 {
+ return ErrAlreadyClosed
+ }
+ if _, err := windows.SetInformationJobObject(
+ job.handle,
+ windows.JobObjectCpuRateControlInformation,
+ uintptr(unsafe.Pointer(cpuInfo)),
+ uint32(unsafe.Sizeof(cpuInfo)),
+ ); err != nil {
+ return fmt.Errorf("failed to set cpu limit info %v on job object: %w", cpuInfo, err)
+ }
+ return nil
+}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go b/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go
new file mode 100644
index 0000000000..4eb9bb9f1f
--- /dev/null
+++ b/vendor/github.com/Microsoft/hcsshim/internal/queue/mq.go
@@ -0,0 +1,92 @@
+package queue
+
+import (
+ "errors"
+ "sync"
+)
+
+var ErrQueueClosed = errors.New("the queue is closed for reading and writing")
+
+// MessageQueue represents a threadsafe message queue to be used to retrieve or
+// write messages to.
+type MessageQueue struct {
+ m *sync.RWMutex
+ c *sync.Cond
+ messages []interface{}
+ closed bool
+}
+
+// NewMessageQueue returns a new MessageQueue.
+func NewMessageQueue() *MessageQueue {
+ m := &sync.RWMutex{}
+ return &MessageQueue{
+ m: m,
+ c: sync.NewCond(m),
+ messages: []interface{}{},
+ }
+}
+
+// Enqueue writes `msg` to the queue.
+func (mq *MessageQueue) Enqueue(msg interface{}) error {
+ mq.m.Lock()
+ defer mq.m.Unlock()
+
+ if mq.closed {
+ return ErrQueueClosed
+ }
+ mq.messages = append(mq.messages, msg)
+ // Signal a waiter that there is now a value available in the queue.
+ mq.c.Signal()
+ return nil
+}
+
+// Dequeue will read a value from the queue and remove it. If the queue
+// is empty, this will block until the queue is closed or a value gets enqueued.
+func (mq *MessageQueue) Dequeue() (interface{}, error) {
+ mq.m.Lock()
+ defer mq.m.Unlock()
+
+ for !mq.closed && mq.size() == 0 {
+ mq.c.Wait()
+ }
+
+ // We got woken up, check if it's because the queue got closed.
+ if mq.closed {
+ return nil, ErrQueueClosed
+ }
+
+ val := mq.messages[0]
+ mq.messages[0] = nil
+ mq.messages = mq.messages[1:]
+ return val, nil
+}
+
+// Size returns the size of the queue.
+func (mq *MessageQueue) Size() int {
+ mq.m.RLock()
+ defer mq.m.RUnlock()
+ return mq.size()
+}
+
+// Nonexported size check to check if the queue is empty inside already locked functions.
+func (mq *MessageQueue) size() int {
+ return len(mq.messages)
+}
+
+// Close closes the queue for future writes or reads. Any attempts to read or write from the
+// queue after close will return ErrQueueClosed. This is safe to call multiple times.
+func (mq *MessageQueue) Close() {
+ mq.m.Lock()
+ defer mq.m.Unlock()
+
+ // Already closed, noop
+ if mq.closed {
+ return
+ }
+
+ mq.messages = nil
+ mq.closed = true
+ // If there's anybody currently waiting on a value from Dequeue, we need to
+ // broadcast so the read(s) can return ErrQueueClosed.
+ mq.c.Broadcast()
+}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go
deleted file mode 100644
index 4e609cbf1c..0000000000
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/iocp.go
+++ /dev/null
@@ -1,3 +0,0 @@
-package winapi
-
-//sys GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error)
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go
index ba12b1ad92..7eb13f8f0a 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/jobobject.go
@@ -24,7 +24,10 @@ const (
// Access rights for creating or opening job objects.
//
// https://docs.microsoft.com/en-us/windows/win32/procthread/job-object-security-and-access-rights
-const JOB_OBJECT_ALL_ACCESS = 0x1F001F
+const (
+ JOB_OBJECT_QUERY = 0x0004
+ JOB_OBJECT_ALL_ACCESS = 0x1F001F
+)
// IO limit flags
//
@@ -93,7 +96,7 @@ type JOBOBJECT_BASIC_PROCESS_ID_LIST struct {
// AllPids returns all the process Ids in the job object.
func (p *JOBOBJECT_BASIC_PROCESS_ID_LIST) AllPids() []uintptr {
- return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList]
+ return (*[(1 << 27) - 1]uintptr)(unsafe.Pointer(&p.ProcessIdList[0]))[:p.NumberOfProcessIdsInList:p.NumberOfProcessIdsInList]
}
// https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-jobobject_basic_accounting_information
@@ -162,7 +165,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {
// PBOOL Result
// );
//
-//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) = kernel32.IsProcessInJob
+//sys IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) = kernel32.IsProcessInJob
// BOOL QueryInformationJobObject(
// HANDLE hJob,
@@ -172,7 +175,7 @@ type JOBOBJECT_ASSOCIATE_COMPLETION_PORT struct {
// LPDWORD lpReturnLength
// );
//
-//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject
+//sys QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) = kernel32.QueryInformationJobObject
// HANDLE OpenJobObjectW(
// DWORD dwDesiredAccess,
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
index 37839435b9..222529f433 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/process.go
@@ -6,3 +6,60 @@ const (
PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = 0x20016
PROC_THREAD_ATTRIBUTE_JOB_LIST = 0x2000D
)
+
+// ProcessVmCounters corresponds to the _VM_COUNTERS_EX and _VM_COUNTERS_EX2 structures.
+const ProcessVmCounters = 3
+
+// __kernel_entry NTSTATUS NtQueryInformationProcess(
+// [in] HANDLE ProcessHandle,
+// [in] PROCESSINFOCLASS ProcessInformationClass,
+// [out] PVOID ProcessInformation,
+// [in] ULONG ProcessInformationLength,
+// [out, optional] PULONG ReturnLength
+// );
+//
+//sys NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQueryInformationProcess
+
+// typedef struct _VM_COUNTERS_EX
+// {
+// SIZE_T PeakVirtualSize;
+// SIZE_T VirtualSize;
+// ULONG PageFaultCount;
+// SIZE_T PeakWorkingSetSize;
+// SIZE_T WorkingSetSize;
+// SIZE_T QuotaPeakPagedPoolUsage;
+// SIZE_T QuotaPagedPoolUsage;
+// SIZE_T QuotaPeakNonPagedPoolUsage;
+// SIZE_T QuotaNonPagedPoolUsage;
+// SIZE_T PagefileUsage;
+// SIZE_T PeakPagefileUsage;
+// SIZE_T PrivateUsage;
+// } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
+//
+type VM_COUNTERS_EX struct {
+ PeakVirtualSize uintptr
+ VirtualSize uintptr
+ PageFaultCount uint32
+ PeakWorkingSetSize uintptr
+ WorkingSetSize uintptr
+ QuotaPeakPagedPoolUsage uintptr
+ QuotaPagedPoolUsage uintptr
+ QuotaPeakNonPagedPoolUsage uintptr
+ QuotaNonPagedPoolUsage uintptr
+ PagefileUsage uintptr
+ PeakPagefileUsage uintptr
+ PrivateUsage uintptr
+}
+
+// typedef struct _VM_COUNTERS_EX2
+// {
+// VM_COUNTERS_EX CountersEx;
+// SIZE_T PrivateWorkingSetSize;
+// SIZE_T SharedCommitUsage;
+// } VM_COUNTERS_EX2, *PVM_COUNTERS_EX2;
+//
+type VM_COUNTERS_EX2 struct {
+ CountersEx VM_COUNTERS_EX
+ PrivateWorkingSetSize uintptr
+ SharedCommitUsage uintptr
+}
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go
index 327f57d7c2..78fe01a4b4 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/system.go
@@ -12,7 +12,8 @@ const STATUS_INFO_LENGTH_MISMATCH = 0xC0000004
// ULONG SystemInformationLength,
// PULONG ReturnLength
// );
-//sys NtQuerySystemInformation(systemInfoClass int, systemInformation uintptr, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation
+//
+//sys NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) = ntdll.NtQuerySystemInformation
type SYSTEM_PROCESS_INFORMATION struct {
NextEntryOffset uint32 // ULONG
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
index 1d4ba3c4f8..d2cc9d9fba 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/winapi.go
@@ -2,4 +2,4 @@
// be thought of as an extension to golang.org/x/sys/windows.
package winapi
-//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go console.go system.go net.go path.go thread.go iocp.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go
+//go:generate go run ..\..\mksyscall_windows.go -output zsyscall_windows.go user.go console.go system.go net.go path.go thread.go jobobject.go logon.go memory.go process.go processor.go devices.go filesystem.go errors.go
diff --git a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
index 4eb64b4c0c..1f16cf0b8e 100644
--- a/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
+++ b/vendor/github.com/Microsoft/hcsshim/internal/winapi/zsyscall_windows.go
@@ -50,7 +50,6 @@ var (
procSetJobCompartmentId = modiphlpapi.NewProc("SetJobCompartmentId")
procSearchPathW = modkernel32.NewProc("SearchPathW")
procCreateRemoteThread = modkernel32.NewProc("CreateRemoteThread")
- procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus")
procIsProcessInJob = modkernel32.NewProc("IsProcessInJob")
procQueryInformationJobObject = modkernel32.NewProc("QueryInformationJobObject")
procOpenJobObjectW = modkernel32.NewProc("OpenJobObjectW")
@@ -61,6 +60,7 @@ var (
procLogonUserW = modadvapi32.NewProc("LogonUserW")
procLocalAlloc = modkernel32.NewProc("LocalAlloc")
procLocalFree = modkernel32.NewProc("LocalFree")
+ procNtQueryInformationProcess = modntdll.NewProc("NtQueryInformationProcess")
procGetActiveProcessorCount = modkernel32.NewProc("GetActiveProcessorCount")
procCM_Get_Device_ID_List_SizeA = modcfgmgr32.NewProc("CM_Get_Device_ID_List_SizeA")
procCM_Get_Device_ID_ListA = modcfgmgr32.NewProc("CM_Get_Device_ID_ListA")
@@ -100,7 +100,7 @@ func resizePseudoConsole(hPc windows.Handle, size uint32) (hr error) {
return
}
-func NtQuerySystemInformation(systemInfoClass int, systemInformation uintptr, systemInfoLength uint32, returnLength *uint32) (status uint32) {
+func NtQuerySystemInformation(systemInfoClass int, systemInformation unsafe.Pointer, systemInfoLength uint32, returnLength *uint32) (status uint32) {
r0, _, _ := syscall.Syscall6(procNtQuerySystemInformation.Addr(), 4, uintptr(systemInfoClass), uintptr(systemInformation), uintptr(systemInfoLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
status = uint32(r0)
return
@@ -140,19 +140,7 @@ func CreateRemoteThread(process windows.Handle, sa *windows.SecurityAttributes,
return
}
-func GetQueuedCompletionStatus(cphandle windows.Handle, qty *uint32, key *uintptr, overlapped **windows.Overlapped, timeout uint32) (err error) {
- r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0)
- if r1 == 0 {
- if e1 != 0 {
- err = errnoErr(e1)
- } else {
- err = syscall.EINVAL
- }
- }
- return
-}
-
-func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *bool) (err error) {
+func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result *int32) (err error) {
r1, _, e1 := syscall.Syscall(procIsProcessInJob.Addr(), 3, uintptr(procHandle), uintptr(jobHandle), uintptr(unsafe.Pointer(result)))
if r1 == 0 {
if e1 != 0 {
@@ -164,7 +152,7 @@ func IsProcessInJob(procHandle windows.Handle, jobHandle windows.Handle, result
return
}
-func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo uintptr, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) {
+func QueryInformationJobObject(jobHandle windows.Handle, infoClass uint32, jobObjectInfo unsafe.Pointer, jobObjectInformationLength uint32, lpReturnLength *uint32) (err error) {
r1, _, e1 := syscall.Syscall6(procQueryInformationJobObject.Addr(), 5, uintptr(jobHandle), uintptr(infoClass), uintptr(jobObjectInfo), uintptr(jobObjectInformationLength), uintptr(unsafe.Pointer(lpReturnLength)), 0)
if r1 == 0 {
if e1 != 0 {
@@ -256,6 +244,12 @@ func LocalFree(ptr uintptr) {
return
}
+func NtQueryInformationProcess(processHandle windows.Handle, processInfoClass uint32, processInfo unsafe.Pointer, processInfoLength uint32, returnLength *uint32) (status uint32) {
+ r0, _, _ := syscall.Syscall6(procNtQueryInformationProcess.Addr(), 5, uintptr(processHandle), uintptr(processInfoClass), uintptr(processInfo), uintptr(processInfoLength), uintptr(unsafe.Pointer(returnLength)), 0)
+ status = uint32(r0)
+ return
+}
+
func GetActiveProcessorCount(groupNumber uint16) (amount uint32) {
r0, _, _ := syscall.Syscall(procGetActiveProcessorCount.Addr(), 1, uintptr(groupNumber), 0, 0)
amount = uint32(r0)
diff --git a/vendor/github.com/PuerkitoBio/purell/.gitignore b/vendor/github.com/PuerkitoBio/purell/.gitignore
deleted file mode 100644
index 748e4c8073..0000000000
--- a/vendor/github.com/PuerkitoBio/purell/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.sublime-*
-.DS_Store
-*.swp
-*.swo
-tags
diff --git a/vendor/github.com/PuerkitoBio/purell/.travis.yml b/vendor/github.com/PuerkitoBio/purell/.travis.yml
deleted file mode 100644
index cf31e6af6d..0000000000
--- a/vendor/github.com/PuerkitoBio/purell/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: go
-
-go:
- - 1.4.x
- - 1.5.x
- - 1.6.x
- - 1.7.x
- - 1.8.x
- - 1.9.x
- - "1.10.x"
- - "1.11.x"
- - tip
diff --git a/vendor/github.com/PuerkitoBio/purell/LICENSE b/vendor/github.com/PuerkitoBio/purell/LICENSE
deleted file mode 100644
index 4b9986dea7..0000000000
--- a/vendor/github.com/PuerkitoBio/purell/LICENSE
+++ /dev/null
@@ -1,12 +0,0 @@
-Copyright (c) 2012, Martin Angers
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-* Neither the name of the author nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/PuerkitoBio/purell/README.md b/vendor/github.com/PuerkitoBio/purell/README.md
deleted file mode 100644
index 07de0c4986..0000000000
--- a/vendor/github.com/PuerkitoBio/purell/README.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# Purell
-
-Purell is a tiny Go library to normalize URLs. It returns a pure URL. Pure-ell. Sanitizer and all. Yeah, I know...
-
-Based on the [wikipedia paper][wiki] and the [RFC 3986 document][rfc].
-
-[](http://travis-ci.org/PuerkitoBio/purell)
-
-## Install
-
-`go get github.com/PuerkitoBio/purell`
-
-## Changelog
-
-* **v1.1.1** : Fix failing test due to Go1.12 changes (thanks to @ianlancetaylor).
-* **2016-11-14 (v1.1.0)** : IDN: Conform to RFC 5895: Fold character width (thanks to @beeker1121).
-* **2016-07-27 (v1.0.0)** : Normalize IDN to ASCII (thanks to @zenovich).
-* **2015-02-08** : Add fix for relative paths issue ([PR #5][pr5]) and add fix for unnecessary encoding of reserved characters ([see issue #7][iss7]).
-* **v0.2.0** : Add benchmarks, Attempt IDN support.
-* **v0.1.0** : Initial release.
-
-## Examples
-
-From `example_test.go` (note that in your code, you would import "github.com/PuerkitoBio/purell", and would prefix references to its methods and constants with "purell."):
-
-```go
-package purell
-
-import (
- "fmt"
- "net/url"
-)
-
-func ExampleNormalizeURLString() {
- if normalized, err := NormalizeURLString("hTTp://someWEBsite.com:80/Amazing%3f/url/",
- FlagLowercaseScheme|FlagLowercaseHost|FlagUppercaseEscapes); err != nil {
- panic(err)
- } else {
- fmt.Print(normalized)
- }
- // Output: http://somewebsite.com:80/Amazing%3F/url/
-}
-
-func ExampleMustNormalizeURLString() {
- normalized := MustNormalizeURLString("hTTpS://someWEBsite.com:443/Amazing%fa/url/",
- FlagsUnsafeGreedy)
- fmt.Print(normalized)
-
- // Output: http://somewebsite.com/Amazing%FA/url
-}
-
-func ExampleNormalizeURL() {
- if u, err := url.Parse("Http://SomeUrl.com:8080/a/b/.././c///g?c=3&a=1&b=9&c=0#target"); err != nil {
- panic(err)
- } else {
- normalized := NormalizeURL(u, FlagsUsuallySafeGreedy|FlagRemoveDuplicateSlashes|FlagRemoveFragment)
- fmt.Print(normalized)
- }
-
- // Output: http://someurl.com:8080/a/c/g?c=3&a=1&b=9&c=0
-}
-```
-
-## API
-
-As seen in the examples above, purell offers three methods, `NormalizeURLString(string, NormalizationFlags) (string, error)`, `MustNormalizeURLString(string, NormalizationFlags) (string)` and `NormalizeURL(*url.URL, NormalizationFlags) (string)`. They all normalize the provided URL based on the specified flags. Here are the available flags:
-
-```go
-const (
- // Safe normalizations
- FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
- FlagLowercaseHost // http://HOST -> http://host
- FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
- FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
- FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
- FlagRemoveDefaultPort // http://host:80 -> http://host
- FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
-
- // Usually safe normalizations
- FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
- FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
- FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
-
- // Unsafe normalizations
- FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
- FlagRemoveFragment // http://host/path#fragment -> http://host/path
- FlagForceHTTP // https://host -> http://host
- FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
- FlagRemoveWWW // http://www.host/ -> http://host/
- FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
- FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
-
- // Normalizations not in the wikipedia article, required to cover tests cases
- // submitted by jehiah
- FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
- FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
- FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
- FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
- FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
-
- // Convenience set of safe normalizations
- FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
-
- // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
- // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
-
- // Convenience set of usually safe normalizations (includes FlagsSafe)
- FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
- FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
-
- // Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
- FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
- FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
-
- // Convenience set of all available flags
- FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
- FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
-)
-```
-
-For convenience, the set of flags `FlagsSafe`, `FlagsUsuallySafe[Greedy|NonGreedy]`, `FlagsUnsafe[Greedy|NonGreedy]` and `FlagsAll[Greedy|NonGreedy]` are provided for the similarly grouped normalizations on [wikipedia's URL normalization page][wiki]. You can add (using the bitwise OR `|` operator) or remove (using the bitwise AND NOT `&^` operator) individual flags from the sets if required, to build your own custom set.
-
-The [full godoc reference is available on gopkgdoc][godoc].
-
-Some things to note:
-
-* `FlagDecodeUnnecessaryEscapes`, `FlagEncodeNecessaryEscapes`, `FlagUppercaseEscapes` and `FlagRemoveEmptyQuerySeparator` are always implicitly set, because internally, the URL string is parsed as an URL object, which automatically decodes unnecessary escapes, uppercases and encodes necessary ones, and removes empty query separators (an unnecessary `?` at the end of the url). So this operation cannot **not** be done. For this reason, `FlagRemoveEmptyQuerySeparator` (as well as the other three) has been included in the `FlagsSafe` convenience set, instead of `FlagsUnsafe`, where Wikipedia puts it.
-
-* The `FlagDecodeUnnecessaryEscapes` decodes the following escapes (*from -> to*):
- - %24 -> $
- - %26 -> &
- - %2B-%3B -> +,-./0123456789:;
- - %3D -> =
- - %40-%5A -> @ABCDEFGHIJKLMNOPQRSTUVWXYZ
- - %5F -> _
- - %61-%7A -> abcdefghijklmnopqrstuvwxyz
- - %7E -> ~
-
-
-* When the `NormalizeURL` function is used (passing an URL object), this source URL object is modified (that is, after the call, the URL object will be modified to reflect the normalization).
-
-* The *replace IP with domain name* normalization (`http://208.77.188.166/ → http://www.example.com/`) is obviously not possible for a library without making some network requests. This is not implemented in purell.
-
-* The *remove unused query string parameters* and *remove default query parameters* are also not implemented, since this is a very case-specific normalization, and it is quite trivial to do with an URL object.
-
-### Safe vs Usually Safe vs Unsafe
-
-Purell allows you to control the level of risk you take while normalizing an URL. You can aggressively normalize, play it totally safe, or anything in between.
-
-Consider the following URL:
-
-`HTTPS://www.RooT.com/toto/t%45%1f///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
-
-Normalizing with the `FlagsSafe` gives:
-
-`https://www.root.com/toto/tE%1F///a/./b/../c/?z=3&w=2&a=4&w=1#invalid`
-
-With the `FlagsUsuallySafeGreedy`:
-
-`https://www.root.com/toto/tE%1F///a/c?z=3&w=2&a=4&w=1#invalid`
-
-And with `FlagsUnsafeGreedy`:
-
-`http://root.com/toto/tE%1F/a/c?a=4&w=1&w=2&z=3`
-
-## TODOs
-
-* Add a class/default instance to allow specifying custom directory index names? At the moment, removing directory index removes `(^|/)((?:default|index)\.\w{1,4})$`.
-
-## Thanks / Contributions
-
-@rogpeppe
-@jehiah
-@opennota
-@pchristopher1275
-@zenovich
-@beeker1121
-
-## License
-
-The [BSD 3-Clause license][bsd].
-
-[bsd]: http://opensource.org/licenses/BSD-3-Clause
-[wiki]: http://en.wikipedia.org/wiki/URL_normalization
-[rfc]: http://tools.ietf.org/html/rfc3986#section-6
-[godoc]: http://go.pkgdoc.org/github.com/PuerkitoBio/purell
-[pr5]: https://github.com/PuerkitoBio/purell/pull/5
-[iss7]: https://github.com/PuerkitoBio/purell/issues/7
diff --git a/vendor/github.com/PuerkitoBio/purell/purell.go b/vendor/github.com/PuerkitoBio/purell/purell.go
deleted file mode 100644
index 6d0fc190a1..0000000000
--- a/vendor/github.com/PuerkitoBio/purell/purell.go
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
-Package purell offers URL normalization as described on the wikipedia page:
-http://en.wikipedia.org/wiki/URL_normalization
-*/
-package purell
-
-import (
- "bytes"
- "fmt"
- "net/url"
- "regexp"
- "sort"
- "strconv"
- "strings"
-
- "github.com/PuerkitoBio/urlesc"
- "golang.org/x/net/idna"
- "golang.org/x/text/unicode/norm"
- "golang.org/x/text/width"
-)
-
-// A set of normalization flags determines how a URL will
-// be normalized.
-type NormalizationFlags uint
-
-const (
- // Safe normalizations
- FlagLowercaseScheme NormalizationFlags = 1 << iota // HTTP://host -> http://host, applied by default in Go1.1
- FlagLowercaseHost // http://HOST -> http://host
- FlagUppercaseEscapes // http://host/t%ef -> http://host/t%EF
- FlagDecodeUnnecessaryEscapes // http://host/t%41 -> http://host/tA
- FlagEncodeNecessaryEscapes // http://host/!"#$ -> http://host/%21%22#$
- FlagRemoveDefaultPort // http://host:80 -> http://host
- FlagRemoveEmptyQuerySeparator // http://host/path? -> http://host/path
-
- // Usually safe normalizations
- FlagRemoveTrailingSlash // http://host/path/ -> http://host/path
- FlagAddTrailingSlash // http://host/path -> http://host/path/ (should choose only one of these add/remove trailing slash flags)
- FlagRemoveDotSegments // http://host/path/./a/b/../c -> http://host/path/a/c
-
- // Unsafe normalizations
- FlagRemoveDirectoryIndex // http://host/path/index.html -> http://host/path/
- FlagRemoveFragment // http://host/path#fragment -> http://host/path
- FlagForceHTTP // https://host -> http://host
- FlagRemoveDuplicateSlashes // http://host/path//a///b -> http://host/path/a/b
- FlagRemoveWWW // http://www.host/ -> http://host/
- FlagAddWWW // http://host/ -> http://www.host/ (should choose only one of these add/remove WWW flags)
- FlagSortQuery // http://host/path?c=3&b=2&a=1&b=1 -> http://host/path?a=1&b=1&b=2&c=3
-
- // Normalizations not in the wikipedia article, required to cover tests cases
- // submitted by jehiah
- FlagDecodeDWORDHost // http://1113982867 -> http://66.102.7.147
- FlagDecodeOctalHost // http://0102.0146.07.0223 -> http://66.102.7.147
- FlagDecodeHexHost // http://0x42660793 -> http://66.102.7.147
- FlagRemoveUnnecessaryHostDots // http://.host../path -> http://host/path
- FlagRemoveEmptyPortSeparator // http://host:/path -> http://host/path
-
- // Convenience set of safe normalizations
- FlagsSafe NormalizationFlags = FlagLowercaseHost | FlagLowercaseScheme | FlagUppercaseEscapes | FlagDecodeUnnecessaryEscapes | FlagEncodeNecessaryEscapes | FlagRemoveDefaultPort | FlagRemoveEmptyQuerySeparator
-
- // For convenience sets, "greedy" uses the "remove trailing slash" and "remove www. prefix" flags,
- // while "non-greedy" uses the "add (or keep) the trailing slash" and "add www. prefix".
-
- // Convenience set of usually safe normalizations (includes FlagsSafe)
- FlagsUsuallySafeGreedy NormalizationFlags = FlagsSafe | FlagRemoveTrailingSlash | FlagRemoveDotSegments
- FlagsUsuallySafeNonGreedy NormalizationFlags = FlagsSafe | FlagAddTrailingSlash | FlagRemoveDotSegments
-
- // Convenience set of unsafe normalizations (includes FlagsUsuallySafe)
- FlagsUnsafeGreedy NormalizationFlags = FlagsUsuallySafeGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagRemoveWWW | FlagSortQuery
- FlagsUnsafeNonGreedy NormalizationFlags = FlagsUsuallySafeNonGreedy | FlagRemoveDirectoryIndex | FlagRemoveFragment | FlagForceHTTP | FlagRemoveDuplicateSlashes | FlagAddWWW | FlagSortQuery
-
- // Convenience set of all available flags
- FlagsAllGreedy = FlagsUnsafeGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
- FlagsAllNonGreedy = FlagsUnsafeNonGreedy | FlagDecodeDWORDHost | FlagDecodeOctalHost | FlagDecodeHexHost | FlagRemoveUnnecessaryHostDots | FlagRemoveEmptyPortSeparator
-)
-
-const (
- defaultHttpPort = ":80"
- defaultHttpsPort = ":443"
-)
-
-// Regular expressions used by the normalizations
-var rxPort = regexp.MustCompile(`(:\d+)/?$`)
-var rxDirIndex = regexp.MustCompile(`(^|/)((?:default|index)\.\w{1,4})$`)
-var rxDupSlashes = regexp.MustCompile(`/{2,}`)
-var rxDWORDHost = regexp.MustCompile(`^(\d+)((?:\.+)?(?:\:\d*)?)$`)
-var rxOctalHost = regexp.MustCompile(`^(0\d*)\.(0\d*)\.(0\d*)\.(0\d*)((?:\.+)?(?:\:\d*)?)$`)
-var rxHexHost = regexp.MustCompile(`^0x([0-9A-Fa-f]+)((?:\.+)?(?:\:\d*)?)$`)
-var rxHostDots = regexp.MustCompile(`^(.+?)(:\d+)?$`)
-var rxEmptyPort = regexp.MustCompile(`:+$`)
-
-// Map of flags to implementation function.
-// FlagDecodeUnnecessaryEscapes has no action, since it is done automatically
-// by parsing the string as an URL. Same for FlagUppercaseEscapes and FlagRemoveEmptyQuerySeparator.
-
-// Since maps have undefined traversing order, make a slice of ordered keys
-var flagsOrder = []NormalizationFlags{
- FlagLowercaseScheme,
- FlagLowercaseHost,
- FlagRemoveDefaultPort,
- FlagRemoveDirectoryIndex,
- FlagRemoveDotSegments,
- FlagRemoveFragment,
- FlagForceHTTP, // Must be after remove default port (because https=443/http=80)
- FlagRemoveDuplicateSlashes,
- FlagRemoveWWW,
- FlagAddWWW,
- FlagSortQuery,
- FlagDecodeDWORDHost,
- FlagDecodeOctalHost,
- FlagDecodeHexHost,
- FlagRemoveUnnecessaryHostDots,
- FlagRemoveEmptyPortSeparator,
- FlagRemoveTrailingSlash, // These two (add/remove trailing slash) must be last
- FlagAddTrailingSlash,
-}
-
-// ... and then the map, where order is unimportant
-var flags = map[NormalizationFlags]func(*url.URL){
- FlagLowercaseScheme: lowercaseScheme,
- FlagLowercaseHost: lowercaseHost,
- FlagRemoveDefaultPort: removeDefaultPort,
- FlagRemoveDirectoryIndex: removeDirectoryIndex,
- FlagRemoveDotSegments: removeDotSegments,
- FlagRemoveFragment: removeFragment,
- FlagForceHTTP: forceHTTP,
- FlagRemoveDuplicateSlashes: removeDuplicateSlashes,
- FlagRemoveWWW: removeWWW,
- FlagAddWWW: addWWW,
- FlagSortQuery: sortQuery,
- FlagDecodeDWORDHost: decodeDWORDHost,
- FlagDecodeOctalHost: decodeOctalHost,
- FlagDecodeHexHost: decodeHexHost,
- FlagRemoveUnnecessaryHostDots: removeUnncessaryHostDots,
- FlagRemoveEmptyPortSeparator: removeEmptyPortSeparator,
- FlagRemoveTrailingSlash: removeTrailingSlash,
- FlagAddTrailingSlash: addTrailingSlash,
-}
-
-// MustNormalizeURLString returns the normalized string, and panics if an error occurs.
-// It takes an URL string as input, as well as the normalization flags.
-func MustNormalizeURLString(u string, f NormalizationFlags) string {
- result, e := NormalizeURLString(u, f)
- if e != nil {
- panic(e)
- }
- return result
-}
-
-// NormalizeURLString returns the normalized string, or an error if it can't be parsed into an URL object.
-// It takes an URL string as input, as well as the normalization flags.
-func NormalizeURLString(u string, f NormalizationFlags) (string, error) {
- parsed, err := url.Parse(u)
- if err != nil {
- return "", err
- }
-
- if f&FlagLowercaseHost == FlagLowercaseHost {
- parsed.Host = strings.ToLower(parsed.Host)
- }
-
- // The idna package doesn't fully conform to RFC 5895
- // (https://tools.ietf.org/html/rfc5895), so we do it here.
- // Taken from Go 1.8 cycle source, courtesy of bradfitz.
- // TODO: Remove when (if?) idna package conforms to RFC 5895.
- parsed.Host = width.Fold.String(parsed.Host)
- parsed.Host = norm.NFC.String(parsed.Host)
- if parsed.Host, err = idna.ToASCII(parsed.Host); err != nil {
- return "", err
- }
-
- return NormalizeURL(parsed, f), nil
-}
-
-// NormalizeURL returns the normalized string.
-// It takes a parsed URL object as input, as well as the normalization flags.
-func NormalizeURL(u *url.URL, f NormalizationFlags) string {
- for _, k := range flagsOrder {
- if f&k == k {
- flags[k](u)
- }
- }
- return urlesc.Escape(u)
-}
-
-func lowercaseScheme(u *url.URL) {
- if len(u.Scheme) > 0 {
- u.Scheme = strings.ToLower(u.Scheme)
- }
-}
-
-func lowercaseHost(u *url.URL) {
- if len(u.Host) > 0 {
- u.Host = strings.ToLower(u.Host)
- }
-}
-
-func removeDefaultPort(u *url.URL) {
- if len(u.Host) > 0 {
- scheme := strings.ToLower(u.Scheme)
- u.Host = rxPort.ReplaceAllStringFunc(u.Host, func(val string) string {
- if (scheme == "http" && val == defaultHttpPort) || (scheme == "https" && val == defaultHttpsPort) {
- return ""
- }
- return val
- })
- }
-}
-
-func removeTrailingSlash(u *url.URL) {
- if l := len(u.Path); l > 0 {
- if strings.HasSuffix(u.Path, "/") {
- u.Path = u.Path[:l-1]
- }
- } else if l = len(u.Host); l > 0 {
- if strings.HasSuffix(u.Host, "/") {
- u.Host = u.Host[:l-1]
- }
- }
-}
-
-func addTrailingSlash(u *url.URL) {
- if l := len(u.Path); l > 0 {
- if !strings.HasSuffix(u.Path, "/") {
- u.Path += "/"
- }
- } else if l = len(u.Host); l > 0 {
- if !strings.HasSuffix(u.Host, "/") {
- u.Host += "/"
- }
- }
-}
-
-func removeDotSegments(u *url.URL) {
- if len(u.Path) > 0 {
- var dotFree []string
- var lastIsDot bool
-
- sections := strings.Split(u.Path, "/")
- for _, s := range sections {
- if s == ".." {
- if len(dotFree) > 0 {
- dotFree = dotFree[:len(dotFree)-1]
- }
- } else if s != "." {
- dotFree = append(dotFree, s)
- }
- lastIsDot = (s == "." || s == "..")
- }
- // Special case if host does not end with / and new path does not begin with /
- u.Path = strings.Join(dotFree, "/")
- if u.Host != "" && !strings.HasSuffix(u.Host, "/") && !strings.HasPrefix(u.Path, "/") {
- u.Path = "/" + u.Path
- }
- // Special case if the last segment was a dot, make sure the path ends with a slash
- if lastIsDot && !strings.HasSuffix(u.Path, "/") {
- u.Path += "/"
- }
- }
-}
-
-func removeDirectoryIndex(u *url.URL) {
- if len(u.Path) > 0 {
- u.Path = rxDirIndex.ReplaceAllString(u.Path, "$1")
- }
-}
-
-func removeFragment(u *url.URL) {
- u.Fragment = ""
-}
-
-func forceHTTP(u *url.URL) {
- if strings.ToLower(u.Scheme) == "https" {
- u.Scheme = "http"
- }
-}
-
-func removeDuplicateSlashes(u *url.URL) {
- if len(u.Path) > 0 {
- u.Path = rxDupSlashes.ReplaceAllString(u.Path, "/")
- }
-}
-
-func removeWWW(u *url.URL) {
- if len(u.Host) > 0 && strings.HasPrefix(strings.ToLower(u.Host), "www.") {
- u.Host = u.Host[4:]
- }
-}
-
-func addWWW(u *url.URL) {
- if len(u.Host) > 0 && !strings.HasPrefix(strings.ToLower(u.Host), "www.") {
- u.Host = "www." + u.Host
- }
-}
-
-func sortQuery(u *url.URL) {
- q := u.Query()
-
- if len(q) > 0 {
- arKeys := make([]string, len(q))
- i := 0
- for k := range q {
- arKeys[i] = k
- i++
- }
- sort.Strings(arKeys)
- buf := new(bytes.Buffer)
- for _, k := range arKeys {
- sort.Strings(q[k])
- for _, v := range q[k] {
- if buf.Len() > 0 {
- buf.WriteRune('&')
- }
- buf.WriteString(fmt.Sprintf("%s=%s", k, urlesc.QueryEscape(v)))
- }
- }
-
- // Rebuild the raw query string
- u.RawQuery = buf.String()
- }
-}
-
-func decodeDWORDHost(u *url.URL) {
- if len(u.Host) > 0 {
- if matches := rxDWORDHost.FindStringSubmatch(u.Host); len(matches) > 2 {
- var parts [4]int64
-
- dword, _ := strconv.ParseInt(matches[1], 10, 0)
- for i, shift := range []uint{24, 16, 8, 0} {
- parts[i] = dword >> shift & 0xFF
- }
- u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[2])
- }
- }
-}
-
-func decodeOctalHost(u *url.URL) {
- if len(u.Host) > 0 {
- if matches := rxOctalHost.FindStringSubmatch(u.Host); len(matches) > 5 {
- var parts [4]int64
-
- for i := 1; i <= 4; i++ {
- parts[i-1], _ = strconv.ParseInt(matches[i], 8, 0)
- }
- u.Host = fmt.Sprintf("%d.%d.%d.%d%s", parts[0], parts[1], parts[2], parts[3], matches[5])
- }
- }
-}
-
-func decodeHexHost(u *url.URL) {
- if len(u.Host) > 0 {
- if matches := rxHexHost.FindStringSubmatch(u.Host); len(matches) > 2 {
- // Conversion is safe because of regex validation
- parsed, _ := strconv.ParseInt(matches[1], 16, 0)
- // Set host as DWORD (base 10) encoded host
- u.Host = fmt.Sprintf("%d%s", parsed, matches[2])
- // The rest is the same as decoding a DWORD host
- decodeDWORDHost(u)
- }
- }
-}
-
-func removeUnncessaryHostDots(u *url.URL) {
- if len(u.Host) > 0 {
- if matches := rxHostDots.FindStringSubmatch(u.Host); len(matches) > 1 {
- // Trim the leading and trailing dots
- u.Host = strings.Trim(matches[1], ".")
- if len(matches) > 2 {
- u.Host += matches[2]
- }
- }
- }
-}
-
-func removeEmptyPortSeparator(u *url.URL) {
- if len(u.Host) > 0 {
- u.Host = rxEmptyPort.ReplaceAllString(u.Host, "")
- }
-}
diff --git a/vendor/github.com/PuerkitoBio/urlesc/.travis.yml b/vendor/github.com/PuerkitoBio/urlesc/.travis.yml
deleted file mode 100644
index ba6b225f91..0000000000
--- a/vendor/github.com/PuerkitoBio/urlesc/.travis.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-language: go
-
-go:
- - 1.4.x
- - 1.5.x
- - 1.6.x
- - 1.7.x
- - 1.8.x
- - tip
-
-install:
- - go build .
-
-script:
- - go test -v
diff --git a/vendor/github.com/PuerkitoBio/urlesc/LICENSE b/vendor/github.com/PuerkitoBio/urlesc/LICENSE
deleted file mode 100644
index 7448756763..0000000000
--- a/vendor/github.com/PuerkitoBio/urlesc/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2012 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
- * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
- * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/github.com/PuerkitoBio/urlesc/README.md b/vendor/github.com/PuerkitoBio/urlesc/README.md
deleted file mode 100644
index 57aff0a539..0000000000
--- a/vendor/github.com/PuerkitoBio/urlesc/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-urlesc [](https://travis-ci.org/PuerkitoBio/urlesc) [](http://godoc.org/github.com/PuerkitoBio/urlesc)
-======
-
-Package urlesc implements query escaping as per RFC 3986.
-
-It contains some parts of the net/url package, modified so as to allow
-some reserved characters incorrectly escaped by net/url (see [issue 5684](https://github.com/golang/go/issues/5684)).
-
-## Install
-
- go get github.com/PuerkitoBio/urlesc
-
-## License
-
-Go license (BSD-3-Clause)
-
diff --git a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go b/vendor/github.com/PuerkitoBio/urlesc/urlesc.go
deleted file mode 100644
index 1b84624594..0000000000
--- a/vendor/github.com/PuerkitoBio/urlesc/urlesc.go
+++ /dev/null
@@ -1,180 +0,0 @@
-// Copyright 2009 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package urlesc implements query escaping as per RFC 3986.
-// It contains some parts of the net/url package, modified so as to allow
-// some reserved characters incorrectly escaped by net/url.
-// See https://github.com/golang/go/issues/5684
-package urlesc
-
-import (
- "bytes"
- "net/url"
- "strings"
-)
-
-type encoding int
-
-const (
- encodePath encoding = 1 + iota
- encodeUserPassword
- encodeQueryComponent
- encodeFragment
-)
-
-// Return true if the specified character should be escaped when
-// appearing in a URL string, according to RFC 3986.
-func shouldEscape(c byte, mode encoding) bool {
- // §2.3 Unreserved characters (alphanum)
- if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' {
- return false
- }
-
- switch c {
- case '-', '.', '_', '~': // §2.3 Unreserved characters (mark)
- return false
-
- // §2.2 Reserved characters (reserved)
- case ':', '/', '?', '#', '[', ']', '@', // gen-delims
- '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=': // sub-delims
- // Different sections of the URL allow a few of
- // the reserved characters to appear unescaped.
- switch mode {
- case encodePath: // §3.3
- // The RFC allows sub-delims and : @.
- // '/', '[' and ']' can be used to assign meaning to individual path
- // segments. This package only manipulates the path as a whole,
- // so we allow those as well. That leaves only ? and # to escape.
- return c == '?' || c == '#'
-
- case encodeUserPassword: // §3.2.1
- // The RFC allows : and sub-delims in
- // userinfo. The parsing of userinfo treats ':' as special so we must escape
- // all the gen-delims.
- return c == ':' || c == '/' || c == '?' || c == '#' || c == '[' || c == ']' || c == '@'
-
- case encodeQueryComponent: // §3.4
- // The RFC allows / and ?.
- return c != '/' && c != '?'
-
- case encodeFragment: // §4.1
- // The RFC text is silent but the grammar allows
- // everything, so escape nothing but #
- return c == '#'
- }
- }
-
- // Everything else must be escaped.
- return true
-}
-
-// QueryEscape escapes the string so it can be safely placed
-// inside a URL query.
-func QueryEscape(s string) string {
- return escape(s, encodeQueryComponent)
-}
-
-func escape(s string, mode encoding) string {
- spaceCount, hexCount := 0, 0
- for i := 0; i < len(s); i++ {
- c := s[i]
- if shouldEscape(c, mode) {
- if c == ' ' && mode == encodeQueryComponent {
- spaceCount++
- } else {
- hexCount++
- }
- }
- }
-
- if spaceCount == 0 && hexCount == 0 {
- return s
- }
-
- t := make([]byte, len(s)+2*hexCount)
- j := 0
- for i := 0; i < len(s); i++ {
- switch c := s[i]; {
- case c == ' ' && mode == encodeQueryComponent:
- t[j] = '+'
- j++
- case shouldEscape(c, mode):
- t[j] = '%'
- t[j+1] = "0123456789ABCDEF"[c>>4]
- t[j+2] = "0123456789ABCDEF"[c&15]
- j += 3
- default:
- t[j] = s[i]
- j++
- }
- }
- return string(t)
-}
-
-var uiReplacer = strings.NewReplacer(
- "%21", "!",
- "%27", "'",
- "%28", "(",
- "%29", ")",
- "%2A", "*",
-)
-
-// unescapeUserinfo unescapes some characters that need not to be escaped as per RFC3986.
-func unescapeUserinfo(s string) string {
- return uiReplacer.Replace(s)
-}
-
-// Escape reassembles the URL into a valid URL string.
-// The general form of the result is one of:
-//
-// scheme:opaque
-// scheme://userinfo@host/path?query#fragment
-//
-// If u.Opaque is non-empty, String uses the first form;
-// otherwise it uses the second form.
-//
-// In the second form, the following rules apply:
-// - if u.Scheme is empty, scheme: is omitted.
-// - if u.User is nil, userinfo@ is omitted.
-// - if u.Host is empty, host/ is omitted.
-// - if u.Scheme and u.Host are empty and u.User is nil,
-// the entire scheme://userinfo@host/ is omitted.
-// - if u.Host is non-empty and u.Path begins with a /,
-// the form host/path does not add its own /.
-// - if u.RawQuery is empty, ?query is omitted.
-// - if u.Fragment is empty, #fragment is omitted.
-func Escape(u *url.URL) string {
- var buf bytes.Buffer
- if u.Scheme != "" {
- buf.WriteString(u.Scheme)
- buf.WriteByte(':')
- }
- if u.Opaque != "" {
- buf.WriteString(u.Opaque)
- } else {
- if u.Scheme != "" || u.Host != "" || u.User != nil {
- buf.WriteString("//")
- if ui := u.User; ui != nil {
- buf.WriteString(unescapeUserinfo(ui.String()))
- buf.WriteByte('@')
- }
- if h := u.Host; h != "" {
- buf.WriteString(h)
- }
- }
- if u.Path != "" && u.Path[0] != '/' && u.Host != "" {
- buf.WriteByte('/')
- }
- buf.WriteString(escape(u.Path, encodePath))
- }
- if u.RawQuery != "" {
- buf.WriteByte('?')
- buf.WriteString(u.RawQuery)
- }
- if u.Fragment != "" {
- buf.WriteByte('#')
- buf.WriteString(escape(u.Fragment, encodeFragment))
- }
- return buf.String()
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go
deleted file mode 100644
index a4e2079e65..0000000000
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
-// Use of this file is governed by the BSD 3-clause license that
-// can be found in the LICENSE.txt file in the project root.
-
-package antlr
-
-import "sync"
-
-var ATNInvalidAltNumber int
-
-type ATN struct {
- // DecisionToState is the decision points for all rules, subrules, optional
- // blocks, ()+, ()*, etc. Used to build DFA predictors for them.
- DecisionToState []DecisionState
-
- // grammarType is the ATN type and is used for deserializing ATNs from strings.
- grammarType int
-
- // lexerActions is referenced by action transitions in the ATN for lexer ATNs.
- lexerActions []LexerAction
-
- // maxTokenType is the maximum value for any symbol recognized by a transition in the ATN.
- maxTokenType int
-
- modeNameToStartState map[string]*TokensStartState
-
- modeToStartState []*TokensStartState
-
- // ruleToStartState maps from rule index to starting state number.
- ruleToStartState []*RuleStartState
-
- // ruleToStopState maps from rule index to stop state number.
- ruleToStopState []*RuleStopState
-
- // ruleToTokenType maps the rule index to the resulting token type for lexer
- // ATNs. For parser ATNs, it maps the rule index to the generated bypass token
- // type if ATNDeserializationOptions.isGenerateRuleBypassTransitions was
- // specified, and otherwise is nil.
- ruleToTokenType []int
-
- states []ATNState
-
- mu sync.Mutex
- stateMu sync.RWMutex
- edgeMu sync.RWMutex
-}
-
-func NewATN(grammarType int, maxTokenType int) *ATN {
- return &ATN{
- grammarType: grammarType,
- maxTokenType: maxTokenType,
- modeNameToStartState: make(map[string]*TokensStartState),
- }
-}
-
-// NextTokensInContext computes the set of valid tokens that can occur starting
-// in state s. If ctx is nil, the set of tokens will not include what can follow
-// the rule surrounding s. In other words, the set will be restricted to tokens
-// reachable staying within the rule of s.
-func (a *ATN) NextTokensInContext(s ATNState, ctx RuleContext) *IntervalSet {
- return NewLL1Analyzer(a).Look(s, nil, ctx)
-}
-
-// NextTokensNoContext computes the set of valid tokens that can occur starting
-// in s and staying in same rule. Token.EPSILON is in set if we reach end of
-// rule.
-func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet {
- a.mu.Lock()
- defer a.mu.Unlock()
- iset := s.GetNextTokenWithinRule()
- if iset == nil {
- iset = a.NextTokensInContext(s, nil)
- iset.readOnly = true
- s.SetNextTokenWithinRule(iset)
- }
- return iset
-}
-
-func (a *ATN) NextTokens(s ATNState, ctx RuleContext) *IntervalSet {
- if ctx == nil {
- return a.NextTokensNoContext(s)
- }
-
- return a.NextTokensInContext(s, ctx)
-}
-
-func (a *ATN) addState(state ATNState) {
- if state != nil {
- state.SetATN(a)
- state.SetStateNumber(len(a.states))
- }
-
- a.states = append(a.states, state)
-}
-
-func (a *ATN) removeState(state ATNState) {
- a.states[state.GetStateNumber()] = nil // Just free the memory; don't shift states in the slice
-}
-
-func (a *ATN) defineDecisionState(s DecisionState) int {
- a.DecisionToState = append(a.DecisionToState, s)
- s.setDecision(len(a.DecisionToState) - 1)
-
- return s.getDecision()
-}
-
-func (a *ATN) getDecisionState(decision int) DecisionState {
- if len(a.DecisionToState) == 0 {
- return nil
- }
-
- return a.DecisionToState[decision]
-}
-
-// getExpectedTokens computes the set of input symbols which could follow ATN
-// state number stateNumber in the specified full parse context ctx and returns
-// the set of potentially valid input symbols which could follow the specified
-// state in the specified context. This method considers the complete parser
-// context, but does not evaluate semantic predicates (i.e. all predicates
-// encountered during the calculation are assumed true). If a path in the ATN
-// exists from the starting state to the RuleStopState of the outermost context
-// without Matching any symbols, Token.EOF is added to the returned set.
-//
-// A nil ctx defaults to ParserRuleContext.EMPTY.
-//
-// It panics if the ATN does not contain state stateNumber.
-func (a *ATN) getExpectedTokens(stateNumber int, ctx RuleContext) *IntervalSet {
- if stateNumber < 0 || stateNumber >= len(a.states) {
- panic("Invalid state number.")
- }
-
- s := a.states[stateNumber]
- following := a.NextTokens(s, nil)
-
- if !following.contains(TokenEpsilon) {
- return following
- }
-
- expected := NewIntervalSet()
-
- expected.addSet(following)
- expected.removeOne(TokenEpsilon)
-
- for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
- invokingState := a.states[ctx.GetInvokingState()]
- rt := invokingState.GetTransitions()[0]
-
- following = a.NextTokens(rt.(*RuleTransition).followState, nil)
- expected.addSet(following)
- expected.removeOne(TokenEpsilon)
- ctx = ctx.GetParent().(RuleContext)
- }
-
- if following.contains(TokenEpsilon) {
- expected.addOne(TokenEOF)
- }
-
- return expected
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go
deleted file mode 100644
index 2ef74926ec..0000000000
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/errors.go
+++ /dev/null
@@ -1,241 +0,0 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
-// Use of this file is governed by the BSD 3-clause license that
-// can be found in the LICENSE.txt file in the project root.
-
-package antlr
-
-// The root of the ANTLR exception hierarchy. In general, ANTLR tracks just
-// 3 kinds of errors: prediction errors, failed predicate errors, and
-// mismatched input errors. In each case, the parser knows where it is
-// in the input, where it is in the ATN, the rule invocation stack,
-// and what kind of problem occurred.
-
-type RecognitionException interface {
- GetOffendingToken() Token
- GetMessage() string
- GetInputStream() IntStream
-}
-
-type BaseRecognitionException struct {
- message string
- recognizer Recognizer
- offendingToken Token
- offendingState int
- ctx RuleContext
- input IntStream
-}
-
-func NewBaseRecognitionException(message string, recognizer Recognizer, input IntStream, ctx RuleContext) *BaseRecognitionException {
-
- // todo
- // Error.call(this)
- //
- // if (!!Error.captureStackTrace) {
- // Error.captureStackTrace(this, RecognitionException)
- // } else {
- // stack := NewError().stack
- // }
- // TODO may be able to use - "runtime" func Stack(buf []byte, all bool) int
-
- t := new(BaseRecognitionException)
-
- t.message = message
- t.recognizer = recognizer
- t.input = input
- t.ctx = ctx
- // The current {@link Token} when an error occurred. Since not all streams
- // support accessing symbols by index, we have to track the {@link Token}
- // instance itself.
- t.offendingToken = nil
- // Get the ATN state number the parser was in at the time the error
- // occurred. For {@link NoViableAltException} and
- // {@link LexerNoViableAltException} exceptions, this is the
- // {@link DecisionState} number. For others, it is the state whose outgoing
- // edge we couldn't Match.
- t.offendingState = -1
- if t.recognizer != nil {
- t.offendingState = t.recognizer.GetState()
- }
-
- return t
-}
-
-func (b *BaseRecognitionException) GetMessage() string {
- return b.message
-}
-
-func (b *BaseRecognitionException) GetOffendingToken() Token {
- return b.offendingToken
-}
-
-func (b *BaseRecognitionException) GetInputStream() IntStream {
- return b.input
-}
-
-//
If the state number is not known, b method returns -1.
-
-//
-// Gets the set of input symbols which could potentially follow the
-// previously Matched symbol at the time b exception was panicn.
-//
-//
If the set of expected tokens is not known and could not be computed,
-// b method returns {@code nil}.
-//
-// @return The set of token types that could potentially follow the current
-// state in the ATN, or {@code nil} if the information is not available.
-// /
-func (b *BaseRecognitionException) getExpectedTokens() *IntervalSet {
- if b.recognizer != nil {
- return b.recognizer.GetATN().getExpectedTokens(b.offendingState, b.ctx)
- }
-
- return nil
-}
-
-func (b *BaseRecognitionException) String() string {
- return b.message
-}
-
-type LexerNoViableAltException struct {
- *BaseRecognitionException
-
- startIndex int
- deadEndConfigs ATNConfigSet
-}
-
-func NewLexerNoViableAltException(lexer Lexer, input CharStream, startIndex int, deadEndConfigs ATNConfigSet) *LexerNoViableAltException {
-
- l := new(LexerNoViableAltException)
-
- l.BaseRecognitionException = NewBaseRecognitionException("", lexer, input, nil)
-
- l.startIndex = startIndex
- l.deadEndConfigs = deadEndConfigs
-
- return l
-}
-
-func (l *LexerNoViableAltException) String() string {
- symbol := ""
- if l.startIndex >= 0 && l.startIndex < l.input.Size() {
- symbol = l.input.(CharStream).GetTextFromInterval(NewInterval(l.startIndex, l.startIndex))
- }
- return "LexerNoViableAltException" + symbol
-}
-
-type NoViableAltException struct {
- *BaseRecognitionException
-
- startToken Token
- offendingToken Token
- ctx ParserRuleContext
- deadEndConfigs ATNConfigSet
-}
-
-// Indicates that the parser could not decide which of two or more paths
-// to take based upon the remaining input. It tracks the starting token
-// of the offending input and also knows where the parser was
-// in the various paths when the error. Reported by ReportNoViableAlternative()
-//
-func NewNoViableAltException(recognizer Parser, input TokenStream, startToken Token, offendingToken Token, deadEndConfigs ATNConfigSet, ctx ParserRuleContext) *NoViableAltException {
-
- if ctx == nil {
- ctx = recognizer.GetParserRuleContext()
- }
-
- if offendingToken == nil {
- offendingToken = recognizer.GetCurrentToken()
- }
-
- if startToken == nil {
- startToken = recognizer.GetCurrentToken()
- }
-
- if input == nil {
- input = recognizer.GetInputStream().(TokenStream)
- }
-
- n := new(NoViableAltException)
- n.BaseRecognitionException = NewBaseRecognitionException("", recognizer, input, ctx)
-
- // Which configurations did we try at input.Index() that couldn't Match
- // input.LT(1)?//
- n.deadEndConfigs = deadEndConfigs
- // The token object at the start index the input stream might
- // not be buffering tokens so get a reference to it. (At the
- // time the error occurred, of course the stream needs to keep a
- // buffer all of the tokens but later we might not have access to those.)
- n.startToken = startToken
- n.offendingToken = offendingToken
-
- return n
-}
-
-type InputMisMatchException struct {
- *BaseRecognitionException
-}
-
-// This signifies any kind of mismatched input exceptions such as
-// when the current input does not Match the expected token.
-//
-func NewInputMisMatchException(recognizer Parser) *InputMisMatchException {
-
- i := new(InputMisMatchException)
- i.BaseRecognitionException = NewBaseRecognitionException("", recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
-
- i.offendingToken = recognizer.GetCurrentToken()
-
- return i
-
-}
-
-// A semantic predicate failed during validation. Validation of predicates
-// occurs when normally parsing the alternative just like Matching a token.
-// Disambiguating predicate evaluation occurs when we test a predicate during
-// prediction.
-
-type FailedPredicateException struct {
- *BaseRecognitionException
-
- ruleIndex int
- predicateIndex int
- predicate string
-}
-
-func NewFailedPredicateException(recognizer Parser, predicate string, message string) *FailedPredicateException {
-
- f := new(FailedPredicateException)
-
- f.BaseRecognitionException = NewBaseRecognitionException(f.formatMessage(predicate, message), recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
-
- s := recognizer.GetInterpreter().atn.states[recognizer.GetState()]
- trans := s.GetTransitions()[0]
- if trans2, ok := trans.(*PredicateTransition); ok {
- f.ruleIndex = trans2.ruleIndex
- f.predicateIndex = trans2.predIndex
- } else {
- f.ruleIndex = 0
- f.predicateIndex = 0
- }
- f.predicate = predicate
- f.offendingToken = recognizer.GetCurrentToken()
-
- return f
-}
-
-func (f *FailedPredicateException) formatMessage(predicate, message string) string {
- if message != "" {
- return message
- }
-
- return "failed predicate: {" + predicate + "}?"
-}
-
-type ParseCancellationException struct {
-}
-
-func NewParseCancellationException() *ParseCancellationException {
- // Error.call(this)
- // Error.captureStackTrace(this, ParseCancellationException)
- return new(ParseCancellationException)
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go
deleted file mode 100644
index 2ab2f56052..0000000000
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser.go
+++ /dev/null
@@ -1,718 +0,0 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
-// Use of this file is governed by the BSD 3-clause license that
-// can be found in the LICENSE.txt file in the project root.
-
-package antlr
-
-import (
- "fmt"
- "strconv"
-)
-
-type Parser interface {
- Recognizer
-
- GetInterpreter() *ParserATNSimulator
-
- GetTokenStream() TokenStream
- GetTokenFactory() TokenFactory
- GetParserRuleContext() ParserRuleContext
- SetParserRuleContext(ParserRuleContext)
- Consume() Token
- GetParseListeners() []ParseTreeListener
-
- GetErrorHandler() ErrorStrategy
- SetErrorHandler(ErrorStrategy)
- GetInputStream() IntStream
- GetCurrentToken() Token
- GetExpectedTokens() *IntervalSet
- NotifyErrorListeners(string, Token, RecognitionException)
- IsExpectedToken(int) bool
- GetPrecedence() int
- GetRuleInvocationStack(ParserRuleContext) []string
-}
-
-type BaseParser struct {
- *BaseRecognizer
-
- Interpreter *ParserATNSimulator
- BuildParseTrees bool
-
- input TokenStream
- errHandler ErrorStrategy
- precedenceStack IntStack
- ctx ParserRuleContext
-
- tracer *TraceListener
- parseListeners []ParseTreeListener
- _SyntaxErrors int
-}
-
-// p.is all the parsing support code essentially most of it is error
-// recovery stuff.//
-func NewBaseParser(input TokenStream) *BaseParser {
-
- p := new(BaseParser)
-
- p.BaseRecognizer = NewBaseRecognizer()
-
- // The input stream.
- p.input = nil
- // The error handling strategy for the parser. The default value is a new
- // instance of {@link DefaultErrorStrategy}.
- p.errHandler = NewDefaultErrorStrategy()
- p.precedenceStack = make([]int, 0)
- p.precedenceStack.Push(0)
- // The {@link ParserRuleContext} object for the currently executing rule.
- // p.is always non-nil during the parsing process.
- p.ctx = nil
- // Specifies whether or not the parser should construct a parse tree during
- // the parsing process. The default value is {@code true}.
- p.BuildParseTrees = true
- // When {@link //setTrace}{@code (true)} is called, a reference to the
- // {@link TraceListener} is stored here so it can be easily removed in a
- // later call to {@link //setTrace}{@code (false)}. The listener itself is
- // implemented as a parser listener so p.field is not directly used by
- // other parser methods.
- p.tracer = nil
- // The list of {@link ParseTreeListener} listeners registered to receive
- // events during the parse.
- p.parseListeners = nil
- // The number of syntax errors Reported during parsing. p.value is
- // incremented each time {@link //NotifyErrorListeners} is called.
- p._SyntaxErrors = 0
- p.SetInputStream(input)
-
- return p
-}
-
-// p.field maps from the serialized ATN string to the deserialized {@link
-// ATN} with
-// bypass alternatives.
-//
-// @see ATNDeserializationOptions//isGenerateRuleBypassTransitions()
-//
-var bypassAltsAtnCache = make(map[string]int)
-
-// reset the parser's state//
-func (p *BaseParser) reset() {
- if p.input != nil {
- p.input.Seek(0)
- }
- p.errHandler.reset(p)
- p.ctx = nil
- p._SyntaxErrors = 0
- p.SetTrace(nil)
- p.precedenceStack = make([]int, 0)
- p.precedenceStack.Push(0)
- if p.Interpreter != nil {
- p.Interpreter.reset()
- }
-}
-
-func (p *BaseParser) GetErrorHandler() ErrorStrategy {
- return p.errHandler
-}
-
-func (p *BaseParser) SetErrorHandler(e ErrorStrategy) {
- p.errHandler = e
-}
-
-// Match current input symbol against {@code ttype}. If the symbol type
-// Matches, {@link ANTLRErrorStrategy//ReportMatch} and {@link //consume} are
-// called to complete the Match process.
-//
-//
If the symbol type does not Match,
-// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
-// strategy to attempt recovery. If {@link //getBuildParseTree} is
-// {@code true} and the token index of the symbol returned by
-// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
-// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
-//
-// @param ttype the token type to Match
-// @return the Matched symbol
-// @panics RecognitionException if the current input symbol did not Match
-// {@code ttype} and the error strategy could not recover from the
-// mismatched symbol
-
-func (p *BaseParser) Match(ttype int) Token {
-
- t := p.GetCurrentToken()
-
- if t.GetTokenType() == ttype {
- p.errHandler.ReportMatch(p)
- p.Consume()
- } else {
- t = p.errHandler.RecoverInline(p)
- if p.BuildParseTrees && t.GetTokenIndex() == -1 {
- // we must have conjured up a Newtoken during single token
- // insertion
- // if it's not the current symbol
- p.ctx.AddErrorNode(t)
- }
- }
-
- return t
-}
-
-// Match current input symbol as a wildcard. If the symbol type Matches
-// (i.e. has a value greater than 0), {@link ANTLRErrorStrategy//ReportMatch}
-// and {@link //consume} are called to complete the Match process.
-//
-//
If the symbol type does not Match,
-// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
-// strategy to attempt recovery. If {@link //getBuildParseTree} is
-// {@code true} and the token index of the symbol returned by
-// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
-// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
-//
-// @return the Matched symbol
-// @panics RecognitionException if the current input symbol did not Match
-// a wildcard and the error strategy could not recover from the mismatched
-// symbol
-
-func (p *BaseParser) MatchWildcard() Token {
- t := p.GetCurrentToken()
- if t.GetTokenType() > 0 {
- p.errHandler.ReportMatch(p)
- p.Consume()
- } else {
- t = p.errHandler.RecoverInline(p)
- if p.BuildParseTrees && t.GetTokenIndex() == -1 {
- // we must have conjured up a Newtoken during single token
- // insertion
- // if it's not the current symbol
- p.ctx.AddErrorNode(t)
- }
- }
- return t
-}
-
-func (p *BaseParser) GetParserRuleContext() ParserRuleContext {
- return p.ctx
-}
-
-func (p *BaseParser) SetParserRuleContext(v ParserRuleContext) {
- p.ctx = v
-}
-
-func (p *BaseParser) GetParseListeners() []ParseTreeListener {
- if p.parseListeners == nil {
- return make([]ParseTreeListener, 0)
- }
- return p.parseListeners
-}
-
-// Registers {@code listener} to receive events during the parsing process.
-//
-//
To support output-preserving grammar transformations (including but not
-// limited to left-recursion removal, automated left-factoring, and
-// optimized code generation), calls to listener methods during the parse
-// may differ substantially from calls made by
-// {@link ParseTreeWalker//DEFAULT} used after the parse is complete. In
-// particular, rule entry and exit events may occur in a different order
-// during the parse than after the parser. In addition, calls to certain
-// rule entry methods may be omitted.
-//
-//
With the following specific exceptions, calls to listener events are
-// deterministic, i.e. for identical input the calls to listener
-// methods will be the same.
-//
-//
-//
Alterations to the grammar used to generate code may change the
-// behavior of the listener calls.
-//
Alterations to the command line options passed to ANTLR 4 when
-// generating the parser may change the behavior of the listener calls.
-//
Changing the version of the ANTLR Tool used to generate the parser
-// may change the behavior of the listener calls.
-//
-//
-// @param listener the listener to add
-//
-// @panics nilPointerException if {@code} listener is {@code nil}
-//
-func (p *BaseParser) AddParseListener(listener ParseTreeListener) {
- if listener == nil {
- panic("listener")
- }
- if p.parseListeners == nil {
- p.parseListeners = make([]ParseTreeListener, 0)
- }
- p.parseListeners = append(p.parseListeners, listener)
-}
-
-//
-// Remove {@code listener} from the list of parse listeners.
-//
-//
If {@code listener} is {@code nil} or has not been added as a parse
-// listener, p.method does nothing.
-// @param listener the listener to remove
-//
-func (p *BaseParser) RemoveParseListener(listener ParseTreeListener) {
-
- if p.parseListeners != nil {
-
- idx := -1
- for i, v := range p.parseListeners {
- if v == listener {
- idx = i
- break
- }
- }
-
- if idx == -1 {
- return
- }
-
- // remove the listener from the slice
- p.parseListeners = append(p.parseListeners[0:idx], p.parseListeners[idx+1:]...)
-
- if len(p.parseListeners) == 0 {
- p.parseListeners = nil
- }
- }
-}
-
-// Remove all parse listeners.
-func (p *BaseParser) removeParseListeners() {
- p.parseListeners = nil
-}
-
-// Notify any parse listeners of an enter rule event.
-func (p *BaseParser) TriggerEnterRuleEvent() {
- if p.parseListeners != nil {
- ctx := p.ctx
- for _, listener := range p.parseListeners {
- listener.EnterEveryRule(ctx)
- ctx.EnterRule(listener)
- }
- }
-}
-
-//
-// Notify any parse listeners of an exit rule event.
-//
-// @see //addParseListener
-//
-func (p *BaseParser) TriggerExitRuleEvent() {
- if p.parseListeners != nil {
- // reverse order walk of listeners
- ctx := p.ctx
- l := len(p.parseListeners) - 1
-
- for i := range p.parseListeners {
- listener := p.parseListeners[l-i]
- ctx.ExitRule(listener)
- listener.ExitEveryRule(ctx)
- }
- }
-}
-
-func (p *BaseParser) GetInterpreter() *ParserATNSimulator {
- return p.Interpreter
-}
-
-func (p *BaseParser) GetATN() *ATN {
- return p.Interpreter.atn
-}
-
-func (p *BaseParser) GetTokenFactory() TokenFactory {
- return p.input.GetTokenSource().GetTokenFactory()
-}
-
-// Tell our token source and error strategy about a Newway to create tokens.//
-func (p *BaseParser) setTokenFactory(factory TokenFactory) {
- p.input.GetTokenSource().setTokenFactory(factory)
-}
-
-// The ATN with bypass alternatives is expensive to create so we create it
-// lazily.
-//
-// @panics UnsupportedOperationException if the current parser does not
-// implement the {@link //getSerializedATN()} method.
-//
-func (p *BaseParser) GetATNWithBypassAlts() {
-
- // TODO
- panic("Not implemented!")
-
- // serializedAtn := p.getSerializedATN()
- // if (serializedAtn == nil) {
- // panic("The current parser does not support an ATN with bypass alternatives.")
- // }
- // result := p.bypassAltsAtnCache[serializedAtn]
- // if (result == nil) {
- // deserializationOptions := NewATNDeserializationOptions(nil)
- // deserializationOptions.generateRuleBypassTransitions = true
- // result = NewATNDeserializer(deserializationOptions).deserialize(serializedAtn)
- // p.bypassAltsAtnCache[serializedAtn] = result
- // }
- // return result
-}
-
-// The preferred method of getting a tree pattern. For example, here's a
-// sample use:
-//
-//
-// ParseTree t = parser.expr()
-// ParseTreePattern p = parser.compileParseTreePattern("<ID>+0",
-// MyParser.RULE_expr)
-// ParseTreeMatch m = p.Match(t)
-// String id = m.Get("ID")
-//
-
-func (p *BaseParser) compileParseTreePattern(pattern, patternRuleIndex, lexer Lexer) {
-
- panic("NewParseTreePatternMatcher not implemented!")
- //
- // if (lexer == nil) {
- // if (p.GetTokenStream() != nil) {
- // tokenSource := p.GetTokenStream().GetTokenSource()
- // if _, ok := tokenSource.(ILexer); ok {
- // lexer = tokenSource
- // }
- // }
- // }
- // if (lexer == nil) {
- // panic("Parser can't discover a lexer to use")
- // }
-
- // m := NewParseTreePatternMatcher(lexer, p)
- // return m.compile(pattern, patternRuleIndex)
-}
-
-func (p *BaseParser) GetInputStream() IntStream {
- return p.GetTokenStream()
-}
-
-func (p *BaseParser) SetInputStream(input TokenStream) {
- p.SetTokenStream(input)
-}
-
-func (p *BaseParser) GetTokenStream() TokenStream {
- return p.input
-}
-
-// Set the token stream and reset the parser.//
-func (p *BaseParser) SetTokenStream(input TokenStream) {
- p.input = nil
- p.reset()
- p.input = input
-}
-
-// Match needs to return the current input symbol, which gets put
-// into the label for the associated token ref e.g., x=ID.
-//
-func (p *BaseParser) GetCurrentToken() Token {
- return p.input.LT(1)
-}
-
-func (p *BaseParser) NotifyErrorListeners(msg string, offendingToken Token, err RecognitionException) {
- if offendingToken == nil {
- offendingToken = p.GetCurrentToken()
- }
- p._SyntaxErrors++
- line := offendingToken.GetLine()
- column := offendingToken.GetColumn()
- listener := p.GetErrorListenerDispatch()
- listener.SyntaxError(p, offendingToken, line, column, msg, err)
-}
-
-func (p *BaseParser) Consume() Token {
- o := p.GetCurrentToken()
- if o.GetTokenType() != TokenEOF {
- p.GetInputStream().Consume()
- }
- hasListener := p.parseListeners != nil && len(p.parseListeners) > 0
- if p.BuildParseTrees || hasListener {
- if p.errHandler.InErrorRecoveryMode(p) {
- node := p.ctx.AddErrorNode(o)
- if p.parseListeners != nil {
- for _, l := range p.parseListeners {
- l.VisitErrorNode(node)
- }
- }
-
- } else {
- node := p.ctx.AddTokenNode(o)
- if p.parseListeners != nil {
- for _, l := range p.parseListeners {
- l.VisitTerminal(node)
- }
- }
- }
- // node.invokingState = p.state
- }
-
- return o
-}
-
-func (p *BaseParser) addContextToParseTree() {
- // add current context to parent if we have a parent
- if p.ctx.GetParent() != nil {
- p.ctx.GetParent().(ParserRuleContext).AddChild(p.ctx)
- }
-}
-
-func (p *BaseParser) EnterRule(localctx ParserRuleContext, state, ruleIndex int) {
- p.SetState(state)
- p.ctx = localctx
- p.ctx.SetStart(p.input.LT(1))
- if p.BuildParseTrees {
- p.addContextToParseTree()
- }
- if p.parseListeners != nil {
- p.TriggerEnterRuleEvent()
- }
-}
-
-func (p *BaseParser) ExitRule() {
- p.ctx.SetStop(p.input.LT(-1))
- // trigger event on ctx, before it reverts to parent
- if p.parseListeners != nil {
- p.TriggerExitRuleEvent()
- }
- p.SetState(p.ctx.GetInvokingState())
- if p.ctx.GetParent() != nil {
- p.ctx = p.ctx.GetParent().(ParserRuleContext)
- } else {
- p.ctx = nil
- }
-}
-
-func (p *BaseParser) EnterOuterAlt(localctx ParserRuleContext, altNum int) {
- localctx.SetAltNumber(altNum)
- // if we have Newlocalctx, make sure we replace existing ctx
- // that is previous child of parse tree
- if p.BuildParseTrees && p.ctx != localctx {
- if p.ctx.GetParent() != nil {
- p.ctx.GetParent().(ParserRuleContext).RemoveLastChild()
- p.ctx.GetParent().(ParserRuleContext).AddChild(localctx)
- }
- }
- p.ctx = localctx
-}
-
-// Get the precedence level for the top-most precedence rule.
-//
-// @return The precedence level for the top-most precedence rule, or -1 if
-// the parser context is not nested within a precedence rule.
-
-func (p *BaseParser) GetPrecedence() int {
- if len(p.precedenceStack) == 0 {
- return -1
- }
-
- return p.precedenceStack[len(p.precedenceStack)-1]
-}
-
-func (p *BaseParser) EnterRecursionRule(localctx ParserRuleContext, state, ruleIndex, precedence int) {
- p.SetState(state)
- p.precedenceStack.Push(precedence)
- p.ctx = localctx
- p.ctx.SetStart(p.input.LT(1))
- if p.parseListeners != nil {
- p.TriggerEnterRuleEvent() // simulates rule entry for
- // left-recursive rules
- }
-}
-
-//
-// Like {@link //EnterRule} but for recursive rules.
-
-func (p *BaseParser) PushNewRecursionContext(localctx ParserRuleContext, state, ruleIndex int) {
- previous := p.ctx
- previous.SetParent(localctx)
- previous.SetInvokingState(state)
- previous.SetStop(p.input.LT(-1))
-
- p.ctx = localctx
- p.ctx.SetStart(previous.GetStart())
- if p.BuildParseTrees {
- p.ctx.AddChild(previous)
- }
- if p.parseListeners != nil {
- p.TriggerEnterRuleEvent() // simulates rule entry for
- // left-recursive rules
- }
-}
-
-func (p *BaseParser) UnrollRecursionContexts(parentCtx ParserRuleContext) {
- p.precedenceStack.Pop()
- p.ctx.SetStop(p.input.LT(-1))
- retCtx := p.ctx // save current ctx (return value)
- // unroll so ctx is as it was before call to recursive method
- if p.parseListeners != nil {
- for p.ctx != parentCtx {
- p.TriggerExitRuleEvent()
- p.ctx = p.ctx.GetParent().(ParserRuleContext)
- }
- } else {
- p.ctx = parentCtx
- }
- // hook into tree
- retCtx.SetParent(parentCtx)
- if p.BuildParseTrees && parentCtx != nil {
- // add return ctx into invoking rule's tree
- parentCtx.AddChild(retCtx)
- }
-}
-
-func (p *BaseParser) GetInvokingContext(ruleIndex int) ParserRuleContext {
- ctx := p.ctx
- for ctx != nil {
- if ctx.GetRuleIndex() == ruleIndex {
- return ctx
- }
- ctx = ctx.GetParent().(ParserRuleContext)
- }
- return nil
-}
-
-func (p *BaseParser) Precpred(localctx RuleContext, precedence int) bool {
- return precedence >= p.precedenceStack[len(p.precedenceStack)-1]
-}
-
-func (p *BaseParser) inContext(context ParserRuleContext) bool {
- // TODO: useful in parser?
- return false
-}
-
-//
-// Checks whether or not {@code symbol} can follow the current state in the
-// ATN. The behavior of p.method is equivalent to the following, but is
-// implemented such that the complete context-sensitive follow set does not
-// need to be explicitly constructed.
-//
-//
-//
-// @param symbol the symbol type to check
-// @return {@code true} if {@code symbol} can follow the current state in
-// the ATN, otherwise {@code false}.
-
-func (p *BaseParser) IsExpectedToken(symbol int) bool {
- atn := p.Interpreter.atn
- ctx := p.ctx
- s := atn.states[p.state]
- following := atn.NextTokens(s, nil)
- if following.contains(symbol) {
- return true
- }
- if !following.contains(TokenEpsilon) {
- return false
- }
- for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
- invokingState := atn.states[ctx.GetInvokingState()]
- rt := invokingState.GetTransitions()[0]
- following = atn.NextTokens(rt.(*RuleTransition).followState, nil)
- if following.contains(symbol) {
- return true
- }
- ctx = ctx.GetParent().(ParserRuleContext)
- }
- if following.contains(TokenEpsilon) && symbol == TokenEOF {
- return true
- }
-
- return false
-}
-
-// Computes the set of input symbols which could follow the current parser
-// state and context, as given by {@link //GetState} and {@link //GetContext},
-// respectively.
-//
-// @see ATN//getExpectedTokens(int, RuleContext)
-//
-func (p *BaseParser) GetExpectedTokens() *IntervalSet {
- return p.Interpreter.atn.getExpectedTokens(p.state, p.ctx)
-}
-
-func (p *BaseParser) GetExpectedTokensWithinCurrentRule() *IntervalSet {
- atn := p.Interpreter.atn
- s := atn.states[p.state]
- return atn.NextTokens(s, nil)
-}
-
-// Get a rule's index (i.e., {@code RULE_ruleName} field) or -1 if not found.//
-func (p *BaseParser) GetRuleIndex(ruleName string) int {
- var ruleIndex, ok = p.GetRuleIndexMap()[ruleName]
- if ok {
- return ruleIndex
- }
-
- return -1
-}
-
-// Return List<String> of the rule names in your parser instance
-// leading up to a call to the current rule. You could override if
-// you want more details such as the file/line info of where
-// in the ATN a rule is invoked.
-//
-// this very useful for error messages.
-
-func (p *BaseParser) GetRuleInvocationStack(c ParserRuleContext) []string {
- if c == nil {
- c = p.ctx
- }
- stack := make([]string, 0)
- for c != nil {
- // compute what follows who invoked us
- ruleIndex := c.GetRuleIndex()
- if ruleIndex < 0 {
- stack = append(stack, "n/a")
- } else {
- stack = append(stack, p.GetRuleNames()[ruleIndex])
- }
-
- vp := c.GetParent()
-
- if vp == nil {
- break
- }
-
- c = vp.(ParserRuleContext)
- }
- return stack
-}
-
-// For debugging and other purposes.//
-func (p *BaseParser) GetDFAStrings() string {
- return fmt.Sprint(p.Interpreter.decisionToDFA)
-}
-
-// For debugging and other purposes.//
-func (p *BaseParser) DumpDFA() {
- seenOne := false
- for _, dfa := range p.Interpreter.decisionToDFA {
- if dfa.numStates() > 0 {
- if seenOne {
- fmt.Println()
- }
- fmt.Println("Decision " + strconv.Itoa(dfa.decision) + ":")
- fmt.Print(dfa.String(p.LiteralNames, p.SymbolicNames))
- seenOne = true
- }
- }
-}
-
-func (p *BaseParser) GetSourceName() string {
- return p.GrammarFileName
-}
-
-// During a parse is sometimes useful to listen in on the rule entry and exit
-// events as well as token Matches. p.is for quick and dirty debugging.
-//
-func (p *BaseParser) SetTrace(trace *TraceListener) {
- if trace == nil {
- p.RemoveParseListener(p.tracer)
- p.tracer = nil
- } else {
- if p.tracer != nil {
- p.RemoveParseListener(p.tracer)
- }
- p.tracer = NewTraceListener(p)
- p.AddParseListener(p.tracer)
- }
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go
deleted file mode 100644
index 2d8e99095d..0000000000
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token.go
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
-// Use of this file is governed by the BSD 3-clause license that
-// can be found in the LICENSE.txt file in the project root.
-
-package antlr
-
-import (
- "strconv"
- "strings"
-)
-
-type TokenSourceCharStreamPair struct {
- tokenSource TokenSource
- charStream CharStream
-}
-
-// A token has properties: text, type, line, character position in the line
-// (so we can ignore tabs), token channel, index, and source from which
-// we obtained this token.
-
-type Token interface {
- GetSource() *TokenSourceCharStreamPair
- GetTokenType() int
- GetChannel() int
- GetStart() int
- GetStop() int
- GetLine() int
- GetColumn() int
-
- GetText() string
- SetText(s string)
-
- GetTokenIndex() int
- SetTokenIndex(v int)
-
- GetTokenSource() TokenSource
- GetInputStream() CharStream
-}
-
-type BaseToken struct {
- source *TokenSourceCharStreamPair
- tokenType int // token type of the token
- channel int // The parser ignores everything not on DEFAULT_CHANNEL
- start int // optional return -1 if not implemented.
- stop int // optional return -1 if not implemented.
- tokenIndex int // from 0..n-1 of the token object in the input stream
- line int // line=1..n of the 1st character
- column int // beginning of the line at which it occurs, 0..n-1
- text string // text of the token.
- readOnly bool
-}
-
-const (
- TokenInvalidType = 0
-
- // During lookahead operations, this "token" signifies we hit rule end ATN state
- // and did not follow it despite needing to.
- TokenEpsilon = -2
-
- TokenMinUserTokenType = 1
-
- TokenEOF = -1
-
- // All tokens go to the parser (unless Skip() is called in that rule)
- // on a particular "channel". The parser tunes to a particular channel
- // so that whitespace etc... can go to the parser on a "hidden" channel.
-
- TokenDefaultChannel = 0
-
- // Anything on different channel than DEFAULT_CHANNEL is not parsed
- // by parser.
-
- TokenHiddenChannel = 1
-)
-
-func (b *BaseToken) GetChannel() int {
- return b.channel
-}
-
-func (b *BaseToken) GetStart() int {
- return b.start
-}
-
-func (b *BaseToken) GetStop() int {
- return b.stop
-}
-
-func (b *BaseToken) GetLine() int {
- return b.line
-}
-
-func (b *BaseToken) GetColumn() int {
- return b.column
-}
-
-func (b *BaseToken) GetTokenType() int {
- return b.tokenType
-}
-
-func (b *BaseToken) GetSource() *TokenSourceCharStreamPair {
- return b.source
-}
-
-func (b *BaseToken) GetTokenIndex() int {
- return b.tokenIndex
-}
-
-func (b *BaseToken) SetTokenIndex(v int) {
- b.tokenIndex = v
-}
-
-func (b *BaseToken) GetTokenSource() TokenSource {
- return b.source.tokenSource
-}
-
-func (b *BaseToken) GetInputStream() CharStream {
- return b.source.charStream
-}
-
-type CommonToken struct {
- *BaseToken
-}
-
-func NewCommonToken(source *TokenSourceCharStreamPair, tokenType, channel, start, stop int) *CommonToken {
-
- t := new(CommonToken)
-
- t.BaseToken = new(BaseToken)
-
- t.source = source
- t.tokenType = tokenType
- t.channel = channel
- t.start = start
- t.stop = stop
- t.tokenIndex = -1
- if t.source.tokenSource != nil {
- t.line = source.tokenSource.GetLine()
- t.column = source.tokenSource.GetCharPositionInLine()
- } else {
- t.column = -1
- }
- return t
-}
-
-// An empty {@link Pair} which is used as the default value of
-// {@link //source} for tokens that do not have a source.
-
-//CommonToken.EMPTY_SOURCE = [ nil, nil ]
-
-// Constructs a New{@link CommonToken} as a copy of another {@link Token}.
-//
-//
-// If {@code oldToken} is also a {@link CommonToken} instance, the newly
-// constructed token will share a reference to the {@link //text} field and
-// the {@link Pair} stored in {@link //source}. Otherwise, {@link //text} will
-// be assigned the result of calling {@link //GetText}, and {@link //source}
-// will be constructed from the result of {@link Token//GetTokenSource} and
-// {@link Token//GetInputStream}.
-//
-// @param oldToken The token to copy.
-//
-func (c *CommonToken) clone() *CommonToken {
- t := NewCommonToken(c.source, c.tokenType, c.channel, c.start, c.stop)
- t.tokenIndex = c.GetTokenIndex()
- t.line = c.GetLine()
- t.column = c.GetColumn()
- t.text = c.GetText()
- return t
-}
-
-func (c *CommonToken) GetText() string {
- if c.text != "" {
- return c.text
- }
- input := c.GetInputStream()
- if input == nil {
- return ""
- }
- n := input.Size()
- if c.start < n && c.stop < n {
- return input.GetTextFromInterval(NewInterval(c.start, c.stop))
- }
- return ""
-}
-
-func (c *CommonToken) SetText(text string) {
- c.text = text
-}
-
-func (c *CommonToken) String() string {
- txt := c.GetText()
- if txt != "" {
- txt = strings.Replace(txt, "\n", "\\n", -1)
- txt = strings.Replace(txt, "\r", "\\r", -1)
- txt = strings.Replace(txt, "\t", "\\t", -1)
- } else {
- txt = ""
- }
-
- var ch string
- if c.channel > 0 {
- ch = ",channel=" + strconv.Itoa(c.channel)
- } else {
- ch = ""
- }
-
- return "[@" + strconv.Itoa(c.tokenIndex) + "," + strconv.Itoa(c.start) + ":" + strconv.Itoa(c.stop) + "='" +
- txt + "',<" + strconv.Itoa(c.tokenType) + ">" +
- ch + "," + strconv.Itoa(c.line) + ":" + strconv.Itoa(c.column) + "]"
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go
deleted file mode 100644
index 96a03f02aa..0000000000
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tokenstream_rewriter.go
+++ /dev/null
@@ -1,649 +0,0 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
-// Use of this file is governed by the BSD 3-clause license that
-// can be found in the LICENSE.txt file in the project root.
-package antlr
-
-import (
-"bytes"
-"fmt"
-)
-
-
-//
-// Useful for rewriting out a buffered input token stream after doing some
-// augmentation or other manipulations on it.
-
-//
-// You can insert stuff, replace, and delete chunks. Note that the operations
-// are done lazily--only if you convert the buffer to a {@link String} with
-// {@link TokenStream#getText()}. This is very efficient because you are not
-// moving data around all the time. As the buffer of tokens is converted to
-// strings, the {@link #getText()} method(s) scan the input token stream and
-// check to see if there is an operation at the current index. If so, the
-// operation is done and then normal {@link String} rendering continues on the
-// buffer. This is like having multiple Turing machine instruction streams
-// (programs) operating on a single input tape. :)
-//
-
-// This rewriter makes no modifications to the token stream. It does not ask the
-// stream to fill itself up nor does it advance the input cursor. The token
-// stream {@link TokenStream#index()} will return the same value before and
-// after any {@link #getText()} call.
-
-//
-// The rewriter only works on tokens that you have in the buffer and ignores the
-// current input cursor. If you are buffering tokens on-demand, calling
-// {@link #getText()} halfway through the input will only do rewrites for those
-// tokens in the first half of the file.
-
-//
-// Since the operations are done lazily at {@link #getText}-time, operations do
-// not screw up the token index values. That is, an insert operation at token
-// index {@code i} does not change the index values for tokens
-// {@code i}+1..n-1.
-
-//
-// Because operations never actually alter the buffer, you may always get the
-// original token stream back without undoing anything. Since the instructions
-// are queued up, you can easily simulate transactions and roll back any changes
-// if there is an error just by removing instructions. For example,
-
-//
-// CharStream input = new ANTLRFileStream("input");
-// TLexer lex = new TLexer(input);
-// CommonTokenStream tokens = new CommonTokenStream(lex);
-// T parser = new T(tokens);
-// TokenStreamRewriter rewriter = new TokenStreamRewriter(tokens);
-// parser.startRule();
-//
-
-//
-// Then in the rules, you can execute (assuming rewriter is visible):
-
-//
-// Token t,u;
-// ...
-// rewriter.insertAfter(t, "text to put after t");}
-// rewriter.insertAfter(u, "text after u");}
-// System.out.println(rewriter.getText());
-//
-
-//
-// You can also have multiple "instruction streams" and get multiple rewrites
-// from a single pass over the input. Just name the instruction streams and use
-// that name again when printing the buffer. This could be useful for generating
-// a C file and also its header file--all from the same buffer:
-
-//
-// rewriter.insertAfter("pass1", t, "text to put after t");}
-// rewriter.insertAfter("pass2", u, "text after u");}
-// System.out.println(rewriter.getText("pass1"));
-// System.out.println(rewriter.getText("pass2"));
-//
-
-//
-// If you don't use named rewrite streams, a "default" stream is used as the
-// first example shows.
-
-
-
-const(
- Default_Program_Name = "default"
- Program_Init_Size = 100
- Min_Token_Index = 0
-)
-
-// Define the rewrite operation hierarchy
-
-type RewriteOperation interface {
- // Execute the rewrite operation by possibly adding to the buffer.
- // Return the index of the next token to operate on.
- Execute(buffer *bytes.Buffer) int
- String() string
- GetInstructionIndex() int
- GetIndex() int
- GetText() string
- GetOpName() string
- GetTokens() TokenStream
- SetInstructionIndex(val int)
- SetIndex(int)
- SetText(string)
- SetOpName(string)
- SetTokens(TokenStream)
-}
-
-type BaseRewriteOperation struct {
- //Current index of rewrites list
- instruction_index int
- //Token buffer index
- index int
- //Substitution text
- text string
- //Actual operation name
- op_name string
- //Pointer to token steam
- tokens TokenStream
-}
-
-func (op *BaseRewriteOperation)GetInstructionIndex() int{
- return op.instruction_index
-}
-
-func (op *BaseRewriteOperation)GetIndex() int{
- return op.index
-}
-
-func (op *BaseRewriteOperation)GetText() string{
- return op.text
-}
-
-func (op *BaseRewriteOperation)GetOpName() string{
- return op.op_name
-}
-
-func (op *BaseRewriteOperation)GetTokens() TokenStream{
- return op.tokens
-}
-
-func (op *BaseRewriteOperation)SetInstructionIndex(val int){
- op.instruction_index = val
-}
-
-func (op *BaseRewriteOperation)SetIndex(val int) {
- op.index = val
-}
-
-func (op *BaseRewriteOperation)SetText(val string){
- op.text = val
-}
-
-func (op *BaseRewriteOperation)SetOpName(val string){
- op.op_name = val
-}
-
-func (op *BaseRewriteOperation)SetTokens(val TokenStream) {
- op.tokens = val
-}
-
-
-func (op *BaseRewriteOperation) Execute(buffer *bytes.Buffer) int{
- return op.index
-}
-
-func (op *BaseRewriteOperation) String() string {
- return fmt.Sprintf("<%s@%d:\"%s\">",
- op.op_name,
- op.tokens.Get(op.GetIndex()),
- op.text,
- )
-
-}
-
-
-type InsertBeforeOp struct {
- BaseRewriteOperation
-}
-
-func NewInsertBeforeOp(index int, text string, stream TokenStream) *InsertBeforeOp{
- return &InsertBeforeOp{BaseRewriteOperation:BaseRewriteOperation{
- index:index,
- text:text,
- op_name:"InsertBeforeOp",
- tokens:stream,
- }}
-}
-
-func (op *InsertBeforeOp) Execute(buffer *bytes.Buffer) int{
- buffer.WriteString(op.text)
- if op.tokens.Get(op.index).GetTokenType() != TokenEOF{
- buffer.WriteString(op.tokens.Get(op.index).GetText())
- }
- return op.index+1
-}
-
-func (op *InsertBeforeOp) String() string {
- return op.BaseRewriteOperation.String()
-}
-
-// Distinguish between insert after/before to do the "insert afters"
-// first and then the "insert befores" at same index. Implementation
-// of "insert after" is "insert before index+1".
-
-type InsertAfterOp struct {
- BaseRewriteOperation
-}
-
-func NewInsertAfterOp(index int, text string, stream TokenStream) *InsertAfterOp{
- return &InsertAfterOp{BaseRewriteOperation:BaseRewriteOperation{
- index:index+1,
- text:text,
- tokens:stream,
- }}
-}
-
-func (op *InsertAfterOp) Execute(buffer *bytes.Buffer) int {
- buffer.WriteString(op.text)
- if op.tokens.Get(op.index).GetTokenType() != TokenEOF{
- buffer.WriteString(op.tokens.Get(op.index).GetText())
- }
- return op.index+1
-}
-
-func (op *InsertAfterOp) String() string {
- return op.BaseRewriteOperation.String()
-}
-
-// I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
-// instructions.
-type ReplaceOp struct{
- BaseRewriteOperation
- LastIndex int
-}
-
-func NewReplaceOp(from, to int, text string, stream TokenStream)*ReplaceOp {
- return &ReplaceOp{
- BaseRewriteOperation:BaseRewriteOperation{
- index:from,
- text:text,
- op_name:"ReplaceOp",
- tokens:stream,
- },
- LastIndex:to,
- }
-}
-
-func (op *ReplaceOp)Execute(buffer *bytes.Buffer) int{
- if op.text != ""{
- buffer.WriteString(op.text)
- }
- return op.LastIndex +1
-}
-
-func (op *ReplaceOp) String() string {
- if op.text == "" {
- return fmt.Sprintf("",
- op.tokens.Get(op.index), op.tokens.Get(op.LastIndex))
- }
- return fmt.Sprintf("",
- op.tokens.Get(op.index), op.tokens.Get(op.LastIndex), op.text)
-}
-
-
-type TokenStreamRewriter struct {
- //Our source stream
- tokens TokenStream
- // You may have multiple, named streams of rewrite operations.
- // I'm calling these things "programs."
- // Maps String (name) → rewrite (List)
- programs map[string][]RewriteOperation
- last_rewrite_token_indexes map[string]int
-}
-
-func NewTokenStreamRewriter(tokens TokenStream) *TokenStreamRewriter{
- return &TokenStreamRewriter{
- tokens: tokens,
- programs: map[string][]RewriteOperation{
- Default_Program_Name:make([]RewriteOperation,0, Program_Init_Size),
- },
- last_rewrite_token_indexes: map[string]int{},
- }
-}
-
-func (tsr *TokenStreamRewriter) GetTokenStream() TokenStream{
- return tsr.tokens
-}
-
-// Rollback the instruction stream for a program so that
-// the indicated instruction (via instructionIndex) is no
-// longer in the stream. UNTESTED!
-func (tsr *TokenStreamRewriter) Rollback(program_name string, instruction_index int){
- is, ok := tsr.programs[program_name]
- if ok{
- tsr.programs[program_name] = is[Min_Token_Index:instruction_index]
- }
-}
-
-func (tsr *TokenStreamRewriter) RollbackDefault(instruction_index int){
- tsr.Rollback(Default_Program_Name, instruction_index)
-}
-//Reset the program so that no instructions exist
-func (tsr *TokenStreamRewriter) DeleteProgram(program_name string){
- tsr.Rollback(program_name, Min_Token_Index) //TODO: double test on that cause lower bound is not included
-}
-
-func (tsr *TokenStreamRewriter) DeleteProgramDefault(){
- tsr.DeleteProgram(Default_Program_Name)
-}
-
-func (tsr *TokenStreamRewriter) InsertAfter(program_name string, index int, text string){
- // to insert after, just insert before next index (even if past end)
- var op RewriteOperation = NewInsertAfterOp(index, text, tsr.tokens)
- rewrites := tsr.GetProgram(program_name)
- op.SetInstructionIndex(len(rewrites))
- tsr.AddToProgram(program_name, op)
-}
-
-func (tsr *TokenStreamRewriter) InsertAfterDefault(index int, text string){
- tsr.InsertAfter(Default_Program_Name, index, text)
-}
-
-func (tsr *TokenStreamRewriter) InsertAfterToken(program_name string, token Token, text string){
- tsr.InsertAfter(program_name, token.GetTokenIndex(), text)
-}
-
-func (tsr* TokenStreamRewriter) InsertBefore(program_name string, index int, text string){
- var op RewriteOperation = NewInsertBeforeOp(index, text, tsr.tokens)
- rewrites := tsr.GetProgram(program_name)
- op.SetInstructionIndex(len(rewrites))
- tsr.AddToProgram(program_name, op)
-}
-
-func (tsr *TokenStreamRewriter) InsertBeforeDefault(index int, text string){
- tsr.InsertBefore(Default_Program_Name, index, text)
-}
-
-func (tsr *TokenStreamRewriter) InsertBeforeToken(program_name string,token Token, text string){
- tsr.InsertBefore(program_name, token.GetTokenIndex(), text)
-}
-
-func (tsr *TokenStreamRewriter) Replace(program_name string, from, to int, text string){
- if from > to || from < 0 || to < 0 || to >= tsr.tokens.Size(){
- panic(fmt.Sprintf("replace: range invalid: %d..%d(size=%d)",
- from, to, tsr.tokens.Size()))
- }
- var op RewriteOperation = NewReplaceOp(from, to, text, tsr.tokens)
- rewrites := tsr.GetProgram(program_name)
- op.SetInstructionIndex(len(rewrites))
- tsr.AddToProgram(program_name, op)
-}
-
-func (tsr *TokenStreamRewriter)ReplaceDefault(from, to int, text string) {
- tsr.Replace(Default_Program_Name, from, to, text)
-}
-
-func (tsr *TokenStreamRewriter)ReplaceDefaultPos(index int, text string){
- tsr.ReplaceDefault(index, index, text)
-}
-
-func (tsr *TokenStreamRewriter)ReplaceToken(program_name string, from, to Token, text string){
- tsr.Replace(program_name, from.GetTokenIndex(), to.GetTokenIndex(), text)
-}
-
-func (tsr *TokenStreamRewriter)ReplaceTokenDefault(from, to Token, text string){
- tsr.ReplaceToken(Default_Program_Name, from, to, text)
-}
-
-func (tsr *TokenStreamRewriter)ReplaceTokenDefaultPos(index Token, text string){
- tsr.ReplaceTokenDefault(index, index, text)
-}
-
-func (tsr *TokenStreamRewriter)Delete(program_name string, from, to int){
- tsr.Replace(program_name, from, to, "" )
-}
-
-func (tsr *TokenStreamRewriter)DeleteDefault(from, to int){
- tsr.Delete(Default_Program_Name, from, to)
-}
-
-func (tsr *TokenStreamRewriter)DeleteDefaultPos(index int){
- tsr.DeleteDefault(index,index)
-}
-
-func (tsr *TokenStreamRewriter)DeleteToken(program_name string, from, to Token) {
- tsr.ReplaceToken(program_name, from, to, "")
-}
-
-func (tsr *TokenStreamRewriter)DeleteTokenDefault(from,to Token){
- tsr.DeleteToken(Default_Program_Name, from, to)
-}
-
-func (tsr *TokenStreamRewriter)GetLastRewriteTokenIndex(program_name string)int {
- i, ok := tsr.last_rewrite_token_indexes[program_name]
- if !ok{
- return -1
- }
- return i
-}
-
-func (tsr *TokenStreamRewriter)GetLastRewriteTokenIndexDefault()int{
- return tsr.GetLastRewriteTokenIndex(Default_Program_Name)
-}
-
-func (tsr *TokenStreamRewriter)SetLastRewriteTokenIndex(program_name string, i int){
- tsr.last_rewrite_token_indexes[program_name] = i
-}
-
-func (tsr *TokenStreamRewriter)InitializeProgram(name string)[]RewriteOperation{
- is := make([]RewriteOperation, 0, Program_Init_Size)
- tsr.programs[name] = is
- return is
-}
-
-func (tsr *TokenStreamRewriter)AddToProgram(name string, op RewriteOperation){
- is := tsr.GetProgram(name)
- is = append(is, op)
- tsr.programs[name] = is
-}
-
-func (tsr *TokenStreamRewriter)GetProgram(name string) []RewriteOperation {
- is, ok := tsr.programs[name]
- if !ok{
- is = tsr.InitializeProgram(name)
- }
- return is
-}
-// Return the text from the original tokens altered per the
-// instructions given to this rewriter.
-func (tsr *TokenStreamRewriter)GetTextDefault() string{
- return tsr.GetText(
- Default_Program_Name,
- NewInterval(0, tsr.tokens.Size()-1))
-}
-// Return the text from the original tokens altered per the
-// instructions given to this rewriter.
-func (tsr *TokenStreamRewriter)GetText(program_name string, interval *Interval) string {
- rewrites := tsr.programs[program_name]
- start := interval.Start
- stop := interval.Stop
- // ensure start/end are in range
- stop = min(stop, tsr.tokens.Size()-1)
- start = max(start,0)
- if rewrites == nil || len(rewrites) == 0{
- return tsr.tokens.GetTextFromInterval(interval) // no instructions to execute
- }
- buf := bytes.Buffer{}
- // First, optimize instruction stream
- indexToOp := reduceToSingleOperationPerIndex(rewrites)
- // Walk buffer, executing instructions and emitting tokens
- for i:=start; i<=stop && i= tsr.tokens.Size()-1 {buf.WriteString(op.GetText())}
- }
- }
- return buf.String()
-}
-
-// We need to combine operations and report invalid operations (like
-// overlapping replaces that are not completed nested). Inserts to
-// same index need to be combined etc... Here are the cases:
-//
-// I.i.u I.j.v leave alone, nonoverlapping
-// I.i.u I.i.v combine: Iivu
-//
-// R.i-j.u R.x-y.v | i-j in x-y delete first R
-// R.i-j.u R.i-j.v delete first R
-// R.i-j.u R.x-y.v | x-y in i-j ERROR
-// R.i-j.u R.x-y.v | boundaries overlap ERROR
-//
-// Delete special case of replace (text==null):
-// D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
-//
-// I.i.u R.x-y.v | i in (x+1)-y delete I (since insert before
-// we're not deleting i)
-// I.i.u R.x-y.v | i not in (x+1)-y leave alone, nonoverlapping
-// R.x-y.v I.i.u | i in x-y ERROR
-// R.x-y.v I.x.u R.x-y.uv (combine, delete I)
-// R.x-y.v I.i.u | i not in x-y leave alone, nonoverlapping
-//
-// I.i.u = insert u before op @ index i
-// R.x-y.u = replace x-y indexed tokens with u
-//
-// First we need to examine replaces. For any replace op:
-//
-// 1. wipe out any insertions before op within that range.
-// 2. Drop any replace op before that is contained completely within
-// that range.
-// 3. Throw exception upon boundary overlap with any previous replace.
-//
-// Then we can deal with inserts:
-//
-// 1. for any inserts to same index, combine even if not adjacent.
-// 2. for any prior replace with same left boundary, combine this
-// insert with replace and delete this replace.
-// 3. throw exception if index in same range as previous replace
-//
-// Don't actually delete; make op null in list. Easier to walk list.
-// Later we can throw as we add to index → op map.
-//
-// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
-// inserted stuff would be before the replace range. But, if you
-// add tokens in front of a method body '{' and then delete the method
-// body, I think the stuff before the '{' you added should disappear too.
-//
-// Return a map from token index to operation.
-//
-func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]RewriteOperation{
- // WALK REPLACES
- for i:=0; i < len(rewrites); i++{
- op := rewrites[i]
- if op == nil{continue}
- rop, ok := op.(*ReplaceOp)
- if !ok{continue}
- // Wipe prior inserts within range
- for j:=0; j rop.index && iop.index <=rop.LastIndex{
- // delete insert as it's a no-op.
- rewrites[iop.instruction_index] = nil
- }
- }
- }
- // Drop any prior replaces contained within
- for j:=0; j=rop.index && prevop.LastIndex <= rop.LastIndex{
- // delete replace as it's a no-op.
- rewrites[prevop.instruction_index] = nil
- continue
- }
- // throw exception unless disjoint or identical
- disjoint := prevop.LastIndex < rop.index || prevop.index > rop.LastIndex
- // Delete special case of replace (text==null):
- // D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
- if prevop.text == "" && rop.text == "" && !disjoint{
- rewrites[prevop.instruction_index] = nil
- rop.index = min(prevop.index, rop.index)
- rop.LastIndex = max(prevop.LastIndex, rop.LastIndex)
- println("new rop" + rop.String()) //TODO: remove console write, taken from Java version
- }else if !disjoint{
- panic("replace op boundaries of " + rop.String() + " overlap with previous " + prevop.String())
- }
- }
- }
- }
- // WALK INSERTS
- for i:=0; i < len(rewrites); i++ {
- op := rewrites[i]
- if op == nil{continue}
- //hack to replicate inheritance in composition
- _, iok := rewrites[i].(*InsertBeforeOp)
- _, aok := rewrites[i].(*InsertAfterOp)
- if !iok && !aok{continue}
- iop := rewrites[i]
- // combine current insert with prior if any at same index
- // deviating a bit from TokenStreamRewriter.java - hard to incorporate inheritance logic
- for j:=0; j= rop.index && iop.GetIndex() <= rop.LastIndex{
- panic("insert op "+iop.String()+" within boundaries of previous "+rop.String())
- }
- }
- }
- }
- m := map[int]RewriteOperation{}
- for i:=0; i < len(rewrites); i++{
- op := rewrites[i]
- if op == nil {continue}
- if _, ok := m[op.GetIndex()]; ok{
- panic("should only be one op per index")
- }
- m[op.GetIndex()] = op
- }
- return m
-}
-
-
-/*
- Quick fixing Go lack of overloads
- */
-
-func max(a,b int)int{
- if a>b{
- return a
- }else {
- return b
- }
-}
-func min(a,b int)int{
- if a b {
- return a
- }
- return b
-}
-
-// A simple integer stack
-
-type IntStack []int
-
-var ErrEmptyStack = errors.New("Stack is empty")
-
-func (s *IntStack) Pop() (int, error) {
- l := len(*s) - 1
- if l < 0 {
- return 0, ErrEmptyStack
- }
- v := (*s)[l]
- *s = (*s)[0:l]
- return v, nil
-}
-
-func (s *IntStack) Push(e int) {
- *s = append(*s, e)
-}
-
-func standardEqualsFunction(a interface{}, b interface{}) bool {
-
- ac, oka := a.(comparable)
- bc, okb := b.(comparable)
-
- if !oka || !okb {
- panic("Not Comparable")
- }
-
- return ac.equals(bc)
-}
-
-func standardHashFunction(a interface{}) int {
- if h, ok := a.(hasher); ok {
- return h.hash()
- }
-
- panic("Not Hasher")
-}
-
-type hasher interface {
- hash() int
-}
-
-const bitsPerWord = 64
-
-func indexForBit(bit int) int {
- return bit / bitsPerWord
-}
-
-func wordForBit(data []uint64, bit int) uint64 {
- idx := indexForBit(bit)
- if idx >= len(data) {
- return 0
- }
- return data[idx]
-}
-
-func maskForBit(bit int) uint64 {
- return uint64(1) << (bit % bitsPerWord)
-}
-
-func wordsNeeded(bit int) int {
- return indexForBit(bit) + 1
-}
-
-type BitSet struct {
- data []uint64
-}
-
-func NewBitSet() *BitSet {
- return &BitSet{}
-}
-
-func (b *BitSet) add(value int) {
- idx := indexForBit(value)
- if idx >= len(b.data) {
- size := wordsNeeded(value)
- data := make([]uint64, size)
- copy(data, b.data)
- b.data = data
- }
- b.data[idx] |= maskForBit(value)
-}
-
-func (b *BitSet) clear(index int) {
- idx := indexForBit(index)
- if idx >= len(b.data) {
- return
- }
- b.data[idx] &= ^maskForBit(index)
-}
-
-func (b *BitSet) or(set *BitSet) {
- // Get min size necessary to represent the bits in both sets.
- bLen := b.minLen()
- setLen := set.minLen()
- maxLen := intMax(bLen, setLen)
- if maxLen > len(b.data) {
- // Increase the size of len(b.data) to repesent the bits in both sets.
- data := make([]uint64, maxLen)
- copy(data, b.data)
- b.data = data
- }
- // len(b.data) is at least setLen.
- for i := 0; i < setLen; i++ {
- b.data[i] |= set.data[i]
- }
-}
-
-func (b *BitSet) remove(value int) {
- b.clear(value)
-}
-
-func (b *BitSet) contains(value int) bool {
- idx := indexForBit(value)
- if idx >= len(b.data) {
- return false
- }
- return (b.data[idx] & maskForBit(value)) != 0
-}
-
-func (b *BitSet) minValue() int {
- for i, v := range b.data {
- if v == 0 {
- continue
- }
- return i*bitsPerWord + bits.TrailingZeros64(v)
- }
- return 2147483647
-}
-
-func (b *BitSet) equals(other interface{}) bool {
- otherBitSet, ok := other.(*BitSet)
- if !ok {
- return false
- }
-
- if b == otherBitSet {
- return true
- }
-
- // We only compare set bits, so we cannot rely on the two slices having the same size. Its
- // possible for two BitSets to have different slice lengths but the same set bits. So we only
- // compare the relavent words and ignore the trailing zeros.
- bLen := b.minLen()
- otherLen := otherBitSet.minLen()
-
- if bLen != otherLen {
- return false
- }
-
- for i := 0; i < bLen; i++ {
- if b.data[i] != otherBitSet.data[i] {
- return false
- }
- }
-
- return true
-}
-
-func (b *BitSet) minLen() int {
- for i := len(b.data); i > 0; i-- {
- if b.data[i-1] != 0 {
- return i
- }
- }
- return 0
-}
-
-func (b *BitSet) length() int {
- cnt := 0
- for _, val := range b.data {
- cnt += bits.OnesCount64(val)
- }
- return cnt
-}
-
-func (b *BitSet) String() string {
- vals := make([]string, 0, b.length())
-
- for i, v := range b.data {
- for v != 0 {
- n := bits.TrailingZeros64(v)
- vals = append(vals, strconv.Itoa(i*bitsPerWord+n))
- v &= ^(uint64(1) << n)
- }
- }
-
- return "{" + strings.Join(vals, ", ") + "}"
-}
-
-type AltDict struct {
- data map[string]interface{}
-}
-
-func NewAltDict() *AltDict {
- d := new(AltDict)
- d.data = make(map[string]interface{})
- return d
-}
-
-func (a *AltDict) Get(key string) interface{} {
- key = "k-" + key
- return a.data[key]
-}
-
-func (a *AltDict) put(key string, value interface{}) {
- key = "k-" + key
- a.data[key] = value
-}
-
-func (a *AltDict) values() []interface{} {
- vs := make([]interface{}, len(a.data))
- i := 0
- for _, v := range a.data {
- vs[i] = v
- i++
- }
- return vs
-}
-
-type DoubleDict struct {
- data map[int]map[int]interface{}
-}
-
-func NewDoubleDict() *DoubleDict {
- dd := new(DoubleDict)
- dd.data = make(map[int]map[int]interface{})
- return dd
-}
-
-func (d *DoubleDict) Get(a, b int) interface{} {
- data := d.data[a]
-
- if data == nil {
- return nil
- }
-
- return data[b]
-}
-
-func (d *DoubleDict) set(a, b int, o interface{}) {
- data := d.data[a]
-
- if data == nil {
- data = make(map[int]interface{})
- d.data[a] = data
- }
-
- data[b] = o
-}
-
-func EscapeWhitespace(s string, escapeSpaces bool) string {
-
- s = strings.Replace(s, "\t", "\\t", -1)
- s = strings.Replace(s, "\n", "\\n", -1)
- s = strings.Replace(s, "\r", "\\r", -1)
- if escapeSpaces {
- s = strings.Replace(s, " ", "\u00B7", -1)
- }
- return s
-}
-
-func TerminalNodeToStringArray(sa []TerminalNode) []string {
- st := make([]string, len(sa))
-
- for i, s := range sa {
- st[i] = fmt.Sprintf("%v", s)
- }
-
- return st
-}
-
-func PrintArrayJavaStyle(sa []string) string {
- var buffer bytes.Buffer
-
- buffer.WriteString("[")
-
- for i, s := range sa {
- buffer.WriteString(s)
- if i != len(sa)-1 {
- buffer.WriteString(", ")
- }
- }
-
- buffer.WriteString("]")
-
- return buffer.String()
-}
-
-// murmur hash
-func murmurInit(seed int) int {
- return seed
-}
-
-func murmurUpdate(h int, value int) int {
- const c1 uint32 = 0xCC9E2D51
- const c2 uint32 = 0x1B873593
- const r1 uint32 = 15
- const r2 uint32 = 13
- const m uint32 = 5
- const n uint32 = 0xE6546B64
-
- k := uint32(value)
- k *= c1
- k = (k << r1) | (k >> (32 - r1))
- k *= c2
-
- hash := uint32(h) ^ k
- hash = (hash << r2) | (hash >> (32 - r2))
- hash = hash*m + n
- return int(hash)
-}
-
-func murmurFinish(h int, numberOfWords int) int {
- var hash = uint32(h)
- hash ^= uint32(numberOfWords) << 2
- hash ^= hash >> 16
- hash *= 0x85ebca6b
- hash ^= hash >> 13
- hash *= 0xc2b2ae35
- hash ^= hash >> 16
-
- return int(hash)
-}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/LICENSE b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/LICENSE
similarity index 100%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/LICENSE
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/LICENSE
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go
new file mode 100644
index 0000000000..ab51212676
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/antlrdoc.go
@@ -0,0 +1,68 @@
+/*
+Package antlr implements the Go version of the ANTLR 4 runtime.
+
+# The ANTLR Tool
+
+ANTLR (ANother Tool for Language Recognition) is a powerful parser generator for reading, processing, executing,
+or translating structured text or binary files. It's widely used to build languages, tools, and frameworks.
+From a grammar, ANTLR generates a parser that can build parse trees and also generates a listener interface
+(or visitor) that makes it easy to respond to the recognition of phrases of interest.
+
+# Code Generation
+
+ANTLR supports the generation of code in a number of [target languages], and the generated code is supported by a
+runtime library, written specifically to support the generated code in the target language. This library is the
+runtime for the Go target.
+
+To generate code for the go target, it is generally recommended to place the source grammar files in a package of
+their own, and use the `.sh` script method of generating code, using the go generate directive. In that same directory
+it is usual, though not required, to place the antlr tool that should be used to generate the code. That does mean
+that the antlr tool JAR file will be checked in to your source code control though, so you are free to use any other
+way of specifying the version of the ANTLR tool to use, such as aliasing in `.zshrc` or equivalent, or a profile in
+your IDE, or configuration in your CI system.
+
+Here is a general template for an ANTLR based recognizer in Go:
+
+ .
+ ├── myproject
+ ├── parser
+ │ ├── mygrammar.g4
+ │ ├── antlr-4.12.0-complete.jar
+ │ ├── error_listeners.go
+ │ ├── generate.go
+ │ ├── generate.sh
+ ├── go.mod
+ ├── go.sum
+ ├── main.go
+ └── main_test.go
+
+Make sure that the package statement in your grammar file(s) reflects the go package they exist in.
+The generate.go file then looks like this:
+
+ package parser
+
+ //go:generate ./generate.sh
+
+And the generate.sh file will look similar to this:
+
+ #!/bin/sh
+
+ alias antlr4='java -Xmx500M -cp "./antlr4-4.12.0-complete.jar:$CLASSPATH" org.antlr.v4.Tool'
+ antlr4 -Dlanguage=Go -no-visitor -package parser *.g4
+
+depending on whether you want visitors or listeners or any other ANTLR options.
+
+From the command line at the root of your package “myproject” you can then simply issue the command:
+
+ go generate ./...
+
+# Copyright Notice
+
+Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+
+Use of this file is governed by the BSD 3-clause license, which can be found in the [LICENSE.txt] file in the project root.
+
+[target languages]: https://github.com/antlr/antlr4/tree/master/runtime
+[LICENSE.txt]: https://github.com/antlr/antlr4/blob/master/LICENSE.txt
+*/
+package antlr
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go
new file mode 100644
index 0000000000..98010d2e6e
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn.go
@@ -0,0 +1,176 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import "sync"
+
+// ATNInvalidAltNumber is used to represent an ALT number that has yet to be calculated or
+// which is invalid for a particular struct such as [*antlr.BaseRuleContext]
+var ATNInvalidAltNumber int
+
+// ATN represents an “[Augmented Transition Network]”, though general in ANTLR the term
+// “Augmented Recursive Transition Network” though there are some descriptions of “[Recursive Transition Network]”
+// in existence.
+//
+// ATNs represent the main networks in the system and are serialized by the code generator and support [ALL(*)].
+//
+// [Augmented Transition Network]: https://en.wikipedia.org/wiki/Augmented_transition_network
+// [ALL(*)]: https://www.antlr.org/papers/allstar-techreport.pdf
+// [Recursive Transition Network]: https://en.wikipedia.org/wiki/Recursive_transition_network
+type ATN struct {
+ // DecisionToState is the decision points for all rules, subrules, optional
+ // blocks, ()+, ()*, etc. Each subrule/rule is a decision point, and we must track them so we
+ // can go back later and build DFA predictors for them. This includes
+ // all the rules, subrules, optional blocks, ()+, ()* etc...
+ DecisionToState []DecisionState
+
+ // grammarType is the ATN type and is used for deserializing ATNs from strings.
+ grammarType int
+
+ // lexerActions is referenced by action transitions in the ATN for lexer ATNs.
+ lexerActions []LexerAction
+
+ // maxTokenType is the maximum value for any symbol recognized by a transition in the ATN.
+ maxTokenType int
+
+ modeNameToStartState map[string]*TokensStartState
+
+ modeToStartState []*TokensStartState
+
+ // ruleToStartState maps from rule index to starting state number.
+ ruleToStartState []*RuleStartState
+
+ // ruleToStopState maps from rule index to stop state number.
+ ruleToStopState []*RuleStopState
+
+ // ruleToTokenType maps the rule index to the resulting token type for lexer
+ // ATNs. For parser ATNs, it maps the rule index to the generated bypass token
+ // type if ATNDeserializationOptions.isGenerateRuleBypassTransitions was
+ // specified, and otherwise is nil.
+ ruleToTokenType []int
+
+ states []ATNState
+
+ mu sync.Mutex
+ stateMu sync.RWMutex
+ edgeMu sync.RWMutex
+}
+
+// NewATN returns a new ATN struct representing the given grammarType and is used
+// for runtime deserialization of ATNs from the code generated by the ANTLR tool
+func NewATN(grammarType int, maxTokenType int) *ATN {
+ return &ATN{
+ grammarType: grammarType,
+ maxTokenType: maxTokenType,
+ modeNameToStartState: make(map[string]*TokensStartState),
+ }
+}
+
+// NextTokensInContext computes and returns the set of valid tokens that can occur starting
+// in state s. If ctx is nil, the set of tokens will not include what can follow
+// the rule surrounding s. In other words, the set will be restricted to tokens
+// reachable staying within the rule of s.
+func (a *ATN) NextTokensInContext(s ATNState, ctx RuleContext) *IntervalSet {
+ return NewLL1Analyzer(a).Look(s, nil, ctx)
+}
+
+// NextTokensNoContext computes and returns the set of valid tokens that can occur starting
+// in state s and staying in same rule. [antlr.Token.EPSILON] is in set if we reach end of
+// rule.
+func (a *ATN) NextTokensNoContext(s ATNState) *IntervalSet {
+ a.mu.Lock()
+ defer a.mu.Unlock()
+ iset := s.GetNextTokenWithinRule()
+ if iset == nil {
+ iset = a.NextTokensInContext(s, nil)
+ iset.readOnly = true
+ s.SetNextTokenWithinRule(iset)
+ }
+ return iset
+}
+
+// NextTokens computes and returns the set of valid tokens starting in state s, by
+// calling either [NextTokensNoContext] (ctx == nil) or [NextTokensInContext] (ctx != nil).
+func (a *ATN) NextTokens(s ATNState, ctx RuleContext) *IntervalSet {
+ if ctx == nil {
+ return a.NextTokensNoContext(s)
+ }
+
+ return a.NextTokensInContext(s, ctx)
+}
+
+func (a *ATN) addState(state ATNState) {
+ if state != nil {
+ state.SetATN(a)
+ state.SetStateNumber(len(a.states))
+ }
+
+ a.states = append(a.states, state)
+}
+
+func (a *ATN) removeState(state ATNState) {
+ a.states[state.GetStateNumber()] = nil // Just free the memory; don't shift states in the slice
+}
+
+func (a *ATN) defineDecisionState(s DecisionState) int {
+ a.DecisionToState = append(a.DecisionToState, s)
+ s.setDecision(len(a.DecisionToState) - 1)
+
+ return s.getDecision()
+}
+
+func (a *ATN) getDecisionState(decision int) DecisionState {
+ if len(a.DecisionToState) == 0 {
+ return nil
+ }
+
+ return a.DecisionToState[decision]
+}
+
+// getExpectedTokens computes the set of input symbols which could follow ATN
+// state number stateNumber in the specified full parse context ctx and returns
+// the set of potentially valid input symbols which could follow the specified
+// state in the specified context. This method considers the complete parser
+// context, but does not evaluate semantic predicates (i.e. all predicates
+// encountered during the calculation are assumed true). If a path in the ATN
+// exists from the starting state to the RuleStopState of the outermost context
+// without Matching any symbols, Token.EOF is added to the returned set.
+//
+// A nil ctx defaults to ParserRuleContext.EMPTY.
+//
+// It panics if the ATN does not contain state stateNumber.
+func (a *ATN) getExpectedTokens(stateNumber int, ctx RuleContext) *IntervalSet {
+ if stateNumber < 0 || stateNumber >= len(a.states) {
+ panic("Invalid state number.")
+ }
+
+ s := a.states[stateNumber]
+ following := a.NextTokens(s, nil)
+
+ if !following.contains(TokenEpsilon) {
+ return following
+ }
+
+ expected := NewIntervalSet()
+
+ expected.addSet(following)
+ expected.removeOne(TokenEpsilon)
+
+ for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
+ invokingState := a.states[ctx.GetInvokingState()]
+ rt := invokingState.GetTransitions()[0]
+
+ following = a.NextTokens(rt.(*RuleTransition).followState, nil)
+ expected.addSet(following)
+ expected.removeOne(TokenEpsilon)
+ ctx = ctx.GetParent().(RuleContext)
+ }
+
+ if following.contains(TokenEpsilon) {
+ expected.addOne(TokenEOF)
+ }
+
+ return expected
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go
similarity index 84%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go
index 97ba417f74..7619fa172e 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -8,19 +8,14 @@ import (
"fmt"
)
-type comparable interface {
- equals(other interface{}) bool
-}
-
// ATNConfig is a tuple: (ATN state, predicted alt, syntactic, semantic
// context). The syntactic context is a graph-structured stack node whose
// path(s) to the root is the rule invocation(s) chain used to arrive at the
// state. The semantic context is the tree of semantic predicates encountered
// before reaching an ATN state.
type ATNConfig interface {
- comparable
-
- hash() int
+ Equals(o Collectable[ATNConfig]) bool
+ Hash() int
GetState() ATNState
GetAlt() int
@@ -47,7 +42,7 @@ type BaseATNConfig struct {
reachesIntoOuterContext int
}
-func NewBaseATNConfig7(old *BaseATNConfig) *BaseATNConfig { // TODO: Dup
+func NewBaseATNConfig7(old *BaseATNConfig) ATNConfig { // TODO: Dup
return &BaseATNConfig{
state: old.state,
alt: old.alt,
@@ -135,11 +130,16 @@ func (b *BaseATNConfig) SetReachesIntoOuterContext(v int) {
b.reachesIntoOuterContext = v
}
+// Equals is the default comparison function for an ATNConfig when no specialist implementation is required
+// for a collection.
+//
// An ATN configuration is equal to another if both have the same state, they
// predict the same alternative, and syntactic/semantic contexts are the same.
-func (b *BaseATNConfig) equals(o interface{}) bool {
+func (b *BaseATNConfig) Equals(o Collectable[ATNConfig]) bool {
if b == o {
return true
+ } else if o == nil {
+ return false
}
var other, ok = o.(*BaseATNConfig)
@@ -153,30 +153,32 @@ func (b *BaseATNConfig) equals(o interface{}) bool {
if b.context == nil {
equal = other.context == nil
} else {
- equal = b.context.equals(other.context)
+ equal = b.context.Equals(other.context)
}
var (
nums = b.state.GetStateNumber() == other.state.GetStateNumber()
alts = b.alt == other.alt
- cons = b.semanticContext.equals(other.semanticContext)
+ cons = b.semanticContext.Equals(other.semanticContext)
sups = b.precedenceFilterSuppressed == other.precedenceFilterSuppressed
)
return nums && alts && cons && sups && equal
}
-func (b *BaseATNConfig) hash() int {
+// Hash is the default hash function for BaseATNConfig, when no specialist hash function
+// is required for a collection
+func (b *BaseATNConfig) Hash() int {
var c int
if b.context != nil {
- c = b.context.hash()
+ c = b.context.Hash()
}
h := murmurInit(7)
h = murmurUpdate(h, b.state.GetStateNumber())
h = murmurUpdate(h, b.alt)
h = murmurUpdate(h, c)
- h = murmurUpdate(h, b.semanticContext.hash())
+ h = murmurUpdate(h, b.semanticContext.Hash())
return murmurFinish(h, 4)
}
@@ -243,7 +245,9 @@ func NewLexerATNConfig1(state ATNState, alt int, context PredictionContext) *Lex
return &LexerATNConfig{BaseATNConfig: NewBaseATNConfig5(state, alt, context, SemanticContextNone)}
}
-func (l *LexerATNConfig) hash() int {
+// Hash is the default hash function for LexerATNConfig objects, it can be used directly or via
+// the default comparator [ObjEqComparator].
+func (l *LexerATNConfig) Hash() int {
var f int
if l.passedThroughNonGreedyDecision {
f = 1
@@ -253,15 +257,20 @@ func (l *LexerATNConfig) hash() int {
h := murmurInit(7)
h = murmurUpdate(h, l.state.GetStateNumber())
h = murmurUpdate(h, l.alt)
- h = murmurUpdate(h, l.context.hash())
- h = murmurUpdate(h, l.semanticContext.hash())
+ h = murmurUpdate(h, l.context.Hash())
+ h = murmurUpdate(h, l.semanticContext.Hash())
h = murmurUpdate(h, f)
- h = murmurUpdate(h, l.lexerActionExecutor.hash())
+ h = murmurUpdate(h, l.lexerActionExecutor.Hash())
h = murmurFinish(h, 6)
return h
}
-func (l *LexerATNConfig) equals(other interface{}) bool {
+// Equals is the default comparison function for LexerATNConfig objects, it can be used directly or via
+// the default comparator [ObjEqComparator].
+func (l *LexerATNConfig) Equals(other Collectable[ATNConfig]) bool {
+ if l == other {
+ return true
+ }
var othert, ok = other.(*LexerATNConfig)
if l == other {
@@ -275,7 +284,7 @@ func (l *LexerATNConfig) equals(other interface{}) bool {
var b bool
if l.lexerActionExecutor != nil {
- b = !l.lexerActionExecutor.equals(othert.lexerActionExecutor)
+ b = !l.lexerActionExecutor.Equals(othert.lexerActionExecutor)
} else {
b = othert.lexerActionExecutor != nil
}
@@ -284,10 +293,9 @@ func (l *LexerATNConfig) equals(other interface{}) bool {
return false
}
- return l.BaseATNConfig.equals(othert.BaseATNConfig)
+ return l.BaseATNConfig.Equals(othert.BaseATNConfig)
}
-
func checkNonGreedyDecision(source *LexerATNConfig, target ATNState) bool {
var ds, ok = target.(DecisionState)
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go
similarity index 81%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go
index 49ad4a7197..43e9b33f3b 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_config_set.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_config_set.go
@@ -1,24 +1,25 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
package antlr
-import "fmt"
+import (
+ "fmt"
+)
type ATNConfigSet interface {
- hash() int
+ Hash() int
+ Equals(o Collectable[ATNConfig]) bool
Add(ATNConfig, *DoubleDict) bool
AddAll([]ATNConfig) bool
- GetStates() Set
+ GetStates() *JStore[ATNState, Comparator[ATNState]]
GetPredicates() []SemanticContext
GetItems() []ATNConfig
OptimizeConfigs(interpreter *BaseATNSimulator)
- Equals(other interface{}) bool
-
Length() int
IsEmpty() bool
Contains(ATNConfig) bool
@@ -57,7 +58,7 @@ type BaseATNConfigSet struct {
// effectively doubles the number of objects associated with ATNConfigs. All
// keys are hashed by (s, i, _, pi), not including the context. Wiped out when
// read-only because a set becomes a DFA state.
- configLookup Set
+ configLookup *JStore[ATNConfig, Comparator[ATNConfig]]
// configs is the added elements.
configs []ATNConfig
@@ -83,7 +84,7 @@ type BaseATNConfigSet struct {
// readOnly is whether it is read-only. Do not
// allow any code to manipulate the set if true because DFA states will point at
- // sets and those must not change. It not protect other fields; conflictingAlts
+ // sets and those must not change. It not, protect other fields; conflictingAlts
// in particular, which is assigned after readOnly.
readOnly bool
@@ -104,7 +105,7 @@ func (b *BaseATNConfigSet) Alts() *BitSet {
func NewBaseATNConfigSet(fullCtx bool) *BaseATNConfigSet {
return &BaseATNConfigSet{
cachedHash: -1,
- configLookup: newArray2DHashSetWithCap(hashATNConfig, equalATNConfigs, 16, 2),
+ configLookup: NewJStore[ATNConfig, Comparator[ATNConfig]](aConfCompInst),
fullCtx: fullCtx,
}
}
@@ -126,9 +127,11 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool {
b.dipsIntoOuterContext = true
}
- existing := b.configLookup.Add(config).(ATNConfig)
+ existing, present := b.configLookup.Put(config)
- if existing == config {
+ // The config was not already in the set
+ //
+ if !present {
b.cachedHash = -1
b.configs = append(b.configs, config) // Track order here
return true
@@ -154,11 +157,14 @@ func (b *BaseATNConfigSet) Add(config ATNConfig, mergeCache *DoubleDict) bool {
return true
}
-func (b *BaseATNConfigSet) GetStates() Set {
- states := newArray2DHashSet(nil, nil)
+func (b *BaseATNConfigSet) GetStates() *JStore[ATNState, Comparator[ATNState]] {
+
+ // states uses the standard comparator provided by the ATNState instance
+ //
+ states := NewJStore[ATNState, Comparator[ATNState]](aStateEqInst)
for i := 0; i < len(b.configs); i++ {
- states.Add(b.configs[i].GetState())
+ states.Put(b.configs[i].GetState())
}
return states
@@ -214,7 +220,34 @@ func (b *BaseATNConfigSet) AddAll(coll []ATNConfig) bool {
return false
}
-func (b *BaseATNConfigSet) Equals(other interface{}) bool {
+// Compare is a hack function just to verify that adding DFAstares to the known
+// set works, so long as comparison of ATNConfigSet s works. For that to work, we
+// need to make sure that the set of ATNConfigs in two sets are equivalent. We can't
+// know the order, so we do this inefficient hack. If this proves the point, then
+// we can change the config set to a better structure.
+func (b *BaseATNConfigSet) Compare(bs *BaseATNConfigSet) bool {
+ if len(b.configs) != len(bs.configs) {
+ return false
+ }
+
+ for _, c := range b.configs {
+ found := false
+ for _, c2 := range bs.configs {
+ if c.Equals(c2) {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ return false
+ }
+
+ }
+ return true
+}
+
+func (b *BaseATNConfigSet) Equals(other Collectable[ATNConfig]) bool {
if b == other {
return true
} else if _, ok := other.(*BaseATNConfigSet); !ok {
@@ -224,15 +257,15 @@ func (b *BaseATNConfigSet) Equals(other interface{}) bool {
other2 := other.(*BaseATNConfigSet)
return b.configs != nil &&
- // TODO: b.configs.equals(other2.configs) && // TODO: Is b necessary?
b.fullCtx == other2.fullCtx &&
b.uniqueAlt == other2.uniqueAlt &&
b.conflictingAlts == other2.conflictingAlts &&
b.hasSemanticContext == other2.hasSemanticContext &&
- b.dipsIntoOuterContext == other2.dipsIntoOuterContext
+ b.dipsIntoOuterContext == other2.dipsIntoOuterContext &&
+ b.Compare(other2)
}
-func (b *BaseATNConfigSet) hash() int {
+func (b *BaseATNConfigSet) Hash() int {
if b.readOnly {
if b.cachedHash == -1 {
b.cachedHash = b.hashCodeConfigs()
@@ -247,7 +280,7 @@ func (b *BaseATNConfigSet) hash() int {
func (b *BaseATNConfigSet) hashCodeConfigs() int {
h := 1
for _, config := range b.configs {
- h = 31*h + config.hash()
+ h = 31*h + config.Hash()
}
return h
}
@@ -283,7 +316,7 @@ func (b *BaseATNConfigSet) Clear() {
b.configs = make([]ATNConfig, 0)
b.cachedHash = -1
- b.configLookup = newArray2DHashSet(nil, equalATNConfigs)
+ b.configLookup = NewJStore[ATNConfig, Comparator[ATNConfig]](atnConfCompInst)
}
func (b *BaseATNConfigSet) FullContext() bool {
@@ -365,7 +398,8 @@ type OrderedATNConfigSet struct {
func NewOrderedATNConfigSet() *OrderedATNConfigSet {
b := NewBaseATNConfigSet(false)
- b.configLookup = newArray2DHashSet(nil, nil)
+ // This set uses the standard Hash() and Equals() from ATNConfig
+ b.configLookup = NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst)
return &OrderedATNConfigSet{BaseATNConfigSet: b}
}
@@ -375,7 +409,7 @@ func hashATNConfig(i interface{}) int {
hash := 7
hash = 31*hash + o.GetState().GetStateNumber()
hash = 31*hash + o.GetAlt()
- hash = 31*hash + o.GetSemanticContext().hash()
+ hash = 31*hash + o.GetSemanticContext().Hash()
return hash
}
@@ -403,5 +437,5 @@ func equalATNConfigs(a, b interface{}) bool {
return false
}
- return ai.GetSemanticContext().equals(bi.GetSemanticContext())
+ return ai.GetSemanticContext().Equals(bi.GetSemanticContext())
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go
similarity index 96%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go
index cb8eafb0b2..3c975ec7bf 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserialization_options.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserialization_options.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go
similarity index 99%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go
index aea9bbfa93..3888856b4b 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_deserializer.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_deserializer.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go
similarity index 94%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go
index d5454d6d5d..41529115fa 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_simulator.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_simulator.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go
similarity index 97%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go
index 3835bb2e93..1f2a56bc31 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_state.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_state.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -49,7 +49,8 @@ type ATNState interface {
AddTransition(Transition, int)
String() string
- hash() int
+ Hash() int
+ Equals(Collectable[ATNState]) bool
}
type BaseATNState struct {
@@ -123,7 +124,7 @@ func (as *BaseATNState) SetNextTokenWithinRule(v *IntervalSet) {
as.NextTokenWithinRule = v
}
-func (as *BaseATNState) hash() int {
+func (as *BaseATNState) Hash() int {
return as.stateNumber
}
@@ -131,7 +132,7 @@ func (as *BaseATNState) String() string {
return strconv.Itoa(as.stateNumber)
}
-func (as *BaseATNState) equals(other interface{}) bool {
+func (as *BaseATNState) Equals(other Collectable[ATNState]) bool {
if ot, ok := other.(ATNState); ok {
return as.stateNumber == ot.GetStateNumber()
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go
similarity index 79%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go
index a7b48976b3..3a515a145f 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/atn_type.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/atn_type.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go
similarity index 82%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go
index 70c1207f7f..c33f0adb5e 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/char_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/char_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go
similarity index 96%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go
index 330ff8f31f..1bb0314ea0 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_factory.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_factory.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go
index c90e9b8904..c6c9485a20 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/common_token_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/common_token_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -331,10 +331,12 @@ func (c *CommonTokenStream) GetTextFromRuleContext(interval RuleContext) string
func (c *CommonTokenStream) GetTextFromInterval(interval *Interval) string {
c.lazyInit()
- c.Fill()
if interval == nil {
+ c.Fill()
interval = NewInterval(0, len(c.tokens)-1)
+ } else {
+ c.Sync(interval.Stop)
}
start := interval.Start
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go
new file mode 100644
index 0000000000..9ea3200536
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/comparators.go
@@ -0,0 +1,147 @@
+package antlr
+
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+// This file contains all the implementations of custom comparators used for generic collections when the
+// Hash() and Equals() funcs supplied by the struct objects themselves need to be overridden. Normally, we would
+// put the comparators in the source file for the struct themselves, but given the organization of this code is
+// sorta kinda based upon the Java code, I found it confusing trying to find out which comparator was where and used by
+// which instantiation of a collection. For instance, an Array2DHashSet in the Java source, when used with ATNConfig
+// collections requires three different comparators depending on what the collection is being used for. Collecting - pun intended -
+// all the comparators here, makes it much easier to see which implementation of hash and equals is used by which collection.
+// It also makes it easy to verify that the Hash() and Equals() functions marry up with the Java implementations.
+
+// ObjEqComparator is the equivalent of the Java ObjectEqualityComparator, which is the default instance of
+// Equality comparator. We do not have inheritance in Go, only interfaces, so we use generics to enforce some
+// type safety and avoid having to implement this for every type that we want to perform comparison on.
+//
+// This comparator works by using the standard Hash() and Equals() methods of the type T that is being compared. Which
+// allows us to use it in any collection instance that does nto require a special hash or equals implementation.
+type ObjEqComparator[T Collectable[T]] struct{}
+
+var (
+ aStateEqInst = &ObjEqComparator[ATNState]{}
+ aConfEqInst = &ObjEqComparator[ATNConfig]{}
+ aConfCompInst = &ATNConfigComparator[ATNConfig]{}
+ atnConfCompInst = &BaseATNConfigComparator[ATNConfig]{}
+ dfaStateEqInst = &ObjEqComparator[*DFAState]{}
+ semctxEqInst = &ObjEqComparator[SemanticContext]{}
+ atnAltCfgEqInst = &ATNAltConfigComparator[ATNConfig]{}
+)
+
+// Equals2 delegates to the Equals() method of type T
+func (c *ObjEqComparator[T]) Equals2(o1, o2 T) bool {
+ return o1.Equals(o2)
+}
+
+// Hash1 delegates to the Hash() method of type T
+func (c *ObjEqComparator[T]) Hash1(o T) int {
+
+ return o.Hash()
+}
+
+type SemCComparator[T Collectable[T]] struct{}
+
+// ATNConfigComparator is used as the compartor for the configLookup field of an ATNConfigSet
+// and has a custom Equals() and Hash() implementation, because equality is not based on the
+// standard Hash() and Equals() methods of the ATNConfig type.
+type ATNConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for configLookup
+func (c *ATNConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetAlt() == o2.GetAlt() &&
+ o1.GetSemanticContext().Equals(o2.GetSemanticContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup
+func (c *ATNConfigComparator[T]) Hash1(o ATNConfig) int {
+ hash := 7
+ hash = 31*hash + o.GetState().GetStateNumber()
+ hash = 31*hash + o.GetAlt()
+ hash = 31*hash + o.GetSemanticContext().Hash()
+ return hash
+}
+
+// ATNAltConfigComparator is used as the comparator for mapping configs to Alt Bitsets
+type ATNAltConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for configLookup
+func (c *ATNAltConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetContext().Equals(o2.GetContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup
+func (c *ATNAltConfigComparator[T]) Hash1(o ATNConfig) int {
+ h := murmurInit(7)
+ h = murmurUpdate(h, o.GetState().GetStateNumber())
+ h = murmurUpdate(h, o.GetContext().Hash())
+ return murmurFinish(h, 2)
+}
+
+// BaseATNConfigComparator is used as the comparator for the configLookup field of a BaseATNConfigSet
+// and has a custom Equals() and Hash() implementation, because equality is not based on the
+// standard Hash() and Equals() methods of the ATNConfig type.
+type BaseATNConfigComparator[T Collectable[T]] struct {
+}
+
+// Equals2 is a custom comparator for ATNConfigs specifically for baseATNConfigSet
+func (c *BaseATNConfigComparator[T]) Equals2(o1, o2 ATNConfig) bool {
+
+ // Same pointer, must be equal, even if both nil
+ //
+ if o1 == o2 {
+ return true
+
+ }
+
+ // If either are nil, but not both, then the result is false
+ //
+ if o1 == nil || o2 == nil {
+ return false
+ }
+
+ return o1.GetState().GetStateNumber() == o2.GetState().GetStateNumber() &&
+ o1.GetAlt() == o2.GetAlt() &&
+ o1.GetSemanticContext().Equals(o2.GetSemanticContext())
+}
+
+// Hash1 is custom hash implementation for ATNConfigs specifically for configLookup, but in fact just
+// delegates to the standard Hash() method of the ATNConfig type.
+func (c *BaseATNConfigComparator[T]) Hash1(o ATNConfig) int {
+
+ return o.Hash()
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go
similarity index 80%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go
index d55a2a87d5..bfd43e1f73 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa.go
@@ -1,13 +1,9 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
package antlr
-import (
- "sort"
-)
-
type DFA struct {
// atnStartState is the ATN state in which this was created
atnStartState DecisionState
@@ -15,8 +11,15 @@ type DFA struct {
decision int
// states is all the DFA states. Use Map to get the old state back; Set can only
- // indicate whether it is there.
- states map[int]*DFAState
+ // indicate whether it is there. Go maps implement key hash collisions and so on and are very
+ // good, but the DFAState is an object and can't be used directly as the key as it can in say JAva
+ // amd C#, whereby if the hashcode is the same for two objects, then Equals() is called against them
+ // to see if they really are the same object.
+ //
+ //
+ states *JStore[*DFAState, *ObjEqComparator[*DFAState]]
+
+ numstates int
s0 *DFAState
@@ -29,7 +32,7 @@ func NewDFA(atnStartState DecisionState, decision int) *DFA {
dfa := &DFA{
atnStartState: atnStartState,
decision: decision,
- states: make(map[int]*DFAState),
+ states: NewJStore[*DFAState, *ObjEqComparator[*DFAState]](dfaStateEqInst),
}
if s, ok := atnStartState.(*StarLoopEntryState); ok && s.precedenceRuleDecision {
dfa.precedenceDfa = true
@@ -92,7 +95,8 @@ func (d *DFA) getPrecedenceDfa() bool {
// true or nil otherwise, and d.precedenceDfa is updated.
func (d *DFA) setPrecedenceDfa(precedenceDfa bool) {
if d.getPrecedenceDfa() != precedenceDfa {
- d.setStates(make(map[int]*DFAState))
+ d.states = NewJStore[*DFAState, *ObjEqComparator[*DFAState]](dfaStateEqInst)
+ d.numstates = 0
if precedenceDfa {
precedenceState := NewDFAState(-1, NewBaseATNConfigSet(false))
@@ -117,38 +121,12 @@ func (d *DFA) setS0(s *DFAState) {
d.s0 = s
}
-func (d *DFA) getState(hash int) (*DFAState, bool) {
- s, ok := d.states[hash]
- return s, ok
-}
-
-func (d *DFA) setStates(states map[int]*DFAState) {
- d.states = states
-}
-
-func (d *DFA) setState(hash int, state *DFAState) {
- d.states[hash] = state
-}
-
-func (d *DFA) numStates() int {
- return len(d.states)
-}
-
-type dfaStateList []*DFAState
-
-func (d dfaStateList) Len() int { return len(d) }
-func (d dfaStateList) Less(i, j int) bool { return d[i].stateNumber < d[j].stateNumber }
-func (d dfaStateList) Swap(i, j int) { d[i], d[j] = d[j], d[i] }
-
// sortedStates returns the states in d sorted by their state number.
func (d *DFA) sortedStates() []*DFAState {
- vs := make([]*DFAState, 0, len(d.states))
-
- for _, v := range d.states {
- vs = append(vs, v)
- }
- sort.Sort(dfaStateList(vs))
+ vs := d.states.SortedSlice(func(i, j *DFAState) bool {
+ return i.stateNumber < j.stateNumber
+ })
return vs
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go
similarity index 97%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go
index bf2ccc06cd..84d0a31e53 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_serializer.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_serializer.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go
similarity index 90%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go
index 970ed19865..c90dec55c8 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/dfa_state.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/dfa_state.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -90,16 +90,16 @@ func NewDFAState(stateNumber int, configs ATNConfigSet) *DFAState {
}
// GetAltSet gets the set of all alts mentioned by all ATN configurations in d.
-func (d *DFAState) GetAltSet() Set {
- alts := newArray2DHashSet(nil, nil)
+func (d *DFAState) GetAltSet() []int {
+ var alts []int
if d.configs != nil {
for _, c := range d.configs.GetItems() {
- alts.Add(c.GetAlt())
+ alts = append(alts, c.GetAlt())
}
}
- if alts.Len() == 0 {
+ if len(alts) == 0 {
return nil
}
@@ -130,27 +130,6 @@ func (d *DFAState) setPrediction(v int) {
d.prediction = v
}
-// equals returns whether d equals other. Two DFAStates are equal if their ATN
-// configuration sets are the same. This method is used to see if a state
-// already exists.
-//
-// Because the number of alternatives and number of ATN configurations are
-// finite, there is a finite number of DFA states that can be processed. This is
-// necessary to show that the algorithm terminates.
-//
-// Cannot test the DFA state numbers here because in
-// ParserATNSimulator.addDFAState we need to know if any other state exists that
-// has d exact set of ATN configurations. The stateNumber is irrelevant.
-func (d *DFAState) equals(other interface{}) bool {
- if d == other {
- return true
- } else if _, ok := other.(*DFAState); !ok {
- return false
- }
-
- return d.configs.Equals(other.(*DFAState).configs)
-}
-
func (d *DFAState) String() string {
var s string
if d.isAcceptState {
@@ -164,8 +143,27 @@ func (d *DFAState) String() string {
return fmt.Sprintf("%d:%s%s", d.stateNumber, fmt.Sprint(d.configs), s)
}
-func (d *DFAState) hash() int {
+func (d *DFAState) Hash() int {
h := murmurInit(7)
- h = murmurUpdate(h, d.configs.hash())
+ h = murmurUpdate(h, d.configs.Hash())
return murmurFinish(h, 1)
}
+
+// Equals returns whether d equals other. Two DFAStates are equal if their ATN
+// configuration sets are the same. This method is used to see if a state
+// already exists.
+//
+// Because the number of alternatives and number of ATN configurations are
+// finite, there is a finite number of DFA states that can be processed. This is
+// necessary to show that the algorithm terminates.
+//
+// Cannot test the DFA state numbers here because in
+// ParserATNSimulator.addDFAState we need to know if any other state exists that
+// has d exact set of ATN configurations. The stateNumber is irrelevant.
+func (d *DFAState) Equals(o Collectable[*DFAState]) bool {
+ if d == o {
+ return true
+ }
+
+ return d.configs.Equals(o.(*DFAState).configs)
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go
index 1fec43d9dc..c55bcc19b2 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/diagnostic_error_listener.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/diagnostic_error_listener.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -87,7 +87,6 @@ func (d *DiagnosticErrorListener) getDecisionDescription(recognizer Parser, dfa
return strconv.Itoa(decision) + " (" + ruleName + ")"
}
-//
// Computes the set of conflicting or ambiguous alternatives from a
// configuration set, if that information was not already provided by the
// parser.
@@ -97,7 +96,6 @@ func (d *DiagnosticErrorListener) getDecisionDescription(recognizer Parser, dfa
// @param configs The conflicting or ambiguous configuration set.
// @return Returns {@code ReportedAlts} if it is not {@code nil}, otherwise
// returns the set of alternatives represented in {@code configs}.
-//
func (d *DiagnosticErrorListener) getConflictingAlts(ReportedAlts *BitSet, set ATNConfigSet) *BitSet {
if ReportedAlts != nil {
return ReportedAlts
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go
index 028e1a9d7f..f679f0dcd5 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_listener.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_listener.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -48,12 +48,9 @@ func NewConsoleErrorListener() *ConsoleErrorListener {
return new(ConsoleErrorListener)
}
-//
// Provides a default instance of {@link ConsoleErrorListener}.
-//
var ConsoleErrorListenerINSTANCE = NewConsoleErrorListener()
-//
// {@inheritDoc}
//
//
@@ -64,7 +61,6 @@ var ConsoleErrorListenerINSTANCE = NewConsoleErrorListener()
//
// line line:charPositionInLinemsg
//
-//
func (c *ConsoleErrorListener) SyntaxError(recognizer Recognizer, offendingSymbol interface{}, line, column int, msg string, e RecognitionException) {
fmt.Fprintln(os.Stderr, "line "+strconv.Itoa(line)+":"+strconv.Itoa(column)+" "+msg)
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go
similarity index 99%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go
index c4080dbfd1..5c0a637ba4 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/error_strategy.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/error_strategy.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -23,7 +23,6 @@ type ErrorStrategy interface {
// This is the default implementation of {@link ANTLRErrorStrategy} used for
// error Reporting and recovery in ANTLR parsers.
-//
type DefaultErrorStrategy struct {
errorRecoveryMode bool
lastErrorIndex int
@@ -61,12 +60,10 @@ func (d *DefaultErrorStrategy) reset(recognizer Parser) {
d.endErrorCondition(recognizer)
}
-//
// This method is called to enter error recovery mode when a recognition
// exception is Reported.
//
// @param recognizer the parser instance
-//
func (d *DefaultErrorStrategy) beginErrorCondition(recognizer Parser) {
d.errorRecoveryMode = true
}
@@ -75,28 +72,23 @@ func (d *DefaultErrorStrategy) InErrorRecoveryMode(recognizer Parser) bool {
return d.errorRecoveryMode
}
-//
// This method is called to leave error recovery mode after recovering from
// a recognition exception.
//
// @param recognizer
-//
func (d *DefaultErrorStrategy) endErrorCondition(recognizer Parser) {
d.errorRecoveryMode = false
d.lastErrorStates = nil
d.lastErrorIndex = -1
}
-//
// {@inheritDoc}
//
//
The default implementation simply calls {@link //endErrorCondition}.
The default implementation returns immediately if the handler is already
@@ -114,7 +106,6 @@ func (d *DefaultErrorStrategy) ReportMatch(recognizer Parser) {
//
All other types: calls {@link Parser//NotifyErrorListeners} to Report
// the exception
//
-//
func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionException) {
// if we've already Reported an error and have not Matched a token
// yet successfully, don't Report any errors.
@@ -142,7 +133,6 @@ func (d *DefaultErrorStrategy) ReportError(recognizer Parser, e RecognitionExcep
//
The default implementation reSynchronizes the parser by consuming tokens
// until we find one in the reSynchronization set--loosely the set of tokens
// that can follow the current rule.
-//
func (d *DefaultErrorStrategy) Recover(recognizer Parser, e RecognitionException) {
if d.lastErrorIndex == recognizer.GetInputStream().Index() &&
@@ -206,7 +196,6 @@ func (d *DefaultErrorStrategy) Recover(recognizer Parser, e RecognitionException
// compare token set at the start of the loop and at each iteration. If for
// some reason speed is suffering for you, you can turn off d
// functionality by simply overriding d method as a blank { }.
-//
func (d *DefaultErrorStrategy) Sync(recognizer Parser) {
// If already recovering, don't try to Sync
if d.InErrorRecoveryMode(recognizer) {
@@ -247,7 +236,6 @@ func (d *DefaultErrorStrategy) Sync(recognizer Parser) {
//
// @param recognizer the parser instance
// @param e the recognition exception
-//
func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *NoViableAltException) {
tokens := recognizer.GetTokenStream()
var input string
@@ -264,7 +252,6 @@ func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *N
recognizer.NotifyErrorListeners(msg, e.offendingToken, e)
}
-//
// This is called by {@link //ReportError} when the exception is an
// {@link InputMisMatchException}.
//
@@ -272,14 +259,12 @@ func (d *DefaultErrorStrategy) ReportNoViableAlternative(recognizer Parser, e *N
//
// @param recognizer the parser instance
// @param e the recognition exception
-//
func (this *DefaultErrorStrategy) ReportInputMisMatch(recognizer Parser, e *InputMisMatchException) {
msg := "mismatched input " + this.GetTokenErrorDisplay(e.offendingToken) +
" expecting " + e.getExpectedTokens().StringVerbose(recognizer.GetLiteralNames(), recognizer.GetSymbolicNames(), false)
recognizer.NotifyErrorListeners(msg, e.offendingToken, e)
}
-//
// This is called by {@link //ReportError} when the exception is a
// {@link FailedPredicateException}.
//
@@ -287,7 +272,6 @@ func (this *DefaultErrorStrategy) ReportInputMisMatch(recognizer Parser, e *Inpu
//
// @param recognizer the parser instance
// @param e the recognition exception
-//
func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *FailedPredicateException) {
ruleName := recognizer.GetRuleNames()[recognizer.GetParserRuleContext().GetRuleIndex()]
msg := "rule " + ruleName + " " + e.message
@@ -310,7 +294,6 @@ func (d *DefaultErrorStrategy) ReportFailedPredicate(recognizer Parser, e *Faile
// {@link Parser//NotifyErrorListeners}.
//
// @param recognizer the parser instance
-//
func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) {
if d.InErrorRecoveryMode(recognizer) {
return
@@ -339,7 +322,6 @@ func (d *DefaultErrorStrategy) ReportUnwantedToken(recognizer Parser) {
// {@link Parser//NotifyErrorListeners}.
//
// @param recognizer the parser instance
-//
func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) {
if d.InErrorRecoveryMode(recognizer) {
return
@@ -392,15 +374,14 @@ func (d *DefaultErrorStrategy) ReportMissingToken(recognizer Parser) {
// derivation:
//
//
-// => ID '=' '(' INT ')' ('+' atom)* ''
+// => ID '=' '(' INT ')' ('+' atom)* ”
// ^
//
//
-// The attempt to Match {@code ')'} will fail when it sees {@code ''} and
-// call {@link //recoverInline}. To recover, it sees that {@code LA(1)==''}
+// The attempt to Match {@code ')'} will fail when it sees {@code ”} and
+// call {@link //recoverInline}. To recover, it sees that {@code LA(1)==”}
// is in the set of tokens that can follow the {@code ')'} token reference
// in rule {@code atom}. It can assume that you forgot the {@code ')'}.
-//
func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token {
// SINGLE TOKEN DELETION
MatchedSymbol := d.SingleTokenDeletion(recognizer)
@@ -418,7 +399,6 @@ func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token {
panic(NewInputMisMatchException(recognizer))
}
-//
// This method implements the single-token insertion inline error recovery
// strategy. It is called by {@link //recoverInline} if the single-token
// deletion strategy fails to recover from the mismatched input. If this
@@ -434,7 +414,6 @@ func (d *DefaultErrorStrategy) RecoverInline(recognizer Parser) Token {
// @param recognizer the parser instance
// @return {@code true} if single-token insertion is a viable recovery
// strategy for the current mismatched input, otherwise {@code false}
-//
func (d *DefaultErrorStrategy) SingleTokenInsertion(recognizer Parser) bool {
currentSymbolType := recognizer.GetTokenStream().LA(1)
// if current token is consistent with what could come after current
@@ -469,7 +448,6 @@ func (d *DefaultErrorStrategy) SingleTokenInsertion(recognizer Parser) bool {
// @return the successfully Matched {@link Token} instance if single-token
// deletion successfully recovers from the mismatched input, otherwise
// {@code nil}
-//
func (d *DefaultErrorStrategy) SingleTokenDeletion(recognizer Parser) Token {
NextTokenType := recognizer.GetTokenStream().LA(2)
expecting := d.GetExpectedTokens(recognizer)
@@ -507,7 +485,6 @@ func (d *DefaultErrorStrategy) SingleTokenDeletion(recognizer Parser) Token {
// a CommonToken of the appropriate type. The text will be the token.
// If you change what tokens must be created by the lexer,
// override d method to create the appropriate tokens.
-//
func (d *DefaultErrorStrategy) GetMissingSymbol(recognizer Parser) Token {
currentSymbol := recognizer.GetCurrentToken()
expecting := d.GetExpectedTokens(recognizer)
@@ -546,7 +523,6 @@ func (d *DefaultErrorStrategy) GetExpectedTokens(recognizer Parser) *IntervalSet
// the token). This is better than forcing you to override a method in
// your token objects because you don't have to go modify your lexer
// so that it creates a NewJava type.
-//
func (d *DefaultErrorStrategy) GetTokenErrorDisplay(t Token) string {
if t == nil {
return ""
@@ -578,7 +554,7 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string {
// from within the rule i.e., the FIRST computation done by
// ANTLR stops at the end of a rule.
//
-// EXAMPLE
+// # EXAMPLE
//
// When you find a "no viable alt exception", the input is not
// consistent with any of the alternatives for rule r. The best
@@ -597,7 +573,6 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string {
// c : ID
// | INT
//
-//
// At each rule invocation, the set of tokens that could follow
// that rule is pushed on a stack. Here are the various
// context-sensitive follow sets:
@@ -660,7 +635,6 @@ func (d *DefaultErrorStrategy) escapeWSAndQuote(s string) string {
//
// Like Grosch I implement context-sensitive FOLLOW sets that are combined
// at run-time upon error to avoid overhead during parsing.
-//
func (d *DefaultErrorStrategy) getErrorRecoverySet(recognizer Parser) *IntervalSet {
atn := recognizer.GetInterpreter().atn
ctx := recognizer.GetParserRuleContext()
@@ -733,7 +707,6 @@ func NewBailErrorStrategy() *BailErrorStrategy {
// in a {@link ParseCancellationException} so it is not caught by the
// rule func catches. Use {@link Exception//getCause()} to get the
// original {@link RecognitionException}.
-//
func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) {
context := recognizer.GetParserRuleContext()
for context != nil {
@@ -749,7 +722,6 @@ func (b *BailErrorStrategy) Recover(recognizer Parser, e RecognitionException) {
// Make sure we don't attempt to recover inline if the parser
// successfully recovers, it won't panic an exception.
-//
func (b *BailErrorStrategy) RecoverInline(recognizer Parser) Token {
b.Recover(recognizer, NewInputMisMatchException(recognizer))
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go
new file mode 100644
index 0000000000..3954c13782
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/errors.go
@@ -0,0 +1,238 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+// The root of the ANTLR exception hierarchy. In general, ANTLR tracks just
+// 3 kinds of errors: prediction errors, failed predicate errors, and
+// mismatched input errors. In each case, the parser knows where it is
+// in the input, where it is in the ATN, the rule invocation stack,
+// and what kind of problem occurred.
+
+type RecognitionException interface {
+ GetOffendingToken() Token
+ GetMessage() string
+ GetInputStream() IntStream
+}
+
+type BaseRecognitionException struct {
+ message string
+ recognizer Recognizer
+ offendingToken Token
+ offendingState int
+ ctx RuleContext
+ input IntStream
+}
+
+func NewBaseRecognitionException(message string, recognizer Recognizer, input IntStream, ctx RuleContext) *BaseRecognitionException {
+
+ // todo
+ // Error.call(this)
+ //
+ // if (!!Error.captureStackTrace) {
+ // Error.captureStackTrace(this, RecognitionException)
+ // } else {
+ // stack := NewError().stack
+ // }
+ // TODO may be able to use - "runtime" func Stack(buf []byte, all bool) int
+
+ t := new(BaseRecognitionException)
+
+ t.message = message
+ t.recognizer = recognizer
+ t.input = input
+ t.ctx = ctx
+ // The current {@link Token} when an error occurred. Since not all streams
+ // support accessing symbols by index, we have to track the {@link Token}
+ // instance itself.
+ t.offendingToken = nil
+ // Get the ATN state number the parser was in at the time the error
+ // occurred. For {@link NoViableAltException} and
+ // {@link LexerNoViableAltException} exceptions, this is the
+ // {@link DecisionState} number. For others, it is the state whose outgoing
+ // edge we couldn't Match.
+ t.offendingState = -1
+ if t.recognizer != nil {
+ t.offendingState = t.recognizer.GetState()
+ }
+
+ return t
+}
+
+func (b *BaseRecognitionException) GetMessage() string {
+ return b.message
+}
+
+func (b *BaseRecognitionException) GetOffendingToken() Token {
+ return b.offendingToken
+}
+
+func (b *BaseRecognitionException) GetInputStream() IntStream {
+ return b.input
+}
+
+//
If the state number is not known, b method returns -1.
+
+// Gets the set of input symbols which could potentially follow the
+// previously Matched symbol at the time b exception was panicn.
+//
+//
If the set of expected tokens is not known and could not be computed,
+// b method returns {@code nil}.
+//
+// @return The set of token types that could potentially follow the current
+// state in the ATN, or {@code nil} if the information is not available.
+// /
+func (b *BaseRecognitionException) getExpectedTokens() *IntervalSet {
+ if b.recognizer != nil {
+ return b.recognizer.GetATN().getExpectedTokens(b.offendingState, b.ctx)
+ }
+
+ return nil
+}
+
+func (b *BaseRecognitionException) String() string {
+ return b.message
+}
+
+type LexerNoViableAltException struct {
+ *BaseRecognitionException
+
+ startIndex int
+ deadEndConfigs ATNConfigSet
+}
+
+func NewLexerNoViableAltException(lexer Lexer, input CharStream, startIndex int, deadEndConfigs ATNConfigSet) *LexerNoViableAltException {
+
+ l := new(LexerNoViableAltException)
+
+ l.BaseRecognitionException = NewBaseRecognitionException("", lexer, input, nil)
+
+ l.startIndex = startIndex
+ l.deadEndConfigs = deadEndConfigs
+
+ return l
+}
+
+func (l *LexerNoViableAltException) String() string {
+ symbol := ""
+ if l.startIndex >= 0 && l.startIndex < l.input.Size() {
+ symbol = l.input.(CharStream).GetTextFromInterval(NewInterval(l.startIndex, l.startIndex))
+ }
+ return "LexerNoViableAltException" + symbol
+}
+
+type NoViableAltException struct {
+ *BaseRecognitionException
+
+ startToken Token
+ offendingToken Token
+ ctx ParserRuleContext
+ deadEndConfigs ATNConfigSet
+}
+
+// Indicates that the parser could not decide which of two or more paths
+// to take based upon the remaining input. It tracks the starting token
+// of the offending input and also knows where the parser was
+// in the various paths when the error. Reported by ReportNoViableAlternative()
+func NewNoViableAltException(recognizer Parser, input TokenStream, startToken Token, offendingToken Token, deadEndConfigs ATNConfigSet, ctx ParserRuleContext) *NoViableAltException {
+
+ if ctx == nil {
+ ctx = recognizer.GetParserRuleContext()
+ }
+
+ if offendingToken == nil {
+ offendingToken = recognizer.GetCurrentToken()
+ }
+
+ if startToken == nil {
+ startToken = recognizer.GetCurrentToken()
+ }
+
+ if input == nil {
+ input = recognizer.GetInputStream().(TokenStream)
+ }
+
+ n := new(NoViableAltException)
+ n.BaseRecognitionException = NewBaseRecognitionException("", recognizer, input, ctx)
+
+ // Which configurations did we try at input.Index() that couldn't Match
+ // input.LT(1)?//
+ n.deadEndConfigs = deadEndConfigs
+ // The token object at the start index the input stream might
+ // not be buffering tokens so get a reference to it. (At the
+ // time the error occurred, of course the stream needs to keep a
+ // buffer all of the tokens but later we might not have access to those.)
+ n.startToken = startToken
+ n.offendingToken = offendingToken
+
+ return n
+}
+
+type InputMisMatchException struct {
+ *BaseRecognitionException
+}
+
+// This signifies any kind of mismatched input exceptions such as
+// when the current input does not Match the expected token.
+func NewInputMisMatchException(recognizer Parser) *InputMisMatchException {
+
+ i := new(InputMisMatchException)
+ i.BaseRecognitionException = NewBaseRecognitionException("", recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
+
+ i.offendingToken = recognizer.GetCurrentToken()
+
+ return i
+
+}
+
+// A semantic predicate failed during validation. Validation of predicates
+// occurs when normally parsing the alternative just like Matching a token.
+// Disambiguating predicate evaluation occurs when we test a predicate during
+// prediction.
+
+type FailedPredicateException struct {
+ *BaseRecognitionException
+
+ ruleIndex int
+ predicateIndex int
+ predicate string
+}
+
+func NewFailedPredicateException(recognizer Parser, predicate string, message string) *FailedPredicateException {
+
+ f := new(FailedPredicateException)
+
+ f.BaseRecognitionException = NewBaseRecognitionException(f.formatMessage(predicate, message), recognizer, recognizer.GetInputStream(), recognizer.GetParserRuleContext())
+
+ s := recognizer.GetInterpreter().atn.states[recognizer.GetState()]
+ trans := s.GetTransitions()[0]
+ if trans2, ok := trans.(*PredicateTransition); ok {
+ f.ruleIndex = trans2.ruleIndex
+ f.predicateIndex = trans2.predIndex
+ } else {
+ f.ruleIndex = 0
+ f.predicateIndex = 0
+ }
+ f.predicate = predicate
+ f.offendingToken = recognizer.GetCurrentToken()
+
+ return f
+}
+
+func (f *FailedPredicateException) formatMessage(predicate, message string) string {
+ if message != "" {
+ return message
+ }
+
+ return "failed predicate: {" + predicate + "}?"
+}
+
+type ParseCancellationException struct {
+}
+
+func NewParseCancellationException() *ParseCancellationException {
+ // Error.call(this)
+ // Error.captureStackTrace(this, ParseCancellationException)
+ return new(ParseCancellationException)
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go
similarity index 92%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go
index 842170c086..bd6ad5efe3 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/file_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/file_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go
similarity index 96%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go
index 5ff270f536..a8b889cedb 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/input_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/input_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go
similarity index 82%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go
index 438e0ea6e7..4778878bd0 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/int_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/int_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go
index 1e9393adb6..c1e155e818 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/interval_set.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/interval_set.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -223,6 +223,10 @@ func (i *IntervalSet) StringVerbose(literalNames []string, symbolicNames []strin
return i.toIndexString()
}
+func (i *IntervalSet) GetIntervals() []*Interval {
+ return i.intervals
+}
+
func (i *IntervalSet) toCharString() string {
names := make([]string, len(i.intervals))
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go
new file mode 100644
index 0000000000..e5a74f0c6c
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/jcollect.go
@@ -0,0 +1,198 @@
+package antlr
+
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+import (
+ "sort"
+)
+
+// Collectable is an interface that a struct should implement if it is to be
+// usable as a key in these collections.
+type Collectable[T any] interface {
+ Hash() int
+ Equals(other Collectable[T]) bool
+}
+
+type Comparator[T any] interface {
+ Hash1(o T) int
+ Equals2(T, T) bool
+}
+
+// JStore implements a container that allows the use of a struct to calculate the key
+// for a collection of values akin to map. This is not meant to be a full-blown HashMap but just
+// serve the needs of the ANTLR Go runtime.
+//
+// For ease of porting the logic of the runtime from the master target (Java), this collection
+// operates in a similar way to Java, in that it can use any struct that supplies a Hash() and Equals()
+// function as the key. The values are stored in a standard go map which internally is a form of hashmap
+// itself, the key for the go map is the hash supplied by the key object. The collection is able to deal with
+// hash conflicts by using a simple slice of values associated with the hash code indexed bucket. That isn't
+// particularly efficient, but it is simple, and it works. As this is specifically for the ANTLR runtime, and
+// we understand the requirements, then this is fine - this is not a general purpose collection.
+type JStore[T any, C Comparator[T]] struct {
+ store map[int][]T
+ len int
+ comparator Comparator[T]
+}
+
+func NewJStore[T any, C Comparator[T]](comparator Comparator[T]) *JStore[T, C] {
+
+ if comparator == nil {
+ panic("comparator cannot be nil")
+ }
+
+ s := &JStore[T, C]{
+ store: make(map[int][]T, 1),
+ comparator: comparator,
+ }
+ return s
+}
+
+// Put will store given value in the collection. Note that the key for storage is generated from
+// the value itself - this is specifically because that is what ANTLR needs - this would not be useful
+// as any kind of general collection.
+//
+// If the key has a hash conflict, then the value will be added to the slice of values associated with the
+// hash, unless the value is already in the slice, in which case the existing value is returned. Value equivalence is
+// tested by calling the equals() method on the key.
+//
+// # If the given value is already present in the store, then the existing value is returned as v and exists is set to true
+//
+// If the given value is not present in the store, then the value is added to the store and returned as v and exists is set to false.
+func (s *JStore[T, C]) Put(value T) (v T, exists bool) { //nolint:ireturn
+
+ kh := s.comparator.Hash1(value)
+
+ for _, v1 := range s.store[kh] {
+ if s.comparator.Equals2(value, v1) {
+ return v1, true
+ }
+ }
+ s.store[kh] = append(s.store[kh], value)
+ s.len++
+ return value, false
+}
+
+// Get will return the value associated with the key - the type of the key is the same type as the value
+// which would not generally be useful, but this is a specific thing for ANTLR where the key is
+// generated using the object we are going to store.
+func (s *JStore[T, C]) Get(key T) (T, bool) { //nolint:ireturn
+
+ kh := s.comparator.Hash1(key)
+
+ for _, v := range s.store[kh] {
+ if s.comparator.Equals2(key, v) {
+ return v, true
+ }
+ }
+ return key, false
+}
+
+// Contains returns true if the given key is present in the store
+func (s *JStore[T, C]) Contains(key T) bool { //nolint:ireturn
+
+ _, present := s.Get(key)
+ return present
+}
+
+func (s *JStore[T, C]) SortedSlice(less func(i, j T) bool) []T {
+ vs := make([]T, 0, len(s.store))
+ for _, v := range s.store {
+ vs = append(vs, v...)
+ }
+ sort.Slice(vs, func(i, j int) bool {
+ return less(vs[i], vs[j])
+ })
+
+ return vs
+}
+
+func (s *JStore[T, C]) Each(f func(T) bool) {
+ for _, e := range s.store {
+ for _, v := range e {
+ f(v)
+ }
+ }
+}
+
+func (s *JStore[T, C]) Len() int {
+ return s.len
+}
+
+func (s *JStore[T, C]) Values() []T {
+ vs := make([]T, 0, len(s.store))
+ for _, e := range s.store {
+ for _, v := range e {
+ vs = append(vs, v)
+ }
+ }
+ return vs
+}
+
+type entry[K, V any] struct {
+ key K
+ val V
+}
+
+type JMap[K, V any, C Comparator[K]] struct {
+ store map[int][]*entry[K, V]
+ len int
+ comparator Comparator[K]
+}
+
+func NewJMap[K, V any, C Comparator[K]](comparator Comparator[K]) *JMap[K, V, C] {
+ return &JMap[K, V, C]{
+ store: make(map[int][]*entry[K, V], 1),
+ comparator: comparator,
+ }
+}
+
+func (m *JMap[K, V, C]) Put(key K, val V) {
+ kh := m.comparator.Hash1(key)
+
+ m.store[kh] = append(m.store[kh], &entry[K, V]{key, val})
+ m.len++
+}
+
+func (m *JMap[K, V, C]) Values() []V {
+ vs := make([]V, 0, len(m.store))
+ for _, e := range m.store {
+ for _, v := range e {
+ vs = append(vs, v.val)
+ }
+ }
+ return vs
+}
+
+func (m *JMap[K, V, C]) Get(key K) (V, bool) {
+
+ var none V
+ kh := m.comparator.Hash1(key)
+ for _, e := range m.store[kh] {
+ if m.comparator.Equals2(e.key, key) {
+ return e.val, true
+ }
+ }
+ return none, false
+}
+
+func (m *JMap[K, V, C]) Len() int {
+ return len(m.store)
+}
+
+func (m *JMap[K, V, C]) Delete(key K) {
+ kh := m.comparator.Hash1(key)
+ for i, e := range m.store[kh] {
+ if m.comparator.Equals2(e.key, key) {
+ m.store[kh] = append(m.store[kh][:i], m.store[kh][i+1:]...)
+ m.len--
+ return
+ }
+ }
+}
+
+func (m *JMap[K, V, C]) Clear() {
+ m.store = make(map[int][]*entry[K, V])
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go
index b04f04572f..6533f05164 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -232,8 +232,6 @@ func (b *BaseLexer) NextToken() Token {
}
return b.token
}
-
- return nil
}
// Instruct the lexer to Skip creating a token for current lexer rule
@@ -342,7 +340,7 @@ func (b *BaseLexer) GetCharIndex() int {
}
// Return the text Matched so far for the current token or any text override.
-//Set the complete text of l token it wipes any previous changes to the text.
+// Set the complete text of l token it wipes any previous changes to the text.
func (b *BaseLexer) GetText() string {
if b.text != "" {
return b.text
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go
similarity index 91%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go
index 5a325be137..111656c295 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -21,8 +21,8 @@ type LexerAction interface {
getActionType() int
getIsPositionDependent() bool
execute(lexer Lexer)
- hash() int
- equals(other LexerAction) bool
+ Hash() int
+ Equals(other LexerAction) bool
}
type BaseLexerAction struct {
@@ -51,15 +51,14 @@ func (b *BaseLexerAction) getIsPositionDependent() bool {
return b.isPositionDependent
}
-func (b *BaseLexerAction) hash() int {
+func (b *BaseLexerAction) Hash() int {
return b.actionType
}
-func (b *BaseLexerAction) equals(other LexerAction) bool {
+func (b *BaseLexerAction) Equals(other LexerAction) bool {
return b == other
}
-//
// Implements the {@code Skip} lexer action by calling {@link Lexer//Skip}.
//
//
The {@code Skip} command does not have any parameters, so l action is
@@ -85,7 +84,8 @@ func (l *LexerSkipAction) String() string {
return "skip"
}
-// Implements the {@code type} lexer action by calling {@link Lexer//setType}
+// Implements the {@code type} lexer action by calling {@link Lexer//setType}
+//
// with the assigned type.
type LexerTypeAction struct {
*BaseLexerAction
@@ -104,14 +104,14 @@ func (l *LexerTypeAction) execute(lexer Lexer) {
lexer.SetType(l.thetype)
}
-func (l *LexerTypeAction) hash() int {
+func (l *LexerTypeAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.actionType)
h = murmurUpdate(h, l.thetype)
return murmurFinish(h, 2)
}
-func (l *LexerTypeAction) equals(other LexerAction) bool {
+func (l *LexerTypeAction) Equals(other LexerAction) bool {
if l == other {
return true
} else if _, ok := other.(*LexerTypeAction); !ok {
@@ -148,14 +148,14 @@ func (l *LexerPushModeAction) execute(lexer Lexer) {
lexer.PushMode(l.mode)
}
-func (l *LexerPushModeAction) hash() int {
+func (l *LexerPushModeAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.actionType)
h = murmurUpdate(h, l.mode)
return murmurFinish(h, 2)
}
-func (l *LexerPushModeAction) equals(other LexerAction) bool {
+func (l *LexerPushModeAction) Equals(other LexerAction) bool {
if l == other {
return true
} else if _, ok := other.(*LexerPushModeAction); !ok {
@@ -245,14 +245,14 @@ func (l *LexerModeAction) execute(lexer Lexer) {
lexer.SetMode(l.mode)
}
-func (l *LexerModeAction) hash() int {
+func (l *LexerModeAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.actionType)
h = murmurUpdate(h, l.mode)
return murmurFinish(h, 2)
}
-func (l *LexerModeAction) equals(other LexerAction) bool {
+func (l *LexerModeAction) Equals(other LexerAction) bool {
if l == other {
return true
} else if _, ok := other.(*LexerModeAction); !ok {
@@ -303,7 +303,7 @@ func (l *LexerCustomAction) execute(lexer Lexer) {
lexer.Action(nil, l.ruleIndex, l.actionIndex)
}
-func (l *LexerCustomAction) hash() int {
+func (l *LexerCustomAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.actionType)
h = murmurUpdate(h, l.ruleIndex)
@@ -311,13 +311,14 @@ func (l *LexerCustomAction) hash() int {
return murmurFinish(h, 3)
}
-func (l *LexerCustomAction) equals(other LexerAction) bool {
+func (l *LexerCustomAction) Equals(other LexerAction) bool {
if l == other {
return true
} else if _, ok := other.(*LexerCustomAction); !ok {
return false
} else {
- return l.ruleIndex == other.(*LexerCustomAction).ruleIndex && l.actionIndex == other.(*LexerCustomAction).actionIndex
+ return l.ruleIndex == other.(*LexerCustomAction).ruleIndex &&
+ l.actionIndex == other.(*LexerCustomAction).actionIndex
}
}
@@ -344,14 +345,14 @@ func (l *LexerChannelAction) execute(lexer Lexer) {
lexer.SetChannel(l.channel)
}
-func (l *LexerChannelAction) hash() int {
+func (l *LexerChannelAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.actionType)
h = murmurUpdate(h, l.channel)
return murmurFinish(h, 2)
}
-func (l *LexerChannelAction) equals(other LexerAction) bool {
+func (l *LexerChannelAction) Equals(other LexerAction) bool {
if l == other {
return true
} else if _, ok := other.(*LexerChannelAction); !ok {
@@ -412,10 +413,10 @@ func (l *LexerIndexedCustomAction) execute(lexer Lexer) {
l.lexerAction.execute(lexer)
}
-func (l *LexerIndexedCustomAction) hash() int {
+func (l *LexerIndexedCustomAction) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, l.offset)
- h = murmurUpdate(h, l.lexerAction.hash())
+ h = murmurUpdate(h, l.lexerAction.Hash())
return murmurFinish(h, 2)
}
@@ -425,6 +426,7 @@ func (l *LexerIndexedCustomAction) equals(other LexerAction) bool {
} else if _, ok := other.(*LexerIndexedCustomAction); !ok {
return false
} else {
- return l.offset == other.(*LexerIndexedCustomAction).offset && l.lexerAction == other.(*LexerIndexedCustomAction).lexerAction
+ return l.offset == other.(*LexerIndexedCustomAction).offset &&
+ l.lexerAction.Equals(other.(*LexerIndexedCustomAction).lexerAction)
}
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go
similarity index 88%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go
index 056941dd6e..be1ba7a7e3 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_action_executor.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_action_executor.go
@@ -1,9 +1,11 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
package antlr
+import "golang.org/x/exp/slices"
+
// Represents an executor for a sequence of lexer actions which traversed during
// the Matching operation of a lexer rule (token).
//
@@ -12,8 +14,8 @@ package antlr
// not cause bloating of the {@link DFA} created for the lexer.
type LexerActionExecutor struct {
- lexerActions []LexerAction
- cachedHash int
+ lexerActions []LexerAction
+ cachedHash int
}
func NewLexerActionExecutor(lexerActions []LexerAction) *LexerActionExecutor {
@@ -30,7 +32,7 @@ func NewLexerActionExecutor(lexerActions []LexerAction) *LexerActionExecutor {
// of the performance-critical {@link LexerATNConfig//hashCode} operation.
l.cachedHash = murmurInit(57)
for _, a := range lexerActions {
- l.cachedHash = murmurUpdate(l.cachedHash, a.hash())
+ l.cachedHash = murmurUpdate(l.cachedHash, a.Hash())
}
return l
@@ -151,14 +153,17 @@ func (l *LexerActionExecutor) execute(lexer Lexer, input CharStream, startIndex
}
}
-func (l *LexerActionExecutor) hash() int {
+func (l *LexerActionExecutor) Hash() int {
if l == nil {
+ // TODO: Why is this here? l should not be nil
return 61
}
+
+ // TODO: This is created from the action itself when the struct is created - will this be an issue at some point? Java uses the runtime assign hashcode
return l.cachedHash
}
-func (l *LexerActionExecutor) equals(other interface{}) bool {
+func (l *LexerActionExecutor) Equals(other interface{}) bool {
if l == other {
return true
}
@@ -169,5 +174,13 @@ func (l *LexerActionExecutor) equals(other interface{}) bool {
if othert == nil {
return false
}
- return l.cachedHash == othert.cachedHash && &l.lexerActions == &othert.lexerActions
+ if l.cachedHash != othert.cachedHash {
+ return false
+ }
+ if len(l.lexerActions) != len(othert.lexerActions) {
+ return false
+ }
+ return slices.EqualFunc(l.lexerActions, othert.lexerActions, func(i, j LexerAction) bool {
+ return i.Equals(j)
+ })
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go
index dc05153ea4..c573b75210 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/lexer_atn_simulator.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/lexer_atn_simulator.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -591,19 +591,24 @@ func (l *LexerATNSimulator) addDFAState(configs ATNConfigSet, suppressEdge bool)
proposed.lexerActionExecutor = firstConfigWithRuleStopState.(*LexerATNConfig).lexerActionExecutor
proposed.setPrediction(l.atn.ruleToTokenType[firstConfigWithRuleStopState.GetState().GetRuleIndex()])
}
- hash := proposed.hash()
dfa := l.decisionToDFA[l.mode]
l.atn.stateMu.Lock()
defer l.atn.stateMu.Unlock()
- existing, ok := dfa.getState(hash)
- if ok {
+ existing, present := dfa.states.Get(proposed)
+ if present {
+
+ // This state was already present, so just return it.
+ //
proposed = existing
} else {
- proposed.stateNumber = dfa.numStates()
+
+ // We need to add the new state
+ //
+ proposed.stateNumber = dfa.states.Len()
configs.SetReadOnly(true)
proposed.configs = configs
- dfa.setState(hash, proposed)
+ dfa.states.Put(proposed)
}
if !suppressEdge {
dfa.setS0(proposed)
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go
similarity index 87%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go
index 6ffb37de69..76689615a6 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/ll1_analyzer.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/ll1_analyzer.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -14,14 +14,15 @@ func NewLL1Analyzer(atn *ATN) *LL1Analyzer {
return la
}
-//* Special value added to the lookahead sets to indicate that we hit
-// a predicate during analysis if {@code seeThruPreds==false}.
-///
+// - Special value added to the lookahead sets to indicate that we hit
+// a predicate during analysis if {@code seeThruPreds==false}.
+//
+// /
const (
LL1AnalyzerHitPred = TokenInvalidType
)
-//*
+// *
// Calculates the SLL(1) expected lookahead set for each outgoing transition
// of an {@link ATNState}. The returned array has one element for each
// outgoing transition in {@code s}. If the closure from transition
@@ -38,7 +39,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet {
look := make([]*IntervalSet, count)
for alt := 0; alt < count; alt++ {
look[alt] = NewIntervalSet()
- lookBusy := newArray2DHashSet(nil, nil)
+ lookBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst)
seeThruPreds := false // fail to get lookahead upon pred
la.look1(s.GetTransitions()[alt].getTarget(), nil, BasePredictionContextEMPTY, look[alt], lookBusy, NewBitSet(), seeThruPreds, false)
// Wipe out lookahead for la alternative if we found nothing
@@ -50,7 +51,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet {
return look
}
-//*
+// *
// Compute set of tokens that can follow {@code s} in the ATN in the
// specified {@code ctx}.
//
@@ -67,7 +68,7 @@ func (la *LL1Analyzer) getDecisionLookahead(s ATNState) []*IntervalSet {
//
// @return The set of tokens that can follow {@code s} in the ATN in the
// specified {@code ctx}.
-///
+// /
func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet {
r := NewIntervalSet()
seeThruPreds := true // ignore preds get all lookahead
@@ -75,7 +76,7 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet
if ctx != nil {
lookContext = predictionContextFromRuleContext(s.GetATN(), ctx)
}
- la.look1(s, stopState, lookContext, r, newArray2DHashSet(nil, nil), NewBitSet(), seeThruPreds, true)
+ la.look1(s, stopState, lookContext, r, NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst), NewBitSet(), seeThruPreds, true)
return r
}
@@ -109,14 +110,14 @@ func (la *LL1Analyzer) Look(s, stopState ATNState, ctx RuleContext) *IntervalSet
// outermost context is reached. This parameter has no effect if {@code ctx}
// is {@code nil}.
-func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) {
+func (la *LL1Analyzer) look2(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool, i int) {
returnState := la.atn.states[ctx.getReturnState(i)]
la.look1(returnState, stopState, ctx.GetParent(i), look, lookBusy, calledRuleStack, seeThruPreds, addEOF)
}
-func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool) {
+func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool) {
c := NewBaseATNConfig6(s, 0, ctx)
@@ -124,8 +125,11 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look
return
}
- lookBusy.Add(c)
+ _, present := lookBusy.Put(c)
+ if present {
+ return
+ }
if s == stopState {
if ctx == nil {
look.addOne(TokenEpsilon)
@@ -198,7 +202,7 @@ func (la *LL1Analyzer) look1(s, stopState ATNState, ctx PredictionContext, look
}
}
-func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy Set, calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) {
+func (la *LL1Analyzer) look3(stopState ATNState, ctx PredictionContext, look *IntervalSet, lookBusy *JStore[ATNConfig, Comparator[ATNConfig]], calledRuleStack *BitSet, seeThruPreds, addEOF bool, t1 *RuleTransition) {
newContext := SingletonBasePredictionContextCreate(ctx, t1.followState.GetStateNumber())
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go
new file mode 100644
index 0000000000..d26bf06392
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser.go
@@ -0,0 +1,708 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "fmt"
+ "strconv"
+)
+
+type Parser interface {
+ Recognizer
+
+ GetInterpreter() *ParserATNSimulator
+
+ GetTokenStream() TokenStream
+ GetTokenFactory() TokenFactory
+ GetParserRuleContext() ParserRuleContext
+ SetParserRuleContext(ParserRuleContext)
+ Consume() Token
+ GetParseListeners() []ParseTreeListener
+
+ GetErrorHandler() ErrorStrategy
+ SetErrorHandler(ErrorStrategy)
+ GetInputStream() IntStream
+ GetCurrentToken() Token
+ GetExpectedTokens() *IntervalSet
+ NotifyErrorListeners(string, Token, RecognitionException)
+ IsExpectedToken(int) bool
+ GetPrecedence() int
+ GetRuleInvocationStack(ParserRuleContext) []string
+}
+
+type BaseParser struct {
+ *BaseRecognizer
+
+ Interpreter *ParserATNSimulator
+ BuildParseTrees bool
+
+ input TokenStream
+ errHandler ErrorStrategy
+ precedenceStack IntStack
+ ctx ParserRuleContext
+
+ tracer *TraceListener
+ parseListeners []ParseTreeListener
+ _SyntaxErrors int
+}
+
+// p.is all the parsing support code essentially most of it is error
+// recovery stuff.//
+func NewBaseParser(input TokenStream) *BaseParser {
+
+ p := new(BaseParser)
+
+ p.BaseRecognizer = NewBaseRecognizer()
+
+ // The input stream.
+ p.input = nil
+ // The error handling strategy for the parser. The default value is a new
+ // instance of {@link DefaultErrorStrategy}.
+ p.errHandler = NewDefaultErrorStrategy()
+ p.precedenceStack = make([]int, 0)
+ p.precedenceStack.Push(0)
+ // The {@link ParserRuleContext} object for the currently executing rule.
+ // p.is always non-nil during the parsing process.
+ p.ctx = nil
+ // Specifies whether or not the parser should construct a parse tree during
+ // the parsing process. The default value is {@code true}.
+ p.BuildParseTrees = true
+ // When {@link //setTrace}{@code (true)} is called, a reference to the
+ // {@link TraceListener} is stored here so it can be easily removed in a
+ // later call to {@link //setTrace}{@code (false)}. The listener itself is
+ // implemented as a parser listener so p.field is not directly used by
+ // other parser methods.
+ p.tracer = nil
+ // The list of {@link ParseTreeListener} listeners registered to receive
+ // events during the parse.
+ p.parseListeners = nil
+ // The number of syntax errors Reported during parsing. p.value is
+ // incremented each time {@link //NotifyErrorListeners} is called.
+ p._SyntaxErrors = 0
+ p.SetInputStream(input)
+
+ return p
+}
+
+// p.field maps from the serialized ATN string to the deserialized {@link
+// ATN} with
+// bypass alternatives.
+//
+// @see ATNDeserializationOptions//isGenerateRuleBypassTransitions()
+var bypassAltsAtnCache = make(map[string]int)
+
+// reset the parser's state//
+func (p *BaseParser) reset() {
+ if p.input != nil {
+ p.input.Seek(0)
+ }
+ p.errHandler.reset(p)
+ p.ctx = nil
+ p._SyntaxErrors = 0
+ p.SetTrace(nil)
+ p.precedenceStack = make([]int, 0)
+ p.precedenceStack.Push(0)
+ if p.Interpreter != nil {
+ p.Interpreter.reset()
+ }
+}
+
+func (p *BaseParser) GetErrorHandler() ErrorStrategy {
+ return p.errHandler
+}
+
+func (p *BaseParser) SetErrorHandler(e ErrorStrategy) {
+ p.errHandler = e
+}
+
+// Match current input symbol against {@code ttype}. If the symbol type
+// Matches, {@link ANTLRErrorStrategy//ReportMatch} and {@link //consume} are
+// called to complete the Match process.
+//
+//
If the symbol type does not Match,
+// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
+// strategy to attempt recovery. If {@link //getBuildParseTree} is
+// {@code true} and the token index of the symbol returned by
+// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
+// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
+//
+// @param ttype the token type to Match
+// @return the Matched symbol
+// @panics RecognitionException if the current input symbol did not Match
+// {@code ttype} and the error strategy could not recover from the
+// mismatched symbol
+
+func (p *BaseParser) Match(ttype int) Token {
+
+ t := p.GetCurrentToken()
+
+ if t.GetTokenType() == ttype {
+ p.errHandler.ReportMatch(p)
+ p.Consume()
+ } else {
+ t = p.errHandler.RecoverInline(p)
+ if p.BuildParseTrees && t.GetTokenIndex() == -1 {
+ // we must have conjured up a Newtoken during single token
+ // insertion
+ // if it's not the current symbol
+ p.ctx.AddErrorNode(t)
+ }
+ }
+
+ return t
+}
+
+// Match current input symbol as a wildcard. If the symbol type Matches
+// (i.e. has a value greater than 0), {@link ANTLRErrorStrategy//ReportMatch}
+// and {@link //consume} are called to complete the Match process.
+//
+//
If the symbol type does not Match,
+// {@link ANTLRErrorStrategy//recoverInline} is called on the current error
+// strategy to attempt recovery. If {@link //getBuildParseTree} is
+// {@code true} and the token index of the symbol returned by
+// {@link ANTLRErrorStrategy//recoverInline} is -1, the symbol is added to
+// the parse tree by calling {@link ParserRuleContext//addErrorNode}.
+//
+// @return the Matched symbol
+// @panics RecognitionException if the current input symbol did not Match
+// a wildcard and the error strategy could not recover from the mismatched
+// symbol
+
+func (p *BaseParser) MatchWildcard() Token {
+ t := p.GetCurrentToken()
+ if t.GetTokenType() > 0 {
+ p.errHandler.ReportMatch(p)
+ p.Consume()
+ } else {
+ t = p.errHandler.RecoverInline(p)
+ if p.BuildParseTrees && t.GetTokenIndex() == -1 {
+ // we must have conjured up a Newtoken during single token
+ // insertion
+ // if it's not the current symbol
+ p.ctx.AddErrorNode(t)
+ }
+ }
+ return t
+}
+
+func (p *BaseParser) GetParserRuleContext() ParserRuleContext {
+ return p.ctx
+}
+
+func (p *BaseParser) SetParserRuleContext(v ParserRuleContext) {
+ p.ctx = v
+}
+
+func (p *BaseParser) GetParseListeners() []ParseTreeListener {
+ if p.parseListeners == nil {
+ return make([]ParseTreeListener, 0)
+ }
+ return p.parseListeners
+}
+
+// Registers {@code listener} to receive events during the parsing process.
+//
+//
To support output-preserving grammar transformations (including but not
+// limited to left-recursion removal, automated left-factoring, and
+// optimized code generation), calls to listener methods during the parse
+// may differ substantially from calls made by
+// {@link ParseTreeWalker//DEFAULT} used after the parse is complete. In
+// particular, rule entry and exit events may occur in a different order
+// during the parse than after the parser. In addition, calls to certain
+// rule entry methods may be omitted.
+//
+//
With the following specific exceptions, calls to listener events are
+// deterministic, i.e. for identical input the calls to listener
+// methods will be the same.
+//
+//
+//
Alterations to the grammar used to generate code may change the
+// behavior of the listener calls.
+//
Alterations to the command line options passed to ANTLR 4 when
+// generating the parser may change the behavior of the listener calls.
+//
Changing the version of the ANTLR Tool used to generate the parser
+// may change the behavior of the listener calls.
+//
+//
+// @param listener the listener to add
+//
+// @panics nilPointerException if {@code} listener is {@code nil}
+func (p *BaseParser) AddParseListener(listener ParseTreeListener) {
+ if listener == nil {
+ panic("listener")
+ }
+ if p.parseListeners == nil {
+ p.parseListeners = make([]ParseTreeListener, 0)
+ }
+ p.parseListeners = append(p.parseListeners, listener)
+}
+
+// Remove {@code listener} from the list of parse listeners.
+//
+//
If {@code listener} is {@code nil} or has not been added as a parse
+// listener, p.method does nothing.
+// @param listener the listener to remove
+func (p *BaseParser) RemoveParseListener(listener ParseTreeListener) {
+
+ if p.parseListeners != nil {
+
+ idx := -1
+ for i, v := range p.parseListeners {
+ if v == listener {
+ idx = i
+ break
+ }
+ }
+
+ if idx == -1 {
+ return
+ }
+
+ // remove the listener from the slice
+ p.parseListeners = append(p.parseListeners[0:idx], p.parseListeners[idx+1:]...)
+
+ if len(p.parseListeners) == 0 {
+ p.parseListeners = nil
+ }
+ }
+}
+
+// Remove all parse listeners.
+func (p *BaseParser) removeParseListeners() {
+ p.parseListeners = nil
+}
+
+// Notify any parse listeners of an enter rule event.
+func (p *BaseParser) TriggerEnterRuleEvent() {
+ if p.parseListeners != nil {
+ ctx := p.ctx
+ for _, listener := range p.parseListeners {
+ listener.EnterEveryRule(ctx)
+ ctx.EnterRule(listener)
+ }
+ }
+}
+
+// Notify any parse listeners of an exit rule event.
+//
+// @see //addParseListener
+func (p *BaseParser) TriggerExitRuleEvent() {
+ if p.parseListeners != nil {
+ // reverse order walk of listeners
+ ctx := p.ctx
+ l := len(p.parseListeners) - 1
+
+ for i := range p.parseListeners {
+ listener := p.parseListeners[l-i]
+ ctx.ExitRule(listener)
+ listener.ExitEveryRule(ctx)
+ }
+ }
+}
+
+func (p *BaseParser) GetInterpreter() *ParserATNSimulator {
+ return p.Interpreter
+}
+
+func (p *BaseParser) GetATN() *ATN {
+ return p.Interpreter.atn
+}
+
+func (p *BaseParser) GetTokenFactory() TokenFactory {
+ return p.input.GetTokenSource().GetTokenFactory()
+}
+
+// Tell our token source and error strategy about a Newway to create tokens.//
+func (p *BaseParser) setTokenFactory(factory TokenFactory) {
+ p.input.GetTokenSource().setTokenFactory(factory)
+}
+
+// The ATN with bypass alternatives is expensive to create so we create it
+// lazily.
+//
+// @panics UnsupportedOperationException if the current parser does not
+// implement the {@link //getSerializedATN()} method.
+func (p *BaseParser) GetATNWithBypassAlts() {
+
+ // TODO
+ panic("Not implemented!")
+
+ // serializedAtn := p.getSerializedATN()
+ // if (serializedAtn == nil) {
+ // panic("The current parser does not support an ATN with bypass alternatives.")
+ // }
+ // result := p.bypassAltsAtnCache[serializedAtn]
+ // if (result == nil) {
+ // deserializationOptions := NewATNDeserializationOptions(nil)
+ // deserializationOptions.generateRuleBypassTransitions = true
+ // result = NewATNDeserializer(deserializationOptions).deserialize(serializedAtn)
+ // p.bypassAltsAtnCache[serializedAtn] = result
+ // }
+ // return result
+}
+
+// The preferred method of getting a tree pattern. For example, here's a
+// sample use:
+//
+//
+// ParseTree t = parser.expr()
+// ParseTreePattern p = parser.compileParseTreePattern("<ID>+0",
+// MyParser.RULE_expr)
+// ParseTreeMatch m = p.Match(t)
+// String id = m.Get("ID")
+//
+
+func (p *BaseParser) compileParseTreePattern(pattern, patternRuleIndex, lexer Lexer) {
+
+ panic("NewParseTreePatternMatcher not implemented!")
+ //
+ // if (lexer == nil) {
+ // if (p.GetTokenStream() != nil) {
+ // tokenSource := p.GetTokenStream().GetTokenSource()
+ // if _, ok := tokenSource.(ILexer); ok {
+ // lexer = tokenSource
+ // }
+ // }
+ // }
+ // if (lexer == nil) {
+ // panic("Parser can't discover a lexer to use")
+ // }
+
+ // m := NewParseTreePatternMatcher(lexer, p)
+ // return m.compile(pattern, patternRuleIndex)
+}
+
+func (p *BaseParser) GetInputStream() IntStream {
+ return p.GetTokenStream()
+}
+
+func (p *BaseParser) SetInputStream(input TokenStream) {
+ p.SetTokenStream(input)
+}
+
+func (p *BaseParser) GetTokenStream() TokenStream {
+ return p.input
+}
+
+// Set the token stream and reset the parser.//
+func (p *BaseParser) SetTokenStream(input TokenStream) {
+ p.input = nil
+ p.reset()
+ p.input = input
+}
+
+// Match needs to return the current input symbol, which gets put
+// into the label for the associated token ref e.g., x=ID.
+func (p *BaseParser) GetCurrentToken() Token {
+ return p.input.LT(1)
+}
+
+func (p *BaseParser) NotifyErrorListeners(msg string, offendingToken Token, err RecognitionException) {
+ if offendingToken == nil {
+ offendingToken = p.GetCurrentToken()
+ }
+ p._SyntaxErrors++
+ line := offendingToken.GetLine()
+ column := offendingToken.GetColumn()
+ listener := p.GetErrorListenerDispatch()
+ listener.SyntaxError(p, offendingToken, line, column, msg, err)
+}
+
+func (p *BaseParser) Consume() Token {
+ o := p.GetCurrentToken()
+ if o.GetTokenType() != TokenEOF {
+ p.GetInputStream().Consume()
+ }
+ hasListener := p.parseListeners != nil && len(p.parseListeners) > 0
+ if p.BuildParseTrees || hasListener {
+ if p.errHandler.InErrorRecoveryMode(p) {
+ node := p.ctx.AddErrorNode(o)
+ if p.parseListeners != nil {
+ for _, l := range p.parseListeners {
+ l.VisitErrorNode(node)
+ }
+ }
+
+ } else {
+ node := p.ctx.AddTokenNode(o)
+ if p.parseListeners != nil {
+ for _, l := range p.parseListeners {
+ l.VisitTerminal(node)
+ }
+ }
+ }
+ // node.invokingState = p.state
+ }
+
+ return o
+}
+
+func (p *BaseParser) addContextToParseTree() {
+ // add current context to parent if we have a parent
+ if p.ctx.GetParent() != nil {
+ p.ctx.GetParent().(ParserRuleContext).AddChild(p.ctx)
+ }
+}
+
+func (p *BaseParser) EnterRule(localctx ParserRuleContext, state, ruleIndex int) {
+ p.SetState(state)
+ p.ctx = localctx
+ p.ctx.SetStart(p.input.LT(1))
+ if p.BuildParseTrees {
+ p.addContextToParseTree()
+ }
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent()
+ }
+}
+
+func (p *BaseParser) ExitRule() {
+ p.ctx.SetStop(p.input.LT(-1))
+ // trigger event on ctx, before it reverts to parent
+ if p.parseListeners != nil {
+ p.TriggerExitRuleEvent()
+ }
+ p.SetState(p.ctx.GetInvokingState())
+ if p.ctx.GetParent() != nil {
+ p.ctx = p.ctx.GetParent().(ParserRuleContext)
+ } else {
+ p.ctx = nil
+ }
+}
+
+func (p *BaseParser) EnterOuterAlt(localctx ParserRuleContext, altNum int) {
+ localctx.SetAltNumber(altNum)
+ // if we have Newlocalctx, make sure we replace existing ctx
+ // that is previous child of parse tree
+ if p.BuildParseTrees && p.ctx != localctx {
+ if p.ctx.GetParent() != nil {
+ p.ctx.GetParent().(ParserRuleContext).RemoveLastChild()
+ p.ctx.GetParent().(ParserRuleContext).AddChild(localctx)
+ }
+ }
+ p.ctx = localctx
+}
+
+// Get the precedence level for the top-most precedence rule.
+//
+// @return The precedence level for the top-most precedence rule, or -1 if
+// the parser context is not nested within a precedence rule.
+
+func (p *BaseParser) GetPrecedence() int {
+ if len(p.precedenceStack) == 0 {
+ return -1
+ }
+
+ return p.precedenceStack[len(p.precedenceStack)-1]
+}
+
+func (p *BaseParser) EnterRecursionRule(localctx ParserRuleContext, state, ruleIndex, precedence int) {
+ p.SetState(state)
+ p.precedenceStack.Push(precedence)
+ p.ctx = localctx
+ p.ctx.SetStart(p.input.LT(1))
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent() // simulates rule entry for
+ // left-recursive rules
+ }
+}
+
+//
+// Like {@link //EnterRule} but for recursive rules.
+
+func (p *BaseParser) PushNewRecursionContext(localctx ParserRuleContext, state, ruleIndex int) {
+ previous := p.ctx
+ previous.SetParent(localctx)
+ previous.SetInvokingState(state)
+ previous.SetStop(p.input.LT(-1))
+
+ p.ctx = localctx
+ p.ctx.SetStart(previous.GetStart())
+ if p.BuildParseTrees {
+ p.ctx.AddChild(previous)
+ }
+ if p.parseListeners != nil {
+ p.TriggerEnterRuleEvent() // simulates rule entry for
+ // left-recursive rules
+ }
+}
+
+func (p *BaseParser) UnrollRecursionContexts(parentCtx ParserRuleContext) {
+ p.precedenceStack.Pop()
+ p.ctx.SetStop(p.input.LT(-1))
+ retCtx := p.ctx // save current ctx (return value)
+ // unroll so ctx is as it was before call to recursive method
+ if p.parseListeners != nil {
+ for p.ctx != parentCtx {
+ p.TriggerExitRuleEvent()
+ p.ctx = p.ctx.GetParent().(ParserRuleContext)
+ }
+ } else {
+ p.ctx = parentCtx
+ }
+ // hook into tree
+ retCtx.SetParent(parentCtx)
+ if p.BuildParseTrees && parentCtx != nil {
+ // add return ctx into invoking rule's tree
+ parentCtx.AddChild(retCtx)
+ }
+}
+
+func (p *BaseParser) GetInvokingContext(ruleIndex int) ParserRuleContext {
+ ctx := p.ctx
+ for ctx != nil {
+ if ctx.GetRuleIndex() == ruleIndex {
+ return ctx
+ }
+ ctx = ctx.GetParent().(ParserRuleContext)
+ }
+ return nil
+}
+
+func (p *BaseParser) Precpred(localctx RuleContext, precedence int) bool {
+ return precedence >= p.precedenceStack[len(p.precedenceStack)-1]
+}
+
+func (p *BaseParser) inContext(context ParserRuleContext) bool {
+ // TODO: useful in parser?
+ return false
+}
+
+//
+// Checks whether or not {@code symbol} can follow the current state in the
+// ATN. The behavior of p.method is equivalent to the following, but is
+// implemented such that the complete context-sensitive follow set does not
+// need to be explicitly constructed.
+//
+//
+//
+// @param symbol the symbol type to check
+// @return {@code true} if {@code symbol} can follow the current state in
+// the ATN, otherwise {@code false}.
+
+func (p *BaseParser) IsExpectedToken(symbol int) bool {
+ atn := p.Interpreter.atn
+ ctx := p.ctx
+ s := atn.states[p.state]
+ following := atn.NextTokens(s, nil)
+ if following.contains(symbol) {
+ return true
+ }
+ if !following.contains(TokenEpsilon) {
+ return false
+ }
+ for ctx != nil && ctx.GetInvokingState() >= 0 && following.contains(TokenEpsilon) {
+ invokingState := atn.states[ctx.GetInvokingState()]
+ rt := invokingState.GetTransitions()[0]
+ following = atn.NextTokens(rt.(*RuleTransition).followState, nil)
+ if following.contains(symbol) {
+ return true
+ }
+ ctx = ctx.GetParent().(ParserRuleContext)
+ }
+ if following.contains(TokenEpsilon) && symbol == TokenEOF {
+ return true
+ }
+
+ return false
+}
+
+// Computes the set of input symbols which could follow the current parser
+// state and context, as given by {@link //GetState} and {@link //GetContext},
+// respectively.
+//
+// @see ATN//getExpectedTokens(int, RuleContext)
+func (p *BaseParser) GetExpectedTokens() *IntervalSet {
+ return p.Interpreter.atn.getExpectedTokens(p.state, p.ctx)
+}
+
+func (p *BaseParser) GetExpectedTokensWithinCurrentRule() *IntervalSet {
+ atn := p.Interpreter.atn
+ s := atn.states[p.state]
+ return atn.NextTokens(s, nil)
+}
+
+// Get a rule's index (i.e., {@code RULE_ruleName} field) or -1 if not found.//
+func (p *BaseParser) GetRuleIndex(ruleName string) int {
+ var ruleIndex, ok = p.GetRuleIndexMap()[ruleName]
+ if ok {
+ return ruleIndex
+ }
+
+ return -1
+}
+
+// Return List<String> of the rule names in your parser instance
+// leading up to a call to the current rule. You could override if
+// you want more details such as the file/line info of where
+// in the ATN a rule is invoked.
+//
+// this very useful for error messages.
+
+func (p *BaseParser) GetRuleInvocationStack(c ParserRuleContext) []string {
+ if c == nil {
+ c = p.ctx
+ }
+ stack := make([]string, 0)
+ for c != nil {
+ // compute what follows who invoked us
+ ruleIndex := c.GetRuleIndex()
+ if ruleIndex < 0 {
+ stack = append(stack, "n/a")
+ } else {
+ stack = append(stack, p.GetRuleNames()[ruleIndex])
+ }
+
+ vp := c.GetParent()
+
+ if vp == nil {
+ break
+ }
+
+ c = vp.(ParserRuleContext)
+ }
+ return stack
+}
+
+// For debugging and other purposes.//
+func (p *BaseParser) GetDFAStrings() string {
+ return fmt.Sprint(p.Interpreter.decisionToDFA)
+}
+
+// For debugging and other purposes.//
+func (p *BaseParser) DumpDFA() {
+ seenOne := false
+ for _, dfa := range p.Interpreter.decisionToDFA {
+ if dfa.states.Len() > 0 {
+ if seenOne {
+ fmt.Println()
+ }
+ fmt.Println("Decision " + strconv.Itoa(dfa.decision) + ":")
+ fmt.Print(dfa.String(p.LiteralNames, p.SymbolicNames))
+ seenOne = true
+ }
+ }
+}
+
+func (p *BaseParser) GetSourceName() string {
+ return p.GrammarFileName
+}
+
+// During a parse is sometimes useful to listen in on the rule entry and exit
+// events as well as token Matches. p.is for quick and dirty debugging.
+func (p *BaseParser) SetTrace(trace *TraceListener) {
+ if trace == nil {
+ p.RemoveParseListener(p.tracer)
+ p.tracer = nil
+ } else {
+ if p.tracer != nil {
+ p.RemoveParseListener(p.tracer)
+ }
+ p.tracer = NewTraceListener(p)
+ p.AddParseListener(p.tracer)
+ }
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go
similarity index 94%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go
index 888d512975..8bcc46a0d9 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_atn_simulator.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_atn_simulator.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -11,11 +11,11 @@ import (
)
var (
- ParserATNSimulatorDebug = false
- ParserATNSimulatorListATNDecisions = false
- ParserATNSimulatorDFADebug = false
- ParserATNSimulatorRetryDebug = false
- TurnOffLRLoopEntryBranchOpt = false
+ ParserATNSimulatorDebug = false
+ ParserATNSimulatorTraceATNSim = false
+ ParserATNSimulatorDFADebug = false
+ ParserATNSimulatorRetryDebug = false
+ TurnOffLRLoopEntryBranchOpt = false
)
type ParserATNSimulator struct {
@@ -70,8 +70,8 @@ func (p *ParserATNSimulator) reset() {
}
func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, outerContext ParserRuleContext) int {
- if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions {
- fmt.Println("AdaptivePredict decision " + strconv.Itoa(decision) +
+ if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim {
+ fmt.Println("adaptivePredict decision " + strconv.Itoa(decision) +
" exec LA(1)==" + p.getLookaheadName(input) +
" line " + strconv.Itoa(input.LT(1).GetLine()) + ":" +
strconv.Itoa(input.LT(1).GetColumn()))
@@ -111,15 +111,15 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou
if s0 == nil {
if outerContext == nil {
- outerContext = RuleContextEmpty
+ outerContext = ParserRuleContextEmpty
}
- if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions {
+ if ParserATNSimulatorDebug {
fmt.Println("predictATN decision " + strconv.Itoa(dfa.decision) +
" exec LA(1)==" + p.getLookaheadName(input) +
", outerContext=" + outerContext.String(p.parser.GetRuleNames(), nil))
}
fullCtx := false
- s0Closure := p.computeStartState(dfa.atnStartState, RuleContextEmpty, fullCtx)
+ s0Closure := p.computeStartState(dfa.atnStartState, ParserRuleContextEmpty, fullCtx)
p.atn.stateMu.Lock()
if dfa.getPrecedenceDfa() {
@@ -174,17 +174,18 @@ func (p *ParserATNSimulator) AdaptivePredict(input TokenStream, decision int, ou
// Reporting insufficient predicates
// cover these cases:
-// dead end
-// single alt
-// single alt + preds
-// conflict
-// conflict + preds
//
+// dead end
+// single alt
+// single alt + preds
+// conflict
+// conflict + preds
func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream, startIndex int, outerContext ParserRuleContext) int {
- if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions {
+ if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim {
fmt.Println("execATN decision " + strconv.Itoa(dfa.decision) +
- " exec LA(1)==" + p.getLookaheadName(input) +
+ ", DFA state " + s0.String() +
+ ", LA(1)==" + p.getLookaheadName(input) +
" line " + strconv.Itoa(input.LT(1).GetLine()) + ":" + strconv.Itoa(input.LT(1).GetColumn()))
}
@@ -277,8 +278,6 @@ func (p *ParserATNSimulator) execATN(dfa *DFA, s0 *DFAState, input TokenStream,
t = input.LA(1)
}
}
-
- panic("Should not have reached p state")
}
// Get an existing target state for an edge in the DFA. If the target state
@@ -384,7 +383,7 @@ func (p *ParserATNSimulator) predicateDFAState(dfaState *DFAState, decisionState
// comes back with reach.uniqueAlt set to a valid alt
func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 ATNConfigSet, input TokenStream, startIndex int, outerContext ParserRuleContext) int {
- if ParserATNSimulatorDebug || ParserATNSimulatorListATNDecisions {
+ if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim {
fmt.Println("execATNWithFullContext " + s0.String())
}
@@ -492,9 +491,6 @@ func (p *ParserATNSimulator) execATNWithFullContext(dfa *DFA, D *DFAState, s0 AT
}
func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCtx bool) ATNConfigSet {
- if ParserATNSimulatorDebug {
- fmt.Println("in computeReachSet, starting closure: " + closure.String())
- }
if p.mergeCache == nil {
p.mergeCache = NewDoubleDict()
}
@@ -570,7 +566,7 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt
//
if reach == nil {
reach = NewBaseATNConfigSet(fullCtx)
- closureBusy := newArray2DHashSet(nil, nil)
+ closureBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](aConfEqInst)
treatEOFAsEpsilon := t == TokenEOF
amount := len(intermediate.configs)
for k := 0; k < amount; k++ {
@@ -610,6 +606,11 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt
reach.Add(skippedStopStates[l], p.mergeCache)
}
}
+
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("computeReachSet " + closure.String() + " -> " + reach.String())
+ }
+
if len(reach.GetItems()) == 0 {
return nil
}
@@ -617,7 +618,6 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt
return reach
}
-//
// Return a configuration set containing only the configurations from
// {@code configs} which are in a {@link RuleStopState}. If all
// configurations in {@code configs} are already in a rule stop state, p
@@ -636,7 +636,6 @@ func (p *ParserATNSimulator) computeReachSet(closure ATNConfigSet, t int, fullCt
// @return {@code configs} if all configurations in {@code configs} are in a
// rule stop state, otherwise return a Newconfiguration set containing only
// the configurations from {@code configs} which are in a rule stop state
-//
func (p *ParserATNSimulator) removeAllConfigsNotInRuleStopState(configs ATNConfigSet, lookToEndOfRule bool) ATNConfigSet {
if PredictionModeallConfigsInRuleStopStates(configs) {
return configs
@@ -662,16 +661,20 @@ func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, full
// always at least the implicit call to start rule
initialContext := predictionContextFromRuleContext(p.atn, ctx)
configs := NewBaseATNConfigSet(fullCtx)
+ if ParserATNSimulatorDebug || ParserATNSimulatorTraceATNSim {
+ fmt.Println("computeStartState from ATN state " + a.String() +
+ " initialContext=" + initialContext.String())
+ }
+
for i := 0; i < len(a.GetTransitions()); i++ {
target := a.GetTransitions()[i].getTarget()
c := NewBaseATNConfig6(target, i+1, initialContext)
- closureBusy := newArray2DHashSet(nil, nil)
+ closureBusy := NewJStore[ATNConfig, Comparator[ATNConfig]](atnConfCompInst)
p.closure(c, configs, closureBusy, true, fullCtx, false)
}
return configs
}
-//
// This method transforms the start state computed by
// {@link //computeStartState} to the special start state used by a
// precedence DFA for a particular precedence value. The transformation
@@ -726,7 +729,6 @@ func (p *ParserATNSimulator) computeStartState(a ATNState, ctx RuleContext, full
// @return The transformed configuration set representing the start state
// for a precedence DFA at a particular precedence level (determined by
// calling {@link Parser//getPrecedence}).
-//
func (p *ParserATNSimulator) applyPrecedenceFilter(configs ATNConfigSet) ATNConfigSet {
statesFromAlt1 := make(map[int]PredictionContext)
@@ -760,7 +762,7 @@ func (p *ParserATNSimulator) applyPrecedenceFilter(configs ATNConfigSet) ATNConf
// (basically a graph subtraction algorithm).
if !config.getPrecedenceFilterSuppressed() {
context := statesFromAlt1[config.GetState().GetStateNumber()]
- if context != nil && context.equals(config.GetContext()) {
+ if context != nil && context.Equals(config.GetContext()) {
// eliminated
continue
}
@@ -824,7 +826,6 @@ func (p *ParserATNSimulator) getPredicatePredictions(ambigAlts *BitSet, altToPre
return pairs
}
-//
// This method is used to improve the localization of error messages by
// choosing an alternative rather than panicing a
// {@link NoViableAltException} in particular prediction scenarios where the
@@ -869,7 +870,6 @@ func (p *ParserATNSimulator) getPredicatePredictions(ambigAlts *BitSet, altToPre
// @return The value to return from {@link //AdaptivePredict}, or
// {@link ATN//INVALID_ALT_NUMBER} if a suitable alternative was not
// identified and {@link //AdaptivePredict} should Report an error instead.
-//
func (p *ParserATNSimulator) getSynValidOrSemInvalidAltThatFinishedDecisionEntryRule(configs ATNConfigSet, outerContext ParserRuleContext) int {
cfgs := p.splitAccordingToSemanticValidity(configs, outerContext)
semValidConfigs := cfgs[0]
@@ -938,11 +938,11 @@ func (p *ParserATNSimulator) splitAccordingToSemanticValidity(configs ATNConfigS
}
// Look through a list of predicate/alt pairs, returning alts for the
-// pairs that win. A {@code NONE} predicate indicates an alt containing an
-// unpredicated config which behaves as "always true." If !complete
-// then we stop at the first predicate that evaluates to true. This
-// includes pairs with nil predicates.
//
+// pairs that win. A {@code NONE} predicate indicates an alt containing an
+// unpredicated config which behaves as "always true." If !complete
+// then we stop at the first predicate that evaluates to true. This
+// includes pairs with nil predicates.
func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPrediction, outerContext ParserRuleContext, complete bool) *BitSet {
predictions := NewBitSet()
for i := 0; i < len(predPredictions); i++ {
@@ -972,16 +972,16 @@ func (p *ParserATNSimulator) evalSemanticContext(predPredictions []*PredPredicti
return predictions
}
-func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx, treatEOFAsEpsilon bool) {
+func (p *ParserATNSimulator) closure(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx, treatEOFAsEpsilon bool) {
initialDepth := 0
p.closureCheckingStopState(config, configs, closureBusy, collectPredicates,
fullCtx, initialDepth, treatEOFAsEpsilon)
}
-func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
- if ParserATNSimulatorDebug {
+func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
+ if ParserATNSimulatorTraceATNSim {
fmt.Println("closure(" + config.String() + ")")
- fmt.Println("configs(" + configs.String() + ")")
+ //fmt.Println("configs(" + configs.String() + ")")
if config.GetReachesIntoOuterContext() > 50 {
panic("problem")
}
@@ -1031,7 +1031,7 @@ func (p *ParserATNSimulator) closureCheckingStopState(config ATNConfig, configs
}
// Do the actual work of walking epsilon edges//
-func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy Set, collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
+func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet, closureBusy *JStore[ATNConfig, Comparator[ATNConfig]], collectPredicates, fullCtx bool, depth int, treatEOFAsEpsilon bool) {
state := config.GetState()
// optimization
if !state.GetEpsilonOnlyTransitions() {
@@ -1066,7 +1066,8 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet,
c.SetReachesIntoOuterContext(c.GetReachesIntoOuterContext() + 1)
- if closureBusy.Add(c) != c {
+ _, present := closureBusy.Put(c)
+ if present {
// avoid infinite recursion for right-recursive rules
continue
}
@@ -1077,9 +1078,13 @@ func (p *ParserATNSimulator) closureWork(config ATNConfig, configs ATNConfigSet,
fmt.Println("dips into outer ctx: " + c.String())
}
} else {
- if !t.getIsEpsilon() && closureBusy.Add(c) != c {
- // avoid infinite recursion for EOF* and EOF+
- continue
+
+ if !t.getIsEpsilon() {
+ _, present := closureBusy.Put(c)
+ if present {
+ // avoid infinite recursion for EOF* and EOF+
+ continue
+ }
}
if _, ok := t.(*RuleTransition); ok {
// latch when newDepth goes negative - once we step out of the entry context we can't return
@@ -1104,7 +1109,16 @@ func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config ATNC
// left-recursion elimination. For efficiency, also check if
// the context has an empty stack case. If so, it would mean
// global FOLLOW so we can't perform optimization
- if startLoop, ok := _p.(StarLoopEntryState); !ok || !startLoop.precedenceRuleDecision || config.GetContext().isEmpty() || config.GetContext().hasEmptyPath() {
+ if _p.GetStateType() != ATNStateStarLoopEntry {
+ return false
+ }
+ startLoop, ok := _p.(*StarLoopEntryState)
+ if !ok {
+ return false
+ }
+ if !startLoop.precedenceRuleDecision ||
+ config.GetContext().isEmpty() ||
+ config.GetContext().hasEmptyPath() {
return false
}
@@ -1117,8 +1131,8 @@ func (p *ParserATNSimulator) canDropLoopEntryEdgeInLeftRecursiveRule(config ATNC
return false
}
}
-
- decisionStartState := _p.(BlockStartState).GetTransitions()[0].getTarget().(BlockStartState)
+ x := _p.GetTransitions()[0].getTarget()
+ decisionStartState := x.(BlockStartState)
blockEndStateNum := decisionStartState.getEndState().stateNumber
blockEndState := p.atn.states[blockEndStateNum].(*BlockEndState)
@@ -1355,13 +1369,12 @@ func (p *ParserATNSimulator) GetTokenName(t int) string {
return "EOF"
}
- if p.parser != nil && p.parser.GetLiteralNames() != nil {
- if t >= len(p.parser.GetLiteralNames()) {
- fmt.Println(strconv.Itoa(t) + " ttype out of range: " + strings.Join(p.parser.GetLiteralNames(), ","))
- // fmt.Println(p.parser.GetInputStream().(TokenStream).GetAllText()) // p seems incorrect
- } else {
- return p.parser.GetLiteralNames()[t] + "<" + strconv.Itoa(t) + ">"
- }
+ if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetLiteralNames()) {
+ return p.parser.GetLiteralNames()[t] + "<" + strconv.Itoa(t) + ">"
+ }
+
+ if p.parser != nil && p.parser.GetLiteralNames() != nil && t < len(p.parser.GetSymbolicNames()) {
+ return p.parser.GetSymbolicNames()[t] + "<" + strconv.Itoa(t) + ">"
}
return strconv.Itoa(t)
@@ -1372,9 +1385,9 @@ func (p *ParserATNSimulator) getLookaheadName(input TokenStream) string {
}
// Used for debugging in AdaptivePredict around execATN but I cut
-// it out for clarity now that alg. works well. We can leave p
-// "dead" code for a bit.
//
+// it out for clarity now that alg. works well. We can leave p
+// "dead" code for a bit.
func (p *ParserATNSimulator) dumpDeadEndConfigs(nvae *NoViableAltException) {
panic("Not implemented")
@@ -1421,7 +1434,6 @@ func (p *ParserATNSimulator) getUniqueAlt(configs ATNConfigSet) int {
return alt
}
-//
// Add an edge to the DFA, if possible. This method calls
// {@link //addDFAState} to ensure the {@code to} state is present in the
// DFA. If {@code from} is {@code nil}, or if {@code t} is outside the
@@ -1440,7 +1452,6 @@ func (p *ParserATNSimulator) getUniqueAlt(configs ATNConfigSet) int {
// @return If {@code to} is {@code nil}, p method returns {@code nil}
// otherwise p method returns the result of calling {@link //addDFAState}
// on {@code to}
-//
func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFAState) *DFAState {
if ParserATNSimulatorDebug {
fmt.Println("EDGE " + from.String() + " -> " + to.String() + " upon " + p.GetTokenName(t))
@@ -1472,7 +1483,6 @@ func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFA
return to
}
-//
// Add state {@code D} to the DFA if it is not already present, and return
// the actual instance stored in the DFA. If a state equivalent to {@code D}
// is already in the DFA, the existing state is returned. Otherwise p
@@ -1486,25 +1496,30 @@ func (p *ParserATNSimulator) addDFAEdge(dfa *DFA, from *DFAState, t int, to *DFA
// @return The state stored in the DFA. This will be either the existing
// state if {@code D} is already in the DFA, or {@code D} itself if the
// state was not already present.
-//
func (p *ParserATNSimulator) addDFAState(dfa *DFA, d *DFAState) *DFAState {
if d == ATNSimulatorError {
return d
}
- hash := d.hash()
- existing, ok := dfa.getState(hash)
- if ok {
+ existing, present := dfa.states.Get(d)
+ if present {
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Print("addDFAState " + d.String() + " exists")
+ }
return existing
}
- d.stateNumber = dfa.numStates()
+
+ // The state was not present, so update it with configs
+ //
+ d.stateNumber = dfa.states.Len()
if !d.configs.ReadOnly() {
d.configs.OptimizeConfigs(p.BaseATNSimulator)
d.configs.SetReadOnly(true)
}
- dfa.setState(hash, d)
- if ParserATNSimulatorDebug {
- fmt.Println("adding NewDFA state: " + d.String())
+ dfa.states.Put(d)
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("addDFAState new " + d.String())
}
+
return d
}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go
index 49cd10c5ff..1c8cee7479 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/parser_rule_context.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/parser_rule_context.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -340,7 +340,7 @@ func (prc *BaseParserRuleContext) String(ruleNames []string, stop RuleContext) s
return s
}
-var RuleContextEmpty = NewBaseParserRuleContext(nil, -1)
+var ParserRuleContextEmpty = NewBaseParserRuleContext(nil, -1)
type InterpreterRuleContext interface {
ParserRuleContext
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go
similarity index 81%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go
index 9fdfd52b26..ba62af3610 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_context.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_context.go
@@ -1,10 +1,12 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
package antlr
import (
+ "fmt"
+ "golang.org/x/exp/slices"
"strconv"
)
@@ -26,10 +28,10 @@ var (
)
type PredictionContext interface {
- hash() int
+ Hash() int
+ Equals(interface{}) bool
GetParent(int) PredictionContext
getReturnState(int) int
- equals(PredictionContext) bool
length() int
isEmpty() bool
hasEmptyPath() bool
@@ -53,7 +55,7 @@ func (b *BasePredictionContext) isEmpty() bool {
func calculateHash(parent PredictionContext, returnState int) int {
h := murmurInit(1)
- h = murmurUpdate(h, parent.hash())
+ h = murmurUpdate(h, parent.Hash())
h = murmurUpdate(h, returnState)
return murmurFinish(h, 2)
}
@@ -86,7 +88,6 @@ func NewPredictionContextCache() *PredictionContextCache {
// Add a context to the cache and return it. If the context already exists,
// return that one instead and do not add a Newcontext to the cache.
// Protect shared cache from unsafe thread access.
-//
func (p *PredictionContextCache) add(ctx PredictionContext) PredictionContext {
if ctx == BasePredictionContextEMPTY {
return BasePredictionContextEMPTY
@@ -160,28 +161,28 @@ func (b *BaseSingletonPredictionContext) hasEmptyPath() bool {
return b.returnState == BasePredictionContextEmptyReturnState
}
-func (b *BaseSingletonPredictionContext) equals(other PredictionContext) bool {
+func (b *BaseSingletonPredictionContext) Hash() int {
+ return b.cachedHash
+}
+
+func (b *BaseSingletonPredictionContext) Equals(other interface{}) bool {
if b == other {
return true
- } else if _, ok := other.(*BaseSingletonPredictionContext); !ok {
+ }
+ if _, ok := other.(*BaseSingletonPredictionContext); !ok {
return false
- } else if b.hash() != other.hash() {
- return false // can't be same if hash is different
}
otherP := other.(*BaseSingletonPredictionContext)
- if b.returnState != other.getReturnState(0) {
+ if b.returnState != otherP.getReturnState(0) {
return false
- } else if b.parentCtx == nil {
+ }
+ if b.parentCtx == nil {
return otherP.parentCtx == nil
}
- return b.parentCtx.equals(otherP.parentCtx)
-}
-
-func (b *BaseSingletonPredictionContext) hash() int {
- return b.cachedHash
+ return b.parentCtx.Equals(otherP.parentCtx)
}
func (b *BaseSingletonPredictionContext) String() string {
@@ -215,7 +216,7 @@ func NewEmptyPredictionContext() *EmptyPredictionContext {
p := new(EmptyPredictionContext)
p.BaseSingletonPredictionContext = NewBaseSingletonPredictionContext(nil, BasePredictionContextEmptyReturnState)
-
+ p.cachedHash = calculateEmptyHash()
return p
}
@@ -231,7 +232,11 @@ func (e *EmptyPredictionContext) getReturnState(index int) int {
return e.returnState
}
-func (e *EmptyPredictionContext) equals(other PredictionContext) bool {
+func (e *EmptyPredictionContext) Hash() int {
+ return e.cachedHash
+}
+
+func (e *EmptyPredictionContext) Equals(other interface{}) bool {
return e == other
}
@@ -254,7 +259,7 @@ func NewArrayPredictionContext(parents []PredictionContext, returnStates []int)
hash := murmurInit(1)
for _, parent := range parents {
- hash = murmurUpdate(hash, parent.hash())
+ hash = murmurUpdate(hash, parent.Hash())
}
for _, returnState := range returnStates {
@@ -298,18 +303,31 @@ func (a *ArrayPredictionContext) getReturnState(index int) int {
return a.returnStates[index]
}
-func (a *ArrayPredictionContext) equals(other PredictionContext) bool {
- if _, ok := other.(*ArrayPredictionContext); !ok {
+// Equals is the default comparison function for ArrayPredictionContext when no specialized
+// implementation is needed for a collection
+func (a *ArrayPredictionContext) Equals(o interface{}) bool {
+ if a == o {
+ return true
+ }
+ other, ok := o.(*ArrayPredictionContext)
+ if !ok {
return false
- } else if a.cachedHash != other.hash() {
+ }
+ if a.cachedHash != other.Hash() {
return false // can't be same if hash is different
- } else {
- otherP := other.(*ArrayPredictionContext)
- return &a.returnStates == &otherP.returnStates && &a.parents == &otherP.parents
}
+
+ // Must compare the actual array elements and not just the array address
+ //
+ return slices.Equal(a.returnStates, other.returnStates) &&
+ slices.EqualFunc(a.parents, other.parents, func(x, y PredictionContext) bool {
+ return x.Equals(y)
+ })
}
-func (a *ArrayPredictionContext) hash() int {
+// Hash is the default hash function for ArrayPredictionContext when no specialized
+// implementation is needed for a collection
+func (a *ArrayPredictionContext) Hash() int {
return a.BasePredictionContext.cachedHash
}
@@ -343,11 +361,11 @@ func (a *ArrayPredictionContext) String() string {
// /
func predictionContextFromRuleContext(a *ATN, outerContext RuleContext) PredictionContext {
if outerContext == nil {
- outerContext = RuleContextEmpty
+ outerContext = ParserRuleContextEmpty
}
// if we are in RuleContext of start rule, s, then BasePredictionContext
// is EMPTY. Nobody called us. (if we are empty, return empty)
- if outerContext.GetParent() == nil || outerContext == RuleContextEmpty {
+ if outerContext.GetParent() == nil || outerContext == ParserRuleContextEmpty {
return BasePredictionContextEMPTY
}
// If we have a parent, convert it to a BasePredictionContext graph
@@ -359,11 +377,20 @@ func predictionContextFromRuleContext(a *ATN, outerContext RuleContext) Predicti
}
func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext {
- // share same graph if both same
- if a == b {
+
+ // Share same graph if both same
+ //
+ if a == b || a.Equals(b) {
return a
}
+ // In Java, EmptyPredictionContext inherits from SingletonPredictionContext, and so the test
+ // in java for SingletonPredictionContext will succeed and a new ArrayPredictionContext will be created
+ // from it.
+ // In go, EmptyPredictionContext does not equate to SingletonPredictionContext and so that conversion
+ // will fail. We need to test for both Empty and Singleton and create an ArrayPredictionContext from
+ // either of them.
+
ac, ok1 := a.(*BaseSingletonPredictionContext)
bc, ok2 := b.(*BaseSingletonPredictionContext)
@@ -380,17 +407,32 @@ func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict)
return b
}
}
- // convert singleton so both are arrays to normalize
- if _, ok := a.(*BaseSingletonPredictionContext); ok {
- a = NewArrayPredictionContext([]PredictionContext{a.GetParent(0)}, []int{a.getReturnState(0)})
+
+ // Convert Singleton or Empty so both are arrays to normalize - We should not use the existing parameters
+ // here.
+ //
+ // TODO: I think that maybe the Prediction Context structs should be redone as there is a chance we will see this mess again - maybe redo the logic here
+
+ var arp, arb *ArrayPredictionContext
+ var ok bool
+ if arp, ok = a.(*ArrayPredictionContext); ok {
+ } else if _, ok = a.(*BaseSingletonPredictionContext); ok {
+ arp = NewArrayPredictionContext([]PredictionContext{a.GetParent(0)}, []int{a.getReturnState(0)})
+ } else if _, ok = a.(*EmptyPredictionContext); ok {
+ arp = NewArrayPredictionContext([]PredictionContext{}, []int{})
}
- if _, ok := b.(*BaseSingletonPredictionContext); ok {
- b = NewArrayPredictionContext([]PredictionContext{b.GetParent(0)}, []int{b.getReturnState(0)})
+
+ if arb, ok = b.(*ArrayPredictionContext); ok {
+ } else if _, ok = b.(*BaseSingletonPredictionContext); ok {
+ arb = NewArrayPredictionContext([]PredictionContext{b.GetParent(0)}, []int{b.getReturnState(0)})
+ } else if _, ok = b.(*EmptyPredictionContext); ok {
+ arb = NewArrayPredictionContext([]PredictionContext{}, []int{})
}
- return mergeArrays(a.(*ArrayPredictionContext), b.(*ArrayPredictionContext), rootIsWildcard, mergeCache)
+
+ // Both arp and arb
+ return mergeArrays(arp, arb, rootIsWildcard, mergeCache)
}
-//
// Merge two {@link SingletonBasePredictionContext} instances.
//
//
Stack tops equal, parents merge is same return left graph.
@@ -423,11 +465,11 @@ func merge(a, b PredictionContext, rootIsWildcard bool, mergeCache *DoubleDict)
// /
func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext {
if mergeCache != nil {
- previous := mergeCache.Get(a.hash(), b.hash())
+ previous := mergeCache.Get(a.Hash(), b.Hash())
if previous != nil {
return previous.(PredictionContext)
}
- previous = mergeCache.Get(b.hash(), a.hash())
+ previous = mergeCache.Get(b.Hash(), a.Hash())
if previous != nil {
return previous.(PredictionContext)
}
@@ -436,7 +478,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool,
rootMerge := mergeRoot(a, b, rootIsWildcard)
if rootMerge != nil {
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), rootMerge)
+ mergeCache.set(a.Hash(), b.Hash(), rootMerge)
}
return rootMerge
}
@@ -456,7 +498,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool,
// Newjoined parent so create Newsingleton pointing to it, a'
spc := SingletonBasePredictionContextCreate(parent, a.returnState)
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), spc)
+ mergeCache.set(a.Hash(), b.Hash(), spc)
}
return spc
}
@@ -478,7 +520,7 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool,
parents := []PredictionContext{singleParent, singleParent}
apc := NewArrayPredictionContext(parents, payloads)
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), apc)
+ mergeCache.set(a.Hash(), b.Hash(), apc)
}
return apc
}
@@ -494,12 +536,11 @@ func mergeSingletons(a, b *BaseSingletonPredictionContext, rootIsWildcard bool,
}
apc := NewArrayPredictionContext(parents, payloads)
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), apc)
+ mergeCache.set(a.Hash(), b.Hash(), apc)
}
return apc
}
-//
// Handle case where at least one of {@code a} or {@code b} is
// {@link //EMPTY}. In the following diagrams, the symbol {@code $} is used
// to represent {@link //EMPTY}.
@@ -561,7 +602,6 @@ func mergeRoot(a, b SingletonPredictionContext, rootIsWildcard bool) PredictionC
return nil
}
-//
// Merge two {@link ArrayBasePredictionContext} instances.
//
//
Different tops, different parents.
@@ -583,12 +623,18 @@ func mergeRoot(a, b SingletonPredictionContext, rootIsWildcard bool) PredictionC
// /
func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache *DoubleDict) PredictionContext {
if mergeCache != nil {
- previous := mergeCache.Get(a.hash(), b.hash())
+ previous := mergeCache.Get(a.Hash(), b.Hash())
if previous != nil {
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous")
+ }
return previous.(PredictionContext)
}
- previous = mergeCache.Get(b.hash(), a.hash())
+ previous = mergeCache.Get(b.Hash(), a.Hash())
if previous != nil {
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> previous")
+ }
return previous.(PredictionContext)
}
}
@@ -608,7 +654,7 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache *
payload := a.returnStates[i]
// $+$ = $
bothDollars := payload == BasePredictionContextEmptyReturnState && aParent == nil && bParent == nil
- axAX := (aParent != nil && bParent != nil && aParent == bParent) // ax+ax
+ axAX := aParent != nil && bParent != nil && aParent == bParent // ax+ax
// ->
// ax
if bothDollars || axAX {
@@ -651,7 +697,7 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache *
if k == 1 { // for just one merged element, return singleton top
pc := SingletonBasePredictionContextCreate(mergedParents[0], mergedReturnStates[0])
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), pc)
+ mergeCache.set(a.Hash(), b.Hash(), pc)
}
return pc
}
@@ -663,27 +709,36 @@ func mergeArrays(a, b *ArrayPredictionContext, rootIsWildcard bool, mergeCache *
// if we created same array as a or b, return that instead
// TODO: track whether this is possible above during merge sort for speed
+ // TODO: In go, I do not think we can just do M == xx as M is a brand new allocation. This could be causing allocation problems
if M == a {
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), a)
+ mergeCache.set(a.Hash(), b.Hash(), a)
+ }
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> a")
}
return a
}
if M == b {
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), b)
+ mergeCache.set(a.Hash(), b.Hash(), b)
+ }
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> b")
}
return b
}
combineCommonParents(mergedParents)
if mergeCache != nil {
- mergeCache.set(a.hash(), b.hash(), M)
+ mergeCache.set(a.Hash(), b.Hash(), M)
+ }
+ if ParserATNSimulatorTraceATNSim {
+ fmt.Println("mergeArrays a=" + a.String() + ",b=" + b.String() + " -> " + M.String())
}
return M
}
-//
// Make pass over all M {@code parents} merge any {@code equals()}
// ones.
// /
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go
similarity index 95%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go
index 15718f912b..7b9b72fab1 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/prediction_mode.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/prediction_mode.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -70,7 +70,6 @@ const (
PredictionModeLLExactAmbigDetection = 2
)
-//
// Computes the SLL prediction termination condition.
//
//
@@ -108,9 +107,9 @@ const (
// The single-alt-state thing lets prediction continue upon rules like
// (otherwise, it would admit defeat too soon):
//
-//
{@code [12|1|[], 6|2|[], 12|2|[]]. s : (ID | ID ID?) '' }
+//
{@code [12|1|[], 6|2|[], 12|2|[]]. s : (ID | ID ID?) ” }
//
-//
When the ATN simulation reaches the state before {@code ''}, it has a
+//
When the ATN simulation reaches the state before {@code ”}, it has a
// DFA state that looks like: {@code [12|1|[], 6|2|[], 12|2|[]]}. Naturally
// {@code 12|1|[]} and {@code 12|2|[]} conflict, but we cannot stop
// processing this node because alternative to has another way to continue,
@@ -152,16 +151,15 @@ const (
//
//
Before testing these configurations against others, we have to merge
// {@code x} and {@code x'} (without modifying the existing configurations).
-// For example, we test {@code (x+x')==x''} when looking for conflicts in
+// For example, we test {@code (x+x')==x”} when looking for conflicts in
// the following configurations.
If the configuration set has predicates (as indicated by
// {@link ATNConfigSet//hasSemanticContext}), this algorithm makes a copy of
// the configurations to strip out all of the predicates so that a standard
// {@link ATNConfigSet} will merge everything ignoring predicates.
-//
func PredictionModehasSLLConflictTerminatingPrediction(mode int, configs ATNConfigSet) bool {
// Configs in rule stop states indicate reaching the end of the decision
// rule (local context) or end of start rule (full context). If all
@@ -229,7 +227,6 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool {
return true
}
-//
// Full LL prediction termination.
//
//
Can we stop looking ahead during ATN simulation or is there some
@@ -334,7 +331,7 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool {
//
//
//
//
@@ -369,31 +366,26 @@ func PredictionModeallConfigsInRuleStopStates(configs ATNConfigSet) bool {
// two or one and three so we keep going. We can only stop prediction when
// we need exact ambiguity detection when the sets look like
// {@code A={{1,2}}} or {@code {{1,2},{1,2}}}, etc...
-//
func PredictionModeresolvesToJustOneViableAlt(altsets []*BitSet) int {
return PredictionModegetSingleViableAlt(altsets)
}
-//
// Determines if every alternative subset in {@code altsets} contains more
// than one alternative.
//
// @param altsets a collection of alternative subsets
// @return {@code true} if every {@link BitSet} in {@code altsets} has
// {@link BitSet//cardinality cardinality} > 1, otherwise {@code false}
-//
func PredictionModeallSubsetsConflict(altsets []*BitSet) bool {
return !PredictionModehasNonConflictingAltSet(altsets)
}
-//
// Determines if any single alternative subset in {@code altsets} contains
// exactly one alternative.
//
// @param altsets a collection of alternative subsets
// @return {@code true} if {@code altsets} contains a {@link BitSet} with
// {@link BitSet//cardinality cardinality} 1, otherwise {@code false}
-//
func PredictionModehasNonConflictingAltSet(altsets []*BitSet) bool {
for i := 0; i < len(altsets); i++ {
alts := altsets[i]
@@ -404,14 +396,12 @@ func PredictionModehasNonConflictingAltSet(altsets []*BitSet) bool {
return false
}
-//
// Determines if any single alternative subset in {@code altsets} contains
// more than one alternative.
//
// @param altsets a collection of alternative subsets
// @return {@code true} if {@code altsets} contains a {@link BitSet} with
// {@link BitSet//cardinality cardinality} > 1, otherwise {@code false}
-//
func PredictionModehasConflictingAltSet(altsets []*BitSet) bool {
for i := 0; i < len(altsets); i++ {
alts := altsets[i]
@@ -422,13 +412,11 @@ func PredictionModehasConflictingAltSet(altsets []*BitSet) bool {
return false
}
-//
// Determines if every alternative subset in {@code altsets} is equivalent.
//
// @param altsets a collection of alternative subsets
// @return {@code true} if every member of {@code altsets} is equal to the
// others, otherwise {@code false}
-//
func PredictionModeallSubsetsEqual(altsets []*BitSet) bool {
var first *BitSet
@@ -444,13 +432,11 @@ func PredictionModeallSubsetsEqual(altsets []*BitSet) bool {
return true
}
-//
// Returns the unique alternative predicted by all alternative subsets in
// {@code altsets}. If no such alternative exists, this method returns
// {@link ATN//INVALID_ALT_NUMBER}.
//
// @param altsets a collection of alternative subsets
-//
func PredictionModegetUniqueAlt(altsets []*BitSet) int {
all := PredictionModeGetAlts(altsets)
if all.length() == 1 {
@@ -466,7 +452,6 @@ func PredictionModegetUniqueAlt(altsets []*BitSet) int {
//
// @param altsets a collection of alternative subsets
// @return the set of represented alternatives in {@code altsets}
-//
func PredictionModeGetAlts(altsets []*BitSet) *BitSet {
all := NewBitSet()
for _, alts := range altsets {
@@ -475,44 +460,35 @@ func PredictionModeGetAlts(altsets []*BitSet) *BitSet {
return all
}
-//
-// This func gets the conflicting alt subsets from a configuration set.
+// PredictionModegetConflictingAltSubsets gets the conflicting alt subsets from a configuration set.
// For each configuration {@code c} in {@code configs}:
//
//
// map[c] U= c.{@link ATNConfig//alt alt} // map hash/equals uses s and x, not
// alt and not pred
//
-//
func PredictionModegetConflictingAltSubsets(configs ATNConfigSet) []*BitSet {
- configToAlts := make(map[int]*BitSet)
+ configToAlts := NewJMap[ATNConfig, *BitSet, *ATNAltConfigComparator[ATNConfig]](atnAltCfgEqInst)
for _, c := range configs.GetItems() {
- key := 31 * c.GetState().GetStateNumber() + c.GetContext().hash()
- alts, ok := configToAlts[key]
+ alts, ok := configToAlts.Get(c)
if !ok {
alts = NewBitSet()
- configToAlts[key] = alts
+ configToAlts.Put(c, alts)
}
alts.add(c.GetAlt())
}
- values := make([]*BitSet, 0, 10)
- for _, v := range configToAlts {
- values = append(values, v)
- }
- return values
+ return configToAlts.Values()
}
-//
-// Get a map from state to alt subset from a configuration set. For each
+// PredictionModeGetStateToAltMap gets a map from state to alt subset from a configuration set. For each
// configuration {@code c} in {@code configs}:
//
//
-//
func PredictionModeGetStateToAltMap(configs ATNConfigSet) *AltDict {
m := NewAltDict()
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go
similarity index 92%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go
index 93efcf355d..bfe542d091 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/recognizer.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/recognizer.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -49,7 +49,7 @@ var tokenTypeMapCache = make(map[string]int)
var ruleIndexMapCache = make(map[string]int)
func (b *BaseRecognizer) checkVersion(toolVersion string) {
- runtimeVersion := "4.10.1"
+ runtimeVersion := "4.12.0"
if runtimeVersion != toolVersion {
fmt.Println("ANTLR runtime and generated code versions disagree: " + runtimeVersion + "!=" + toolVersion)
}
@@ -108,7 +108,6 @@ func (b *BaseRecognizer) SetState(v int) {
// Get a map from rule names to rule indexes.
//
//
Used for XPath and tree pattern compilation.
-//
func (b *BaseRecognizer) GetRuleIndexMap() map[string]int {
panic("Method not defined!")
@@ -171,18 +170,18 @@ func (b *BaseRecognizer) GetErrorHeader(e RecognitionException) string {
}
// How should a token be displayed in an error message? The default
-// is to display just the text, but during development you might
-// want to have a lot of information spit out. Override in that case
-// to use t.String() (which, for CommonToken, dumps everything about
-// the token). This is better than forcing you to override a method in
-// your token objects because you don't have to go modify your lexer
-// so that it creates a NewJava type.
+//
+// is to display just the text, but during development you might
+// want to have a lot of information spit out. Override in that case
+// to use t.String() (which, for CommonToken, dumps everything about
+// the token). This is better than forcing you to override a method in
+// your token objects because you don't have to go modify your lexer
+// so that it creates a NewJava type.
//
// @deprecated This method is not called by the ANTLR 4 Runtime. Specific
// implementations of {@link ANTLRErrorStrategy} may provide a similar
// feature when necessary. For example, see
// {@link DefaultErrorStrategy//GetTokenErrorDisplay}.
-//
func (b *BaseRecognizer) GetTokenErrorDisplay(t Token) string {
if t == nil {
return ""
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go
similarity index 97%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go
index 600cf8c062..210699ba23 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/rule_context.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/rule_context.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go
similarity index 85%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go
index 9ada430779..a702e99def 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/semantic_context.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/semantic_context.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -18,12 +18,12 @@ import (
//
type SemanticContext interface {
- comparable
+ Equals(other Collectable[SemanticContext]) bool
+ Hash() int
evaluate(parser Recognizer, outerContext RuleContext) bool
evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext
- hash() int
String() string
}
@@ -78,7 +78,7 @@ func NewPredicate(ruleIndex, predIndex int, isCtxDependent bool) *Predicate {
//The default {@link SemanticContext}, which is semantically equivalent to
//a predicate of the form {@code {true}?}.
-var SemanticContextNone SemanticContext = NewPredicate(-1, -1, false)
+var SemanticContextNone = NewPredicate(-1, -1, false)
func (p *Predicate) evalPrecedence(parser Recognizer, outerContext RuleContext) SemanticContext {
return p
@@ -95,7 +95,7 @@ func (p *Predicate) evaluate(parser Recognizer, outerContext RuleContext) bool {
return parser.Sempred(localctx, p.ruleIndex, p.predIndex)
}
-func (p *Predicate) equals(other interface{}) bool {
+func (p *Predicate) Equals(other Collectable[SemanticContext]) bool {
if p == other {
return true
} else if _, ok := other.(*Predicate); !ok {
@@ -107,7 +107,7 @@ func (p *Predicate) equals(other interface{}) bool {
}
}
-func (p *Predicate) hash() int {
+func (p *Predicate) Hash() int {
h := murmurInit(0)
h = murmurUpdate(h, p.ruleIndex)
h = murmurUpdate(h, p.predIndex)
@@ -151,17 +151,22 @@ func (p *PrecedencePredicate) compareTo(other *PrecedencePredicate) int {
return p.precedence - other.precedence
}
-func (p *PrecedencePredicate) equals(other interface{}) bool {
- if p == other {
- return true
- } else if _, ok := other.(*PrecedencePredicate); !ok {
+func (p *PrecedencePredicate) Equals(other Collectable[SemanticContext]) bool {
+
+ var op *PrecedencePredicate
+ var ok bool
+ if op, ok = other.(*PrecedencePredicate); !ok {
return false
- } else {
- return p.precedence == other.(*PrecedencePredicate).precedence
}
+
+ if p == op {
+ return true
+ }
+
+ return p.precedence == other.(*PrecedencePredicate).precedence
}
-func (p *PrecedencePredicate) hash() int {
+func (p *PrecedencePredicate) Hash() int {
h := uint32(1)
h = 31*h + uint32(p.precedence)
return int(h)
@@ -171,10 +176,10 @@ func (p *PrecedencePredicate) String() string {
return "{" + strconv.Itoa(p.precedence) + ">=prec}?"
}
-func PrecedencePredicatefilterPrecedencePredicates(set Set) []*PrecedencePredicate {
+func PrecedencePredicatefilterPrecedencePredicates(set *JStore[SemanticContext, Comparator[SemanticContext]]) []*PrecedencePredicate {
result := make([]*PrecedencePredicate, 0)
- set.Each(func(v interface{}) bool {
+ set.Each(func(v SemanticContext) bool {
if c2, ok := v.(*PrecedencePredicate); ok {
result = append(result, c2)
}
@@ -193,21 +198,21 @@ type AND struct {
func NewAND(a, b SemanticContext) *AND {
- operands := newArray2DHashSet(nil, nil)
+ operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst)
if aa, ok := a.(*AND); ok {
for _, o := range aa.opnds {
- operands.Add(o)
+ operands.Put(o)
}
} else {
- operands.Add(a)
+ operands.Put(a)
}
if ba, ok := b.(*AND); ok {
for _, o := range ba.opnds {
- operands.Add(o)
+ operands.Put(o)
}
} else {
- operands.Add(b)
+ operands.Put(b)
}
precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands)
if len(precedencePredicates) > 0 {
@@ -220,7 +225,7 @@ func NewAND(a, b SemanticContext) *AND {
}
}
- operands.Add(reduced)
+ operands.Put(reduced)
}
vs := operands.Values()
@@ -235,14 +240,15 @@ func NewAND(a, b SemanticContext) *AND {
return and
}
-func (a *AND) equals(other interface{}) bool {
+func (a *AND) Equals(other Collectable[SemanticContext]) bool {
if a == other {
return true
- } else if _, ok := other.(*AND); !ok {
+ }
+ if _, ok := other.(*AND); !ok {
return false
} else {
for i, v := range other.(*AND).opnds {
- if !a.opnds[i].equals(v) {
+ if !a.opnds[i].Equals(v) {
return false
}
}
@@ -250,13 +256,11 @@ func (a *AND) equals(other interface{}) bool {
}
}
-//
// {@inheritDoc}
//
//
// The evaluation of predicates by a context is short-circuiting, but
// unordered.
-//
func (a *AND) evaluate(parser Recognizer, outerContext RuleContext) bool {
for i := 0; i < len(a.opnds); i++ {
if !a.opnds[i].evaluate(parser, outerContext) {
@@ -304,18 +308,18 @@ func (a *AND) evalPrecedence(parser Recognizer, outerContext RuleContext) Semant
return result
}
-func (a *AND) hash() int {
+func (a *AND) Hash() int {
h := murmurInit(37) // Init with a value different from OR
for _, op := range a.opnds {
- h = murmurUpdate(h, op.hash())
+ h = murmurUpdate(h, op.Hash())
}
return murmurFinish(h, len(a.opnds))
}
-func (a *OR) hash() int {
+func (a *OR) Hash() int {
h := murmurInit(41) // Init with a value different from AND
for _, op := range a.opnds {
- h = murmurUpdate(h, op.hash())
+ h = murmurUpdate(h, op.Hash())
}
return murmurFinish(h, len(a.opnds))
}
@@ -345,21 +349,21 @@ type OR struct {
func NewOR(a, b SemanticContext) *OR {
- operands := newArray2DHashSet(nil, nil)
+ operands := NewJStore[SemanticContext, Comparator[SemanticContext]](semctxEqInst)
if aa, ok := a.(*OR); ok {
for _, o := range aa.opnds {
- operands.Add(o)
+ operands.Put(o)
}
} else {
- operands.Add(a)
+ operands.Put(a)
}
if ba, ok := b.(*OR); ok {
for _, o := range ba.opnds {
- operands.Add(o)
+ operands.Put(o)
}
} else {
- operands.Add(b)
+ operands.Put(b)
}
precedencePredicates := PrecedencePredicatefilterPrecedencePredicates(operands)
if len(precedencePredicates) > 0 {
@@ -372,7 +376,7 @@ func NewOR(a, b SemanticContext) *OR {
}
}
- operands.Add(reduced)
+ operands.Put(reduced)
}
vs := operands.Values()
@@ -388,14 +392,14 @@ func NewOR(a, b SemanticContext) *OR {
return o
}
-func (o *OR) equals(other interface{}) bool {
+func (o *OR) Equals(other Collectable[SemanticContext]) bool {
if o == other {
return true
} else if _, ok := other.(*OR); !ok {
return false
} else {
for i, v := range other.(*OR).opnds {
- if !o.opnds[i].equals(v) {
+ if !o.opnds[i].Equals(v) {
return false
}
}
@@ -406,7 +410,6 @@ func (o *OR) equals(other interface{}) bool {
//
// The evaluation of predicates by o context is short-circuiting, but
// unordered.
-//
func (o *OR) evaluate(parser Recognizer, outerContext RuleContext) bool {
for i := 0; i < len(o.opnds); i++ {
if o.opnds[i].evaluate(parser, outerContext) {
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go
new file mode 100644
index 0000000000..f73b06bc6a
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token.go
@@ -0,0 +1,209 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "strconv"
+ "strings"
+)
+
+type TokenSourceCharStreamPair struct {
+ tokenSource TokenSource
+ charStream CharStream
+}
+
+// A token has properties: text, type, line, character position in the line
+// (so we can ignore tabs), token channel, index, and source from which
+// we obtained this token.
+
+type Token interface {
+ GetSource() *TokenSourceCharStreamPair
+ GetTokenType() int
+ GetChannel() int
+ GetStart() int
+ GetStop() int
+ GetLine() int
+ GetColumn() int
+
+ GetText() string
+ SetText(s string)
+
+ GetTokenIndex() int
+ SetTokenIndex(v int)
+
+ GetTokenSource() TokenSource
+ GetInputStream() CharStream
+}
+
+type BaseToken struct {
+ source *TokenSourceCharStreamPair
+ tokenType int // token type of the token
+ channel int // The parser ignores everything not on DEFAULT_CHANNEL
+ start int // optional return -1 if not implemented.
+ stop int // optional return -1 if not implemented.
+ tokenIndex int // from 0..n-1 of the token object in the input stream
+ line int // line=1..n of the 1st character
+ column int // beginning of the line at which it occurs, 0..n-1
+ text string // text of the token.
+ readOnly bool
+}
+
+const (
+ TokenInvalidType = 0
+
+ // During lookahead operations, this "token" signifies we hit rule end ATN state
+ // and did not follow it despite needing to.
+ TokenEpsilon = -2
+
+ TokenMinUserTokenType = 1
+
+ TokenEOF = -1
+
+ // All tokens go to the parser (unless Skip() is called in that rule)
+ // on a particular "channel". The parser tunes to a particular channel
+ // so that whitespace etc... can go to the parser on a "hidden" channel.
+
+ TokenDefaultChannel = 0
+
+ // Anything on different channel than DEFAULT_CHANNEL is not parsed
+ // by parser.
+
+ TokenHiddenChannel = 1
+)
+
+func (b *BaseToken) GetChannel() int {
+ return b.channel
+}
+
+func (b *BaseToken) GetStart() int {
+ return b.start
+}
+
+func (b *BaseToken) GetStop() int {
+ return b.stop
+}
+
+func (b *BaseToken) GetLine() int {
+ return b.line
+}
+
+func (b *BaseToken) GetColumn() int {
+ return b.column
+}
+
+func (b *BaseToken) GetTokenType() int {
+ return b.tokenType
+}
+
+func (b *BaseToken) GetSource() *TokenSourceCharStreamPair {
+ return b.source
+}
+
+func (b *BaseToken) GetTokenIndex() int {
+ return b.tokenIndex
+}
+
+func (b *BaseToken) SetTokenIndex(v int) {
+ b.tokenIndex = v
+}
+
+func (b *BaseToken) GetTokenSource() TokenSource {
+ return b.source.tokenSource
+}
+
+func (b *BaseToken) GetInputStream() CharStream {
+ return b.source.charStream
+}
+
+type CommonToken struct {
+ *BaseToken
+}
+
+func NewCommonToken(source *TokenSourceCharStreamPair, tokenType, channel, start, stop int) *CommonToken {
+
+ t := new(CommonToken)
+
+ t.BaseToken = new(BaseToken)
+
+ t.source = source
+ t.tokenType = tokenType
+ t.channel = channel
+ t.start = start
+ t.stop = stop
+ t.tokenIndex = -1
+ if t.source.tokenSource != nil {
+ t.line = source.tokenSource.GetLine()
+ t.column = source.tokenSource.GetCharPositionInLine()
+ } else {
+ t.column = -1
+ }
+ return t
+}
+
+// An empty {@link Pair} which is used as the default value of
+// {@link //source} for tokens that do not have a source.
+
+//CommonToken.EMPTY_SOURCE = [ nil, nil ]
+
+// Constructs a New{@link CommonToken} as a copy of another {@link Token}.
+//
+//
+// If {@code oldToken} is also a {@link CommonToken} instance, the newly
+// constructed token will share a reference to the {@link //text} field and
+// the {@link Pair} stored in {@link //source}. Otherwise, {@link //text} will
+// be assigned the result of calling {@link //GetText}, and {@link //source}
+// will be constructed from the result of {@link Token//GetTokenSource} and
+// {@link Token//GetInputStream}.
+//
+// @param oldToken The token to copy.
+func (c *CommonToken) clone() *CommonToken {
+ t := NewCommonToken(c.source, c.tokenType, c.channel, c.start, c.stop)
+ t.tokenIndex = c.GetTokenIndex()
+ t.line = c.GetLine()
+ t.column = c.GetColumn()
+ t.text = c.GetText()
+ return t
+}
+
+func (c *CommonToken) GetText() string {
+ if c.text != "" {
+ return c.text
+ }
+ input := c.GetInputStream()
+ if input == nil {
+ return ""
+ }
+ n := input.Size()
+ if c.start < n && c.stop < n {
+ return input.GetTextFromInterval(NewInterval(c.start, c.stop))
+ }
+ return ""
+}
+
+func (c *CommonToken) SetText(text string) {
+ c.text = text
+}
+
+func (c *CommonToken) String() string {
+ txt := c.GetText()
+ if txt != "" {
+ txt = strings.Replace(txt, "\n", "\\n", -1)
+ txt = strings.Replace(txt, "\r", "\\r", -1)
+ txt = strings.Replace(txt, "\t", "\\t", -1)
+ } else {
+ txt = ""
+ }
+
+ var ch string
+ if c.channel > 0 {
+ ch = ",channel=" + strconv.Itoa(c.channel)
+ } else {
+ ch = ""
+ }
+
+ return "[@" + strconv.Itoa(c.tokenIndex) + "," + strconv.Itoa(c.start) + ":" + strconv.Itoa(c.stop) + "='" +
+ txt + "',<" + strconv.Itoa(c.tokenType) + ">" +
+ ch + "," + strconv.Itoa(c.line) + ":" + strconv.Itoa(c.column) + "]"
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go
similarity index 85%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go
index e023978fef..a3f36eaa67 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_source.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_source.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go
similarity index 87%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go
index df92c81478..1527d43f60 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/token_stream.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/token_stream.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go
new file mode 100644
index 0000000000..b3e38af344
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tokenstream_rewriter.go
@@ -0,0 +1,659 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bytes"
+ "fmt"
+)
+
+//
+// Useful for rewriting out a buffered input token stream after doing some
+// augmentation or other manipulations on it.
+
+//
+// You can insert stuff, replace, and delete chunks. Note that the operations
+// are done lazily--only if you convert the buffer to a {@link String} with
+// {@link TokenStream#getText()}. This is very efficient because you are not
+// moving data around all the time. As the buffer of tokens is converted to
+// strings, the {@link #getText()} method(s) scan the input token stream and
+// check to see if there is an operation at the current index. If so, the
+// operation is done and then normal {@link String} rendering continues on the
+// buffer. This is like having multiple Turing machine instruction streams
+// (programs) operating on a single input tape. :)
+//
+
+// This rewriter makes no modifications to the token stream. It does not ask the
+// stream to fill itself up nor does it advance the input cursor. The token
+// stream {@link TokenStream#index()} will return the same value before and
+// after any {@link #getText()} call.
+
+//
+// The rewriter only works on tokens that you have in the buffer and ignores the
+// current input cursor. If you are buffering tokens on-demand, calling
+// {@link #getText()} halfway through the input will only do rewrites for those
+// tokens in the first half of the file.
+
+//
+// Since the operations are done lazily at {@link #getText}-time, operations do
+// not screw up the token index values. That is, an insert operation at token
+// index {@code i} does not change the index values for tokens
+// {@code i}+1..n-1.
+
+//
+// Because operations never actually alter the buffer, you may always get the
+// original token stream back without undoing anything. Since the instructions
+// are queued up, you can easily simulate transactions and roll back any changes
+// if there is an error just by removing instructions. For example,
+
+//
+// CharStream input = new ANTLRFileStream("input");
+// TLexer lex = new TLexer(input);
+// CommonTokenStream tokens = new CommonTokenStream(lex);
+// T parser = new T(tokens);
+// TokenStreamRewriter rewriter = new TokenStreamRewriter(tokens);
+// parser.startRule();
+//
+
+//
+// Then in the rules, you can execute (assuming rewriter is visible):
+
+//
+// Token t,u;
+// ...
+// rewriter.insertAfter(t, "text to put after t");}
+// rewriter.insertAfter(u, "text after u");}
+// System.out.println(rewriter.getText());
+//
+
+//
+// You can also have multiple "instruction streams" and get multiple rewrites
+// from a single pass over the input. Just name the instruction streams and use
+// that name again when printing the buffer. This could be useful for generating
+// a C file and also its header file--all from the same buffer:
+
+//
+// rewriter.insertAfter("pass1", t, "text to put after t");}
+// rewriter.insertAfter("pass2", u, "text after u");}
+// System.out.println(rewriter.getText("pass1"));
+// System.out.println(rewriter.getText("pass2"));
+//
+
+//
+// If you don't use named rewrite streams, a "default" stream is used as the
+// first example shows.
+
+const (
+ Default_Program_Name = "default"
+ Program_Init_Size = 100
+ Min_Token_Index = 0
+)
+
+// Define the rewrite operation hierarchy
+
+type RewriteOperation interface {
+ // Execute the rewrite operation by possibly adding to the buffer.
+ // Return the index of the next token to operate on.
+ Execute(buffer *bytes.Buffer) int
+ String() string
+ GetInstructionIndex() int
+ GetIndex() int
+ GetText() string
+ GetOpName() string
+ GetTokens() TokenStream
+ SetInstructionIndex(val int)
+ SetIndex(int)
+ SetText(string)
+ SetOpName(string)
+ SetTokens(TokenStream)
+}
+
+type BaseRewriteOperation struct {
+ //Current index of rewrites list
+ instruction_index int
+ //Token buffer index
+ index int
+ //Substitution text
+ text string
+ //Actual operation name
+ op_name string
+ //Pointer to token steam
+ tokens TokenStream
+}
+
+func (op *BaseRewriteOperation) GetInstructionIndex() int {
+ return op.instruction_index
+}
+
+func (op *BaseRewriteOperation) GetIndex() int {
+ return op.index
+}
+
+func (op *BaseRewriteOperation) GetText() string {
+ return op.text
+}
+
+func (op *BaseRewriteOperation) GetOpName() string {
+ return op.op_name
+}
+
+func (op *BaseRewriteOperation) GetTokens() TokenStream {
+ return op.tokens
+}
+
+func (op *BaseRewriteOperation) SetInstructionIndex(val int) {
+ op.instruction_index = val
+}
+
+func (op *BaseRewriteOperation) SetIndex(val int) {
+ op.index = val
+}
+
+func (op *BaseRewriteOperation) SetText(val string) {
+ op.text = val
+}
+
+func (op *BaseRewriteOperation) SetOpName(val string) {
+ op.op_name = val
+}
+
+func (op *BaseRewriteOperation) SetTokens(val TokenStream) {
+ op.tokens = val
+}
+
+func (op *BaseRewriteOperation) Execute(buffer *bytes.Buffer) int {
+ return op.index
+}
+
+func (op *BaseRewriteOperation) String() string {
+ return fmt.Sprintf("<%s@%d:\"%s\">",
+ op.op_name,
+ op.tokens.Get(op.GetIndex()),
+ op.text,
+ )
+
+}
+
+type InsertBeforeOp struct {
+ BaseRewriteOperation
+}
+
+func NewInsertBeforeOp(index int, text string, stream TokenStream) *InsertBeforeOp {
+ return &InsertBeforeOp{BaseRewriteOperation: BaseRewriteOperation{
+ index: index,
+ text: text,
+ op_name: "InsertBeforeOp",
+ tokens: stream,
+ }}
+}
+
+func (op *InsertBeforeOp) Execute(buffer *bytes.Buffer) int {
+ buffer.WriteString(op.text)
+ if op.tokens.Get(op.index).GetTokenType() != TokenEOF {
+ buffer.WriteString(op.tokens.Get(op.index).GetText())
+ }
+ return op.index + 1
+}
+
+func (op *InsertBeforeOp) String() string {
+ return op.BaseRewriteOperation.String()
+}
+
+// Distinguish between insert after/before to do the "insert afters"
+// first and then the "insert befores" at same index. Implementation
+// of "insert after" is "insert before index+1".
+
+type InsertAfterOp struct {
+ BaseRewriteOperation
+}
+
+func NewInsertAfterOp(index int, text string, stream TokenStream) *InsertAfterOp {
+ return &InsertAfterOp{BaseRewriteOperation: BaseRewriteOperation{
+ index: index + 1,
+ text: text,
+ tokens: stream,
+ }}
+}
+
+func (op *InsertAfterOp) Execute(buffer *bytes.Buffer) int {
+ buffer.WriteString(op.text)
+ if op.tokens.Get(op.index).GetTokenType() != TokenEOF {
+ buffer.WriteString(op.tokens.Get(op.index).GetText())
+ }
+ return op.index + 1
+}
+
+func (op *InsertAfterOp) String() string {
+ return op.BaseRewriteOperation.String()
+}
+
+// I'm going to try replacing range from x..y with (y-x)+1 ReplaceOp
+// instructions.
+type ReplaceOp struct {
+ BaseRewriteOperation
+ LastIndex int
+}
+
+func NewReplaceOp(from, to int, text string, stream TokenStream) *ReplaceOp {
+ return &ReplaceOp{
+ BaseRewriteOperation: BaseRewriteOperation{
+ index: from,
+ text: text,
+ op_name: "ReplaceOp",
+ tokens: stream,
+ },
+ LastIndex: to,
+ }
+}
+
+func (op *ReplaceOp) Execute(buffer *bytes.Buffer) int {
+ if op.text != "" {
+ buffer.WriteString(op.text)
+ }
+ return op.LastIndex + 1
+}
+
+func (op *ReplaceOp) String() string {
+ if op.text == "" {
+ return fmt.Sprintf("",
+ op.tokens.Get(op.index), op.tokens.Get(op.LastIndex))
+ }
+ return fmt.Sprintf("",
+ op.tokens.Get(op.index), op.tokens.Get(op.LastIndex), op.text)
+}
+
+type TokenStreamRewriter struct {
+ //Our source stream
+ tokens TokenStream
+ // You may have multiple, named streams of rewrite operations.
+ // I'm calling these things "programs."
+ // Maps String (name) → rewrite (List)
+ programs map[string][]RewriteOperation
+ last_rewrite_token_indexes map[string]int
+}
+
+func NewTokenStreamRewriter(tokens TokenStream) *TokenStreamRewriter {
+ return &TokenStreamRewriter{
+ tokens: tokens,
+ programs: map[string][]RewriteOperation{
+ Default_Program_Name: make([]RewriteOperation, 0, Program_Init_Size),
+ },
+ last_rewrite_token_indexes: map[string]int{},
+ }
+}
+
+func (tsr *TokenStreamRewriter) GetTokenStream() TokenStream {
+ return tsr.tokens
+}
+
+// Rollback the instruction stream for a program so that
+// the indicated instruction (via instructionIndex) is no
+// longer in the stream. UNTESTED!
+func (tsr *TokenStreamRewriter) Rollback(program_name string, instruction_index int) {
+ is, ok := tsr.programs[program_name]
+ if ok {
+ tsr.programs[program_name] = is[Min_Token_Index:instruction_index]
+ }
+}
+
+func (tsr *TokenStreamRewriter) RollbackDefault(instruction_index int) {
+ tsr.Rollback(Default_Program_Name, instruction_index)
+}
+
+// Reset the program so that no instructions exist
+func (tsr *TokenStreamRewriter) DeleteProgram(program_name string) {
+ tsr.Rollback(program_name, Min_Token_Index) //TODO: double test on that cause lower bound is not included
+}
+
+func (tsr *TokenStreamRewriter) DeleteProgramDefault() {
+ tsr.DeleteProgram(Default_Program_Name)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfter(program_name string, index int, text string) {
+ // to insert after, just insert before next index (even if past end)
+ var op RewriteOperation = NewInsertAfterOp(index, text, tsr.tokens)
+ rewrites := tsr.GetProgram(program_name)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(program_name, op)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfterDefault(index int, text string) {
+ tsr.InsertAfter(Default_Program_Name, index, text)
+}
+
+func (tsr *TokenStreamRewriter) InsertAfterToken(program_name string, token Token, text string) {
+ tsr.InsertAfter(program_name, token.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) InsertBefore(program_name string, index int, text string) {
+ var op RewriteOperation = NewInsertBeforeOp(index, text, tsr.tokens)
+ rewrites := tsr.GetProgram(program_name)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(program_name, op)
+}
+
+func (tsr *TokenStreamRewriter) InsertBeforeDefault(index int, text string) {
+ tsr.InsertBefore(Default_Program_Name, index, text)
+}
+
+func (tsr *TokenStreamRewriter) InsertBeforeToken(program_name string, token Token, text string) {
+ tsr.InsertBefore(program_name, token.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) Replace(program_name string, from, to int, text string) {
+ if from > to || from < 0 || to < 0 || to >= tsr.tokens.Size() {
+ panic(fmt.Sprintf("replace: range invalid: %d..%d(size=%d)",
+ from, to, tsr.tokens.Size()))
+ }
+ var op RewriteOperation = NewReplaceOp(from, to, text, tsr.tokens)
+ rewrites := tsr.GetProgram(program_name)
+ op.SetInstructionIndex(len(rewrites))
+ tsr.AddToProgram(program_name, op)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceDefault(from, to int, text string) {
+ tsr.Replace(Default_Program_Name, from, to, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceDefaultPos(index int, text string) {
+ tsr.ReplaceDefault(index, index, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceToken(program_name string, from, to Token, text string) {
+ tsr.Replace(program_name, from.GetTokenIndex(), to.GetTokenIndex(), text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceTokenDefault(from, to Token, text string) {
+ tsr.ReplaceToken(Default_Program_Name, from, to, text)
+}
+
+func (tsr *TokenStreamRewriter) ReplaceTokenDefaultPos(index Token, text string) {
+ tsr.ReplaceTokenDefault(index, index, text)
+}
+
+func (tsr *TokenStreamRewriter) Delete(program_name string, from, to int) {
+ tsr.Replace(program_name, from, to, "")
+}
+
+func (tsr *TokenStreamRewriter) DeleteDefault(from, to int) {
+ tsr.Delete(Default_Program_Name, from, to)
+}
+
+func (tsr *TokenStreamRewriter) DeleteDefaultPos(index int) {
+ tsr.DeleteDefault(index, index)
+}
+
+func (tsr *TokenStreamRewriter) DeleteToken(program_name string, from, to Token) {
+ tsr.ReplaceToken(program_name, from, to, "")
+}
+
+func (tsr *TokenStreamRewriter) DeleteTokenDefault(from, to Token) {
+ tsr.DeleteToken(Default_Program_Name, from, to)
+}
+
+func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndex(program_name string) int {
+ i, ok := tsr.last_rewrite_token_indexes[program_name]
+ if !ok {
+ return -1
+ }
+ return i
+}
+
+func (tsr *TokenStreamRewriter) GetLastRewriteTokenIndexDefault() int {
+ return tsr.GetLastRewriteTokenIndex(Default_Program_Name)
+}
+
+func (tsr *TokenStreamRewriter) SetLastRewriteTokenIndex(program_name string, i int) {
+ tsr.last_rewrite_token_indexes[program_name] = i
+}
+
+func (tsr *TokenStreamRewriter) InitializeProgram(name string) []RewriteOperation {
+ is := make([]RewriteOperation, 0, Program_Init_Size)
+ tsr.programs[name] = is
+ return is
+}
+
+func (tsr *TokenStreamRewriter) AddToProgram(name string, op RewriteOperation) {
+ is := tsr.GetProgram(name)
+ is = append(is, op)
+ tsr.programs[name] = is
+}
+
+func (tsr *TokenStreamRewriter) GetProgram(name string) []RewriteOperation {
+ is, ok := tsr.programs[name]
+ if !ok {
+ is = tsr.InitializeProgram(name)
+ }
+ return is
+}
+
+// Return the text from the original tokens altered per the
+// instructions given to this rewriter.
+func (tsr *TokenStreamRewriter) GetTextDefault() string {
+ return tsr.GetText(
+ Default_Program_Name,
+ NewInterval(0, tsr.tokens.Size()-1))
+}
+
+// Return the text from the original tokens altered per the
+// instructions given to this rewriter.
+func (tsr *TokenStreamRewriter) GetText(program_name string, interval *Interval) string {
+ rewrites := tsr.programs[program_name]
+ start := interval.Start
+ stop := interval.Stop
+ // ensure start/end are in range
+ stop = min(stop, tsr.tokens.Size()-1)
+ start = max(start, 0)
+ if rewrites == nil || len(rewrites) == 0 {
+ return tsr.tokens.GetTextFromInterval(interval) // no instructions to execute
+ }
+ buf := bytes.Buffer{}
+ // First, optimize instruction stream
+ indexToOp := reduceToSingleOperationPerIndex(rewrites)
+ // Walk buffer, executing instructions and emitting tokens
+ for i := start; i <= stop && i < tsr.tokens.Size(); {
+ op := indexToOp[i]
+ delete(indexToOp, i) // remove so any left have index size-1
+ t := tsr.tokens.Get(i)
+ if op == nil {
+ // no operation at that index, just dump token
+ if t.GetTokenType() != TokenEOF {
+ buf.WriteString(t.GetText())
+ }
+ i++ // move to next token
+ } else {
+ i = op.Execute(&buf) // execute operation and skip
+ }
+ }
+ // include stuff after end if it's last index in buffer
+ // So, if they did an insertAfter(lastValidIndex, "foo"), include
+ // foo if end==lastValidIndex.
+ if stop == tsr.tokens.Size()-1 {
+ // Scan any remaining operations after last token
+ // should be included (they will be inserts).
+ for _, op := range indexToOp {
+ if op.GetIndex() >= tsr.tokens.Size()-1 {
+ buf.WriteString(op.GetText())
+ }
+ }
+ }
+ return buf.String()
+}
+
+// We need to combine operations and report invalid operations (like
+// overlapping replaces that are not completed nested). Inserts to
+// same index need to be combined etc... Here are the cases:
+//
+// I.i.u I.j.v leave alone, nonoverlapping
+// I.i.u I.i.v combine: Iivu
+//
+// R.i-j.u R.x-y.v | i-j in x-y delete first R
+// R.i-j.u R.i-j.v delete first R
+// R.i-j.u R.x-y.v | x-y in i-j ERROR
+// R.i-j.u R.x-y.v | boundaries overlap ERROR
+//
+// Delete special case of replace (text==null):
+// D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
+//
+// I.i.u R.x-y.v | i in (x+1)-y delete I (since insert before
+// we're not deleting i)
+// I.i.u R.x-y.v | i not in (x+1)-y leave alone, nonoverlapping
+// R.x-y.v I.i.u | i in x-y ERROR
+// R.x-y.v I.x.u R.x-y.uv (combine, delete I)
+// R.x-y.v I.i.u | i not in x-y leave alone, nonoverlapping
+//
+// I.i.u = insert u before op @ index i
+// R.x-y.u = replace x-y indexed tokens with u
+//
+// First we need to examine replaces. For any replace op:
+//
+// 1. wipe out any insertions before op within that range.
+// 2. Drop any replace op before that is contained completely within
+// that range.
+// 3. Throw exception upon boundary overlap with any previous replace.
+//
+// Then we can deal with inserts:
+//
+// 1. for any inserts to same index, combine even if not adjacent.
+// 2. for any prior replace with same left boundary, combine this
+// insert with replace and delete this replace.
+// 3. throw exception if index in same range as previous replace
+//
+// Don't actually delete; make op null in list. Easier to walk list.
+// Later we can throw as we add to index → op map.
+//
+// Note that I.2 R.2-2 will wipe out I.2 even though, technically, the
+// inserted stuff would be before the replace range. But, if you
+// add tokens in front of a method body '{' and then delete the method
+// body, I think the stuff before the '{' you added should disappear too.
+//
+// Return a map from token index to operation.
+func reduceToSingleOperationPerIndex(rewrites []RewriteOperation) map[int]RewriteOperation {
+ // WALK REPLACES
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ rop, ok := op.(*ReplaceOp)
+ if !ok {
+ continue
+ }
+ // Wipe prior inserts within range
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if iop, ok := rewrites[j].(*InsertBeforeOp); ok {
+ if iop.index == rop.index {
+ // E.g., insert before 2, delete 2..2; update replace
+ // text to include insert before, kill insert
+ rewrites[iop.instruction_index] = nil
+ if rop.text != "" {
+ rop.text = iop.text + rop.text
+ } else {
+ rop.text = iop.text
+ }
+ } else if iop.index > rop.index && iop.index <= rop.LastIndex {
+ // delete insert as it's a no-op.
+ rewrites[iop.instruction_index] = nil
+ }
+ }
+ }
+ // Drop any prior replaces contained within
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if prevop, ok := rewrites[j].(*ReplaceOp); ok {
+ if prevop.index >= rop.index && prevop.LastIndex <= rop.LastIndex {
+ // delete replace as it's a no-op.
+ rewrites[prevop.instruction_index] = nil
+ continue
+ }
+ // throw exception unless disjoint or identical
+ disjoint := prevop.LastIndex < rop.index || prevop.index > rop.LastIndex
+ // Delete special case of replace (text==null):
+ // D.i-j.u D.x-y.v | boundaries overlap combine to max(min)..max(right)
+ if prevop.text == "" && rop.text == "" && !disjoint {
+ rewrites[prevop.instruction_index] = nil
+ rop.index = min(prevop.index, rop.index)
+ rop.LastIndex = max(prevop.LastIndex, rop.LastIndex)
+ println("new rop" + rop.String()) //TODO: remove console write, taken from Java version
+ } else if !disjoint {
+ panic("replace op boundaries of " + rop.String() + " overlap with previous " + prevop.String())
+ }
+ }
+ }
+ }
+ // WALK INSERTS
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ //hack to replicate inheritance in composition
+ _, iok := rewrites[i].(*InsertBeforeOp)
+ _, aok := rewrites[i].(*InsertAfterOp)
+ if !iok && !aok {
+ continue
+ }
+ iop := rewrites[i]
+ // combine current insert with prior if any at same index
+ // deviating a bit from TokenStreamRewriter.java - hard to incorporate inheritance logic
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if nextIop, ok := rewrites[j].(*InsertAfterOp); ok {
+ if nextIop.index == iop.GetIndex() {
+ iop.SetText(nextIop.text + iop.GetText())
+ rewrites[j] = nil
+ }
+ }
+ if prevIop, ok := rewrites[j].(*InsertBeforeOp); ok {
+ if prevIop.index == iop.GetIndex() {
+ iop.SetText(iop.GetText() + prevIop.text)
+ rewrites[prevIop.instruction_index] = nil
+ }
+ }
+ }
+ // look for replaces where iop.index is in range; error
+ for j := 0; j < i && j < len(rewrites); j++ {
+ if rop, ok := rewrites[j].(*ReplaceOp); ok {
+ if iop.GetIndex() == rop.index {
+ rop.text = iop.GetText() + rop.text
+ rewrites[i] = nil
+ continue
+ }
+ if iop.GetIndex() >= rop.index && iop.GetIndex() <= rop.LastIndex {
+ panic("insert op " + iop.String() + " within boundaries of previous " + rop.String())
+ }
+ }
+ }
+ }
+ m := map[int]RewriteOperation{}
+ for i := 0; i < len(rewrites); i++ {
+ op := rewrites[i]
+ if op == nil {
+ continue
+ }
+ if _, ok := m[op.GetIndex()]; ok {
+ panic("should only be one op per index")
+ }
+ m[op.GetIndex()] = op
+ }
+ return m
+}
+
+/*
+ Quick fixing Go lack of overloads
+*/
+
+func max(a, b int) int {
+ if a > b {
+ return a
+ } else {
+ return b
+ }
+}
+func min(a, b int) int {
+ if a < b {
+ return a
+ } else {
+ return b
+ }
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/trace_listener.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trace_listener.go
similarity index 93%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/trace_listener.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trace_listener.go
index e6fff992ff..7b663bf849 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/trace_listener.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trace_listener.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/transition.go
similarity index 99%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/transition.go
index 53056bd74f..36be4f7331 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/transition.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/transition.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tree.go
similarity index 98%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tree.go
index 08ce22bba3..85b4f137b5 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/tree.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/tree.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -234,10 +234,8 @@ func (p *ParseTreeWalker) Walk(listener ParseTreeListener, t Tree) {
}
}
-//
// Enters a grammar rule by first triggering the generic event {@link ParseTreeListener//EnterEveryRule}
// then by triggering the event specific to the given parse tree node
-//
func (p *ParseTreeWalker) EnterRule(listener ParseTreeListener, r RuleNode) {
ctx := r.GetRuleContext().(ParserRuleContext)
listener.EnterEveryRule(ctx)
@@ -246,7 +244,6 @@ func (p *ParseTreeWalker) EnterRule(listener ParseTreeListener, r RuleNode) {
// Exits a grammar rule by first triggering the event specific to the given parse tree node
// then by triggering the generic event {@link ParseTreeListener//ExitEveryRule}
-//
func (p *ParseTreeWalker) ExitRule(listener ParseTreeListener, r RuleNode) {
ctx := r.GetRuleContext().(ParserRuleContext)
ctx.ExitRule(listener)
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/trees.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trees.go
similarity index 93%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/trees.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trees.go
index 80144ecade..d7dbb03228 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/trees.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/trees.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2012-2017 The ANTLR Project. All rights reserved.
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
// Use of this file is governed by the BSD 3-clause license that
// can be found in the LICENSE.txt file in the project root.
@@ -9,8 +9,9 @@ import "fmt"
/** A set of utility routines useful for all kinds of ANTLR trees. */
// Print out a whole tree in LISP form. {@link //getNodeText} is used on the
-// node payloads to get the text for the nodes. Detect
-// parse trees and extract data appropriately.
+//
+// node payloads to get the text for the nodes. Detect
+// parse trees and extract data appropriately.
func TreesStringTree(tree Tree, ruleNames []string, recog Recognizer) string {
if recog != nil {
@@ -80,8 +81,8 @@ func TreesGetChildren(t Tree) []Tree {
}
// Return a list of all ancestors of this node. The first node of
-// list is the root and the last is the parent of this node.
//
+// list is the root and the last is the parent of this node.
func TreesgetAncestors(t Tree) []Tree {
ancestors := make([]Tree, 0)
t = t.GetParent()
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils.go
new file mode 100644
index 0000000000..9fad5d916b
--- /dev/null
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils.go
@@ -0,0 +1,352 @@
+// Copyright (c) 2012-2022 The ANTLR Project. All rights reserved.
+// Use of this file is governed by the BSD 3-clause license that
+// can be found in the LICENSE.txt file in the project root.
+
+package antlr
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "math/bits"
+ "strconv"
+ "strings"
+)
+
+func intMin(a, b int) int {
+ if a < b {
+ return a
+ }
+ return b
+}
+
+func intMax(a, b int) int {
+ if a > b {
+ return a
+ }
+ return b
+}
+
+// A simple integer stack
+
+type IntStack []int
+
+var ErrEmptyStack = errors.New("Stack is empty")
+
+func (s *IntStack) Pop() (int, error) {
+ l := len(*s) - 1
+ if l < 0 {
+ return 0, ErrEmptyStack
+ }
+ v := (*s)[l]
+ *s = (*s)[0:l]
+ return v, nil
+}
+
+func (s *IntStack) Push(e int) {
+ *s = append(*s, e)
+}
+
+type comparable interface {
+ Equals(other Collectable[any]) bool
+}
+
+func standardEqualsFunction(a Collectable[any], b Collectable[any]) bool {
+
+ return a.Equals(b)
+}
+
+func standardHashFunction(a interface{}) int {
+ if h, ok := a.(hasher); ok {
+ return h.Hash()
+ }
+
+ panic("Not Hasher")
+}
+
+type hasher interface {
+ Hash() int
+}
+
+const bitsPerWord = 64
+
+func indexForBit(bit int) int {
+ return bit / bitsPerWord
+}
+
+func wordForBit(data []uint64, bit int) uint64 {
+ idx := indexForBit(bit)
+ if idx >= len(data) {
+ return 0
+ }
+ return data[idx]
+}
+
+func maskForBit(bit int) uint64 {
+ return uint64(1) << (bit % bitsPerWord)
+}
+
+func wordsNeeded(bit int) int {
+ return indexForBit(bit) + 1
+}
+
+type BitSet struct {
+ data []uint64
+}
+
+func NewBitSet() *BitSet {
+ return &BitSet{}
+}
+
+func (b *BitSet) add(value int) {
+ idx := indexForBit(value)
+ if idx >= len(b.data) {
+ size := wordsNeeded(value)
+ data := make([]uint64, size)
+ copy(data, b.data)
+ b.data = data
+ }
+ b.data[idx] |= maskForBit(value)
+}
+
+func (b *BitSet) clear(index int) {
+ idx := indexForBit(index)
+ if idx >= len(b.data) {
+ return
+ }
+ b.data[idx] &= ^maskForBit(index)
+}
+
+func (b *BitSet) or(set *BitSet) {
+ // Get min size necessary to represent the bits in both sets.
+ bLen := b.minLen()
+ setLen := set.minLen()
+ maxLen := intMax(bLen, setLen)
+ if maxLen > len(b.data) {
+ // Increase the size of len(b.data) to repesent the bits in both sets.
+ data := make([]uint64, maxLen)
+ copy(data, b.data)
+ b.data = data
+ }
+ // len(b.data) is at least setLen.
+ for i := 0; i < setLen; i++ {
+ b.data[i] |= set.data[i]
+ }
+}
+
+func (b *BitSet) remove(value int) {
+ b.clear(value)
+}
+
+func (b *BitSet) contains(value int) bool {
+ idx := indexForBit(value)
+ if idx >= len(b.data) {
+ return false
+ }
+ return (b.data[idx] & maskForBit(value)) != 0
+}
+
+func (b *BitSet) minValue() int {
+ for i, v := range b.data {
+ if v == 0 {
+ continue
+ }
+ return i*bitsPerWord + bits.TrailingZeros64(v)
+ }
+ return 2147483647
+}
+
+func (b *BitSet) equals(other interface{}) bool {
+ otherBitSet, ok := other.(*BitSet)
+ if !ok {
+ return false
+ }
+
+ if b == otherBitSet {
+ return true
+ }
+
+ // We only compare set bits, so we cannot rely on the two slices having the same size. Its
+ // possible for two BitSets to have different slice lengths but the same set bits. So we only
+ // compare the relevant words and ignore the trailing zeros.
+ bLen := b.minLen()
+ otherLen := otherBitSet.minLen()
+
+ if bLen != otherLen {
+ return false
+ }
+
+ for i := 0; i < bLen; i++ {
+ if b.data[i] != otherBitSet.data[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (b *BitSet) minLen() int {
+ for i := len(b.data); i > 0; i-- {
+ if b.data[i-1] != 0 {
+ return i
+ }
+ }
+ return 0
+}
+
+func (b *BitSet) length() int {
+ cnt := 0
+ for _, val := range b.data {
+ cnt += bits.OnesCount64(val)
+ }
+ return cnt
+}
+
+func (b *BitSet) String() string {
+ vals := make([]string, 0, b.length())
+
+ for i, v := range b.data {
+ for v != 0 {
+ n := bits.TrailingZeros64(v)
+ vals = append(vals, strconv.Itoa(i*bitsPerWord+n))
+ v &= ^(uint64(1) << n)
+ }
+ }
+
+ return "{" + strings.Join(vals, ", ") + "}"
+}
+
+type AltDict struct {
+ data map[string]interface{}
+}
+
+func NewAltDict() *AltDict {
+ d := new(AltDict)
+ d.data = make(map[string]interface{})
+ return d
+}
+
+func (a *AltDict) Get(key string) interface{} {
+ key = "k-" + key
+ return a.data[key]
+}
+
+func (a *AltDict) put(key string, value interface{}) {
+ key = "k-" + key
+ a.data[key] = value
+}
+
+func (a *AltDict) values() []interface{} {
+ vs := make([]interface{}, len(a.data))
+ i := 0
+ for _, v := range a.data {
+ vs[i] = v
+ i++
+ }
+ return vs
+}
+
+type DoubleDict struct {
+ data map[int]map[int]interface{}
+}
+
+func NewDoubleDict() *DoubleDict {
+ dd := new(DoubleDict)
+ dd.data = make(map[int]map[int]interface{})
+ return dd
+}
+
+func (d *DoubleDict) Get(a, b int) interface{} {
+ data := d.data[a]
+
+ if data == nil {
+ return nil
+ }
+
+ return data[b]
+}
+
+func (d *DoubleDict) set(a, b int, o interface{}) {
+ data := d.data[a]
+
+ if data == nil {
+ data = make(map[int]interface{})
+ d.data[a] = data
+ }
+
+ data[b] = o
+}
+
+func EscapeWhitespace(s string, escapeSpaces bool) string {
+
+ s = strings.Replace(s, "\t", "\\t", -1)
+ s = strings.Replace(s, "\n", "\\n", -1)
+ s = strings.Replace(s, "\r", "\\r", -1)
+ if escapeSpaces {
+ s = strings.Replace(s, " ", "\u00B7", -1)
+ }
+ return s
+}
+
+func TerminalNodeToStringArray(sa []TerminalNode) []string {
+ st := make([]string, len(sa))
+
+ for i, s := range sa {
+ st[i] = fmt.Sprintf("%v", s)
+ }
+
+ return st
+}
+
+func PrintArrayJavaStyle(sa []string) string {
+ var buffer bytes.Buffer
+
+ buffer.WriteString("[")
+
+ for i, s := range sa {
+ buffer.WriteString(s)
+ if i != len(sa)-1 {
+ buffer.WriteString(", ")
+ }
+ }
+
+ buffer.WriteString("]")
+
+ return buffer.String()
+}
+
+// murmur hash
+func murmurInit(seed int) int {
+ return seed
+}
+
+func murmurUpdate(h int, value int) int {
+ const c1 uint32 = 0xCC9E2D51
+ const c2 uint32 = 0x1B873593
+ const r1 uint32 = 15
+ const r2 uint32 = 13
+ const m uint32 = 5
+ const n uint32 = 0xE6546B64
+
+ k := uint32(value)
+ k *= c1
+ k = (k << r1) | (k >> (32 - r1))
+ k *= c2
+
+ hash := uint32(h) ^ k
+ hash = (hash << r2) | (hash >> (32 - r2))
+ hash = hash*m + n
+ return int(hash)
+}
+
+func murmurFinish(h int, numberOfWords int) int {
+ var hash = uint32(h)
+ hash ^= uint32(numberOfWords) << 2
+ hash ^= hash >> 16
+ hash *= 0x85ebca6b
+ hash ^= hash >> 13
+ hash *= 0xc2b2ae35
+ hash ^= hash >> 16
+
+ return int(hash)
+}
diff --git a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils_set.go
similarity index 80%
rename from vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go
rename to vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils_set.go
index 0d4eac698d..c9bd6751e3 100644
--- a/vendor/github.com/antlr/antlr4/runtime/Go/antlr/utils_set.go
+++ b/vendor/github.com/antlr/antlr4/runtime/Go/antlr/v4/utils_set.go
@@ -8,8 +8,6 @@ const (
_loadFactor = 0.75
)
-var _ Set = (*array2DHashSet)(nil)
-
type Set interface {
Add(value interface{}) (added interface{})
Len() int
@@ -20,9 +18,9 @@ type Set interface {
}
type array2DHashSet struct {
- buckets [][]interface{}
+ buckets [][]Collectable[any]
hashcodeFunction func(interface{}) int
- equalsFunction func(interface{}, interface{}) bool
+ equalsFunction func(Collectable[any], Collectable[any]) bool
n int // How many elements in set
threshold int // when to expand
@@ -61,11 +59,11 @@ func (as *array2DHashSet) Values() []interface{} {
return values
}
-func (as *array2DHashSet) Contains(value interface{}) bool {
+func (as *array2DHashSet) Contains(value Collectable[any]) bool {
return as.Get(value) != nil
}
-func (as *array2DHashSet) Add(value interface{}) interface{} {
+func (as *array2DHashSet) Add(value Collectable[any]) interface{} {
if as.n > as.threshold {
as.expand()
}
@@ -98,7 +96,7 @@ func (as *array2DHashSet) expand() {
b := as.getBuckets(o)
bucketLength := newBucketLengths[b]
- var newBucket []interface{}
+ var newBucket []Collectable[any]
if bucketLength == 0 {
// new bucket
newBucket = as.createBucket(as.initialBucketCapacity)
@@ -107,7 +105,7 @@ func (as *array2DHashSet) expand() {
newBucket = newTable[b]
if bucketLength == len(newBucket) {
// expand
- newBucketCopy := make([]interface{}, len(newBucket)<<1)
+ newBucketCopy := make([]Collectable[any], len(newBucket)<<1)
copy(newBucketCopy[:bucketLength], newBucket)
newBucket = newBucketCopy
newTable[b] = newBucket
@@ -124,7 +122,7 @@ func (as *array2DHashSet) Len() int {
return as.n
}
-func (as *array2DHashSet) Get(o interface{}) interface{} {
+func (as *array2DHashSet) Get(o Collectable[any]) interface{} {
if o == nil {
return nil
}
@@ -147,7 +145,7 @@ func (as *array2DHashSet) Get(o interface{}) interface{} {
return nil
}
-func (as *array2DHashSet) innerAdd(o interface{}) interface{} {
+func (as *array2DHashSet) innerAdd(o Collectable[any]) interface{} {
b := as.getBuckets(o)
bucket := as.buckets[b]
@@ -178,7 +176,7 @@ func (as *array2DHashSet) innerAdd(o interface{}) interface{} {
// full bucket, expand and add to end
oldLength := len(bucket)
- bucketCopy := make([]interface{}, oldLength<<1)
+ bucketCopy := make([]Collectable[any], oldLength<<1)
copy(bucketCopy[:oldLength], bucket)
bucket = bucketCopy
as.buckets[b] = bucket
@@ -187,22 +185,22 @@ func (as *array2DHashSet) innerAdd(o interface{}) interface{} {
return o
}
-func (as *array2DHashSet) getBuckets(value interface{}) int {
+func (as *array2DHashSet) getBuckets(value Collectable[any]) int {
hash := as.hashcodeFunction(value)
return hash & (len(as.buckets) - 1)
}
-func (as *array2DHashSet) createBuckets(cap int) [][]interface{} {
- return make([][]interface{}, cap)
+func (as *array2DHashSet) createBuckets(cap int) [][]Collectable[any] {
+ return make([][]Collectable[any], cap)
}
-func (as *array2DHashSet) createBucket(cap int) []interface{} {
- return make([]interface{}, cap)
+func (as *array2DHashSet) createBucket(cap int) []Collectable[any] {
+ return make([]Collectable[any], cap)
}
func newArray2DHashSetWithCap(
hashcodeFunction func(interface{}) int,
- equalsFunction func(interface{}, interface{}) bool,
+ equalsFunction func(Collectable[any], Collectable[any]) bool,
initCap int,
initBucketCap int,
) *array2DHashSet {
@@ -231,7 +229,7 @@ func newArray2DHashSetWithCap(
func newArray2DHashSet(
hashcodeFunction func(interface{}) int,
- equalsFunction func(interface{}, interface{}) bool,
+ equalsFunction func(Collectable[any], Collectable[any]) bool,
) *array2DHashSet {
return newArray2DHashSetWithCap(hashcodeFunction, equalsFunction, _initalCapacity, _initalBucketCapacity)
}
diff --git a/vendor/github.com/blang/semver/.travis.yml b/vendor/github.com/blang/semver/.travis.yml
deleted file mode 100644
index 102fb9a691..0000000000
--- a/vendor/github.com/blang/semver/.travis.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-language: go
-matrix:
- include:
- - go: 1.4.3
- - go: 1.5.4
- - go: 1.6.3
- - go: 1.7
- - go: tip
- allow_failures:
- - go: tip
-install:
-- go get golang.org/x/tools/cmd/cover
-- go get github.com/mattn/goveralls
-script:
-- echo "Test and track coverage" ; $HOME/gopath/bin/goveralls -package "." -service=travis-ci
- -repotoken $COVERALLS_TOKEN
-- echo "Build examples" ; cd examples && go build
-- echo "Check if gofmt'd" ; diff -u <(echo -n) <(gofmt -d -s .)
-env:
- global:
- secure: HroGEAUQpVq9zX1b1VIkraLiywhGbzvNnTZq2TMxgK7JHP8xqNplAeF1izrR2i4QLL9nsY+9WtYss4QuPvEtZcVHUobw6XnL6radF7jS1LgfYZ9Y7oF+zogZ2I5QUMRLGA7rcxQ05s7mKq3XZQfeqaNts4bms/eZRefWuaFZbkw=
diff --git a/vendor/github.com/blang/semver/LICENSE b/vendor/github.com/blang/semver/LICENSE
deleted file mode 100644
index 5ba5c86fcb..0000000000
--- a/vendor/github.com/blang/semver/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License
-
-Copyright (c) 2014 Benedikt Lang
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
diff --git a/vendor/github.com/blang/semver/README.md b/vendor/github.com/blang/semver/README.md
deleted file mode 100644
index 08b2e4a3d7..0000000000
--- a/vendor/github.com/blang/semver/README.md
+++ /dev/null
@@ -1,194 +0,0 @@
-semver for golang [](https://travis-ci.org/blang/semver) [](https://godoc.org/github.com/blang/semver) [](https://coveralls.io/r/blang/semver?branch=master)
-======
-
-semver is a [Semantic Versioning](http://semver.org/) library written in golang. It fully covers spec version `2.0.0`.
-
-Usage
------
-```bash
-$ go get github.com/blang/semver
-```
-Note: Always vendor your dependencies or fix on a specific version tag.
-
-```go
-import github.com/blang/semver
-v1, err := semver.Make("1.0.0-beta")
-v2, err := semver.Make("2.0.0-beta")
-v1.Compare(v2)
-```
-
-Also check the [GoDocs](http://godoc.org/github.com/blang/semver).
-
-Why should I use this lib?
------
-
-- Fully spec compatible
-- No reflection
-- No regex
-- Fully tested (Coverage >99%)
-- Readable parsing/validation errors
-- Fast (See [Benchmarks](#benchmarks))
-- Only Stdlib
-- Uses values instead of pointers
-- Many features, see below
-
-
-Features
------
-
-- Parsing and validation at all levels
-- Comparator-like comparisons
-- Compare Helper Methods
-- InPlace manipulation
-- Ranges `>=1.0.0 <2.0.0 || >=3.0.0 !3.0.1-beta.1`
-- Wildcards `>=1.x`, `<=2.5.x`
-- Sortable (implements sort.Interface)
-- database/sql compatible (sql.Scanner/Valuer)
-- encoding/json compatible (json.Marshaler/Unmarshaler)
-
-Ranges
-------
-
-A `Range` is a set of conditions which specify which versions satisfy the range.
-
-A condition is composed of an operator and a version. The supported operators are:
-
-- `<1.0.0` Less than `1.0.0`
-- `<=1.0.0` Less than or equal to `1.0.0`
-- `>1.0.0` Greater than `1.0.0`
-- `>=1.0.0` Greater than or equal to `1.0.0`
-- `1.0.0`, `=1.0.0`, `==1.0.0` Equal to `1.0.0`
-- `!1.0.0`, `!=1.0.0` Not equal to `1.0.0`. Excludes version `1.0.0`.
-
-Note that spaces between the operator and the version will be gracefully tolerated.
-
-A `Range` can link multiple `Ranges` separated by space:
-
-Ranges can be linked by logical AND:
-
- - `>1.0.0 <2.0.0` would match between both ranges, so `1.1.1` and `1.8.7` but not `1.0.0` or `2.0.0`
- - `>1.0.0 <3.0.0 !2.0.3-beta.2` would match every version between `1.0.0` and `3.0.0` except `2.0.3-beta.2`
-
-Ranges can also be linked by logical OR:
-
- - `<2.0.0 || >=3.0.0` would match `1.x.x` and `3.x.x` but not `2.x.x`
-
-AND has a higher precedence than OR. It's not possible to use brackets.
-
-Ranges can be combined by both AND and OR
-
- - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
-
-Range usage:
-
-```
-v, err := semver.Parse("1.2.3")
-range, err := semver.ParseRange(">1.0.0 <2.0.0 || >=3.0.0")
-if range(v) {
- //valid
-}
-
-```
-
-Example
------
-
-Have a look at full examples in [examples/main.go](examples/main.go)
-
-```go
-import github.com/blang/semver
-
-v, err := semver.Make("0.0.1-alpha.preview+123.github")
-fmt.Printf("Major: %d\n", v.Major)
-fmt.Printf("Minor: %d\n", v.Minor)
-fmt.Printf("Patch: %d\n", v.Patch)
-fmt.Printf("Pre: %s\n", v.Pre)
-fmt.Printf("Build: %s\n", v.Build)
-
-// Prerelease versions array
-if len(v.Pre) > 0 {
- fmt.Println("Prerelease versions:")
- for i, pre := range v.Pre {
- fmt.Printf("%d: %q\n", i, pre)
- }
-}
-
-// Build meta data array
-if len(v.Build) > 0 {
- fmt.Println("Build meta data:")
- for i, build := range v.Build {
- fmt.Printf("%d: %q\n", i, build)
- }
-}
-
-v001, err := semver.Make("0.0.1")
-// Compare using helpers: v.GT(v2), v.LT, v.GTE, v.LTE
-v001.GT(v) == true
-v.LT(v001) == true
-v.GTE(v) == true
-v.LTE(v) == true
-
-// Or use v.Compare(v2) for comparisons (-1, 0, 1):
-v001.Compare(v) == 1
-v.Compare(v001) == -1
-v.Compare(v) == 0
-
-// Manipulate Version in place:
-v.Pre[0], err = semver.NewPRVersion("beta")
-if err != nil {
- fmt.Printf("Error parsing pre release version: %q", err)
-}
-
-fmt.Println("\nValidate versions:")
-v.Build[0] = "?"
-
-err = v.Validate()
-if err != nil {
- fmt.Printf("Validation failed: %s\n", err)
-}
-```
-
-
-Benchmarks
------
-
- BenchmarkParseSimple-4 5000000 390 ns/op 48 B/op 1 allocs/op
- BenchmarkParseComplex-4 1000000 1813 ns/op 256 B/op 7 allocs/op
- BenchmarkParseAverage-4 1000000 1171 ns/op 163 B/op 4 allocs/op
- BenchmarkStringSimple-4 20000000 119 ns/op 16 B/op 1 allocs/op
- BenchmarkStringLarger-4 10000000 206 ns/op 32 B/op 2 allocs/op
- BenchmarkStringComplex-4 5000000 324 ns/op 80 B/op 3 allocs/op
- BenchmarkStringAverage-4 5000000 273 ns/op 53 B/op 2 allocs/op
- BenchmarkValidateSimple-4 200000000 9.33 ns/op 0 B/op 0 allocs/op
- BenchmarkValidateComplex-4 3000000 469 ns/op 0 B/op 0 allocs/op
- BenchmarkValidateAverage-4 5000000 256 ns/op 0 B/op 0 allocs/op
- BenchmarkCompareSimple-4 100000000 11.8 ns/op 0 B/op 0 allocs/op
- BenchmarkCompareComplex-4 50000000 30.8 ns/op 0 B/op 0 allocs/op
- BenchmarkCompareAverage-4 30000000 41.5 ns/op 0 B/op 0 allocs/op
- BenchmarkSort-4 3000000 419 ns/op 256 B/op 2 allocs/op
- BenchmarkRangeParseSimple-4 2000000 850 ns/op 192 B/op 5 allocs/op
- BenchmarkRangeParseAverage-4 1000000 1677 ns/op 400 B/op 10 allocs/op
- BenchmarkRangeParseComplex-4 300000 5214 ns/op 1440 B/op 30 allocs/op
- BenchmarkRangeMatchSimple-4 50000000 25.6 ns/op 0 B/op 0 allocs/op
- BenchmarkRangeMatchAverage-4 30000000 56.4 ns/op 0 B/op 0 allocs/op
- BenchmarkRangeMatchComplex-4 10000000 153 ns/op 0 B/op 0 allocs/op
-
-See benchmark cases at [semver_test.go](semver_test.go)
-
-
-Motivation
------
-
-I simply couldn't find any lib supporting the full spec. Others were just wrong or used reflection and regex which i don't like.
-
-
-Contribution
------
-
-Feel free to make a pull request. For bigger changes create a issue first to discuss about it.
-
-
-License
------
-
-See [LICENSE](LICENSE) file.
diff --git a/vendor/github.com/blang/semver/json.go b/vendor/github.com/blang/semver/json.go
deleted file mode 100644
index a74bf7c449..0000000000
--- a/vendor/github.com/blang/semver/json.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package semver
-
-import (
- "encoding/json"
-)
-
-// MarshalJSON implements the encoding/json.Marshaler interface.
-func (v Version) MarshalJSON() ([]byte, error) {
- return json.Marshal(v.String())
-}
-
-// UnmarshalJSON implements the encoding/json.Unmarshaler interface.
-func (v *Version) UnmarshalJSON(data []byte) (err error) {
- var versionString string
-
- if err = json.Unmarshal(data, &versionString); err != nil {
- return
- }
-
- *v, err = Parse(versionString)
-
- return
-}
diff --git a/vendor/github.com/blang/semver/package.json b/vendor/github.com/blang/semver/package.json
deleted file mode 100644
index 1cf8ebdd9c..0000000000
--- a/vendor/github.com/blang/semver/package.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "author": "blang",
- "bugs": {
- "URL": "https://github.com/blang/semver/issues",
- "url": "https://github.com/blang/semver/issues"
- },
- "gx": {
- "dvcsimport": "github.com/blang/semver"
- },
- "gxVersion": "0.10.0",
- "language": "go",
- "license": "MIT",
- "name": "semver",
- "releaseCmd": "git commit -a -m \"gx publish $VERSION\"",
- "version": "3.5.1"
-}
-
diff --git a/vendor/github.com/blang/semver/range.go b/vendor/github.com/blang/semver/range.go
deleted file mode 100644
index fca406d479..0000000000
--- a/vendor/github.com/blang/semver/range.go
+++ /dev/null
@@ -1,416 +0,0 @@
-package semver
-
-import (
- "fmt"
- "strconv"
- "strings"
- "unicode"
-)
-
-type wildcardType int
-
-const (
- noneWildcard wildcardType = iota
- majorWildcard wildcardType = 1
- minorWildcard wildcardType = 2
- patchWildcard wildcardType = 3
-)
-
-func wildcardTypefromInt(i int) wildcardType {
- switch i {
- case 1:
- return majorWildcard
- case 2:
- return minorWildcard
- case 3:
- return patchWildcard
- default:
- return noneWildcard
- }
-}
-
-type comparator func(Version, Version) bool
-
-var (
- compEQ comparator = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) == 0
- }
- compNE = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) != 0
- }
- compGT = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) == 1
- }
- compGE = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) >= 0
- }
- compLT = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) == -1
- }
- compLE = func(v1 Version, v2 Version) bool {
- return v1.Compare(v2) <= 0
- }
-)
-
-type versionRange struct {
- v Version
- c comparator
-}
-
-// rangeFunc creates a Range from the given versionRange.
-func (vr *versionRange) rangeFunc() Range {
- return Range(func(v Version) bool {
- return vr.c(v, vr.v)
- })
-}
-
-// Range represents a range of versions.
-// A Range can be used to check if a Version satisfies it:
-//
-// range, err := semver.ParseRange(">1.0.0 <2.0.0")
-// range(semver.MustParse("1.1.1") // returns true
-type Range func(Version) bool
-
-// OR combines the existing Range with another Range using logical OR.
-func (rf Range) OR(f Range) Range {
- return Range(func(v Version) bool {
- return rf(v) || f(v)
- })
-}
-
-// AND combines the existing Range with another Range using logical AND.
-func (rf Range) AND(f Range) Range {
- return Range(func(v Version) bool {
- return rf(v) && f(v)
- })
-}
-
-// ParseRange parses a range and returns a Range.
-// If the range could not be parsed an error is returned.
-//
-// Valid ranges are:
-// - "<1.0.0"
-// - "<=1.0.0"
-// - ">1.0.0"
-// - ">=1.0.0"
-// - "1.0.0", "=1.0.0", "==1.0.0"
-// - "!1.0.0", "!=1.0.0"
-//
-// A Range can consist of multiple ranges separated by space:
-// Ranges can be linked by logical AND:
-// - ">1.0.0 <2.0.0" would match between both ranges, so "1.1.1" and "1.8.7" but not "1.0.0" or "2.0.0"
-// - ">1.0.0 <3.0.0 !2.0.3-beta.2" would match every version between 1.0.0 and 3.0.0 except 2.0.3-beta.2
-//
-// Ranges can also be linked by logical OR:
-// - "<2.0.0 || >=3.0.0" would match "1.x.x" and "3.x.x" but not "2.x.x"
-//
-// AND has a higher precedence than OR. It's not possible to use brackets.
-//
-// Ranges can be combined by both AND and OR
-//
-// - `>1.0.0 <2.0.0 || >3.0.0 !4.2.1` would match `1.2.3`, `1.9.9`, `3.1.1`, but not `4.2.1`, `2.1.1`
-func ParseRange(s string) (Range, error) {
- parts := splitAndTrim(s)
- orParts, err := splitORParts(parts)
- if err != nil {
- return nil, err
- }
- expandedParts, err := expandWildcardVersion(orParts)
- if err != nil {
- return nil, err
- }
- var orFn Range
- for _, p := range expandedParts {
- var andFn Range
- for _, ap := range p {
- opStr, vStr, err := splitComparatorVersion(ap)
- if err != nil {
- return nil, err
- }
- vr, err := buildVersionRange(opStr, vStr)
- if err != nil {
- return nil, fmt.Errorf("Could not parse Range %q: %s", ap, err)
- }
- rf := vr.rangeFunc()
-
- // Set function
- if andFn == nil {
- andFn = rf
- } else { // Combine with existing function
- andFn = andFn.AND(rf)
- }
- }
- if orFn == nil {
- orFn = andFn
- } else {
- orFn = orFn.OR(andFn)
- }
-
- }
- return orFn, nil
-}
-
-// splitORParts splits the already cleaned parts by '||'.
-// Checks for invalid positions of the operator and returns an
-// error if found.
-func splitORParts(parts []string) ([][]string, error) {
- var ORparts [][]string
- last := 0
- for i, p := range parts {
- if p == "||" {
- if i == 0 {
- return nil, fmt.Errorf("First element in range is '||'")
- }
- ORparts = append(ORparts, parts[last:i])
- last = i + 1
- }
- }
- if last == len(parts) {
- return nil, fmt.Errorf("Last element in range is '||'")
- }
- ORparts = append(ORparts, parts[last:])
- return ORparts, nil
-}
-
-// buildVersionRange takes a slice of 2: operator and version
-// and builds a versionRange, otherwise an error.
-func buildVersionRange(opStr, vStr string) (*versionRange, error) {
- c := parseComparator(opStr)
- if c == nil {
- return nil, fmt.Errorf("Could not parse comparator %q in %q", opStr, strings.Join([]string{opStr, vStr}, ""))
- }
- v, err := Parse(vStr)
- if err != nil {
- return nil, fmt.Errorf("Could not parse version %q in %q: %s", vStr, strings.Join([]string{opStr, vStr}, ""), err)
- }
-
- return &versionRange{
- v: v,
- c: c,
- }, nil
-
-}
-
-// inArray checks if a byte is contained in an array of bytes
-func inArray(s byte, list []byte) bool {
- for _, el := range list {
- if el == s {
- return true
- }
- }
- return false
-}
-
-// splitAndTrim splits a range string by spaces and cleans whitespaces
-func splitAndTrim(s string) (result []string) {
- last := 0
- var lastChar byte
- excludeFromSplit := []byte{'>', '<', '='}
- for i := 0; i < len(s); i++ {
- if s[i] == ' ' && !inArray(lastChar, excludeFromSplit) {
- if last < i-1 {
- result = append(result, s[last:i])
- }
- last = i + 1
- } else if s[i] != ' ' {
- lastChar = s[i]
- }
- }
- if last < len(s)-1 {
- result = append(result, s[last:])
- }
-
- for i, v := range result {
- result[i] = strings.Replace(v, " ", "", -1)
- }
-
- // parts := strings.Split(s, " ")
- // for _, x := range parts {
- // if s := strings.TrimSpace(x); len(s) != 0 {
- // result = append(result, s)
- // }
- // }
- return
-}
-
-// splitComparatorVersion splits the comparator from the version.
-// Input must be free of leading or trailing spaces.
-func splitComparatorVersion(s string) (string, string, error) {
- i := strings.IndexFunc(s, unicode.IsDigit)
- if i == -1 {
- return "", "", fmt.Errorf("Could not get version from string: %q", s)
- }
- return strings.TrimSpace(s[0:i]), s[i:], nil
-}
-
-// getWildcardType will return the type of wildcard that the
-// passed version contains
-func getWildcardType(vStr string) wildcardType {
- parts := strings.Split(vStr, ".")
- nparts := len(parts)
- wildcard := parts[nparts-1]
-
- possibleWildcardType := wildcardTypefromInt(nparts)
- if wildcard == "x" {
- return possibleWildcardType
- }
-
- return noneWildcard
-}
-
-// createVersionFromWildcard will convert a wildcard version
-// into a regular version, replacing 'x's with '0's, handling
-// special cases like '1.x.x' and '1.x'
-func createVersionFromWildcard(vStr string) string {
- // handle 1.x.x
- vStr2 := strings.Replace(vStr, ".x.x", ".x", 1)
- vStr2 = strings.Replace(vStr2, ".x", ".0", 1)
- parts := strings.Split(vStr2, ".")
-
- // handle 1.x
- if len(parts) == 2 {
- return vStr2 + ".0"
- }
-
- return vStr2
-}
-
-// incrementMajorVersion will increment the major version
-// of the passed version
-func incrementMajorVersion(vStr string) (string, error) {
- parts := strings.Split(vStr, ".")
- i, err := strconv.Atoi(parts[0])
- if err != nil {
- return "", err
- }
- parts[0] = strconv.Itoa(i + 1)
-
- return strings.Join(parts, "."), nil
-}
-
-// incrementMajorVersion will increment the minor version
-// of the passed version
-func incrementMinorVersion(vStr string) (string, error) {
- parts := strings.Split(vStr, ".")
- i, err := strconv.Atoi(parts[1])
- if err != nil {
- return "", err
- }
- parts[1] = strconv.Itoa(i + 1)
-
- return strings.Join(parts, "."), nil
-}
-
-// expandWildcardVersion will expand wildcards inside versions
-// following these rules:
-//
-// * when dealing with patch wildcards:
-// >= 1.2.x will become >= 1.2.0
-// <= 1.2.x will become < 1.3.0
-// > 1.2.x will become >= 1.3.0
-// < 1.2.x will become < 1.2.0
-// != 1.2.x will become < 1.2.0 >= 1.3.0
-//
-// * when dealing with minor wildcards:
-// >= 1.x will become >= 1.0.0
-// <= 1.x will become < 2.0.0
-// > 1.x will become >= 2.0.0
-// < 1.0 will become < 1.0.0
-// != 1.x will become < 1.0.0 >= 2.0.0
-//
-// * when dealing with wildcards without
-// version operator:
-// 1.2.x will become >= 1.2.0 < 1.3.0
-// 1.x will become >= 1.0.0 < 2.0.0
-func expandWildcardVersion(parts [][]string) ([][]string, error) {
- var expandedParts [][]string
- for _, p := range parts {
- var newParts []string
- for _, ap := range p {
- if strings.Index(ap, "x") != -1 {
- opStr, vStr, err := splitComparatorVersion(ap)
- if err != nil {
- return nil, err
- }
-
- versionWildcardType := getWildcardType(vStr)
- flatVersion := createVersionFromWildcard(vStr)
-
- var resultOperator string
- var shouldIncrementVersion bool
- switch opStr {
- case ">":
- resultOperator = ">="
- shouldIncrementVersion = true
- case ">=":
- resultOperator = ">="
- case "<":
- resultOperator = "<"
- case "<=":
- resultOperator = "<"
- shouldIncrementVersion = true
- case "", "=", "==":
- newParts = append(newParts, ">="+flatVersion)
- resultOperator = "<"
- shouldIncrementVersion = true
- case "!=", "!":
- newParts = append(newParts, "<"+flatVersion)
- resultOperator = ">="
- shouldIncrementVersion = true
- }
-
- var resultVersion string
- if shouldIncrementVersion {
- switch versionWildcardType {
- case patchWildcard:
- resultVersion, _ = incrementMinorVersion(flatVersion)
- case minorWildcard:
- resultVersion, _ = incrementMajorVersion(flatVersion)
- }
- } else {
- resultVersion = flatVersion
- }
-
- ap = resultOperator + resultVersion
- }
- newParts = append(newParts, ap)
- }
- expandedParts = append(expandedParts, newParts)
- }
-
- return expandedParts, nil
-}
-
-func parseComparator(s string) comparator {
- switch s {
- case "==":
- fallthrough
- case "":
- fallthrough
- case "=":
- return compEQ
- case ">":
- return compGT
- case ">=":
- return compGE
- case "<":
- return compLT
- case "<=":
- return compLE
- case "!":
- fallthrough
- case "!=":
- return compNE
- }
-
- return nil
-}
-
-// MustParseRange is like ParseRange but panics if the range cannot be parsed.
-func MustParseRange(s string) Range {
- r, err := ParseRange(s)
- if err != nil {
- panic(`semver: ParseRange(` + s + `): ` + err.Error())
- }
- return r
-}
diff --git a/vendor/github.com/blang/semver/semver.go b/vendor/github.com/blang/semver/semver.go
deleted file mode 100644
index 8ee0842e6a..0000000000
--- a/vendor/github.com/blang/semver/semver.go
+++ /dev/null
@@ -1,418 +0,0 @@
-package semver
-
-import (
- "errors"
- "fmt"
- "strconv"
- "strings"
-)
-
-const (
- numbers string = "0123456789"
- alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-"
- alphanum = alphas + numbers
-)
-
-// SpecVersion is the latest fully supported spec version of semver
-var SpecVersion = Version{
- Major: 2,
- Minor: 0,
- Patch: 0,
-}
-
-// Version represents a semver compatible version
-type Version struct {
- Major uint64
- Minor uint64
- Patch uint64
- Pre []PRVersion
- Build []string //No Precendence
-}
-
-// Version to string
-func (v Version) String() string {
- b := make([]byte, 0, 5)
- b = strconv.AppendUint(b, v.Major, 10)
- b = append(b, '.')
- b = strconv.AppendUint(b, v.Minor, 10)
- b = append(b, '.')
- b = strconv.AppendUint(b, v.Patch, 10)
-
- if len(v.Pre) > 0 {
- b = append(b, '-')
- b = append(b, v.Pre[0].String()...)
-
- for _, pre := range v.Pre[1:] {
- b = append(b, '.')
- b = append(b, pre.String()...)
- }
- }
-
- if len(v.Build) > 0 {
- b = append(b, '+')
- b = append(b, v.Build[0]...)
-
- for _, build := range v.Build[1:] {
- b = append(b, '.')
- b = append(b, build...)
- }
- }
-
- return string(b)
-}
-
-// Equals checks if v is equal to o.
-func (v Version) Equals(o Version) bool {
- return (v.Compare(o) == 0)
-}
-
-// EQ checks if v is equal to o.
-func (v Version) EQ(o Version) bool {
- return (v.Compare(o) == 0)
-}
-
-// NE checks if v is not equal to o.
-func (v Version) NE(o Version) bool {
- return (v.Compare(o) != 0)
-}
-
-// GT checks if v is greater than o.
-func (v Version) GT(o Version) bool {
- return (v.Compare(o) == 1)
-}
-
-// GTE checks if v is greater than or equal to o.
-func (v Version) GTE(o Version) bool {
- return (v.Compare(o) >= 0)
-}
-
-// GE checks if v is greater than or equal to o.
-func (v Version) GE(o Version) bool {
- return (v.Compare(o) >= 0)
-}
-
-// LT checks if v is less than o.
-func (v Version) LT(o Version) bool {
- return (v.Compare(o) == -1)
-}
-
-// LTE checks if v is less than or equal to o.
-func (v Version) LTE(o Version) bool {
- return (v.Compare(o) <= 0)
-}
-
-// LE checks if v is less than or equal to o.
-func (v Version) LE(o Version) bool {
- return (v.Compare(o) <= 0)
-}
-
-// Compare compares Versions v to o:
-// -1 == v is less than o
-// 0 == v is equal to o
-// 1 == v is greater than o
-func (v Version) Compare(o Version) int {
- if v.Major != o.Major {
- if v.Major > o.Major {
- return 1
- }
- return -1
- }
- if v.Minor != o.Minor {
- if v.Minor > o.Minor {
- return 1
- }
- return -1
- }
- if v.Patch != o.Patch {
- if v.Patch > o.Patch {
- return 1
- }
- return -1
- }
-
- // Quick comparison if a version has no prerelease versions
- if len(v.Pre) == 0 && len(o.Pre) == 0 {
- return 0
- } else if len(v.Pre) == 0 && len(o.Pre) > 0 {
- return 1
- } else if len(v.Pre) > 0 && len(o.Pre) == 0 {
- return -1
- }
-
- i := 0
- for ; i < len(v.Pre) && i < len(o.Pre); i++ {
- if comp := v.Pre[i].Compare(o.Pre[i]); comp == 0 {
- continue
- } else if comp == 1 {
- return 1
- } else {
- return -1
- }
- }
-
- // If all pr versions are the equal but one has further prversion, this one greater
- if i == len(v.Pre) && i == len(o.Pre) {
- return 0
- } else if i == len(v.Pre) && i < len(o.Pre) {
- return -1
- } else {
- return 1
- }
-
-}
-
-// Validate validates v and returns error in case
-func (v Version) Validate() error {
- // Major, Minor, Patch already validated using uint64
-
- for _, pre := range v.Pre {
- if !pre.IsNum { //Numeric prerelease versions already uint64
- if len(pre.VersionStr) == 0 {
- return fmt.Errorf("Prerelease can not be empty %q", pre.VersionStr)
- }
- if !containsOnly(pre.VersionStr, alphanum) {
- return fmt.Errorf("Invalid character(s) found in prerelease %q", pre.VersionStr)
- }
- }
- }
-
- for _, build := range v.Build {
- if len(build) == 0 {
- return fmt.Errorf("Build meta data can not be empty %q", build)
- }
- if !containsOnly(build, alphanum) {
- return fmt.Errorf("Invalid character(s) found in build meta data %q", build)
- }
- }
-
- return nil
-}
-
-// New is an alias for Parse and returns a pointer, parses version string and returns a validated Version or error
-func New(s string) (vp *Version, err error) {
- v, err := Parse(s)
- vp = &v
- return
-}
-
-// Make is an alias for Parse, parses version string and returns a validated Version or error
-func Make(s string) (Version, error) {
- return Parse(s)
-}
-
-// ParseTolerant allows for certain version specifications that do not strictly adhere to semver
-// specs to be parsed by this library. It does so by normalizing versions before passing them to
-// Parse(). It currently trims spaces, removes a "v" prefix, and adds a 0 patch number to versions
-// with only major and minor components specified
-func ParseTolerant(s string) (Version, error) {
- s = strings.TrimSpace(s)
- s = strings.TrimPrefix(s, "v")
-
- // Split into major.minor.(patch+pr+meta)
- parts := strings.SplitN(s, ".", 3)
- if len(parts) < 3 {
- if strings.ContainsAny(parts[len(parts)-1], "+-") {
- return Version{}, errors.New("Short version cannot contain PreRelease/Build meta data")
- }
- for len(parts) < 3 {
- parts = append(parts, "0")
- }
- s = strings.Join(parts, ".")
- }
-
- return Parse(s)
-}
-
-// Parse parses version string and returns a validated Version or error
-func Parse(s string) (Version, error) {
- if len(s) == 0 {
- return Version{}, errors.New("Version string empty")
- }
-
- // Split into major.minor.(patch+pr+meta)
- parts := strings.SplitN(s, ".", 3)
- if len(parts) != 3 {
- return Version{}, errors.New("No Major.Minor.Patch elements found")
- }
-
- // Major
- if !containsOnly(parts[0], numbers) {
- return Version{}, fmt.Errorf("Invalid character(s) found in major number %q", parts[0])
- }
- if hasLeadingZeroes(parts[0]) {
- return Version{}, fmt.Errorf("Major number must not contain leading zeroes %q", parts[0])
- }
- major, err := strconv.ParseUint(parts[0], 10, 64)
- if err != nil {
- return Version{}, err
- }
-
- // Minor
- if !containsOnly(parts[1], numbers) {
- return Version{}, fmt.Errorf("Invalid character(s) found in minor number %q", parts[1])
- }
- if hasLeadingZeroes(parts[1]) {
- return Version{}, fmt.Errorf("Minor number must not contain leading zeroes %q", parts[1])
- }
- minor, err := strconv.ParseUint(parts[1], 10, 64)
- if err != nil {
- return Version{}, err
- }
-
- v := Version{}
- v.Major = major
- v.Minor = minor
-
- var build, prerelease []string
- patchStr := parts[2]
-
- if buildIndex := strings.IndexRune(patchStr, '+'); buildIndex != -1 {
- build = strings.Split(patchStr[buildIndex+1:], ".")
- patchStr = patchStr[:buildIndex]
- }
-
- if preIndex := strings.IndexRune(patchStr, '-'); preIndex != -1 {
- prerelease = strings.Split(patchStr[preIndex+1:], ".")
- patchStr = patchStr[:preIndex]
- }
-
- if !containsOnly(patchStr, numbers) {
- return Version{}, fmt.Errorf("Invalid character(s) found in patch number %q", patchStr)
- }
- if hasLeadingZeroes(patchStr) {
- return Version{}, fmt.Errorf("Patch number must not contain leading zeroes %q", patchStr)
- }
- patch, err := strconv.ParseUint(patchStr, 10, 64)
- if err != nil {
- return Version{}, err
- }
-
- v.Patch = patch
-
- // Prerelease
- for _, prstr := range prerelease {
- parsedPR, err := NewPRVersion(prstr)
- if err != nil {
- return Version{}, err
- }
- v.Pre = append(v.Pre, parsedPR)
- }
-
- // Build meta data
- for _, str := range build {
- if len(str) == 0 {
- return Version{}, errors.New("Build meta data is empty")
- }
- if !containsOnly(str, alphanum) {
- return Version{}, fmt.Errorf("Invalid character(s) found in build meta data %q", str)
- }
- v.Build = append(v.Build, str)
- }
-
- return v, nil
-}
-
-// MustParse is like Parse but panics if the version cannot be parsed.
-func MustParse(s string) Version {
- v, err := Parse(s)
- if err != nil {
- panic(`semver: Parse(` + s + `): ` + err.Error())
- }
- return v
-}
-
-// PRVersion represents a PreRelease Version
-type PRVersion struct {
- VersionStr string
- VersionNum uint64
- IsNum bool
-}
-
-// NewPRVersion creates a new valid prerelease version
-func NewPRVersion(s string) (PRVersion, error) {
- if len(s) == 0 {
- return PRVersion{}, errors.New("Prerelease is empty")
- }
- v := PRVersion{}
- if containsOnly(s, numbers) {
- if hasLeadingZeroes(s) {
- return PRVersion{}, fmt.Errorf("Numeric PreRelease version must not contain leading zeroes %q", s)
- }
- num, err := strconv.ParseUint(s, 10, 64)
-
- // Might never be hit, but just in case
- if err != nil {
- return PRVersion{}, err
- }
- v.VersionNum = num
- v.IsNum = true
- } else if containsOnly(s, alphanum) {
- v.VersionStr = s
- v.IsNum = false
- } else {
- return PRVersion{}, fmt.Errorf("Invalid character(s) found in prerelease %q", s)
- }
- return v, nil
-}
-
-// IsNumeric checks if prerelease-version is numeric
-func (v PRVersion) IsNumeric() bool {
- return v.IsNum
-}
-
-// Compare compares two PreRelease Versions v and o:
-// -1 == v is less than o
-// 0 == v is equal to o
-// 1 == v is greater than o
-func (v PRVersion) Compare(o PRVersion) int {
- if v.IsNum && !o.IsNum {
- return -1
- } else if !v.IsNum && o.IsNum {
- return 1
- } else if v.IsNum && o.IsNum {
- if v.VersionNum == o.VersionNum {
- return 0
- } else if v.VersionNum > o.VersionNum {
- return 1
- } else {
- return -1
- }
- } else { // both are Alphas
- if v.VersionStr == o.VersionStr {
- return 0
- } else if v.VersionStr > o.VersionStr {
- return 1
- } else {
- return -1
- }
- }
-}
-
-// PreRelease version to string
-func (v PRVersion) String() string {
- if v.IsNum {
- return strconv.FormatUint(v.VersionNum, 10)
- }
- return v.VersionStr
-}
-
-func containsOnly(s string, set string) bool {
- return strings.IndexFunc(s, func(r rune) bool {
- return !strings.ContainsRune(set, r)
- }) == -1
-}
-
-func hasLeadingZeroes(s string) bool {
- return len(s) > 1 && s[0] == '0'
-}
-
-// NewBuildVersion creates a new valid build version
-func NewBuildVersion(s string) (string, error) {
- if len(s) == 0 {
- return "", errors.New("Buildversion is empty")
- }
- if !containsOnly(s, alphanum) {
- return "", fmt.Errorf("Invalid character(s) found in build meta data %q", s)
- }
- return s, nil
-}
diff --git a/vendor/github.com/blang/semver/sort.go b/vendor/github.com/blang/semver/sort.go
deleted file mode 100644
index e18f880826..0000000000
--- a/vendor/github.com/blang/semver/sort.go
+++ /dev/null
@@ -1,28 +0,0 @@
-package semver
-
-import (
- "sort"
-)
-
-// Versions represents multiple versions.
-type Versions []Version
-
-// Len returns length of version collection
-func (s Versions) Len() int {
- return len(s)
-}
-
-// Swap swaps two versions inside the collection by its indices
-func (s Versions) Swap(i, j int) {
- s[i], s[j] = s[j], s[i]
-}
-
-// Less checks if version at index i is less than version at index j
-func (s Versions) Less(i, j int) bool {
- return s[i].LT(s[j])
-}
-
-// Sort sorts a slice of versions
-func Sort(versions []Version) {
- sort.Sort(Versions(versions))
-}
diff --git a/vendor/github.com/blang/semver/sql.go b/vendor/github.com/blang/semver/sql.go
deleted file mode 100644
index eb4d802666..0000000000
--- a/vendor/github.com/blang/semver/sql.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package semver
-
-import (
- "database/sql/driver"
- "fmt"
-)
-
-// Scan implements the database/sql.Scanner interface.
-func (v *Version) Scan(src interface{}) (err error) {
- var str string
- switch src := src.(type) {
- case string:
- str = src
- case []byte:
- str = string(src)
- default:
- return fmt.Errorf("Version.Scan: cannot convert %T to string.", src)
- }
-
- if t, err := Parse(str); err == nil {
- *v = t
- }
-
- return
-}
-
-// Value implements the database/sql/driver.Valuer interface.
-func (v Version) Value() (driver.Value, error) {
- return v.String(), nil
-}
diff --git a/vendor/github.com/cenkalti/backoff/v4/.gitignore b/vendor/github.com/cenkalti/backoff/v4/.gitignore
new file mode 100644
index 0000000000..50d95c548b
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/.gitignore
@@ -0,0 +1,25 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+
+# IDEs
+.idea/
diff --git a/vendor/github.com/cenkalti/backoff/v4/LICENSE b/vendor/github.com/cenkalti/backoff/v4/LICENSE
new file mode 100644
index 0000000000..89b8179965
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Cenk Altı
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/github.com/cenkalti/backoff/v4/README.md b/vendor/github.com/cenkalti/backoff/v4/README.md
new file mode 100644
index 0000000000..16abdfc084
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/README.md
@@ -0,0 +1,32 @@
+# Exponential Backoff [![GoDoc][godoc image]][godoc] [![Build Status][travis image]][travis] [![Coverage Status][coveralls image]][coveralls]
+
+This is a Go port of the exponential backoff algorithm from [Google's HTTP Client Library for Java][google-http-java-client].
+
+[Exponential backoff][exponential backoff wiki]
+is an algorithm that uses feedback to multiplicatively decrease the rate of some process,
+in order to gradually find an acceptable rate.
+The retries exponentially increase and stop increasing when a certain threshold is met.
+
+## Usage
+
+Import path is `github.com/cenkalti/backoff/v4`. Please note the version part at the end.
+
+Use https://pkg.go.dev/github.com/cenkalti/backoff/v4 to view the documentation.
+
+## Contributing
+
+* I would like to keep this library as small as possible.
+* Please don't send a PR without opening an issue and discussing it first.
+* If proposed change is not a common use case, I will probably not accept it.
+
+[godoc]: https://pkg.go.dev/github.com/cenkalti/backoff/v4
+[godoc image]: https://godoc.org/github.com/cenkalti/backoff?status.png
+[travis]: https://travis-ci.org/cenkalti/backoff
+[travis image]: https://travis-ci.org/cenkalti/backoff.png?branch=master
+[coveralls]: https://coveralls.io/github/cenkalti/backoff?branch=master
+[coveralls image]: https://coveralls.io/repos/github/cenkalti/backoff/badge.svg?branch=master
+
+[google-http-java-client]: https://github.com/google/google-http-java-client/blob/da1aa993e90285ec18579f1553339b00e19b3ab5/google-http-client/src/main/java/com/google/api/client/util/ExponentialBackOff.java
+[exponential backoff wiki]: http://en.wikipedia.org/wiki/Exponential_backoff
+
+[advanced example]: https://pkg.go.dev/github.com/cenkalti/backoff/v4?tab=doc#pkg-examples
diff --git a/vendor/github.com/cenkalti/backoff/v4/backoff.go b/vendor/github.com/cenkalti/backoff/v4/backoff.go
new file mode 100644
index 0000000000..3676ee405d
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/backoff.go
@@ -0,0 +1,66 @@
+// Package backoff implements backoff algorithms for retrying operations.
+//
+// Use Retry function for retrying operations that may fail.
+// If Retry does not meet your needs,
+// copy/paste the function into your project and modify as you wish.
+//
+// There is also Ticker type similar to time.Ticker.
+// You can use it if you need to work with channels.
+//
+// See Examples section below for usage examples.
+package backoff
+
+import "time"
+
+// BackOff is a backoff policy for retrying an operation.
+type BackOff interface {
+ // NextBackOff returns the duration to wait before retrying the operation,
+ // or backoff. Stop to indicate that no more retries should be made.
+ //
+ // Example usage:
+ //
+ // duration := backoff.NextBackOff();
+ // if (duration == backoff.Stop) {
+ // // Do not retry operation.
+ // } else {
+ // // Sleep for duration and retry operation.
+ // }
+ //
+ NextBackOff() time.Duration
+
+ // Reset to initial state.
+ Reset()
+}
+
+// Stop indicates that no more retries should be made for use in NextBackOff().
+const Stop time.Duration = -1
+
+// ZeroBackOff is a fixed backoff policy whose backoff time is always zero,
+// meaning that the operation is retried immediately without waiting, indefinitely.
+type ZeroBackOff struct{}
+
+func (b *ZeroBackOff) Reset() {}
+
+func (b *ZeroBackOff) NextBackOff() time.Duration { return 0 }
+
+// StopBackOff is a fixed backoff policy that always returns backoff.Stop for
+// NextBackOff(), meaning that the operation should never be retried.
+type StopBackOff struct{}
+
+func (b *StopBackOff) Reset() {}
+
+func (b *StopBackOff) NextBackOff() time.Duration { return Stop }
+
+// ConstantBackOff is a backoff policy that always returns the same backoff delay.
+// This is in contrast to an exponential backoff policy,
+// which returns a delay that grows longer as you call NextBackOff() over and over again.
+type ConstantBackOff struct {
+ Interval time.Duration
+}
+
+func (b *ConstantBackOff) Reset() {}
+func (b *ConstantBackOff) NextBackOff() time.Duration { return b.Interval }
+
+func NewConstantBackOff(d time.Duration) *ConstantBackOff {
+ return &ConstantBackOff{Interval: d}
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/context.go b/vendor/github.com/cenkalti/backoff/v4/context.go
new file mode 100644
index 0000000000..48482330eb
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/context.go
@@ -0,0 +1,62 @@
+package backoff
+
+import (
+ "context"
+ "time"
+)
+
+// BackOffContext is a backoff policy that stops retrying after the context
+// is canceled.
+type BackOffContext interface { // nolint: golint
+ BackOff
+ Context() context.Context
+}
+
+type backOffContext struct {
+ BackOff
+ ctx context.Context
+}
+
+// WithContext returns a BackOffContext with context ctx
+//
+// ctx must not be nil
+func WithContext(b BackOff, ctx context.Context) BackOffContext { // nolint: golint
+ if ctx == nil {
+ panic("nil context")
+ }
+
+ if b, ok := b.(*backOffContext); ok {
+ return &backOffContext{
+ BackOff: b.BackOff,
+ ctx: ctx,
+ }
+ }
+
+ return &backOffContext{
+ BackOff: b,
+ ctx: ctx,
+ }
+}
+
+func getContext(b BackOff) context.Context {
+ if cb, ok := b.(BackOffContext); ok {
+ return cb.Context()
+ }
+ if tb, ok := b.(*backOffTries); ok {
+ return getContext(tb.delegate)
+ }
+ return context.Background()
+}
+
+func (b *backOffContext) Context() context.Context {
+ return b.ctx
+}
+
+func (b *backOffContext) NextBackOff() time.Duration {
+ select {
+ case <-b.ctx.Done():
+ return Stop
+ default:
+ return b.BackOff.NextBackOff()
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/exponential.go b/vendor/github.com/cenkalti/backoff/v4/exponential.go
new file mode 100644
index 0000000000..2c56c1e718
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/exponential.go
@@ -0,0 +1,161 @@
+package backoff
+
+import (
+ "math/rand"
+ "time"
+)
+
+/*
+ExponentialBackOff is a backoff implementation that increases the backoff
+period for each retry attempt using a randomization function that grows exponentially.
+
+NextBackOff() is calculated using the following formula:
+
+ randomized interval =
+ RetryInterval * (random value in range [1 - RandomizationFactor, 1 + RandomizationFactor])
+
+In other words NextBackOff() will range between the randomization factor
+percentage below and above the retry interval.
+
+For example, given the following parameters:
+
+ RetryInterval = 2
+ RandomizationFactor = 0.5
+ Multiplier = 2
+
+the actual backoff period used in the next retry attempt will range between 1 and 3 seconds,
+multiplied by the exponential, that is, between 2 and 6 seconds.
+
+Note: MaxInterval caps the RetryInterval and not the randomized interval.
+
+If the time elapsed since an ExponentialBackOff instance is created goes past the
+MaxElapsedTime, then the method NextBackOff() starts returning backoff.Stop.
+
+The elapsed time can be reset by calling Reset().
+
+Example: Given the following default arguments, for 10 tries the sequence will be,
+and assuming we go over the MaxElapsedTime on the 10th try:
+
+ Request # RetryInterval (seconds) Randomized Interval (seconds)
+
+ 1 0.5 [0.25, 0.75]
+ 2 0.75 [0.375, 1.125]
+ 3 1.125 [0.562, 1.687]
+ 4 1.687 [0.8435, 2.53]
+ 5 2.53 [1.265, 3.795]
+ 6 3.795 [1.897, 5.692]
+ 7 5.692 [2.846, 8.538]
+ 8 8.538 [4.269, 12.807]
+ 9 12.807 [6.403, 19.210]
+ 10 19.210 backoff.Stop
+
+Note: Implementation is not thread-safe.
+*/
+type ExponentialBackOff struct {
+ InitialInterval time.Duration
+ RandomizationFactor float64
+ Multiplier float64
+ MaxInterval time.Duration
+ // After MaxElapsedTime the ExponentialBackOff returns Stop.
+ // It never stops if MaxElapsedTime == 0.
+ MaxElapsedTime time.Duration
+ Stop time.Duration
+ Clock Clock
+
+ currentInterval time.Duration
+ startTime time.Time
+}
+
+// Clock is an interface that returns current time for BackOff.
+type Clock interface {
+ Now() time.Time
+}
+
+// Default values for ExponentialBackOff.
+const (
+ DefaultInitialInterval = 500 * time.Millisecond
+ DefaultRandomizationFactor = 0.5
+ DefaultMultiplier = 1.5
+ DefaultMaxInterval = 60 * time.Second
+ DefaultMaxElapsedTime = 15 * time.Minute
+)
+
+// NewExponentialBackOff creates an instance of ExponentialBackOff using default values.
+func NewExponentialBackOff() *ExponentialBackOff {
+ b := &ExponentialBackOff{
+ InitialInterval: DefaultInitialInterval,
+ RandomizationFactor: DefaultRandomizationFactor,
+ Multiplier: DefaultMultiplier,
+ MaxInterval: DefaultMaxInterval,
+ MaxElapsedTime: DefaultMaxElapsedTime,
+ Stop: Stop,
+ Clock: SystemClock,
+ }
+ b.Reset()
+ return b
+}
+
+type systemClock struct{}
+
+func (t systemClock) Now() time.Time {
+ return time.Now()
+}
+
+// SystemClock implements Clock interface that uses time.Now().
+var SystemClock = systemClock{}
+
+// Reset the interval back to the initial retry interval and restarts the timer.
+// Reset must be called before using b.
+func (b *ExponentialBackOff) Reset() {
+ b.currentInterval = b.InitialInterval
+ b.startTime = b.Clock.Now()
+}
+
+// NextBackOff calculates the next backoff interval using the formula:
+// Randomized interval = RetryInterval * (1 ± RandomizationFactor)
+func (b *ExponentialBackOff) NextBackOff() time.Duration {
+ // Make sure we have not gone over the maximum elapsed time.
+ elapsed := b.GetElapsedTime()
+ next := getRandomValueFromInterval(b.RandomizationFactor, rand.Float64(), b.currentInterval)
+ b.incrementCurrentInterval()
+ if b.MaxElapsedTime != 0 && elapsed+next > b.MaxElapsedTime {
+ return b.Stop
+ }
+ return next
+}
+
+// GetElapsedTime returns the elapsed time since an ExponentialBackOff instance
+// is created and is reset when Reset() is called.
+//
+// The elapsed time is computed using time.Now().UnixNano(). It is
+// safe to call even while the backoff policy is used by a running
+// ticker.
+func (b *ExponentialBackOff) GetElapsedTime() time.Duration {
+ return b.Clock.Now().Sub(b.startTime)
+}
+
+// Increments the current interval by multiplying it with the multiplier.
+func (b *ExponentialBackOff) incrementCurrentInterval() {
+ // Check for overflow, if overflow is detected set the current interval to the max interval.
+ if float64(b.currentInterval) >= float64(b.MaxInterval)/b.Multiplier {
+ b.currentInterval = b.MaxInterval
+ } else {
+ b.currentInterval = time.Duration(float64(b.currentInterval) * b.Multiplier)
+ }
+}
+
+// Returns a random value from the following interval:
+// [currentInterval - randomizationFactor * currentInterval, currentInterval + randomizationFactor * currentInterval].
+func getRandomValueFromInterval(randomizationFactor, random float64, currentInterval time.Duration) time.Duration {
+ if randomizationFactor == 0 {
+ return currentInterval // make sure no randomness is used when randomizationFactor is 0.
+ }
+ var delta = randomizationFactor * float64(currentInterval)
+ var minInterval = float64(currentInterval) - delta
+ var maxInterval = float64(currentInterval) + delta
+
+ // Get a random value from the range [minInterval, maxInterval].
+ // The formula used below has a +1 because if the minInterval is 1 and the maxInterval is 3 then
+ // we want a 33% chance for selecting either 1, 2 or 3.
+ return time.Duration(minInterval + (random * (maxInterval - minInterval + 1)))
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/retry.go b/vendor/github.com/cenkalti/backoff/v4/retry.go
new file mode 100644
index 0000000000..b9c0c51cd7
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/retry.go
@@ -0,0 +1,146 @@
+package backoff
+
+import (
+ "errors"
+ "time"
+)
+
+// An OperationWithData is executing by RetryWithData() or RetryNotifyWithData().
+// The operation will be retried using a backoff policy if it returns an error.
+type OperationWithData[T any] func() (T, error)
+
+// An Operation is executing by Retry() or RetryNotify().
+// The operation will be retried using a backoff policy if it returns an error.
+type Operation func() error
+
+func (o Operation) withEmptyData() OperationWithData[struct{}] {
+ return func() (struct{}, error) {
+ return struct{}{}, o()
+ }
+}
+
+// Notify is a notify-on-error function. It receives an operation error and
+// backoff delay if the operation failed (with an error).
+//
+// NOTE that if the backoff policy stated to stop retrying,
+// the notify function isn't called.
+type Notify func(error, time.Duration)
+
+// Retry the operation o until it does not return error or BackOff stops.
+// o is guaranteed to be run at least once.
+//
+// If o returns a *PermanentError, the operation is not retried, and the
+// wrapped error is returned.
+//
+// Retry sleeps the goroutine for the duration returned by BackOff after a
+// failed operation returns.
+func Retry(o Operation, b BackOff) error {
+ return RetryNotify(o, b, nil)
+}
+
+// RetryWithData is like Retry but returns data in the response too.
+func RetryWithData[T any](o OperationWithData[T], b BackOff) (T, error) {
+ return RetryNotifyWithData(o, b, nil)
+}
+
+// RetryNotify calls notify function with the error and wait duration
+// for each failed attempt before sleep.
+func RetryNotify(operation Operation, b BackOff, notify Notify) error {
+ return RetryNotifyWithTimer(operation, b, notify, nil)
+}
+
+// RetryNotifyWithData is like RetryNotify but returns data in the response too.
+func RetryNotifyWithData[T any](operation OperationWithData[T], b BackOff, notify Notify) (T, error) {
+ return doRetryNotify(operation, b, notify, nil)
+}
+
+// RetryNotifyWithTimer calls notify function with the error and wait duration using the given Timer
+// for each failed attempt before sleep.
+// A default timer that uses system timer is used when nil is passed.
+func RetryNotifyWithTimer(operation Operation, b BackOff, notify Notify, t Timer) error {
+ _, err := doRetryNotify(operation.withEmptyData(), b, notify, t)
+ return err
+}
+
+// RetryNotifyWithTimerAndData is like RetryNotifyWithTimer but returns data in the response too.
+func RetryNotifyWithTimerAndData[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) {
+ return doRetryNotify(operation, b, notify, t)
+}
+
+func doRetryNotify[T any](operation OperationWithData[T], b BackOff, notify Notify, t Timer) (T, error) {
+ var (
+ err error
+ next time.Duration
+ res T
+ )
+ if t == nil {
+ t = &defaultTimer{}
+ }
+
+ defer func() {
+ t.Stop()
+ }()
+
+ ctx := getContext(b)
+
+ b.Reset()
+ for {
+ res, err = operation()
+ if err == nil {
+ return res, nil
+ }
+
+ var permanent *PermanentError
+ if errors.As(err, &permanent) {
+ return res, permanent.Err
+ }
+
+ if next = b.NextBackOff(); next == Stop {
+ if cerr := ctx.Err(); cerr != nil {
+ return res, cerr
+ }
+
+ return res, err
+ }
+
+ if notify != nil {
+ notify(err, next)
+ }
+
+ t.Start(next)
+
+ select {
+ case <-ctx.Done():
+ return res, ctx.Err()
+ case <-t.C():
+ }
+ }
+}
+
+// PermanentError signals that the operation should not be retried.
+type PermanentError struct {
+ Err error
+}
+
+func (e *PermanentError) Error() string {
+ return e.Err.Error()
+}
+
+func (e *PermanentError) Unwrap() error {
+ return e.Err
+}
+
+func (e *PermanentError) Is(target error) bool {
+ _, ok := target.(*PermanentError)
+ return ok
+}
+
+// Permanent wraps the given err in a *PermanentError.
+func Permanent(err error) error {
+ if err == nil {
+ return nil
+ }
+ return &PermanentError{
+ Err: err,
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/ticker.go b/vendor/github.com/cenkalti/backoff/v4/ticker.go
new file mode 100644
index 0000000000..df9d68bce5
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/ticker.go
@@ -0,0 +1,97 @@
+package backoff
+
+import (
+ "context"
+ "sync"
+ "time"
+)
+
+// Ticker holds a channel that delivers `ticks' of a clock at times reported by a BackOff.
+//
+// Ticks will continue to arrive when the previous operation is still running,
+// so operations that take a while to fail could run in quick succession.
+type Ticker struct {
+ C <-chan time.Time
+ c chan time.Time
+ b BackOff
+ ctx context.Context
+ timer Timer
+ stop chan struct{}
+ stopOnce sync.Once
+}
+
+// NewTicker returns a new Ticker containing a channel that will send
+// the time at times specified by the BackOff argument. Ticker is
+// guaranteed to tick at least once. The channel is closed when Stop
+// method is called or BackOff stops. It is not safe to manipulate the
+// provided backoff policy (notably calling NextBackOff or Reset)
+// while the ticker is running.
+func NewTicker(b BackOff) *Ticker {
+ return NewTickerWithTimer(b, &defaultTimer{})
+}
+
+// NewTickerWithTimer returns a new Ticker with a custom timer.
+// A default timer that uses system timer is used when nil is passed.
+func NewTickerWithTimer(b BackOff, timer Timer) *Ticker {
+ if timer == nil {
+ timer = &defaultTimer{}
+ }
+ c := make(chan time.Time)
+ t := &Ticker{
+ C: c,
+ c: c,
+ b: b,
+ ctx: getContext(b),
+ timer: timer,
+ stop: make(chan struct{}),
+ }
+ t.b.Reset()
+ go t.run()
+ return t
+}
+
+// Stop turns off a ticker. After Stop, no more ticks will be sent.
+func (t *Ticker) Stop() {
+ t.stopOnce.Do(func() { close(t.stop) })
+}
+
+func (t *Ticker) run() {
+ c := t.c
+ defer close(c)
+
+ // Ticker is guaranteed to tick at least once.
+ afterC := t.send(time.Now())
+
+ for {
+ if afterC == nil {
+ return
+ }
+
+ select {
+ case tick := <-afterC:
+ afterC = t.send(tick)
+ case <-t.stop:
+ t.c = nil // Prevent future ticks from being sent to the channel.
+ return
+ case <-t.ctx.Done():
+ return
+ }
+ }
+}
+
+func (t *Ticker) send(tick time.Time) <-chan time.Time {
+ select {
+ case t.c <- tick:
+ case <-t.stop:
+ return nil
+ }
+
+ next := t.b.NextBackOff()
+ if next == Stop {
+ t.Stop()
+ return nil
+ }
+
+ t.timer.Start(next)
+ return t.timer.C()
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/timer.go b/vendor/github.com/cenkalti/backoff/v4/timer.go
new file mode 100644
index 0000000000..8120d0213c
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/timer.go
@@ -0,0 +1,35 @@
+package backoff
+
+import "time"
+
+type Timer interface {
+ Start(duration time.Duration)
+ Stop()
+ C() <-chan time.Time
+}
+
+// defaultTimer implements Timer interface using time.Timer
+type defaultTimer struct {
+ timer *time.Timer
+}
+
+// C returns the timers channel which receives the current time when the timer fires.
+func (t *defaultTimer) C() <-chan time.Time {
+ return t.timer.C
+}
+
+// Start starts the timer to fire after the given duration
+func (t *defaultTimer) Start(duration time.Duration) {
+ if t.timer == nil {
+ t.timer = time.NewTimer(duration)
+ } else {
+ t.timer.Reset(duration)
+ }
+}
+
+// Stop is called when the timer is not used anymore and resources may be freed.
+func (t *defaultTimer) Stop() {
+ if t.timer != nil {
+ t.timer.Stop()
+ }
+}
diff --git a/vendor/github.com/cenkalti/backoff/v4/tries.go b/vendor/github.com/cenkalti/backoff/v4/tries.go
new file mode 100644
index 0000000000..28d58ca37c
--- /dev/null
+++ b/vendor/github.com/cenkalti/backoff/v4/tries.go
@@ -0,0 +1,38 @@
+package backoff
+
+import "time"
+
+/*
+WithMaxRetries creates a wrapper around another BackOff, which will
+return Stop if NextBackOff() has been called too many times since
+the last time Reset() was called
+
+Note: Implementation is not thread-safe.
+*/
+func WithMaxRetries(b BackOff, max uint64) BackOff {
+ return &backOffTries{delegate: b, maxTries: max}
+}
+
+type backOffTries struct {
+ delegate BackOff
+ maxTries uint64
+ numTries uint64
+}
+
+func (b *backOffTries) NextBackOff() time.Duration {
+ if b.maxTries == 0 {
+ return Stop
+ }
+ if b.maxTries > 0 {
+ if b.maxTries <= b.numTries {
+ return Stop
+ }
+ b.numTries++
+ }
+ return b.delegate.NextBackOff()
+}
+
+func (b *backOffTries) Reset() {
+ b.numTries = 0
+ b.delegate.Reset()
+}
diff --git a/vendor/github.com/cespare/xxhash/v2/README.md b/vendor/github.com/cespare/xxhash/v2/README.md
index 792b4a60b3..8bf0e5b781 100644
--- a/vendor/github.com/cespare/xxhash/v2/README.md
+++ b/vendor/github.com/cespare/xxhash/v2/README.md
@@ -3,8 +3,7 @@
[](https://pkg.go.dev/github.com/cespare/xxhash/v2)
[](https://github.com/cespare/xxhash/actions/workflows/test.yml)
-xxhash is a Go implementation of the 64-bit
-[xxHash](http://cyan4973.github.io/xxHash/) algorithm, XXH64. This is a
+xxhash is a Go implementation of the 64-bit [xxHash] algorithm, XXH64. This is a
high-quality hashing algorithm that is much faster than anything in the Go
standard library.
@@ -25,8 +24,11 @@ func (*Digest) WriteString(string) (int, error)
func (*Digest) Sum64() uint64
```
-This implementation provides a fast pure-Go implementation and an even faster
-assembly implementation for amd64.
+The package is written with optimized pure Go and also contains even faster
+assembly implementations for amd64 and arm64. If desired, the `purego` build tag
+opts into using the Go code even on those architectures.
+
+[xxHash]: http://cyan4973.github.io/xxHash/
## Compatibility
@@ -45,19 +47,20 @@ I recommend using the latest release of Go.
Here are some quick benchmarks comparing the pure-Go and assembly
implementations of Sum64.
-| input size | purego | asm |
-| --- | --- | --- |
-| 5 B | 979.66 MB/s | 1291.17 MB/s |
-| 100 B | 7475.26 MB/s | 7973.40 MB/s |
-| 4 KB | 17573.46 MB/s | 17602.65 MB/s |
-| 10 MB | 17131.46 MB/s | 17142.16 MB/s |
+| input size | purego | asm |
+| ---------- | --------- | --------- |
+| 4 B | 1.3 GB/s | 1.2 GB/s |
+| 16 B | 2.9 GB/s | 3.5 GB/s |
+| 100 B | 6.9 GB/s | 8.1 GB/s |
+| 4 KB | 11.7 GB/s | 16.7 GB/s |
+| 10 MB | 12.0 GB/s | 17.3 GB/s |
-These numbers were generated on Ubuntu 18.04 with an Intel i7-8700K CPU using
-the following commands under Go 1.11.2:
+These numbers were generated on Ubuntu 20.04 with an Intel Xeon Platinum 8252C
+CPU using the following commands under Go 1.19.2:
```
-$ go test -tags purego -benchtime 10s -bench '/xxhash,direct,bytes'
-$ go test -benchtime 10s -bench '/xxhash,direct,bytes'
+benchstat <(go test -tags purego -benchtime 500ms -count 15 -bench 'Sum64$')
+benchstat <(go test -benchtime 500ms -count 15 -bench 'Sum64$')
```
## Projects using this package
diff --git a/vendor/github.com/cespare/xxhash/v2/testall.sh b/vendor/github.com/cespare/xxhash/v2/testall.sh
new file mode 100644
index 0000000000..94b9c44398
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/v2/testall.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+set -eu -o pipefail
+
+# Small convenience script for running the tests with various combinations of
+# arch/tags. This assumes we're running on amd64 and have qemu available.
+
+go test ./...
+go test -tags purego ./...
+GOARCH=arm64 go test
+GOARCH=arm64 go test -tags purego
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash.go b/vendor/github.com/cespare/xxhash/v2/xxhash.go
index 15c835d541..a9e0d45c9d 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash.go
@@ -16,19 +16,11 @@ const (
prime5 uint64 = 2870177450012600261
)
-// NOTE(caleb): I'm using both consts and vars of the primes. Using consts where
-// possible in the Go code is worth a small (but measurable) performance boost
-// by avoiding some MOVQs. Vars are needed for the asm and also are useful for
-// convenience in the Go code in a few places where we need to intentionally
-// avoid constant arithmetic (e.g., v1 := prime1 + prime2 fails because the
-// result overflows a uint64).
-var (
- prime1v = prime1
- prime2v = prime2
- prime3v = prime3
- prime4v = prime4
- prime5v = prime5
-)
+// Store the primes in an array as well.
+//
+// The consts are used when possible in Go code to avoid MOVs but we need a
+// contiguous array of the assembly code.
+var primes = [...]uint64{prime1, prime2, prime3, prime4, prime5}
// Digest implements hash.Hash64.
type Digest struct {
@@ -50,10 +42,10 @@ func New() *Digest {
// Reset clears the Digest's state so that it can be reused.
func (d *Digest) Reset() {
- d.v1 = prime1v + prime2
+ d.v1 = primes[0] + prime2
d.v2 = prime2
d.v3 = 0
- d.v4 = -prime1v
+ d.v4 = -primes[0]
d.total = 0
d.n = 0
}
@@ -69,21 +61,23 @@ func (d *Digest) Write(b []byte) (n int, err error) {
n = len(b)
d.total += uint64(n)
+ memleft := d.mem[d.n&(len(d.mem)-1):]
+
if d.n+n < 32 {
// This new data doesn't even fill the current block.
- copy(d.mem[d.n:], b)
+ copy(memleft, b)
d.n += n
return
}
if d.n > 0 {
// Finish off the partial block.
- copy(d.mem[d.n:], b)
+ c := copy(memleft, b)
d.v1 = round(d.v1, u64(d.mem[0:8]))
d.v2 = round(d.v2, u64(d.mem[8:16]))
d.v3 = round(d.v3, u64(d.mem[16:24]))
d.v4 = round(d.v4, u64(d.mem[24:32]))
- b = b[32-d.n:]
+ b = b[c:]
d.n = 0
}
@@ -133,21 +127,20 @@ func (d *Digest) Sum64() uint64 {
h += d.total
- i, end := 0, d.n
- for ; i+8 <= end; i += 8 {
- k1 := round(0, u64(d.mem[i:i+8]))
+ b := d.mem[:d.n&(len(d.mem)-1)]
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
h ^= k1
h = rol27(h)*prime1 + prime4
}
- if i+4 <= end {
- h ^= uint64(u32(d.mem[i:i+4])) * prime1
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
h = rol23(h)*prime2 + prime3
- i += 4
+ b = b[4:]
}
- for i < end {
- h ^= uint64(d.mem[i]) * prime5
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
h = rol11(h) * prime1
- i++
}
h ^= h >> 33
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
deleted file mode 100644
index ad14b807f4..0000000000
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// +build !appengine
-// +build gc
-// +build !purego
-
-package xxhash
-
-// Sum64 computes the 64-bit xxHash digest of b.
-//
-//go:noescape
-func Sum64(b []byte) uint64
-
-//go:noescape
-func writeBlocks(d *Digest, b []byte) int
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
index be8db5bf79..3e8b132579 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_amd64.s
@@ -1,215 +1,209 @@
+//go:build !appengine && gc && !purego
// +build !appengine
// +build gc
// +build !purego
#include "textflag.h"
-// Register allocation:
-// AX h
-// SI pointer to advance through b
-// DX n
-// BX loop end
-// R8 v1, k1
-// R9 v2
-// R10 v3
-// R11 v4
-// R12 tmp
-// R13 prime1v
-// R14 prime2v
-// DI prime4v
-
-// round reads from and advances the buffer pointer in SI.
-// It assumes that R13 has prime1v and R14 has prime2v.
-#define round(r) \
- MOVQ (SI), R12 \
- ADDQ $8, SI \
- IMULQ R14, R12 \
- ADDQ R12, r \
- ROLQ $31, r \
- IMULQ R13, r
-
-// mergeRound applies a merge round on the two registers acc and val.
-// It assumes that R13 has prime1v, R14 has prime2v, and DI has prime4v.
-#define mergeRound(acc, val) \
- IMULQ R14, val \
- ROLQ $31, val \
- IMULQ R13, val \
- XORQ val, acc \
- IMULQ R13, acc \
- ADDQ DI, acc
+// Registers:
+#define h AX
+#define d AX
+#define p SI // pointer to advance through b
+#define n DX
+#define end BX // loop end
+#define v1 R8
+#define v2 R9
+#define v3 R10
+#define v4 R11
+#define x R12
+#define prime1 R13
+#define prime2 R14
+#define prime4 DI
+
+#define round(acc, x) \
+ IMULQ prime2, x \
+ ADDQ x, acc \
+ ROLQ $31, acc \
+ IMULQ prime1, acc
+
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ IMULQ prime2, x \
+ ROLQ $31, x \
+ IMULQ prime1, x
+
+// mergeRound applies a merge round on the two registers acc and x.
+// It assumes that prime1, prime2, and prime4 have been loaded.
+#define mergeRound(acc, x) \
+ round0(x) \
+ XORQ x, acc \
+ IMULQ prime1, acc \
+ ADDQ prime4, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that there is at least one block
+// to process.
+#define blockLoop() \
+loop: \
+ MOVQ +0(p), x \
+ round(v1, x) \
+ MOVQ +8(p), x \
+ round(v2, x) \
+ MOVQ +16(p), x \
+ round(v3, x) \
+ MOVQ +24(p), x \
+ round(v4, x) \
+ ADDQ $32, p \
+ CMPQ p, end \
+ JLE loop
// func Sum64(b []byte) uint64
-TEXT ·Sum64(SB), NOSPLIT, $0-32
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
// Load fixed primes.
- MOVQ ·prime1v(SB), R13
- MOVQ ·prime2v(SB), R14
- MOVQ ·prime4v(SB), DI
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
+ MOVQ ·primes+24(SB), prime4
// Load slice.
- MOVQ b_base+0(FP), SI
- MOVQ b_len+8(FP), DX
- LEAQ (SI)(DX*1), BX
+ MOVQ b_base+0(FP), p
+ MOVQ b_len+8(FP), n
+ LEAQ (p)(n*1), end
// The first loop limit will be len(b)-32.
- SUBQ $32, BX
+ SUBQ $32, end
// Check whether we have at least one block.
- CMPQ DX, $32
+ CMPQ n, $32
JLT noBlocks
// Set up initial state (v1, v2, v3, v4).
- MOVQ R13, R8
- ADDQ R14, R8
- MOVQ R14, R9
- XORQ R10, R10
- XORQ R11, R11
- SUBQ R13, R11
-
- // Loop until SI > BX.
-blockLoop:
- round(R8)
- round(R9)
- round(R10)
- round(R11)
-
- CMPQ SI, BX
- JLE blockLoop
-
- MOVQ R8, AX
- ROLQ $1, AX
- MOVQ R9, R12
- ROLQ $7, R12
- ADDQ R12, AX
- MOVQ R10, R12
- ROLQ $12, R12
- ADDQ R12, AX
- MOVQ R11, R12
- ROLQ $18, R12
- ADDQ R12, AX
-
- mergeRound(AX, R8)
- mergeRound(AX, R9)
- mergeRound(AX, R10)
- mergeRound(AX, R11)
+ MOVQ prime1, v1
+ ADDQ prime2, v1
+ MOVQ prime2, v2
+ XORQ v3, v3
+ XORQ v4, v4
+ SUBQ prime1, v4
+
+ blockLoop()
+
+ MOVQ v1, h
+ ROLQ $1, h
+ MOVQ v2, x
+ ROLQ $7, x
+ ADDQ x, h
+ MOVQ v3, x
+ ROLQ $12, x
+ ADDQ x, h
+ MOVQ v4, x
+ ROLQ $18, x
+ ADDQ x, h
+
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
JMP afterBlocks
noBlocks:
- MOVQ ·prime5v(SB), AX
+ MOVQ ·primes+32(SB), h
afterBlocks:
- ADDQ DX, AX
-
- // Right now BX has len(b)-32, and we want to loop until SI > len(b)-8.
- ADDQ $24, BX
-
- CMPQ SI, BX
- JG fourByte
-
-wordLoop:
- // Calculate k1.
- MOVQ (SI), R8
- ADDQ $8, SI
- IMULQ R14, R8
- ROLQ $31, R8
- IMULQ R13, R8
-
- XORQ R8, AX
- ROLQ $27, AX
- IMULQ R13, AX
- ADDQ DI, AX
-
- CMPQ SI, BX
- JLE wordLoop
-
-fourByte:
- ADDQ $4, BX
- CMPQ SI, BX
- JG singles
-
- MOVL (SI), R8
- ADDQ $4, SI
- IMULQ R13, R8
- XORQ R8, AX
-
- ROLQ $23, AX
- IMULQ R14, AX
- ADDQ ·prime3v(SB), AX
-
-singles:
- ADDQ $4, BX
- CMPQ SI, BX
+ ADDQ n, h
+
+ ADDQ $24, end
+ CMPQ p, end
+ JG try4
+
+loop8:
+ MOVQ (p), x
+ ADDQ $8, p
+ round0(x)
+ XORQ x, h
+ ROLQ $27, h
+ IMULQ prime1, h
+ ADDQ prime4, h
+
+ CMPQ p, end
+ JLE loop8
+
+try4:
+ ADDQ $4, end
+ CMPQ p, end
+ JG try1
+
+ MOVL (p), x
+ ADDQ $4, p
+ IMULQ prime1, x
+ XORQ x, h
+
+ ROLQ $23, h
+ IMULQ prime2, h
+ ADDQ ·primes+16(SB), h
+
+try1:
+ ADDQ $4, end
+ CMPQ p, end
JGE finalize
-singlesLoop:
- MOVBQZX (SI), R12
- ADDQ $1, SI
- IMULQ ·prime5v(SB), R12
- XORQ R12, AX
+loop1:
+ MOVBQZX (p), x
+ ADDQ $1, p
+ IMULQ ·primes+32(SB), x
+ XORQ x, h
+ ROLQ $11, h
+ IMULQ prime1, h
- ROLQ $11, AX
- IMULQ R13, AX
-
- CMPQ SI, BX
- JL singlesLoop
+ CMPQ p, end
+ JL loop1
finalize:
- MOVQ AX, R12
- SHRQ $33, R12
- XORQ R12, AX
- IMULQ R14, AX
- MOVQ AX, R12
- SHRQ $29, R12
- XORQ R12, AX
- IMULQ ·prime3v(SB), AX
- MOVQ AX, R12
- SHRQ $32, R12
- XORQ R12, AX
-
- MOVQ AX, ret+24(FP)
+ MOVQ h, x
+ SHRQ $33, x
+ XORQ x, h
+ IMULQ prime2, h
+ MOVQ h, x
+ SHRQ $29, x
+ XORQ x, h
+ IMULQ ·primes+16(SB), h
+ MOVQ h, x
+ SHRQ $32, x
+ XORQ x, h
+
+ MOVQ h, ret+24(FP)
RET
-// writeBlocks uses the same registers as above except that it uses AX to store
-// the d pointer.
-
// func writeBlocks(d *Digest, b []byte) int
-TEXT ·writeBlocks(SB), NOSPLIT, $0-40
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
// Load fixed primes needed for round.
- MOVQ ·prime1v(SB), R13
- MOVQ ·prime2v(SB), R14
+ MOVQ ·primes+0(SB), prime1
+ MOVQ ·primes+8(SB), prime2
// Load slice.
- MOVQ b_base+8(FP), SI
- MOVQ b_len+16(FP), DX
- LEAQ (SI)(DX*1), BX
- SUBQ $32, BX
+ MOVQ b_base+8(FP), p
+ MOVQ b_len+16(FP), n
+ LEAQ (p)(n*1), end
+ SUBQ $32, end
// Load vN from d.
- MOVQ d+0(FP), AX
- MOVQ 0(AX), R8 // v1
- MOVQ 8(AX), R9 // v2
- MOVQ 16(AX), R10 // v3
- MOVQ 24(AX), R11 // v4
+ MOVQ s+0(FP), d
+ MOVQ 0(d), v1
+ MOVQ 8(d), v2
+ MOVQ 16(d), v3
+ MOVQ 24(d), v4
// We don't need to check the loop condition here; this function is
// always called with at least one block of data to process.
-blockLoop:
- round(R8)
- round(R9)
- round(R10)
- round(R11)
-
- CMPQ SI, BX
- JLE blockLoop
+ blockLoop()
// Copy vN back to d.
- MOVQ R8, 0(AX)
- MOVQ R9, 8(AX)
- MOVQ R10, 16(AX)
- MOVQ R11, 24(AX)
-
- // The number of bytes written is SI minus the old base pointer.
- SUBQ b_base+8(FP), SI
- MOVQ SI, ret+32(FP)
+ MOVQ v1, 0(d)
+ MOVQ v2, 8(d)
+ MOVQ v3, 16(d)
+ MOVQ v4, 24(d)
+
+ // The number of bytes written is p minus the old base pointer.
+ SUBQ b_base+8(FP), p
+ MOVQ p, ret+32(FP)
RET
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
new file mode 100644
index 0000000000..7e3145a221
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_arm64.s
@@ -0,0 +1,183 @@
+//go:build !appengine && gc && !purego
+// +build !appengine
+// +build gc
+// +build !purego
+
+#include "textflag.h"
+
+// Registers:
+#define digest R1
+#define h R2 // return value
+#define p R3 // input pointer
+#define n R4 // input length
+#define nblocks R5 // n / 32
+#define prime1 R7
+#define prime2 R8
+#define prime3 R9
+#define prime4 R10
+#define prime5 R11
+#define v1 R12
+#define v2 R13
+#define v3 R14
+#define v4 R15
+#define x1 R20
+#define x2 R21
+#define x3 R22
+#define x4 R23
+
+#define round(acc, x) \
+ MADD prime2, acc, x, acc \
+ ROR $64-31, acc \
+ MUL prime1, acc
+
+// round0 performs the operation x = round(0, x).
+#define round0(x) \
+ MUL prime2, x \
+ ROR $64-31, x \
+ MUL prime1, x
+
+#define mergeRound(acc, x) \
+ round0(x) \
+ EOR x, acc \
+ MADD acc, prime4, prime1, acc
+
+// blockLoop processes as many 32-byte blocks as possible,
+// updating v1, v2, v3, and v4. It assumes that n >= 32.
+#define blockLoop() \
+ LSR $5, n, nblocks \
+ PCALIGN $16 \
+ loop: \
+ LDP.P 16(p), (x1, x2) \
+ LDP.P 16(p), (x3, x4) \
+ round(v1, x1) \
+ round(v2, x2) \
+ round(v3, x3) \
+ round(v4, x4) \
+ SUB $1, nblocks \
+ CBNZ nblocks, loop
+
+// func Sum64(b []byte) uint64
+TEXT ·Sum64(SB), NOSPLIT|NOFRAME, $0-32
+ LDP b_base+0(FP), (p, n)
+
+ LDP ·primes+0(SB), (prime1, prime2)
+ LDP ·primes+16(SB), (prime3, prime4)
+ MOVD ·primes+32(SB), prime5
+
+ CMP $32, n
+ CSEL LT, prime5, ZR, h // if n < 32 { h = prime5 } else { h = 0 }
+ BLT afterLoop
+
+ ADD prime1, prime2, v1
+ MOVD prime2, v2
+ MOVD $0, v3
+ NEG prime1, v4
+
+ blockLoop()
+
+ ROR $64-1, v1, x1
+ ROR $64-7, v2, x2
+ ADD x1, x2
+ ROR $64-12, v3, x3
+ ROR $64-18, v4, x4
+ ADD x3, x4
+ ADD x2, x4, h
+
+ mergeRound(h, v1)
+ mergeRound(h, v2)
+ mergeRound(h, v3)
+ mergeRound(h, v4)
+
+afterLoop:
+ ADD n, h
+
+ TBZ $4, n, try8
+ LDP.P 16(p), (x1, x2)
+
+ round0(x1)
+
+ // NOTE: here and below, sequencing the EOR after the ROR (using a
+ // rotated register) is worth a small but measurable speedup for small
+ // inputs.
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+ round0(x2)
+ ROR $64-27, h
+ EOR x2 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try8:
+ TBZ $3, n, try4
+ MOVD.P 8(p), x1
+
+ round0(x1)
+ ROR $64-27, h
+ EOR x1 @> 64-27, h, h
+ MADD h, prime4, prime1, h
+
+try4:
+ TBZ $2, n, try2
+ MOVWU.P 4(p), x2
+
+ MUL prime1, x2
+ ROR $64-23, h
+ EOR x2 @> 64-23, h, h
+ MADD h, prime3, prime2, h
+
+try2:
+ TBZ $1, n, try1
+ MOVHU.P 2(p), x3
+ AND $255, x3, x1
+ LSR $8, x3, x2
+
+ MUL prime5, x1
+ ROR $64-11, h
+ EOR x1 @> 64-11, h, h
+ MUL prime1, h
+
+ MUL prime5, x2
+ ROR $64-11, h
+ EOR x2 @> 64-11, h, h
+ MUL prime1, h
+
+try1:
+ TBZ $0, n, finalize
+ MOVBU (p), x4
+
+ MUL prime5, x4
+ ROR $64-11, h
+ EOR x4 @> 64-11, h, h
+ MUL prime1, h
+
+finalize:
+ EOR h >> 33, h
+ MUL prime2, h
+ EOR h >> 29, h
+ MUL prime3, h
+ EOR h >> 32, h
+
+ MOVD h, ret+24(FP)
+ RET
+
+// func writeBlocks(d *Digest, b []byte) int
+TEXT ·writeBlocks(SB), NOSPLIT|NOFRAME, $0-40
+ LDP ·primes+0(SB), (prime1, prime2)
+
+ // Load state. Assume v[1-4] are stored contiguously.
+ MOVD d+0(FP), digest
+ LDP 0(digest), (v1, v2)
+ LDP 16(digest), (v3, v4)
+
+ LDP b_base+8(FP), (p, n)
+
+ blockLoop()
+
+ // Store updated state.
+ STP (v1, v2), 0(digest)
+ STP (v3, v4), 16(digest)
+
+ BIC $31, n
+ MOVD n, ret+32(FP)
+ RET
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
new file mode 100644
index 0000000000..9216e0a40c
--- /dev/null
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_asm.go
@@ -0,0 +1,15 @@
+//go:build (amd64 || arm64) && !appengine && gc && !purego
+// +build amd64 arm64
+// +build !appengine
+// +build gc
+// +build !purego
+
+package xxhash
+
+// Sum64 computes the 64-bit xxHash digest of b.
+//
+//go:noescape
+func Sum64(b []byte) uint64
+
+//go:noescape
+func writeBlocks(d *Digest, b []byte) int
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
index 4a5a821603..26df13bba4 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_other.go
@@ -1,4 +1,5 @@
-// +build !amd64 appengine !gc purego
+//go:build (!amd64 && !arm64) || appengine || !gc || purego
+// +build !amd64,!arm64 appengine !gc purego
package xxhash
@@ -14,10 +15,10 @@ func Sum64(b []byte) uint64 {
var h uint64
if n >= 32 {
- v1 := prime1v + prime2
+ v1 := primes[0] + prime2
v2 := prime2
v3 := uint64(0)
- v4 := -prime1v
+ v4 := -primes[0]
for len(b) >= 32 {
v1 = round(v1, u64(b[0:8:len(b)]))
v2 = round(v2, u64(b[8:16:len(b)]))
@@ -36,19 +37,18 @@ func Sum64(b []byte) uint64 {
h += uint64(n)
- i, end := 0, len(b)
- for ; i+8 <= end; i += 8 {
- k1 := round(0, u64(b[i:i+8:len(b)]))
+ for ; len(b) >= 8; b = b[8:] {
+ k1 := round(0, u64(b[:8]))
h ^= k1
h = rol27(h)*prime1 + prime4
}
- if i+4 <= end {
- h ^= uint64(u32(b[i:i+4:len(b)])) * prime1
+ if len(b) >= 4 {
+ h ^= uint64(u32(b[:4])) * prime1
h = rol23(h)*prime2 + prime3
- i += 4
+ b = b[4:]
}
- for ; i < end; i++ {
- h ^= uint64(b[i]) * prime5
+ for ; len(b) > 0; b = b[1:] {
+ h ^= uint64(b[0]) * prime5
h = rol11(h) * prime1
}
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
index fc9bea7a31..e86f1b5fd8 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_safe.go
@@ -1,3 +1,4 @@
+//go:build appengine
// +build appengine
// This file contains the safe implementations of otherwise unsafe-using code.
diff --git a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
index 376e0ca2e4..1c1638fd88 100644
--- a/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
+++ b/vendor/github.com/cespare/xxhash/v2/xxhash_unsafe.go
@@ -1,3 +1,4 @@
+//go:build !appengine
// +build !appengine
// This file encapsulates usage of unsafe.
@@ -11,7 +12,7 @@ import (
// In the future it's possible that compiler optimizations will make these
// XxxString functions unnecessary by realizing that calls such as
-// Sum64([]byte(s)) don't need to copy s. See https://golang.org/issue/2205.
+// Sum64([]byte(s)) don't need to copy s. See https://go.dev/issue/2205.
// If that happens, even if we keep these functions they can be replaced with
// the trivial safe code.
diff --git a/vendor/github.com/chai2010/gettext-go/.travis.yml b/vendor/github.com/chai2010/gettext-go/.travis.yml
new file mode 100644
index 0000000000..4eac3982bc
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/.travis.yml
@@ -0,0 +1,5 @@
+language: go
+
+go:
+ - "1.14"
+ - tip
diff --git a/vendor/github.com/chai2010/gettext-go/README.md b/vendor/github.com/chai2010/gettext-go/README.md
new file mode 100644
index 0000000000..9381bd1522
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/README.md
@@ -0,0 +1,191 @@
+- *赞助 BTC: 1Cbd6oGAUUyBi7X7MaR4np4nTmQZXVgkCW*
+- *赞助 ETH: 0x623A3C3a72186A6336C79b18Ac1eD36e1c71A8a6*
+- *Go语言付费QQ群: 1055927514*
+
+----
+
+# gettext-go: GNU gettext for Go ([Imported By Kubernetes](https://pkg.go.dev/github.com/chai2010/gettext-go@v0.1.0/gettext?tab=importedby))
+
+- PkgDoc: [http://godoc.org/github.com/chai2010/gettext-go](http://godoc.org/github.com/chai2010/gettext-go)
+- PkgDoc: [http://pkg.go.dev/github.com/chai2010/gettext-go](http://pkg.go.dev/github.com/chai2010/gettext-go)
+
+## Install
+
+1. `go get github.com/chai2010/gettext-go`
+2. `go run hello.go`
+
+The godoc.org or go.dev has more information.
+
+## Examples
+
+```Go
+package main
+
+import (
+ "fmt"
+
+ "github.com/chai2010/gettext-go"
+)
+
+func main() {
+ gettext := gettext.New("hello", "./examples/locale").SetLanguage("zh_CN")
+ fmt.Println(gettext.Gettext("Hello, world!"))
+
+ // Output: 你好, 世界!
+}
+```
+
+```Go
+package main
+
+import (
+ "fmt"
+
+ "github.com/chai2010/gettext-go"
+)
+
+func main() {
+ gettext.SetLanguage("zh_CN")
+ gettext.BindLocale(gettext.New("hello", "locale"))
+
+ // gettext.BindLocale("hello", "locale") // from locale dir
+ // gettext.BindLocale("hello", "locale.zip") // from locale zip file
+ // gettext.BindLocale("hello", "locale.zip", zipData) // from embedded zip data
+
+ // translate source text
+ fmt.Println(gettext.Gettext("Hello, world!"))
+ // Output: 你好, 世界!
+
+ // if no msgctxt in PO file (only msgid and msgstr),
+ // specify context as "" by
+ fmt.Println(gettext.PGettext("", "Hello, world!"))
+ // Output: 你好, 世界!
+
+ // translate resource
+ fmt.Println(string(gettext.Getdata("poems.txt"))))
+ // Output: ...
+}
+```
+
+Go file: [hello.go](https://github.com/chai2010/gettext-go/blob/master/examples/hello.go); PO file: [hello.po](https://github.com/chai2010/gettext-go/blob/master/examples/locale/default/LC_MESSAGES/hello.po);
+
+----
+
+## API Changes (v0.1.0 vs v1.0.0)
+
+### Renamed package path
+
+| v0.1.0 (old) | v1.0.0 (new) |
+| ----------------------------------------------- | --------------------------------------- |
+| `github.com/chai2010/gettext-go/gettext` | `github.com/chai2010/gettext-go` |
+| `github.com/chai2010/gettext-go/gettext/po` | `github.com/chai2010/gettext-go/po` |
+| `github.com/chai2010/gettext-go/gettext/mo` | `github.com/chai2010/gettext-go/mo` |
+| `github.com/chai2010/gettext-go/gettext/plural` | `github.com/chai2010/gettext-go/plural` |
+
+### Renamed functions
+
+| v0.1.0 (old) | v1.0.0 (new) |
+| ---------------------------------- | --------------------------- |
+| `gettext-go/gettext.*` | `gettext-go.*` |
+| `gettext-go/gettext.DefaultLocal` | `gettext-go.DefaultLanguage`|
+| `gettext-go/gettext.BindTextdomain`| `gettext-go.BindLocale` |
+| `gettext-go/gettext.Textdomain` | `gettext-go.SetDomain` |
+| `gettext-go/gettext.SetLocale` | `gettext-go.SetLanguage` |
+| `gettext-go/gettext/po.Load` | `gettext-go/po.LoadFile` |
+| `gettext-go/gettext/po.LoadData` | `gettext-go/po.Load` |
+| `gettext-go/gettext/mo.Load` | `gettext-go/mo.LoadFile` |
+| `gettext-go/gettext/mo.LoadData` | `gettext-go/mo.Load` |
+
+### Use empty string as the default context for `gettext.Gettext`
+
+```go
+package main
+
+// v0.1.0
+// if the **context** missing, use `callerName(2)` as the context:
+
+// v1.0.0
+// if the **context** missing, use empty string as the context:
+
+func main() {
+ gettext.Gettext("hello")
+ // v0.1.0 => gettext.PGettext("main.main", "hello")
+ // v1.0.0 => gettext.PGettext("", "hello")
+
+ gettext.DGettext("domain", "hello")
+ // v0.1.0 => gettext.DPGettext("domain", "main.main", "hello")
+ // v1.0.0 => gettext.DPGettext("domain", "", "hello")
+
+ gettext.NGettext("domain", "hello", "hello2", n)
+ // v0.1.0 => gettext.PNGettext("domain", "main.main", "hello", "hello2", n)
+ // v1.0.0 => gettext.PNGettext("domain", "", "hello", "hello2", n)
+
+ gettext.DNGettext("domain", "hello", "hello2", n)
+ // v0.1.0 => gettext.DPNGettext("domain", "main.main", "hello", "hello2", n)
+ // v1.0.0 => gettext.DPNGettext("domain", "", "hello", "hello2", n)
+}
+```
+
+### `BindLocale` support `FileSystem` interface
+
+```go
+// Use FileSystem:
+// BindLocale(New("poedit", "name", OS("path/to/dir"))) // bind "poedit" domain
+// BindLocale(New("poedit", "name", OS("path/to.zip"))) // bind "poedit" domain
+```
+
+## New API in v1.0.0
+
+`Gettexter` interface:
+
+```go
+type Gettexter interface {
+ FileSystem() FileSystem
+
+ GetDomain() string
+ SetDomain(domain string) Gettexter
+
+ GetLanguage() string
+ SetLanguage(lang string) Gettexter
+
+ Gettext(msgid string) string
+ PGettext(msgctxt, msgid string) string
+
+ NGettext(msgid, msgidPlural string, n int) string
+ PNGettext(msgctxt, msgid, msgidPlural string, n int) string
+
+ DGettext(domain, msgid string) string
+ DPGettext(domain, msgctxt, msgid string) string
+ DNGettext(domain, msgid, msgidPlural string, n int) string
+ DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string
+
+ Getdata(name string) []byte
+ DGetdata(domain, name string) []byte
+}
+
+func New(domain, path string, data ...interface{}) Gettexter
+```
+
+`FileSystem` interface:
+
+```go
+type FileSystem interface {
+ LocaleList() []string
+ LoadMessagesFile(domain, lang, ext string) ([]byte, error)
+ LoadResourceFile(domain, lang, name string) ([]byte, error)
+ String() string
+}
+
+func NewFS(name string, x interface{}) FileSystem
+func OS(root string) FileSystem
+func ZipFS(r *zip.Reader, name string) FileSystem
+func NilFS(name string) FileSystem
+```
+
+----
+
+## BUGS
+
+Please report bugs to .
+
+Thanks!
diff --git a/vendor/github.com/chai2010/gettext-go/doc.go b/vendor/github.com/chai2010/gettext-go/doc.go
new file mode 100644
index 0000000000..50dfea3305
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/doc.go
@@ -0,0 +1,67 @@
+// Copyright 2013 . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package gettext implements a basic GNU's gettext library.
+
+Example:
+ import (
+ "github.com/chai2010/gettext-go"
+ )
+
+ func main() {
+ gettext.SetLanguage("zh_CN")
+
+ // gettext.BindLocale(gettext.New("hello", "locale")) // from locale dir
+ // gettext.BindLocale(gettext.New("hello", "locale.zip")) // from locale zip file
+ // gettext.BindLocale(gettext.New("hello", "locale.zip", zipData)) // from embedded zip data
+
+ gettext.BindLocale(gettext.New("hello", "locale"))
+
+ // translate source text
+ fmt.Println(gettext.Gettext("Hello, world!"))
+ // Output: 你好, 世界!
+
+ // translate resource
+ fmt.Println(string(gettext.Getdata("poems.txt")))
+ // Output: ...
+ }
+
+Translate directory struct("./examples/locale.zip"):
+
+ Root: "path" or "file.zip/zipBaseName"
+ +-default # locale: $(LC_MESSAGES) or $(LANG) or "default"
+ | +-LC_MESSAGES # just for `gettext.Gettext`
+ | | +-hello.mo # $(Root)/$(lang)/LC_MESSAGES/$(domain).mo
+ | | +-hello.po # $(Root)/$(lang)/LC_MESSAGES/$(domain).po
+ | | \-hello.json # $(Root)/$(lang)/LC_MESSAGES/$(domain).json
+ | |
+ | \-LC_RESOURCE # just for `gettext.Getdata`
+ | +-hello # domain map a dir in resource translate
+ | +-favicon.ico # $(Root)/$(lang)/LC_RESOURCE/$(domain)/$(filename)
+ | \-poems.txt
+ |
+ \-zh_CN # simple chinese translate
+ +-LC_MESSAGES
+ | +-hello.po # try "$(domain).po" first
+ | +-hello.mo # try "$(domain).mo" second
+ | \-hello.json # try "$(domain).json" third
+ |
+ \-LC_RESOURCE
+ +-hello
+ +-favicon.ico # $(lang)/$(domain)/favicon.ico
+ \-poems.txt # $(lang)/$(domain)/poems.txt
+
+See:
+ http://en.wikipedia.org/wiki/Gettext
+ http://www.gnu.org/software/gettext/manual/html_node
+ http://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html
+ http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
+ http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
+ http://www.poedit.net/
+
+Please report bugs to .
+Thanks!
+*/
+package gettext
diff --git a/vendor/github.com/chai2010/gettext-go/fs.go b/vendor/github.com/chai2010/gettext-go/fs.go
new file mode 100644
index 0000000000..4e66fae7c6
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/fs.go
@@ -0,0 +1,84 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "archive/zip"
+ "bytes"
+ "fmt"
+)
+
+type FileSystem interface {
+ LocaleList() []string
+ LoadMessagesFile(domain, lang, ext string) ([]byte, error)
+ LoadResourceFile(domain, lang, name string) ([]byte, error)
+ String() string
+}
+
+func NewFS(name string, x interface{}) FileSystem {
+ if x == nil {
+ if name != "" {
+ return OS(name)
+ }
+ return NilFS(name)
+ }
+
+ switch x := x.(type) {
+ case []byte:
+ if len(x) == 0 {
+ return OS(name)
+ }
+ if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
+ return ZipFS(r, name)
+ }
+ if fs, err := newJson(x, name); err == nil {
+ return fs
+ }
+ case string:
+ if len(x) == 0 {
+ return OS(name)
+ }
+ if r, err := zip.NewReader(bytes.NewReader([]byte(x)), int64(len(x))); err == nil {
+ return ZipFS(r, name)
+ }
+ if fs, err := newJson([]byte(x), name); err == nil {
+ return fs
+ }
+ case FileSystem:
+ return x
+ }
+
+ return NilFS(name)
+}
+
+func OS(root string) FileSystem {
+ return newOsFS(root)
+}
+
+func ZipFS(r *zip.Reader, name string) FileSystem {
+ return newZipFS(r, name)
+}
+
+func NilFS(name string) FileSystem {
+ return &nilFS{name}
+}
+
+type nilFS struct {
+ name string
+}
+
+func (p *nilFS) LocaleList() []string {
+ return nil
+}
+
+func (p *nilFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
+ return nil, fmt.Errorf("not found")
+}
+func (p *nilFS) LoadResourceFile(domain, lang, name string) ([]byte, error) {
+ return nil, fmt.Errorf("not found")
+}
+func (p *nilFS) String() string {
+ return "gettext.nilfs(" + p.name + ")"
+}
diff --git a/vendor/github.com/chai2010/gettext-go/fs_json.go b/vendor/github.com/chai2010/gettext-go/fs_json.go
new file mode 100644
index 0000000000..c7138c9954
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/fs_json.go
@@ -0,0 +1,66 @@
+// Copyright 2020 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "encoding/json"
+ "fmt"
+ "sort"
+)
+
+type jsonFS struct {
+ name string
+ x map[string]struct {
+ LC_MESSAGES map[string][]struct {
+ MsgContext string `json:"msgctxt"` // msgctxt context
+ MsgId string `json:"msgid"` // msgid untranslated-string
+ MsgIdPlural string `json:"msgid_plural"` // msgid_plural untranslated-string-plural
+ MsgStr []string `json:"msgstr"` // msgstr translated-string
+ }
+ LC_RESOURCE map[string]map[string]string
+ }
+}
+
+func isJsonData() bool {
+ return false
+}
+
+func newJson(jsonData []byte, name string) (*jsonFS, error) {
+ p := &jsonFS{name: name}
+ if err := json.Unmarshal(jsonData, &p.x); err != nil {
+ return nil, err
+ }
+
+ return p, nil
+}
+
+func (p *jsonFS) LocaleList() []string {
+ var ss []string
+ for lang := range p.x {
+ ss = append(ss, lang)
+ }
+ sort.Strings(ss)
+ return ss
+}
+
+func (p *jsonFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
+ if v, ok := p.x[lang]; ok {
+ if v, ok := v.LC_MESSAGES[domain+ext]; ok {
+ return json.Marshal(v)
+ }
+ }
+ return nil, fmt.Errorf("not found")
+}
+func (p *jsonFS) LoadResourceFile(domain, lang, name string) ([]byte, error) {
+ if v, ok := p.x[lang]; ok {
+ if v, ok := v.LC_RESOURCE[domain]; ok {
+ return []byte(v[name]), nil
+ }
+ }
+ return nil, fmt.Errorf("not found")
+}
+func (p *jsonFS) String() string {
+ return "gettext.nilfs(" + p.name + ")"
+}
diff --git a/vendor/github.com/chai2010/gettext-go/fs_os.go b/vendor/github.com/chai2010/gettext-go/fs_os.go
new file mode 100644
index 0000000000..80d4f51bac
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/fs_os.go
@@ -0,0 +1,91 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "archive/zip"
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "sort"
+ "strings"
+)
+
+type osFS struct {
+ root string
+}
+
+func newOsFS(root string) FileSystem {
+ // locale zip file
+ if fi, err := os.Stat(root); err == nil && !fi.IsDir() {
+ if strings.HasSuffix(strings.ToLower(root), ".zip") {
+ if x, err := ioutil.ReadFile(root); err == nil {
+ if r, err := zip.NewReader(bytes.NewReader(x), int64(len(x))); err == nil {
+ return ZipFS(r, root)
+ }
+ }
+ }
+ if strings.HasSuffix(strings.ToLower(root), ".json") {
+ if x, err := ioutil.ReadFile(root); err == nil {
+ if fs, err := newJson(x, root); err == nil {
+ return fs
+ }
+ }
+ }
+ }
+
+ // locale dir
+ return &osFS{root: root}
+}
+
+func (p *osFS) LocaleList() []string {
+ list, err := ioutil.ReadDir(p.root)
+ if err != nil {
+ return nil
+ }
+ ssMap := make(map[string]bool)
+ for _, dir := range list {
+ if dir.IsDir() {
+ ssMap[dir.Name()] = true
+ }
+ }
+ var locales = make([]string, 0, len(ssMap))
+ for s := range ssMap {
+ locales = append(locales, s)
+ }
+ sort.Strings(locales)
+ return locales
+}
+
+func (p *osFS) LoadMessagesFile(domain, locale, ext string) ([]byte, error) {
+ trName := p.makeMessagesFileName(domain, locale, ext)
+ rcData, err := ioutil.ReadFile(trName)
+ if err != nil {
+ return nil, err
+ }
+ return rcData, nil
+}
+
+func (p *osFS) LoadResourceFile(domain, locale, name string) ([]byte, error) {
+ rcName := p.makeResourceFileName(domain, locale, name)
+ rcData, err := ioutil.ReadFile(rcName)
+ if err != nil {
+ return nil, err
+ }
+ return rcData, nil
+}
+
+func (p *osFS) String() string {
+ return "gettext.localfs(" + p.root + ")"
+}
+
+func (p *osFS) makeMessagesFileName(domain, lang, ext string) string {
+ return fmt.Sprintf("%s/%s/LC_MESSAGES/%s%s", p.root, lang, domain, ext)
+}
+
+func (p *osFS) makeResourceFileName(domain, lang, name string) string {
+ return fmt.Sprintf("%s/%s/LC_RESOURCE/%s/%s", p.root, lang, domain, name)
+}
diff --git a/vendor/github.com/chai2010/gettext-go/fs_zip.go b/vendor/github.com/chai2010/gettext-go/fs_zip.go
new file mode 100644
index 0000000000..61eb8359da
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/fs_zip.go
@@ -0,0 +1,142 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "archive/zip"
+ "fmt"
+ "io/ioutil"
+ "sort"
+ "strings"
+)
+
+type zipFS struct {
+ root string
+ name string
+ r *zip.Reader
+}
+
+func newZipFS(r *zip.Reader, name string) *zipFS {
+ fs := &zipFS{r: r, name: name}
+ fs.root = fs.zipRoot()
+ return fs
+}
+
+func (p *zipFS) zipName() string {
+ name := p.name
+ if x := strings.LastIndexAny(name, `\/`); x != -1 {
+ name = name[x+1:]
+ }
+ name = strings.TrimSuffix(name, ".zip")
+ return name
+}
+
+func (p *zipFS) zipRoot() string {
+ var somepath string
+ for _, f := range p.r.File {
+ if x := strings.Index(f.Name, "LC_MESSAGES"); x != -1 {
+ somepath = f.Name
+ }
+ if x := strings.Index(f.Name, "LC_RESOURCE"); x != -1 {
+ somepath = f.Name
+ }
+ }
+ if somepath == "" {
+ return p.zipName()
+ }
+
+ ss := strings.Split(somepath, "/")
+ for i, s := range ss {
+ // $(root)/$(lang)/LC_MESSAGES
+ // $(root)/$(lang)/LC_RESOURCE
+ if (s == "LC_MESSAGES" || s == "LC_RESOURCE") && i >= 2 {
+ return strings.Join(ss[:i-1], "/")
+ }
+ }
+
+ return p.zipName()
+}
+
+func (p *zipFS) LocaleList() []string {
+ var locals []string
+ for s := range p.lsZip(p.r) {
+ locals = append(locals, s)
+ }
+ sort.Strings(locals)
+ return locals
+}
+
+func (p *zipFS) LoadMessagesFile(domain, lang, ext string) ([]byte, error) {
+ trName := p.makeMessagesFileName(domain, lang, ext)
+ for _, f := range p.r.File {
+ if f.Name != trName {
+ continue
+ }
+ rc, err := f.Open()
+ if err != nil {
+ return nil, err
+ }
+ rcData, err := ioutil.ReadAll(rc)
+ rc.Close()
+ return rcData, err
+ }
+ return nil, fmt.Errorf("not found")
+}
+
+func (p *zipFS) LoadResourceFile(domain, lang, name string) ([]byte, error) {
+ rcName := p.makeResourceFileName(domain, lang, name)
+ for _, f := range p.r.File {
+ if f.Name != rcName {
+ continue
+ }
+ rc, err := f.Open()
+ if err != nil {
+ return nil, err
+ }
+ rcData, err := ioutil.ReadAll(rc)
+ rc.Close()
+ return rcData, err
+ }
+ return nil, fmt.Errorf("not found")
+}
+
+func (p *zipFS) String() string {
+ return "gettext.zipfs(" + p.name + ")"
+}
+
+func (p *zipFS) makeMessagesFileName(domain, lang, ext string) string {
+ return fmt.Sprintf("%s/%s/LC_MESSAGES/%s%s", p.root, lang, domain, ext)
+}
+
+func (p *zipFS) makeResourceFileName(domain, lang, name string) string {
+ return fmt.Sprintf("%s/%s/LC_RESOURCE/%s/%s", p.root, lang, domain, name)
+}
+
+func (p *zipFS) lsZip(r *zip.Reader) map[string]bool {
+ ssMap := make(map[string]bool)
+ for _, f := range r.File {
+ if x := strings.Index(f.Name, "LC_MESSAGES"); x != -1 {
+ s := strings.TrimRight(f.Name[:x], `\/`)
+ if x = strings.LastIndexAny(s, `\/`); x != -1 {
+ s = s[x+1:]
+ }
+ if s != "" {
+ ssMap[s] = true
+ }
+ continue
+ }
+ if x := strings.Index(f.Name, "LC_RESOURCE"); x != -1 {
+ s := strings.TrimRight(f.Name[:x], `\/`)
+ if x = strings.LastIndexAny(s, `\/`); x != -1 {
+ s = s[x+1:]
+ }
+ if s != "" {
+ ssMap[s] = true
+ }
+ continue
+ }
+ }
+ return ssMap
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext.go b/vendor/github.com/chai2010/gettext-go/gettext.go
new file mode 100644
index 0000000000..7747188ab4
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/gettext.go
@@ -0,0 +1,219 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+var (
+ DefaultLanguage string = getDefaultLanguage() // use $(LC_MESSAGES) or $(LANG) or "default"
+)
+
+type Gettexter interface {
+ FileSystem() FileSystem
+
+ GetDomain() string
+ SetDomain(domain string) Gettexter
+
+ GetLanguage() string
+ SetLanguage(lang string) Gettexter
+
+ Gettext(msgid string) string
+ PGettext(msgctxt, msgid string) string
+
+ NGettext(msgid, msgidPlural string, n int) string
+ PNGettext(msgctxt, msgid, msgidPlural string, n int) string
+
+ DGettext(domain, msgid string) string
+ DPGettext(domain, msgctxt, msgid string) string
+ DNGettext(domain, msgid, msgidPlural string, n int) string
+ DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string
+
+ Getdata(name string) []byte
+ DGetdata(domain, name string) []byte
+}
+
+// New create Interface use default language.
+func New(domain, path string, data ...interface{}) Gettexter {
+ return newLocale(domain, path, data...)
+}
+
+var defaultGettexter struct {
+ lang string
+ domain string
+ Gettexter
+}
+
+func init() {
+ defaultGettexter.lang = getDefaultLanguage()
+ defaultGettexter.domain = "default"
+ defaultGettexter.Gettexter = newLocale("", "")
+}
+
+// BindLocale sets and queries program's domains.
+//
+// Examples:
+// BindLocale(New("poedit", "locale")) // bind "poedit" domain
+//
+// Use zip file:
+// BindLocale(New("poedit", "locale.zip")) // bind "poedit" domain
+// BindLocale(New("poedit", "locale.zip", zipData)) // bind "poedit" domain
+//
+// Use FileSystem:
+// BindLocale(New("poedit", "name", OS("path/to/dir"))) // bind "poedit" domain
+// BindLocale(New("poedit", "name", OS("path/to.zip"))) // bind "poedit" domain
+//
+func BindLocale(g Gettexter) {
+ if g != nil {
+ defaultGettexter.Gettexter = g
+ defaultGettexter.SetLanguage(defaultGettexter.lang)
+ } else {
+ defaultGettexter.Gettexter = newLocale("", "")
+ defaultGettexter.SetLanguage(defaultGettexter.lang)
+ }
+}
+
+// SetLanguage sets and queries the program's current lang.
+//
+// If the lang is not empty string, set the new locale.
+//
+// If the lang is empty string, don't change anything.
+//
+// Returns is the current locale.
+//
+// Examples:
+// SetLanguage("") // get locale: return DefaultLocale
+// SetLanguage("zh_CN") // set locale: return zh_CN
+// SetLanguage("") // get locale: return zh_CN
+func SetLanguage(lang string) string {
+ defaultGettexter.SetLanguage(lang)
+ return defaultGettexter.GetLanguage()
+}
+
+// SetDomain sets and retrieves the current message domain.
+//
+// If the domain is not empty string, set the new domains.
+//
+// If the domain is empty string, don't change anything.
+//
+// Returns is the all used domains.
+//
+// Examples:
+// SetDomain("poedit") // set domain: poedit
+// SetDomain("") // get domain: return poedit
+func SetDomain(domain string) string {
+ defaultGettexter.SetDomain(domain)
+ return defaultGettexter.GetDomain()
+}
+
+// Gettext attempt to translate a text string into the user's native language,
+// by looking up the translation in a message catalog.
+//
+// It use the caller's function name as the msgctxt.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.Gettext("Hello") // msgctxt is ""
+// }
+func Gettext(msgid string) string {
+ return defaultGettexter.Gettext(msgid)
+}
+
+// Getdata attempt to translate a resource file into the user's native language,
+// by looking up the translation in a message catalog.
+//
+// Examples:
+// func Foo() {
+// Textdomain("hello")
+// BindLocale("hello", "locale.zip", nilOrZipData)
+// poems := gettext.Getdata("poems.txt")
+// }
+func Getdata(name string) []byte {
+ return defaultGettexter.Getdata(name)
+}
+
+// NGettext attempt to translate a text string into the user's native language,
+// by looking up the appropriate plural form of the translation in a message
+// catalog.
+//
+// It use the caller's function name as the msgctxt.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.NGettext("%d people", "%d peoples", 2)
+// }
+func NGettext(msgid, msgidPlural string, n int) string {
+ return defaultGettexter.NGettext(msgid, msgidPlural, n)
+}
+
+// PGettext attempt to translate a text string into the user's native language,
+// by looking up the translation in a message catalog.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.PGettext("gettext-go.example", "Hello") // msgctxt is "gettext-go.example"
+// }
+func PGettext(msgctxt, msgid string) string {
+ return defaultGettexter.PGettext(msgctxt, msgid)
+}
+
+// PNGettext attempt to translate a text string into the user's native language,
+// by looking up the appropriate plural form of the translation in a message
+// catalog.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.PNGettext("gettext-go.example", "%d people", "%d peoples", 2)
+// }
+func PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
+ return defaultGettexter.PNGettext(msgctxt, msgid, msgidPlural, n)
+}
+
+// DGettext like Gettext(), but looking up the message in the specified domain.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.DGettext("poedit", "Hello")
+// }
+func DGettext(domain, msgid string) string {
+ return defaultGettexter.DGettext(domain, msgid)
+}
+
+// DNGettext like NGettext(), but looking up the message in the specified domain.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.PNGettext("poedit", "gettext-go.example", "%d people", "%d peoples", 2)
+// }
+func DNGettext(domain, msgid, msgidPlural string, n int) string {
+ return defaultGettexter.DNGettext(domain, msgid, msgidPlural, n)
+}
+
+// DPGettext like PGettext(), but looking up the message in the specified domain.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.DPGettext("poedit", "gettext-go.example", "Hello")
+// }
+func DPGettext(domain, msgctxt, msgid string) string {
+ return defaultGettexter.DPGettext(domain, msgctxt, msgid)
+}
+
+// DPNGettext like PNGettext(), but looking up the message in the specified domain.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.DPNGettext("poedit", "gettext-go.example", "%d people", "%d peoples", 2)
+// }
+func DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
+ return defaultGettexter.DPNGettext(domain, msgctxt, msgid, msgidPlural, n)
+}
+
+// DGetdata like Getdata(), but looking up the resource in the specified domain.
+//
+// Examples:
+// func Foo() {
+// msg := gettext.DGetdata("hello", "poems.txt")
+// }
+func DGetdata(domain, name string) []byte {
+ return defaultGettexter.DGetdata(domain, name)
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/caller.go b/vendor/github.com/chai2010/gettext-go/gettext/caller.go
deleted file mode 100644
index e24aab3756..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/caller.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "regexp"
- "runtime"
-)
-
-var (
- reInit = regexp.MustCompile(`init·\d+$`) // main.init·1
- reClosure = regexp.MustCompile(`func·\d+$`) // main.func·001
-)
-
-// caller types:
-// runtime.goexit
-// runtime.main
-// main.init
-// main.main
-// main.init·1 -> main.init
-// main.func·001 -> main.func
-// code.google.com/p/gettext-go/gettext.TestCallerName
-// ...
-func callerName(skip int) string {
- pc, _, _, ok := runtime.Caller(skip)
- if !ok {
- return ""
- }
- name := runtime.FuncForPC(pc).Name()
- if reInit.MatchString(name) {
- return reInit.ReplaceAllString(name, "init")
- }
- if reClosure.MatchString(name) {
- return reClosure.ReplaceAllString(name, "func")
- }
- return name
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/doc.go b/vendor/github.com/chai2010/gettext-go/gettext/doc.go
deleted file mode 100644
index 422bf2c6d7..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/doc.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2013 . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package gettext implements a basic GNU's gettext library.
-
-Example:
- import (
- "github.com/chai2010/gettext-go/gettext"
- )
-
- func main() {
- gettext.SetLocale("zh_CN")
- gettext.Textdomain("hello")
-
- // gettext.BindTextdomain("hello", "local", nil) // from local dir
- // gettext.BindTextdomain("hello", "local.zip", nil) // from local zip file
- // gettext.BindTextdomain("hello", "local.zip", zipData) // from embedded zip data
-
- gettext.BindTextdomain("hello", "local", nil)
-
- // translate source text
- fmt.Println(gettext.Gettext("Hello, world!"))
- // Output: 你好, 世界!
-
- // translate resource
- fmt.Println(string(gettext.Getdata("poems.txt")))
- // Output: ...
- }
-
-Translate directory struct("../examples/local.zip"):
-
- Root: "path" or "file.zip/zipBaseName"
- +-default # local: $(LC_MESSAGES) or $(LANG) or "default"
- | +-LC_MESSAGES # just for `gettext.Gettext`
- | | +-hello.mo # $(Root)/$(local)/LC_MESSAGES/$(domain).mo
- | | \-hello.po # $(Root)/$(local)/LC_MESSAGES/$(domain).mo
- | |
- | \-LC_RESOURCE # just for `gettext.Getdata`
- | +-hello # domain map a dir in resource translate
- | +-favicon.ico # $(Root)/$(local)/LC_RESOURCE/$(domain)/$(filename)
- | \-poems.txt
- |
- \-zh_CN # simple chinese translate
- +-LC_MESSAGES
- | +-hello.mo # try "$(domain).mo" first
- | \-hello.po # try "$(domain).po" second
- |
- \-LC_RESOURCE
- +-hello
- +-favicon.ico # try "$(local)/$(domain)/file" first
- \-poems.txt # try "default/$(domain)/file" second
-
-See:
- http://en.wikipedia.org/wiki/Gettext
- http://www.gnu.org/software/gettext/manual/html_node
- http://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html
- http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
- http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
- http://www.poedit.net/
-
-Please report bugs to .
-Thanks!
-*/
-package gettext
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/domain.go b/vendor/github.com/chai2010/gettext-go/gettext/domain.go
deleted file mode 100644
index f860b27b6b..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/domain.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "sync"
-)
-
-type domainManager struct {
- mutex sync.Mutex
- locale string
- domain string
- domainMap map[string]*fileSystem
- trTextMap map[string]*translator
-}
-
-func newDomainManager() *domainManager {
- return &domainManager{
- locale: DefaultLocale,
- domainMap: make(map[string]*fileSystem),
- trTextMap: make(map[string]*translator),
- }
-}
-
-func (p *domainManager) makeTrMapKey(domain, locale string) string {
- return domain + "_$$$_" + locale
-}
-
-func (p *domainManager) Bind(domain, path string, data []byte) (domains, paths []string) {
- p.mutex.Lock()
- defer p.mutex.Unlock()
-
- switch {
- case domain != "" && path != "": // bind new domain
- p.bindDomainTranslators(domain, path, data)
- case domain != "" && path == "": // delete domain
- p.deleteDomain(domain)
- }
-
- // return all bind domain
- for k, fs := range p.domainMap {
- domains = append(domains, k)
- paths = append(paths, fs.FsName)
- }
- return
-}
-
-func (p *domainManager) SetLocale(locale string) string {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- if locale != "" {
- p.locale = locale
- }
- return p.locale
-}
-
-func (p *domainManager) SetDomain(domain string) string {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- if domain != "" {
- p.domain = domain
- }
- return p.domain
-}
-
-func (p *domainManager) Getdata(name string) []byte {
- return p.getdata(p.domain, name)
-}
-
-func (p *domainManager) DGetdata(domain, name string) []byte {
- return p.getdata(domain, name)
-}
-
-func (p *domainManager) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- return p.gettext(p.domain, msgctxt, msgid, msgidPlural, n)
-}
-
-func (p *domainManager) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
- p.mutex.Lock()
- defer p.mutex.Unlock()
- return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
-}
-
-func (p *domainManager) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
- if p.locale == "" || p.domain == "" {
- return msgid
- }
- if _, ok := p.domainMap[domain]; !ok {
- return msgid
- }
- if f, ok := p.trTextMap[p.makeTrMapKey(domain, p.locale)]; ok {
- return f.PNGettext(msgctxt, msgid, msgidPlural, n)
- }
- return msgid
-}
-
-func (p *domainManager) getdata(domain, name string) []byte {
- if p.locale == "" || p.domain == "" {
- return nil
- }
- if _, ok := p.domainMap[domain]; !ok {
- return nil
- }
- if fs, ok := p.domainMap[domain]; ok {
- if data, err := fs.LoadResourceFile(domain, p.locale, name); err == nil {
- return data
- }
- if p.locale != "default" {
- if data, err := fs.LoadResourceFile(domain, "default", name); err == nil {
- return data
- }
- }
- }
- return nil
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/domain_helper.go b/vendor/github.com/chai2010/gettext-go/gettext/domain_helper.go
deleted file mode 100644
index 8dce58e655..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/domain_helper.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "fmt"
- "strings"
-)
-
-func (p *domainManager) bindDomainTranslators(domain, path string, data []byte) {
- if _, ok := p.domainMap[domain]; ok {
- p.deleteDomain(domain) // delete old domain
- }
- fs := newFileSystem(path, data)
- for locale, _ := range fs.LocaleMap {
- trMapKey := p.makeTrMapKey(domain, locale)
- if data, err := fs.LoadMessagesFile(domain, locale, ".mo"); err == nil {
- p.trTextMap[trMapKey], _ = newMoTranslator(
- fmt.Sprintf("%s_%s.mo", domain, locale),
- data,
- )
- continue
- }
- if data, err := fs.LoadMessagesFile(domain, locale, ".po"); err == nil {
- p.trTextMap[trMapKey], _ = newPoTranslator(
- fmt.Sprintf("%s_%s.po", domain, locale),
- data,
- )
- continue
- }
- p.trTextMap[p.makeTrMapKey(domain, locale)] = nilTranslator
- }
- p.domainMap[domain] = fs
-}
-
-func (p *domainManager) deleteDomain(domain string) {
- if _, ok := p.domainMap[domain]; !ok {
- return
- }
- // delete all mo files
- trMapKeyPrefix := p.makeTrMapKey(domain, "")
- for k, _ := range p.trTextMap {
- if strings.HasPrefix(k, trMapKeyPrefix) {
- delete(p.trTextMap, k)
- }
- }
- delete(p.domainMap, domain)
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/fs.go b/vendor/github.com/chai2010/gettext-go/gettext/fs.go
deleted file mode 100644
index 1c2e23c1d0..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/fs.go
+++ /dev/null
@@ -1,187 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "archive/zip"
- "bytes"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "strings"
-)
-
-type fileSystem struct {
- FsName string
- FsRoot string
- FsZipData []byte
- LocaleMap map[string]bool
-}
-
-func newFileSystem(path string, data []byte) *fileSystem {
- fs := &fileSystem{
- FsName: path,
- FsZipData: data,
- }
- if err := fs.init(); err != nil {
- log.Printf("gettext-go: invalid domain, err = %v", err)
- }
- return fs
-}
-
-func (p *fileSystem) init() error {
- zipName := func(name string) string {
- if x := strings.LastIndexAny(name, `\/`); x != -1 {
- name = name[x+1:]
- }
- name = strings.TrimSuffix(name, ".zip")
- return name
- }
-
- // zip data
- if len(p.FsZipData) != 0 {
- p.FsRoot = zipName(p.FsName)
- p.LocaleMap = p.lsZip(p.FsZipData)
- return nil
- }
-
- // local dir or zip file
- fi, err := os.Stat(p.FsName)
- if err != nil {
- return err
- }
-
- // local dir
- if fi.IsDir() {
- p.FsRoot = p.FsName
- p.LocaleMap = p.lsDir(p.FsName)
- return nil
- }
-
- // local zip file
- p.FsZipData, err = ioutil.ReadFile(p.FsName)
- if err != nil {
- return err
- }
- p.FsRoot = zipName(p.FsName)
- p.LocaleMap = p.lsZip(p.FsZipData)
- return nil
-}
-
-func (p *fileSystem) LoadMessagesFile(domain, local, ext string) ([]byte, error) {
- if len(p.FsZipData) == 0 {
- trName := p.makeMessagesFileName(domain, local, ext)
- rcData, err := ioutil.ReadFile(trName)
- if err != nil {
- return nil, err
- }
- return rcData, nil
- } else {
- r, err := zip.NewReader(bytes.NewReader(p.FsZipData), int64(len(p.FsZipData)))
- if err != nil {
- return nil, err
- }
-
- trName := p.makeMessagesFileName(domain, local, ext)
- for _, f := range r.File {
- if f.Name != trName {
- continue
- }
- rc, err := f.Open()
- if err != nil {
- return nil, err
- }
- rcData, err := ioutil.ReadAll(rc)
- rc.Close()
- return rcData, err
- }
- return nil, fmt.Errorf("not found")
- }
-}
-
-func (p *fileSystem) LoadResourceFile(domain, local, name string) ([]byte, error) {
- if len(p.FsZipData) == 0 {
- rcName := p.makeResourceFileName(domain, local, name)
- rcData, err := ioutil.ReadFile(rcName)
- if err != nil {
- return nil, err
- }
- return rcData, nil
- } else {
- r, err := zip.NewReader(bytes.NewReader(p.FsZipData), int64(len(p.FsZipData)))
- if err != nil {
- return nil, err
- }
-
- rcName := p.makeResourceFileName(domain, local, name)
- for _, f := range r.File {
- if f.Name != rcName {
- continue
- }
- rc, err := f.Open()
- if err != nil {
- return nil, err
- }
- rcData, err := ioutil.ReadAll(rc)
- rc.Close()
- return rcData, err
- }
- return nil, fmt.Errorf("not found")
- }
-}
-
-func (p *fileSystem) makeMessagesFileName(domain, local, ext string) string {
- return fmt.Sprintf("%s/%s/LC_MESSAGES/%s%s", p.FsRoot, local, domain, ext)
-}
-
-func (p *fileSystem) makeResourceFileName(domain, local, name string) string {
- return fmt.Sprintf("%s/%s/LC_RESOURCE/%s/%s", p.FsRoot, local, domain, name)
-}
-
-func (p *fileSystem) lsZip(data []byte) map[string]bool {
- r, err := zip.NewReader(bytes.NewReader(data), int64(len(data)))
- if err != nil {
- return nil
- }
- ssMap := make(map[string]bool)
- for _, f := range r.File {
- if x := strings.Index(f.Name, "LC_MESSAGES"); x != -1 {
- s := strings.TrimRight(f.Name[:x], `\/`)
- if x = strings.LastIndexAny(s, `\/`); x != -1 {
- s = s[x+1:]
- }
- if s != "" {
- ssMap[s] = true
- }
- continue
- }
- if x := strings.Index(f.Name, "LC_RESOURCE"); x != -1 {
- s := strings.TrimRight(f.Name[:x], `\/`)
- if x = strings.LastIndexAny(s, `\/`); x != -1 {
- s = s[x+1:]
- }
- if s != "" {
- ssMap[s] = true
- }
- continue
- }
- }
- return ssMap
-}
-
-func (p *fileSystem) lsDir(path string) map[string]bool {
- list, err := ioutil.ReadDir(path)
- if err != nil {
- return nil
- }
- ssMap := make(map[string]bool)
- for _, dir := range list {
- if dir.IsDir() {
- ssMap[dir.Name()] = true
- }
- }
- return ssMap
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/gettext.go b/vendor/github.com/chai2010/gettext-go/gettext/gettext.go
deleted file mode 100644
index ca14065b22..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/gettext.go
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-var (
- defaultManager = newDomainManager()
-)
-
-var (
- DefaultLocale = getDefaultLocale() // use $(LC_MESSAGES) or $(LANG) or "default"
-)
-
-// SetLocale sets and queries the program's current locale.
-//
-// If the locale is not empty string, set the new local.
-//
-// If the locale is empty string, don't change anything.
-//
-// Returns is the current locale.
-//
-// Examples:
-// SetLocale("") // get locale: return DefaultLocale
-// SetLocale("zh_CN") // set locale: return zh_CN
-// SetLocale("") // get locale: return zh_CN
-func SetLocale(locale string) string {
- return defaultManager.SetLocale(locale)
-}
-
-// BindTextdomain sets and queries program's domains.
-//
-// If the domain and path are all not empty string, bind the new domain.
-// If the domain already exists, return error.
-//
-// If the domain is not empty string, but the path is the empty string,
-// delete the domain.
-// If the domain don't exists, return error.
-//
-// If the domain and the path are all empty string, don't change anything.
-//
-// Returns is the all bind domains.
-//
-// Examples:
-// BindTextdomain("poedit", "local", nil) // bind "poedit" domain
-// BindTextdomain("", "", nil) // return all domains
-// BindTextdomain("poedit", "", nil) // delete "poedit" domain
-// BindTextdomain("", "", nil) // return all domains
-//
-// Use zip file:
-// BindTextdomain("poedit", "local.zip", nil) // bind "poedit" domain
-// BindTextdomain("poedit", "local.zip", zipData) // bind "poedit" domain
-//
-func BindTextdomain(domain, path string, zipData []byte) (domains, paths []string) {
- return defaultManager.Bind(domain, path, zipData)
-}
-
-// Textdomain sets and retrieves the current message domain.
-//
-// If the domain is not empty string, set the new domains.
-//
-// If the domain is empty string, don't change anything.
-//
-// Returns is the all used domains.
-//
-// Examples:
-// Textdomain("poedit") // set domain: poedit
-// Textdomain("") // get domain: return poedit
-func Textdomain(domain string) string {
- return defaultManager.SetDomain(domain)
-}
-
-// Gettext attempt to translate a text string into the user's native language,
-// by looking up the translation in a message catalog.
-//
-// It use the caller's function name as the msgctxt.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.Gettext("Hello") // msgctxt is "some/package/name.Foo"
-// }
-func Gettext(msgid string) string {
- return PGettext(callerName(2), msgid)
-}
-
-// Getdata attempt to translate a resource file into the user's native language,
-// by looking up the translation in a message catalog.
-//
-// Examples:
-// func Foo() {
-// Textdomain("hello")
-// BindTextdomain("hello", "local.zip", nilOrZipData)
-// poems := gettext.Getdata("poems.txt")
-// }
-func Getdata(name string) []byte {
- return defaultManager.Getdata(name)
-}
-
-// NGettext attempt to translate a text string into the user's native language,
-// by looking up the appropriate plural form of the translation in a message
-// catalog.
-//
-// It use the caller's function name as the msgctxt.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.NGettext("%d people", "%d peoples", 2)
-// }
-func NGettext(msgid, msgidPlural string, n int) string {
- return PNGettext(callerName(2), msgid, msgidPlural, n)
-}
-
-// PGettext attempt to translate a text string into the user's native language,
-// by looking up the translation in a message catalog.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.PGettext("gettext-go.example", "Hello") // msgctxt is "gettext-go.example"
-// }
-func PGettext(msgctxt, msgid string) string {
- return PNGettext(msgctxt, msgid, "", 0)
-}
-
-// PNGettext attempt to translate a text string into the user's native language,
-// by looking up the appropriate plural form of the translation in a message
-// catalog.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.PNGettext("gettext-go.example", "%d people", "%d peoples", 2)
-// }
-func PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
- return defaultManager.PNGettext(msgctxt, msgid, msgidPlural, n)
-}
-
-// DGettext like Gettext(), but looking up the message in the specified domain.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.DGettext("poedit", "Hello")
-// }
-func DGettext(domain, msgid string) string {
- return DPGettext(domain, callerName(2), msgid)
-}
-
-// DNGettext like NGettext(), but looking up the message in the specified domain.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.PNGettext("poedit", "gettext-go.example", "%d people", "%d peoples", 2)
-// }
-func DNGettext(domain, msgid, msgidPlural string, n int) string {
- return DPNGettext(domain, callerName(2), msgid, msgidPlural, n)
-}
-
-// DPGettext like PGettext(), but looking up the message in the specified domain.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.DPGettext("poedit", "gettext-go.example", "Hello")
-// }
-func DPGettext(domain, msgctxt, msgid string) string {
- return DPNGettext(domain, msgctxt, msgid, "", 0)
-}
-
-// DPNGettext like PNGettext(), but looking up the message in the specified domain.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.DPNGettext("poedit", "gettext-go.example", "%d people", "%d peoples", 2)
-// }
-func DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
- return defaultManager.DPNGettext(domain, msgctxt, msgid, msgidPlural, n)
-}
-
-// DGetdata like Getdata(), but looking up the resource in the specified domain.
-//
-// Examples:
-// func Foo() {
-// msg := gettext.DGetdata("hello", "poems.txt")
-// }
-func DGetdata(domain, name string) []byte {
- return defaultManager.DGetdata(domain, name)
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/local.go b/vendor/github.com/chai2010/gettext-go/gettext/local.go
deleted file mode 100644
index 179a392fe2..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/local.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "os"
- "strings"
-)
-
-func getDefaultLocale() string {
- if v := os.Getenv("LC_MESSAGES"); v != "" {
- return simplifiedLocale(v)
- }
- if v := os.Getenv("LANG"); v != "" {
- return simplifiedLocale(v)
- }
- return "default"
-}
-
-func simplifiedLocale(lang string) string {
- // en_US/en_US.UTF-8/zh_CN/zh_TW/el_GR@euro/...
- if idx := strings.Index(lang, ":"); idx != -1 {
- lang = lang[:idx]
- }
- if idx := strings.Index(lang, "@"); idx != -1 {
- lang = lang[:idx]
- }
- if idx := strings.Index(lang, "."); idx != -1 {
- lang = lang[:idx]
- }
- return strings.TrimSpace(lang)
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/doc.go b/vendor/github.com/chai2010/gettext-go/gettext/mo/doc.go
deleted file mode 100644
index 9677680631..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/mo/doc.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package mo provides support for reading and writing GNU MO file.
-
-Examples:
- import (
- "github.com/chai2010/gettext-go/gettext/mo"
- )
-
- func main() {
- moFile, err := mo.Load("test.mo")
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("%v", moFile)
- }
-
-GNU MO file struct:
-
- byte
- +------------------------------------------+
- 0 | magic number = 0x950412de |
- | |
- 4 | file format revision = 0 |
- | |
- 8 | number of strings | == N
- | |
- 12 | offset of table with original strings | == O
- | |
- 16 | offset of table with translation strings | == T
- | |
- 20 | size of hashing table | == S
- | |
- 24 | offset of hashing table | == H
- | |
- . .
- . (possibly more entries later) .
- . .
- | |
- O | length & offset 0th string ----------------.
- O + 8 | length & offset 1st string ------------------.
- ... ... | |
- O + ((N-1)*8)| length & offset (N-1)th string | | |
- | | | |
- T | length & offset 0th translation ---------------.
- T + 8 | length & offset 1st translation -----------------.
- ... ... | | | |
- T + ((N-1)*8)| length & offset (N-1)th translation | | | | |
- | | | | | |
- H | start hash table | | | | |
- ... ... | | | |
- H + S * 4 | end hash table | | | | |
- | | | | | |
- | NUL terminated 0th string <----------------' | | |
- | | | | |
- | NUL terminated 1st string <------------------' | |
- | | | |
- ... ... | |
- | | | |
- | NUL terminated 0th translation <---------------' |
- | | |
- | NUL terminated 1st translation <-----------------'
- | |
- ... ...
- | |
- +------------------------------------------+
-
-The GNU MO file specification is at
-http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html.
-*/
-package mo
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/encoder.go b/vendor/github.com/chai2010/gettext-go/gettext/mo/encoder.go
deleted file mode 100644
index 9b1c240b4f..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/mo/encoder.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mo
-
-import (
- "bytes"
- "encoding/binary"
- "sort"
- "strings"
-)
-
-type moHeader struct {
- MagicNumber uint32
- MajorVersion uint16
- MinorVersion uint16
- MsgIdCount uint32
- MsgIdOffset uint32
- MsgStrOffset uint32
- HashSize uint32
- HashOffset uint32
-}
-
-type moStrPos struct {
- Size uint32 // must keep fields order
- Addr uint32
-}
-
-func encodeFile(f *File) []byte {
- hdr := &moHeader{
- MagicNumber: MoMagicLittleEndian,
- }
- data := encodeData(hdr, f)
- data = append(encodeHeader(hdr), data...)
- return data
-}
-
-// encode data and init moHeader
-func encodeData(hdr *moHeader, f *File) []byte {
- msgList := []Message{f.MimeHeader.toMessage()}
- for _, v := range f.Messages {
- if len(v.MsgId) == 0 {
- continue
- }
- if len(v.MsgStr) == 0 && len(v.MsgStrPlural) == 0 {
- continue
- }
- msgList = append(msgList, v)
- }
- sort.Sort(byMessages(msgList))
-
- var buf bytes.Buffer
- var msgIdPosList = make([]moStrPos, len(msgList))
- var msgStrPosList = make([]moStrPos, len(msgList))
- for i, v := range msgList {
- // write msgid
- msgId := encodeMsgId(v)
- msgIdPosList[i].Addr = uint32(buf.Len() + MoHeaderSize)
- msgIdPosList[i].Size = uint32(len(msgId))
- buf.WriteString(msgId)
- // write msgstr
- msgStr := encodeMsgStr(v)
- msgStrPosList[i].Addr = uint32(buf.Len() + MoHeaderSize)
- msgStrPosList[i].Size = uint32(len(msgStr))
- buf.WriteString(msgStr)
- }
-
- hdr.MsgIdOffset = uint32(buf.Len() + MoHeaderSize)
- binary.Write(&buf, binary.LittleEndian, msgIdPosList)
- hdr.MsgStrOffset = uint32(buf.Len() + MoHeaderSize)
- binary.Write(&buf, binary.LittleEndian, msgStrPosList)
-
- hdr.MsgIdCount = uint32(len(msgList))
- return buf.Bytes()
-}
-
-// must called after encodeData
-func encodeHeader(hdr *moHeader) []byte {
- var buf bytes.Buffer
- binary.Write(&buf, binary.LittleEndian, hdr)
- return buf.Bytes()
-}
-
-func encodeMsgId(v Message) string {
- if v.MsgContext != "" && v.MsgIdPlural != "" {
- return v.MsgContext + EotSeparator + v.MsgId + NulSeparator + v.MsgIdPlural
- }
- if v.MsgContext != "" && v.MsgIdPlural == "" {
- return v.MsgContext + EotSeparator + v.MsgId
- }
- if v.MsgContext == "" && v.MsgIdPlural != "" {
- return v.MsgId + NulSeparator + v.MsgIdPlural
- }
- return v.MsgId
-}
-
-func encodeMsgStr(v Message) string {
- if v.MsgIdPlural != "" {
- return strings.Join(v.MsgStrPlural, NulSeparator)
- }
- return v.MsgStr
-}
-
-type byMessages []Message
-
-func (d byMessages) Len() int {
- return len(d)
-}
-func (d byMessages) Less(i, j int) bool {
- if a, b := d[i].MsgContext, d[j].MsgContext; a != b {
- return a < b
- }
- if a, b := d[i].MsgId, d[j].MsgId; a != b {
- return a < b
- }
- if a, b := d[i].MsgIdPlural, d[j].MsgIdPlural; a != b {
- return a < b
- }
- return false
-}
-func (d byMessages) Swap(i, j int) {
- d[i], d[j] = d[j], d[i]
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/file.go b/vendor/github.com/chai2010/gettext-go/gettext/mo/file.go
deleted file mode 100644
index b49a77b42a..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/mo/file.go
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mo
-
-import (
- "bytes"
- "encoding/binary"
- "fmt"
- "io/ioutil"
- "strings"
-)
-
-const (
- MoHeaderSize = 28
- MoMagicLittleEndian = 0x950412de
- MoMagicBigEndian = 0xde120495
-
- EotSeparator = "\x04" // msgctxt and msgid separator
- NulSeparator = "\x00" // msgid and msgstr separator
-)
-
-// File represents an MO File.
-//
-// See http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
-type File struct {
- MagicNumber uint32
- MajorVersion uint16
- MinorVersion uint16
- MsgIdCount uint32
- MsgIdOffset uint32
- MsgStrOffset uint32
- HashSize uint32
- HashOffset uint32
- MimeHeader Header
- Messages []Message
-}
-
-// Load loads a named mo file.
-func Load(name string) (*File, error) {
- data, err := ioutil.ReadFile(name)
- if err != nil {
- return nil, err
- }
- return LoadData(data)
-}
-
-// LoadData loads mo file format data.
-func LoadData(data []byte) (*File, error) {
- r := bytes.NewReader(data)
-
- var magicNumber uint32
- if err := binary.Read(r, binary.LittleEndian, &magicNumber); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- var bo binary.ByteOrder
- switch magicNumber {
- case MoMagicLittleEndian:
- bo = binary.LittleEndian
- case MoMagicBigEndian:
- bo = binary.BigEndian
- default:
- return nil, fmt.Errorf("gettext: %v", "invalid magic number")
- }
-
- var header struct {
- MajorVersion uint16
- MinorVersion uint16
- MsgIdCount uint32
- MsgIdOffset uint32
- MsgStrOffset uint32
- HashSize uint32
- HashOffset uint32
- }
- if err := binary.Read(r, bo, &header); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- if v := header.MajorVersion; v != 0 && v != 1 {
- return nil, fmt.Errorf("gettext: %v", "invalid version number")
- }
- if v := header.MinorVersion; v != 0 && v != 1 {
- return nil, fmt.Errorf("gettext: %v", "invalid version number")
- }
-
- msgIdStart := make([]uint32, header.MsgIdCount)
- msgIdLen := make([]uint32, header.MsgIdCount)
- if _, err := r.Seek(int64(header.MsgIdOffset), 0); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- for i := 0; i < int(header.MsgIdCount); i++ {
- if err := binary.Read(r, bo, &msgIdLen[i]); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- if err := binary.Read(r, bo, &msgIdStart[i]); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- }
-
- msgStrStart := make([]int32, header.MsgIdCount)
- msgStrLen := make([]int32, header.MsgIdCount)
- if _, err := r.Seek(int64(header.MsgStrOffset), 0); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- for i := 0; i < int(header.MsgIdCount); i++ {
- if err := binary.Read(r, bo, &msgStrLen[i]); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- if err := binary.Read(r, bo, &msgStrStart[i]); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- }
-
- file := &File{
- MagicNumber: magicNumber,
- MajorVersion: header.MajorVersion,
- MinorVersion: header.MinorVersion,
- MsgIdCount: header.MsgIdCount,
- MsgIdOffset: header.MsgIdOffset,
- MsgStrOffset: header.MsgStrOffset,
- HashSize: header.HashSize,
- HashOffset: header.HashOffset,
- }
- for i := 0; i < int(header.MsgIdCount); i++ {
- if _, err := r.Seek(int64(msgIdStart[i]), 0); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- msgIdData := make([]byte, msgIdLen[i])
- if _, err := r.Read(msgIdData); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
-
- if _, err := r.Seek(int64(msgStrStart[i]), 0); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
- msgStrData := make([]byte, msgStrLen[i])
- if _, err := r.Read(msgStrData); err != nil {
- return nil, fmt.Errorf("gettext: %v", err)
- }
-
- if len(msgIdData) == 0 {
- var msg = Message{
- MsgId: string(msgIdData),
- MsgStr: string(msgStrData),
- }
- file.MimeHeader.fromMessage(&msg)
- } else {
- var msg = Message{
- MsgId: string(msgIdData),
- MsgStr: string(msgStrData),
- }
- // Is this a context message?
- if idx := strings.Index(msg.MsgId, EotSeparator); idx != -1 {
- msg.MsgContext, msg.MsgId = msg.MsgId[:idx], msg.MsgId[idx+1:]
- }
- // Is this a plural message?
- if idx := strings.Index(msg.MsgId, NulSeparator); idx != -1 {
- msg.MsgId, msg.MsgIdPlural = msg.MsgId[:idx], msg.MsgId[idx+1:]
- msg.MsgStrPlural = strings.Split(msg.MsgStr, NulSeparator)
- msg.MsgStr = ""
- }
- file.Messages = append(file.Messages, msg)
- }
- }
-
- return file, nil
-}
-
-// Save saves a mo file.
-func (f *File) Save(name string) error {
- return ioutil.WriteFile(name, f.Data(), 0666)
-}
-
-// Save returns a mo file format data.
-func (f *File) Data() []byte {
- return encodeFile(f)
-}
-
-// String returns the po format file string.
-func (f *File) String() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "# version: %d.%d\n", f.MajorVersion, f.MinorVersion)
- fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
- fmt.Fprintf(&buf, "\n")
-
- for k, v := range f.Messages {
- fmt.Fprintf(&buf, `msgid "%v"`+"\n", k)
- fmt.Fprintf(&buf, `msgstr "%s"`+"\n", v.MsgStr)
- fmt.Fprintf(&buf, "\n")
- }
-
- return buf.String()
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/message.go b/vendor/github.com/chai2010/gettext-go/gettext/mo/message.go
deleted file mode 100644
index 91ad79bece..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/mo/message.go
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package mo
-
-import (
- "bytes"
- "fmt"
-)
-
-// A MO file is made up of many entries,
-// each entry holding the relation between an original untranslated string
-// and its corresponding translation.
-//
-// See http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
-type Message struct {
- MsgContext string // msgctxt context
- MsgId string // msgid untranslated-string
- MsgIdPlural string // msgid_plural untranslated-string-plural
- MsgStr string // msgstr translated-string
- MsgStrPlural []string // msgstr[0] translated-string-case-0
-}
-
-// String returns the po format entry string.
-func (p Message) String() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "msgid %s", encodePoString(p.MsgId))
- if p.MsgIdPlural != "" {
- fmt.Fprintf(&buf, "msgid_plural %s", encodePoString(p.MsgIdPlural))
- }
- if p.MsgStr != "" {
- fmt.Fprintf(&buf, "msgstr %s", encodePoString(p.MsgStr))
- }
- for i := 0; i < len(p.MsgStrPlural); i++ {
- fmt.Fprintf(&buf, "msgstr[%d] %s", i, encodePoString(p.MsgStrPlural[i]))
- }
- return buf.String()
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/plural/doc.go b/vendor/github.com/chai2010/gettext-go/gettext/plural/doc.go
deleted file mode 100644
index 5641e2c3e7..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/plural/doc.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package plural provides standard plural formulas.
-
-Examples:
- import (
- "code.google.com/p/gettext-go/gettext/plural"
- )
-
- func main() {
- enFormula := plural.Formula("en_US")
- xxFormula := plural.Formula("zh_CN")
-
- fmt.Printf("%s: %d\n", "en", enFormula(0))
- fmt.Printf("%s: %d\n", "en", enFormula(1))
- fmt.Printf("%s: %d\n", "en", enFormula(2))
- fmt.Printf("%s: %d\n", "??", xxFormula(0))
- fmt.Printf("%s: %d\n", "??", xxFormula(1))
- fmt.Printf("%s: %d\n", "??", xxFormula(2))
- fmt.Printf("%s: %d\n", "??", xxFormula(9))
- // Output:
- // en: 0
- // en: 0
- // en: 1
- // ??: 0
- // ??: 0
- // ??: 1
- // ??: 8
- }
-
-See http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
-*/
-package plural
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/doc.go b/vendor/github.com/chai2010/gettext-go/gettext/po/doc.go
deleted file mode 100644
index 12bac8f2a2..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/po/doc.go
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-/*
-Package po provides support for reading and writing GNU PO file.
-
-Examples:
- import (
- "github.com/chai2010/gettext-go/gettext/po"
- )
-
- func main() {
- poFile, err := po.Load("test.po")
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("%v", poFile)
- }
-
-The GNU PO file specification is at
-http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html.
-*/
-package po
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/file.go b/vendor/github.com/chai2010/gettext-go/gettext/po/file.go
deleted file mode 100644
index a9b7abf949..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/po/file.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package po
-
-import (
- "bytes"
- "fmt"
- "io"
- "io/ioutil"
- "sort"
-)
-
-// File represents an PO File.
-//
-// See http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
-type File struct {
- MimeHeader Header
- Messages []Message
-}
-
-// Load loads a named po file.
-func Load(name string) (*File, error) {
- data, err := ioutil.ReadFile(name)
- if err != nil {
- return nil, err
- }
- return LoadData(data)
-}
-
-// LoadData loads po file format data.
-func LoadData(data []byte) (*File, error) {
- r := newLineReader(string(data))
- var file File
- for {
- var msg Message
- if err := msg.readPoEntry(r); err != nil {
- if err == io.EOF {
- return &file, nil
- }
- return nil, err
- }
- if msg.MsgId == "" {
- file.MimeHeader.parseHeader(&msg)
- continue
- }
- file.Messages = append(file.Messages, msg)
- }
-}
-
-// Save saves a po file.
-func (f *File) Save(name string) error {
- return ioutil.WriteFile(name, []byte(f.String()), 0666)
-}
-
-// Save returns a po file format data.
-func (f *File) Data() []byte {
- // sort the massge as ReferenceFile/ReferenceLine field
- var messages []Message
- messages = append(messages, f.Messages...)
- sort.Sort(byMessages(messages))
-
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
- for i := 0; i < len(messages); i++ {
- fmt.Fprintf(&buf, "%s\n", messages[i].String())
- }
- return buf.Bytes()
-}
-
-// String returns the po format file string.
-func (f *File) String() string {
- return string(f.Data())
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/message.go b/vendor/github.com/chai2010/gettext-go/gettext/po/message.go
deleted file mode 100644
index a2cf2512c7..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/po/message.go
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package po
-
-import (
- "bytes"
- "fmt"
- "io"
- "strconv"
- "strings"
-)
-
-// A PO file is made up of many entries,
-// each entry holding the relation between an original untranslated string
-// and its corresponding translation.
-//
-// See http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
-type Message struct {
- Comment // Coments
- MsgContext string // msgctxt context
- MsgId string // msgid untranslated-string
- MsgIdPlural string // msgid_plural untranslated-string-plural
- MsgStr string // msgstr translated-string
- MsgStrPlural []string // msgstr[0] translated-string-case-0
-}
-
-type byMessages []Message
-
-func (d byMessages) Len() int {
- return len(d)
-}
-func (d byMessages) Less(i, j int) bool {
- if d[i].Comment.less(&d[j].Comment) {
- return true
- }
- if a, b := d[i].MsgContext, d[j].MsgContext; a != b {
- return a < b
- }
- if a, b := d[i].MsgId, d[j].MsgId; a != b {
- return a < b
- }
- if a, b := d[i].MsgIdPlural, d[j].MsgIdPlural; a != b {
- return a < b
- }
- return false
-}
-func (d byMessages) Swap(i, j int) {
- d[i], d[j] = d[j], d[i]
-}
-
-func (p *Message) readPoEntry(r *lineReader) (err error) {
- *p = Message{}
- if err = r.skipBlankLine(); err != nil {
- return
- }
- defer func(oldPos int) {
- newPos := r.currentPos()
- if newPos != oldPos && err == io.EOF {
- err = nil
- }
- }(r.currentPos())
-
- if err = p.Comment.readPoComment(r); err != nil {
- return
- }
- for {
- var s string
- if s, _, err = r.currentLine(); err != nil {
- return
- }
-
- if p.isInvalidLine(s) {
- err = fmt.Errorf("gettext: line %d, %v", r.currentPos(), "invalid line")
- return
- }
- if reComment.MatchString(s) || reBlankLine.MatchString(s) {
- return
- }
-
- if err = p.readMsgContext(r); err != nil {
- return
- }
- if err = p.readMsgId(r); err != nil {
- return
- }
- if err = p.readMsgIdPlural(r); err != nil {
- return
- }
- if err = p.readMsgStrOrPlural(r); err != nil {
- return
- }
- }
-}
-
-func (p *Message) readMsgContext(r *lineReader) (err error) {
- var s string
- if s, _, err = r.currentLine(); err != nil {
- return
- }
- if !reMsgContext.MatchString(s) {
- return
- }
- p.MsgContext, err = p.readString(r)
- return
-}
-
-func (p *Message) readMsgId(r *lineReader) (err error) {
- var s string
- if s, _, err = r.currentLine(); err != nil {
- return
- }
- if !reMsgId.MatchString(s) {
- return
- }
- p.MsgId, err = p.readString(r)
- return
-}
-
-func (p *Message) readMsgIdPlural(r *lineReader) (err error) {
- var s string
- if s, _, err = r.currentLine(); err != nil {
- return
- }
- if !reMsgIdPlural.MatchString(s) {
- return
- }
- p.MsgIdPlural, err = p.readString(r)
- return nil
-}
-
-func (p *Message) readMsgStrOrPlural(r *lineReader) (err error) {
- var s string
- if s, _, err = r.currentLine(); err != nil {
- return
- }
- if !reMsgStr.MatchString(s) && !reMsgStrPlural.MatchString(s) {
- return
- }
- if reMsgStrPlural.MatchString(s) {
- left, right := strings.Index(s, `[`), strings.LastIndex(s, `]`)
- idx, _ := strconv.Atoi(s[left+1 : right])
- s, err = p.readString(r)
- if n := len(p.MsgStrPlural); (idx + 1) > n {
- p.MsgStrPlural = append(p.MsgStrPlural, make([]string, (idx+1)-n)...)
- }
- p.MsgStrPlural[idx] = s
- } else {
- p.MsgStr, err = p.readString(r)
- }
- return nil
-}
-
-func (p *Message) readString(r *lineReader) (msg string, err error) {
- var s string
- if s, _, err = r.readLine(); err != nil {
- return
- }
- msg += decodePoString(s)
- for {
- if s, _, err = r.readLine(); err != nil {
- return
- }
- if !reStringLine.MatchString(s) {
- r.unreadLine()
- break
- }
- msg += decodePoString(s)
- }
- return
-}
-
-// String returns the po format entry string.
-func (p Message) String() string {
- var buf bytes.Buffer
- fmt.Fprintf(&buf, "%s", p.Comment.String())
- fmt.Fprintf(&buf, "msgid %s", encodePoString(p.MsgId))
- if p.MsgIdPlural != "" {
- fmt.Fprintf(&buf, "msgid_plural %s", encodePoString(p.MsgIdPlural))
- }
- if p.MsgStr != "" {
- fmt.Fprintf(&buf, "msgstr %s", encodePoString(p.MsgStr))
- }
- for i := 0; i < len(p.MsgStrPlural); i++ {
- fmt.Fprintf(&buf, "msgstr[%d] %s", i, encodePoString(p.MsgStrPlural[i]))
- }
- return buf.String()
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/util.go b/vendor/github.com/chai2010/gettext-go/gettext/po/util.go
deleted file mode 100644
index 52544832cf..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/po/util.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package po
-
-import (
- "bytes"
- "strings"
-)
-
-func decodePoString(text string) string {
- lines := strings.Split(text, "\n")
- for i := 0; i < len(lines); i++ {
- left := strings.Index(lines[i], `"`)
- right := strings.LastIndex(lines[i], `"`)
- if left < 0 || right < 0 || left == right {
- lines[i] = ""
- continue
- }
- line := lines[i][left+1 : right]
- data := make([]byte, 0, len(line))
- for i := 0; i < len(line); i++ {
- if line[i] != '\\' {
- data = append(data, line[i])
- continue
- }
- if i+1 >= len(line) {
- break
- }
- switch line[i+1] {
- case 'n': // \\n -> \n
- data = append(data, '\n')
- i++
- case 't': // \\t -> \n
- data = append(data, '\t')
- i++
- case '\\': // \\\ -> ?
- data = append(data, '\\')
- i++
- }
- }
- lines[i] = string(data)
- }
- return strings.Join(lines, "")
-}
-
-func encodePoString(text string) string {
- var buf bytes.Buffer
- lines := strings.Split(text, "\n")
- for i := 0; i < len(lines); i++ {
- if lines[i] == "" {
- if i != len(lines)-1 {
- buf.WriteString(`"\n"` + "\n")
- }
- continue
- }
- buf.WriteRune('"')
- for _, r := range lines[i] {
- switch r {
- case '\\':
- buf.WriteString(`\\`)
- case '"':
- buf.WriteString(`\"`)
- case '\n':
- buf.WriteString(`\n`)
- case '\t':
- buf.WriteString(`\t`)
- default:
- buf.WriteRune(r)
- }
- }
- buf.WriteString(`\n"` + "\n")
- }
- return buf.String()
-}
-
-func encodeCommentPoString(text string) string {
- var buf bytes.Buffer
- lines := strings.Split(text, "\n")
- if len(lines) > 1 {
- buf.WriteString(`""` + "\n")
- }
- for i := 0; i < len(lines); i++ {
- if len(lines) > 0 {
- buf.WriteString("#| ")
- }
- buf.WriteRune('"')
- for _, r := range lines[i] {
- switch r {
- case '\\':
- buf.WriteString(`\\`)
- case '"':
- buf.WriteString(`\"`)
- case '\n':
- buf.WriteString(`\n`)
- case '\t':
- buf.WriteString(`\t`)
- default:
- buf.WriteRune(r)
- }
- }
- if i < len(lines)-1 {
- buf.WriteString(`\n"` + "\n")
- } else {
- buf.WriteString(`"`)
- }
- }
- return buf.String()
-}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/tr.go b/vendor/github.com/chai2010/gettext-go/gettext/tr.go
deleted file mode 100644
index fedfbc301d..0000000000
--- a/vendor/github.com/chai2010/gettext-go/gettext/tr.go
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright 2013 ChaiShushan . All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gettext
-
-import (
- "github.com/chai2010/gettext-go/gettext/mo"
- "github.com/chai2010/gettext-go/gettext/plural"
- "github.com/chai2010/gettext-go/gettext/po"
-)
-
-var nilTranslator = &translator{
- MessageMap: make(map[string]mo.Message),
- PluralFormula: plural.Formula("??"),
-}
-
-type translator struct {
- MessageMap map[string]mo.Message
- PluralFormula func(n int) int
-}
-
-func newMoTranslator(name string, data []byte) (*translator, error) {
- var (
- f *mo.File
- err error
- )
- if len(data) != 0 {
- f, err = mo.LoadData(data)
- } else {
- f, err = mo.Load(name)
- }
- if err != nil {
- return nil, err
- }
- var tr = &translator{
- MessageMap: make(map[string]mo.Message),
- }
- for _, v := range f.Messages {
- tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = v
- }
- if lang := f.MimeHeader.Language; lang != "" {
- tr.PluralFormula = plural.Formula(lang)
- } else {
- tr.PluralFormula = plural.Formula("??")
- }
- return tr, nil
-}
-
-func newPoTranslator(name string, data []byte) (*translator, error) {
- var (
- f *po.File
- err error
- )
- if len(data) != 0 {
- f, err = po.LoadData(data)
- } else {
- f, err = po.Load(name)
- }
- if err != nil {
- return nil, err
- }
- var tr = &translator{
- MessageMap: make(map[string]mo.Message),
- }
- for _, v := range f.Messages {
- tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = mo.Message{
- MsgContext: v.MsgContext,
- MsgId: v.MsgId,
- MsgIdPlural: v.MsgIdPlural,
- MsgStr: v.MsgStr,
- MsgStrPlural: v.MsgStrPlural,
- }
- }
- if lang := f.MimeHeader.Language; lang != "" {
- tr.PluralFormula = plural.Formula(lang)
- } else {
- tr.PluralFormula = plural.Formula("??")
- }
- return tr, nil
-}
-
-func (p *translator) PGettext(msgctxt, msgid string) string {
- return p.PNGettext(msgctxt, msgid, "", 0)
-}
-
-func (p *translator) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
- n = p.PluralFormula(n)
- if ss := p.findMsgStrPlural(msgctxt, msgid, msgidPlural); len(ss) != 0 {
- if n >= len(ss) {
- n = len(ss) - 1
- }
- if ss[n] != "" {
- return ss[n]
- }
- }
- if msgidPlural != "" && n > 0 {
- return msgidPlural
- }
- return msgid
-}
-
-func (p *translator) findMsgStrPlural(msgctxt, msgid, msgidPlural string) []string {
- key := p.makeMapKey(msgctxt, msgid)
- if v, ok := p.MessageMap[key]; ok {
- if len(v.MsgIdPlural) != 0 {
- if len(v.MsgStrPlural) != 0 {
- return v.MsgStrPlural
- } else {
- return nil
- }
- } else {
- if len(v.MsgStr) != 0 {
- return []string{v.MsgStr}
- } else {
- return nil
- }
- }
- }
- return nil
-}
-
-func (p *translator) makeMapKey(msgctxt, msgid string) string {
- if msgctxt != "" {
- return msgctxt + mo.EotSeparator + msgid
- }
- return msgid
-}
diff --git a/vendor/github.com/chai2010/gettext-go/locale.go b/vendor/github.com/chai2010/gettext-go/locale.go
new file mode 100644
index 0000000000..e7a2d4b37b
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/locale.go
@@ -0,0 +1,205 @@
+// Copyright 2020 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "fmt"
+ "sync"
+)
+
+type _Locale struct {
+ mutex sync.Mutex
+ fs FileSystem
+ lang string
+ domain string
+ trMap map[string]*translator
+ trCurrent *translator
+}
+
+var _ Gettexter = (*_Locale)(nil)
+
+func newLocale(domain, path string, data ...interface{}) *_Locale {
+ if domain == "" {
+ domain = "default"
+ }
+ p := &_Locale{
+ lang: DefaultLanguage,
+ domain: domain,
+ }
+ if len(data) > 0 {
+ p.fs = NewFS(path, data[0])
+ } else {
+ p.fs = NewFS(path, nil)
+ }
+
+ p.syncTrMap()
+ return p
+}
+
+func (p *_Locale) makeTrMapKey(domain, _Locale string) string {
+ return domain + "_$$$_" + _Locale
+}
+
+func (p *_Locale) FileSystem() FileSystem {
+ return p.fs
+}
+
+func (p *_Locale) GetLanguage() string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+
+ return p.lang
+}
+func (p *_Locale) SetLanguage(lang string) Gettexter {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+
+ if lang == "" {
+ lang = DefaultLanguage
+ }
+ if lang == p.lang {
+ return p
+ }
+
+ p.lang = lang
+ p.syncTrMap()
+ return p
+}
+
+func (p *_Locale) GetDomain() string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.domain
+}
+
+func (p *_Locale) SetDomain(domain string) Gettexter {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+
+ if domain == "" || domain == p.domain {
+ return p
+ }
+
+ p.domain = domain
+ p.syncTrMap()
+ return p
+}
+
+func (p *_Locale) syncTrMap() {
+ p.trMap = make(map[string]*translator)
+ trMapKey := p.makeTrMapKey(p.domain, p.lang)
+
+ if tr, ok := p.trMap[trMapKey]; ok {
+ p.trCurrent = tr
+ return
+ }
+
+ // try load po file
+ if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".po"); err == nil {
+ if tr, err := newPoTranslator(fmt.Sprintf("%s_%s.po", p.domain, p.lang), data); err == nil {
+ p.trMap[trMapKey] = tr
+ p.trCurrent = tr
+ return
+ }
+ }
+
+ // try load mo file
+ if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".mo"); err == nil {
+ if tr, err := newMoTranslator(fmt.Sprintf("%s_%s.mo", p.domain, p.lang), data); err == nil {
+ p.trMap[trMapKey] = tr
+ p.trCurrent = tr
+ return
+ }
+ }
+
+ // try load json file
+ if data, err := p.fs.LoadMessagesFile(p.domain, p.lang, ".json"); err == nil {
+ if tr, err := newJsonTranslator(p.lang, fmt.Sprintf("%s_%s.json", p.domain, p.lang), data); err == nil {
+ p.trMap[trMapKey] = tr
+ p.trCurrent = tr
+ return
+ }
+ }
+
+ // no po/mo file
+ p.trMap[trMapKey] = nilTranslator
+ p.trCurrent = nilTranslator
+ return
+}
+
+func (p *_Locale) Gettext(msgid string) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.trCurrent.PGettext("", msgid)
+}
+
+func (p *_Locale) PGettext(msgctxt, msgid string) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.trCurrent.PGettext(msgctxt, msgid)
+}
+
+func (p *_Locale) NGettext(msgid, msgidPlural string, n int) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.trCurrent.PNGettext("", msgid, msgidPlural, n)
+}
+
+func (p *_Locale) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.trCurrent.PNGettext(msgctxt, msgid, msgidPlural, n)
+}
+
+func (p *_Locale) DGettext(domain, msgid string) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.gettext(domain, "", msgid, "", 0)
+}
+
+func (p *_Locale) DNGettext(domain, msgid, msgidPlural string, n int) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.gettext(domain, "", msgid, msgidPlural, n)
+}
+
+func (p *_Locale) DPGettext(domain, msgctxt, msgid string) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.gettext(domain, msgctxt, msgid, "", 0)
+}
+
+func (p *_Locale) DPNGettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
+ p.mutex.Lock()
+ defer p.mutex.Unlock()
+ return p.gettext(domain, msgctxt, msgid, msgidPlural, n)
+}
+
+func (p *_Locale) Getdata(name string) []byte {
+ return p.getdata(p.domain, name)
+}
+
+func (p *_Locale) DGetdata(domain, name string) []byte {
+ return p.getdata(domain, name)
+}
+
+func (p *_Locale) gettext(domain, msgctxt, msgid, msgidPlural string, n int) string {
+ if f, ok := p.trMap[p.makeTrMapKey(domain, p.lang)]; ok {
+ return f.PNGettext(msgctxt, msgid, msgidPlural, n)
+ }
+ return msgid
+}
+
+func (p *_Locale) getdata(domain, name string) []byte {
+ if data, err := p.fs.LoadResourceFile(domain, p.lang, name); err == nil {
+ return data
+ }
+ if p.lang != "default" {
+ if data, err := p.fs.LoadResourceFile(domain, "default", name); err == nil {
+ return data
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/chai2010/gettext-go/mo/doc.go b/vendor/github.com/chai2010/gettext-go/mo/doc.go
new file mode 100644
index 0000000000..5fefc18930
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/mo/doc.go
@@ -0,0 +1,74 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package mo provides support for reading and writing GNU MO file.
+
+Examples:
+ import (
+ "github.com/chai2010/gettext-go/mo"
+ )
+
+ func main() {
+ moFile, err := mo.LoadFile("test.mo")
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("%v", moFile)
+ }
+
+GNU MO file struct:
+
+ byte
+ +------------------------------------------+
+ 0 | magic number = 0x950412de |
+ | |
+ 4 | file format revision = 0 |
+ | |
+ 8 | number of strings | == N
+ | |
+ 12 | offset of table with original strings | == O
+ | |
+ 16 | offset of table with translation strings | == T
+ | |
+ 20 | size of hashing table | == S
+ | |
+ 24 | offset of hashing table | == H
+ | |
+ . .
+ . (possibly more entries later) .
+ . .
+ | |
+ O | length & offset 0th string ----------------.
+ O + 8 | length & offset 1st string ------------------.
+ ... ... | |
+ O + ((N-1)*8)| length & offset (N-1)th string | | |
+ | | | |
+ T | length & offset 0th translation ---------------.
+ T + 8 | length & offset 1st translation -----------------.
+ ... ... | | | |
+ T + ((N-1)*8)| length & offset (N-1)th translation | | | | |
+ | | | | | |
+ H | start hash table | | | | |
+ ... ... | | | |
+ H + S * 4 | end hash table | | | | |
+ | | | | | |
+ | NUL terminated 0th string <----------------' | | |
+ | | | | |
+ | NUL terminated 1st string <------------------' | |
+ | | | |
+ ... ... | |
+ | | | |
+ | NUL terminated 0th translation <---------------' |
+ | | |
+ | NUL terminated 1st translation <-----------------'
+ | |
+ ... ...
+ | |
+ +------------------------------------------+
+
+The GNU MO file specification is at
+http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html.
+*/
+package mo
diff --git a/vendor/github.com/chai2010/gettext-go/mo/encoder.go b/vendor/github.com/chai2010/gettext-go/mo/encoder.go
new file mode 100644
index 0000000000..f953fd3cb8
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/mo/encoder.go
@@ -0,0 +1,105 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package mo
+
+import (
+ "bytes"
+ "encoding/binary"
+ "sort"
+ "strings"
+)
+
+type moHeader struct {
+ MagicNumber uint32
+ MajorVersion uint16
+ MinorVersion uint16
+ MsgIdCount uint32
+ MsgIdOffset uint32
+ MsgStrOffset uint32
+ HashSize uint32
+ HashOffset uint32
+}
+
+type moStrPos struct {
+ Size uint32 // must keep fields order
+ Addr uint32
+}
+
+func encodeFile(f *File) []byte {
+ hdr := &moHeader{
+ MagicNumber: MoMagicLittleEndian,
+ }
+ data := encodeData(hdr, f)
+ data = append(encodeHeader(hdr), data...)
+ return data
+}
+
+// encode data and init moHeader
+func encodeData(hdr *moHeader, f *File) []byte {
+ msgList := []Message{f.MimeHeader.toMessage()}
+ for _, v := range f.Messages {
+ if len(v.MsgId) == 0 {
+ continue
+ }
+ if len(v.MsgStr) == 0 && len(v.MsgStrPlural) == 0 {
+ continue
+ }
+ msgList = append(msgList, v)
+ }
+ sort.Slice(msgList, func(i, j int) bool {
+ return msgList[i].less(&msgList[j])
+ })
+
+ var buf bytes.Buffer
+ var msgIdPosList = make([]moStrPos, len(msgList))
+ var msgStrPosList = make([]moStrPos, len(msgList))
+ for i, v := range msgList {
+ // write msgid
+ msgId := encodeMsgId(v)
+ msgIdPosList[i].Addr = uint32(buf.Len() + MoHeaderSize)
+ msgIdPosList[i].Size = uint32(len(msgId))
+ buf.WriteString(msgId)
+ // write msgstr
+ msgStr := encodeMsgStr(v)
+ msgStrPosList[i].Addr = uint32(buf.Len() + MoHeaderSize)
+ msgStrPosList[i].Size = uint32(len(msgStr))
+ buf.WriteString(msgStr)
+ }
+
+ hdr.MsgIdOffset = uint32(buf.Len() + MoHeaderSize)
+ binary.Write(&buf, binary.LittleEndian, msgIdPosList)
+ hdr.MsgStrOffset = uint32(buf.Len() + MoHeaderSize)
+ binary.Write(&buf, binary.LittleEndian, msgStrPosList)
+
+ hdr.MsgIdCount = uint32(len(msgList))
+ return buf.Bytes()
+}
+
+// must called after encodeData
+func encodeHeader(hdr *moHeader) []byte {
+ var buf bytes.Buffer
+ binary.Write(&buf, binary.LittleEndian, hdr)
+ return buf.Bytes()
+}
+
+func encodeMsgId(v Message) string {
+ if v.MsgContext != "" && v.MsgIdPlural != "" {
+ return v.MsgContext + EotSeparator + v.MsgId + NulSeparator + v.MsgIdPlural
+ }
+ if v.MsgContext != "" && v.MsgIdPlural == "" {
+ return v.MsgContext + EotSeparator + v.MsgId
+ }
+ if v.MsgContext == "" && v.MsgIdPlural != "" {
+ return v.MsgId + NulSeparator + v.MsgIdPlural
+ }
+ return v.MsgId
+}
+
+func encodeMsgStr(v Message) string {
+ if v.MsgIdPlural != "" {
+ return strings.Join(v.MsgStrPlural, NulSeparator)
+ }
+ return v.MsgStr
+}
diff --git a/vendor/github.com/chai2010/gettext-go/mo/file.go b/vendor/github.com/chai2010/gettext-go/mo/file.go
new file mode 100644
index 0000000000..6f7ed161c1
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/mo/file.go
@@ -0,0 +1,197 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package mo
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "io/ioutil"
+ "strings"
+)
+
+const (
+ MoHeaderSize = 28
+ MoMagicLittleEndian = 0x950412de
+ MoMagicBigEndian = 0xde120495
+
+ EotSeparator = "\x04" // msgctxt and msgid separator
+ NulSeparator = "\x00" // msgid and msgstr separator
+)
+
+// File represents an MO File.
+//
+// See http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
+type File struct {
+ MagicNumber uint32
+ MajorVersion uint16
+ MinorVersion uint16
+ MsgIdCount uint32
+ MsgIdOffset uint32
+ MsgStrOffset uint32
+ HashSize uint32
+ HashOffset uint32
+ MimeHeader Header
+ Messages []Message
+}
+
+// Load loads mo file format data.
+func Load(data []byte) (*File, error) {
+ return loadData(data)
+}
+
+// Load loads a named mo file.
+func LoadFile(path string) (*File, error) {
+ data, err := ioutil.ReadFile(path)
+ if err != nil {
+ return nil, err
+ }
+ return loadData(data)
+}
+
+func loadData(data []byte) (*File, error) {
+ r := bytes.NewReader(data)
+
+ var magicNumber uint32
+ if err := binary.Read(r, binary.LittleEndian, &magicNumber); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ var bo binary.ByteOrder
+ switch magicNumber {
+ case MoMagicLittleEndian:
+ bo = binary.LittleEndian
+ case MoMagicBigEndian:
+ bo = binary.BigEndian
+ default:
+ return nil, fmt.Errorf("gettext: %v", "invalid magic number")
+ }
+
+ var header struct {
+ MajorVersion uint16
+ MinorVersion uint16
+ MsgIdCount uint32
+ MsgIdOffset uint32
+ MsgStrOffset uint32
+ HashSize uint32
+ HashOffset uint32
+ }
+ if err := binary.Read(r, bo, &header); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ if v := header.MajorVersion; v != 0 && v != 1 {
+ return nil, fmt.Errorf("gettext: %v", "invalid version number")
+ }
+ if v := header.MinorVersion; v != 0 && v != 1 {
+ return nil, fmt.Errorf("gettext: %v", "invalid version number")
+ }
+
+ msgIdStart := make([]uint32, header.MsgIdCount)
+ msgIdLen := make([]uint32, header.MsgIdCount)
+ if _, err := r.Seek(int64(header.MsgIdOffset), 0); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ for i := 0; i < int(header.MsgIdCount); i++ {
+ if err := binary.Read(r, bo, &msgIdLen[i]); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ if err := binary.Read(r, bo, &msgIdStart[i]); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ }
+
+ msgStrStart := make([]int32, header.MsgIdCount)
+ msgStrLen := make([]int32, header.MsgIdCount)
+ if _, err := r.Seek(int64(header.MsgStrOffset), 0); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ for i := 0; i < int(header.MsgIdCount); i++ {
+ if err := binary.Read(r, bo, &msgStrLen[i]); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ if err := binary.Read(r, bo, &msgStrStart[i]); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ }
+
+ file := &File{
+ MagicNumber: magicNumber,
+ MajorVersion: header.MajorVersion,
+ MinorVersion: header.MinorVersion,
+ MsgIdCount: header.MsgIdCount,
+ MsgIdOffset: header.MsgIdOffset,
+ MsgStrOffset: header.MsgStrOffset,
+ HashSize: header.HashSize,
+ HashOffset: header.HashOffset,
+ }
+ for i := 0; i < int(header.MsgIdCount); i++ {
+ if _, err := r.Seek(int64(msgIdStart[i]), 0); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ msgIdData := make([]byte, msgIdLen[i])
+ if _, err := r.Read(msgIdData); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+
+ if _, err := r.Seek(int64(msgStrStart[i]), 0); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+ msgStrData := make([]byte, msgStrLen[i])
+ if _, err := r.Read(msgStrData); err != nil {
+ return nil, fmt.Errorf("gettext: %v", err)
+ }
+
+ if len(msgIdData) == 0 {
+ var msg = Message{
+ MsgId: string(msgIdData),
+ MsgStr: string(msgStrData),
+ }
+ file.MimeHeader.fromMessage(&msg)
+ } else {
+ var msg = Message{
+ MsgId: string(msgIdData),
+ MsgStr: string(msgStrData),
+ }
+ // Is this a context message?
+ if idx := strings.Index(msg.MsgId, EotSeparator); idx != -1 {
+ msg.MsgContext, msg.MsgId = msg.MsgId[:idx], msg.MsgId[idx+1:]
+ }
+ // Is this a plural message?
+ if idx := strings.Index(msg.MsgId, NulSeparator); idx != -1 {
+ msg.MsgId, msg.MsgIdPlural = msg.MsgId[:idx], msg.MsgId[idx+1:]
+ msg.MsgStrPlural = strings.Split(msg.MsgStr, NulSeparator)
+ msg.MsgStr = ""
+ }
+ file.Messages = append(file.Messages, msg)
+ }
+ }
+
+ return file, nil
+}
+
+// Save saves a mo file.
+func (f *File) Save(name string) error {
+ return ioutil.WriteFile(name, f.Data(), 0666)
+}
+
+// Save returns a mo file format data.
+func (f *File) Data() []byte {
+ return encodeFile(f)
+}
+
+// String returns the po format file string.
+func (f *File) String() string {
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "# version: %d.%d\n", f.MajorVersion, f.MinorVersion)
+ fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
+ fmt.Fprintf(&buf, "\n")
+
+ for k, v := range f.Messages {
+ fmt.Fprintf(&buf, `msgid "%v"`+"\n", k)
+ fmt.Fprintf(&buf, `msgstr "%s"`+"\n", v.MsgStr)
+ fmt.Fprintf(&buf, "\n")
+ }
+
+ return buf.String()
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/header.go b/vendor/github.com/chai2010/gettext-go/mo/header.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/mo/header.go
rename to vendor/github.com/chai2010/gettext-go/mo/header.go
diff --git a/vendor/github.com/chai2010/gettext-go/mo/message.go b/vendor/github.com/chai2010/gettext-go/mo/message.go
new file mode 100644
index 0000000000..b67bde0b70
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/mo/message.go
@@ -0,0 +1,52 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package mo
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// A MO file is made up of many entries,
+// each entry holding the relation between an original untranslated string
+// and its corresponding translation.
+//
+// See http://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
+type Message struct {
+ MsgContext string // msgctxt context
+ MsgId string // msgid untranslated-string
+ MsgIdPlural string // msgid_plural untranslated-string-plural
+ MsgStr string // msgstr translated-string
+ MsgStrPlural []string // msgstr[0] translated-string-case-0
+}
+
+// String returns the po format entry string.
+func (p Message) String() string {
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "msgid %s", encodePoString(p.MsgId))
+ if p.MsgIdPlural != "" {
+ fmt.Fprintf(&buf, "msgid_plural %s", encodePoString(p.MsgIdPlural))
+ }
+ if p.MsgStr != "" {
+ fmt.Fprintf(&buf, "msgstr %s", encodePoString(p.MsgStr))
+ }
+ for i := 0; i < len(p.MsgStrPlural); i++ {
+ fmt.Fprintf(&buf, "msgstr[%d] %s", i, encodePoString(p.MsgStrPlural[i]))
+ }
+ return buf.String()
+}
+
+func (m_i *Message) less(m_j *Message) bool {
+ if a, b := m_i.MsgContext, m_j.MsgContext; a != b {
+ return a < b
+ }
+ if a, b := m_i.MsgId, m_j.MsgId; a != b {
+ return a < b
+ }
+ if a, b := m_i.MsgIdPlural, m_j.MsgIdPlural; a != b {
+ return a < b
+ }
+ return false
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/mo/util.go b/vendor/github.com/chai2010/gettext-go/mo/util.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/mo/util.go
rename to vendor/github.com/chai2010/gettext-go/mo/util.go
diff --git a/vendor/github.com/chai2010/gettext-go/plural/doc.go b/vendor/github.com/chai2010/gettext-go/plural/doc.go
new file mode 100644
index 0000000000..31cb8fae9f
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/plural/doc.go
@@ -0,0 +1,36 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package plural provides standard plural formulas.
+
+Examples:
+ import (
+ "github.com/chai2010/gettext-go/plural"
+ )
+
+ func main() {
+ enFormula := plural.Formula("en_US")
+ xxFormula := plural.Formula("zh_CN")
+
+ fmt.Printf("%s: %d\n", "en", enFormula(0))
+ fmt.Printf("%s: %d\n", "en", enFormula(1))
+ fmt.Printf("%s: %d\n", "en", enFormula(2))
+ fmt.Printf("%s: %d\n", "??", xxFormula(0))
+ fmt.Printf("%s: %d\n", "??", xxFormula(1))
+ fmt.Printf("%s: %d\n", "??", xxFormula(2))
+ fmt.Printf("%s: %d\n", "??", xxFormula(9))
+ // Output:
+ // en: 0
+ // en: 0
+ // en: 1
+ // ??: 0
+ // ??: 0
+ // ??: 1
+ // ??: 8
+ }
+
+See http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
+*/
+package plural
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/plural/formula.go b/vendor/github.com/chai2010/gettext-go/plural/formula.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/plural/formula.go
rename to vendor/github.com/chai2010/gettext-go/plural/formula.go
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/plural/table.go b/vendor/github.com/chai2010/gettext-go/plural/table.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/plural/table.go
rename to vendor/github.com/chai2010/gettext-go/plural/table.go
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/comment.go b/vendor/github.com/chai2010/gettext-go/po/comment.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/po/comment.go
rename to vendor/github.com/chai2010/gettext-go/po/comment.go
diff --git a/vendor/github.com/chai2010/gettext-go/po/doc.go b/vendor/github.com/chai2010/gettext-go/po/doc.go
new file mode 100644
index 0000000000..6cfa2a24be
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/po/doc.go
@@ -0,0 +1,24 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+/*
+Package po provides support for reading and writing GNU PO file.
+
+Examples:
+ import (
+ "github.com/chai2010/gettext-go/po"
+ )
+
+ func main() {
+ poFile, err := po.LoadFile("test.po")
+ if err != nil {
+ log.Fatal(err)
+ }
+ fmt.Printf("%v", poFile)
+ }
+
+The GNU PO file specification is at
+http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html.
+*/
+package po
diff --git a/vendor/github.com/chai2010/gettext-go/po/file.go b/vendor/github.com/chai2010/gettext-go/po/file.go
new file mode 100644
index 0000000000..4a122eeb8b
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/po/file.go
@@ -0,0 +1,81 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package po
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "sort"
+)
+
+// File represents an PO File.
+//
+// See http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
+type File struct {
+ MimeHeader Header
+ Messages []Message
+}
+
+// Load loads po file format data.
+func Load(data []byte) (*File, error) {
+ return loadData(data)
+}
+
+// LoadFile loads a named po file.
+func LoadFile(path string) (*File, error) {
+ data, err := ioutil.ReadFile(path)
+ if err != nil {
+ return nil, err
+ }
+ return loadData(data)
+}
+
+func loadData(data []byte) (*File, error) {
+ r := newLineReader(string(data))
+ var file File
+ for {
+ var msg Message
+ if err := msg.readPoEntry(r); err != nil {
+ if err == io.EOF {
+ return &file, nil
+ }
+ return nil, err
+ }
+ if msg.MsgId == "" {
+ file.MimeHeader.parseHeader(&msg)
+ continue
+ }
+ file.Messages = append(file.Messages, msg)
+ }
+}
+
+// Save saves a po file.
+func (f *File) Save(name string) error {
+ return ioutil.WriteFile(name, []byte(f.String()), 0666)
+}
+
+// Save returns a po file format data.
+func (f *File) Data() []byte {
+ // sort the massge as ReferenceFile/ReferenceLine field
+ var messages []Message
+ messages = append(messages, f.Messages...)
+ sort.Slice(messages, func(i, j int) bool {
+ return messages[i].less(&messages[j])
+ })
+
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "%s\n", f.MimeHeader.String())
+ for i := 0; i < len(messages); i++ {
+ fmt.Fprintf(&buf, "%s\n", messages[i].String())
+ }
+ return buf.Bytes()
+}
+
+// String returns the po format file string.
+func (f *File) String() string {
+ return string(f.Data())
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/header.go b/vendor/github.com/chai2010/gettext-go/po/header.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/po/header.go
rename to vendor/github.com/chai2010/gettext-go/po/header.go
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/line_reader.go b/vendor/github.com/chai2010/gettext-go/po/line_reader.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/po/line_reader.go
rename to vendor/github.com/chai2010/gettext-go/po/line_reader.go
diff --git a/vendor/github.com/chai2010/gettext-go/po/message.go b/vendor/github.com/chai2010/gettext-go/po/message.go
new file mode 100644
index 0000000000..39936dcc7b
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/po/message.go
@@ -0,0 +1,193 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package po
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+)
+
+// A PO file is made up of many entries,
+// each entry holding the relation between an original untranslated string
+// and its corresponding translation.
+//
+// See http://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
+type Message struct {
+ Comment // Coments
+ MsgContext string // msgctxt context
+ MsgId string // msgid untranslated-string
+ MsgIdPlural string // msgid_plural untranslated-string-plural
+ MsgStr string // msgstr translated-string
+ MsgStrPlural []string // msgstr[0] translated-string-case-0
+}
+
+func (p *Message) less(q *Message) bool {
+ if p.Comment.less(&q.Comment) {
+ return true
+ }
+ if a, b := p.MsgContext, q.MsgContext; a != b {
+ return a < b
+ }
+ if a, b := p.MsgId, q.MsgId; a != b {
+ return a < b
+ }
+ if a, b := p.MsgIdPlural, q.MsgIdPlural; a != b {
+ return a < b
+ }
+ return false
+}
+
+func (p *Message) readPoEntry(r *lineReader) (err error) {
+ *p = Message{}
+ if err = r.skipBlankLine(); err != nil {
+ return
+ }
+ defer func(oldPos int) {
+ newPos := r.currentPos()
+ if newPos != oldPos && err == io.EOF {
+ err = nil
+ }
+ }(r.currentPos())
+
+ if err = p.Comment.readPoComment(r); err != nil {
+ return
+ }
+ for {
+ var s string
+ if s, _, err = r.currentLine(); err != nil {
+ return
+ }
+
+ if p.isInvalidLine(s) {
+ err = fmt.Errorf("gettext: line %d, %v", r.currentPos(), "invalid line")
+ return
+ }
+ if reComment.MatchString(s) || reBlankLine.MatchString(s) {
+ return
+ }
+
+ if err = p.readMsgContext(r); err != nil {
+ return
+ }
+ if err = p.readMsgId(r); err != nil {
+ return
+ }
+ if err = p.readMsgIdPlural(r); err != nil {
+ return
+ }
+ if err = p.readMsgStrOrPlural(r); err != nil {
+ return
+ }
+ }
+}
+
+func (p *Message) readMsgContext(r *lineReader) (err error) {
+ var s string
+ if s, _, err = r.currentLine(); err != nil {
+ return
+ }
+ if !reMsgContext.MatchString(s) {
+ return
+ }
+ p.MsgContext, err = p.readString(r)
+ return
+}
+
+func (p *Message) readMsgId(r *lineReader) (err error) {
+ var s string
+ if s, _, err = r.currentLine(); err != nil {
+ return
+ }
+ if !reMsgId.MatchString(s) {
+ return
+ }
+ p.MsgId, err = p.readString(r)
+ return
+}
+
+func (p *Message) readMsgIdPlural(r *lineReader) (err error) {
+ var s string
+ if s, _, err = r.currentLine(); err != nil {
+ return
+ }
+ if !reMsgIdPlural.MatchString(s) {
+ return
+ }
+ p.MsgIdPlural, err = p.readString(r)
+ return nil
+}
+
+func (p *Message) readMsgStrOrPlural(r *lineReader) (err error) {
+ var s string
+ if s, _, err = r.currentLine(); err != nil {
+ return
+ }
+ if !reMsgStr.MatchString(s) && !reMsgStrPlural.MatchString(s) {
+ return
+ }
+ if reMsgStrPlural.MatchString(s) {
+ left, right := strings.Index(s, `[`), strings.LastIndex(s, `]`)
+ idx, _ := strconv.Atoi(s[left+1 : right])
+ s, err = p.readString(r)
+ if n := len(p.MsgStrPlural); (idx + 1) > n {
+ p.MsgStrPlural = append(p.MsgStrPlural, make([]string, (idx+1)-n)...)
+ }
+ p.MsgStrPlural[idx] = s
+ } else {
+ p.MsgStr, err = p.readString(r)
+ }
+ return nil
+}
+
+func (p *Message) readString(r *lineReader) (msg string, err error) {
+ var s string
+ if s, _, err = r.readLine(); err != nil {
+ return
+ }
+ msg += decodePoString(s)
+ for {
+ if s, _, err = r.readLine(); err != nil {
+ return
+ }
+ if !reStringLine.MatchString(s) {
+ r.unreadLine()
+ break
+ }
+ msg += decodePoString(s)
+ }
+ return
+}
+
+// String returns the po format entry string.
+func (p Message) String() string {
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "%s", p.Comment.String())
+ if p.MsgContext != "" {
+ fmt.Fprintf(&buf, "msgctxt %s", encodePoString(p.MsgContext))
+ }
+ fmt.Fprintf(&buf, "msgid %s", encodePoString(p.MsgId))
+ if p.MsgIdPlural != "" {
+ fmt.Fprintf(&buf, "msgid_plural %s", encodePoString(p.MsgIdPlural))
+ }
+ if len(p.MsgStrPlural) == 0 {
+ if p.MsgStr != "" {
+ fmt.Fprintf(&buf, "msgstr %s", encodePoString(p.MsgStr))
+ } else {
+ fmt.Fprintf(&buf, "msgstr %s", `""`+"\n")
+ }
+ } else {
+ for i := 0; i < len(p.MsgStrPlural); i++ {
+ if p.MsgStrPlural[i] != "" {
+ fmt.Fprintf(&buf, "msgstr[%d] %s", i, encodePoString(p.MsgStrPlural[i]))
+ } else {
+ fmt.Fprintf(&buf, "msgstr[%d] %s", i, `""`+"\n")
+ }
+ }
+ }
+ return buf.String()
+}
diff --git a/vendor/github.com/chai2010/gettext-go/gettext/po/re.go b/vendor/github.com/chai2010/gettext-go/po/re.go
similarity index 100%
rename from vendor/github.com/chai2010/gettext-go/gettext/po/re.go
rename to vendor/github.com/chai2010/gettext-go/po/re.go
diff --git a/vendor/github.com/chai2010/gettext-go/po/util.go b/vendor/github.com/chai2010/gettext-go/po/util.go
new file mode 100644
index 0000000000..d8b3b0e254
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/po/util.go
@@ -0,0 +1,114 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package po
+
+import (
+ "bytes"
+ "strings"
+)
+
+func decodePoString(text string) string {
+ lines := strings.Split(text, "\n")
+ for i := 0; i < len(lines); i++ {
+ left := strings.Index(lines[i], `"`)
+ right := strings.LastIndex(lines[i], `"`)
+ if left < 0 || right < 0 || left == right {
+ lines[i] = ""
+ continue
+ }
+ line := lines[i][left+1 : right]
+ data := make([]byte, 0, len(line))
+ for i := 0; i < len(line); i++ {
+ if line[i] != '\\' {
+ data = append(data, line[i])
+ continue
+ }
+ if i+1 >= len(line) {
+ break
+ }
+ switch line[i+1] {
+ case 'n': // \\n -> \n
+ data = append(data, '\n')
+ i++
+ case 't': // \\t -> \n
+ data = append(data, '\t')
+ i++
+ case '\\': // \\\ -> ?
+ data = append(data, '\\')
+ i++
+ }
+ }
+ lines[i] = string(data)
+ }
+ return strings.Join(lines, "")
+}
+
+func encodePoString(text string) string {
+ var buf bytes.Buffer
+ lines := strings.Split(text, "\n")
+ for i := 0; i < len(lines); i++ {
+ if lines[i] == "" {
+ if i != len(lines)-1 {
+ buf.WriteString(`"\n"` + "\n")
+ }
+ continue
+ }
+ buf.WriteRune('"')
+ for _, r := range lines[i] {
+ switch r {
+ case '\\':
+ buf.WriteString(`\\`)
+ case '"':
+ buf.WriteString(`\"`)
+ case '\n':
+ buf.WriteString(`\n`)
+ case '\t':
+ buf.WriteString(`\t`)
+ default:
+ buf.WriteRune(r)
+ }
+ }
+ if i < len(lines)-1 {
+ buf.WriteString(`\n"` + "\n")
+ } else {
+ buf.WriteString(`"` + "\n")
+ }
+ }
+ return buf.String()
+}
+
+func encodeCommentPoString(text string) string {
+ var buf bytes.Buffer
+ lines := strings.Split(text, "\n")
+ if len(lines) > 1 {
+ buf.WriteString(`""` + "\n")
+ }
+ for i := 0; i < len(lines); i++ {
+ if len(lines) > 0 {
+ buf.WriteString("#| ")
+ }
+ buf.WriteRune('"')
+ for _, r := range lines[i] {
+ switch r {
+ case '\\':
+ buf.WriteString(`\\`)
+ case '"':
+ buf.WriteString(`\"`)
+ case '\n':
+ buf.WriteString(`\n`)
+ case '\t':
+ buf.WriteString(`\t`)
+ default:
+ buf.WriteRune(r)
+ }
+ }
+ if i < len(lines)-1 {
+ buf.WriteString(`\n"` + "\n")
+ } else {
+ buf.WriteString(`"`)
+ }
+ }
+ return buf.String()
+}
diff --git a/vendor/github.com/chai2010/gettext-go/tr.go b/vendor/github.com/chai2010/gettext-go/tr.go
new file mode 100644
index 0000000000..5b9d08f426
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/tr.go
@@ -0,0 +1,175 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "encoding/json"
+
+ "github.com/chai2010/gettext-go/mo"
+ "github.com/chai2010/gettext-go/plural"
+ "github.com/chai2010/gettext-go/po"
+)
+
+var nilTranslator = &translator{
+ MessageMap: make(map[string]mo.Message),
+ PluralFormula: plural.Formula("??"),
+}
+
+type translator struct {
+ MessageMap map[string]mo.Message
+ PluralFormula func(n int) int
+}
+
+func newMoTranslator(name string, data []byte) (*translator, error) {
+ var (
+ f *mo.File
+ err error
+ )
+ if len(data) != 0 {
+ f, err = mo.Load(data)
+ } else {
+ f, err = mo.LoadFile(name)
+ }
+ if err != nil {
+ return nil, err
+ }
+ var tr = &translator{
+ MessageMap: make(map[string]mo.Message),
+ }
+ for _, v := range f.Messages {
+ tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = v
+ }
+ if lang := f.MimeHeader.Language; lang != "" {
+ tr.PluralFormula = plural.Formula(lang)
+ } else {
+ tr.PluralFormula = plural.Formula("??")
+ }
+ return tr, nil
+}
+
+func newPoTranslator(name string, data []byte) (*translator, error) {
+ var (
+ f *po.File
+ err error
+ )
+ if len(data) != 0 {
+ f, err = po.Load(data)
+ } else {
+ f, err = po.LoadFile(name)
+ }
+ if err != nil {
+ return nil, err
+ }
+ var tr = &translator{
+ MessageMap: make(map[string]mo.Message),
+ }
+ for _, v := range f.Messages {
+ tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = mo.Message{
+ MsgContext: v.MsgContext,
+ MsgId: v.MsgId,
+ MsgIdPlural: v.MsgIdPlural,
+ MsgStr: v.MsgStr,
+ MsgStrPlural: v.MsgStrPlural,
+ }
+ }
+ if lang := f.MimeHeader.Language; lang != "" {
+ tr.PluralFormula = plural.Formula(lang)
+ } else {
+ tr.PluralFormula = plural.Formula("??")
+ }
+ return tr, nil
+}
+
+func newJsonTranslator(lang, name string, jsonData []byte) (*translator, error) {
+ var msgList []struct {
+ MsgContext string `json:"msgctxt"` // msgctxt context
+ MsgId string `json:"msgid"` // msgid untranslated-string
+ MsgIdPlural string `json:"msgid_plural"` // msgid_plural untranslated-string-plural
+ MsgStr []string `json:"msgstr"` // msgstr translated-string
+ }
+ if err := json.Unmarshal(jsonData, &msgList); err != nil {
+ return nil, err
+ }
+
+ var tr = &translator{
+ MessageMap: make(map[string]mo.Message),
+ PluralFormula: plural.Formula(lang),
+ }
+
+ for _, v := range msgList {
+ var v_MsgStr string
+ var v_MsgStrPlural = v.MsgStr
+
+ if len(v.MsgStr) != 0 {
+ v_MsgStr = v.MsgStr[0]
+ }
+
+ tr.MessageMap[tr.makeMapKey(v.MsgContext, v.MsgId)] = mo.Message{
+ MsgContext: v.MsgContext,
+ MsgId: v.MsgId,
+ MsgIdPlural: v.MsgIdPlural,
+ MsgStr: v_MsgStr,
+ MsgStrPlural: v_MsgStrPlural,
+ }
+ }
+ return tr, nil
+}
+
+func (p *translator) PGettext(msgctxt, msgid string) string {
+ return p.findMsgStr(msgctxt, msgid)
+}
+
+func (p *translator) PNGettext(msgctxt, msgid, msgidPlural string, n int) string {
+ n = p.PluralFormula(n)
+ if ss := p.findMsgStrPlural(msgctxt, msgid, msgidPlural); len(ss) != 0 {
+ if n >= len(ss) {
+ n = len(ss) - 1
+ }
+ if ss[n] != "" {
+ return ss[n]
+ }
+ }
+ if msgidPlural != "" && n > 0 {
+ return msgidPlural
+ }
+ return msgid
+}
+
+func (p *translator) findMsgStr(msgctxt, msgid string) string {
+ key := p.makeMapKey(msgctxt, msgid)
+ if v, ok := p.MessageMap[key]; ok {
+ if v.MsgStr != "" {
+ return v.MsgStr
+ }
+ }
+ return msgid
+}
+
+func (p *translator) findMsgStrPlural(msgctxt, msgid, msgidPlural string) []string {
+ key := p.makeMapKey(msgctxt, msgid)
+ if v, ok := p.MessageMap[key]; ok {
+ if len(v.MsgIdPlural) != 0 {
+ if len(v.MsgStrPlural) != 0 {
+ return v.MsgStrPlural
+ } else {
+ return nil
+ }
+ } else {
+ if len(v.MsgStr) != 0 {
+ return []string{v.MsgStr}
+ } else {
+ return nil
+ }
+ }
+ }
+ return nil
+}
+
+func (p *translator) makeMapKey(msgctxt, msgid string) string {
+ if msgctxt != "" {
+ return msgctxt + mo.EotSeparator + msgid
+ }
+ return msgid
+}
diff --git a/vendor/github.com/chai2010/gettext-go/util.go b/vendor/github.com/chai2010/gettext-go/util.go
new file mode 100644
index 0000000000..b8269a605c
--- /dev/null
+++ b/vendor/github.com/chai2010/gettext-go/util.go
@@ -0,0 +1,34 @@
+// Copyright 2013 ChaiShushan . All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package gettext
+
+import (
+ "os"
+ "strings"
+)
+
+func getDefaultLanguage() string {
+ if v := os.Getenv("LC_MESSAGES"); v != "" {
+ return simplifiedLanguage(v)
+ }
+ if v := os.Getenv("LANG"); v != "" {
+ return simplifiedLanguage(v)
+ }
+ return "default"
+}
+
+func simplifiedLanguage(lang string) string {
+ // en_US/en_US.UTF-8/zh_CN/zh_TW/el_GR@euro/...
+ if idx := strings.Index(lang, ":"); idx != -1 {
+ lang = lang[:idx]
+ }
+ if idx := strings.Index(lang, "@"); idx != -1 {
+ lang = lang[:idx]
+ }
+ if idx := strings.Index(lang, "."); idx != -1 {
+ lang = lang[:idx]
+ }
+ return strings.TrimSpace(lang)
+}
diff --git a/vendor/github.com/containerd/containerd/archive/tar.go b/vendor/github.com/containerd/containerd/archive/tar.go
index 62341d5e12..44b7949531 100644
--- a/vendor/github.com/containerd/containerd/archive/tar.go
+++ b/vendor/github.com/containerd/containerd/archive/tar.go
@@ -31,6 +31,7 @@ import (
"time"
"github.com/containerd/containerd/log"
+ "github.com/containerd/containerd/pkg/userns"
"github.com/containerd/continuity/fs"
)
@@ -119,6 +120,8 @@ const (
whiteoutOpaqueDir = whiteoutMetaPrefix + ".opq"
paxSchilyXattr = "SCHILY.xattr."
+
+ userXattrPrefix = "user."
)
// Apply applies a tar stream of an OCI style diff tar.
@@ -380,6 +383,10 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header
// Lchown is not supported on Windows.
if runtime.GOOS != "windows" {
if err := os.Lchown(path, hdr.Uid, hdr.Gid); err != nil {
+ err = fmt.Errorf("failed to Lchown %q for UID %d, GID %d: %w", path, hdr.Uid, hdr.Gid, err)
+ if errors.Is(err, syscall.EINVAL) && userns.RunningInUserNS() {
+ err = fmt.Errorf("%w (Hint: try increasing the number of subordinate IDs in /etc/subuid and /etc/subgid)", err)
+ }
return err
}
}
@@ -388,11 +395,19 @@ func createTarFile(ctx context.Context, path, extractDir string, hdr *tar.Header
if strings.HasPrefix(key, paxSchilyXattr) {
key = key[len(paxSchilyXattr):]
if err := setxattr(path, key, value); err != nil {
+ if errors.Is(err, syscall.EPERM) && strings.HasPrefix(key, userXattrPrefix) {
+ // In the user.* namespace, only regular files and directories can have extended attributes.
+ // See https://man7.org/linux/man-pages/man7/xattr.7.html for details.
+ if fi, err := os.Lstat(path); err == nil && (!fi.Mode().IsRegular() && !fi.Mode().IsDir()) {
+ log.G(ctx).WithError(err).Warnf("ignored xattr %s in archive", key)
+ continue
+ }
+ }
if errors.Is(err, syscall.ENOTSUP) {
log.G(ctx).WithError(err).Warnf("ignored xattr %s in archive", key)
continue
}
- return err
+ return fmt.Errorf("failed to setxattr %q for key %q: %w", path, key, err)
}
}
}
diff --git a/vendor/github.com/containerd/containerd/archive/tar_unix.go b/vendor/github.com/containerd/containerd/archive/tar_unix.go
index 2f3a3a392e..854afcf0ad 100644
--- a/vendor/github.com/containerd/containerd/archive/tar_unix.go
+++ b/vendor/github.com/containerd/containerd/archive/tar_unix.go
@@ -63,7 +63,7 @@ func setHeaderForSpecialDevice(hdr *tar.Header, name string, fi os.FileInfo) err
}
// Rdev is int32 on darwin/bsd, int64 on linux/solaris
- rdev := uint64(s.Rdev) // nolint: unconvert
+ rdev := uint64(s.Rdev) //nolint:unconvert
// Currently go does not fill in the major/minors
if s.Mode&syscall.S_IFBLK != 0 ||
diff --git a/vendor/github.com/containerd/containerd/content/helpers.go b/vendor/github.com/containerd/containerd/content/helpers.go
index 3ec1ffce00..723c313917 100644
--- a/vendor/github.com/containerd/containerd/content/helpers.go
+++ b/vendor/github.com/containerd/containerd/content/helpers.go
@@ -26,10 +26,16 @@ import (
"time"
"github.com/containerd/containerd/errdefs"
+ "github.com/containerd/containerd/log"
"github.com/opencontainers/go-digest"
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
)
+// maxResets is the no.of times the Copy() method can tolerate a reset of the body
+const maxResets = 5
+
+var ErrReset = errors.New("writer has been reset")
+
var bufPool = sync.Pool{
New: func() interface{} {
buffer := make([]byte, 1<<20)
@@ -80,7 +86,7 @@ func WriteBlob(ctx context.Context, cs Ingester, ref string, r io.Reader, desc o
return fmt.Errorf("failed to open writer: %w", err)
}
- return nil // all ready present
+ return nil // already present
}
defer cw.Close()
@@ -131,35 +137,63 @@ func OpenWriter(ctx context.Context, cs Ingester, opts ...WriterOpt) (Writer, er
// the size or digest is unknown, these values may be empty.
//
// Copy is buffered, so no need to wrap reader in buffered io.
-func Copy(ctx context.Context, cw Writer, r io.Reader, size int64, expected digest.Digest, opts ...Opt) error {
+func Copy(ctx context.Context, cw Writer, or io.Reader, size int64, expected digest.Digest, opts ...Opt) error {
ws, err := cw.Status()
if err != nil {
return fmt.Errorf("failed to get status: %w", err)
}
-
+ r := or
if ws.Offset > 0 {
- r, err = seekReader(r, ws.Offset, size)
+ r, err = seekReader(or, ws.Offset, size)
if err != nil {
return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err)
}
}
- copied, err := copyWithBuffer(cw, r)
- if err != nil {
- return fmt.Errorf("failed to copy: %w", err)
- }
- if size != 0 && copied < size-ws.Offset {
- // Short writes would return its own error, this indicates a read failure
- return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF)
- }
-
- if err := cw.Commit(ctx, size, expected, opts...); err != nil {
- if !errdefs.IsAlreadyExists(err) {
- return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err)
+ for i := 0; i < maxResets; i++ {
+ if i >= 1 {
+ log.G(ctx).WithField("digest", expected).Debugf("retrying copy due to reset")
+ }
+ copied, err := copyWithBuffer(cw, r)
+ if errors.Is(err, ErrReset) {
+ ws, err := cw.Status()
+ if err != nil {
+ return fmt.Errorf("failed to get status: %w", err)
+ }
+ r, err = seekReader(or, ws.Offset, size)
+ if err != nil {
+ return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err)
+ }
+ continue
+ }
+ if err != nil {
+ return fmt.Errorf("failed to copy: %w", err)
+ }
+ if size != 0 && copied < size-ws.Offset {
+ // Short writes would return its own error, this indicates a read failure
+ return fmt.Errorf("failed to read expected number of bytes: %w", io.ErrUnexpectedEOF)
+ }
+ if err := cw.Commit(ctx, size, expected, opts...); err != nil {
+ if errors.Is(err, ErrReset) {
+ ws, err := cw.Status()
+ if err != nil {
+ return fmt.Errorf("failed to get status: %w", err)
+ }
+ r, err = seekReader(or, ws.Offset, size)
+ if err != nil {
+ return fmt.Errorf("unable to resume write to %v: %w", ws.Ref, err)
+ }
+ continue
+ }
+ if !errdefs.IsAlreadyExists(err) {
+ return fmt.Errorf("failed commit on ref %q: %w", ws.Ref, err)
+ }
}
+ return nil
}
- return nil
+ log.G(ctx).WithField("digest", expected).Errorf("failed to copy after %d retries", maxResets)
+ return fmt.Errorf("failed to copy after %d retries", maxResets)
}
// CopyReaderAt copies to a writer from a given reader at for the given
diff --git a/vendor/github.com/containerd/containerd/content/local/store.go b/vendor/github.com/containerd/containerd/content/local/store.go
index 457bbcd0eb..f41a92d04a 100644
--- a/vendor/github.com/containerd/containerd/content/local/store.go
+++ b/vendor/github.com/containerd/containerd/content/local/store.go
@@ -643,7 +643,6 @@ func (s *store) ingestRoot(ref string) string {
// - root: entire ingest directory
// - ref: name of the starting ref, must be unique
// - data: file where data is written
-//
func (s *store) ingestPaths(ref string) (string, string, string) {
var (
fp = s.ingestRoot(ref)
diff --git a/vendor/github.com/containerd/containerd/filters/filter.go b/vendor/github.com/containerd/containerd/filters/filter.go
index cf09d8d9e4..e13f2625c7 100644
--- a/vendor/github.com/containerd/containerd/filters/filter.go
+++ b/vendor/github.com/containerd/containerd/filters/filter.go
@@ -65,7 +65,6 @@
// ```
// name==foo,labels.bar
// ```
-//
package filters
import (
diff --git a/vendor/github.com/containerd/containerd/filters/parser.go b/vendor/github.com/containerd/containerd/filters/parser.go
index 49182d7b7b..32767909b1 100644
--- a/vendor/github.com/containerd/containerd/filters/parser.go
+++ b/vendor/github.com/containerd/containerd/filters/parser.go
@@ -45,7 +45,6 @@ field := quoted | [A-Za-z] [A-Za-z0-9_]+
operator := "==" | "!=" | "~="
value := quoted | [^\s,]+
quoted :=
-
*/
func Parse(s string) (Filter, error) {
// special case empty to match all
diff --git a/vendor/github.com/containerd/containerd/filters/quote.go b/vendor/github.com/containerd/containerd/filters/quote.go
index b76aab9b4a..5c800ef846 100644
--- a/vendor/github.com/containerd/containerd/filters/quote.go
+++ b/vendor/github.com/containerd/containerd/filters/quote.go
@@ -31,10 +31,10 @@ var errQuoteSyntax = errors.New("quote syntax error")
// or character literal represented by the string s.
// It returns four values:
//
-// 1) value, the decoded Unicode code point or byte value;
-// 2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation;
-// 3) tail, the remainder of the string after the character; and
-// 4) an error that will be nil if the character is syntactically valid.
+// 1. value, the decoded Unicode code point or byte value;
+// 2. multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation;
+// 3. tail, the remainder of the string after the character; and
+// 4. an error that will be nil if the character is syntactically valid.
//
// The second argument, quote, specifies the type of literal being parsed
// and therefore which escaped quote character is permitted.
diff --git a/vendor/github.com/containerd/containerd/leases/lease.go b/vendor/github.com/containerd/containerd/leases/lease.go
index 058d065594..fc0ca3491c 100644
--- a/vendor/github.com/containerd/containerd/leases/lease.go
+++ b/vendor/github.com/containerd/containerd/leases/lease.go
@@ -65,10 +65,15 @@ func SynchronousDelete(ctx context.Context, o *DeleteOptions) error {
return nil
}
-// WithLabels sets labels on a lease
+// WithLabels merges labels on a lease
func WithLabels(labels map[string]string) Opt {
return func(l *Lease) error {
- l.Labels = labels
+ if l.Labels == nil {
+ l.Labels = map[string]string{}
+ }
+ for k, v := range labels {
+ l.Labels[k] = v
+ }
return nil
}
}
diff --git a/vendor/github.com/containerd/containerd/metadata/buckets.go b/vendor/github.com/containerd/containerd/metadata/buckets.go
index d23be84fea..516de1fc7a 100644
--- a/vendor/github.com/containerd/containerd/metadata/buckets.go
+++ b/vendor/github.com/containerd/containerd/metadata/buckets.go
@@ -26,7 +26,7 @@
//
// Generically, we try to do the following:
//
-// //