diff --git a/.gitignore b/.gitignore index 7af245c26..5b2ba4aae 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,3 @@ TODO # Virtual go & fuse .virtualgo .fuse_hidden* - -# Packr generated files -*-packr.go diff --git a/Dockerfile b/Dockerfile index bd95dc250..6d330041d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,12 @@ ############# builder -FROM golang:1.15.8 AS builder +FROM golang:1.16.2 AS builder WORKDIR /go/src/github.com/gardener/gardener-extension-os-gardenlinux COPY . . RUN make install-requirements && make generate && make install ############# gardener-extension-os-gardenlinux -FROM alpine:3.13.2 AS gardener-extension-os-gardenlinux +FROM alpine:3.13.5 AS gardener-extension-os-gardenlinux COPY --from=builder /go/bin/gardener-extension-os-gardenlinux /gardener-extension-os-gardenlinux ENTRYPOINT ["/gardener-extension-os-gardenlinux"] diff --git a/LICENSE.md b/LICENSE.md index 065c1271e..a4bf74414 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -242,11 +242,6 @@ gopkg.in/yaml.v2. Copyright 2011-2016 Canonical Ltd. Apache 2 license (https://github.com/go-yaml/yaml/blob/v2/LICENSE) -Packr. -https://github.com/gobuffalo/packr -Copyright (c) 2016 Mark Bates. -MIT license (https://github.com/gobuffalo/packr/blob/master/LICENSE.txt) - Cobra. https://github.com/spf13/cobra Copyright 2019 Steve Francia. diff --git a/Makefile b/Makefile index 7f6cb9e96..7006839c7 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,6 @@ docker-images: .PHONY: install-requirements install-requirements: - @go install -mod=vendor $(REPO_ROOT)/vendor/github.com/gobuffalo/packr/v2/packr2 @go install -mod=vendor $(REPO_ROOT)/vendor/github.com/onsi/ginkgo/ginkgo @$(REPO_ROOT)/vendor/github.com/gardener/gardener/hack/install-requirements.sh @$(REPO_ROOT)/hack/update-github-templates.sh diff --git a/go.mod b/go.mod index 22181542b..03855846f 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,11 @@ module github.com/gardener/gardener-extension-os-gardenlinux -go 1.15 +go 1.16 require ( github.com/ahmetb/gen-crd-api-reference-docs v0.2.0 - github.com/gardener/gardener v1.19.1 - github.com/gobuffalo/packr v1.30.1 - github.com/gobuffalo/packr/v2 v2.5.1 - github.com/onsi/ginkgo v1.14.1 + github.com/gardener/gardener v1.21.0 + github.com/onsi/ginkgo v1.14.2 github.com/onsi/gomega v1.10.5 github.com/spf13/cobra v1.1.1 k8s.io/api v0.20.2 diff --git a/go.sum b/go.sum index dd37b5c9f..03b5273a7 100644 --- a/go.sum +++ b/go.sum @@ -57,7 +57,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= @@ -72,7 +71,6 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt 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/ahmetb/gen-crd-api-reference-docs v0.1.5 h1:OU+AFpBEhyclrQGx4I6zpCx5WvXiKqvFeeOASOmhKCY= github.com/ahmetb/gen-crd-api-reference-docs v0.1.5/go.mod h1:P/XzJ+c2+khJKNKABcm2biRwk2QAuwbLf8DlXuaL7WM= github.com/ahmetb/gen-crd-api-reference-docs v0.2.0 h1:YI/cAcRdNAHArfhGKcmCY5qMa32k/UyCZagLgabC5JY= github.com/ahmetb/gen-crd-api-reference-docs v0.2.0/go.mod h1:P/XzJ+c2+khJKNKABcm2biRwk2QAuwbLf8DlXuaL7WM= @@ -94,6 +92,7 @@ github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.13.54/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k= github.com/aws/aws-sdk-go v1.19.41/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/b4b4r07/go-pipe v0.0.0-20191010045404-84b446f57366/go.mod h1:1ymsiQNa3qebVEEVtuIdhtAXRfjO4qFCFq1bBUOT2HE= github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= 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= @@ -151,7 +150,6 @@ github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= 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/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -159,7 +157,6 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484 h1:pEtiCjIXx3RvGjlUJuCNxNOw0MNblyR9Wi+vJGBFh+8= github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= 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= @@ -173,7 +170,6 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -181,25 +177,20 @@ github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.5.0 h1:Tb4jWdSpdjKzTUicPnY61PZxKbDoGa7ABbrReT3gQVY= github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gardener/controller-manager-library v0.1.1-0.20191212112146-917449ad760c h1:h0tTz/YMor/aRLztJ7gJtPwgXpVD+tF/cIvr2/rtPC4= +github.com/gardener/component-spec/bindings-go v0.0.32/go.mod h1:53EIwICsuMgbY/MFCv5/lbOR5e1MQe1HY674Io+nGYE= +github.com/gardener/component-spec/bindings-go v0.0.33/go.mod h1:53EIwICsuMgbY/MFCv5/lbOR5e1MQe1HY674Io+nGYE= github.com/gardener/controller-manager-library v0.1.1-0.20191212112146-917449ad760c/go.mod h1:v6cbldxmpL2fYBEB2lSnq3LSEPwIHus9En6iIhwNE1k= -github.com/gardener/controller-manager-library v0.1.1-0.20200204110458-c263b9bb97ad h1:fX6pN0Xv+1A+2xYmFvG7Qd7W+3bLfd98sRl1TZoRNes= github.com/gardener/controller-manager-library v0.1.1-0.20200204110458-c263b9bb97ad/go.mod h1:v6cbldxmpL2fYBEB2lSnq3LSEPwIHus9En6iIhwNE1k= github.com/gardener/controller-manager-library v0.2.1-0.20200810091329-d980dbe10959/go.mod h1:XMp1tPcX3SP/dMd+3id418f5Cqu44vydeTkBRbW8EvQ= -github.com/gardener/etcd-druid v0.1.12 h1:tNYlN4tW0/TPVzNQBuB1+kWoVEORrvvR5wcCxFCCvNE= github.com/gardener/etcd-druid v0.1.12/go.mod h1:yZrUQY9clD8/ZXK+MmEq8OS1TaKJeipV0u4kHHrwWeY= github.com/gardener/etcd-druid v0.1.15/go.mod h1:BHXG8N04Dl4On7Ie6cErwmpvzncNrmeb+HO7Sqrhf+A= github.com/gardener/etcd-druid v0.3.0 h1:rqOR8UPKT9tywPYowEaVAhSfYgz165whJORsijz9Tps= github.com/gardener/etcd-druid v0.3.0/go.mod h1:uxZjZ57gIgpX554vGp495g2i8DByoS3OkVtiqsxtbwk= -github.com/gardener/external-dns-management v0.7.3 h1:SAW9ur2mjZ+x89xbmcplJgqNUmFGYIZLI2E+PaBhhG0= github.com/gardener/external-dns-management v0.7.3/go.mod h1:Y3om11E865x4aQ7cmcHjknb8RMgCO153huRb/SvP+9o= -github.com/gardener/external-dns-management v0.7.7 h1:J0CEkjPqGCvDtHxOCDLAvTa/1I/6GPjjavb6028lMOY= github.com/gardener/external-dns-management v0.7.7/go.mod h1:egCe/FPOsUbXA4WV0ne3h7nAD/nLT09hNt/FQQXK+ec= github.com/gardener/external-dns-management v0.7.18 h1:15uIyFfZSbR8fivnXvqb1Dvv4QqzfNYxEFUQ9K+mpsE= github.com/gardener/external-dns-management v0.7.18/go.mod h1:oHhauLQ3/sop0c1urS6n304Wqv/WM4me0geLn9nTAcY= @@ -207,20 +198,17 @@ github.com/gardener/gardener v1.1.2/go.mod h1:CP9I0tCDVXTLPkJv/jUtXVUh948kSNKEGU github.com/gardener/gardener v1.3.1/go.mod h1:936P5tQbg6ViiW8BVC9ELM95sFrk4DgobKrxMNtn/LU= github.com/gardener/gardener v1.4.1-0.20200519155656-a8ccc6cc779a/go.mod h1:t9oESM37bAMIuezi9I0H0I8+++8jy8BUPitcf4ERRXY= github.com/gardener/gardener v1.11.3/go.mod h1:5DzqfOm+G8UftKu5zUbYJ+9Cnfd4XrvRNDabkM9AIp4= -github.com/gardener/gardener v1.19.1 h1:9OaB7DZiXtz9F/8RAqc7m7G12iLeByZNob8XjE4h4BQ= -github.com/gardener/gardener v1.19.1/go.mod h1:Y92sGlFnM3XS+sxEcsJydNVsBZPCUSfqq/HY0UIXQgA= -github.com/gardener/gardener-resource-manager v0.10.0 h1:6OUKoWI3oha42F0oJN8OEo3UR+D3onOCel4Th+zgotU= +github.com/gardener/gardener v1.21.0 h1:+jX9SEPnVmDheWlhJsmQrgUgQ1Y39Xmtmktw7heWKi4= +github.com/gardener/gardener v1.21.0/go.mod h1:H/Y5heDyef3WfsVTvkhiFe0sgqYFsM1ot4zy8NX/cas= github.com/gardener/gardener-resource-manager v0.10.0/go.mod h1:0pKTHOhvU91eQB0EYr/6Ymd7lXc/5Hi8P8tF/gpV0VQ= -github.com/gardener/gardener-resource-manager v0.13.1 h1:BiQ0EMO58663UN7lkOXRKV4gt5bEBIk80nxxokAboxc= github.com/gardener/gardener-resource-manager v0.13.1/go.mod h1:0No/XttYRUwDn5lSppq9EqlKdo/XJQ44aCZz5BVu3Vw= github.com/gardener/gardener-resource-manager v0.18.0 h1:bNB0yKhSqe8DnsvIp3xZr9nsFB4fm+AUAqj1EoIvWU8= github.com/gardener/gardener-resource-manager v0.18.0/go.mod h1:k53Yw2iDAIpTxnChQY9qFHrRtuPQWJDNnCP9eE6TnWQ= -github.com/gardener/hvpa-controller v0.0.0-20191014062307-fad3bdf06a25 h1:nOFITmV7vt4fcYPEXgj66Qs83FdDEMvL/LQcR0diRRE= github.com/gardener/hvpa-controller v0.0.0-20191014062307-fad3bdf06a25/go.mod h1:yj7YJ6ijo4adcpXQKutPFZfQuKLdM5UMZZUlpbM3vig= -github.com/gardener/hvpa-controller v0.2.5 h1:emP1t6hHdFcnvqv698MdBcXz/1JOLZGiAaRHQDSyZBM= github.com/gardener/hvpa-controller v0.2.5/go.mod h1:rjsb3BPKJFMluudZ8/bhCCDQfFCF/0Um+rzXQI/MmfI= github.com/gardener/hvpa-controller v0.3.1 h1:VsOdcKZMcZDlUNVbFY8oqlKrb1GSCdmzPooKT/Tyi+Y= github.com/gardener/hvpa-controller v0.3.1/go.mod h1:rjsb3BPKJFMluudZ8/bhCCDQfFCF/0Um+rzXQI/MmfI= +github.com/gardener/landscaper/apis v0.7.0/go.mod h1:++MW27PlSnbWM4AJipikw62RSprxO5TKVxZ8nh0e4Yw= github.com/gardener/machine-controller-manager v0.27.0/go.mod h1:zlIxuLQMtRO+aXOFsG6qtYkBmggbWY82K7MSO051ARU= github.com/gardener/machine-controller-manager v0.33.0/go.mod h1:jxxE+mGgXwg4iPlCHTG4GtUfK2CcHA6yYoIIowoxOZU= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -234,57 +222,45 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-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-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= 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 h1:q4c+kbcR0d5rSurhBR8dIgieOaYpXtsdTYfx22Cu6rs= github.com/go-logr/logr v0.3.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.1.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-logr/zapr v0.1.1 h1:qXBXPDdNncunGs7XeEpsJt8wCjYBygluzfdLO0G5baE= github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= github.com/go-logr/zapr v0.2.0 h1:v6Ji8yBW77pva6NkJKQdHLAJKrIJKRHz0RXwPqCHSR4= github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2 h1:A9+F4Dc/MCNB5jibxf6rRvOvR/iFgQdyNx9eIhnGqq0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2 h1:o20suLFB4Ri0tuzpWtyHlh7E7HnkqTNLq6aR6WVNS1w= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= 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.2 h1:SStNd1jRcYtfKCN7R0laGNs80WYYvn5CbBjM2sOmCrE= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3 h1:0XRyw8kguri6Yw4SxhsQA/atC88yqrk0+G4YhI2wabc= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2 h1:jvO6bCMBEilGwMfHhrd61zIID4oIFdwb76V17SM88dE= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/flect v0.1.5/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= github.com/gobuffalo/flect v0.2.0 h1:EWCvMGGxOjsgwlWaP+f4+Hh6yrrte7JeFL2S6b+0hdM= github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80= -github.com/gobuffalo/logger v1.0.0 h1:xw9Ko9EcC5iAFprrjJ6oZco9UpzS5MQ4jAwghsLHdy4= github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg= github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk= -github.com/gobuffalo/packr/v2 v2.5.1 h1:TFOeY2VoGamPjQLiNDT3mn//ytzk236VMO2j7iHxJR4= github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= 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/godbus/dbus/v5 v5.0.3/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.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= 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 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= @@ -295,21 +271,16 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4-0.20200731163441-8734ec565a4d h1:izNDUPqGqkeNSYeebPs9caowE15dhr4m59/68323beM= github.com/golang/mock v1.4.4-0.20200731163441-8734ec565a4d/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= @@ -317,7 +288,6 @@ github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+ github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= @@ -328,26 +298,21 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/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.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= -github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= 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= @@ -359,7 +324,6 @@ 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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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= @@ -368,7 +332,6 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.2.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= @@ -400,8 +363,9 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv 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 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-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= @@ -411,7 +375,6 @@ github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 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.3 h1:YPkqC67at8FYaadspW/6uE0COsBxS2656RLEr8Bppgk= github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -420,21 +383,17 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO 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 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= -github.com/huandu/xstrings v1.3.0 h1:gvV6jG9dTgFEncxo+AF7PH6MZXi/vZl25owA/8Dg8Wo= github.com/huandu/xstrings v1.3.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs= 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/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI= github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -444,15 +403,14 @@ github.com/infobloxopen/infoblox-go-client v1.1.0/go.mod h1:BXiw7S2b9qJoM8MS40vf github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/joncalhoun/pipe v0.0.0-20170510025636-72505674a733/go.mod h1:2MNFZhLx2HMHTN4xKH6FhpoQWqmD8Ato8QOE2hp5hY4= github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -461,21 +419,17 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X 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/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= 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 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= 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 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -486,12 +440,12 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63 h1:nTT4s92Dgz2HlrB2NaMgvlfqHH39OgMhA7z3PK7PGD4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0 h1:aizVhC/NAAcKWb+5QsU1iNOZb4Yws5UO2I+aIprQITM= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mandelsoft/filepath v0.0.0-20200909114706-3df73d378d55/go.mod h1:n4xEiUD2HNHnn2w5ZKF0qgjDecHVCWAl5DxZ7+pcFU8= +github.com/mandelsoft/vfs v0.0.0-20201002134249-3c471f64a4d1/go.mod h1:74aV7kulg9C434HiI3zNALN79QHc9IZMN+SI4UdLn14= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -503,11 +457,9 @@ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHX github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 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/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mholt/archiver v3.1.1+incompatible h1:1dCVxuqs0dJseYEhi5pl7MYPH9zDa1wBi7mF09cbNkU= github.com/mholt/archiver v3.1.1+incompatible/go.mod h1:Dh2dOXnSdiLxRiPoVfIr/fI1TwETms9B8CTWfeh7ROU= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= @@ -521,7 +473,6 @@ github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS4 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -537,7 +488,6 @@ github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8m 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/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nwaples/rardecode v1.0.0 h1:r7vGuS5akxOnR4JQSkko62RJ1ReCMXxQRPtxsiFMBOs= github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= @@ -548,29 +498,27 @@ github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB github.com/onsi/ginkgo v1.4.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 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= 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 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.14.1 h1:jMU0WaQrP0a/YAEq8eJmJKjBoMs+pClEr1vDMlM/Do4= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.3.0/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.2/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 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME= 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.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= 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.4/go.mod h1:g/HbgYopi++010VEqkFgJHKC09uJiW9UkXvMUuKHUCQ= github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/packethost/packngo v0.0.0-20181217122008-b3b45f1b4979/go.mod h1:otzZQXgoO96RTzDB/Hycg0qZcXZsWJGJRSXbmEIJ+4M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= @@ -578,10 +526,8 @@ 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.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v2.3.0+incompatible h1:CZzRn4Ut9GbUkHlQ7jqBXeZQV41ZSKWFc302ZU6lUTk= github.com/pierrec/lz4 v2.3.0+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 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -596,17 +542,13 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= 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 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8= github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0 h1:ElTg5tNp4DqfV7UQjDqv2+RJlNzsDtvNAWccbItceIE= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -615,9 +557,7 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/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.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.7.0 h1:L+1lyG48J1zAQXA3RBX/nG/B3gjlHq0zTt2tlbJLyCY= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= @@ -626,11 +566,8 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/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 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= @@ -640,7 +577,6 @@ github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfm github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= 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= @@ -652,7 +588,6 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= 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 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -666,9 +601,7 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= @@ -690,10 +623,8 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -703,17 +634,19 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1 github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 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/ulikunitz/xz v0.5.6 h1:jGHAfXawEGZQ3blwU5wnWKQJvAraT7Ftq9EXjnXYgt8= github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.3/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 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= @@ -725,20 +658,16 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.5.1 h1:rsqfU5vBkVknbhUGbAUwQKR2H4ItV8tjJ+6kJX4cxHM= go.uber.org/atomic v1.5.1/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -747,9 +676,7 @@ go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9E go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= @@ -766,12 +693,9 @@ golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 h1:/Tl7pH94bvbAAHBdZJT947M/+gp0+CqQXDtMRC0fseo= golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -783,7 +707,6 @@ golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587 h1:5Uz0rkjCFu9BC9gCRN7EkwVvhNyQgGWb8KNJrPwBoHY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -799,18 +722,17 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= 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 h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/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= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -838,26 +760,23 @@ golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933 h1:e6HwijUxhDe+hPNjZQQn9bA5PW3vNmnN64U2ZW759Lk= golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/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= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/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-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -866,8 +785,8 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/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-20180117170059-2c42eef0765b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -899,7 +818,6 @@ golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191128015809-6d18c012aee9 h1:ZBzSG/7F4eNKz2L3GE9o300RX0Az1Bw5HF7PDraD+qU= golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -912,12 +830,11 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d h1:62ap6LNOjDU6uGmKXHJbSfciMoV+FeI1sRXx/pLDL44= golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200806060901-a37d78b92225/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 h1:5CtCZbICpIOFdgO940moixOPjc0178IU44m4EjOO5IY= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -926,17 +843,13 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -977,7 +890,6 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371 h1:Cjq6sG3gnKDchzWy7ouGQklhxMtWvh4AhSNJ0qGIeo4= golang.org/x/tools v0.0.0-20191203134012-c197fd4bf371/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -990,23 +902,19 @@ golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200408032209-46bd65c8538f h1:rsqLea9h7rgdpXI+GnnbQkptKSzOybXLjn3gqcL2XZ0= golang.org/x/tools v0.0.0-20200408032209-46bd65c8538f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43 h1:Lcsc5ErIWemp8qAbYffG5vPrqjJ0zk82RTFGifeS1Pc= golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43/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-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 h1:UaoXseXAWUJUcuJ2E2oczJdLxAJXL0lOmVaBl7kuk+I= golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d h1:vWQvJ/Z0Lu+9/8oQ/pAYXNzbc7CMnBl+tULGVHOy3oE= +golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898 h1:/atklqdjdhuosWIl6AIbOeHJjicWYPqR9bpxqxYG2pA= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 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.0.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= -gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0= gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= gomodules.xyz/jsonpatch/v2 v2.1.0 h1:Phva6wqu+xR//Njw6iorylFFgn/z547tw5Ne3HZPQ+k= gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU= @@ -1027,9 +935,7 @@ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= @@ -1070,7 +976,6 @@ google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQ google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= @@ -1083,13 +988,13 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 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 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= 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.42.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 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/pipe.v2 v2.0.0-20140414041502-3c2ca4d52544/go.mod h1:UhTeH/yXCK/KY7TX24mqPkaQ7gZeqmWd/8SSS8B3aHw= 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= @@ -1100,14 +1005,11 @@ 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.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.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20190905181640-827449938966/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2 h1:XZx7nhd5GMaZpmDaEHFVafUZC7ya0fuo7cSJ3UCKYmM= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= @@ -1118,7 +1020,6 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh 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= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= @@ -1134,14 +1035,10 @@ k8s.io/apiextensions-apiserver v0.20.2 h1:rfrMWQ87lhd8EzQWRnbQ4gXrniL/yTRBgYH1x1 k8s.io/apiextensions-apiserver v0.20.2/go.mod h1:F6TXp389Xntt+LUq3vw6HFOLttPa0V8821ogLGwb6Zs= k8s.io/apimachinery v0.20.2 h1:hFx6Sbt1oG0n6DZ+g4bFt5f6BoMkOjKWsQFu077M3Vg= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad h1:IMoNR9pilTBaCS5WpwWnAdmoVYVeXowOD3bLrwxIAtQ= k8s.io/apiserver v0.0.0-20190918160949-bfa5e2e684ad/go.mod h1:XPCXEwhjaFN29a8NldXA901ElnKeKLrLtREO9ZhFyhg= k8s.io/apiserver v0.0.0-20191010014313-3893be10d307/go.mod h1:6bqaTSOSJavUIXUtfaR9Os9JtTCm8ZqH2SUl2S60C4w= -k8s.io/apiserver v0.16.8 h1:FTuZF/ENaJYPsSE5bVlziJQZGi9pR6oMOk4CPdF6ClQ= k8s.io/apiserver v0.16.8/go.mod h1:FzppK0uWsEZnS/FUCOTLQuMRSItRGYstLxTx4nU1Wc4= -k8s.io/apiserver v0.18.8 h1:Au4kMn8sb1zFdyKqc8iMHLsYLxRI6Y+iAhRNKKQtlBY= k8s.io/apiserver v0.18.8/go.mod h1:12u5FuGql8Cc497ORNj79rhPdiXQC4bf53X/skR/1YM= -k8s.io/apiserver v0.18.10 h1:wFA61pz7st1WLi96aDqr3nr6o/frkBdfRa60tpkMdRs= k8s.io/apiserver v0.18.10/go.mod h1:N4FaJo9BeSgmtvVByXi4fPSQPRqhvvLMGqswwkddob8= k8s.io/apiserver v0.20.2 h1:lGno2t3gcZnLtzsKH4oG0xA9/4GTiBzMO1DGp+K+Bak= k8s.io/apiserver v0.20.2/go.mod h1:2nKd93WyMhZx4Hp3RfgH2K5PhwyTrprrkWYnI7id7jA= @@ -1150,9 +1047,7 @@ k8s.io/autoscaler v0.0.0-20190805135949-100e91ba756e/go.mod h1:QEXezc9uKPT91dwqh k8s.io/client-go v0.20.2 h1:uuf+iIAbfnCSw8IGAv/Rg0giM+2bOzHLOsbbrwrdhNQ= k8s.io/client-go v0.20.2/go.mod h1:kH5brqWqp7HDxUFKoEgiI4v8G1xzbe9giaCenUWJzgE= k8s.io/cluster-bootstrap v0.0.0-20190918163108-da9fdfce26bb/go.mod h1:mQVbtFRxlw/BzBqBaQwIMzjDTST1KrGtzWaR4CGlsTU= -k8s.io/cluster-bootstrap v0.16.8 h1:94hV4G7aSIkNCX2G1Jk8URz8zLermBbrrwNre2Y8S9w= k8s.io/cluster-bootstrap v0.16.8/go.mod h1:fT1U/qWmXNmIColCsCBg4G881nWFaEqONL0xmP48rkI= -k8s.io/cluster-bootstrap v0.18.8 h1:+gkx/sfGBtokxvRbVA5nVA8bPy1YvpDYRiGRqyEtSXc= k8s.io/cluster-bootstrap v0.18.8/go.mod h1:guq0Uc+QwazHgpS1yAw5Z7yUlBCtGppbgWQkbN3lxIY= k8s.io/cluster-bootstrap v0.20.2 h1:fuZH5boornwWn8+ejecZs1QK0Js7GhzwObMY3jrvpSE= k8s.io/cluster-bootstrap v0.20.2/go.mod h1:2vQbXkXcZN1N6SnBlWBctKjARH9vj+Uzo4DPgzUJdqw= @@ -1161,9 +1056,7 @@ k8s.io/code-generator v0.20.2/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbW k8s.io/component-base v0.20.2 h1:LMmu5I0pLtwjpp5009KLuMGFqSc2S2isGw8t1hpYKLE= k8s.io/component-base v0.20.2/go.mod h1:pzFtCiwe/ASD0iV7ySMu8SYVJjCapNM9bjvk7ptpKh0= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20190826232639-a874a240740c h1:HH5z+xQGPLMQ2MlS+UVaOaSFgaEqGw1Zb007B9yjZEY= k8s.io/gengo v0.0.0-20190826232639-a874a240740c/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2wGWbulskmzRX8Vs= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded h1:JApXBKYyB7l9xx+DK7/+mFjC7A9Bt5A93FPvFD0HIFE= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= @@ -1175,26 +1068,20 @@ k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= -k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= 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 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-aggregator v0.0.0-20191004104030-d9d5f0cc7532/go.mod h1:8sbzT4QQKDEmSCIbfqjV0sd97GpUT7A4W626sBiYJmU= -k8s.io/kube-aggregator v0.16.8 h1:Z7+kBXA5V/SKINY9W7QBvZn/Orf5jwPAcW4cPJnNxFA= k8s.io/kube-aggregator v0.16.8/go.mod h1:l73g+bVdjrgDz9nrISk6AgupGbv1n+4WjTbGaXz/YvI= -k8s.io/kube-aggregator v0.18.8 h1:8VQxblQqRInpJ+DS2aGgbdWq6xP8UG/jzV6v8cFccOc= k8s.io/kube-aggregator v0.18.8/go.mod h1:CyLoGZB+io8eEwnn+6RbV7QWJQhj8a3TBH8ZM8sLbhI= -k8s.io/kube-aggregator v0.18.10 h1:dEq7kt0hM0JLZK+NYeUDjmuPRWTBCct+2biXD4aJsE8= k8s.io/kube-aggregator v0.18.10/go.mod h1:4hDj1WpnMJTXhMlDHf14zB0B/hrFCY6dBN0ZHQNqiyQ= k8s.io/kube-aggregator v0.20.2 h1:fzc2Re7AwGDn54mntt2g6n8qkfPUbcvF+kY2VGNHWIQ= k8s.io/kube-aggregator v0.20.2/go.mod h1:j7ks4pWm6cjXzlVZB9tewvUdg2njjbiFuHp575ZKnqc= k8s.io/kube-openapi v0.0.0-20180731170545-e3762e86a74c/go.mod h1:BXM9ceUBTj2QnfH2MK1odQs778ajze1RxcmP6S8RVVc= k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= -k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU= k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= k8s.io/kube-openapi v0.0.0-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= -k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29 h1:NeQXVJ2XFSkRoPzRo8AId01ZER+j8oV4SZADT4iBOXQ= k8s.io/kube-openapi v0.0.0-20200410145947-bcb3869e6f29/go.mod h1:F+5wygcW0wmRTnM3cOgIqGivxkwSWIWT5YdsDbeAOaU= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= @@ -1202,20 +1089,15 @@ k8s.io/kubelet v0.16.8/go.mod h1:mzDpnryQg2dlB6V3/WAgb1baIamiICtWpXMFrPOFh6I= k8s.io/kubelet v0.18.8/go.mod h1:6z1jHCk0NPE6WshFStfqcgQ1bnD3tetcPmhC2915aio= k8s.io/kubelet v0.20.2/go.mod h1:i441hnZtH2wUiDNqpXVZYaNCqEOBd2sM7x2mV0n7dJs= k8s.io/metrics v0.0.0-20191004105854-2e8cf7d0888c/go.mod h1:a25VAbm3QT3xiVl1jtoF1ueAKQM149UdZ+L93ePfV3M= -k8s.io/metrics v0.16.8 h1:VHYjoncB4WjvizvQ36vQ2kga4jo7+hLhJIYi60JGru0= k8s.io/metrics v0.16.8/go.mod h1:uBIJKJKdga8vL76a1dl+eRlUqOAdCbBpvFHC28SbUIY= k8s.io/metrics v0.18.8/go.mod h1:j7JzZdiyhLP2BsJm/Fzjs+j5Lb1Y7TySjhPWqBPwRXA= k8s.io/metrics v0.20.2/go.mod h1:yTck5nl5wt/lIeLcU6g0b8/AKJf2girwe0PQiaM4Mwk= k8s.io/utils v0.0.0-20190506122338-8fab8cb257d5/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20190801114015-581e00157fb1 h1:+ySTxfHnfzZb9ys375PXNlLhkJPLKgHajBU0N62BDvE= k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20191218082557-f07c713de883/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200327001022-6496210b90e8 h1:6JFbaLjRyBz8K2Jvt+pcT+N3vvwMZfg8MfVENwe9aag= k8s.io/utils v0.0.0-20200327001022-6496210b90e8/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= -k8s.io/utils v0.0.0-20200603063816-c1c6865ac451 h1:v8ud2Up6QK1lNOKFgiIVrZdMg7MpmSnvtrOieolJKoE= k8s.io/utils v0.0.0-20200603063816-c1c6865ac451/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 h1:7Nu2dTj82c6IaWvL7hImJzcXoTPz1MsSCH7r+0m6rfo= k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210111153108-fddb29f9d009 h1:0T5IaWHO3sJTEmCP6mUlBvMukxPKUQWqiI/YuiBNMiQ= @@ -1227,9 +1109,7 @@ 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/controller-runtime v0.2.0-beta.5/go.mod h1:HweyYKQ8fBuzdu2bdaeBJvsFgAi/OqBBnrVGXcqKhME= -sigs.k8s.io/controller-runtime v0.4.0 h1:wATM6/m+3w8lj8FXNaO6Fs/rq/vqoOjO1Q116Z9NPsg= sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= -sigs.k8s.io/controller-runtime v0.6.3 h1:SBbr+inLPEKhvlJtrvDcwIpm+uhDvp63Bl72xYJtoOE= sigs.k8s.io/controller-runtime v0.6.3/go.mod h1:WlZNXcM0++oyaQt4B7C2lEE5JYRs8vJUzRP4N4JpdAY= sigs.k8s.io/controller-runtime v0.8.3 h1:GMHvzjTmaWHQB8HadW+dIvBoJuLvZObYJ5YoZruPRao= sigs.k8s.io/controller-runtime v0.8.3/go.mod h1:U/l+DUopBc1ecfRZ5aviA9JDmGFQKvLf5YkZNx2e0sU= @@ -1245,14 +1125,11 @@ sigs.k8s.io/structured-merge-diff v1.0.2 h1:WiMoyniAVAYm03w+ImfF9IE2G23GLR/SwDnQ sigs.k8s.io/structured-merge-diff v1.0.2/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA= sigs.k8s.io/structured-merge-diff/v2 v2.0.1/go.mod h1:Wb7vfKAodbKgf6tn1Kl0VvGj7mRH6DGaRcixXEJXTsE= 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 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/testing_frameworks v0.1.1/go.mod h1:VVBKrHmJ6Ekkfz284YKhQePcdycOzNH9qL6ht1zEr/U= -sigs.k8s.io/testing_frameworks v0.1.2 h1:vK0+tvjF0BZ/RYFeZ1E6BYBwHJJXhjuZ3TdsEKH+UQM= sigs.k8s.io/testing_frameworks v0.1.2/go.mod h1:ToQrwSC3s8Xf/lADdZp3Mktcql9CG0UAmdJG9th5i0w= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/hack/tools.go b/hack/tools.go index 6e5e03f22..3cd54ca0b 100644 --- a/hack/tools.go +++ b/hack/tools.go @@ -25,7 +25,6 @@ import ( _ "github.com/gardener/gardener/hack/api-reference/template" _ "github.com/ahmetb/gen-crd-api-reference-docs" - _ "github.com/gobuffalo/packr/v2/packr2" _ "github.com/onsi/ginkgo/ginkgo" _ "k8s.io/code-generator" ) diff --git a/pkg/generator/generator.go b/pkg/generator/generator.go index e8b5ce41c..ba5f082ca 100644 --- a/pkg/generator/generator.go +++ b/pkg/generator/generator.go @@ -15,9 +15,10 @@ package generator import ( + "embed" + ostemplate "github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/template" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gobuffalo/packr/v2" "k8s.io/apimachinery/pkg/util/runtime" ) @@ -28,14 +29,14 @@ func additionalValues(*extensionsv1alpha1.OperatingSystemConfig) (map[string]int return nil, nil } -//go:generate packr2 +//go:embed templates/* +var templates embed.FS func init() { - box := packr.New("templates", "./templates") - cloudInitTemplateString, err := box.FindString("cloud-init.gardenlinux.template") + cloudInitTemplateString, err := templates.ReadFile("templates/cloud-init.gardenlinux.template") runtime.Must(err) - cloudInitTemplate, err := ostemplate.NewTemplate("cloud-init").Parse(cloudInitTemplateString) + cloudInitTemplate, err := ostemplate.NewTemplate("cloud-init").Parse(string(cloudInitTemplateString)) runtime.Must(err) cloudInitGenerator = ostemplate.NewCloudInitGenerator(cloudInitTemplate, ostemplate.DefaultUnitsPath, cmd, additionalValues) } diff --git a/pkg/generator/generator_test.go b/pkg/generator/generator_test.go index 40b0d463a..1655844cf 100644 --- a/pkg/generator/generator_test.go +++ b/pkg/generator/generator_test.go @@ -16,11 +16,11 @@ package generator_test import ( gardenlinux_generator "github.com/gardener/gardener-extension-os-gardenlinux/pkg/generator" + "github.com/gardener/gardener-extension-os-gardenlinux/pkg/generator/testfiles" commongen "github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator" "github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test" "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gobuffalo/packr" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -88,12 +88,11 @@ dataKey: token`) var _ = Describe("Garden Linux OS Generator Test", func() { Describe("Conformance Tests", func() { - var box = packr.NewBox("./testfiles") g := gardenlinux_generator.CloudInitGenerator() - test.DescribeTest(gardenlinux_generator.CloudInitGenerator(), box)() + test.DescribeTest(gardenlinux_generator.CloudInitGenerator(), testfiles.Files)() It("[docker] [bootstrap] should render correctly ", func() { - expectedCloudInit, err := box.Find("docker-bootstrap") + expectedCloudInit, err := testfiles.Files.ReadFile("docker-bootstrap") Expect(err).NotTo(HaveOccurred()) osc.Bootstrap = true @@ -106,7 +105,7 @@ var _ = Describe("Garden Linux OS Generator Test", func() { }) It("[docker] [reconcile] should render correctly", func() { - expectedCloudInit, err := box.Find("docker-reconcile") + expectedCloudInit, err := testfiles.Files.ReadFile("docker-reconcile") Expect(err).NotTo(HaveOccurred()) osc.Bootstrap = false @@ -119,7 +118,7 @@ var _ = Describe("Garden Linux OS Generator Test", func() { }) It("[containerd] [bootstrap] should render correctly", func() { - expectedCloudInit, err := box.Find("containerd-bootstrap") + expectedCloudInit, err := testfiles.Files.ReadFile("containerd-bootstrap") Expect(err).NotTo(HaveOccurred()) osc.Bootstrap = true @@ -132,7 +131,7 @@ var _ = Describe("Garden Linux OS Generator Test", func() { }) It("[containerd] [reconcile] should render correctly bootstrap", func() { - expectedCloudInit, err := box.Find("containerd-reconcile") + expectedCloudInit, err := testfiles.Files.ReadFile("containerd-reconcile") Expect(err).NotTo(HaveOccurred()) osc.Bootstrap = false diff --git a/pkg/generator/testfiles/embed.go b/pkg/generator/testfiles/embed.go new file mode 100644 index 000000000..adf908741 --- /dev/null +++ b/pkg/generator/testfiles/embed.go @@ -0,0 +1,21 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 testfiles + +import "embed" + +// Files contains the contents of the testfiles directory +//go:embed cloud-* containerd-* docker-* +var Files embed.FS diff --git a/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedresources.go b/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedresources.go deleted file mode 100644 index 90edf98ab..000000000 --- a/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedresources.go +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 manager - -import ( - "context" - - resourcesv1alpha1 "github.com/gardener/gardener-resource-manager/pkg/apis/resources/v1alpha1" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" -) - -type ManagedResource struct { - client client.Client - resource *resourcesv1alpha1.ManagedResource -} - -func NewManagedResource(client client.Client) *ManagedResource { - return &ManagedResource{ - client: client, - resource: &resourcesv1alpha1.ManagedResource{}, - } -} - -func (m *ManagedResource) WithNamespacedName(namespace, name string) *ManagedResource { - m.resource.Namespace = namespace - m.resource.Name = name - return m -} - -func (m *ManagedResource) WithLabels(labels map[string]string) *ManagedResource { - m.resource.Labels = labels - return m -} - -func (m *ManagedResource) WithAnnotations(annotations map[string]string) *ManagedResource { - m.resource.Annotations = annotations - return m -} - -func (m *ManagedResource) WithClass(name string) *ManagedResource { - if name == "" { - m.resource.Spec.Class = nil - } else { - m.resource.Spec.Class = &name - } - return m -} - -func (m *ManagedResource) WithSecretRef(secretRefName string) *ManagedResource { - m.resource.Spec.SecretRefs = append(m.resource.Spec.SecretRefs, corev1.LocalObjectReference{Name: secretRefName}) - return m -} - -func (m *ManagedResource) WithSecretRefs(secretRefs []corev1.LocalObjectReference) *ManagedResource { - m.resource.Spec.SecretRefs = append(m.resource.Spec.SecretRefs, secretRefs...) - return m -} - -func (m *ManagedResource) WithInjectedLabels(labelsToInject map[string]string) *ManagedResource { - m.resource.Spec.InjectLabels = labelsToInject - return m -} - -func (m *ManagedResource) ForceOverwriteAnnotations(v bool) *ManagedResource { - m.resource.Spec.ForceOverwriteAnnotations = &v - return m -} - -func (m *ManagedResource) ForceOverwriteLabels(v bool) *ManagedResource { - m.resource.Spec.ForceOverwriteLabels = &v - return m -} - -func (m *ManagedResource) KeepObjects(v bool) *ManagedResource { - m.resource.Spec.KeepObjects = &v - return m -} - -func (m *ManagedResource) DeletePersistentVolumeClaims(v bool) *ManagedResource { - m.resource.Spec.DeletePersistentVolumeClaims = &v - return m -} - -func (m *ManagedResource) Reconcile(ctx context.Context) error { - resource := &resourcesv1alpha1.ManagedResource{ - ObjectMeta: metav1.ObjectMeta{Name: m.resource.Name, Namespace: m.resource.Namespace}, - } - - _, err := controllerutil.CreateOrUpdate(ctx, m.client, resource, func() error { - resource.Labels = m.resource.Labels - resource.Annotations = m.resource.Annotations - resource.Spec = m.resource.Spec - return nil - }) - return err -} - -func (m *ManagedResource) Delete(ctx context.Context) error { - if err := m.client.Delete(ctx, m.resource); err != nil && !apierrors.IsNotFound(err) { - return err - } - return nil -} diff --git a/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedsecrets.go b/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedsecrets.go deleted file mode 100644 index d04f7cfd5..000000000 --- a/vendor/github.com/gardener/gardener-resource-manager/pkg/manager/managedsecrets.go +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 manager - -import ( - "context" - - corev1 "k8s.io/api/core/v1" - apierrors "k8s.io/apimachinery/pkg/api/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" -) - -type Secret struct { - client client.Client - - keyValues map[string]string - secret *corev1.Secret -} - -func NewSecret(client client.Client) *Secret { - return &Secret{ - client: client, - keyValues: make(map[string]string), - secret: &corev1.Secret{}, - } -} - -func (s *Secret) WithNamespacedName(namespace, name string) *Secret { - s.secret.Namespace = namespace - s.secret.Name = name - return s -} - -func (s *Secret) WithLabels(labels map[string]string) *Secret { - s.secret.Labels = labels - return s -} - -func (s *Secret) WithAnnotations(annotations map[string]string) *Secret { - s.secret.Annotations = annotations - return s -} - -func (s *Secret) WithKeyValues(keyValues map[string][]byte) *Secret { - s.secret.Data = keyValues - return s -} - -func (s *Secret) Reconcile(ctx context.Context) error { - secret := &corev1.Secret{ - ObjectMeta: metav1.ObjectMeta{Name: s.secret.Name, Namespace: s.secret.Namespace}, - } - - _, err := controllerutil.CreateOrUpdate(ctx, s.client, secret, func() error { - secret.Labels = s.secret.Labels - secret.Annotations = s.secret.Annotations - secret.Type = corev1.SecretTypeOpaque - secret.Data = s.secret.Data - return nil - }) - return err -} - -func (s *Secret) Delete(ctx context.Context) error { - if err := s.client.Delete(ctx, s.secret); err != nil && !apierrors.IsNotFound(err) { - return err - } - return nil -} - -type Secrets struct { - client client.Client - - secrets []Secret -} - -func NewSecrets(client client.Client) *Secrets { - return &Secrets{ - client: client, - secrets: []Secret{}, - } -} - -func (s *Secrets) WithSecretList(secrets []Secret) *Secrets { - s.secrets = append(s.secrets, secrets...) - return s -} - -func (s *Secrets) WithSecret(secrets Secret) *Secrets { - s.secrets = append(s.secrets, secrets) - return s -} - -func (s *Secrets) Reconcile(ctx context.Context) error { - for _, secret := range s.secrets { - if err := secret.Reconcile(ctx); err != nil { - return err - } - } - return nil -} - -func (s *Secrets) Delete(ctx context.Context) error { - for _, secret := range s.secrets { - if err := secret.Delete(ctx); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/managedresources.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/managedresources.go deleted file mode 100644 index 466b1d34b..000000000 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/managedresources.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 controller - -import ( - "context" - - "github.com/gardener/gardener/pkg/chartrenderer" - "github.com/gardener/gardener/pkg/utils/chart" - "github.com/gardener/gardener/pkg/utils/imagevector" - "github.com/gardener/gardener/pkg/utils/managedresources" - - "github.com/pkg/errors" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// RenderChartAndCreateManagedResource renders a chart and creates a ManagedResource for the gardener-resource-manager -// out of the results. -func RenderChartAndCreateManagedResource(ctx context.Context, namespace string, name string, client client.Client, chartRenderer chartrenderer.Interface, chart chart.Interface, values map[string]interface{}, imageVector imagevector.ImageVector, chartNamespace string, version string, withNoCleanupLabel bool, forceOverwriteAnnotations bool) error { - chartName, data, err := chart.Render(chartRenderer, chartNamespace, imageVector, version, version, values) - if err != nil { - return errors.Wrapf(err, "could not render chart") - } - - // Create or update managed resource referencing the previously created secret - var injectedLabels map[string]string - if withNoCleanupLabel { - injectedLabels = map[string]string{ShootNoCleanupLabel: "true"} - } - - return managedresources.CreateManagedResource(ctx, client, namespace, name, "", chartName, data, false, injectedLabels, forceOverwriteAnnotations) -} diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/controller.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/controller.go index 7fc0089fa..12b4b6cdf 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/controller.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/controller.go @@ -31,8 +31,6 @@ const ( // ControllerName is the name of the operating system configuration controller. ControllerName = "operatingsystemconfig_controller" - - name = "operatingsystemconfig-controller" ) // AddArgs are arguments for adding an operatingsystemconfig controller to a manager. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/README.md b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/README.md index ef416bb62..5fd1c7e2e 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/README.md +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/README.md @@ -10,24 +10,27 @@ in a test file. Each Generator implementation can use this function as shown bellow: ```go +package my_generator_test + import ( - "github.com/gobuffalo/packr" + "embed" + "github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) -var _ Describe("My Generator Test", func(){ - var box packr.Box - - BeforeSuite(func() { - box = packr.NewBox("/path/to/testfiles") - }) +//go:embed /path/to/testfiles +var files embed.FS - Describe("Conformance Tests", test.DescribeTest(NewGenerator(),box)) +var _ = Describe("My Generator Test", func(){ + Describe("Conformance Tests", + test.DescribeTest(NewGenerator(), files), + ) - Describe("My other Tests", func(){ - ... - }) + Describe("My other Tests", func(){ + // ... + }) }) ``` diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/template_generator.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/template_generator.go index 089f9b2b9..cb1eb2ef5 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/template_generator.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator/test/template_generator.go @@ -15,12 +15,13 @@ package test import ( + "embed" + "github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/oscommon/generator" extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" - "github.com/gobuffalo/packr" - "github.com/onsi/ginkgo" - "github.com/onsi/gomega" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" ) var ( @@ -29,13 +30,12 @@ var ( // DescribeTest returns a function which can be used in tests for the // template generator implementation. It receives an instance of a template -// generator and a packr Box with the test files to be used in the tests. -var DescribeTest = func(g generator.Generator, box packr.Box) func() { +// generator and embedded files with the test files to be used in the tests. +var DescribeTest = func(g generator.Generator, files embed.FS) func() { return func() { - - ginkgo.It("should render correctly", func() { - expectedCloudInit, err := box.Find("cloud-init") - gomega.Expect(err).NotTo(gomega.HaveOccurred()) + It("should render correctly", func() { + expectedCloudInit, err := files.ReadFile("cloud-init") + Expect(err).NotTo(HaveOccurred()) cloudInit, _, err := g.Generate(&generator.OperatingSystemConfig{ Object: &extensionsv1alpha1.OperatingSystemConfig{}, @@ -62,8 +62,8 @@ var DescribeTest = func(g generator.Generator, box packr.Box) func() { Bootstrap: true, }) - gomega.Expect(err).NotTo(gomega.HaveOccurred()) - gomega.Expect(cloudInit).To(gomega.Equal(expectedCloudInit)) + Expect(err).NotTo(HaveOccurred()) + Expect(cloudInit).To(Equal(expectedCloudInit)) }) } } diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/reconciler.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/reconciler.go index d8c1572db..922a7f517 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/reconciler.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/operatingsystemconfig/reconciler.go @@ -22,7 +22,6 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" @@ -43,20 +42,23 @@ type reconciler struct { logger logr.Logger actuator Actuator - client client.Client - reader client.Reader - scheme *runtime.Scheme + client client.Client + reader client.Reader + scheme *runtime.Scheme + statusUpdater extensionscontroller.StatusUpdater } // NewReconciler creates a new reconcile.Reconciler that reconciles // OperatingSystemConfig resources of Gardener's `extensions.gardener.cloud` API group. func NewReconciler(actuator Actuator) reconcile.Reconciler { - logger := log.Log.WithName(name) + logger := log.Log.WithName(ControllerName) + return extensionscontroller.OperationAnnotationWrapper( func() client.Object { return &extensionsv1alpha1.OperatingSystemConfig{} }, &reconciler{ - logger: logger, - actuator: actuator, + logger: logger, + actuator: actuator, + statusUpdater: extensionscontroller.NewStatusUpdater(logger), }, ) } @@ -69,6 +71,7 @@ func (r *reconciler) InjectFunc(f inject.Func) error { // InjectClient injects the controller runtime client into the reconciler. func (r *reconciler) InjectClient(client client.Client) error { r.client = client + r.statusUpdater.InjectClient(client) return nil } @@ -124,25 +127,25 @@ func (r *reconciler) reconcile(ctx context.Context, osc *extensionsv1alpha1.Oper return reconcile.Result{}, err } - if err := r.updateStatusProcessing(ctx, osc, operationType, "Reconciling the operating system config"); err != nil { + if err := r.statusUpdater.Processing(ctx, osc, operationType, "Reconciling the operating system config"); err != nil { return reconcile.Result{}, err } userData, command, units, err := r.actuator.Reconcile(ctx, osc) if err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, operationType, "Error reconciling operating system config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), operationType, "Error reconciling operating system config") return extensionscontroller.ReconcileErr(err) } secret, err := r.createOrUpdateOSCResultSecret(ctx, osc, userData) if err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, operationType, "Could not apply secret for generated cloud config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), operationType, "Could not apply secret for generated cloud config") return extensionscontroller.ReconcileErr(err) } setOSCStatus(osc, secret, command, units) - if err := r.updateStatusSuccess(ctx, osc, operationType, "Successfully reconciled operating system config"); err != nil { + if err := r.statusUpdater.Success(ctx, osc, operationType, "Successfully reconciled operating system config"); err != nil { return reconcile.Result{}, err } @@ -154,25 +157,25 @@ func (r *reconciler) restore(ctx context.Context, osc *extensionsv1alpha1.Operat return reconcile.Result{}, err } - if err := r.updateStatusProcessing(ctx, osc, gardencorev1beta1.LastOperationTypeRestore, "Restoring the operating system config"); err != nil { + if err := r.statusUpdater.Processing(ctx, osc, gardencorev1beta1.LastOperationTypeRestore, "Restoring the operating system config"); err != nil { return reconcile.Result{}, err } userData, command, units, err := r.actuator.Restore(ctx, osc) if err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, gardencorev1beta1.LastOperationTypeRestore, "Error restoring operating system config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeRestore, "Error restoring operating system config") return extensionscontroller.ReconcileErr(err) } secret, err := r.createOrUpdateOSCResultSecret(ctx, osc, userData) if err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, gardencorev1beta1.LastOperationTypeRestore, "Could not apply secret for generated cloud config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeRestore, "Could not apply secret for generated cloud config") return extensionscontroller.ReconcileErr(err) } setOSCStatus(osc, secret, command, units) - if err := r.updateStatusSuccess(ctx, osc, gardencorev1beta1.LastOperationTypeRestore, "Successfully restored operating system config"); err != nil { + if err := r.statusUpdater.Success(ctx, osc, gardencorev1beta1.LastOperationTypeRestore, "Successfully restored operating system config"); err != nil { return reconcile.Result{}, err } @@ -189,16 +192,16 @@ func (r *reconciler) delete(ctx context.Context, osc *extensionsv1alpha1.Operati return reconcile.Result{}, nil } - if err := r.updateStatusProcessing(ctx, osc, gardencorev1beta1.LastOperationTypeDelete, "Deleting the operating system config"); err != nil { + if err := r.statusUpdater.Processing(ctx, osc, gardencorev1beta1.LastOperationTypeDelete, "Deleting the operating system config"); err != nil { return reconcile.Result{}, err } if err := r.actuator.Delete(ctx, osc); err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, gardencorev1beta1.LastOperationTypeDelete, "Error deleting operating system config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeDelete, "Error deleting operating system config") return extensionscontroller.ReconcileErr(err) } - if err := r.updateStatusSuccess(ctx, osc, gardencorev1beta1.LastOperationTypeDelete, "Successfully deleted operating system config"); err != nil { + if err := r.statusUpdater.Success(ctx, osc, gardencorev1beta1.LastOperationTypeDelete, "Successfully deleted operating system config"); err != nil { return reconcile.Result{}, err } @@ -216,16 +219,16 @@ func (r *reconciler) migrate(ctx context.Context, osc *extensionsv1alpha1.Operat return reconcile.Result{}, nil } - if err := r.updateStatusProcessing(ctx, osc, gardencorev1beta1.LastOperationTypeMigrate, "Migrating the operating system config"); err != nil { + if err := r.statusUpdater.Processing(ctx, osc, gardencorev1beta1.LastOperationTypeMigrate, "Migrating the operating system config"); err != nil { return reconcile.Result{}, err } if err := r.actuator.Migrate(ctx, osc); err != nil { - utilruntime.HandleError(r.updateStatusError(ctx, extensionscontroller.ReconcileErrCauseOrErr(err), osc, gardencorev1beta1.LastOperationTypeMigrate, "Error migrating operating system config")) + _ = r.statusUpdater.Error(ctx, osc, extensionscontroller.ReconcileErrCauseOrErr(err), gardencorev1beta1.LastOperationTypeMigrate, "Error migrating operating system config") return extensionscontroller.ReconcileErr(err) } - if err := r.updateStatusSuccess(ctx, osc, gardencorev1beta1.LastOperationTypeMigrate, "Successfully migrated operating system config"); err != nil { + if err := r.statusUpdater.Success(ctx, osc, gardencorev1beta1.LastOperationTypeMigrate, "Successfully migrated operating system config"); err != nil { return reconcile.Result{}, err } @@ -241,25 +244,6 @@ func (r *reconciler) migrate(ctx context.Context, osc *extensionsv1alpha1.Operat return reconcile.Result{}, nil } -func (r *reconciler) updateStatusProcessing(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, lastOperationType gardencorev1beta1.LastOperationType, description string) error { - r.logger.Info(description, "osc", osc.Name) - osc.Status.LastOperation = extensionscontroller.LastOperation(lastOperationType, gardencorev1beta1.LastOperationStateProcessing, 1, description) - return r.client.Status().Update(ctx, osc) -} - -func (r *reconciler) updateStatusError(ctx context.Context, err error, osc *extensionsv1alpha1.OperatingSystemConfig, lastOperationType gardencorev1beta1.LastOperationType, description string) error { - osc.Status.ObservedGeneration = osc.Generation - osc.Status.LastOperation, osc.Status.LastError = extensionscontroller.ReconcileError(lastOperationType, gardencorev1beta1helper.FormatLastErrDescription(fmt.Errorf("%s: %v", description, err)), 50, gardencorev1beta1helper.ExtractErrorCodes(gardencorev1beta1helper.DetermineError(err, err.Error()))...) - return r.client.Status().Update(ctx, osc) -} - -func (r *reconciler) updateStatusSuccess(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, lastOperationType gardencorev1beta1.LastOperationType, description string) error { - r.logger.Info(description, "osc", osc.Name) - osc.Status.ObservedGeneration = osc.Generation - osc.Status.LastOperation, osc.Status.LastError = extensionscontroller.ReconcileSucceeded(lastOperationType, description) - return r.client.Status().Update(ctx, osc) -} - func (r *reconciler) createOrUpdateOSCResultSecret(ctx context.Context, osc *extensionsv1alpha1.OperatingSystemConfig, userData []byte) (*corev1.Secret, error) { secret := &corev1.Secret{ObjectMeta: SecretObjectMetaForConfig(osc)} if _, err := controllerutil.CreateOrUpdate(ctx, r.client, secret, func() error { diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/shoot.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/shoot.go index 49ed0a84c..b0730e66c 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/shoot.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/shoot.go @@ -19,12 +19,6 @@ import ( "github.com/gardener/gardener/pkg/chartrenderer" ) -const ( - // ShootNoCleanupLabel is a constant for a label on a resource indicating that the Gardener cleaner should not delete this - // resource when cleaning a shoot during the deletion flow. - ShootNoCleanupLabel = "shoot.gardener.cloud/no-cleanup" -) - // ChartRendererFactory creates chartrenderer.Interface to be used by this actuator. type ChartRendererFactory interface { // NewChartRendererForShoot creates a new chartrenderer.Interface for the shoot cluster. diff --git a/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go b/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go index 5361fb5b0..d5b57835d 100644 --- a/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go +++ b/vendor/github.com/gardener/gardener/extensions/pkg/controller/status.go @@ -15,9 +15,17 @@ package controller import ( + "context" + "fmt" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + gardencorev1beta1helper "github.com/gardener/gardener/pkg/apis/core/v1beta1/helper" + extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" + "github.com/go-logr/logr" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/util/retry" + "sigs.k8s.io/controller-runtime/pkg/client" ) // LastOperation creates a new LastOperation from the given parameters. @@ -51,3 +59,90 @@ func ReconcileSucceeded(t gardencorev1beta1.LastOperationType, description strin func ReconcileError(t gardencorev1beta1.LastOperationType, description string, progress int32, codes ...gardencorev1beta1.ErrorCode) (*gardencorev1beta1.LastOperation, *gardencorev1beta1.LastError) { return LastOperation(t, gardencorev1beta1.LastOperationStateError, progress, description), LastError(description, codes...) } + +// StatusUpdater contains functions for updating statuses of extension resources after a controller operation. +type StatusUpdater interface { + // InjectClient injects the client into the status updater. + InjectClient(client.Client) + // Processing updates the last operation of an extension resource when an operation is started. + Processing(context.Context, extensionsv1alpha1.Object, gardencorev1beta1.LastOperationType, string) error + // Error updates the last operation of an extension resource when an operation was erroneous. + Error(context.Context, extensionsv1alpha1.Object, error, gardencorev1beta1.LastOperationType, string) error + // Success updates the last operation of an extension resource when an operation was successful. + Success(context.Context, extensionsv1alpha1.Object, gardencorev1beta1.LastOperationType, string) error +} + +// NewStatusUpdater returns a new status updater. +func NewStatusUpdater(logger logr.Logger) *statusUpdater { + return &statusUpdater{logger: logger} +} + +type statusUpdater struct { + logger logr.Logger + client client.Client +} + +var _ = StatusUpdater(&statusUpdater{}) + +func (s *statusUpdater) InjectClient(c client.Client) { + s.client = c +} + +func (s *statusUpdater) Processing(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + if s.client == nil { + return fmt.Errorf("client is not set. Call InjectClient() first") + } + + s.logger.Info(description, s.logKeysAndValues(obj)...) + + return TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { + lastOp := LastOperation(lastOperationType, gardencorev1beta1.LastOperationStateProcessing, 1, description) + + obj.GetExtensionStatus().SetLastOperation(lastOp) + return nil + }) +} + +func (s *statusUpdater) Error(ctx context.Context, obj extensionsv1alpha1.Object, err error, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + if s.client == nil { + return fmt.Errorf("client is not set. Call InjectClient() first") + } + + errDescription := gardencorev1beta1helper.FormatLastErrDescription(fmt.Errorf("%s: %v", description, err)) + s.logger.Error(fmt.Errorf(errDescription), "error", s.logKeysAndValues(obj)...) + + return TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { + lastOp, lastErr := ReconcileError(lastOperationType, errDescription, 50, gardencorev1beta1helper.ExtractErrorCodes(gardencorev1beta1helper.DetermineError(err, err.Error()))...) + + obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) + obj.GetExtensionStatus().SetLastOperation(lastOp) + obj.GetExtensionStatus().SetLastError(lastErr) + return nil + }) +} + +func (s *statusUpdater) Success(ctx context.Context, obj extensionsv1alpha1.Object, lastOperationType gardencorev1beta1.LastOperationType, description string) error { + if s.client == nil { + return fmt.Errorf("client is not set. Call InjectClient() first") + } + + s.logger.Info(description, s.logKeysAndValues(obj)...) + + return TryUpdateStatus(ctx, retry.DefaultBackoff, s.client, obj, func() error { + lastOp, lastErr := ReconcileSucceeded(lastOperationType, description) + + obj.GetExtensionStatus().SetObservedGeneration(obj.GetGeneration()) + obj.GetExtensionStatus().SetLastOperation(lastOp) + obj.GetExtensionStatus().SetLastError(lastErr) + return nil + }) +} + +func (s *statusUpdater) logKeysAndValues(obj metav1.Object) []interface{} { + var keysAndValues []interface{} + if ns := obj.GetNamespace(); ns != "" { + keysAndValues = append(keysAndValues, "namespace", ns) + } + keysAndValues = append(keysAndValues, "name", obj.GetName()) + return keysAndValues +} diff --git a/vendor/github.com/gardener/gardener/hack/cherry-pick-pull.sh b/vendor/github.com/gardener/gardener/hack/cherry-pick-pull.sh index 5f98c6a0b..59decee31 100755 --- a/vendor/github.com/gardener/gardener/hack/cherry-pick-pull.sh +++ b/vendor/github.com/gardener/gardener/hack/cherry-pick-pull.sh @@ -57,12 +57,12 @@ if ! which hub > /dev/null; then fi if [[ "$#" -lt 2 ]]; then - echo "${0} ...: cherry pick one or more onto and leave instructions for proposing pull request" + echo "${0} / ...: cherry pick one or more onto and leave instructions for proposing pull request" echo - echo " Checks out and handles the cherry-pick of (possibly multiple) for you." + echo " Checks out / and handles the cherry-pick of (possibly multiple) for you." echo " Examples:" - echo " $0 upstream/release-3.14 12345 # Cherry-picks PR 12345 onto upstream/release-3.14 and proposes that as a PR." - echo " $0 upstream/release-3.14 12345 56789 # Cherry-picks PR 12345, then 56789 and proposes the combination as a single PR." + echo " $0 ${UPSTREAM_REMOTE}/release-3.14 12345 # Cherry-picks PR 12345 onto ${UPSTREAM_REMOTE}/release-3.14 and proposes that as a PR." + echo " $0 ${UPSTREAM_REMOTE}/release-3.14 12345 56789 # Cherry-picks PR 12345, then 56789 and proposes the combination as a single PR." echo echo " Set the DRY_RUN environment var to skip git push and creating PR." echo " This is useful for creating patches to a release branch without making a PR." @@ -203,14 +203,15 @@ for pull in "${PULLS[@]}"; do } # set the subject - subject=$(grep -m 1 "^Subject" "/tmp/${pull}.patch" | sed -e 's/Subject: \[PATCH//g' | sed 's/.*] //') + pr_info=$(curl "https://api.github.com/repos/${MAIN_REPO_ORG}/${MAIN_REPO_NAME}/pulls/${pull}" -sS) + subject=$(echo ${pr_info} | jq -cr '.title') SUBJECTS+=("#${pull}: ${subject}") # remove the patch file from /tmp rm -f "/tmp/${pull}.patch" # get the release notes - notes=$(curl "https://api.github.com/repos/${MAIN_REPO_ORG}/${MAIN_REPO_NAME}/pulls/${pull}" -sS | jq '.body' | grep -Po "\`\`\` *${RELEASE_NOTE_CATEGORY} ${RELEASE_NOTE_TARGET_GROUP}.*?\`\`\`") + notes=$(echo ${pr_info} | jq '.body' | grep -Po "\`\`\` *${RELEASE_NOTE_CATEGORY} ${RELEASE_NOTE_TARGET_GROUP}.*?\`\`\`") RELEASE_NOTES+=("${notes}") done gitamcleanup=false diff --git a/vendor/github.com/gardener/gardener/hack/clean.sh b/vendor/github.com/gardener/gardener/hack/clean.sh index 44b3f6182..833cc73cd 100755 --- a/vendor/github.com/gardener/gardener/hack/clean.sh +++ b/vendor/github.com/gardener/gardener/hack/clean.sh @@ -27,7 +27,6 @@ for source_tree in $@; do grep -lr '// Code generated by client-gen. DO NOT EDIT' "$(dirname "$source_tree")" | xargs rm -f grep -lr '// Code generated by informer-gen. DO NOT EDIT' "$(dirname "$source_tree")" | xargs rm -f grep -lr '// Code generated by lister-gen. DO NOT EDIT' "$(dirname "$source_tree")" | xargs rm -f - grep -lr --include="*.go" "//go:generate packr2" "$(dirname "$source_tree")" | xargs -I {} packr2 clean "{}/.." done if [ -d "$PWD/hack/api-reference" ]; then diff --git a/vendor/github.com/gardener/gardener/hack/install-requirements.sh b/vendor/github.com/gardener/gardener/hack/install-requirements.sh index 465d311f0..a2e634a72 100755 --- a/vendor/github.com/gardener/gardener/hack/install-requirements.sh +++ b/vendor/github.com/gardener/gardener/hack/install-requirements.sh @@ -18,7 +18,7 @@ set -e echo "> Installing requirements" -GO111MODULE=off go get golang.org/x/tools/cmd/goimports +GO111MODULE=off go get -u golang.org/x/tools/cmd/goimports export GO111MODULE=on curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.27.0 diff --git a/vendor/github.com/gardener/gardener/hack/test-cover.sh b/vendor/github.com/gardener/gardener/hack/test-cover.sh index 232103d20..66313d98e 100755 --- a/vendor/github.com/gardener/gardener/hack/test-cover.sh +++ b/vendor/github.com/gardener/gardener/hack/test-cover.sh @@ -27,6 +27,7 @@ setup_envtest_env ${ENVTEST_ASSETS_DIR} echo "> Test Cover" +export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT=1m GO111MODULE=on ginkgo -cover -timeout=2m -race -mod=vendor $@ REPO_ROOT="$(git rev-parse --show-toplevel)" diff --git a/vendor/github.com/gardener/gardener/hack/test.sh b/vendor/github.com/gardener/gardener/hack/test.sh index 9a96f1d4b..a4ff327f2 100755 --- a/vendor/github.com/gardener/gardener/hack/test.sh +++ b/vendor/github.com/gardener/gardener/hack/test.sh @@ -27,4 +27,5 @@ setup_envtest_env ${ENVTEST_ASSETS_DIR} echo "> Test" +export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT=1m GO111MODULE=on go test -race -mod=vendor $@ | grep -v 'no test files' diff --git a/vendor/github.com/gardener/gardener/hack/update-codegen.sh b/vendor/github.com/gardener/gardener/hack/update-codegen.sh index 75aa25d7d..5d14604e3 100755 --- a/vendor/github.com/gardener/gardener/hack/update-codegen.sh +++ b/vendor/github.com/gardener/gardener/hack/update-codegen.sh @@ -181,7 +181,7 @@ export -f scheduler_groups gardenlet_groups() { echo "Generating API groups for pkg/gardenlet/apis/config" - + bash "${PROJECT_ROOT}"/vendor/k8s.io/code-generator/generate-internal-groups.sh \ deepcopy,defaulter \ github.com/gardener/gardener/pkg/client/componentconfig \ @@ -201,6 +201,30 @@ gardenlet_groups() { } export -f gardenlet_groups +# Componentconfig for landscaper-gardenlet + +landscapergardenlet_groups() { + echo "Generating API groups for landscaper/gardenlet/pkg/apis/imports" + + bash "${PROJECT_ROOT}"/vendor/k8s.io/code-generator/generate-internal-groups.sh \ + deepcopy,defaulter \ + github.com/gardener/gardener/pkg/client/componentconfig \ + github.com/gardener/gardener/landscaper/pkg/gardenlet/apis \ + github.com/gardener/gardener/landscaper/pkg/gardenlet/apis \ + "imports:v1alpha1" \ + -h "${PROJECT_ROOT}/hack/LICENSE_BOILERPLATE.txt" + + bash "${PROJECT_ROOT}"/vendor/k8s.io/code-generator/generate-internal-groups.sh \ + conversion \ + github.com/gardener/gardener/pkg/client/componentconfig \ + github.com/gardener/gardener/landscaper/pkg/gardenlet/apis \ + github.com/gardener/gardener/landscaper/pkg/gardenlet/apis \ + "imports:v1alpha1" \ + --extra-peer-dirs=github.com/gardener/gardener/pkg/gardenlet/apis/config,github.com/gardener/landscaper/apis/core/v1alpha1,k8s.io/apimachinery/pkg/apis/meta/v1,k8s.io/apimachinery/pkg/conversion,k8s.io/apimachinery/pkg/runtime \ + -h "${PROJECT_ROOT}/hack/LICENSE_BOILERPLATE.txt" +} +export -f landscapergardenlet_groups + # Componentconfig for admission plugins shoottolerationrestriction_groups() { @@ -264,7 +288,8 @@ if [[ $# -gt 0 && "$1" == "--parallel" ]]; then admissioncontroller_groups \ scheduler_groups \ gardenlet_groups \ - shoottolerationrestriction_groups + shoottolerationrestriction_groups \ + landscapergardenlet_groups else core_groups extensions_groups @@ -274,7 +299,8 @@ else admissioncontroller_groups scheduler_groups gardenlet_groups - shoottolerationrestriction_groups + shoottolerationrestriction_groups + landscapergardenlet_groups fi openapi_definitions "$@" diff --git a/vendor/github.com/gardener/gardener/pkg/api/extensions/accessor.go b/vendor/github.com/gardener/gardener/pkg/api/extensions/accessor.go index 5c1523167..01763a6d1 100644 --- a/vendor/github.com/gardener/gardener/pkg/api/extensions/accessor.go +++ b/vendor/github.com/gardener/gardener/pkg/api/extensions/accessor.go @@ -147,6 +147,18 @@ func (u unstructuredStatusAccessor) GetLastOperation() *gardencorev1beta1.LastOp return lastOperation } +// SetLastOperation implements Status. +func (u unstructuredStatusAccessor) SetLastOperation(lastOp *gardencorev1beta1.LastOperation) { + unstrc, err := runtime.DefaultUnstructuredConverter.ToUnstructured(lastOp) + if err != nil { + return + } + + if err := unstructured.SetNestedField(u.UnstructuredContent(), unstrc, "status", "lastOperation"); err != nil { + return + } +} + // GetLastError implements Status. func (u unstructuredStatusAccessor) GetLastError() *gardencorev1beta1.LastError { val, ok, err := unstructured.NestedFieldNoCopy(u.UnstructuredContent(), "status", "lastError") @@ -161,11 +173,30 @@ func (u unstructuredStatusAccessor) GetLastError() *gardencorev1beta1.LastError return lastError } +// SetLastError implements Status. +func (u unstructuredStatusAccessor) SetLastError(lastErr *gardencorev1beta1.LastError) { + unstrc, err := runtime.DefaultUnstructuredConverter.ToUnstructured(lastErr) + if err != nil { + return + } + + if err := unstructured.SetNestedField(u.UnstructuredContent(), unstrc, "status", "lastError"); err != nil { + return + } +} + // GetObservedGeneration implements Status. func (u unstructuredStatusAccessor) GetObservedGeneration() int64 { return nestedInt64(u.Object, "status", "observedGeneration") } +// SetObservedGeneration implements Status. +func (u unstructuredStatusAccessor) SetObservedGeneration(generation int64) { + if err := unstructured.SetNestedField(u.UnstructuredContent(), generation, "status", "observedGeneration"); err != nil { + return + } +} + // GetState implements Status. func (u unstructuredStatusAccessor) GetState() *runtime.RawExtension { val, ok, err := unstructured.NestedFieldNoCopy(u.UnstructuredContent(), "status", "state") diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/field_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/field_constants.go index a951d7750..24beec3d4 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/field_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/field_constants.go @@ -24,6 +24,10 @@ const ( // the Seed cluster of a core.gardener.cloud/v1beta1 BackupEntry. BackupEntrySeedName = "spec.seedName" + // ProjectNamespace is the field selector path for filtering by namespace + // for core.gardener.cloud/{v1beta1,v1beta1} Project. + ProjectNamespace = "spec.namespace" + // RegistrationRefName is the field selector path for finding // the ControllerRegistration name of a core.gardener.cloud/{v1beta1,v1beta1} ControllerInstallation. RegistrationRefName = "spec.registrationRef.name" diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_common.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_common.go index b7285670b..0e2371c13 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_common.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_common.go @@ -34,6 +34,8 @@ const ( // ErrorInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level. // It is classified as a non-retryable error code. ErrorInfraDependencies ErrorCode = "ERR_INFRA_DEPENDENCIES" + // ErrorRetryableInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level, but operation should be retried. + ErrorRetryableInfraDependencies ErrorCode = "ERR_RETRYABLE_INFRA_DEPENDENCIES" // ErrorInfraResourcesDepleted indicates that the last error occurred due to depleted resource in the infrastructure. ErrorInfraResourcesDepleted ErrorCode = "ERR_INFRA_RESOURCES_DEPLETED" // ErrorCleanupClusterResources indicates that the last error occurred due to resources in the cluster that are stuck in deletion. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go index ba37874d6..807009100 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_seed.go @@ -199,16 +199,14 @@ type SeedSettings struct { Scheduling *SeedSettingScheduling // ShootDNS controls the shoot DNS settings for the seed. ShootDNS *SeedSettingShootDNS - // LoadBalancerServices controls certain settings for services of type load balancer that are created in the - // seed. + // LoadBalancerServices controls certain settings for services of type load balancer that are created in the seed. LoadBalancerServices *SeedSettingLoadBalancerServices // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler } // SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the -// seed. When enabled then this is done via PodPriority and requires the Seed cluster to have Kubernetes version 1.11 -// or the PodPriority feature gate as well as the scheduling.k8s.io/v1alpha1 API group enabled. +// seed. type SeedSettingExcessCapacityReservation struct { // Enabled controls whether the excess capacity reservation should be enabled. Enabled bool diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go index 1942b59d6..24205d645 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/types_shoot.go @@ -133,6 +133,16 @@ type ShootStatus struct { UID types.UID // ClusterIdentity is the identity of the Shoot cluster ClusterIdentity *string + // List of addresses on which the Kube API server can be reached. + AdvertisedAddresses []ShootAdvertisedAddress +} + +// ShootAdvertisedAddress contains information for the shoot's Kube API server. +type ShootAdvertisedAddress struct { + // Name of the advertised address. e.g. external + Name string + // The URL of the API Server. e.g. https://api.foo.bar or https://1.2.3.4 + URL string } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -428,7 +438,6 @@ type OIDCConfig struct { GroupsPrefix *string // The URL of the OpenID issuer, only HTTPS scheme will be accepted. If set, it will be used to verify the OIDC JSON Web Token (JWT). IssuerURL *string - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. RequiredClaims map[string]string // List of allowed JOSE asymmetric signing algorithms. JWTs with a 'alg' header value not in this list will be rejected. Values are defined by RFC 7518 https://tools.ietf.org/html/rfc7518#section-3.1 @@ -496,8 +505,6 @@ type KubeControllerManagerConfig struct { type HorizontalPodAutoscalerConfig struct { // The period after which a ready pod transition is considered to be the first. CPUInitializationPeriod *metav1.Duration - // The period since last downscale, before another downscale can be performed in horizontal pod autoscaler. - DownscaleDelay *metav1.Duration // The configurable window at which the controller will choose the highest recommendation for autoscaling. DownscaleStabilization *metav1.Duration // The configurable period at which the horizontal pod autoscaler considers a Pod “not yet ready” given that it’s unready and it has transitioned to unready during that time. @@ -506,27 +513,8 @@ type HorizontalPodAutoscalerConfig struct { SyncPeriod *metav1.Duration // The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. Tolerance *float64 - // The period since last upscale, before another upscale can be performed in horizontal pod autoscaler. - UpscaleDelay *metav1.Duration } -const ( - // DefaultHPADownscaleDelay is a constant for the default HPA downscale delay for a Shoot cluster. - DefaultHPADownscaleDelay = 15 * time.Minute - // DefaultHPASyncPeriod is a constant for the default HPA sync period for a Shoot cluster. - DefaultHPASyncPeriod = 30 * time.Second - // DefaultHPATolerance is a constant for the default HPA tolerance for a Shoot cluster. - DefaultHPATolerance = 0.1 - // DefaultHPAUpscaleDelay is for the default HPA upscale delay for a Shoot cluster. - DefaultHPAUpscaleDelay = 1 * time.Minute - // DefaultDownscaleStabilization is the default HPA downscale stabilization window for a Shoot cluster - DefaultDownscaleStabilization = 5 * time.Minute - // DefaultInitialReadinessDelay is for the default HPA ReadinessDelay value in the Shoot cluster - DefaultInitialReadinessDelay = 30 * time.Second - // DefaultCPUInitializationPeriod is the for the default value of the CPUInitializationPeriod in the Shoot cluster - DefaultCPUInitializationPeriod = 5 * time.Minute -) - // KubeSchedulerConfig contains configuration settings for the kube-scheduler. type KubeSchedulerConfig struct { KubernetesConfig @@ -670,7 +658,6 @@ type KubeletConfigReserved struct { // EphemeralStorage is the reserved ephemeral-storage. EphemeralStorage *resource.Quantity // PID is the reserved process-ids. - // To reserve PID, the SupportNodePidsLimit feature gate must be enabled in Kubernetes versions < 1.15. PID *resource.Quantity } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go index ca925c3c3..a634a4dea 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/constants/types_constants.go @@ -128,11 +128,6 @@ const ( // GardenRoleOptionalAddon is the value of the GardenRole key indicating type 'optional-addon'. GardenRoleOptionalAddon = "optional-addon" - // DeprecatedShootUID is an annotation key for the shoot namespace in the seed cluster, - // which value will be the value of `shoot.status.uid` - // - // Deprecated: Use the `Cluster` resource or the annotation key from the new API group `ShootUID`. - DeprecatedShootUID = "shoot.garden.sapcloud.io/uid" // ShootUID is an annotation key for the shoot namespace in the seed cluster, // which value will be the value of `shoot.status.uid` ShootUID = "shoot.gardener.cloud/uid" diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go index 349bb6a9a..2edc94545 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/defaults.go @@ -208,16 +208,11 @@ func SetDefaults_Shoot(obj *Shoot) { kubeReservedMemory = resource.MustParse("1Gi") kubeReservedCPU = resource.MustParse("80m") kubeReservedPID = resource.MustParse("20k") - - k8sVersionGreaterEqual115, _ = versionutils.CompareVersions(obj.Spec.Kubernetes.Version, ">=", "1.15") ) if obj.Spec.Kubernetes.Kubelet.KubeReserved == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved = &KubeletConfigReserved{Memory: &kubeReservedMemory, CPU: &kubeReservedCPU} - - if k8sVersionGreaterEqual115 { - obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID - } + obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID } else { if obj.Spec.Kubernetes.Kubelet.KubeReserved.Memory == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.Memory = &kubeReservedMemory @@ -225,7 +220,7 @@ func SetDefaults_Shoot(obj *Shoot) { if obj.Spec.Kubernetes.Kubelet.KubeReserved.CPU == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.CPU = &kubeReservedCPU } - if obj.Spec.Kubernetes.Kubelet.KubeReserved.PID == nil && k8sVersionGreaterEqual115 { + if obj.Spec.Kubernetes.Kubelet.KubeReserved.PID == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID } } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go index 5ddc5f21b..5707e0115 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.pb.go @@ -3443,10 +3443,38 @@ func (m *Shoot) XXX_DiscardUnknown() { var xxx_messageInfo_Shoot proto.InternalMessageInfo +func (m *ShootAdvertisedAddress) Reset() { *m = ShootAdvertisedAddress{} } +func (*ShootAdvertisedAddress) ProtoMessage() {} +func (*ShootAdvertisedAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_f1caaec5647a9dbf, []int{121} +} +func (m *ShootAdvertisedAddress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShootAdvertisedAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ShootAdvertisedAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShootAdvertisedAddress.Merge(m, src) +} +func (m *ShootAdvertisedAddress) XXX_Size() int { + return m.Size() +} +func (m *ShootAdvertisedAddress) XXX_DiscardUnknown() { + xxx_messageInfo_ShootAdvertisedAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_ShootAdvertisedAddress proto.InternalMessageInfo + func (m *ShootList) Reset() { *m = ShootList{} } func (*ShootList) ProtoMessage() {} func (*ShootList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{121} + return fileDescriptor_f1caaec5647a9dbf, []int{122} } func (m *ShootList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3474,7 +3502,7 @@ var xxx_messageInfo_ShootList proto.InternalMessageInfo func (m *ShootMachineImage) Reset() { *m = ShootMachineImage{} } func (*ShootMachineImage) ProtoMessage() {} func (*ShootMachineImage) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{122} + return fileDescriptor_f1caaec5647a9dbf, []int{123} } func (m *ShootMachineImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3530,7 @@ var xxx_messageInfo_ShootMachineImage proto.InternalMessageInfo func (m *ShootNetworks) Reset() { *m = ShootNetworks{} } func (*ShootNetworks) ProtoMessage() {} func (*ShootNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{123} + return fileDescriptor_f1caaec5647a9dbf, []int{124} } func (m *ShootNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3530,7 +3558,7 @@ var xxx_messageInfo_ShootNetworks proto.InternalMessageInfo func (m *ShootSpec) Reset() { *m = ShootSpec{} } func (*ShootSpec) ProtoMessage() {} func (*ShootSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{124} + return fileDescriptor_f1caaec5647a9dbf, []int{125} } func (m *ShootSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3558,7 +3586,7 @@ var xxx_messageInfo_ShootSpec proto.InternalMessageInfo func (m *ShootState) Reset() { *m = ShootState{} } func (*ShootState) ProtoMessage() {} func (*ShootState) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{125} + return fileDescriptor_f1caaec5647a9dbf, []int{126} } func (m *ShootState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3586,7 +3614,7 @@ var xxx_messageInfo_ShootState proto.InternalMessageInfo func (m *ShootStateList) Reset() { *m = ShootStateList{} } func (*ShootStateList) ProtoMessage() {} func (*ShootStateList) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{126} + return fileDescriptor_f1caaec5647a9dbf, []int{127} } func (m *ShootStateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3614,7 +3642,7 @@ var xxx_messageInfo_ShootStateList proto.InternalMessageInfo func (m *ShootStateSpec) Reset() { *m = ShootStateSpec{} } func (*ShootStateSpec) ProtoMessage() {} func (*ShootStateSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{127} + return fileDescriptor_f1caaec5647a9dbf, []int{128} } func (m *ShootStateSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3642,7 +3670,7 @@ var xxx_messageInfo_ShootStateSpec proto.InternalMessageInfo func (m *ShootStatus) Reset() { *m = ShootStatus{} } func (*ShootStatus) ProtoMessage() {} func (*ShootStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{128} + return fileDescriptor_f1caaec5647a9dbf, []int{129} } func (m *ShootStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3670,7 +3698,7 @@ var xxx_messageInfo_ShootStatus proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{129} + return fileDescriptor_f1caaec5647a9dbf, []int{130} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3698,7 +3726,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *VerticalPodAutoscaler) Reset() { *m = VerticalPodAutoscaler{} } func (*VerticalPodAutoscaler) ProtoMessage() {} func (*VerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{130} + return fileDescriptor_f1caaec5647a9dbf, []int{131} } func (m *VerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3726,7 +3754,7 @@ var xxx_messageInfo_VerticalPodAutoscaler proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{131} + return fileDescriptor_f1caaec5647a9dbf, []int{132} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3754,7 +3782,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeType) Reset() { *m = VolumeType{} } func (*VolumeType) ProtoMessage() {} func (*VolumeType) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{132} + return fileDescriptor_f1caaec5647a9dbf, []int{133} } func (m *VolumeType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3782,7 +3810,7 @@ var xxx_messageInfo_VolumeType proto.InternalMessageInfo func (m *WatchCacheSizes) Reset() { *m = WatchCacheSizes{} } func (*WatchCacheSizes) ProtoMessage() {} func (*WatchCacheSizes) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{133} + return fileDescriptor_f1caaec5647a9dbf, []int{134} } func (m *WatchCacheSizes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3810,7 +3838,7 @@ var xxx_messageInfo_WatchCacheSizes proto.InternalMessageInfo func (m *Worker) Reset() { *m = Worker{} } func (*Worker) ProtoMessage() {} func (*Worker) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{134} + return fileDescriptor_f1caaec5647a9dbf, []int{135} } func (m *Worker) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3838,7 +3866,7 @@ var xxx_messageInfo_Worker proto.InternalMessageInfo func (m *WorkerKubernetes) Reset() { *m = WorkerKubernetes{} } func (*WorkerKubernetes) ProtoMessage() {} func (*WorkerKubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{135} + return fileDescriptor_f1caaec5647a9dbf, []int{136} } func (m *WorkerKubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3866,7 +3894,7 @@ var xxx_messageInfo_WorkerKubernetes proto.InternalMessageInfo func (m *WorkerSystemComponents) Reset() { *m = WorkerSystemComponents{} } func (*WorkerSystemComponents) ProtoMessage() {} func (*WorkerSystemComponents) Descriptor() ([]byte, []int) { - return fileDescriptor_f1caaec5647a9dbf, []int{136} + return fileDescriptor_f1caaec5647a9dbf, []int{137} } func (m *WorkerSystemComponents) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4021,6 +4049,7 @@ func init() { proto.RegisterType((*SeedVolumeProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.SeedVolumeProvider") proto.RegisterType((*ServiceAccountConfig)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ServiceAccountConfig") proto.RegisterType((*Shoot)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.Shoot") + proto.RegisterType((*ShootAdvertisedAddress)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ShootAdvertisedAddress") proto.RegisterType((*ShootList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ShootList") proto.RegisterType((*ShootMachineImage)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ShootMachineImage") proto.RegisterType((*ShootNetworks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1alpha1.ShootNetworks") @@ -4046,573 +4075,574 @@ func init() { } var fileDescriptor_f1caaec5647a9dbf = []byte{ - // 9050 bytes of a gzipped FileDescriptorProto + // 9064 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0xf1, 0xb5, 0x78, 0x0b, 0xe0, 0x80, 0xbe, 0x0f, 0x82, 0x47, 0xf2, 0x96, 0x1a, - 0x89, 0x0a, 0x19, 0xc9, 0x38, 0x53, 0x94, 0x2c, 0x91, 0x22, 0x29, 0x62, 0x77, 0x71, 0x77, 0xab, - 0x3b, 0xdc, 0x2d, 0x7b, 0x0f, 0xa4, 0x3e, 0x52, 0xa6, 0x06, 0x33, 0x8d, 0xc5, 0x10, 0xb3, 0x33, - 0xcb, 0x99, 0x59, 0x1c, 0x70, 0x74, 0x22, 0x45, 0xb6, 0xe5, 0x24, 0x4e, 0x5c, 0x71, 0x59, 0x29, - 0xa5, 0x22, 0x95, 0x6d, 0xb9, 0x52, 0x29, 0xa7, 0xf2, 0x21, 0x97, 0x2b, 0x56, 0xca, 0x95, 0x94, - 0x7f, 0xd8, 0x3f, 0xac, 0xc8, 0x29, 0x47, 0x95, 0x72, 0x5c, 0x8a, 0xcb, 0x81, 0x22, 0xa4, 0x2a, - 0xdf, 0xc9, 0x9f, 0x54, 0xfe, 0x5c, 0x39, 0x29, 0x57, 0x7f, 0x4c, 0x4f, 0xcf, 0xec, 0x0c, 0xb0, - 0x98, 0xc1, 0x81, 0xe4, 0x2f, 0x60, 0xfb, 0x75, 0xbf, 0xd7, 0xd3, 0xfd, 0xfa, 0xf5, 0x7b, 0xaf, - 0x5f, 0xbf, 0x86, 0x66, 0xcf, 0x0e, 0xb7, 0x87, 0x9b, 0x2b, 0xa6, 0xd7, 0xbf, 0xda, 0x33, 0x7c, - 0x8b, 0xb8, 0xc4, 0x8f, 0xff, 0x19, 0xec, 0xf4, 0xae, 0x1a, 0x03, 0x3b, 0xb8, 0x6a, 0x7a, 0x3e, - 0xb9, 0xba, 0xfb, 0xac, 0xe1, 0x0c, 0xb6, 0x8d, 0x67, 0xaf, 0xf6, 0x28, 0xd0, 0x08, 0x89, 0xb5, - 0x32, 0xf0, 0xbd, 0xd0, 0x43, 0xcf, 0xc5, 0x48, 0x56, 0xa2, 0xb6, 0xf1, 0x3f, 0x83, 0x9d, 0xde, - 0x0a, 0x45, 0xb2, 0x42, 0x91, 0xac, 0x44, 0x48, 0x2e, 0x37, 0x4e, 0x44, 0x79, 0x93, 0x84, 0xa3, - 0x84, 0x2f, 0xff, 0x98, 0x8a, 0xc3, 0xeb, 0x79, 0x57, 0x59, 0xf1, 0xe6, 0x70, 0x8b, 0xfd, 0x62, - 0x3f, 0xd8, 0x7f, 0xa2, 0xfa, 0x33, 0x3b, 0x9f, 0x0c, 0x56, 0x6c, 0x8f, 0x22, 0xbe, 0x6a, 0x0c, - 0x43, 0x2f, 0x30, 0x0d, 0xc7, 0x76, 0x7b, 0x57, 0x77, 0x47, 0x31, 0xeb, 0x4a, 0x55, 0xd1, 0x85, - 0x23, 0xeb, 0xf8, 0x9b, 0x86, 0x99, 0x55, 0xe7, 0x63, 0x71, 0x9d, 0xbe, 0x61, 0x6e, 0xdb, 0x2e, - 0xf1, 0xf7, 0xa3, 0x8f, 0xbb, 0xea, 0x93, 0xc0, 0x1b, 0xfa, 0x26, 0x39, 0x51, 0xab, 0xe0, 0x6a, - 0x9f, 0x84, 0x46, 0x16, 0xad, 0xab, 0x79, 0xad, 0xfc, 0xa1, 0x1b, 0xda, 0xfd, 0x51, 0x32, 0x3f, - 0x71, 0x5c, 0x83, 0xc0, 0xdc, 0x26, 0x7d, 0x63, 0xa4, 0xdd, 0x73, 0x79, 0xed, 0x86, 0xa1, 0xed, - 0x5c, 0xb5, 0xdd, 0x30, 0x08, 0xfd, 0x74, 0x23, 0xfd, 0xa3, 0x30, 0xb5, 0x6a, 0x59, 0x9e, 0x8b, - 0x9e, 0x81, 0x19, 0xe2, 0x1a, 0x9b, 0x0e, 0xb1, 0x96, 0xb5, 0x27, 0xb5, 0xa7, 0xab, 0x8d, 0x73, - 0xdf, 0x3d, 0xa8, 0xbf, 0xef, 0xf0, 0xa0, 0x3e, 0xb3, 0xc6, 0x8b, 0x71, 0x04, 0xd7, 0xbf, 0x5e, - 0x81, 0x69, 0xd6, 0x28, 0x40, 0xbf, 0xa4, 0xc1, 0xf9, 0x9d, 0xe1, 0x26, 0xf1, 0x5d, 0x12, 0x92, - 0xa0, 0x65, 0x04, 0xdb, 0x9b, 0x9e, 0xe1, 0x73, 0x14, 0xb5, 0x8f, 0xde, 0x58, 0x29, 0xc0, 0x82, - 0x2b, 0x37, 0x47, 0xf1, 0x35, 0x1e, 0x39, 0x3c, 0xa8, 0x9f, 0xcf, 0x00, 0xe0, 0x2c, 0xea, 0xe8, - 0x1e, 0xcc, 0xb9, 0x3d, 0xdb, 0xdd, 0x6b, 0xbb, 0x3d, 0x9f, 0x04, 0xc1, 0x72, 0x85, 0xf5, 0x66, - 0xb5, 0x50, 0x6f, 0x6e, 0x2b, 0x88, 0x1a, 0x8b, 0x87, 0x07, 0xf5, 0x39, 0xb5, 0x04, 0x27, 0x08, - 0xe9, 0x5f, 0xd5, 0xe0, 0xdc, 0xaa, 0xd5, 0xb7, 0x83, 0xc0, 0xf6, 0xdc, 0x8e, 0x33, 0xec, 0xd9, - 0x2e, 0x7a, 0x12, 0x26, 0x5d, 0xa3, 0x4f, 0xd8, 0x90, 0xcc, 0x36, 0xe6, 0xc4, 0xa8, 0x4e, 0xde, - 0x36, 0xfa, 0x04, 0x33, 0x08, 0x7a, 0x15, 0xa6, 0x4d, 0xcf, 0xdd, 0xb2, 0x7b, 0xa2, 0xa3, 0x3f, - 0xb6, 0xc2, 0x67, 0x72, 0x45, 0x9d, 0x49, 0xd6, 0x3f, 0xc1, 0x01, 0x2b, 0xd8, 0xb8, 0xb7, 0xb6, - 0x17, 0x12, 0x97, 0x92, 0x69, 0xc0, 0xe1, 0x41, 0x7d, 0xba, 0xc9, 0x10, 0x60, 0x81, 0x48, 0xbf, - 0x06, 0xd5, 0x55, 0x87, 0xf8, 0xa1, 0xed, 0xf6, 0xd0, 0x0b, 0xb0, 0x40, 0xfa, 0x86, 0xed, 0x60, - 0x62, 0x12, 0x7b, 0x97, 0xf8, 0xc1, 0xb2, 0xf6, 0xe4, 0xc4, 0xd3, 0xb3, 0x0d, 0x74, 0x78, 0x50, - 0x5f, 0x58, 0x4b, 0x40, 0x70, 0xaa, 0xa6, 0xfe, 0x15, 0x0d, 0x6a, 0xab, 0x43, 0xcb, 0x0e, 0x39, - 0x7e, 0x14, 0x40, 0xcd, 0xa0, 0x3f, 0x3b, 0x9e, 0x63, 0x9b, 0xfb, 0x62, 0x9a, 0x5f, 0x29, 0x34, - 0xb0, 0xab, 0x31, 0x9e, 0xc6, 0xb9, 0xc3, 0x83, 0x7a, 0x4d, 0x29, 0xc0, 0x2a, 0x15, 0x7d, 0x1b, - 0x54, 0x18, 0xfa, 0x1c, 0xcc, 0xf1, 0xaf, 0x5c, 0x37, 0x06, 0x98, 0x6c, 0x89, 0x4e, 0x7c, 0x40, - 0x19, 0xb4, 0x88, 0xd2, 0xca, 0x9d, 0xcd, 0x37, 0x89, 0x19, 0x62, 0xb2, 0x45, 0x7c, 0xe2, 0x9a, - 0x84, 0xcf, 0x5f, 0x53, 0x69, 0x8c, 0x13, 0xa8, 0xf4, 0x1f, 0x6a, 0xb0, 0xb8, 0xba, 0x6b, 0xd8, - 0x8e, 0xb1, 0x69, 0x3b, 0x76, 0xb8, 0xff, 0x79, 0xcf, 0x25, 0x63, 0x4c, 0xe0, 0x06, 0x3c, 0x32, - 0x74, 0x0d, 0xde, 0xce, 0x21, 0xeb, 0x7c, 0xca, 0xee, 0xee, 0x0f, 0x08, 0x65, 0x3d, 0x3a, 0xd4, - 0x8f, 0x1d, 0x1e, 0xd4, 0x1f, 0xd9, 0xc8, 0xae, 0x82, 0xf3, 0xda, 0x22, 0x0c, 0x97, 0x14, 0xd0, - 0x6b, 0x9e, 0x33, 0xec, 0x0b, 0xac, 0x13, 0x0c, 0xeb, 0xe5, 0xc3, 0x83, 0xfa, 0xa5, 0x8d, 0xcc, - 0x1a, 0x38, 0xa7, 0xa5, 0xfe, 0xbd, 0x0a, 0xcc, 0x35, 0x0c, 0x73, 0x67, 0x38, 0x68, 0x0c, 0xcd, - 0x1d, 0x12, 0xa2, 0x2f, 0x42, 0x95, 0x4a, 0x2e, 0xcb, 0x08, 0x0d, 0x31, 0x92, 0x3f, 0x9e, 0xcb, - 0x7e, 0x6c, 0x16, 0x69, 0xed, 0x78, 0x6c, 0xd7, 0x49, 0x68, 0x34, 0x90, 0x18, 0x13, 0x88, 0xcb, - 0xb0, 0xc4, 0x8a, 0x7a, 0x30, 0x19, 0x0c, 0x88, 0x29, 0x98, 0x7b, 0xad, 0x10, 0xb3, 0xa8, 0x5d, - 0xee, 0x0e, 0x88, 0x19, 0x4f, 0x03, 0xfd, 0x85, 0x19, 0x01, 0xe4, 0xc1, 0x74, 0x10, 0x1a, 0xe1, - 0x90, 0x8e, 0x0f, 0x25, 0x75, 0xbd, 0x3c, 0x29, 0x86, 0xae, 0xb1, 0x20, 0x88, 0x4d, 0xf3, 0xdf, - 0x58, 0x90, 0xd1, 0x7f, 0xa0, 0xc1, 0xa2, 0x5a, 0xfd, 0x96, 0x1d, 0x84, 0xe8, 0x2f, 0x8d, 0x0c, - 0xe8, 0xca, 0x78, 0x03, 0x4a, 0x5b, 0xb3, 0xe1, 0x5c, 0x14, 0xe4, 0xaa, 0x51, 0x89, 0x32, 0x98, - 0x5b, 0x30, 0x65, 0x87, 0xa4, 0xcf, 0x19, 0xab, 0xa8, 0x4c, 0x53, 0xfb, 0xdc, 0x98, 0x17, 0xd4, - 0xa6, 0xda, 0x14, 0x2f, 0xe6, 0xe8, 0xf5, 0x2f, 0xc2, 0x05, 0xb5, 0x56, 0xc7, 0xf7, 0x76, 0x6d, - 0x8b, 0xf8, 0x74, 0x31, 0x84, 0xfb, 0x83, 0x91, 0xc5, 0x40, 0x99, 0x0b, 0x33, 0x08, 0xfa, 0x10, - 0x4c, 0xfb, 0xa4, 0x67, 0x7b, 0x2e, 0x9b, 0xf0, 0xd9, 0x78, 0xf0, 0x30, 0x2b, 0xc5, 0x02, 0xaa, - 0xff, 0xf7, 0x4a, 0x72, 0xf0, 0xe8, 0x44, 0xa2, 0x7b, 0x50, 0x1d, 0x08, 0x52, 0x62, 0xf0, 0xda, - 0xa5, 0xbf, 0x30, 0xea, 0x7b, 0x3c, 0xae, 0x51, 0x09, 0x96, 0xc4, 0x90, 0x0d, 0x0b, 0xd1, 0xff, - 0xcd, 0x12, 0xb2, 0x98, 0xc9, 0xd4, 0x4e, 0x02, 0x11, 0x4e, 0x21, 0x46, 0x77, 0x61, 0x36, 0x20, - 0xa6, 0x4f, 0xa8, 0x5c, 0x12, 0x9c, 0x9a, 0x29, 0xbc, 0xba, 0x51, 0x25, 0x21, 0xbc, 0x96, 0x44, - 0xf7, 0x67, 0x25, 0x00, 0xc7, 0x88, 0xd0, 0xe3, 0x30, 0x19, 0x10, 0x62, 0x2d, 0x4f, 0xb2, 0x41, - 0xaf, 0xb2, 0xa5, 0x41, 0x88, 0x85, 0x59, 0xa9, 0xfe, 0x6b, 0x93, 0x80, 0x46, 0x19, 0x5b, 0xfd, - 0x6a, 0x5e, 0x22, 0x06, 0xbd, 0xcc, 0x57, 0x8b, 0x35, 0x92, 0x42, 0x8c, 0xde, 0x86, 0x79, 0xc7, - 0x08, 0xc2, 0x3b, 0x03, 0xaa, 0x7e, 0x44, 0xdc, 0x51, 0xfb, 0x68, 0xa3, 0xd0, 0xf4, 0xde, 0x52, - 0x31, 0x35, 0x96, 0x0e, 0x0f, 0xea, 0xf3, 0x89, 0x22, 0x9c, 0xa4, 0x85, 0x76, 0x60, 0x96, 0x16, - 0xac, 0xf9, 0xbe, 0xe7, 0x8b, 0x21, 0x7f, 0xb9, 0x30, 0x61, 0x86, 0xa5, 0x31, 0x4f, 0x67, 0x42, - 0xfe, 0xc4, 0x31, 0x7e, 0xf4, 0x19, 0x40, 0xde, 0x66, 0x40, 0xfc, 0x5d, 0x62, 0x5d, 0xe7, 0xda, - 0x16, 0xfd, 0x5c, 0x3a, 0x2f, 0x13, 0x8d, 0xcb, 0x62, 0x0e, 0xd1, 0x9d, 0x91, 0x1a, 0x38, 0xa3, - 0x15, 0xda, 0x01, 0x24, 0x35, 0x36, 0x39, 0xed, 0xcb, 0x53, 0xe3, 0x33, 0xcd, 0x25, 0x4a, 0xec, - 0xfa, 0x08, 0x0a, 0x9c, 0x81, 0x56, 0xff, 0xfd, 0x0a, 0xd4, 0x38, 0x93, 0xac, 0xb9, 0xa1, 0xbf, - 0x7f, 0x06, 0x5b, 0xc3, 0x56, 0x62, 0x6b, 0x68, 0x95, 0x58, 0xea, 0xac, 0xc7, 0xb9, 0x3b, 0x83, - 0x9b, 0xda, 0x19, 0xae, 0x95, 0xa6, 0x74, 0xf4, 0xc6, 0xf0, 0xc7, 0x1a, 0x9c, 0x53, 0x6a, 0x9f, - 0xc1, 0xbe, 0x40, 0x92, 0xfb, 0xc2, 0x2b, 0x65, 0x3f, 0x30, 0x67, 0x5b, 0x30, 0x13, 0xdf, 0xc5, - 0x44, 0xf6, 0x47, 0x01, 0x36, 0x99, 0x4c, 0xb9, 0x1d, 0x2b, 0x49, 0x72, 0xd6, 0x1b, 0x12, 0x82, - 0x95, 0x5a, 0x52, 0x58, 0x55, 0x32, 0x85, 0xd5, 0xbf, 0xaa, 0xc0, 0xd2, 0xc8, 0x58, 0x8f, 0x0a, - 0x10, 0xed, 0x9d, 0x12, 0x20, 0x95, 0x77, 0x44, 0x80, 0x4c, 0x14, 0x11, 0x20, 0xfa, 0xef, 0x69, - 0x30, 0xd1, 0xc4, 0x6d, 0xf4, 0xe1, 0x84, 0x12, 0xfb, 0x88, 0xaa, 0xc4, 0x3e, 0x38, 0xa8, 0xcf, - 0x34, 0x71, 0x5b, 0xd1, 0x67, 0x7f, 0x41, 0x83, 0x25, 0xd3, 0x73, 0x43, 0x83, 0x72, 0x24, 0xe6, - 0x12, 0x3f, 0xe2, 0xac, 0x62, 0xfa, 0x5b, 0x33, 0x85, 0xad, 0xf1, 0xa8, 0xe8, 0xc1, 0x52, 0x1a, - 0x12, 0xe0, 0x51, 0xd2, 0xfa, 0x06, 0xcc, 0x36, 0x1d, 0x6f, 0x68, 0xb5, 0xdd, 0x2d, 0xef, 0x14, - 0x55, 0x90, 0x7f, 0xaf, 0xc1, 0x1c, 0xc3, 0xdb, 0xf1, 0xbd, 0x2d, 0xdb, 0x21, 0xef, 0x11, 0x65, - 0x58, 0xed, 0x72, 0x9e, 0xc8, 0x63, 0xba, 0xa9, 0x5a, 0xf1, 0xbd, 0xa2, 0x9b, 0xaa, 0x7d, 0xce, - 0x11, 0x42, 0xdf, 0x98, 0x49, 0x7e, 0x1a, 0x13, 0x43, 0x4f, 0x43, 0xd5, 0x34, 0x1a, 0x43, 0xd7, - 0x72, 0x24, 0x67, 0xd0, 0x6e, 0x36, 0x57, 0x79, 0x19, 0x96, 0x50, 0xf4, 0x36, 0x40, 0xec, 0x34, - 0x10, 0x13, 0x71, 0xbd, 0xa4, 0xa7, 0xa2, 0x4b, 0x42, 0x6a, 0x6b, 0x07, 0xf1, 0xec, 0xc7, 0x30, - 0xac, 0x90, 0x43, 0x7f, 0x05, 0xe6, 0xc5, 0x30, 0xb7, 0xfb, 0x46, 0x4f, 0x98, 0x72, 0x45, 0xc7, - 0x6a, 0x5d, 0xc1, 0xd4, 0xb8, 0x28, 0x28, 0xcf, 0xab, 0xa5, 0x01, 0x4e, 0x92, 0x43, 0xf7, 0x61, - 0xae, 0xaf, 0xda, 0xa7, 0x93, 0x25, 0xb6, 0x0b, 0xc5, 0x58, 0x6d, 0x5c, 0x10, 0xd4, 0xe7, 0x12, - 0xa6, 0x6d, 0x82, 0x56, 0x86, 0x8e, 0x3d, 0xf5, 0xb0, 0x74, 0xec, 0x2d, 0x98, 0xe1, 0x6b, 0x3c, - 0x58, 0x9e, 0x66, 0x5f, 0xf8, 0xa9, 0x42, 0x5f, 0xc8, 0xe5, 0x45, 0xec, 0x0a, 0xe3, 0xbf, 0x03, - 0x1c, 0x21, 0x47, 0xf7, 0x60, 0x8e, 0x6e, 0x59, 0x5d, 0xe2, 0x10, 0x33, 0xf4, 0xfc, 0xe5, 0x99, - 0x12, 0x9e, 0xa6, 0xae, 0x82, 0x88, 0x7b, 0x2a, 0xd4, 0x12, 0x9c, 0x20, 0x24, 0x85, 0x60, 0x35, - 0x57, 0x08, 0xee, 0x42, 0x6d, 0x57, 0x71, 0x19, 0xcc, 0xb2, 0x61, 0xf8, 0x74, 0xa1, 0x9e, 0xc5, - 0x0e, 0x84, 0xc6, 0x79, 0x41, 0xa9, 0xa6, 0x3a, 0x1b, 0x54, 0x42, 0xfa, 0xcf, 0x4d, 0xc3, 0x52, - 0xd3, 0x19, 0x06, 0x21, 0xf1, 0x57, 0x85, 0x37, 0x97, 0xf8, 0xe8, 0x2b, 0x1a, 0x5c, 0x62, 0xff, - 0xb6, 0xbc, 0x7b, 0x6e, 0x8b, 0x38, 0xc6, 0xfe, 0xea, 0x16, 0xad, 0x61, 0x59, 0x27, 0x13, 0x44, - 0xad, 0xa1, 0xd8, 0xb3, 0x99, 0xf3, 0xa3, 0x9b, 0x89, 0x11, 0xe7, 0x50, 0x42, 0x3f, 0xaf, 0xc1, - 0xa3, 0x19, 0xa0, 0x16, 0x71, 0x48, 0x48, 0x84, 0x24, 0x38, 0x69, 0x3f, 0x9e, 0x38, 0x3c, 0xa8, - 0x3f, 0xda, 0xcd, 0x43, 0x8a, 0xf3, 0xe9, 0xd1, 0x5d, 0xf6, 0x72, 0x06, 0xf4, 0x9a, 0x61, 0x3b, - 0x43, 0x9f, 0x08, 0x4d, 0xf5, 0xa4, 0xdd, 0xb9, 0x72, 0x78, 0x50, 0xbf, 0xdc, 0xcd, 0xc5, 0x8a, - 0x8f, 0xa0, 0x88, 0xbe, 0x04, 0x17, 0x25, 0x74, 0xc3, 0x75, 0x09, 0xb1, 0x88, 0x75, 0xd7, 0xee, - 0x13, 0x66, 0xbb, 0x9c, 0xbc, 0x2b, 0x8f, 0x1e, 0x1e, 0xd4, 0x2f, 0x76, 0xb3, 0x10, 0xe2, 0x6c, - 0x3a, 0xa8, 0x07, 0x4f, 0xc4, 0x80, 0xd0, 0x76, 0xec, 0xfb, 0x0c, 0xd3, 0xdd, 0x6d, 0x9f, 0x04, - 0xdb, 0x9e, 0x63, 0x31, 0x79, 0xa1, 0x35, 0xde, 0x7f, 0x78, 0x50, 0x7f, 0xa2, 0x7b, 0x54, 0x45, - 0x7c, 0x34, 0x1e, 0x64, 0xc1, 0x5c, 0x60, 0x1a, 0x6e, 0xdb, 0x0d, 0x89, 0xbf, 0x6b, 0x38, 0xcb, - 0xd3, 0x85, 0x3e, 0x90, 0xaf, 0x51, 0x05, 0x0f, 0x4e, 0x60, 0xd5, 0xff, 0x87, 0x06, 0x35, 0xb1, - 0x12, 0x98, 0xe2, 0x62, 0xc2, 0x94, 0x49, 0xb7, 0x2d, 0xc1, 0xf1, 0x2f, 0x17, 0xdf, 0x1f, 0x29, - 0xba, 0x78, 0x73, 0x64, 0x45, 0x98, 0xe3, 0x46, 0xf7, 0x32, 0x76, 0xb7, 0x66, 0xc9, 0xdd, 0x8d, - 0x91, 0x3b, 0x66, 0x67, 0xd3, 0x0f, 0x26, 0x60, 0xb6, 0xe9, 0xb9, 0x96, 0xcd, 0x14, 0xe6, 0x67, - 0x13, 0x4a, 0xda, 0x13, 0xaa, 0x7c, 0x7a, 0x70, 0x50, 0x9f, 0x97, 0x15, 0x15, 0x81, 0xf5, 0xbc, - 0x34, 0xd2, 0xb8, 0xd6, 0xf6, 0xfe, 0xa4, 0x71, 0xf5, 0xe0, 0xa0, 0x7e, 0x4e, 0x36, 0x4b, 0xda, - 0x5b, 0x68, 0x17, 0x10, 0x55, 0x9f, 0xef, 0xfa, 0x86, 0x1b, 0x70, 0xb4, 0x94, 0x6d, 0xf9, 0x0a, - 0xfa, 0x8b, 0xe3, 0xcd, 0x2a, 0x6d, 0x11, 0x6b, 0xd7, 0xb7, 0x46, 0xb0, 0xe1, 0x0c, 0x0a, 0xe8, - 0x4d, 0x58, 0xa0, 0xa5, 0x1b, 0x03, 0xcb, 0x08, 0x89, 0xb2, 0x54, 0x4e, 0x42, 0xf3, 0x92, 0xa0, - 0xb9, 0x70, 0x2b, 0x81, 0x09, 0xa7, 0x30, 0x73, 0xa5, 0xd6, 0x08, 0x3c, 0x97, 0xad, 0x82, 0x84, - 0x52, 0x4b, 0x4b, 0xb1, 0x80, 0xa2, 0x67, 0x60, 0xa6, 0x4f, 0x82, 0xc0, 0xe8, 0x11, 0xc6, 0xd6, - 0xb3, 0xf1, 0xee, 0xb5, 0xce, 0x8b, 0x71, 0x04, 0x47, 0x1f, 0x81, 0x29, 0xd3, 0xb3, 0x48, 0xb0, - 0x3c, 0xc3, 0xfc, 0xc9, 0x97, 0x18, 0x33, 0xd1, 0x82, 0x07, 0x07, 0xf5, 0x59, 0x66, 0x8b, 0xd0, - 0x5f, 0x98, 0x57, 0xd2, 0x7f, 0x85, 0x6a, 0x94, 0x29, 0xd5, 0x3c, 0xcf, 0x39, 0xce, 0xa7, 0x95, - 0x19, 0x13, 0x67, 0xe7, 0x59, 0xd3, 0xbf, 0x5f, 0x81, 0x0b, 0xb4, 0x87, 0xbe, 0xe7, 0x38, 0x54, - 0xcc, 0x0e, 0x1c, 0x6f, 0xbf, 0x4f, 0xdc, 0x70, 0x0c, 0x93, 0xe1, 0x0c, 0xfd, 0x7f, 0xaf, 0xc0, - 0xf4, 0x80, 0x1f, 0x9f, 0x4c, 0xb0, 0xee, 0x3c, 0x4d, 0x27, 0x91, 0x9f, 0x6d, 0x3c, 0x38, 0xa8, - 0x5f, 0xce, 0xfa, 0x00, 0x71, 0x2a, 0x22, 0xda, 0x21, 0x3b, 0xa5, 0x75, 0x70, 0xa6, 0x7b, 0x6e, - 0x4c, 0x55, 0xde, 0xd8, 0x24, 0xce, 0xb8, 0x7a, 0x86, 0xfe, 0x5f, 0x2b, 0x70, 0x29, 0xee, 0x51, - 0xdb, 0x0d, 0x42, 0xc3, 0x71, 0xb8, 0x4d, 0xfc, 0xf0, 0x8d, 0xa5, 0xb7, 0x12, 0xc6, 0xd2, 0x9d, - 0xc2, 0x96, 0xe7, 0x68, 0xe7, 0x73, 0x3d, 0x45, 0xfb, 0x29, 0x4f, 0xd1, 0xab, 0xa7, 0x49, 0xf4, - 0x68, 0xa7, 0xd1, 0xff, 0xd4, 0xe0, 0x72, 0x76, 0xc3, 0x33, 0xb0, 0xdd, 0x06, 0x49, 0xdb, 0xed, - 0xe6, 0x29, 0x7e, 0x76, 0x8e, 0x15, 0xf7, 0x47, 0xb9, 0x9f, 0xcb, 0xec, 0xb9, 0x2d, 0x38, 0x47, - 0x95, 0xec, 0x20, 0x14, 0xce, 0x8d, 0x93, 0x1d, 0xf4, 0x45, 0x0e, 0x8e, 0x73, 0x38, 0x89, 0x03, - 0xa7, 0x91, 0xa2, 0xdb, 0x30, 0x43, 0x19, 0x9e, 0xe2, 0xaf, 0x8c, 0x8f, 0x5f, 0xca, 0xd4, 0x2e, - 0x6f, 0x8b, 0x23, 0x24, 0xfa, 0xff, 0xd3, 0xe0, 0xf1, 0xa3, 0xa6, 0x1f, 0xf9, 0x00, 0x66, 0xb4, - 0x8d, 0xf1, 0xa3, 0xd8, 0xc2, 0xaa, 0x40, 0x84, 0x26, 0x5e, 0x46, 0xb2, 0x28, 0xc0, 0x0a, 0x95, - 0x0c, 0x3f, 0x7f, 0xe5, 0x21, 0xf9, 0xf9, 0xf5, 0xff, 0xa5, 0xa9, 0x02, 0x43, 0x1d, 0xfe, 0xf7, - 0x9c, 0xc0, 0x50, 0x3b, 0x9f, 0xeb, 0x67, 0x49, 0xae, 0x5a, 0xb5, 0xc9, 0x7b, 0x6f, 0xd5, 0xaa, - 0xbd, 0xcf, 0x59, 0xb5, 0xbf, 0x58, 0xc9, 0xfb, 0x5c, 0xb6, 0x6a, 0xf7, 0x60, 0x36, 0x0a, 0x9f, - 0x89, 0x78, 0xfb, 0x7a, 0xe9, 0x4e, 0x71, 0x7c, 0xf1, 0xf9, 0x57, 0x54, 0x12, 0xe0, 0x98, 0x18, - 0xda, 0x07, 0xb0, 0xe4, 0x7e, 0x29, 0x18, 0xa0, 0x5d, 0x92, 0x74, 0xbc, 0x01, 0x37, 0x16, 0x28, - 0xcf, 0xc5, 0xbf, 0xb1, 0x42, 0x4c, 0xff, 0x8d, 0x0a, 0xa0, 0xd1, 0xfe, 0x52, 0xa5, 0x63, 0xc7, - 0x76, 0xad, 0xb4, 0xd2, 0x71, 0xd3, 0x76, 0x2d, 0xcc, 0x20, 0x52, 0x2d, 0xa9, 0xe4, 0xaa, 0x25, - 0x2f, 0xc1, 0xb9, 0x9e, 0xe3, 0x6d, 0x1a, 0x8e, 0xb3, 0x2f, 0xc2, 0x70, 0xd8, 0xbe, 0x54, 0x6d, - 0x9c, 0xa7, 0xc2, 0xed, 0x7a, 0x12, 0x84, 0xd3, 0x75, 0xd1, 0x00, 0x16, 0x7d, 0x62, 0x7a, 0xae, - 0x69, 0x3b, 0x4c, 0x89, 0xf4, 0x86, 0x61, 0x41, 0x63, 0xee, 0xc2, 0xe1, 0x41, 0x7d, 0x11, 0xa7, - 0x70, 0xe1, 0x11, 0xec, 0xe8, 0x29, 0x98, 0x19, 0xf8, 0x76, 0xdf, 0xf0, 0xf7, 0x99, 0x9a, 0x5a, - 0x6d, 0xd4, 0xa8, 0x94, 0xec, 0xf0, 0x22, 0x1c, 0xc1, 0xf4, 0x6f, 0x6a, 0x30, 0xd1, 0xba, 0xdd, - 0x45, 0x3a, 0x4c, 0x5b, 0x5e, 0xdf, 0xb0, 0x5d, 0x31, 0x4a, 0x2c, 0x96, 0xa5, 0xc5, 0x4a, 0xb0, - 0x80, 0xa0, 0xb7, 0x60, 0x36, 0x92, 0x31, 0xe5, 0x8e, 0x37, 0x5a, 0xb7, 0xbb, 0xf2, 0x2c, 0x58, - 0x32, 0x53, 0x54, 0x12, 0xe0, 0x98, 0x8a, 0x6e, 0xc0, 0x52, 0xeb, 0x76, 0xb7, 0xed, 0x9a, 0xce, - 0xd0, 0x22, 0x6b, 0x7b, 0xec, 0x0f, 0xfd, 0x34, 0x9b, 0x97, 0x88, 0x00, 0x1a, 0xf6, 0x69, 0xa2, - 0x12, 0x8e, 0x60, 0xb4, 0x1a, 0xe1, 0x2d, 0x44, 0xf0, 0x07, 0xab, 0x26, 0x90, 0xe0, 0x08, 0xa6, - 0xff, 0x49, 0x05, 0x6a, 0x4a, 0x87, 0x50, 0x1f, 0x66, 0xf8, 0xf7, 0x46, 0x67, 0xb0, 0xd7, 0x8a, - 0x7e, 0x63, 0xb2, 0xdb, 0x9c, 0x3c, 0x1f, 0xd2, 0x00, 0x47, 0x34, 0xd4, 0x79, 0xaa, 0xe4, 0xcf, - 0x13, 0x5a, 0x01, 0xe0, 0x47, 0xcc, 0xec, 0x70, 0x87, 0xeb, 0xab, 0x6c, 0x29, 0x74, 0x65, 0x29, - 0x56, 0x6a, 0xa0, 0xc7, 0x05, 0x47, 0x2b, 0xa7, 0xd0, 0x0a, 0x37, 0xf7, 0x60, 0xea, 0xbe, 0xe7, - 0x92, 0x40, 0xf8, 0xfd, 0x4e, 0xeb, 0x0b, 0x67, 0xa9, 0x94, 0xfa, 0x3c, 0x45, 0x8c, 0x39, 0x7e, - 0xfd, 0x5b, 0x1a, 0x40, 0xcb, 0x08, 0x0d, 0xee, 0xa4, 0x1a, 0x23, 0x82, 0xe7, 0xf1, 0xc4, 0x4a, - 0xac, 0x8e, 0x9c, 0x27, 0x4c, 0x06, 0xf6, 0xfd, 0xe8, 0xfb, 0xe5, 0x16, 0xc4, 0xb1, 0x77, 0xed, - 0xfb, 0x04, 0x33, 0x38, 0xfa, 0x30, 0xcc, 0x12, 0xd7, 0xf4, 0xf7, 0x07, 0xa1, 0x38, 0x88, 0xaf, - 0xf2, 0x53, 0x9e, 0xb5, 0xa8, 0x10, 0xc7, 0x70, 0x7d, 0x17, 0xaa, 0x6b, 0xae, 0x35, 0xf0, 0x6c, - 0x6e, 0x9f, 0x1c, 0xd3, 0xc1, 0x27, 0x60, 0x62, 0xe8, 0x3b, 0xa2, 0x7f, 0x35, 0x51, 0x61, 0x62, - 0x03, 0xdf, 0xc2, 0xb4, 0x9c, 0x1a, 0x7d, 0x83, 0xa1, 0x3f, 0xf0, 0x82, 0xa8, 0x93, 0x52, 0x41, - 0xe9, 0xf0, 0x62, 0x1c, 0xc1, 0xf5, 0x07, 0x1a, 0x2c, 0xae, 0xed, 0x0d, 0x6c, 0x9f, 0x85, 0x06, - 0x11, 0x9f, 0xee, 0xec, 0xb4, 0xfd, 0x2e, 0xff, 0x57, 0xf4, 0x41, 0xb6, 0x17, 0x35, 0x70, 0x04, - 0x47, 0x5b, 0xb0, 0x40, 0x58, 0x73, 0x2a, 0x17, 0x5a, 0x86, 0x74, 0x9c, 0x9d, 0xc4, 0xe6, 0xe5, - 0xa1, 0x67, 0x09, 0x2c, 0x38, 0x85, 0x15, 0x75, 0x61, 0xc1, 0x74, 0x8c, 0x20, 0xb0, 0xb7, 0x6c, - 0x33, 0x3e, 0x01, 0x9b, 0x6d, 0x7c, 0x98, 0xb6, 0x6d, 0x26, 0x20, 0x0f, 0x0e, 0xea, 0x17, 0x45, - 0x3f, 0x93, 0x00, 0x9c, 0x42, 0xa1, 0xff, 0xae, 0x06, 0xb3, 0x52, 0x9f, 0x79, 0x77, 0x99, 0x85, - 0x4f, 0x43, 0xd5, 0xb2, 0x03, 0x55, 0xc6, 0xb3, 0x03, 0x8c, 0x96, 0x28, 0xc3, 0x12, 0xaa, 0xff, - 0xeb, 0x0a, 0x5c, 0x92, 0xb8, 0xa3, 0xed, 0x86, 0xaa, 0x5f, 0xe3, 0xec, 0x39, 0x8f, 0x0b, 0x56, - 0x53, 0x38, 0x5d, 0x61, 0xb3, 0xa7, 0xd2, 0x7c, 0x54, 0xcb, 0xe2, 0x21, 0x74, 0x1b, 0xa6, 0xa8, - 0xd1, 0x12, 0xb9, 0x3b, 0x4e, 0x38, 0x1a, 0x6c, 0xbd, 0xb2, 0xfe, 0x62, 0x8e, 0x06, 0xbd, 0xad, - 0xaa, 0x0d, 0x53, 0x4c, 0xc4, 0x7f, 0xe6, 0x64, 0xc2, 0x81, 0x45, 0x22, 0xaf, 0xd0, 0x2f, 0xb1, - 0xa2, 0x11, 0xc9, 0x88, 0x9c, 0xc9, 0xd2, 0x1c, 0xf4, 0x00, 0xaa, 0xd7, 0x05, 0x5a, 0x74, 0x19, - 0x2a, 0x76, 0x34, 0x7a, 0x20, 0x5a, 0x55, 0xda, 0x2d, 0x5c, 0xb1, 0x2d, 0xb9, 0x48, 0x2b, 0xb9, - 0x8b, 0x54, 0x59, 0x45, 0x13, 0x47, 0xaf, 0x22, 0xfd, 0x1f, 0x69, 0x70, 0x21, 0xa2, 0x1a, 0xf5, - 0x8a, 0x4a, 0xac, 0x31, 0x44, 0xc1, 0xf1, 0x5a, 0xc3, 0x1d, 0x98, 0x64, 0x0a, 0xe7, 0x44, 0x91, - 0xd9, 0x91, 0x08, 0x69, 0x77, 0x30, 0x43, 0xa4, 0x7f, 0x5b, 0x83, 0xda, 0x0d, 0x7b, 0x93, 0xf8, - 0x2e, 0xd7, 0xe4, 0x9f, 0x4a, 0x07, 0x0b, 0xd7, 0xb2, 0x02, 0x85, 0xd1, 0x3e, 0xcc, 0x06, 0xe6, - 0x36, 0xb1, 0x86, 0x8e, 0x3c, 0x3e, 0x2e, 0x16, 0x12, 0xac, 0xd0, 0xee, 0x0a, 0x84, 0x4a, 0x38, - 0x54, 0x44, 0x02, 0xc7, 0xd4, 0xf4, 0xb7, 0xe1, 0x7c, 0x46, 0x23, 0x54, 0x67, 0x8c, 0xeb, 0x87, - 0x62, 0x78, 0x23, 0x4e, 0xf4, 0x43, 0xcc, 0xcb, 0xd1, 0xa3, 0x30, 0x41, 0xdc, 0x28, 0x30, 0x61, - 0x86, 0xca, 0xd8, 0x35, 0xd7, 0xc2, 0xb4, 0x8c, 0x2e, 0x50, 0xc7, 0x4b, 0x88, 0x22, 0xb6, 0x40, - 0x6f, 0x89, 0x32, 0x2c, 0xa1, 0xfa, 0xdf, 0x9c, 0x86, 0x27, 0x6e, 0x78, 0xbe, 0x7d, 0xdf, 0x73, - 0x43, 0xc3, 0xe9, 0x78, 0x56, 0x7c, 0x10, 0x22, 0x16, 0xfb, 0xcf, 0x6a, 0xf0, 0x88, 0x39, 0x18, + 0x75, 0x18, 0x67, 0xf1, 0xb5, 0x78, 0x0b, 0xe0, 0x80, 0xbe, 0x0f, 0x82, 0x47, 0xf2, 0x96, 0x1a, + 0x89, 0x0a, 0x19, 0xc9, 0x38, 0x53, 0x94, 0x2c, 0x91, 0x22, 0x29, 0x62, 0x77, 0x71, 0xc7, 0xd5, + 0x1d, 0xee, 0x96, 0xbd, 0x07, 0x52, 0x94, 0x52, 0xa6, 0x06, 0x33, 0x8d, 0xc5, 0x10, 0xb3, 0x33, + 0xcb, 0x99, 0x59, 0x1c, 0x70, 0x74, 0x22, 0x45, 0xb6, 0xe5, 0x24, 0xae, 0xb8, 0xe2, 0xb2, 0x53, + 0x4a, 0x59, 0x2a, 0xdb, 0x72, 0xa5, 0x52, 0x4e, 0xe5, 0x43, 0x8e, 0x2b, 0x56, 0xca, 0x49, 0xca, + 0x3f, 0xec, 0x1f, 0x56, 0xe4, 0x94, 0xa3, 0x4a, 0x39, 0x2e, 0xc5, 0xe5, 0x40, 0x11, 0x52, 0x95, + 0xef, 0xe4, 0x4f, 0x2a, 0x7f, 0xae, 0x9c, 0x94, 0xab, 0x3f, 0xa6, 0xa7, 0x67, 0x76, 0x06, 0x58, + 0xcc, 0xe0, 0x40, 0xf2, 0x17, 0xb0, 0xfd, 0xba, 0xdf, 0xeb, 0xe9, 0x7e, 0xfd, 0xfa, 0xbd, 0xd7, + 0xaf, 0x5f, 0x43, 0xb3, 0x67, 0x87, 0xdb, 0xc3, 0xcd, 0x15, 0xd3, 0xeb, 0x5f, 0xed, 0x19, 0xbe, + 0x45, 0x5c, 0xe2, 0xc7, 0xff, 0x0c, 0x76, 0x7a, 0x57, 0x8d, 0x81, 0x1d, 0x5c, 0x35, 0x3d, 0x9f, + 0x5c, 0xdd, 0x7d, 0xc6, 0x70, 0x06, 0xdb, 0xc6, 0x33, 0x57, 0x7b, 0x14, 0x68, 0x84, 0xc4, 0x5a, + 0x19, 0xf8, 0x5e, 0xe8, 0xa1, 0x67, 0x63, 0x24, 0x2b, 0x51, 0xdb, 0xf8, 0x9f, 0xc1, 0x4e, 0x6f, + 0x85, 0x22, 0x59, 0xa1, 0x48, 0x56, 0x22, 0x24, 0x97, 0x1b, 0x27, 0xa2, 0xbc, 0x49, 0xc2, 0x51, + 0xc2, 0x97, 0x7f, 0x44, 0xc5, 0xe1, 0xf5, 0xbc, 0xab, 0xac, 0x78, 0x73, 0xb8, 0xc5, 0x7e, 0xb1, + 0x1f, 0xec, 0x3f, 0x51, 0xfd, 0xe9, 0x9d, 0x4f, 0x05, 0x2b, 0xb6, 0x47, 0x11, 0x5f, 0x35, 0x86, + 0xa1, 0x17, 0x98, 0x86, 0x63, 0xbb, 0xbd, 0xab, 0xbb, 0xa3, 0x98, 0x75, 0xa5, 0xaa, 0xe8, 0xc2, + 0x91, 0x75, 0xfc, 0x4d, 0xc3, 0xcc, 0xaa, 0xf3, 0xf1, 0xb8, 0x4e, 0xdf, 0x30, 0xb7, 0x6d, 0x97, + 0xf8, 0xfb, 0xd1, 0xc7, 0x5d, 0xf5, 0x49, 0xe0, 0x0d, 0x7d, 0x93, 0x9c, 0xa8, 0x55, 0x70, 0xb5, + 0x4f, 0x42, 0x23, 0x8b, 0xd6, 0xd5, 0xbc, 0x56, 0xfe, 0xd0, 0x0d, 0xed, 0xfe, 0x28, 0x99, 0x1f, + 0x3b, 0xae, 0x41, 0x60, 0x6e, 0x93, 0xbe, 0x31, 0xd2, 0xee, 0xd9, 0xbc, 0x76, 0xc3, 0xd0, 0x76, + 0xae, 0xda, 0x6e, 0x18, 0x84, 0x7e, 0xba, 0x91, 0xfe, 0x31, 0x98, 0x5a, 0xb5, 0x2c, 0xcf, 0x45, + 0x4f, 0xc3, 0x0c, 0x71, 0x8d, 0x4d, 0x87, 0x58, 0xcb, 0xda, 0x13, 0xda, 0x53, 0xd5, 0xc6, 0xb9, + 0xef, 0x1c, 0xd4, 0x1f, 0x3a, 0x3c, 0xa8, 0xcf, 0xac, 0xf1, 0x62, 0x1c, 0xc1, 0xf5, 0xaf, 0x55, + 0x60, 0x9a, 0x35, 0x0a, 0xd0, 0x2f, 0x68, 0x70, 0x7e, 0x67, 0xb8, 0x49, 0x7c, 0x97, 0x84, 0x24, + 0x68, 0x19, 0xc1, 0xf6, 0xa6, 0x67, 0xf8, 0x1c, 0x45, 0xed, 0x63, 0xaf, 0xac, 0x14, 0x60, 0xc1, + 0x95, 0x1b, 0xa3, 0xf8, 0x1a, 0x0f, 0x1f, 0x1e, 0xd4, 0xcf, 0x67, 0x00, 0x70, 0x16, 0x75, 0x74, + 0x17, 0xe6, 0xdc, 0x9e, 0xed, 0xee, 0xb5, 0xdd, 0x9e, 0x4f, 0x82, 0x60, 0xb9, 0xc2, 0x7a, 0xb3, + 0x5a, 0xa8, 0x37, 0xb7, 0x14, 0x44, 0x8d, 0xc5, 0xc3, 0x83, 0xfa, 0x9c, 0x5a, 0x82, 0x13, 0x84, + 0xf4, 0xaf, 0x6a, 0x70, 0x6e, 0xd5, 0xea, 0xdb, 0x41, 0x60, 0x7b, 0x6e, 0xc7, 0x19, 0xf6, 0x6c, + 0x17, 0x3d, 0x01, 0x93, 0xae, 0xd1, 0x27, 0x6c, 0x48, 0x66, 0x1b, 0x73, 0x62, 0x54, 0x27, 0x6f, + 0x19, 0x7d, 0x82, 0x19, 0x04, 0xbd, 0x0a, 0xd3, 0xa6, 0xe7, 0x6e, 0xd9, 0x3d, 0xd1, 0xd1, 0x1f, + 0x59, 0xe1, 0x33, 0xb9, 0xa2, 0xce, 0x24, 0xeb, 0x9f, 0xe0, 0x80, 0x15, 0x6c, 0xdc, 0x5d, 0xdb, + 0x0b, 0x89, 0x4b, 0xc9, 0x34, 0xe0, 0xf0, 0xa0, 0x3e, 0xdd, 0x64, 0x08, 0xb0, 0x40, 0xa4, 0x5f, + 0x83, 0xea, 0xaa, 0x43, 0xfc, 0xd0, 0x76, 0x7b, 0xe8, 0x79, 0x58, 0x20, 0x7d, 0xc3, 0x76, 0x30, + 0x31, 0x89, 0xbd, 0x4b, 0xfc, 0x60, 0x59, 0x7b, 0x62, 0xe2, 0xa9, 0xd9, 0x06, 0x3a, 0x3c, 0xa8, + 0x2f, 0xac, 0x25, 0x20, 0x38, 0x55, 0x53, 0xff, 0x8a, 0x06, 0xb5, 0xd5, 0xa1, 0x65, 0x87, 0x1c, + 0x3f, 0x0a, 0xa0, 0x66, 0xd0, 0x9f, 0x1d, 0xcf, 0xb1, 0xcd, 0x7d, 0x31, 0xcd, 0x2f, 0x17, 0x1a, + 0xd8, 0xd5, 0x18, 0x4f, 0xe3, 0xdc, 0xe1, 0x41, 0xbd, 0xa6, 0x14, 0x60, 0x95, 0x8a, 0xbe, 0x0d, + 0x2a, 0x0c, 0xbd, 0x01, 0x73, 0xfc, 0x2b, 0xd7, 0x8d, 0x01, 0x26, 0x5b, 0xa2, 0x13, 0x1f, 0x54, + 0x06, 0x2d, 0xa2, 0xb4, 0x72, 0x7b, 0xf3, 0x2d, 0x62, 0x86, 0x98, 0x6c, 0x11, 0x9f, 0xb8, 0x26, + 0xe1, 0xf3, 0xd7, 0x54, 0x1a, 0xe3, 0x04, 0x2a, 0xfd, 0x07, 0x1a, 0x2c, 0xae, 0xee, 0x1a, 0xb6, + 0x63, 0x6c, 0xda, 0x8e, 0x1d, 0xee, 0x7f, 0xde, 0x73, 0xc9, 0x18, 0x13, 0xb8, 0x01, 0x0f, 0x0f, + 0x5d, 0x83, 0xb7, 0x73, 0xc8, 0x3a, 0x9f, 0xb2, 0x3b, 0xfb, 0x03, 0x42, 0x59, 0x8f, 0x0e, 0xf5, + 0xa3, 0x87, 0x07, 0xf5, 0x87, 0x37, 0xb2, 0xab, 0xe0, 0xbc, 0xb6, 0x08, 0xc3, 0x25, 0x05, 0xf4, + 0x9a, 0xe7, 0x0c, 0xfb, 0x02, 0xeb, 0x04, 0xc3, 0x7a, 0xf9, 0xf0, 0xa0, 0x7e, 0x69, 0x23, 0xb3, + 0x06, 0xce, 0x69, 0xa9, 0x7f, 0xb7, 0x02, 0x73, 0x0d, 0xc3, 0xdc, 0x19, 0x0e, 0x1a, 0x43, 0x73, + 0x87, 0x84, 0xe8, 0x8b, 0x50, 0xa5, 0x92, 0xcb, 0x32, 0x42, 0x43, 0x8c, 0xe4, 0x8f, 0xe6, 0xb2, + 0x1f, 0x9b, 0x45, 0x5a, 0x3b, 0x1e, 0xdb, 0x75, 0x12, 0x1a, 0x0d, 0x24, 0xc6, 0x04, 0xe2, 0x32, + 0x2c, 0xb1, 0xa2, 0x1e, 0x4c, 0x06, 0x03, 0x62, 0x0a, 0xe6, 0x5e, 0x2b, 0xc4, 0x2c, 0x6a, 0x97, + 0xbb, 0x03, 0x62, 0xc6, 0xd3, 0x40, 0x7f, 0x61, 0x46, 0x00, 0x79, 0x30, 0x1d, 0x84, 0x46, 0x38, + 0xa4, 0xe3, 0x43, 0x49, 0x5d, 0x2f, 0x4f, 0x8a, 0xa1, 0x6b, 0x2c, 0x08, 0x62, 0xd3, 0xfc, 0x37, + 0x16, 0x64, 0xf4, 0xef, 0x6b, 0xb0, 0xa8, 0x56, 0xbf, 0x69, 0x07, 0x21, 0xfa, 0x4b, 0x23, 0x03, + 0xba, 0x32, 0xde, 0x80, 0xd2, 0xd6, 0x6c, 0x38, 0x17, 0x05, 0xb9, 0x6a, 0x54, 0xa2, 0x0c, 0xe6, + 0x16, 0x4c, 0xd9, 0x21, 0xe9, 0x73, 0xc6, 0x2a, 0x2a, 0xd3, 0xd4, 0x3e, 0x37, 0xe6, 0x05, 0xb5, + 0xa9, 0x36, 0xc5, 0x8b, 0x39, 0x7a, 0xfd, 0x8b, 0x70, 0x41, 0xad, 0xd5, 0xf1, 0xbd, 0x5d, 0xdb, + 0x22, 0x3e, 0x5d, 0x0c, 0xe1, 0xfe, 0x60, 0x64, 0x31, 0x50, 0xe6, 0xc2, 0x0c, 0x82, 0x3e, 0x0c, + 0xd3, 0x3e, 0xe9, 0xd9, 0x9e, 0xcb, 0x26, 0x7c, 0x36, 0x1e, 0x3c, 0xcc, 0x4a, 0xb1, 0x80, 0xea, + 0xff, 0xbd, 0x92, 0x1c, 0x3c, 0x3a, 0x91, 0xe8, 0x2e, 0x54, 0x07, 0x82, 0x94, 0x18, 0xbc, 0x76, + 0xe9, 0x2f, 0x8c, 0xfa, 0x1e, 0x8f, 0x6b, 0x54, 0x82, 0x25, 0x31, 0x64, 0xc3, 0x42, 0xf4, 0x7f, + 0xb3, 0x84, 0x2c, 0x66, 0x32, 0xb5, 0x93, 0x40, 0x84, 0x53, 0x88, 0xd1, 0x1d, 0x98, 0x0d, 0x88, + 0xe9, 0x13, 0x2a, 0x97, 0x04, 0xa7, 0x66, 0x0a, 0xaf, 0x6e, 0x54, 0x49, 0x08, 0xaf, 0x25, 0xd1, + 0xfd, 0x59, 0x09, 0xc0, 0x31, 0x22, 0xf4, 0x18, 0x4c, 0x06, 0x84, 0x58, 0xcb, 0x93, 0x6c, 0xd0, + 0xab, 0x6c, 0x69, 0x10, 0x62, 0x61, 0x56, 0xaa, 0xff, 0xda, 0x24, 0xa0, 0x51, 0xc6, 0x56, 0xbf, + 0x9a, 0x97, 0x88, 0x41, 0x2f, 0xf3, 0xd5, 0x62, 0x8d, 0xa4, 0x10, 0xa3, 0x77, 0x60, 0xde, 0x31, + 0x82, 0xf0, 0xf6, 0x80, 0xaa, 0x1f, 0x11, 0x77, 0xd4, 0x3e, 0xd6, 0x28, 0x34, 0xbd, 0x37, 0x55, + 0x4c, 0x8d, 0xa5, 0xc3, 0x83, 0xfa, 0x7c, 0xa2, 0x08, 0x27, 0x69, 0xa1, 0x1d, 0x98, 0xa5, 0x05, + 0x6b, 0xbe, 0xef, 0xf9, 0x62, 0xc8, 0x5f, 0x2a, 0x4c, 0x98, 0x61, 0x69, 0xcc, 0xd3, 0x99, 0x90, + 0x3f, 0x71, 0x8c, 0x1f, 0x7d, 0x16, 0x90, 0xb7, 0x19, 0x10, 0x7f, 0x97, 0x58, 0xd7, 0xb9, 0xb6, + 0x45, 0x3f, 0x97, 0xce, 0xcb, 0x44, 0xe3, 0xb2, 0x98, 0x43, 0x74, 0x7b, 0xa4, 0x06, 0xce, 0x68, + 0x85, 0x76, 0x00, 0x49, 0x8d, 0x4d, 0x4e, 0xfb, 0xf2, 0xd4, 0xf8, 0x4c, 0x73, 0x89, 0x12, 0xbb, + 0x3e, 0x82, 0x02, 0x67, 0xa0, 0xd5, 0x7f, 0xbf, 0x02, 0x35, 0xce, 0x24, 0x6b, 0x6e, 0xe8, 0xef, + 0x9f, 0xc1, 0xd6, 0xb0, 0x95, 0xd8, 0x1a, 0x5a, 0x25, 0x96, 0x3a, 0xeb, 0x71, 0xee, 0xce, 0xe0, + 0xa6, 0x76, 0x86, 0x6b, 0xa5, 0x29, 0x1d, 0xbd, 0x31, 0xfc, 0xb1, 0x06, 0xe7, 0x94, 0xda, 0x67, + 0xb0, 0x2f, 0x90, 0xe4, 0xbe, 0xf0, 0x72, 0xd9, 0x0f, 0xcc, 0xd9, 0x16, 0xcc, 0xc4, 0x77, 0x31, + 0x91, 0xfd, 0x31, 0x80, 0x4d, 0x26, 0x53, 0x6e, 0xc5, 0x4a, 0x92, 0x9c, 0xf5, 0x86, 0x84, 0x60, + 0xa5, 0x96, 0x14, 0x56, 0x95, 0x4c, 0x61, 0xf5, 0xaf, 0x2a, 0xb0, 0x34, 0x32, 0xd6, 0xa3, 0x02, + 0x44, 0x7b, 0xb7, 0x04, 0x48, 0xe5, 0x5d, 0x11, 0x20, 0x13, 0x45, 0x04, 0x88, 0xfe, 0x7b, 0x1a, + 0x4c, 0x34, 0x71, 0x1b, 0x7d, 0x24, 0xa1, 0xc4, 0x3e, 0xac, 0x2a, 0xb1, 0xf7, 0x0f, 0xea, 0x33, + 0x4d, 0xdc, 0x56, 0xf4, 0xd9, 0x9f, 0xd3, 0x60, 0xc9, 0xf4, 0xdc, 0xd0, 0xa0, 0x1c, 0x89, 0xb9, + 0xc4, 0x8f, 0x38, 0xab, 0x98, 0xfe, 0xd6, 0x4c, 0x61, 0x6b, 0x3c, 0x22, 0x7a, 0xb0, 0x94, 0x86, + 0x04, 0x78, 0x94, 0xb4, 0xbe, 0x01, 0xb3, 0x4d, 0xc7, 0x1b, 0x5a, 0x6d, 0x77, 0xcb, 0x3b, 0x45, + 0x15, 0xe4, 0xdf, 0x6b, 0x30, 0xc7, 0xf0, 0x76, 0x7c, 0x6f, 0xcb, 0x76, 0xc8, 0xfb, 0x44, 0x19, + 0x56, 0xbb, 0x9c, 0x27, 0xf2, 0x98, 0x6e, 0xaa, 0x56, 0x7c, 0xbf, 0xe8, 0xa6, 0x6a, 0x9f, 0x73, + 0x84, 0xd0, 0xd7, 0x67, 0x92, 0x9f, 0xc6, 0xc4, 0xd0, 0x53, 0x50, 0x35, 0x8d, 0xc6, 0xd0, 0xb5, + 0x1c, 0xc9, 0x19, 0xb4, 0x9b, 0xcd, 0x55, 0x5e, 0x86, 0x25, 0x14, 0xbd, 0x03, 0x10, 0x3b, 0x0d, + 0xc4, 0x44, 0x5c, 0x2f, 0xe9, 0xa9, 0xe8, 0x92, 0x90, 0xda, 0xda, 0x41, 0x3c, 0xfb, 0x31, 0x0c, + 0x2b, 0xe4, 0xd0, 0x5f, 0x81, 0x79, 0x31, 0xcc, 0xed, 0xbe, 0xd1, 0x13, 0xa6, 0x5c, 0xd1, 0xb1, + 0x5a, 0x57, 0x30, 0x35, 0x2e, 0x0a, 0xca, 0xf3, 0x6a, 0x69, 0x80, 0x93, 0xe4, 0xd0, 0x3d, 0x98, + 0xeb, 0xab, 0xf6, 0xe9, 0x64, 0x89, 0xed, 0x42, 0x31, 0x56, 0x1b, 0x17, 0x04, 0xf5, 0xb9, 0x84, + 0x69, 0x9b, 0xa0, 0x95, 0xa1, 0x63, 0x4f, 0x3d, 0x28, 0x1d, 0x7b, 0x0b, 0x66, 0xf8, 0x1a, 0x0f, + 0x96, 0xa7, 0xd9, 0x17, 0x7e, 0xba, 0xd0, 0x17, 0x72, 0x79, 0x11, 0xbb, 0xc2, 0xf8, 0xef, 0x00, + 0x47, 0xc8, 0xd1, 0x5d, 0x98, 0xa3, 0x5b, 0x56, 0x97, 0x38, 0xc4, 0x0c, 0x3d, 0x7f, 0x79, 0xa6, + 0x84, 0xa7, 0xa9, 0xab, 0x20, 0xe2, 0x9e, 0x0a, 0xb5, 0x04, 0x27, 0x08, 0x49, 0x21, 0x58, 0xcd, + 0x15, 0x82, 0xbb, 0x50, 0xdb, 0x55, 0x5c, 0x06, 0xb3, 0x6c, 0x18, 0x3e, 0x53, 0xa8, 0x67, 0xb1, + 0x03, 0xa1, 0x71, 0x5e, 0x50, 0xaa, 0xa9, 0xce, 0x06, 0x95, 0x90, 0xfe, 0x33, 0xd3, 0xb0, 0xd4, + 0x74, 0x86, 0x41, 0x48, 0xfc, 0x55, 0xe1, 0xcd, 0x25, 0x3e, 0xfa, 0x8a, 0x06, 0x97, 0xd8, 0xbf, + 0x2d, 0xef, 0xae, 0xdb, 0x22, 0x8e, 0xb1, 0xbf, 0xba, 0x45, 0x6b, 0x58, 0xd6, 0xc9, 0x04, 0x51, + 0x6b, 0x28, 0xf6, 0x6c, 0xe6, 0xfc, 0xe8, 0x66, 0x62, 0xc4, 0x39, 0x94, 0xd0, 0xcf, 0x6a, 0xf0, + 0x48, 0x06, 0xa8, 0x45, 0x1c, 0x12, 0x12, 0x21, 0x09, 0x4e, 0xda, 0x8f, 0xc7, 0x0f, 0x0f, 0xea, + 0x8f, 0x74, 0xf3, 0x90, 0xe2, 0x7c, 0x7a, 0x74, 0x97, 0xbd, 0x9c, 0x01, 0xbd, 0x66, 0xd8, 0xce, + 0xd0, 0x27, 0x42, 0x53, 0x3d, 0x69, 0x77, 0xae, 0x1c, 0x1e, 0xd4, 0x2f, 0x77, 0x73, 0xb1, 0xe2, + 0x23, 0x28, 0xa2, 0x2f, 0xc1, 0x45, 0x09, 0xdd, 0x70, 0x5d, 0x42, 0x2c, 0x62, 0xdd, 0xb1, 0xfb, + 0x84, 0xd9, 0x2e, 0x27, 0xef, 0xca, 0x23, 0x87, 0x07, 0xf5, 0x8b, 0xdd, 0x2c, 0x84, 0x38, 0x9b, + 0x0e, 0xea, 0xc1, 0xe3, 0x31, 0x20, 0xb4, 0x1d, 0xfb, 0x1e, 0xc3, 0x74, 0x67, 0xdb, 0x27, 0xc1, + 0xb6, 0xe7, 0x58, 0x4c, 0x5e, 0x68, 0x8d, 0x0f, 0x1c, 0x1e, 0xd4, 0x1f, 0xef, 0x1e, 0x55, 0x11, + 0x1f, 0x8d, 0x07, 0x59, 0x30, 0x17, 0x98, 0x86, 0xdb, 0x76, 0x43, 0xe2, 0xef, 0x1a, 0xce, 0xf2, + 0x74, 0xa1, 0x0f, 0xe4, 0x6b, 0x54, 0xc1, 0x83, 0x13, 0x58, 0xf5, 0xff, 0xa1, 0x41, 0x4d, 0xac, + 0x04, 0xa6, 0xb8, 0x98, 0x30, 0x65, 0xd2, 0x6d, 0x4b, 0x70, 0xfc, 0x4b, 0xc5, 0xf7, 0x47, 0x8a, + 0x2e, 0xde, 0x1c, 0x59, 0x11, 0xe6, 0xb8, 0xd1, 0xdd, 0x8c, 0xdd, 0xad, 0x59, 0x72, 0x77, 0x63, + 0xe4, 0x8e, 0xd9, 0xd9, 0xf4, 0x83, 0x09, 0x98, 0x6d, 0x7a, 0xae, 0x65, 0x33, 0x85, 0xf9, 0x99, + 0x84, 0x92, 0xf6, 0xb8, 0x2a, 0x9f, 0xee, 0x1f, 0xd4, 0xe7, 0x65, 0x45, 0x45, 0x60, 0x3d, 0x27, + 0x8d, 0x34, 0xae, 0xb5, 0x7d, 0x20, 0x69, 0x5c, 0xdd, 0x3f, 0xa8, 0x9f, 0x93, 0xcd, 0x92, 0xf6, + 0x16, 0xda, 0x05, 0x44, 0xd5, 0xe7, 0x3b, 0xbe, 0xe1, 0x06, 0x1c, 0x2d, 0x65, 0x5b, 0xbe, 0x82, + 0xfe, 0xe2, 0x78, 0xb3, 0x4a, 0x5b, 0xc4, 0xda, 0xf5, 0xcd, 0x11, 0x6c, 0x38, 0x83, 0x02, 0x7a, + 0x0b, 0x16, 0x68, 0xe9, 0xc6, 0xc0, 0x32, 0x42, 0xa2, 0x2c, 0x95, 0x93, 0xd0, 0xbc, 0x24, 0x68, + 0x2e, 0xdc, 0x4c, 0x60, 0xc2, 0x29, 0xcc, 0x5c, 0xa9, 0x35, 0x02, 0xcf, 0x65, 0xab, 0x20, 0xa1, + 0xd4, 0xd2, 0x52, 0x2c, 0xa0, 0xe8, 0x69, 0x98, 0xe9, 0x93, 0x20, 0x30, 0x7a, 0x84, 0xb1, 0xf5, + 0x6c, 0xbc, 0x7b, 0xad, 0xf3, 0x62, 0x1c, 0xc1, 0xd1, 0x47, 0x61, 0xca, 0xf4, 0x2c, 0x12, 0x2c, + 0xcf, 0x30, 0x7f, 0xf2, 0x25, 0xc6, 0x4c, 0xb4, 0xe0, 0xfe, 0x41, 0x7d, 0x96, 0xd9, 0x22, 0xf4, + 0x17, 0xe6, 0x95, 0xf4, 0x5f, 0xa1, 0x1a, 0x65, 0x4a, 0x35, 0xcf, 0x73, 0x8e, 0xf3, 0x69, 0x65, + 0xc6, 0xc4, 0xd9, 0x79, 0xd6, 0xf4, 0xef, 0x55, 0xe0, 0x02, 0xed, 0xa1, 0xef, 0x39, 0x0e, 0x15, + 0xb3, 0x03, 0xc7, 0xdb, 0xef, 0x13, 0x37, 0x1c, 0xc3, 0x64, 0x38, 0x43, 0xff, 0xdf, 0xcb, 0x30, + 0x3d, 0xe0, 0xc7, 0x27, 0x13, 0xac, 0x3b, 0x4f, 0xd1, 0x49, 0xe4, 0x67, 0x1b, 0xf7, 0x0f, 0xea, + 0x97, 0xb3, 0x3e, 0x40, 0x9c, 0x8a, 0x88, 0x76, 0xc8, 0x4e, 0x69, 0x1d, 0x9c, 0xe9, 0x9e, 0x1d, + 0x53, 0x95, 0x37, 0x36, 0x89, 0x33, 0xae, 0x9e, 0xa1, 0xff, 0xd7, 0x0a, 0x5c, 0x8a, 0x7b, 0xd4, + 0x76, 0x83, 0xd0, 0x70, 0x1c, 0x6e, 0x13, 0x3f, 0x78, 0x63, 0xe9, 0xed, 0x84, 0xb1, 0x74, 0xbb, + 0xb0, 0xe5, 0x39, 0xda, 0xf9, 0x5c, 0x4f, 0xd1, 0x7e, 0xca, 0x53, 0xf4, 0xea, 0x69, 0x12, 0x3d, + 0xda, 0x69, 0xf4, 0x3f, 0x35, 0xb8, 0x9c, 0xdd, 0xf0, 0x0c, 0x6c, 0xb7, 0x41, 0xd2, 0x76, 0xbb, + 0x71, 0x8a, 0x9f, 0x9d, 0x63, 0xc5, 0xfd, 0x51, 0xee, 0xe7, 0x32, 0x7b, 0x6e, 0x0b, 0xce, 0x51, + 0x25, 0x3b, 0x08, 0x85, 0x73, 0xe3, 0x64, 0x07, 0x7d, 0x91, 0x83, 0xe3, 0x1c, 0x4e, 0xe2, 0xc0, + 0x69, 0xa4, 0xe8, 0x16, 0xcc, 0x50, 0x86, 0xa7, 0xf8, 0x2b, 0xe3, 0xe3, 0x97, 0x32, 0xb5, 0xcb, + 0xdb, 0xe2, 0x08, 0x89, 0xfe, 0xff, 0x34, 0x78, 0xec, 0xa8, 0xe9, 0x47, 0x3e, 0x80, 0x19, 0x6d, + 0x63, 0xfc, 0x28, 0xb6, 0xb0, 0x2a, 0x10, 0xa1, 0x89, 0x97, 0x91, 0x2c, 0x0a, 0xb0, 0x42, 0x25, + 0xc3, 0xcf, 0x5f, 0x79, 0x40, 0x7e, 0x7e, 0xfd, 0x7f, 0x69, 0xaa, 0xc0, 0x50, 0x87, 0xff, 0x7d, + 0x27, 0x30, 0xd4, 0xce, 0xe7, 0xfa, 0x59, 0x92, 0xab, 0x56, 0x6d, 0xf2, 0xfe, 0x5b, 0xb5, 0x6a, + 0xef, 0x73, 0x56, 0xed, 0xcf, 0x57, 0xf2, 0x3e, 0x97, 0xad, 0xda, 0x3d, 0x98, 0x8d, 0xc2, 0x67, + 0x22, 0xde, 0xbe, 0x5e, 0xba, 0x53, 0x1c, 0x5f, 0x7c, 0xfe, 0x15, 0x95, 0x04, 0x38, 0x26, 0x86, + 0xf6, 0x01, 0x2c, 0xb9, 0x5f, 0x0a, 0x06, 0x68, 0x97, 0x24, 0x1d, 0x6f, 0xc0, 0x8d, 0x05, 0xca, + 0x73, 0xf1, 0x6f, 0xac, 0x10, 0xd3, 0x7f, 0xa3, 0x02, 0x68, 0xb4, 0xbf, 0x54, 0xe9, 0xd8, 0xb1, + 0x5d, 0x2b, 0xad, 0x74, 0xdc, 0xb0, 0x5d, 0x0b, 0x33, 0x88, 0x54, 0x4b, 0x2a, 0xb9, 0x6a, 0xc9, + 0x8b, 0x70, 0xae, 0xe7, 0x78, 0x9b, 0x86, 0xe3, 0xec, 0x8b, 0x30, 0x1c, 0xb6, 0x2f, 0x55, 0x1b, + 0xe7, 0xa9, 0x70, 0xbb, 0x9e, 0x04, 0xe1, 0x74, 0x5d, 0x34, 0x80, 0x45, 0x9f, 0x98, 0x9e, 0x6b, + 0xda, 0x0e, 0x53, 0x22, 0xbd, 0x61, 0x58, 0xd0, 0x98, 0xbb, 0x70, 0x78, 0x50, 0x5f, 0xc4, 0x29, + 0x5c, 0x78, 0x04, 0x3b, 0x7a, 0x12, 0x66, 0x06, 0xbe, 0xdd, 0x37, 0xfc, 0x7d, 0xa6, 0xa6, 0x56, + 0x1b, 0x35, 0x2a, 0x25, 0x3b, 0xbc, 0x08, 0x47, 0x30, 0xfd, 0x1b, 0x1a, 0x4c, 0xb4, 0x6e, 0x75, + 0x91, 0x0e, 0xd3, 0x96, 0xd7, 0x37, 0x6c, 0x57, 0x8c, 0x12, 0x8b, 0x65, 0x69, 0xb1, 0x12, 0x2c, + 0x20, 0xe8, 0x6d, 0x98, 0x8d, 0x64, 0x4c, 0xb9, 0xe3, 0x8d, 0xd6, 0xad, 0xae, 0x3c, 0x0b, 0x96, + 0xcc, 0x14, 0x95, 0x04, 0x38, 0xa6, 0xa2, 0x1b, 0xb0, 0xd4, 0xba, 0xd5, 0x6d, 0xbb, 0xa6, 0x33, + 0xb4, 0xc8, 0xda, 0x1e, 0xfb, 0x43, 0x3f, 0xcd, 0xe6, 0x25, 0x22, 0x80, 0x86, 0x7d, 0x9a, 0xa8, + 0x84, 0x23, 0x18, 0xad, 0x46, 0x78, 0x0b, 0x11, 0xfc, 0xc1, 0xaa, 0x09, 0x24, 0x38, 0x82, 0xe9, + 0x7f, 0x52, 0x81, 0x9a, 0xd2, 0x21, 0xd4, 0x87, 0x19, 0xfe, 0xbd, 0xd1, 0x19, 0xec, 0xb5, 0xa2, + 0xdf, 0x98, 0xec, 0x36, 0x27, 0xcf, 0x87, 0x34, 0xc0, 0x11, 0x0d, 0x75, 0x9e, 0x2a, 0xf9, 0xf3, + 0x84, 0x56, 0x00, 0xf8, 0x11, 0x33, 0x3b, 0xdc, 0xe1, 0xfa, 0x2a, 0x5b, 0x0a, 0x5d, 0x59, 0x8a, + 0x95, 0x1a, 0xe8, 0x31, 0xc1, 0xd1, 0xca, 0x29, 0xb4, 0xc2, 0xcd, 0x3d, 0x98, 0xba, 0xe7, 0xb9, + 0x24, 0x10, 0x7e, 0xbf, 0xd3, 0xfa, 0xc2, 0x59, 0x2a, 0xa5, 0x3e, 0x4f, 0x11, 0x63, 0x8e, 0x5f, + 0xff, 0xa6, 0x06, 0xd0, 0x32, 0x42, 0x83, 0x3b, 0xa9, 0xc6, 0x88, 0xe0, 0x79, 0x2c, 0xb1, 0x12, + 0xab, 0x23, 0xe7, 0x09, 0x93, 0x81, 0x7d, 0x2f, 0xfa, 0x7e, 0xb9, 0x05, 0x71, 0xec, 0x5d, 0xfb, + 0x1e, 0xc1, 0x0c, 0x8e, 0x3e, 0x02, 0xb3, 0xc4, 0x35, 0xfd, 0xfd, 0x41, 0x28, 0x0e, 0xe2, 0xab, + 0xfc, 0x94, 0x67, 0x2d, 0x2a, 0xc4, 0x31, 0x5c, 0xdf, 0x85, 0xea, 0x9a, 0x6b, 0x0d, 0x3c, 0x9b, + 0xdb, 0x27, 0xc7, 0x74, 0xf0, 0x71, 0x98, 0x18, 0xfa, 0x8e, 0xe8, 0x5f, 0x4d, 0x54, 0x98, 0xd8, + 0xc0, 0x37, 0x31, 0x2d, 0xa7, 0x46, 0xdf, 0x60, 0xe8, 0x0f, 0xbc, 0x20, 0xea, 0xa4, 0x54, 0x50, + 0x3a, 0xbc, 0x18, 0x47, 0x70, 0xfd, 0xbe, 0x06, 0x8b, 0x6b, 0x7b, 0x03, 0xdb, 0x67, 0xa1, 0x41, + 0xc4, 0xa7, 0x3b, 0x3b, 0x6d, 0xbf, 0xcb, 0xff, 0x15, 0x7d, 0x90, 0xed, 0x45, 0x0d, 0x1c, 0xc1, + 0xd1, 0x16, 0x2c, 0x10, 0xd6, 0x9c, 0xca, 0x85, 0x96, 0x21, 0x1d, 0x67, 0x27, 0xb1, 0x79, 0x79, + 0xe8, 0x59, 0x02, 0x0b, 0x4e, 0x61, 0x45, 0x5d, 0x58, 0x30, 0x1d, 0x23, 0x08, 0xec, 0x2d, 0xdb, + 0x8c, 0x4f, 0xc0, 0x66, 0x1b, 0x1f, 0xa1, 0x6d, 0x9b, 0x09, 0xc8, 0xfd, 0x83, 0xfa, 0x45, 0xd1, + 0xcf, 0x24, 0x00, 0xa7, 0x50, 0xe8, 0xbf, 0xab, 0xc1, 0xac, 0xd4, 0x67, 0xde, 0x5b, 0x66, 0xe1, + 0x53, 0x50, 0xb5, 0xec, 0x40, 0x95, 0xf1, 0xec, 0x00, 0xa3, 0x25, 0xca, 0xb0, 0x84, 0xea, 0xff, + 0xba, 0x02, 0x97, 0x24, 0xee, 0x68, 0xbb, 0xa1, 0xea, 0xd7, 0x38, 0x7b, 0xce, 0x63, 0x82, 0xd5, + 0x14, 0x4e, 0x57, 0xd8, 0xec, 0xc9, 0x34, 0x1f, 0xd5, 0xb2, 0x78, 0x08, 0xdd, 0x82, 0x29, 0x6a, + 0xb4, 0x44, 0xee, 0x8e, 0x13, 0x8e, 0x06, 0x5b, 0xaf, 0xac, 0xbf, 0x98, 0xa3, 0x41, 0xef, 0xa8, + 0x6a, 0xc3, 0x14, 0x13, 0xf1, 0x9f, 0x3d, 0x99, 0x70, 0x60, 0x91, 0xc8, 0x2b, 0xf4, 0x4b, 0xac, + 0x68, 0x44, 0x32, 0x22, 0x67, 0xb2, 0x34, 0x07, 0x3d, 0x80, 0xea, 0x75, 0x81, 0x16, 0x5d, 0x86, + 0x8a, 0x1d, 0x8d, 0x1e, 0x88, 0x56, 0x95, 0x76, 0x0b, 0x57, 0x6c, 0x4b, 0x2e, 0xd2, 0x4a, 0xee, + 0x22, 0x55, 0x56, 0xd1, 0xc4, 0xd1, 0xab, 0x48, 0xff, 0x07, 0x1a, 0x5c, 0x88, 0xa8, 0x46, 0xbd, + 0xa2, 0x12, 0x6b, 0x0c, 0x51, 0x70, 0xbc, 0xd6, 0x70, 0x1b, 0x26, 0x99, 0xc2, 0x39, 0x51, 0x64, + 0x76, 0x24, 0x42, 0xda, 0x1d, 0xcc, 0x10, 0xe9, 0xdf, 0xd2, 0xa0, 0xf6, 0x8a, 0xbd, 0x49, 0x7c, + 0x97, 0x6b, 0xf2, 0x4f, 0xa6, 0x83, 0x85, 0x6b, 0x59, 0x81, 0xc2, 0x68, 0x1f, 0x66, 0x03, 0x73, + 0x9b, 0x58, 0x43, 0x47, 0x1e, 0x1f, 0x17, 0x0b, 0x09, 0x56, 0x68, 0x77, 0x05, 0x42, 0x25, 0x1c, + 0x2a, 0x22, 0x81, 0x63, 0x6a, 0xfa, 0x3b, 0x70, 0x3e, 0xa3, 0x11, 0xaa, 0x33, 0xc6, 0xf5, 0x43, + 0x31, 0xbc, 0x11, 0x27, 0xfa, 0x21, 0xe6, 0xe5, 0xe8, 0x11, 0x98, 0x20, 0x6e, 0x14, 0x98, 0x30, + 0x43, 0x65, 0xec, 0x9a, 0x6b, 0x61, 0x5a, 0x46, 0x17, 0xa8, 0xe3, 0x25, 0x44, 0x11, 0x5b, 0xa0, + 0x37, 0x45, 0x19, 0x96, 0x50, 0xfd, 0x9f, 0x4f, 0xc2, 0xe3, 0xaf, 0x78, 0xbe, 0x7d, 0xcf, 0x73, + 0x43, 0xc3, 0xe9, 0x78, 0x56, 0x7c, 0x10, 0x22, 0x16, 0xfb, 0x4f, 0x6b, 0xf0, 0xb0, 0x39, 0x18, 0xb6, 0x5d, 0x3b, 0xb4, 0x8d, 0xc8, 0x3f, 0xdd, 0x21, 0xbe, 0xed, 0x15, 0x3d, 0x0f, 0x61, 0x21, - 0xa6, 0xcd, 0xce, 0x46, 0x16, 0x4a, 0x9c, 0x47, 0x0b, 0xbd, 0x09, 0x0b, 0x96, 0x77, 0xcf, 0xe5, - 0xde, 0x72, 0xe2, 0x18, 0xfb, 0x05, 0x4f, 0x41, 0x98, 0x80, 0x6b, 0x25, 0x30, 0xe1, 0x14, 0x66, - 0x76, 0x04, 0x24, 0x8b, 0xba, 0x21, 0x0b, 0xb1, 0xbd, 0x1f, 0x0f, 0x67, 0xc1, 0x23, 0xa0, 0x56, - 0x26, 0x46, 0x9c, 0x43, 0x09, 0x7d, 0x09, 0x2e, 0xda, 0x7c, 0x20, 0x30, 0x31, 0x2c, 0xdb, 0x25, - 0x41, 0xc0, 0xbf, 0xbb, 0xc4, 0x19, 0x47, 0x3b, 0x0b, 0x21, 0xce, 0xa6, 0x83, 0x7e, 0x12, 0x20, - 0xd8, 0x77, 0x4d, 0x31, 0xd7, 0x53, 0x85, 0xa8, 0x72, 0x0d, 0x4c, 0x62, 0xc1, 0x0a, 0x46, 0xaa, - 0x83, 0x84, 0x9e, 0x43, 0x7c, 0xc3, 0x35, 0xb9, 0x03, 0x58, 0xe3, 0x3a, 0xc8, 0xdd, 0xa8, 0x10, - 0xc7, 0x70, 0x64, 0xc1, 0xdc, 0x70, 0xa0, 0x4c, 0xfe, 0x4c, 0xf1, 0x73, 0x90, 0x0d, 0x05, 0x0f, - 0x4e, 0x60, 0xd5, 0xff, 0x89, 0x06, 0x33, 0x22, 0x42, 0x1e, 0x7d, 0x28, 0xa5, 0xf0, 0x4b, 0x67, - 0x58, 0x4a, 0xe9, 0xbf, 0xcf, 0xbc, 0x24, 0xc2, 0xa4, 0x12, 0x4c, 0x59, 0x4c, 0x5f, 0x14, 0x94, - 0x63, 0x03, 0x2d, 0xe1, 0x2d, 0x89, 0x8c, 0x36, 0x85, 0x9a, 0xfe, 0xab, 0x1a, 0x2c, 0x8d, 0xb4, - 0x1a, 0x63, 0x6b, 0x3d, 0x43, 0x4f, 0xf7, 0x37, 0x01, 0xd8, 0x75, 0x88, 0xd5, 0x4e, 0xbb, 0x4b, - 0xfc, 0x5d, 0x29, 0x57, 0x7e, 0x5e, 0x83, 0xc5, 0xf8, 0x4c, 0x46, 0xf4, 0x42, 0x2b, 0x11, 0x6b, - 0x72, 0x33, 0x85, 0xac, 0xb1, 0x2c, 0x3e, 0x7c, 0x31, 0x0d, 0xc1, 0x23, 0x84, 0xd1, 0xdf, 0xd0, - 0x60, 0xd1, 0x48, 0x5e, 0x87, 0x88, 0xf6, 0x81, 0x62, 0xb1, 0x7e, 0xa9, 0xbb, 0x15, 0x71, 0x67, - 0x52, 0x80, 0x00, 0x8f, 0xd0, 0x45, 0x1f, 0x83, 0x39, 0x63, 0x60, 0xaf, 0x0e, 0x2d, 0x9b, 0xea, - 0x04, 0x51, 0x0c, 0x3d, 0xe3, 0xdd, 0xd5, 0x4e, 0x5b, 0x96, 0xe3, 0x44, 0x2d, 0x79, 0xe1, 0x41, - 0x0c, 0xe5, 0x64, 0xd9, 0x0b, 0x0f, 0x62, 0x14, 0xe3, 0x0b, 0x0f, 0x62, 0xf0, 0x54, 0x2a, 0xe8, - 0x0b, 0xf0, 0x28, 0xdf, 0x42, 0x1b, 0x46, 0x60, 0x9b, 0xab, 0xc3, 0x70, 0x9b, 0xb8, 0x61, 0xa4, - 0x05, 0x73, 0xb3, 0x9a, 0x1d, 0x3b, 0xaf, 0xe5, 0x55, 0xc2, 0xf9, 0xed, 0x91, 0x07, 0xe0, 0xd9, - 0x96, 0x29, 0x3e, 0x88, 0x9f, 0x7c, 0x16, 0x0b, 0x0b, 0xb8, 0xd3, 0x6e, 0x35, 0xc5, 0xf7, 0x30, - 0x89, 0x14, 0xff, 0xc6, 0x0a, 0x09, 0xf4, 0x77, 0x35, 0x98, 0x17, 0x8c, 0x2e, 0x88, 0xce, 0x30, - 0x16, 0xf8, 0x42, 0x61, 0x86, 0x4c, 0x71, 0xfd, 0x0a, 0x56, 0xb1, 0xf3, 0xf0, 0x45, 0x19, 0x0d, - 0x93, 0x80, 0xe1, 0x64, 0x47, 0xd0, 0xd7, 0x35, 0xb8, 0x10, 0x10, 0x7f, 0xd7, 0x36, 0xc9, 0xaa, - 0x69, 0x7a, 0x43, 0x37, 0x9a, 0xe7, 0x6a, 0x09, 0xff, 0x51, 0x37, 0x03, 0x61, 0x63, 0xf9, 0xf0, - 0xa0, 0x7e, 0x21, 0x0b, 0x82, 0x33, 0x3b, 0x80, 0x7e, 0x5a, 0x83, 0x73, 0xf7, 0x8c, 0xd0, 0xdc, - 0x6e, 0x1a, 0xe6, 0x36, 0xb3, 0x31, 0x83, 0xe5, 0xd9, 0x12, 0x51, 0xb2, 0xaf, 0x27, 0x71, 0x71, - 0xff, 0x51, 0xaa, 0x10, 0xa7, 0x29, 0xa2, 0x10, 0xaa, 0x3e, 0x79, 0x6b, 0x48, 0x82, 0x30, 0x58, - 0x06, 0x46, 0xfd, 0x33, 0xe5, 0x27, 0x0d, 0x0b, 0x8c, 0x5c, 0x7d, 0x8a, 0x7e, 0x61, 0x49, 0xe9, - 0xf2, 0x2b, 0x80, 0x46, 0x67, 0x14, 0x2d, 0xc2, 0xc4, 0x0e, 0xe1, 0x57, 0x8e, 0x66, 0x31, 0xfd, - 0x17, 0x5d, 0x80, 0xa9, 0x5d, 0xc3, 0x19, 0x72, 0x4d, 0xb8, 0x8a, 0xf9, 0x8f, 0x17, 0x2a, 0x9f, - 0xd4, 0xf4, 0xef, 0x68, 0x70, 0x31, 0x93, 0x26, 0xc2, 0x70, 0xa9, 0x6f, 0xec, 0xdd, 0xf6, 0xdc, - 0xf5, 0x61, 0x68, 0x84, 0xb6, 0xdb, 0x6b, 0xbb, 0x5b, 0x8e, 0xdd, 0xdb, 0xe6, 0x1a, 0xe1, 0x14, - 0xd7, 0x29, 0xd6, 0x33, 0x6b, 0xe0, 0x9c, 0x96, 0xa8, 0x0d, 0xe7, 0xfb, 0xc6, 0xde, 0x08, 0xc2, - 0x0a, 0x43, 0xc8, 0x6e, 0xae, 0xad, 0x8f, 0x82, 0x71, 0x56, 0x1b, 0xfd, 0xeb, 0x93, 0xf0, 0x18, - 0xed, 0x78, 0xbc, 0xef, 0xac, 0x1b, 0xae, 0xd1, 0x7b, 0x97, 0xca, 0xf7, 0x6f, 0x6b, 0xf0, 0xc8, - 0x76, 0xb6, 0x9e, 0x2b, 0xb6, 0x3e, 0x5c, 0x4c, 0xdd, 0x3f, 0x4a, 0x77, 0xe6, 0xe1, 0x1f, 0x47, - 0x56, 0xc1, 0x79, 0xbd, 0x42, 0xaf, 0xc0, 0xa2, 0xeb, 0x59, 0xa4, 0xd9, 0x6e, 0xe1, 0x75, 0x23, - 0xd8, 0xe9, 0x46, 0x5e, 0x9d, 0x29, 0xee, 0xe0, 0xbc, 0x9d, 0x82, 0xe1, 0x91, 0xda, 0x68, 0x17, - 0xd0, 0xc0, 0xb3, 0xd6, 0x76, 0x6d, 0x33, 0x8a, 0x02, 0x28, 0xee, 0x54, 0x65, 0xc1, 0xf9, 0x9d, - 0x11, 0x6c, 0x38, 0x83, 0x82, 0xfe, 0x3d, 0x0d, 0xce, 0xd1, 0x29, 0xe9, 0xf8, 0xde, 0xde, 0xfe, - 0xbb, 0x92, 0x1b, 0x9e, 0x81, 0xc9, 0xbe, 0x67, 0x45, 0x76, 0xe9, 0x45, 0xaa, 0x1c, 0xad, 0x7b, - 0x16, 0x79, 0xc0, 0x9d, 0xac, 0x7b, 0xfb, 0xf4, 0x07, 0x66, 0x55, 0xf4, 0x3f, 0xd5, 0xb8, 0xfa, - 0x12, 0xd9, 0x65, 0xef, 0x4e, 0xf6, 0xfe, 0x04, 0xcc, 0xd3, 0xb2, 0x75, 0x63, 0xaf, 0xd3, 0x7a, - 0xcd, 0x73, 0xa2, 0xb8, 0x14, 0x16, 0x2d, 0x7e, 0x53, 0x05, 0xe0, 0x64, 0x3d, 0xfd, 0x5b, 0xf3, - 0xc0, 0x2a, 0x38, 0x24, 0x7c, 0x57, 0x7e, 0xd8, 0xb3, 0x50, 0x33, 0x07, 0xc3, 0xe6, 0xb5, 0xee, - 0xab, 0x43, 0x2f, 0x34, 0x84, 0x03, 0x98, 0xa9, 0x24, 0xcd, 0xce, 0x46, 0x54, 0x8c, 0xd5, 0x3a, - 0x74, 0xe1, 0x98, 0x83, 0xa1, 0x10, 0x46, 0x1d, 0x35, 0x7c, 0x81, 0x2d, 0x9c, 0x66, 0x67, 0x23, - 0x01, 0xc3, 0x23, 0xb5, 0xd1, 0x97, 0x35, 0x98, 0x23, 0x82, 0xa9, 0x6f, 0x18, 0xbe, 0x25, 0xd6, - 0x4c, 0xf1, 0x0d, 0x45, 0x8e, 0x6e, 0xb4, 0x54, 0xb8, 0x32, 0xb7, 0xa6, 0xd0, 0xc0, 0x09, 0x8a, - 0x4c, 0xaf, 0x12, 0xbf, 0xe9, 0x64, 0x79, 0xd6, 0x75, 0xdf, 0x30, 0x89, 0x62, 0x8a, 0x4d, 0x09, - 0xbd, 0x2a, 0xaf, 0x12, 0xce, 0x6f, 0x8f, 0xfe, 0xb1, 0x06, 0x97, 0x24, 0xd4, 0x76, 0xed, 0xfe, - 0xb0, 0x8f, 0x89, 0xe9, 0x18, 0x76, 0x5f, 0x28, 0x59, 0x9f, 0x3d, 0xbd, 0x2f, 0x4d, 0xe2, 0xe7, - 0x9b, 0x56, 0x36, 0x0c, 0xe7, 0xf4, 0x09, 0xfd, 0xaa, 0x06, 0x4f, 0x46, 0xa0, 0x0e, 0x35, 0x75, - 0x86, 0x3e, 0x89, 0xa3, 0x9b, 0xc4, 0x98, 0x14, 0xb3, 0x07, 0x3f, 0x78, 0x78, 0x50, 0x7f, 0x72, - 0xed, 0x18, 0xdc, 0xf8, 0x58, 0xea, 0x09, 0x8e, 0xe9, 0x7a, 0x5b, 0xa1, 0xd0, 0xca, 0x1e, 0x1a, - 0xc7, 0x50, 0x1a, 0x38, 0x41, 0x11, 0xfd, 0x86, 0x06, 0x8f, 0xa8, 0x05, 0x2a, 0xc3, 0x70, 0x75, - 0xec, 0x73, 0xa7, 0xd7, 0x9b, 0x14, 0x01, 0xee, 0xd2, 0xc9, 0x01, 0xe2, 0xbc, 0x6e, 0xa1, 0xa7, - 0x60, 0xa6, 0xcf, 0x98, 0x93, 0xab, 0x6c, 0x53, 0xdc, 0x37, 0xc7, 0xf9, 0x35, 0xc0, 0x11, 0x8c, - 0x9a, 0x43, 0x03, 0xcf, 0xea, 0xd8, 0x56, 0x70, 0xcb, 0xee, 0xdb, 0xe1, 0x72, 0x8d, 0x5d, 0x2f, - 0x61, 0xe3, 0xd1, 0xf1, 0xac, 0x4e, 0xbb, 0xc5, 0xcb, 0x71, 0xa2, 0x16, 0x8b, 0xa0, 0xb5, 0xfb, - 0x46, 0x8f, 0x74, 0x86, 0x8e, 0xd3, 0xf1, 0x3d, 0x66, 0x24, 0xb7, 0x88, 0x61, 0x39, 0xb6, 0x4b, - 0x96, 0xe7, 0x8a, 0x47, 0xd0, 0xb6, 0xf3, 0x90, 0xe2, 0x7c, 0x7a, 0x68, 0x05, 0x60, 0xcb, 0xb0, - 0x9d, 0xee, 0x3d, 0x63, 0x70, 0xc7, 0x5d, 0x9e, 0x67, 0x62, 0x8c, 0x59, 0x22, 0xd7, 0x64, 0x29, - 0x56, 0x6a, 0x30, 0x86, 0xa2, 0xc2, 0x10, 0x13, 0x7e, 0x4f, 0x66, 0x79, 0xe1, 0xb4, 0x18, 0x2a, - 0xc2, 0xc8, 0x07, 0xf0, 0xa6, 0x42, 0x03, 0x27, 0x28, 0xa2, 0xaf, 0x6a, 0xb0, 0x10, 0xec, 0x07, - 0x21, 0xe9, 0xcb, 0x4e, 0x9c, 0x3b, 0xf5, 0x4e, 0x30, 0x0f, 0x42, 0x37, 0x41, 0x05, 0xa7, 0xa8, - 0xea, 0x07, 0x15, 0xae, 0x22, 0x8f, 0x70, 0x21, 0x7a, 0x09, 0xce, 0xf5, 0x49, 0xdf, 0xf3, 0xf7, - 0x57, 0xa3, 0x0b, 0xe4, 0xc2, 0xe7, 0xc1, 0x6c, 0x86, 0xf5, 0x24, 0x08, 0xa7, 0xeb, 0xd2, 0x9d, - 0x82, 0xcd, 0xd8, 0xb5, 0x6e, 0xdc, 0xbe, 0x12, 0xef, 0x14, 0xed, 0x14, 0x0c, 0x8f, 0xd4, 0x46, - 0x4d, 0x58, 0x12, 0x65, 0x6d, 0xaa, 0x7e, 0x05, 0xd7, 0x7c, 0x12, 0x1d, 0x47, 0x50, 0xad, 0x62, - 0xa9, 0x9d, 0x06, 0xe2, 0xd1, 0xfa, 0xf4, 0x2b, 0xe8, 0x0f, 0xb5, 0x17, 0x93, 0xf1, 0x57, 0xdc, - 0x4e, 0x82, 0x70, 0xba, 0x6e, 0xa4, 0x28, 0x26, 0xba, 0x30, 0x15, 0x7f, 0xc5, 0xed, 0x14, 0x0c, - 0x8f, 0xd4, 0xd6, 0xff, 0x74, 0x12, 0x3e, 0x30, 0x86, 0xf0, 0x46, 0xfd, 0xec, 0xe1, 0x3e, 0x66, - 0x1d, 0xad, 0x44, 0xe7, 0x17, 0x2b, 0xaf, 0x0e, 0x0d, 0x37, 0xb4, 0xc3, 0xfd, 0x31, 0xa7, 0x67, - 0x90, 0x33, 0x3d, 0x27, 0xa7, 0x37, 0xee, 0x74, 0x06, 0x79, 0xd3, 0x79, 0x72, 0x92, 0xe3, 0x4f, - 0x7f, 0x3f, 0x7b, 0xfa, 0x0b, 0x8e, 0xea, 0xb1, 0xec, 0x32, 0xc8, 0x61, 0x97, 0x82, 0xa3, 0x3a, - 0x06, 0x7b, 0xfd, 0x87, 0x49, 0xf8, 0xe0, 0x38, 0xbb, 0x48, 0x41, 0xfe, 0xca, 0x90, 0xd3, 0x0f, - 0x95, 0xbf, 0xf2, 0x42, 0x4e, 0x1e, 0x22, 0x7f, 0x65, 0x90, 0x7c, 0xd8, 0xfc, 0x95, 0x37, 0xaa, - 0x0f, 0x8b, 0xbf, 0xf2, 0x46, 0x75, 0x0c, 0xfe, 0xfa, 0x3f, 0xe9, 0xfd, 0x41, 0x6e, 0x61, 0x6d, - 0x98, 0x30, 0x07, 0xc3, 0x82, 0x42, 0x8a, 0x1d, 0xa9, 0x35, 0x3b, 0x1b, 0x98, 0xe2, 0x40, 0x18, - 0xa6, 0x39, 0xff, 0x14, 0x14, 0x41, 0x2c, 0x5c, 0x88, 0xb3, 0x24, 0x16, 0x98, 0xe8, 0x50, 0x91, - 0xc1, 0x36, 0xe9, 0x13, 0xdf, 0x70, 0xba, 0xa1, 0xe7, 0x1b, 0xbd, 0xa2, 0xd2, 0x86, 0x0d, 0xd5, - 0x5a, 0x0a, 0x17, 0x1e, 0xc1, 0x4e, 0x07, 0x64, 0x60, 0x5b, 0x05, 0xe5, 0x0b, 0x1b, 0x90, 0x4e, - 0xbb, 0x85, 0x29, 0x0e, 0xfd, 0x7b, 0x55, 0x50, 0xee, 0x57, 0x50, 0x83, 0xc5, 0x70, 0x1c, 0xef, - 0x5e, 0xc7, 0xb7, 0x77, 0x6d, 0x87, 0xf4, 0x88, 0x25, 0x03, 0xf0, 0x03, 0x71, 0xf2, 0xca, 0xb4, - 0xa7, 0xd5, 0xbc, 0x4a, 0x38, 0xbf, 0x3d, 0xd5, 0xe5, 0x96, 0xcc, 0xf4, 0x45, 0xad, 0x52, 0x47, - 0x2d, 0x23, 0xd7, 0xbe, 0xf8, 0x82, 0x1a, 0x29, 0xc6, 0xa3, 0x74, 0xd1, 0x5f, 0xd5, 0xb8, 0xb5, - 0x2d, 0x5d, 0x76, 0x62, 0xd2, 0x6e, 0x9c, 0x96, 0x97, 0x38, 0xb6, 0xdb, 0x63, 0xaf, 0x60, 0x92, - 0x22, 0xfa, 0x96, 0x06, 0x17, 0x77, 0xb2, 0xbc, 0x6f, 0x62, 0x6e, 0x3b, 0x85, 0xfb, 0x92, 0xe3, - 0xcf, 0xe3, 0xe7, 0x87, 0x99, 0x15, 0x70, 0x76, 0x4f, 0xe4, 0x38, 0x49, 0xd7, 0x89, 0x90, 0x03, - 0xc5, 0xc7, 0x29, 0xe5, 0x84, 0x89, 0xc7, 0x49, 0x02, 0x70, 0x92, 0x22, 0x7a, 0x0b, 0x66, 0x77, - 0x22, 0x57, 0x94, 0x30, 0x6e, 0x5b, 0x85, 0xc9, 0x2b, 0x0e, 0x2d, 0x7e, 0x52, 0x29, 0x0b, 0x71, - 0x4c, 0x05, 0xd9, 0x30, 0xb3, 0xc3, 0xa5, 0x91, 0x30, 0x4a, 0x1b, 0xe5, 0xf5, 0x65, 0x6e, 0x19, - 0x89, 0x22, 0x1c, 0xe1, 0x57, 0xa3, 0x38, 0xaa, 0xc7, 0xc4, 0x42, 0x7d, 0x43, 0x83, 0x8b, 0xbb, - 0xc4, 0x0f, 0x6d, 0x33, 0xed, 0xfe, 0x9c, 0x2d, 0xa1, 0xd4, 0xbf, 0x96, 0x85, 0x91, 0xb3, 0x4a, - 0x26, 0x08, 0x67, 0xf7, 0x41, 0xff, 0x2f, 0x1a, 0x8c, 0x78, 0x83, 0xd0, 0x2f, 0x6a, 0x30, 0xb7, - 0x45, 0x8c, 0x70, 0xe8, 0x93, 0xeb, 0x46, 0x28, 0xa3, 0x74, 0x5f, 0x3f, 0x15, 0x2f, 0xd4, 0xca, - 0x35, 0x05, 0x33, 0x3f, 0x88, 0x91, 0x17, 0x83, 0x55, 0x10, 0x4e, 0x74, 0xe1, 0xf2, 0xa7, 0x61, - 0x69, 0xa4, 0xe1, 0x89, 0xfc, 0xfd, 0xbf, 0x23, 0xfc, 0x89, 0xe9, 0x44, 0x70, 0x6f, 0xc0, 0x94, - 0x61, 0x59, 0x32, 0xd9, 0xcc, 0x0b, 0x05, 0x0f, 0x1d, 0x2d, 0x35, 0x1c, 0x9a, 0xfd, 0xc4, 0x1c, - 0x2f, 0xba, 0x06, 0xc8, 0x48, 0x1c, 0xaf, 0xad, 0x7b, 0x56, 0x64, 0x2e, 0x31, 0xef, 0xee, 0xea, - 0x08, 0x14, 0x67, 0xb4, 0xd0, 0x3f, 0x05, 0x0b, 0xc9, 0xeb, 0x76, 0x27, 0x88, 0xc8, 0xd3, 0xff, - 0xba, 0x06, 0x68, 0xf4, 0x2a, 0x3a, 0x0a, 0xa0, 0x2a, 0x6a, 0x44, 0x93, 0x5c, 0xcc, 0xd5, 0x98, - 0x0e, 0x16, 0x8c, 0x23, 0xd2, 0x45, 0x41, 0x80, 0x25, 0x21, 0xfd, 0xcf, 0x34, 0x88, 0x93, 0x5a, - 0xa0, 0x8f, 0x43, 0xcd, 0x22, 0x81, 0xe9, 0xdb, 0x83, 0x30, 0xfe, 0x10, 0x79, 0x85, 0xb8, 0x15, - 0x83, 0xb0, 0x5a, 0x0f, 0xe9, 0x30, 0x1d, 0x1a, 0xc1, 0x4e, 0xbb, 0x25, 0x0c, 0x47, 0xb6, 0xcd, - 0xdf, 0x65, 0x25, 0x58, 0x40, 0xe2, 0xbb, 0x6b, 0x13, 0x63, 0xdc, 0x5d, 0x43, 0x5b, 0xa7, 0x70, - 0x51, 0x0f, 0x1d, 0x7f, 0x49, 0x4f, 0xff, 0xb7, 0x15, 0x48, 0x26, 0x12, 0x29, 0x3a, 0x04, 0xa3, - 0x37, 0x0b, 0x2b, 0x0f, 0xed, 0x66, 0xe1, 0x47, 0x58, 0xd2, 0x2d, 0x9e, 0x2a, 0x91, 0x1f, 0x86, - 0xa8, 0x99, 0xb2, 0x78, 0x9e, 0x43, 0x59, 0x03, 0x3d, 0xaf, 0xc6, 0xfe, 0xcd, 0x36, 0x3e, 0x10, - 0xad, 0x0b, 0x16, 0xd0, 0xf7, 0x40, 0xdc, 0x9d, 0x94, 0xdf, 0x9f, 0x08, 0xf3, 0xfb, 0xb8, 0x88, - 0x5c, 0x9b, 0x4a, 0xdc, 0xef, 0x8c, 0x2e, 0x85, 0x2e, 0x25, 0x1a, 0xc6, 0xe1, 0x6c, 0xfa, 0xd7, - 0x34, 0x98, 0x11, 0x69, 0x05, 0xc6, 0x08, 0xd9, 0xec, 0xc1, 0x14, 0x53, 0xd7, 0x4b, 0x69, 0x32, - 0xdd, 0x6d, 0xcf, 0x0b, 0x13, 0xe9, 0x15, 0x58, 0xa8, 0x18, 0xfb, 0x17, 0x73, 0xfc, 0xfa, 0x37, - 0x26, 0xe1, 0x49, 0x51, 0x65, 0x64, 0x9b, 0x96, 0x8b, 0x70, 0x1f, 0xce, 0x8b, 0x69, 0x6a, 0xf9, - 0x86, 0x2d, 0xcf, 0x8b, 0x8a, 0x59, 0x60, 0xe2, 0x2c, 0x71, 0x04, 0x1d, 0xce, 0xa2, 0x81, 0x7e, - 0x0a, 0x2e, 0x88, 0xe2, 0x1b, 0xc4, 0x70, 0xc2, 0xed, 0x88, 0x76, 0x31, 0x6b, 0x8c, 0x1d, 0x60, - 0xaf, 0x67, 0xe0, 0xc3, 0x99, 0x54, 0x58, 0xb4, 0x97, 0x00, 0x34, 0x7d, 0x62, 0xa8, 0x87, 0x65, - 0x25, 0xa2, 0xbd, 0xd6, 0x33, 0x31, 0xe2, 0x1c, 0x4a, 0xcc, 0x95, 0x65, 0xec, 0x31, 0xcb, 0x18, - 0x93, 0xd0, 0xb7, 0x59, 0xc2, 0x0b, 0xca, 0xe0, 0xdc, 0x96, 0x4d, 0x82, 0x70, 0xba, 0x2e, 0x7a, - 0x01, 0x16, 0xd8, 0xf9, 0x5f, 0x7c, 0x5d, 0x6b, 0x2a, 0xce, 0x9c, 0x79, 0x3b, 0x01, 0xc1, 0xa9, - 0x9a, 0xfa, 0xaf, 0x6b, 0x30, 0xa7, 0x32, 0xd0, 0x18, 0x81, 0x9d, 0xbb, 0x8a, 0xc0, 0x2e, 0x13, - 0x2d, 0xa9, 0x92, 0x1d, 0x53, 0x66, 0x9f, 0xcf, 0x68, 0xc3, 0x0e, 0xad, 0x48, 0x4a, 0xf8, 0x97, - 0x3a, 0xb4, 0x1a, 0xd9, 0x49, 0xe4, 0xa1, 0x55, 0x1a, 0x82, 0x47, 0x08, 0xa3, 0xd7, 0x61, 0xc2, - 0xf4, 0x6d, 0x31, 0x30, 0x9f, 0x2c, 0x66, 0x9f, 0xe0, 0x76, 0x1c, 0x3b, 0xdf, 0xc4, 0x6d, 0x4c, - 0x31, 0xea, 0xbf, 0x3d, 0x01, 0x35, 0x25, 0x6b, 0x09, 0x5a, 0x2f, 0x63, 0xdf, 0xc6, 0xe8, 0x23, - 0x1b, 0x77, 0x1d, 0x26, 0x7a, 0x83, 0x61, 0x41, 0x03, 0x57, 0xa2, 0xbb, 0x4e, 0xd1, 0xf5, 0x06, - 0x43, 0xf4, 0x9a, 0x34, 0x99, 0x8b, 0x19, 0xb5, 0x32, 0xe0, 0x2e, 0x65, 0x36, 0x47, 0xec, 0x39, - 0x99, 0xcb, 0x9e, 0x2e, 0xcc, 0x04, 0xc2, 0x9e, 0x9e, 0x2a, 0x91, 0x34, 0x47, 0x19, 0x6a, 0x61, - 0x40, 0x73, 0x3d, 0x3c, 0xb2, 0xaf, 0x23, 0x22, 0x54, 0x0b, 0x18, 0xb2, 0x88, 0x77, 0x66, 0x62, - 0x54, 0xb9, 0x16, 0xb0, 0xc1, 0x4a, 0xb0, 0x80, 0xe8, 0xff, 0x4c, 0x03, 0x34, 0x8a, 0x10, 0x7d, - 0x00, 0xa6, 0x58, 0xe0, 0xbf, 0x58, 0x6c, 0x4a, 0xa6, 0x04, 0x23, 0x08, 0x30, 0x87, 0xa1, 0xd7, - 0xc5, 0xad, 0x8e, 0x62, 0x33, 0x23, 0xb7, 0x70, 0x41, 0x53, 0xb9, 0x06, 0x12, 0xed, 0x51, 0x13, - 0x79, 0x7b, 0x94, 0xfe, 0xc3, 0x0a, 0x65, 0x39, 0xdb, 0x0d, 0x89, 0xcb, 0xe2, 0x30, 0xef, 0x03, - 0x18, 0xc3, 0xd0, 0xe3, 0x7b, 0xb2, 0xe0, 0xbc, 0xcf, 0x14, 0x1c, 0x5d, 0x89, 0x75, 0x55, 0x62, - 0xe4, 0x87, 0x22, 0xf1, 0x6f, 0xac, 0x50, 0xa3, 0xb4, 0x43, 0xbb, 0x4f, 0x5e, 0xb7, 0x5d, 0xcb, - 0xbb, 0x27, 0x06, 0xa3, 0x34, 0xed, 0xbb, 0x12, 0x23, 0xa7, 0x1d, 0xff, 0xc6, 0x0a, 0x35, 0xf4, - 0x59, 0x58, 0x66, 0xf9, 0x77, 0x5d, 0x96, 0xc3, 0x49, 0x74, 0xce, 0x73, 0x9c, 0x68, 0x97, 0xa8, - 0x36, 0x1e, 0x3f, 0x3c, 0xa8, 0x2f, 0x37, 0x73, 0xea, 0xe0, 0xdc, 0xd6, 0xfa, 0xb7, 0x35, 0xb8, - 0x98, 0x39, 0x16, 0xe8, 0x3a, 0x2c, 0xc5, 0x07, 0xe2, 0xaa, 0x54, 0xab, 0xc6, 0x49, 0xc9, 0x6e, - 0xa6, 0x2b, 0xe0, 0xd1, 0x36, 0x68, 0x5d, 0x6e, 0xed, 0xaa, 0xd4, 0x14, 0xa7, 0xe9, 0x8f, 0x09, - 0x54, 0x59, 0x82, 0x15, 0x67, 0xb5, 0xd3, 0xbf, 0x90, 0xe8, 0x70, 0x3c, 0x60, 0x94, 0x99, 0x37, - 0x49, 0x4f, 0x46, 0xcc, 0x4a, 0x66, 0x6e, 0xd0, 0x42, 0xcc, 0x61, 0xe8, 0x09, 0x35, 0x6e, 0x5d, - 0x4a, 0x8d, 0x28, 0x76, 0x5d, 0x1f, 0x02, 0xac, 0x7b, 0xae, 0x1d, 0x7a, 0xbe, 0xed, 0xf6, 0x50, - 0x0f, 0xaa, 0x86, 0xc8, 0x0e, 0x2d, 0x98, 0xed, 0xa5, 0x62, 0x96, 0x91, 0x40, 0xc2, 0x23, 0xb9, - 0xa2, 0x5f, 0x58, 0x22, 0xd7, 0xff, 0xa1, 0x06, 0x97, 0xb2, 0xef, 0x64, 0x8c, 0xb1, 0x1d, 0xf6, - 0xa1, 0xe6, 0xc7, 0xcd, 0x04, 0x67, 0xfe, 0x84, 0x7a, 0x3b, 0x5b, 0xc9, 0x16, 0x4f, 0x55, 0x85, - 0xa6, 0xef, 0x05, 0xd1, 0xec, 0xa4, 0x2f, 0x6c, 0xcb, 0xe5, 0xaa, 0xf4, 0x04, 0xab, 0xf8, 0xf5, - 0xaf, 0x54, 0x00, 0x6e, 0x93, 0xf0, 0x9e, 0xe7, 0xef, 0xd0, 0x31, 0x7a, 0x57, 0xdd, 0x0d, 0x7a, - 0x1c, 0x26, 0x07, 0x9e, 0x15, 0x08, 0x89, 0xc2, 0x2e, 0xed, 0xb0, 0xd3, 0x5c, 0x56, 0x8a, 0xea, - 0x30, 0xc5, 0xfc, 0xb6, 0x42, 0x76, 0x33, 0x4d, 0x95, 0x6a, 0x27, 0x01, 0xe6, 0xe5, 0xe8, 0x69, - 0xa8, 0x8a, 0x20, 0xc3, 0x40, 0xe8, 0xde, 0x6c, 0xc2, 0x44, 0x38, 0x62, 0x80, 0x25, 0x54, 0xff, - 0x99, 0x49, 0x48, 0xe4, 0x37, 0x8f, 0x2d, 0xe8, 0xc9, 0x87, 0x64, 0x41, 0x7f, 0x16, 0x96, 0x1d, - 0xcf, 0xb0, 0x1a, 0x86, 0x43, 0xd9, 0xde, 0xef, 0xf2, 0xf9, 0x30, 0xdc, 0x1e, 0x89, 0xf2, 0x94, - 0x33, 0x11, 0x70, 0x2b, 0xa7, 0x0e, 0xce, 0x6d, 0x8d, 0x86, 0x4a, 0x5a, 0x75, 0xaa, 0x33, 0xac, - 0x97, 0xce, 0xff, 0xbe, 0xa2, 0x46, 0x98, 0xca, 0x8d, 0x34, 0x99, 0x7a, 0x1d, 0x7d, 0x55, 0x83, - 0x8b, 0x64, 0x2f, 0x24, 0xbe, 0x6b, 0x38, 0x77, 0x7d, 0x63, 0x6b, 0xcb, 0x36, 0x13, 0xf1, 0x32, - 0x9d, 0xc3, 0x83, 0xfa, 0xc5, 0xb5, 0xac, 0x0a, 0x0f, 0x0e, 0xea, 0xcf, 0x8d, 0x3e, 0x70, 0x10, - 0xc5, 0x93, 0x66, 0x36, 0x61, 0xec, 0x98, 0x4d, 0xee, 0xf2, 0xf3, 0x50, 0x3b, 0x41, 0xfc, 0xe4, - 0xac, 0xea, 0x4f, 0xf9, 0xe5, 0x69, 0x50, 0xa2, 0x79, 0x4f, 0x90, 0x5b, 0xef, 0xef, 0x6b, 0x70, - 0xc1, 0x74, 0x6c, 0xe2, 0x86, 0xa9, 0xa8, 0x65, 0xbe, 0x34, 0x5e, 0x2b, 0x16, 0x67, 0x3c, 0x20, - 0x6e, 0xbb, 0xd5, 0xf4, 0x5c, 0x97, 0x98, 0x61, 0x33, 0x03, 0x3b, 0x37, 0x4e, 0xb2, 0x20, 0x38, - 0xb3, 0x37, 0xec, 0x83, 0x58, 0x79, 0xbb, 0xa5, 0x5e, 0xe5, 0x69, 0x8a, 0x32, 0x2c, 0xa1, 0xe8, - 0x59, 0xa8, 0xf5, 0x7c, 0x6f, 0x38, 0x08, 0x9a, 0x2c, 0x92, 0x87, 0xaf, 0x30, 0x16, 0x2a, 0x75, - 0x3d, 0x2e, 0xc6, 0x6a, 0x1d, 0xf4, 0x31, 0x98, 0xe3, 0x3f, 0x3b, 0x3e, 0xd9, 0xb2, 0xf7, 0xc4, - 0x8a, 0x63, 0x81, 0x01, 0xd7, 0x95, 0x72, 0x9c, 0xa8, 0x85, 0x3e, 0x0c, 0xb3, 0x76, 0x10, 0x0c, - 0x89, 0xbf, 0x81, 0x6f, 0x89, 0xc4, 0x3d, 0xcc, 0x1b, 0xda, 0x8e, 0x0a, 0x71, 0x0c, 0x47, 0xbf, - 0xa4, 0xc1, 0x82, 0x4f, 0xde, 0x1a, 0xda, 0x3e, 0xb1, 0x18, 0xd1, 0x40, 0xc4, 0x54, 0x77, 0x4b, - 0x06, 0x72, 0xaf, 0xe0, 0x04, 0x56, 0xce, 0xe9, 0xd2, 0x8f, 0x90, 0x04, 0xe2, 0x54, 0x17, 0xe8, - 0x58, 0x05, 0x76, 0xcf, 0xb5, 0xdd, 0xde, 0xaa, 0xd3, 0x0b, 0x96, 0xab, 0x6c, 0xf5, 0xb2, 0xb1, - 0xea, 0xc6, 0xc5, 0x58, 0xad, 0x83, 0x3e, 0x01, 0xf3, 0xc3, 0x80, 0xf2, 0x6e, 0x9f, 0xf0, 0x01, - 0x9e, 0x8d, 0x43, 0xec, 0x36, 0x54, 0x00, 0x4e, 0xd6, 0xa3, 0xa6, 0x59, 0x54, 0x20, 0x86, 0x19, - 0xf8, 0xe5, 0x5c, 0xda, 0xcf, 0x8d, 0x04, 0x04, 0xa7, 0x6a, 0x5e, 0x5e, 0x85, 0xf3, 0x19, 0x9f, - 0x79, 0xa2, 0x05, 0xf2, 0xeb, 0x15, 0x78, 0xff, 0xb1, 0x6c, 0x89, 0x7e, 0x59, 0x83, 0x1a, 0xd9, - 0x0b, 0x7d, 0x43, 0x06, 0xfc, 0xd1, 0x39, 0xea, 0x3d, 0x9c, 0x45, 0xb0, 0xb2, 0x16, 0x53, 0xe2, - 0xf3, 0x26, 0xf7, 0x3c, 0x05, 0x82, 0xd5, 0x0e, 0x51, 0x15, 0x9b, 0x5f, 0xde, 0x56, 0x1d, 0x6d, - 0x22, 0x21, 0xb4, 0x80, 0x5c, 0x7e, 0x19, 0x16, 0xd3, 0x98, 0x4f, 0x34, 0x54, 0xbf, 0x55, 0x81, - 0xa9, 0x8e, 0x63, 0xb8, 0x67, 0xf1, 0xd4, 0xc0, 0x17, 0x13, 0xf9, 0x3f, 0x8a, 0x65, 0x55, 0x61, - 0x7d, 0xcd, 0xcd, 0x0f, 0xb4, 0x9d, 0xca, 0x0f, 0xf4, 0x4a, 0x09, 0x1a, 0x47, 0xa7, 0x03, 0xfa, - 0x9e, 0x06, 0xb3, 0xac, 0xde, 0x19, 0xe4, 0x11, 0x79, 0x23, 0x99, 0x47, 0xe4, 0x85, 0xe2, 0x1f, - 0x95, 0x93, 0x36, 0xe4, 0x8f, 0xa3, 0x8f, 0x61, 0x59, 0x42, 0x3e, 0xa7, 0x66, 0xc0, 0xe7, 0x5f, - 0xf3, 0x74, 0x56, 0xd6, 0x9d, 0x5b, 0x9e, 0x69, 0x38, 0x69, 0x4d, 0xee, 0xe8, 0x34, 0xf8, 0x2e, - 0xcc, 0x12, 0x71, 0xab, 0x3e, 0xfa, 0x9a, 0x62, 0xba, 0x6d, 0x74, 0x37, 0x3f, 0xa6, 0x17, 0x95, - 0x04, 0x38, 0x26, 0xa1, 0xff, 0x4e, 0x05, 0x6a, 0xca, 0x6c, 0xbe, 0x23, 0xd9, 0x7d, 0xae, 0x65, - 0xe6, 0x8b, 0xae, 0xb0, 0x80, 0xbe, 0x4b, 0x27, 0x48, 0x36, 0x1f, 0x40, 0xcd, 0x8c, 0xd3, 0x15, - 0x96, 0x62, 0x70, 0x25, 0xed, 0xa1, 0x08, 0x2c, 0x8e, 0x0b, 0xb0, 0x4a, 0x45, 0xff, 0x17, 0x15, - 0x98, 0xe9, 0xf8, 0x1e, 0x9d, 0xe3, 0x33, 0x10, 0x10, 0x9b, 0x09, 0x01, 0x51, 0x70, 0xf1, 0xf2, - 0xde, 0xe6, 0x8a, 0x88, 0x37, 0x53, 0x22, 0xa2, 0x51, 0x8a, 0xca, 0xd1, 0x42, 0xe2, 0x0f, 0x35, - 0xa8, 0x89, 0x9a, 0x67, 0x20, 0x26, 0x8c, 0xa4, 0x98, 0x78, 0xb1, 0xcc, 0x87, 0xe5, 0x08, 0x8a, - 0xbf, 0xa7, 0xc1, 0xbc, 0xa8, 0xb1, 0x4e, 0xfa, 0x9b, 0xc4, 0x47, 0xd7, 0x60, 0x26, 0x18, 0xb2, - 0xb9, 0x14, 0x5f, 0xf4, 0x98, 0x2a, 0x2a, 0xfc, 0x4d, 0xc3, 0x64, 0xef, 0x1e, 0xf0, 0x2a, 0x4a, - 0x62, 0x2e, 0x5e, 0x80, 0xa3, 0xc6, 0xd4, 0xa0, 0xf3, 0x3d, 0x67, 0xe4, 0xda, 0x3c, 0xf6, 0x1c, - 0x82, 0x19, 0x84, 0xda, 0x51, 0xf4, 0x6f, 0x74, 0xa4, 0xc4, 0xec, 0x28, 0x0a, 0x0e, 0x30, 0x2f, - 0xd7, 0x7f, 0x6e, 0x52, 0x8e, 0x36, 0x93, 0x63, 0x37, 0x60, 0xd6, 0xf4, 0x89, 0x11, 0x12, 0xab, - 0xb1, 0x3f, 0x4e, 0xe7, 0x98, 0x42, 0xd7, 0x8c, 0x5a, 0xe0, 0xb8, 0x31, 0x55, 0x9d, 0xd4, 0x53, - 0xa2, 0x4a, 0xac, 0x66, 0xe6, 0x9e, 0x10, 0xbd, 0x08, 0x53, 0xde, 0x3d, 0x57, 0xc6, 0x49, 0x1c, - 0x49, 0x98, 0x7d, 0xca, 0x1d, 0x5a, 0x1b, 0xf3, 0x46, 0x6a, 0xa2, 0x87, 0xc9, 0x23, 0x12, 0x3d, - 0xf4, 0x61, 0xa6, 0xcf, 0xa6, 0x21, 0x4a, 0xcb, 0x50, 0x8a, 0x99, 0xf9, 0x8c, 0xaa, 0x09, 0x29, - 0x19, 0x6a, 0x1c, 0xd1, 0xa0, 0x4a, 0x30, 0xd5, 0xd3, 0x82, 0x81, 0x61, 0x12, 0x55, 0x09, 0xbe, - 0x1d, 0x15, 0xe2, 0x18, 0x8e, 0xee, 0x43, 0x8d, 0xdf, 0x64, 0xe6, 0xb2, 0x76, 0xa6, 0x84, 0x4f, - 0x52, 0xf4, 0xef, 0x6e, 0x8c, 0x8e, 0x0f, 0xbe, 0x52, 0x80, 0x55, 0x62, 0xfa, 0x2f, 0x4c, 0x48, - 0x36, 0x15, 0x82, 0x3f, 0x3b, 0x69, 0xbf, 0x56, 0xe8, 0xd5, 0x8f, 0xe7, 0x60, 0x6a, 0xb0, 0x6d, - 0x04, 0x11, 0xaf, 0x46, 0xd9, 0x53, 0xa7, 0x3a, 0xb4, 0xf0, 0xc1, 0x41, 0x7d, 0x4e, 0x90, 0x66, - 0xbf, 0x31, 0xaf, 0x8b, 0x86, 0x70, 0x3e, 0x08, 0x0d, 0x87, 0x74, 0x6d, 0xe1, 0x3e, 0x0a, 0x42, - 0xa3, 0x3f, 0x28, 0x90, 0x04, 0x95, 0x9d, 0x32, 0x75, 0x47, 0x51, 0xe1, 0x2c, 0xfc, 0xe8, 0x67, - 0x34, 0x58, 0x66, 0xe5, 0xab, 0xc3, 0xd0, 0xe3, 0x99, 0x8d, 0x63, 0xe2, 0x27, 0x3f, 0x64, 0x65, - 0xc6, 0x7e, 0x37, 0x07, 0x1f, 0xce, 0xa5, 0xa4, 0xff, 0x5f, 0x0d, 0xd0, 0xe8, 0x2c, 0xa2, 0x3e, - 0x54, 0x2d, 0xb2, 0x65, 0x0c, 0x9d, 0x30, 0xda, 0x8c, 0x8b, 0x5d, 0x75, 0x8d, 0x71, 0xc6, 0x02, - 0xb2, 0x25, 0x10, 0x63, 0x49, 0x02, 0x0d, 0x60, 0xf6, 0xde, 0xb6, 0x1d, 0x12, 0xc7, 0x0e, 0x42, - 0x21, 0x24, 0x4b, 0xd3, 0x93, 0xfa, 0xc7, 0xeb, 0x11, 0x66, 0x1c, 0x13, 0xd1, 0xff, 0xda, 0x04, - 0x54, 0x4f, 0xf0, 0x38, 0xd3, 0x10, 0x90, 0xb8, 0xe8, 0x4e, 0x95, 0x16, 0x52, 0xc6, 0x6f, 0xc5, - 0x34, 0x8b, 0xe6, 0x08, 0x32, 0x9c, 0x41, 0x00, 0xbd, 0x0d, 0x17, 0x6c, 0x77, 0xcb, 0x37, 0x82, - 0xd0, 0x1f, 0x9a, 0xe1, 0xd0, 0x8f, 0x08, 0x17, 0x4a, 0x50, 0xc2, 0x8c, 0xfd, 0x76, 0x06, 0x3a, - 0x9c, 0x49, 0x04, 0x6d, 0xc1, 0xcc, 0x3d, 0xcf, 0xdf, 0xa1, 0x32, 0x6c, 0xb2, 0x44, 0x2e, 0xf8, - 0xd7, 0x19, 0x8e, 0x58, 0x78, 0xf1, 0xdf, 0x01, 0x8e, 0x90, 0xeb, 0x7f, 0xa0, 0xc1, 0x14, 0xbf, - 0x2c, 0xf5, 0xde, 0x30, 0x74, 0x58, 0x5f, 0x73, 0xf3, 0x1a, 0x52, 0xf3, 0x83, 0xd5, 0x78, 0xaf, - 0x98, 0x1f, 0xac, 0xb3, 0x39, 0x5a, 0xc5, 0x1f, 0x4c, 0x88, 0x8f, 0x61, 0xdb, 0x76, 0x1b, 0xce, - 0x0b, 0x0d, 0xf4, 0x96, 0xbd, 0x45, 0x28, 0x83, 0xb5, 0x8c, 0xfd, 0x40, 0x5c, 0x00, 0x66, 0xd2, - 0xaf, 0x39, 0x0a, 0xc6, 0x59, 0x6d, 0xd0, 0xbf, 0xd4, 0xe8, 0x06, 0x19, 0xfa, 0xb6, 0x59, 0x2e, - 0x07, 0xa3, 0xec, 0xdc, 0xca, 0x3a, 0xc7, 0xc6, 0x2d, 0xf8, 0x8d, 0x78, 0xa7, 0x64, 0xa5, 0x0f, - 0x0e, 0xea, 0xf5, 0x0c, 0x0f, 0x61, 0xe4, 0xd3, 0xa6, 0x43, 0xfb, 0x95, 0x1f, 0x1e, 0x59, 0x85, - 0xf9, 0xd7, 0xa3, 0x2e, 0xa3, 0x1b, 0x30, 0x15, 0x98, 0xde, 0x80, 0x1c, 0xf5, 0x0c, 0x59, 0xda, - 0xfe, 0x92, 0x23, 0xdc, 0xa5, 0x2d, 0x31, 0x47, 0x70, 0xf9, 0x4d, 0x98, 0x53, 0x7b, 0x9e, 0xe1, - 0x21, 0x68, 0xa9, 0x1e, 0x82, 0x13, 0x9f, 0xb7, 0xa9, 0x1e, 0x85, 0xdf, 0xad, 0x80, 0x78, 0xc9, - 0x65, 0x8c, 0x53, 0x84, 0x37, 0xa3, 0x9c, 0x73, 0x65, 0x9e, 0xaf, 0x49, 0xbf, 0x09, 0x19, 0x0f, - 0x82, 0x9a, 0x76, 0x0e, 0x79, 0x30, 0xed, 0x18, 0x9b, 0xc4, 0x89, 0x5e, 0xf5, 0xb8, 0x5e, 0xe2, - 0xd1, 0x09, 0x9e, 0xa7, 0x39, 0x48, 0xf9, 0x9a, 0x79, 0x21, 0x16, 0x64, 0x2e, 0x3f, 0x0f, 0x35, - 0xa5, 0xda, 0x89, 0xdc, 0x32, 0x7f, 0xa8, 0xc1, 0x5c, 0x22, 0xf1, 0x54, 0x1f, 0x26, 0x7c, 0x69, - 0x8e, 0x17, 0x3d, 0x66, 0x89, 0xa2, 0x81, 0x1e, 0x3b, 0xa2, 0x12, 0xa6, 0x74, 0x64, 0x8e, 0xaa, - 0xca, 0x69, 0xe5, 0xa8, 0xfa, 0xba, 0x06, 0x97, 0xa2, 0x0f, 0x4a, 0x26, 0x36, 0x40, 0x4f, 0x43, - 0xd5, 0x18, 0xd8, 0xcc, 0xf9, 0xaa, 0xfa, 0xaf, 0x57, 0x3b, 0x6d, 0x56, 0x86, 0x25, 0x14, 0x7d, - 0x04, 0xaa, 0x11, 0xeb, 0x09, 0xe5, 0x4b, 0xca, 0x2d, 0x79, 0x70, 0x24, 0x6b, 0xa0, 0xa7, 0x94, - 0xbc, 0x80, 0x53, 0xf1, 0x46, 0x2d, 0x09, 0xf3, 0xf3, 0x60, 0xfd, 0x6b, 0x15, 0x98, 0xe7, 0xce, - 0x8a, 0x86, 0xed, 0x5a, 0xb6, 0xdb, 0x3b, 0x83, 0x0d, 0x22, 0xf1, 0xc8, 0x60, 0xe5, 0xb4, 0x1e, - 0x19, 0xbc, 0x09, 0xd3, 0x6f, 0x51, 0x49, 0x15, 0x31, 0xf8, 0x58, 0x02, 0x43, 0x32, 0x2f, 0x13, - 0x72, 0x01, 0x16, 0x28, 0xf4, 0x3f, 0xd1, 0x60, 0x29, 0x31, 0x2c, 0x67, 0xb0, 0xd3, 0xf4, 0x92, - 0x3b, 0x4d, 0xa3, 0x60, 0x82, 0x0f, 0xa5, 0xd3, 0x39, 0x3b, 0xce, 0x6f, 0x56, 0x80, 0x3d, 0x69, - 0x76, 0x06, 0x53, 0xfd, 0x46, 0x42, 0x17, 0x78, 0xa9, 0xf8, 0xdb, 0x33, 0x79, 0x0e, 0x8d, 0x5e, - 0xca, 0xa1, 0xf1, 0xe9, 0xe2, 0x24, 0x8e, 0xf6, 0x66, 0xfc, 0x4a, 0x05, 0x80, 0x56, 0xe3, 0x8f, - 0xbf, 0x89, 0xb8, 0xc4, 0xf8, 0x31, 0xd0, 0xd9, 0x77, 0xcb, 0x0b, 0x9e, 0xba, 0x7c, 0x5f, 0x6c, - 0x22, 0x76, 0x9b, 0x27, 0xdf, 0x16, 0x4b, 0x2e, 0xc0, 0xc9, 0x53, 0x5a, 0x80, 0xfa, 0x6f, 0x6a, - 0xc0, 0x52, 0x8e, 0xb7, 0x6e, 0x77, 0xd1, 0x27, 0x60, 0xde, 0xe6, 0xe7, 0x92, 0x2d, 0x35, 0xa3, - 0x16, 0x3b, 0x3b, 0x69, 0xab, 0x00, 0x9c, 0xac, 0x87, 0x5c, 0x65, 0x5c, 0xcb, 0xbc, 0xbc, 0x28, - 0x3a, 0x22, 0x73, 0xea, 0xce, 0x65, 0xcf, 0x8c, 0xfe, 0xa3, 0x0a, 0x9c, 0x4b, 0xd5, 0x1d, 0xc3, - 0x54, 0x79, 0x38, 0x12, 0x4c, 0x49, 0xb3, 0x3b, 0x71, 0x06, 0x69, 0x76, 0x65, 0xc6, 0xdb, 0xc9, - 0x87, 0x9c, 0xf1, 0xf6, 0xbb, 0x1a, 0x54, 0xe9, 0x18, 0x9f, 0x81, 0x0c, 0xfd, 0xc9, 0xa4, 0x0c, - 0x7d, 0xbe, 0x30, 0xef, 0xe4, 0x88, 0xce, 0x3f, 0xd3, 0x80, 0xbd, 0x48, 0x21, 0x82, 0x31, 0x94, - 0xf8, 0x06, 0x2d, 0x27, 0xbe, 0xe1, 0x49, 0x11, 0x1e, 0x91, 0x72, 0xed, 0x29, 0x21, 0x12, 0x1f, - 0x51, 0x22, 0x20, 0x26, 0x92, 0xa2, 0x64, 0x34, 0x0a, 0x02, 0xbd, 0x0d, 0xf3, 0xc1, 0xb6, 0xe7, - 0x85, 0x91, 0x85, 0x2f, 0x66, 0xaf, 0x51, 0x3c, 0x94, 0x38, 0xfa, 0x16, 0xbe, 0x3a, 0xbb, 0x2a, - 0x72, 0x9c, 0xa4, 0xa5, 0xff, 0x9e, 0xf8, 0xfc, 0x13, 0x2c, 0x95, 0x33, 0x14, 0x7d, 0x1f, 0x4a, - 0x89, 0xbe, 0xbc, 0xa7, 0x15, 0x7f, 0x4b, 0x7c, 0x85, 0x7c, 0xb0, 0xcc, 0x81, 0x79, 0x47, 0x7d, - 0x79, 0x44, 0x30, 0x66, 0xa1, 0x47, 0x4b, 0xc4, 0x7b, 0x9d, 0x4a, 0x11, 0x4e, 0x22, 0xa7, 0xb2, - 0x31, 0xea, 0xb8, 0xfa, 0x0e, 0x3b, 0x6b, 0xd8, 0x51, 0x01, 0x38, 0x59, 0x4f, 0x7f, 0x15, 0x3e, - 0xc8, 0xbb, 0xcd, 0xe2, 0xb7, 0xd7, 0xf6, 0x4c, 0x12, 0x04, 0x4d, 0x63, 0x60, 0x98, 0xd4, 0x06, - 0x61, 0x37, 0x20, 0xb9, 0x8b, 0xee, 0x99, 0x74, 0x06, 0x54, 0xe9, 0x17, 0x48, 0x67, 0x41, 0xd5, - 0xbf, 0x5c, 0x81, 0xba, 0x82, 0x33, 0x11, 0xc9, 0x12, 0x71, 0xdc, 0x37, 0x35, 0xa8, 0x19, 0xae, - 0xeb, 0x85, 0x86, 0x7a, 0x70, 0x44, 0x4a, 0xbc, 0x23, 0x97, 0x4b, 0x6b, 0x65, 0x35, 0xa6, 0x93, - 0x3a, 0x27, 0x56, 0x20, 0x58, 0xed, 0xce, 0xe5, 0x97, 0x61, 0x31, 0xdd, 0xea, 0x44, 0xc6, 0x46, - 0x03, 0x2e, 0x2a, 0xbd, 0x12, 0x17, 0xc9, 0xa8, 0x22, 0xfc, 0x0c, 0xcc, 0xec, 0xda, 0x81, 0x1d, - 0x5d, 0x4a, 0x56, 0x86, 0xf1, 0x35, 0x5e, 0x8c, 0x23, 0xb8, 0xfe, 0x0a, 0x9c, 0x57, 0x71, 0xb0, - 0x35, 0x73, 0xbb, 0x7b, 0x92, 0x89, 0x58, 0x87, 0x27, 0x15, 0x0c, 0x99, 0x57, 0xa9, 0x4e, 0x82, - 0xee, 0x67, 0xa7, 0x23, 0x16, 0x17, 0xb1, 0xfe, 0xdf, 0xd1, 0xe0, 0x51, 0x92, 0xc7, 0x31, 0x82, - 0xdf, 0x3f, 0x57, 0x76, 0x4a, 0x73, 0x59, 0x52, 0xa4, 0xae, 0xc9, 0x03, 0xe3, 0xfc, 0xae, 0xa1, - 0xfb, 0x00, 0x81, 0x9c, 0x93, 0x52, 0x21, 0xa0, 0x99, 0xb3, 0x2c, 0xf2, 0x95, 0xca, 0xdf, 0x58, - 0xa1, 0x86, 0x7c, 0xa8, 0x06, 0x62, 0x2e, 0x4b, 0xdd, 0xf8, 0xcc, 0xe0, 0x0d, 0x11, 0xe5, 0x26, - 0x7e, 0x61, 0x49, 0x07, 0xfd, 0x9a, 0x06, 0x17, 0x9c, 0x8c, 0xa5, 0x21, 0xe4, 0xfc, 0xdd, 0x87, - 0xb1, 0xec, 0xb8, 0xdb, 0x32, 0x0b, 0x82, 0x33, 0xfb, 0x82, 0xfe, 0x41, 0xee, 0xdd, 0x42, 0x1e, - 0x7d, 0xbd, 0x51, 0xb6, 0x97, 0xa7, 0x75, 0xcd, 0xf0, 0xdf, 0xcc, 0x70, 0xd5, 0x83, 0xf9, 0xd6, - 0x4c, 0x98, 0xde, 0x64, 0xda, 0xbb, 0xe0, 0xf7, 0xe2, 0xb6, 0x82, 0x78, 0xae, 0x9e, 0xe9, 0xd6, - 0xfc, 0x7f, 0x2c, 0x50, 0xa3, 0x15, 0x80, 0x4d, 0xc7, 0x33, 0x77, 0x9a, 0xed, 0x16, 0x8e, 0x44, - 0x3b, 0xe3, 0xb1, 0x86, 0x2c, 0xc5, 0x4a, 0x0d, 0xf4, 0x05, 0x98, 0xb0, 0xa4, 0xc2, 0xf7, 0x62, - 0x19, 0x5d, 0x37, 0x0e, 0xad, 0xa5, 0x1c, 0x45, 0xb1, 0x22, 0x0f, 0xaa, 0xae, 0xd8, 0xdd, 0x05, - 0xff, 0x14, 0x7f, 0xfe, 0x53, 0xaa, 0x09, 0x52, 0x3b, 0x89, 0x4a, 0xb0, 0x24, 0x42, 0x09, 0x4a, - 0xf5, 0x7d, 0xaa, 0x24, 0x41, 0xa9, 0xbb, 0x1f, 0x65, 0x59, 0x75, 0x54, 0x4d, 0x7c, 0x7a, 0x7c, - 0x4d, 0x7c, 0x3e, 0x57, 0x0b, 0xdf, 0x82, 0xe9, 0xd0, 0x60, 0x21, 0x1a, 0x33, 0x25, 0x22, 0x24, - 0xe8, 0x07, 0xdc, 0xa5, 0x68, 0x62, 0x2d, 0x84, 0xfd, 0x0c, 0xb0, 0xc0, 0x4e, 0xb9, 0x91, 0x3f, - 0x4d, 0x2a, 0x52, 0x47, 0x15, 0xe7, 0x46, 0xfe, 0xd6, 0x03, 0xe7, 0x46, 0xfe, 0x3f, 0x16, 0xa8, - 0xd1, 0x0e, 0xd5, 0x2d, 0xf9, 0x16, 0x20, 0xae, 0xfd, 0xae, 0x96, 0x5d, 0x9a, 0x41, 0x14, 0xa0, - 0xcb, 0x7f, 0x61, 0x49, 0x00, 0x99, 0x30, 0x23, 0x8c, 0x39, 0x91, 0x90, 0xf3, 0xc5, 0x32, 0x49, - 0x91, 0xa3, 0x27, 0x4c, 0xf8, 0x1d, 0xbf, 0x08, 0xb3, 0xfe, 0xdb, 0x13, 0xdc, 0x0e, 0x7f, 0x07, - 0x63, 0x5a, 0x7a, 0x50, 0x8d, 0x90, 0x95, 0x72, 0x6c, 0x44, 0x39, 0xf6, 0xf9, 0x80, 0xca, 0x8c, - 0xfb, 0x12, 0x39, 0x6a, 0x66, 0x5d, 0x07, 0x50, 0x92, 0x0d, 0x8d, 0x75, 0x15, 0x20, 0xfb, 0xf0, - 0x77, 0xb2, 0xd0, 0xe1, 0xef, 0x4b, 0x70, 0x2e, 0x8a, 0x8f, 0xb1, 0x08, 0xf3, 0x7d, 0x8b, 0x08, - 0x52, 0x76, 0x67, 0xad, 0x99, 0x04, 0xe1, 0x74, 0x5d, 0xfd, 0x26, 0xcc, 0xca, 0x75, 0x81, 0x9e, - 0x50, 0x74, 0xb4, 0x58, 0x74, 0xdd, 0x24, 0xfb, 0x5c, 0x61, 0xab, 0x27, 0x14, 0x36, 0x6e, 0x58, - 0xbd, 0x46, 0x0b, 0x84, 0xee, 0xa6, 0xff, 0x37, 0x8d, 0x33, 0x82, 0x78, 0x47, 0xc5, 0x80, 0x5a, - 0x9f, 0x27, 0x2f, 0x62, 0x89, 0x33, 0x8b, 0xdd, 0x90, 0x62, 0x07, 0xeb, 0xeb, 0x31, 0x1a, 0xac, - 0xe2, 0x44, 0x7b, 0xa3, 0x8f, 0xfd, 0x5c, 0x2f, 0xb9, 0x68, 0xc7, 0x7e, 0xf3, 0x07, 0x8d, 0xb6, - 0x51, 0x1f, 0x56, 0xd1, 0x8e, 0x7e, 0x58, 0xe5, 0xf8, 0xf7, 0x21, 0xf4, 0x7f, 0xaa, 0x41, 0x66, - 0x0e, 0x60, 0xa4, 0xc3, 0x34, 0x0f, 0xee, 0x55, 0x9f, 0x41, 0xe2, 0x91, 0xbf, 0x58, 0x40, 0x90, - 0x0f, 0x17, 0x44, 0xe4, 0xec, 0x4d, 0xb2, 0x1f, 0x3f, 0xbf, 0x23, 0x56, 0xc7, 0xf8, 0xf1, 0x73, - 0x2c, 0xab, 0x49, 0x37, 0x85, 0x09, 0x67, 0xe2, 0x66, 0xb1, 0x9b, 0x4c, 0x7f, 0x7a, 0x8f, 0x1c, - 0x69, 0xb2, 0xbe, 0x3e, 0xe4, 0xd8, 0x4d, 0x4e, 0xe3, 0xf8, 0xd8, 0x4d, 0x56, 0xef, 0xbd, 0x72, - 0x78, 0xca, 0x3a, 0x9b, 0xe3, 0x8f, 0xf9, 0x7d, 0x0d, 0x96, 0x46, 0xee, 0x43, 0x8f, 0x71, 0xf2, - 0x76, 0x86, 0x5e, 0x89, 0xa7, 0xd2, 0x0f, 0xaf, 0xd4, 0x32, 0x13, 0x25, 0xbc, 0x0e, 0xf3, 0x09, - 0x6f, 0x8c, 0xbc, 0x57, 0xa3, 0x65, 0xde, 0xab, 0x51, 0xaf, 0xcd, 0x54, 0x8e, 0xbc, 0x36, 0xf3, - 0xbf, 0xe7, 0xc4, 0x7c, 0x33, 0x1d, 0xf8, 0x0d, 0x98, 0x66, 0x77, 0x5b, 0xa2, 0x97, 0xbc, 0x3e, - 0x55, 0xfc, 0xd2, 0x4c, 0xc0, 0x45, 0x01, 0xff, 0x1f, 0x0b, 0xb4, 0xa8, 0x05, 0x8b, 0xec, 0xb1, - 0xe7, 0x8e, 0xef, 0x6d, 0xd9, 0x0e, 0xb9, 0x1d, 0x4b, 0x1d, 0x79, 0xa1, 0xb6, 0x99, 0x82, 0xe3, - 0x91, 0x16, 0xa8, 0xab, 0x6a, 0xc5, 0x9f, 0x2c, 0xea, 0x99, 0xe4, 0x09, 0x8c, 0xa4, 0x36, 0xec, - 0x03, 0x90, 0x68, 0xea, 0xa2, 0x78, 0x8b, 0x97, 0x0b, 0x5e, 0x16, 0x96, 0x1c, 0x10, 0xc9, 0x0d, - 0x59, 0x14, 0x60, 0x85, 0x0a, 0x0a, 0xa0, 0xb6, 0x1d, 0xbf, 0xf5, 0x22, 0x74, 0xe2, 0x57, 0xca, - 0x3e, 0x34, 0xc3, 0x37, 0x2a, 0xa5, 0x00, 0xab, 0x54, 0x50, 0x90, 0x78, 0x67, 0xbb, 0x4c, 0x1a, - 0xfd, 0x58, 0xc3, 0x38, 0xee, 0x8d, 0x6d, 0x4a, 0xd4, 0x95, 0x57, 0xd4, 0x44, 0xc4, 0x5b, 0x31, - 0xa2, 0xf1, 0x4d, 0xb7, 0x98, 0x68, 0x5c, 0x86, 0x15, 0x32, 0x74, 0x78, 0xfb, 0xf1, 0xc5, 0x44, - 0xa1, 0x49, 0xbf, 0x52, 0xf6, 0x86, 0xa8, 0xd0, 0x03, 0xe2, 0x02, 0xac, 0x52, 0x41, 0x1e, 0x40, - 0x5f, 0x5e, 0x58, 0x14, 0x6a, 0x75, 0xb1, 0x2f, 0x8d, 0xef, 0x3d, 0x72, 0x1b, 0x31, 0xfe, 0x8d, - 0x15, 0x12, 0x54, 0x8b, 0x97, 0x56, 0x15, 0x94, 0x50, 0x38, 0xc7, 0xb2, 0xa8, 0x3e, 0x1e, 0x6b, - 0x15, 0x35, 0xb6, 0x6e, 0x1f, 0x53, 0x34, 0x8a, 0x07, 0x07, 0xf5, 0x39, 0x26, 0x4c, 0x46, 0x34, - 0x8c, 0xd8, 0xf9, 0x3a, 0x77, 0x94, 0xf3, 0x15, 0x5d, 0x87, 0xa5, 0x40, 0x3d, 0xa3, 0x64, 0x02, - 0x62, 0x9e, 0x35, 0x91, 0x57, 0x5c, 0xbb, 0xe9, 0x0a, 0x78, 0xb4, 0x0d, 0x97, 0x80, 0xc4, 0x62, - 0xed, 0x17, 0x54, 0x09, 0xc8, 0xcb, 0xb0, 0x84, 0xa2, 0x7b, 0xa9, 0x27, 0xa9, 0xcf, 0x95, 0x36, - 0x84, 0xc6, 0x7b, 0xa0, 0x1a, 0xfd, 0x94, 0xfa, 0x74, 0xd8, 0x62, 0x89, 0x10, 0x9c, 0x22, 0x6f, - 0x87, 0xa1, 0xdd, 0x64, 0x0c, 0xea, 0xd2, 0xe9, 0x84, 0xfc, 0x49, 0x87, 0x6c, 0x6e, 0xfc, 0xe9, - 0xbf, 0xa3, 0x8a, 0x79, 0xa4, 0x88, 0x90, 0x33, 0xd0, 0xce, 0x48, 0x42, 0x3b, 0x6b, 0x96, 0xd3, - 0x9c, 0x48, 0x6e, 0xd4, 0xd9, 0x1f, 0x69, 0xb0, 0x10, 0x57, 0x3b, 0x03, 0xed, 0xc9, 0x4a, 0x6a, - 0x4f, 0x9f, 0x2e, 0xf9, 0x61, 0x39, 0x2a, 0xd4, 0xff, 0xaf, 0xa8, 0x9f, 0xc5, 0x94, 0x84, 0x7b, - 0x8a, 0x81, 0xcb, 0x4d, 0xea, 0x76, 0x29, 0x03, 0x57, 0x8d, 0xe5, 0x89, 0xbf, 0x38, 0xc3, 0xe0, - 0xfd, 0x52, 0x62, 0x87, 0x2e, 0x13, 0xb4, 0x96, 0xfd, 0x06, 0xe1, 0xb1, 0xdb, 0xb5, 0xaf, 0xae, - 0x58, 0x1e, 0x47, 0xb2, 0x5a, 0x30, 0x50, 0x4a, 0xf9, 0xe4, 0xa3, 0xdf, 0xf8, 0xfb, 0xda, 0x2c, - 0xd4, 0x14, 0xc5, 0xfd, 0x1d, 0x71, 0x69, 0x0c, 0xa1, 0x66, 0x7a, 0x6e, 0x10, 0xfa, 0x86, 0x72, - 0x39, 0xa9, 0x2c, 0x51, 0x29, 0x2a, 0x9a, 0x31, 0x6a, 0xac, 0xd2, 0xa1, 0x1b, 0x9b, 0x64, 0xb4, - 0x89, 0xd3, 0xf0, 0xa4, 0x1c, 0xc5, 0x5c, 0x1f, 0x03, 0x88, 0x94, 0x24, 0xf9, 0x04, 0xaa, 0xcc, - 0x00, 0xd7, 0x0e, 0x6e, 0x48, 0x18, 0x56, 0xea, 0xa1, 0xb7, 0x61, 0xde, 0x51, 0x73, 0x3f, 0x09, - 0x15, 0xae, 0xd8, 0x79, 0x6b, 0x22, 0x8b, 0x54, 0x74, 0x54, 0xa8, 0x14, 0xe1, 0x24, 0x2d, 0xb4, - 0x03, 0xb3, 0x4e, 0x94, 0xb0, 0x4c, 0xe8, 0x71, 0x2f, 0x17, 0x26, 0xcc, 0xb0, 0x70, 0xc7, 0xa7, - 0xfc, 0x89, 0x63, 0xfc, 0x94, 0xef, 0xe4, 0x8f, 0x72, 0xce, 0xcf, 0x98, 0x9a, 0xe4, 0x3b, 0x59, - 0x14, 0x60, 0x85, 0x4a, 0x8e, 0x73, 0xaa, 0x5a, 0xc8, 0x39, 0x35, 0x84, 0xf3, 0x3e, 0x09, 0xfd, - 0xfd, 0xe6, 0xbe, 0xc9, 0x5e, 0xd6, 0xf3, 0x43, 0x96, 0x9b, 0x6c, 0xb6, 0xd8, 0x25, 0x03, 0x3c, - 0x8a, 0x0a, 0x67, 0xe1, 0xa7, 0x76, 0x1a, 0xdd, 0xf4, 0xc5, 0x1d, 0x5f, 0x66, 0xa7, 0xb1, 0x87, - 0xf7, 0x59, 0x29, 0xfa, 0x38, 0xd4, 0x42, 0x62, 0x6e, 0xbb, 0xb6, 0x69, 0x38, 0xed, 0x96, 0xd0, - 0xa8, 0xe2, 0x3d, 0x34, 0x06, 0x61, 0xb5, 0x1e, 0x6a, 0xc0, 0xc4, 0xd0, 0xb6, 0x84, 0x2a, 0xf5, - 0xe3, 0xf2, 0x49, 0xdd, 0x76, 0xeb, 0xc1, 0x41, 0xfd, 0xfd, 0x71, 0x08, 0xad, 0xfc, 0x92, 0xab, - 0x83, 0x9d, 0xde, 0xd5, 0x70, 0x7f, 0x40, 0x82, 0x95, 0x8d, 0x76, 0x0b, 0xd3, 0xc6, 0x59, 0xce, - 0xba, 0xf9, 0x13, 0x38, 0xeb, 0x6e, 0x01, 0xc4, 0x5b, 0x7c, 0x69, 0x6f, 0xdd, 0x7f, 0x9e, 0x82, - 0x8b, 0x65, 0x4f, 0x35, 0x59, 0xde, 0x2e, 0xf6, 0xb4, 0xc0, 0xea, 0x56, 0x48, 0xfc, 0x3b, 0x77, - 0xd6, 0xef, 0x6e, 0xfb, 0x24, 0xd8, 0xf6, 0x1c, 0xab, 0x60, 0xe2, 0xb0, 0xf8, 0x71, 0x8a, 0x11, - 0x8c, 0x38, 0x87, 0x12, 0x6a, 0xc2, 0x52, 0xf4, 0xbc, 0x01, 0xa6, 0x5b, 0xca, 0xd0, 0x0f, 0x42, - 0x11, 0x65, 0xc9, 0x9c, 0xb2, 0x6b, 0x69, 0x20, 0x1e, 0xad, 0x9f, 0x46, 0xc2, 0x9f, 0x39, 0x98, - 0x64, 0x2f, 0x22, 0x8e, 0x20, 0xe1, 0x6f, 0x1d, 0x8c, 0xd6, 0x57, 0x91, 0xc8, 0x17, 0x14, 0x99, - 0x78, 0x4a, 0x21, 0x89, 0x9f, 0x57, 0x1c, 0xad, 0x8f, 0x2c, 0x78, 0xdc, 0x27, 0xa6, 0xd7, 0xef, - 0x13, 0xd7, 0xe2, 0x39, 0x1f, 0x0d, 0xbf, 0x67, 0xbb, 0xd7, 0x7c, 0x83, 0x55, 0x14, 0xcf, 0x34, - 0x3e, 0x79, 0x78, 0x50, 0x7f, 0x1c, 0x1f, 0x51, 0x0f, 0x1f, 0x89, 0x05, 0xf5, 0xe1, 0xdc, 0x90, - 0xa5, 0xb8, 0xf1, 0xdb, 0x6e, 0x48, 0xfc, 0x5d, 0xc3, 0x29, 0xf8, 0x7e, 0x07, 0xe3, 0xdd, 0x8d, - 0x24, 0x2a, 0x9c, 0xc6, 0x8d, 0xf6, 0xa9, 0x28, 0x10, 0xdd, 0x51, 0x48, 0x56, 0x8b, 0x67, 0xb6, - 0xc3, 0xa3, 0xe8, 0x70, 0x16, 0x0d, 0xfd, 0xef, 0x68, 0x20, 0x0e, 0x61, 0xe4, 0x73, 0xc6, 0x5a, - 0xe6, 0x73, 0xc6, 0xa7, 0xf3, 0xac, 0xf7, 0x5f, 0x88, 0xdf, 0x4a, 0xcf, 0x7c, 0xd4, 0x5b, 0xbe, - 0x6a, 0x7f, 0x0f, 0x44, 0x63, 0x96, 0x47, 0x6c, 0xac, 0x24, 0x54, 0xc7, 0x3f, 0x2a, 0x1c, 0xa7, - 0xc1, 0x9a, 0xc8, 0x4d, 0x83, 0xf5, 0x1d, 0x0d, 0xd2, 0x8f, 0xb9, 0xa1, 0xa7, 0x60, 0x46, 0xdc, - 0x4b, 0x12, 0x37, 0x1b, 0x78, 0x84, 0x1a, 0x2f, 0xc2, 0x11, 0x2c, 0x69, 0x3f, 0x95, 0xd1, 0x06, - 0xb3, 0x63, 0xaf, 0x8f, 0xd1, 0xcb, 0x0e, 0x16, 0x60, 0x9a, 0x5f, 0xa4, 0x41, 0x3f, 0x9d, 0x19, - 0x02, 0x73, 0xab, 0xc4, 0x5d, 0x9d, 0x02, 0x91, 0x2e, 0x89, 0x54, 0x27, 0x95, 0x23, 0x53, 0x9d, - 0x74, 0x79, 0x3e, 0xba, 0x32, 0xee, 0xb3, 0x26, 0x6e, 0x8b, 0x84, 0xe8, 0x22, 0x17, 0x1d, 0x1a, - 0x26, 0xbc, 0x4a, 0x93, 0x25, 0x72, 0xed, 0xf1, 0x21, 0x50, 0x7c, 0x4b, 0x0b, 0x47, 0xf8, 0x95, - 0xe2, 0x8b, 0x0b, 0x53, 0x25, 0x8e, 0x5c, 0xc4, 0xa8, 0x8f, 0x71, 0x71, 0x41, 0xb2, 0xfd, 0x74, - 0x2e, 0xdb, 0xf7, 0x60, 0x46, 0x08, 0x0e, 0x21, 0xc5, 0x5e, 0x2c, 0x93, 0x6d, 0x4e, 0xb9, 0x73, - 0xca, 0x0b, 0x70, 0x84, 0x9d, 0xee, 0x8d, 0x7d, 0x63, 0xcf, 0xee, 0x0f, 0xfb, 0x4c, 0x76, 0x4d, - 0xa9, 0x55, 0x59, 0x31, 0x8e, 0xe0, 0xac, 0x2a, 0x3f, 0xab, 0x62, 0x1a, 0x8f, 0x5a, 0x55, 0xbc, - 0xe9, 0x11, 0xc1, 0xd1, 0xe7, 0xa1, 0xda, 0x37, 0xf6, 0xba, 0x43, 0xbf, 0x47, 0x84, 0x3b, 0x29, - 0xdf, 0x22, 0x1f, 0x86, 0xb6, 0xb3, 0x42, 0x75, 0xf5, 0xd0, 0x5f, 0x69, 0xbb, 0xe1, 0x1d, 0xbf, - 0x1b, 0xfa, 0x32, 0xab, 0xd6, 0xba, 0xc0, 0x82, 0x25, 0x3e, 0xe4, 0xc0, 0x42, 0xdf, 0xd8, 0xdb, - 0x70, 0x0d, 0xf9, 0xf4, 0x40, 0xad, 0x20, 0x05, 0xe6, 0x5b, 0x5f, 0x4f, 0xe0, 0xc2, 0x29, 0xdc, - 0x19, 0x6e, 0xfc, 0xb9, 0x87, 0xe5, 0xc6, 0x5f, 0x95, 0x61, 0x01, 0xf3, 0x8c, 0x0d, 0x1f, 0xcd, - 0x3a, 0xd4, 0x3a, 0xfa, 0xc4, 0xff, 0x0d, 0x79, 0xe2, 0xbf, 0x50, 0xc2, 0xf7, 0x7e, 0xc4, 0x69, - 0xff, 0x2e, 0xd4, 0x2c, 0x23, 0x34, 0x78, 0x69, 0xb0, 0x7c, 0xae, 0x84, 0xdb, 0xa0, 0x25, 0xf1, - 0x28, 0x09, 0x81, 0x63, 0xdc, 0x58, 0x25, 0x84, 0xee, 0xf0, 0xd4, 0xf4, 0x0e, 0x09, 0xe3, 0x2a, - 0xcc, 0x2f, 0xb7, 0xc8, 0xfd, 0x7a, 0x51, 0x22, 0xf9, 0x91, 0x0a, 0x38, 0xbb, 0x1d, 0x55, 0x27, - 0x79, 0x68, 0xf2, 0x52, 0x7c, 0xdb, 0x3d, 0x71, 0x9b, 0xe9, 0x6f, 0x69, 0xb0, 0xc8, 0x1f, 0x0d, - 0x6a, 0x7a, 0xfd, 0x81, 0xe7, 0x12, 0x3a, 0x31, 0x88, 0x8d, 0xea, 0xcd, 0x12, 0xf2, 0xa1, 0x9b, - 0x42, 0x29, 0x0e, 0x24, 0x53, 0xa5, 0x78, 0x84, 0x34, 0xfa, 0xe7, 0x1a, 0x2c, 0xf7, 0x73, 0xf2, - 0xed, 0x2e, 0x9f, 0x2f, 0x11, 0x13, 0x75, 0x5c, 0x12, 0x5f, 0xfe, 0xa0, 0xd9, 0x71, 0xb5, 0x70, - 0x6e, 0xe7, 0xca, 0x86, 0x4f, 0x96, 0xb9, 0xe6, 0xf5, 0x97, 0x61, 0x31, 0xbd, 0x13, 0xa8, 0xb9, - 0xf4, 0xb5, 0x87, 0x9b, 0x4b, 0x5f, 0x7f, 0x09, 0x2e, 0x65, 0xcf, 0x3a, 0xd5, 0x8e, 0xd8, 0xd3, - 0x14, 0xc2, 0x20, 0x89, 0x93, 0xc3, 0xd1, 0x42, 0xcc, 0x61, 0x8d, 0x95, 0xef, 0xfe, 0xe8, 0xca, - 0xfb, 0xbe, 0xff, 0xa3, 0x2b, 0xef, 0xfb, 0xc1, 0x8f, 0xae, 0xbc, 0xef, 0xcb, 0x87, 0x57, 0xb4, - 0xef, 0x1e, 0x5e, 0xd1, 0xbe, 0x7f, 0x78, 0x45, 0xfb, 0xc1, 0xe1, 0x15, 0xed, 0x3f, 0x1e, 0x5e, - 0xd1, 0xfe, 0xf6, 0x7f, 0xba, 0xf2, 0xbe, 0xcf, 0x57, 0xa3, 0x2e, 0xfd, 0x79, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xa6, 0x4b, 0xaa, 0xf1, 0x38, 0xaf, 0x00, 0x00, + 0xa6, 0xcd, 0xce, 0x46, 0x16, 0x4a, 0x9c, 0x47, 0x8b, 0x1d, 0xcb, 0x58, 0xde, 0x5d, 0x97, 0x75, + 0xae, 0x1b, 0xb2, 0xb0, 0xd7, 0x7b, 0xf1, 0x27, 0x16, 0x3c, 0x96, 0x69, 0x65, 0x62, 0xc4, 0x39, + 0x94, 0xd0, 0x97, 0xe0, 0xa2, 0xcd, 0x3b, 0x87, 0x89, 0x61, 0xd9, 0x2e, 0x09, 0x02, 0x76, 0x38, + 0x51, 0xe6, 0xdc, 0xa1, 0x9d, 0x85, 0x10, 0x67, 0xd3, 0x41, 0x3f, 0x0e, 0x10, 0xec, 0xbb, 0xa6, + 0x18, 0xff, 0xa9, 0x42, 0x54, 0xb9, 0x56, 0x24, 0xb1, 0x60, 0x05, 0x23, 0xd5, 0x0b, 0x42, 0xcf, + 0x21, 0xbe, 0xe1, 0x9a, 0xdc, 0x29, 0xab, 0x71, 0xbd, 0xe0, 0x4e, 0x54, 0x88, 0x63, 0xb8, 0xfe, + 0x8f, 0x34, 0x98, 0x11, 0xf1, 0xe4, 0xe8, 0xc3, 0x29, 0xf5, 0x58, 0xba, 0x8e, 0x52, 0x2a, 0xf2, + 0x3d, 0xe6, 0x53, 0x10, 0x06, 0x88, 0xd8, 0xa2, 0x8a, 0x69, 0x57, 0x82, 0x72, 0x6c, 0xce, 0x24, + 0x7c, 0x0b, 0x91, 0x89, 0xa3, 0x50, 0xd3, 0x7f, 0x55, 0x83, 0xa5, 0x91, 0x56, 0x63, 0x6c, 0x44, + 0x67, 0xe8, 0x17, 0xfe, 0x06, 0x00, 0xbb, 0x3c, 0xb0, 0xda, 0x69, 0x77, 0x89, 0xbf, 0x2b, 0x57, + 0xe1, 0xcf, 0x6a, 0xb0, 0x18, 0x9f, 0x60, 0x88, 0x5e, 0x68, 0x25, 0x22, 0x33, 0x6e, 0xa4, 0x90, + 0x35, 0x96, 0xc5, 0x87, 0x2f, 0xa6, 0x21, 0x78, 0x84, 0x30, 0xfa, 0x1b, 0x1a, 0x2c, 0x1a, 0xc9, + 0xcb, 0x03, 0x91, 0xd4, 0x2c, 0x16, 0x19, 0x97, 0xba, 0x89, 0x10, 0x77, 0x26, 0x05, 0x08, 0xf0, + 0x08, 0x5d, 0xf4, 0x71, 0x98, 0x33, 0x06, 0xf6, 0xea, 0xd0, 0xb2, 0xe9, 0x0e, 0x1a, 0x45, 0x9c, + 0x33, 0x6f, 0xf1, 0x6a, 0xa7, 0x2d, 0xcb, 0x71, 0xa2, 0x96, 0xbc, 0x1e, 0x20, 0x86, 0x72, 0xb2, + 0xec, 0xf5, 0x00, 0x31, 0x8a, 0xf1, 0xf5, 0x00, 0x31, 0x78, 0x2a, 0x15, 0xf4, 0x05, 0x78, 0x84, + 0x6f, 0x38, 0x0d, 0x23, 0xb0, 0xcd, 0xd5, 0x61, 0xb8, 0x4d, 0xdc, 0x30, 0xd2, 0x19, 0xb9, 0x11, + 0xca, 0x0e, 0x69, 0xd7, 0xf2, 0x2a, 0xe1, 0xfc, 0xf6, 0xc8, 0x03, 0xf0, 0x6c, 0xcb, 0x14, 0x1f, + 0xc4, 0xcf, 0x09, 0x8b, 0x1d, 0xa2, 0xdf, 0x6e, 0xb7, 0x9a, 0xe2, 0x7b, 0x98, 0xac, 0x88, 0x7f, + 0x63, 0x85, 0x04, 0xfa, 0x3b, 0x1a, 0xcc, 0x0b, 0x46, 0x17, 0x44, 0x67, 0x18, 0x0b, 0x7c, 0xa1, + 0x30, 0x43, 0xa6, 0xb8, 0x7e, 0x05, 0xab, 0xd8, 0x79, 0xb0, 0x9f, 0x8c, 0x1d, 0x49, 0xc0, 0x70, + 0xb2, 0x23, 0xe8, 0x6b, 0x1a, 0x5c, 0x08, 0x88, 0xbf, 0x6b, 0x9b, 0x64, 0xd5, 0x34, 0xbd, 0xa1, + 0x1b, 0xcd, 0x73, 0xb5, 0x84, 0xb7, 0xa5, 0x9b, 0x81, 0xb0, 0xb1, 0x7c, 0x78, 0x50, 0xbf, 0x90, + 0x05, 0xc1, 0x99, 0x1d, 0x40, 0x3f, 0xa9, 0xc1, 0xb9, 0xbb, 0x46, 0x68, 0x6e, 0x37, 0x0d, 0x73, + 0x9b, 0x59, 0x64, 0xc1, 0xf2, 0x6c, 0x89, 0x98, 0xd2, 0xd7, 0x93, 0xb8, 0xb8, 0xb7, 0x25, 0x55, + 0x88, 0xd3, 0x14, 0x51, 0x08, 0x55, 0x9f, 0xbc, 0x3d, 0x24, 0x41, 0x18, 0x2c, 0x03, 0xa3, 0xfe, + 0xd9, 0xf2, 0x93, 0x86, 0x05, 0x46, 0xae, 0x6c, 0x44, 0xbf, 0xb0, 0xa4, 0x74, 0xf9, 0x65, 0x40, + 0xa3, 0x33, 0x8a, 0x16, 0x61, 0x62, 0x87, 0xf0, 0x0b, 0x3a, 0xb3, 0x98, 0xfe, 0x8b, 0x2e, 0xc0, + 0xd4, 0xae, 0xe1, 0x0c, 0xb9, 0xde, 0x58, 0xc5, 0xfc, 0xc7, 0xf3, 0x95, 0x4f, 0x69, 0xfa, 0xb7, + 0x35, 0xb8, 0x98, 0x49, 0x13, 0x61, 0xb8, 0xd4, 0x37, 0xf6, 0x6e, 0x79, 0xee, 0xfa, 0x30, 0x34, + 0x42, 0xdb, 0xed, 0xb5, 0xdd, 0x2d, 0xc7, 0xee, 0x6d, 0x73, 0xfd, 0x69, 0x8a, 0xef, 0xf6, 0xeb, + 0x99, 0x35, 0x70, 0x4e, 0x4b, 0xd4, 0x86, 0xf3, 0x7d, 0x63, 0x6f, 0x04, 0x61, 0x85, 0x21, 0x64, + 0xf7, 0xbc, 0xd6, 0x47, 0xc1, 0x38, 0xab, 0x8d, 0xfe, 0xb5, 0x49, 0x78, 0x94, 0x76, 0x3c, 0xde, + 0x77, 0xd6, 0x0d, 0xd7, 0xe8, 0xbd, 0x47, 0xe5, 0xfb, 0xb7, 0x34, 0x78, 0x78, 0x3b, 0x5b, 0x2b, + 0x14, 0x5b, 0x1f, 0x2e, 0xa6, 0x1c, 0x1f, 0xa5, 0x69, 0xf2, 0x60, 0x89, 0x23, 0xab, 0xe0, 0xbc, + 0x5e, 0xa1, 0x97, 0x61, 0xd1, 0xf5, 0x2c, 0xd2, 0x6c, 0xb7, 0xf0, 0xba, 0x11, 0xec, 0x74, 0x23, + 0x1f, 0xc8, 0x14, 0x77, 0x07, 0xde, 0x4a, 0xc1, 0xf0, 0x48, 0x6d, 0xb4, 0x0b, 0x68, 0xe0, 0x59, + 0x6b, 0xbb, 0xb6, 0x19, 0x9d, 0x99, 0x17, 0x77, 0x41, 0xb2, 0x50, 0xf6, 0xce, 0x08, 0x36, 0x9c, + 0x41, 0x41, 0xff, 0xae, 0x06, 0xe7, 0xe8, 0x94, 0x74, 0x7c, 0x6f, 0x6f, 0xff, 0x3d, 0xc9, 0x0d, + 0x4f, 0xc3, 0x64, 0xdf, 0xb3, 0x22, 0x2b, 0xee, 0x22, 0x55, 0x8e, 0xd6, 0x3d, 0x8b, 0xdc, 0xe7, + 0x2e, 0xc9, 0xbd, 0x7d, 0xfa, 0x03, 0xb3, 0x2a, 0xfa, 0x9f, 0x6a, 0x5c, 0x7d, 0x89, 0xac, 0x98, + 0xf7, 0x26, 0x7b, 0x7f, 0x12, 0xe6, 0x69, 0xd9, 0xba, 0xb1, 0xd7, 0x69, 0xbd, 0xe6, 0x39, 0x51, + 0x14, 0x07, 0x8b, 0xad, 0xbe, 0xa1, 0x02, 0x70, 0xb2, 0x9e, 0xfe, 0xcd, 0x79, 0x60, 0x15, 0x1c, + 0x12, 0xbe, 0x27, 0x3f, 0xec, 0x19, 0xa8, 0x99, 0x83, 0x61, 0xf3, 0x5a, 0xf7, 0xd5, 0xa1, 0x17, + 0x1a, 0xc2, 0x5d, 0xca, 0x54, 0x92, 0x66, 0x67, 0x23, 0x2a, 0xc6, 0x6a, 0x1d, 0xba, 0x70, 0xcc, + 0xc1, 0x50, 0x08, 0xa3, 0x8e, 0x7a, 0xd8, 0xcf, 0x16, 0x4e, 0xb3, 0xb3, 0x91, 0x80, 0xe1, 0x91, + 0xda, 0xe8, 0xcb, 0x1a, 0xcc, 0x11, 0xc1, 0xd4, 0xaf, 0x18, 0xbe, 0x25, 0xd6, 0x4c, 0xf1, 0x0d, + 0x45, 0x8e, 0x6e, 0xb4, 0x54, 0xb8, 0x32, 0xb7, 0xa6, 0xd0, 0xc0, 0x09, 0x8a, 0x4c, 0xaf, 0x12, + 0xbf, 0xe9, 0x64, 0x79, 0xd6, 0x75, 0xdf, 0x30, 0x89, 0x62, 0x24, 0x4d, 0x09, 0xbd, 0x2a, 0xaf, + 0x12, 0xce, 0x6f, 0x8f, 0xfe, 0xa1, 0x06, 0x97, 0x24, 0xd4, 0x76, 0xed, 0xfe, 0xb0, 0x8f, 0x89, + 0xe9, 0x18, 0x76, 0x5f, 0x28, 0x59, 0x9f, 0x3b, 0xbd, 0x2f, 0x4d, 0xe2, 0xe7, 0x9b, 0x56, 0x36, + 0x0c, 0xe7, 0xf4, 0x09, 0xfd, 0xaa, 0x06, 0x4f, 0x44, 0xa0, 0x0e, 0x35, 0x75, 0x86, 0x3e, 0x89, + 0x63, 0x81, 0xc4, 0x98, 0xcc, 0x14, 0x12, 0x6b, 0x1f, 0x3a, 0x3c, 0xa8, 0x3f, 0xb1, 0x76, 0x0c, + 0x6e, 0x7c, 0x2c, 0xf5, 0x04, 0xc7, 0x74, 0xbd, 0xad, 0x50, 0x68, 0x65, 0x0f, 0x8c, 0x63, 0x28, + 0x0d, 0x9c, 0xa0, 0x88, 0x7e, 0x43, 0x83, 0x87, 0xd5, 0x02, 0x95, 0x61, 0xb8, 0x3a, 0xf6, 0xc6, + 0xe9, 0xf5, 0x26, 0x45, 0x80, 0x3b, 0x40, 0x72, 0x80, 0x38, 0xaf, 0x5b, 0xe8, 0x49, 0x98, 0xe9, + 0x33, 0xe6, 0xe4, 0x2a, 0xdb, 0x14, 0xf7, 0x64, 0x71, 0x7e, 0x0d, 0x70, 0x04, 0xa3, 0xe6, 0xd0, + 0xc0, 0xb3, 0x3a, 0xb6, 0x15, 0xdc, 0xb4, 0xfb, 0x76, 0xb8, 0x5c, 0x63, 0x97, 0x31, 0xd8, 0x78, + 0x74, 0x3c, 0xab, 0xd3, 0x6e, 0xf1, 0x72, 0x9c, 0xa8, 0xc5, 0xe2, 0x4d, 0xed, 0xbe, 0xd1, 0x23, + 0x9d, 0xa1, 0xe3, 0x74, 0x7c, 0x8f, 0x19, 0xc9, 0x2d, 0x62, 0x58, 0x8e, 0xed, 0x92, 0xe5, 0xb9, + 0xe2, 0xf1, 0xa6, 0xed, 0x3c, 0xa4, 0x38, 0x9f, 0x1e, 0x5a, 0x01, 0xd8, 0x32, 0x6c, 0xa7, 0x7b, + 0xd7, 0x18, 0xdc, 0x76, 0x97, 0xe7, 0x99, 0x18, 0x63, 0x96, 0xc8, 0x35, 0x59, 0x8a, 0x95, 0x1a, + 0x8c, 0xa1, 0xa8, 0x30, 0xc4, 0x84, 0xdf, 0x2a, 0x59, 0x5e, 0x38, 0x2d, 0x86, 0x8a, 0x30, 0xf2, + 0x01, 0xbc, 0xa1, 0xd0, 0xc0, 0x09, 0x8a, 0xe8, 0xab, 0x1a, 0x2c, 0x04, 0xfb, 0x41, 0x48, 0xfa, + 0xb2, 0x13, 0xe7, 0x4e, 0xbd, 0x13, 0xcc, 0x83, 0xd0, 0x4d, 0x50, 0xc1, 0x29, 0xaa, 0xfa, 0x41, + 0x85, 0xab, 0xc8, 0x23, 0x5c, 0x88, 0x5e, 0x84, 0x73, 0x7d, 0xd2, 0xf7, 0xfc, 0xfd, 0xd5, 0xe8, + 0xba, 0xb5, 0xf0, 0x79, 0x30, 0x9b, 0x61, 0x3d, 0x09, 0xc2, 0xe9, 0xba, 0x74, 0xa7, 0x60, 0x33, + 0x76, 0xad, 0x1b, 0xb7, 0xaf, 0xc4, 0x3b, 0x45, 0x3b, 0x05, 0xc3, 0x23, 0xb5, 0x51, 0x13, 0x96, + 0x44, 0x59, 0x9b, 0xaa, 0x5f, 0xc1, 0x35, 0x9f, 0x44, 0xce, 0x7b, 0xaa, 0x55, 0x2c, 0xb5, 0xd3, + 0x40, 0x3c, 0x5a, 0x9f, 0x7e, 0x05, 0xfd, 0xa1, 0xf6, 0x62, 0x32, 0xfe, 0x8a, 0x5b, 0x49, 0x10, + 0x4e, 0xd7, 0x8d, 0x14, 0xc5, 0x44, 0x17, 0xa6, 0xe2, 0xaf, 0xb8, 0x95, 0x82, 0xe1, 0x91, 0xda, + 0xfa, 0x9f, 0x4e, 0xc2, 0x07, 0xc7, 0x10, 0xde, 0xa8, 0x9f, 0x3d, 0xdc, 0xc7, 0xac, 0xa3, 0x95, + 0xc8, 0xdb, 0xbf, 0xf2, 0xea, 0xd0, 0x70, 0x43, 0x3b, 0xdc, 0x1f, 0x73, 0x7a, 0x06, 0x39, 0xd3, + 0x73, 0x72, 0x7a, 0xe3, 0x4e, 0x67, 0x90, 0x37, 0x9d, 0x27, 0x27, 0x39, 0xfe, 0xf4, 0xf7, 0xb3, + 0xa7, 0xbf, 0xe0, 0xa8, 0x1e, 0xcb, 0x2e, 0x83, 0x1c, 0x76, 0x29, 0x38, 0xaa, 0x63, 0xb0, 0xd7, + 0x7f, 0x98, 0x84, 0x0f, 0x8d, 0xb3, 0x8b, 0x14, 0xe4, 0xaf, 0x0c, 0x39, 0xfd, 0x40, 0xf9, 0x2b, + 0x2f, 0x40, 0xe3, 0x01, 0xf2, 0x57, 0x06, 0xc9, 0x07, 0xcd, 0x5f, 0x79, 0xa3, 0xfa, 0xa0, 0xf8, + 0x2b, 0x6f, 0x54, 0xc7, 0xe0, 0xaf, 0xff, 0x93, 0xde, 0x1f, 0xe4, 0x16, 0xd6, 0x86, 0x09, 0x73, + 0x30, 0x2c, 0x28, 0xa4, 0xd8, 0x01, 0x54, 0xb3, 0xb3, 0x81, 0x29, 0x0e, 0x84, 0x61, 0x9a, 0xf3, + 0x4f, 0x41, 0x11, 0xc4, 0x82, 0x6b, 0x38, 0x4b, 0x62, 0x81, 0x89, 0x0e, 0x15, 0x19, 0x6c, 0x93, + 0x3e, 0xf1, 0x0d, 0xa7, 0x1b, 0x7a, 0xbe, 0xd1, 0x2b, 0x2a, 0x6d, 0xd8, 0x50, 0xad, 0xa5, 0x70, + 0xe1, 0x11, 0xec, 0x74, 0x40, 0x06, 0xb6, 0x55, 0x50, 0xbe, 0xb0, 0x01, 0xe9, 0xb4, 0x5b, 0x98, + 0xe2, 0xd0, 0xbf, 0x5b, 0x05, 0xe5, 0x36, 0x02, 0x35, 0x58, 0x0c, 0xc7, 0xf1, 0xee, 0x76, 0x7c, + 0x7b, 0xd7, 0x76, 0x48, 0x8f, 0x58, 0x32, 0x5c, 0x3d, 0x10, 0xe7, 0x94, 0x4c, 0x7b, 0x5a, 0xcd, + 0xab, 0x84, 0xf3, 0xdb, 0x53, 0x5d, 0x6e, 0xc9, 0x4c, 0x5f, 0x6b, 0x2a, 0x75, 0xd4, 0x32, 0x72, + 0x49, 0x8a, 0x2f, 0xa8, 0x91, 0x62, 0x3c, 0x4a, 0x17, 0xfd, 0x55, 0x8d, 0x5b, 0xdb, 0xd2, 0x65, + 0x27, 0x26, 0xed, 0x95, 0xd3, 0xf2, 0x12, 0xc7, 0x76, 0x7b, 0xec, 0x15, 0x4c, 0x52, 0x44, 0xdf, + 0xd4, 0xe0, 0xe2, 0x4e, 0x96, 0xf7, 0x4d, 0xcc, 0x6d, 0xa7, 0x70, 0x5f, 0x72, 0xfc, 0x79, 0xfc, + 0x64, 0x2f, 0xb3, 0x02, 0xce, 0xee, 0x89, 0x1c, 0x27, 0xe9, 0x3a, 0x11, 0x72, 0xa0, 0xf8, 0x38, + 0xa5, 0x9c, 0x30, 0xf1, 0x38, 0x49, 0x00, 0x4e, 0x52, 0x44, 0x6f, 0xc3, 0xec, 0x4e, 0xe4, 0x8a, + 0x12, 0xc6, 0x6d, 0xab, 0x30, 0x79, 0xc5, 0xa1, 0xc5, 0xcf, 0x10, 0x65, 0x21, 0x8e, 0xa9, 0x20, + 0x1b, 0x66, 0x76, 0xb8, 0x34, 0x12, 0x46, 0x69, 0xa3, 0xbc, 0xbe, 0xcc, 0x2d, 0x23, 0x51, 0x84, + 0x23, 0xfc, 0x6a, 0xcc, 0x43, 0xf5, 0x98, 0xc8, 0xa1, 0xaf, 0x6b, 0x70, 0x71, 0x97, 0xf8, 0xa1, + 0x6d, 0xa6, 0xdd, 0x9f, 0xb3, 0x25, 0x94, 0xfa, 0xd7, 0xb2, 0x30, 0x72, 0x56, 0xc9, 0x04, 0xe1, + 0xec, 0x3e, 0xe8, 0xff, 0x45, 0x83, 0x11, 0x6f, 0x10, 0xfa, 0x79, 0x0d, 0xe6, 0xb6, 0x88, 0x11, + 0x0e, 0x7d, 0x72, 0xdd, 0x08, 0x65, 0x4c, 0xeb, 0xeb, 0xa7, 0xe2, 0x85, 0x5a, 0xb9, 0xa6, 0x60, + 0xe6, 0x07, 0x31, 0xf2, 0x1a, 0xad, 0x0a, 0xc2, 0x89, 0x2e, 0x5c, 0xfe, 0x0c, 0x2c, 0x8d, 0x34, + 0x3c, 0x91, 0xbf, 0xff, 0x77, 0x84, 0x3f, 0x31, 0x9d, 0x36, 0xed, 0x4d, 0x98, 0x32, 0x2c, 0x4b, + 0xa6, 0x66, 0x79, 0xbe, 0xe0, 0xa1, 0xa3, 0xa5, 0x06, 0x0f, 0xb3, 0x9f, 0x98, 0xe3, 0x45, 0xd7, + 0x00, 0x19, 0x89, 0xe3, 0xb5, 0x75, 0xcf, 0x8a, 0xcc, 0x25, 0xe6, 0xdd, 0x5d, 0x1d, 0x81, 0xe2, + 0x8c, 0x16, 0xfa, 0xa7, 0x61, 0x21, 0x79, 0x39, 0xed, 0x04, 0xf1, 0x6b, 0xfa, 0x5f, 0xd7, 0x00, + 0x8d, 0x5e, 0xdc, 0x46, 0x01, 0x54, 0x45, 0x8d, 0x68, 0x92, 0x8b, 0xb9, 0x1a, 0xd3, 0xa1, 0x75, + 0x71, 0xfc, 0xb6, 0x28, 0x08, 0xb0, 0x24, 0xa4, 0xff, 0x99, 0x06, 0x71, 0x0a, 0x08, 0xf4, 0x09, + 0xa8, 0x59, 0x24, 0x30, 0x7d, 0x7b, 0x10, 0xc6, 0x1f, 0x22, 0x2f, 0xdc, 0xb6, 0x62, 0x10, 0x56, + 0xeb, 0x21, 0x1d, 0xa6, 0x43, 0x23, 0xd8, 0x69, 0xb7, 0x84, 0xe1, 0xc8, 0xb6, 0xf9, 0x3b, 0xac, + 0x04, 0x0b, 0x48, 0x7c, 0xd3, 0x6b, 0x62, 0x8c, 0x9b, 0x5e, 0x68, 0xeb, 0x14, 0xae, 0xb5, 0xa1, + 0xe3, 0xaf, 0xb4, 0xe9, 0xff, 0xb6, 0x02, 0xc9, 0xb4, 0x1b, 0x45, 0x87, 0x60, 0xf4, 0x1e, 0x5e, + 0xe5, 0x81, 0xdd, 0xc3, 0xfb, 0x28, 0x4b, 0x51, 0xc5, 0x13, 0x0b, 0xf2, 0xc3, 0x10, 0x35, 0xaf, + 0x14, 0xcf, 0x0a, 0x28, 0x6b, 0xa0, 0xe7, 0xd4, 0x48, 0xb9, 0xd9, 0xc6, 0x07, 0xa3, 0x75, 0xc1, + 0xc2, 0xdf, 0xee, 0x8b, 0x9b, 0x86, 0xf2, 0xfb, 0x13, 0x41, 0x71, 0x9f, 0x10, 0x71, 0x5e, 0x53, + 0x89, 0xdb, 0x90, 0xd1, 0x15, 0xca, 0xa5, 0x44, 0xc3, 0x38, 0xf8, 0x4b, 0xff, 0x45, 0x0d, 0x66, + 0xc4, 0x25, 0xfc, 0x31, 0x02, 0x1c, 0x7b, 0x30, 0xc5, 0xd4, 0xf5, 0x52, 0x9a, 0x4c, 0x77, 0xdb, + 0xf3, 0xc2, 0x44, 0x32, 0x02, 0x16, 0x58, 0xc5, 0xfe, 0xc5, 0x1c, 0xbf, 0xfe, 0xf5, 0x49, 0x78, + 0x42, 0x54, 0x19, 0xd9, 0xa6, 0xe5, 0x22, 0xdc, 0x87, 0xf3, 0x62, 0x9a, 0x5a, 0xbe, 0x61, 0xcb, + 0xf3, 0xa2, 0x62, 0x16, 0x98, 0x38, 0x4b, 0x1c, 0x41, 0x87, 0xb3, 0x68, 0xa0, 0x9f, 0x80, 0x0b, + 0xa2, 0xf8, 0x15, 0x62, 0x38, 0xe1, 0x76, 0x44, 0xbb, 0x98, 0x35, 0xc6, 0x0e, 0xb0, 0xd7, 0x33, + 0xf0, 0xe1, 0x4c, 0x2a, 0x2c, 0x0e, 0x4b, 0x00, 0x9a, 0x3e, 0x31, 0xd4, 0xc3, 0xb2, 0x12, 0x71, + 0x58, 0xeb, 0x99, 0x18, 0x71, 0x0e, 0x25, 0xe6, 0xca, 0x32, 0xf6, 0x98, 0x65, 0x8c, 0x49, 0xe8, + 0xdb, 0x2c, 0x3d, 0x04, 0x65, 0x70, 0x6e, 0xcb, 0x26, 0x41, 0x38, 0x5d, 0x17, 0x3d, 0x0f, 0x0b, + 0xec, 0xfc, 0x2f, 0xbe, 0xdc, 0x34, 0x15, 0xe7, 0x99, 0xbc, 0x95, 0x80, 0xe0, 0x54, 0x4d, 0xfd, + 0xd7, 0x35, 0x98, 0x53, 0x19, 0x68, 0x8c, 0x30, 0xc8, 0x5d, 0x45, 0x60, 0x97, 0x89, 0x2d, 0x54, + 0xc9, 0x8e, 0x29, 0xb3, 0xcf, 0x67, 0xb4, 0x61, 0x87, 0x56, 0x24, 0x25, 0xfc, 0x4b, 0x1d, 0x5a, + 0x8d, 0xec, 0x24, 0xf2, 0xd0, 0x2a, 0x0d, 0xc1, 0x23, 0x84, 0xd1, 0xeb, 0x30, 0x61, 0xfa, 0xb6, + 0x18, 0x98, 0x4f, 0x15, 0xb3, 0x4f, 0x70, 0x3b, 0x8e, 0x34, 0x6f, 0xe2, 0x36, 0xa6, 0x18, 0xf5, + 0xdf, 0x9e, 0x80, 0x9a, 0x92, 0xe3, 0x03, 0xad, 0x97, 0xb1, 0x6f, 0x63, 0xf4, 0x91, 0x8d, 0xbb, + 0x0e, 0x13, 0xbd, 0xc1, 0xb0, 0xa0, 0x81, 0x2b, 0xd1, 0x5d, 0xa7, 0xe8, 0x7a, 0x83, 0x21, 0x7a, + 0x4d, 0x9a, 0xcc, 0xc5, 0x8c, 0x5a, 0x19, 0x70, 0x97, 0x32, 0x9b, 0x23, 0xf6, 0x9c, 0xcc, 0x65, + 0x4f, 0x17, 0x66, 0x02, 0x61, 0x4f, 0x4f, 0x95, 0x48, 0x31, 0xa3, 0x0c, 0xb5, 0x30, 0xa0, 0xb9, + 0x1e, 0x1e, 0xd9, 0xd7, 0x11, 0x11, 0xaa, 0x05, 0x0c, 0x59, 0x7c, 0x38, 0x33, 0x31, 0xaa, 0x5c, + 0x0b, 0xd8, 0x60, 0x25, 0x58, 0x40, 0xf4, 0x7f, 0xaa, 0x01, 0x1a, 0x45, 0x88, 0x3e, 0x08, 0x53, + 0x2c, 0x4c, 0x5e, 0x2c, 0x36, 0x25, 0xaf, 0x80, 0x11, 0x04, 0x98, 0xc3, 0xd0, 0xeb, 0xe2, 0x0e, + 0x44, 0xb1, 0x99, 0x91, 0x5b, 0xb8, 0xa0, 0xa9, 0x5c, 0x9a, 0x88, 0xf6, 0xa8, 0x89, 0xbc, 0x3d, + 0x4a, 0xff, 0x41, 0x85, 0xb2, 0x9c, 0xed, 0x86, 0xc4, 0x35, 0x5c, 0x93, 0xa0, 0x7b, 0x00, 0xc6, + 0x30, 0xf4, 0xf8, 0x9e, 0x2c, 0x38, 0xef, 0xb3, 0x05, 0x47, 0x57, 0x62, 0x5d, 0x95, 0x18, 0xf9, + 0xa1, 0x48, 0xfc, 0x1b, 0x2b, 0xd4, 0x28, 0xed, 0xd0, 0xee, 0x93, 0xd7, 0x6d, 0xd7, 0xf2, 0xee, + 0x8a, 0xc1, 0x28, 0x4d, 0xfb, 0x8e, 0xc4, 0xc8, 0x69, 0xc7, 0xbf, 0xb1, 0x42, 0x0d, 0x7d, 0x0e, + 0x96, 0x59, 0xb6, 0x5a, 0x97, 0x65, 0x3c, 0x12, 0x9d, 0xf3, 0x1c, 0x27, 0xda, 0x25, 0xaa, 0x8d, + 0xc7, 0x0e, 0x0f, 0xea, 0xcb, 0xcd, 0x9c, 0x3a, 0x38, 0xb7, 0xb5, 0xfe, 0x2d, 0x0d, 0x2e, 0x66, + 0x8e, 0x05, 0xba, 0x0e, 0x4b, 0xf1, 0x81, 0xb8, 0x2a, 0xd5, 0xaa, 0x71, 0x0a, 0xaf, 0x1b, 0xe9, + 0x0a, 0x78, 0xb4, 0x0d, 0x5a, 0x97, 0x5b, 0xbb, 0x2a, 0x35, 0xc5, 0x69, 0xfa, 0xa3, 0x02, 0x55, + 0x96, 0x60, 0xc5, 0x59, 0xed, 0xf4, 0x2f, 0x24, 0x3a, 0x1c, 0x0f, 0x18, 0x65, 0xe6, 0x4d, 0xd2, + 0x93, 0x11, 0xb3, 0x92, 0x99, 0x1b, 0xb4, 0x10, 0x73, 0x18, 0x7a, 0x5c, 0x8d, 0xf2, 0x96, 0x52, + 0x23, 0x8a, 0xf4, 0xd6, 0x87, 0x00, 0xeb, 0x9e, 0x6b, 0x87, 0x9e, 0x6f, 0xbb, 0x3d, 0xd4, 0x83, + 0xaa, 0x21, 0x72, 0x29, 0x0b, 0x66, 0x7b, 0xb1, 0x98, 0x65, 0x24, 0x90, 0xf0, 0x48, 0xae, 0xe8, + 0x17, 0x96, 0xc8, 0xf5, 0xbf, 0xaf, 0xc1, 0xa5, 0xec, 0x1b, 0x0c, 0x63, 0x6c, 0x87, 0x7d, 0xa8, + 0xf9, 0x71, 0x33, 0xc1, 0x99, 0x3f, 0xa6, 0xde, 0x65, 0x56, 0x72, 0xab, 0x53, 0x55, 0xa1, 0xe9, + 0x7b, 0x41, 0x34, 0x3b, 0xe9, 0xeb, 0xcd, 0x72, 0xb9, 0x2a, 0x3d, 0xc1, 0x2a, 0x7e, 0xfd, 0x2b, + 0x15, 0x80, 0x5b, 0x24, 0xbc, 0xeb, 0xf9, 0x3b, 0x74, 0x8c, 0xde, 0x53, 0x37, 0x69, 0x1e, 0x83, + 0xc9, 0x81, 0x67, 0x05, 0x42, 0xa2, 0xb0, 0x2b, 0x2e, 0xec, 0x34, 0x97, 0x95, 0xa2, 0x3a, 0x4c, + 0x31, 0xbf, 0xad, 0x90, 0xdd, 0x4c, 0x53, 0xa5, 0xda, 0x49, 0x80, 0x79, 0x39, 0x7a, 0x0a, 0xaa, + 0x22, 0xc8, 0x30, 0x10, 0xba, 0x37, 0x9b, 0x30, 0x11, 0x8e, 0x18, 0x60, 0x09, 0xd5, 0x7f, 0x6a, + 0x12, 0x12, 0xd9, 0xc0, 0x63, 0x0b, 0x7a, 0xf2, 0x01, 0x59, 0xd0, 0x9f, 0x83, 0x65, 0xc7, 0x33, + 0xac, 0x86, 0xe1, 0x50, 0xb6, 0xf7, 0xbb, 0x7c, 0x3e, 0x0c, 0xb7, 0x47, 0xa2, 0xac, 0xde, 0x4c, + 0x04, 0xdc, 0xcc, 0xa9, 0x83, 0x73, 0x5b, 0xa3, 0xa1, 0x92, 0x84, 0x9c, 0xea, 0x0c, 0xeb, 0xa5, + 0xb3, 0xa5, 0xaf, 0xa8, 0x11, 0xa6, 0x72, 0x23, 0x4d, 0x26, 0x2a, 0x47, 0x5f, 0xd5, 0xe0, 0x22, + 0xd9, 0x0b, 0x89, 0xef, 0x1a, 0xce, 0x1d, 0xdf, 0xd8, 0xda, 0xb2, 0xcd, 0x44, 0xbc, 0x4c, 0xe7, + 0xf0, 0xa0, 0x7e, 0x71, 0x2d, 0xab, 0xc2, 0xfd, 0x83, 0xfa, 0xb3, 0xa3, 0xcf, 0x01, 0x44, 0xf1, + 0xa4, 0x99, 0x4d, 0x18, 0x3b, 0x66, 0x93, 0xbb, 0xfc, 0x1c, 0xd4, 0x4e, 0x10, 0x3f, 0x39, 0xab, + 0xfa, 0x53, 0x7e, 0x79, 0x1a, 0x94, 0x68, 0xde, 0x13, 0x64, 0xa2, 0xfb, 0xbb, 0x1a, 0x5c, 0x30, + 0x1d, 0x9b, 0xb8, 0x61, 0x2a, 0x6a, 0x99, 0x2f, 0x8d, 0xd7, 0x8a, 0xc5, 0x19, 0x0f, 0x88, 0xdb, + 0x6e, 0x35, 0x3d, 0xd7, 0x25, 0x66, 0xd8, 0xcc, 0xc0, 0xce, 0x8d, 0x93, 0x2c, 0x08, 0xce, 0xec, + 0x0d, 0xfb, 0x20, 0x56, 0xde, 0x6e, 0xa9, 0x17, 0x5f, 0x9a, 0xa2, 0x0c, 0x4b, 0x28, 0x7a, 0x06, + 0x6a, 0x3d, 0xdf, 0x1b, 0x0e, 0x82, 0x26, 0x8b, 0xe4, 0xe1, 0x2b, 0x8c, 0x85, 0x4a, 0x5d, 0x8f, + 0x8b, 0xb1, 0x5a, 0x07, 0x7d, 0x1c, 0xe6, 0xf8, 0xcf, 0x8e, 0x4f, 0xb6, 0xec, 0x3d, 0xb1, 0xe2, + 0x58, 0x60, 0xc0, 0x75, 0xa5, 0x1c, 0x27, 0x6a, 0xa1, 0x8f, 0xc0, 0xac, 0x1d, 0x04, 0x43, 0xe2, + 0x6f, 0xe0, 0x9b, 0x22, 0xcd, 0x0d, 0xf3, 0x86, 0xb6, 0xa3, 0x42, 0x1c, 0xc3, 0xd1, 0x2f, 0x68, + 0xb0, 0xe0, 0x93, 0xb7, 0x87, 0xb6, 0x4f, 0x2c, 0x46, 0x34, 0x10, 0x31, 0xd5, 0xdd, 0x92, 0x81, + 0xdc, 0x2b, 0x38, 0x81, 0x95, 0x73, 0xba, 0xf4, 0x23, 0x24, 0x81, 0x38, 0xd5, 0x05, 0x3a, 0x56, + 0x81, 0xdd, 0x73, 0x6d, 0xb7, 0xb7, 0xea, 0xf4, 0x82, 0xe5, 0x2a, 0x5b, 0xbd, 0x6c, 0xac, 0xba, + 0x71, 0x31, 0x56, 0xeb, 0xa0, 0x4f, 0xc2, 0xfc, 0x30, 0xa0, 0xbc, 0xdb, 0x27, 0x7c, 0x80, 0x67, + 0xe3, 0x10, 0xbb, 0x0d, 0x15, 0x80, 0x93, 0xf5, 0xa8, 0x69, 0x16, 0x15, 0x88, 0x61, 0x06, 0x7e, + 0x95, 0x95, 0xf6, 0x73, 0x23, 0x01, 0xc1, 0xa9, 0x9a, 0x97, 0x57, 0xe1, 0x7c, 0xc6, 0x67, 0x9e, + 0x68, 0x81, 0xfc, 0x7a, 0x05, 0x3e, 0x70, 0x2c, 0x5b, 0xa2, 0x5f, 0xd6, 0xa0, 0x46, 0xf6, 0x42, + 0xdf, 0x90, 0x01, 0x7f, 0x74, 0x8e, 0x7a, 0x0f, 0x66, 0x11, 0xac, 0xac, 0xc5, 0x94, 0xf8, 0xbc, + 0xc9, 0x3d, 0x4f, 0x81, 0x60, 0xb5, 0x43, 0x54, 0xc5, 0xe6, 0x57, 0x9d, 0x55, 0x47, 0x9b, 0x48, + 0x9f, 0x2c, 0x20, 0x97, 0x5f, 0x82, 0xc5, 0x34, 0xe6, 0x13, 0x0d, 0xd5, 0x6f, 0x55, 0x60, 0xaa, + 0xe3, 0x18, 0xee, 0x59, 0x24, 0xe6, 0xff, 0x62, 0x22, 0x5b, 0x46, 0xb1, 0x1c, 0x24, 0xac, 0xaf, + 0xb9, 0xd9, 0x74, 0xb6, 0x53, 0xd9, 0x74, 0x5e, 0x2e, 0x41, 0xe3, 0xe8, 0xe4, 0x39, 0xdf, 0xd5, + 0x60, 0x96, 0xd5, 0x3b, 0x83, 0xac, 0x1b, 0x6f, 0x26, 0xb3, 0x6e, 0x3c, 0x5f, 0xfc, 0xa3, 0x72, + 0x92, 0x6c, 0xfc, 0x71, 0xf4, 0x31, 0x2c, 0xa7, 0xc6, 0x1b, 0x6a, 0xbe, 0x78, 0xfe, 0x35, 0x4f, + 0x65, 0xe5, 0xa8, 0xb9, 0xe9, 0x99, 0x86, 0x93, 0xd6, 0xe4, 0x8e, 0x4e, 0x1a, 0xef, 0xc2, 0x2c, + 0x11, 0x77, 0xd0, 0xa3, 0xaf, 0x29, 0xa6, 0xdb, 0x46, 0x37, 0xd9, 0x63, 0x7a, 0x51, 0x49, 0x80, + 0x63, 0x12, 0xfa, 0xef, 0x54, 0xa0, 0xa6, 0xcc, 0xe6, 0xbb, 0x92, 0x0b, 0xe7, 0x5a, 0x66, 0x76, + 0xe5, 0x0a, 0x0b, 0xe8, 0xbb, 0x74, 0x82, 0xd4, 0xec, 0x01, 0xd4, 0xcc, 0x38, 0xb9, 0x5f, 0x29, + 0x06, 0x57, 0x92, 0x04, 0x8a, 0xc0, 0xe2, 0xb8, 0x00, 0xab, 0x54, 0xf4, 0x7f, 0x51, 0x81, 0x99, + 0x8e, 0xef, 0xd1, 0x39, 0x3e, 0x03, 0x01, 0xb1, 0x99, 0x10, 0x10, 0x05, 0x17, 0x2f, 0xef, 0x6d, + 0xae, 0x88, 0x78, 0x2b, 0x25, 0x22, 0x1a, 0xa5, 0xa8, 0x1c, 0x2d, 0x24, 0xfe, 0x50, 0x83, 0x9a, + 0xa8, 0x79, 0x06, 0x62, 0xc2, 0x48, 0x8a, 0x89, 0x17, 0xca, 0x7c, 0x58, 0x8e, 0xa0, 0xf8, 0x25, + 0x0d, 0xe6, 0x45, 0x8d, 0x75, 0xd2, 0xdf, 0x24, 0x3e, 0xba, 0x06, 0x33, 0xc1, 0x90, 0xcd, 0xa5, + 0xf8, 0xa2, 0x47, 0x55, 0x51, 0xe1, 0x6f, 0x1a, 0x26, 0x7b, 0x25, 0x80, 0x57, 0x51, 0xd2, 0x58, + 0xf1, 0x02, 0x1c, 0x35, 0xa6, 0x06, 0x9d, 0xef, 0x39, 0x23, 0x97, 0xcc, 0xb1, 0xe7, 0x10, 0xcc, + 0x20, 0xd4, 0x8e, 0xa2, 0x7f, 0xa3, 0x23, 0x25, 0x66, 0x47, 0x51, 0x70, 0x80, 0x79, 0xb9, 0xfe, + 0x33, 0x93, 0x72, 0xb4, 0x99, 0x1c, 0x7b, 0x05, 0x66, 0x4d, 0x9f, 0x18, 0x21, 0xb1, 0x1a, 0xfb, + 0xe3, 0x74, 0x8e, 0x29, 0x74, 0xcd, 0xa8, 0x05, 0x8e, 0x1b, 0x53, 0xd5, 0x49, 0x3d, 0x25, 0xaa, + 0xc4, 0x6a, 0x66, 0xee, 0x09, 0xd1, 0x0b, 0x30, 0xe5, 0xdd, 0x75, 0x65, 0x9c, 0xc4, 0x91, 0x84, + 0xd9, 0xa7, 0xdc, 0xa6, 0xb5, 0x31, 0x6f, 0xa4, 0xa6, 0x45, 0x98, 0x3c, 0x22, 0x2d, 0x42, 0x1f, + 0x66, 0xfa, 0x6c, 0x1a, 0xa2, 0x24, 0x06, 0xa5, 0x98, 0x99, 0xcf, 0xa8, 0x9a, 0xbe, 0x91, 0xa1, + 0xc6, 0x11, 0x0d, 0xaa, 0x04, 0x53, 0x3d, 0x2d, 0x18, 0x18, 0x26, 0x51, 0x95, 0xe0, 0x5b, 0x51, + 0x21, 0x8e, 0xe1, 0xe8, 0x1e, 0xd4, 0xf8, 0x1d, 0x63, 0x2e, 0x6b, 0x67, 0x4a, 0xf8, 0x24, 0x45, + 0xff, 0xee, 0xc4, 0xe8, 0xf8, 0xe0, 0x2b, 0x05, 0x58, 0x25, 0xa6, 0xff, 0xdc, 0x84, 0x64, 0x53, + 0x21, 0xf8, 0xb3, 0x53, 0xdc, 0x6b, 0x85, 0xde, 0xc8, 0x78, 0x16, 0xa6, 0x06, 0xdb, 0x46, 0x10, + 0xf1, 0x6a, 0x94, 0x6b, 0x74, 0xaa, 0x43, 0x0b, 0xef, 0x1f, 0xd4, 0xe7, 0x04, 0x69, 0xf6, 0x1b, + 0xf3, 0xba, 0x68, 0x08, 0xe7, 0x83, 0xd0, 0x70, 0x48, 0xd7, 0x16, 0xee, 0xa3, 0x20, 0x34, 0xfa, + 0x83, 0x02, 0x29, 0x43, 0xd9, 0x29, 0x53, 0x77, 0x14, 0x15, 0xce, 0xc2, 0x8f, 0x7e, 0x4a, 0x83, + 0x65, 0x56, 0xbe, 0x3a, 0x0c, 0x3d, 0x9e, 0x07, 0x38, 0x26, 0x7e, 0xf2, 0x43, 0x56, 0x66, 0xec, + 0x77, 0x73, 0xf0, 0xe1, 0x5c, 0x4a, 0xfa, 0xff, 0xd5, 0x00, 0x8d, 0xce, 0x22, 0xea, 0x43, 0xd5, + 0x22, 0x5b, 0xc6, 0xd0, 0x09, 0xa3, 0xcd, 0xb8, 0xd8, 0x55, 0xd7, 0x18, 0x67, 0x2c, 0x20, 0x5b, + 0x02, 0x31, 0x96, 0x24, 0xd0, 0x00, 0x66, 0xef, 0x6e, 0xdb, 0x21, 0x71, 0xec, 0x20, 0x14, 0x42, + 0xb2, 0x34, 0x3d, 0xa9, 0x7f, 0xbc, 0x1e, 0x61, 0xc6, 0x31, 0x11, 0xfd, 0xaf, 0x4d, 0x40, 0xf5, + 0x04, 0x4f, 0x19, 0x0d, 0x01, 0x89, 0x8b, 0xee, 0x54, 0x69, 0x21, 0x65, 0xfc, 0x56, 0x4c, 0xb3, + 0x68, 0x8e, 0x20, 0xc3, 0x19, 0x04, 0xd0, 0x3b, 0x70, 0xc1, 0x76, 0xb7, 0x7c, 0x23, 0x08, 0xfd, + 0xa1, 0x19, 0x0e, 0xfd, 0x88, 0x70, 0xa1, 0x74, 0x1e, 0xcc, 0xd8, 0x6f, 0x67, 0xa0, 0xc3, 0x99, + 0x44, 0xd0, 0x16, 0xcc, 0xdc, 0xf5, 0xfc, 0x1d, 0x2a, 0xc3, 0x26, 0x4b, 0x64, 0x4e, 0x7f, 0x9d, + 0xe1, 0x88, 0x85, 0x17, 0xff, 0x1d, 0xe0, 0x08, 0xb9, 0xfe, 0x07, 0x1a, 0x4c, 0xf1, 0xcb, 0x52, + 0xef, 0x0f, 0x43, 0x87, 0xf5, 0x35, 0x37, 0x0b, 0x20, 0x35, 0x3f, 0x58, 0x8d, 0xf7, 0x8b, 0xf9, + 0xc1, 0x3a, 0x9b, 0xa3, 0x55, 0xfc, 0xc1, 0x84, 0xf8, 0x18, 0xb6, 0x6d, 0xb7, 0xe1, 0xbc, 0xd0, + 0x40, 0x6f, 0xda, 0x5b, 0x84, 0x32, 0x58, 0xcb, 0xd8, 0x0f, 0xc4, 0x05, 0x60, 0x26, 0xfd, 0x9a, + 0xa3, 0x60, 0x9c, 0xd5, 0x06, 0xfd, 0x4b, 0x8d, 0x6e, 0x90, 0xa1, 0x6f, 0x9b, 0xe5, 0x32, 0x16, + 0xca, 0xce, 0xad, 0xac, 0x73, 0x6c, 0xdc, 0x82, 0xdf, 0x88, 0x77, 0x4a, 0x56, 0x7a, 0xff, 0xa0, + 0x5e, 0xcf, 0xf0, 0x10, 0x46, 0x3e, 0x6d, 0x3a, 0xb4, 0x5f, 0xf9, 0xc1, 0x91, 0x55, 0x98, 0x7f, + 0x3d, 0xea, 0x32, 0x7a, 0x05, 0xa6, 0x02, 0xd3, 0x1b, 0x90, 0xa3, 0x1e, 0xed, 0x4a, 0xdb, 0x5f, + 0x72, 0x84, 0xbb, 0xb4, 0x25, 0xe6, 0x08, 0x2e, 0xbf, 0x05, 0x73, 0x6a, 0xcf, 0x33, 0x3c, 0x04, + 0x2d, 0xd5, 0x43, 0x70, 0xe2, 0xf3, 0x36, 0xd5, 0xa3, 0xf0, 0xbb, 0x15, 0x10, 0xef, 0x9e, 0x8c, + 0x71, 0x8a, 0xf0, 0x56, 0x94, 0xa1, 0xad, 0xcc, 0x63, 0x2f, 0xe9, 0x17, 0x14, 0xe3, 0x41, 0x50, + 0x93, 0xb4, 0x21, 0x0f, 0xa6, 0x1d, 0x63, 0x93, 0x38, 0xd1, 0x1b, 0x18, 0xd7, 0x4b, 0x3c, 0xd1, + 0xc0, 0xb3, 0x1a, 0x07, 0x29, 0x5f, 0x33, 0x2f, 0xc4, 0x82, 0xcc, 0xe5, 0xe7, 0xa0, 0xa6, 0x54, + 0x3b, 0x91, 0x5b, 0xe6, 0x0f, 0x35, 0x98, 0x4b, 0xa4, 0x69, 0xea, 0xc3, 0x84, 0x2f, 0xcd, 0xf1, + 0xa2, 0xc7, 0x2c, 0x51, 0x34, 0xd0, 0xa3, 0x47, 0x54, 0xc2, 0x94, 0x8e, 0xcc, 0xe8, 0x54, 0x39, + 0xad, 0x8c, 0x4e, 0x5f, 0xd3, 0xe0, 0x52, 0xf4, 0x41, 0xc9, 0xc4, 0x06, 0xe8, 0x29, 0xa8, 0x1a, + 0x03, 0x9b, 0x39, 0x5f, 0x55, 0xff, 0xf5, 0x6a, 0xa7, 0xcd, 0xca, 0xb0, 0x84, 0xa2, 0x8f, 0x42, + 0x35, 0x62, 0x3d, 0xa1, 0x7c, 0x49, 0xb9, 0x25, 0x0f, 0x8e, 0x64, 0x0d, 0xf4, 0xa4, 0x92, 0x45, + 0x6f, 0x2a, 0xde, 0xa8, 0x25, 0x61, 0x7e, 0x1e, 0xac, 0xff, 0x62, 0x05, 0xe6, 0xb9, 0xb3, 0xa2, + 0x61, 0xbb, 0x96, 0xed, 0xf6, 0xce, 0x60, 0x83, 0x48, 0x3c, 0xc9, 0x57, 0x39, 0xad, 0x27, 0xf9, + 0x6e, 0xc0, 0xf4, 0xdb, 0x54, 0x52, 0x45, 0x0c, 0x3e, 0x96, 0xc0, 0x90, 0xcc, 0xcb, 0x84, 0x5c, + 0x80, 0x05, 0x0a, 0xfd, 0x4f, 0x34, 0x58, 0x4a, 0x0c, 0xcb, 0x19, 0xec, 0x34, 0xbd, 0xe4, 0x4e, + 0xd3, 0x28, 0x98, 0xe0, 0x43, 0xe9, 0x74, 0xce, 0x8e, 0xf3, 0x9b, 0x15, 0x60, 0x0f, 0x80, 0x9d, + 0xc1, 0x54, 0xbf, 0x99, 0xd0, 0x05, 0x5e, 0x2c, 0xfe, 0x52, 0x4b, 0x9e, 0x43, 0xa3, 0x97, 0x72, + 0x68, 0x7c, 0xa6, 0x38, 0x89, 0xa3, 0xbd, 0x19, 0xbf, 0x52, 0x01, 0xa0, 0xd5, 0xf8, 0x53, 0x69, + 0x22, 0x2e, 0x31, 0x7e, 0x3a, 0x73, 0xf6, 0xbd, 0xf2, 0xde, 0xa5, 0x2e, 0x5f, 0xe3, 0x9a, 0x88, + 0xdd, 0xe6, 0xc9, 0x97, 0xb8, 0x92, 0x0b, 0x70, 0xf2, 0x94, 0x16, 0xa0, 0xfe, 0x9b, 0x1a, 0xb0, + 0x04, 0xdd, 0xad, 0x5b, 0x5d, 0xf4, 0x49, 0x98, 0xb7, 0xf9, 0xb9, 0x64, 0x4b, 0xcd, 0xa8, 0xc5, + 0xce, 0x4e, 0xda, 0x2a, 0x00, 0x27, 0xeb, 0x21, 0x57, 0x19, 0xd7, 0x32, 0xef, 0x14, 0x8a, 0x8e, + 0xc8, 0x0c, 0xb4, 0x73, 0xd9, 0x33, 0xa3, 0xff, 0xb0, 0x02, 0xe7, 0x52, 0x75, 0xc7, 0x30, 0x55, + 0x1e, 0x8c, 0x04, 0x53, 0x92, 0xd2, 0x4e, 0x9c, 0x41, 0x52, 0x5a, 0x99, 0x1f, 0x76, 0xf2, 0x01, + 0xe7, 0x87, 0xfd, 0x8e, 0x06, 0x55, 0x3a, 0xc6, 0x67, 0x20, 0x43, 0x7f, 0x3c, 0x29, 0x43, 0x9f, + 0x2b, 0xcc, 0x3b, 0x39, 0xa2, 0xf3, 0xcf, 0x34, 0x60, 0xef, 0x37, 0x88, 0x60, 0x0c, 0x25, 0xbe, + 0x41, 0xcb, 0x89, 0x6f, 0x78, 0x42, 0x84, 0x47, 0xa4, 0x5c, 0x7b, 0x4a, 0x88, 0xc4, 0x47, 0x95, + 0x08, 0x88, 0x89, 0xa4, 0x28, 0x19, 0x8d, 0x82, 0x40, 0xef, 0xc0, 0x7c, 0xb0, 0xed, 0x79, 0x61, + 0x64, 0xe1, 0x8b, 0xd9, 0x6b, 0x14, 0x0f, 0x25, 0x8e, 0xbe, 0x85, 0xaf, 0xce, 0xae, 0x8a, 0x1c, + 0x27, 0x69, 0xe9, 0xbf, 0x27, 0x3e, 0xff, 0x04, 0x4b, 0xe5, 0x0c, 0x45, 0xdf, 0x87, 0x53, 0xa2, + 0x2f, 0xef, 0x21, 0xc2, 0xdf, 0x12, 0x5f, 0x21, 0x9f, 0xf7, 0x72, 0x60, 0xde, 0x51, 0xdf, 0xe9, + 0x10, 0x8c, 0x59, 0xe8, 0x89, 0x0f, 0xf1, 0xba, 0xa5, 0x52, 0x84, 0x93, 0xc8, 0xa9, 0x6c, 0x8c, + 0x3a, 0xae, 0xbe, 0x5a, 0xce, 0x1a, 0x76, 0x54, 0x00, 0x4e, 0xd6, 0xd3, 0x5f, 0x85, 0x0f, 0xf1, + 0x6e, 0xb3, 0xf8, 0xed, 0xb5, 0x3d, 0x93, 0x04, 0x41, 0xd3, 0x18, 0x18, 0x26, 0xb5, 0x41, 0xd8, + 0x0d, 0x48, 0xee, 0xa2, 0x7b, 0x3a, 0x9d, 0x2f, 0x54, 0xfa, 0x05, 0xd2, 0x39, 0x43, 0xf5, 0x2f, + 0x57, 0xa0, 0xae, 0xe0, 0x4c, 0x44, 0xb2, 0x44, 0x1c, 0xf7, 0x0d, 0x0d, 0x6a, 0x86, 0xeb, 0x7a, + 0xa1, 0xa1, 0x1e, 0x1c, 0x91, 0x12, 0xaf, 0xae, 0xe5, 0xd2, 0x5a, 0x59, 0x8d, 0xe9, 0xa4, 0xce, + 0x89, 0x15, 0x08, 0x56, 0xbb, 0x73, 0xf9, 0x25, 0x58, 0x4c, 0xb7, 0x3a, 0x91, 0xb1, 0xd1, 0x80, + 0x8b, 0x4a, 0xaf, 0xc4, 0x45, 0x32, 0xaa, 0x08, 0x3f, 0x0d, 0x33, 0xbb, 0x76, 0x60, 0x47, 0x97, + 0x92, 0x95, 0x61, 0x7c, 0x8d, 0x17, 0xe3, 0x08, 0xae, 0xbf, 0x0c, 0xe7, 0x55, 0x1c, 0x6c, 0xcd, + 0xdc, 0xea, 0x9e, 0x64, 0x22, 0xd6, 0xe1, 0x09, 0x05, 0x43, 0xe6, 0x55, 0xaa, 0x93, 0xa0, 0xfb, + 0xe9, 0xe9, 0x88, 0xc5, 0x45, 0xac, 0xff, 0xb7, 0x35, 0x78, 0x84, 0xe4, 0x71, 0x8c, 0xe0, 0xf7, + 0x37, 0xca, 0x4e, 0x69, 0x2e, 0x4b, 0x8a, 0xd4, 0x35, 0x79, 0x60, 0x9c, 0xdf, 0x35, 0x74, 0x0f, + 0x20, 0x90, 0x73, 0x52, 0x2a, 0x04, 0x34, 0x73, 0x96, 0x45, 0x26, 0x51, 0xf9, 0x1b, 0x2b, 0xd4, + 0x90, 0x0f, 0xd5, 0x40, 0xcc, 0x65, 0xa9, 0x1b, 0x9f, 0x19, 0xbc, 0x21, 0xa2, 0xdc, 0xc4, 0x2f, + 0x2c, 0xe9, 0xa0, 0x5f, 0xd3, 0xe0, 0x82, 0x93, 0xb1, 0x34, 0x84, 0x9c, 0xbf, 0xf3, 0x20, 0x96, + 0x1d, 0x77, 0x5b, 0x66, 0x41, 0x70, 0x66, 0x5f, 0xd0, 0xdf, 0xcb, 0xbd, 0x5b, 0xc8, 0xa3, 0xaf, + 0x37, 0xca, 0xf6, 0xf2, 0xb4, 0xae, 0x19, 0xfe, 0x9b, 0x19, 0xae, 0x7a, 0x30, 0xdf, 0x9a, 0x09, + 0xd3, 0x9b, 0x4c, 0x7b, 0x17, 0xfc, 0x5e, 0xdc, 0x56, 0x10, 0x8f, 0xbb, 0x33, 0xdd, 0x9a, 0xff, + 0x8f, 0x05, 0x6a, 0xb4, 0x02, 0xb0, 0xe9, 0x78, 0xe6, 0x4e, 0xb3, 0xdd, 0xc2, 0x91, 0x68, 0x67, + 0x3c, 0xd6, 0x90, 0xa5, 0x58, 0xa9, 0x81, 0xbe, 0x00, 0x13, 0x96, 0x54, 0xf8, 0x5e, 0x28, 0xa3, + 0xeb, 0xc6, 0xa1, 0xb5, 0x94, 0xa3, 0x28, 0x56, 0xe4, 0x41, 0xd5, 0x15, 0xbb, 0xbb, 0xe0, 0x9f, + 0xe2, 0x8f, 0x65, 0x4a, 0x35, 0x41, 0x6a, 0x27, 0x51, 0x09, 0x96, 0x44, 0x28, 0x41, 0xa9, 0xbe, + 0x4f, 0x95, 0x24, 0x28, 0x75, 0xf7, 0xa3, 0x2c, 0xab, 0x8e, 0xaa, 0x89, 0x4f, 0x8f, 0xaf, 0x89, + 0xcf, 0xe7, 0x6a, 0xe1, 0x5b, 0x30, 0x1d, 0x1a, 0x2c, 0x44, 0x63, 0xa6, 0x44, 0x84, 0x04, 0xfd, + 0x80, 0x3b, 0x14, 0x4d, 0xac, 0x85, 0xb0, 0x9f, 0x01, 0x16, 0xd8, 0x29, 0x37, 0xf2, 0x87, 0x3c, + 0x45, 0xea, 0xa8, 0xe2, 0xdc, 0xc8, 0x5f, 0x46, 0xe0, 0xdc, 0xc8, 0xff, 0xc7, 0x02, 0x35, 0xda, + 0xa1, 0xba, 0x25, 0xdf, 0x02, 0xc4, 0xb5, 0xdf, 0xd5, 0xb2, 0x4b, 0x33, 0x88, 0x02, 0x74, 0xf9, + 0x2f, 0x2c, 0x09, 0x20, 0x13, 0x66, 0x84, 0x31, 0x27, 0x12, 0x72, 0xbe, 0x50, 0x26, 0x29, 0x72, + 0xf4, 0xe0, 0x07, 0xbf, 0xe3, 0x17, 0x61, 0xd6, 0x7f, 0x7b, 0x82, 0xdb, 0xe1, 0xef, 0x62, 0x4c, + 0x4b, 0x0f, 0xaa, 0x11, 0xb2, 0x52, 0x8e, 0x8d, 0x28, 0x23, 0x3d, 0x1f, 0x50, 0x99, 0x9f, 0x5e, + 0x22, 0x47, 0xcd, 0xac, 0xeb, 0x00, 0x4a, 0xb2, 0xa1, 0xb1, 0xae, 0x02, 0x64, 0x1f, 0xfe, 0x4e, + 0x16, 0x3a, 0xfc, 0x7d, 0x11, 0xce, 0x45, 0xf1, 0x31, 0x16, 0x61, 0xbe, 0x6f, 0x11, 0x41, 0xca, + 0xee, 0xac, 0x35, 0x93, 0x20, 0x9c, 0xae, 0xab, 0xdf, 0x80, 0x59, 0xb9, 0x2e, 0xd0, 0xe3, 0x8a, + 0x8e, 0x16, 0x8b, 0xae, 0x1b, 0x64, 0x9f, 0x2b, 0x6c, 0xf5, 0x84, 0xc2, 0xc6, 0x0d, 0xab, 0xd7, + 0x68, 0x81, 0xd0, 0xdd, 0xf4, 0xff, 0xa6, 0x71, 0x46, 0x10, 0xaf, 0x8e, 0x18, 0x50, 0xeb, 0xf3, + 0xe4, 0x45, 0x2c, 0x71, 0x66, 0xb1, 0x1b, 0x52, 0xec, 0x60, 0x7d, 0x3d, 0x46, 0x83, 0x55, 0x9c, + 0x68, 0x6f, 0xf4, 0x69, 0x9c, 0xeb, 0x25, 0x17, 0xed, 0xd8, 0x2f, 0xe4, 0xa0, 0xd1, 0x36, 0xea, + 0x33, 0x24, 0xda, 0xd1, 0xcf, 0x90, 0x1c, 0xff, 0x9a, 0x82, 0xfe, 0x8f, 0x35, 0xc8, 0xcc, 0x01, + 0x8c, 0x74, 0x98, 0xe6, 0xc1, 0xbd, 0xea, 0xa3, 0x41, 0x3c, 0xf2, 0x17, 0x0b, 0x08, 0xf2, 0xe1, + 0x82, 0x88, 0x9c, 0xbd, 0x41, 0xf6, 0xe3, 0xc7, 0x6a, 0xc4, 0xea, 0x18, 0x3f, 0x7e, 0x8e, 0x65, + 0x35, 0xe9, 0xa6, 0x30, 0xe1, 0x4c, 0xdc, 0x2c, 0x76, 0x93, 0xe9, 0x4f, 0xef, 0x93, 0x23, 0x4d, + 0xd6, 0xd7, 0x07, 0x1c, 0xbb, 0xc9, 0x69, 0x1c, 0xed, 0xc8, 0x7c, 0x03, 0x2e, 0xb1, 0x6a, 0xab, + 0x16, 0x53, 0x99, 0x02, 0x62, 0xad, 0x5a, 0x16, 0xbb, 0x4f, 0x51, 0xf6, 0x5d, 0x1c, 0x76, 0x2e, + 0xcb, 0x70, 0xbf, 0x5f, 0xce, 0x65, 0x59, 0x67, 0x73, 0x5c, 0x3d, 0xbf, 0xaf, 0xc1, 0xd2, 0xc8, + 0x55, 0xeb, 0x31, 0xc6, 0xe8, 0x0c, 0x1d, 0x1e, 0x4f, 0xa6, 0x5f, 0x40, 0xa9, 0x65, 0xe6, 0x60, + 0x78, 0x1d, 0xe6, 0x13, 0x8e, 0x1e, 0x79, 0x65, 0x47, 0xcb, 0xbc, 0xb2, 0xa3, 0xde, 0xc8, 0xa9, + 0x1c, 0x79, 0x23, 0xe7, 0x7f, 0xcf, 0x89, 0xf9, 0x66, 0xea, 0xf5, 0x9b, 0x30, 0xcd, 0xae, 0xcd, + 0x44, 0x4f, 0x6a, 0x7d, 0xba, 0xf8, 0x7d, 0x9c, 0x80, 0x4b, 0x19, 0xfe, 0x3f, 0x16, 0x68, 0x51, + 0x0b, 0x16, 0xd9, 0xab, 0xcb, 0x1d, 0xdf, 0xdb, 0xb2, 0x1d, 0x72, 0x2b, 0x16, 0x68, 0xf2, 0xae, + 0x6e, 0x33, 0x05, 0xc7, 0x23, 0x2d, 0x50, 0x57, 0x55, 0xb8, 0x3f, 0x55, 0xd4, 0xe9, 0xc9, 0x73, + 0x23, 0x49, 0x45, 0xdb, 0x07, 0x20, 0xd1, 0xd4, 0x45, 0xa1, 0x1c, 0x2f, 0x15, 0xbc, 0x87, 0x2c, + 0x39, 0x20, 0x12, 0x49, 0xb2, 0x28, 0xc0, 0x0a, 0x15, 0x14, 0x40, 0x6d, 0x3b, 0x7e, 0x74, 0x45, + 0xa8, 0xdb, 0x2f, 0x97, 0x7d, 0xf1, 0x85, 0xef, 0x81, 0x4a, 0x01, 0x56, 0xa9, 0xa0, 0x20, 0xf1, + 0xe0, 0x75, 0x99, 0x0c, 0xfd, 0xb1, 0xf2, 0x72, 0xdc, 0x63, 0xd7, 0x94, 0xa8, 0x2b, 0x6f, 0xbf, + 0x89, 0x60, 0xba, 0x62, 0x44, 0xe3, 0x4b, 0x74, 0x31, 0xd1, 0xb8, 0x0c, 0x2b, 0x64, 0xe8, 0xf0, + 0xf6, 0xe3, 0x3b, 0x8f, 0x42, 0x49, 0x7f, 0xb9, 0xec, 0xe5, 0x53, 0xa1, 0x62, 0xc4, 0x05, 0x58, + 0xa5, 0x82, 0x3c, 0x80, 0xbe, 0xbc, 0x0b, 0x29, 0x34, 0xf6, 0x62, 0x5f, 0x1a, 0x5f, 0xa9, 0xe4, + 0xe6, 0x67, 0xfc, 0x1b, 0x2b, 0x24, 0xa8, 0x81, 0x20, 0x0d, 0x36, 0x28, 0xa1, 0xcb, 0x8e, 0x65, + 0xac, 0x7d, 0x22, 0x56, 0x58, 0x6a, 0x6c, 0xdd, 0x3e, 0xaa, 0x28, 0x2b, 0xf7, 0x0f, 0xea, 0x73, + 0x4c, 0x98, 0x8c, 0x28, 0x2f, 0xb1, 0x5f, 0x77, 0xee, 0x28, 0xbf, 0x2e, 0xba, 0x0e, 0x4b, 0x81, + 0x7a, 0xfc, 0xc9, 0x04, 0xc4, 0x3c, 0x6b, 0x22, 0x6f, 0xcf, 0x76, 0xd3, 0x15, 0xf0, 0x68, 0x1b, + 0x2e, 0x01, 0x89, 0xc5, 0xda, 0x2f, 0xa8, 0x12, 0x90, 0x97, 0x61, 0x09, 0x45, 0x77, 0x53, 0x6f, + 0x43, 0x9f, 0x2b, 0x6d, 0x63, 0x8d, 0xf7, 0x52, 0x34, 0xfa, 0x09, 0xf5, 0x0d, 0xaf, 0xc5, 0x12, + 0xd1, 0x3d, 0x45, 0x1e, 0xf1, 0x42, 0xbb, 0xc9, 0xf0, 0xd6, 0xa5, 0xd3, 0x89, 0x26, 0x94, 0xbe, + 0xde, 0xdc, 0xd0, 0xd6, 0x7f, 0x47, 0x75, 0xfe, 0x48, 0xc7, 0x21, 0x67, 0xa0, 0xf8, 0x91, 0x84, + 0xe2, 0xd7, 0x2c, 0xa7, 0x94, 0x91, 0xdc, 0x80, 0xb6, 0x3f, 0xd2, 0x60, 0x21, 0xae, 0x76, 0x06, + 0xda, 0x93, 0x95, 0xd4, 0x9e, 0x3e, 0x53, 0xf2, 0xc3, 0x72, 0x54, 0xa8, 0xff, 0x5f, 0x51, 0x3f, + 0x8b, 0x29, 0x09, 0x77, 0x15, 0xdb, 0x99, 0x5b, 0xeb, 0xed, 0x52, 0xb6, 0xb3, 0x1a, 0x26, 0x14, + 0x7f, 0x71, 0x86, 0x2d, 0xfd, 0xa5, 0xc4, 0x0e, 0x5d, 0x26, 0x1e, 0x2e, 0xfb, 0x31, 0xc0, 0x63, + 0xb7, 0x6b, 0x5f, 0x5d, 0xb1, 0x3c, 0x44, 0x65, 0xb5, 0x60, 0x0c, 0x96, 0xf2, 0xc9, 0x47, 0x3f, + 0xb6, 0xf7, 0x4f, 0x00, 0x6a, 0x8a, 0x4d, 0xf0, 0xae, 0x78, 0x4b, 0x86, 0x50, 0x33, 0x3d, 0x37, + 0x08, 0x7d, 0x43, 0xb9, 0xf7, 0x54, 0x96, 0xa8, 0x14, 0x15, 0xcd, 0x18, 0x35, 0x56, 0xe9, 0xd0, + 0x8d, 0x4d, 0x32, 0xda, 0xc4, 0x69, 0x38, 0x69, 0x8e, 0x62, 0xae, 0x8f, 0x03, 0x44, 0x4a, 0x92, + 0x7c, 0x8b, 0x54, 0x26, 0x97, 0x6b, 0x07, 0xaf, 0x48, 0x18, 0x56, 0xea, 0xa1, 0x77, 0x60, 0xde, + 0x51, 0xd3, 0x4a, 0x09, 0x15, 0xae, 0xd8, 0x51, 0x6e, 0x22, 0x41, 0x55, 0x74, 0x0a, 0xa9, 0x14, + 0xe1, 0x24, 0x2d, 0xb4, 0x03, 0xb3, 0x4e, 0x94, 0x0b, 0x4d, 0xe8, 0x71, 0x2f, 0x15, 0x26, 0xcc, + 0xb0, 0x70, 0x9f, 0xaa, 0xfc, 0x89, 0x63, 0xfc, 0x94, 0xef, 0xe4, 0x8f, 0x72, 0x7e, 0xd5, 0x98, + 0x9a, 0xe4, 0x3b, 0x59, 0x14, 0x60, 0x85, 0x4a, 0x8e, 0xdf, 0xab, 0x5a, 0xc8, 0xef, 0x35, 0x84, + 0xf3, 0x3e, 0x09, 0xfd, 0xfd, 0xe6, 0xbe, 0xc9, 0x9e, 0xd3, 0xf3, 0x43, 0x96, 0xf6, 0x6c, 0xb6, + 0xd8, 0xfd, 0x05, 0x3c, 0x8a, 0x0a, 0x67, 0xe1, 0xa7, 0x76, 0x1a, 0xdd, 0xf4, 0xc5, 0xf5, 0x61, + 0x66, 0xa7, 0xb1, 0x17, 0xf0, 0x59, 0x29, 0xfa, 0x04, 0xd4, 0x42, 0x62, 0x6e, 0xbb, 0xb6, 0x69, + 0x38, 0xed, 0x96, 0xd0, 0xa8, 0xe2, 0x3d, 0x34, 0x06, 0x61, 0xb5, 0x1e, 0x6a, 0xc0, 0xc4, 0xd0, + 0xb6, 0x84, 0x2a, 0xf5, 0xa3, 0xd2, 0x86, 0x6f, 0xb7, 0xee, 0x1f, 0xd4, 0x3f, 0x10, 0x47, 0xe7, + 0xca, 0x2f, 0xb9, 0x3a, 0xd8, 0xe9, 0x5d, 0x0d, 0xf7, 0x07, 0x24, 0x58, 0xd9, 0x68, 0xb7, 0x30, + 0x6d, 0x9c, 0xe5, 0x07, 0x9c, 0x1f, 0xdf, 0x0f, 0x88, 0x7e, 0x49, 0x83, 0xf3, 0x46, 0xda, 0xfd, + 0x40, 0x82, 0xe5, 0x85, 0x12, 0x52, 0x39, 0xdb, 0xa7, 0x11, 0xe7, 0x3a, 0x59, 0x1d, 0xa5, 0x87, + 0xb3, 0x3a, 0xa1, 0xdf, 0x04, 0x88, 0xf5, 0x8f, 0xd2, 0x5e, 0xca, 0xff, 0x3c, 0x05, 0x17, 0xcb, + 0x9e, 0xe6, 0xb2, 0x7c, 0x65, 0xec, 0x49, 0x85, 0xd5, 0xad, 0x90, 0xf8, 0xb7, 0x6f, 0xaf, 0xdf, + 0xd9, 0xf6, 0x49, 0xb0, 0xed, 0x39, 0x56, 0xc1, 0x84, 0x69, 0xf1, 0xa3, 0x1c, 0x23, 0x18, 0x71, + 0x0e, 0x25, 0xd4, 0x84, 0xa5, 0xe8, 0x59, 0x07, 0x4c, 0xf7, 0xbb, 0xa1, 0x1f, 0x84, 0x22, 0xba, + 0x94, 0x39, 0xa3, 0xd7, 0xd2, 0x40, 0x3c, 0x5a, 0x3f, 0x8d, 0x84, 0x3f, 0xef, 0x30, 0xc9, 0xde, + 0x68, 0x1c, 0x41, 0xc2, 0xdf, 0x78, 0x18, 0xad, 0xaf, 0x22, 0x91, 0x6f, 0x3a, 0x32, 0xd9, 0x99, + 0x42, 0x12, 0x3f, 0xf8, 0x38, 0x5a, 0x1f, 0x59, 0xf0, 0x98, 0x4f, 0x4c, 0xaf, 0xdf, 0x27, 0xae, + 0xc5, 0x73, 0x5d, 0x1a, 0x7e, 0xcf, 0x76, 0xaf, 0xf9, 0x06, 0xab, 0x28, 0x1e, 0x8e, 0x7c, 0xe2, + 0xf0, 0xa0, 0xfe, 0x18, 0x3e, 0xa2, 0x1e, 0x3e, 0x12, 0x0b, 0xea, 0xc3, 0xb9, 0x21, 0x4b, 0xed, + 0xe3, 0xb7, 0xdd, 0x90, 0xf8, 0xbb, 0x86, 0x53, 0xf0, 0xdd, 0x12, 0xb6, 0xb0, 0x36, 0x92, 0xa8, + 0x70, 0x1a, 0x37, 0xda, 0xa7, 0x72, 0x4a, 0x74, 0x47, 0x21, 0x59, 0x2d, 0x9e, 0xd1, 0x0f, 0x8f, + 0xa2, 0xc3, 0x59, 0x34, 0xf4, 0xbf, 0xad, 0x81, 0x38, 0x7c, 0x92, 0x8f, 0x1e, 0x6b, 0x99, 0x8f, + 0x1e, 0x9f, 0xce, 0xe3, 0xdf, 0x7f, 0x21, 0x7e, 0x51, 0x3d, 0xf3, 0xe9, 0x6f, 0xf9, 0xf6, 0xfd, + 0x5d, 0x10, 0x8d, 0x59, 0xfe, 0xb4, 0xb1, 0x92, 0x6f, 0x1d, 0xff, 0xf4, 0x70, 0x9c, 0xfe, 0x6b, + 0x22, 0x37, 0xfd, 0xd7, 0xb7, 0x35, 0x48, 0x3f, 0x62, 0x87, 0x9e, 0x84, 0x19, 0x71, 0x1f, 0x4b, + 0xdc, 0xe8, 0xe0, 0x91, 0x79, 0xbc, 0x08, 0x47, 0xb0, 0xa4, 0x71, 0x57, 0x46, 0x55, 0xcd, 0x8e, + 0x39, 0x3f, 0x46, 0x69, 0x3c, 0x58, 0x80, 0x69, 0x7e, 0x81, 0x08, 0xfd, 0x64, 0x66, 0xe8, 0xcf, + 0xcd, 0x12, 0x77, 0x94, 0x0a, 0x44, 0xf8, 0x24, 0x52, 0xbc, 0x54, 0x8e, 0x4c, 0xf1, 0xd2, 0xe5, + 0x79, 0xf8, 0xca, 0xf8, 0xf6, 0x9a, 0xb8, 0x2d, 0x12, 0xc1, 0x8b, 0x1c, 0x7c, 0x68, 0x98, 0x70, + 0x79, 0x4d, 0x96, 0xc8, 0x31, 0xc8, 0x87, 0x40, 0x71, 0x7c, 0x2d, 0x1c, 0xe1, 0xf4, 0x8a, 0x2f, + 0x6c, 0x4c, 0x95, 0x38, 0x6a, 0x12, 0xa3, 0x3e, 0xc6, 0x85, 0x0d, 0xc9, 0xf6, 0xd3, 0xb9, 0x6c, + 0xdf, 0x83, 0x19, 0x21, 0x38, 0x84, 0x14, 0x7b, 0xa1, 0x4c, 0x96, 0x3d, 0xe5, 0xae, 0x2d, 0x2f, + 0xc0, 0x11, 0x76, 0xba, 0x37, 0xf6, 0x8d, 0x3d, 0xbb, 0x3f, 0xec, 0x33, 0xd9, 0x35, 0xa5, 0x56, + 0x65, 0xc5, 0x38, 0x82, 0xb3, 0xaa, 0xfc, 0x8c, 0x8e, 0xa9, 0x63, 0x6a, 0x55, 0xf1, 0x96, 0x49, + 0x04, 0x47, 0x9f, 0x87, 0x6a, 0xdf, 0xd8, 0xeb, 0x0e, 0xfd, 0x1e, 0x11, 0xbe, 0xae, 0x7c, 0x77, + 0xc1, 0x30, 0xb4, 0x9d, 0x15, 0x6a, 0x48, 0x84, 0xfe, 0x4a, 0xdb, 0x0d, 0x6f, 0xfb, 0xdd, 0xd0, + 0x97, 0xd9, 0xc4, 0xd6, 0x05, 0x16, 0x2c, 0xf1, 0x21, 0x07, 0x16, 0xfa, 0xc6, 0xde, 0x86, 0x6b, + 0xc8, 0x27, 0x17, 0x6a, 0x05, 0x29, 0x30, 0xc7, 0xff, 0x7a, 0x02, 0x17, 0x4e, 0xe1, 0xce, 0x38, + 0x63, 0x98, 0x7b, 0x50, 0x67, 0x0c, 0xab, 0x32, 0x1c, 0x62, 0x9e, 0xb1, 0xe1, 0x23, 0x59, 0x87, + 0x79, 0x47, 0x47, 0x3a, 0xbc, 0x29, 0x23, 0x1d, 0x16, 0x4a, 0x1c, 0x0c, 0x1c, 0x11, 0xe5, 0xb0, + 0x0b, 0x35, 0xcb, 0x08, 0x0d, 0x5e, 0x1a, 0x2c, 0x9f, 0x2b, 0xe1, 0xd3, 0x68, 0x49, 0x3c, 0x4a, + 0x22, 0xe4, 0x18, 0x37, 0x56, 0x09, 0xa1, 0xdb, 0x3c, 0x25, 0xbf, 0x43, 0xc2, 0xb8, 0x0a, 0x73, + 0x1a, 0x2e, 0x72, 0xa7, 0x63, 0x94, 0x40, 0x7f, 0xa4, 0x02, 0xce, 0x6e, 0x47, 0xd5, 0x49, 0x1e, + 0x92, 0xbd, 0x14, 0xdf, 0xf2, 0x4f, 0xdc, 0xe2, 0xfa, 0x9b, 0x1a, 0x2c, 0xf2, 0xc7, 0x92, 0x9a, + 0x5e, 0x7f, 0xe0, 0xb9, 0x84, 0x4e, 0x0c, 0x62, 0xa3, 0x7a, 0xa3, 0x84, 0x7c, 0xe8, 0xa6, 0x50, + 0x8a, 0x83, 0xd8, 0x54, 0x29, 0x1e, 0x21, 0x8d, 0xfe, 0x99, 0x06, 0xcb, 0xfd, 0x9c, 0x3c, 0xc3, + 0xcb, 0xe7, 0x4b, 0xc4, 0x82, 0x1d, 0x97, 0xbc, 0x98, 0x3f, 0xe4, 0x76, 0x5c, 0x2d, 0x9c, 0xdb, + 0xb9, 0xb2, 0x61, 0xa3, 0x65, 0xae, 0xb7, 0xfd, 0x65, 0x58, 0x4c, 0xef, 0x04, 0xea, 0x1b, 0x02, + 0xda, 0x83, 0x7d, 0x43, 0x40, 0x7f, 0x11, 0x2e, 0x65, 0xcf, 0x3a, 0xd5, 0x8e, 0xd8, 0x93, 0x1c, + 0xc2, 0x20, 0x89, 0x93, 0xe2, 0xd1, 0x42, 0xcc, 0x61, 0x8d, 0x95, 0xef, 0xfc, 0xf0, 0xca, 0x43, + 0xdf, 0xfb, 0xe1, 0x95, 0x87, 0xbe, 0xff, 0xc3, 0x2b, 0x0f, 0x7d, 0xf9, 0xf0, 0x8a, 0xf6, 0x9d, + 0xc3, 0x2b, 0xda, 0xf7, 0x0e, 0xaf, 0x68, 0xdf, 0x3f, 0xbc, 0xa2, 0xfd, 0xc7, 0xc3, 0x2b, 0xda, + 0xdf, 0xfa, 0x4f, 0x57, 0x1e, 0xfa, 0x7c, 0x35, 0xea, 0xd2, 0x9f, 0x07, 0x00, 0x00, 0xff, 0xff, + 0xa0, 0x48, 0xc1, 0xf3, 0x5e, 0xaf, 0x00, 0x00, } func (m *Addon) Marshal() (dAtA []byte, err error) { @@ -6925,18 +6955,6 @@ func (m *HorizontalPodAutoscalerConfig) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l - if m.UpscaleDelay != nil { - { - size, err := m.UpscaleDelay.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } if m.Tolerance != nil { i -= 8 encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(*m.Tolerance)))) @@ -6979,18 +6997,6 @@ func (m *HorizontalPodAutoscalerConfig) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x1a } - if m.DownscaleDelay != nil { - { - size, err := m.DownscaleDelay.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } if m.CPUInitializationPeriod != nil { { size, err := m.CPUInitializationPeriod.MarshalToSizedBuffer(dAtA[:i]) @@ -11186,6 +11192,39 @@ func (m *Shoot) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ShootAdvertisedAddress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ShootAdvertisedAddress) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShootAdvertisedAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.URL) + copy(dAtA[i:], m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ShootList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11692,6 +11731,20 @@ func (m *ShootStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AdvertisedAddresses) > 0 { + for iNdEx := len(m.AdvertisedAddresses) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AdvertisedAddresses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 + } + } if m.ClusterIdentity != nil { i -= len(*m.ClusterIdentity) copy(dAtA[i:], *m.ClusterIdentity) @@ -13270,10 +13323,6 @@ func (m *HorizontalPodAutoscalerConfig) Size() (n int) { l = m.CPUInitializationPeriod.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.DownscaleDelay != nil { - l = m.DownscaleDelay.Size() - n += 1 + l + sovGenerated(uint64(l)) - } if m.DownscaleStabilization != nil { l = m.DownscaleStabilization.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -13289,10 +13338,6 @@ func (m *HorizontalPodAutoscalerConfig) Size() (n int) { if m.Tolerance != nil { n += 9 } - if m.UpscaleDelay != nil { - l = m.UpscaleDelay.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -14840,6 +14885,19 @@ func (m *Shoot) Size() (n int) { return n } +func (m *ShootAdvertisedAddress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.URL) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *ShootList) Size() (n int) { if m == nil { return 0 @@ -15073,6 +15131,12 @@ func (m *ShootStatus) Size() (n int) { l = len(*m.ClusterIdentity) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.AdvertisedAddresses) > 0 { + for _, e := range m.AdvertisedAddresses { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -15927,12 +15991,10 @@ func (this *HorizontalPodAutoscalerConfig) String() string { } s := strings.Join([]string{`&HorizontalPodAutoscalerConfig{`, `CPUInitializationPeriod:` + strings.Replace(fmt.Sprintf("%v", this.CPUInitializationPeriod), "Duration", "v11.Duration", 1) + `,`, - `DownscaleDelay:` + strings.Replace(fmt.Sprintf("%v", this.DownscaleDelay), "Duration", "v11.Duration", 1) + `,`, `DownscaleStabilization:` + strings.Replace(fmt.Sprintf("%v", this.DownscaleStabilization), "Duration", "v11.Duration", 1) + `,`, `InitialReadinessDelay:` + strings.Replace(fmt.Sprintf("%v", this.InitialReadinessDelay), "Duration", "v11.Duration", 1) + `,`, `SyncPeriod:` + strings.Replace(fmt.Sprintf("%v", this.SyncPeriod), "Duration", "v11.Duration", 1) + `,`, `Tolerance:` + valueToStringGenerated(this.Tolerance) + `,`, - `UpscaleDelay:` + strings.Replace(fmt.Sprintf("%v", this.UpscaleDelay), "Duration", "v11.Duration", 1) + `,`, `}`, }, "") return s @@ -17030,6 +17092,17 @@ func (this *Shoot) String() string { }, "") return s } +func (this *ShootAdvertisedAddress) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ShootAdvertisedAddress{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `}`, + }, "") + return s +} func (this *ShootList) String() string { if this == nil { return "nil" @@ -17183,6 +17256,11 @@ func (this *ShootStatus) String() string { repeatedStringForLastErrors += strings.Replace(strings.Replace(f.String(), "LastError", "LastError", 1), `&`, ``, 1) + "," } repeatedStringForLastErrors += "}" + repeatedStringForAdvertisedAddresses := "[]ShootAdvertisedAddress{" + for _, f := range this.AdvertisedAddresses { + repeatedStringForAdvertisedAddresses += strings.Replace(strings.Replace(f.String(), "ShootAdvertisedAddress", "ShootAdvertisedAddress", 1), `&`, ``, 1) + "," + } + repeatedStringForAdvertisedAddresses += "}" s := strings.Join([]string{`&ShootStatus{`, `Conditions:` + repeatedStringForConditions + `,`, `Constraints:` + repeatedStringForConstraints + `,`, @@ -17197,6 +17275,7 @@ func (this *ShootStatus) String() string { `TechnicalID:` + fmt.Sprintf("%v", this.TechnicalID) + `,`, `UID:` + fmt.Sprintf("%v", this.UID) + `,`, `ClusterIdentity:` + valueToStringGenerated(this.ClusterIdentity) + `,`, + `AdvertisedAddresses:` + repeatedStringForAdvertisedAddresses + `,`, `}`, }, "") return s @@ -24183,42 +24262,6 @@ func (m *HorizontalPodAutoscalerConfig) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DownscaleDelay", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DownscaleDelay == nil { - m.DownscaleDelay = &v11.Duration{} - } - if err := m.DownscaleDelay.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DownscaleStabilization", wireType) @@ -24339,42 +24382,6 @@ func (m *HorizontalPodAutoscalerConfig) Unmarshal(dAtA []byte) error { iNdEx += 8 v2 := float64(math.Float64frombits(v)) m.Tolerance = &v2 - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpscaleDelay", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UpscaleDelay == nil { - m.UpscaleDelay = &v11.Duration{} - } - if err := m.UpscaleDelay.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -37088,6 +37095,123 @@ func (m *Shoot) Unmarshal(dAtA []byte) error { } return nil } +func (m *ShootAdvertisedAddress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ShootAdvertisedAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShootAdvertisedAddress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ShootList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -38948,6 +39072,40 @@ func (m *ShootStatus) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.ClusterIdentity = &s iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdvertisedAddresses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AdvertisedAddresses = append(m.AdvertisedAddresses, ShootAdvertisedAddress{}) + if err := m.AdvertisedAddresses[len(m.AdvertisedAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto index c9f83d6b1..90544b5cd 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/generated.proto @@ -687,10 +687,6 @@ message HorizontalPodAutoscalerConfig { // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration cpuInitializationPeriod = 1; - // The period since last downscale, before another downscale can be performed in horizontal pod autoscaler. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration downscaleDelay = 2; - // The configurable window at which the controller will choose the highest recommendation for autoscaling. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration downscaleStabilization = 3; @@ -706,10 +702,6 @@ message HorizontalPodAutoscalerConfig { // The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. // +optional optional double tolerance = 6; - - // The period since last upscale, before another upscale can be performed in horizontal pod autoscaler. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration upscaleDelay = 7; } // Ingress configures the Ingress specific settings of the Seed cluster. @@ -1008,7 +1000,6 @@ message KubeletConfigReserved { optional k8s.io.apimachinery.pkg.api.resource.Quantity ephemeralStorage = 3; // PID is the reserved process-ids. - // To reserve PID, the SupportNodePidsLimit feature gate must be enabled in Kubernetes versions < 1.15. // +optional optional k8s.io.apimachinery.pkg.api.resource.Quantity pid = 4; } @@ -1330,7 +1321,6 @@ message OIDCConfig { // +optional optional string issuerURL = 6; - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. // +optional map requiredClaims = 7; @@ -1446,7 +1436,7 @@ message ProjectMember { // Role represents the role of this member. // IMPORTANT: Be aware that this field will be removed in the `v1` version of this API in favor of the `roles` // list. - // TODO: Remove this field in favor of the `owner` role in `v1`. + // TODO: Remove this field in favor of the `roles` list in `v1`. optional string role = 2; // Roles represents the list of roles of this member. @@ -1759,9 +1749,7 @@ message SeedSelector { repeated string providerTypes = 2; } -// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the -// seed. When enabled then this is done via PodPriority and requires the Seed cluster to have Kubernetes version 1.11 -// or the PodPriority feature gate as well as the scheduling.k8s.io/v1alpha1 API group enabled. +// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. message SeedSettingExcessCapacityReservation { // Enabled controls whether the excess capacity reservation should be enabled. optional bool enabled = 1; @@ -1813,8 +1801,7 @@ message SeedSettings { // +optional optional SeedSettingShootDNS shootDNS = 3; - // LoadBalancerServices controls certain settings for services of type load balancer that are created in the - // seed. + // LoadBalancerServices controls certain settings for services of type load balancer that are created in the seed. // +optional optional SeedSettingLoadBalancerServices loadBalancerServices = 4; @@ -1955,6 +1942,15 @@ message Shoot { optional ShootStatus status = 3; } +// ShootAdvertisedAddress contains information for the shoot's Kube API server. +message ShootAdvertisedAddress { + // Name of the advertised address. e.g. external + optional string name = 1; + + // The URL of the API Server. e.g. https://api.foo.bar or https://1.2.3.4 + optional string url = 2; +} + // ShootList is a list of Shoot objects. message ShootList { // Standard list object metadata. @@ -2157,6 +2153,12 @@ message ShootStatus { // ClusterIdentity is the identity of the Shoot cluster // +optional optional string clusterIdentity = 13; + + // List of addresses on which the Kube API server can be reached. + // +optional + // +patchMergeKey=name + // +patchStrategy=merge + repeated ShootAdvertisedAddress advertisedAddresses = 14; } // Toleration is a toleration for a seed taint. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go index 2ef77f8d5..3fc48ccfe 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_common.go @@ -32,6 +32,8 @@ const ( // ErrorInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level. // It is classified as a non-retryable error code. ErrorInfraDependencies ErrorCode = "ERR_INFRA_DEPENDENCIES" + // ErrorRetryableInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level, but operation should be retried. + ErrorRetryableInfraDependencies ErrorCode = "ERR_RETRYABLE_INFRA_DEPENDENCIES" // ErrorInfraResourcesDepleted indicates that the last error occurred due to depleted resource in the infrastructure. ErrorInfraResourcesDepleted ErrorCode = "ERR_INFRA_RESOURCES_DEPLETED" // ErrorCleanupClusterResources indicates that the last error occurred due to resources in the cluster that are stuck in deletion. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_project.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_project.go index b48ec447e..6980f49b1 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_project.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_project.go @@ -106,7 +106,7 @@ type ProjectMember struct { // Role represents the role of this member. // IMPORTANT: Be aware that this field will be removed in the `v1` version of this API in favor of the `roles` // list. - // TODO: Remove this field in favor of the `owner` role in `v1`. + // TODO: Remove this field in favor of the `roles` list in `v1`. Role string `json:"role" protobuf:"bytes,2,opt,name=role"` // Roles represents the list of roles of this member. // +optional diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go index 25d8e7e1f..e417148c7 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_seed.go @@ -212,8 +212,7 @@ type SeedSettings struct { // ShootDNS controls the shoot DNS settings for the seed. // +optional ShootDNS *SeedSettingShootDNS `json:"shootDNS,omitempty" protobuf:"bytes,3,opt,name=shootDNS"` - // LoadBalancerServices controls certain settings for services of type load balancer that are created in the - // seed. + // LoadBalancerServices controls certain settings for services of type load balancer that are created in the seed. // +optional LoadBalancerServices *SeedSettingLoadBalancerServices `json:"loadBalancerServices,omitempty" protobuf:"bytes,4,opt,name=loadBalancerServices"` // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. @@ -221,9 +220,7 @@ type SeedSettings struct { VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler `json:"verticalPodAutoscaler,omitempty" protobuf:"bytes,5,opt,name=verticalPodAutoscaler"` } -// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the -// seed. When enabled then this is done via PodPriority and requires the Seed cluster to have Kubernetes version 1.11 -// or the PodPriority feature gate as well as the scheduling.k8s.io/v1alpha1 API group enabled. +// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. type SeedSettingExcessCapacityReservation struct { // Enabled controls whether the excess capacity reservation should be enabled. Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go index 083e06770..46f7ed33a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/types_shoot.go @@ -153,6 +153,19 @@ type ShootStatus struct { // ClusterIdentity is the identity of the Shoot cluster // +optional ClusterIdentity *string `json:"clusterIdentity,omitempty" protobuf:"bytes,13,opt,name=clusterIdentity"` + // List of addresses on which the Kube API server can be reached. + // +optional + // +patchMergeKey=name + // +patchStrategy=merge + AdvertisedAddresses []ShootAdvertisedAddress `json:"advertisedAddresses,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,14,rep,name=advertisedAddresses"` +} + +// ShootAdvertisedAddress contains information for the shoot's Kube API server. +type ShootAdvertisedAddress struct { + // Name of the advertised address. e.g. external + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // The URL of the API Server. e.g. https://api.foo.bar or https://1.2.3.4 + URL string `json:"url" protobuf:"bytes,2,opt,name=url"` } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -536,7 +549,6 @@ type OIDCConfig struct { // The URL of the OpenID issuer, only HTTPS scheme will be accepted. If set, it will be used to verify the OIDC JSON Web Token (JWT). // +optional IssuerURL *string `json:"issuerURL,omitempty" protobuf:"bytes,6,opt,name=issuerURL"` - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. // +optional RequiredClaims map[string]string `json:"requiredClaims,omitempty" protobuf:"bytes,7,rep,name=requiredClaims"` @@ -618,9 +630,6 @@ type HorizontalPodAutoscalerConfig struct { // The period after which a ready pod transition is considered to be the first. // +optional CPUInitializationPeriod *metav1.Duration `json:"cpuInitializationPeriod,omitempty" protobuf:"bytes,1,opt,name=cpuInitializationPeriod"` - // The period since last downscale, before another downscale can be performed in horizontal pod autoscaler. - // +optional - DownscaleDelay *metav1.Duration `json:"downscaleDelay,omitempty" protobuf:"bytes,2,opt,name=downscaleDelay"` // The configurable window at which the controller will choose the highest recommendation for autoscaling. // +optional DownscaleStabilization *metav1.Duration `json:"downscaleStabilization,omitempty" protobuf:"bytes,3,opt,name=downscaleStabilization"` @@ -633,20 +642,13 @@ type HorizontalPodAutoscalerConfig struct { // The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. // +optional Tolerance *float64 `json:"tolerance,omitempty" protobuf:"fixed64,6,opt,name=tolerance"` - // The period since last upscale, before another upscale can be performed in horizontal pod autoscaler. - // +optional - UpscaleDelay *metav1.Duration `json:"upscaleDelay,omitempty" protobuf:"bytes,7,opt,name=upscaleDelay"` } const ( - // DefaultHPADownscaleDelay is a constant for the default HPA downscale delay for a Shoot cluster. - DefaultHPADownscaleDelay = 15 * time.Minute // DefaultHPASyncPeriod is a constant for the default HPA sync period for a Shoot cluster. DefaultHPASyncPeriod = 30 * time.Second // DefaultHPATolerance is a constant for the default HPA tolerance for a Shoot cluster. DefaultHPATolerance = 0.1 - // DefaultHPAUpscaleDelay is for the default HPA upscale delay for a Shoot cluster. - DefaultHPAUpscaleDelay = 1 * time.Minute // DefaultDownscaleStabilization is the default HPA downscale stabilization window for a Shoot cluster DefaultDownscaleStabilization = 5 * time.Minute // DefaultInitialReadinessDelay is for the default HPA ReadinessDelay value in the Shoot cluster @@ -832,7 +834,6 @@ type KubeletConfigReserved struct { // +optional EphemeralStorage *resource.Quantity `json:"ephemeralStorage,omitempty" protobuf:"bytes,3,opt,name=ephemeralStorage"` // PID is the reserved process-ids. - // To reserve PID, the SupportNodePidsLimit feature gate must be enabled in Kubernetes versions < 1.15. // +optional PID *resource.Quantity `json:"pid,omitempty" protobuf:"bytes,4,opt,name=pid"` } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go index 6169e1309..62ec0bb0a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.conversion.go @@ -1157,6 +1157,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*ShootAdvertisedAddress)(nil), (*core.ShootAdvertisedAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(a.(*ShootAdvertisedAddress), b.(*core.ShootAdvertisedAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ShootAdvertisedAddress)(nil), (*ShootAdvertisedAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ShootAdvertisedAddress_To_v1alpha1_ShootAdvertisedAddress(a.(*core.ShootAdvertisedAddress), b.(*ShootAdvertisedAddress), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ShootList)(nil), (*core.ShootList)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ShootList_To_core_ShootList(a.(*ShootList), b.(*core.ShootList), scope) }); err != nil { @@ -2559,12 +2569,10 @@ func Convert_core_HibernationSchedule_To_v1alpha1_HibernationSchedule(in *core.H func autoConvert_v1alpha1_HorizontalPodAutoscalerConfig_To_core_HorizontalPodAutoscalerConfig(in *HorizontalPodAutoscalerConfig, out *core.HorizontalPodAutoscalerConfig, s conversion.Scope) error { out.CPUInitializationPeriod = (*metav1.Duration)(unsafe.Pointer(in.CPUInitializationPeriod)) - out.DownscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.DownscaleDelay)) out.DownscaleStabilization = (*metav1.Duration)(unsafe.Pointer(in.DownscaleStabilization)) out.InitialReadinessDelay = (*metav1.Duration)(unsafe.Pointer(in.InitialReadinessDelay)) out.SyncPeriod = (*metav1.Duration)(unsafe.Pointer(in.SyncPeriod)) out.Tolerance = (*float64)(unsafe.Pointer(in.Tolerance)) - out.UpscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.UpscaleDelay)) return nil } @@ -2575,12 +2583,10 @@ func Convert_v1alpha1_HorizontalPodAutoscalerConfig_To_core_HorizontalPodAutosca func autoConvert_core_HorizontalPodAutoscalerConfig_To_v1alpha1_HorizontalPodAutoscalerConfig(in *core.HorizontalPodAutoscalerConfig, out *HorizontalPodAutoscalerConfig, s conversion.Scope) error { out.CPUInitializationPeriod = (*metav1.Duration)(unsafe.Pointer(in.CPUInitializationPeriod)) - out.DownscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.DownscaleDelay)) out.DownscaleStabilization = (*metav1.Duration)(unsafe.Pointer(in.DownscaleStabilization)) out.InitialReadinessDelay = (*metav1.Duration)(unsafe.Pointer(in.InitialReadinessDelay)) out.SyncPeriod = (*metav1.Duration)(unsafe.Pointer(in.SyncPeriod)) out.Tolerance = (*float64)(unsafe.Pointer(in.Tolerance)) - out.UpscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.UpscaleDelay)) return nil } @@ -4541,6 +4547,28 @@ func Convert_core_Shoot_To_v1alpha1_Shoot(in *core.Shoot, out *Shoot, s conversi return autoConvert_core_Shoot_To_v1alpha1_Shoot(in, out, s) } +func autoConvert_v1alpha1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in *ShootAdvertisedAddress, out *core.ShootAdvertisedAddress, s conversion.Scope) error { + out.Name = in.Name + out.URL = in.URL + return nil +} + +// Convert_v1alpha1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress is an autogenerated conversion function. +func Convert_v1alpha1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in *ShootAdvertisedAddress, out *core.ShootAdvertisedAddress, s conversion.Scope) error { + return autoConvert_v1alpha1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in, out, s) +} + +func autoConvert_core_ShootAdvertisedAddress_To_v1alpha1_ShootAdvertisedAddress(in *core.ShootAdvertisedAddress, out *ShootAdvertisedAddress, s conversion.Scope) error { + out.Name = in.Name + out.URL = in.URL + return nil +} + +// Convert_core_ShootAdvertisedAddress_To_v1alpha1_ShootAdvertisedAddress is an autogenerated conversion function. +func Convert_core_ShootAdvertisedAddress_To_v1alpha1_ShootAdvertisedAddress(in *core.ShootAdvertisedAddress, out *ShootAdvertisedAddress, s conversion.Scope) error { + return autoConvert_core_ShootAdvertisedAddress_To_v1alpha1_ShootAdvertisedAddress(in, out, s) +} + func autoConvert_v1alpha1_ShootList_To_core_ShootList(in *ShootList, out *core.ShootList, s conversion.Scope) error { out.ListMeta = in.ListMeta if in.Items != nil { @@ -4785,6 +4813,7 @@ func autoConvert_v1alpha1_ShootStatus_To_core_ShootStatus(in *ShootStatus, out * out.TechnicalID = in.TechnicalID out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) + out.AdvertisedAddresses = *(*[]core.ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) return nil } @@ -4803,6 +4832,7 @@ func autoConvert_core_ShootStatus_To_v1alpha1_ShootStatus(in *core.ShootStatus, out.TechnicalID = in.TechnicalID out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) + out.AdvertisedAddresses = *(*[]ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go index 133b3765f..1c877b783 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1alpha1/zz_generated.deepcopy.go @@ -1278,11 +1278,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(metav1.Duration) **out = **in } - if in.DownscaleDelay != nil { - in, out := &in.DownscaleDelay, &out.DownscaleDelay - *out = new(metav1.Duration) - **out = **in - } if in.DownscaleStabilization != nil { in, out := &in.DownscaleStabilization, &out.DownscaleStabilization *out = new(metav1.Duration) @@ -1303,11 +1298,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(float64) **out = **in } - if in.UpscaleDelay != nil { - in, out := &in.UpscaleDelay, &out.UpscaleDelay - *out = new(metav1.Duration) - **out = **in - } return } @@ -3497,6 +3487,22 @@ func (in *Shoot) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ShootAdvertisedAddress) DeepCopyInto(out *ShootAdvertisedAddress) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShootAdvertisedAddress. +func (in *ShootAdvertisedAddress) DeepCopy() *ShootAdvertisedAddress { + if in == nil { + return nil + } + out := new(ShootAdvertisedAddress) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ShootList) DeepCopyInto(out *ShootList) { *out = *in @@ -3806,6 +3812,11 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = new(string) **out = **in } + if in.AdvertisedAddresses != nil { + in, out := &in.AdvertisedAddresses, &out.AdvertisedAddresses + *out = make([]ShootAdvertisedAddress, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go index c386ce210..d3b5fa196 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/constants/types_constants.go @@ -61,6 +61,9 @@ const ( // DeploymentNameKubeControllerManager is a constant for the name of a Kubernetes deployment object that contains // the kube-controller-manager pod. DeploymentNameKubeControllerManager = "kube-controller-manager" + // DeploymentNameGardenlet is a constant for the name of a Kubernetes deployment object that contains + // the Gardenlet pod. + DeploymentNameGardenlet = "gardenlet" // DeploymentNameKubeScheduler is a constant for the name of a Kubernetes deployment object that contains // the kube-scheduler pod. @@ -110,6 +113,9 @@ const ( // GardenerDescription is a constant for a key in an annotation describing what the resource is used for. GardenerDescription = "gardener.cloud/description" + // GardenCreatedBy is the key for an annotation of a Shoot cluster whose value indicates contains the username + // of the user that created the resource. + GardenCreatedBy = "gardener.cloud/created-by" // GardenerOperation is a constant for an annotation on a resource that describes a desired operation. GardenerOperation = "gardener.cloud/operation" // GardenerOperationReconcile is a constant for the value of the operation annotation describing a reconcile @@ -158,17 +164,71 @@ const ( GardenRoleKubeconfig = "kubeconfig" // GardenRoleSSHKeyPair is the value of the GardenRole key indicating type 'ssh-keypair'. GardenRoleSSHKeyPair = "ssh-keypair" + // GardenRoleDefaultDomain is the value of the GardenRole key indicating type 'default-domain'. + GardenRoleDefaultDomain = "default-domain" + // GardenRoleInternalDomain is the value of the GardenRole key indicating type 'internal-domain'. + GardenRoleInternalDomain = "internal-domain" + // GardenRoleOpenVPNDiffieHellman is the value of the GardenRole key indicating type 'openvpn-diffie-hellman'. + GardenRoleOpenVPNDiffieHellman = "openvpn-diffie-hellman" + // GardenRoleGlobalMonitoring is the value of the GardenRole key indicating type 'global-monitoring' + GardenRoleGlobalMonitoring = "global-monitoring" + // GardenRoleAlerting is the value of GardenRole key indicating type 'alerting'. + GardenRoleAlerting = "alerting" + // GardenRoleHvpa is the value of GardenRole key indicating type 'hvpa'. + GardenRoleHvpa = "hvpa" + // GardenRoleControlPlaneWildcardCert is the value of the GardenRole key indicating type 'controlplane-cert'. + // It refers to a wildcard tls certificate which can be used for services exposed under the corresponding domain. + GardenRoleControlPlaneWildcardCert = "controlplane-cert" - // DeprecatedShootUID is an annotation key for the shoot namespace in the seed cluster, - // which value will be the value of `shoot.status.uid` - // - // Deprecated: Use the `Cluster` resource or the annotation key from the new API group `ShootUID`. - DeprecatedShootUID = "shoot.garden.sapcloud.io/uid" // ShootUID is an annotation key for the shoot namespace in the seed cluster, // which value will be the value of `shoot.status.uid` ShootUID = "shoot.gardener.cloud/uid" // ShootPurpose is a constant for the shoot purpose. ShootPurpose = "shoot.gardener.cloud/purpose" + // ShootSyncPeriod is a constant for an annotation on a Shoot which may be used to overwrite the global Shoot controller sync period. + // The value must be a duration. It can also be used to disable the reconciliation at all by setting it to 0m. Disabling the reconciliation + // does only mean that the period reconciliation is disabled. However, when the Gardener is restarted/redeployed or the specification is + // changed then the reconciliation flow will be executed. + ShootSyncPeriod = "shoot.gardener.cloud/sync-period" + // ShootIgnore is a constant for an annotation on a Shoot which may be used to tell the Gardener that the Shoot with this name should be + // ignored completely. That means that the Shoot will never reach the reconciliation flow (independent of the operation (create/update/ + // delete)). + ShootIgnore = "shoot.gardener.cloud/ignore" + // ShootNoCleanup is a constant for a label on a resource indicating that the Gardener cleaner should not delete this + // resource when cleaning a shoot during the deletion flow. + ShootNoCleanup = "shoot.gardener.cloud/no-cleanup" + // ShootAlphaScalingAPIServerClass is a constant for an annotation on the shoot stating the initial API server class. + // It influences the size of the initial resource requests/limits. + // Possible values are [small, medium, large, xlarge, 2xlarge]. + // Note that this annotation is alpha and can be removed anytime without further notice. Only use it if you know + // what you do. + ShootAlphaScalingAPIServerClass = "alpha.kube-apiserver.scaling.shoot.gardener.cloud/class" + // ShootExpirationTimestamp is an annotation on a Shoot resource whose value represents the time when the Shoot lifetime + // is expired. The lifetime can be extended, but at most by the minimal value of the 'clusterLifetimeDays' property + // of referenced quotas. + ShootExpirationTimestamp = "shoot.gardener.cloud/expiration-timestamp" + // ShootStatus is a constant for a label on a Shoot resource indicating that the Shoot's health. + ShootStatus = "shoot.gardener.cloud/status" + // FailedShootNeedsRetryOperation is a constant for an annotation on a Shoot in a failed state indicating that a retry operation should be triggered during the next maintenance time window. + FailedShootNeedsRetryOperation = "maintenance.shoot.gardener.cloud/needs-retry-operation" + // ShootTasks is a constant for an annotation on a Shoot which states that certain tasks should be done. + ShootTasks = "shoot.gardener.cloud/tasks" + // ShootTaskDeployInfrastructure is a name for a Shoot's infrastructure deployment task. It indicates that the + // Infrastructure extension resource shall be reconciled. + ShootTaskDeployInfrastructure = "deployInfrastructure" + // ShootTaskRestartControlPlanePods is a name for a Shoot task which is dedicated to restart related control plane pods. + ShootTaskRestartControlPlanePods = "restartControlPlanePods" + // ShootTaskRestartCoreAddons is a name for a Shoot task which is dedicated to restart some core addons. + ShootTaskRestartCoreAddons = "restartCoreAddons" + // ShootOperationMaintain is a constant for an annotation on a Shoot indicating that the Shoot maintenance shall be + // executed as soon as possible. + ShootOperationMaintain = "maintain" + // ShootOperationRetry is a constant for an annotation on a Shoot indicating that a failed Shoot reconciliation shall be + // retried. + ShootOperationRetry = "retry" + // ShootOperationRotateKubeconfigCredentials is a constant for an annotation on a Shoot indicating that the credentials + // contained in the kubeconfig that is handed out to the user shall be rotated. + ShootOperationRotateKubeconfigCredentials = "rotate-kubeconfig-credentials" // SeedResourceManagerClass is the resource-class managed by the Gardener-Resource-Manager // instance in the garden namespace on the seeds. @@ -340,6 +400,22 @@ const ( SeedUserNamePrefix = "gardener.cloud:system:seed:" // SeedUserNameSuffixAmbiguous is the default seed name in case the gardenlet config.SeedConfig is not set SeedUserNameSuffixAmbiguous = "" + + // ProjectName is the key of a label on namespaces whose value holds the project name. + ProjectName = "project.gardener.cloud/name" + // ProjectSkipStaleCheck is the key of an annotation on a project namespace that marks the associated Project to be + // skipped by the stale project controller. If the project has already configured stale timestamps in its status + // then they will be reset. + ProjectSkipStaleCheck = "project.gardener.cloud/skip-stale-check" + // NamespaceProject is the key of an annotation on namespace whose value holds the project uid. + NamespaceProject = "namespace.gardener.cloud/project" + // NamespaceKeepAfterProjectDeletion is a constant for an annotation on a `Namespace` resource that states that it + // should not be deleted if the corresponding `Project` gets deleted. Please note that all project related labels + // from the namespace will be removed when the project is being deleted. + NamespaceKeepAfterProjectDeletion = "namespace.gardener.cloud/keep-after-project-deletion" + + // DefaultVpnRange is the default network range for the vpn between seed and shoot cluster. + DefaultVpnRange = "192.168.123.0/24" ) // ControlPlaneSecretRoles contains all role values used for control plane secrets synced to the Garden cluster. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/conversions.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/conversions.go index 749ed9106..621ae3f21 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/conversions.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/conversions.go @@ -66,6 +66,20 @@ func addConversionFuncs(scheme *runtime.Scheme) error { return err } + if err := scheme.AddFieldLabelConversionFunc( + SchemeGroupVersion.WithKind("Project"), + func(label, value string) (string, string, error) { + switch label { + case "metadata.name", core.ProjectNamespace: + return label, value, nil + default: + return "", "", fmt.Errorf("field label not supported: %s", label) + } + }, + ); err != nil { + return err + } + if err := scheme.AddFieldLabelConversionFunc( SchemeGroupVersion.WithKind("Shoot"), func(label, value string) (string, string, error) { diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go index fc30a75b9..d7e768ea2 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/defaults.go @@ -208,16 +208,11 @@ func SetDefaults_Shoot(obj *Shoot) { kubeReservedMemory = resource.MustParse("1Gi") kubeReservedCPU = resource.MustParse("80m") kubeReservedPID = resource.MustParse("20k") - - k8sVersionGreaterEqual115, _ = versionutils.CompareVersions(obj.Spec.Kubernetes.Version, ">=", "1.15") ) if obj.Spec.Kubernetes.Kubelet.KubeReserved == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved = &KubeletConfigReserved{Memory: &kubeReservedMemory, CPU: &kubeReservedCPU} - - if k8sVersionGreaterEqual115 { - obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID - } + obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID } else { if obj.Spec.Kubernetes.Kubelet.KubeReserved.Memory == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.Memory = &kubeReservedMemory @@ -225,7 +220,7 @@ func SetDefaults_Shoot(obj *Shoot) { if obj.Spec.Kubernetes.Kubelet.KubeReserved.CPU == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.CPU = &kubeReservedCPU } - if obj.Spec.Kubernetes.Kubelet.KubeReserved.PID == nil && k8sVersionGreaterEqual115 { + if obj.Spec.Kubernetes.Kubelet.KubeReserved.PID == nil { obj.Spec.Kubernetes.Kubelet.KubeReserved.PID = &kubeReservedPID } } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go index d99627bda..5c2e5060e 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.pb.go @@ -3385,10 +3385,38 @@ func (m *Shoot) XXX_DiscardUnknown() { var xxx_messageInfo_Shoot proto.InternalMessageInfo +func (m *ShootAdvertisedAddress) Reset() { *m = ShootAdvertisedAddress{} } +func (*ShootAdvertisedAddress) ProtoMessage() {} +func (*ShootAdvertisedAddress) Descriptor() ([]byte, []int) { + return fileDescriptor_ca37af0df9a5bbd2, []int{119} +} +func (m *ShootAdvertisedAddress) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShootAdvertisedAddress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *ShootAdvertisedAddress) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShootAdvertisedAddress.Merge(m, src) +} +func (m *ShootAdvertisedAddress) XXX_Size() int { + return m.Size() +} +func (m *ShootAdvertisedAddress) XXX_DiscardUnknown() { + xxx_messageInfo_ShootAdvertisedAddress.DiscardUnknown(m) +} + +var xxx_messageInfo_ShootAdvertisedAddress proto.InternalMessageInfo + func (m *ShootList) Reset() { *m = ShootList{} } func (*ShootList) ProtoMessage() {} func (*ShootList) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{119} + return fileDescriptor_ca37af0df9a5bbd2, []int{120} } func (m *ShootList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3416,7 +3444,7 @@ var xxx_messageInfo_ShootList proto.InternalMessageInfo func (m *ShootMachineImage) Reset() { *m = ShootMachineImage{} } func (*ShootMachineImage) ProtoMessage() {} func (*ShootMachineImage) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{120} + return fileDescriptor_ca37af0df9a5bbd2, []int{121} } func (m *ShootMachineImage) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3444,7 +3472,7 @@ var xxx_messageInfo_ShootMachineImage proto.InternalMessageInfo func (m *ShootNetworks) Reset() { *m = ShootNetworks{} } func (*ShootNetworks) ProtoMessage() {} func (*ShootNetworks) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{121} + return fileDescriptor_ca37af0df9a5bbd2, []int{122} } func (m *ShootNetworks) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3472,7 +3500,7 @@ var xxx_messageInfo_ShootNetworks proto.InternalMessageInfo func (m *ShootSpec) Reset() { *m = ShootSpec{} } func (*ShootSpec) ProtoMessage() {} func (*ShootSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{122} + return fileDescriptor_ca37af0df9a5bbd2, []int{123} } func (m *ShootSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3500,7 +3528,7 @@ var xxx_messageInfo_ShootSpec proto.InternalMessageInfo func (m *ShootStatus) Reset() { *m = ShootStatus{} } func (*ShootStatus) ProtoMessage() {} func (*ShootStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{123} + return fileDescriptor_ca37af0df9a5bbd2, []int{124} } func (m *ShootStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3528,7 +3556,7 @@ var xxx_messageInfo_ShootStatus proto.InternalMessageInfo func (m *ShootTemplate) Reset() { *m = ShootTemplate{} } func (*ShootTemplate) ProtoMessage() {} func (*ShootTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{124} + return fileDescriptor_ca37af0df9a5bbd2, []int{125} } func (m *ShootTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3556,7 +3584,7 @@ var xxx_messageInfo_ShootTemplate proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{125} + return fileDescriptor_ca37af0df9a5bbd2, []int{126} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3584,7 +3612,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *VerticalPodAutoscaler) Reset() { *m = VerticalPodAutoscaler{} } func (*VerticalPodAutoscaler) ProtoMessage() {} func (*VerticalPodAutoscaler) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{126} + return fileDescriptor_ca37af0df9a5bbd2, []int{127} } func (m *VerticalPodAutoscaler) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3612,7 +3640,7 @@ var xxx_messageInfo_VerticalPodAutoscaler proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{127} + return fileDescriptor_ca37af0df9a5bbd2, []int{128} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3640,7 +3668,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeType) Reset() { *m = VolumeType{} } func (*VolumeType) ProtoMessage() {} func (*VolumeType) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{128} + return fileDescriptor_ca37af0df9a5bbd2, []int{129} } func (m *VolumeType) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3668,7 +3696,7 @@ var xxx_messageInfo_VolumeType proto.InternalMessageInfo func (m *WatchCacheSizes) Reset() { *m = WatchCacheSizes{} } func (*WatchCacheSizes) ProtoMessage() {} func (*WatchCacheSizes) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{129} + return fileDescriptor_ca37af0df9a5bbd2, []int{130} } func (m *WatchCacheSizes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3696,7 +3724,7 @@ var xxx_messageInfo_WatchCacheSizes proto.InternalMessageInfo func (m *Worker) Reset() { *m = Worker{} } func (*Worker) ProtoMessage() {} func (*Worker) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{130} + return fileDescriptor_ca37af0df9a5bbd2, []int{131} } func (m *Worker) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3724,7 +3752,7 @@ var xxx_messageInfo_Worker proto.InternalMessageInfo func (m *WorkerKubernetes) Reset() { *m = WorkerKubernetes{} } func (*WorkerKubernetes) ProtoMessage() {} func (*WorkerKubernetes) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{131} + return fileDescriptor_ca37af0df9a5bbd2, []int{132} } func (m *WorkerKubernetes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3752,7 +3780,7 @@ var xxx_messageInfo_WorkerKubernetes proto.InternalMessageInfo func (m *WorkerSystemComponents) Reset() { *m = WorkerSystemComponents{} } func (*WorkerSystemComponents) ProtoMessage() {} func (*WorkerSystemComponents) Descriptor() ([]byte, []int) { - return fileDescriptor_ca37af0df9a5bbd2, []int{132} + return fileDescriptor_ca37af0df9a5bbd2, []int{133} } func (m *WorkerSystemComponents) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3907,6 +3935,7 @@ func init() { proto.RegisterType((*SeedVolumeProvider)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.SeedVolumeProvider") proto.RegisterType((*ServiceAccountConfig)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ServiceAccountConfig") proto.RegisterType((*Shoot)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.Shoot") + proto.RegisterType((*ShootAdvertisedAddress)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ShootAdvertisedAddress") proto.RegisterType((*ShootList)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ShootList") proto.RegisterType((*ShootMachineImage)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ShootMachineImage") proto.RegisterType((*ShootNetworks)(nil), "github.com.gardener.gardener.pkg.apis.core.v1beta1.ShootNetworks") @@ -3930,563 +3959,564 @@ func init() { } var fileDescriptor_ca37af0df9a5bbd2 = []byte{ - // 8886 bytes of a gzipped FileDescriptorProto + // 8898 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, - 0x75, 0xd8, 0xf5, 0xf0, 0x6b, 0xf8, 0x86, 0xe4, 0x92, 0xb5, 0x1f, 0xc7, 0xe3, 0xdd, 0xed, 0x9c, + 0x75, 0xd8, 0xf5, 0xf0, 0x6b, 0xf8, 0x86, 0xe4, 0x92, 0xb5, 0x1f, 0xc7, 0xe3, 0xdd, 0xed, 0xac, 0x5a, 0x3a, 0xe1, 0x2e, 0x92, 0xb8, 0xbe, 0x93, 0xe4, 0xd3, 0xdd, 0xe9, 0x74, 0xc7, 0x99, 0xe1, 0xee, 0x8e, 0x76, 0xc9, 0x9d, 0xab, 0x59, 0xee, 0x49, 0xe7, 0xe4, 0xa2, 0x66, 0x77, 0x71, 0xd8, - 0xc7, 0x9e, 0xee, 0xb9, 0xee, 0x1e, 0x2e, 0xb9, 0x72, 0x20, 0x45, 0x88, 0xec, 0x7c, 0x38, 0x8e, - 0xe1, 0x58, 0x11, 0x62, 0x25, 0xb0, 0x8c, 0x20, 0x31, 0x02, 0x07, 0xb2, 0x83, 0x44, 0x46, 0x82, - 0x24, 0x80, 0x61, 0x23, 0x90, 0x6c, 0x24, 0x80, 0x60, 0x44, 0x88, 0x82, 0xc4, 0x54, 0xc4, 0x00, - 0x42, 0x82, 0xe4, 0x9f, 0x91, 0x3f, 0x0b, 0x03, 0x09, 0xea, 0xa3, 0xab, 0xab, 0x7b, 0xba, 0xc9, - 0x61, 0x0f, 0xc9, 0xbb, 0xfd, 0x45, 0x4e, 0xbd, 0xaa, 0xf7, 0xaa, 0xab, 0x5e, 0xbd, 0x7a, 0xef, - 0xd5, 0xab, 0x57, 0x50, 0xeb, 0xd8, 0xe1, 0x76, 0x7f, 0x73, 0xd9, 0xf4, 0xba, 0xd7, 0x3a, 0x86, - 0x6f, 0x11, 0x97, 0xf8, 0xf1, 0x3f, 0xbd, 0x9d, 0xce, 0x35, 0xa3, 0x67, 0x07, 0xd7, 0x4c, 0xcf, - 0x27, 0xd7, 0x76, 0x5f, 0xd8, 0x24, 0xa1, 0xf1, 0xc2, 0xb5, 0x0e, 0x85, 0x19, 0x21, 0xb1, 0x96, - 0x7b, 0xbe, 0x17, 0x7a, 0xe8, 0xc5, 0x18, 0xc7, 0x72, 0xd4, 0x34, 0xfe, 0xa7, 0xb7, 0xd3, 0x59, - 0xa6, 0x38, 0x96, 0x29, 0x8e, 0x65, 0x81, 0x63, 0xe9, 0x13, 0x2a, 0x5d, 0xaf, 0xe3, 0x5d, 0x63, - 0xa8, 0x36, 0xfb, 0x5b, 0xec, 0x17, 0xfb, 0xc1, 0xfe, 0xe3, 0x24, 0x96, 0x9e, 0xdf, 0xf9, 0x4c, - 0xb0, 0x6c, 0x7b, 0xb4, 0x33, 0xd7, 0x8c, 0x7e, 0xe8, 0x05, 0xa6, 0xe1, 0xd8, 0x6e, 0xe7, 0xda, - 0xee, 0x40, 0x6f, 0x96, 0x74, 0xa5, 0xaa, 0xe8, 0xf6, 0x91, 0x75, 0xfc, 0x4d, 0xc3, 0xcc, 0xaa, - 0xf3, 0xa9, 0xb8, 0x4e, 0xd7, 0x30, 0xb7, 0x6d, 0x97, 0xf8, 0xfb, 0xd1, 0x80, 0x5c, 0xf3, 0x49, - 0xe0, 0xf5, 0x7d, 0x93, 0x9c, 0xa8, 0x55, 0x70, 0xad, 0x4b, 0x42, 0x23, 0x8b, 0xd6, 0xb5, 0xbc, - 0x56, 0x7e, 0xdf, 0x0d, 0xed, 0xee, 0x20, 0x99, 0x9f, 0x3d, 0xae, 0x41, 0x60, 0x6e, 0x93, 0xae, - 0x31, 0xd0, 0xee, 0x93, 0x79, 0xed, 0xfa, 0xa1, 0xed, 0x5c, 0xb3, 0xdd, 0x30, 0x08, 0xfd, 0x74, - 0x23, 0xfd, 0x45, 0x98, 0x58, 0xb1, 0x2c, 0xcf, 0x45, 0xcf, 0xc3, 0x14, 0x71, 0x8d, 0x4d, 0x87, - 0x58, 0x8b, 0xda, 0x33, 0xda, 0x73, 0xe5, 0xda, 0x85, 0xef, 0x1f, 0x54, 0x1f, 0x3b, 0x3c, 0xa8, - 0x4e, 0xad, 0xf2, 0x62, 0x1c, 0xc1, 0xf5, 0x6f, 0x94, 0x60, 0x92, 0x35, 0x0a, 0xd0, 0xaf, 0x6a, - 0x70, 0x71, 0xa7, 0xbf, 0x49, 0x7c, 0x97, 0x84, 0x24, 0x68, 0x18, 0xc1, 0xf6, 0xa6, 0x67, 0xf8, - 0x1c, 0x45, 0xe5, 0xc5, 0x1b, 0xcb, 0x27, 0xe7, 0x9e, 0xe5, 0x5b, 0x83, 0xe8, 0x6a, 0x8f, 0x1f, - 0x1e, 0x54, 0x2f, 0x66, 0x00, 0x70, 0x16, 0x71, 0xb4, 0x0b, 0x33, 0x6e, 0xc7, 0x76, 0xf7, 0x9a, - 0x6e, 0xc7, 0x27, 0x41, 0xb0, 0x58, 0x62, 0x9d, 0x79, 0xa3, 0x48, 0x67, 0xd6, 0x15, 0x3c, 0xb5, - 0xf9, 0xc3, 0x83, 0xea, 0x8c, 0x5a, 0x82, 0x13, 0x74, 0xf4, 0x5f, 0xd0, 0xe0, 0xc2, 0x8a, 0xd5, - 0xb5, 0x83, 0xc0, 0xf6, 0xdc, 0x96, 0xd3, 0xef, 0xd8, 0x2e, 0x7a, 0x06, 0xc6, 0x5d, 0xa3, 0x4b, - 0xd8, 0x80, 0x4c, 0xd7, 0x66, 0xc4, 0x98, 0x8e, 0xaf, 0x1b, 0x5d, 0x82, 0x19, 0x04, 0xbd, 0x09, - 0x93, 0xa6, 0xe7, 0x6e, 0xd9, 0x1d, 0xd1, 0xcf, 0x4f, 0x2c, 0xf3, 0x79, 0x5c, 0x56, 0xe7, 0x91, - 0x75, 0x4f, 0xcc, 0xff, 0x32, 0x36, 0xee, 0xaf, 0xee, 0x85, 0xc4, 0xa5, 0x64, 0x6a, 0x70, 0x78, - 0x50, 0x9d, 0xac, 0x33, 0x04, 0x58, 0x20, 0xd2, 0xaf, 0x43, 0x79, 0xc5, 0x21, 0x7e, 0x68, 0xbb, - 0x1d, 0xf4, 0x0a, 0xcc, 0x91, 0xae, 0x61, 0x3b, 0x98, 0x98, 0xc4, 0xde, 0x25, 0x7e, 0xb0, 0xa8, - 0x3d, 0x33, 0xf6, 0xdc, 0x74, 0x0d, 0x1d, 0x1e, 0x54, 0xe7, 0x56, 0x13, 0x10, 0x9c, 0xaa, 0xa9, - 0xff, 0x55, 0x0d, 0x2a, 0x2b, 0x7d, 0xcb, 0x0e, 0x39, 0x7e, 0xe4, 0x43, 0xc5, 0xa0, 0x3f, 0x5b, - 0x9e, 0x63, 0x9b, 0xfb, 0x62, 0x92, 0x5f, 0x2f, 0x32, 0xae, 0x2b, 0x31, 0x9a, 0xda, 0x85, 0xc3, - 0x83, 0x6a, 0x45, 0x29, 0xc0, 0x2a, 0x11, 0x7d, 0x1b, 0x54, 0x18, 0xfa, 0x22, 0xcc, 0xf0, 0x8f, - 0x5c, 0x33, 0x7a, 0x98, 0x6c, 0x89, 0x3e, 0x7c, 0x58, 0x19, 0xb3, 0x88, 0xd0, 0xf2, 0x9d, 0xcd, - 0x77, 0x89, 0x19, 0x62, 0xb2, 0x45, 0x7c, 0xe2, 0x9a, 0x84, 0x4f, 0x5f, 0x5d, 0x69, 0x8c, 0x13, - 0xa8, 0xf4, 0x1f, 0x6b, 0x30, 0xbf, 0xb2, 0x6b, 0xd8, 0x8e, 0xb1, 0x69, 0x3b, 0x76, 0xb8, 0xff, - 0xb6, 0xe7, 0x92, 0x21, 0xe6, 0x6f, 0x03, 0x1e, 0xef, 0xbb, 0x06, 0x6f, 0xe7, 0x90, 0x35, 0x3e, - 0x63, 0x77, 0xf7, 0x7b, 0x84, 0x32, 0x1e, 0x1d, 0xe9, 0x27, 0x0f, 0x0f, 0xaa, 0x8f, 0x6f, 0x64, - 0x57, 0xc1, 0x79, 0x6d, 0x11, 0x86, 0x2b, 0x0a, 0xe8, 0x9e, 0xe7, 0xf4, 0xbb, 0x02, 0xeb, 0x18, - 0xc3, 0xba, 0x74, 0x78, 0x50, 0xbd, 0xb2, 0x91, 0x59, 0x03, 0xe7, 0xb4, 0xd4, 0xbf, 0x5f, 0x82, - 0x99, 0x9a, 0x61, 0xee, 0xf4, 0x7b, 0xb5, 0xbe, 0xb9, 0x43, 0x42, 0xf4, 0x25, 0x28, 0x53, 0xb1, - 0x65, 0x19, 0xa1, 0x21, 0x46, 0xf2, 0x67, 0x72, 0xb9, 0x8f, 0x4d, 0x22, 0xad, 0x1d, 0x8f, 0xed, - 0x1a, 0x09, 0x8d, 0x1a, 0x12, 0x63, 0x02, 0x71, 0x19, 0x96, 0x58, 0xd1, 0x16, 0x8c, 0x07, 0x3d, - 0x62, 0x0a, 0xde, 0x6e, 0x14, 0xe1, 0x15, 0xb5, 0xc7, 0xed, 0x1e, 0x31, 0xe3, 0x59, 0xa0, 0xbf, - 0x30, 0xc3, 0x8f, 0x5c, 0x98, 0x0c, 0x42, 0x23, 0xec, 0xd3, 0xe1, 0xa1, 0x94, 0xae, 0x8f, 0x4c, - 0x89, 0x61, 0xab, 0xcd, 0x09, 0x5a, 0x93, 0xfc, 0x37, 0x16, 0x54, 0xf4, 0xff, 0xac, 0xc1, 0xbc, - 0x5a, 0xfd, 0xb6, 0x1d, 0x84, 0xe8, 0x2f, 0x0e, 0x0c, 0xe7, 0xf2, 0x70, 0xc3, 0x49, 0x5b, 0xb3, - 0xc1, 0x9c, 0x17, 0xe4, 0xca, 0x51, 0x89, 0x32, 0x94, 0x04, 0x26, 0xec, 0x90, 0x74, 0x39, 0x5b, - 0x15, 0x94, 0x67, 0x6a, 0x97, 0x6b, 0xb3, 0x82, 0xd8, 0x44, 0x93, 0xa2, 0xc5, 0x1c, 0xbb, 0xfe, - 0x25, 0xb8, 0xa4, 0xd6, 0x6a, 0xf9, 0xde, 0xae, 0x6d, 0x11, 0x9f, 0xae, 0x84, 0x70, 0xbf, 0x37, - 0xb0, 0x12, 0x28, 0x67, 0x61, 0x06, 0x41, 0x1f, 0x85, 0x49, 0x9f, 0x74, 0x6c, 0xcf, 0x65, 0xb3, - 0x3d, 0x1d, 0x8f, 0x1d, 0x66, 0xa5, 0x58, 0x40, 0xf5, 0xff, 0x5b, 0x4a, 0x8e, 0x1d, 0x9d, 0x46, - 0xb4, 0x0b, 0xe5, 0x9e, 0x20, 0x25, 0xc6, 0xee, 0xe6, 0xa8, 0x1f, 0x18, 0x75, 0x3d, 0x1e, 0xd5, - 0xa8, 0x04, 0x4b, 0x5a, 0xc8, 0x86, 0xb9, 0xe8, 0xff, 0xfa, 0x08, 0x62, 0x98, 0x89, 0xd3, 0x56, - 0x02, 0x11, 0x4e, 0x21, 0x46, 0x77, 0x61, 0x3a, 0x20, 0xa6, 0x4f, 0xa8, 0x4c, 0x12, 0x6c, 0x9a, - 0x29, 0xb8, 0xda, 0x51, 0x25, 0x21, 0xb8, 0x16, 0x44, 0xf7, 0xa7, 0x25, 0x00, 0xc7, 0x88, 0xd0, - 0x73, 0x50, 0x0e, 0x08, 0xb1, 0xa8, 0x44, 0x5a, 0x1c, 0xe7, 0x73, 0x43, 0x3f, 0xb5, 0x2d, 0xca, - 0xb0, 0x84, 0xea, 0xdf, 0x1e, 0x07, 0x34, 0xc8, 0xe2, 0xea, 0x08, 0xf0, 0x12, 0x31, 0xfe, 0xa3, - 0x8c, 0x80, 0x58, 0x2d, 0x29, 0xc4, 0xe8, 0x01, 0xcc, 0x3a, 0x46, 0x10, 0xde, 0xe9, 0x51, 0x1d, - 0x24, 0x62, 0x94, 0xca, 0x8b, 0x2b, 0x45, 0x66, 0xfa, 0xb6, 0x8a, 0xa8, 0xb6, 0x70, 0x78, 0x50, - 0x9d, 0x4d, 0x14, 0xe1, 0x24, 0x29, 0xf4, 0x2e, 0x4c, 0xd3, 0x82, 0x55, 0xdf, 0xf7, 0x7c, 0x31, - 0xfa, 0xaf, 0x15, 0xa5, 0xcb, 0x90, 0xd4, 0x66, 0xe9, 0x9c, 0xc8, 0x9f, 0x38, 0x46, 0x8f, 0x3e, - 0x0f, 0xc8, 0xdb, 0x0c, 0x88, 0xbf, 0x4b, 0xac, 0x1b, 0x5c, 0xe1, 0xa2, 0x1f, 0x4b, 0x67, 0x67, - 0xac, 0xb6, 0x24, 0x66, 0x13, 0xdd, 0x19, 0xa8, 0x81, 0x33, 0x5a, 0xa1, 0x1d, 0x40, 0x52, 0x69, - 0x93, 0x0c, 0xb0, 0x38, 0x31, 0x3c, 0xfb, 0x5c, 0xa1, 0xc4, 0x6e, 0x0c, 0xa0, 0xc0, 0x19, 0x68, - 0xf5, 0x7f, 0x5f, 0x82, 0x0a, 0x67, 0x91, 0x55, 0x37, 0xf4, 0xf7, 0xcf, 0x61, 0x83, 0x20, 0x89, - 0x0d, 0xa2, 0x5e, 0x7c, 0xcd, 0xb3, 0x0e, 0xe7, 0xee, 0x0f, 0xdd, 0xd4, 0xfe, 0xb0, 0x3a, 0x2a, - 0xa1, 0xa3, 0xb7, 0x87, 0x1f, 0x6a, 0x70, 0x41, 0xa9, 0x7d, 0x0e, 0xbb, 0x83, 0x95, 0xdc, 0x1d, - 0x5e, 0x1f, 0xf1, 0xfb, 0x72, 0x36, 0x07, 0x2f, 0xf1, 0x59, 0x4c, 0x70, 0xbf, 0x08, 0xb0, 0xc9, - 0xc4, 0xc9, 0x7a, 0xac, 0x27, 0xc9, 0x29, 0xaf, 0x49, 0x08, 0x56, 0x6a, 0x25, 0x64, 0x56, 0xe9, - 0x48, 0x99, 0xf5, 0xbd, 0x12, 0x2c, 0x0c, 0x0c, 0xfb, 0xa0, 0x1c, 0xd1, 0xde, 0x27, 0x39, 0x52, - 0x7a, 0x3f, 0xe4, 0xc8, 0x58, 0x11, 0x39, 0xa2, 0xff, 0x81, 0x06, 0x63, 0x75, 0xdc, 0x44, 0x1f, - 0x4b, 0x68, 0xb4, 0x8f, 0xab, 0x1a, 0xed, 0xc3, 0x83, 0xea, 0x54, 0x1d, 0x37, 0x15, 0xe5, 0xf6, - 0x6f, 0x6b, 0xb0, 0x60, 0x7a, 0x6e, 0x68, 0x50, 0xd6, 0xc4, 0x5c, 0xec, 0x47, 0x2c, 0x56, 0x48, - 0x99, 0xab, 0xa7, 0x90, 0xd5, 0x9e, 0x10, 0x1d, 0x58, 0x48, 0x43, 0x02, 0x3c, 0x48, 0x59, 0xdf, - 0x80, 0xe9, 0xba, 0xe3, 0xf5, 0xad, 0xa6, 0xbb, 0xe5, 0x9d, 0xa2, 0x46, 0xf2, 0x23, 0x0d, 0x66, - 0x18, 0xde, 0x96, 0xef, 0x6d, 0xd9, 0x0e, 0x79, 0x34, 0x14, 0x63, 0xb5, 0xc7, 0x79, 0x82, 0x8f, - 0x29, 0xaa, 0x6a, 0xc5, 0x47, 0x44, 0x51, 0x55, 0xbb, 0x9c, 0x23, 0x8b, 0xbe, 0x31, 0x95, 0xfc, - 0x32, 0x26, 0x8d, 0x9e, 0x83, 0xb2, 0x69, 0xd4, 0xfa, 0xae, 0xe5, 0x48, 0xbe, 0xa0, 0xbd, 0xac, - 0xaf, 0xf0, 0x32, 0x2c, 0xa1, 0xe8, 0x01, 0x40, 0xec, 0x3c, 0x10, 0xd3, 0x70, 0x7d, 0x34, 0x87, - 0x45, 0x9b, 0x84, 0xd4, 0xe6, 0x0e, 0xe2, 0xa9, 0x8f, 0x61, 0x58, 0xa1, 0x86, 0xfe, 0x0a, 0xcc, - 0x8a, 0x41, 0x6e, 0x76, 0x8d, 0x8e, 0xb0, 0xe9, 0x0a, 0x8e, 0xd4, 0x9a, 0x82, 0xa8, 0x76, 0x59, - 0x10, 0x9e, 0x55, 0x4b, 0x03, 0x9c, 0xa4, 0x86, 0xf6, 0x61, 0xa6, 0xab, 0xda, 0xa9, 0xe3, 0xc5, - 0xb7, 0x0c, 0xc5, 0x66, 0xad, 0x5d, 0x12, 0xc4, 0x67, 0x12, 0x16, 0x6e, 0x82, 0x54, 0x86, 0xba, - 0x3d, 0x71, 0x56, 0xea, 0x36, 0x81, 0x29, 0xbe, 0xbc, 0x83, 0xc5, 0x49, 0xf6, 0x81, 0xaf, 0x14, - 0xf9, 0x40, 0x2e, 0x29, 0x62, 0x6f, 0x18, 0xff, 0x1d, 0xe0, 0x08, 0x37, 0xda, 0x85, 0x19, 0xba, - 0x5b, 0xb5, 0x89, 0x43, 0xcc, 0xd0, 0xf3, 0x17, 0xa7, 0x8a, 0x7b, 0x9b, 0xda, 0x0a, 0x1e, 0xee, - 0xae, 0x50, 0x4b, 0x70, 0x82, 0x8e, 0x94, 0x7e, 0xe5, 0x5c, 0xe9, 0xd7, 0x87, 0xca, 0xae, 0xe2, - 0x37, 0x98, 0x66, 0x83, 0xf0, 0xb9, 0x22, 0x1d, 0x8b, 0x9d, 0x08, 0xb5, 0x8b, 0x82, 0x50, 0x45, - 0x75, 0x38, 0xa8, 0x74, 0xf4, 0x5f, 0x9c, 0x84, 0x85, 0xba, 0xd3, 0x0f, 0x42, 0xe2, 0xaf, 0x08, - 0x77, 0x2e, 0xf1, 0xd1, 0xd7, 0x34, 0xb8, 0xc2, 0xfe, 0x6d, 0x78, 0xf7, 0xdd, 0x06, 0x71, 0x8c, - 0xfd, 0x95, 0x2d, 0x5a, 0xc3, 0xb2, 0x4e, 0x26, 0x81, 0x1a, 0x7d, 0xb1, 0x53, 0x33, 0x07, 0x48, - 0x3b, 0x13, 0x23, 0xce, 0xa1, 0x84, 0xfe, 0x96, 0x06, 0x4f, 0x64, 0x80, 0x1a, 0xc4, 0x21, 0x21, - 0x11, 0x32, 0xe0, 0xa4, 0xfd, 0x78, 0xfa, 0xf0, 0xa0, 0xfa, 0x44, 0x3b, 0x0f, 0x29, 0xce, 0xa7, - 0x87, 0x7e, 0x59, 0x83, 0xa5, 0x0c, 0xe8, 0x75, 0xc3, 0x76, 0xfa, 0x3e, 0x11, 0x8a, 0xea, 0x49, - 0xbb, 0x73, 0xf5, 0xf0, 0xa0, 0xba, 0xd4, 0xce, 0xc5, 0x8a, 0x8f, 0xa0, 0x88, 0xbe, 0x02, 0x97, - 0x25, 0x74, 0xc3, 0x75, 0x09, 0xb1, 0x88, 0x75, 0xd7, 0x16, 0x76, 0xe5, 0xc9, 0xbb, 0xf2, 0xc4, - 0xe1, 0x41, 0xf5, 0x72, 0x3b, 0x0b, 0x21, 0xce, 0xa6, 0x83, 0x3a, 0xf0, 0x74, 0x0c, 0x08, 0x6d, - 0xc7, 0x7e, 0xc0, 0x30, 0xdd, 0xdd, 0xf6, 0x49, 0xb0, 0xed, 0x39, 0x16, 0x13, 0x16, 0x5a, 0xed, - 0x43, 0x87, 0x07, 0xd5, 0xa7, 0xdb, 0x47, 0x55, 0xc4, 0x47, 0xe3, 0x41, 0x16, 0xcc, 0x04, 0xa6, - 0xe1, 0x36, 0xdd, 0x90, 0xf8, 0xbb, 0x86, 0xb3, 0x38, 0x59, 0xe8, 0x03, 0xf9, 0x12, 0x55, 0xf0, - 0xe0, 0x04, 0x56, 0xfd, 0x7f, 0x69, 0x50, 0x11, 0x2b, 0x81, 0x29, 0x2c, 0x9b, 0x30, 0x61, 0xd2, - 0x0d, 0x4b, 0x70, 0xfc, 0x6b, 0x85, 0x37, 0x46, 0x8a, 0x2d, 0xde, 0x15, 0x59, 0x11, 0xe6, 0xa8, - 0xd1, 0x6e, 0xc6, 0xb6, 0x56, 0x1b, 0x6d, 0x5b, 0x63, 0xd4, 0x8e, 0xd9, 0xd2, 0xf4, 0x83, 0x31, - 0x98, 0xae, 0x7b, 0xae, 0x65, 0x33, 0x25, 0xf9, 0x85, 0x84, 0x6a, 0xf6, 0xb4, 0x2a, 0x9c, 0x1e, - 0x1e, 0x54, 0x67, 0x65, 0x45, 0x45, 0x5a, 0xbd, 0x2c, 0x2d, 0x34, 0xae, 0xab, 0x7d, 0x28, 0x69, - 0x5a, 0x3d, 0x3c, 0xa8, 0x5e, 0x90, 0xcd, 0x92, 0xd6, 0x16, 0xda, 0x05, 0x44, 0x75, 0xe6, 0xbb, - 0xbe, 0xe1, 0x06, 0x1c, 0x2d, 0x65, 0x5a, 0xbe, 0x7e, 0xfe, 0xc2, 0x70, 0x73, 0x4a, 0x5b, 0xc4, - 0x2a, 0xf5, 0xed, 0x01, 0x6c, 0x38, 0x83, 0x02, 0x7a, 0x17, 0xe6, 0x68, 0xe9, 0x46, 0xcf, 0x32, - 0x42, 0xa2, 0x2c, 0x94, 0x93, 0xd0, 0xbc, 0x22, 0x68, 0xce, 0xdd, 0x4e, 0x60, 0xc2, 0x29, 0xcc, - 0x5c, 0x95, 0x35, 0x02, 0xcf, 0x65, 0x6b, 0x20, 0xa1, 0xca, 0xd2, 0x52, 0x2c, 0xa0, 0xe8, 0x79, - 0x98, 0xea, 0x92, 0x20, 0x30, 0x3a, 0x84, 0x31, 0xf5, 0x74, 0xbc, 0x73, 0xad, 0xf1, 0x62, 0x1c, - 0xc1, 0xd1, 0xc7, 0x61, 0xc2, 0xf4, 0x2c, 0x12, 0x2c, 0x4e, 0x31, 0x8f, 0xf2, 0x15, 0xc6, 0x4b, - 0xb4, 0xe0, 0xe1, 0x41, 0x75, 0x9a, 0x19, 0x20, 0xf4, 0x17, 0xe6, 0x95, 0xf4, 0xdf, 0xa0, 0x8a, - 0x64, 0x4a, 0x21, 0x1f, 0x42, 0x05, 0x3f, 0x3f, 0xff, 0x9a, 0xfe, 0x83, 0x12, 0x5c, 0xa2, 0x3d, - 0xf4, 0x3d, 0xc7, 0xa1, 0x42, 0xb6, 0xe7, 0x78, 0xfb, 0x5d, 0xe2, 0x86, 0x1f, 0xa8, 0x5e, 0xa2, - 0x37, 0x60, 0xb2, 0xc7, 0xcf, 0x4f, 0xc6, 0x58, 0x77, 0x9e, 0xa3, 0x93, 0xc8, 0x4f, 0x37, 0x1e, - 0x1e, 0x54, 0x97, 0xb2, 0x3e, 0x40, 0x9c, 0x8b, 0x88, 0x76, 0xc8, 0x4e, 0x69, 0x1c, 0x9c, 0xe9, - 0x3e, 0x39, 0xa4, 0x06, 0x6f, 0x6c, 0x12, 0x67, 0x58, 0x25, 0x43, 0xff, 0x69, 0x09, 0xae, 0xc4, - 0x3d, 0x6a, 0xba, 0x41, 0x68, 0x38, 0x0e, 0xb7, 0x83, 0xcf, 0xde, 0x44, 0xea, 0x25, 0x4c, 0xa4, - 0xf5, 0xa2, 0xe6, 0xe6, 0x60, 0xdf, 0x73, 0xbd, 0x44, 0x7b, 0x29, 0x2f, 0x51, 0xeb, 0x14, 0x69, - 0x1e, 0xed, 0x30, 0xfa, 0xdf, 0x1a, 0x2c, 0x65, 0x37, 0x3c, 0x07, 0x83, 0xcd, 0x4b, 0x1a, 0x6c, - 0x9f, 0x3f, 0xbd, 0xaf, 0xce, 0x31, 0xdd, 0xfe, 0x53, 0xee, 0xd7, 0x32, 0x23, 0x6e, 0x0b, 0x2e, - 0x50, 0xed, 0x3a, 0x08, 0x85, 0x3b, 0xe3, 0x64, 0xe7, 0x7c, 0x91, 0x4b, 0xe3, 0x02, 0x4e, 0xe2, - 0xc0, 0x69, 0xa4, 0x68, 0x1d, 0xa6, 0x28, 0xb7, 0x53, 0xfc, 0xa5, 0xe1, 0xf1, 0x4b, 0x81, 0xda, - 0xe6, 0x6d, 0x71, 0x84, 0x44, 0xff, 0x73, 0x0d, 0x9e, 0x3a, 0x6a, 0xf6, 0xd1, 0x7b, 0x00, 0x66, - 0xb4, 0x87, 0xf1, 0x83, 0xd8, 0xa2, 0x5a, 0x40, 0x84, 0x25, 0x5e, 0x42, 0xb2, 0x28, 0xc0, 0x0a, - 0x91, 0x0c, 0xef, 0x7e, 0xe9, 0x8c, 0xbc, 0xfb, 0xfa, 0xff, 0xd1, 0x54, 0x61, 0xa1, 0x8e, 0xfe, - 0xa3, 0x26, 0x2c, 0xd4, 0xbe, 0xe7, 0x7a, 0x56, 0x92, 0x4b, 0x56, 0x6d, 0xf2, 0xc8, 0x2d, 0x59, - 0xb5, 0xf3, 0x39, 0x4b, 0xf6, 0xef, 0x94, 0xf2, 0xbe, 0x96, 0x2d, 0xd9, 0xfb, 0x30, 0x1d, 0xc5, - 0xcd, 0x44, 0x8c, 0x7d, 0x7d, 0xd4, 0x3e, 0x71, 0x74, 0xf1, 0xf1, 0x57, 0x54, 0x12, 0xe0, 0x98, - 0x16, 0xda, 0x03, 0xb0, 0xe4, 0x46, 0x29, 0x66, 0xff, 0xe6, 0x68, 0x94, 0xe3, 0x8d, 0xb7, 0x36, - 0x47, 0xf9, 0x2d, 0xfe, 0x8d, 0x15, 0x5a, 0xfa, 0xef, 0x96, 0x00, 0x0d, 0x76, 0x97, 0x2a, 0x1b, - 0x3b, 0xb6, 0x6b, 0xa5, 0x95, 0x8d, 0x5b, 0xb6, 0x6b, 0x61, 0x06, 0x91, 0xea, 0x48, 0x29, 0x57, - 0x1d, 0x79, 0x0d, 0x2e, 0x74, 0x1c, 0x6f, 0xd3, 0x70, 0x9c, 0x7d, 0x11, 0x7d, 0xc3, 0x36, 0xa4, - 0x72, 0xed, 0x22, 0x95, 0x6b, 0x37, 0x92, 0x20, 0x9c, 0xae, 0x8b, 0x7a, 0x30, 0xef, 0x13, 0xd3, - 0x73, 0x4d, 0xdb, 0x61, 0xca, 0xa3, 0xd7, 0x0f, 0x0b, 0x9a, 0x70, 0x97, 0x0e, 0x0f, 0xaa, 0xf3, - 0x38, 0x85, 0x0b, 0x0f, 0x60, 0x47, 0xcf, 0xc2, 0x54, 0xcf, 0xb7, 0xbb, 0x86, 0xbf, 0xcf, 0xd4, - 0xd3, 0x72, 0xad, 0x42, 0x05, 0x64, 0x8b, 0x17, 0xe1, 0x08, 0xa6, 0x7f, 0x4b, 0x83, 0xb1, 0xc6, - 0x7a, 0x1b, 0xe9, 0x30, 0x69, 0x79, 0x5d, 0xc3, 0x76, 0xc5, 0x28, 0xb1, 0x20, 0x96, 0x06, 0x2b, - 0xc1, 0x02, 0x82, 0x7a, 0x30, 0x1d, 0xc9, 0x97, 0x91, 0x0e, 0x35, 0x1a, 0xeb, 0x6d, 0x79, 0x10, - 0x2c, 0x59, 0x29, 0x2a, 0x09, 0x70, 0x4c, 0x44, 0x37, 0x60, 0xa1, 0xb1, 0xde, 0x6e, 0xba, 0xa6, - 0xd3, 0xb7, 0xc8, 0xea, 0x1e, 0xfb, 0x43, 0xbf, 0xcc, 0xe6, 0x25, 0x22, 0x70, 0x86, 0x7d, 0x99, - 0xa8, 0x84, 0x23, 0x18, 0xad, 0x46, 0x78, 0x0b, 0x11, 0xf5, 0xc1, 0xaa, 0x09, 0x24, 0x38, 0x82, - 0xe9, 0x3f, 0x2a, 0x41, 0x45, 0xe9, 0x10, 0x72, 0x60, 0x8a, 0x7f, 0x6e, 0x74, 0xe8, 0xba, 0x5a, - 0xf0, 0x13, 0x93, 0xbd, 0xe6, 0xd4, 0xf9, 0x80, 0x06, 0x38, 0x22, 0xa1, 0xce, 0x52, 0x29, 0x7f, - 0x96, 0xd0, 0x32, 0x00, 0x3f, 0x5e, 0x66, 0xe7, 0x33, 0x5c, 0x4b, 0x65, 0x0b, 0xa1, 0x2d, 0x4b, - 0xb1, 0x52, 0x03, 0x3d, 0x25, 0xf8, 0x99, 0x9f, 0x3e, 0x97, 0x53, 0xbc, 0xbc, 0x05, 0x13, 0x0f, - 0x3c, 0x97, 0x04, 0xc2, 0xd1, 0x77, 0x4a, 0x1f, 0x38, 0x4d, 0x05, 0xd4, 0xdb, 0x14, 0x2f, 0xe6, - 0xe8, 0xf5, 0xdf, 0xd4, 0x00, 0x1a, 0x46, 0x68, 0x70, 0xbf, 0xd4, 0x10, 0x81, 0x3b, 0x4f, 0x25, - 0x96, 0x61, 0x79, 0xe0, 0xe8, 0x60, 0x3c, 0xb0, 0x1f, 0x44, 0x9f, 0x2f, 0xf7, 0x1e, 0x8e, 0xbd, - 0x6d, 0x3f, 0x20, 0x98, 0xc1, 0xd1, 0xc7, 0x60, 0x9a, 0xb8, 0xa6, 0xbf, 0xdf, 0x0b, 0x89, 0xc5, - 0x46, 0xa0, 0xcc, 0xcf, 0x73, 0x56, 0xa3, 0x42, 0x1c, 0xc3, 0xf5, 0x5d, 0x28, 0xaf, 0xba, 0x56, - 0xcf, 0xb3, 0xb9, 0x51, 0x72, 0x4c, 0x07, 0x9f, 0x86, 0xb1, 0xbe, 0xef, 0x88, 0xfe, 0x55, 0x44, - 0x85, 0xb1, 0x0d, 0x7c, 0x1b, 0xd3, 0x72, 0x6a, 0xe9, 0xf5, 0xfa, 0x7e, 0xcf, 0x0b, 0xa2, 0x4e, - 0x4a, 0xc5, 0xa4, 0xc5, 0x8b, 0x71, 0x04, 0xd7, 0x1f, 0x6a, 0x30, 0xbf, 0xba, 0xd7, 0xb3, 0x7d, - 0x16, 0x11, 0x44, 0x7c, 0xba, 0xa5, 0xd3, 0xf6, 0xbb, 0xfc, 0x5f, 0xd1, 0x07, 0xd9, 0x5e, 0xd4, - 0xc0, 0x11, 0x1c, 0x6d, 0xc1, 0x1c, 0x61, 0xcd, 0xa9, 0x50, 0x68, 0x18, 0xd2, 0x57, 0x76, 0x12, - 0x43, 0x97, 0x07, 0x9c, 0x25, 0xb0, 0xe0, 0x14, 0x56, 0xd4, 0x86, 0x39, 0xd3, 0x31, 0x82, 0xc0, - 0xde, 0xb2, 0xcd, 0xf8, 0xac, 0x6b, 0xba, 0xf6, 0x31, 0xda, 0xb6, 0x9e, 0x80, 0x3c, 0x3c, 0xa8, - 0x5e, 0x16, 0xfd, 0x4c, 0x02, 0x70, 0x0a, 0x85, 0xfe, 0x07, 0x1a, 0x4c, 0x4b, 0x45, 0xe6, 0x83, - 0x65, 0x0b, 0x3e, 0x07, 0x65, 0xcb, 0x0e, 0x54, 0x01, 0xcf, 0x4e, 0x2b, 0x1a, 0xa2, 0x0c, 0x4b, - 0xa8, 0x1e, 0x40, 0xf9, 0x86, 0x58, 0x23, 0x68, 0x09, 0x4a, 0x76, 0xb4, 0xbf, 0x80, 0xf8, 0x80, - 0x52, 0xb3, 0x81, 0x4b, 0xb6, 0x25, 0xb9, 0xaa, 0x94, 0xcb, 0x55, 0xca, 0xb4, 0x8f, 0x1d, 0x3d, - 0xed, 0xfa, 0x77, 0x34, 0xa8, 0xdc, 0xb4, 0x37, 0x89, 0xef, 0x72, 0x2d, 0xee, 0xd9, 0x74, 0x8c, - 0x68, 0x25, 0x2b, 0x3e, 0x14, 0xed, 0xc1, 0x74, 0x60, 0x6e, 0x13, 0xab, 0xef, 0xc8, 0xb3, 0xc2, - 0x42, 0x91, 0xa0, 0x0a, 0xe9, 0xb6, 0xc0, 0xa7, 0xc4, 0xc2, 0x44, 0x14, 0x70, 0x4c, 0x4c, 0xff, - 0x32, 0x5c, 0xcc, 0x68, 0x84, 0xaa, 0x30, 0x11, 0x84, 0x86, 0x1f, 0x8a, 0x31, 0x63, 0xb2, 0xa3, - 0x4d, 0x0b, 0x30, 0x2f, 0x47, 0x4f, 0xc0, 0x18, 0x71, 0x2d, 0x31, 0x68, 0x53, 0x74, 0x95, 0xad, - 0xba, 0x16, 0xa6, 0x65, 0x74, 0x8a, 0x1c, 0x2f, 0xc1, 0x8c, 0x6c, 0x8a, 0x6e, 0x8b, 0x32, 0x2c, - 0xa1, 0xfa, 0x2f, 0x4d, 0xc2, 0xd3, 0x37, 0x3d, 0xdf, 0x7e, 0xe0, 0xb9, 0xa1, 0xe1, 0xb4, 0x3c, - 0x2b, 0xf6, 0x7e, 0x8b, 0xe9, 0xfe, 0xba, 0x06, 0x8f, 0x9b, 0xbd, 0x7e, 0xd3, 0xb5, 0x43, 0xdb, - 0x88, 0x9c, 0x92, 0x2d, 0xe2, 0xdb, 0x5e, 0x51, 0x27, 0x38, 0x8b, 0x2d, 0xac, 0xb7, 0x36, 0xb2, - 0x50, 0xe2, 0x3c, 0x5a, 0xe8, 0x5d, 0x98, 0xb3, 0xbc, 0xfb, 0x2e, 0x77, 0x91, 0x12, 0xc7, 0xd8, - 0x2f, 0xe8, 0xfa, 0x66, 0x2c, 0xde, 0x48, 0x60, 0xc2, 0x29, 0xcc, 0xcc, 0xef, 0x2f, 0x8b, 0xda, - 0x21, 0x8b, 0xad, 0x7c, 0x10, 0x0f, 0x67, 0x41, 0xbf, 0x7f, 0x23, 0x13, 0x23, 0xce, 0xa1, 0x84, - 0xbe, 0x02, 0x97, 0x6d, 0x3e, 0x10, 0x98, 0x18, 0x96, 0xed, 0x92, 0x20, 0xe0, 0xdf, 0x3d, 0x82, - 0x63, 0xbb, 0x99, 0x85, 0x10, 0x67, 0xd3, 0x41, 0xef, 0x00, 0x04, 0xfb, 0xae, 0x29, 0xe6, 0x7a, - 0xa2, 0x10, 0x55, 0xbe, 0x05, 0x4b, 0x2c, 0x58, 0xc1, 0x48, 0x77, 0xa1, 0xd0, 0x73, 0x88, 0x6f, - 0xb8, 0x26, 0xf7, 0xfb, 0x69, 0x7c, 0x17, 0xba, 0x1b, 0x15, 0xe2, 0x18, 0x8e, 0x2c, 0x98, 0xe9, - 0xf7, 0x94, 0xc9, 0x9f, 0x2a, 0xee, 0xfc, 0xde, 0x50, 0xf0, 0xe0, 0x04, 0x56, 0xfd, 0x9f, 0x69, - 0x30, 0x25, 0x22, 0xa3, 0xd1, 0x47, 0x53, 0xfa, 0x9e, 0xf4, 0x82, 0xa4, 0x74, 0xbe, 0x7d, 0x66, - 0x1f, 0x0b, 0x8d, 0x5a, 0x30, 0x65, 0x21, 0x85, 0x41, 0x10, 0x8e, 0xd5, 0xf3, 0x84, 0x9d, 0x1c, - 0xa9, 0xec, 0x0a, 0x31, 0xfd, 0xdb, 0x1a, 0x2c, 0x0c, 0xb4, 0x1a, 0x42, 0x99, 0x3f, 0x47, 0xff, - 0xe6, 0xaf, 0x01, 0xb0, 0x20, 0xf8, 0x95, 0x56, 0xb3, 0x4d, 0xfc, 0x5d, 0x29, 0x56, 0xfe, 0xa6, - 0x06, 0xf3, 0xb1, 0x27, 0x5e, 0xf4, 0x42, 0x2b, 0x1e, 0x57, 0x70, 0x2b, 0x85, 0xab, 0xb6, 0x28, - 0xbe, 0x7b, 0x3e, 0x0d, 0xc1, 0x03, 0x74, 0xd1, 0xdf, 0xd0, 0x60, 0xde, 0x48, 0x06, 0xc1, 0x47, - 0x9b, 0x40, 0xa1, 0xe0, 0xae, 0x54, 0x40, 0x7d, 0xdc, 0x97, 0x14, 0x20, 0xc0, 0x03, 0x64, 0xd1, - 0xa7, 0x60, 0xc6, 0xe8, 0xd9, 0x2b, 0x7d, 0xcb, 0x26, 0xae, 0x29, 0x23, 0xa7, 0x19, 0xe3, 0xae, - 0xb4, 0x9a, 0xb2, 0x1c, 0x27, 0x6a, 0xc9, 0x28, 0x77, 0x31, 0x90, 0xe3, 0x23, 0x46, 0xb9, 0x8b, - 0x31, 0x8c, 0xa3, 0xdc, 0xc5, 0xd0, 0xa9, 0x44, 0xd0, 0xcf, 0xc1, 0x13, 0x7c, 0xf7, 0xac, 0x19, - 0x81, 0x6d, 0xae, 0xf4, 0xc3, 0x6d, 0xe2, 0x86, 0x91, 0x0e, 0xc4, 0x2d, 0x2a, 0x76, 0xce, 0xb8, - 0x9a, 0x57, 0x09, 0xe7, 0xb7, 0x47, 0x2e, 0x80, 0x67, 0x5b, 0xa6, 0xf8, 0x1e, 0x7e, 0xd4, 0x55, - 0xe8, 0x18, 0xf8, 0x4e, 0xb3, 0x51, 0x17, 0x9f, 0xc3, 0x84, 0x51, 0xfc, 0x1b, 0x2b, 0x14, 0xd0, - 0x37, 0x35, 0x98, 0x15, 0x4c, 0x2e, 0x68, 0x4e, 0xb1, 0xf9, 0x7f, 0xbb, 0x28, 0x33, 0xa6, 0x18, - 0x7e, 0x19, 0xab, 0xc8, 0x79, 0xb8, 0x9a, 0x0c, 0x7c, 0x48, 0xc0, 0x70, 0xb2, 0x1f, 0xe8, 0xef, - 0x69, 0x70, 0x29, 0x20, 0xfe, 0xae, 0x6d, 0x92, 0x15, 0xd3, 0xf4, 0xfa, 0x6e, 0x34, 0xc9, 0xe5, - 0xe2, 0x7e, 0x83, 0x76, 0x06, 0xbe, 0xda, 0xe2, 0xe1, 0x41, 0xf5, 0x52, 0x16, 0x04, 0x67, 0xd2, - 0xa7, 0xbb, 0xe4, 0x85, 0xfb, 0x46, 0x68, 0x6e, 0xd7, 0x0d, 0x73, 0x9b, 0x99, 0x17, 0xc1, 0xe2, - 0x74, 0xf1, 0x88, 0xc8, 0xb7, 0x92, 0xa8, 0xb8, 0xdb, 0x20, 0x55, 0x88, 0xd3, 0x04, 0x51, 0x00, - 0x65, 0x9f, 0xbc, 0xd7, 0x27, 0x41, 0x18, 0x2c, 0x02, 0x23, 0xde, 0x1c, 0x79, 0xc6, 0xb0, 0x40, - 0xc8, 0xb5, 0xa6, 0xe8, 0x17, 0x96, 0x84, 0x96, 0xde, 0x00, 0x34, 0x38, 0x9d, 0x68, 0x1e, 0xc6, - 0x76, 0x08, 0xbf, 0x61, 0x32, 0x8d, 0xe9, 0xbf, 0xe8, 0x12, 0x4c, 0xec, 0x1a, 0x4e, 0x9f, 0x6b, - 0xb6, 0x65, 0xcc, 0x7f, 0xbc, 0x52, 0xfa, 0x8c, 0xa6, 0xff, 0x9e, 0x06, 0x97, 0x33, 0x69, 0x22, - 0x0c, 0x57, 0xba, 0xc6, 0xde, 0xba, 0xe7, 0xae, 0xf5, 0x43, 0x23, 0xb4, 0xdd, 0x4e, 0xd3, 0xdd, - 0x72, 0xec, 0xce, 0x36, 0x57, 0x04, 0x27, 0xb8, 0x2a, 0xb1, 0x96, 0x59, 0x03, 0xe7, 0xb4, 0x44, - 0x4d, 0xb8, 0xd8, 0x35, 0xf6, 0x06, 0x10, 0x96, 0x18, 0x42, 0x76, 0x4f, 0x69, 0x6d, 0x10, 0x8c, - 0xb3, 0xda, 0xe8, 0xdf, 0x18, 0x87, 0x27, 0x69, 0xc7, 0xe3, 0xfd, 0x66, 0xcd, 0x70, 0x8d, 0xce, - 0x07, 0x53, 0xae, 0x7f, 0x47, 0x83, 0xc7, 0xb7, 0xb3, 0xb5, 0x5b, 0xb1, 0xe3, 0xbd, 0x59, 0x48, - 0xc7, 0x3f, 0x4a, 0x61, 0xe6, 0x07, 0xfd, 0x47, 0x56, 0xc1, 0x79, 0x9d, 0x42, 0x6f, 0xc0, 0xbc, - 0xeb, 0x59, 0xa4, 0xde, 0x6c, 0xe0, 0x35, 0x23, 0xd8, 0x69, 0x47, 0xc6, 0xfc, 0x04, 0x77, 0x6a, - 0xad, 0xa7, 0x60, 0x78, 0xa0, 0x36, 0xda, 0x05, 0xd4, 0xf3, 0xac, 0xd5, 0x5d, 0xdb, 0x8c, 0x4e, - 0x7c, 0x8b, 0x3b, 0xd2, 0x58, 0x10, 0x76, 0x6b, 0x00, 0x1b, 0xce, 0xa0, 0xa0, 0xff, 0x91, 0x06, - 0x17, 0xe8, 0x8c, 0xb4, 0x7c, 0x6f, 0x6f, 0xff, 0x83, 0xc8, 0x0b, 0xcf, 0xc3, 0x78, 0xd7, 0xb3, - 0x22, 0x23, 0xf3, 0x32, 0xd5, 0x88, 0xd6, 0x3c, 0x8b, 0x3c, 0xe4, 0x8e, 0xb5, 0xbd, 0x7d, 0xfa, - 0x03, 0xb3, 0x2a, 0xfa, 0x7f, 0xd5, 0xb8, 0xce, 0x12, 0xd9, 0x62, 0x1f, 0x48, 0xde, 0x7e, 0x09, - 0x66, 0x69, 0xd9, 0x9a, 0xb1, 0xd7, 0x6a, 0xdc, 0xf3, 0x9c, 0x28, 0x02, 0x81, 0xc5, 0x02, 0xdf, - 0x52, 0x01, 0x38, 0x59, 0x4f, 0xff, 0xe6, 0x2c, 0xb0, 0x0a, 0x0e, 0x09, 0x3f, 0x88, 0xdf, 0xf5, - 0x02, 0x54, 0xcc, 0x5e, 0xbf, 0x7e, 0xbd, 0xfd, 0x66, 0xdf, 0x0b, 0x0d, 0xe1, 0xf3, 0x63, 0x8a, - 0x48, 0xbd, 0xb5, 0x11, 0x15, 0x63, 0xb5, 0x0e, 0x5d, 0x35, 0x66, 0xaf, 0x2f, 0xe4, 0x50, 0x4b, - 0x3d, 0xa7, 0x66, 0xab, 0xa6, 0xde, 0xda, 0x48, 0xc0, 0xf0, 0x40, 0x6d, 0xf4, 0x15, 0x98, 0x21, - 0x82, 0xa1, 0x6f, 0x1a, 0xbe, 0x25, 0xd6, 0x4b, 0xe1, 0x9d, 0x44, 0x0e, 0x6d, 0xb4, 0x4a, 0xb8, - 0xfe, 0xb6, 0xaa, 0x90, 0xc0, 0x09, 0x82, 0x4c, 0x97, 0x12, 0xbf, 0xe9, 0x4c, 0x79, 0xd6, 0x0d, - 0xdf, 0x30, 0x89, 0x62, 0x7a, 0x4d, 0x08, 0x5d, 0x2a, 0xaf, 0x12, 0xce, 0x6f, 0x8f, 0x7e, 0x5b, - 0x83, 0x2b, 0x12, 0x6a, 0xbb, 0x76, 0xb7, 0xdf, 0xc5, 0xc4, 0x74, 0x0c, 0xbb, 0x2b, 0x14, 0xab, - 0xb7, 0x4e, 0xed, 0x43, 0x93, 0xe8, 0xf9, 0x66, 0x95, 0x0d, 0xc3, 0x39, 0x5d, 0x42, 0xdf, 0xd6, - 0xe0, 0x99, 0x08, 0xd4, 0xa2, 0xa6, 0x4d, 0xdf, 0x27, 0x71, 0x0c, 0x8b, 0x18, 0x92, 0x62, 0xe6, - 0xdf, 0x47, 0x0e, 0x0f, 0xaa, 0xcf, 0xac, 0x1e, 0x83, 0x1b, 0x1f, 0x4b, 0x5d, 0x65, 0x97, 0xb6, - 0xb7, 0x15, 0x0a, 0x4d, 0xec, 0xac, 0xd8, 0x85, 0x92, 0xc0, 0x09, 0x82, 0xe8, 0x77, 0x34, 0x78, - 0x5c, 0x2d, 0x50, 0xb9, 0x85, 0xab, 0x60, 0x5f, 0x38, 0xb5, 0xce, 0xa4, 0xf0, 0x73, 0xf7, 0x4d, - 0x0e, 0x10, 0xe7, 0xf5, 0x0a, 0x3d, 0x0b, 0x53, 0x5d, 0xc6, 0x98, 0x5c, 0x4d, 0x9b, 0xe0, 0x6e, - 0x38, 0xce, 0xab, 0x01, 0x8e, 0x60, 0xd4, 0xfa, 0xe9, 0x79, 0x56, 0xcb, 0xb6, 0x82, 0xdb, 0x76, - 0xd7, 0x0e, 0x17, 0x2b, 0xec, 0xda, 0x00, 0x1b, 0x8e, 0x96, 0x67, 0xb5, 0x9a, 0x0d, 0x5e, 0x8e, - 0x13, 0xb5, 0x58, 0x88, 0xa4, 0xdd, 0x35, 0x3a, 0xa4, 0xd5, 0x77, 0x9c, 0x96, 0xef, 0x31, 0x8b, - 0xb8, 0x41, 0x0c, 0xcb, 0xb1, 0x5d, 0xb2, 0x38, 0x53, 0x3c, 0x44, 0xb2, 0x99, 0x87, 0x14, 0xe7, - 0xd3, 0x43, 0xcb, 0x00, 0x5b, 0x86, 0xed, 0xb4, 0xef, 0x1b, 0xbd, 0x3b, 0xee, 0xe2, 0x2c, 0x13, - 0x60, 0xcc, 0xf4, 0xb8, 0x2e, 0x4b, 0xb1, 0x52, 0x83, 0x72, 0x13, 0x95, 0x82, 0x98, 0xf0, 0xeb, - 0x0f, 0x8b, 0x73, 0xa7, 0xc4, 0x4d, 0x11, 0x42, 0x3e, 0x7c, 0xb7, 0x14, 0x12, 0x38, 0x41, 0x10, - 0x7d, 0x5d, 0x83, 0xb9, 0x60, 0x3f, 0x08, 0x49, 0x57, 0xf6, 0xe1, 0xc2, 0x69, 0xf7, 0x81, 0xf9, - 0x0a, 0xda, 0x09, 0x22, 0x38, 0x45, 0x54, 0x3f, 0x28, 0x71, 0xa5, 0x78, 0x80, 0x05, 0xd1, 0x6b, - 0x70, 0xa1, 0x4b, 0xba, 0x9e, 0xbf, 0xbf, 0x12, 0x5d, 0x11, 0x16, 0xde, 0x0d, 0x66, 0x24, 0xac, - 0x25, 0x41, 0x38, 0x5d, 0x97, 0x6e, 0x10, 0x6c, 0xba, 0xae, 0xb7, 0xe3, 0xf6, 0xa5, 0x78, 0x83, - 0x68, 0xa6, 0x60, 0x78, 0xa0, 0x36, 0xaa, 0xc3, 0x82, 0x28, 0x6b, 0x52, 0x95, 0x2b, 0xb8, 0xee, - 0x93, 0xe8, 0x04, 0x83, 0xaa, 0x12, 0x0b, 0xcd, 0x34, 0x10, 0x0f, 0xd6, 0xa7, 0x5f, 0x41, 0x7f, - 0xa8, 0xbd, 0x18, 0x8f, 0xbf, 0x62, 0x3d, 0x09, 0xc2, 0xe9, 0xba, 0x91, 0x72, 0x98, 0xe8, 0xc2, - 0x44, 0xfc, 0x15, 0xeb, 0x29, 0x18, 0x1e, 0xa8, 0xad, 0xff, 0xb7, 0x71, 0xf8, 0xf0, 0x10, 0x62, - 0x1b, 0x75, 0xb3, 0x87, 0xfb, 0x98, 0x45, 0xb4, 0x1c, 0x1d, 0x70, 0x2f, 0xbf, 0xd9, 0x37, 0xdc, - 0xd0, 0x0e, 0xf7, 0x87, 0x9c, 0x9e, 0x5e, 0xce, 0xf4, 0x9c, 0x9c, 0xde, 0xb0, 0xd3, 0x19, 0xe4, - 0x4d, 0xe7, 0xc9, 0x49, 0x0e, 0x3f, 0xfd, 0xdd, 0xec, 0xe9, 0x2f, 0x38, 0xaa, 0xc7, 0xb2, 0x4b, - 0x2f, 0x87, 0x5d, 0x0a, 0x8e, 0xea, 0x10, 0xec, 0xf5, 0xa7, 0xe3, 0xf0, 0x91, 0x61, 0xb6, 0x90, - 0x82, 0xfc, 0x95, 0x21, 0xa4, 0xcf, 0x94, 0xbf, 0xf2, 0x42, 0x0b, 0xce, 0x90, 0xbf, 0x32, 0x48, - 0x9e, 0x35, 0x7f, 0xe5, 0x8d, 0xea, 0x59, 0xf1, 0x57, 0xde, 0xa8, 0x0e, 0xc1, 0x5f, 0x7f, 0x96, - 0xde, 0x1f, 0xe4, 0x0e, 0xd6, 0x84, 0x31, 0xb3, 0xd7, 0x2f, 0x28, 0xa4, 0xd8, 0xd9, 0x59, 0xbd, - 0xb5, 0x81, 0x29, 0x0e, 0x84, 0x61, 0x92, 0xf3, 0x4f, 0x41, 0x11, 0xc4, 0xc2, 0x42, 0x38, 0x4b, - 0x62, 0x81, 0x89, 0x0e, 0x15, 0xe9, 0x6d, 0x93, 0x2e, 0xf1, 0x0d, 0xa7, 0x1d, 0x7a, 0xbe, 0xd1, - 0x29, 0x2a, 0x6d, 0xd8, 0x50, 0xad, 0xa6, 0x70, 0xe1, 0x01, 0xec, 0x74, 0x40, 0x7a, 0xb6, 0x55, - 0x50, 0xbe, 0xb0, 0x01, 0x69, 0x35, 0x1b, 0x98, 0xe2, 0xd0, 0xff, 0xb0, 0x0c, 0x4a, 0xfc, 0x3c, - 0xb5, 0x54, 0x0c, 0xc7, 0xf1, 0xee, 0xb7, 0x7c, 0x7b, 0xd7, 0x76, 0x48, 0x87, 0x58, 0x32, 0xc0, - 0x3a, 0x10, 0x27, 0xac, 0x4c, 0x75, 0x5a, 0xc9, 0xab, 0x84, 0xf3, 0xdb, 0x53, 0x4b, 0x74, 0xc1, - 0x4c, 0x5f, 0xc3, 0x19, 0xe5, 0x4c, 0x65, 0xe0, 0x4e, 0x0f, 0x5f, 0x4f, 0x03, 0xc5, 0x78, 0x90, - 0x2c, 0xfa, 0xaa, 0xc6, 0x4d, 0x6c, 0xe9, 0xa3, 0x13, 0x73, 0x76, 0xe3, 0x94, 0x5c, 0xc2, 0xb1, - 0xad, 0x1e, 0x7b, 0x01, 0x93, 0x04, 0xa9, 0x2d, 0x74, 0x79, 0x27, 0xcb, 0xdb, 0x26, 0x66, 0xf6, - 0x4e, 0xd1, 0xae, 0xe4, 0xb8, 0xef, 0xf8, 0x29, 0x61, 0x66, 0x05, 0x9c, 0xdd, 0x11, 0x39, 0x4a, - 0xd2, 0x59, 0x22, 0x84, 0x40, 0xe1, 0x51, 0x4a, 0x79, 0x5d, 0xe2, 0x51, 0x92, 0x00, 0x9c, 0x24, - 0x88, 0x7a, 0x30, 0xbd, 0x13, 0xb9, 0x9e, 0x84, 0x45, 0x5b, 0x2f, 0x4a, 0x5d, 0xf1, 0x5f, 0xf1, - 0xd3, 0x48, 0x59, 0x88, 0x63, 0x22, 0x68, 0x1b, 0xa6, 0x76, 0xb8, 0x20, 0x12, 0x96, 0xe8, 0xca, - 0xc8, 0x9a, 0x32, 0x37, 0x88, 0x44, 0x11, 0x8e, 0xd0, 0xab, 0x91, 0x0f, 0xe5, 0x63, 0x02, 0x5e, - 0x7e, 0x5d, 0x83, 0xcb, 0xbb, 0xc4, 0x0f, 0x6d, 0x33, 0xed, 0xeb, 0x9c, 0x2e, 0xae, 0xcd, 0xdf, - 0xcb, 0x42, 0xc8, 0xd9, 0x24, 0x13, 0x84, 0xb3, 0xbb, 0xa0, 0xff, 0x54, 0x83, 0x01, 0xef, 0x0f, - 0xfa, 0x15, 0x0d, 0x66, 0xb6, 0x88, 0x11, 0xf6, 0x7d, 0x72, 0xc3, 0x08, 0x65, 0x10, 0xe6, 0xbd, - 0xd3, 0x70, 0x3a, 0x2d, 0x5f, 0x57, 0x10, 0xf3, 0xf3, 0x16, 0x79, 0xd7, 0x53, 0x05, 0xe1, 0x44, - 0x0f, 0x96, 0x5e, 0x87, 0x85, 0x81, 0x86, 0x27, 0xf2, 0xec, 0xff, 0x3b, 0xe1, 0x3c, 0x4c, 0x27, - 0xf8, 0x7a, 0x07, 0x26, 0x0c, 0xcb, 0x92, 0xe9, 0x43, 0x5e, 0x2e, 0x76, 0xae, 0x68, 0xa9, 0xb1, - 0xae, 0xec, 0x27, 0xe6, 0x68, 0xd1, 0x75, 0x40, 0x46, 0xe2, 0x08, 0x6d, 0xcd, 0xb3, 0x22, 0x2b, - 0x89, 0x39, 0x72, 0x57, 0x06, 0xa0, 0x38, 0xa3, 0x85, 0xfe, 0x2a, 0xcc, 0x25, 0x6f, 0x51, 0x9d, - 0x20, 0xe6, 0x4a, 0xff, 0xeb, 0x1a, 0xa0, 0xc1, 0xab, 0xc5, 0xc8, 0x87, 0xb2, 0xa8, 0x11, 0x4d, - 0x71, 0x21, 0xbf, 0x62, 0x3a, 0x1a, 0x2c, 0x0e, 0x36, 0x16, 0x05, 0x01, 0x96, 0x74, 0xf4, 0x3f, - 0xd7, 0x20, 0xce, 0x4f, 0x80, 0x3e, 0x0d, 0x15, 0x8b, 0x04, 0xa6, 0x6f, 0xf7, 0xc2, 0xf8, 0x3b, - 0xe4, 0xb5, 0xd0, 0x46, 0x0c, 0xc2, 0x6a, 0x3d, 0xa4, 0xc3, 0x64, 0x68, 0x04, 0x3b, 0xcd, 0x86, - 0x30, 0x17, 0xd9, 0xe6, 0x7e, 0x97, 0x95, 0x60, 0x01, 0x89, 0x6f, 0x24, 0x8d, 0x0d, 0x71, 0x23, - 0x09, 0x6d, 0x9d, 0xc2, 0xf5, 0x2b, 0x74, 0xfc, 0xd5, 0x2b, 0xfd, 0x4f, 0x4a, 0x90, 0x4c, 0x09, - 0x51, 0x74, 0x08, 0x06, 0xef, 0x8b, 0x95, 0xce, 0xec, 0xbe, 0xd8, 0xc7, 0x59, 0x3e, 0x25, 0x9e, - 0x00, 0x8f, 0x1f, 0x7b, 0xa8, 0x59, 0x90, 0x78, 0xfa, 0x3a, 0x59, 0x03, 0xbd, 0xcc, 0x22, 0xa4, - 0xc2, 0xc8, 0x88, 0xfe, 0x70, 0xb4, 0x2c, 0xda, 0xb4, 0xf0, 0xa1, 0xb8, 0x11, 0x27, 0xbf, 0x9f, - 0x95, 0x62, 0xde, 0x02, 0x7d, 0x5a, 0x04, 0xd4, 0x4d, 0x24, 0x6e, 0xed, 0x45, 0x57, 0xfd, 0x16, - 0x12, 0x0d, 0xe3, 0x28, 0x3b, 0xfd, 0xef, 0x6a, 0x30, 0x25, 0xee, 0x89, 0x0f, 0x11, 0x93, 0xb7, - 0x05, 0x13, 0x4c, 0x49, 0x1f, 0x45, 0x7f, 0x69, 0x6f, 0x7b, 0x5e, 0x98, 0xb8, 0x2d, 0xcf, 0x02, - 0xc1, 0xd8, 0xbf, 0x98, 0xa3, 0xd7, 0xbf, 0x35, 0x0e, 0xcf, 0x88, 0x2a, 0x03, 0xdb, 0xb3, 0x5c, - 0x82, 0xfb, 0x70, 0x51, 0xcc, 0x52, 0xc3, 0x37, 0x6c, 0x79, 0x30, 0x54, 0xcc, 0xec, 0x12, 0x47, - 0x86, 0x03, 0xe8, 0x70, 0x16, 0x0d, 0xf4, 0xf3, 0x70, 0x49, 0x14, 0xdf, 0x24, 0x86, 0x13, 0x6e, - 0x47, 0xb4, 0x8b, 0x99, 0x60, 0xec, 0x94, 0x7a, 0x2d, 0x03, 0x1f, 0xce, 0xa4, 0xc2, 0x62, 0xb9, - 0x04, 0xa0, 0xee, 0x13, 0x43, 0x3d, 0x15, 0x1b, 0x21, 0x96, 0x6b, 0x2d, 0x13, 0x23, 0xce, 0xa1, - 0xc4, 0xfc, 0x57, 0xc6, 0x1e, 0x33, 0x87, 0x31, 0x09, 0x7d, 0x9b, 0xe5, 0x2f, 0xa0, 0xfc, 0xcd, - 0x0d, 0xd8, 0x24, 0x08, 0xa7, 0xeb, 0xa2, 0x57, 0x60, 0x8e, 0x1d, 0xf4, 0xc5, 0xd7, 0x70, 0x26, - 0xe2, 0x7c, 0x88, 0xeb, 0x09, 0x08, 0x4e, 0xd5, 0xd4, 0x7f, 0x4b, 0x83, 0x19, 0x95, 0x81, 0x86, - 0x88, 0xe1, 0xed, 0x2b, 0xe2, 0x7a, 0x84, 0x50, 0x48, 0x95, 0xea, 0x30, 0x12, 0xfb, 0xa1, 0x06, - 0x17, 0x33, 0xda, 0xb0, 0xe3, 0x29, 0x92, 0x12, 0xfd, 0xa3, 0x1c, 0x4f, 0x0d, 0x6c, 0x23, 0xf2, - 0x78, 0x2a, 0x0d, 0xc1, 0x03, 0x74, 0xd1, 0x3d, 0x18, 0x33, 0x7d, 0x5b, 0x0c, 0xcb, 0x4b, 0x85, - 0x4c, 0x12, 0xdc, 0x8c, 0x03, 0xa3, 0xeb, 0xb8, 0x89, 0x29, 0x42, 0xfd, 0x5f, 0x8d, 0x41, 0x45, - 0x49, 0x41, 0x81, 0xd6, 0x46, 0xb1, 0x68, 0x63, 0xf4, 0x91, 0x55, 0xbb, 0x06, 0x63, 0x9d, 0x5e, - 0xbf, 0xa0, 0x49, 0x2b, 0xd1, 0xdd, 0xa0, 0xe8, 0x3a, 0xbd, 0x3e, 0xba, 0x27, 0x8d, 0xe4, 0x62, - 0x66, 0xac, 0x8c, 0xa5, 0x4b, 0x19, 0xca, 0x11, 0x6f, 0x8e, 0xe7, 0xf2, 0x66, 0x17, 0xa6, 0x02, - 0x61, 0x41, 0x4f, 0x14, 0x4f, 0x7f, 0xa2, 0x8c, 0xb4, 0xb0, 0x98, 0xb9, 0xfa, 0x1d, 0x19, 0xd4, - 0x11, 0x0d, 0xaa, 0x00, 0xf4, 0x59, 0x34, 0x33, 0xb3, 0x2b, 0xca, 0x5c, 0x01, 0xd8, 0x60, 0x25, - 0x58, 0x40, 0xf4, 0x7f, 0xa9, 0x01, 0x1a, 0x44, 0x88, 0x3e, 0x0c, 0x13, 0x2c, 0xa8, 0x5b, 0x2c, - 0x34, 0xe5, 0xe6, 0xbb, 0x11, 0x04, 0x98, 0xc3, 0xd0, 0x5b, 0x22, 0x62, 0xbf, 0xd8, 0xc4, 0xc8, - 0xdd, 0x5b, 0xd0, 0x54, 0x42, 0xfc, 0xa3, 0xed, 0x69, 0x2c, 0x6f, 0x7b, 0xd2, 0xff, 0xb4, 0x44, - 0x39, 0xce, 0x76, 0x43, 0xe2, 0xb2, 0x08, 0xcb, 0x7d, 0x00, 0xa3, 0x1f, 0x7a, 0x7c, 0x3b, 0x16, - 0x8c, 0xd7, 0x2c, 0x36, 0xb8, 0x12, 0xe9, 0x8a, 0x44, 0xc8, 0x4f, 0x40, 0xe2, 0xdf, 0x58, 0x21, - 0x46, 0x49, 0x87, 0x76, 0x97, 0xbc, 0x65, 0xbb, 0x96, 0x77, 0x5f, 0x8c, 0xc5, 0xa8, 0xa4, 0xef, - 0x4a, 0x84, 0x9c, 0x74, 0xfc, 0x1b, 0x2b, 0xc4, 0xd0, 0x17, 0x60, 0x91, 0x25, 0x54, 0x75, 0x59, - 0x2a, 0x1e, 0xd1, 0x37, 0xcf, 0x71, 0xa2, 0xfd, 0xa1, 0x5c, 0x7b, 0xea, 0xf0, 0xa0, 0xba, 0x58, - 0xcf, 0xa9, 0x83, 0x73, 0x5b, 0xeb, 0xbf, 0xa3, 0xc1, 0xe5, 0xcc, 0xa1, 0x40, 0x37, 0x60, 0x21, - 0x3e, 0xf6, 0x56, 0x05, 0x5a, 0x39, 0xce, 0x2c, 0x75, 0x2b, 0x5d, 0x01, 0x0f, 0xb6, 0x41, 0x6b, - 0x72, 0x53, 0x57, 0x05, 0xa6, 0x38, 0x33, 0x7f, 0x52, 0xa0, 0xca, 0x92, 0xa9, 0x38, 0xab, 0x9d, - 0xfe, 0x73, 0x89, 0x0e, 0xc7, 0x03, 0x46, 0x59, 0x79, 0x93, 0x74, 0x64, 0x24, 0xac, 0x64, 0xe5, - 0x1a, 0x2d, 0xc4, 0x1c, 0x86, 0x9e, 0x56, 0xe3, 0xd1, 0xa5, 0xc8, 0x88, 0x62, 0xd2, 0xf5, 0x10, - 0x60, 0xcd, 0x73, 0xed, 0xd0, 0xf3, 0x6d, 0xb7, 0x83, 0xb6, 0xa0, 0x6c, 0x88, 0x6c, 0xbf, 0x82, - 0xd5, 0x3e, 0x5b, 0xc8, 0x20, 0x12, 0x38, 0x78, 0xa4, 0x56, 0xf4, 0x0b, 0x4b, 0xdc, 0xfa, 0x3f, - 0xd5, 0xe0, 0x0a, 0x95, 0x1e, 0x56, 0x74, 0xd5, 0x4d, 0x5e, 0x89, 0x1d, 0x62, 0x1f, 0xec, 0x42, - 0xc5, 0x8f, 0x9b, 0x09, 0xbe, 0xfc, 0x59, 0xf5, 0xba, 0xad, 0x92, 0xfa, 0x9b, 0xea, 0x08, 0x75, - 0xdf, 0x0b, 0xa2, 0xc9, 0x49, 0xdf, 0xc0, 0x95, 0x6b, 0x55, 0xe9, 0x09, 0x56, 0xf1, 0xeb, 0x5f, - 0x2b, 0x01, 0xac, 0x93, 0xf0, 0xbe, 0xe7, 0xef, 0xd0, 0x21, 0xfa, 0x40, 0x5d, 0xfa, 0x78, 0x0a, - 0xc6, 0x7b, 0x9e, 0x15, 0x08, 0x71, 0xc2, 0xee, 0x1d, 0xb1, 0x83, 0x5b, 0x56, 0x8a, 0xaa, 0x30, - 0xc1, 0xbc, 0xb4, 0x42, 0x6e, 0x33, 0x15, 0x95, 0xaa, 0x25, 0x01, 0xe6, 0xe5, 0x3c, 0x77, 0x1e, - 0x0b, 0x21, 0x0c, 0x84, 0xce, 0x2d, 0x72, 0xe7, 0xf1, 0x32, 0x2c, 0xa1, 0xfa, 0xd7, 0xc6, 0x21, - 0x91, 0xae, 0x3a, 0xb6, 0x9b, 0xb5, 0xb3, 0xb1, 0x9b, 0xbf, 0x00, 0x8b, 0x8e, 0x67, 0x58, 0x35, - 0xc3, 0xa1, 0x4c, 0xef, 0xb7, 0xf9, 0x74, 0x18, 0x6e, 0x47, 0xe6, 0x42, 0x66, 0x02, 0xe0, 0x76, - 0x4e, 0x1d, 0x9c, 0xdb, 0x1a, 0x85, 0x32, 0x49, 0x36, 0xcf, 0x94, 0x75, 0x7b, 0xd4, 0x64, 0xde, - 0xcb, 0x6a, 0xf0, 0xa8, 0xdc, 0x42, 0x93, 0x79, 0xb4, 0xd1, 0x2f, 0x68, 0x70, 0x99, 0xec, 0x85, - 0xc4, 0x77, 0x0d, 0xe7, 0xae, 0x6f, 0x6c, 0x6d, 0xd9, 0xa6, 0x08, 0x89, 0xe1, 0x93, 0xd3, 0x3a, - 0x3c, 0xa8, 0x5e, 0x5e, 0xcd, 0xaa, 0xf0, 0xf0, 0xa0, 0xfa, 0xc9, 0xc1, 0x5c, 0xf5, 0x51, 0xac, - 0x68, 0x66, 0x13, 0xc6, 0x8c, 0xd9, 0xe4, 0x96, 0x5e, 0x86, 0xca, 0x09, 0xa2, 0x23, 0xa7, 0x55, - 0x1f, 0xca, 0x3f, 0x98, 0x04, 0x25, 0x4e, 0xf7, 0x04, 0xf9, 0xd1, 0xfe, 0x91, 0x06, 0x97, 0x4c, - 0xc7, 0x26, 0x6e, 0x98, 0x0a, 0x47, 0xe6, 0x0b, 0x63, 0xa3, 0x50, 0x00, 0x71, 0x8f, 0xb8, 0xcd, - 0x46, 0xdd, 0x73, 0x5d, 0x62, 0x86, 0xf5, 0x0c, 0xe4, 0xdc, 0x24, 0xc9, 0x82, 0xe0, 0xcc, 0xce, - 0xb0, 0xef, 0x61, 0xe5, 0xcd, 0x86, 0x7a, 0x3d, 0xa7, 0x2e, 0xca, 0xb0, 0x84, 0xa2, 0x17, 0xa0, - 0xd2, 0xf1, 0xbd, 0x7e, 0x2f, 0xa8, 0xb3, 0x68, 0x1d, 0x3e, 0x83, 0x2c, 0x18, 0xea, 0x46, 0x5c, - 0x8c, 0xd5, 0x3a, 0xe8, 0x53, 0x30, 0xc3, 0x7f, 0xb6, 0x7c, 0xb2, 0x65, 0xef, 0x89, 0xe5, 0xc6, - 0x42, 0x00, 0x6e, 0x28, 0xe5, 0x38, 0x51, 0x0b, 0x7d, 0x0c, 0xa6, 0xed, 0x20, 0xe8, 0x13, 0x7f, - 0x03, 0xdf, 0x16, 0x39, 0x58, 0x98, 0xf7, 0xb3, 0x19, 0x15, 0xe2, 0x18, 0x8e, 0x7e, 0x55, 0x83, - 0x39, 0x9f, 0xbc, 0xd7, 0xb7, 0x7d, 0x62, 0x31, 0xa2, 0x81, 0x08, 0x96, 0xc6, 0xa3, 0x05, 0x68, - 0x2f, 0xe3, 0x04, 0x52, 0xce, 0xe7, 0xd2, 0x77, 0x90, 0x04, 0xe2, 0x54, 0x0f, 0xe8, 0x50, 0x05, - 0x76, 0xc7, 0xb5, 0xdd, 0xce, 0x8a, 0xd3, 0x09, 0x16, 0xcb, 0x6c, 0xe9, 0xb2, 0xa1, 0x6a, 0xc7, - 0xc5, 0x58, 0xad, 0x83, 0x5e, 0x82, 0xd9, 0x7e, 0x40, 0x39, 0xb7, 0x4b, 0xf8, 0xf8, 0x4e, 0xc7, - 0x21, 0x74, 0x1b, 0x2a, 0x00, 0x27, 0xeb, 0x51, 0x7b, 0x2c, 0x2a, 0x10, 0xa3, 0x0c, 0xfc, 0xc6, - 0x25, 0xed, 0xe7, 0x46, 0x02, 0x82, 0x53, 0x35, 0x97, 0x56, 0xe0, 0x62, 0xc6, 0x67, 0x9e, 0x68, - 0x79, 0xfc, 0x56, 0x09, 0x3e, 0x74, 0x2c, 0x57, 0xa2, 0x7f, 0xa8, 0x41, 0x85, 0xec, 0x85, 0xbe, - 0x21, 0x03, 0xfa, 0xe8, 0x14, 0x6d, 0x9d, 0xc9, 0x12, 0x58, 0x5e, 0x8d, 0x09, 0xf1, 0x69, 0x93, - 0xdb, 0x9d, 0x02, 0xc1, 0x6a, 0x7f, 0xa8, 0x6a, 0xcd, 0xef, 0xe3, 0xaa, 0xbe, 0x35, 0x91, 0xd5, - 0x57, 0x40, 0x96, 0x3e, 0x07, 0xf3, 0x69, 0xcc, 0x27, 0x1a, 0xa9, 0x7f, 0x51, 0x82, 0x89, 0x96, - 0x63, 0xb8, 0xe7, 0x91, 0x35, 0xfe, 0x2f, 0x27, 0x92, 0x39, 0x14, 0xca, 0x90, 0xc1, 0xba, 0x9a, - 0x9b, 0xe8, 0xa5, 0x93, 0x4a, 0xf4, 0xf2, 0x7a, 0x71, 0x12, 0x47, 0xe7, 0x75, 0xf9, 0x23, 0x0d, - 0xa6, 0x59, 0xbd, 0x73, 0xc8, 0x09, 0xf1, 0x4e, 0x32, 0x27, 0xc4, 0xcb, 0x85, 0xbf, 0x29, 0x27, - 0x05, 0xc4, 0x0f, 0xa3, 0x6f, 0x61, 0x19, 0x1f, 0xbe, 0xa8, 0x66, 0x33, 0xe7, 0x1f, 0xf3, 0x5c, - 0x56, 0xfa, 0x94, 0xdb, 0x9e, 0x69, 0x38, 0x69, 0x0d, 0xee, 0xe8, 0x94, 0xe6, 0x5d, 0x98, 0x26, - 0xe2, 0x9a, 0x74, 0xf4, 0x31, 0x85, 0x54, 0xda, 0xe8, 0xae, 0x75, 0x4c, 0x2e, 0x2a, 0x09, 0x70, - 0x4c, 0x41, 0xff, 0xb7, 0x25, 0xa8, 0x28, 0x73, 0xf9, 0x7e, 0x64, 0x69, 0xb9, 0x9e, 0x99, 0xe8, - 0xb7, 0xc4, 0x22, 0xf6, 0xae, 0x9c, 0x20, 0x59, 0xb8, 0x0f, 0x15, 0x33, 0x4e, 0x38, 0x37, 0x0a, - 0x73, 0x2b, 0x79, 0xeb, 0x44, 0xc8, 0x70, 0x5c, 0x80, 0x55, 0x22, 0xfa, 0xbf, 0x2e, 0xc1, 0x54, - 0xcb, 0xf7, 0xe8, 0x04, 0x9f, 0x83, 0x68, 0x30, 0x12, 0xa2, 0xa1, 0xd8, 0xba, 0xe5, 0x9d, 0xcd, - 0x15, 0x0e, 0x76, 0x4a, 0x38, 0xac, 0x8c, 0x42, 0xe4, 0x68, 0xf1, 0xf0, 0x1f, 0x35, 0xa8, 0x88, - 0x9a, 0xe7, 0x20, 0x20, 0xbe, 0x94, 0x14, 0x10, 0xaf, 0x8e, 0xf0, 0x5d, 0x39, 0x22, 0xe2, 0xd7, - 0x35, 0x98, 0x15, 0x35, 0xd6, 0x48, 0x77, 0x93, 0xf8, 0xe8, 0x3a, 0x4c, 0x05, 0x7d, 0x36, 0x91, - 0xe2, 0x83, 0x9e, 0x54, 0x85, 0x84, 0xbf, 0x69, 0x98, 0x2c, 0x67, 0x3d, 0xaf, 0xa2, 0xe4, 0x56, - 0xe2, 0x05, 0x38, 0x6a, 0x4c, 0x4d, 0x38, 0xdf, 0x73, 0x06, 0x2e, 0xb6, 0x63, 0xcf, 0x21, 0x98, - 0x41, 0xa8, 0xe5, 0x44, 0xff, 0x46, 0x87, 0x47, 0xcc, 0x72, 0xa2, 0xe0, 0x00, 0xf3, 0x72, 0xfd, - 0xeb, 0xe3, 0x72, 0xb0, 0x99, 0x04, 0xbb, 0x09, 0xd3, 0xa6, 0x4f, 0x8c, 0x90, 0x58, 0xb5, 0xfd, - 0x61, 0x3a, 0xc7, 0xb4, 0xb8, 0x7a, 0xd4, 0x02, 0xc7, 0x8d, 0xa9, 0xc2, 0xa4, 0x9e, 0x07, 0x95, - 0x62, 0xdd, 0x32, 0xf7, 0x2c, 0xe8, 0xb3, 0x30, 0xe1, 0xdd, 0x77, 0x65, 0x20, 0xc4, 0x91, 0x84, - 0xd9, 0xa7, 0xdc, 0xa1, 0xb5, 0x31, 0x6f, 0xc4, 0x32, 0x79, 0x88, 0xdc, 0x0f, 0x5c, 0x91, 0xad, - 0x64, 0xe5, 0x7d, 0x40, 0x0e, 0x4c, 0x75, 0xd9, 0x34, 0x70, 0x2f, 0xf7, 0x68, 0xac, 0xcc, 0x27, - 0x54, 0xcd, 0x27, 0xc8, 0x30, 0xe3, 0x88, 0x04, 0x55, 0x7c, 0xa9, 0x72, 0x16, 0xf4, 0x0c, 0x93, - 0xa8, 0x8a, 0xef, 0x7a, 0x54, 0x88, 0x63, 0x38, 0xda, 0x87, 0x0a, 0xbf, 0x91, 0xcc, 0xa5, 0xec, - 0x54, 0x71, 0x07, 0xa4, 0xe8, 0xde, 0xdd, 0x18, 0x1b, 0x1f, 0x7a, 0xa5, 0x00, 0xab, 0xb4, 0xf4, - 0x5f, 0x1e, 0x93, 0x4c, 0x2a, 0x24, 0x7e, 0x76, 0x9e, 0x75, 0xad, 0xd0, 0x7b, 0x0d, 0x9f, 0x84, - 0x89, 0xde, 0xb6, 0x11, 0x44, 0x9c, 0x1a, 0xe5, 0xbe, 0x9c, 0x68, 0xd1, 0xc2, 0x87, 0x07, 0xd5, - 0x19, 0x41, 0x9a, 0xfd, 0xc6, 0xbc, 0x2e, 0xea, 0xc3, 0xc5, 0x20, 0x34, 0x1c, 0xd2, 0xb6, 0x85, - 0xb7, 0x28, 0x08, 0x8d, 0x6e, 0xaf, 0x40, 0x0a, 0x4b, 0x76, 0x9c, 0xd4, 0x1e, 0x44, 0x85, 0xb3, - 0xf0, 0xa3, 0xbf, 0xa6, 0xc1, 0x22, 0x2b, 0x5f, 0xe9, 0x87, 0x1e, 0xcf, 0x4a, 0x1b, 0x13, 0x3f, - 0xf9, 0x61, 0x2a, 0xb3, 0xee, 0xdb, 0x39, 0xf8, 0x70, 0x2e, 0x25, 0xfd, 0xcf, 0x34, 0x40, 0x83, - 0xb3, 0x88, 0x1c, 0x28, 0x5b, 0x64, 0xcb, 0xe8, 0x3b, 0x61, 0xb4, 0x0b, 0x17, 0xba, 0xb5, 0x1a, - 0xa3, 0x8c, 0x85, 0x63, 0x43, 0xe0, 0xc5, 0x92, 0x02, 0xf2, 0x60, 0xfa, 0xfe, 0xb6, 0x1d, 0x12, - 0xc7, 0x0e, 0x42, 0x21, 0x20, 0x47, 0x25, 0x27, 0xd5, 0x8e, 0xb7, 0x22, 0xc4, 0x38, 0xa6, 0xa1, - 0xff, 0xe2, 0x18, 0x94, 0x4f, 0xf0, 0xba, 0x4e, 0x1f, 0x90, 0xb8, 0xae, 0x4e, 0x75, 0x15, 0x32, - 0x8a, 0x97, 0x8a, 0x69, 0x14, 0xf5, 0x01, 0x64, 0x38, 0x83, 0x00, 0xfa, 0x32, 0x5c, 0xb2, 0xdd, - 0x2d, 0xdf, 0x08, 0x42, 0xbf, 0x6f, 0x86, 0x7d, 0x3f, 0x22, 0x3c, 0x56, 0x84, 0x30, 0xb3, 0xee, - 0x9b, 0x19, 0xe8, 0x70, 0x26, 0x11, 0x44, 0x60, 0xea, 0xbe, 0xe7, 0xef, 0x50, 0xf9, 0x35, 0x5e, - 0x3c, 0x85, 0xf7, 0x5b, 0x0c, 0x45, 0x2c, 0xb8, 0xf8, 0xef, 0x00, 0x47, 0xb8, 0xf5, 0x3f, 0xd6, - 0x60, 0x82, 0x5f, 0x7f, 0x7a, 0x24, 0x4c, 0x1b, 0xd6, 0xd5, 0xdc, 0xb4, 0x74, 0xd4, 0xe2, 0x60, - 0x35, 0x1e, 0x11, 0x8b, 0x83, 0xf5, 0x35, 0x47, 0x9d, 0xf8, 0xe3, 0x31, 0xf1, 0x2d, 0x6c, 0xbf, - 0x6e, 0xc2, 0x45, 0xa1, 0x77, 0xde, 0xb6, 0xb7, 0x08, 0xe5, 0xae, 0x86, 0xb1, 0x1f, 0x88, 0xbb, - 0xbc, 0x4c, 0xf0, 0xd5, 0x07, 0xc1, 0x38, 0xab, 0x0d, 0xfa, 0x37, 0x1a, 0xdd, 0x19, 0x43, 0xdf, - 0x36, 0x47, 0xca, 0xa0, 0x27, 0xfb, 0xb6, 0xbc, 0xc6, 0x91, 0x71, 0x83, 0x7d, 0x23, 0xde, 0x22, - 0x59, 0xe9, 0xc3, 0x83, 0x6a, 0x35, 0xc3, 0x1b, 0x18, 0x79, 0xaf, 0xe9, 0xc0, 0x7e, 0xed, 0xc7, - 0x47, 0x56, 0x61, 0x9e, 0xf4, 0xa8, 0xc7, 0xe8, 0x26, 0x4c, 0x04, 0xa6, 0xd7, 0x23, 0x47, 0x3d, - 0x22, 0x95, 0xb6, 0xb8, 0xe4, 0x00, 0xb7, 0x69, 0x4b, 0xcc, 0x11, 0x2c, 0xbd, 0x0b, 0x33, 0x6a, - 0xcf, 0x33, 0x1c, 0x02, 0x0d, 0xd5, 0x21, 0x70, 0xe2, 0x63, 0x35, 0xd5, 0x81, 0xf0, 0xfb, 0x25, - 0x10, 0xef, 0x6e, 0x0c, 0x71, 0x5e, 0x60, 0x47, 0x59, 0xc3, 0x46, 0x78, 0x6b, 0x24, 0xfd, 0x98, - 0x5f, 0x3c, 0x06, 0x6a, 0xe2, 0x30, 0xe4, 0xc2, 0xa4, 0x63, 0x6c, 0x12, 0x27, 0x7a, 0x85, 0xe1, - 0x7a, 0xf1, 0x67, 0x02, 0x78, 0x76, 0xdd, 0x20, 0xe5, 0x55, 0xe6, 0x85, 0x58, 0x50, 0x59, 0x7a, - 0x19, 0x2a, 0x4a, 0xb5, 0x13, 0xf9, 0x60, 0xbe, 0xa9, 0xc1, 0x95, 0x88, 0x25, 0x92, 0xd7, 0xf9, - 0xd1, 0x73, 0x50, 0x36, 0x7a, 0x36, 0x73, 0x4b, 0xaa, 0x8e, 0xdd, 0x95, 0x56, 0x93, 0x95, 0x61, - 0x09, 0x45, 0x1f, 0x87, 0x72, 0x34, 0x4f, 0x42, 0x47, 0x91, 0x4b, 0x5c, 0x9e, 0xa7, 0xc8, 0x1a, - 0xe8, 0x59, 0x25, 0x0f, 0xda, 0x44, 0xbc, 0xa3, 0x49, 0xc2, 0xfc, 0x8c, 0x54, 0xff, 0xb5, 0x12, - 0xcc, 0x72, 0x5b, 0xbe, 0x66, 0xbb, 0x96, 0xed, 0x76, 0xce, 0x41, 0x94, 0x26, 0xde, 0x53, 0x2b, - 0x9d, 0xd6, 0x7b, 0x6a, 0xb7, 0x60, 0xf2, 0x3d, 0xba, 0xac, 0x23, 0x76, 0x18, 0x6a, 0x75, 0xc9, - 0xb9, 0x66, 0x12, 0x21, 0xc0, 0x02, 0x85, 0xfe, 0x5f, 0x34, 0x58, 0x48, 0x0c, 0xcb, 0x39, 0x08, - 0xe5, 0xad, 0xa4, 0x50, 0x5e, 0x29, 0x96, 0xd4, 0x42, 0xe9, 0x73, 0x8e, 0x70, 0xfe, 0xdd, 0x12, - 0x8c, 0xb7, 0x09, 0xb1, 0xce, 0x61, 0xa6, 0xdf, 0x49, 0x6c, 0x9a, 0x9f, 0x2d, 0xfc, 0xb6, 0x46, - 0x9e, 0xc5, 0xbf, 0x95, 0xb2, 0xf8, 0x3f, 0x57, 0x98, 0xc2, 0xd1, 0xe6, 0xfe, 0x6f, 0x94, 0x00, - 0x68, 0x35, 0xfe, 0xa2, 0x95, 0x88, 0xd1, 0x8b, 0xdf, 0x3c, 0x9c, 0xfe, 0xa0, 0xbc, 0x54, 0xa8, - 0xcb, 0x77, 0x93, 0xc6, 0x62, 0x7f, 0x72, 0xf2, 0xcd, 0xa4, 0xe4, 0xea, 0x1b, 0x3f, 0xa5, 0xd5, - 0xa7, 0xff, 0x73, 0x0d, 0x58, 0x5e, 0xe5, 0xc6, 0x7a, 0x1b, 0xbd, 0x04, 0xb3, 0x36, 0x3f, 0xad, - 0x6b, 0xa8, 0xc9, 0xa3, 0xd8, 0x99, 0x42, 0x53, 0x05, 0xe0, 0x64, 0x3d, 0xd4, 0x55, 0xc6, 0x75, - 0x84, 0x77, 0xe5, 0x44, 0x3f, 0x64, 0xf6, 0xd0, 0x99, 0xec, 0x89, 0xd1, 0x7f, 0x5c, 0x82, 0x0b, - 0xa9, 0xba, 0x43, 0xe8, 0xf3, 0x67, 0x23, 0xbd, 0x94, 0x84, 0xa2, 0x63, 0x67, 0x9f, 0x50, 0x54, - 0xe6, 0xf6, 0x1c, 0x3f, 0xdb, 0xdc, 0x9e, 0xdf, 0xd3, 0x80, 0x3d, 0x0e, 0x77, 0x0e, 0xd2, 0xf3, - 0x2f, 0x25, 0xa5, 0xe7, 0x67, 0x8a, 0x32, 0x4e, 0x8e, 0xd0, 0xfc, 0xed, 0x12, 0xb0, 0x7c, 0xfb, - 0x22, 0x38, 0x41, 0x39, 0xef, 0xd7, 0x72, 0xce, 0xfb, 0x9f, 0x11, 0xe1, 0x02, 0x29, 0xc7, 0x97, - 0x12, 0x32, 0xf0, 0x71, 0x25, 0x22, 0x60, 0x2c, 0x29, 0x46, 0x06, 0xa3, 0x02, 0xd0, 0x03, 0x98, - 0x0d, 0xb6, 0x3d, 0x2f, 0x8c, 0x4c, 0x60, 0x31, 0x77, 0x2b, 0x85, 0x43, 0x6a, 0xa3, 0x4f, 0xe1, - 0x0b, 0xb3, 0xad, 0xe2, 0xc6, 0x49, 0x52, 0x68, 0x19, 0x60, 0xd3, 0xf1, 0xcc, 0x9d, 0x7a, 0xb3, - 0x81, 0xa3, 0xc0, 0x4b, 0x16, 0x51, 0x54, 0x93, 0xa5, 0x58, 0xa9, 0xa1, 0xff, 0xa1, 0xc6, 0x47, - 0xeb, 0x04, 0xcb, 0xea, 0x1c, 0xa5, 0xe4, 0x47, 0x53, 0x52, 0x32, 0xef, 0x75, 0xb9, 0xef, 0x8a, - 0xaf, 0x90, 0x4f, 0x37, 0x39, 0x30, 0xeb, 0xa8, 0xcf, 0x30, 0x08, 0x36, 0x2e, 0xf4, 0x82, 0x83, - 0x78, 0xb0, 0x50, 0x29, 0xc2, 0x49, 0xe4, 0x54, 0x8c, 0x46, 0x1d, 0x57, 0x9f, 0xa5, 0x66, 0x0d, - 0x5b, 0x2a, 0x00, 0x27, 0xeb, 0xe9, 0x6f, 0xc2, 0x47, 0x78, 0xb7, 0x59, 0xdc, 0xf3, 0xea, 0x9e, - 0x49, 0x82, 0xa0, 0x6e, 0xf4, 0x0c, 0x93, 0x2a, 0xf6, 0xec, 0xba, 0x20, 0xf7, 0x78, 0x9d, 0xe0, - 0xe9, 0xf8, 0xff, 0xa7, 0x41, 0x55, 0xc1, 0x99, 0x88, 0x04, 0x89, 0x18, 0xf4, 0x5b, 0x1a, 0x54, - 0x0c, 0xd7, 0xf5, 0x42, 0x43, 0x3d, 0x80, 0xb1, 0x8a, 0x3f, 0xa8, 0x95, 0x4b, 0x6a, 0x79, 0x25, - 0x26, 0x93, 0x3a, 0x6a, 0x55, 0x20, 0x58, 0xed, 0xcd, 0xd2, 0xe7, 0x60, 0x3e, 0xdd, 0xea, 0x44, - 0x2a, 0x7c, 0x0d, 0x2e, 0x2b, 0xbd, 0x12, 0x17, 0xaf, 0xa8, 0xbe, 0xfc, 0x3c, 0x4c, 0xed, 0xda, - 0x81, 0x1d, 0x5d, 0xe0, 0x55, 0x46, 0xf1, 0x1e, 0x2f, 0xc6, 0x11, 0x5c, 0x7f, 0x03, 0x2e, 0xaa, - 0x38, 0xd8, 0x12, 0x5b, 0x6f, 0x9f, 0x64, 0x1e, 0xd6, 0xe0, 0x19, 0x05, 0x43, 0xe6, 0xed, 0xa3, - 0x93, 0xa0, 0xfb, 0xea, 0x64, 0xc4, 0xe1, 0x22, 0x44, 0xfe, 0xbb, 0x1a, 0x3c, 0x41, 0xf2, 0x18, - 0x46, 0xb0, 0xfb, 0x17, 0x46, 0x9c, 0xd1, 0x5c, 0x86, 0x14, 0xe9, 0x5d, 0xf2, 0xc0, 0x38, 0xbf, - 0x67, 0x68, 0x1f, 0x20, 0x90, 0x53, 0x32, 0x4a, 0xf4, 0x64, 0xe6, 0x1c, 0x8b, 0x14, 0x9e, 0xf2, - 0x37, 0x56, 0x88, 0xa1, 0xf7, 0xa0, 0x1c, 0x88, 0x99, 0x1c, 0xe5, 0x72, 0x64, 0x06, 0x63, 0x88, - 0x00, 0x31, 0xf1, 0x0b, 0x4b, 0x32, 0xe8, 0x37, 0x35, 0xb8, 0xe4, 0x64, 0xac, 0x0b, 0xb1, 0x25, - 0xb4, 0xcf, 0x60, 0xc9, 0x71, 0x17, 0x60, 0x16, 0x04, 0x67, 0x76, 0x05, 0xfd, 0xe3, 0xdc, 0x9b, - 0x78, 0x3c, 0x66, 0xf9, 0xee, 0x88, 0x9d, 0x3c, 0xad, 0x4b, 0x79, 0xdf, 0x9c, 0xe2, 0x2a, 0x0a, - 0xf3, 0x54, 0x6d, 0xc2, 0xe4, 0x26, 0x53, 0xf1, 0x05, 0xab, 0x17, 0xb6, 0x27, 0xc4, 0x73, 0xdd, - 0x4c, 0xff, 0xe6, 0xff, 0x63, 0x81, 0x19, 0xbd, 0x0d, 0x63, 0x96, 0x1b, 0xbd, 0xe6, 0xf1, 0xea, - 0x08, 0xfa, 0x6d, 0x1c, 0x60, 0x4a, 0xb9, 0x83, 0x22, 0x45, 0x2e, 0x94, 0x5d, 0xb1, 0xab, 0x0b, - 0x5e, 0x2c, 0xfc, 0x9e, 0xa1, 0xd4, 0x0e, 0xa4, 0x4e, 0x12, 0x95, 0x60, 0x49, 0x83, 0xd2, 0x93, - 0x0a, 0xfb, 0xf8, 0x68, 0xf4, 0x86, 0x7a, 0xf4, 0xbd, 0xa5, 0xea, 0xde, 0x27, 0x78, 0x4a, 0x7b, - 0x36, 0x57, 0xef, 0x26, 0x30, 0x19, 0x1a, 0x2c, 0x5e, 0x61, 0xb2, 0x78, 0xbc, 0x00, 0xed, 0xff, - 0x5d, 0x8a, 0x25, 0x56, 0x25, 0xd8, 0xcf, 0x00, 0x0b, 0xe4, 0x94, 0xb1, 0xf8, 0x53, 0x8b, 0xe2, - 0xc0, 0xac, 0x30, 0x63, 0xf1, 0x3c, 0xf6, 0x9c, 0xb1, 0xf8, 0xff, 0x58, 0x60, 0x46, 0xef, 0x52, - 0x75, 0x92, 0xcb, 0x71, 0x91, 0x8d, 0xe9, 0x8d, 0x11, 0xd7, 0x58, 0x10, 0x85, 0xa8, 0xf2, 0x5f, - 0x58, 0xe2, 0x47, 0x9b, 0x30, 0x25, 0x4c, 0x37, 0x71, 0xb1, 0xf6, 0xd5, 0x11, 0xb2, 0xfd, 0x46, - 0x4f, 0x33, 0xf0, 0xcb, 0x6d, 0x11, 0x62, 0xfd, 0x9f, 0x94, 0xb9, 0xd1, 0x2d, 0xce, 0xfa, 0xb6, - 0xa0, 0x1c, 0xa1, 0x1b, 0x25, 0x5c, 0x3a, 0xca, 0xc6, 0xce, 0x3f, 0x2d, 0xfa, 0x85, 0x25, 0x6e, - 0x54, 0xcf, 0x8a, 0x4c, 0x8f, 0x33, 0xe6, 0x0d, 0x17, 0x95, 0x9e, 0x0c, 0x45, 0x19, 0x3b, 0x8f, - 0x50, 0x94, 0xd3, 0x7c, 0xbb, 0xfe, 0x35, 0xb8, 0x10, 0x45, 0x8a, 0x58, 0x84, 0x39, 0x84, 0x45, - 0x0c, 0x25, 0xbb, 0xab, 0x55, 0x4f, 0x82, 0x70, 0xba, 0x2e, 0xfa, 0x7d, 0x0d, 0xca, 0xa6, 0xd8, - 0xa5, 0xc5, 0xba, 0xba, 0x3d, 0x9a, 0x67, 0x66, 0x39, 0xda, 0xf4, 0xb9, 0xba, 0x77, 0x2f, 0x92, - 0x11, 0x51, 0xf1, 0x29, 0x79, 0xea, 0x65, 0xaf, 0xd1, 0x7f, 0xa0, 0xca, 0xac, 0xc3, 0x72, 0xc4, - 0xb3, 0xab, 0x2f, 0x3c, 0xb8, 0xf3, 0xce, 0x88, 0x5f, 0xb1, 0x12, 0x63, 0xe4, 0x1f, 0xf2, 0x45, - 0xa9, 0xb7, 0xc6, 0x90, 0x53, 0xfa, 0x16, 0xb5, 0xfb, 0x4b, 0x3b, 0x30, 0x9b, 0x18, 0xc1, 0xb3, - 0x3c, 0x30, 0x58, 0x72, 0x61, 0x3e, 0xfd, 0xa1, 0x67, 0x7a, 0x40, 0x71, 0x0b, 0xa6, 0xa5, 0x04, - 0x46, 0x4f, 0x2b, 0x84, 0xe2, 0x1d, 0xf2, 0x16, 0xd9, 0xe7, 0x54, 0xab, 0x09, 0x05, 0x9f, 0x9b, - 0xed, 0xf7, 0x68, 0x81, 0x40, 0xa8, 0xff, 0x40, 0x18, 0x7d, 0x77, 0x49, 0xb7, 0xe7, 0x18, 0x21, - 0x79, 0xf4, 0xbd, 0xa4, 0xfa, 0xff, 0xd4, 0xb8, 0x20, 0x15, 0x2f, 0xac, 0x18, 0x50, 0xe9, 0xf2, - 0x5c, 0x57, 0x2c, 0xb7, 0x6a, 0xb1, 0xeb, 0x75, 0x2c, 0x52, 0x63, 0x2d, 0x46, 0x83, 0x55, 0x9c, - 0xe8, 0xfe, 0xe0, 0x1b, 0x40, 0xd7, 0x47, 0xdb, 0xf1, 0x86, 0x7e, 0x0a, 0x08, 0x0d, 0xb6, 0x51, - 0x5f, 0x5c, 0xd1, 0x8e, 0x7e, 0x71, 0xe5, 0xf8, 0x77, 0x38, 0xf4, 0xef, 0x68, 0x90, 0x99, 0x21, - 0x1a, 0xe9, 0x30, 0xc9, 0xe3, 0xc3, 0xd5, 0xc7, 0x91, 0x78, 0xf0, 0x38, 0x16, 0x10, 0xe4, 0xc3, - 0x25, 0x11, 0x7d, 0x7d, 0x8b, 0xec, 0xc7, 0xcf, 0xf2, 0x88, 0xa9, 0x1f, 0x3e, 0x0e, 0x93, 0xe5, - 0xc0, 0x69, 0xa7, 0x30, 0xe1, 0x4c, 0xdc, 0x2c, 0x00, 0x98, 0x19, 0x11, 0x8f, 0xc6, 0x29, 0x39, - 0xeb, 0xea, 0xd9, 0x06, 0x00, 0x73, 0x12, 0xc7, 0x07, 0x00, 0xb3, 0x7a, 0x8f, 0xc8, 0x71, 0x3c, - 0xeb, 0x6b, 0x8e, 0xf3, 0xf2, 0x7b, 0x1a, 0x2c, 0x0c, 0xdc, 0xa2, 0x1f, 0xea, 0x30, 0xf7, 0xdc, - 0x7c, 0x72, 0xcf, 0xa6, 0x5f, 0xb7, 0xa9, 0x64, 0x26, 0xd7, 0x78, 0x0b, 0x66, 0x13, 0xbe, 0x4b, - 0x79, 0x29, 0x4b, 0xcb, 0xbc, 0x94, 0xa5, 0xde, 0xb9, 0x2a, 0x1d, 0x79, 0xe7, 0xea, 0x70, 0x46, - 0x4c, 0x37, 0xb3, 0x03, 0xdf, 0x81, 0x49, 0x76, 0x33, 0x2a, 0x7a, 0xdd, 0xeb, 0x95, 0xc2, 0x37, - 0xae, 0x02, 0x2e, 0x06, 0xf8, 0xff, 0x58, 0x60, 0x45, 0x0d, 0x98, 0x67, 0xaf, 0x3e, 0xb7, 0x7c, - 0x6f, 0xcb, 0x76, 0xc8, 0x7a, 0x2c, 0x71, 0xe4, 0x3d, 0xec, 0x7a, 0x0a, 0x8e, 0x07, 0x5a, 0x20, - 0xcc, 0x2d, 0x49, 0xbe, 0x10, 0x5e, 0x2a, 0xe8, 0xc3, 0xe7, 0x99, 0xae, 0xa4, 0x05, 0xf9, 0x1e, - 0x00, 0x89, 0x26, 0x2e, 0x0a, 0xde, 0x79, 0xad, 0xd8, 0x0d, 0x73, 0x39, 0xfd, 0x91, 0xc4, 0x90, - 0x45, 0x01, 0x56, 0x88, 0x20, 0x1f, 0x2a, 0xdb, 0xf1, 0xe3, 0x3f, 0xc2, 0xac, 0x7b, 0x7d, 0xc4, - 0x87, 0x87, 0xf8, 0x06, 0xa5, 0x14, 0x60, 0x95, 0x08, 0xf2, 0x13, 0xaf, 0x6d, 0x8f, 0xf0, 0xb4, - 0x42, 0x6c, 0x0d, 0x1c, 0xf7, 0xd2, 0x36, 0xa5, 0xe9, 0xca, 0xab, 0x8d, 0xa3, 0xd8, 0x81, 0xf1, - 0x05, 0xc9, 0x98, 0x66, 0x5c, 0x86, 0x15, 0x2a, 0x74, 0x6c, 0xbb, 0xf1, 0x75, 0x56, 0x61, 0x16, - 0xbe, 0x3e, 0xe2, 0xb5, 0x62, 0xb1, 0xf9, 0xc7, 0x05, 0x58, 0x25, 0x82, 0x5c, 0x80, 0xae, 0xbc, - 0xe5, 0x2a, 0xcc, 0xc3, 0x42, 0xdf, 0x19, 0xdf, 0x95, 0xe5, 0x0e, 0xb8, 0xf8, 0x37, 0x56, 0x28, - 0x50, 0xbb, 0x57, 0x3a, 0x21, 0xa0, 0xb8, 0x0a, 0x35, 0x94, 0x03, 0xe2, 0xd3, 0xb1, 0x26, 0x51, - 0x61, 0xeb, 0xf5, 0x49, 0x45, 0x8b, 0x78, 0x78, 0x50, 0x9d, 0x61, 0x32, 0x64, 0x40, 0xab, 0x88, - 0x4f, 0x1c, 0x66, 0x8e, 0x3a, 0x71, 0x40, 0x37, 0x60, 0x21, 0x50, 0x4f, 0xf0, 0x99, 0x60, 0x98, - 0x65, 0x4d, 0xe4, 0xad, 0xe8, 0x76, 0xba, 0x02, 0x1e, 0x6c, 0xc3, 0x05, 0x1f, 0xb1, 0x58, 0xfb, - 0x39, 0x55, 0xf0, 0xf1, 0x32, 0x2c, 0xa1, 0x68, 0x37, 0xf5, 0x28, 0xf5, 0x85, 0x51, 0x3d, 0x07, - 0xc3, 0xbd, 0x50, 0x8d, 0xbe, 0xac, 0x3e, 0x3c, 0x3a, 0x5f, 0x3c, 0x94, 0x2b, 0xfb, 0x66, 0xf3, - 0x31, 0x8f, 0x8f, 0xf6, 0x93, 0x41, 0xcc, 0x0b, 0xa7, 0x12, 0x35, 0x2a, 0xcf, 0x20, 0x72, 0x03, - 0x98, 0xbf, 0x53, 0x86, 0x8a, 0xa2, 0x7b, 0xbc, 0x1f, 0x17, 0x56, 0x42, 0xa8, 0x98, 0x9e, 0x1b, - 0x84, 0xbe, 0xa1, 0x5c, 0xd2, 0x19, 0x91, 0xa6, 0xfc, 0xf0, 0x7a, 0x8c, 0x19, 0xab, 0x64, 0xe8, - 0x12, 0x95, 0xbe, 0x9b, 0xb1, 0x53, 0xf0, 0xdd, 0xc8, 0x25, 0x9a, 0xe1, 0xbf, 0xf9, 0x14, 0x40, - 0x24, 0xe9, 0xe5, 0xcb, 0x8e, 0x32, 0xeb, 0x59, 0x33, 0xb8, 0x29, 0x61, 0x58, 0xa9, 0x87, 0x1e, - 0xc0, 0xac, 0xa3, 0x66, 0x3c, 0x12, 0xdb, 0x50, 0xa1, 0xd3, 0xd5, 0x44, 0xea, 0xa4, 0xe8, 0xa0, - 0x4f, 0x29, 0xc2, 0x49, 0x52, 0x94, 0x0d, 0x9c, 0x28, 0x4b, 0xd7, 0x48, 0x7e, 0x48, 0x99, 0xeb, - 0x2b, 0x66, 0x03, 0x59, 0x14, 0x60, 0x85, 0x48, 0x8e, 0xb3, 0x68, 0xaa, 0x90, 0xb3, 0xa8, 0x0f, - 0x17, 0x7d, 0x12, 0xfa, 0xfb, 0xf5, 0x7d, 0x93, 0xbd, 0xdf, 0xe6, 0x87, 0x2c, 0x45, 0x56, 0xb9, - 0x58, 0x0c, 0x3c, 0x1e, 0x44, 0x85, 0xb3, 0xf0, 0x27, 0x44, 0xdc, 0xf4, 0x91, 0x22, 0xee, 0xd3, - 0x50, 0x09, 0x89, 0xb9, 0xed, 0xda, 0xa6, 0xe1, 0x34, 0x1b, 0xe2, 0x9e, 0x6a, 0xbc, 0x5a, 0x63, - 0x10, 0x56, 0xeb, 0xa1, 0x1a, 0x8c, 0xf5, 0x6d, 0x4b, 0xc8, 0xf9, 0x9f, 0x91, 0xcf, 0x78, 0x36, - 0x1b, 0x0f, 0x0f, 0xaa, 0x1f, 0x8a, 0xbd, 0x2f, 0xf2, 0xab, 0xae, 0xf5, 0x76, 0x3a, 0xd7, 0xc2, - 0xfd, 0x1e, 0x09, 0x96, 0x37, 0x9a, 0x0d, 0x4c, 0x1b, 0x67, 0x39, 0xd2, 0x66, 0x86, 0x77, 0xa4, - 0xe9, 0x7f, 0xa2, 0x09, 0x7d, 0xf7, 0x1c, 0xbd, 0x11, 0x67, 0x6d, 0xc2, 0xe9, 0xb7, 0x01, 0x62, - 0x09, 0x39, 0xb2, 0xbf, 0xe6, 0xa7, 0x13, 0x70, 0x79, 0xd4, 0x73, 0x50, 0x96, 0x20, 0x8b, 0x65, - 0xed, 0x5f, 0xd9, 0x0a, 0x89, 0x7f, 0xe7, 0xce, 0xda, 0xdd, 0x6d, 0x9f, 0x04, 0xdb, 0x9e, 0x63, - 0x15, 0xcc, 0xd0, 0x15, 0x3f, 0xfa, 0x30, 0x80, 0x11, 0xe7, 0x50, 0x42, 0x75, 0x58, 0x88, 0x5e, - 0x0e, 0xc0, 0x46, 0x48, 0x6a, 0x7d, 0x3f, 0x08, 0x45, 0xf8, 0x26, 0x73, 0x3c, 0xaf, 0xa6, 0x81, - 0x78, 0xb0, 0x7e, 0x1a, 0x09, 0x7f, 0x41, 0x60, 0x9c, 0x3d, 0x2c, 0x38, 0x80, 0x84, 0x3f, 0x23, - 0x30, 0x58, 0x5f, 0x45, 0x22, 0x1f, 0x22, 0x64, 0x02, 0x31, 0x85, 0x24, 0x7e, 0xa5, 0x70, 0xb0, - 0x3e, 0xb2, 0xe0, 0x29, 0x9f, 0x98, 0x5e, 0xb7, 0x4b, 0x5c, 0x8b, 0xa7, 0x56, 0x34, 0xfc, 0x8e, - 0xed, 0x5e, 0xf7, 0x0d, 0x56, 0x51, 0xbc, 0x76, 0xf8, 0xcc, 0xe1, 0x41, 0xf5, 0x29, 0x7c, 0x44, - 0x3d, 0x7c, 0x24, 0x16, 0xd4, 0x85, 0x0b, 0x7d, 0x96, 0x51, 0xc6, 0x6f, 0xba, 0x21, 0xf1, 0x77, - 0x0d, 0xa7, 0xe0, 0xbb, 0x18, 0x6c, 0x41, 0x6e, 0x24, 0x51, 0xe1, 0x34, 0x6e, 0xb4, 0x4f, 0x65, - 0x9d, 0xe8, 0x8e, 0x42, 0xb2, 0x5c, 0x3c, 0x85, 0x1c, 0x1e, 0x44, 0x87, 0xb3, 0x68, 0xe8, 0x7f, - 0x5f, 0x03, 0x71, 0xe2, 0x43, 0x8d, 0x5e, 0xc5, 0x72, 0x2f, 0xbf, 0xff, 0xef, 0x23, 0xdf, 0x07, - 0x81, 0x80, 0xe5, 0xed, 0x1a, 0x2a, 0xeb, 0xd3, 0xf1, 0x0f, 0xde, 0xc6, 0x79, 0xa7, 0xc6, 0x72, - 0xf3, 0x4e, 0x7d, 0x57, 0x83, 0xf4, 0xfb, 0x68, 0xe8, 0x59, 0x98, 0x12, 0x97, 0x83, 0xc4, 0x15, - 0x03, 0x1e, 0x03, 0xc7, 0x8b, 0x70, 0x04, 0x4b, 0x2a, 0xa0, 0x23, 0xdc, 0x25, 0xc8, 0x8e, 0xeb, - 0x3e, 0x5a, 0x01, 0xd5, 0x7f, 0x38, 0x07, 0x93, 0xfc, 0x3a, 0x0b, 0x95, 0x3d, 0x19, 0x61, 0x33, - 0xb7, 0x8a, 0x5f, 0x98, 0x29, 0x10, 0x1d, 0x93, 0x48, 0x2f, 0x52, 0x3a, 0x32, 0xbd, 0x08, 0xe6, - 0xc9, 0xdf, 0x46, 0x70, 0x3a, 0xd4, 0x71, 0x53, 0xe4, 0x1b, 0x17, 0x89, 0xdf, 0x50, 0x98, 0xb0, - 0xc6, 0xc7, 0x8b, 0xa7, 0xb5, 0xe3, 0x03, 0xa0, 0xd8, 0xe4, 0x73, 0x47, 0xd8, 0xe3, 0xf1, 0xfd, - 0x81, 0x89, 0xe2, 0x1e, 0x6a, 0x31, 0xe4, 0x43, 0xdc, 0x1f, 0x90, 0x1c, 0x3f, 0x99, 0xcb, 0xf1, - 0x5b, 0x30, 0x25, 0xe4, 0x86, 0x10, 0x62, 0xaf, 0x8e, 0x90, 0xd8, 0x4d, 0xb9, 0xf0, 0xc9, 0x0b, - 0x70, 0x84, 0x9c, 0xee, 0x8c, 0x5d, 0x63, 0xcf, 0xee, 0xf6, 0xbb, 0x4c, 0x72, 0x4d, 0xa8, 0x55, - 0x59, 0x31, 0x8e, 0xe0, 0xac, 0x2a, 0x77, 0xec, 0x33, 0x25, 0x4b, 0xad, 0x2a, 0xde, 0xcb, 0x88, - 0xe0, 0xe8, 0x6d, 0x28, 0x77, 0x8d, 0xbd, 0x76, 0xdf, 0xef, 0x10, 0x61, 0x87, 0xe7, 0xab, 0x26, - 0xfd, 0xd0, 0x76, 0x96, 0xa9, 0x69, 0x10, 0xfa, 0xcb, 0x4d, 0x37, 0xbc, 0xe3, 0xb7, 0x43, 0x5f, - 0xe6, 0xb0, 0x5a, 0x13, 0x58, 0xb0, 0xc4, 0x87, 0x1c, 0x98, 0xeb, 0x1a, 0x7b, 0x1b, 0xae, 0x21, - 0xd3, 0xfa, 0x57, 0x0a, 0x52, 0x60, 0xce, 0xc8, 0xb5, 0x04, 0x2e, 0x9c, 0xc2, 0x9d, 0xe1, 0xf7, - 0x9c, 0x39, 0x2b, 0xbf, 0xe7, 0x8a, 0x8c, 0x3f, 0x98, 0x65, 0x4c, 0xf8, 0x44, 0xd6, 0x11, 0xc0, - 0xd1, 0xb1, 0x05, 0xef, 0xc8, 0xd8, 0x82, 0xb9, 0xe2, 0xce, 0xca, 0x23, 0xe2, 0x0a, 0xfa, 0x50, - 0xb1, 0xe4, 0xfb, 0xfc, 0xc1, 0xe2, 0x85, 0xe2, 0xc6, 0x72, 0xfc, 0xcc, 0xbf, 0x92, 0x74, 0x37, - 0x46, 0x8d, 0x55, 0x3a, 0xe8, 0x0e, 0x4f, 0xfb, 0xee, 0x90, 0x30, 0xae, 0xc2, 0x94, 0xfd, 0x79, - 0xee, 0x0f, 0x89, 0xb2, 0xb4, 0x0f, 0x54, 0xc0, 0xd9, 0xed, 0xa8, 0x2a, 0xc9, 0x83, 0x9e, 0x17, - 0xe2, 0x7b, 0xe6, 0x89, 0x0b, 0x45, 0xbf, 0xa4, 0xc1, 0x3c, 0x7f, 0x8e, 0xa7, 0xee, 0x75, 0x7b, - 0x9e, 0x4b, 0xe8, 0xb4, 0x20, 0x36, 0xa6, 0x9f, 0x2f, 0x2e, 0x1b, 0xda, 0x29, 0x8c, 0xe2, 0xec, - 0x26, 0x55, 0x8a, 0x07, 0x28, 0xa3, 0xdf, 0xd3, 0x60, 0xb1, 0x9b, 0x93, 0xd3, 0x76, 0xf1, 0x62, - 0xf1, 0x20, 0xaa, 0xe3, 0xf2, 0xe4, 0xf2, 0x27, 0xc2, 0x8e, 0xab, 0x85, 0x73, 0xfb, 0x36, 0x6a, - 0xa8, 0xe5, 0x28, 0x17, 0xad, 0x7e, 0x1e, 0xe6, 0xd3, 0x7b, 0x80, 0x9a, 0xa8, 0x5e, 0x3b, 0xd3, - 0x44, 0xf5, 0xfa, 0x6b, 0x70, 0x25, 0x7b, 0xce, 0xa9, 0x4a, 0xc4, 0x5e, 0x7c, 0x10, 0x96, 0x48, - 0x9c, 0x86, 0x8d, 0x16, 0x62, 0x0e, 0xab, 0x7d, 0xe2, 0xfb, 0x3f, 0xb9, 0xfa, 0xd8, 0x0f, 0x7e, - 0x72, 0xf5, 0xb1, 0x1f, 0xfd, 0xe4, 0xea, 0x63, 0x5f, 0x3d, 0xbc, 0xaa, 0x7d, 0xff, 0xf0, 0xaa, - 0xf6, 0x83, 0xc3, 0xab, 0xda, 0x8f, 0x0e, 0xaf, 0x6a, 0xff, 0xfd, 0xf0, 0xaa, 0xf6, 0x2b, 0xff, - 0xe3, 0xea, 0x63, 0x6f, 0x4f, 0x89, 0x1e, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x0b, 0x81, - 0x3f, 0x02, 0x27, 0xac, 0x00, 0x00, + 0xc7, 0x9e, 0xee, 0xb9, 0xee, 0x1e, 0x2e, 0xb9, 0x72, 0x20, 0x45, 0x88, 0xec, 0x7c, 0x3a, 0x86, + 0x63, 0x45, 0xb0, 0x95, 0xc0, 0x32, 0x82, 0xc4, 0x08, 0x1c, 0xc8, 0x0e, 0x12, 0x19, 0xf9, 0x04, + 0x0c, 0x1b, 0x81, 0x64, 0x21, 0x01, 0x04, 0x23, 0x42, 0x2e, 0x48, 0x4c, 0x45, 0x0c, 0x20, 0x24, + 0x48, 0xfe, 0x19, 0xf9, 0xb3, 0x30, 0x10, 0xa3, 0x3e, 0xba, 0xba, 0xba, 0xa7, 0x9b, 0x3b, 0xec, + 0x21, 0x79, 0xb7, 0xbf, 0xc8, 0xa9, 0x57, 0xf5, 0x5e, 0x75, 0xd5, 0xab, 0x57, 0xef, 0xbd, 0x7a, + 0xf5, 0x0a, 0x6a, 0x1d, 0x3b, 0xdc, 0xee, 0x6f, 0x2e, 0x9b, 0x5e, 0xf7, 0x6a, 0xc7, 0xf0, 0x2d, + 0xe2, 0x12, 0x3f, 0xfe, 0xa7, 0xb7, 0xd3, 0xb9, 0x6a, 0xf4, 0xec, 0xe0, 0xaa, 0xe9, 0xf9, 0xe4, + 0xea, 0xee, 0xf3, 0x9b, 0x24, 0x34, 0x9e, 0xbf, 0xda, 0xa1, 0x30, 0x23, 0x24, 0xd6, 0x72, 0xcf, + 0xf7, 0x42, 0x0f, 0xbd, 0x10, 0xe3, 0x58, 0x8e, 0x9a, 0xc6, 0xff, 0xf4, 0x76, 0x3a, 0xcb, 0x14, + 0xc7, 0x32, 0xc5, 0xb1, 0x2c, 0x70, 0x2c, 0x7d, 0x42, 0xa5, 0xeb, 0x75, 0xbc, 0xab, 0x0c, 0xd5, + 0x66, 0x7f, 0x8b, 0xfd, 0x62, 0x3f, 0xd8, 0x7f, 0x9c, 0xc4, 0xd2, 0x73, 0x3b, 0x9f, 0x09, 0x96, + 0x6d, 0x8f, 0x76, 0xe6, 0xaa, 0xd1, 0x0f, 0xbd, 0xc0, 0x34, 0x1c, 0xdb, 0xed, 0x5c, 0xdd, 0x1d, + 0xe8, 0xcd, 0x92, 0xae, 0x54, 0x15, 0xdd, 0x3e, 0xb2, 0x8e, 0xbf, 0x69, 0x98, 0x59, 0x75, 0x3e, + 0x15, 0xd7, 0xe9, 0x1a, 0xe6, 0xb6, 0xed, 0x12, 0x7f, 0x3f, 0x1a, 0x90, 0xab, 0x3e, 0x09, 0xbc, + 0xbe, 0x6f, 0x92, 0x63, 0xb5, 0x0a, 0xae, 0x76, 0x49, 0x68, 0x64, 0xd1, 0xba, 0x9a, 0xd7, 0xca, + 0xef, 0xbb, 0xa1, 0xdd, 0x1d, 0x24, 0xf3, 0xb3, 0x0f, 0x6b, 0x10, 0x98, 0xdb, 0xa4, 0x6b, 0x0c, + 0xb4, 0xfb, 0x64, 0x5e, 0xbb, 0x7e, 0x68, 0x3b, 0x57, 0x6d, 0x37, 0x0c, 0x42, 0x3f, 0xdd, 0x48, + 0x7f, 0x01, 0x26, 0x56, 0x2c, 0xcb, 0x73, 0xd1, 0x73, 0x30, 0x45, 0x5c, 0x63, 0xd3, 0x21, 0xd6, + 0xa2, 0x76, 0x45, 0x7b, 0xb6, 0x5c, 0x3b, 0xf7, 0xfd, 0x83, 0xea, 0x63, 0x87, 0x07, 0xd5, 0xa9, + 0x55, 0x5e, 0x8c, 0x23, 0xb8, 0xfe, 0x8d, 0x12, 0x4c, 0xb2, 0x46, 0x01, 0xfa, 0x15, 0x0d, 0xce, + 0xef, 0xf4, 0x37, 0x89, 0xef, 0x92, 0x90, 0x04, 0x0d, 0x23, 0xd8, 0xde, 0xf4, 0x0c, 0x9f, 0xa3, + 0xa8, 0xbc, 0x70, 0x7d, 0xf9, 0xf8, 0xdc, 0xb3, 0x7c, 0x73, 0x10, 0x5d, 0xed, 0xf1, 0xc3, 0x83, + 0xea, 0xf9, 0x0c, 0x00, 0xce, 0x22, 0x8e, 0x76, 0x61, 0xc6, 0xed, 0xd8, 0xee, 0x5e, 0xd3, 0xed, + 0xf8, 0x24, 0x08, 0x16, 0x4b, 0xac, 0x33, 0xaf, 0x17, 0xe9, 0xcc, 0xba, 0x82, 0xa7, 0x36, 0x7f, + 0x78, 0x50, 0x9d, 0x51, 0x4b, 0x70, 0x82, 0x8e, 0xfe, 0x0b, 0x1a, 0x9c, 0x5b, 0xb1, 0xba, 0x76, + 0x10, 0xd8, 0x9e, 0xdb, 0x72, 0xfa, 0x1d, 0xdb, 0x45, 0x57, 0x60, 0xdc, 0x35, 0xba, 0x84, 0x0d, + 0xc8, 0x74, 0x6d, 0x46, 0x8c, 0xe9, 0xf8, 0xba, 0xd1, 0x25, 0x98, 0x41, 0xd0, 0x1b, 0x30, 0x69, + 0x7a, 0xee, 0x96, 0xdd, 0x11, 0xfd, 0xfc, 0xc4, 0x32, 0x9f, 0xc7, 0x65, 0x75, 0x1e, 0x59, 0xf7, + 0xc4, 0xfc, 0x2f, 0x63, 0xe3, 0xde, 0xea, 0x5e, 0x48, 0x5c, 0x4a, 0xa6, 0x06, 0x87, 0x07, 0xd5, + 0xc9, 0x3a, 0x43, 0x80, 0x05, 0x22, 0xfd, 0x1a, 0x94, 0x57, 0x1c, 0xe2, 0x87, 0xb6, 0xdb, 0x41, + 0x2f, 0xc3, 0x1c, 0xe9, 0x1a, 0xb6, 0x83, 0x89, 0x49, 0xec, 0x5d, 0xe2, 0x07, 0x8b, 0xda, 0x95, + 0xb1, 0x67, 0xa7, 0x6b, 0xe8, 0xf0, 0xa0, 0x3a, 0xb7, 0x9a, 0x80, 0xe0, 0x54, 0x4d, 0xfd, 0xaf, + 0x6a, 0x50, 0x59, 0xe9, 0x5b, 0x76, 0xc8, 0xf1, 0x23, 0x1f, 0x2a, 0x06, 0xfd, 0xd9, 0xf2, 0x1c, + 0xdb, 0xdc, 0x17, 0x93, 0xfc, 0x5a, 0x91, 0x71, 0x5d, 0x89, 0xd1, 0xd4, 0xce, 0x1d, 0x1e, 0x54, + 0x2b, 0x4a, 0x01, 0x56, 0x89, 0xe8, 0xdb, 0xa0, 0xc2, 0xd0, 0x17, 0x61, 0x86, 0x7f, 0xe4, 0x9a, + 0xd1, 0xc3, 0x64, 0x4b, 0xf4, 0xe1, 0xc3, 0xca, 0x98, 0x45, 0x84, 0x96, 0x6f, 0x6f, 0xbe, 0x43, + 0xcc, 0x10, 0x93, 0x2d, 0xe2, 0x13, 0xd7, 0x24, 0x7c, 0xfa, 0xea, 0x4a, 0x63, 0x9c, 0x40, 0xa5, + 0xff, 0x58, 0x83, 0xf9, 0x95, 0x5d, 0xc3, 0x76, 0x8c, 0x4d, 0xdb, 0xb1, 0xc3, 0xfd, 0xb7, 0x3c, + 0x97, 0x0c, 0x31, 0x7f, 0x1b, 0xf0, 0x78, 0xdf, 0x35, 0x78, 0x3b, 0x87, 0xac, 0xf1, 0x19, 0xbb, + 0xb3, 0xdf, 0x23, 0x94, 0xf1, 0xe8, 0x48, 0x3f, 0x79, 0x78, 0x50, 0x7d, 0x7c, 0x23, 0xbb, 0x0a, + 0xce, 0x6b, 0x8b, 0x30, 0x5c, 0x52, 0x40, 0x77, 0x3d, 0xa7, 0xdf, 0x15, 0x58, 0xc7, 0x18, 0xd6, + 0xa5, 0xc3, 0x83, 0xea, 0xa5, 0x8d, 0xcc, 0x1a, 0x38, 0xa7, 0xa5, 0xfe, 0xfd, 0x12, 0xcc, 0xd4, + 0x0c, 0x73, 0xa7, 0xdf, 0xab, 0xf5, 0xcd, 0x1d, 0x12, 0xa2, 0x2f, 0x41, 0x99, 0x8a, 0x2d, 0xcb, + 0x08, 0x0d, 0x31, 0x92, 0x3f, 0x93, 0xcb, 0x7d, 0x6c, 0x12, 0x69, 0xed, 0x78, 0x6c, 0xd7, 0x48, + 0x68, 0xd4, 0x90, 0x18, 0x13, 0x88, 0xcb, 0xb0, 0xc4, 0x8a, 0xb6, 0x60, 0x3c, 0xe8, 0x11, 0x53, + 0xf0, 0x76, 0xa3, 0x08, 0xaf, 0xa8, 0x3d, 0x6e, 0xf7, 0x88, 0x19, 0xcf, 0x02, 0xfd, 0x85, 0x19, + 0x7e, 0xe4, 0xc2, 0x64, 0x10, 0x1a, 0x61, 0x9f, 0x0e, 0x0f, 0xa5, 0x74, 0x6d, 0x64, 0x4a, 0x0c, + 0x5b, 0x6d, 0x4e, 0xd0, 0x9a, 0xe4, 0xbf, 0xb1, 0xa0, 0xa2, 0xff, 0x17, 0x0d, 0xe6, 0xd5, 0xea, + 0xb7, 0xec, 0x20, 0x44, 0x7f, 0x71, 0x60, 0x38, 0x97, 0x87, 0x1b, 0x4e, 0xda, 0x9a, 0x0d, 0xe6, + 0xbc, 0x20, 0x57, 0x8e, 0x4a, 0x94, 0xa1, 0x24, 0x30, 0x61, 0x87, 0xa4, 0xcb, 0xd9, 0xaa, 0xa0, + 0x3c, 0x53, 0xbb, 0x5c, 0x9b, 0x15, 0xc4, 0x26, 0x9a, 0x14, 0x2d, 0xe6, 0xd8, 0xf5, 0x2f, 0xc1, + 0x05, 0xb5, 0x56, 0xcb, 0xf7, 0x76, 0x6d, 0x8b, 0xf8, 0x74, 0x25, 0x84, 0xfb, 0xbd, 0x81, 0x95, + 0x40, 0x39, 0x0b, 0x33, 0x08, 0xfa, 0x28, 0x4c, 0xfa, 0xa4, 0x63, 0x7b, 0x2e, 0x9b, 0xed, 0xe9, + 0x78, 0xec, 0x30, 0x2b, 0xc5, 0x02, 0xaa, 0xff, 0xbf, 0x52, 0x72, 0xec, 0xe8, 0x34, 0xa2, 0x5d, + 0x28, 0xf7, 0x04, 0x29, 0x31, 0x76, 0x37, 0x46, 0xfd, 0xc0, 0xa8, 0xeb, 0xf1, 0xa8, 0x46, 0x25, + 0x58, 0xd2, 0x42, 0x36, 0xcc, 0x45, 0xff, 0xd7, 0x47, 0x10, 0xc3, 0x4c, 0x9c, 0xb6, 0x12, 0x88, + 0x70, 0x0a, 0x31, 0xba, 0x03, 0xd3, 0x01, 0x31, 0x7d, 0x42, 0x65, 0x92, 0x60, 0xd3, 0x4c, 0xc1, + 0xd5, 0x8e, 0x2a, 0x09, 0xc1, 0xb5, 0x20, 0xba, 0x3f, 0x2d, 0x01, 0x38, 0x46, 0x84, 0x9e, 0x85, + 0x72, 0x40, 0x88, 0x45, 0x25, 0xd2, 0xe2, 0x38, 0x9f, 0x1b, 0xfa, 0xa9, 0x6d, 0x51, 0x86, 0x25, + 0x54, 0xff, 0xf6, 0x38, 0xa0, 0x41, 0x16, 0x57, 0x47, 0x80, 0x97, 0x88, 0xf1, 0x1f, 0x65, 0x04, + 0xc4, 0x6a, 0x49, 0x21, 0x46, 0xf7, 0x61, 0xd6, 0x31, 0x82, 0xf0, 0x76, 0x8f, 0xea, 0x20, 0x11, + 0xa3, 0x54, 0x5e, 0x58, 0x29, 0x32, 0xd3, 0xb7, 0x54, 0x44, 0xb5, 0x85, 0xc3, 0x83, 0xea, 0x6c, + 0xa2, 0x08, 0x27, 0x49, 0xa1, 0x77, 0x60, 0x9a, 0x16, 0xac, 0xfa, 0xbe, 0xe7, 0x8b, 0xd1, 0x7f, + 0xb5, 0x28, 0x5d, 0x86, 0xa4, 0x36, 0x4b, 0xe7, 0x44, 0xfe, 0xc4, 0x31, 0x7a, 0xf4, 0x79, 0x40, + 0xde, 0x66, 0x40, 0xfc, 0x5d, 0x62, 0x5d, 0xe7, 0x0a, 0x17, 0xfd, 0x58, 0x3a, 0x3b, 0x63, 0xb5, + 0x25, 0x31, 0x9b, 0xe8, 0xf6, 0x40, 0x0d, 0x9c, 0xd1, 0x0a, 0xed, 0x00, 0x92, 0x4a, 0x9b, 0x64, + 0x80, 0xc5, 0x89, 0xe1, 0xd9, 0xe7, 0x12, 0x25, 0x76, 0x7d, 0x00, 0x05, 0xce, 0x40, 0xab, 0xff, + 0x87, 0x12, 0x54, 0x38, 0x8b, 0xac, 0xba, 0xa1, 0xbf, 0x7f, 0x06, 0x1b, 0x04, 0x49, 0x6c, 0x10, + 0xf5, 0xe2, 0x6b, 0x9e, 0x75, 0x38, 0x77, 0x7f, 0xe8, 0xa6, 0xf6, 0x87, 0xd5, 0x51, 0x09, 0x1d, + 0xbd, 0x3d, 0xfc, 0x48, 0x83, 0x73, 0x4a, 0xed, 0x33, 0xd8, 0x1d, 0xac, 0xe4, 0xee, 0xf0, 0xda, + 0x88, 0xdf, 0x97, 0xb3, 0x39, 0x78, 0x89, 0xcf, 0x62, 0x82, 0xfb, 0x05, 0x80, 0x4d, 0x26, 0x4e, + 0xd6, 0x63, 0x3d, 0x49, 0x4e, 0x79, 0x4d, 0x42, 0xb0, 0x52, 0x2b, 0x21, 0xb3, 0x4a, 0x47, 0xca, + 0xac, 0xef, 0x95, 0x60, 0x61, 0x60, 0xd8, 0x07, 0xe5, 0x88, 0xf6, 0x3e, 0xc9, 0x91, 0xd2, 0xfb, + 0x21, 0x47, 0xc6, 0x8a, 0xc8, 0x11, 0xfd, 0x0f, 0x34, 0x18, 0xab, 0xe3, 0x26, 0xfa, 0x58, 0x42, + 0xa3, 0x7d, 0x5c, 0xd5, 0x68, 0x1f, 0x1c, 0x54, 0xa7, 0xea, 0xb8, 0xa9, 0x28, 0xb7, 0x7f, 0x47, + 0x83, 0x05, 0xd3, 0x73, 0x43, 0x83, 0xb2, 0x26, 0xe6, 0x62, 0x3f, 0x62, 0xb1, 0x42, 0xca, 0x5c, + 0x3d, 0x85, 0xac, 0xf6, 0x84, 0xe8, 0xc0, 0x42, 0x1a, 0x12, 0xe0, 0x41, 0xca, 0xfa, 0x06, 0x4c, + 0xd7, 0x1d, 0xaf, 0x6f, 0x35, 0xdd, 0x2d, 0xef, 0x04, 0x35, 0x92, 0xf7, 0x34, 0x98, 0x61, 0x78, + 0x5b, 0xbe, 0xb7, 0x65, 0x3b, 0xe4, 0xd1, 0x50, 0x8c, 0xd5, 0x1e, 0xe7, 0x09, 0x3e, 0xa6, 0xa8, + 0xaa, 0x15, 0x1f, 0x11, 0x45, 0x55, 0xed, 0x72, 0x8e, 0x2c, 0xfa, 0xc6, 0x54, 0xf2, 0xcb, 0x98, + 0x34, 0x7a, 0x16, 0xca, 0xa6, 0x51, 0xeb, 0xbb, 0x96, 0x23, 0xf9, 0x82, 0xf6, 0xb2, 0xbe, 0xc2, + 0xcb, 0xb0, 0x84, 0xa2, 0xfb, 0x00, 0xb1, 0xf3, 0x40, 0x4c, 0xc3, 0xb5, 0xd1, 0x1c, 0x16, 0x6d, + 0x12, 0x52, 0x9b, 0x3b, 0x88, 0xa7, 0x3e, 0x86, 0x61, 0x85, 0x1a, 0xfa, 0x2b, 0x30, 0x2b, 0x06, + 0xb9, 0xd9, 0x35, 0x3a, 0xc2, 0xa6, 0x2b, 0x38, 0x52, 0x6b, 0x0a, 0xa2, 0xda, 0x45, 0x41, 0x78, + 0x56, 0x2d, 0x0d, 0x70, 0x92, 0x1a, 0xda, 0x87, 0x99, 0xae, 0x6a, 0xa7, 0x8e, 0x17, 0xdf, 0x32, + 0x14, 0x9b, 0xb5, 0x76, 0x41, 0x10, 0x9f, 0x49, 0x58, 0xb8, 0x09, 0x52, 0x19, 0xea, 0xf6, 0xc4, + 0x69, 0xa9, 0xdb, 0x04, 0xa6, 0xf8, 0xf2, 0x0e, 0x16, 0x27, 0xd9, 0x07, 0xbe, 0x5c, 0xe4, 0x03, + 0xb9, 0xa4, 0x88, 0xbd, 0x61, 0xfc, 0x77, 0x80, 0x23, 0xdc, 0x68, 0x17, 0x66, 0xe8, 0x6e, 0xd5, + 0x26, 0x0e, 0x31, 0x43, 0xcf, 0x5f, 0x9c, 0x2a, 0xee, 0x6d, 0x6a, 0x2b, 0x78, 0xb8, 0xbb, 0x42, + 0x2d, 0xc1, 0x09, 0x3a, 0x52, 0xfa, 0x95, 0x73, 0xa5, 0x5f, 0x1f, 0x2a, 0xbb, 0x8a, 0xdf, 0x60, + 0x9a, 0x0d, 0xc2, 0xe7, 0x8a, 0x74, 0x2c, 0x76, 0x22, 0xd4, 0xce, 0x0b, 0x42, 0x15, 0xd5, 0xe1, + 0xa0, 0xd2, 0xd1, 0x7f, 0x71, 0x12, 0x16, 0xea, 0x4e, 0x3f, 0x08, 0x89, 0xbf, 0x22, 0xdc, 0xb9, + 0xc4, 0x47, 0x5f, 0xd3, 0xe0, 0x12, 0xfb, 0xb7, 0xe1, 0xdd, 0x73, 0x1b, 0xc4, 0x31, 0xf6, 0x57, + 0xb6, 0x68, 0x0d, 0xcb, 0x3a, 0x9e, 0x04, 0x6a, 0xf4, 0xc5, 0x4e, 0xcd, 0x1c, 0x20, 0xed, 0x4c, + 0x8c, 0x38, 0x87, 0x12, 0xfa, 0x5b, 0x1a, 0x3c, 0x91, 0x01, 0x6a, 0x10, 0x87, 0x84, 0x44, 0xc8, + 0x80, 0xe3, 0xf6, 0xe3, 0xe9, 0xc3, 0x83, 0xea, 0x13, 0xed, 0x3c, 0xa4, 0x38, 0x9f, 0x1e, 0xfa, + 0x25, 0x0d, 0x96, 0x32, 0xa0, 0xd7, 0x0c, 0xdb, 0xe9, 0xfb, 0x44, 0x28, 0xaa, 0xc7, 0xed, 0xce, + 0xe5, 0xc3, 0x83, 0xea, 0x52, 0x3b, 0x17, 0x2b, 0x3e, 0x82, 0x22, 0xfa, 0x0a, 0x5c, 0x94, 0xd0, + 0x0d, 0xd7, 0x25, 0xc4, 0x22, 0xd6, 0x1d, 0x5b, 0xd8, 0x95, 0xc7, 0xef, 0xca, 0x13, 0x87, 0x07, + 0xd5, 0x8b, 0xed, 0x2c, 0x84, 0x38, 0x9b, 0x0e, 0xea, 0xc0, 0xd3, 0x31, 0x20, 0xb4, 0x1d, 0xfb, + 0x3e, 0xc3, 0x74, 0x67, 0xdb, 0x27, 0xc1, 0xb6, 0xe7, 0x58, 0x4c, 0x58, 0x68, 0xb5, 0x0f, 0x1d, + 0x1e, 0x54, 0x9f, 0x6e, 0x1f, 0x55, 0x11, 0x1f, 0x8d, 0x07, 0x59, 0x30, 0x13, 0x98, 0x86, 0xdb, + 0x74, 0x43, 0xe2, 0xef, 0x1a, 0xce, 0xe2, 0x64, 0xa1, 0x0f, 0xe4, 0x4b, 0x54, 0xc1, 0x83, 0x13, + 0x58, 0xf5, 0xff, 0xad, 0x41, 0x45, 0xac, 0x04, 0xa6, 0xb0, 0x6c, 0xc2, 0x84, 0x49, 0x37, 0x2c, + 0xc1, 0xf1, 0xaf, 0x16, 0xde, 0x18, 0x29, 0xb6, 0x78, 0x57, 0x64, 0x45, 0x98, 0xa3, 0x46, 0xbb, + 0x19, 0xdb, 0x5a, 0x6d, 0xb4, 0x6d, 0x8d, 0x51, 0x7b, 0xc8, 0x96, 0xa6, 0x1f, 0x8c, 0xc1, 0x74, + 0xdd, 0x73, 0x2d, 0x9b, 0x29, 0xc9, 0xcf, 0x27, 0x54, 0xb3, 0xa7, 0x55, 0xe1, 0xf4, 0xe0, 0xa0, + 0x3a, 0x2b, 0x2b, 0x2a, 0xd2, 0xea, 0x25, 0x69, 0xa1, 0x71, 0x5d, 0xed, 0x43, 0x49, 0xd3, 0xea, + 0xc1, 0x41, 0xf5, 0x9c, 0x6c, 0x96, 0xb4, 0xb6, 0xd0, 0x2e, 0x20, 0xaa, 0x33, 0xdf, 0xf1, 0x0d, + 0x37, 0xe0, 0x68, 0x29, 0xd3, 0xf2, 0xf5, 0xf3, 0x17, 0x86, 0x9b, 0x53, 0xda, 0x22, 0x56, 0xa9, + 0x6f, 0x0d, 0x60, 0xc3, 0x19, 0x14, 0xd0, 0x3b, 0x30, 0x47, 0x4b, 0x37, 0x7a, 0x96, 0x11, 0x12, + 0x65, 0xa1, 0x1c, 0x87, 0xe6, 0x25, 0x41, 0x73, 0xee, 0x56, 0x02, 0x13, 0x4e, 0x61, 0xe6, 0xaa, + 0xac, 0x11, 0x78, 0x2e, 0x5b, 0x03, 0x09, 0x55, 0x96, 0x96, 0x62, 0x01, 0x45, 0xcf, 0xc1, 0x54, + 0x97, 0x04, 0x81, 0xd1, 0x21, 0x8c, 0xa9, 0xa7, 0xe3, 0x9d, 0x6b, 0x8d, 0x17, 0xe3, 0x08, 0x8e, + 0x3e, 0x0e, 0x13, 0xa6, 0x67, 0x91, 0x60, 0x71, 0x8a, 0x79, 0x94, 0x2f, 0x31, 0x5e, 0xa2, 0x05, + 0x0f, 0x0e, 0xaa, 0xd3, 0xcc, 0x00, 0xa1, 0xbf, 0x30, 0xaf, 0xa4, 0xff, 0x06, 0x55, 0x24, 0x53, + 0x0a, 0xf9, 0x10, 0x2a, 0xf8, 0xd9, 0xf9, 0xd7, 0xf4, 0x1f, 0x96, 0xe0, 0x02, 0xed, 0xa1, 0xef, + 0x39, 0x0e, 0x15, 0xb2, 0x3d, 0xc7, 0xdb, 0xef, 0x12, 0x37, 0xfc, 0x40, 0xf5, 0x12, 0xbd, 0x0e, + 0x93, 0x3d, 0x7e, 0x7e, 0x32, 0xc6, 0xba, 0xf3, 0x2c, 0x9d, 0x44, 0x7e, 0xba, 0xf1, 0xe0, 0xa0, + 0xba, 0x94, 0xf5, 0x01, 0xe2, 0x5c, 0x44, 0xb4, 0x43, 0x76, 0x4a, 0xe3, 0xe0, 0x4c, 0xf7, 0xc9, + 0x21, 0x35, 0x78, 0x63, 0x93, 0x38, 0xc3, 0x2a, 0x19, 0xfa, 0x4f, 0x4b, 0x70, 0x29, 0xee, 0x51, + 0xd3, 0x0d, 0x42, 0xc3, 0x71, 0xb8, 0x1d, 0x7c, 0xfa, 0x26, 0x52, 0x2f, 0x61, 0x22, 0xad, 0x17, + 0x35, 0x37, 0x07, 0xfb, 0x9e, 0xeb, 0x25, 0xda, 0x4b, 0x79, 0x89, 0x5a, 0x27, 0x48, 0xf3, 0x68, + 0x87, 0xd1, 0xff, 0xd1, 0x60, 0x29, 0xbb, 0xe1, 0x19, 0x18, 0x6c, 0x5e, 0xd2, 0x60, 0xfb, 0xfc, + 0xc9, 0x7d, 0x75, 0x8e, 0xe9, 0xf6, 0x9f, 0x73, 0xbf, 0x96, 0x19, 0x71, 0x5b, 0x70, 0x8e, 0x6a, + 0xd7, 0x41, 0x28, 0xdc, 0x19, 0xc7, 0x3b, 0xe7, 0x8b, 0x5c, 0x1a, 0xe7, 0x70, 0x12, 0x07, 0x4e, + 0x23, 0x45, 0xeb, 0x30, 0x45, 0xb9, 0x9d, 0xe2, 0x2f, 0x0d, 0x8f, 0x5f, 0x0a, 0xd4, 0x36, 0x6f, + 0x8b, 0x23, 0x24, 0xfa, 0x9f, 0x69, 0xf0, 0xd4, 0x51, 0xb3, 0x8f, 0xde, 0x05, 0x30, 0xa3, 0x3d, + 0x8c, 0x1f, 0xc4, 0x16, 0xd5, 0x02, 0x22, 0x2c, 0xf1, 0x12, 0x92, 0x45, 0x01, 0x56, 0x88, 0x64, + 0x78, 0xf7, 0x4b, 0xa7, 0xe4, 0xdd, 0xd7, 0xff, 0xaf, 0xa6, 0x0a, 0x0b, 0x75, 0xf4, 0x1f, 0x35, + 0x61, 0xa1, 0xf6, 0x3d, 0xd7, 0xb3, 0x92, 0x5c, 0xb2, 0x6a, 0x93, 0x47, 0x6e, 0xc9, 0xaa, 0x9d, + 0xcf, 0x59, 0xb2, 0x7f, 0xb7, 0x94, 0xf7, 0xb5, 0x6c, 0xc9, 0xde, 0x83, 0xe9, 0x28, 0x6e, 0x26, + 0x62, 0xec, 0x6b, 0xa3, 0xf6, 0x89, 0xa3, 0x8b, 0x8f, 0xbf, 0xa2, 0x92, 0x00, 0xc7, 0xb4, 0xd0, + 0x1e, 0x80, 0x25, 0x37, 0x4a, 0x31, 0xfb, 0x37, 0x46, 0xa3, 0x1c, 0x6f, 0xbc, 0xb5, 0x39, 0xca, + 0x6f, 0xf1, 0x6f, 0xac, 0xd0, 0xd2, 0x7f, 0xb7, 0x04, 0x68, 0xb0, 0xbb, 0x54, 0xd9, 0xd8, 0xb1, + 0x5d, 0x2b, 0xad, 0x6c, 0xdc, 0xb4, 0x5d, 0x0b, 0x33, 0x88, 0x54, 0x47, 0x4a, 0xb9, 0xea, 0xc8, + 0xab, 0x70, 0xae, 0xe3, 0x78, 0x9b, 0x86, 0xe3, 0xec, 0x8b, 0xe8, 0x1b, 0xb6, 0x21, 0x95, 0x6b, + 0xe7, 0xa9, 0x5c, 0xbb, 0x9e, 0x04, 0xe1, 0x74, 0x5d, 0xd4, 0x83, 0x79, 0x9f, 0x98, 0x9e, 0x6b, + 0xda, 0x0e, 0x53, 0x1e, 0xbd, 0x7e, 0x58, 0xd0, 0x84, 0xbb, 0x70, 0x78, 0x50, 0x9d, 0xc7, 0x29, + 0x5c, 0x78, 0x00, 0x3b, 0x7a, 0x06, 0xa6, 0x7a, 0xbe, 0xdd, 0x35, 0xfc, 0x7d, 0xa6, 0x9e, 0x96, + 0x6b, 0x15, 0x2a, 0x20, 0x5b, 0xbc, 0x08, 0x47, 0x30, 0xfd, 0x5b, 0x1a, 0x8c, 0x35, 0xd6, 0xdb, + 0x48, 0x87, 0x49, 0xcb, 0xeb, 0x1a, 0xb6, 0x2b, 0x46, 0x89, 0x05, 0xb1, 0x34, 0x58, 0x09, 0x16, + 0x10, 0xd4, 0x83, 0xe9, 0x48, 0xbe, 0x8c, 0x74, 0xa8, 0xd1, 0x58, 0x6f, 0xcb, 0x83, 0x60, 0xc9, + 0x4a, 0x51, 0x49, 0x80, 0x63, 0x22, 0xba, 0x01, 0x0b, 0x8d, 0xf5, 0x76, 0xd3, 0x35, 0x9d, 0xbe, + 0x45, 0x56, 0xf7, 0xd8, 0x1f, 0xfa, 0x65, 0x36, 0x2f, 0x11, 0x81, 0x33, 0xec, 0xcb, 0x44, 0x25, + 0x1c, 0xc1, 0x68, 0x35, 0xc2, 0x5b, 0x88, 0xa8, 0x0f, 0x56, 0x4d, 0x20, 0xc1, 0x11, 0x4c, 0x7f, + 0xaf, 0x04, 0x15, 0xa5, 0x43, 0xc8, 0x81, 0x29, 0xfe, 0xb9, 0xd1, 0xa1, 0xeb, 0x6a, 0xc1, 0x4f, + 0x4c, 0xf6, 0x9a, 0x53, 0xe7, 0x03, 0x1a, 0xe0, 0x88, 0x84, 0x3a, 0x4b, 0xa5, 0xfc, 0x59, 0x42, + 0xcb, 0x00, 0xfc, 0x78, 0x99, 0x9d, 0xcf, 0x70, 0x2d, 0x95, 0x2d, 0x84, 0xb6, 0x2c, 0xc5, 0x4a, + 0x0d, 0xf4, 0x94, 0xe0, 0x67, 0x7e, 0xfa, 0x5c, 0x4e, 0xf1, 0xf2, 0x16, 0x4c, 0xdc, 0xf7, 0x5c, + 0x12, 0x08, 0x47, 0xdf, 0x09, 0x7d, 0xe0, 0x34, 0x15, 0x50, 0x6f, 0x51, 0xbc, 0x98, 0xa3, 0xd7, + 0x7f, 0x53, 0x03, 0x68, 0x18, 0xa1, 0xc1, 0xfd, 0x52, 0x43, 0x04, 0xee, 0x3c, 0x95, 0x58, 0x86, + 0xe5, 0x81, 0xa3, 0x83, 0xf1, 0xc0, 0xbe, 0x1f, 0x7d, 0xbe, 0xdc, 0x7b, 0x38, 0xf6, 0xb6, 0x7d, + 0x9f, 0x60, 0x06, 0x47, 0x1f, 0x83, 0x69, 0xe2, 0x9a, 0xfe, 0x7e, 0x2f, 0x24, 0x16, 0x1b, 0x81, + 0x32, 0x3f, 0xcf, 0x59, 0x8d, 0x0a, 0x71, 0x0c, 0xd7, 0x77, 0xa1, 0xbc, 0xea, 0x5a, 0x3d, 0xcf, + 0xe6, 0x46, 0xc9, 0x43, 0x3a, 0xf8, 0x34, 0x8c, 0xf5, 0x7d, 0x47, 0xf4, 0xaf, 0x22, 0x2a, 0x8c, + 0x6d, 0xe0, 0x5b, 0x98, 0x96, 0x53, 0x4b, 0xaf, 0xd7, 0xf7, 0x7b, 0x5e, 0x10, 0x75, 0x52, 0x2a, + 0x26, 0x2d, 0x5e, 0x8c, 0x23, 0xb8, 0xfe, 0x40, 0x83, 0xf9, 0xd5, 0xbd, 0x9e, 0xed, 0xb3, 0x88, + 0x20, 0xe2, 0xd3, 0x2d, 0x9d, 0xb6, 0xdf, 0xe5, 0xff, 0x8a, 0x3e, 0xc8, 0xf6, 0xa2, 0x06, 0x8e, + 0xe0, 0x68, 0x0b, 0xe6, 0x08, 0x6b, 0x4e, 0x85, 0x42, 0xc3, 0x90, 0xbe, 0xb2, 0xe3, 0x18, 0xba, + 0x3c, 0xe0, 0x2c, 0x81, 0x05, 0xa7, 0xb0, 0xa2, 0x36, 0xcc, 0x99, 0x8e, 0x11, 0x04, 0xf6, 0x96, + 0x6d, 0xc6, 0x67, 0x5d, 0xd3, 0xb5, 0x8f, 0xd1, 0xb6, 0xf5, 0x04, 0xe4, 0xc1, 0x41, 0xf5, 0xa2, + 0xe8, 0x67, 0x12, 0x80, 0x53, 0x28, 0xf4, 0x3f, 0xd0, 0x60, 0x5a, 0x2a, 0x32, 0x1f, 0x2c, 0x5b, + 0xf0, 0x59, 0x28, 0x5b, 0x76, 0xa0, 0x0a, 0x78, 0x76, 0x5a, 0xd1, 0x10, 0x65, 0x58, 0x42, 0xf5, + 0x00, 0xca, 0xd7, 0xc5, 0x1a, 0x41, 0x4b, 0x50, 0xb2, 0xa3, 0xfd, 0x05, 0xc4, 0x07, 0x94, 0x9a, + 0x0d, 0x5c, 0xb2, 0x2d, 0xc9, 0x55, 0xa5, 0x5c, 0xae, 0x52, 0xa6, 0x7d, 0xec, 0xe8, 0x69, 0xd7, + 0xbf, 0xa3, 0x41, 0xe5, 0x86, 0xbd, 0x49, 0x7c, 0x97, 0x6b, 0x71, 0xcf, 0xa4, 0x63, 0x44, 0x2b, + 0x59, 0xf1, 0xa1, 0x68, 0x0f, 0xa6, 0x03, 0x73, 0x9b, 0x58, 0x7d, 0x47, 0x9e, 0x15, 0x16, 0x8a, + 0x04, 0x55, 0x48, 0xb7, 0x05, 0x3e, 0x25, 0x16, 0x26, 0xa2, 0x80, 0x63, 0x62, 0xfa, 0x97, 0xe1, + 0x7c, 0x46, 0x23, 0x54, 0x85, 0x89, 0x20, 0x34, 0xfc, 0x50, 0x8c, 0x19, 0x93, 0x1d, 0x6d, 0x5a, + 0x80, 0x79, 0x39, 0x7a, 0x02, 0xc6, 0x88, 0x6b, 0x89, 0x41, 0x9b, 0xa2, 0xab, 0x6c, 0xd5, 0xb5, + 0x30, 0x2d, 0xa3, 0x53, 0xe4, 0x78, 0x09, 0x66, 0x64, 0x53, 0x74, 0x4b, 0x94, 0x61, 0x09, 0xd5, + 0xff, 0xcd, 0x38, 0x3c, 0x7d, 0xc3, 0xf3, 0xed, 0xfb, 0x9e, 0x1b, 0x1a, 0x4e, 0xcb, 0xb3, 0x62, + 0xef, 0xb7, 0x98, 0xee, 0xaf, 0x6b, 0xf0, 0xb8, 0xd9, 0xeb, 0x37, 0x5d, 0x3b, 0xb4, 0x8d, 0xc8, + 0x29, 0xd9, 0x22, 0xbe, 0xed, 0x15, 0x75, 0x82, 0xb3, 0xd8, 0xc2, 0x7a, 0x6b, 0x23, 0x0b, 0x25, + 0xce, 0xa3, 0xc5, 0x7c, 0xf1, 0x96, 0x77, 0xcf, 0x65, 0x9d, 0x6b, 0x87, 0x2c, 0xde, 0xf1, 0x7e, + 0xfc, 0x89, 0x05, 0x7d, 0xf1, 0x8d, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xfa, 0x0a, 0x5c, 0xb4, 0x79, + 0xe7, 0x30, 0x31, 0x2c, 0xdb, 0x25, 0x41, 0xc0, 0x3c, 0xd2, 0xa3, 0x38, 0x9b, 0x9b, 0x59, 0x08, + 0x71, 0x36, 0x1d, 0xf4, 0x36, 0x40, 0xb0, 0xef, 0x9a, 0x62, 0xfc, 0x27, 0x0a, 0x51, 0xe5, 0xdb, + 0xa2, 0xc4, 0x82, 0x15, 0x8c, 0x74, 0x67, 0x08, 0x3d, 0x87, 0xf8, 0x86, 0x6b, 0x72, 0x5f, 0x9c, + 0xc6, 0x77, 0x86, 0x3b, 0x51, 0x21, 0x8e, 0xe1, 0xfa, 0x3f, 0xd3, 0x60, 0x4a, 0xc4, 0x11, 0xa3, + 0x8f, 0xa6, 0xb4, 0x23, 0xe9, 0x33, 0x48, 0x69, 0x48, 0xfb, 0xcc, 0x9a, 0x14, 0xfa, 0xa7, 0x10, + 0x52, 0x85, 0xb6, 0x57, 0x41, 0x38, 0x56, 0x66, 0x13, 0x56, 0x65, 0xa4, 0xe0, 0x2a, 0xc4, 0xf4, + 0x6f, 0x6b, 0xb0, 0x30, 0xd0, 0x6a, 0x08, 0xd5, 0xf7, 0x0c, 0xbd, 0x81, 0xbf, 0x0a, 0xc0, 0x42, + 0xc6, 0x57, 0x5a, 0xcd, 0x36, 0xf1, 0x77, 0xe5, 0x22, 0xfc, 0x9b, 0x1a, 0xcc, 0xc7, 0x7e, 0x6b, + 0xd1, 0x0b, 0xad, 0xf8, 0x29, 0xfc, 0xcd, 0x14, 0xae, 0xda, 0xa2, 0xf8, 0xee, 0xf9, 0x34, 0x04, + 0x0f, 0xd0, 0x45, 0x7f, 0x43, 0x83, 0x79, 0x23, 0x19, 0x32, 0x1e, 0x89, 0xcc, 0x42, 0xa1, 0x50, + 0xa9, 0xf0, 0xf3, 0xb8, 0x2f, 0x29, 0x40, 0x80, 0x07, 0xc8, 0xa2, 0x4f, 0xc1, 0x8c, 0xd1, 0xb3, + 0x57, 0xfa, 0x96, 0x4d, 0x5c, 0x53, 0xc6, 0x19, 0x33, 0x0f, 0xe1, 0x4a, 0xab, 0x29, 0xcb, 0x71, + 0xa2, 0x96, 0x8c, 0x09, 0x17, 0x03, 0x39, 0x3e, 0x62, 0x4c, 0xb8, 0x18, 0xc3, 0x38, 0x26, 0x5c, + 0x0c, 0x9d, 0x4a, 0x04, 0xfd, 0x1c, 0x3c, 0xc1, 0xf7, 0x9a, 0x9a, 0x11, 0xd8, 0xe6, 0x4a, 0x3f, + 0xdc, 0x26, 0x6e, 0x18, 0x69, 0x0c, 0xdc, 0xfe, 0x60, 0xa7, 0x72, 0xab, 0x79, 0x95, 0x70, 0x7e, + 0x7b, 0xe4, 0x02, 0x78, 0xb6, 0x65, 0x8a, 0xef, 0xe1, 0x07, 0x43, 0x85, 0x0e, 0x4d, 0x6f, 0x37, + 0x1b, 0x75, 0xf1, 0x39, 0x4c, 0x4c, 0xc4, 0xbf, 0xb1, 0x42, 0x01, 0x7d, 0x53, 0x83, 0x59, 0xc1, + 0xe4, 0x82, 0xe6, 0x14, 0x9b, 0xff, 0xb7, 0x8a, 0x32, 0x63, 0x8a, 0xe1, 0x97, 0xb1, 0x8a, 0x9c, + 0x07, 0x77, 0xc9, 0x30, 0x81, 0x04, 0x0c, 0x27, 0xfb, 0x81, 0xfe, 0xbe, 0x06, 0x17, 0x02, 0xe2, + 0xef, 0xda, 0x26, 0x59, 0x31, 0x4d, 0xaf, 0xef, 0x46, 0x93, 0x5c, 0x2e, 0x6e, 0x65, 0xb7, 0x33, + 0xf0, 0xd5, 0x16, 0x0f, 0x0f, 0xaa, 0x17, 0xb2, 0x20, 0x38, 0x93, 0x3e, 0xdd, 0xbf, 0xce, 0xdd, + 0x33, 0x42, 0x73, 0xbb, 0x6e, 0x98, 0xdb, 0x4c, 0x19, 0x0f, 0x16, 0xa7, 0x8b, 0xc7, 0x0f, 0xbe, + 0x99, 0x44, 0xc5, 0x8d, 0xec, 0x54, 0x21, 0x4e, 0x13, 0x44, 0x01, 0x94, 0x7d, 0xf2, 0x6e, 0x9f, + 0x04, 0x61, 0xb0, 0x08, 0x8c, 0x78, 0x73, 0xe4, 0x19, 0xc3, 0x02, 0x21, 0xd7, 0x31, 0xa2, 0x5f, + 0x58, 0x12, 0x5a, 0x7a, 0x1d, 0xd0, 0xe0, 0x74, 0xa2, 0x79, 0x18, 0xdb, 0x21, 0xfc, 0x3e, 0xc6, + 0x34, 0xa6, 0xff, 0xa2, 0x0b, 0x30, 0xb1, 0x6b, 0x38, 0x7d, 0xae, 0x07, 0x96, 0x31, 0xff, 0xf1, + 0x72, 0xe9, 0x33, 0x9a, 0xfe, 0x7b, 0x1a, 0x5c, 0xcc, 0xa4, 0x89, 0x30, 0x5c, 0xea, 0x1a, 0x7b, + 0xeb, 0x9e, 0xbb, 0xd6, 0x0f, 0x8d, 0xd0, 0x76, 0x3b, 0x4d, 0x77, 0xcb, 0xb1, 0x3b, 0xdb, 0x5c, + 0x6d, 0x9a, 0xe0, 0x9b, 0xfc, 0x5a, 0x66, 0x0d, 0x9c, 0xd3, 0x12, 0x35, 0xe1, 0x7c, 0xd7, 0xd8, + 0x1b, 0x40, 0x58, 0x62, 0x08, 0xd9, 0xad, 0x9e, 0xb5, 0x41, 0x30, 0xce, 0x6a, 0xa3, 0x7f, 0x63, + 0x1c, 0x9e, 0xa4, 0x1d, 0x8f, 0xf7, 0x9b, 0x35, 0xc3, 0x35, 0x3a, 0x1f, 0x4c, 0xb9, 0xfe, 0x1d, + 0x0d, 0x1e, 0xdf, 0xce, 0xd6, 0x05, 0xc5, 0x8e, 0xf7, 0x46, 0x21, 0x8d, 0xf8, 0x28, 0xf5, 0x92, + 0x1f, 0x8b, 0x1f, 0x59, 0x05, 0xe7, 0x75, 0x0a, 0xbd, 0x0e, 0xf3, 0xae, 0x67, 0x91, 0x7a, 0xb3, + 0x81, 0xd7, 0x8c, 0x60, 0xa7, 0x1d, 0x99, 0xbe, 0x13, 0xdc, 0x05, 0xb4, 0x9e, 0x82, 0xe1, 0x81, + 0xda, 0x68, 0x17, 0x50, 0xcf, 0xb3, 0x56, 0x77, 0x6d, 0x33, 0x3a, 0x1f, 0x2d, 0xee, 0x76, 0x62, + 0x21, 0xcb, 0xad, 0x01, 0x6c, 0x38, 0x83, 0x82, 0xfe, 0x47, 0x1a, 0x9c, 0xa3, 0x33, 0xd2, 0xf2, + 0xbd, 0xbd, 0xfd, 0x0f, 0x22, 0x2f, 0x3c, 0x07, 0xe3, 0x5d, 0xcf, 0x8a, 0x4c, 0xb2, 0x8b, 0x54, + 0x23, 0x5a, 0xf3, 0x2c, 0xf2, 0x80, 0xbb, 0xa1, 0xf6, 0xf6, 0xe9, 0x0f, 0xcc, 0xaa, 0xe8, 0xff, + 0x4d, 0xe3, 0x3a, 0x4b, 0x64, 0xb9, 0x7c, 0x20, 0x79, 0xfb, 0x45, 0x98, 0xa5, 0x65, 0x6b, 0xc6, + 0x5e, 0xab, 0x71, 0xd7, 0x73, 0xa2, 0xf3, 0x7a, 0x16, 0x39, 0x7b, 0x53, 0x05, 0xe0, 0x64, 0x3d, + 0xfd, 0x9b, 0xb3, 0xc0, 0x2a, 0x38, 0x24, 0xfc, 0x20, 0x7e, 0xd7, 0xf3, 0x50, 0x31, 0x7b, 0xfd, + 0xfa, 0xb5, 0xf6, 0x1b, 0x7d, 0x2f, 0x34, 0x84, 0x87, 0x8c, 0x29, 0x22, 0xf5, 0xd6, 0x46, 0x54, + 0x8c, 0xd5, 0x3a, 0x74, 0xd5, 0x98, 0xbd, 0xbe, 0x90, 0x43, 0x2d, 0xf5, 0x54, 0x97, 0xad, 0x9a, + 0x7a, 0x6b, 0x23, 0x01, 0xc3, 0x03, 0xb5, 0xd1, 0x57, 0x60, 0x86, 0x08, 0x86, 0xbe, 0x61, 0xf8, + 0x96, 0x58, 0x2f, 0x85, 0x77, 0x12, 0x39, 0xb4, 0xd1, 0x2a, 0xe1, 0xfa, 0xdb, 0xaa, 0x42, 0x02, + 0x27, 0x08, 0x32, 0x5d, 0x4a, 0xfc, 0xa6, 0x33, 0xe5, 0x59, 0xd7, 0x7d, 0xc3, 0x24, 0x8a, 0x51, + 0x34, 0x21, 0x74, 0xa9, 0xbc, 0x4a, 0x38, 0xbf, 0x3d, 0xfa, 0x6d, 0x0d, 0x2e, 0x49, 0xa8, 0xed, + 0xda, 0xdd, 0x7e, 0x17, 0x13, 0xd3, 0x31, 0xec, 0xae, 0x50, 0xac, 0xde, 0x3c, 0xb1, 0x0f, 0x4d, + 0xa2, 0xe7, 0x9b, 0x55, 0x36, 0x0c, 0xe7, 0x74, 0x09, 0x7d, 0x5b, 0x83, 0x2b, 0x11, 0xa8, 0x45, + 0x4d, 0x9b, 0xbe, 0x4f, 0xe2, 0x88, 0x0f, 0x31, 0x24, 0x53, 0x85, 0x04, 0xda, 0x47, 0x0e, 0x0f, + 0xaa, 0x57, 0x56, 0x1f, 0x82, 0x1b, 0x3f, 0x94, 0xba, 0xca, 0x2e, 0x6d, 0x6f, 0x2b, 0x14, 0x9a, + 0xd8, 0x69, 0xb1, 0x0b, 0x25, 0x81, 0x13, 0x04, 0xd1, 0xef, 0x68, 0xf0, 0xb8, 0x5a, 0xa0, 0x72, + 0x0b, 0x57, 0xc1, 0xbe, 0x70, 0x62, 0x9d, 0x49, 0xe1, 0xe7, 0xce, 0x8e, 0x1c, 0x20, 0xce, 0xeb, + 0x15, 0x7a, 0x06, 0xa6, 0xba, 0x8c, 0x31, 0xb9, 0x9a, 0x36, 0xc1, 0x9d, 0x56, 0x9c, 0x57, 0x03, + 0x1c, 0xc1, 0xa8, 0xf5, 0xd3, 0xf3, 0xac, 0x96, 0x6d, 0x05, 0xb7, 0xec, 0xae, 0x1d, 0x2e, 0x56, + 0x58, 0x90, 0x3d, 0x1b, 0x8e, 0x96, 0x67, 0xb5, 0x9a, 0x0d, 0x5e, 0x8e, 0x13, 0xb5, 0x58, 0x40, + 0xa1, 0xdd, 0x35, 0x3a, 0xa4, 0xd5, 0x77, 0x9c, 0x96, 0xef, 0x31, 0x8b, 0xb8, 0x41, 0x0c, 0xcb, + 0xb1, 0x5d, 0xb2, 0x38, 0x53, 0x3c, 0xa0, 0xb0, 0x99, 0x87, 0x14, 0xe7, 0xd3, 0x43, 0xcb, 0x00, + 0x5b, 0x86, 0xed, 0xb4, 0xef, 0x19, 0xbd, 0xdb, 0xee, 0xe2, 0x2c, 0x13, 0x60, 0xcc, 0xf4, 0xb8, + 0x26, 0x4b, 0xb1, 0x52, 0x83, 0x72, 0x13, 0x95, 0x82, 0x98, 0xf0, 0xcb, 0x02, 0x8b, 0x73, 0x27, + 0xc4, 0x4d, 0x11, 0x42, 0x3e, 0x7c, 0x37, 0x15, 0x12, 0x38, 0x41, 0x10, 0x7d, 0x5d, 0x83, 0xb9, + 0x60, 0x3f, 0x08, 0x49, 0x57, 0xf6, 0xe1, 0xdc, 0x49, 0xf7, 0x81, 0xf9, 0x0a, 0xda, 0x09, 0x22, + 0x38, 0x45, 0x54, 0x3f, 0x28, 0x71, 0xa5, 0x78, 0x80, 0x05, 0xd1, 0xab, 0x70, 0xae, 0x4b, 0xba, + 0x9e, 0xbf, 0xbf, 0x12, 0x5d, 0xa8, 0x15, 0xde, 0x0d, 0x66, 0x24, 0xac, 0x25, 0x41, 0x38, 0x5d, + 0x97, 0x6e, 0x10, 0x6c, 0xba, 0xae, 0xb5, 0xe3, 0xf6, 0xa5, 0x78, 0x83, 0x68, 0xa6, 0x60, 0x78, + 0xa0, 0x36, 0xaa, 0xc3, 0x82, 0x28, 0x6b, 0x52, 0x95, 0x2b, 0xb8, 0xe6, 0x93, 0xc8, 0xdf, 0x4f, + 0x55, 0x89, 0x85, 0x66, 0x1a, 0x88, 0x07, 0xeb, 0xd3, 0xaf, 0xa0, 0x3f, 0xd4, 0x5e, 0x8c, 0xc7, + 0x5f, 0xb1, 0x9e, 0x04, 0xe1, 0x74, 0xdd, 0x48, 0x39, 0x4c, 0x74, 0x61, 0x22, 0xfe, 0x8a, 0xf5, + 0x14, 0x0c, 0x0f, 0xd4, 0xd6, 0xff, 0xfb, 0x38, 0x7c, 0x78, 0x08, 0xb1, 0x8d, 0xba, 0xd9, 0xc3, + 0xfd, 0x90, 0x45, 0xb4, 0x1c, 0x1d, 0x07, 0x2f, 0xbf, 0xd1, 0x37, 0xdc, 0xd0, 0x0e, 0xf7, 0x87, + 0x9c, 0x9e, 0x5e, 0xce, 0xf4, 0x1c, 0x9f, 0xde, 0xb0, 0xd3, 0x19, 0xe4, 0x4d, 0xe7, 0xf1, 0x49, + 0x0e, 0x3f, 0xfd, 0xdd, 0xec, 0xe9, 0x2f, 0x38, 0xaa, 0x0f, 0x65, 0x97, 0x5e, 0x0e, 0xbb, 0x14, + 0x1c, 0xd5, 0x21, 0xd8, 0xeb, 0x4f, 0xc6, 0xe1, 0x23, 0xc3, 0x6c, 0x21, 0x05, 0xf9, 0x2b, 0x43, + 0x48, 0x9f, 0x2a, 0x7f, 0xe5, 0x1d, 0xc4, 0x9f, 0x22, 0x7f, 0x65, 0x90, 0x3c, 0x6d, 0xfe, 0xca, + 0x1b, 0xd5, 0xd3, 0xe2, 0xaf, 0xbc, 0x51, 0x1d, 0x82, 0xbf, 0xfe, 0x34, 0xbd, 0x3f, 0xc8, 0x1d, + 0xac, 0x09, 0x63, 0x66, 0xaf, 0x5f, 0x50, 0x48, 0xb1, 0x93, 0xa6, 0x7a, 0x6b, 0x03, 0x53, 0x1c, + 0x08, 0xc3, 0x24, 0xe7, 0x9f, 0x82, 0x22, 0x88, 0x05, 0x51, 0x70, 0x96, 0xc4, 0x02, 0x13, 0x1d, + 0x2a, 0xd2, 0xdb, 0x26, 0x5d, 0xe2, 0x1b, 0x4e, 0x3b, 0xf4, 0x7c, 0xa3, 0x53, 0x54, 0xda, 0xb0, + 0xa1, 0x5a, 0x4d, 0xe1, 0xc2, 0x03, 0xd8, 0xe9, 0x80, 0xf4, 0x6c, 0xab, 0xa0, 0x7c, 0x61, 0x03, + 0xd2, 0x6a, 0x36, 0x30, 0xc5, 0xa1, 0xff, 0x61, 0x19, 0x94, 0x68, 0x73, 0x6a, 0xa9, 0x18, 0x8e, + 0xe3, 0xdd, 0x6b, 0xf9, 0xf6, 0xae, 0xed, 0x90, 0x0e, 0xb1, 0x64, 0x38, 0x72, 0x20, 0xce, 0x23, + 0x99, 0xea, 0xb4, 0x92, 0x57, 0x09, 0xe7, 0xb7, 0xa7, 0x96, 0xe8, 0x82, 0x99, 0xbe, 0xb4, 0x32, + 0xca, 0x99, 0xca, 0xc0, 0x0d, 0x18, 0xbe, 0x9e, 0x06, 0x8a, 0xf1, 0x20, 0x59, 0xf4, 0x55, 0x8d, + 0x9b, 0xd8, 0xd2, 0x47, 0x27, 0xe6, 0xec, 0xfa, 0x09, 0xb9, 0x84, 0x63, 0x5b, 0x3d, 0xf6, 0x02, + 0x26, 0x09, 0x52, 0x5b, 0xe8, 0xe2, 0x4e, 0x96, 0xb7, 0x4d, 0xcc, 0xec, 0xed, 0xa2, 0x5d, 0xc9, + 0x71, 0xdf, 0xf1, 0xf3, 0xbb, 0xcc, 0x0a, 0x38, 0xbb, 0x23, 0x72, 0x94, 0xa4, 0xb3, 0x44, 0x08, + 0x81, 0xc2, 0xa3, 0x94, 0xf2, 0xba, 0xc4, 0xa3, 0x24, 0x01, 0x38, 0x49, 0x10, 0xf5, 0x60, 0x7a, + 0x27, 0x72, 0x3d, 0x09, 0x8b, 0xb6, 0x5e, 0x94, 0xba, 0xe2, 0xbf, 0xe2, 0xe7, 0x84, 0xb2, 0x10, + 0xc7, 0x44, 0xd0, 0x36, 0x4c, 0xed, 0x70, 0x41, 0x24, 0x2c, 0xd1, 0x95, 0x91, 0x35, 0x65, 0x6e, + 0x10, 0x89, 0x22, 0x1c, 0xa1, 0x57, 0xe3, 0x04, 0xca, 0x0f, 0x09, 0x0f, 0xf9, 0x75, 0x0d, 0x2e, + 0xee, 0x12, 0x3f, 0xb4, 0xcd, 0xb4, 0xaf, 0x73, 0xba, 0xb8, 0x36, 0x7f, 0x37, 0x0b, 0x21, 0x67, + 0x93, 0x4c, 0x10, 0xce, 0xee, 0x82, 0xfe, 0x53, 0x0d, 0x06, 0xbc, 0x3f, 0xe8, 0x97, 0x35, 0x98, + 0xd9, 0x22, 0x46, 0xd8, 0xf7, 0xc9, 0x75, 0x23, 0x94, 0x21, 0x8b, 0x77, 0x4f, 0xc2, 0xe9, 0xb4, + 0x7c, 0x4d, 0x41, 0xcc, 0xcf, 0x5b, 0xe4, 0xcd, 0x48, 0x15, 0x84, 0x13, 0x3d, 0x58, 0x7a, 0x0d, + 0x16, 0x06, 0x1a, 0x1e, 0xcb, 0xb3, 0xff, 0xef, 0x85, 0xf3, 0x30, 0x9d, 0x0e, 0xeb, 0x6d, 0x98, + 0x30, 0x2c, 0x4b, 0x26, 0xdb, 0x78, 0xa9, 0xd8, 0xb9, 0xa2, 0xa5, 0x46, 0x86, 0xb2, 0x9f, 0x98, + 0xa3, 0x45, 0xd7, 0x00, 0x19, 0x89, 0x23, 0xb4, 0x35, 0xcf, 0x8a, 0xac, 0x24, 0xe6, 0xc8, 0x5d, + 0x19, 0x80, 0xe2, 0x8c, 0x16, 0xfa, 0x2b, 0x30, 0x97, 0xbc, 0x73, 0x74, 0x8c, 0x08, 0x25, 0xfd, + 0xaf, 0x6b, 0x80, 0x06, 0x2f, 0xe2, 0x22, 0x1f, 0xca, 0xa2, 0x46, 0x34, 0xc5, 0x85, 0xfc, 0x8a, + 0xe9, 0xd8, 0xa9, 0x38, 0x34, 0x57, 0x14, 0x04, 0x58, 0xd2, 0xd1, 0xff, 0x4c, 0x83, 0xf8, 0x36, + 0x3f, 0xfa, 0x34, 0x54, 0x2c, 0x12, 0x98, 0xbe, 0xdd, 0x0b, 0xe3, 0xef, 0x90, 0x97, 0x28, 0x1b, + 0x31, 0x08, 0xab, 0xf5, 0x90, 0x0e, 0x93, 0xa1, 0x11, 0xec, 0x34, 0x1b, 0xc2, 0x5c, 0x64, 0x9b, + 0xfb, 0x1d, 0x56, 0x82, 0x05, 0x24, 0xbe, 0xbf, 0x33, 0x36, 0xc4, 0xfd, 0x1d, 0xb4, 0x75, 0x02, + 0x97, 0x95, 0xd0, 0xc3, 0x2f, 0x2a, 0xe9, 0x7f, 0x5c, 0x82, 0x64, 0x02, 0x85, 0xa2, 0x43, 0x30, + 0x78, 0xbb, 0xaa, 0x74, 0x6a, 0xb7, 0xab, 0x3e, 0xce, 0xb2, 0x0f, 0xf1, 0x74, 0x71, 0xfc, 0xd8, + 0x43, 0xcd, 0x19, 0xc4, 0x93, 0xbd, 0xc9, 0x1a, 0xe8, 0x25, 0x16, 0x4f, 0x14, 0x46, 0x46, 0xf4, + 0x87, 0xa3, 0x65, 0xd1, 0xa6, 0x85, 0x0f, 0xc4, 0xfd, 0x31, 0xf9, 0xfd, 0xac, 0x14, 0xf3, 0x16, + 0xe8, 0xd3, 0x22, 0xfc, 0x6c, 0x22, 0x71, 0xc7, 0x2d, 0xba, 0x18, 0xb7, 0x90, 0x68, 0x18, 0xc7, + 0xa4, 0xe9, 0x7f, 0x4f, 0x83, 0x29, 0x71, 0xab, 0x7a, 0x88, 0x08, 0xb6, 0x2d, 0x98, 0x60, 0x4a, + 0xfa, 0x28, 0xfa, 0x4b, 0x7b, 0xdb, 0xf3, 0xc2, 0xc4, 0xdd, 0x72, 0x16, 0x36, 0xc5, 0xfe, 0xc5, + 0x1c, 0xbd, 0xfe, 0xad, 0x71, 0xb8, 0x22, 0xaa, 0x0c, 0x6c, 0xcf, 0x72, 0x09, 0xee, 0xc3, 0x79, + 0x31, 0x4b, 0x0d, 0xdf, 0xb0, 0xe5, 0xc1, 0x50, 0x31, 0xb3, 0x4b, 0x1c, 0x19, 0x0e, 0xa0, 0xc3, + 0x59, 0x34, 0xd0, 0xcf, 0xc3, 0x05, 0x51, 0x7c, 0x83, 0x18, 0x4e, 0xb8, 0x1d, 0xd1, 0x2e, 0x66, + 0x82, 0xb1, 0x53, 0xea, 0xb5, 0x0c, 0x7c, 0x38, 0x93, 0x0a, 0x8b, 0xb2, 0x12, 0x80, 0xba, 0x4f, + 0x0c, 0xf5, 0x54, 0x6c, 0x84, 0x28, 0xab, 0xb5, 0x4c, 0x8c, 0x38, 0x87, 0x12, 0xf3, 0x5f, 0x19, + 0x7b, 0xcc, 0x1c, 0xc6, 0x24, 0xf4, 0x6d, 0x76, 0xdb, 0x9f, 0xf2, 0x37, 0x37, 0x60, 0x93, 0x20, + 0x9c, 0xae, 0x8b, 0x5e, 0x86, 0x39, 0x76, 0xd0, 0x17, 0x5f, 0x5a, 0x99, 0x88, 0xb3, 0x07, 0xae, + 0x27, 0x20, 0x38, 0x55, 0x53, 0xff, 0x2d, 0x0d, 0x66, 0x54, 0x06, 0x1a, 0x22, 0xe2, 0xb5, 0xaf, + 0x88, 0xeb, 0x11, 0x02, 0x07, 0x55, 0xaa, 0xc3, 0x48, 0xec, 0x07, 0x1a, 0x9c, 0xcf, 0x68, 0xc3, + 0x8e, 0xa7, 0x48, 0x4a, 0xf4, 0x8f, 0x72, 0x3c, 0x35, 0xb0, 0x8d, 0xc8, 0xe3, 0xa9, 0x34, 0x04, + 0x0f, 0xd0, 0x45, 0x77, 0x61, 0xcc, 0xf4, 0x6d, 0x31, 0x2c, 0x2f, 0x16, 0x32, 0x49, 0x70, 0x33, + 0x0e, 0x23, 0xae, 0xe3, 0x26, 0xa6, 0x08, 0xf5, 0x7f, 0x35, 0x06, 0x15, 0x25, 0x61, 0x03, 0x5a, + 0x1b, 0xc5, 0xa2, 0x8d, 0xd1, 0x47, 0x56, 0xed, 0x1a, 0x8c, 0x75, 0x7a, 0xfd, 0x82, 0x26, 0xad, + 0x44, 0x77, 0x9d, 0xa2, 0xeb, 0xf4, 0xfa, 0xe8, 0xae, 0x34, 0x92, 0x8b, 0x99, 0xb1, 0x32, 0x96, + 0x2e, 0x65, 0x28, 0x47, 0xbc, 0x39, 0x9e, 0xcb, 0x9b, 0x5d, 0x98, 0x0a, 0x84, 0x05, 0x3d, 0x51, + 0x3c, 0x59, 0x88, 0x32, 0xd2, 0xc2, 0x62, 0xe6, 0xea, 0x77, 0x64, 0x50, 0x47, 0x34, 0xa8, 0x02, + 0xd0, 0x67, 0xb1, 0xbf, 0xcc, 0xae, 0x28, 0x73, 0x05, 0x60, 0x83, 0x95, 0x60, 0x01, 0xd1, 0xff, + 0xa5, 0x06, 0x68, 0x10, 0x21, 0xfa, 0x30, 0x4c, 0xb0, 0x10, 0x68, 0xb1, 0xd0, 0x94, 0x7b, 0xe2, + 0x46, 0x10, 0x60, 0x0e, 0x43, 0x6f, 0x8a, 0xf8, 0xf6, 0x62, 0x13, 0x23, 0x77, 0x6f, 0x41, 0x53, + 0x09, 0x88, 0x8f, 0xb6, 0xa7, 0xb1, 0xbc, 0xed, 0x49, 0xff, 0x93, 0x12, 0xe5, 0x38, 0xdb, 0x0d, + 0x89, 0x6b, 0xb8, 0x26, 0x41, 0xfb, 0x00, 0x46, 0x3f, 0xf4, 0xf8, 0x76, 0x2c, 0x18, 0xaf, 0x59, + 0x6c, 0x70, 0x25, 0xd2, 0x15, 0x89, 0x90, 0x9f, 0x80, 0xc4, 0xbf, 0xb1, 0x42, 0x8c, 0x92, 0x0e, + 0xed, 0x2e, 0x79, 0xd3, 0x76, 0x2d, 0xef, 0x9e, 0x18, 0x8b, 0x51, 0x49, 0xdf, 0x91, 0x08, 0x39, + 0xe9, 0xf8, 0x37, 0x56, 0x88, 0xa1, 0x2f, 0xc0, 0x22, 0x4b, 0x3f, 0xea, 0xb2, 0xc4, 0x35, 0xa2, + 0x6f, 0x9e, 0xe3, 0x44, 0xfb, 0x43, 0xb9, 0xf6, 0xd4, 0xe1, 0x41, 0x75, 0xb1, 0x9e, 0x53, 0x07, + 0xe7, 0xb6, 0xd6, 0x7f, 0x47, 0x83, 0x8b, 0x99, 0x43, 0x81, 0xae, 0xc3, 0x42, 0x7c, 0xec, 0xad, + 0x0a, 0xb4, 0x72, 0x9c, 0x87, 0xe9, 0x66, 0xba, 0x02, 0x1e, 0x6c, 0x83, 0xd6, 0xe4, 0xa6, 0xae, + 0x0a, 0x4c, 0x71, 0x66, 0xfe, 0xa4, 0x40, 0x95, 0x25, 0x53, 0x71, 0x56, 0x3b, 0xfd, 0xe7, 0x12, + 0x1d, 0x8e, 0x07, 0x8c, 0xb2, 0xf2, 0x26, 0xe9, 0xc8, 0x48, 0x58, 0xc9, 0xca, 0x35, 0x5a, 0x88, + 0x39, 0x0c, 0x3d, 0xad, 0x46, 0x6f, 0x4b, 0x91, 0x11, 0x45, 0x70, 0xeb, 0x21, 0xc0, 0x9a, 0xe7, + 0xda, 0xa1, 0xe7, 0xdb, 0x6e, 0x07, 0x6d, 0x41, 0xd9, 0x10, 0xb9, 0x71, 0x05, 0xab, 0x7d, 0xb6, + 0x90, 0x41, 0x24, 0x70, 0xf0, 0x48, 0xad, 0xe8, 0x17, 0x96, 0xb8, 0xf5, 0x7f, 0xaa, 0xc1, 0x25, + 0x2a, 0x3d, 0xac, 0xe8, 0x62, 0x98, 0xbc, 0x40, 0x3a, 0xc4, 0x3e, 0xd8, 0x85, 0x8a, 0x1f, 0x37, + 0x13, 0x7c, 0xf9, 0xb3, 0xea, 0xe5, 0x54, 0x25, 0x51, 0x36, 0xd5, 0x11, 0xea, 0xbe, 0x17, 0x44, + 0x93, 0x93, 0xbe, 0xaf, 0x2a, 0xd7, 0xaa, 0xd2, 0x13, 0xac, 0xe2, 0xd7, 0xbf, 0x56, 0x02, 0x58, + 0x27, 0xe1, 0x3d, 0xcf, 0xdf, 0xa1, 0x43, 0xf4, 0x81, 0xba, 0x22, 0xf1, 0x14, 0x8c, 0xf7, 0x3c, + 0x2b, 0x10, 0xe2, 0x84, 0xdd, 0xd2, 0x61, 0x07, 0xb7, 0xac, 0x14, 0x55, 0x61, 0x82, 0x79, 0x69, + 0x85, 0xdc, 0x66, 0x2a, 0x2a, 0x55, 0x4b, 0x02, 0xcc, 0xcb, 0x79, 0xa6, 0x39, 0x16, 0x42, 0x18, + 0x08, 0x9d, 0x5b, 0x64, 0x9a, 0xe3, 0x65, 0x58, 0x42, 0xf5, 0xaf, 0x8d, 0x43, 0x22, 0xb9, 0x73, + 0x6c, 0x37, 0x6b, 0xa7, 0x63, 0x37, 0x7f, 0x01, 0x16, 0x1d, 0xcf, 0xb0, 0x6a, 0x86, 0x43, 0x99, + 0xde, 0x6f, 0xf3, 0xe9, 0x30, 0xdc, 0x8e, 0xcc, 0x1c, 0xcc, 0x04, 0xc0, 0xad, 0x9c, 0x3a, 0x38, + 0xb7, 0x35, 0x0a, 0x65, 0x4a, 0x69, 0x9e, 0x57, 0xea, 0xd6, 0xa8, 0xa9, 0xaf, 0x97, 0xd5, 0xe0, + 0x51, 0xb9, 0x85, 0x26, 0xb3, 0x4e, 0xa3, 0x5f, 0xd0, 0xe0, 0x22, 0xd9, 0x0b, 0x89, 0xef, 0x1a, + 0xce, 0x1d, 0xdf, 0xd8, 0xda, 0xb2, 0x4d, 0x11, 0x12, 0xc3, 0x27, 0xa7, 0x75, 0x78, 0x50, 0xbd, + 0xb8, 0x9a, 0x55, 0xe1, 0xc1, 0x41, 0xf5, 0x93, 0x83, 0x99, 0xdd, 0xa3, 0x58, 0xd1, 0xcc, 0x26, + 0x8c, 0x19, 0xb3, 0xc9, 0x2d, 0xbd, 0x04, 0x95, 0x63, 0x44, 0x47, 0x4e, 0xab, 0x3e, 0x94, 0x7f, + 0x30, 0x09, 0x4a, 0x9c, 0xee, 0x31, 0xb2, 0x89, 0xfd, 0x23, 0x0d, 0x2e, 0x98, 0x8e, 0x4d, 0xdc, + 0x30, 0x15, 0x8e, 0xcc, 0x17, 0xc6, 0x46, 0xa1, 0x00, 0xe2, 0x1e, 0x71, 0x9b, 0x8d, 0xba, 0xe7, + 0xba, 0xc4, 0x0c, 0xeb, 0x19, 0xc8, 0xb9, 0x49, 0x92, 0x05, 0xc1, 0x99, 0x9d, 0x61, 0xdf, 0xc3, + 0xca, 0x9b, 0x0d, 0xf5, 0x32, 0x4b, 0x5d, 0x94, 0x61, 0x09, 0x45, 0xcf, 0x43, 0xa5, 0xe3, 0x7b, + 0xfd, 0x5e, 0x50, 0x67, 0xd1, 0x3a, 0x7c, 0x06, 0x59, 0x30, 0xd4, 0xf5, 0xb8, 0x18, 0xab, 0x75, + 0xd0, 0xa7, 0x60, 0x86, 0xff, 0x6c, 0xf9, 0x64, 0xcb, 0xde, 0x13, 0xcb, 0x8d, 0x85, 0x00, 0x5c, + 0x57, 0xca, 0x71, 0xa2, 0x16, 0xfa, 0x18, 0x4c, 0xdb, 0x41, 0xd0, 0x27, 0xfe, 0x06, 0xbe, 0x25, + 0x32, 0x96, 0x30, 0xef, 0x67, 0x33, 0x2a, 0xc4, 0x31, 0x1c, 0xfd, 0x8a, 0x06, 0x73, 0x3e, 0x79, + 0xb7, 0x6f, 0xfb, 0xc4, 0x62, 0x44, 0x03, 0x11, 0x2c, 0x8d, 0x47, 0x0b, 0xd0, 0x5e, 0xc6, 0x09, + 0xa4, 0x9c, 0xcf, 0xa5, 0xef, 0x20, 0x09, 0xc4, 0xa9, 0x1e, 0xd0, 0xa1, 0x0a, 0xec, 0x8e, 0x6b, + 0xbb, 0x9d, 0x15, 0xa7, 0x13, 0x2c, 0x96, 0xd9, 0xd2, 0x65, 0x43, 0xd5, 0x8e, 0x8b, 0xb1, 0x5a, + 0x07, 0xbd, 0x08, 0xb3, 0xfd, 0x80, 0x72, 0x6e, 0x97, 0xf0, 0xf1, 0x9d, 0x8e, 0x43, 0xe8, 0x36, + 0x54, 0x00, 0x4e, 0xd6, 0xa3, 0xf6, 0x58, 0x54, 0x20, 0x46, 0x19, 0xf8, 0xfd, 0x44, 0xda, 0xcf, + 0x8d, 0x04, 0x04, 0xa7, 0x6a, 0x2e, 0xad, 0xc0, 0xf9, 0x8c, 0xcf, 0x3c, 0xd6, 0xf2, 0xf8, 0xad, + 0x12, 0x7c, 0xe8, 0xa1, 0x5c, 0x89, 0xfe, 0xa1, 0x06, 0x15, 0xb2, 0x17, 0xfa, 0x86, 0x0c, 0xe8, + 0xa3, 0x53, 0xb4, 0x75, 0x2a, 0x4b, 0x60, 0x79, 0x35, 0x26, 0xc4, 0xa7, 0x4d, 0x6e, 0x77, 0x0a, + 0x04, 0xab, 0xfd, 0xa1, 0xaa, 0x35, 0xbf, 0xbd, 0xaa, 0xfa, 0xd6, 0x44, 0x0e, 0x5c, 0x01, 0x59, + 0xfa, 0x1c, 0xcc, 0xa7, 0x31, 0x1f, 0x6b, 0xa4, 0xfe, 0x45, 0x09, 0x26, 0x5a, 0x8e, 0xe1, 0x9e, + 0x45, 0x8e, 0xf5, 0xbf, 0x9c, 0x48, 0x7d, 0x50, 0x28, 0x9f, 0x04, 0xeb, 0x6a, 0x6e, 0x5a, 0x94, + 0x4e, 0x2a, 0x2d, 0xca, 0x6b, 0xc5, 0x49, 0x1c, 0x9d, 0x05, 0xe5, 0x8f, 0x34, 0x98, 0x66, 0xf5, + 0xce, 0x20, 0x83, 0xc2, 0xdb, 0xc9, 0x0c, 0x0a, 0x2f, 0x15, 0xfe, 0xa6, 0x9c, 0x84, 0x09, 0x3f, + 0x8a, 0xbe, 0x85, 0xe5, 0x47, 0xf8, 0xa2, 0x9a, 0xfb, 0x9b, 0x7f, 0xcc, 0xb3, 0x59, 0xc9, 0x46, + 0x6e, 0x79, 0xa6, 0xe1, 0xa4, 0x35, 0xb8, 0xa3, 0x13, 0x80, 0x77, 0x61, 0x9a, 0x88, 0x4b, 0xc5, + 0xd1, 0xc7, 0x14, 0x52, 0x69, 0xa3, 0x9b, 0xc9, 0x31, 0xb9, 0xa8, 0x24, 0xc0, 0x31, 0x05, 0xfd, + 0xdf, 0x95, 0xa0, 0xa2, 0xcc, 0xe5, 0xfb, 0x91, 0xd3, 0xe4, 0x5a, 0x66, 0x5a, 0xdc, 0x12, 0x8b, + 0xd8, 0xbb, 0x74, 0x8c, 0xd4, 0xda, 0x3e, 0x54, 0xcc, 0x38, 0x3d, 0xdb, 0x28, 0xcc, 0xad, 0x64, + 0x79, 0x13, 0x21, 0xc3, 0x71, 0x01, 0x56, 0x89, 0xe8, 0xff, 0xba, 0x04, 0x53, 0x2d, 0xdf, 0xa3, + 0x13, 0x7c, 0x06, 0xa2, 0xc1, 0x48, 0x88, 0x86, 0x62, 0xeb, 0x96, 0x77, 0x36, 0x57, 0x38, 0xd8, + 0x29, 0xe1, 0xb0, 0x32, 0x0a, 0x91, 0xa3, 0xc5, 0xc3, 0x7f, 0xd2, 0xa0, 0x22, 0x6a, 0x9e, 0x81, + 0x80, 0xf8, 0x52, 0x52, 0x40, 0xbc, 0x32, 0xc2, 0x77, 0xe5, 0x88, 0x88, 0x5f, 0xd7, 0x60, 0x56, + 0xd4, 0x58, 0x23, 0xdd, 0x4d, 0xe2, 0xa3, 0x6b, 0x30, 0x15, 0xf4, 0xd9, 0x44, 0x8a, 0x0f, 0x7a, + 0x52, 0x15, 0x12, 0xfe, 0xa6, 0x61, 0xb2, 0x0c, 0xef, 0xbc, 0x8a, 0x92, 0x89, 0x88, 0x17, 0xe0, + 0xa8, 0x31, 0x35, 0xe1, 0x7c, 0xcf, 0x19, 0xb8, 0x06, 0x8e, 0x3d, 0x87, 0x60, 0x06, 0xa1, 0x96, + 0x13, 0xfd, 0x1b, 0x1d, 0x1e, 0x31, 0xcb, 0x89, 0x82, 0x03, 0xcc, 0xcb, 0xf5, 0xaf, 0x8f, 0xcb, + 0xc1, 0x66, 0x12, 0xec, 0x06, 0x4c, 0x9b, 0x3e, 0x31, 0x42, 0x62, 0xd5, 0xf6, 0x87, 0xe9, 0x1c, + 0xd3, 0xe2, 0xea, 0x51, 0x0b, 0x1c, 0x37, 0xa6, 0x0a, 0x93, 0x7a, 0x1e, 0x54, 0x8a, 0x75, 0xcb, + 0xdc, 0xb3, 0xa0, 0xcf, 0xc2, 0x84, 0x77, 0xcf, 0x95, 0x81, 0x10, 0x47, 0x12, 0x66, 0x9f, 0x72, + 0x9b, 0xd6, 0xc6, 0xbc, 0x11, 0xcb, 0x7b, 0x21, 0x32, 0x25, 0x70, 0x45, 0xb6, 0x92, 0x95, 0x25, + 0x01, 0x39, 0x30, 0xd5, 0x65, 0xd3, 0xc0, 0xbd, 0xdc, 0xa3, 0xb1, 0x32, 0x9f, 0x50, 0x35, 0xfb, + 0x1e, 0xc3, 0x8c, 0x23, 0x12, 0x54, 0xf1, 0xa5, 0xca, 0x59, 0xd0, 0x33, 0x4c, 0xa2, 0x2a, 0xbe, + 0xeb, 0x51, 0x21, 0x8e, 0xe1, 0x68, 0x1f, 0x2a, 0xfc, 0xae, 0x30, 0x97, 0xb2, 0x53, 0xc5, 0x1d, + 0x90, 0xa2, 0x7b, 0x77, 0x62, 0x6c, 0x7c, 0xe8, 0x95, 0x02, 0xac, 0xd2, 0xd2, 0x7f, 0x69, 0x4c, + 0x32, 0xa9, 0x90, 0xf8, 0xd9, 0x59, 0xc9, 0xb5, 0x42, 0xaf, 0x1b, 0x7c, 0x12, 0x26, 0x7a, 0xdb, + 0x46, 0x10, 0x71, 0x6a, 0x94, 0x29, 0x72, 0xa2, 0x45, 0x0b, 0x1f, 0x1c, 0x54, 0x67, 0x04, 0x69, + 0xf6, 0x1b, 0xf3, 0xba, 0xa8, 0x0f, 0xe7, 0x83, 0xd0, 0x70, 0x48, 0xdb, 0x16, 0xde, 0xa2, 0x20, + 0x34, 0xba, 0xbd, 0x02, 0x09, 0x1f, 0xd9, 0x71, 0x52, 0x7b, 0x10, 0x15, 0xce, 0xc2, 0x8f, 0xfe, + 0x9a, 0x06, 0x8b, 0xac, 0x7c, 0xa5, 0x1f, 0x7a, 0x3c, 0x87, 0x6b, 0x4c, 0xfc, 0xf8, 0x87, 0xa9, + 0xcc, 0xba, 0x6f, 0xe7, 0xe0, 0xc3, 0xb9, 0x94, 0xf4, 0x3f, 0xd5, 0x00, 0x0d, 0xce, 0x22, 0x72, + 0xa0, 0x6c, 0x91, 0x2d, 0xa3, 0xef, 0x84, 0xd1, 0x2e, 0x5c, 0xe8, 0xd6, 0x6a, 0x8c, 0x32, 0x16, + 0x8e, 0x0d, 0x81, 0x17, 0x4b, 0x0a, 0xc8, 0x83, 0xe9, 0x7b, 0xdb, 0x76, 0x48, 0x1c, 0x3b, 0x08, + 0x85, 0x80, 0x1c, 0x95, 0x9c, 0x54, 0x3b, 0xde, 0x8c, 0x10, 0xe3, 0x98, 0x86, 0xfe, 0x8b, 0x63, + 0x50, 0x3e, 0xc6, 0x5b, 0x34, 0x7d, 0x40, 0xe2, 0xba, 0x3a, 0xd5, 0x55, 0xc8, 0x28, 0x5e, 0x2a, + 0xa6, 0x51, 0xd4, 0x07, 0x90, 0xe1, 0x0c, 0x02, 0xe8, 0xcb, 0x70, 0xc1, 0x76, 0xb7, 0x7c, 0x23, + 0x08, 0xfd, 0xbe, 0x19, 0xf6, 0xfd, 0x88, 0xf0, 0x58, 0x11, 0xc2, 0xcc, 0xba, 0x6f, 0x66, 0xa0, + 0xc3, 0x99, 0x44, 0x10, 0x81, 0xa9, 0x7b, 0x9e, 0xbf, 0x43, 0xe5, 0xd7, 0x78, 0xf1, 0x84, 0xd7, + 0x6f, 0x32, 0x14, 0xb1, 0xe0, 0xe2, 0xbf, 0x03, 0x1c, 0xe1, 0xd6, 0x7f, 0xa0, 0xc1, 0x04, 0xbf, + 0xfe, 0xf4, 0x48, 0x98, 0x36, 0xac, 0xab, 0xb9, 0x49, 0xdc, 0xa8, 0xc5, 0xc1, 0x6a, 0x3c, 0x22, + 0x16, 0x07, 0xeb, 0x6b, 0x8e, 0x3a, 0xf1, 0x83, 0x31, 0xf1, 0x2d, 0x6c, 0xbf, 0x6e, 0xc2, 0x79, + 0xa1, 0x77, 0xde, 0xb2, 0xb7, 0x08, 0xe5, 0xae, 0x86, 0xb1, 0x1f, 0x88, 0xbb, 0xbc, 0x4c, 0xf0, + 0xd5, 0x07, 0xc1, 0x38, 0xab, 0x0d, 0xfa, 0xb7, 0x1a, 0xdd, 0x19, 0x43, 0xdf, 0x36, 0x47, 0xca, + 0x37, 0x27, 0xfb, 0xb6, 0xbc, 0xc6, 0x91, 0x71, 0x83, 0x7d, 0x23, 0xde, 0x22, 0x59, 0xe9, 0x83, + 0x83, 0x6a, 0x35, 0xc3, 0x1b, 0x18, 0x79, 0xaf, 0xe9, 0xc0, 0x7e, 0xed, 0xc7, 0x47, 0x56, 0x61, + 0x9e, 0xf4, 0xa8, 0xc7, 0xe8, 0x06, 0x4c, 0x04, 0xa6, 0xd7, 0x23, 0x47, 0x3d, 0xb9, 0x94, 0xb6, + 0xb8, 0xe4, 0x00, 0xb7, 0x69, 0x4b, 0xcc, 0x11, 0x2c, 0xbd, 0x03, 0x33, 0x6a, 0xcf, 0x33, 0x1c, + 0x02, 0x0d, 0xd5, 0x21, 0x70, 0xec, 0x63, 0x35, 0xd5, 0x81, 0xf0, 0xfb, 0x25, 0x10, 0xaf, 0x54, + 0x0c, 0x71, 0x5e, 0x60, 0x47, 0x39, 0xb6, 0x46, 0x78, 0x99, 0x23, 0xfd, 0xf4, 0x5d, 0x3c, 0x06, + 0x6a, 0x9a, 0x2d, 0xe4, 0xc2, 0xa4, 0x63, 0x6c, 0x12, 0x27, 0x7a, 0xb3, 0xe0, 0x5a, 0xf1, 0xa4, + 0xfa, 0x3c, 0x17, 0x6d, 0x90, 0xf2, 0x2a, 0xf3, 0x42, 0x2c, 0xa8, 0x2c, 0xbd, 0x04, 0x15, 0xa5, + 0xda, 0xb1, 0x7c, 0x30, 0xdf, 0xd4, 0xe0, 0x52, 0xc4, 0x12, 0xc9, 0xeb, 0xfc, 0xe8, 0x59, 0x28, + 0x1b, 0x3d, 0x9b, 0xb9, 0x25, 0x55, 0xc7, 0xee, 0x4a, 0xab, 0xc9, 0xca, 0xb0, 0x84, 0xa2, 0x8f, + 0x43, 0x39, 0x9a, 0x27, 0xa1, 0xa3, 0xc8, 0x25, 0x2e, 0xcf, 0x53, 0x64, 0x0d, 0xf4, 0x8c, 0x92, + 0x35, 0x6c, 0x22, 0xde, 0xd1, 0x24, 0x61, 0x7e, 0x46, 0xaa, 0xff, 0x6a, 0x09, 0x66, 0xb9, 0x2d, + 0x5f, 0xb3, 0x5d, 0xcb, 0x76, 0x3b, 0x67, 0x20, 0x4a, 0x13, 0xaf, 0x8f, 0x95, 0x4e, 0xea, 0xf5, + 0xb1, 0x9b, 0x30, 0xf9, 0x2e, 0x5d, 0xd6, 0x11, 0x3b, 0x0c, 0xb5, 0xba, 0xe4, 0x5c, 0x33, 0x89, + 0x10, 0x60, 0x81, 0x42, 0xff, 0xaf, 0x1a, 0x2c, 0x24, 0x86, 0xe5, 0x0c, 0x84, 0xf2, 0x56, 0x52, + 0x28, 0xaf, 0x14, 0x4b, 0x6a, 0xa1, 0xf4, 0x39, 0x47, 0x38, 0xff, 0x6e, 0x09, 0xc6, 0xdb, 0x84, + 0x58, 0x67, 0x30, 0xd3, 0x6f, 0x27, 0x36, 0xcd, 0xcf, 0x16, 0x7e, 0x89, 0x22, 0xcf, 0xe2, 0xdf, + 0x4a, 0x59, 0xfc, 0x9f, 0x2b, 0x4c, 0xe1, 0x68, 0x73, 0xff, 0x37, 0x4a, 0x00, 0xb4, 0x1a, 0x7f, + 0xff, 0x49, 0xc4, 0xe8, 0xc5, 0x2f, 0x04, 0x4e, 0x7f, 0x50, 0xde, 0xf5, 0xd3, 0xe5, 0x2b, 0x43, + 0x63, 0xb1, 0x3f, 0x39, 0xf9, 0xc2, 0x50, 0x72, 0xf5, 0x8d, 0x9f, 0xd0, 0xea, 0xd3, 0xff, 0xb9, + 0x06, 0x2c, 0x0b, 0x71, 0x63, 0xbd, 0x8d, 0x5e, 0x84, 0x59, 0x9b, 0x9f, 0xd6, 0x35, 0xd4, 0xe4, + 0x51, 0xec, 0x4c, 0xa1, 0xa9, 0x02, 0x70, 0xb2, 0x1e, 0xea, 0x2a, 0xe3, 0x3a, 0xc2, 0x2b, 0x6c, + 0xa2, 0x1f, 0x32, 0xd7, 0xe6, 0x4c, 0xf6, 0xc4, 0xe8, 0x3f, 0x2e, 0xc1, 0xb9, 0x54, 0xdd, 0x21, + 0xf4, 0xf9, 0xd3, 0x91, 0x5e, 0x4a, 0xfa, 0xcd, 0xb1, 0xd3, 0x4f, 0xbf, 0x29, 0x33, 0x61, 0x8e, + 0x9f, 0x6e, 0x26, 0xcc, 0xef, 0x69, 0xc0, 0x9e, 0x52, 0x3b, 0x03, 0xe9, 0xf9, 0x97, 0x92, 0xd2, + 0xf3, 0x33, 0x45, 0x19, 0x27, 0x47, 0x68, 0xfe, 0x76, 0x09, 0x58, 0x76, 0x7a, 0x11, 0x9c, 0xa0, + 0x9c, 0xf7, 0x6b, 0x39, 0xe7, 0xfd, 0x57, 0x44, 0xb8, 0x40, 0xca, 0xf1, 0xa5, 0x84, 0x0c, 0x7c, + 0x5c, 0x89, 0x08, 0x18, 0x4b, 0x8a, 0x91, 0xc1, 0xa8, 0x00, 0x74, 0x1f, 0x66, 0x83, 0x6d, 0xcf, + 0x0b, 0x23, 0x13, 0x58, 0xcc, 0xdd, 0x4a, 0xe1, 0x90, 0xda, 0xe8, 0x53, 0xf8, 0xc2, 0x6c, 0xab, + 0xb8, 0x71, 0x92, 0x14, 0x5a, 0x06, 0xd8, 0x74, 0x3c, 0x73, 0xa7, 0xde, 0x6c, 0xe0, 0x28, 0xf0, + 0x92, 0x45, 0x14, 0xd5, 0x64, 0x29, 0x56, 0x6a, 0xe8, 0x7f, 0xa8, 0xf1, 0xd1, 0x3a, 0xc6, 0xb2, + 0x3a, 0x43, 0x29, 0xf9, 0xd1, 0x94, 0x94, 0xcc, 0x7b, 0x8b, 0xed, 0xbb, 0xe2, 0x2b, 0xe4, 0x43, + 0x47, 0x0e, 0xcc, 0x3a, 0xea, 0xa3, 0x05, 0x82, 0x8d, 0x0b, 0xbd, 0x77, 0x20, 0x9e, 0xf7, 0x53, + 0x8a, 0x70, 0x12, 0x39, 0x15, 0xa3, 0x51, 0xc7, 0xd5, 0x47, 0x9c, 0x59, 0xc3, 0x96, 0x0a, 0xc0, + 0xc9, 0x7a, 0xfa, 0x1b, 0xf0, 0x11, 0xde, 0x6d, 0x16, 0xf7, 0xbc, 0xba, 0x67, 0x92, 0x20, 0xa8, + 0x1b, 0x3d, 0xc3, 0xa4, 0x8a, 0x3d, 0xbb, 0x2e, 0xc8, 0x3d, 0x5e, 0xc7, 0x78, 0x68, 0xfd, 0xff, + 0x6b, 0x50, 0x55, 0x70, 0x26, 0x22, 0x41, 0x22, 0x06, 0xfd, 0x96, 0x06, 0x15, 0xc3, 0x75, 0xbd, + 0xd0, 0x50, 0x0f, 0x60, 0xac, 0xe2, 0xcf, 0x4f, 0xe5, 0x92, 0x5a, 0x5e, 0x89, 0xc9, 0xa4, 0x8e, + 0x5a, 0x15, 0x08, 0x56, 0x7b, 0xb3, 0xf4, 0x39, 0x98, 0x4f, 0xb7, 0x3a, 0x96, 0x0a, 0x5f, 0x83, + 0x8b, 0x4a, 0xaf, 0xc4, 0xc5, 0x2b, 0xaa, 0x2f, 0x3f, 0x07, 0x53, 0xbb, 0x76, 0x60, 0x47, 0x17, + 0x78, 0x95, 0x51, 0xbc, 0xcb, 0x8b, 0x71, 0x04, 0xd7, 0x5f, 0x87, 0xf3, 0x2a, 0x0e, 0xb6, 0xc4, + 0xd6, 0xdb, 0xc7, 0x99, 0x87, 0x35, 0xb8, 0xa2, 0x60, 0xc8, 0xbc, 0x7d, 0x74, 0x1c, 0x74, 0x5f, + 0x9d, 0x8c, 0x38, 0x5c, 0x84, 0xc8, 0x7f, 0x57, 0x83, 0x27, 0x48, 0x1e, 0xc3, 0x08, 0x76, 0xff, + 0xc2, 0x88, 0x33, 0x9a, 0xcb, 0x90, 0x22, 0xbd, 0x4b, 0x1e, 0x18, 0xe7, 0xf7, 0x0c, 0xed, 0x03, + 0x04, 0x72, 0x4a, 0x46, 0x89, 0x9e, 0xcc, 0x9c, 0x63, 0x91, 0x5c, 0x53, 0xfe, 0xc6, 0x0a, 0x31, + 0xf4, 0x2e, 0x94, 0x03, 0x31, 0x93, 0xa3, 0x5c, 0x8e, 0xcc, 0x60, 0x0c, 0x11, 0x20, 0x26, 0x7e, + 0x61, 0x49, 0x06, 0xfd, 0xa6, 0x06, 0x17, 0x9c, 0x8c, 0x75, 0x21, 0xb6, 0x84, 0xf6, 0x29, 0x2c, + 0x39, 0xee, 0x02, 0xcc, 0x82, 0xe0, 0xcc, 0xae, 0xa0, 0x7f, 0x9c, 0x7b, 0x13, 0x8f, 0xc7, 0x2c, + 0xdf, 0x19, 0xb1, 0x93, 0x27, 0x75, 0x29, 0xef, 0x9b, 0x53, 0x5c, 0x45, 0x61, 0x9e, 0xaa, 0x4d, + 0x98, 0xdc, 0x64, 0x2a, 0xbe, 0x60, 0xf5, 0xc2, 0xf6, 0x84, 0x78, 0xdc, 0x9a, 0xe9, 0xdf, 0xfc, + 0x7f, 0x2c, 0x30, 0xa3, 0xb7, 0x60, 0xcc, 0x72, 0xa3, 0xb7, 0x2f, 0x5e, 0x19, 0x41, 0xbf, 0x8d, + 0x03, 0x4c, 0x29, 0x77, 0x50, 0xa4, 0xc8, 0x85, 0xb2, 0x2b, 0x76, 0x75, 0xc1, 0x8b, 0x85, 0x5f, + 0xff, 0x93, 0xda, 0x81, 0xd4, 0x49, 0xa2, 0x12, 0x2c, 0x69, 0x50, 0x7a, 0x52, 0x61, 0x1f, 0x1f, + 0x8d, 0xde, 0x50, 0x4f, 0xa4, 0xb7, 0x54, 0xdd, 0xfb, 0x18, 0x0f, 0x4f, 0xcf, 0xe6, 0xea, 0xdd, + 0x04, 0x26, 0x43, 0x83, 0xc5, 0x2b, 0x4c, 0x16, 0x8f, 0x17, 0xa0, 0xfd, 0xbf, 0x43, 0xb1, 0xc4, + 0xaa, 0x04, 0xfb, 0x19, 0x60, 0x81, 0x9c, 0x32, 0x16, 0x7f, 0x98, 0x50, 0x1c, 0x98, 0x15, 0x66, + 0x2c, 0x9e, 0xf5, 0x9d, 0x33, 0x16, 0xff, 0x1f, 0x0b, 0xcc, 0xe8, 0x1d, 0xaa, 0x4e, 0x72, 0x39, + 0x2e, 0xb2, 0x31, 0xbd, 0x3e, 0xe2, 0x1a, 0x0b, 0xa2, 0x10, 0x55, 0xfe, 0x0b, 0x4b, 0xfc, 0x68, + 0x13, 0xa6, 0x84, 0xe9, 0x26, 0x2e, 0xd6, 0xbe, 0x32, 0x42, 0xb6, 0xdf, 0xe8, 0x21, 0x03, 0x7e, + 0xb9, 0x2d, 0x42, 0xac, 0xff, 0x93, 0x32, 0x37, 0xba, 0xc5, 0x59, 0xdf, 0x16, 0x94, 0x23, 0x74, + 0xa3, 0x84, 0x4b, 0x47, 0xb9, 0xcb, 0xf9, 0xa7, 0x45, 0xbf, 0xb0, 0xc4, 0x8d, 0xea, 0x59, 0x91, + 0xe9, 0x71, 0xc6, 0xbc, 0xe1, 0xa2, 0xd2, 0x93, 0xa1, 0x28, 0x63, 0x67, 0x11, 0x8a, 0x72, 0x92, + 0x2f, 0xbd, 0xbf, 0x0a, 0xe7, 0xa2, 0x48, 0x11, 0x8b, 0x30, 0x87, 0xb0, 0x88, 0xa1, 0x64, 0x77, + 0xb5, 0xea, 0x49, 0x10, 0x4e, 0xd7, 0x45, 0xbf, 0xaf, 0x41, 0xd9, 0x14, 0xbb, 0xb4, 0x58, 0x57, + 0xb7, 0x46, 0xf3, 0xcc, 0x2c, 0x47, 0x9b, 0x3e, 0x57, 0xf7, 0xee, 0x46, 0x32, 0x22, 0x2a, 0x3e, + 0x21, 0x4f, 0xbd, 0xec, 0x35, 0xfa, 0x8f, 0x54, 0x99, 0x75, 0x58, 0x46, 0x75, 0x76, 0xf5, 0x85, + 0x07, 0x77, 0xde, 0x1e, 0xf1, 0x2b, 0x56, 0x62, 0x8c, 0xfc, 0x43, 0xbe, 0x28, 0xf5, 0xd6, 0x18, + 0x72, 0x42, 0xdf, 0xa2, 0x76, 0x7f, 0x69, 0x07, 0x66, 0x13, 0x23, 0x78, 0x9a, 0x07, 0x06, 0x4b, + 0x2e, 0xcc, 0xa7, 0x3f, 0xf4, 0x54, 0x0f, 0x28, 0x6e, 0xc2, 0xb4, 0x94, 0xc0, 0xe8, 0x69, 0x85, + 0x50, 0xbc, 0x43, 0xde, 0x24, 0xfb, 0x9c, 0x6a, 0x35, 0xa1, 0xe0, 0x73, 0xb3, 0xfd, 0x2e, 0x2d, + 0x10, 0x08, 0xf5, 0x1f, 0x0a, 0xa3, 0xef, 0x0e, 0xe9, 0xf6, 0x1c, 0x23, 0x24, 0x8f, 0xbe, 0x97, + 0x54, 0xff, 0x5f, 0x1a, 0x17, 0xa4, 0xe2, 0x3d, 0x12, 0x03, 0x2a, 0x5d, 0x9e, 0xeb, 0x8a, 0xe5, + 0x56, 0x2d, 0x76, 0xbd, 0x8e, 0x45, 0x6a, 0xac, 0xc5, 0x68, 0xb0, 0x8a, 0x13, 0xdd, 0x1b, 0x7c, + 0x31, 0xe7, 0xda, 0x68, 0x3b, 0xde, 0xd0, 0x0f, 0xe7, 0xa0, 0xc1, 0x36, 0xea, 0xfb, 0x24, 0xda, + 0xd1, 0xef, 0x93, 0x3c, 0xfc, 0xd5, 0x0a, 0xfd, 0x3b, 0x1a, 0x64, 0x66, 0x88, 0x46, 0x3a, 0x4c, + 0xf2, 0xf8, 0x70, 0xf5, 0x29, 0x21, 0x1e, 0x3c, 0x8e, 0x05, 0x04, 0xf9, 0x70, 0x41, 0x44, 0x5f, + 0xdf, 0x24, 0xfb, 0xf1, 0x23, 0x36, 0x62, 0xea, 0x87, 0x8f, 0xc3, 0x64, 0x39, 0x70, 0xda, 0x29, + 0x4c, 0x38, 0x13, 0x37, 0x0b, 0x00, 0x66, 0x46, 0xc4, 0xa3, 0x71, 0x4a, 0xce, 0xba, 0x7a, 0xba, + 0x01, 0xc0, 0x9c, 0xc4, 0xd1, 0x2e, 0xff, 0x2f, 0xc2, 0x25, 0x56, 0x6d, 0xc5, 0x62, 0x76, 0x43, + 0x40, 0xac, 0x15, 0xcb, 0x62, 0xb7, 0x71, 0x46, 0x7d, 0x2e, 0x87, 0x9d, 0xf4, 0x33, 0xdc, 0x8f, + 0xc8, 0x49, 0x3f, 0xeb, 0x6b, 0x8e, 0x5f, 0xf4, 0x7b, 0x1a, 0x2c, 0x0c, 0x5c, 0xd0, 0x1f, 0xea, + 0x9c, 0xf8, 0xcc, 0xdc, 0x7d, 0xcf, 0xa4, 0x9f, 0x99, 0xa9, 0x64, 0xe6, 0xed, 0x78, 0x13, 0x66, + 0x13, 0x6e, 0x51, 0x79, 0xdf, 0x4b, 0xcb, 0xbc, 0xef, 0xa5, 0x5e, 0xe7, 0x2a, 0x1d, 0x79, 0x9d, + 0xeb, 0x70, 0x46, 0x4c, 0x37, 0x33, 0x31, 0xdf, 0x86, 0x49, 0x76, 0xe9, 0x2a, 0x7a, 0x66, 0xeb, + 0xe5, 0xc2, 0x97, 0xb9, 0x02, 0x2e, 0x61, 0xf8, 0xff, 0x58, 0x60, 0x45, 0x0d, 0x98, 0x67, 0xcf, + 0x2f, 0xb7, 0x7c, 0x6f, 0xcb, 0x76, 0xc8, 0x7a, 0x2c, 0xcc, 0xe4, 0x15, 0xef, 0x7a, 0x0a, 0x8e, + 0x07, 0x5a, 0x20, 0xcc, 0x8d, 0x54, 0xbe, 0xc6, 0x5e, 0x2c, 0x78, 0x3c, 0xc0, 0x93, 0x68, 0x49, + 0xe3, 0xf4, 0x5d, 0x00, 0x12, 0x4d, 0x5c, 0x14, 0x17, 0xf4, 0x6a, 0xb1, 0xcb, 0xeb, 0x72, 0xfa, + 0x23, 0x61, 0x24, 0x8b, 0x02, 0xac, 0x10, 0x41, 0x3e, 0x54, 0xb6, 0xe3, 0x57, 0x78, 0x84, 0xc5, + 0xf8, 0xda, 0x88, 0x2f, 0x00, 0xf1, 0xbd, 0x4f, 0x29, 0xc0, 0x2a, 0x11, 0xe4, 0x27, 0x9e, 0xbd, + 0x1e, 0xe1, 0xd5, 0x86, 0xd8, 0xd0, 0x78, 0xd8, 0x93, 0xd7, 0x94, 0xa6, 0x2b, 0x6f, 0x4d, 0x8e, + 0x62, 0x62, 0xc6, 0x77, 0x2f, 0x63, 0x9a, 0x71, 0x19, 0x56, 0xa8, 0xd0, 0xb1, 0xed, 0xc6, 0x37, + 0x65, 0x85, 0xc5, 0xf9, 0xda, 0x88, 0x37, 0x96, 0x85, 0x5e, 0x11, 0x17, 0x60, 0x95, 0x08, 0x72, + 0x01, 0xba, 0xf2, 0x02, 0xad, 0xb0, 0x3c, 0x0b, 0x7d, 0x67, 0x7c, 0x0d, 0x97, 0xfb, 0xf6, 0xe2, + 0xdf, 0x58, 0xa1, 0x40, 0x4d, 0x6a, 0xe9, 0xdf, 0x80, 0xe2, 0xda, 0xd9, 0x50, 0xbe, 0x8d, 0x4f, + 0xc7, 0x4a, 0x4a, 0x85, 0xad, 0xd7, 0x27, 0x15, 0x05, 0xe5, 0xc1, 0x41, 0x75, 0x86, 0xc9, 0x90, + 0x01, 0x85, 0x25, 0x3e, 0xcc, 0x98, 0x39, 0xea, 0x30, 0x03, 0x5d, 0x87, 0x85, 0x40, 0x0d, 0x0e, + 0x60, 0x82, 0x61, 0x96, 0x35, 0x91, 0x17, 0xae, 0xdb, 0xe9, 0x0a, 0x78, 0xb0, 0x0d, 0x17, 0x7c, + 0xc4, 0x62, 0xed, 0xe7, 0x54, 0xc1, 0xc7, 0xcb, 0xb0, 0x84, 0xa2, 0xdd, 0xd4, 0xeb, 0xd0, 0xe7, + 0x46, 0x75, 0x4a, 0x0c, 0xf7, 0x54, 0x34, 0xfa, 0xb2, 0xfa, 0x02, 0xe8, 0x7c, 0xf1, 0x28, 0xb1, + 0xec, 0x4b, 0xd3, 0x0f, 0x79, 0x05, 0xb4, 0x9f, 0x8c, 0x8f, 0x5e, 0x38, 0x91, 0x80, 0x54, 0x79, + 0xbc, 0x91, 0x1b, 0x1b, 0xfd, 0x83, 0x69, 0xa8, 0x28, 0x6a, 0xcd, 0xfb, 0x71, 0x17, 0x26, 0x84, + 0x8a, 0xe9, 0xb9, 0x41, 0xe8, 0x1b, 0xca, 0xfd, 0x9f, 0x11, 0x69, 0xca, 0x0f, 0xaf, 0xc7, 0x98, + 0xb1, 0x4a, 0x86, 0x2e, 0x51, 0xe9, 0x16, 0x1a, 0x3b, 0x01, 0xb7, 0x90, 0x5c, 0xa2, 0x19, 0xae, + 0xa1, 0x4f, 0x01, 0x44, 0x92, 0x5e, 0x3e, 0xb1, 0x28, 0x13, 0xaa, 0x35, 0x83, 0x1b, 0x12, 0x86, + 0x95, 0x7a, 0xe8, 0x3e, 0xcc, 0x3a, 0x6a, 0x32, 0x25, 0xb1, 0x0d, 0x15, 0x3a, 0xb8, 0x4d, 0x64, + 0x65, 0x8a, 0xce, 0x10, 0x95, 0x22, 0x9c, 0x24, 0x45, 0xd9, 0xc0, 0x89, 0x12, 0x80, 0x8d, 0xe4, + 0xe2, 0x94, 0x69, 0xc4, 0x62, 0x36, 0x90, 0x45, 0x01, 0x56, 0x88, 0xe4, 0xf8, 0xa1, 0xa6, 0x0a, + 0xf9, 0xa1, 0xfa, 0x70, 0xde, 0x27, 0xa1, 0xbf, 0x5f, 0xdf, 0x37, 0xd9, 0xa3, 0x6d, 0x7e, 0xc8, + 0xb2, 0x6f, 0x95, 0x8b, 0x85, 0xd7, 0xe3, 0x41, 0x54, 0x38, 0x0b, 0x7f, 0x42, 0xc4, 0x4d, 0x1f, + 0x29, 0xe2, 0x3e, 0x0d, 0x95, 0x90, 0x98, 0xdb, 0xae, 0x6d, 0x1a, 0x4e, 0xb3, 0x21, 0xae, 0xc0, + 0xc6, 0xab, 0x35, 0x06, 0x61, 0xb5, 0x1e, 0xaa, 0xc1, 0x58, 0xdf, 0xb6, 0x84, 0x9c, 0xff, 0x19, + 0x69, 0x20, 0x34, 0x1b, 0x0f, 0x0e, 0xaa, 0x1f, 0x8a, 0x1d, 0x3b, 0xf2, 0xab, 0xae, 0xf6, 0x76, + 0x3a, 0x57, 0xc3, 0xfd, 0x1e, 0x09, 0x96, 0x37, 0x9a, 0x0d, 0x4c, 0x1b, 0x67, 0xf9, 0xe8, 0x66, + 0x8e, 0xe1, 0xa3, 0xfb, 0x35, 0x0d, 0xce, 0x1b, 0x69, 0xdb, 0x86, 0x04, 0x8b, 0xb3, 0xc5, 0xe5, + 0x65, 0xb6, 0xbd, 0x14, 0x27, 0xe1, 0x58, 0x19, 0x24, 0x87, 0xb3, 0xfa, 0xa0, 0xff, 0xb1, 0x26, + 0x74, 0xf1, 0x33, 0x74, 0xc2, 0x9c, 0xb6, 0xe5, 0xaa, 0xdf, 0x02, 0x88, 0xa5, 0xf7, 0xc8, 0x6e, + 0xaa, 0x9f, 0x4e, 0xc0, 0xc5, 0x51, 0x8f, 0x7f, 0x59, 0x5e, 0x30, 0xf6, 0x58, 0xc1, 0xca, 0x56, + 0x48, 0xfc, 0xdb, 0xb7, 0xd7, 0xee, 0x6c, 0xfb, 0x24, 0xd8, 0xf6, 0x1c, 0xab, 0x60, 0x62, 0xb2, + 0xf8, 0xad, 0x8b, 0x01, 0x8c, 0x38, 0x87, 0x12, 0xaa, 0xc3, 0x42, 0xf4, 0x60, 0x02, 0x36, 0x42, + 0x52, 0xeb, 0xfb, 0x41, 0x28, 0xa2, 0x56, 0x99, 0xbf, 0x7d, 0x35, 0x0d, 0xc4, 0x83, 0xf5, 0xd3, + 0x48, 0xf8, 0xc3, 0x09, 0xe3, 0xec, 0xa5, 0xc3, 0x01, 0x24, 0xfc, 0xf5, 0x84, 0xc1, 0xfa, 0x2a, + 0x12, 0xf9, 0x32, 0x22, 0x13, 0xd6, 0x29, 0x24, 0xf1, 0xb3, 0x89, 0x83, 0xf5, 0x91, 0x05, 0x4f, + 0xf9, 0xc4, 0xf4, 0xba, 0x5d, 0xe2, 0x5a, 0x3c, 0xa3, 0xa4, 0xe1, 0x77, 0x6c, 0xf7, 0x9a, 0x6f, + 0xb0, 0x8a, 0xe2, 0xf9, 0xc5, 0x2b, 0x87, 0x07, 0xd5, 0xa7, 0xf0, 0x11, 0xf5, 0xf0, 0x91, 0x58, + 0x50, 0x17, 0xce, 0xf5, 0x59, 0x22, 0x1d, 0xbf, 0xe9, 0x86, 0xc4, 0xdf, 0x35, 0x9c, 0x82, 0xcf, + 0x81, 0x30, 0x61, 0xb1, 0x91, 0x44, 0x85, 0xd3, 0xb8, 0xd1, 0x3e, 0x95, 0xc3, 0xa2, 0x3b, 0x0a, + 0xc9, 0x72, 0xf1, 0xcc, 0x79, 0x78, 0x10, 0x1d, 0xce, 0xa2, 0xa1, 0xff, 0x9a, 0x06, 0xe2, 0xa0, + 0x8b, 0x1a, 0xe4, 0x8a, 0x57, 0xa1, 0xfc, 0xfe, 0x3f, 0xa2, 0x7c, 0x0f, 0x04, 0x02, 0x96, 0xae, + 0x6c, 0xa8, 0x64, 0x57, 0x0f, 0x7f, 0x15, 0x37, 0x4e, 0xb7, 0x35, 0x96, 0x9b, 0x6e, 0xeb, 0xbb, + 0x1a, 0xa4, 0x9f, 0x85, 0x43, 0xcf, 0xc0, 0x94, 0xb8, 0x13, 0x25, 0x6e, 0x56, 0xf0, 0xd0, 0x3f, + 0x5e, 0x84, 0x23, 0x58, 0x52, 0x39, 0x1e, 0xe1, 0x0a, 0x45, 0x76, 0x38, 0xfb, 0xd1, 0xca, 0xb1, + 0xfe, 0xa3, 0x39, 0x98, 0xe4, 0xb7, 0x78, 0xa8, 0xec, 0xc9, 0x88, 0x16, 0xba, 0x59, 0xfc, 0x9e, + 0x50, 0x81, 0xa0, 0xa0, 0x44, 0x56, 0x95, 0xd2, 0x91, 0x59, 0x55, 0x30, 0xcf, 0x79, 0x37, 0x82, + 0x43, 0xa4, 0x8e, 0x9b, 0x22, 0xcd, 0xba, 0xc8, 0x77, 0x87, 0xc2, 0x84, 0xa7, 0x60, 0xbc, 0x78, + 0x36, 0x3f, 0x3e, 0x00, 0x8a, 0xbf, 0x60, 0xee, 0x08, 0x5f, 0x41, 0x7c, 0x6d, 0x62, 0xa2, 0xb8, + 0x63, 0x5e, 0x0c, 0xf9, 0x10, 0xd7, 0x26, 0x24, 0xc7, 0x4f, 0xe6, 0x72, 0xfc, 0x16, 0x4c, 0x09, + 0xb9, 0x21, 0x84, 0xd8, 0x2b, 0x23, 0xe4, 0xb3, 0x53, 0xee, 0xb9, 0xf2, 0x02, 0x1c, 0x21, 0xa7, + 0x3b, 0x63, 0xd7, 0xd8, 0xb3, 0xbb, 0xfd, 0x2e, 0x93, 0x5c, 0x13, 0x6a, 0x55, 0x56, 0x8c, 0x23, + 0x38, 0xab, 0xca, 0xcf, 0x33, 0x98, 0x02, 0xa8, 0x56, 0x15, 0xcf, 0x84, 0x44, 0x70, 0xf4, 0x16, + 0x94, 0xbb, 0xc6, 0x5e, 0xbb, 0xef, 0x77, 0x88, 0xf0, 0x11, 0xe4, 0xab, 0x26, 0xfd, 0xd0, 0x76, + 0x96, 0xa9, 0xd9, 0x12, 0xfa, 0xcb, 0x4d, 0x37, 0xbc, 0xed, 0xb7, 0x43, 0x5f, 0xa6, 0xee, 0x5a, + 0x13, 0x58, 0xb0, 0xc4, 0x87, 0x1c, 0x98, 0xeb, 0x1a, 0x7b, 0x1b, 0xae, 0x21, 0x5f, 0x33, 0xa8, + 0x14, 0xa4, 0xc0, 0x1c, 0xa5, 0x6b, 0x09, 0x5c, 0x38, 0x85, 0x3b, 0xc3, 0x27, 0x3b, 0x73, 0x5a, + 0x3e, 0xd9, 0x15, 0x19, 0x76, 0xc1, 0xf5, 0xcd, 0x27, 0xb2, 0x4e, 0x3e, 0x8e, 0x0e, 0xa9, 0x78, + 0x5b, 0x86, 0x54, 0xcc, 0x15, 0x77, 0xa4, 0x1e, 0x11, 0x4e, 0xd1, 0x87, 0x8a, 0x25, 0x1f, 0xf1, + 0x0f, 0x16, 0xcf, 0x15, 0x37, 0xe4, 0x1b, 0x12, 0x8d, 0x92, 0x6b, 0x38, 0x46, 0x8d, 0x55, 0x3a, + 0xe8, 0x36, 0xcf, 0x76, 0xef, 0x90, 0x30, 0xae, 0xc2, 0x0c, 0x91, 0x79, 0xee, 0xab, 0x89, 0x92, + 0xd3, 0x0f, 0x54, 0xc0, 0xd9, 0xed, 0xa8, 0x2a, 0xc9, 0x63, 0xbd, 0x17, 0xe2, 0xeb, 0xf5, 0x89, + 0x7b, 0x54, 0x7f, 0x5b, 0x83, 0x79, 0xfe, 0x0a, 0x51, 0xdd, 0xeb, 0xf6, 0x3c, 0x97, 0xd0, 0x69, + 0x41, 0x6c, 0x4c, 0x3f, 0x5f, 0x5c, 0x36, 0xb4, 0x53, 0x18, 0xc5, 0x91, 0x55, 0xaa, 0x14, 0x0f, + 0x50, 0x46, 0xbf, 0xa7, 0xc1, 0x62, 0x37, 0x27, 0x95, 0xef, 0xe2, 0xf9, 0xe2, 0xb1, 0x63, 0x0f, + 0x4b, 0x0f, 0xcc, 0x5f, 0x46, 0x7b, 0x58, 0x2d, 0x9c, 0xdb, 0xb7, 0x51, 0x23, 0x4c, 0x47, 0xb9, + 0x5f, 0xf6, 0xf3, 0x30, 0x9f, 0xde, 0x03, 0xd4, 0xfc, 0xfc, 0xda, 0xa9, 0xe6, 0xe7, 0xd7, 0x5f, + 0x85, 0x4b, 0xd9, 0x73, 0x4e, 0x55, 0x22, 0xf6, 0xd0, 0x85, 0xb0, 0x44, 0xe2, 0xec, 0x73, 0xb4, + 0x10, 0x73, 0x58, 0xed, 0x13, 0xdf, 0xff, 0xc9, 0xe5, 0xc7, 0x7e, 0xf8, 0x93, 0xcb, 0x8f, 0xbd, + 0xf7, 0x93, 0xcb, 0x8f, 0x7d, 0xf5, 0xf0, 0xb2, 0xf6, 0xfd, 0xc3, 0xcb, 0xda, 0x0f, 0x0f, 0x2f, + 0x6b, 0xef, 0x1d, 0x5e, 0xd6, 0xfe, 0xc7, 0xe1, 0x65, 0xed, 0x97, 0xff, 0xe7, 0xe5, 0xc7, 0xde, + 0x9a, 0x12, 0x3d, 0xfa, 0xf3, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf3, 0x16, 0xa2, 0x7e, 0x4c, 0xac, + 0x00, 0x00, } func (m *Addon) Marshal() (dAtA []byte, err error) { @@ -6688,18 +6718,6 @@ func (m *HorizontalPodAutoscalerConfig) MarshalToSizedBuffer(dAtA []byte) (int, _ = i var l int _ = l - if m.UpscaleDelay != nil { - { - size, err := m.UpscaleDelay.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } if m.Tolerance != nil { i -= 8 encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(*m.Tolerance)))) @@ -6742,18 +6760,6 @@ func (m *HorizontalPodAutoscalerConfig) MarshalToSizedBuffer(dAtA []byte) (int, i-- dAtA[i] = 0x1a } - if m.DownscaleDelay != nil { - { - size, err := m.DownscaleDelay.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenerated(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } if m.CPUInitializationPeriod != nil { { size, err := m.CPUInitializationPeriod.MarshalToSizedBuffer(dAtA[:i]) @@ -11007,6 +11013,39 @@ func (m *Shoot) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ShootAdvertisedAddress) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ShootAdvertisedAddress) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShootAdvertisedAddress) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.URL) + copy(dAtA[i:], m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *ShootList) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -11358,6 +11397,20 @@ func (m *ShootStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.AdvertisedAddresses) > 0 { + for iNdEx := len(m.AdvertisedAddresses) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AdvertisedAddresses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + } + } if m.ClusterIdentity != nil { i -= len(*m.ClusterIdentity) copy(dAtA[i:], *m.ClusterIdentity) @@ -12923,10 +12976,6 @@ func (m *HorizontalPodAutoscalerConfig) Size() (n int) { l = m.CPUInitializationPeriod.Size() n += 1 + l + sovGenerated(uint64(l)) } - if m.DownscaleDelay != nil { - l = m.DownscaleDelay.Size() - n += 1 + l + sovGenerated(uint64(l)) - } if m.DownscaleStabilization != nil { l = m.DownscaleStabilization.Size() n += 1 + l + sovGenerated(uint64(l)) @@ -12942,10 +12991,6 @@ func (m *HorizontalPodAutoscalerConfig) Size() (n int) { if m.Tolerance != nil { n += 9 } - if m.UpscaleDelay != nil { - l = m.UpscaleDelay.Size() - n += 1 + l + sovGenerated(uint64(l)) - } return n } @@ -14511,6 +14556,19 @@ func (m *Shoot) Size() (n int) { return n } +func (m *ShootAdvertisedAddress) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.URL) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *ShootList) Size() (n int) { if m == nil { return 0 @@ -14683,6 +14741,12 @@ func (m *ShootStatus) Size() (n int) { l = len(*m.ClusterIdentity) n += 1 + l + sovGenerated(uint64(l)) } + if len(m.AdvertisedAddresses) > 0 { + for _, e := range m.AdvertisedAddresses { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -15519,12 +15583,10 @@ func (this *HorizontalPodAutoscalerConfig) String() string { } s := strings.Join([]string{`&HorizontalPodAutoscalerConfig{`, `CPUInitializationPeriod:` + strings.Replace(fmt.Sprintf("%v", this.CPUInitializationPeriod), "Duration", "v11.Duration", 1) + `,`, - `DownscaleDelay:` + strings.Replace(fmt.Sprintf("%v", this.DownscaleDelay), "Duration", "v11.Duration", 1) + `,`, `DownscaleStabilization:` + strings.Replace(fmt.Sprintf("%v", this.DownscaleStabilization), "Duration", "v11.Duration", 1) + `,`, `InitialReadinessDelay:` + strings.Replace(fmt.Sprintf("%v", this.InitialReadinessDelay), "Duration", "v11.Duration", 1) + `,`, `SyncPeriod:` + strings.Replace(fmt.Sprintf("%v", this.SyncPeriod), "Duration", "v11.Duration", 1) + `,`, `Tolerance:` + valueToStringGenerated(this.Tolerance) + `,`, - `UpscaleDelay:` + strings.Replace(fmt.Sprintf("%v", this.UpscaleDelay), "Duration", "v11.Duration", 1) + `,`, `}`, }, "") return s @@ -16644,6 +16706,17 @@ func (this *Shoot) String() string { }, "") return s } +func (this *ShootAdvertisedAddress) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ShootAdvertisedAddress{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `}`, + }, "") + return s +} func (this *ShootList) String() string { if this == nil { return "nil" @@ -16743,6 +16816,11 @@ func (this *ShootStatus) String() string { repeatedStringForLastErrors += strings.Replace(strings.Replace(f.String(), "LastError", "LastError", 1), `&`, ``, 1) + "," } repeatedStringForLastErrors += "}" + repeatedStringForAdvertisedAddresses := "[]ShootAdvertisedAddress{" + for _, f := range this.AdvertisedAddresses { + repeatedStringForAdvertisedAddresses += strings.Replace(strings.Replace(f.String(), "ShootAdvertisedAddress", "ShootAdvertisedAddress", 1), `&`, ``, 1) + "," + } + repeatedStringForAdvertisedAddresses += "}" s := strings.Join([]string{`&ShootStatus{`, `Conditions:` + repeatedStringForConditions + `,`, `Constraints:` + repeatedStringForConstraints + `,`, @@ -16756,6 +16834,7 @@ func (this *ShootStatus) String() string { `TechnicalID:` + fmt.Sprintf("%v", this.TechnicalID) + `,`, `UID:` + fmt.Sprintf("%v", this.UID) + `,`, `ClusterIdentity:` + valueToStringGenerated(this.ClusterIdentity) + `,`, + `AdvertisedAddresses:` + repeatedStringForAdvertisedAddresses + `,`, `}`, }, "") return s @@ -23382,42 +23461,6 @@ func (m *HorizontalPodAutoscalerConfig) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DownscaleDelay", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DownscaleDelay == nil { - m.DownscaleDelay = &v11.Duration{} - } - if err := m.DownscaleDelay.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field DownscaleStabilization", wireType) @@ -23538,42 +23581,6 @@ func (m *HorizontalPodAutoscalerConfig) Unmarshal(dAtA []byte) error { iNdEx += 8 v2 := float64(math.Float64frombits(v)) m.Tolerance = &v2 - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpscaleDelay", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenerated - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenerated - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenerated - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UpscaleDelay == nil { - m.UpscaleDelay = &v11.Duration{} - } - if err := m.UpscaleDelay.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -36545,6 +36552,123 @@ func (m *Shoot) Unmarshal(dAtA []byte) error { } return nil } +func (m *ShootAdvertisedAddress) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ShootAdvertisedAddress: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShootAdvertisedAddress: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.URL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *ShootList) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -37975,6 +38099,40 @@ func (m *ShootStatus) Unmarshal(dAtA []byte) error { s := string(dAtA[iNdEx:postIndex]) m.ClusterIdentity = &s iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AdvertisedAddresses", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AdvertisedAddresses = append(m.AdvertisedAddresses, ShootAdvertisedAddress{}) + if err := m.AdvertisedAddresses[len(m.AdvertisedAddresses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto index 06935ddb5..453638304 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/generated.proto @@ -651,10 +651,6 @@ message HorizontalPodAutoscalerConfig { // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration cpuInitializationPeriod = 1; - // The period since last downscale, before another downscale can be performed in horizontal pod autoscaler. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration downscaleDelay = 2; - // The configurable window at which the controller will choose the highest recommendation for autoscaling. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration downscaleStabilization = 3; @@ -670,10 +666,6 @@ message HorizontalPodAutoscalerConfig { // The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. // +optional optional double tolerance = 6; - - // The period since last upscale, before another upscale can be performed in horizontal pod autoscaler. - // +optional - optional k8s.io.apimachinery.pkg.apis.meta.v1.Duration upscaleDelay = 7; } // Ingress configures the Ingress specific settings of the Seed cluster @@ -972,7 +964,6 @@ message KubeletConfigReserved { optional k8s.io.apimachinery.pkg.api.resource.Quantity ephemeralStorage = 3; // PID is the reserved process-ids. - // To reserve PID, the SupportNodePidsLimit feature gate must be enabled in Kubernetes versions < 1.15. // +optional optional k8s.io.apimachinery.pkg.api.resource.Quantity pid = 4; } @@ -1294,7 +1285,6 @@ message OIDCConfig { // +optional optional string issuerURL = 6; - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. // +optional map requiredClaims = 7; @@ -1410,7 +1400,7 @@ message ProjectMember { // Role represents the role of this member. // IMPORTANT: Be aware that this field will be removed in the `v1` version of this API in favor of the `roles` // list. - // TODO: Remove this field in favor of the `owner` role in `v1`. + // TODO: Remove this field in favor of the `roles` list in `v1`. optional string role = 2; // Roles represents the list of roles of this member. @@ -1720,9 +1710,7 @@ message SeedSelector { repeated string providerTypes = 2; } -// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the -// seed. When enabled then this is done via PodPriority and requires the Seed cluster to have Kubernetes version 1.11 -// or the PodPriority feature gate as well as the scheduling.k8s.io/v1alpha1 API group enabled. +// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. message SeedSettingExcessCapacityReservation { // Enabled controls whether the excess capacity reservation should be enabled. optional bool enabled = 1; @@ -1774,8 +1762,7 @@ message SeedSettings { // +optional optional SeedSettingShootDNS shootDNS = 3; - // LoadBalancerServices controls certain settings for services of type load balancer that are created in the - // seed. + // LoadBalancerServices controls certain settings for services of type load balancer that are created in the seed. // +optional optional SeedSettingLoadBalancerServices loadBalancerServices = 4; @@ -1931,6 +1918,15 @@ message Shoot { optional ShootStatus status = 3; } +// ShootAdvertisedAddress contains information for the shoot's Kube API server. +message ShootAdvertisedAddress { + // Name of the advertised address. e.g. external + optional string name = 1; + + // The URL of the API Server. e.g. https://api.foo.bar or https://1.2.3.4 + optional string url = 2; +} + // ShootList is a list of Shoot objects. message ShootList { // Standard list object metadata. @@ -2091,6 +2087,12 @@ message ShootStatus { // ClusterIdentity is the identity of the Shoot cluster // +optional optional string clusterIdentity = 12; + + // List of addresses on which the Kube API server can be reached. + // +optional + // +patchMergeKey=name + // +patchStrategy=merge + repeated ShootAdvertisedAddress advertisedAddresses = 13; } // ShootTemplate is a template for creating a Shoot object. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go index ab2df1f2e..9c5a15ac6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/helper/errors.go @@ -50,12 +50,13 @@ func (e *ErrorWithCodes) Error() string { } var ( - unauthorizedRegexp = regexp.MustCompile(`(?i)(Unauthorized|InvalidClientTokenId|InvalidAuthenticationTokenTenant|SignatureDoesNotMatch|Authentication failed|AuthFailure|AuthorizationFailed|invalid character|invalid_grant|invalid_client|Authorization Profile was not found|cannot fetch token|no active subscriptions|InvalidAccessKeyId|InvalidSecretAccessKey|query returned no results|UnauthorizedOperation|not authorized)`) + unauthorizedRegexp = regexp.MustCompile(`(?i)(Unauthorized|InvalidClientTokenId|InvalidAuthenticationTokenTenant|SignatureDoesNotMatch|Authentication failed|AuthFailure|AuthorizationFailed|invalid character|invalid_grant|invalid_client|Authorization Profile was not found|cannot fetch token|no active subscriptions|InvalidAccessKeyId|InvalidSecretAccessKey|query returned no results|UnauthorizedOperation|not authorized|InvalidSubscriptionId)`) quotaExceededRegexp = regexp.MustCompile(`(?i)(LimitExceeded|Quota|Throttling|Too many requests)`) insufficientPrivilegesRegexp = regexp.MustCompile(`(?i)(AccessDenied|OperationNotAllowed|Error 403)`) - dependenciesRegexp = regexp.MustCompile(`(?i)(PendingVerification|Access Not Configured|accessNotConfigured|DependencyViolation|OptInRequired|DeleteConflict|Conflict|inactive billing state|ReadOnlyDisabledSubscription|is already being used|InUseSubnetCannotBeDeleted|VnetInUse|InUseRouteTableCannotBeDeleted|timeout while waiting for state to become|InvalidCidrBlock|already busy for|InsufficientFreeAddressesInSubnet|InternalServerError|RetryableError|Future#WaitForCompletion: context has been cancelled|internalerror|internal server error|A resource with the ID|VnetAddressSpaceCannotChangeDueToPeerings)`) + dependenciesRegexp = regexp.MustCompile(`(?i)(PendingVerification|Access Not Configured|accessNotConfigured|DependencyViolation|OptInRequired|DeleteConflict|Conflict|inactive billing state|ReadOnlyDisabledSubscription|is already being used|InUseSubnetCannotBeDeleted|VnetInUse|InUseRouteTableCannotBeDeleted|timeout while waiting for state to become|InvalidCidrBlock|already busy for|InsufficientFreeAddressesInSubnet|InternalServerError|Future#WaitForCompletion: context has been cancelled|internalerror|internal server error|A resource with the ID|VnetAddressSpaceCannotChangeDueToPeerings|InternalBillingError)`) + retryableDependenciesRegexp = regexp.MustCompile(`(?i)(RetryableError)`) resourcesDepletedRegexp = regexp.MustCompile(`(?i)(not available in the current hardware cluster|InsufficientInstanceCapacity|SkuNotAvailable|ZonalAllocationFailed|out of stock)`) - configurationProblemRegexp = regexp.MustCompile(`(?i)(AzureBastionSubnet|not supported in your requested Availability Zone|InvalidParameter|InvalidParameterValue|notFound|NetcfgInvalidSubnet|InvalidSubnet|Invalid value|KubeletHasInsufficientMemory|KubeletHasDiskPressure|KubeletHasInsufficientPID|violates constraint|no attached internet gateway found|Your query returned no results|PrivateEndpointNetworkPoliciesCannotBeEnabledOnPrivateEndpointSubnet|invalid VPC attributes|PrivateLinkServiceNetworkPoliciesCannotBeEnabledOnPrivateLinkServiceSubnet|unrecognized feature gate|runtime-config invalid key|LoadBalancingRuleMustDisableSNATSinceSameFrontendIPConfigurationIsReferencedByOutboundRule)`) + configurationProblemRegexp = regexp.MustCompile(`(?i)(AzureBastionSubnet|not supported in your requested Availability Zone|InvalidParameter|InvalidParameterValue|notFound|NetcfgInvalidSubnet|InvalidSubnet|Invalid value|KubeletHasInsufficientMemory|KubeletHasDiskPressure|KubeletHasInsufficientPID|violates constraint|no attached internet gateway found|Your query returned no results|PrivateEndpointNetworkPoliciesCannotBeEnabledOnPrivateEndpointSubnet|invalid VPC attributes|PrivateLinkServiceNetworkPoliciesCannotBeEnabledOnPrivateLinkServiceSubnet|unrecognized feature gate|runtime-config invalid key|LoadBalancingRuleMustDisableSNATSinceSameFrontendIPConfigurationIsReferencedByOutboundRule|strict decoder error|not allowed to configure an unsupported)`) retryableConfigurationProblemRegexp = regexp.MustCompile(`(?i)(is misconfigured and requires zero voluntary evictions)`) ) @@ -105,6 +106,9 @@ func DetermineErrorCodes(err error) []gardencorev1beta1.ErrorCode { if dependenciesRegexp.MatchString(message) { codes.Insert(string(gardencorev1beta1.ErrorInfraDependencies)) } + if retryableDependenciesRegexp.MatchString(message) { + codes.Insert(string(gardencorev1beta1.ErrorRetryableInfraDependencies)) + } if resourcesDepletedRegexp.MatchString(message) { codes.Insert(string(gardencorev1beta1.ErrorInfraResourcesDepleted)) } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go index 3c88d9232..a6d598db7 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_common.go @@ -32,6 +32,8 @@ const ( // ErrorInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level. // It is classified as a non-retryable error code. ErrorInfraDependencies ErrorCode = "ERR_INFRA_DEPENDENCIES" + // ErrorRetryableInfraDependencies indicates that the last error occurred due to dependent objects on the infrastructure level, but operation should be retried. + ErrorRetryableInfraDependencies ErrorCode = "ERR_RETRYABLE_INFRA_DEPENDENCIES" // ErrorInfraResourcesDepleted indicates that the last error occurred due to depleted resource in the infrastructure. ErrorInfraResourcesDepleted ErrorCode = "ERR_INFRA_RESOURCES_DEPLETED" // ErrorCleanupClusterResources indicates that the last error occurred due to resources in the cluster that are stuck in deletion. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_project.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_project.go index 3938c9920..8eee35775 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_project.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_project.go @@ -106,7 +106,7 @@ type ProjectMember struct { // Role represents the role of this member. // IMPORTANT: Be aware that this field will be removed in the `v1` version of this API in favor of the `roles` // list. - // TODO: Remove this field in favor of the `owner` role in `v1`. + // TODO: Remove this field in favor of the `roles` list in `v1`. Role string `json:"role" protobuf:"bytes,2,opt,name=role"` // Roles represents the list of roles of this member. // +optional diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go index be12b88c7..a617d392c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_seed.go @@ -229,8 +229,7 @@ type SeedSettings struct { // ShootDNS controls the shoot DNS settings for the seed. // +optional ShootDNS *SeedSettingShootDNS `json:"shootDNS,omitempty" protobuf:"bytes,3,opt,name=shootDNS"` - // LoadBalancerServices controls certain settings for services of type load balancer that are created in the - // seed. + // LoadBalancerServices controls certain settings for services of type load balancer that are created in the seed. // +optional LoadBalancerServices *SeedSettingLoadBalancerServices `json:"loadBalancerServices,omitempty" protobuf:"bytes,4,opt,name=loadBalancerServices"` // VerticalPodAutoscaler controls certain settings for the vertical pod autoscaler components deployed in the seed. @@ -238,9 +237,7 @@ type SeedSettings struct { VerticalPodAutoscaler *SeedSettingVerticalPodAutoscaler `json:"verticalPodAutoscaler,omitempty" protobuf:"bytes,5,opt,name=verticalPodAutoscaler"` } -// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the -// seed. When enabled then this is done via PodPriority and requires the Seed cluster to have Kubernetes version 1.11 -// or the PodPriority feature gate as well as the scheduling.k8s.io/v1alpha1 API group enabled. +// SeedSettingExcessCapacityReservation controls the excess capacity reservation for shoot control planes in the seed. type SeedSettingExcessCapacityReservation struct { // Enabled controls whether the excess capacity reservation should be enabled. Enabled bool `json:"enabled" protobuf:"bytes,1,opt,name=enabled"` diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go index 444400e35..8e90134bc 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/types_shoot.go @@ -160,6 +160,19 @@ type ShootStatus struct { // ClusterIdentity is the identity of the Shoot cluster // +optional ClusterIdentity *string `json:"clusterIdentity,omitempty" protobuf:"bytes,12,opt,name=clusterIdentity"` + // List of addresses on which the Kube API server can be reached. + // +optional + // +patchMergeKey=name + // +patchStrategy=merge + AdvertisedAddresses []ShootAdvertisedAddress `json:"advertisedAddresses,omitempty" patchStrategy:"merge" patchMergeKey:"name" protobuf:"bytes,13,rep,name=advertisedAddresses"` +} + +// ShootAdvertisedAddress contains information for the shoot's Kube API server. +type ShootAdvertisedAddress struct { + // Name of the advertised address. e.g. external + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // The URL of the API Server. e.g. https://api.foo.bar or https://1.2.3.4 + URL string `json:"url" protobuf:"bytes,2,opt,name=url"` } ////////////////////////////////////////////////////////////////////////////////////////////////// @@ -543,7 +556,6 @@ type OIDCConfig struct { // The URL of the OpenID issuer, only HTTPS scheme will be accepted. If set, it will be used to verify the OIDC JSON Web Token (JWT). // +optional IssuerURL *string `json:"issuerURL,omitempty" protobuf:"bytes,6,opt,name=issuerURL"` - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. // +optional RequiredClaims map[string]string `json:"requiredClaims,omitempty" protobuf:"bytes,7,rep,name=requiredClaims"` @@ -625,9 +637,6 @@ type HorizontalPodAutoscalerConfig struct { // The period after which a ready pod transition is considered to be the first. // +optional CPUInitializationPeriod *metav1.Duration `json:"cpuInitializationPeriod,omitempty" protobuf:"bytes,1,opt,name=cpuInitializationPeriod"` - // The period since last downscale, before another downscale can be performed in horizontal pod autoscaler. - // +optional - DownscaleDelay *metav1.Duration `json:"downscaleDelay,omitempty" protobuf:"bytes,2,opt,name=downscaleDelay"` // The configurable window at which the controller will choose the highest recommendation for autoscaling. // +optional DownscaleStabilization *metav1.Duration `json:"downscaleStabilization,omitempty" protobuf:"bytes,3,opt,name=downscaleStabilization"` @@ -640,20 +649,13 @@ type HorizontalPodAutoscalerConfig struct { // The minimum change (from 1.0) in the desired-to-actual metrics ratio for the horizontal pod autoscaler to consider scaling. // +optional Tolerance *float64 `json:"tolerance,omitempty" protobuf:"fixed64,6,opt,name=tolerance"` - // The period since last upscale, before another upscale can be performed in horizontal pod autoscaler. - // +optional - UpscaleDelay *metav1.Duration `json:"upscaleDelay,omitempty" protobuf:"bytes,7,opt,name=upscaleDelay"` } const ( - // DefaultHPADownscaleDelay is a constant for the default HPA downscale delay for a Shoot cluster. - DefaultHPADownscaleDelay = 15 * time.Minute // DefaultHPASyncPeriod is a constant for the default HPA sync period for a Shoot cluster. DefaultHPASyncPeriod = 30 * time.Second // DefaultHPATolerance is a constant for the default HPA tolerance for a Shoot cluster. DefaultHPATolerance = 0.1 - // DefaultHPAUpscaleDelay is for the default HPA upscale delay for a Shoot cluster. - DefaultHPAUpscaleDelay = 1 * time.Minute // DefaultDownscaleStabilization is the default HPA downscale stabilization window for a Shoot cluster DefaultDownscaleStabilization = 5 * time.Minute // DefaultInitialReadinessDelay is for the default HPA ReadinessDelay value in the Shoot cluster @@ -839,7 +841,6 @@ type KubeletConfigReserved struct { // +optional EphemeralStorage *resource.Quantity `json:"ephemeralStorage,omitempty" protobuf:"bytes,3,opt,name=ephemeralStorage"` // PID is the reserved process-ids. - // To reserve PID, the SupportNodePidsLimit feature gate must be enabled in Kubernetes versions < 1.15. // +optional PID *resource.Quantity `json:"pid,omitempty" protobuf:"bytes,4,opt,name=pid"` } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go index 19aeb217d..7233651a6 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.conversion.go @@ -1211,6 +1211,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*ShootAdvertisedAddress)(nil), (*core.ShootAdvertisedAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1beta1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(a.(*ShootAdvertisedAddress), b.(*core.ShootAdvertisedAddress), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.ShootAdvertisedAddress)(nil), (*ShootAdvertisedAddress)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_ShootAdvertisedAddress_To_v1beta1_ShootAdvertisedAddress(a.(*core.ShootAdvertisedAddress), b.(*ShootAdvertisedAddress), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ShootList)(nil), (*core.ShootList)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1beta1_ShootList_To_core_ShootList(a.(*ShootList), b.(*core.ShootList), scope) }); err != nil { @@ -2466,12 +2476,10 @@ func Convert_core_HibernationSchedule_To_v1beta1_HibernationSchedule(in *core.Hi func autoConvert_v1beta1_HorizontalPodAutoscalerConfig_To_core_HorizontalPodAutoscalerConfig(in *HorizontalPodAutoscalerConfig, out *core.HorizontalPodAutoscalerConfig, s conversion.Scope) error { out.CPUInitializationPeriod = (*metav1.Duration)(unsafe.Pointer(in.CPUInitializationPeriod)) - out.DownscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.DownscaleDelay)) out.DownscaleStabilization = (*metav1.Duration)(unsafe.Pointer(in.DownscaleStabilization)) out.InitialReadinessDelay = (*metav1.Duration)(unsafe.Pointer(in.InitialReadinessDelay)) out.SyncPeriod = (*metav1.Duration)(unsafe.Pointer(in.SyncPeriod)) out.Tolerance = (*float64)(unsafe.Pointer(in.Tolerance)) - out.UpscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.UpscaleDelay)) return nil } @@ -2482,12 +2490,10 @@ func Convert_v1beta1_HorizontalPodAutoscalerConfig_To_core_HorizontalPodAutoscal func autoConvert_core_HorizontalPodAutoscalerConfig_To_v1beta1_HorizontalPodAutoscalerConfig(in *core.HorizontalPodAutoscalerConfig, out *HorizontalPodAutoscalerConfig, s conversion.Scope) error { out.CPUInitializationPeriod = (*metav1.Duration)(unsafe.Pointer(in.CPUInitializationPeriod)) - out.DownscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.DownscaleDelay)) out.DownscaleStabilization = (*metav1.Duration)(unsafe.Pointer(in.DownscaleStabilization)) out.InitialReadinessDelay = (*metav1.Duration)(unsafe.Pointer(in.InitialReadinessDelay)) out.SyncPeriod = (*metav1.Duration)(unsafe.Pointer(in.SyncPeriod)) out.Tolerance = (*float64)(unsafe.Pointer(in.Tolerance)) - out.UpscaleDelay = (*metav1.Duration)(unsafe.Pointer(in.UpscaleDelay)) return nil } @@ -4489,6 +4495,28 @@ func Convert_core_Shoot_To_v1beta1_Shoot(in *core.Shoot, out *Shoot, s conversio return autoConvert_core_Shoot_To_v1beta1_Shoot(in, out, s) } +func autoConvert_v1beta1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in *ShootAdvertisedAddress, out *core.ShootAdvertisedAddress, s conversion.Scope) error { + out.Name = in.Name + out.URL = in.URL + return nil +} + +// Convert_v1beta1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress is an autogenerated conversion function. +func Convert_v1beta1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in *ShootAdvertisedAddress, out *core.ShootAdvertisedAddress, s conversion.Scope) error { + return autoConvert_v1beta1_ShootAdvertisedAddress_To_core_ShootAdvertisedAddress(in, out, s) +} + +func autoConvert_core_ShootAdvertisedAddress_To_v1beta1_ShootAdvertisedAddress(in *core.ShootAdvertisedAddress, out *ShootAdvertisedAddress, s conversion.Scope) error { + out.Name = in.Name + out.URL = in.URL + return nil +} + +// Convert_core_ShootAdvertisedAddress_To_v1beta1_ShootAdvertisedAddress is an autogenerated conversion function. +func Convert_core_ShootAdvertisedAddress_To_v1beta1_ShootAdvertisedAddress(in *core.ShootAdvertisedAddress, out *ShootAdvertisedAddress, s conversion.Scope) error { + return autoConvert_core_ShootAdvertisedAddress_To_v1beta1_ShootAdvertisedAddress(in, out, s) +} + func autoConvert_v1beta1_ShootList_To_core_ShootList(in *ShootList, out *core.ShootList, s conversion.Scope) error { out.ListMeta = in.ListMeta if in.Items != nil { @@ -4660,6 +4688,7 @@ func autoConvert_v1beta1_ShootStatus_To_core_ShootStatus(in *ShootStatus, out *c out.TechnicalID = in.TechnicalID out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) + out.AdvertisedAddresses = *(*[]core.ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) return nil } @@ -4683,6 +4712,7 @@ func autoConvert_core_ShootStatus_To_v1beta1_ShootStatus(in *core.ShootStatus, o out.TechnicalID = in.TechnicalID out.UID = types.UID(in.UID) out.ClusterIdentity = (*string)(unsafe.Pointer(in.ClusterIdentity)) + out.AdvertisedAddresses = *(*[]ShootAdvertisedAddress)(unsafe.Pointer(&in.AdvertisedAddresses)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go index 69201037f..d79891b9a 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/v1beta1/zz_generated.deepcopy.go @@ -1224,11 +1224,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(metav1.Duration) **out = **in } - if in.DownscaleDelay != nil { - in, out := &in.DownscaleDelay, &out.DownscaleDelay - *out = new(metav1.Duration) - **out = **in - } if in.DownscaleStabilization != nil { in, out := &in.DownscaleStabilization, &out.DownscaleStabilization *out = new(metav1.Duration) @@ -1249,11 +1244,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(float64) **out = **in } - if in.UpscaleDelay != nil { - in, out := &in.UpscaleDelay, &out.UpscaleDelay - *out = new(metav1.Duration) - **out = **in - } return } @@ -3457,6 +3447,22 @@ func (in *Shoot) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ShootAdvertisedAddress) DeepCopyInto(out *ShootAdvertisedAddress) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShootAdvertisedAddress. +func (in *ShootAdvertisedAddress) DeepCopy() *ShootAdvertisedAddress { + if in == nil { + return nil + } + out := new(ShootAdvertisedAddress) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ShootList) DeepCopyInto(out *ShootList) { *out = *in @@ -3664,6 +3670,11 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = new(string) **out = **in } + if in.AdvertisedAddresses != nil { + in, out := &in.AdvertisedAddresses, &out.AdvertisedAddresses + *out = make([]ShootAdvertisedAddress, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go index dba596570..638271424 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/core/zz_generated.deepcopy.go @@ -1277,11 +1277,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(metav1.Duration) **out = **in } - if in.DownscaleDelay != nil { - in, out := &in.DownscaleDelay, &out.DownscaleDelay - *out = new(metav1.Duration) - **out = **in - } if in.DownscaleStabilization != nil { in, out := &in.DownscaleStabilization, &out.DownscaleStabilization *out = new(metav1.Duration) @@ -1302,11 +1297,6 @@ func (in *HorizontalPodAutoscalerConfig) DeepCopyInto(out *HorizontalPodAutoscal *out = new(float64) **out = **in } - if in.UpscaleDelay != nil { - in, out := &in.UpscaleDelay, &out.UpscaleDelay - *out = new(metav1.Duration) - **out = **in - } return } @@ -3528,6 +3518,22 @@ func (in *Shoot) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *ShootAdvertisedAddress) DeepCopyInto(out *ShootAdvertisedAddress) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ShootAdvertisedAddress. +func (in *ShootAdvertisedAddress) DeepCopy() *ShootAdvertisedAddress { + if in == nil { + return nil + } + out := new(ShootAdvertisedAddress) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ShootList) DeepCopyInto(out *ShootList) { *out = *in @@ -3827,6 +3833,11 @@ func (in *ShootStatus) DeepCopyInto(out *ShootStatus) { *out = new(string) **out = **in } + if in.AdvertisedAddresses != nil { + in, out := &in.AdvertisedAddresses, &out.AdvertisedAddresses + *out = make([]ShootAdvertisedAddress, len(*in)) + copy(*out, *in) + } return } diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types.go index 54a896317..a1e10001c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types.go @@ -35,11 +35,17 @@ type Status interface { // GetLastOperation retrieves the LastOperation of a status. // LastOperation may be nil. GetLastOperation() *gardencorev1beta1.LastOperation + // SetLastOperation sets the LastOperation of a status. + SetLastOperation(*gardencorev1beta1.LastOperation) // GetObservedGeneration retrieves the last generation observed by the extension controller. GetObservedGeneration() int64 + // SetObservedGeneration sets the ObservedGeneration of a status. + SetObservedGeneration(int64) // GetLastError retrieves the LastError of a status. // LastError may be nil. GetLastError() *gardencorev1beta1.LastError + // SetLastError sets the LastError of a status. + SetLastError(*gardencorev1beta1.LastError) // GetState retrieves the State of the extension GetState() *runtime.RawExtension // SetState sets the State of the extension diff --git a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_defaults.go b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_defaults.go index a6339036e..f3b4f1675 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/extensions/v1alpha1/types_defaults.go @@ -93,16 +93,31 @@ func (d *DefaultStatus) GetLastOperation() *gardencorev1beta1.LastOperation { return d.LastOperation } +// SetLastOperation implements Status. +func (d *DefaultStatus) SetLastOperation(lastOp *gardencorev1beta1.LastOperation) { + d.LastOperation = lastOp +} + // GetLastError implements Status. func (d *DefaultStatus) GetLastError() *gardencorev1beta1.LastError { return d.LastError } +// SetLastError implements Status. +func (d *DefaultStatus) SetLastError(lastErr *gardencorev1beta1.LastError) { + d.LastError = lastErr +} + // GetObservedGeneration implements Status. func (d *DefaultStatus) GetObservedGeneration() int64 { return d.ObservedGeneration } +// SetObservedGeneration implements Status. +func (d *DefaultStatus) SetObservedGeneration(generation int64) { + d.ObservedGeneration = generation +} + // GetState implements Status. func (d *DefaultStatus) GetState() *runtime.RawExtension { return d.State diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseed.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseed.go index 211d83bf0..2c3902950 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseed.go @@ -151,8 +151,6 @@ type ManagedSeedStatus struct { } const ( - // ManagedSeedShootExists is a condition type for indicating whether the ManagedSeed's shoot exists. - ManagedSeedShootExists gardencore.ConditionType = "ShootExists" // ManagedSeedShootReconciled is a condition type for indicating whether the ManagedSeed's shoot has been reconciled. ManagedSeedShootReconciled gardencore.ConditionType = "ShootReconciled" // ManagedSeedSeedRegistered is a condition type for indicating whether the ManagedSeed's seed has been registered, diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseedset.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseedset.go index de954c957..27d69e826 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseedset.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/types_managedseedset.go @@ -123,6 +123,44 @@ type ManagedSeedSetStatus struct { CollisionCount *int32 // Conditions represents the latest available observations of a ManagedSeedSet's current state. Conditions []gardencore.Condition + // PendingReplica, if not empty, indicates the replica that is currently pending creation, update, or deletion. + // This replica is in a state that requires the controller to wait for it to change before advancing to the next replica. + PendingReplica *PendingReplica +} + +// PendingReplicaReason is a string enumeration type that enumerates all possible reasons for a replica to be pending. +type PendingReplicaReason string + +const ( + // ShootReconcilingReason indicates that the replica's shoot is reconciling. + ShootReconcilingReason PendingReplicaReason = "ShootReconciling" + // ShootDeletingReason indicates that the replica's shoot is deleting. + ShootDeletingReason PendingReplicaReason = "ShootDeleting" + // ShootReconcileFailedReason indicates that the reconciliation of this replica's shoot has failed. + ShootReconcileFailedReason PendingReplicaReason = "ShootReconcileFailed" + // ShootDeleteFailedReason indicates that the deletion of tis replica's shoot has failed. + ShootDeleteFailedReason PendingReplicaReason = "ShootDeleteFailed" + // ManagedSeedPreparingReason indicates that the replica's managed seed is preparing. + ManagedSeedPreparingReason PendingReplicaReason = "ManagedSeedPreparing" + // ManagedSeedDeletingReason indicates that the replica's managed seed is deleting. + ManagedSeedDeletingReason PendingReplicaReason = "ManagedSeedDeleting" + // SeedNotReadyReason indicates that the replica's seed is not ready. + SeedNotReadyReason PendingReplicaReason = "SeedNotReady" + // ShootNotHealthyReason indicates that the replica's shoot is not healthy. + ShootNotHealthyReason PendingReplicaReason = "ShootNotHealthy" +) + +// PendingReplica contains information about a replica that is currently pending creation, update, or deletion. +type PendingReplica struct { + // Name is the replica name. + Name string + // Reason is the reason for the replica to be pending. + Reason PendingReplicaReason + // Since is the moment in time since the replica is pending with the specified reason. + Since metav1.Time + // Retries is the number of times the shoot operation (reconcile or delete) has been retried after having failed. + // Only applicable if Reason is ShootReconciling or ShootDeleting. + Retries *int32 } // TODO Condition constants diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go index 39118f801..b70cae200 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.pb.go @@ -383,10 +383,38 @@ func (m *ManagedSeedTemplate) XXX_DiscardUnknown() { var xxx_messageInfo_ManagedSeedTemplate proto.InternalMessageInfo +func (m *PendingReplica) Reset() { *m = PendingReplica{} } +func (*PendingReplica) ProtoMessage() {} +func (*PendingReplica) Descriptor() ([]byte, []int) { + return fileDescriptor_d64c05a219673fe5, []int{12} +} +func (m *PendingReplica) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PendingReplica) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *PendingReplica) XXX_Merge(src proto.Message) { + xxx_messageInfo_PendingReplica.Merge(m, src) +} +func (m *PendingReplica) XXX_Size() int { + return m.Size() +} +func (m *PendingReplica) XXX_DiscardUnknown() { + xxx_messageInfo_PendingReplica.DiscardUnknown(m) +} + +var xxx_messageInfo_PendingReplica proto.InternalMessageInfo + func (m *RollingUpdateStrategy) Reset() { *m = RollingUpdateStrategy{} } func (*RollingUpdateStrategy) ProtoMessage() {} func (*RollingUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_d64c05a219673fe5, []int{12} + return fileDescriptor_d64c05a219673fe5, []int{13} } func (m *RollingUpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -414,7 +442,7 @@ var xxx_messageInfo_RollingUpdateStrategy proto.InternalMessageInfo func (m *Shoot) Reset() { *m = Shoot{} } func (*Shoot) ProtoMessage() {} func (*Shoot) Descriptor() ([]byte, []int) { - return fileDescriptor_d64c05a219673fe5, []int{13} + return fileDescriptor_d64c05a219673fe5, []int{14} } func (m *Shoot) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -442,7 +470,7 @@ var xxx_messageInfo_Shoot proto.InternalMessageInfo func (m *UpdateStrategy) Reset() { *m = UpdateStrategy{} } func (*UpdateStrategy) ProtoMessage() {} func (*UpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_d64c05a219673fe5, []int{14} + return fileDescriptor_d64c05a219673fe5, []int{15} } func (m *UpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -482,6 +510,7 @@ func init() { proto.RegisterType((*ManagedSeedSpec)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.ManagedSeedSpec") proto.RegisterType((*ManagedSeedStatus)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.ManagedSeedStatus") proto.RegisterType((*ManagedSeedTemplate)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.ManagedSeedTemplate") + proto.RegisterType((*PendingReplica)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.PendingReplica") proto.RegisterType((*RollingUpdateStrategy)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.RollingUpdateStrategy") proto.RegisterType((*Shoot)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.Shoot") proto.RegisterType((*UpdateStrategy)(nil), "github.com.gardener.gardener.pkg.apis.seedmanagement.v1alpha1.UpdateStrategy") @@ -492,111 +521,117 @@ func init() { } var fileDescriptor_d64c05a219673fe5 = []byte{ - // 1650 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xcd, 0x6f, 0x1b, 0xc7, - 0x15, 0xd7, 0x52, 0xa2, 0xcc, 0x7d, 0x92, 0x28, 0x6b, 0x24, 0xab, 0xb4, 0x80, 0x92, 0x02, 0x4f, - 0x2a, 0x5a, 0x2f, 0x2b, 0xd5, 0x28, 0x5c, 0xb7, 0x2e, 0xca, 0x95, 0x55, 0x7f, 0x40, 0x92, 0xd5, - 0x91, 0xe4, 0x02, 0x45, 0x0f, 0x1d, 0x2e, 0xc7, 0xd4, 0x56, 0xdc, 0x0f, 0xef, 0x0e, 0x69, 0x13, - 0x01, 0x02, 0x23, 0xb7, 0x1c, 0x02, 0x04, 0xfe, 0x17, 0x02, 0xe4, 0x6f, 0xf1, 0x29, 0x30, 0x82, - 0x1c, 0x0c, 0x04, 0x20, 0x6c, 0x26, 0x48, 0x90, 0x7f, 0xc1, 0x87, 0x20, 0x98, 0xd9, 0xd9, 0x4f, - 0x92, 0x89, 0x22, 0x31, 0x3e, 0xe4, 0xb6, 0xf3, 0x3e, 0x7e, 0xef, 0xcd, 0x9b, 0x37, 0x6f, 0xde, - 0x5b, 0xd8, 0x6b, 0x99, 0xec, 0xa4, 0xd3, 0xd0, 0x0c, 0xc7, 0xaa, 0xb5, 0x88, 0xd7, 0xa4, 0x36, - 0xf5, 0xe2, 0x0f, 0xf7, 0xb4, 0x55, 0x23, 0xae, 0xe9, 0xd7, 0x7c, 0x4a, 0x9b, 0x16, 0xb1, 0x49, - 0x8b, 0x5a, 0xd4, 0x66, 0xb5, 0xee, 0x26, 0x69, 0xbb, 0x27, 0x64, 0xb3, 0xd6, 0xe2, 0x62, 0x84, - 0xd1, 0xa6, 0xe6, 0x7a, 0x0e, 0x73, 0xd0, 0xad, 0x18, 0x4e, 0x0b, 0x51, 0xe2, 0x0f, 0xf7, 0xb4, - 0xa5, 0x71, 0x38, 0x2d, 0x0d, 0xa7, 0x85, 0x70, 0x6b, 0xfa, 0xd9, 0xbc, 0x31, 0x1c, 0x8f, 0xd6, - 0xba, 0x9b, 0x0d, 0xca, 0x86, 0x5d, 0x58, 0xbb, 0x96, 0xc4, 0x70, 0x5a, 0x4e, 0x4d, 0x90, 0x1b, - 0x9d, 0x47, 0x62, 0x25, 0x16, 0xe2, 0x4b, 0x8a, 0x57, 0x4f, 0x6f, 0xf8, 0x9a, 0xe9, 0x70, 0xe0, - 0x10, 0x77, 0x08, 0xf2, 0x7a, 0x2c, 0x63, 0x11, 0xe3, 0xc4, 0xb4, 0xa9, 0xd7, 0x8b, 0xbd, 0xb1, - 0x28, 0x23, 0xa3, 0xb4, 0x6a, 0xe3, 0xb4, 0xbc, 0x8e, 0xcd, 0x4c, 0x8b, 0x0e, 0x29, 0xfc, 0xf9, - 0xa7, 0x14, 0x7c, 0xe3, 0x84, 0x5a, 0x24, 0xab, 0x57, 0x7d, 0x9d, 0x03, 0xf5, 0x8e, 0x08, 0x52, - 0x9b, 0x32, 0xf4, 0x81, 0x02, 0xd0, 0xa4, 0x6e, 0xdb, 0xe9, 0xf1, 0xd8, 0x96, 0x94, 0x75, 0x65, - 0x63, 0x6e, 0x0b, 0x6b, 0x17, 0x3a, 0x18, 0x2d, 0x82, 0xbf, 0x1d, 0x21, 0xeb, 0xc5, 0x41, 0xbf, - 0x02, 0xf1, 0x1a, 0x27, 0xac, 0xa2, 0x63, 0x98, 0x35, 0x1c, 0xfb, 0x91, 0xd9, 0x2a, 0xe5, 0x84, - 0xfd, 0x6b, 0x5a, 0xb0, 0x37, 0x2d, 0xb9, 0x37, 0x61, 0x56, 0xee, 0x4d, 0xc3, 0xe4, 0xc9, 0xce, - 0x53, 0x46, 0x6d, 0xdf, 0x74, 0x6c, 0xbd, 0xf8, 0xa2, 0x5f, 0x99, 0x1a, 0xf4, 0x2b, 0xb3, 0xdb, - 0x02, 0x04, 0x4b, 0x30, 0x74, 0x03, 0xd4, 0x86, 0xe3, 0x30, 0x9f, 0x79, 0xc4, 0x2d, 0x4d, 0xaf, - 0x2b, 0x1b, 0xaa, 0xbe, 0x36, 0xe8, 0x57, 0x54, 0x3d, 0x24, 0xbe, 0x4d, 0x2e, 0x70, 0x2c, 0x8c, - 0x6e, 0xc1, 0xa2, 0x45, 0xbd, 0x16, 0xfd, 0xb7, 0xc9, 0x4e, 0x0e, 0x88, 0xc7, 0x23, 0x33, 0xb3, - 0xae, 0x6c, 0x14, 0xf4, 0xe5, 0x41, 0xbf, 0xb2, 0xb8, 0x97, 0x66, 0xe1, 0xac, 0x6c, 0xf5, 0xb9, - 0x0a, 0xcb, 0x23, 0x62, 0x80, 0xae, 0xc3, 0xbc, 0x47, 0xdd, 0xb6, 0x69, 0x90, 0x6d, 0xa7, 0x23, - 0xa3, 0x9d, 0xd7, 0x2f, 0x0f, 0xfa, 0x95, 0x79, 0x9c, 0xa0, 0xe3, 0x94, 0x14, 0xda, 0x85, 0x15, - 0x8f, 0x76, 0x4d, 0xbe, 0xd5, 0xbb, 0xa6, 0xcf, 0x1c, 0xaf, 0xb7, 0x6b, 0x5a, 0x26, 0x13, 0xb1, - 0xca, 0xeb, 0xa5, 0x41, 0xbf, 0xb2, 0x82, 0x47, 0xf0, 0xf1, 0x48, 0x2d, 0xf4, 0x4f, 0x40, 0x3e, - 0xf5, 0xba, 0xa6, 0x41, 0xeb, 0x86, 0xc1, 0xf1, 0xf7, 0x89, 0x45, 0x65, 0x74, 0x56, 0x07, 0xfd, - 0x0a, 0x3a, 0x1c, 0xe2, 0xe2, 0x11, 0x1a, 0x88, 0x42, 0xde, 0xb4, 0x48, 0x8b, 0x8a, 0xc0, 0xcc, - 0x6d, 0xdd, 0xbe, 0x60, 0xca, 0xdc, 0xe3, 0x58, 0xba, 0x3a, 0xe8, 0x57, 0xf2, 0xe2, 0x13, 0x07, - 0xe8, 0xe8, 0x18, 0x54, 0x8f, 0xfa, 0x4e, 0xc7, 0x33, 0xa8, 0x5f, 0xca, 0x0b, 0x53, 0x1b, 0x89, - 0xec, 0xd0, 0xf8, 0x25, 0xd4, 0xba, 0x9b, 0x1a, 0x96, 0x42, 0x98, 0x3e, 0xee, 0x98, 0x9e, 0x00, - 0xf7, 0xf5, 0x05, 0x7e, 0xda, 0x21, 0xc7, 0xc7, 0x31, 0x12, 0x7a, 0xae, 0x80, 0xea, 0x3a, 0xcd, - 0x5d, 0xd2, 0xa0, 0x6d, 0xbf, 0x34, 0xbb, 0x3e, 0xbd, 0x31, 0xb7, 0x45, 0x26, 0x9f, 0xf5, 0xda, - 0x41, 0x68, 0x63, 0xc7, 0x66, 0x5e, 0x4f, 0x5f, 0x92, 0x99, 0xaa, 0x46, 0x74, 0x1c, 0xbb, 0x81, - 0x3e, 0x55, 0xa0, 0xe8, 0x3a, 0xcd, 0xba, 0x6d, 0x3b, 0x8c, 0x30, 0xd3, 0xb1, 0xfd, 0xd2, 0x25, - 0xe1, 0xd9, 0xa3, 0x5f, 0xc6, 0xb3, 0x84, 0xa1, 0xc0, 0xbd, 0x55, 0xe9, 0x5e, 0x31, 0xcd, 0xc4, - 0x19, 0xaf, 0x90, 0x01, 0x4b, 0xa4, 0xd9, 0x34, 0xf9, 0x82, 0xb4, 0x1f, 0x3a, 0xed, 0x8e, 0x45, - 0xfd, 0x52, 0x41, 0xb8, 0xba, 0x36, 0xea, 0x70, 0x02, 0x11, 0xfd, 0xaa, 0x84, 0x5f, 0xaa, 0x67, - 0x95, 0xf1, 0x30, 0x1e, 0x7a, 0x02, 0xab, 0x59, 0xe2, 0x1e, 0xcf, 0x3e, 0xbf, 0xa4, 0x0a, 0x4b, - 0x95, 0xf1, 0x96, 0x84, 0x9c, 0x5e, 0x96, 0xe6, 0x56, 0xeb, 0x23, 0x61, 0xf0, 0x18, 0x78, 0xf4, - 0x17, 0x98, 0xa6, 0x76, 0xb7, 0x04, 0xe3, 0xf7, 0xb3, 0x63, 0x77, 0x1f, 0x12, 0x4f, 0x9f, 0x93, - 0x06, 0xa6, 0x77, 0xec, 0x2e, 0xe6, 0x3a, 0xe8, 0x2a, 0x4c, 0x77, 0x5d, 0x52, 0x9a, 0x13, 0xb5, - 0xe2, 0x12, 0x67, 0x3d, 0x3c, 0xa8, 0x63, 0x4e, 0x5b, 0xfb, 0x1b, 0x14, 0xd3, 0xc9, 0x80, 0x2e, - 0xc3, 0xf4, 0x29, 0xed, 0x89, 0x22, 0xa0, 0x62, 0xfe, 0x89, 0x56, 0x20, 0xdf, 0x25, 0xed, 0x0e, - 0x15, 0x57, 0x5b, 0xc5, 0xc1, 0xe2, 0x66, 0xee, 0x86, 0xb2, 0x56, 0x87, 0xe5, 0x11, 0x07, 0xf6, - 0x73, 0x20, 0xaa, 0x9f, 0x28, 0x10, 0x5c, 0x2d, 0xa4, 0x01, 0x78, 0xd4, 0x75, 0x7c, 0x93, 0x57, - 0x85, 0x40, 0x39, 0x28, 0xcf, 0x38, 0xa2, 0xe2, 0x84, 0x04, 0xdf, 0x15, 0x23, 0x41, 0x6d, 0x56, - 0x83, 0x5d, 0x1d, 0x91, 0x16, 0xe6, 0x34, 0xf4, 0x00, 0xc0, 0xed, 0xb4, 0xdb, 0x07, 0x4e, 0xdb, - 0x34, 0x7a, 0xb2, 0x8a, 0xd4, 0x38, 0xd4, 0x41, 0x44, 0x7d, 0xdb, 0xaf, 0xfc, 0x76, 0xf8, 0xd5, - 0xd4, 0x62, 0x01, 0x9c, 0x80, 0xa8, 0x7e, 0x99, 0x83, 0xb9, 0x3d, 0x91, 0xc2, 0xcd, 0x43, 0x4a, - 0x9b, 0xe8, 0x7f, 0x50, 0xe0, 0x2f, 0x66, 0x93, 0x30, 0x22, 0x1f, 0xa7, 0x3f, 0x8e, 0x7d, 0x1c, - 0xc4, 0x1d, 0xe0, 0xd2, 0xfc, 0x8c, 0x1e, 0x34, 0xfe, 0x4f, 0x0d, 0xb6, 0x47, 0x19, 0xd1, 0x91, - 0x3c, 0x27, 0x88, 0x69, 0x38, 0x42, 0x45, 0x2e, 0xcc, 0xf8, 0x2e, 0x35, 0xe4, 0xd3, 0xb3, 0x7f, - 0xc1, 0xab, 0x96, 0xf0, 0xfd, 0xd0, 0xa5, 0x86, 0x3e, 0x2f, 0x6d, 0xcf, 0xf0, 0x15, 0x16, 0x96, - 0xd0, 0x53, 0x98, 0xf5, 0x19, 0x61, 0x1d, 0x5f, 0x04, 0x6c, 0x6e, 0xeb, 0x60, 0x82, 0x36, 0x05, - 0x6e, 0xfc, 0x22, 0x06, 0x6b, 0x2c, 0xed, 0x55, 0x5f, 0x2b, 0xb0, 0x98, 0x90, 0xde, 0x35, 0x7d, - 0x86, 0xfe, 0x3b, 0x14, 0x61, 0xed, 0x6c, 0x11, 0xe6, 0xda, 0x22, 0xbe, 0x97, 0xa5, 0xb5, 0x42, - 0x48, 0x49, 0x44, 0xd7, 0x81, 0xbc, 0xc9, 0xa8, 0xe5, 0x97, 0x72, 0xe2, 0x3a, 0xdd, 0x9f, 0xdc, - 0x56, 0xf5, 0x05, 0x69, 0x36, 0x7f, 0x8f, 0x1b, 0xc0, 0x81, 0x9d, 0xea, 0xd7, 0x39, 0x28, 0x26, - 0x03, 0x42, 0xd9, 0x3b, 0xc8, 0x21, 0x3f, 0x95, 0x43, 0xff, 0x9a, 0xe0, 0x79, 0x52, 0x36, 0x36, - 0x8d, 0xde, 0xcb, 0xa4, 0xd1, 0xe1, 0x64, 0xcd, 0xfe, 0x78, 0x26, 0x7d, 0xa3, 0x00, 0x4a, 0x2b, - 0xbc, 0x83, 0x64, 0xf2, 0xd2, 0xc9, 0xb4, 0x37, 0xd1, 0x0d, 0x8f, 0xc9, 0xa7, 0xef, 0x67, 0xb2, - 0x1b, 0xe5, 0x47, 0x80, 0x36, 0xa0, 0x20, 0x9b, 0x34, 0x5f, 0xb6, 0x71, 0xf3, 0xdc, 0x69, 0xd9, - 0xc6, 0xf9, 0x38, 0xe2, 0x22, 0x02, 0x05, 0x9f, 0xb6, 0xa9, 0xc1, 0x1c, 0x4f, 0xe6, 0xc7, 0x9f, - 0xce, 0x18, 0x12, 0xfe, 0x56, 0x1c, 0x4a, 0xd5, 0x38, 0x2e, 0x21, 0x05, 0x47, 0xb0, 0xe8, 0x99, - 0x02, 0x05, 0x46, 0x2d, 0xb7, 0x4d, 0x18, 0x95, 0xc9, 0x80, 0x27, 0x17, 0x9b, 0x23, 0x89, 0x1c, - 0xbb, 0x10, 0x52, 0x70, 0x64, 0x15, 0xbd, 0x0f, 0x0b, 0xfe, 0x89, 0xe3, 0xb0, 0x90, 0x25, 0xdb, - 0xc2, 0xfa, 0x19, 0xdd, 0x90, 0x2f, 0xab, 0x98, 0xd1, 0xb4, 0xc3, 0x24, 0x90, 0x7e, 0x45, 0x5a, - 0x5d, 0x48, 0x91, 0x71, 0xda, 0x1c, 0xfa, 0x50, 0x81, 0x62, 0xc7, 0x6d, 0x12, 0x46, 0x0f, 0x19, - 0x9f, 0x76, 0x5a, 0x3d, 0xd9, 0x2d, 0x5e, 0x34, 0x49, 0x8e, 0x53, 0xa0, 0x3a, 0xe2, 0xed, 0x51, - 0x9a, 0x86, 0x33, 0x86, 0xc7, 0x36, 0xec, 0xb3, 0xe7, 0x69, 0xd8, 0xab, 0x9f, 0xe5, 0x61, 0x65, - 0xd4, 0xd5, 0x44, 0xf7, 0x01, 0x39, 0x0d, 0xde, 0x99, 0xd3, 0xe6, 0x9d, 0x60, 0xc6, 0x33, 0x1d, - 0x5b, 0x24, 0xe3, 0xb4, 0xbe, 0x26, 0x83, 0x86, 0x1e, 0x0c, 0x49, 0xe0, 0x11, 0x5a, 0xe8, 0x0f, - 0x89, 0x74, 0x0e, 0xe6, 0x8a, 0xe8, 0xb0, 0x47, 0xa4, 0xf4, 0x5f, 0x61, 0xc1, 0xa3, 0xa4, 0xd9, - 0x0b, 0x59, 0x22, 0xe7, 0xf2, 0xf1, 0x49, 0xe1, 0x24, 0x13, 0xa7, 0x65, 0xd1, 0x1d, 0x58, 0xb2, - 0xe9, 0x53, 0x26, 0xd7, 0xfb, 0x1d, 0xab, 0x41, 0x3d, 0x91, 0x2d, 0xf9, 0xb8, 0x41, 0xdc, 0xcf, - 0x0a, 0xe0, 0x61, 0x1d, 0x54, 0x87, 0x45, 0xa3, 0xe3, 0x89, 0x09, 0x2c, 0xf4, 0x23, 0x2f, 0x60, - 0x7e, 0x23, 0x61, 0x16, 0xb7, 0xd3, 0x6c, 0x9c, 0x95, 0xe7, 0x10, 0xc1, 0xd9, 0x35, 0x23, 0x88, - 0xd9, 0x34, 0xc4, 0x71, 0x9a, 0x8d, 0xb3, 0xf2, 0x29, 0x2f, 0x82, 0xd3, 0x2b, 0x5d, 0x12, 0x6d, - 0xd0, 0xb0, 0x17, 0x01, 0x1b, 0x67, 0xe5, 0xd1, 0xdf, 0xc3, 0xd4, 0x8d, 0x10, 0x0a, 0xc1, 0x38, - 0x16, 0xb6, 0xe3, 0xc7, 0x29, 0x2e, 0xce, 0x48, 0xa3, 0x9b, 0x50, 0x34, 0x9c, 0x76, 0x5b, 0x2c, - 0x82, 0xc1, 0x52, 0x15, 0x9b, 0x10, 0xb9, 0xba, 0x9d, 0xe2, 0xe0, 0x8c, 0x24, 0x7a, 0x0c, 0x60, - 0x38, 0x76, 0xd0, 0x07, 0xfb, 0xb2, 0xe7, 0xbd, 0x75, 0x9e, 0x4b, 0xbb, 0x1d, 0xa2, 0xc4, 0x4f, - 0x65, 0x44, 0xf2, 0x71, 0xc2, 0x48, 0xf5, 0xdb, 0x5c, 0xaa, 0x09, 0x11, 0xe5, 0x94, 0x42, 0x5e, - 0xdc, 0x67, 0xf9, 0x68, 0x5c, 0x74, 0x9a, 0x14, 0xa5, 0x22, 0x98, 0x26, 0xc5, 0x27, 0x0e, 0xd0, - 0x51, 0x17, 0xe6, 0xfd, 0x44, 0x45, 0x93, 0xf5, 0xf8, 0x1f, 0xe7, 0x2a, 0x52, 0xa9, 0xca, 0xc8, - 0x47, 0xf8, 0x24, 0x05, 0xa7, 0xec, 0xa0, 0x0e, 0xa8, 0xad, 0x70, 0x06, 0x93, 0x05, 0xfa, 0xee, - 0xa4, 0x66, 0xba, 0x60, 0xca, 0x8d, 0x96, 0x38, 0xb6, 0x54, 0xfd, 0x5c, 0x81, 0xa5, 0xa1, 0xe6, - 0x30, 0x73, 0xe4, 0xca, 0x3b, 0x38, 0xf2, 0x31, 0xa5, 0x2a, 0x77, 0x9e, 0x52, 0x55, 0xfd, 0x4e, - 0x81, 0xe5, 0x11, 0xaf, 0xd3, 0xaf, 0x71, 0x52, 0xa8, 0xde, 0x86, 0x2b, 0x98, 0xdf, 0x57, 0xbb, - 0x95, 0x7e, 0x72, 0xd0, 0xef, 0x41, 0x75, 0x89, 0xc7, 0xcc, 0xa8, 0xe4, 0xe7, 0x83, 0x34, 0x38, - 0x08, 0x89, 0x38, 0xe6, 0x57, 0x7f, 0x07, 0xc1, 0x2d, 0x40, 0xeb, 0x30, 0x63, 0x13, 0x8b, 0xca, - 0x91, 0x2f, 0x32, 0x28, 0xfe, 0xf1, 0x08, 0x4e, 0xf5, 0x0b, 0x05, 0x32, 0xaf, 0x1b, 0xda, 0x82, - 0x19, 0xd6, 0x73, 0x43, 0xa5, 0x32, 0x57, 0x38, 0xea, 0xb9, 0xf4, 0x6d, 0xbf, 0x82, 0xd2, 0x92, - 0x9c, 0x8a, 0x85, 0x2c, 0xfa, 0x48, 0x81, 0x05, 0x2f, 0xe9, 0xb8, 0x8c, 0xd9, 0xd1, 0x05, 0x63, - 0x36, 0x32, 0x18, 0xfa, 0x92, 0x78, 0x73, 0x92, 0x2c, 0x9c, 0xb6, 0xae, 0x6b, 0x2f, 0xde, 0x94, - 0xa7, 0x5e, 0xbe, 0x29, 0x4f, 0xbd, 0x7a, 0x53, 0x9e, 0x7a, 0x36, 0x28, 0x2b, 0x2f, 0x06, 0x65, - 0xe5, 0xe5, 0xa0, 0xac, 0xbc, 0x1a, 0x94, 0x95, 0xd7, 0x83, 0xb2, 0xf2, 0xf1, 0x57, 0xe5, 0xa9, - 0xff, 0x14, 0x42, 0x3b, 0x3f, 0x04, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x44, 0x1b, 0xc7, 0xe8, 0x16, - 0x00, 0x00, + // 1754 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x58, 0xdd, 0x8f, 0x1b, 0x49, + 0x11, 0xdf, 0xd9, 0x5d, 0x7b, 0x3d, 0xe5, 0x5d, 0x6f, 0xb6, 0xb3, 0x17, 0x7c, 0x2b, 0x61, 0xaf, + 0x2c, 0x81, 0x96, 0x8f, 0x1b, 0x93, 0xe5, 0x84, 0xc2, 0x41, 0x4e, 0x78, 0x36, 0x21, 0x77, 0xa7, + 0x6c, 0x62, 0xda, 0xbb, 0x41, 0x42, 0x3c, 0xd0, 0x9e, 0xe9, 0x78, 0x87, 0x78, 0x3e, 0x6e, 0xba, + 0xed, 0x8b, 0x85, 0x84, 0x4e, 0xbc, 0xf1, 0x80, 0x84, 0xee, 0x5f, 0x40, 0xe2, 0x6f, 0xc9, 0xe3, + 0x09, 0xf1, 0x70, 0x02, 0xc9, 0x4a, 0x0c, 0x02, 0xc1, 0x9f, 0x90, 0x07, 0x84, 0xba, 0xa7, 0xe7, + 0xd3, 0x36, 0x59, 0xb2, 0x26, 0x0f, 0xbc, 0x4d, 0xd7, 0xc7, 0xaf, 0xaa, 0xab, 0xab, 0xab, 0xaa, + 0x07, 0x4e, 0x07, 0x0e, 0xbf, 0x18, 0xf5, 0x0d, 0xcb, 0x77, 0xdb, 0x03, 0x12, 0xda, 0xd4, 0xa3, + 0x61, 0xfa, 0x11, 0x3c, 0x19, 0xb4, 0x49, 0xe0, 0xb0, 0x36, 0xa3, 0xd4, 0x76, 0x89, 0x47, 0x06, + 0xd4, 0xa5, 0x1e, 0x6f, 0x8f, 0x6f, 0x92, 0x61, 0x70, 0x41, 0x6e, 0xb6, 0x07, 0x42, 0x8c, 0x70, + 0x6a, 0x1b, 0x41, 0xe8, 0x73, 0x1f, 0xdd, 0x4e, 0xe1, 0x8c, 0x18, 0x25, 0xfd, 0x08, 0x9e, 0x0c, + 0x0c, 0x01, 0x67, 0xe4, 0xe1, 0x8c, 0x18, 0xee, 0xc0, 0xbc, 0x9c, 0x37, 0x96, 0x1f, 0xd2, 0xf6, + 0xf8, 0x66, 0x9f, 0xf2, 0x79, 0x17, 0x0e, 0xde, 0xc9, 0x62, 0xf8, 0x03, 0xbf, 0x2d, 0xc9, 0xfd, + 0xd1, 0x63, 0xb9, 0x92, 0x0b, 0xf9, 0xa5, 0xc4, 0x5b, 0x4f, 0x6e, 0x31, 0xc3, 0xf1, 0x05, 0x70, + 0x8c, 0x3b, 0x07, 0xf9, 0x6e, 0x2a, 0xe3, 0x12, 0xeb, 0xc2, 0xf1, 0x68, 0x38, 0x49, 0xbd, 0x71, + 0x29, 0x27, 0x8b, 0xb4, 0xda, 0xcb, 0xb4, 0xc2, 0x91, 0xc7, 0x1d, 0x97, 0xce, 0x29, 0x7c, 0xe7, + 0x55, 0x0a, 0xcc, 0xba, 0xa0, 0x2e, 0x29, 0xea, 0xb5, 0x9e, 0xaf, 0x83, 0x7e, 0x4f, 0x06, 0x69, + 0x48, 0x39, 0xfa, 0x95, 0x06, 0x60, 0xd3, 0x60, 0xe8, 0x4f, 0x44, 0x6c, 0xeb, 0xda, 0xa1, 0x76, + 0x54, 0x3d, 0xc6, 0xc6, 0x95, 0x0e, 0xc6, 0x48, 0xe0, 0xef, 0x24, 0xc8, 0x66, 0x6d, 0x36, 0x6d, + 0x42, 0xba, 0xc6, 0x19, 0xab, 0xe8, 0x1c, 0xca, 0x96, 0xef, 0x3d, 0x76, 0x06, 0xf5, 0x75, 0x69, + 0xff, 0x1d, 0x23, 0xda, 0x9b, 0x91, 0xdd, 0x9b, 0x34, 0xab, 0xf6, 0x66, 0x60, 0xf2, 0xc9, 0xdd, + 0xa7, 0x9c, 0x7a, 0xcc, 0xf1, 0x3d, 0xb3, 0xf6, 0x6c, 0xda, 0x5c, 0x9b, 0x4d, 0x9b, 0xe5, 0x13, + 0x09, 0x82, 0x15, 0x18, 0xba, 0x05, 0x7a, 0xdf, 0xf7, 0x39, 0xe3, 0x21, 0x09, 0xea, 0x1b, 0x87, + 0xda, 0x91, 0x6e, 0x1e, 0xcc, 0xa6, 0x4d, 0xdd, 0x8c, 0x89, 0x2f, 0xb3, 0x0b, 0x9c, 0x0a, 0xa3, + 0xdb, 0xb0, 0xeb, 0xd2, 0x70, 0x40, 0x7f, 0xec, 0xf0, 0x8b, 0x2e, 0x09, 0x45, 0x64, 0x36, 0x0f, + 0xb5, 0xa3, 0x8a, 0x79, 0x7d, 0x36, 0x6d, 0xee, 0x9e, 0xe6, 0x59, 0xb8, 0x28, 0xdb, 0xfa, 0x4c, + 0x87, 0xeb, 0x0b, 0x62, 0x80, 0xde, 0x85, 0xed, 0x90, 0x06, 0x43, 0xc7, 0x22, 0x27, 0xfe, 0x48, + 0x45, 0xbb, 0x64, 0x5e, 0x9b, 0x4d, 0x9b, 0xdb, 0x38, 0x43, 0xc7, 0x39, 0x29, 0x74, 0x1f, 0xf6, + 0x43, 0x3a, 0x76, 0xc4, 0x56, 0x3f, 0x70, 0x18, 0xf7, 0xc3, 0xc9, 0x7d, 0xc7, 0x75, 0xb8, 0x8c, + 0x55, 0xc9, 0xac, 0xcf, 0xa6, 0xcd, 0x7d, 0xbc, 0x80, 0x8f, 0x17, 0x6a, 0xa1, 0x1f, 0x02, 0x62, + 0x34, 0x1c, 0x3b, 0x16, 0xed, 0x58, 0x96, 0xc0, 0x7f, 0x40, 0x5c, 0xaa, 0xa2, 0x73, 0x63, 0x36, + 0x6d, 0xa2, 0xde, 0x1c, 0x17, 0x2f, 0xd0, 0x40, 0x14, 0x4a, 0x8e, 0x4b, 0x06, 0x54, 0x06, 0xa6, + 0x7a, 0x7c, 0xe7, 0x8a, 0x29, 0xf3, 0xa1, 0xc0, 0x32, 0xf5, 0xd9, 0xb4, 0x59, 0x92, 0x9f, 0x38, + 0x42, 0x47, 0xe7, 0xa0, 0x87, 0x94, 0xf9, 0xa3, 0xd0, 0xa2, 0xac, 0x5e, 0x92, 0xa6, 0x8e, 0x32, + 0xd9, 0x61, 0x88, 0x4b, 0x68, 0x8c, 0x6f, 0x1a, 0x58, 0x09, 0x61, 0xfa, 0xf1, 0xc8, 0x09, 0x25, + 0x38, 0x33, 0x77, 0xc4, 0x69, 0xc7, 0x1c, 0x86, 0x53, 0x24, 0xf4, 0x99, 0x06, 0x7a, 0xe0, 0xdb, + 0xf7, 0x49, 0x9f, 0x0e, 0x59, 0xbd, 0x7c, 0xb8, 0x71, 0x54, 0x3d, 0x26, 0xab, 0xcf, 0x7a, 0xa3, + 0x1b, 0xdb, 0xb8, 0xeb, 0xf1, 0x70, 0x62, 0xee, 0xa9, 0x4c, 0xd5, 0x13, 0x3a, 0x4e, 0xdd, 0x40, + 0xbf, 0xd7, 0xa0, 0x16, 0xf8, 0x76, 0xc7, 0xf3, 0x7c, 0x4e, 0xb8, 0xe3, 0x7b, 0xac, 0xbe, 0x25, + 0x3d, 0x7b, 0xfc, 0xbf, 0xf1, 0x2c, 0x63, 0x28, 0x72, 0xef, 0x86, 0x72, 0xaf, 0x96, 0x67, 0xe2, + 0x82, 0x57, 0xc8, 0x82, 0x3d, 0x62, 0xdb, 0x8e, 0x58, 0x90, 0xe1, 0x23, 0x7f, 0x38, 0x72, 0x29, + 0xab, 0x57, 0xa4, 0xab, 0x07, 0x8b, 0x0e, 0x27, 0x12, 0x31, 0xdf, 0x56, 0xf0, 0x7b, 0x9d, 0xa2, + 0x32, 0x9e, 0xc7, 0x43, 0x9f, 0xc0, 0x8d, 0x22, 0xf1, 0x54, 0x64, 0x1f, 0xab, 0xeb, 0xd2, 0x52, + 0x73, 0xb9, 0x25, 0x29, 0x67, 0x36, 0x94, 0xb9, 0x1b, 0x9d, 0x85, 0x30, 0x78, 0x09, 0x3c, 0xfa, + 0x2e, 0x6c, 0x50, 0x6f, 0x5c, 0x87, 0xe5, 0xfb, 0xb9, 0xeb, 0x8d, 0x1f, 0x91, 0xd0, 0xac, 0x2a, + 0x03, 0x1b, 0x77, 0xbd, 0x31, 0x16, 0x3a, 0xe8, 0x6d, 0xd8, 0x18, 0x07, 0xa4, 0x5e, 0x95, 0xb5, + 0x62, 0x4b, 0xb0, 0x1e, 0x75, 0x3b, 0x58, 0xd0, 0x0e, 0xbe, 0x0f, 0xb5, 0x7c, 0x32, 0xa0, 0x6b, + 0xb0, 0xf1, 0x84, 0x4e, 0x64, 0x11, 0xd0, 0xb1, 0xf8, 0x44, 0xfb, 0x50, 0x1a, 0x93, 0xe1, 0x88, + 0xca, 0xab, 0xad, 0xe3, 0x68, 0xf1, 0xde, 0xfa, 0x2d, 0xed, 0xa0, 0x03, 0xd7, 0x17, 0x1c, 0xd8, + 0x7f, 0x03, 0xd1, 0xfa, 0x9d, 0x06, 0xd1, 0xd5, 0x42, 0x06, 0x40, 0x48, 0x03, 0x9f, 0x39, 0xa2, + 0x2a, 0x44, 0xca, 0x51, 0x79, 0xc6, 0x09, 0x15, 0x67, 0x24, 0xc4, 0xae, 0x38, 0x89, 0x6a, 0xb3, + 0x1e, 0xed, 0xea, 0x8c, 0x0c, 0xb0, 0xa0, 0xa1, 0x87, 0x00, 0xc1, 0x68, 0x38, 0xec, 0xfa, 0x43, + 0xc7, 0x9a, 0xa8, 0x2a, 0xd2, 0x16, 0x50, 0xdd, 0x84, 0xfa, 0x72, 0xda, 0xfc, 0xf2, 0x7c, 0xd7, + 0x34, 0x52, 0x01, 0x9c, 0x81, 0x68, 0xfd, 0x79, 0x1d, 0xaa, 0xa7, 0x32, 0x85, 0xed, 0x1e, 0xa5, + 0x36, 0xfa, 0x19, 0x54, 0x44, 0xc7, 0xb4, 0x09, 0x27, 0xaa, 0x39, 0x7d, 0x6b, 0x69, 0x73, 0x90, + 0x77, 0x40, 0x48, 0x8b, 0x33, 0x7a, 0xd8, 0xff, 0x39, 0xb5, 0xf8, 0x29, 0xe5, 0xc4, 0x44, 0xea, + 0x9c, 0x20, 0xa5, 0xe1, 0x04, 0x15, 0x05, 0xb0, 0xc9, 0x02, 0x6a, 0xa9, 0xd6, 0xf3, 0xe0, 0x8a, + 0x57, 0x2d, 0xe3, 0x7b, 0x2f, 0xa0, 0x96, 0xb9, 0xad, 0x6c, 0x6f, 0x8a, 0x15, 0x96, 0x96, 0xd0, + 0x53, 0x28, 0x33, 0x4e, 0xf8, 0x88, 0xc9, 0x80, 0x55, 0x8f, 0xbb, 0x2b, 0xb4, 0x29, 0x71, 0xd3, + 0x8e, 0x18, 0xad, 0xb1, 0xb2, 0xd7, 0x7a, 0xae, 0xc1, 0x6e, 0x46, 0xfa, 0xbe, 0xc3, 0x38, 0xfa, + 0xe9, 0x5c, 0x84, 0x8d, 0xcb, 0x45, 0x58, 0x68, 0xcb, 0xf8, 0x5e, 0x53, 0xd6, 0x2a, 0x31, 0x25, + 0x13, 0x5d, 0x1f, 0x4a, 0x0e, 0xa7, 0x2e, 0xab, 0xaf, 0xcb, 0xeb, 0xf4, 0xd1, 0xea, 0xb6, 0x6a, + 0xee, 0x28, 0xb3, 0xa5, 0x0f, 0x85, 0x01, 0x1c, 0xd9, 0x69, 0xfd, 0x75, 0x1d, 0x6a, 0xd9, 0x80, + 0x50, 0xfe, 0x06, 0x72, 0x88, 0xe5, 0x72, 0xe8, 0x47, 0x2b, 0x3c, 0x4f, 0xca, 0x97, 0xa6, 0xd1, + 0x2f, 0x0a, 0x69, 0xd4, 0x5b, 0xad, 0xd9, 0xff, 0x9c, 0x49, 0x7f, 0xd3, 0x00, 0xe5, 0x15, 0xde, + 0x40, 0x32, 0x85, 0xf9, 0x64, 0x3a, 0x5d, 0xe9, 0x86, 0x97, 0xe4, 0xd3, 0xbf, 0x36, 0x8b, 0x1b, + 0x15, 0x47, 0x80, 0x8e, 0xa0, 0xa2, 0x86, 0x34, 0xa6, 0xc6, 0xb8, 0x6d, 0xe1, 0xb4, 0x1a, 0xe3, + 0x18, 0x4e, 0xb8, 0x88, 0x40, 0x85, 0xd1, 0x21, 0xb5, 0xb8, 0x1f, 0xaa, 0xfc, 0xf8, 0xf6, 0x25, + 0x43, 0x22, 0x7a, 0x45, 0x4f, 0xa9, 0xa6, 0x71, 0x89, 0x29, 0x38, 0x81, 0x45, 0x9f, 0x6a, 0x50, + 0xe1, 0xd4, 0x0d, 0x86, 0x84, 0x53, 0x95, 0x0c, 0x78, 0x75, 0xb1, 0x39, 0x53, 0xc8, 0xa9, 0x0b, + 0x31, 0x05, 0x27, 0x56, 0xd1, 0x2f, 0x61, 0x87, 0x5d, 0xf8, 0x3e, 0x8f, 0x59, 0x6a, 0x2c, 0xec, + 0x5c, 0xd2, 0x0d, 0xd5, 0x59, 0xe5, 0x1b, 0xcd, 0xe8, 0x65, 0x81, 0xcc, 0xb7, 0x94, 0xd5, 0x9d, + 0x1c, 0x19, 0xe7, 0xcd, 0xa1, 0x5f, 0x6b, 0x50, 0x1b, 0x05, 0x36, 0xe1, 0xb4, 0xc7, 0xc5, 0x6b, + 0x67, 0x30, 0x51, 0xd3, 0xe2, 0x55, 0x93, 0xe4, 0x3c, 0x07, 0x6a, 0x22, 0x31, 0x1e, 0xe5, 0x69, + 0xb8, 0x60, 0x78, 0xe9, 0xc0, 0x5e, 0x7e, 0x9d, 0x81, 0xbd, 0xf5, 0xa7, 0x32, 0xec, 0x2f, 0xba, + 0x9a, 0xe8, 0x23, 0x40, 0x7e, 0x5f, 0x4c, 0xe6, 0xd4, 0xbe, 0x17, 0xbd, 0xf1, 0x1c, 0xdf, 0x93, + 0xc9, 0xb8, 0x61, 0x1e, 0xa8, 0xa0, 0xa1, 0x87, 0x73, 0x12, 0x78, 0x81, 0x16, 0xfa, 0x66, 0x26, + 0x9d, 0xa3, 0x77, 0x45, 0x72, 0xd8, 0x0b, 0x52, 0xfa, 0x7b, 0xb0, 0x13, 0x52, 0x62, 0x4f, 0x62, + 0x96, 0xcc, 0xb9, 0x52, 0x7a, 0x52, 0x38, 0xcb, 0xc4, 0x79, 0x59, 0x74, 0x0f, 0xf6, 0x3c, 0xfa, + 0x94, 0xab, 0xf5, 0x83, 0x91, 0xdb, 0xa7, 0xa1, 0xcc, 0x96, 0x52, 0x3a, 0x20, 0x3e, 0x28, 0x0a, + 0xe0, 0x79, 0x1d, 0xd4, 0x81, 0x5d, 0x6b, 0x14, 0xca, 0x17, 0x58, 0xec, 0x47, 0x49, 0xc2, 0x7c, + 0x49, 0xc1, 0xec, 0x9e, 0xe4, 0xd9, 0xb8, 0x28, 0x2f, 0x20, 0xa2, 0xb3, 0xb3, 0x13, 0x88, 0x72, + 0x1e, 0xe2, 0x3c, 0xcf, 0xc6, 0x45, 0xf9, 0x9c, 0x17, 0xd1, 0xe9, 0xd5, 0xb7, 0xe4, 0x18, 0x34, + 0xef, 0x45, 0xc4, 0xc6, 0x45, 0x79, 0xf4, 0x7e, 0x9c, 0xba, 0x09, 0x42, 0x25, 0x7a, 0x8e, 0xc5, + 0xe3, 0xf8, 0x79, 0x8e, 0x8b, 0x0b, 0xd2, 0xe8, 0x3d, 0xa8, 0x59, 0xfe, 0x70, 0x28, 0x17, 0xd1, + 0xc3, 0x52, 0x97, 0x9b, 0x90, 0xb9, 0x7a, 0x92, 0xe3, 0xe0, 0x82, 0x24, 0xfa, 0x18, 0xc0, 0xf2, + 0xbd, 0x68, 0x0e, 0x66, 0x6a, 0xe6, 0xbd, 0xfd, 0x3a, 0x97, 0xf6, 0x24, 0x46, 0x49, 0x5b, 0x65, + 0x42, 0x62, 0x38, 0x63, 0x44, 0x5e, 0xd5, 0x80, 0x7a, 0xb6, 0xe3, 0x0d, 0x54, 0x14, 0xe5, 0xc0, + 0x7c, 0xf5, 0xab, 0xda, 0xcd, 0x81, 0x46, 0xdb, 0xcf, 0xd3, 0x70, 0xc1, 0x70, 0xeb, 0xef, 0xeb, + 0xb9, 0x81, 0x48, 0x96, 0x76, 0x0a, 0x25, 0x59, 0x5b, 0x54, 0x03, 0xbb, 0xea, 0xcb, 0x56, 0x96, + 0xad, 0xe8, 0x65, 0x2b, 0x3f, 0x71, 0x84, 0x8e, 0xc6, 0xb0, 0xcd, 0x32, 0xd5, 0x55, 0xf5, 0x86, + 0x1f, 0xbc, 0x56, 0xc1, 0xcc, 0x55, 0xe9, 0xd9, 0xb4, 0xb9, 0x9d, 0xa5, 0xe0, 0x9c, 0x1d, 0x34, + 0x02, 0x7d, 0x10, 0xbf, 0x07, 0x55, 0xb3, 0xf8, 0x60, 0x55, 0xef, 0xcb, 0xe8, 0xc5, 0x9d, 0x2c, + 0x71, 0x6a, 0xa9, 0xf5, 0x07, 0x0d, 0xf6, 0xe6, 0x06, 0xd5, 0x42, 0xfa, 0x69, 0x6f, 0x22, 0xfd, + 0x16, 0x97, 0xcd, 0xf5, 0xd7, 0x29, 0x9b, 0xad, 0x7f, 0x68, 0x70, 0x7d, 0x41, 0xa7, 0xfc, 0x7f, + 0x7c, 0xb5, 0xb4, 0xfe, 0xa9, 0x41, 0xe1, 0x36, 0xa1, 0x43, 0xd8, 0xf4, 0x88, 0x4b, 0xd5, 0x13, + 0x32, 0x51, 0x92, 0xff, 0x8c, 0x24, 0x07, 0xbd, 0x0f, 0xe5, 0x90, 0x12, 0xa6, 0x02, 0xac, 0x9b, + 0x5f, 0x8d, 0xc7, 0x49, 0x2c, 0xa9, 0x2f, 0xa7, 0xcd, 0xfd, 0xc2, 0x0d, 0x95, 0x74, 0xac, 0xb4, + 0xd0, 0x43, 0x28, 0x31, 0xc7, 0xb3, 0xe2, 0xa9, 0xe6, 0xeb, 0x97, 0x8b, 0xe2, 0x99, 0xe3, 0xd2, + 0x74, 0x9c, 0xeb, 0x09, 0x00, 0x1c, 0xe1, 0xa0, 0xaf, 0xc0, 0x56, 0x48, 0x79, 0xe8, 0x50, 0xa6, + 0x7a, 0x4e, 0x75, 0x36, 0x6d, 0x6e, 0xe1, 0x88, 0x84, 0x63, 0x5e, 0xeb, 0x0e, 0xbc, 0x85, 0x45, + 0xa1, 0xf4, 0x06, 0xf9, 0x5e, 0x8f, 0xbe, 0x01, 0x7a, 0x40, 0x42, 0xee, 0x24, 0xbd, 0xb6, 0x14, + 0xe5, 0x7c, 0x37, 0x26, 0xe2, 0x94, 0xdf, 0xfa, 0x1a, 0x44, 0x57, 0xfe, 0xd5, 0x81, 0x6a, 0xfd, + 0x51, 0x83, 0xc2, 0x58, 0x81, 0x8e, 0x61, 0x93, 0x4f, 0x82, 0x58, 0xa9, 0x21, 0x14, 0xce, 0x26, + 0x01, 0x7d, 0x39, 0x6d, 0xa2, 0xbc, 0xa4, 0xa0, 0x62, 0x29, 0x8b, 0x7e, 0xa3, 0xc1, 0x4e, 0x98, + 0x75, 0x5c, 0x25, 0xc8, 0xd9, 0x15, 0x13, 0x64, 0x61, 0x30, 0xcc, 0x3d, 0xd9, 0xec, 0xb3, 0x2c, + 0x9c, 0xb7, 0x6e, 0x1a, 0xcf, 0x5e, 0x34, 0xd6, 0x3e, 0x7f, 0xd1, 0x58, 0xfb, 0xe2, 0x45, 0x63, + 0xed, 0xd3, 0x59, 0x43, 0x7b, 0x36, 0x6b, 0x68, 0x9f, 0xcf, 0x1a, 0xda, 0x17, 0xb3, 0x86, 0xf6, + 0x7c, 0xd6, 0xd0, 0x7e, 0xfb, 0x97, 0xc6, 0xda, 0x4f, 0x2a, 0xb1, 0x9d, 0x7f, 0x07, 0x00, 0x00, + 0xff, 0xff, 0x05, 0xed, 0x1a, 0x1d, 0x61, 0x18, 0x00, 0x00, } func (m *Gardenlet) Marshal() (dAtA []byte, err error) { @@ -1164,6 +1199,18 @@ func (m *ManagedSeedSetStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PendingReplica != nil { + { + size, err := m.PendingReplica.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if len(m.Conditions) > 0 { for iNdEx := len(m.Conditions) - 1; iNdEx >= 0; iNdEx-- { { @@ -1356,6 +1403,54 @@ func (m *ManagedSeedTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *PendingReplica) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PendingReplica) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PendingReplica) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Retries != nil { + i = encodeVarintGenerated(dAtA, i, uint64(*m.Retries)) + i-- + dAtA[i] = 0x20 + } + { + size, err := m.Since.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x12 + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *RollingUpdateStrategy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1686,6 +1781,10 @@ func (m *ManagedSeedSetStatus) Size() (n int) { n += 1 + l + sovGenerated(uint64(l)) } } + if m.PendingReplica != nil { + l = m.PendingReplica.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1739,6 +1838,24 @@ func (m *ManagedSeedTemplate) Size() (n int) { return n } +func (m *PendingReplica) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Since.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Retries != nil { + n += 1 + sovGenerated(uint64(*m.Retries)) + } + return n +} + func (m *RollingUpdateStrategy) Size() (n int) { if m == nil { return 0 @@ -1956,6 +2073,7 @@ func (this *ManagedSeedSetStatus) String() string { `UpdateRevision:` + fmt.Sprintf("%v", this.UpdateRevision) + `,`, `CollisionCount:` + valueToStringGenerated(this.CollisionCount) + `,`, `Conditions:` + repeatedStringForConditions + `,`, + `PendingReplica:` + strings.Replace(this.PendingReplica.String(), "PendingReplica", "PendingReplica", 1) + `,`, `}`, }, "") return s @@ -1999,6 +2117,19 @@ func (this *ManagedSeedTemplate) String() string { }, "") return s } +func (this *PendingReplica) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PendingReplica{`, + `Name:` + fmt.Sprintf("%v", this.Name) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Since:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Since), "Time", "v11.Time", 1), `&`, ``, 1) + `,`, + `Retries:` + valueToStringGenerated(this.Retries) + `,`, + `}`, + }, "") + return s +} func (this *RollingUpdateStrategy) String() string { if this == nil { return "nil" @@ -3974,6 +4105,42 @@ func (m *ManagedSeedSetStatus) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PendingReplica", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PendingReplica == nil { + m.PendingReplica = &PendingReplica{} + } + if err := m.PendingReplica.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -4384,6 +4551,176 @@ func (m *ManagedSeedTemplate) Unmarshal(dAtA []byte) error { } return nil } +func (m *PendingReplica) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PendingReplica: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PendingReplica: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Name = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = PendingReplicaReason(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Since", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Since.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Retries", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Retries = &v + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *RollingUpdateStrategy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto index 219d021bb..17da9c75b 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/generated.proto @@ -238,6 +238,11 @@ message ManagedSeedSetStatus { // +patchStrategy=merge // +optional repeated github.com.gardener.gardener.pkg.apis.core.v1beta1.Condition conditions = 10; + + // PendingReplica, if not empty, indicates the replica that is currently pending creation, update, or deletion. + // This replica is in a state that requires the controller to wait for it to change before advancing to the next replica. + // +optional + optional PendingReplica pendingReplica = 11; } // ManagedSeedSpec is the specification of a ManagedSeed. @@ -282,6 +287,23 @@ message ManagedSeedTemplate { optional ManagedSeedSpec spec = 2; } +// PendingReplica contains information about a replica that is currently pending creation, update, or deletion. +message PendingReplica { + // Name is the replica name. + optional string name = 1; + + // Reason is the reason for the replica to be pending. + optional string reason = 2; + + // Since is the moment in time since the replica is pending with the specified reason. + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time since = 3; + + // Retries is the number of times the shoot operation (reconcile or delete) has been retried after having failed. + // Only applicable if Reason is ShootReconciling or ShootDeleting. + // +optional + optional int32 retries = 4; +} + // RollingUpdateStrategy is used to communicate parameters for RollingUpdateStrategyType. message RollingUpdateStrategy { // Partition indicates the ordinal at which the ManagedSeedSet should be partitioned. Defaults to 0. diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseed.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseed.go index 6ec5b161f..d1e75cda1 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseed.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseed.go @@ -181,8 +181,6 @@ type ManagedSeedStatus struct { } const ( - // ManagedSeedShootExists is a condition type for indicating whether the ManagedSeed's shoot exists. - ManagedSeedShootExists gardencorev1beta1.ConditionType = "ShootExists" // ManagedSeedShootReconciled is a condition type for indicating whether the ManagedSeed's shoot has been reconciled. ManagedSeedShootReconciled gardencorev1beta1.ConditionType = "ShootReconciled" // ManagedSeedSeedRegistered is a condition type for indicating whether the ManagedSeed's seed has been registered, diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseedset.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseedset.go index 91bc279ca..682ad1e72 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseedset.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/types_managedseedset.go @@ -137,6 +137,46 @@ type ManagedSeedSetStatus struct { // +patchStrategy=merge // +optional Conditions []gardencorev1beta1.Condition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,10,rep,name=conditions"` + // PendingReplica, if not empty, indicates the replica that is currently pending creation, update, or deletion. + // This replica is in a state that requires the controller to wait for it to change before advancing to the next replica. + // +optional + PendingReplica *PendingReplica `json:"pendingReplica,omitempty" protobuf:"bytes,11,opt,name=pendingReplica"` +} + +// PendingReplicaReason is a string enumeration type that enumerates all possible reasons for a replica to be pending. +type PendingReplicaReason string + +const ( + // ShootReconcilingReason indicates that the replica's shoot is reconciling. + ShootReconcilingReason PendingReplicaReason = "ShootReconciling" + // ShootDeletingReason indicates that the replica's shoot is deleting. + ShootDeletingReason PendingReplicaReason = "ShootDeleting" + // ShootReconcileFailedReason indicates that the reconciliation of this replica's shoot has failed. + ShootReconcileFailedReason PendingReplicaReason = "ShootReconcileFailed" + // ShootDeleteFailedReason indicates that the deletion of tis replica's shoot has failed. + ShootDeleteFailedReason PendingReplicaReason = "ShootDeleteFailed" + // ManagedSeedPreparingReason indicates that the replica's managed seed is preparing. + ManagedSeedPreparingReason PendingReplicaReason = "ManagedSeedPreparing" + // ManagedSeedDeletingReason indicates that the replica's managed seed is deleting. + ManagedSeedDeletingReason PendingReplicaReason = "ManagedSeedDeleting" + // SeedNotReadyReason indicates that the replica's seed is not ready. + SeedNotReadyReason PendingReplicaReason = "SeedNotReady" + // ShootNotHealthyReason indicates that the replica's shoot is not healthy. + ShootNotHealthyReason PendingReplicaReason = "ShootNotHealthy" +) + +// PendingReplica contains information about a replica that is currently pending creation, update, or deletion. +type PendingReplica struct { + // Name is the replica name. + Name string `json:"name" protobuf:"bytes,1,opt,name=name"` + // Reason is the reason for the replica to be pending. + Reason PendingReplicaReason `json:"reason" protobuf:"bytes,2,opt,name=reason,casttype=PendingReplicaReason"` + // Since is the moment in time since the replica is pending with the specified reason. + Since metav1.Time `json:"since" protobuf:"bytes,3,opt,name=since"` + // Retries is the number of times the shoot operation (reconcile or delete) has been retried after having failed. + // Only applicable if Reason is ShootReconciling or ShootDeleting. + // +optional + Retries *int32 `json:"retries,omitempty" protobuf:"varint,4,opt,name=retries"` } // TODO Condition constants diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go index 34f663538..27c2a586d 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.conversion.go @@ -148,6 +148,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*PendingReplica)(nil), (*seedmanagement.PendingReplica)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_PendingReplica_To_seedmanagement_PendingReplica(a.(*PendingReplica), b.(*seedmanagement.PendingReplica), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*seedmanagement.PendingReplica)(nil), (*PendingReplica)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_seedmanagement_PendingReplica_To_v1alpha1_PendingReplica(a.(*seedmanagement.PendingReplica), b.(*PendingReplica), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*RollingUpdateStrategy)(nil), (*seedmanagement.RollingUpdateStrategy)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_RollingUpdateStrategy_To_seedmanagement_RollingUpdateStrategy(a.(*RollingUpdateStrategy), b.(*seedmanagement.RollingUpdateStrategy), scope) }); err != nil { @@ -492,6 +502,7 @@ func autoConvert_v1alpha1_ManagedSeedSetStatus_To_seedmanagement_ManagedSeedSetS out.UpdateRevision = in.UpdateRevision out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) out.Conditions = *(*[]core.Condition)(unsafe.Pointer(&in.Conditions)) + out.PendingReplica = (*seedmanagement.PendingReplica)(unsafe.Pointer(in.PendingReplica)) return nil } @@ -511,6 +522,7 @@ func autoConvert_seedmanagement_ManagedSeedSetStatus_To_v1alpha1_ManagedSeedSetS out.UpdateRevision = in.UpdateRevision out.CollisionCount = (*int32)(unsafe.Pointer(in.CollisionCount)) out.Conditions = *(*[]v1beta1.Condition)(unsafe.Pointer(&in.Conditions)) + out.PendingReplica = (*PendingReplica)(unsafe.Pointer(in.PendingReplica)) return nil } @@ -623,6 +635,32 @@ func Convert_seedmanagement_ManagedSeedTemplate_To_v1alpha1_ManagedSeedTemplate( return autoConvert_seedmanagement_ManagedSeedTemplate_To_v1alpha1_ManagedSeedTemplate(in, out, s) } +func autoConvert_v1alpha1_PendingReplica_To_seedmanagement_PendingReplica(in *PendingReplica, out *seedmanagement.PendingReplica, s conversion.Scope) error { + out.Name = in.Name + out.Reason = seedmanagement.PendingReplicaReason(in.Reason) + out.Since = in.Since + out.Retries = (*int32)(unsafe.Pointer(in.Retries)) + return nil +} + +// Convert_v1alpha1_PendingReplica_To_seedmanagement_PendingReplica is an autogenerated conversion function. +func Convert_v1alpha1_PendingReplica_To_seedmanagement_PendingReplica(in *PendingReplica, out *seedmanagement.PendingReplica, s conversion.Scope) error { + return autoConvert_v1alpha1_PendingReplica_To_seedmanagement_PendingReplica(in, out, s) +} + +func autoConvert_seedmanagement_PendingReplica_To_v1alpha1_PendingReplica(in *seedmanagement.PendingReplica, out *PendingReplica, s conversion.Scope) error { + out.Name = in.Name + out.Reason = PendingReplicaReason(in.Reason) + out.Since = in.Since + out.Retries = (*int32)(unsafe.Pointer(in.Retries)) + return nil +} + +// Convert_seedmanagement_PendingReplica_To_v1alpha1_PendingReplica is an autogenerated conversion function. +func Convert_seedmanagement_PendingReplica_To_v1alpha1_PendingReplica(in *seedmanagement.PendingReplica, out *PendingReplica, s conversion.Scope) error { + return autoConvert_seedmanagement_PendingReplica_To_v1alpha1_PendingReplica(in, out, s) +} + func autoConvert_v1alpha1_RollingUpdateStrategy_To_seedmanagement_RollingUpdateStrategy(in *RollingUpdateStrategy, out *seedmanagement.RollingUpdateStrategy, s conversion.Scope) error { out.Partition = (*int32)(unsafe.Pointer(in.Partition)) return nil diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go index e9fa5272b..328c9a224 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/v1alpha1/zz_generated.deepcopy.go @@ -341,6 +341,11 @@ func (in *ManagedSeedSetStatus) DeepCopyInto(out *ManagedSeedSetStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.PendingReplica != nil { + in, out := &in.PendingReplica, &out.PendingReplica + *out = new(PendingReplica) + (*in).DeepCopyInto(*out) + } return } @@ -426,6 +431,28 @@ func (in *ManagedSeedTemplate) DeepCopy() *ManagedSeedTemplate { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PendingReplica) DeepCopyInto(out *PendingReplica) { + *out = *in + in.Since.DeepCopyInto(&out.Since) + if in.Retries != nil { + in, out := &in.Retries, &out.Retries + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingReplica. +func (in *PendingReplica) DeepCopy() *PendingReplica { + if in == nil { + return nil + } + out := new(PendingReplica) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RollingUpdateStrategy) DeepCopyInto(out *RollingUpdateStrategy) { *out = *in diff --git a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go index bea2b3c68..5a39bb7cb 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/seedmanagement/zz_generated.deepcopy.go @@ -343,6 +343,11 @@ func (in *ManagedSeedSetStatus) DeepCopyInto(out *ManagedSeedSetStatus) { (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.PendingReplica != nil { + in, out := &in.PendingReplica, &out.PendingReplica + *out = new(PendingReplica) + (*in).DeepCopyInto(*out) + } return } @@ -428,6 +433,28 @@ func (in *ManagedSeedTemplate) DeepCopy() *ManagedSeedTemplate { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PendingReplica) DeepCopyInto(out *PendingReplica) { + *out = *in + in.Since.DeepCopyInto(&out.Since) + if in.Retries != nil { + in, out := &in.Retries, &out.Retries + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PendingReplica. +func (in *PendingReplica) DeepCopy() *PendingReplica { + if in == nil { + return nil + } + out := new(PendingReplica) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *RollingUpdateStrategy) DeepCopyInto(out *RollingUpdateStrategy) { *out = *in diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/types_shared.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/types_shared.go index 849a9ee87..8f4e7bba4 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/types_shared.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/types_shared.go @@ -63,7 +63,6 @@ type KubeAPIServerOpenIDConnect struct { // The URL of the OpenID issuer, only HTTPS scheme will be accepted. If set, it will be used to verify the OIDC JSON Web Token (JWT). // Required. IssuerURL string - // ATTENTION: Only meaningful for Kubernetes >= 1.11 // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. RequiredClaims map[string]string // List of allowed JOSE asymmetric signing algorithms. JWTs with a 'alg' header value not in this list will be rejected. Values are defined by RFC 7518 https://tools.ietf.org/html/rfc7518#section-3.1 diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto index 7f5c6d371..947035b8c 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/generated.proto @@ -85,7 +85,6 @@ message KubeAPIServerOpenIDConnect { optional string issuerURL = 5; // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. - // Only applied when the Kubernetes version of the Shoot is >= 1.11 // +optional map requiredClaims = 6; diff --git a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/types_shared.go b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/types_shared.go index 01b4e840e..416893921 100644 --- a/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/types_shared.go +++ b/vendor/github.com/gardener/gardener/pkg/apis/settings/v1alpha1/types_shared.go @@ -76,7 +76,6 @@ type KubeAPIServerOpenIDConnect struct { // Required. IssuerURL string `json:"issuerURL" protobuf:"bytes,5,opt,name=issuerURL"` // key=value pairs that describes a required claim in the ID Token. If set, the claim is verified to be present in the ID Token with a matching value. - // Only applied when the Kubernetes version of the Shoot is >= 1.11 // +optional RequiredClaims map[string]string `json:"requiredClaims,omitempty" protobuf:"bytes,6,rep,name=requiredClaims"` // List of allowed JOSE asymmetric signing algorithms. JWTs with a 'alg' header value not in this list will be rejected. Values are defined by RFC 7518 https://tools.ietf.org/html/rfc7518#section-3.1 diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go new file mode 100644 index 000000000..1ef0fbc5d --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupbucket.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// BackupBucketLister helps list BackupBuckets. +// All objects returned here must be treated as read-only. +type BackupBucketLister interface { + // List lists all BackupBuckets in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.BackupBucket, err error) + // Get retrieves the BackupBucket from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.BackupBucket, error) + BackupBucketListerExpansion +} + +// backupBucketLister implements the BackupBucketLister interface. +type backupBucketLister struct { + indexer cache.Indexer +} + +// NewBackupBucketLister returns a new BackupBucketLister. +func NewBackupBucketLister(indexer cache.Indexer) BackupBucketLister { + return &backupBucketLister{indexer: indexer} +} + +// List lists all BackupBuckets in the indexer. +func (s *backupBucketLister) List(selector labels.Selector) (ret []*core.BackupBucket, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.BackupBucket)) + }) + return ret, err +} + +// Get retrieves the BackupBucket from the index for a given name. +func (s *backupBucketLister) Get(name string) (*core.BackupBucket, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("backupbucket"), name) + } + return obj.(*core.BackupBucket), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go new file mode 100644 index 000000000..b2ed6868c --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/backupentry.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// BackupEntryLister helps list BackupEntries. +// All objects returned here must be treated as read-only. +type BackupEntryLister interface { + // List lists all BackupEntries in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.BackupEntry, err error) + // BackupEntries returns an object that can list and get BackupEntries. + BackupEntries(namespace string) BackupEntryNamespaceLister + BackupEntryListerExpansion +} + +// backupEntryLister implements the BackupEntryLister interface. +type backupEntryLister struct { + indexer cache.Indexer +} + +// NewBackupEntryLister returns a new BackupEntryLister. +func NewBackupEntryLister(indexer cache.Indexer) BackupEntryLister { + return &backupEntryLister{indexer: indexer} +} + +// List lists all BackupEntries in the indexer. +func (s *backupEntryLister) List(selector labels.Selector) (ret []*core.BackupEntry, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.BackupEntry)) + }) + return ret, err +} + +// BackupEntries returns an object that can list and get BackupEntries. +func (s *backupEntryLister) BackupEntries(namespace string) BackupEntryNamespaceLister { + return backupEntryNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// BackupEntryNamespaceLister helps list and get BackupEntries. +// All objects returned here must be treated as read-only. +type BackupEntryNamespaceLister interface { + // List lists all BackupEntries in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.BackupEntry, err error) + // Get retrieves the BackupEntry from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.BackupEntry, error) + BackupEntryNamespaceListerExpansion +} + +// backupEntryNamespaceLister implements the BackupEntryNamespaceLister +// interface. +type backupEntryNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all BackupEntries in the indexer for a given namespace. +func (s backupEntryNamespaceLister) List(selector labels.Selector) (ret []*core.BackupEntry, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.BackupEntry)) + }) + return ret, err +} + +// Get retrieves the BackupEntry from the indexer for a given namespace and name. +func (s backupEntryNamespaceLister) Get(name string) (*core.BackupEntry, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("backupentry"), name) + } + return obj.(*core.BackupEntry), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go new file mode 100644 index 000000000..6721fa190 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/cloudprofile.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// CloudProfileLister helps list CloudProfiles. +// All objects returned here must be treated as read-only. +type CloudProfileLister interface { + // List lists all CloudProfiles in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.CloudProfile, err error) + // Get retrieves the CloudProfile from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.CloudProfile, error) + CloudProfileListerExpansion +} + +// cloudProfileLister implements the CloudProfileLister interface. +type cloudProfileLister struct { + indexer cache.Indexer +} + +// NewCloudProfileLister returns a new CloudProfileLister. +func NewCloudProfileLister(indexer cache.Indexer) CloudProfileLister { + return &cloudProfileLister{indexer: indexer} +} + +// List lists all CloudProfiles in the indexer. +func (s *cloudProfileLister) List(selector labels.Selector) (ret []*core.CloudProfile, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.CloudProfile)) + }) + return ret, err +} + +// Get retrieves the CloudProfile from the index for a given name. +func (s *cloudProfileLister) Get(name string) (*core.CloudProfile, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("cloudprofile"), name) + } + return obj.(*core.CloudProfile), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go new file mode 100644 index 000000000..b873af531 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerinstallation.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ControllerInstallationLister helps list ControllerInstallations. +// All objects returned here must be treated as read-only. +type ControllerInstallationLister interface { + // List lists all ControllerInstallations in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.ControllerInstallation, err error) + // Get retrieves the ControllerInstallation from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.ControllerInstallation, error) + ControllerInstallationListerExpansion +} + +// controllerInstallationLister implements the ControllerInstallationLister interface. +type controllerInstallationLister struct { + indexer cache.Indexer +} + +// NewControllerInstallationLister returns a new ControllerInstallationLister. +func NewControllerInstallationLister(indexer cache.Indexer) ControllerInstallationLister { + return &controllerInstallationLister{indexer: indexer} +} + +// List lists all ControllerInstallations in the indexer. +func (s *controllerInstallationLister) List(selector labels.Selector) (ret []*core.ControllerInstallation, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.ControllerInstallation)) + }) + return ret, err +} + +// Get retrieves the ControllerInstallation from the index for a given name. +func (s *controllerInstallationLister) Get(name string) (*core.ControllerInstallation, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("controllerinstallation"), name) + } + return obj.(*core.ControllerInstallation), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go new file mode 100644 index 000000000..39acc404a --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/controllerregistration.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ControllerRegistrationLister helps list ControllerRegistrations. +// All objects returned here must be treated as read-only. +type ControllerRegistrationLister interface { + // List lists all ControllerRegistrations in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.ControllerRegistration, err error) + // Get retrieves the ControllerRegistration from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.ControllerRegistration, error) + ControllerRegistrationListerExpansion +} + +// controllerRegistrationLister implements the ControllerRegistrationLister interface. +type controllerRegistrationLister struct { + indexer cache.Indexer +} + +// NewControllerRegistrationLister returns a new ControllerRegistrationLister. +func NewControllerRegistrationLister(indexer cache.Indexer) ControllerRegistrationLister { + return &controllerRegistrationLister{indexer: indexer} +} + +// List lists all ControllerRegistrations in the indexer. +func (s *controllerRegistrationLister) List(selector labels.Selector) (ret []*core.ControllerRegistration, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.ControllerRegistration)) + }) + return ret, err +} + +// Get retrieves the ControllerRegistration from the index for a given name. +func (s *controllerRegistrationLister) Get(name string) (*core.ControllerRegistration, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("controllerregistration"), name) + } + return obj.(*core.ControllerRegistration), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go new file mode 100644 index 000000000..e2690e302 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/expansion_generated.go @@ -0,0 +1,91 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +// BackupBucketListerExpansion allows custom methods to be added to +// BackupBucketLister. +type BackupBucketListerExpansion interface{} + +// BackupEntryListerExpansion allows custom methods to be added to +// BackupEntryLister. +type BackupEntryListerExpansion interface{} + +// BackupEntryNamespaceListerExpansion allows custom methods to be added to +// BackupEntryNamespaceLister. +type BackupEntryNamespaceListerExpansion interface{} + +// CloudProfileListerExpansion allows custom methods to be added to +// CloudProfileLister. +type CloudProfileListerExpansion interface{} + +// ControllerInstallationListerExpansion allows custom methods to be added to +// ControllerInstallationLister. +type ControllerInstallationListerExpansion interface{} + +// ControllerRegistrationListerExpansion allows custom methods to be added to +// ControllerRegistrationLister. +type ControllerRegistrationListerExpansion interface{} + +// PlantListerExpansion allows custom methods to be added to +// PlantLister. +type PlantListerExpansion interface{} + +// PlantNamespaceListerExpansion allows custom methods to be added to +// PlantNamespaceLister. +type PlantNamespaceListerExpansion interface{} + +// ProjectListerExpansion allows custom methods to be added to +// ProjectLister. +type ProjectListerExpansion interface{} + +// QuotaListerExpansion allows custom methods to be added to +// QuotaLister. +type QuotaListerExpansion interface{} + +// QuotaNamespaceListerExpansion allows custom methods to be added to +// QuotaNamespaceLister. +type QuotaNamespaceListerExpansion interface{} + +// SecretBindingListerExpansion allows custom methods to be added to +// SecretBindingLister. +type SecretBindingListerExpansion interface{} + +// SecretBindingNamespaceListerExpansion allows custom methods to be added to +// SecretBindingNamespaceLister. +type SecretBindingNamespaceListerExpansion interface{} + +// SeedListerExpansion allows custom methods to be added to +// SeedLister. +type SeedListerExpansion interface{} + +// ShootListerExpansion allows custom methods to be added to +// ShootLister. +type ShootListerExpansion interface{} + +// ShootNamespaceListerExpansion allows custom methods to be added to +// ShootNamespaceLister. +type ShootNamespaceListerExpansion interface{} + +// ShootStateListerExpansion allows custom methods to be added to +// ShootStateLister. +type ShootStateListerExpansion interface{} + +// ShootStateNamespaceListerExpansion allows custom methods to be added to +// ShootStateNamespaceLister. +type ShootStateNamespaceListerExpansion interface{} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go new file mode 100644 index 000000000..00feab542 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/plant.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// PlantLister helps list Plants. +// All objects returned here must be treated as read-only. +type PlantLister interface { + // List lists all Plants in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Plant, err error) + // Plants returns an object that can list and get Plants. + Plants(namespace string) PlantNamespaceLister + PlantListerExpansion +} + +// plantLister implements the PlantLister interface. +type plantLister struct { + indexer cache.Indexer +} + +// NewPlantLister returns a new PlantLister. +func NewPlantLister(indexer cache.Indexer) PlantLister { + return &plantLister{indexer: indexer} +} + +// List lists all Plants in the indexer. +func (s *plantLister) List(selector labels.Selector) (ret []*core.Plant, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.Plant)) + }) + return ret, err +} + +// Plants returns an object that can list and get Plants. +func (s *plantLister) Plants(namespace string) PlantNamespaceLister { + return plantNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// PlantNamespaceLister helps list and get Plants. +// All objects returned here must be treated as read-only. +type PlantNamespaceLister interface { + // List lists all Plants in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Plant, err error) + // Get retrieves the Plant from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.Plant, error) + PlantNamespaceListerExpansion +} + +// plantNamespaceLister implements the PlantNamespaceLister +// interface. +type plantNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Plants in the indexer for a given namespace. +func (s plantNamespaceLister) List(selector labels.Selector) (ret []*core.Plant, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.Plant)) + }) + return ret, err +} + +// Get retrieves the Plant from the indexer for a given namespace and name. +func (s plantNamespaceLister) Get(name string) (*core.Plant, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("plant"), name) + } + return obj.(*core.Plant), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go new file mode 100644 index 000000000..f5dc3952d --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/project.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ProjectLister helps list Projects. +// All objects returned here must be treated as read-only. +type ProjectLister interface { + // List lists all Projects in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Project, err error) + // Get retrieves the Project from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.Project, error) + ProjectListerExpansion +} + +// projectLister implements the ProjectLister interface. +type projectLister struct { + indexer cache.Indexer +} + +// NewProjectLister returns a new ProjectLister. +func NewProjectLister(indexer cache.Indexer) ProjectLister { + return &projectLister{indexer: indexer} +} + +// List lists all Projects in the indexer. +func (s *projectLister) List(selector labels.Selector) (ret []*core.Project, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.Project)) + }) + return ret, err +} + +// Get retrieves the Project from the index for a given name. +func (s *projectLister) Get(name string) (*core.Project, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("project"), name) + } + return obj.(*core.Project), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go new file mode 100644 index 000000000..71deacca8 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/quota.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// QuotaLister helps list Quotas. +// All objects returned here must be treated as read-only. +type QuotaLister interface { + // List lists all Quotas in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Quota, err error) + // Quotas returns an object that can list and get Quotas. + Quotas(namespace string) QuotaNamespaceLister + QuotaListerExpansion +} + +// quotaLister implements the QuotaLister interface. +type quotaLister struct { + indexer cache.Indexer +} + +// NewQuotaLister returns a new QuotaLister. +func NewQuotaLister(indexer cache.Indexer) QuotaLister { + return "aLister{indexer: indexer} +} + +// List lists all Quotas in the indexer. +func (s *quotaLister) List(selector labels.Selector) (ret []*core.Quota, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.Quota)) + }) + return ret, err +} + +// Quotas returns an object that can list and get Quotas. +func (s *quotaLister) Quotas(namespace string) QuotaNamespaceLister { + return quotaNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// QuotaNamespaceLister helps list and get Quotas. +// All objects returned here must be treated as read-only. +type QuotaNamespaceLister interface { + // List lists all Quotas in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Quota, err error) + // Get retrieves the Quota from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.Quota, error) + QuotaNamespaceListerExpansion +} + +// quotaNamespaceLister implements the QuotaNamespaceLister +// interface. +type quotaNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Quotas in the indexer for a given namespace. +func (s quotaNamespaceLister) List(selector labels.Selector) (ret []*core.Quota, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.Quota)) + }) + return ret, err +} + +// Get retrieves the Quota from the indexer for a given namespace and name. +func (s quotaNamespaceLister) Get(name string) (*core.Quota, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("quota"), name) + } + return obj.(*core.Quota), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go new file mode 100644 index 000000000..40f30fea0 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/secretbinding.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// SecretBindingLister helps list SecretBindings. +// All objects returned here must be treated as read-only. +type SecretBindingLister interface { + // List lists all SecretBindings in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.SecretBinding, err error) + // SecretBindings returns an object that can list and get SecretBindings. + SecretBindings(namespace string) SecretBindingNamespaceLister + SecretBindingListerExpansion +} + +// secretBindingLister implements the SecretBindingLister interface. +type secretBindingLister struct { + indexer cache.Indexer +} + +// NewSecretBindingLister returns a new SecretBindingLister. +func NewSecretBindingLister(indexer cache.Indexer) SecretBindingLister { + return &secretBindingLister{indexer: indexer} +} + +// List lists all SecretBindings in the indexer. +func (s *secretBindingLister) List(selector labels.Selector) (ret []*core.SecretBinding, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.SecretBinding)) + }) + return ret, err +} + +// SecretBindings returns an object that can list and get SecretBindings. +func (s *secretBindingLister) SecretBindings(namespace string) SecretBindingNamespaceLister { + return secretBindingNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// SecretBindingNamespaceLister helps list and get SecretBindings. +// All objects returned here must be treated as read-only. +type SecretBindingNamespaceLister interface { + // List lists all SecretBindings in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.SecretBinding, err error) + // Get retrieves the SecretBinding from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.SecretBinding, error) + SecretBindingNamespaceListerExpansion +} + +// secretBindingNamespaceLister implements the SecretBindingNamespaceLister +// interface. +type secretBindingNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all SecretBindings in the indexer for a given namespace. +func (s secretBindingNamespaceLister) List(selector labels.Selector) (ret []*core.SecretBinding, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.SecretBinding)) + }) + return ret, err +} + +// Get retrieves the SecretBinding from the indexer for a given namespace and name. +func (s secretBindingNamespaceLister) Get(name string) (*core.SecretBinding, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("secretbinding"), name) + } + return obj.(*core.SecretBinding), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go new file mode 100644 index 000000000..a2c6f8648 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/seed.go @@ -0,0 +1,68 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// SeedLister helps list Seeds. +// All objects returned here must be treated as read-only. +type SeedLister interface { + // List lists all Seeds in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Seed, err error) + // Get retrieves the Seed from the index for a given name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.Seed, error) + SeedListerExpansion +} + +// seedLister implements the SeedLister interface. +type seedLister struct { + indexer cache.Indexer +} + +// NewSeedLister returns a new SeedLister. +func NewSeedLister(indexer cache.Indexer) SeedLister { + return &seedLister{indexer: indexer} +} + +// List lists all Seeds in the indexer. +func (s *seedLister) List(selector labels.Selector) (ret []*core.Seed, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.Seed)) + }) + return ret, err +} + +// Get retrieves the Seed from the index for a given name. +func (s *seedLister) Get(name string) (*core.Seed, error) { + obj, exists, err := s.indexer.GetByKey(name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("seed"), name) + } + return obj.(*core.Seed), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go new file mode 100644 index 000000000..9ee704ab5 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shoot.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ShootLister helps list Shoots. +// All objects returned here must be treated as read-only. +type ShootLister interface { + // List lists all Shoots in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Shoot, err error) + // Shoots returns an object that can list and get Shoots. + Shoots(namespace string) ShootNamespaceLister + ShootListerExpansion +} + +// shootLister implements the ShootLister interface. +type shootLister struct { + indexer cache.Indexer +} + +// NewShootLister returns a new ShootLister. +func NewShootLister(indexer cache.Indexer) ShootLister { + return &shootLister{indexer: indexer} +} + +// List lists all Shoots in the indexer. +func (s *shootLister) List(selector labels.Selector) (ret []*core.Shoot, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.Shoot)) + }) + return ret, err +} + +// Shoots returns an object that can list and get Shoots. +func (s *shootLister) Shoots(namespace string) ShootNamespaceLister { + return shootNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// ShootNamespaceLister helps list and get Shoots. +// All objects returned here must be treated as read-only. +type ShootNamespaceLister interface { + // List lists all Shoots in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.Shoot, err error) + // Get retrieves the Shoot from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.Shoot, error) + ShootNamespaceListerExpansion +} + +// shootNamespaceLister implements the ShootNamespaceLister +// interface. +type shootNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Shoots in the indexer for a given namespace. +func (s shootNamespaceLister) List(selector labels.Selector) (ret []*core.Shoot, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.Shoot)) + }) + return ret, err +} + +// Get retrieves the Shoot from the indexer for a given namespace and name. +func (s shootNamespaceLister) Get(name string) (*core.Shoot, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("shoot"), name) + } + return obj.(*core.Shoot), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go new file mode 100644 index 000000000..53b2fea50 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/core/listers/core/internalversion/shootstate.go @@ -0,0 +1,99 @@ +/* +Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file + +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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package internalversion + +import ( + core "github.com/gardener/gardener/pkg/apis/core" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// ShootStateLister helps list ShootStates. +// All objects returned here must be treated as read-only. +type ShootStateLister interface { + // List lists all ShootStates in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.ShootState, err error) + // ShootStates returns an object that can list and get ShootStates. + ShootStates(namespace string) ShootStateNamespaceLister + ShootStateListerExpansion +} + +// shootStateLister implements the ShootStateLister interface. +type shootStateLister struct { + indexer cache.Indexer +} + +// NewShootStateLister returns a new ShootStateLister. +func NewShootStateLister(indexer cache.Indexer) ShootStateLister { + return &shootStateLister{indexer: indexer} +} + +// List lists all ShootStates in the indexer. +func (s *shootStateLister) List(selector labels.Selector) (ret []*core.ShootState, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*core.ShootState)) + }) + return ret, err +} + +// ShootStates returns an object that can list and get ShootStates. +func (s *shootStateLister) ShootStates(namespace string) ShootStateNamespaceLister { + return shootStateNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// ShootStateNamespaceLister helps list and get ShootStates. +// All objects returned here must be treated as read-only. +type ShootStateNamespaceLister interface { + // List lists all ShootStates in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*core.ShootState, err error) + // Get retrieves the ShootState from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*core.ShootState, error) + ShootStateNamespaceListerExpansion +} + +// shootStateNamespaceLister implements the ShootStateNamespaceLister +// interface. +type shootStateNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all ShootStates in the indexer for a given namespace. +func (s shootStateNamespaceLister) List(selector labels.Selector) (ret []*core.ShootState, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*core.ShootState)) + }) + return ret, err +} + +// Get retrieves the ShootState from the indexer for a given namespace and name. +func (s shootStateNamespaceLister) Get(name string) (*core.ShootState, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(core.Resource("shootstate"), name) + } + return obj.(*core.ShootState), nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/admissionplugins.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/admissionplugins.go index 0095d6d80..bad9857f4 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/admissionplugins.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/admissionplugins.go @@ -37,17 +37,12 @@ var ( {Name: "MutatingAdmissionWebhook"}, {Name: "ValidatingAdmissionWebhook"}, } - defaultPluginsWithInitializers = append(defaultPlugins, gardencorev1beta1.AdmissionPlugin{Name: "Initializers"}) - lowestSupportedKubernetesVersionMajorMinor = "1.10" + lowestSupportedKubernetesVersionMajorMinor = "1.15" lowestSupportedKubernetesVersion, _ = semver.NewVersion(lowestSupportedKubernetesVersionMajorMinor) admissionPlugins = map[string][]gardencorev1beta1.AdmissionPlugin{ - "1.10": defaultPluginsWithInitializers, - "1.11": defaultPluginsWithInitializers, - "1.12": defaultPluginsWithInitializers, - "1.13": defaultPluginsWithInitializers, - "1.14": defaultPlugins, + "1.15": defaultPlugins, } ) diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go new file mode 100644 index 000000000..712b6cd69 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/cache.go @@ -0,0 +1,136 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 cache + +import ( + "context" + "strings" + + "github.com/gardener/gardener/pkg/logger" + + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/cache" + runtimecache "sigs.k8s.io/controller-runtime/pkg/cache" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +var _ cache.Cache = &aggregator{} + +// aggregator is a cache that can hold different cache implementations depending on the objects' GVKs. +type aggregator struct { + fallbackCache cache.Cache + gvkToCache map[schema.GroupVersionKind]cache.Cache + scheme *runtime.Scheme +} + +func (c *aggregator) cacheForObject(obj runtime.Object) cache.Cache { + gvks, _, err := c.scheme.ObjectKinds(obj) + if err != nil || len(gvks) != 1 { + return c.fallbackCache + } + + return c.cacheForKind(gvks[0]) +} + +func (c *aggregator) cacheForKind(kind schema.GroupVersionKind) cache.Cache { + gvk := kind + if strings.HasSuffix(gvk.Kind, "List") { + gvk.Kind = gvk.Kind[:len(gvk.Kind)-4] + } + + cache, ok := c.gvkToCache[gvk] + if !ok { + cache = c.fallbackCache + } + return cache +} + +func processError(err error) error { + if !IsAPIError(err) { + // Return every other, unspecified error as a `CacheError` to allow users to follow up with a proper error handling. + // For instance, a `Multinamespace` cache returns an unspecified error for unknown namespaces. + // https://github.com/kubernetes-sigs/controller-runtime/blob/b5065bd85190e92864522fcc85aa4f6a3cce4f82/pkg/cache/multi_namespace_cache.go#L132 + return NewCacheError(err) + } + return err +} + +// Get retrieves an obj for the given object key from the Kubernetes Cluster. +// Every non-API related error is returned as a `CacheError`. +func (c *aggregator) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { + if err := c.cacheForObject(obj).Get(ctx, key, obj); err != nil { + return processError(err) + } + return nil +} + +// List retrieves list of objects for a given namespace and list options. +// Every non-API related error is returned as a `CacheError`. +func (c *aggregator) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + if err := c.cacheForObject(list).List(ctx, list, opts...); err != nil { + return processError(err) + } + return nil +} + +func (c *aggregator) GetInformer(ctx context.Context, obj client.Object) (cache.Informer, error) { + return c.cacheForObject(obj).GetInformer(ctx, obj) +} + +func (c *aggregator) GetInformerForKind(ctx context.Context, gvk schema.GroupVersionKind) (cache.Informer, error) { + return c.cacheForKind(gvk).GetInformerForKind(ctx, gvk) +} + +func (c *aggregator) Start(ctx context.Context) error { + for gvk, cache := range c.gvkToCache { + go func(gvk schema.GroupVersionKind, cache runtimecache.Cache) { + err := cache.Start(ctx) + if err != nil { + logger.Logger.Errorf("cache failed to start for %q: %v", gvk.String(), err) + } + }(gvk, cache) + } + go func() { + if err := c.fallbackCache.Start(ctx); err != nil { + logger.Logger.Error(err) + } + }() + <-ctx.Done() + + return nil +} + +func (c *aggregator) WaitForCacheSync(ctx context.Context) bool { + for _, cache := range c.gvkToCache { + if !cache.WaitForCacheSync(ctx) { + return false + } + } + return c.fallbackCache.WaitForCacheSync(ctx) +} + +func (c *aggregator) IndexField(ctx context.Context, obj client.Object, field string, extractValue client.IndexerFunc) error { + return c.cacheForObject(obj).IndexField(ctx, obj, field, extractValue) +} + +// NewAggregator creates a new instance of an aggregated cache. +func NewAggregator(fallbackCache cache.Cache, gvkToCache map[schema.GroupVersionKind]cache.Cache, scheme *runtime.Scheme) cache.Cache { + return &aggregator{ + fallbackCache: fallbackCache, + gvkToCache: gvkToCache, + scheme: scheme, + } +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/errors.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/errors.go new file mode 100644 index 000000000..0f683b888 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/cache/errors.go @@ -0,0 +1,53 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 cache + +import ( + "fmt" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" +) + +// IsAPIError checks if the given error is API related. +func IsAPIError(err error) bool { + if _, ok := err.(apierrors.APIStatus); ok { + return true + } + if meta.IsNoMatchError(err) || meta.IsAmbiguousError(err) { + return true + } + return false +} + +// CacheError is an error type indicating that an cache error occurred. +type CacheError struct { + cause error +} + +// Unwrap returns the next error in the error chain. +func (e *CacheError) Unwrap() error { + return e.cause +} + +// Error returns the error string with the underlying error. +func (e *CacheError) Error() string { + return fmt.Errorf("an underlying cache error occurred: %w", e.cause).Error() +} + +// NewCacheError returns a new instance of `CacheError`. +func NewCacheError(err error) error { + return &CacheError{err} +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go index e9cc4e54f..f98a0c1f3 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/client.go @@ -35,9 +35,11 @@ import ( gardencoreclientset "github.com/gardener/gardener/pkg/client/core/clientset/versioned" gardenercorescheme "github.com/gardener/gardener/pkg/client/core/clientset/versioned/scheme" + kcache "github.com/gardener/gardener/pkg/client/kubernetes/cache" gardenseedmanagementclientset "github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned" seedmanagementscheme "github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme" settingsscheme "github.com/gardener/gardener/pkg/client/settings/clientset/versioned/scheme" + "github.com/gardener/gardener/pkg/logger" versionutils "github.com/gardener/gardener/pkg/utils/version" ) @@ -219,17 +221,13 @@ func ValidateConfig(config clientcmdapi.Config) error { } var supportedKubernetesVersions = []string{ - "1.10", - "1.11", - "1.12", - "1.13", - "1.14", "1.15", "1.16", "1.17", "1.18", "1.19", "1.20", + "1.21", } func checkIfSupportedKubernetesVersion(gitVersion string) error { @@ -264,7 +262,7 @@ func newClientSet(conf *Config) (Interface, error) { return nil, err } - runtimeCache, err := NewRuntimeCache(conf.restConfig, cache.Options{ + runtimeCache, err := conf.newRuntimeCache(conf.restConfig, cache.Options{ Scheme: conf.clientOptions.Scheme, Mapper: conf.clientOptions.Mapper, Resync: conf.cacheResync, @@ -280,7 +278,7 @@ func newClientSet(conf *Config) (Interface, error) { var runtimeClient client.Client if UseCachedRuntimeClients && !conf.disableCache { - runtimeClient, err = client.NewDelegatingClient(client.NewDelegatingClientInput{ + delegatingClient, err := client.NewDelegatingClient(client.NewDelegatingClientInput{ CacheReader: runtimeCache, Client: directClient, UncachedObjects: conf.uncachedObjects, @@ -288,6 +286,11 @@ func newClientSet(conf *Config) (Interface, error) { if err != nil { return nil, err } + + runtimeClient = &fallbackClient{ + Client: delegatingClient, + reader: directClient, + } } else { runtimeClient = directClient } @@ -349,7 +352,13 @@ func setConfigDefaults(conf *Config) error { // we can't default to protobuf ContentType here, otherwise controller-runtime clients will also try to talk to // CRD resources (e.g. extension CRs in the Seed) using protobuf, but CRDs don't support protobuf // see https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/#advanced-features-and-flexibility - return setClientOptionsDefaults(conf.restConfig, &conf.clientOptions) + if err := setClientOptionsDefaults(conf.restConfig, &conf.clientOptions); err != nil { + return err + } + if conf.newRuntimeCache == nil { + conf.newRuntimeCache = NewRuntimeCache + } + return nil } func defaultContentTypeProtobuf(c *rest.Config) *rest.Config { @@ -359,3 +368,36 @@ func defaultContentTypeProtobuf(c *rest.Config) *rest.Config { } return &config } + +var _ client.Client = &fallbackClient{} + +// fallbackClient holds a `client.Reader` and `client.Reader` which is meant as a fallback +// in case Get/List requests with the ordinary `client.Reader` fail (e.g. because of cache errors). +type fallbackClient struct { + client.Client + reader client.Reader +} + +var cacheError = &kcache.CacheError{} + +// Get retrieves an obj for a given object key from the Kubernetes Cluster. +// In case of a cache error, the underlying API reader is used to execute the request again. +func (d *fallbackClient) Get(ctx context.Context, key client.ObjectKey, obj client.Object) error { + err := d.Client.Get(ctx, key, obj) + if err != nil && errors.As(err, &cacheError) { + logger.Logger.Debug("Falling back to API reader because a cache error occurred: %w", err) + return d.reader.Get(ctx, key, obj) + } + return err +} + +// List retrieves list of objects for a given namespace and list options. +// In case of a cache error, the underlying API reader is used to execute the request again. +func (d *fallbackClient) List(ctx context.Context, list client.ObjectList, opts ...client.ListOption) error { + err := d.Client.List(ctx, list, opts...) + if err != nil && errors.As(err, &cacheError) { + logger.Logger.Debug("Falling back to API reader because a cache error occurred: %w", err) + return d.reader.List(ctx, list, opts...) + } + return err +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go index 842aacb3a..27095ce05 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/options.go @@ -20,11 +20,13 @@ import ( "k8s.io/client-go/rest" baseconfig "k8s.io/component-base/config" + "sigs.k8s.io/controller-runtime/pkg/cache" "sigs.k8s.io/controller-runtime/pkg/client" ) // Config carries options for new ClientSets. type Config struct { + newRuntimeCache cache.NewCacheFunc clientOptions client.Options restConfig *rest.Config cacheResync *time.Duration @@ -99,3 +101,11 @@ func WithUncached(objs ...client.Object) ConfigFunc { return nil } } + +// WithNewCacheFunc allows to set the function which is used to create a new cache. +func WithNewCacheFunc(fn cache.NewCacheFunc) ConfigFunc { + return func(config *Config) error { + config.newRuntimeCache = fn + return nil + } +} diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/runtime_client.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/runtime_client.go index 255961dff..7748ba9fe 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/runtime_client.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/runtime_client.go @@ -20,11 +20,14 @@ import ( "fmt" "time" + kcache "github.com/gardener/gardener/pkg/client/kubernetes/cache" "github.com/gardener/gardener/pkg/logger" "github.com/sirupsen/logrus" "golang.org/x/time/rate" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "sigs.k8s.io/controller-runtime/pkg/cache" @@ -98,6 +101,37 @@ func setClientOptionsDefaults(config *rest.Config, options *client.Options) erro return nil } +// AggregatorCacheFunc returns a `cache.NewCacheFunc` which creates a cache that holds different cache implementations depending on the objects' GVKs. +func AggregatorCacheFunc(newCache cache.NewCacheFunc, typeToNewCache map[client.Object]cache.NewCacheFunc, scheme *runtime.Scheme) cache.NewCacheFunc { + return func(config *rest.Config, options cache.Options) (cache.Cache, error) { + if err := setCacheOptionsDefaults(&options); err != nil { + return nil, err + } + + fallbackCache, err := newCache(config, options) + if err != nil { + return nil, err + } + + gvkToCache := make(map[schema.GroupVersionKind]cache.Cache) + for object, fn := range typeToNewCache { + gvk, err := apiutil.GVKForObject(object, scheme) + if err != nil { + return nil, err + } + + cache, err := fn(config, options) + if err != nil { + return nil, err + } + + gvkToCache[gvk] = cache + } + + return kcache.NewAggregator(fallbackCache, gvkToCache, scheme), nil + } +} + // NewRuntimeCache creates a new cache.Cache with the given config and options. It can be used // for creating new controller-runtime clients with caches. func NewRuntimeCache(config *rest.Config, options cache.Options) (cache.Cache, error) { diff --git a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go index 2f07cf6a7..f0cdc4abe 100644 --- a/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go +++ b/vendor/github.com/gardener/gardener/pkg/client/kubernetes/types.go @@ -23,6 +23,7 @@ import ( gardenextensionsscheme "github.com/gardener/gardener/pkg/client/extensions/clientset/versioned/scheme" gardenseedmanagementclientset "github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned" gardenseedmanagementscheme "github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme" + gardensettingsscheme "github.com/gardener/gardener/pkg/client/settings/clientset/versioned/scheme" druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" dnsv1alpha1 "github.com/gardener/external-dns-management/pkg/apis/dns/v1alpha1" @@ -94,6 +95,8 @@ func init() { corescheme.AddToScheme, gardencorescheme.AddToScheme, gardenseedmanagementscheme.AddToScheme, + gardensettingsscheme.AddToScheme, + apiregistrationscheme.AddToScheme, ) utilruntime.Must(gardenSchemeBuilder.AddToScheme(GardenScheme)) diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go index 29cadc604..fccbecb17 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/associations.go @@ -30,15 +30,16 @@ import ( // DetermineShootsAssociatedTo gets a to determine the Shoots resources which are associated // to given (either a CloudProfile a or a Seed object). -func DetermineShootsAssociatedTo(obj interface{}, shootLister gardencorelisters.ShootLister) ([]string, error) { - var associatedShoots []string - shoots, err := shootLister.List(labels.Everything()) - if err != nil { +func DetermineShootsAssociatedTo(ctx context.Context, gardenClient client.Reader, obj interface{}) ([]string, error) { + shootList := &gardencorev1beta1.ShootList{} + if err := gardenClient.List(ctx, shootList); err != nil { logger.Logger.Info(err.Error()) return nil, err } - for _, shoot := range shoots { + var associatedShoots []string + + for _, shoot := range shootList.Items { switch t := obj.(type) { case *gardencorev1beta1.CloudProfile: cloudProfile := obj.(*gardencorev1beta1.CloudProfile) @@ -59,6 +60,7 @@ func DetermineShootsAssociatedTo(obj interface{}, shootLister gardencorelisters. return nil, fmt.Errorf("unable to determine Shoot associations, due to unknown type %t", t) } } + return associatedShoots, nil } diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/miscellaneous.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/miscellaneous.go index 486bcc077..bc0a1b5a0 100644 --- a/vendor/github.com/gardener/gardener/pkg/controllerutils/miscellaneous.go +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/miscellaneous.go @@ -19,7 +19,7 @@ import ( "time" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - "github.com/gardener/gardener/pkg/operation/common" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" "github.com/gardener/gardener/pkg/utils" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -30,7 +30,7 @@ const separator = "," // GetTasks returns the list of tasks in the ShootTasks annotation. func GetTasks(annotations map[string]string) []string { var tasks []string - if val := annotations[common.ShootTasks]; len(val) > 0 { + if val := annotations[v1beta1constants.ShootTasks]; len(val) > 0 { tasks = strings.Split(val, separator) } return tasks @@ -73,7 +73,7 @@ func RemoveTasks(annotations map[string]string, tasksToRemove ...string) { // RemoveAllTasks removes the ShootTasks annotation from the passed map. func RemoveAllTasks(annotations map[string]string) { - delete(annotations, common.ShootTasks) + delete(annotations, v1beta1constants.ShootTasks) } func setTaskAnnotations(annotations map[string]string, tasks []string) { @@ -82,7 +82,7 @@ func setTaskAnnotations(annotations map[string]string, tasks []string) { return } - annotations[common.ShootTasks] = strings.Join(tasks, separator) + annotations[v1beta1constants.ShootTasks] = strings.Join(tasks, separator) } var ( diff --git a/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go b/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go new file mode 100644 index 000000000..1f43200ef --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/controllerutils/patch.go @@ -0,0 +1,52 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 controllerutils + +import ( + "context" + + apierrors "k8s.io/apimachinery/pkg/api/errors" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" +) + +// PatchOrCreate patches or creates the given object in the Kubernetes cluster. The object's desired state is only +// reconciled with the existing state inside the passed in callback MutateFn, however, the object is not read from the +// API server. +// +// The MutateFn is called regardless of creating or patching an object. +// +// It returns the executed operation and an error. +func PatchOrCreate(ctx context.Context, c client.Writer, obj client.Object, f controllerutil.MutateFn) (controllerutil.OperationResult, error) { + patch := client.StrategicMergeFrom(obj.DeepCopyObject().(client.Object)) + + if err := f(); err != nil { + return controllerutil.OperationResultNone, err + } + + if err := c.Patch(ctx, obj, patch); err != nil { + if !apierrors.IsNotFound(err) { + return controllerutil.OperationResultNone, err + } + + if err2 := c.Create(ctx, obj); err2 != nil { + return controllerutil.OperationResultNone, err2 + } + + return controllerutil.OperationResultCreated, nil + } + + return controllerutil.OperationResultUpdated, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/extensions/cluster.go b/vendor/github.com/gardener/gardener/pkg/extensions/cluster.go index 561989393..0b23a1a05 100644 --- a/vendor/github.com/gardener/gardener/pkg/extensions/cluster.go +++ b/vendor/github.com/gardener/gardener/pkg/extensions/cluster.go @@ -27,13 +27,82 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/serializer" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) -var gardenscheme *runtime.Scheme +var gardenScheme *runtime.Scheme func init() { - gardenscheme = runtime.NewScheme() - gardencoreinstall.Install(gardenscheme) + gardenScheme = runtime.NewScheme() + gardencoreinstall.Install(gardenScheme) +} + +// SyncClusterResourceToSeed creates or updates the `extensions.gardener.cloud/v1alpha1.Cluster` resource in the seed +// cluster by adding the shoot, seed, and cloudprofile specification. +func SyncClusterResourceToSeed( + ctx context.Context, + client client.Client, + clusterName string, + shoot *gardencorev1beta1.Shoot, + cloudProfile *gardencorev1beta1.CloudProfile, + seed *gardencorev1beta1.Seed, +) error { + if shoot.Spec.SeedName == nil { + return nil + } + + var ( + cluster = &extensionsv1alpha1.Cluster{ + ObjectMeta: metav1.ObjectMeta{ + Name: clusterName, + }, + } + + cloudProfileObj *gardencorev1beta1.CloudProfile + seedObj *gardencorev1beta1.Seed + shootObj *gardencorev1beta1.Shoot + ) + + if cloudProfile != nil { + cloudProfileObj = cloudProfile.DeepCopy() + cloudProfileObj.TypeMeta = metav1.TypeMeta{ + APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), + Kind: "CloudProfile", + } + cloudProfileObj.ManagedFields = nil + } + + if seed != nil { + seedObj = seed.DeepCopy() + seedObj.TypeMeta = metav1.TypeMeta{ + APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), + Kind: "Seed", + } + seedObj.ManagedFields = nil + } + + if shoot != nil { + shootObj = shoot.DeepCopy() + shootObj.TypeMeta = metav1.TypeMeta{ + APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), + Kind: "Shoot", + } + shootObj.ManagedFields = nil + } + + _, err := controllerutil.CreateOrUpdate(ctx, client, cluster, func() error { + if cloudProfileObj != nil { + cluster.Spec.CloudProfile = runtime.RawExtension{Object: cloudProfileObj} + } + if seedObj != nil { + cluster.Spec.Seed = runtime.RawExtension{Object: seedObj} + } + if shootObj != nil { + cluster.Spec.Shoot = runtime.RawExtension{Object: shootObj} + } + return nil + }) + return err } // Cluster contains the decoded resources of Gardener's extension Cluster resource. @@ -51,10 +120,7 @@ func GetCluster(ctx context.Context, c client.Client, namespace string) (*Cluste return nil, err } - decoder, err := NewGardenDecoder() - if err != nil { - return nil, err - } + decoder := NewGardenDecoder() cloudProfile, err := CloudProfileFromCluster(decoder, cluster) if err != nil { @@ -85,7 +151,7 @@ func CloudProfileFromCluster(decoder runtime.Decoder, cluster *extensionsv1alpha if _, _, err := decoder.Decode(cluster.Spec.CloudProfile.Raw, nil, cloudProfileInternal); err != nil { return nil, err } - if err := gardenscheme.Convert(cloudProfileInternal, cloudProfile, nil); err != nil { + if err := gardenScheme.Convert(cloudProfileInternal, cloudProfile, nil); err != nil { return nil, err } @@ -105,7 +171,7 @@ func SeedFromCluster(decoder runtime.Decoder, cluster *extensionsv1alpha1.Cluste if _, _, err := decoder.Decode(cluster.Spec.Seed.Raw, nil, seedInternal); err != nil { return nil, err } - if err := gardenscheme.Convert(seedInternal, seed, nil); err != nil { + if err := gardenScheme.Convert(seedInternal, seed, nil); err != nil { return nil, err } @@ -125,7 +191,7 @@ func ShootFromCluster(decoder runtime.Decoder, cluster *extensionsv1alpha1.Clust if _, _, err := decoder.Decode(cluster.Spec.Shoot.Raw, nil, shootInternal); err != nil { return nil, err } - if err := gardenscheme.Convert(shootInternal, shoot, nil); err != nil { + if err := gardenScheme.Convert(shootInternal, shoot, nil); err != nil { return nil, err } @@ -139,15 +205,10 @@ func GetShoot(ctx context.Context, c client.Client, namespace string) (*gardenco return nil, err } - decoder, err := NewGardenDecoder() - if err != nil { - return nil, err - } - - return ShootFromCluster(decoder, cluster) + return ShootFromCluster(NewGardenDecoder(), cluster) } // NewGardenDecoder returns a new Garden API decoder. -func NewGardenDecoder() (runtime.Decoder, error) { - return serializer.NewCodecFactory(gardenscheme).UniversalDecoder(), nil +func NewGardenDecoder() runtime.Decoder { + return serializer.NewCodecFactory(gardenScheme).UniversalDecoder() } diff --git a/vendor/github.com/gardener/gardener/pkg/operation/common/extensions.go b/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go similarity index 89% rename from vendor/github.com/gardener/gardener/pkg/operation/common/extensions.go rename to vendor/github.com/gardener/gardener/pkg/extensions/customresources.go index f36904076..81933bfc6 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/common/extensions.go +++ b/vendor/github.com/gardener/gardener/pkg/extensions/customresources.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package common +package extensions import ( "context" @@ -29,6 +29,7 @@ import ( extensionsv1alpha1 "github.com/gardener/gardener/pkg/apis/extensions/v1alpha1" "github.com/gardener/gardener/pkg/utils" "github.com/gardener/gardener/pkg/utils/flow" + gutil "github.com/gardener/gardener/pkg/utils/gardener" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" "github.com/gardener/gardener/pkg/utils/kubernetes/health" "github.com/gardener/gardener/pkg/utils/retry" @@ -37,69 +38,12 @@ import ( autoscalingv1 "k8s.io/api/autoscaling/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" ) -// SyncClusterResourceToSeed creates or updates the `extensions.gardener.cloud/v1alpha1.Cluster` resource in the seed -// cluster by adding the shoot, seed, and cloudprofile specification. -func SyncClusterResourceToSeed(ctx context.Context, client client.Client, clusterName string, shoot *gardencorev1beta1.Shoot, cloudProfile *gardencorev1beta1.CloudProfile, seed *gardencorev1beta1.Seed) error { - if shoot.Spec.SeedName == nil { - return nil - } - - var ( - cluster = &extensionsv1alpha1.Cluster{ - ObjectMeta: metav1.ObjectMeta{ - Name: clusterName, - }, - } - - cloudProfileObj *gardencorev1beta1.CloudProfile - seedObj *gardencorev1beta1.Seed - shootObj *gardencorev1beta1.Shoot - ) - - if cloudProfile != nil { - cloudProfileObj = cloudProfile.DeepCopy() - cloudProfileObj.TypeMeta = metav1.TypeMeta{ - APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), - Kind: "CloudProfile", - } - } - - if seed != nil { - seedObj = seed.DeepCopy() - seedObj.TypeMeta = metav1.TypeMeta{ - APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), - Kind: "Seed", - } - } - - if shoot != nil { - shootObj = shoot.DeepCopy() - shootObj.TypeMeta = metav1.TypeMeta{ - APIVersion: gardencorev1beta1.SchemeGroupVersion.String(), - Kind: "Shoot", - } - } - - _, err := controllerutil.CreateOrUpdate(ctx, client, cluster, func() error { - if cloudProfileObj != nil { - cluster.Spec.CloudProfile = runtime.RawExtension{Object: cloudProfileObj} - } - if seedObj != nil { - cluster.Spec.Seed = runtime.RawExtension{Object: seedObj} - } - if shootObj != nil { - cluster.Spec.Shoot = runtime.RawExtension{Object: shootObj} - } - return nil - }) - return err -} +// TimeNow returns the current time. Exposed for testing. +var TimeNow = time.Now // WaitUntilExtensionCRReady waits until the given extension resource has become ready. func WaitUntilExtensionCRReady( @@ -204,7 +148,7 @@ func DeleteExtensionCR( obj.SetNamespace(namespace) obj.SetName(name) - if err := ConfirmDeletion(ctx, c, obj); err != nil { + if err := gutil.ConfirmDeletion(ctx, c, obj); err != nil { return err } diff --git a/vendor/github.com/gardener/gardener/pkg/extensions/id.go b/vendor/github.com/gardener/gardener/pkg/extensions/id.go new file mode 100644 index 000000000..c0386f357 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/extensions/id.go @@ -0,0 +1,24 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 extensions + +import ( + "fmt" +) + +// Id returns an identifier for the given extension kind/type. +func Id(extensionKind, extensionType string) string { + return fmt.Sprintf("%s/%s", extensionKind, extensionType) +} diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go index 028808cde..c48761e4d 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/types.go @@ -266,6 +266,10 @@ type ManagedSeedControllerConfiguration struct { // ConcurrentSyncs is the number of workers used for the controller to work on // events. ConcurrentSyncs *int + // SyncPeriod is the duration how often the existing resources are reconciled. + SyncPeriod *metav1.Duration + // WaitSyncPeriod is the duration how often an existing resource is reconciled when the controller is waiting for an event. + WaitSyncPeriod *metav1.Duration // SyncJitterPeriod is a jitter duration for the reconciler sync that can be used to distribute the syncs randomly. // If its value is greater than 0 then the managed seeds will not be enqueued immediately but only after a random // duration between 0 and the configured value. It is defaulted to 5m. @@ -309,10 +313,24 @@ type FluentBit struct { OutputSection *string } +// Loki contains configuration for the Loki. +type Loki struct { + // Garden contains configuration for the Loki in garden namespace. + Garden *GardenLoki +} + +// GardenLoki contains configuration for the Loki in garden namespace. +type GardenLoki struct { + // Priority is the priority value for the Loki + Priority *int32 +} + // Logging contains configuration for the logging stack. type Logging struct { // FluentBit contains configurations for the fluent-bit FluentBit *FluentBit + // Loki contains configuration for the Loki + Loki *Loki } // ServerConfiguration contains details for the HTTP(S) servers. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go index b7755ea72..541540fe2 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/defaults.go @@ -290,6 +290,16 @@ func SetDefaults_ManagedSeedControllerConfiguration(obj *ManagedSeedControllerCo obj.ConcurrentSyncs = &v } + if obj.SyncPeriod == nil { + v := metav1.Duration{Duration: 1 * time.Hour} + obj.SyncPeriod = &v + } + + if obj.WaitSyncPeriod == nil { + v := metav1.Duration{Duration: 15 * time.Second} + obj.WaitSyncPeriod = &v + } + if obj.SyncJitterPeriod == nil { v := metav1.Duration{Duration: 5 * time.Minute} obj.SyncJitterPeriod = &v diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go index df61431f3..66c456f13 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/types.go @@ -323,6 +323,12 @@ type ManagedSeedControllerConfiguration struct { // events. // +optional ConcurrentSyncs *int `json:"concurrentSyncs,omitempty"` + // SyncPeriod is the duration how often the existing resources are reconciled. + // +optional + SyncPeriod *metav1.Duration `json:"syncPeriod,omitempty"` + // WaitSyncPeriod is the duration how often an existing resource is reconciled when the controller is waiting for an event. + // +optional + WaitSyncPeriod *metav1.Duration `json:"waitSyncPeriod,omitempty"` // SyncJitterPeriod is a jitter duration for the reconciler sync that can be used to distribute the syncs randomly. // If its value is greater than 0 then the managed seeds will not be enqueued immediately but only after a random // duration between 0 and the configured value. It is defaulted to 5m. @@ -374,11 +380,26 @@ type FluentBit struct { OutputSection *string `json:"output,omitempty" yaml:"output,omitempty"` } +// Loki contains configuration for the Loki. +type Loki struct { + // Garden contains configuration for the Loki in garden namespace. + Garden *GardenLoki `json:"garden,omitempty" yaml:"garden,omitempty"` +} + +// GardenLoki contains configuration for the Loki in garden namespace. +type GardenLoki struct { + // Priority is the priority value for the Loki + Priority *int `json:"priority,omitempty" yaml:"priority,omitempty"` +} + // Logging contains configuration for the logging stack. type Logging struct { // FluentBit contains configurations for the fluent-bit // +optional FluentBit *FluentBit `json:"fluentBit,omitempty" yaml:"fluentBit,omitempty"` + // Loki contains configuration for the Loki + // +optional + Loki *Loki `json:"loki,omitempty" yaml:"loki,omitempty"` } // ServerConfiguration contains details for the HTTP(S) servers. diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go index 4273d90ee..db4b0009f 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.conversion.go @@ -121,6 +121,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*GardenLoki)(nil), (*config.GardenLoki)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_GardenLoki_To_config_GardenLoki(a.(*GardenLoki), b.(*config.GardenLoki), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.GardenLoki)(nil), (*GardenLoki)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_GardenLoki_To_v1alpha1_GardenLoki(a.(*config.GardenLoki), b.(*GardenLoki), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*GardenletConfiguration)(nil), (*config.GardenletConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_GardenletConfiguration_To_config_GardenletConfiguration(a.(*GardenletConfiguration), b.(*config.GardenletConfiguration), scope) }); err != nil { @@ -171,6 +181,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*Loki)(nil), (*config.Loki)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_Loki_To_config_Loki(a.(*Loki), b.(*config.Loki), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.Loki)(nil), (*Loki)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_Loki_To_v1alpha1_Loki(a.(*config.Loki), b.(*Loki), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ManagedSeedControllerConfiguration)(nil), (*config.ManagedSeedControllerConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ManagedSeedControllerConfiguration_To_config_ManagedSeedControllerConfiguration(a.(*ManagedSeedControllerConfiguration), b.(*config.ManagedSeedControllerConfiguration), scope) }); err != nil { @@ -528,6 +548,38 @@ func Convert_config_GardenClientConnection_To_v1alpha1_GardenClientConnection(in return autoConvert_config_GardenClientConnection_To_v1alpha1_GardenClientConnection(in, out, s) } +func autoConvert_v1alpha1_GardenLoki_To_config_GardenLoki(in *GardenLoki, out *config.GardenLoki, s conversion.Scope) error { + if in.Priority != nil { + in, out := &in.Priority, &out.Priority + *out = new(int32) + **out = int32(**in) + } else { + out.Priority = nil + } + return nil +} + +// Convert_v1alpha1_GardenLoki_To_config_GardenLoki is an autogenerated conversion function. +func Convert_v1alpha1_GardenLoki_To_config_GardenLoki(in *GardenLoki, out *config.GardenLoki, s conversion.Scope) error { + return autoConvert_v1alpha1_GardenLoki_To_config_GardenLoki(in, out, s) +} + +func autoConvert_config_GardenLoki_To_v1alpha1_GardenLoki(in *config.GardenLoki, out *GardenLoki, s conversion.Scope) error { + if in.Priority != nil { + in, out := &in.Priority, &out.Priority + *out = new(int) + **out = int(**in) + } else { + out.Priority = nil + } + return nil +} + +// Convert_config_GardenLoki_To_v1alpha1_GardenLoki is an autogenerated conversion function. +func Convert_config_GardenLoki_To_v1alpha1_GardenLoki(in *config.GardenLoki, out *GardenLoki, s conversion.Scope) error { + return autoConvert_config_GardenLoki_To_v1alpha1_GardenLoki(in, out, s) +} + func autoConvert_v1alpha1_GardenletConfiguration_To_config_GardenletConfiguration(in *GardenletConfiguration, out *config.GardenletConfiguration, s conversion.Scope) error { if in.GardenClientConnection != nil { in, out := &in.GardenClientConnection, &out.GardenClientConnection @@ -581,7 +633,15 @@ func autoConvert_v1alpha1_GardenletConfiguration_To_config_GardenletConfiguratio out.SeedConfig = nil } out.SeedSelector = (*v1.LabelSelector)(unsafe.Pointer(in.SeedSelector)) - out.Logging = (*config.Logging)(unsafe.Pointer(in.Logging)) + if in.Logging != nil { + in, out := &in.Logging, &out.Logging + *out = new(config.Logging) + if err := Convert_v1alpha1_Logging_To_config_Logging(*in, *out, s); err != nil { + return err + } + } else { + out.Logging = nil + } out.SNI = (*config.SNI)(unsafe.Pointer(in.SNI)) return nil } @@ -644,7 +704,15 @@ func autoConvert_config_GardenletConfiguration_To_v1alpha1_GardenletConfiguratio out.SeedConfig = nil } out.SeedSelector = (*v1.LabelSelector)(unsafe.Pointer(in.SeedSelector)) - out.Logging = (*Logging)(unsafe.Pointer(in.Logging)) + if in.Logging != nil { + in, out := &in.Logging, &out.Logging + *out = new(Logging) + if err := Convert_config_Logging_To_v1alpha1_Logging(*in, *out, s); err != nil { + return err + } + } else { + out.Logging = nil + } out.SNI = (*SNI)(unsafe.Pointer(in.SNI)) return nil } @@ -750,6 +818,15 @@ func Convert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfig func autoConvert_v1alpha1_Logging_To_config_Logging(in *Logging, out *config.Logging, s conversion.Scope) error { out.FluentBit = (*config.FluentBit)(unsafe.Pointer(in.FluentBit)) + if in.Loki != nil { + in, out := &in.Loki, &out.Loki + *out = new(config.Loki) + if err := Convert_v1alpha1_Loki_To_config_Loki(*in, *out, s); err != nil { + return err + } + } else { + out.Loki = nil + } return nil } @@ -760,6 +837,15 @@ func Convert_v1alpha1_Logging_To_config_Logging(in *Logging, out *config.Logging func autoConvert_config_Logging_To_v1alpha1_Logging(in *config.Logging, out *Logging, s conversion.Scope) error { out.FluentBit = (*FluentBit)(unsafe.Pointer(in.FluentBit)) + if in.Loki != nil { + in, out := &in.Loki, &out.Loki + *out = new(Loki) + if err := Convert_config_Loki_To_v1alpha1_Loki(*in, *out, s); err != nil { + return err + } + } else { + out.Loki = nil + } return nil } @@ -768,8 +854,46 @@ func Convert_config_Logging_To_v1alpha1_Logging(in *config.Logging, out *Logging return autoConvert_config_Logging_To_v1alpha1_Logging(in, out, s) } +func autoConvert_v1alpha1_Loki_To_config_Loki(in *Loki, out *config.Loki, s conversion.Scope) error { + if in.Garden != nil { + in, out := &in.Garden, &out.Garden + *out = new(config.GardenLoki) + if err := Convert_v1alpha1_GardenLoki_To_config_GardenLoki(*in, *out, s); err != nil { + return err + } + } else { + out.Garden = nil + } + return nil +} + +// Convert_v1alpha1_Loki_To_config_Loki is an autogenerated conversion function. +func Convert_v1alpha1_Loki_To_config_Loki(in *Loki, out *config.Loki, s conversion.Scope) error { + return autoConvert_v1alpha1_Loki_To_config_Loki(in, out, s) +} + +func autoConvert_config_Loki_To_v1alpha1_Loki(in *config.Loki, out *Loki, s conversion.Scope) error { + if in.Garden != nil { + in, out := &in.Garden, &out.Garden + *out = new(GardenLoki) + if err := Convert_config_GardenLoki_To_v1alpha1_GardenLoki(*in, *out, s); err != nil { + return err + } + } else { + out.Garden = nil + } + return nil +} + +// Convert_config_Loki_To_v1alpha1_Loki is an autogenerated conversion function. +func Convert_config_Loki_To_v1alpha1_Loki(in *config.Loki, out *Loki, s conversion.Scope) error { + return autoConvert_config_Loki_To_v1alpha1_Loki(in, out, s) +} + func autoConvert_v1alpha1_ManagedSeedControllerConfiguration_To_config_ManagedSeedControllerConfiguration(in *ManagedSeedControllerConfiguration, out *config.ManagedSeedControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.WaitSyncPeriod = (*v1.Duration)(unsafe.Pointer(in.WaitSyncPeriod)) out.SyncJitterPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncJitterPeriod)) return nil } @@ -781,6 +905,8 @@ func Convert_v1alpha1_ManagedSeedControllerConfiguration_To_config_ManagedSeedCo func autoConvert_config_ManagedSeedControllerConfiguration_To_v1alpha1_ManagedSeedControllerConfiguration(in *config.ManagedSeedControllerConfiguration, out *ManagedSeedControllerConfiguration, s conversion.Scope) error { out.ConcurrentSyncs = (*int)(unsafe.Pointer(in.ConcurrentSyncs)) + out.SyncPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncPeriod)) + out.WaitSyncPeriod = (*v1.Duration)(unsafe.Pointer(in.WaitSyncPeriod)) out.SyncJitterPeriod = (*v1.Duration)(unsafe.Pointer(in.SyncJitterPeriod)) return nil } diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go index 73b8a9f51..9f9e5ff26 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -233,6 +233,27 @@ func (in *GardenClientConnection) DeepCopy() *GardenClientConnection { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GardenLoki) DeepCopyInto(out *GardenLoki) { + *out = *in + if in.Priority != nil { + in, out := &in.Priority, &out.Priority + *out = new(int) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GardenLoki. +func (in *GardenLoki) DeepCopy() *GardenLoki { + if in == nil { + return nil + } + out := new(GardenLoki) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GardenletConfiguration) DeepCopyInto(out *GardenletConfiguration) { *out = *in @@ -458,6 +479,11 @@ func (in *Logging) DeepCopyInto(out *Logging) { *out = new(FluentBit) (*in).DeepCopyInto(*out) } + if in.Loki != nil { + in, out := &in.Loki, &out.Loki + *out = new(Loki) + (*in).DeepCopyInto(*out) + } return } @@ -471,6 +497,27 @@ func (in *Logging) DeepCopy() *Logging { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Loki) DeepCopyInto(out *Loki) { + *out = *in + if in.Garden != nil { + in, out := &in.Garden, &out.Garden + *out = new(GardenLoki) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Loki. +func (in *Loki) DeepCopy() *Loki { + if in == nil { + return nil + } + out := new(Loki) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ManagedSeedControllerConfiguration) DeepCopyInto(out *ManagedSeedControllerConfiguration) { *out = *in @@ -479,6 +526,16 @@ func (in *ManagedSeedControllerConfiguration) DeepCopyInto(out *ManagedSeedContr *out = new(int) **out = **in } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.WaitSyncPeriod != nil { + in, out := &in.WaitSyncPeriod, &out.WaitSyncPeriod + *out = new(v1.Duration) + **out = **in + } if in.SyncJitterPeriod != nil { in, out := &in.SyncJitterPeriod, &out.SyncJitterPeriod *out = new(v1.Duration) diff --git a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go index e47435f2e..f32639cca 100644 --- a/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go +++ b/vendor/github.com/gardener/gardener/pkg/gardenlet/apis/config/zz_generated.deepcopy.go @@ -233,6 +233,27 @@ func (in *GardenClientConnection) DeepCopy() *GardenClientConnection { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *GardenLoki) DeepCopyInto(out *GardenLoki) { + *out = *in + if in.Priority != nil { + in, out := &in.Priority, &out.Priority + *out = new(int32) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GardenLoki. +func (in *GardenLoki) DeepCopy() *GardenLoki { + if in == nil { + return nil + } + out := new(GardenLoki) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GardenletConfiguration) DeepCopyInto(out *GardenletConfiguration) { *out = *in @@ -458,6 +479,11 @@ func (in *Logging) DeepCopyInto(out *Logging) { *out = new(FluentBit) (*in).DeepCopyInto(*out) } + if in.Loki != nil { + in, out := &in.Loki, &out.Loki + *out = new(Loki) + (*in).DeepCopyInto(*out) + } return } @@ -471,6 +497,27 @@ func (in *Logging) DeepCopy() *Logging { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Loki) DeepCopyInto(out *Loki) { + *out = *in + if in.Garden != nil { + in, out := &in.Garden, &out.Garden + *out = new(GardenLoki) + (*in).DeepCopyInto(*out) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Loki. +func (in *Loki) DeepCopy() *Loki { + if in == nil { + return nil + } + out := new(Loki) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ManagedSeedControllerConfiguration) DeepCopyInto(out *ManagedSeedControllerConfiguration) { *out = *in @@ -479,6 +526,16 @@ func (in *ManagedSeedControllerConfiguration) DeepCopyInto(out *ManagedSeedContr *out = new(int) **out = **in } + if in.SyncPeriod != nil { + in, out := &in.SyncPeriod, &out.SyncPeriod + *out = new(v1.Duration) + **out = **in + } + if in.WaitSyncPeriod != nil { + in, out := &in.WaitSyncPeriod, &out.WaitSyncPeriod + *out = new(v1.Duration) + **out = **in + } if in.SyncJitterPeriod != nil { in, out := &in.SyncJitterPeriod, &out.SyncJitterPeriod *out = new(v1.Duration) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/common/managedresources.go b/vendor/github.com/gardener/gardener/pkg/operation/common/managedresources.go deleted file mode 100644 index 5b1bb5457..000000000 --- a/vendor/github.com/gardener/gardener/pkg/operation/common/managedresources.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 common - -import ( - "context" - - "github.com/gardener/gardener-resource-manager/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -const ( - // ManagedResourceLabelKeyOrigin is a key for a label on a managed resource with the value 'origin'. - ManagedResourceLabelKeyOrigin = "origin" - // ManagedResourceLabelValueGardener is a value for a label on a managed resource with the value 'gardener'. - ManagedResourceLabelValueGardener = "gardener" - - // ManagedResourceSecretPrefix is the prefix that is used for secrets referenced by managed resources. - ManagedResourceSecretPrefix = "managedresource-" -) - -// DeployManagedResourceForShoot deploys a ManagedResource CR for the shoot's gardener-resource-manager. -func DeployManagedResourceForShoot(ctx context.Context, c client.Client, name, namespace string, keepObjects bool, data map[string][]byte) error { - return deployManagedResource(ctx, c, name, namespace, data, NewManagedResourceForShoot(c, name, namespace, keepObjects)) -} - -// DeleteManagedResourceForShoot deploys a ManagedResource CR for the shoot's gardener-resource-manager. -func DeleteManagedResourceForShoot(ctx context.Context, c client.Client, name, namespace string) error { - return deleteManagedResource(ctx, c, name, namespace, manager.NewManagedResource(c).WithNamespacedName(namespace, name)) -} - -// DeployManagedResourceForSeed deploys a ManagedResource CR for the seed's gardener-resource-manager. -func DeployManagedResourceForSeed(ctx context.Context, c client.Client, name, namespace string, keepObjects bool, data map[string][]byte) error { - return deployManagedResource(ctx, c, name, namespace, data, NewManagedResourceForSeed(c, name, namespace, keepObjects)) -} - -// DeleteManagedResourceForSeed deploys a ManagedResource CR for the seed's gardener-resource-manager. -func DeleteManagedResourceForSeed(ctx context.Context, c client.Client, name, namespace string) error { - return deleteManagedResource(ctx, c, name, namespace, manager.NewManagedResource(c).WithNamespacedName(namespace, name)) -} - -func deployManagedResource(ctx context.Context, c client.Client, name, namespace string, data map[string][]byte, managedResource *manager.ManagedResource) error { - secretName, secret := NewManagedResourceSecret(c, name, namespace) - - if err := secret.WithKeyValues(data).Reconcile(ctx); err != nil { - return err - } - - return managedResource.WithSecretRef(secretName).Reconcile(ctx) -} - -func deleteManagedResource(ctx context.Context, c client.Client, name, namespace string, managedResource *manager.ManagedResource) error { - _, secret := NewManagedResourceSecret(c, name, namespace) - - if err := managedResource.Delete(ctx); err != nil { - return err - } - return secret.Delete(ctx) -} - -// NewManagedResourceSecret constructs a new Secret object containing manifests managed by the Gardener-Resource-Manager -// which can be reconciled. -func NewManagedResourceSecret(c client.Client, name, namespace string) (string, *manager.Secret) { - secretName := ManagedResourceSecretName(name) - return secretName, manager.NewSecret(c).WithNamespacedName(namespace, secretName) -} - -// NewManagedResourceForShoot constructs a new ManagedResource object for the shoot's Gardener-Resource-Manager. -func NewManagedResourceForShoot(c client.Client, name, namespace string, keepObjects bool) *manager.ManagedResource { - var ( - injectedLabels = map[string]string{ShootNoCleanup: "true"} - labels = map[string]string{ManagedResourceLabelKeyOrigin: ManagedResourceLabelValueGardener} - ) - - return manager.NewManagedResource(c). - WithNamespacedName(namespace, name). - WithLabels(labels). - WithInjectedLabels(injectedLabels). - KeepObjects(keepObjects) -} - -// NewManagedResourceForSeed constructs a new ManagedResource object for the seed's Gardener-Resource-Manager. -func NewManagedResourceForSeed(c client.Client, name, namespace string, keepObjects bool) *manager.ManagedResource { - return manager.NewManagedResource(c). - WithNamespacedName(namespace, name). - WithClass("seed"). - KeepObjects(keepObjects) -} - -// ManagedResourceSecretName returns the name of a corev1.Scret for the given name of a -// resourcesv1alpha1.ManagedResource. -func ManagedResourceSecretName(managedResourceName string) string { - return ManagedResourceSecretPrefix + managedResourceName -} diff --git a/vendor/github.com/gardener/gardener/pkg/operation/common/types.go b/vendor/github.com/gardener/gardener/pkg/operation/common/types.go index c64c43bfc..7c3ced13e 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/common/types.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/common/types.go @@ -25,26 +25,6 @@ const ( // BasicAuthSecretName is the name of the secret containing basic authentication credentials for the kube-apiserver. BasicAuthSecretName = "kube-apiserver-basic-auth" - // ConfirmationDeletion is an annotation on a Shoot and Project resources whose value must be set to "true" in order to - // allow deleting the resource (if the annotation is not set any DELETE request will be denied). - ConfirmationDeletion = "confirmation.gardener.cloud/deletion" - - // DNSProvider is the key for an annotation on a Kubernetes Secret object whose value must point to a valid - // DNS provider. - DNSProvider = "dns.gardener.cloud/provider" - - // DNSDomain is the key for an annotation on a Kubernetes Secret object whose value must point to a valid - // domain name. - DNSDomain = "dns.gardener.cloud/domain" - - // DNSIncludeZones is the key for an annotation on a Kubernetes Secret object whose value must point to a list - // of zones that shall be included. - DNSIncludeZones = "dns.gardener.cloud/include-zones" - - // DNSExcludeZones is the key for an annotation on a Kubernetes Secret object whose value must point to a list - // of zones that shall be excluded. - DNSExcludeZones = "dns.gardener.cloud/exclude-zones" - // EtcdEncryptionSecretName is the name of the shoot-specific secret which contains // that shoot's EncryptionConfiguration. The EncryptionConfiguration contains a key // which the shoot's apiserver uses for encrypting selected etcd content. @@ -74,36 +54,9 @@ const ( // EtcdEncryptionKeySecretLen is the expected length in bytes of the EncryptionConfiguration's key EtcdEncryptionKeySecretLen = 32 - // GardenerDeletionProtected is a label on CustomResourceDefinitions indicating that the deletion is protected, i.e. - // it must be confirmed with the `confirmation.gardener.cloud/deletion=true` annotation before a `DELETE` call - // is accepted. - GardenerDeletionProtected = "gardener.cloud/deletion-protected" - // ETCDEncryptionConfigDataName is the name of ShootState data entry holding the current key and encryption state used to encrypt shoot resources ETCDEncryptionConfigDataName = "etcdEncryptionConfiguration" - // GardenRoleDefaultDomain is the value of the GardenRole key indicating type 'default-domain'. - GardenRoleDefaultDomain = "default-domain" - - // GardenRoleInternalDomain is the value of the GardenRole key indicating type 'internal-domain'. - GardenRoleInternalDomain = "internal-domain" - - // GardenRoleOpenVPNDiffieHellman is the value of the GardenRole key indicating type 'openvpn-diffie-hellman'. - GardenRoleOpenVPNDiffieHellman = "openvpn-diffie-hellman" - - // GardenRoleGlobalMonitoring is the value of the GardenRole key indicating type 'global-monitoring' - GardenRoleGlobalMonitoring = "global-monitoring" - - // GardenRoleAlerting is the value of GardenRole key indicating type 'alerting'. - GardenRoleAlerting = "alerting" - - // GardenRoleHvpa is the value of GardenRole key indicating type 'hvpa'. - GardenRoleHvpa = "hvpa" - - // GardenCreatedBy is the key for an annotation of a Shoot cluster whose value indicates contains the username - // of the user that created the resource. - GardenCreatedBy = "gardener.cloud/created-by" - // GrafanaOperatorsPrefix is a constant for a prefix used for the operators Grafana instance. GrafanaOperatorsPrefix = "go" @@ -122,21 +75,6 @@ const ( // AlertManagerPrefix is a constant for a prefix used for the AlertManager instance. AlertManagerPrefix = "au" - // IngressPrefix is the part of a FQDN which will be used to construct the domain name for an ingress controller of - // a Shoot cluster. For example, when a Shoot specifies domain 'cluster.example.com', the ingress domain would be - // '*..cluster.example.com'. - IngressPrefix = "ingress" - - // APIServerPrefix is the part of a FQDN which will be used to construct the domain name for the kube-apiserver of - // a Shoot cluster. For example, when a Shoot specifies domain 'cluster.example.com', the apiserver domain would be - // 'api.cluster.example.com'. - APIServerPrefix = "api" - - // InternalDomainKey is a key which must be present in an internal domain constructed for a Shoot cluster. If the - // configured internal domain already contains it, it won't be added twice. If it does not contain it, it will be - // appended. - InternalDomainKey = "internal" - // CoreDNSDeploymentName is the name of the coredns deployment. CoreDNSDeploymentName = "coredns" @@ -164,85 +102,8 @@ const ( // VPASecretName is the name of the secret used by VPA VPASecretName = "vpa-tls-certs" - // ProjectName is the key of a label on namespaces whose value holds the project name. - ProjectName = "project.gardener.cloud/name" - - // ProjectSkipStaleCheck is the key of an annotation on a project namespace that marks the associated Project to be - // skipped by the stale project controller. If the project has already configured stale timestamps in its status - // then they will be reset. - ProjectSkipStaleCheck = "project.gardener.cloud/skip-stale-check" - - // NamespaceProject is the key of an annotation on namespace whose value holds the project uid. - NamespaceProject = "namespace.gardener.cloud/project" - - // NamespaceKeepAfterProjectDeletion is a constant for an annotation on a `Namespace` resource that states that it - // should not be deleted if the corresponding `Project` gets deleted. Please note that all project related labels - // from the namespace will be removed when the project is being deleted. - NamespaceKeepAfterProjectDeletion = "namespace.gardener.cloud/keep-after-project-deletion" - - // ShootAlphaScalingAPIServerClass is a constant for an annotation on the shoot stating the initial API server class. - // It influences the size of the initial resource requests/limits. - // Possible values are [small, medium, large, xlarge, 2xlarge]. - // Note that this annotation is alpha and can be removed anytime without further notice. Only use it if you know - // what you do. - ShootAlphaScalingAPIServerClass = "alpha.kube-apiserver.scaling.shoot.gardener.cloud/class" - - // ShootExpirationTimestamp is an annotation on a Shoot resource whose value represents the time when the Shoot lifetime - // is expired. The lifetime can be extended, but at most by the minimal value of the 'clusterLifetimeDays' property - // of referenced quotas. - ShootExpirationTimestamp = "shoot.gardener.cloud/expiration-timestamp" - - // ShootNoCleanup is a constant for a label on a resource indicating that the Gardener cleaner should not delete this - // resource when cleaning a shoot during the deletion flow. - ShootNoCleanup = "shoot.gardener.cloud/no-cleanup" - - // ShootStatus is a constant for a label on a Shoot resource indicating that the Shoot's health. - ShootStatus = "shoot.gardener.cloud/status" - - // ShootOperationMaintain is a constant for an annotation on a Shoot indicating that the Shoot maintenance shall be executed as soon as - // possible. - ShootOperationMaintain = "maintain" - - // FailedShootNeedsRetryOperation is a constant for an annotation on a Shoot in a failed state indicating that a retry operation should be triggered during the next maintenance time window. - FailedShootNeedsRetryOperation = "maintenance.shoot.gardener.cloud/needs-retry-operation" - - // ShootOperationRotateKubeconfigCredentials is a constant for an annotation on a Shoot indicating that the credentials contained in the - // kubeconfig that is handed out to the user shall be rotated. - ShootOperationRotateKubeconfigCredentials = "rotate-kubeconfig-credentials" - - // ShootTasks is a constant for an annotation on a Shoot which states that certain tasks should be done. - ShootTasks = "shoot.gardener.cloud/tasks" - - // ShootTaskDeployInfrastructure is a name for a Shoot's infrastructure deployment task. It indicates that the - // Infrastructure extension resource shall be reconciled. - ShootTaskDeployInfrastructure = "deployInfrastructure" - - // ShootTaskRestartControlPlanePods is a name for a Shoot task which is dedicated to restart related control plane pods. - ShootTaskRestartControlPlanePods = "restartControlPlanePods" - - // ShootTaskRestartCoreAddons is a name for a Shoot task which is dedicated to restart some core addons. - ShootTaskRestartCoreAddons = "restartCoreAddons" - - // ShootOperationRetry is a constant for an annotation on a Shoot indicating that a failed Shoot reconciliation shall be retried. - ShootOperationRetry = "retry" - - // ShootOperationReconcile is a constant for an annotation on a Shoot indicating that a Shoot reconciliation shall be triggered. - ShootOperationReconcile = "reconcile" - - // ShootSyncPeriod is a constant for an annotation on a Shoot which may be used to overwrite the global Shoot controller sync period. - // The value must be a duration. It can also be used to disable the reconciliation at all by setting it to 0m. Disabling the reconciliation - // does only mean that the period reconciliation is disabled. However, when the Gardener is restarted/redeployed or the specification is - // changed then the reconciliation flow will be executed. - ShootSyncPeriod = "shoot.gardener.cloud/sync-period" - - // ShootIgnore is a constant for an annotation on a Shoot which may be used to tell the Gardener that the Shoot with this name should be - // ignored completely. That means that the Shoot will never reach the reconciliation flow (independent of the operation (create/update/ - // delete)). - ShootIgnore = "shoot.gardener.cloud/ignore" - // ManagedResourceShootCoreName is the name of the shoot core managed resource. ManagedResourceShootCoreName = "shoot-core" - // ManagedResourceAddonsName is the name of the addons managed resource. ManagedResourceAddonsName = "addons" @@ -267,10 +128,6 @@ const ( // ServiceAccountSigningKeySecretDataKey is the data key of a signing key Kubernetes secret. ServiceAccountSigningKeySecretDataKey = "signing-key" - // ControlPlaneWildcardCert is the value of the GardenRole key indicating type 'controlplane-cert'. - // It refers to a wildcard tls certificate which can be used for services exposed under the corresponding domain. - ControlPlaneWildcardCert = "controlplane-cert" - // AlertManagerTLS is the name of the secret resource which holds the TLS certificate for Alert Manager. AlertManagerTLS = "alertmanager-tls" // GrafanaTLS is the name of the secret resource which holds the TLS certificate for Grafana. @@ -283,4 +140,7 @@ const ( // ShootDNSIngressName is a constant for the DNS resources used for the shoot ingress addon. ShootDNSIngressName = "ingress" + + // GardenLokiPriorityClassName is the name of the PriorityClass for the Loki in the garden namespace + GardenLokiPriorityClassName = "garden-loki" ) diff --git a/vendor/github.com/gardener/gardener/pkg/operation/common/utils.go b/vendor/github.com/gardener/gardener/pkg/operation/common/utils.go index be117be47..2baf99bc9 100644 --- a/vendor/github.com/gardener/gardener/pkg/operation/common/utils.go +++ b/vendor/github.com/gardener/gardener/pkg/operation/common/utils.go @@ -20,20 +20,15 @@ import ( "fmt" "math/big" "net" - "reflect" "regexp" - "strconv" "strings" "time" - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" - gardencorelisters "github.com/gardener/gardener/pkg/client/core/listers/core/v1beta1" "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/utils" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" + hvpav1alpha1 "github.com/gardener/hvpa-controller/api/v1alpha1" admissionregistrationv1beta1 "k8s.io/api/admissionregistration/v1beta1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" @@ -45,17 +40,11 @@ import ( apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/types" autoscalingv1beta2 "k8s.io/autoscaler/vertical-pod-autoscaler/pkg/apis/autoscaling.k8s.io/v1beta2" - "k8s.io/client-go/util/retry" - "k8s.io/component-base/version" "sigs.k8s.io/controller-runtime/pkg/client" ) -// TimeNow returns the current time. Exposed for testing. -var TimeNow = time.Now - // GetSecretKeysWithPrefix returns a list of keys of the given map which are prefixed with . func GetSecretKeysWithPrefix(kind string, m map[string]*corev1.Secret) []string { var result []string @@ -138,61 +127,6 @@ func ReplaceCloudProviderConfigKey(cloudProviderConfig, separator, key, value st return keyValueRegexp.ReplaceAllString(cloudProviderConfig, fmt.Sprintf(`${1}%q`, strings.Replace(value, `$`, `$$`, -1))) } -// ProjectForNamespace returns the project object responsible for a given . -// It tries to identify the project object by looking for the namespace name in the project spec. -func ProjectForNamespace(projectLister gardencorelisters.ProjectLister, namespaceName string) (*gardencorev1beta1.Project, error) { - projectList, err := projectLister.List(labels.Everything()) - if err != nil { - return nil, err - } - - var projects []gardencorev1beta1.Project - for _, p := range projectList { - projects = append(projects, *p) - } - - return projectForNamespace(projects, namespaceName) -} - -// ProjectForNamespaceWithClient returns the project object responsible for a given . -// It tries to identify the project object by looking for the namespace name in the project spec. -func ProjectForNamespaceWithClient(ctx context.Context, c client.Reader, namespaceName string) (*gardencorev1beta1.Project, error) { - projectList := &gardencorev1beta1.ProjectList{} - err := c.List(ctx, projectList) - if err != nil { - return nil, err - } - - return projectForNamespace(projectList.Items, namespaceName) -} - -func projectForNamespace(projects []gardencorev1beta1.Project, namespaceName string) (*gardencorev1beta1.Project, error) { - for _, project := range projects { - if project.Spec.Namespace != nil && *project.Spec.Namespace == namespaceName { - return &project, nil - } - } - - return nil, apierrors.NewNotFound(gardencorev1beta1.Resource("Project"), fmt.Sprintf("for namespace %s", namespaceName)) -} - -// GardenerDeletionGracePeriod is the default grace period for Gardener's force deletion methods. -var GardenerDeletionGracePeriod = 5 * time.Minute - -// ShouldObjectBeRemoved determines whether the given object should be gone now. -// This is calculated by first checking the deletion timestamp of an object: If the deletion timestamp -// is unset, the object should not be removed - i.e. this returns false. -// Otherwise, it is checked whether the deletionTimestamp is before the current time minus the -// grace period. -func ShouldObjectBeRemoved(obj metav1.Object, gracePeriod time.Duration) bool { - deletionTimestamp := obj.GetDeletionTimestamp() - if deletionTimestamp == nil { - return false - } - - return deletionTimestamp.Time.Before(time.Now().Add(-gracePeriod)) -} - // DeleteHvpa delete all resources required for the HVPA in the given namespace. func DeleteHvpa(ctx context.Context, k8sClient kubernetes.Interface, namespace string) error { if k8sClient == nil { @@ -200,7 +134,7 @@ func DeleteHvpa(ctx context.Context, k8sClient kubernetes.Interface, namespace s } listOptions := metav1.ListOptions{ - LabelSelector: fmt.Sprintf("%s=%s", v1beta1constants.GardenRole, GardenRoleHvpa), + LabelSelector: fmt.Sprintf("%s=%s", v1beta1constants.GardenRole, v1beta1constants.GardenRoleHvpa), } // Delete all CRDs with label "gardener.cloud/role=hvpa" @@ -322,6 +256,8 @@ func DeleteSeedLoggingStack(ctx context.Context, k8sClient client.Client) error &appsv1.DaemonSet{ObjectMeta: metav1.ObjectMeta{Name: "fluent-bit", Namespace: v1beta1constants.GardenNamespace}}, &networkingv1.NetworkPolicy{ObjectMeta: metav1.ObjectMeta{Name: "allow-fluentbit", Namespace: v1beta1constants.GardenNamespace}}, &schedulingv1.PriorityClass{ObjectMeta: metav1.ObjectMeta{Name: "fluent-bit"}}, + &schedulingv1.PriorityClass{ObjectMeta: metav1.ObjectMeta{Name: "loki"}}, + &schedulingv1.PriorityClass{ObjectMeta: metav1.ObjectMeta{Name: GardenLokiPriorityClassName}}, &rbacv1.ClusterRole{ObjectMeta: metav1.ObjectMeta{Name: "fluent-bit-read"}}, &rbacv1.ClusterRoleBinding{ObjectMeta: metav1.ObjectMeta{Name: "fluent-bit-read"}}, &corev1.ServiceAccount{ObjectMeta: metav1.ObjectMeta{Name: "fluent-bit", Namespace: v1beta1constants.GardenNamespace}}, @@ -337,23 +273,6 @@ func DeleteSeedLoggingStack(ctx context.Context, k8sClient client.Client) error return DeleteLoki(ctx, k8sClient, v1beta1constants.GardenNamespace) } -// GetContainerResourcesInStatefulSet returns the containers resources in StatefulSet -func GetContainerResourcesInStatefulSet(ctx context.Context, k8sClient client.Client, key client.ObjectKey) (map[string]*corev1.ResourceRequirements, error) { - statefulSet := &appsv1.StatefulSet{} - resourcesPerContainer := make(map[string]*corev1.ResourceRequirements) - if err := k8sClient.Get(ctx, key, statefulSet); client.IgnoreNotFound(err) != nil { - return nil, err - } else if !apierrors.IsNotFound(err) { - for _, container := range statefulSet.Spec.Template.Spec.Containers { - resourcesPerContainer[container.Name] = container.Resources.DeepCopy() - } - return resourcesPerContainer, nil - } - - // Use the default resources defined in values file - return nil, nil -} - // DeleteReserveExcessCapacity deletes the deployment and priority class for excess capacity func DeleteReserveExcessCapacity(ctx context.Context, k8sClient client.Client) error { if k8sClient == nil { @@ -475,163 +394,6 @@ func DeleteGrafanaByRole(ctx context.Context, k8sClient kubernetes.Interface, na return nil } -// GetDomainInfoFromAnnotations returns the provider and the domain that is specified in the give annotations. -func GetDomainInfoFromAnnotations(annotations map[string]string) (provider string, domain string, includeZones, excludeZones []string, err error) { - if annotations == nil { - return "", "", nil, nil, fmt.Errorf("domain secret has no annotations") - } - - if providerAnnotation, ok := annotations[DNSProvider]; ok { - provider = providerAnnotation - } - - if domainAnnotation, ok := annotations[DNSDomain]; ok { - domain = domainAnnotation - } - - if includeZonesAnnotation, ok := annotations[DNSIncludeZones]; ok { - includeZones = strings.Split(includeZonesAnnotation, ",") - } - if excludeZonesAnnotation, ok := annotations[DNSExcludeZones]; ok { - excludeZones = strings.Split(excludeZonesAnnotation, ",") - } - - if len(domain) == 0 { - return "", "", nil, nil, fmt.Errorf("missing dns domain annotation on domain secret") - } - if len(provider) == 0 { - return "", "", nil, nil, fmt.Errorf("missing dns provider annotation on domain secret") - } - - return -} - -// CurrentReplicaCount returns the current replicaCount for the given deployment. -func CurrentReplicaCount(ctx context.Context, client client.Client, namespace, deploymentName string) (int32, error) { - deployment := &appsv1.Deployment{} - if err := client.Get(ctx, kutil.Key(namespace, deploymentName), deployment); err != nil && !apierrors.IsNotFound(err) { - return 0, err - } - if deployment.Spec.Replicas == nil { - return 0, nil - } - return *deployment.Spec.Replicas, nil -} - -// RespectShootSyncPeriodOverwrite checks whether to respect the sync period overwrite of a Shoot or not. -func RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite bool, shoot *gardencorev1beta1.Shoot) bool { - return respectSyncPeriodOverwrite || shoot.Namespace == v1beta1constants.GardenNamespace -} - -// ShouldIgnoreShoot determines whether a Shoot should be ignored or not. -func ShouldIgnoreShoot(respectSyncPeriodOverwrite bool, shoot *gardencorev1beta1.Shoot) bool { - if !RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite, shoot) { - return false - } - - value, ok := shoot.Annotations[ShootIgnore] - if !ok { - return false - } - - ignore, _ := strconv.ParseBool(value) - return ignore -} - -// IsShootFailed checks if a Shoot is failed. -func IsShootFailed(shoot *gardencorev1beta1.Shoot) bool { - lastOperation := shoot.Status.LastOperation - - return lastOperation != nil && lastOperation.State == gardencorev1beta1.LastOperationStateFailed && - shoot.Generation == shoot.Status.ObservedGeneration && - shoot.Status.Gardener.Version == version.Get().GitVersion -} - -// IsNowInEffectiveShootMaintenanceTimeWindow checks if the current time is in the effective -// maintenance time window of the Shoot. -func IsNowInEffectiveShootMaintenanceTimeWindow(shoot *gardencorev1beta1.Shoot) bool { - return EffectiveShootMaintenanceTimeWindow(shoot).Contains(time.Now()) -} - -// LastReconciliationDuringThisTimeWindow returns true if is contained in the given effective maintenance time -// window of the shoot and if the did not happen longer than the longest possible duration of a -// maintenance time window. -func LastReconciliationDuringThisTimeWindow(shoot *gardencorev1beta1.Shoot) bool { - if shoot.Status.LastOperation == nil { - return false - } - - var ( - timeWindow = EffectiveShootMaintenanceTimeWindow(shoot) - now = time.Now() - lastReconciliation = shoot.Status.LastOperation.LastUpdateTime.Time - ) - - return timeWindow.Contains(lastReconciliation) && now.UTC().Sub(lastReconciliation.UTC()) <= gardencorev1beta1.MaintenanceTimeWindowDurationMaximum -} - -// IsObservedAtLatestGenerationAndSucceeded checks whether the Shoot's generation has changed or if the LastOperation status -// is Succeeded. -func IsObservedAtLatestGenerationAndSucceeded(shoot *gardencorev1beta1.Shoot) bool { - lastOperation := shoot.Status.LastOperation - return shoot.Generation == shoot.Status.ObservedGeneration && - (lastOperation != nil && lastOperation.State == gardencorev1beta1.LastOperationStateSucceeded) -} - -// SyncPeriodOfShoot determines the sync period of the given shoot. -// -// If no overwrite is allowed, the defaultMinSyncPeriod is returned. -// Otherwise, the overwrite is parsed. If an error occurs or it is smaller than the defaultMinSyncPeriod, -// the defaultMinSyncPeriod is returned. Otherwise, the overwrite is returned. -func SyncPeriodOfShoot(respectSyncPeriodOverwrite bool, defaultMinSyncPeriod time.Duration, shoot *gardencorev1beta1.Shoot) time.Duration { - if !RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite, shoot) { - return defaultMinSyncPeriod - } - - syncPeriodOverwrite, ok := shoot.Annotations[ShootSyncPeriod] - if !ok { - return defaultMinSyncPeriod - } - - syncPeriod, err := time.ParseDuration(syncPeriodOverwrite) - if err != nil { - return defaultMinSyncPeriod - } - - if syncPeriod < defaultMinSyncPeriod { - return defaultMinSyncPeriod - } - return syncPeriod -} - -// EffectiveMaintenanceTimeWindow cuts a maintenance time window at the end with a guess of 15 minutes. It is subtracted from the end -// of a maintenance time window to use a best-effort kind of finishing the operation before the end. -// Generally, we can't make sure that the maintenance operation is done by the end of the time window anyway (considering large -// clusters with hundreds of nodes, a rolling update will take several hours). -func EffectiveMaintenanceTimeWindow(timeWindow *utils.MaintenanceTimeWindow) *utils.MaintenanceTimeWindow { - return timeWindow.WithEnd(timeWindow.End().Add(0, -15, 0)) -} - -// EffectiveShootMaintenanceTimeWindow returns the effective MaintenanceTimeWindow of the given Shoot. -func EffectiveShootMaintenanceTimeWindow(shoot *gardencorev1beta1.Shoot) *utils.MaintenanceTimeWindow { - maintenance := shoot.Spec.Maintenance - if maintenance == nil || maintenance.TimeWindow == nil { - return utils.AlwaysTimeWindow - } - - timeWindow, err := utils.ParseMaintenanceTimeWindow(maintenance.TimeWindow.Begin, maintenance.TimeWindow.End) - if err != nil { - return utils.AlwaysTimeWindow - } - - return EffectiveMaintenanceTimeWindow(timeWindow) -} - -// GardenEtcdEncryptionSecretName returns the name to the 'backup' of the etcd encryption secret in the Garden cluster. -func GardenEtcdEncryptionSecretName(shootName string) string { - return fmt.Sprintf("%s.%s", shootName, EtcdEncryptionSecretName) -} - // ReadServiceAccountSigningKeySecret reads the signing key secret to extract the signing key. // It errors if there is no value at ServiceAccountSigningKeySecretDataKey. func ReadServiceAccountSigningKeySecret(secret *corev1.Secret) (string, error) { @@ -653,66 +415,6 @@ func GetServiceAccountSigningKeySecret(ctx context.Context, c client.Client, sho return ReadServiceAccountSigningKeySecret(secret) } -// GetAPIServerDomain returns the fully qualified domain name of for the api-server for the Shoot cluster. The -// end result is 'api.'. -func GetAPIServerDomain(domain string) string { - return fmt.Sprintf("%s.%s", APIServerPrefix, domain) -} - -// GetSecretFromSecretRef gets the Secret object from . -func GetSecretFromSecretRef(ctx context.Context, c client.Client, secretRef *corev1.SecretReference) (*corev1.Secret, error) { - secret := &corev1.Secret{} - if err := c.Get(ctx, kutil.Key(secretRef.Namespace, secretRef.Name), secret); err != nil { - return nil, err - } - return secret, nil -} - -// CheckIfDeletionIsConfirmed returns whether the deletion of an object is confirmed or not. -func CheckIfDeletionIsConfirmed(obj client.Object) error { - annotations := obj.GetAnnotations() - if annotations == nil { - return annotationRequiredError() - } - - value := annotations[ConfirmationDeletion] - if confirmed, err := strconv.ParseBool(value); err != nil || !confirmed { - return annotationRequiredError() - } - return nil -} - -func annotationRequiredError() error { - return fmt.Errorf("must have a %q annotation to delete", ConfirmationDeletion) -} - -// ConfirmDeletion adds Gardener's deletion confirmation annotation to the given object and sends an UPDATE request. -func ConfirmDeletion(ctx context.Context, c client.Client, obj client.Object) error { - return retry.RetryOnConflict(retry.DefaultBackoff, func() error { - if err := c.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil { - if !apierrors.IsNotFound(err) { - return err - } - return nil - } - - existing := obj.DeepCopyObject() - kutil.SetMetaDataAnnotation(obj, ConfirmationDeletion, "true") - kutil.SetMetaDataAnnotation(obj, v1beta1constants.GardenerTimestamp, TimeNow().UTC().String()) - - if reflect.DeepEqual(existing, obj) { - return nil - } - - return c.Update(ctx, obj) - }) -} - -// ExtensionID returns an identifier for the given extension kind/type. -func ExtensionID(extensionKind, extensionType string) string { - return fmt.Sprintf("%s/%s", extensionKind, extensionType) -} - // DeleteDeploymentsHavingDeprecatedRoleLabelKey deletes the Deployments with the passed object keys if // the corresponding Deployment .spec.selector contains the deprecated "garden.sapcloud.io/role" label key. func DeleteDeploymentsHavingDeprecatedRoleLabelKey(ctx context.Context, c client.Client, keys []client.ObjectKey) error { diff --git a/vendor/github.com/gardener/gardener/pkg/utils/chart/chart.go b/vendor/github.com/gardener/gardener/pkg/utils/chart/chart.go deleted file mode 100644 index 0984bc1c3..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/chart/chart.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 chart - -import ( - "context" - - "github.com/gardener/gardener/pkg/chartrenderer" - gardenerkubernetes "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/utils" - "github.com/gardener/gardener/pkg/utils/imagevector" - - "github.com/pkg/errors" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// Interface represents a Helm chart that can be applied and deleted. -type Interface interface { - // Apply applies this chart in the given namespace using the given ChartApplier. Before applying the chart, - // it collects its values, injecting images and merging the given values as needed. - Apply(context.Context, gardenerkubernetes.ChartApplier, string, imagevector.ImageVector, string, string, map[string]interface{}) error - // Render renders this chart in the given namespace using the given chartRenderer. Before rendering the chart, - // it collects its values, injecting images and merging the given values as needed. - Render(chartrenderer.Interface, string, imagevector.ImageVector, string, string, map[string]interface{}) (string, []byte, error) - // Delete deletes this chart's objects from the given namespace. - Delete(context.Context, client.Client, string) error -} - -// Chart represents a Helm chart (and its sub-charts) that can be applied and deleted. -type Chart struct { - Name string - Path string - Images []string - Objects []*Object - SubCharts []*Chart -} - -// Object represents an object deployed by a Chart. -type Object struct { - Type client.Object - Name string -} - -// Apply applies this chart in the given namespace using the given ChartApplier. Before applying the chart, -// it collects its values, injecting images and merging the given values as needed. -func (c *Chart) Apply( - ctx context.Context, - chartApplier gardenerkubernetes.ChartApplier, - namespace string, - imageVector imagevector.ImageVector, - runtimeVersion, targetVersion string, - additionalValues map[string]interface{}, -) error { - - // Get values with injected images - values, err := c.injectImages(imageVector, runtimeVersion, targetVersion) - if err != nil { - return err - } - - // Apply chart - err = chartApplier.Apply(ctx, c.Path, namespace, c.Name, gardenerkubernetes.Values(utils.MergeMaps(values, additionalValues))) - if err != nil { - return errors.Wrapf(err, "could not apply chart '%s' in namespace '%s'", c.Name, namespace) - } - return nil -} - -// Render renders this chart in the given namespace using the given chartRenderer. Before rendering the chart, -// it collects its values, injecting images and merging the given values as needed. -func (c *Chart) Render( - chartRenderer chartrenderer.Interface, - namespace string, - imageVector imagevector.ImageVector, - runtimeVersion, targetVersion string, - additionalValues map[string]interface{}, -) (string, []byte, error) { - - // Get values with injected images - values, err := c.injectImages(imageVector, runtimeVersion, targetVersion) - if err != nil { - return "", nil, err - } - - // Apply chart - rc, err := chartRenderer.Render(c.Path, c.Name, namespace, utils.MergeMaps(values, additionalValues)) - if err != nil { - return "", nil, errors.Wrapf(err, "could not render chart '%s' in namespace '%s'", c.Name, namespace) - } - return rc.ChartName, rc.Manifest(), nil -} - -// injectImages collects returns a values map with injected images, including sub-charts. -func (c *Chart) injectImages( - imageVector imagevector.ImageVector, - runtimeVersion, targetVersion string, -) (map[string]interface{}, error) { - - // Inject images - values := make(map[string]interface{}) - var err error - if len(c.Images) > 0 { - values, err = InjectImages(values, imageVector, c.Images, imagevector.RuntimeVersion(runtimeVersion), imagevector.TargetVersion(targetVersion)) - if err != nil { - return nil, errors.Wrapf(err, "could not inject chart '%s' images", c.Name) - } - } - - // Add subchart values - for _, sc := range c.SubCharts { - scValues, err := sc.injectImages(imageVector, runtimeVersion, targetVersion) - if err != nil { - return nil, err - } - values[sc.Name] = scValues - } - - return values, nil -} - -// Delete deletes this chart's objects from the given namespace using the given client. -func (c *Chart) Delete(ctx context.Context, client client.Client, namespace string) error { - // Delete objects - for _, o := range c.Objects { - if err := o.Delete(ctx, client, namespace); err != nil { - return errors.Wrap(err, "could not delete chart object") - } - } - - // Delete subchart objects - for _, sc := range c.SubCharts { - if err := sc.Delete(ctx, client, namespace); err != nil { - return err - } - } - - return nil -} - -// Delete deletes this object from the given namespace using the given client. -func (o *Object) Delete(ctx context.Context, c client.Client, namespace string) error { - obj := o.Type.DeepCopyObject().(client.Object) - kind := obj.GetObjectKind().GroupVersionKind().Kind - key := objectKey(namespace, o.Name) - if err := c.Get(ctx, key, obj); err != nil { - if apierrors.IsNotFound(err) { - return nil - } - return errors.Wrapf(err, "could not get %s '%s'", kind, key.String()) - } - if err := c.Delete(ctx, obj); err != nil { - return errors.Wrapf(err, "could not delete %s '%s'", kind, key.String()) - } - return nil -} - -func objectKey(namespace, name string) client.ObjectKey { - return client.ObjectKey{Namespace: namespace, Name: name} -} - -// InjectImages finds the images with the given names and opts, makes a shallow copy of the given -// Values and injects a name to image string mapping at the `images` key of that map and returns it. -func InjectImages(values map[string]interface{}, v imagevector.ImageVector, names []string, opts ...imagevector.FindOptionFunc) (map[string]interface{}, error) { - images, err := imagevector.FindImages(v, names, opts...) - if err != nil { - return nil, err - } - - values = utils.ShallowCopyMapStringInterface(values) - values["images"] = imagevector.ImageMapToValues(images) - return values, nil -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/gardener/deletion_confirmation.go b/vendor/github.com/gardener/gardener/pkg/utils/gardener/deletion_confirmation.go new file mode 100644 index 000000000..fb322e283 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/gardener/deletion_confirmation.go @@ -0,0 +1,83 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 gardener + +import ( + "context" + "fmt" + "reflect" + "strconv" + "time" + + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/utils/kubernetes" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/client-go/util/retry" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +const ( + // ConfirmationDeletion is an annotation on a Shoot and Project resources whose value must be set to "true" in order to + // allow deleting the resource (if the annotation is not set any DELETE request will be denied). + ConfirmationDeletion = "confirmation.gardener.cloud/deletion" + // DeletionProtected is a label on CustomResourceDefinitions indicating that the deletion is protected, i.e. + // it must be confirmed with the `confirmation.gardener.cloud/deletion=true` annotation before a `DELETE` call + // is accepted. + DeletionProtected = "gardener.cloud/deletion-protected" +) + +// TimeNow returns the current time. Exposed for testing. +var TimeNow = time.Now + +// CheckIfDeletionIsConfirmed returns whether the deletion of an object is confirmed or not. +func CheckIfDeletionIsConfirmed(obj client.Object) error { + annotations := obj.GetAnnotations() + if annotations == nil { + return confirmationAnnotationRequiredError() + } + + value := annotations[ConfirmationDeletion] + if confirmed, err := strconv.ParseBool(value); err != nil || !confirmed { + return confirmationAnnotationRequiredError() + } + return nil +} + +// ConfirmDeletion adds Gardener's deletion confirmation annotation to the given object and sends an UPDATE request. +func ConfirmDeletion(ctx context.Context, c client.Client, obj client.Object) error { + return retry.RetryOnConflict(retry.DefaultBackoff, func() error { + if err := c.Get(ctx, client.ObjectKeyFromObject(obj), obj); err != nil { + if !errors.IsNotFound(err) { + return err + } + return nil + } + + existing := obj.DeepCopyObject() + kubernetes.SetMetaDataAnnotation(obj, ConfirmationDeletion, "true") + kubernetes.SetMetaDataAnnotation(obj, v1beta1constants.GardenerTimestamp, TimeNow().UTC().String()) + + if reflect.DeepEqual(existing, obj) { + return nil + } + + return c.Update(ctx, obj) + }) +} + +func confirmationAnnotationRequiredError() error { + return fmt.Errorf("must have a %q annotation to delete", ConfirmationDeletion) +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/gardener/dns.go b/vendor/github.com/gardener/gardener/pkg/utils/gardener/dns.go new file mode 100644 index 000000000..3a8147882 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/gardener/dns.go @@ -0,0 +1,99 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 gardener + +import ( + "fmt" + "strings" +) + +const ( + // DNSProvider is the key for an annotation on a Kubernetes Secret object whose value must point to a valid + // DNS provider. + DNSProvider = "dns.gardener.cloud/provider" + // DNSDomain is the key for an annotation on a Kubernetes Secret object whose value must point to a valid + // domain name. + DNSDomain = "dns.gardener.cloud/domain" + // DNSIncludeZones is the key for an annotation on a Kubernetes Secret object whose value must point to a list + // of zones that shall be included. + DNSIncludeZones = "dns.gardener.cloud/include-zones" + // DNSExcludeZones is the key for an annotation on a Kubernetes Secret object whose value must point to a list + // of zones that shall be excluded. + DNSExcludeZones = "dns.gardener.cloud/exclude-zones" + + // APIServerFQDNPrefix is the part of a FQDN which will be used to construct the domain name for the kube-apiserver of + // a Shoot cluster. For example, when a Shoot specifies domain 'cluster.example.com', the apiserver domain would be + // 'api.cluster.example.com'. + APIServerFQDNPrefix = "api" + // IngressPrefix is the part of a FQDN which will be used to construct the domain name for an ingress controller of + // a Shoot cluster. For example, when a Shoot specifies domain 'cluster.example.com', the ingress domain would be + // '*..cluster.example.com'. + IngressPrefix = "ingress" + // InternalDomainKey is a key which must be present in an internal domain constructed for a Shoot cluster. If the + // configured internal domain already contains it, it won't be added twice. If it does not contain it, it will be + // appended. + InternalDomainKey = "internal" +) + +// GetDomainInfoFromAnnotations returns the provider and the domain that is specified in the given annotations. +func GetDomainInfoFromAnnotations(annotations map[string]string) (provider string, domain string, includeZones, excludeZones []string, err error) { + if annotations == nil { + return "", "", nil, nil, fmt.Errorf("domain secret has no annotations") + } + + if providerAnnotation, ok := annotations[DNSProvider]; ok { + provider = providerAnnotation + } + + if domainAnnotation, ok := annotations[DNSDomain]; ok { + domain = domainAnnotation + } + + if includeZonesAnnotation, ok := annotations[DNSIncludeZones]; ok { + includeZones = strings.Split(includeZonesAnnotation, ",") + } + if excludeZonesAnnotation, ok := annotations[DNSExcludeZones]; ok { + excludeZones = strings.Split(excludeZonesAnnotation, ",") + } + + if len(domain) == 0 { + return "", "", nil, nil, fmt.Errorf("missing dns domain annotation on domain secret") + } + if len(provider) == 0 { + return "", "", nil, nil, fmt.Errorf("missing dns provider annotation on domain secret") + } + + return +} + +// GetAPIServerDomain returns the fully qualified domain name of for the api-server for the Shoot cluster. The +// end result is 'api.'. +func GetAPIServerDomain(domain string) string { + return fmt.Sprintf("%s.%s", APIServerFQDNPrefix, domain) +} + +// GenerateDNSProviderName creates a name for the dns provider out of the passed `secretName` and `providerType`. +func GenerateDNSProviderName(secretName, providerType string) string { + switch { + case secretName != "" && providerType != "": + return fmt.Sprintf("%s-%s", providerType, secretName) + case secretName != "": + return secretName + case providerType != "": + return providerType + default: + return "" + } +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/gardener/project.go b/vendor/github.com/gardener/gardener/pkg/utils/gardener/project.go new file mode 100644 index 000000000..a5483c51d --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/gardener/project.go @@ -0,0 +1,103 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 gardener + +import ( + "context" + + gardencore "github.com/gardener/gardener/pkg/apis/core" + gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" + v1beta1constants "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + gardencoreinternallisters "github.com/gardener/gardener/pkg/client/core/listers/core/internalversion" + gardencorelisters "github.com/gardener/gardener/pkg/client/core/listers/core/v1beta1" + kutil "github.com/gardener/gardener/pkg/utils/kubernetes" + + corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "sigs.k8s.io/controller-runtime/pkg/client" +) + +// ProjectForNamespaceFromLister returns the Project responsible for a given . It lists all Projects +// via the given lister, iterates over them and tries to identify the Project by looking for the namespace name +// in the project spec. +func ProjectForNamespaceFromLister(projectLister gardencorelisters.ProjectLister, namespaceName string) (*gardencorev1beta1.Project, error) { + projectList, err := projectLister.List(labels.Everything()) + if err != nil { + return nil, err + } + + for _, project := range projectList { + if project.Spec.Namespace != nil && *project.Spec.Namespace == namespaceName { + return project, nil + } + } + + return nil, apierrors.NewNotFound(gardencorev1beta1.Resource("Project"), namespaceName) +} + +// ProjectForNamespaceFromInternalLister returns the Project responsible for a given . It lists all Projects +// via the given lister, iterates over them and tries to identify the Project by looking for the namespace name +// in the project spec. +func ProjectForNamespaceFromInternalLister(projectLister gardencoreinternallisters.ProjectLister, namespaceName string) (*gardencore.Project, error) { + projectList, err := projectLister.List(labels.Everything()) + if err != nil { + return nil, err + } + + for _, project := range projectList { + if project.Spec.Namespace != nil && *project.Spec.Namespace == namespaceName { + return project, nil + } + } + + return nil, apierrors.NewNotFound(gardencore.Resource("Project"), namespaceName) +} + +// ProjectForNamespaceFromReader returns the Project responsible for a given . It reads the namespace and +// fetches the project name label. Then it will read the project with the respective name. +func ProjectForNamespaceFromReader(ctx context.Context, reader client.Reader, namespaceName string) (*gardencorev1beta1.Project, error) { + projectList := &gardencorev1beta1.ProjectList{} + if err := reader.List(ctx, projectList, client.MatchingFields{gardencore.ProjectNamespace: namespaceName}); err != nil { + return nil, err + } + + if len(projectList.Items) == 0 { + return nil, apierrors.NewNotFound(gardencorev1beta1.Resource("Project"), "") + } + + return &projectList.Items[0], nil +} + +// ProjectAndNamespaceFromReader returns the Project responsible for a given . It reads the namespace and +// fetches the project name label. Then it will read the project with the respective name. +func ProjectAndNamespaceFromReader(ctx context.Context, reader client.Reader, namespaceName string) (*gardencorev1beta1.Project, *corev1.Namespace, error) { + namespace := &corev1.Namespace{} + if err := reader.Get(ctx, kutil.Key(namespaceName), namespace); err != nil { + return nil, nil, err + } + + projectName := namespace.Labels[v1beta1constants.ProjectName] + if projectName == "" { + return nil, namespace, nil + } + + project := &gardencorev1beta1.Project{} + if err := reader.Get(ctx, kutil.Key(projectName), project); err != nil { + return nil, namespace, err + } + + return project, namespace, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/gardener/seed.go b/vendor/github.com/gardener/gardener/pkg/utils/gardener/seed.go new file mode 100644 index 000000000..dc294138d --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/gardener/seed.go @@ -0,0 +1,37 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 gardener + +import ( + "strings" +) + +const ( + seedNamespaceNamePrefix = "seed-" +) + +// ComputeGardenNamespace returns the name of the namespace belonging to the given seed in the Garden cluster. +func ComputeGardenNamespace(seedName string) string { + return seedNamespaceNamePrefix + seedName +} + +// ComputeSeedName computes the name of the seed out of the seed namespace in the Garden cluster. +func ComputeSeedName(seedNamespaceName string) string { + seedName := strings.TrimPrefix(seedNamespaceName, seedNamespaceNamePrefix) + if seedName == seedNamespaceName { + return "" + } + return seedName +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/gardener/shoot.go b/vendor/github.com/gardener/gardener/pkg/utils/gardener/shoot.go new file mode 100644 index 000000000..d4d22aa05 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/gardener/shoot.go @@ -0,0 +1,142 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 gardener + +import ( + "fmt" + "strconv" + "time" + + "k8s.io/component-base/version" + + "github.com/gardener/gardener/pkg/apis/core/v1beta1" + "github.com/gardener/gardener/pkg/apis/core/v1beta1/constants" + "github.com/gardener/gardener/pkg/operation/common" + "github.com/gardener/gardener/pkg/utils" +) + +// RespectShootSyncPeriodOverwrite checks whether to respect the sync period overwrite of a Shoot or not. +func RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite bool, shoot *v1beta1.Shoot) bool { + return respectSyncPeriodOverwrite || shoot.Namespace == constants.GardenNamespace +} + +// ShouldIgnoreShoot determines whether a Shoot should be ignored or not. +func ShouldIgnoreShoot(respectSyncPeriodOverwrite bool, shoot *v1beta1.Shoot) bool { + if !RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite, shoot) { + return false + } + + value, ok := shoot.Annotations[constants.ShootIgnore] + if !ok { + return false + } + + ignore, _ := strconv.ParseBool(value) + return ignore +} + +// IsShootFailed checks if a Shoot is failed. +func IsShootFailed(shoot *v1beta1.Shoot) bool { + lastOperation := shoot.Status.LastOperation + + return lastOperation != nil && lastOperation.State == v1beta1.LastOperationStateFailed && + shoot.Generation == shoot.Status.ObservedGeneration && + shoot.Status.Gardener.Version == version.Get().GitVersion +} + +// IsNowInEffectiveShootMaintenanceTimeWindow checks if the current time is in the effective +// maintenance time window of the Shoot. +func IsNowInEffectiveShootMaintenanceTimeWindow(shoot *v1beta1.Shoot) bool { + return EffectiveShootMaintenanceTimeWindow(shoot).Contains(time.Now()) +} + +// LastReconciliationDuringThisTimeWindow returns true if is contained in the given effective maintenance time +// window of the shoot and if the did not happen longer than the longest possible duration of a +// maintenance time window. +func LastReconciliationDuringThisTimeWindow(shoot *v1beta1.Shoot) bool { + if shoot.Status.LastOperation == nil { + return false + } + + var ( + timeWindow = EffectiveShootMaintenanceTimeWindow(shoot) + now = time.Now() + lastReconciliation = shoot.Status.LastOperation.LastUpdateTime.Time + ) + + return timeWindow.Contains(lastReconciliation) && now.UTC().Sub(lastReconciliation.UTC()) <= v1beta1.MaintenanceTimeWindowDurationMaximum +} + +// IsObservedAtLatestGenerationAndSucceeded checks whether the Shoot's generation has changed or if the LastOperation status +// is Succeeded. +func IsObservedAtLatestGenerationAndSucceeded(shoot *v1beta1.Shoot) bool { + lastOperation := shoot.Status.LastOperation + return shoot.Generation == shoot.Status.ObservedGeneration && + (lastOperation != nil && lastOperation.State == v1beta1.LastOperationStateSucceeded) +} + +// SyncPeriodOfShoot determines the sync period of the given shoot. +// +// If no overwrite is allowed, the defaultMinSyncPeriod is returned. +// Otherwise, the overwrite is parsed. If an error occurs or it is smaller than the defaultMinSyncPeriod, +// the defaultMinSyncPeriod is returned. Otherwise, the overwrite is returned. +func SyncPeriodOfShoot(respectSyncPeriodOverwrite bool, defaultMinSyncPeriod time.Duration, shoot *v1beta1.Shoot) time.Duration { + if !RespectShootSyncPeriodOverwrite(respectSyncPeriodOverwrite, shoot) { + return defaultMinSyncPeriod + } + + syncPeriodOverwrite, ok := shoot.Annotations[constants.ShootSyncPeriod] + if !ok { + return defaultMinSyncPeriod + } + + syncPeriod, err := time.ParseDuration(syncPeriodOverwrite) + if err != nil { + return defaultMinSyncPeriod + } + + if syncPeriod < defaultMinSyncPeriod { + return defaultMinSyncPeriod + } + return syncPeriod +} + +// EffectiveMaintenanceTimeWindow cuts a maintenance time window at the end with a guess of 15 minutes. It is subtracted from the end +// of a maintenance time window to use a best-effort kind of finishing the operation before the end. +// Generally, we can't make sure that the maintenance operation is done by the end of the time window anyway (considering large +// clusters with hundreds of nodes, a rolling update will take several hours). +func EffectiveMaintenanceTimeWindow(timeWindow *utils.MaintenanceTimeWindow) *utils.MaintenanceTimeWindow { + return timeWindow.WithEnd(timeWindow.End().Add(0, -15, 0)) +} + +// EffectiveShootMaintenanceTimeWindow returns the effective MaintenanceTimeWindow of the given Shoot. +func EffectiveShootMaintenanceTimeWindow(shoot *v1beta1.Shoot) *utils.MaintenanceTimeWindow { + maintenance := shoot.Spec.Maintenance + if maintenance == nil || maintenance.TimeWindow == nil { + return utils.AlwaysTimeWindow + } + + timeWindow, err := utils.ParseMaintenanceTimeWindow(maintenance.TimeWindow.Begin, maintenance.TimeWindow.End) + if err != nil { + return utils.AlwaysTimeWindow + } + + return EffectiveMaintenanceTimeWindow(timeWindow) +} + +// GardenEtcdEncryptionSecretName returns the name to the 'backup' of the etcd encryption secret in the Garden cluster. +func GardenEtcdEncryptionSecretName(shootName string) string { + return fmt.Sprintf("%s.%s", shootName, common.EtcdEncryptionSecretName) +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector.go b/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector.go deleted file mode 100644 index 597fee2de..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 imagevector - -import ( - "fmt" - "io" - "os" - "regexp" - "strings" - - versionutils "github.com/gardener/gardener/pkg/utils/version" - - "gopkg.in/yaml.v2" -) - -const ( - // OverrideEnv is the name of the image vector override environment variable. - OverrideEnv = "IMAGEVECTOR_OVERWRITE" - // SHA256TagPrefix is the prefix in an image tag for sha256 tags. - SHA256TagPrefix = "sha256:" -) - -// Read reads an ImageVector from the given io.Reader. -func Read(r io.Reader) (ImageVector, error) { - vector := struct { - Images ImageVector `json:"images" yaml:"images"` - }{} - - if err := yaml.NewDecoder(r).Decode(&vector); err != nil { - return nil, err - } - return vector.Images, nil -} - -// ReadFile reads an ImageVector from the file with the given name. -func ReadFile(name string) (ImageVector, error) { - file, err := os.Open(name) - if err != nil { - return nil, err - } - defer file.Close() - - return Read(file) -} - -// ReadGlobalImageVectorWithEnvOverride reads the global image vector and applies the env override. Exposed for testing. -func ReadGlobalImageVectorWithEnvOverride(filePath string) (ImageVector, error) { - imageVector, err := ReadFile(filePath) - if err != nil { - return nil, err - } - - return WithEnvOverride(imageVector) -} - -// mergeImageSources merges the two given ImageSources. -// -// If the tag of the override is non-empty, it immediately returns the override. -// Otherwise, the override is copied, gets the tag of the old source and is returned. -func mergeImageSources(old, override *ImageSource) *ImageSource { - tag := override.Tag - if tag == nil { - tag = old.Tag - } - - runtimeVersion := override.RuntimeVersion - if runtimeVersion == nil { - runtimeVersion = old.RuntimeVersion - } - - targetVersion := override.TargetVersion - if targetVersion == nil { - targetVersion = old.TargetVersion - } - - return &ImageSource{ - Name: override.Name, - RuntimeVersion: runtimeVersion, - TargetVersion: targetVersion, - Repository: override.Repository, - Tag: tag, - } -} - -type imageSourceKey struct { - Name string - RuntimeVersion string - TargetVersion string -} - -func computeKey(source *ImageSource) imageSourceKey { - var runtimeVersion, targetVersion string - - if source.RuntimeVersion != nil { - runtimeVersion = *source.RuntimeVersion - } - if source.TargetVersion != nil { - targetVersion = *source.TargetVersion - } - - return imageSourceKey{ - Name: source.Name, - RuntimeVersion: runtimeVersion, - TargetVersion: targetVersion, - } -} - -// Merge merges the given ImageVectors into one. -// -// Images of ImageVectors that are later in the given sequence with the same name override -// previous images. -func Merge(vectors ...ImageVector) ImageVector { - var ( - out ImageVector - keyToIndex = make(map[imageSourceKey]int) - ) - - for _, vector := range vectors { - for _, image := range vector { - key := computeKey(image) - - if idx, ok := keyToIndex[key]; ok { - out[idx] = mergeImageSources(out[idx], image) - continue - } - - keyToIndex[key] = len(out) - out = append(out, image) - } - } - - return out -} - -// WithEnvOverride checks if an environment variable with the key IMAGEVECTOR_OVERWRITE is set. -// If yes, it reads the ImageVector at the value of the variable and merges it with the given one. -// Otherwise, it returns the unmodified ImageVector. -func WithEnvOverride(vector ImageVector) (ImageVector, error) { - overwritePath := os.Getenv(OverrideEnv) - if len(overwritePath) == 0 { - return vector, nil - } - - override, err := ReadFile(overwritePath) - if err != nil { - return nil, err - } - - return Merge(vector, override), nil -} - -// String implements Stringer. -func (o *FindOptions) String() string { - var runtimeVersion string - if o.RuntimeVersion != nil { - runtimeVersion = "runtime version " + *o.RuntimeVersion + " " - } - - var targetVersion string - if o.TargetVersion != nil { - targetVersion = "target version " + *o.TargetVersion - } - - return runtimeVersion + targetVersion -} - -// ApplyOptions applies the given FindOptionFuncs to these FindOptions. Returns a pointer to the mutated value. -func (o *FindOptions) ApplyOptions(opts []FindOptionFunc) *FindOptions { - for _, opt := range opts { - opt(o) - } - return o -} - -// RuntimeVersion sets the RuntimeVersion of the FindOptions to the given version. -func RuntimeVersion(version string) FindOptionFunc { - return func(options *FindOptions) { - options.RuntimeVersion = &version - } -} - -// TargetVersion sets the TargetVersion of the FindOptions to the given version. -func TargetVersion(version string) FindOptionFunc { - return func(options *FindOptions) { - options.TargetVersion = &version - } -} - -var r = regexp.MustCompile(`^(v?[0-9]+\.[0-9]+\.[0-9]+|=)`) - -func checkConstraint(constraint, version *string) (score int, ok bool, err error) { - if constraint == nil || version == nil { - return 0, true, nil - } - - matches, err := versionutils.CheckVersionMeetsConstraint(*version, *constraint) - if err != nil || !matches { - return 0, false, err - } - - score = 1 - - // prioritize equal constraints - if r.MatchString(*constraint) { - score = 2 - } - - return score, true, nil -} - -func match(source *ImageSource, name string, opts *FindOptions) (score int, ok bool, err error) { - if source.Name != name { - return 0, false, nil - } - - runtimeScore, ok, err := checkConstraint(source.RuntimeVersion, opts.RuntimeVersion) - if err != nil || !ok { - return 0, false, err - } - score += runtimeScore - - targetScore, ok, err := checkConstraint(source.TargetVersion, opts.TargetVersion) - if err != nil || !ok { - return 0, false, err - } - score += targetScore - - return score, true, nil -} - -// FindImage returns an image with the given from the sources in the image vector. -// The specifies the kubernetes version the image will be running on. -// The specifies the kubernetes version the image shall target. -// If multiple entries were found, the provided is compared with the constraints -// stated in the image definition. -// In case multiple images match the search, the first which was found is returned. -// In case no image was found, an error is returned. -func (v ImageVector) FindImage(name string, opts ...FindOptionFunc) (*Image, error) { - o := &FindOptions{} - o = o.ApplyOptions(opts) - - var ( - bestScore int - bestCandidate *ImageSource - ) - - for _, source := range v { - if source.Name == name { - score, ok, err := match(source, name, o) - if err != nil { - return nil, err - } - - if ok && (bestCandidate == nil || score > bestScore) { - bestCandidate = source - bestScore = score - } - } - } - - if bestCandidate == nil { - return nil, fmt.Errorf("could not find image %q opts %v", name, o) - } - - return bestCandidate.ToImage(o.TargetVersion), nil -} - -// FindImages returns an image map with the given from the sources in the image vector. -// The specifies the kubernetes version the image will be running on. -// The specifies the kubernetes version the image shall target. -// If multiple entries were found, the provided is compared with the constraints -// stated in the image definition. -// In case multiple images match the search, the first which was found is returned. -// In case no image was found, an error is returned. -func FindImages(v ImageVector, names []string, opts ...FindOptionFunc) (map[string]*Image, error) { - images := map[string]*Image{} - for _, imageName := range names { - image, err := v.FindImage(imageName, opts...) - if err != nil { - return nil, err - } - images[imageName] = image - } - return images, nil -} - -// ToImage applies the given to the source to produce an output image. -// If the tag of an image source is empty, it will use the given as tag. -func (i *ImageSource) ToImage(targetVersion *string) *Image { - tag := i.Tag - if tag == nil && targetVersion != nil { - version := fmt.Sprintf("v%s", strings.TrimLeft(*targetVersion, "v")) - tag = &version - } - - return &Image{ - Name: i.Name, - Repository: i.Repository, - Tag: tag, - } -} - -// String will returns the string representation of the image. -func (i *Image) String() string { - if i.Tag == nil { - return i.Repository - } - - delimiter := ":" - if strings.HasPrefix(*i.Tag, SHA256TagPrefix) { - delimiter = "@" - } - - return i.Repository + delimiter + *i.Tag -} - -// ImageMapToValues transforms the given image name to image mapping into chart Values. -func ImageMapToValues(m map[string]*Image) map[string]interface{} { - out := make(map[string]interface{}, len(m)) - for k, v := range m { - out[k] = v.String() - } - return out -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector_components.go b/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector_components.go deleted file mode 100644 index 729559760..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/imagevector_components.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 imagevector - -import ( - "io" - "os" - - "gopkg.in/yaml.v2" -) - -const ( - // ComponentOverrideEnv is the name of the environment variable for image vector overrides of components deployed - // by Gardener. - ComponentOverrideEnv = "IMAGEVECTOR_OVERWRITE_COMPONENTS" -) - -// ReadComponentOverwrite reads an ComponentImageVector from the given io.Reader. -func ReadComponentOverwrite(r io.Reader) (ComponentImageVectors, error) { - data := struct { - Components []ComponentImageVector `json:"components" yaml:"components"` - }{} - - if err := yaml.NewDecoder(r).Decode(&data); err != nil { - return nil, err - } - - out := make(ComponentImageVectors, len(data.Components)) - for _, component := range data.Components { - out[component.Name] = component.ImageVectorOverwrite - } - - return out, nil -} - -// ReadComponentOverwriteFile reads an ComponentImageVector from the file with the given name. -func ReadComponentOverwriteFile(name string) (ComponentImageVectors, error) { - file, err := os.Open(name) - if err != nil { - return nil, err - } - defer file.Close() - - return ReadComponentOverwrite(file) -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/types.go b/vendor/github.com/gardener/gardener/pkg/utils/imagevector/types.go deleted file mode 100644 index 168fb8ed1..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/imagevector/types.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 imagevector - -// ImageSource contains the repository and the tag of a Docker container image. If the respective -// image is only valid for a specific Kubernetes runtime version, then it must also contain the -// 'runtimeVersion' field describing for which versions it can be used. Similarly, if it is only -// valid for a specific Kubernetes version to operate on, then it must also contain the 'targetVersion' -// field describing for which versions it can be used. Examples of these are CSI controllers that run -// in the seed cluster and act on the shoot cluster. Different versions might be used depending on the -// seed and the shoot version. -type ImageSource struct { - Name string `json:"name" yaml:"name"` - RuntimeVersion *string `json:"runtimeVersion,omitempty" yaml:"runtimeVersion,omitempty"` - TargetVersion *string `json:"targetVersion,omitempty" yaml:"targetVersion,omitempty"` - - Repository string `json:"repository" yaml:"repository"` - Tag *string `json:"tag,omitempty" yaml:"tag,omitempty"` -} - -// Image is a concrete, pullable image with a nonempty tag. -type Image struct { - Name string - Repository string - Tag *string -} - -// ImageVector is a list of image sources. -type ImageVector []*ImageSource - -// ComponentImageVector contains an image vector overwrite for a component deployed by Gardener. -type ComponentImageVector struct { - Name string `json:"name" yaml:"name"` - ImageVectorOverwrite string `json:"imageVectorOverwrite" yaml:"imageVectorOverwrite"` -} - -// ComponentImageVectors maps a component with a given name (key) to the image vector overwrite content (value). -type ComponentImageVectors map[string]string - -// FindOptions are options that can be supplied during either `FindImage` or `FindImages`. -type FindOptions struct { - RuntimeVersion *string - TargetVersion *string -} - -// FindOptionFunc is a function that mutates FindOptions. -type FindOptionFunc func(*FindOptions) diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/deployment.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/deployment.go index c5f7840ec..97ad0f486 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/deployment.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/deployment.go @@ -15,16 +15,16 @@ package kubernetes import ( + "context" "fmt" "strings" - apierrors "k8s.io/apimachinery/pkg/api/errors" - "k8s.io/apimachinery/pkg/labels" - "github.com/Masterminds/semver" - appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + apierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "sigs.k8s.io/controller-runtime/pkg/client" ) // ValidDeploymentContainerImageVersion validates compliance of a deployment container image to a minimum version @@ -138,3 +138,15 @@ func (d *deploymentNamespaceLister) List(selector labels.Selector) ([]*appsv1.De return deployment.Namespace == d.namespace && selector.Matches(labels.Set(deployment.Labels)) }) } + +// CurrentReplicaCountForDeployment returns the current replicaCount for the given deployment. +func CurrentReplicaCountForDeployment(ctx context.Context, client client.Client, namespace, deploymentName string) (int32, error) { + deployment := &appsv1.Deployment{} + if err := client.Get(ctx, Key(namespace, deploymentName), deployment); err != nil && !apierrors.IsNotFound(err) { + return 0, err + } + if deployment.Spec.Replicas == nil { + return 0, nil + } + return *deployment.Spec.Replicas, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/eventhandler.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/eventhandler.go new file mode 100644 index 000000000..a79f7eba5 --- /dev/null +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/eventhandler.go @@ -0,0 +1,330 @@ +// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file +// +// 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 kubernetes + +import ( + "context" + "fmt" + + "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/tools/cache" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/event" + "sigs.k8s.io/controller-runtime/pkg/predicate" +) + +// ControllerPredicateFactory provides a method for creating new Predicates for a controller. +type ControllerPredicateFactory interface { + // NewControllerPredicate creates and returns a new Predicate with the given controller. + NewControllerPredicate(client.Object) predicate.Predicate +} + +// ControllerPredicateFactoryFunc is a function that implements ControllerPredicateFactory. +type ControllerPredicateFactoryFunc func(client.Object, client.Object, client.Object, bool) bool + +// NewControllerPredicate creates and returns a new Predicate with the given controller. +func (f ControllerPredicateFactoryFunc) NewControllerPredicate(controller client.Object) predicate.Predicate { + return predicate.Funcs{ + CreateFunc: func(e event.CreateEvent) bool { + return f(e.Object, nil, controller, false) + }, + UpdateFunc: func(e event.UpdateEvent) bool { + return f(e.ObjectNew, e.ObjectOld, controller, false) + }, + DeleteFunc: func(e event.DeleteEvent) bool { + return f(e.Object, nil, controller, true) + }, + GenericFunc: func(e event.GenericEvent) bool { + return false + }, + } +} + +// Enqueuer provides a method for enqueuing an object for processing. +type Enqueuer interface { + // Enqueue enqueues the object for processing. + Enqueue(client.Object) +} + +// EnqueuerFunc is a function that implements Enqueuer. +type EnqueuerFunc func(client.Object) + +// Enqueue enqueues the object for processing. +func (f EnqueuerFunc) Enqueue(obj client.Object) { + f(obj) +} + +// ControlledResourceEventHandler is an implementation of cache.ResourceEventHandler that enqueues controllers upon +// controlled resource events, if a predicate check is successful. +type ControlledResourceEventHandler struct { + // ControllerTypes is a list of controller types. If multiple controller types are specified, + // there is a chain of controllers. Only the top-most controller (with the last listed type) is eventually enqueued. + ControllerTypes []ControllerType + // Ctx is the context used to get controller objects. + Ctx context.Context + // Reader is the reader used to get controller objects. + Reader client.Reader + // ControllerPredicateFactory is used to create a predicate to check if an object event is of interest to a controller, + // before enqueueing it. If nil, the controller is always enqueued. + ControllerPredicateFactory ControllerPredicateFactory + // Enqueuer is used to enqueue the controller. + Enqueuer Enqueuer + // Scheme is used to resolve types to their GroupKinds. + Scheme *runtime.Scheme + // Logger is used to log messages. + Logger *logrus.Logger +} + +// ControllerType contains information about a controller type. +type ControllerType struct { + // Type is the controller type. It is used to check the controller group and kind and get objects of the specified type. + Type client.Object + // Namespace is an optional namespace to look for controllers. If nil, the namespace of the controlled object is used. + Namespace *string + // NameFunc is an optional function that returns the controller name from the given object. + // It is only used if the object doesn't have a controller ref. + NameFunc func(obj client.Object) string + + // groupKind is the cached GroupKind as determined from Type. + groupKind *schema.GroupKind +} + +// OnAdd is called when an object is added. +func (h *ControlledResourceEventHandler) OnAdd(o interface{}) { + obj, ok := o.(client.Object) + if !ok { + return + } + + // Get the controller, if any + controller := h.getControllerOf(obj, 0) + if controller == nil { + return + } + + // Create and check predicate to determine if the event is of interest to the controller + if h.ControllerPredicateFactory != nil { + e := event.CreateEvent{Object: obj} + if p := h.ControllerPredicateFactory.NewControllerPredicate(controller); !p.Create(e) { + return + } + } + + // Enqueue the controller + h.logEnqueue(controller, obj, "Add") + h.Enqueuer.Enqueue(controller) +} + +// OnUpdate is called when an object is modified. +func (h *ControlledResourceEventHandler) OnUpdate(old, new interface{}) { + oldObj, ok := old.(client.Object) + if !ok { + return + } + newObj, ok := new.(client.Object) + if !ok { + return + } + + // Check resource versions, as we may receive update events for all object of certain kind + if newObj.GetResourceVersion() == oldObj.GetResourceVersion() { + return + } + + // Get the old and the new controllers, if any + oldController := h.getControllerOf(oldObj, 0) + newController := h.getControllerOf(newObj, 0) + + // If the controller has changed, enqueue the old controller, if any + if oldController != nil && (newController == nil || oldController.GetUID() != newController.GetUID()) { + // Create and check predicate to determine if the event is of interest to the old controller + if h.ControllerPredicateFactory != nil { + e := event.UpdateEvent{ObjectOld: oldObj, ObjectNew: newObj} + if p := h.ControllerPredicateFactory.NewControllerPredicate(oldController); !p.Update(e) { + return + } + } + + // Enqueue the old controller + h.logEnqueue(oldController, oldObj, "Update") + h.Enqueuer.Enqueue(oldController) + } + + if newController == nil { + return + } + + // Create and check predicate to determine if the event is of interest to the new controller + if h.ControllerPredicateFactory != nil { + e := event.UpdateEvent{ObjectOld: oldObj, ObjectNew: newObj} + if p := h.ControllerPredicateFactory.NewControllerPredicate(newController); !p.Update(e) { + return + } + } + + // Enqueue the new controller + h.logEnqueue(newController, newObj, "Update") + h.Enqueuer.Enqueue(newController) +} + +// OnDelete is called when an object is deleted. It will get the final state of the item if it is known, +// otherwise it will get an object of type DeletedFinalStateUnknown. +func (h *ControlledResourceEventHandler) OnDelete(o interface{}) { + obj, ok := o.(client.Object) + if !ok { + tombstone, ok := o.(cache.DeletedFinalStateUnknown) + if !ok { + return + } + obj, ok = tombstone.Obj.(client.Object) + if !ok { + return + } + } + + // Get the controller, if any + controller := h.getControllerOf(obj, 0) + if controller == nil { + return + } + + // Create and check predicate to determine if the event is of interest to the controller + if h.ControllerPredicateFactory != nil { + e := event.DeleteEvent{Object: obj} + if p := h.ControllerPredicateFactory.NewControllerPredicate(controller); !p.Delete(e) { + return + } + } + + // Enqueue the controller + h.logEnqueue(controller, obj, "Delete") + h.Enqueuer.Enqueue(controller) +} + +func (h *ControlledResourceEventHandler) getControllerOf(obj client.Object, index int) client.Object { + ct := h.ControllerTypes[index] + + // Get controller by ref or by name + controllerRef := metav1.GetControllerOf(obj) + if controllerRef != nil { + return h.getControllerByRef(obj.GetNamespace(), controllerRef, index) + } else if ct.NameFunc != nil { + if name := ct.NameFunc(obj); name != "" { + return h.getControllerByName(obj.GetNamespace(), name, index) + } + } + return nil +} + +func (h *ControlledResourceEventHandler) getControllerByName(namespace, name string, index int) client.Object { + ct := h.ControllerTypes[index] + + // Get controller by name + controller := ct.Type.DeepCopyObject().(client.Object) + if ct.Namespace != nil { + namespace = *ct.Namespace + } + if err := h.Reader.Get(h.Ctx, Key(namespace, name), controller); err != nil { + return nil + } + + // If this is the final controller in the chain, return it, otherwise move up the chain + if index == len(h.ControllerTypes)-1 { + return controller + } + return h.getControllerOf(controller, index+1) +} + +func (h *ControlledResourceEventHandler) getControllerByRef(namespace string, controllerRef *metav1.OwnerReference, index int) client.Object { + ct := h.ControllerTypes[index] + + // Check controller ref group and kind + crgv, err := schema.ParseGroupVersion(controllerRef.APIVersion) + if err != nil { + return nil + } + gk, err := h.getGroupKind(&ct) + if err != nil { + return nil + } + if crgv.Group != gk.Group || controllerRef.Kind != gk.Kind { + return nil + } + + // Get controller by name + controller := ct.Type.DeepCopyObject().(client.Object) + if ct.Namespace != nil { + namespace = *ct.Namespace + } + if err := h.Reader.Get(h.Ctx, Key(namespace, controllerRef.Name), controller); err != nil { + return nil + } + + // Check UID + if controller.GetUID() != controllerRef.UID { + return nil + } + + // If this is the final controller in the chain, return it, otherwise move up the chain + if index == len(h.ControllerTypes)-1 { + return controller + } + return h.getControllerOf(controller, index+1) +} + +func (h *ControlledResourceEventHandler) logEnqueue(controller, obj client.Object, eventType string) { + h.Logger.Debugf("Enqueueing %s %s due to %s event on %s %s", h.getLastControllerKind(), ObjectName(controller), + eventType, h.getObjectKind(obj), ObjectName(obj)) +} + +func (h *ControlledResourceEventHandler) getGroupKind(ct *ControllerType) (*schema.GroupKind, error) { + if ct.groupKind == nil { + var err error + if ct.groupKind, err = getObjectGroupKind(h.Scheme, ct.Type); err != nil { + return nil, err + } + } + return ct.groupKind, nil +} + +func (h *ControlledResourceEventHandler) getLastControllerKind() string { + if gk, err := h.getGroupKind(&h.ControllerTypes[len(h.ControllerTypes)-1]); err == nil { + return gk.Kind + } + return "" +} + +func (h *ControlledResourceEventHandler) getObjectKind(obj client.Object) string { + if gk, err := getObjectGroupKind(h.Scheme, obj); err == nil { + return gk.Kind + } + return "" +} + +// getObjectGroupKind parses the given object into a schema.GroupKind. +func getObjectGroupKind(scheme *runtime.Scheme, obj client.Object) (*schema.GroupKind, error) { + // Get the kinds of the type + kinds, _, err := scheme.ObjectKinds(obj) + if err != nil { + return nil, err + } + if len(kinds) != 1 { + return nil, fmt.Errorf("expected exactly 1 kind for type %T, but found %d kinds", obj, len(kinds)) + } + return &schema.GroupKind{Group: kinds[0].Group, Kind: kinds[0].Kind}, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/health.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/health.go index 8b47f8d8b..342e72a64 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/health.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/health.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "net/http" + "strings" "time" druidv1alpha1 "github.com/gardener/etcd-druid/api/v1alpha1" @@ -29,6 +30,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/client-go/rest" + apiregistrationv1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" "sigs.k8s.io/controller-runtime/pkg/client" gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" @@ -45,10 +47,9 @@ func requiredConditionMissing(conditionType string) error { return fmt.Errorf("condition %q is missing", conditionType) } -func checkConditionState(conditionType string, expected, actual, reason, message string) error { +func checkConditionState(expected, actual, reason, message string) error { if expected != actual { - return fmt.Errorf("condition %q has invalid status %s (expected %s) due to %s: %s", - conditionType, actual, expected, reason, message) + return fmt.Errorf("%s (%s)", strings.Trim(message, "."), reason) } return nil } @@ -99,29 +100,27 @@ func CheckDeployment(deployment *appsv1.Deployment) error { if condition == nil { return requiredConditionMissing(conditionType) } - if err := checkConditionState(conditionType, string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } for _, trueOptionalConditionType := range trueOptionalDeploymentConditionTypes { - conditionType := string(trueOptionalConditionType) condition := getDeploymentCondition(deployment.Status.Conditions, trueOptionalConditionType) if condition == nil { continue } - if err := checkConditionState(conditionType, string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } for _, falseOptionalConditionType := range falseOptionalDeploymentConditionTypes { - conditionType := string(falseOptionalConditionType) condition := getDeploymentCondition(deployment.Status.Conditions, falseOptionalConditionType) if condition == nil { continue } - if err := checkConditionState(conditionType, string(corev1.ConditionFalse), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionFalse), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } @@ -153,7 +152,7 @@ func CheckStatefulSet(statefulSet *appsv1.StatefulSet) error { // A Etcd is considered healthy if its ready field in status is true. func CheckEtcd(etcd *druidv1alpha1.Etcd) error { if !utils.IsTrue(etcd.Status.Ready) { - return fmt.Errorf("etcd %s is not ready yet", etcd.Name) + return fmt.Errorf("etcd %q is not ready yet", etcd.Name) } return nil } @@ -192,11 +191,6 @@ func CheckDaemonSet(daemonSet *appsv1.DaemonSet) error { return nil } -// NodeOutOfDisk is deprecated NodeConditionType. -// It is no longer reported by kubelet >= 1.13. See https://github.com/kubernetes/kubernetes/pull/70111. -// +deprecated -const NodeOutOfDisk = "OutOfDisk" - var ( trueNodeConditionTypes = []corev1.NodeConditionType{ corev1.NodeReady, @@ -207,7 +201,6 @@ var ( corev1.NodeMemoryPressure, corev1.NodeNetworkUnavailable, corev1.NodePIDPressure, - NodeOutOfDisk, } ) @@ -221,18 +214,17 @@ func CheckNode(node *corev1.Node) error { if condition == nil { return requiredConditionMissing(conditionType) } - if err := checkConditionState(conditionType, string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } for _, falseConditionType := range falseNodeConditionTypes { - conditionType := string(falseConditionType) condition := getNodeCondition(node.Status.Conditions, falseConditionType) if condition == nil { continue } - if err := checkConditionState(conditionType, string(corev1.ConditionFalse), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionFalse), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } @@ -240,6 +232,27 @@ func CheckNode(node *corev1.Node) error { return nil } +// CheckAPIService checks whether the given APIService is healthy. +// An APIService is considered healthy if it has the `Available` condition and its status is `True`. +func CheckAPIService(apiService *apiregistrationv1.APIService) error { + const ( + requiredCondition = apiregistrationv1.Available + requiredConditionStatus = apiregistrationv1.ConditionTrue + ) + + for _, condition := range apiService.Status.Conditions { + if condition.Type == requiredCondition { + return checkConditionState( + string(requiredConditionStatus), + string(condition.Status), + condition.Reason, + condition.Message, + ) + } + } + return requiredConditionMissing(string(requiredCondition)) +} + var ( trueSeedConditionTypes = []gardencorev1beta1.ConditionType{ gardencorev1beta1.SeedGardenletReady, @@ -277,7 +290,7 @@ func checkSeed(seed *gardencorev1beta1.Seed, identity *gardencorev1beta1.Gardene if condition == nil { return requiredConditionMissing(conditionType) } - if err := checkConditionState(conditionType, string(gardencorev1beta1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(gardencorev1beta1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } @@ -303,7 +316,7 @@ func CheckManagedSeed(managedSeed *seedmanagementv1alpha1.ManagedSeed) error { if condition == nil { return requiredConditionMissing(string(conditionType)) } - if err := checkConditionState(string(conditionType), string(gardencorev1beta1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(gardencorev1beta1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } @@ -436,7 +449,7 @@ func CheckManagedResource(managedResource *resourcesv1alpha1.ManagedResource) er if condition == nil { return requiredConditionMissing(conditionType) } - if err := checkConditionState(conditionType, string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { + if err := checkConditionState(string(corev1.ConditionTrue), string(condition.Status), condition.Reason, condition.Message); err != nil { return err } } diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/pod_health.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/pod_health.go index dbafa0b83..73356c90c 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/pod_health.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/health/pod_health.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Coppied from https://github.com/kubernetes/kubernetes/blob/a93f803f8e400f1d42dc812bc51932ff3b31798a/pkg/api/pod/util.go#L181-L211 +// Copied from https://github.com/kubernetes/kubernetes/blob/a93f803f8e400f1d42dc812bc51932ff3b31798a/pkg/api/pod/util.go#L181-L211 package health diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/kubernetes.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/kubernetes.go index 6a0ac7454..8814ece6e 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/kubernetes.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/kubernetes.go @@ -77,6 +77,16 @@ func HasMetaDataAnnotation(meta metav1.Object, key, value string) bool { return ok && val == value } +// SetAnnotationAndUpdate sets the annotation on the given object and updates it. +func SetAnnotationAndUpdate(ctx context.Context, c client.Client, obj client.Object, key, value string) error { + if !HasMetaDataAnnotation(obj, key, value) { + objCopy := obj.DeepCopyObject() + SetMetaDataAnnotation(obj, key, value) + return c.Patch(ctx, obj, client.MergeFrom(objCopy)) + } + return nil +} + func nameAndNamespace(namespaceOrName string, nameOpt ...string) (namespace, name string) { if len(nameOpt) > 1 { panic(fmt.Sprintf("more than name/namespace for key specified: %s/%v", namespaceOrName, nameOpt)) @@ -185,7 +195,8 @@ func WaitUntilLoadBalancerIsReady(ctx context.Context, kubeClient kubernetes.Int }); err != nil { const eventsLimit = 2 - eventsErrorMessage, err2 := FetchEventMessages(ctx, kubeClient.DirectClient(), service, corev1.EventTypeWarning, eventsLimit) + // use API reader here, we don't want to cache all events + eventsErrorMessage, err2 := FetchEventMessages(ctx, kubeClient.Client().Scheme(), kubeClient.APIReader(), service, corev1.EventTypeWarning, eventsLimit) if err2 != nil { logger.Errorf("error %q occured while fetching events for error %q", err2, err) return "", fmt.Errorf("'%w' occurred but could not fetch events for more information", err) @@ -301,13 +312,10 @@ func ReconcileServicePorts(existingPorts []corev1.ServicePort, desiredPorts []co // FetchEventMessages gets events for the given object of the given `eventType` and returns them as a formatted output. // The function expects that the given `obj` is specified with a proper `metav1.TypeMeta`. -func FetchEventMessages(ctx context.Context, c client.Client, obj client.Object, eventType string, eventsLimit int) (string, error) { - if c.Scheme() == nil { - return "", errors.New("scheme is not provided") - } - gvk, err := apiutil.GVKForObject(obj, c.Scheme()) +func FetchEventMessages(ctx context.Context, scheme *runtime.Scheme, reader client.Reader, obj client.Object, eventType string, eventsLimit int) (string, error) { + gvk, err := apiutil.GVKForObject(obj, scheme) if err != nil { - return "", fmt.Errorf("failed identify GVK for object: %w", err) + return "", fmt.Errorf("failed to identify GVK for object: %w", err) } apiVersion, kind := gvk.ToAPIVersionAndKind() @@ -325,7 +333,7 @@ func FetchEventMessages(ctx context.Context, c client.Client, obj client.Object, "type": eventType, } eventList := &corev1.EventList{} - if err := c.List(ctx, eventList, fieldSelector); err != nil { + if err := reader.List(ctx, eventList, fieldSelector); err != nil { return "", fmt.Errorf("error '%v' occurred while fetching more details", err) } @@ -430,7 +438,7 @@ func OwnedBy(obj client.Object, apiVersion, kind, name string, uid types.UID) bo // is provided then it will be applied for each object right after listing all objects. If no object remains then nil // is returned. The Items field in the list object will be populated with the result returned from the server after // applying the filter function (if provided). -func NewestObject(ctx context.Context, c client.Client, listObj client.ObjectList, filterFn func(client.Object) bool, listOpts ...client.ListOption) (client.Object, error) { +func NewestObject(ctx context.Context, c client.Reader, listObj client.ObjectList, filterFn func(client.Object) bool, listOpts ...client.ListOption) (client.Object, error) { if err := c.List(ctx, listObj, listOpts...); err != nil { return nil, err } @@ -478,7 +486,7 @@ func NewestObject(ctx context.Context, c client.Client, listObj client.ObjectLis } // NewestPodForDeployment returns the most recently created Pod object for the given deployment. -func NewestPodForDeployment(ctx context.Context, c client.Client, deployment *appsv1.Deployment) (*corev1.Pod, error) { +func NewestPodForDeployment(ctx context.Context, c client.Reader, deployment *appsv1.Deployment) (*corev1.Pod, error) { listOpts := []client.ListOption{client.InNamespace(deployment.Namespace)} if deployment.Spec.Selector != nil { listOpts = append(listOpts, client.MatchingLabels(deployment.Spec.Selector.MatchLabels)) @@ -560,3 +568,12 @@ func MostRecentCompleteLogs( return string(logs), nil } + +// IgnoreAlreadyExists returns nil on AlreadyExists errors. +// All other values that are not AlreadyExists errors or nil are returned unmodified. +func IgnoreAlreadyExists(err error) error { + if apierrors.IsAlreadyExists(err) { + return nil + } + return err +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/namespace.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/namespace.go deleted file mode 100644 index dec21a8e2..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/namespace.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 kubernetes - -import ( - "context" - - "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/logger" - - corev1 "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - k8s "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" -) - -func tryUpdateNamespace( - ctx context.Context, - k k8s.Interface, - backoff wait.Backoff, - meta metav1.ObjectMeta, - transform func(*corev1.Namespace) (*corev1.Namespace, error), - updateFunc func(k k8s.Interface, namespace *corev1.Namespace) (*corev1.Namespace, error), - exitEarlyFunc func(cur, updated *corev1.Namespace) bool, -) (*corev1.Namespace, error) { - var ( - result *corev1.Namespace - attempt int - ) - - err := retry.RetryOnConflict(backoff, func() (err error) { - attempt++ - cur, err := k.CoreV1().Namespaces().Get(ctx, meta.Name, kubernetes.DefaultGetOptions()) - if err != nil { - return err - } - - updated, err := transform(cur.DeepCopy()) - if err != nil { - return err - } - - if exitEarlyFunc(cur, updated) { - result = cur - return nil - } - - result, err = updateFunc(k, updated) - if err != nil { - logger.Logger.Errorf("Attempt %d failed to update Namespace %s due to %v", attempt, cur.Name, err) - } - return - }) - if err != nil { - logger.Logger.Errorf("Failed to update Namespace %s after %d attempts due to %v", meta.Name, attempt, err) - } - - return result, err -} - -// TryUpdateNamespace tries to update a namespace and retries the operation with the given . -func TryUpdateNamespace(ctx context.Context, k k8s.Interface, backoff wait.Backoff, meta metav1.ObjectMeta, transform func(*corev1.Namespace) (*corev1.Namespace, error)) (*corev1.Namespace, error) { - return tryUpdateNamespace(ctx, k, backoff, meta, transform, func(k k8s.Interface, namespace *corev1.Namespace) (*corev1.Namespace, error) { - return k.CoreV1().Namespaces().Update(ctx, namespace, kubernetes.DefaultUpdateOptions()) - }, func(cur, updated *corev1.Namespace) bool { - return equality.Semantic.DeepEqual(cur, updated) - }) -} - -// TryUpdateNamespaceLabels tries to update a namespace's labels and retries the operation with the given . -func TryUpdateNamespaceLabels(ctx context.Context, k k8s.Interface, backoff wait.Backoff, meta metav1.ObjectMeta, transform func(*corev1.Namespace) (*corev1.Namespace, error)) (*corev1.Namespace, error) { - return tryUpdateNamespace(ctx, k, backoff, meta, transform, func(k k8s.Interface, namespace *corev1.Namespace) (*corev1.Namespace, error) { - return k.CoreV1().Namespaces().Update(ctx, namespace, kubernetes.DefaultUpdateOptions()) - }, func(cur, updated *corev1.Namespace) bool { - return equality.Semantic.DeepEqual(cur.Labels, updated.Labels) - }) -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/object.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/object.go index ff9b537cc..0d4cc8d43 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/object.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/object.go @@ -26,11 +26,14 @@ import ( // ObjectName returns the name of the given object in the format / func ObjectName(obj client.Object) string { + if obj.GetNamespace() == "" { + return obj.GetName() + } return client.ObjectKeyFromObject(obj).String() } // DeleteObjects deletes a list of Kubernetes objects. -func DeleteObjects(ctx context.Context, c client.Client, objects ...client.Object) error { +func DeleteObjects(ctx context.Context, c client.Writer, objects ...client.Object) error { for _, obj := range objects { if err := DeleteObject(ctx, c, obj); err != nil { return err @@ -40,7 +43,7 @@ func DeleteObjects(ctx context.Context, c client.Client, objects ...client.Objec } // DeleteObject deletes a Kubernetes object. It ignores 'not found' and 'no match' errors. -func DeleteObject(ctx context.Context, c client.Client, object client.Object) error { +func DeleteObject(ctx context.Context, c client.Writer, object client.Object) error { if err := c.Delete(ctx, object); client.IgnoreNotFound(err) != nil && !meta.IsNoMatchError(err) { return err } diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/project.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/project.go deleted file mode 100644 index 5425114ed..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/project.go +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2018 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 kubernetes - -import ( - "context" - - gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1" - gardencore "github.com/gardener/gardener/pkg/client/core/clientset/versioned" - "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/logger" - - "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/client-go/util/retry" -) - -func tryUpdateProject( - ctx context.Context, - g gardencore.Interface, - backoff wait.Backoff, - meta metav1.ObjectMeta, - transform func(*gardencorev1beta1.Project) (*gardencorev1beta1.Project, error), - updateFunc func(g gardencore.Interface, project *gardencorev1beta1.Project) (*gardencorev1beta1.Project, error), - compare func(cur, updated *gardencorev1beta1.Project) bool, -) (*gardencorev1beta1.Project, error) { - var ( - result *gardencorev1beta1.Project - attempt int - ) - - err := retry.RetryOnConflict(backoff, func() (err error) { - attempt++ - cur, err := g.CoreV1beta1().Projects().Get(ctx, meta.Name, kubernetes.DefaultGetOptions()) - if err != nil { - return err - } - - updated, err := transform(cur.DeepCopy()) - if err != nil { - return err - } - - if compare(cur, updated) { - result = cur - return nil - } - - result, err = updateFunc(g, updated) - if err != nil { - logger.Logger.Errorf("Attempt %d failed to update Project %s due to %v", attempt, cur.Name, err) - } - return - }) - if err != nil { - logger.Logger.Errorf("Failed to update Project %s after %d attempts due to %v", meta.Name, attempt, err) - } - - return result, err -} - -// TryUpdateProject tries to update a project and retries the operation with the given . -func TryUpdateProject(ctx context.Context, g gardencore.Interface, backoff wait.Backoff, meta metav1.ObjectMeta, transform func(*gardencorev1beta1.Project) (*gardencorev1beta1.Project, error)) (*gardencorev1beta1.Project, error) { - return tryUpdateProject(ctx, g, backoff, meta, transform, func(g gardencore.Interface, project *gardencorev1beta1.Project) (*gardencorev1beta1.Project, error) { - return g.CoreV1beta1().Projects().Update(ctx, project, kubernetes.DefaultUpdateOptions()) - }, func(cur, updated *gardencorev1beta1.Project) bool { - return equality.Semantic.DeepEqual(cur, updated) - }) -} - -// TryUpdateProjectStatus tries to update a project's status and retries the operation with the given . -func TryUpdateProjectStatus(ctx context.Context, g gardencore.Interface, backoff wait.Backoff, meta metav1.ObjectMeta, transform func(*gardencorev1beta1.Project) (*gardencorev1beta1.Project, error)) (*gardencorev1beta1.Project, error) { - return tryUpdateProject(ctx, g, backoff, meta, transform, func(g gardencore.Interface, project *gardencorev1beta1.Project) (*gardencorev1beta1.Project, error) { - return g.CoreV1beta1().Projects().UpdateStatus(ctx, project, kubernetes.DefaultUpdateOptions()) - }, func(cur, updated *gardencorev1beta1.Project) bool { - return equality.Semantic.DeepEqual(cur.Status, updated.Status) - }) -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/secret.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/secret.go deleted file mode 100644 index edd61cc6c..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/secret.go +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2021 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 kubernetes - -import ( - "context" - - corev1 "k8s.io/api/core/v1" - - "github.com/gardener/gardener/pkg/client/kubernetes" - "github.com/gardener/gardener/pkg/logger" - - "k8s.io/apimachinery/pkg/api/equality" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/wait" - k8s "k8s.io/client-go/kubernetes" - "k8s.io/client-go/util/retry" -) - -func tryUpdateSecret( - ctx context.Context, - k k8s.Interface, - backoff wait.Backoff, - meta metav1.ObjectMeta, - transform func(*corev1.Secret) (*corev1.Secret, error), - updateFunc func(k k8s.Interface, secret *corev1.Secret) (*corev1.Secret, error), - equalFunc func(cur, updated *corev1.Secret) bool, -) (*corev1.Secret, error) { - - var ( - result *corev1.Secret - attempt int - ) - err := retry.RetryOnConflict(backoff, func() (err error) { - attempt++ - cur, err := k.CoreV1().Secrets(meta.Namespace).Get(ctx, meta.Name, kubernetes.DefaultGetOptions()) - if err != nil { - return err - } - - updated, err := transform(cur.DeepCopy()) - if err != nil { - return err - } - - if equalFunc(cur, updated) { - result = cur - return nil - } - - result, err = updateFunc(k, updated) - if err != nil { - logger.Logger.Errorf("Attempt %d failed to update Secret %s/%s due to %v", attempt, cur.Namespace, cur.Name, err) - } - return - }) - if err != nil { - logger.Logger.Errorf("Failed to update Secret %s/%s after %d attempts due to %v", meta.Namespace, meta.Name, attempt, err) - } - return result, err -} - -// TryUpdateSecret tries to update the secret matching the given . -// It retries with the given characteristics as long as it gets Conflict errors. -// The transformation function is applied to the current state of the Secret object. If the transformation -// yields a semantically equal Secret, no update is done and the operation returns normally. -func TryUpdateSecret(ctx context.Context, k k8s.Interface, backoff wait.Backoff, meta metav1.ObjectMeta, transform func(*corev1.Secret) (*corev1.Secret, error)) (*corev1.Secret, error) { - return tryUpdateSecret(ctx, k, backoff, meta, transform, func(k k8s.Interface, secret *corev1.Secret) (*corev1.Secret, error) { - return k.CoreV1().Secrets(secret.Namespace).Update(ctx, secret, kubernetes.DefaultUpdateOptions()) - }, func(cur, updated *corev1.Secret) bool { - return equality.Semantic.DeepEqual(cur, updated) - }) -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/statefulset.go b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/statefulset.go index a3a3c81c6..1ba1caf60 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/statefulset.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/kubernetes/statefulset.go @@ -15,9 +15,13 @@ package kubernetes import ( + "context" + appsv1 "k8s.io/api/apps/v1" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/labels" + "sigs.k8s.io/controller-runtime/pkg/client" ) // StatefulSetSource is a function that produces a slice of StatefulSets or an error. @@ -100,3 +104,22 @@ func (d *statefulSetNamespaceLister) List(selector labels.Selector) ([]*appsv1.S return statefulSet.Namespace == d.namespace && selector.Matches(labels.Set(statefulSet.Labels)) }) } + +// GetContainerResourcesInStatefulSet returns the containers resources in StatefulSet. +func GetContainerResourcesInStatefulSet(ctx context.Context, k8sClient client.Client, key client.ObjectKey) (map[string]*corev1.ResourceRequirements, error) { + statefulSet := &appsv1.StatefulSet{} + if err := k8sClient.Get(ctx, key, statefulSet); err != nil { + if apierrors.IsNotFound(err) { + return nil, nil + } + return nil, err + } + + resourcesPerContainer := make(map[string]*corev1.ResourceRequirements) + + for _, container := range statefulSet.Spec.Template.Spec.Containers { + resourcesPerContainer[container.Name] = container.Resources.DeepCopy() + } + + return resourcesPerContainer, nil +} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/managedresources/managedresources.go b/vendor/github.com/gardener/gardener/pkg/utils/managedresources/managedresources.go deleted file mode 100644 index 2e75ec254..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/managedresources/managedresources.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 managedresources - -import ( - "context" - "fmt" - "time" - - kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - "github.com/gardener/gardener/pkg/utils/kubernetes/health" - "github.com/gardener/gardener/pkg/utils/retry" - - resourcesv1alpha1 "github.com/gardener/gardener-resource-manager/pkg/apis/resources/v1alpha1" - "github.com/gardener/gardener-resource-manager/pkg/manager" - "github.com/pkg/errors" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - k8sretry "k8s.io/client-go/util/retry" - "sigs.k8s.io/controller-runtime/pkg/client" -) - -// CreateManagedResourceFromUnstructured creates a managed resource and its secret with the given name, class, and objects in the given namespace. -func CreateManagedResourceFromUnstructured(ctx context.Context, client client.Client, namespace, name, class string, objs []*unstructured.Unstructured, keepObjects bool, injectedLabels map[string]string) error { - var data []byte - for _, obj := range objs { - bytes, err := obj.MarshalJSON() - if err != nil { - return errors.Wrapf(err, "marshal failed for '%s/%s' for secret '%s/%s'", obj.GetNamespace(), obj.GetName(), namespace, name) - } - data = append(data, []byte("\n---\n")...) - data = append(data, bytes...) - } - return CreateManagedResource(ctx, client, namespace, name, class, name, data, keepObjects, injectedLabels, false) -} - -// CreateManagedResource creates a managed resource and its secret with the given name, class, key, and data in the given namespace. -func CreateManagedResource(ctx context.Context, client client.Client, namespace, name, class, key string, data []byte, keepObjects bool, injectedLabels map[string]string, forceOverwriteAnnotations bool) error { - if key == "" { - key = name - } - - // Create or update secret containing the rendered rbac manifests - if err := manager.NewSecret(client). - WithNamespacedName(namespace, name). - WithKeyValues(map[string][]byte{key: data}). - Reconcile(ctx); err != nil { - return errors.Wrapf(err, "could not create or update secret '%s/%s' of managed resources", namespace, name) - } - - if err := manager.NewManagedResource(client). - WithNamespacedName(namespace, name). - WithClass(class). - WithInjectedLabels(injectedLabels). - KeepObjects(keepObjects). - WithSecretRef(name). - ForceOverwriteAnnotations(forceOverwriteAnnotations). - Reconcile(ctx); err != nil { - return errors.Wrapf(err, "could not create or update managed resource '%s/%s'", namespace, name) - } - - return nil -} - -// DeleteManagedResource deletes the managed resource and its secret with the given name in the given namespace. -func DeleteManagedResource(ctx context.Context, client client.Client, namespace string, name string) error { - if err := manager. - NewManagedResource(client). - WithNamespacedName(namespace, name). - Delete(ctx); err != nil { - return errors.Wrapf(err, "could not delete managed resource '%s/%s'", namespace, name) - } - - if err := manager. - NewSecret(client). - WithNamespacedName(namespace, name). - Delete(ctx); err != nil { - return errors.Wrapf(err, "could not delete secret '%s/%s' of managed resource", namespace, name) - } - - return nil -} - -// IntervalWait is the interval when waiting for managed resources. -var IntervalWait = 2 * time.Second - -// WaitUntilManagedResourceHealthy waits until the given managed resource is healthy. -func WaitUntilManagedResourceHealthy(ctx context.Context, client client.Client, namespace, name string) error { - obj := &resourcesv1alpha1.ManagedResource{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - } - - return retry.Until(ctx, IntervalWait, func(ctx context.Context) (done bool, err error) { - if err := client.Get(ctx, kutil.Key(namespace, name), obj); err != nil { - return retry.SevereError(err) - } - - if err := health.CheckManagedResource(obj); err != nil { - return retry.MinorError(fmt.Errorf("managed resource %s/%s is not healthy", namespace, name)) - } - - return retry.Ok() - }) -} - -// WaitUntilManagedResourceDeleted waits until the given managed resource is deleted. -func WaitUntilManagedResourceDeleted(ctx context.Context, client client.Client, namespace, name string) error { - mr := &resourcesv1alpha1.ManagedResource{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - } - return kutil.WaitUntilResourceDeleted(ctx, client, mr, IntervalWait) -} - -// KeepManagedResourceObjects updates the keepObjects field of the managed resource with the given name in the given namespace. -func KeepManagedResourceObjects(ctx context.Context, c client.Client, namespace, name string, keepObjects bool) error { - resource := &resourcesv1alpha1.ManagedResource{ - ObjectMeta: metav1.ObjectMeta{ - Name: name, - Namespace: namespace, - }, - } - - if err := kutil.TryUpdate(ctx, k8sretry.DefaultBackoff, c, resource, func() error { - resource.Spec.KeepObjects = &keepObjects - return nil - }); client.IgnoreNotFound(err) != nil { - return errors.Wrapf(err, "could not update managed resource '%s/%s'", namespace, name) - } - - return nil -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/managedresources/registry.go b/vendor/github.com/gardener/gardener/pkg/utils/managedresources/registry.go deleted file mode 100644 index 5bbd443a6..000000000 --- a/vendor/github.com/gardener/gardener/pkg/utils/managedresources/registry.go +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the LICENSE file -// -// 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 managedresources - -import ( - "fmt" - "reflect" - "strings" - - "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/runtime/serializer" - "k8s.io/apimachinery/pkg/runtime/serializer/json" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" -) - -// Registry stores objects and their serialized form. It allows to compute a map of all registered objects that can be -// used as part of a Secret's data which is referenced by a ManagedResource. -type Registry struct { - scheme *runtime.Scheme - codec runtime.Codec - nameToObject map[string]*object -} - -type object struct { - obj client.Object - serialization []byte -} - -// NewRegistry returns a new registry for resources. The given scheme, codec, and serializer must know all the resource -// types that will later be added to the registry. -func NewRegistry(scheme *runtime.Scheme, codec serializer.CodecFactory, serializer *json.Serializer) *Registry { - var groupVersions []schema.GroupVersion - for k := range scheme.AllKnownTypes() { - groupVersions = append(groupVersions, k.GroupVersion()) - } - - return &Registry{ - scheme: scheme, - codec: codec.CodecForVersions(serializer, serializer, schema.GroupVersions(groupVersions), schema.GroupVersions(groupVersions)), - nameToObject: make(map[string]*object), - } -} - -// Add adds the given object the registry. It computes a filename based on its type, namespace, and name. It serializes -// the object to YAML and stores both representations (object and serialization) in the registry. -func (r *Registry) Add(obj client.Object) error { - if obj == nil || reflect.ValueOf(obj) == reflect.Zero(reflect.TypeOf(obj)) { - return nil - } - - objectName, err := r.objectName(obj) - if err != nil { - return err - } - filename := objectName + ".yaml" - - if _, ok := r.nameToObject[filename]; ok { - return fmt.Errorf("duplicate filename in registry: %q", filename) - } - - serializationYAML, err := runtime.Encode(r.codec, obj) - if err != nil { - return err - } - - r.nameToObject[filename] = &object{ - obj: obj, - serialization: serializationYAML, - } - - return nil -} - -// SerializedObjects returns a map whose keys are filenames and whose values are serialized objects. -func (r *Registry) SerializedObjects() map[string][]byte { - out := make(map[string][]byte, len(r.nameToObject)) - for name, object := range r.nameToObject { - out[name] = object.serialization - } - return out -} - -// AddAllAndSerialize calls Add() for all the given objects before calling SerializedObjects(). -func (r *Registry) AddAllAndSerialize(objects ...client.Object) (map[string][]byte, error) { - for _, resource := range objects { - if err := r.Add(resource); err != nil { - return nil, err - } - } - return r.SerializedObjects(), nil -} - -// RegisteredObjects returns a map whose keys are filenames and whose values are objects. -func (r *Registry) RegisteredObjects() map[string]client.Object { - out := make(map[string]client.Object, len(r.nameToObject)) - for name, object := range r.nameToObject { - out[name] = object.obj - } - return out -} - -// String returns the string representation of the registry. -func (r *Registry) String() string { - out := make([]string, 0, len(r.nameToObject)) - for name, object := range r.nameToObject { - out = append(out, fmt.Sprintf("* %s:\n%s", name, object.serialization)) - } - return strings.Join(out, "\n\n") -} - -func (r *Registry) objectName(obj client.Object) (string, error) { - gvk, err := apiutil.GVKForObject(obj, r.scheme) - if err != nil { - return "", err - } - - return fmt.Sprintf( - "%s__%s__%s", - strings.ToLower(gvk.Kind), - obj.GetNamespace(), - strings.Replace(obj.GetName(), ":", "_", -1), - ), nil -} diff --git a/vendor/github.com/gardener/gardener/pkg/utils/secrets/certificates.go b/vendor/github.com/gardener/gardener/pkg/utils/secrets/certificates.go index 0d2fd550e..5d25c958d 100644 --- a/vendor/github.com/gardener/gardener/pkg/utils/secrets/certificates.go +++ b/vendor/github.com/gardener/gardener/pkg/utils/secrets/certificates.go @@ -28,13 +28,14 @@ import ( "sync" "time" + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "sigs.k8s.io/controller-runtime/pkg/client" + "github.com/gardener/gardener/pkg/client/kubernetes" "github.com/gardener/gardener/pkg/utils" "github.com/gardener/gardener/pkg/utils/infodata" kutil "github.com/gardener/gardener/pkg/utils/kubernetes" - corev1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "sigs.k8s.io/controller-runtime/pkg/client" ) type certType string @@ -430,10 +431,10 @@ const TemporaryDirectoryForSelfGeneratedTLSCertificatesPattern = "self-generated // the generated CA + server certificate bytes into a temporary directory with the default filenames, e.g. `DataKeyCertificateCA`. // The function will return the *Certificate object as well as the path of the temporary directory where the // certificates are stored. -func SelfGenerateTLSServerCertificate(name string, dnsNames []string) (*Certificate, string, error) { +func SelfGenerateTLSServerCertificate(name string, dnsNames []string, ips []net.IP) (cert *Certificate, ca *Certificate, dir string, rErr error) { tempDir, err := ioutil.TempDir("", TemporaryDirectoryForSelfGeneratedTLSCertificatesPattern) if err != nil { - return nil, "", err + return nil, nil, "", err } caCertificateConfig := &CertificateSecretConfig{ @@ -443,32 +444,33 @@ func SelfGenerateTLSServerCertificate(name string, dnsNames []string) (*Certific } caCertificate, err := caCertificateConfig.GenerateCertificate() if err != nil { - return nil, "", err + return nil, nil, "", err } if err := ioutil.WriteFile(filepath.Join(tempDir, DataKeyCertificateCA), caCertificate.CertificatePEM, 0644); err != nil { - return nil, "", err + return nil, nil, "", err } if err := ioutil.WriteFile(filepath.Join(tempDir, DataKeyPrivateKeyCA), caCertificate.PrivateKeyPEM, 0644); err != nil { - return nil, "", err + return nil, nil, "", err } certificateConfig := &CertificateSecretConfig{ - Name: name, - CommonName: name, - DNSNames: dnsNames, - CertType: ServerCert, - SigningCA: caCertificate, + Name: name, + CommonName: name, + DNSNames: dnsNames, + IPAddresses: ips, + CertType: ServerCert, + SigningCA: caCertificate, } certificate, err := certificateConfig.GenerateCertificate() if err != nil { - return nil, "", err + return nil, nil, "", err } if err := ioutil.WriteFile(filepath.Join(tempDir, DataKeyCertificate), certificate.CertificatePEM, 0644); err != nil { - return nil, "", err + return nil, nil, "", err } if err := ioutil.WriteFile(filepath.Join(tempDir, DataKeyPrivateKey), certificate.PrivateKeyPEM, 0644); err != nil { - return nil, "", err + return nil, nil, "", err } - return certificate, tempDir, nil + return certificate, caCertificate, tempDir, nil } diff --git a/vendor/github.com/gobuffalo/envy/.gitignore b/vendor/github.com/gobuffalo/envy/.gitignore deleted file mode 100644 index 05bc384b5..000000000 --- a/vendor/github.com/gobuffalo/envy/.gitignore +++ /dev/null @@ -1,30 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ -.env diff --git a/vendor/github.com/gobuffalo/envy/.gometalinter.json b/vendor/github.com/gobuffalo/envy/.gometalinter.json deleted file mode 100644 index e4f65a36e..000000000 --- a/vendor/github.com/gobuffalo/envy/.gometalinter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Enable": ["vet", "golint", "goimports", "deadcode", "gotype", "ineffassign", "misspell", "nakedret", "unconvert", "megacheck", "varcheck"] -} diff --git a/vendor/github.com/gobuffalo/envy/LICENSE.txt b/vendor/github.com/gobuffalo/envy/LICENSE.txt deleted file mode 100644 index 123ddc0d8..000000000 --- a/vendor/github.com/gobuffalo/envy/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2018 Mark Bates - -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/gobuffalo/envy/Makefile b/vendor/github.com/gobuffalo/envy/Makefile deleted file mode 100644 index 46aece8ff..000000000 --- a/vendor/github.com/gobuffalo/envy/Makefile +++ /dev/null @@ -1,46 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: - packr2 - $(GO_BIN) install -v . - -deps: - $(GO_BIN) get github.com/gobuffalo/release - $(GO_BIN) get github.com/gobuffalo/packr/v2/packr2 - $(GO_BIN) get -tags ${TAGS} -t ./... -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -endif - -build: - packr2 - $(GO_BIN) build -v . - -test: - packr2 - $(GO_BIN) test -tags ${TAGS} ./... - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - gometalinter --vendor ./... --deadline=1m --skip=internal - -update: - $(GO_BIN) get -u -tags ${TAGS} -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -endif - packr2 - make test - make install -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -endif - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -release: - release -y -f version.go diff --git a/vendor/github.com/gobuffalo/envy/README.md b/vendor/github.com/gobuffalo/envy/README.md deleted file mode 100644 index f54462a77..000000000 --- a/vendor/github.com/gobuffalo/envy/README.md +++ /dev/null @@ -1,93 +0,0 @@ -# envy -[![Build Status](https://travis-ci.org/gobuffalo/envy.svg?branch=master)](https://travis-ci.org/gobuffalo/envy) - -Envy makes working with ENV variables in Go trivial. - -* Get ENV variables with default values. -* Set ENV variables safely without affecting the underlying system. -* Temporarily change ENV vars; useful for testing. -* Map all of the key/values in the ENV. -* Loads .env files (by using [godotenv](https://github.com/joho/godotenv/)) -* More! - -## Installation - -```text -$ go get -u github.com/gobuffalo/envy -``` - -## Usage - -```go -func Test_Get(t *testing.T) { - r := require.New(t) - r.NotZero(os.Getenv("GOPATH")) - r.Equal(os.Getenv("GOPATH"), envy.Get("GOPATH", "foo")) - r.Equal("bar", envy.Get("IDONTEXIST", "bar")) -} - -func Test_MustGet(t *testing.T) { - r := require.New(t) - r.NotZero(os.Getenv("GOPATH")) - v, err := envy.MustGet("GOPATH") - r.NoError(err) - r.Equal(os.Getenv("GOPATH"), v) - - _, err = envy.MustGet("IDONTEXIST") - r.Error(err) -} - -func Test_Set(t *testing.T) { - r := require.New(t) - _, err := envy.MustGet("FOO") - r.Error(err) - - envy.Set("FOO", "foo") - r.Equal("foo", envy.Get("FOO", "bar")) -} - -func Test_Temp(t *testing.T) { - r := require.New(t) - - _, err := envy.MustGet("BAR") - r.Error(err) - - envy.Temp(func() { - envy.Set("BAR", "foo") - r.Equal("foo", envy.Get("BAR", "bar")) - _, err = envy.MustGet("BAR") - r.NoError(err) - }) - - _, err = envy.MustGet("BAR") - r.Error(err) -} -``` -## .env files support - -Envy now supports loading `.env` files by using the [godotenv library](https://github.com/joho/godotenv/). -That means one can use and define multiple `.env` files which will be loaded on-demand. By default, no env files will be loaded. To load one or more, you need to call the `envy.Load` function in one of the following ways: - -```go -envy.Load() // 1 - -envy.Load("MY_ENV_FILE") // 2 - -envy.Load(".env", ".env.prod") // 3 - -envy.Load(".env", "NON_EXISTING_FILE") // 4 - -// 5 -envy.Load(".env") -envy.Load("NON_EXISTING_FILE") - -// 6 -envy.Load(".env", "NON_EXISTING_FILE", ".env.prod") -``` - -1. Will load the default `.env` file -2. Will load the file `MY_ENV_FILE`, **but not** `.env` -3. Will load the file `.env`, and after that will load the `.env.prod` file. If any variable is redefined in `. env.prod` it will be overwritten (will contain the `env.prod` value) -4. Will load the `.env` file and return an error as the second file does not exist. The values in `.env` will be loaded and available. -5. Same as 4 -6. Will load the `.env` file and return an error as the second file does not exist. The values in `.env` will be loaded and available, **but the ones in** `.env.prod` **won't**. diff --git a/vendor/github.com/gobuffalo/envy/SHOULDERS.md b/vendor/github.com/gobuffalo/envy/SHOULDERS.md deleted file mode 100644 index 2384f72f4..000000000 --- a/vendor/github.com/gobuffalo/envy/SHOULDERS.md +++ /dev/null @@ -1,14 +0,0 @@ -# github.com/gobuffalo/envy Stands on the Shoulders of Giants - -github.com/gobuffalo/envy does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/davecgh/go-spew](https://godoc.org/github.com/davecgh/go-spew) - -* [github.com/joho/godotenv](https://godoc.org/github.com/joho/godotenv) - -* [github.com/rogpeppe/go-internal](https://godoc.org/github.com/rogpeppe/go-internal) - -* [github.com/stretchr/testify](https://godoc.org/github.com/stretchr/testify) diff --git a/vendor/github.com/gobuffalo/envy/azure-pipelines.yml b/vendor/github.com/gobuffalo/envy/azure-pipelines.yml deleted file mode 100644 index 144c4a209..000000000 --- a/vendor/github.com/gobuffalo/envy/azure-pipelines.yml +++ /dev/null @@ -1,59 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.9: - go_version: "1.9" - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.9: - go_version: "1.9" - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.9: - go_version: "1.9" - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/envy/azure-tests.yml b/vendor/github.com/gobuffalo/envy/azure-tests.yml deleted file mode 100644 index eea5822fa..000000000 --- a/vendor/github.com/gobuffalo/envy/azure-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/envy/azure.sh b/vendor/github.com/gobuffalo/envy/azure.sh deleted file mode 100644 index f70949796..000000000 --- a/vendor/github.com/gobuffalo/envy/azure.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -xe - -cat >> .env << EOF -# This is a comment -# We can use equal or colon notation -DIR: root -FLAVOUR: none -INSIDE_FOLDER=false -EOF diff --git a/vendor/github.com/gobuffalo/envy/env b/vendor/github.com/gobuffalo/envy/env deleted file mode 100644 index 33eeb3b13..000000000 --- a/vendor/github.com/gobuffalo/envy/env +++ /dev/null @@ -1,5 +0,0 @@ -# This is a comment -# We can use equal or colon notation -DIR: root -FLAVOUR: none -INSIDE_FOLDER=false \ No newline at end of file diff --git a/vendor/github.com/gobuffalo/envy/envy.go b/vendor/github.com/gobuffalo/envy/envy.go deleted file mode 100644 index dc31ba2c0..000000000 --- a/vendor/github.com/gobuffalo/envy/envy.go +++ /dev/null @@ -1,276 +0,0 @@ -/* -package envy makes working with ENV variables in Go trivial. - -* Get ENV variables with default values. -* Set ENV variables safely without affecting the underlying system. -* Temporarily change ENV vars; useful for testing. -* Map all of the key/values in the ENV. -* Loads .env files (by using [godotenv](https://github.com/joho/godotenv/)) -* More! -*/ -package envy - -import ( - "errors" - "flag" - "fmt" - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "runtime" - "strings" - "sync" - - "github.com/joho/godotenv" - "github.com/rogpeppe/go-internal/modfile" -) - -var gil = &sync.RWMutex{} -var env = map[string]string{} - -// GO111MODULE is ENV for turning mods on/off -const GO111MODULE = "GO111MODULE" - -func init() { - Load() - loadEnv() -} - -// Load the ENV variables to the env map -func loadEnv() { - gil.Lock() - defer gil.Unlock() - - if os.Getenv("GO_ENV") == "" { - // if the flag "test.v" is *defined*, we're running as a unit test. Note that we don't care - // about v.Value (verbose test mode); we just want to know if the test environment has defined - // it. It's also possible that the flags are not yet fully parsed (i.e. flag.Parsed() == false), - // so we could not depend on v.Value anyway. - // - if v := flag.Lookup("test.v"); v != nil { - env["GO_ENV"] = "test" - } - } - - // set the GOPATH if using >= 1.8 and the GOPATH isn't set - if os.Getenv("GOPATH") == "" { - out, err := exec.Command("go", "env", "GOPATH").Output() - if err == nil { - gp := strings.TrimSpace(string(out)) - os.Setenv("GOPATH", gp) - } - } - - for _, e := range os.Environ() { - pair := strings.Split(e, "=") - env[pair[0]] = os.Getenv(pair[0]) - } -} - -// Mods returns true if module support is enabled, false otherwise -// See https://github.com/golang/go/wiki/Modules#how-to-install-and-activate-module-support for details -func Mods() bool { - go111 := Get(GO111MODULE, "") - - if !InGoPath() { - return go111 != "off" - } - - return go111 == "on" -} - -// Reload the ENV variables. Useful if -// an external ENV manager has been used -func Reload() { - env = map[string]string{} - loadEnv() -} - -// Load .env files. Files will be loaded in the same order that are received. -// Redefined vars will override previously existing values. -// IE: envy.Load(".env", "test_env/.env") will result in DIR=test_env -// If no arg passed, it will try to load a .env file. -func Load(files ...string) error { - - // If no files received, load the default one - if len(files) == 0 { - err := godotenv.Overload() - if err == nil { - Reload() - } - return err - } - - // We received a list of files - for _, file := range files { - - // Check if it exists or we can access - if _, err := os.Stat(file); err != nil { - // It does not exist or we can not access. - // Return and stop loading - return err - } - - // It exists and we have permission. Load it - if err := godotenv.Overload(file); err != nil { - return err - } - - // Reload the env so all new changes are noticed - Reload() - - } - return nil -} - -// Get a value from the ENV. If it doesn't exist the -// default value will be returned. -func Get(key string, value string) string { - gil.RLock() - defer gil.RUnlock() - if v, ok := env[key]; ok { - return v - } - return value -} - -// Get a value from the ENV. If it doesn't exist -// an error will be returned -func MustGet(key string) (string, error) { - gil.RLock() - defer gil.RUnlock() - if v, ok := env[key]; ok { - return v, nil - } - return "", fmt.Errorf("could not find ENV var with %s", key) -} - -// Set a value into the ENV. This is NOT permanent. It will -// only affect values accessed through envy. -func Set(key string, value string) { - gil.Lock() - defer gil.Unlock() - env[key] = value -} - -// MustSet the value into the underlying ENV, as well as envy. -// This may return an error if there is a problem setting the -// underlying ENV value. -func MustSet(key string, value string) error { - gil.Lock() - defer gil.Unlock() - err := os.Setenv(key, value) - if err != nil { - return err - } - env[key] = value - return nil -} - -// Map all of the keys/values set in envy. -func Map() map[string]string { - gil.RLock() - defer gil.RUnlock() - cp := map[string]string{} - for k, v := range env { - cp[k] = v - } - return cp -} - -// Temp makes a copy of the values and allows operation on -// those values temporarily during the run of the function. -// At the end of the function run the copy is discarded and -// the original values are replaced. This is useful for testing. -// Warning: This function is NOT safe to use from a goroutine or -// from code which may access any Get or Set function from a goroutine -func Temp(f func()) { - oenv := env - env = map[string]string{} - for k, v := range oenv { - env[k] = v - } - defer func() { env = oenv }() - f() -} - -func GoPath() string { - return Get("GOPATH", "") -} - -func GoBin() string { - return Get("GO_BIN", "go") -} - -func InGoPath() bool { - pwd, _ := os.Getwd() - for _, p := range GoPaths() { - if strings.HasPrefix(pwd, p) { - return true - } - } - return false -} - -// GoPaths returns all possible GOPATHS that are set. -func GoPaths() []string { - gp := Get("GOPATH", "") - if runtime.GOOS == "windows" { - return strings.Split(gp, ";") // Windows uses a different separator - } - return strings.Split(gp, ":") -} - -func importPath(path string) string { - path = strings.TrimPrefix(path, "/private") - for _, gopath := range GoPaths() { - srcpath := filepath.Join(gopath, "src") - rel, err := filepath.Rel(srcpath, path) - if err == nil { - return filepath.ToSlash(rel) - } - } - - // fallback to trim - rel := strings.TrimPrefix(path, filepath.Join(GoPath(), "src")) - rel = strings.TrimPrefix(rel, string(filepath.Separator)) - return filepath.ToSlash(rel) -} - -// CurrentModule will attempt to return the module name from `go.mod` if -// modules are enabled. -// If modules are not enabled it will fallback to using CurrentPackage instead. -func CurrentModule() (string, error) { - if !Mods() { - return CurrentPackage(), nil - } - moddata, err := ioutil.ReadFile("go.mod") - if err != nil { - return "", errors.New("go.mod cannot be read or does not exist while go module is enabled") - } - packagePath := modfile.ModulePath(moddata) - if packagePath == "" { - return "", errors.New("go.mod is malformed") - } - return packagePath, nil -} - -// CurrentPackage attempts to figure out the current package name from the PWD -// Use CurrentModule for a more accurate package name. -func CurrentPackage() string { - if Mods() { - } - pwd, _ := os.Getwd() - return importPath(pwd) -} - -func Environ() []string { - gil.RLock() - defer gil.RUnlock() - var e []string - for k, v := range env { - e = append(e, fmt.Sprintf("%s=%s", k, v)) - } - return e -} diff --git a/vendor/github.com/gobuffalo/envy/go.mod b/vendor/github.com/gobuffalo/envy/go.mod deleted file mode 100644 index d951b7ce1..000000000 --- a/vendor/github.com/gobuffalo/envy/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/gobuffalo/envy - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/joho/godotenv v1.3.0 - github.com/rogpeppe/go-internal v1.1.0 - github.com/stretchr/testify v1.3.0 -) diff --git a/vendor/github.com/gobuffalo/envy/go.sum b/vendor/github.com/gobuffalo/envy/go.sum deleted file mode 100644 index f11ef4ce5..000000000 --- a/vendor/github.com/gobuffalo/envy/go.sum +++ /dev/null @@ -1,17 +0,0 @@ -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/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.1.0 h1:g0fH8RicVgNl+zVZDCDfbdWxAWoAEJyI7I3TZYXFiig= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/vendor/github.com/gobuffalo/envy/version.go b/vendor/github.com/gobuffalo/envy/version.go deleted file mode 100644 index b1623aef7..000000000 --- a/vendor/github.com/gobuffalo/envy/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package envy - -const Version = "v1.7.0" diff --git a/vendor/github.com/gobuffalo/logger/.gitignore b/vendor/github.com/gobuffalo/logger/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/logger/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/logger/LICENSE b/vendor/github.com/gobuffalo/logger/LICENSE deleted file mode 100644 index 649efd437..000000000 --- a/vendor/github.com/gobuffalo/logger/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -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/gobuffalo/logger/Makefile b/vendor/github.com/gobuffalo/logger/Makefile deleted file mode 100644 index 0ac539f1c..000000000 --- a/vendor/github.com/gobuffalo/logger/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -TAGS ?= "" -GO_BIN ?= "go" - -install: - $(GO_BIN) install -tags ${TAGS} -v . - make tidy - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - make tidy - -build: - $(GO_BIN) build -v . - make tidy - -test: - $(GO_BIN) test -cover -tags ${TAGS} ./... - make tidy - -ci-deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - golangci-lint run --enable-all - make tidy - -update: -ifeq ($(GO111MODULE),on) - rm go.* - $(GO_BIN) mod init - $(GO_BIN) mod tidy -else - $(GO_BIN) get -u -tags ${TAGS} -endif - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -release: - $(GO_BIN) get github.com/gobuffalo/release - make tidy - release -y -f version.go --skip-packr - make tidy - - - diff --git a/vendor/github.com/gobuffalo/logger/README.md b/vendor/github.com/gobuffalo/logger/README.md deleted file mode 100644 index 15aefce98..000000000 --- a/vendor/github.com/gobuffalo/logger/README.md +++ /dev/null @@ -1,22 +0,0 @@ -

- -

-GoDoc -Build Status -Go Report Card -

- -# Logger - -The [`logger.Logger`](https://godoc.org/github.com/gobuffalo/logger#Logger) interface is used throughout Buffalo apps, and other systems, to log a whole manner of things. - -## Installation - -```bash -$ go get -u github.com/gobuffalo/logger -``` - -## Documentation - -* [GoDoc](https://godoc.org/github.com/gobuffalo/logger) -* [General Buffalo Documentation](https://gobuffalo.io) diff --git a/vendor/github.com/gobuffalo/logger/SHOULDERS.md b/vendor/github.com/gobuffalo/logger/SHOULDERS.md deleted file mode 100644 index d0c0f4e54..000000000 --- a/vendor/github.com/gobuffalo/logger/SHOULDERS.md +++ /dev/null @@ -1,18 +0,0 @@ -# github.com/gobuffalo/logger Stands on the Shoulders of Giants - -github.com/gobuffalo/logger does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/gobuffalo/envy](https://godoc.org/github.com/gobuffalo/envy) - -* [github.com/konsorten/go-windows-terminal-sequences](https://godoc.org/github.com/konsorten/go-windows-terminal-sequences) - -* [github.com/rogpeppe/go-internal](https://godoc.org/github.com/rogpeppe/go-internal) - -* [github.com/sirupsen/logrus](https://godoc.org/github.com/sirupsen/logrus) - -* [golang.org/x/crypto](https://godoc.org/golang.org/x/crypto) - -* [golang.org/x/sys](https://godoc.org/golang.org/x/sys) diff --git a/vendor/github.com/gobuffalo/logger/azure-pipelines.yml b/vendor/github.com/gobuffalo/logger/azure-pipelines.yml deleted file mode 100644 index 417e2c579..000000000 --- a/vendor/github.com/gobuffalo/logger/azure-pipelines.yml +++ /dev/null @@ -1,71 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/logger/azure-tests.yml b/vendor/github.com/gobuffalo/logger/azure-tests.yml deleted file mode 100644 index eea5822fa..000000000 --- a/vendor/github.com/gobuffalo/logger/azure-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/logger/formatter.go b/vendor/github.com/gobuffalo/logger/formatter.go deleted file mode 100644 index cb173d77e..000000000 --- a/vendor/github.com/gobuffalo/logger/formatter.go +++ /dev/null @@ -1,153 +0,0 @@ -package logger - -// I really don't want to have this, but until (if) https://github.com/sirupsen/logrus/pull/606 is merged we're stuck with all this code. And yes, this is ALL needed just to remove some blank space in the logs - -import ( - "bytes" - "fmt" - "sort" - "strings" - "sync" - "time" - - "github.com/sirupsen/logrus" -) - -const ( - red = 31 - yellow = 33 - blue = 36 - gray = 37 -) - -// textFormatter formats logs into text -type textFormatter struct { - ForceColors bool - isTerminal bool - sync.Once -} - -func (f *textFormatter) init(entry *logrus.Entry) { - if entry.Logger != nil { - f.isTerminal = checkIfTerminal(entry.Logger.Out) - } -} - -const defaultTimestampFormat = time.RFC3339 - -// Format renders a single log entry -func (f *textFormatter) Format(entry *logrus.Entry) ([]byte, error) { - prefixFieldClashes(entry.Data) - - keys := make([]string, 0, len(entry.Data)) - for k := range entry.Data { - keys = append(keys, k) - } - - sort.Strings(keys) - - var b *bytes.Buffer - if entry.Buffer != nil { - b = entry.Buffer - } else { - b = &bytes.Buffer{} - } - - f.Do(func() { f.init(entry) }) - - isColored := (f.ForceColors || f.isTerminal) - - if isColored { - f.printColored(b, entry, keys) - } else { - f.appendKeyValue(b, "level", entry.Level.String()) - if entry.Message != "" { - f.appendKeyValue(b, "msg", entry.Message) - } - for _, key := range keys { - f.appendKeyValue(b, key, entry.Data[key]) - } - } - - b.WriteByte('\n') - return b.Bytes(), nil -} - -func (f *textFormatter) printColored(b *bytes.Buffer, entry *logrus.Entry, keys []string) { - var levelColor int - switch entry.Level { - case logrus.DebugLevel: - levelColor = gray - case logrus.WarnLevel: - levelColor = yellow - case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel: - levelColor = red - default: - levelColor = blue - } - - levelText := strings.ToUpper(entry.Level.String())[0:4] - - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s]", levelColor, levelText, entry.Time.Format(defaultTimestampFormat)) - - if entry.Message != "" { - fmt.Fprintf(b, " %s", entry.Message) - } - - for _, k := range keys { - v := entry.Data[k] - fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k) - f.appendValue(b, v) - } -} - -func (f *textFormatter) needsQuoting(text string) bool { - if len(text) == 0 { - return true - } - for _, ch := range text { - if !((ch >= 'a' && ch <= 'z') || - (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || - ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') { - return true - } - } - return false -} - -func (f *textFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) { - if b.Len() > 0 { - b.WriteByte(' ') - } - b.WriteString(key) - b.WriteByte('=') - f.appendValue(b, value) -} - -func (f *textFormatter) appendValue(b *bytes.Buffer, value interface{}) { - stringVal, ok := value.(string) - if !ok { - stringVal = fmt.Sprint(value) - } - - if !f.needsQuoting(stringVal) { - b.WriteString(stringVal) - } else { - b.WriteString(fmt.Sprintf("%q", stringVal)) - } -} - -func prefixFieldClashes(data logrus.Fields) { - if t, ok := data["time"]; ok { - data["fields.time"] = t - } - - if m, ok := data["msg"]; ok { - data["fields.msg"] = m - } - - if l, ok := data["level"]; ok { - data["fields.level"] = l - } -} diff --git a/vendor/github.com/gobuffalo/logger/go.mod b/vendor/github.com/gobuffalo/logger/go.mod deleted file mode 100644 index 316b6d863..000000000 --- a/vendor/github.com/gobuffalo/logger/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/gobuffalo/logger - -go 1.12 - -require ( - github.com/gobuffalo/envy v1.7.0 - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/rogpeppe/go-internal v1.3.0 // indirect - github.com/sirupsen/logrus v1.4.2 - golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 - golang.org/x/sys v0.0.0-20190515120540-06a5c4944438 // indirect -) diff --git a/vendor/github.com/gobuffalo/logger/go.sum b/vendor/github.com/gobuffalo/logger/go.sum deleted file mode 100644 index 78b7b96cc..000000000 --- a/vendor/github.com/gobuffalo/logger/go.sum +++ /dev/null @@ -1,40 +0,0 @@ -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/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= -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 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.1.0 h1:g0fH8RicVgNl+zVZDCDfbdWxAWoAEJyI7I3TZYXFiig= -github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -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/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/vendor/github.com/gobuffalo/logger/level.go b/vendor/github.com/gobuffalo/logger/level.go deleted file mode 100644 index 0c9199a7a..000000000 --- a/vendor/github.com/gobuffalo/logger/level.go +++ /dev/null @@ -1,25 +0,0 @@ -package logger - -import "github.com/sirupsen/logrus" - -// Level of the logger -type Level = logrus.Level - -const ( - // PanicLevel level, highest level of severity. Logs and then calls panic with the - // message passed to Debug, Info, ... - PanicLevel = logrus.PanicLevel - // FatalLevel level. Logs and then calls `logger.Exit(1)`. It will exit even if the - // logging level is set to Panic. - FatalLevel = logrus.FatalLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - // Commonly used for hooks to send errors to an error tracking service. - ErrorLevel = logrus.ErrorLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel = logrus.WarnLevel - // InfoLevel level. General operational entries about what's going on inside the - // application. - InfoLevel = logrus.InfoLevel - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel = logrus.DebugLevel -) diff --git a/vendor/github.com/gobuffalo/logger/logger.go b/vendor/github.com/gobuffalo/logger/logger.go deleted file mode 100644 index ad7d1f8e8..000000000 --- a/vendor/github.com/gobuffalo/logger/logger.go +++ /dev/null @@ -1,64 +0,0 @@ -package logger - -import ( - "os" - - "github.com/gobuffalo/envy" - "github.com/sirupsen/logrus" -) - -// FieldLogger interface -type FieldLogger interface { - Logger - WithField(string, interface{}) FieldLogger - WithFields(map[string]interface{}) FieldLogger -} - -// Logger interface is used throughout Buffalo -// apps to log a whole manner of things. -type Logger interface { - Debugf(string, ...interface{}) - Infof(string, ...interface{}) - Printf(string, ...interface{}) - Warnf(string, ...interface{}) - Errorf(string, ...interface{}) - Fatalf(string, ...interface{}) - Debug(...interface{}) - Info(...interface{}) - Warn(...interface{}) - Error(...interface{}) - Fatal(...interface{}) - Panic(...interface{}) -} - -func ParseLevel(level string) (Level, error) { - l, err := logrus.ParseLevel(level) - return Level(l), err -} - -// NewLogger based on the specified log level, defaults to "debug". -// See `New` for more details. -func NewLogger(level string) FieldLogger { - lvl, err := logrus.ParseLevel(level) - if err != nil { - lvl = logrus.DebugLevel - } - return New(lvl) -} - -// New based on the specified log level, defaults to "debug". -// This logger will log to the STDOUT in a human readable, -// but parseable form. -/* - Example: time="2016-12-01T21:02:07-05:00" level=info duration=225.283µs human_size="106 B" method=GET path="/" render=199.79µs request_id=2265736089 size=106 status=200 -*/ -func New(lvl Level) FieldLogger { - dev := envy.Get("GO_ENV", "development") == "development" - l := logrus.New() - l.SetOutput(os.Stdout) - l.Level = lvl - l.Formatter = &textFormatter{ - ForceColors: dev, - } - return Logrus{l} -} diff --git a/vendor/github.com/gobuffalo/logger/logrus.go b/vendor/github.com/gobuffalo/logger/logrus.go deleted file mode 100644 index bf13148ed..000000000 --- a/vendor/github.com/gobuffalo/logger/logrus.go +++ /dev/null @@ -1,34 +0,0 @@ -package logger - -import ( - "io" - - "github.com/sirupsen/logrus" -) - -var _ Logger = Logrus{} -var _ FieldLogger = Logrus{} -var _ Outable = Logrus{} - -// Logrus is a Logger implementation backed by sirupsen/logrus -type Logrus struct { - logrus.FieldLogger -} - -// SetOutput will try and set the output of the underlying -// logrus.FieldLogger if it can -func (l Logrus) SetOutput(w io.Writer) { - if lg, ok := l.FieldLogger.(Outable); ok { - lg.SetOutput(w) - } -} - -// WithField returns a new Logger with the field added -func (l Logrus) WithField(s string, i interface{}) FieldLogger { - return Logrus{l.FieldLogger.WithField(s, i)} -} - -// WithFields returns a new Logger with the fields added -func (l Logrus) WithFields(m map[string]interface{}) FieldLogger { - return Logrus{l.FieldLogger.WithFields(m)} -} diff --git a/vendor/github.com/gobuffalo/logger/outable.go b/vendor/github.com/gobuffalo/logger/outable.go deleted file mode 100644 index 459fe1972..000000000 --- a/vendor/github.com/gobuffalo/logger/outable.go +++ /dev/null @@ -1,8 +0,0 @@ -package logger - -import "io" - -// Outable interface for loggers that allow setting the output writer -type Outable interface { - SetOutput(out io.Writer) -} diff --git a/vendor/github.com/gobuffalo/logger/terminal_check.go b/vendor/github.com/gobuffalo/logger/terminal_check.go deleted file mode 100644 index f7ec282c8..000000000 --- a/vendor/github.com/gobuffalo/logger/terminal_check.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build !appengine - -package logger - -import ( - "io" - "os" - - "golang.org/x/crypto/ssh/terminal" -) - -func checkIfTerminal(w io.Writer) bool { - switch v := w.(type) { - case *os.File: - return terminal.IsTerminal(int(v.Fd())) - default: - return false - } -} diff --git a/vendor/github.com/gobuffalo/logger/terminal_check_appengine.go b/vendor/github.com/gobuffalo/logger/terminal_check_appengine.go deleted file mode 100644 index fe84f0b89..000000000 --- a/vendor/github.com/gobuffalo/logger/terminal_check_appengine.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine - -package logger - -import ( - "io" -) - -func checkIfTerminal(w io.Writer) bool { - return true -} diff --git a/vendor/github.com/gobuffalo/logger/version.go b/vendor/github.com/gobuffalo/logger/version.go deleted file mode 100644 index fbeb45116..000000000 --- a/vendor/github.com/gobuffalo/logger/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package logger - -// Version of the logger -const Version = "v1.0.0" diff --git a/vendor/github.com/gobuffalo/packd/.gitignore b/vendor/github.com/gobuffalo/packd/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/packd/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/packd/.gometalinter.json b/vendor/github.com/gobuffalo/packd/.gometalinter.json deleted file mode 100644 index e4f65a36e..000000000 --- a/vendor/github.com/gobuffalo/packd/.gometalinter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Enable": ["vet", "golint", "goimports", "deadcode", "gotype", "ineffassign", "misspell", "nakedret", "unconvert", "megacheck", "varcheck"] -} diff --git a/vendor/github.com/gobuffalo/packd/LICENSE b/vendor/github.com/gobuffalo/packd/LICENSE deleted file mode 100644 index 649efd437..000000000 --- a/vendor/github.com/gobuffalo/packd/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -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/gobuffalo/packd/Makefile b/vendor/github.com/gobuffalo/packd/Makefile deleted file mode 100644 index 0ac539f1c..000000000 --- a/vendor/github.com/gobuffalo/packd/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -TAGS ?= "" -GO_BIN ?= "go" - -install: - $(GO_BIN) install -tags ${TAGS} -v . - make tidy - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - make tidy - -build: - $(GO_BIN) build -v . - make tidy - -test: - $(GO_BIN) test -cover -tags ${TAGS} ./... - make tidy - -ci-deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - golangci-lint run --enable-all - make tidy - -update: -ifeq ($(GO111MODULE),on) - rm go.* - $(GO_BIN) mod init - $(GO_BIN) mod tidy -else - $(GO_BIN) get -u -tags ${TAGS} -endif - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -release: - $(GO_BIN) get github.com/gobuffalo/release - make tidy - release -y -f version.go --skip-packr - make tidy - - - diff --git a/vendor/github.com/gobuffalo/packd/README.md b/vendor/github.com/gobuffalo/packd/README.md deleted file mode 100644 index 1c534cdd5..000000000 --- a/vendor/github.com/gobuffalo/packd/README.md +++ /dev/null @@ -1,24 +0,0 @@ -

- -

-GoDoc -Build Status -Go Report Card -

- -# github.com/gobuffalo/packd - -This is a collection of interfaces designed to make using [github.com/gobuffalo/packr](https://github.com/gobuffalo/packr) easier, and to make the transition between v1 and v2 as seamless as possible. - -They can, and should, be used for testing, alternate Box implementations, etc... - - -## Installation - -```bash -$ go get -u -v github.com/gobuffalo/packd -``` - -## Memory Box - -The [`packd#MemoryBox`](https://godoc.org/github.com/gobuffalo/packd#MemoryBox) is a complete, thread-safe, implementation of [`packd#Box`](https://godoc.org/github.com/gobuffalo/packd#Box) diff --git a/vendor/github.com/gobuffalo/packd/SHOULDERS.md b/vendor/github.com/gobuffalo/packd/SHOULDERS.md deleted file mode 100644 index 076205ba1..000000000 --- a/vendor/github.com/gobuffalo/packd/SHOULDERS.md +++ /dev/null @@ -1,10 +0,0 @@ -# github.com/gobuffalo/packd Stands on the Shoulders of Giants - -github.com/gobuffalo/packd does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/davecgh/go-spew](https://godoc.org/github.com/davecgh/go-spew) - -* [github.com/stretchr/testify](https://godoc.org/github.com/stretchr/testify) diff --git a/vendor/github.com/gobuffalo/packd/azure-pipelines.yml b/vendor/github.com/gobuffalo/packd/azure-pipelines.yml deleted file mode 100644 index 417e2c579..000000000 --- a/vendor/github.com/gobuffalo/packd/azure-pipelines.yml +++ /dev/null @@ -1,71 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/packd/azure-tests.yml b/vendor/github.com/gobuffalo/packd/azure-tests.yml deleted file mode 100644 index eea5822fa..000000000 --- a/vendor/github.com/gobuffalo/packd/azure-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/packd/file.go b/vendor/github.com/gobuffalo/packd/file.go deleted file mode 100644 index 58fd86fea..000000000 --- a/vendor/github.com/gobuffalo/packd/file.go +++ /dev/null @@ -1,126 +0,0 @@ -package packd - -import ( - "bytes" - "fmt" - "io" - "os" - "time" -) - -var _ File = &virtualFile{} -var _ io.Reader = &virtualFile{} -var _ io.Writer = &virtualFile{} -var _ fmt.Stringer = &virtualFile{} - -type virtualFile struct { - io.Reader - name string - info fileInfo - original []byte -} - -func (f virtualFile) Name() string { - return f.name -} - -func (f *virtualFile) Seek(offset int64, whence int) (int64, error) { - return f.Reader.(*bytes.Reader).Seek(offset, whence) -} - -func (f virtualFile) FileInfo() (os.FileInfo, error) { - return f.info, nil -} - -func (f *virtualFile) Close() error { - return nil -} - -func (f virtualFile) Readdir(count int) ([]os.FileInfo, error) { - return []os.FileInfo{f.info}, nil -} - -func (f virtualFile) Stat() (os.FileInfo, error) { - return f.info, nil -} - -func (f virtualFile) String() string { - return string(f.original) -} - -// Read reads the next len(p) bytes from the virtualFile and -// rewind read offset to 0 when it met EOF. -func (f *virtualFile) Read(p []byte) (int, error) { - i, err := f.Reader.Read(p) - - if i == 0 || err == io.EOF { - f.Seek(0, io.SeekStart) - } - return i, err -} - -// Write copies byte slice p to content of virtualFile. -func (f *virtualFile) Write(p []byte) (int, error) { - return f.write(p) -} - -// write copies byte slice or data from io.Reader to content of the -// virtualFile and update related information of the virtualFile. -func (f *virtualFile) write(d interface{}) (c int, err error) { - bb := &bytes.Buffer{} - switch d.(type) { - case []byte: - c, err = bb.Write(d.([]byte)) - case io.Reader: - if d != nil { - i64, e := io.Copy(bb, d.(io.Reader)) - c = int(i64) - err = e - } - default: - err = fmt.Errorf("unknown type of argument") - } - - if err != nil { - return c, err - } - - f.info.size = int64(c) - f.info.modTime = time.Now() - f.original = bb.Bytes() - f.Reader = bytes.NewReader(f.original) - return c, nil -} - -// NewFile returns a new "virtual" file -func NewFile(name string, r io.Reader) (File, error) { - return buildFile(name, r) -} - -// NewDir returns a new "virtual" directory -func NewDir(name string) (File, error) { - v, err := buildFile(name, nil) - if err != nil { - return v, err - } - v.info.isDir = true - return v, nil -} - -func buildFile(name string, r io.Reader) (*virtualFile, error) { - vf := &virtualFile{ - name: name, - info: fileInfo{ - Path: name, - modTime: time.Now(), - }, - } - - var err error - if r != nil { - _, err = vf.write(r) - } else { - _, err = vf.write([]byte{}) // for safety - } - return vf, err -} diff --git a/vendor/github.com/gobuffalo/packd/file_info.go b/vendor/github.com/gobuffalo/packd/file_info.go deleted file mode 100644 index 8bed0b903..000000000 --- a/vendor/github.com/gobuffalo/packd/file_info.go +++ /dev/null @@ -1,39 +0,0 @@ -package packd - -import ( - "os" - "time" -) - -var _ os.FileInfo = fileInfo{} - -type fileInfo struct { - Path string - size int64 - modTime time.Time - isDir bool -} - -func (f fileInfo) Name() string { - return f.Path -} - -func (f fileInfo) Size() int64 { - return f.size -} - -func (f fileInfo) Mode() os.FileMode { - return 0444 -} - -func (f fileInfo) ModTime() time.Time { - return f.modTime -} - -func (f fileInfo) IsDir() bool { - return f.isDir -} - -func (f fileInfo) Sys() interface{} { - return nil -} diff --git a/vendor/github.com/gobuffalo/packd/go.mod b/vendor/github.com/gobuffalo/packd/go.mod deleted file mode 100644 index e61ff1ef0..000000000 --- a/vendor/github.com/gobuffalo/packd/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/gobuffalo/packd - -go 1.12 - -require ( - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/stretchr/testify v1.3.0 -) diff --git a/vendor/github.com/gobuffalo/packd/go.sum b/vendor/github.com/gobuffalo/packd/go.sum deleted file mode 100644 index 4f76e62c1..000000000 --- a/vendor/github.com/gobuffalo/packd/go.sum +++ /dev/null @@ -1,9 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= diff --git a/vendor/github.com/gobuffalo/packd/interfaces.go b/vendor/github.com/gobuffalo/packd/interfaces.go deleted file mode 100644 index e8475f0aa..000000000 --- a/vendor/github.com/gobuffalo/packd/interfaces.go +++ /dev/null @@ -1,83 +0,0 @@ -package packd - -import ( - "fmt" - "io" - "net/http" - "os" -) - -type WalkFunc func(string, File) error - -// Box represents the entirety of the necessary -// interfaces to form a "full" box. -// github.com/gobuffalo/packr#Box is an example of this interface. -type Box interface { - HTTPBox - Lister - Addable - Finder - Walkable - Haser -} - -type Haser interface { - Has(string) bool -} - -type Walker interface { - Walk(wf WalkFunc) error -} - -type Walkable interface { - Walker - WalkPrefix(prefix string, wf WalkFunc) error -} - -type Finder interface { - Find(string) ([]byte, error) - FindString(name string) (string, error) -} - -type HTTPBox interface { - Open(name string) (http.File, error) -} - -type Lister interface { - List() []string -} - -type Addable interface { - AddString(path string, t string) error - AddBytes(path string, t []byte) error -} - -type SimpleFile interface { - fmt.Stringer - io.Reader - io.Writer - Name() string -} - -type HTTPFile interface { - SimpleFile - io.Closer - io.Seeker - Readdir(count int) ([]os.FileInfo, error) - Stat() (os.FileInfo, error) -} - -type File interface { - HTTPFile - FileInfo() (os.FileInfo, error) -} - -// LegacyBox represents deprecated methods -// that older Box implementations might have had. -// github.com/gobuffalo/packr v1 is an example of a LegacyBox. -type LegacyBox interface { - String(name string) string - MustString(name string) (string, error) - Bytes(name string) []byte - MustBytes(name string) ([]byte, error) -} diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/.gitignore b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/LICENSE b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/LICENSE deleted file mode 100644 index 649efd437..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -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/gobuffalo/packd/internal/takeon/github.com/markbates/errx/Makefile b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/Makefile deleted file mode 100644 index 0ac539f1c..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -TAGS ?= "" -GO_BIN ?= "go" - -install: - $(GO_BIN) install -tags ${TAGS} -v . - make tidy - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - make tidy - -build: - $(GO_BIN) build -v . - make tidy - -test: - $(GO_BIN) test -cover -tags ${TAGS} ./... - make tidy - -ci-deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - golangci-lint run --enable-all - make tidy - -update: -ifeq ($(GO111MODULE),on) - rm go.* - $(GO_BIN) mod init - $(GO_BIN) mod tidy -else - $(GO_BIN) get -u -tags ${TAGS} -endif - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -release: - $(GO_BIN) get github.com/gobuffalo/release - make tidy - release -y -f version.go --skip-packr - make tidy - - - diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/SHOULDERS.md b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/SHOULDERS.md deleted file mode 100644 index b19072e9f..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/SHOULDERS.md +++ /dev/null @@ -1,6 +0,0 @@ -# github.com/markbates/errx Stands on the Shoulders of Giants - -github.com/markbates/errx does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-pipelines.yml b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-pipelines.yml deleted file mode 100644 index 417e2c579..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-pipelines.yml +++ /dev/null @@ -1,71 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-tests.yml b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-tests.yml deleted file mode 100644 index eea5822fa..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/azure-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/errx.go b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/errx.go deleted file mode 100644 index 5a6f6398c..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/errx.go +++ /dev/null @@ -1,23 +0,0 @@ -package errx - -// go2 errors -type Wrapper interface { - Unwrap() error -} - -// pkg/errors -type Causer interface { - Cause() error -} - -func Unwrap(err error) error { - switch e := err.(type) { - case Wrapper: - return e.Unwrap() - case Causer: - return e.Cause() - } - return err -} - -var Cause = Unwrap diff --git a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/version.go b/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/version.go deleted file mode 100644 index 82e25a1a9..000000000 --- a/vendor/github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package errx - -// Version of errx -const Version = "v1.0.0" diff --git a/vendor/github.com/gobuffalo/packd/map.go b/vendor/github.com/gobuffalo/packd/map.go deleted file mode 100644 index 906b49e3e..000000000 --- a/vendor/github.com/gobuffalo/packd/map.go +++ /dev/null @@ -1,70 +0,0 @@ -package packd - -import ( - "sort" - "sync" -) - -// ByteMap wraps sync.Map and uses the following types: -// key: string -// value: []byte -type ByteMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *ByteMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns []byte or bool. -// A false return indicates either the key was not found -// or the value is not of type []byte -func (m *ByteMap) Load(key string) ([]byte, bool) { - i, ok := m.data.Load(key) - if !ok { - return []byte(``), false - } - s, ok := i.([]byte) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *ByteMap) LoadOrStore(key string, value []byte) ([]byte, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.([]byte) - return s, ok -} - -// Range over the []byte values in the map -func (m *ByteMap) Range(f func(key string, value []byte) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.([]byte) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a []byte in the map -func (m *ByteMap) Store(key string, value []byte) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *ByteMap) Keys() []string { - var keys []string - m.Range(func(key string, value []byte) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/vendor/github.com/gobuffalo/packd/memory_box.go b/vendor/github.com/gobuffalo/packd/memory_box.go deleted file mode 100644 index 7f3137cb4..000000000 --- a/vendor/github.com/gobuffalo/packd/memory_box.go +++ /dev/null @@ -1,156 +0,0 @@ -package packd - -import ( - "bytes" - "net/http" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx" -) - -var _ Addable = NewMemoryBox() -var _ Finder = NewMemoryBox() -var _ Lister = NewMemoryBox() -var _ HTTPBox = NewMemoryBox() -var _ Haser = NewMemoryBox() -var _ Walkable = NewMemoryBox() -var _ Box = NewMemoryBox() - -// MemoryBox is a thread-safe, in-memory, implementation of the Box interface. -type MemoryBox struct { - files *ByteMap -} - -func (m *MemoryBox) Has(path string) bool { - _, ok := m.files.Load(path) - return ok -} - -func (m *MemoryBox) List() []string { - var names []string - m.files.Range(func(key string, value []byte) bool { - names = append(names, key) - return true - }) - - sort.Strings(names) - return names -} - -func (m *MemoryBox) Open(path string) (http.File, error) { - cpath := strings.TrimPrefix(path, "/") - - if filepath.Ext(cpath) == "" { - // it's a directory - return NewDir(path) - } - - if len(cpath) == 0 { - cpath = "index.html" - } - - b, err := m.Find(cpath) - if err != nil { - return nil, err - } - - cpath = filepath.FromSlash(cpath) - - f, err := NewFile(cpath, bytes.NewReader(b)) - if err != nil { - return nil, err - } - return f, nil -} - -func (m *MemoryBox) FindString(path string) (string, error) { - bb, err := m.Find(path) - return string(bb), err -} - -func (m *MemoryBox) Find(path string) (ret []byte, e error) { - res, ok := m.files.Load(path) - if !ok { - - var b []byte - lpath := strings.ToLower(path) - err := m.Walk(func(p string, file File) error { - lp := strings.ToLower(p) - if lp != lpath { - return nil - } - - res := file.String() - b = []byte(res) - return nil - }) - if err != nil { - return b, os.ErrNotExist - } - if len(b) == 0 { - return b, os.ErrNotExist - } - return b, nil - } - return res, nil -} - -func (m *MemoryBox) AddString(path string, t string) error { - return m.AddBytes(path, []byte(t)) -} - -func (m *MemoryBox) AddBytes(path string, t []byte) error { - m.files.Store(path, t) - return nil -} - -func (m *MemoryBox) Walk(wf WalkFunc) error { - var err error - m.files.Range(func(path string, b []byte) bool { - var f File - f, err = NewFile(path, bytes.NewReader(b)) - if err != nil { - return false - } - - err = wf(path, f) - if err != nil { - if errx.Unwrap(err) == filepath.SkipDir { - err = nil - return true - } - return false - } - - return true - }) - - if errx.Unwrap(err) == filepath.SkipDir { - return nil - } - return err -} - -func (m *MemoryBox) WalkPrefix(pre string, wf WalkFunc) error { - return m.Walk(func(path string, file File) error { - if strings.HasPrefix(path, pre) { - return wf(path, file) - } - return nil - }) -} - -func (m *MemoryBox) Remove(path string) { - m.files.Delete(path) - m.files.Delete(strings.ToLower(path)) -} - -// NewMemoryBox returns a configured *MemoryBox -func NewMemoryBox() *MemoryBox { - return &MemoryBox{ - files: &ByteMap{}, - } -} diff --git a/vendor/github.com/gobuffalo/packd/skip_walker.go b/vendor/github.com/gobuffalo/packd/skip_walker.go deleted file mode 100644 index 233c6dd6f..000000000 --- a/vendor/github.com/gobuffalo/packd/skip_walker.go +++ /dev/null @@ -1,43 +0,0 @@ -package packd - -import ( - "path/filepath" - "strings" -) - -var CommonSkipPrefixes = []string{".", "_", "node_modules", "vendor"} - -// SkipWalker will walk the Walker and call the WalkFunc for files who's directories -// do no match any of the skipPrefixes. If no skipPrefixes are passed, then -// CommonSkipPrefixes is used -func SkipWalker(walker Walker, skipPrefixes []string, wf WalkFunc) error { - if len(skipPrefixes) == 0 { - skipPrefixes = append(skipPrefixes, CommonSkipPrefixes...) - } - return walker.Walk(func(path string, file File) error { - fi, err := file.FileInfo() - if err != nil { - return err - } - - path = strings.Replace(path, "\\", "/", -1) - - parts := strings.Split(path, "/") - if !fi.IsDir() { - parts = parts[:len(parts)-1] - } - - for _, base := range parts { - if base != "." { - for _, skip := range skipPrefixes { - skip = strings.ToLower(skip) - lbase := strings.ToLower(base) - if strings.HasPrefix(lbase, skip) { - return filepath.SkipDir - } - } - } - } - return wf(path, file) - }) -} diff --git a/vendor/github.com/gobuffalo/packd/version.go b/vendor/github.com/gobuffalo/packd/version.go deleted file mode 100644 index 082aaef29..000000000 --- a/vendor/github.com/gobuffalo/packd/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package packd - -// Version of packd -const Version = "v0.3.0" diff --git a/vendor/github.com/gobuffalo/packr/.codeclimate.yml b/vendor/github.com/gobuffalo/packr/.codeclimate.yml deleted file mode 100644 index 8c914a509..000000000 --- a/vendor/github.com/gobuffalo/packr/.codeclimate.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -engines: - golint: - enabled: true - checks: - GoLint/Naming/MixedCaps: - enabled: false - govet: - enabled: true - gofmt: - enabled: true - fixme: - enabled: true -ratings: - paths: - - "**.go" -exclude_paths: - - "**/*_test.go" - - "*_test.go" - - "fixtures/" diff --git a/vendor/github.com/gobuffalo/packr/.gitignore b/vendor/github.com/gobuffalo/packr/.gitignore deleted file mode 100644 index 157ef96e3..000000000 --- a/vendor/github.com/gobuffalo/packr/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -*.log -./packr2 -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -/packr_darwin_amd64 -/packr_linux_amd64 -.vscode/ -debug.test -.grifter/ -*-packr.go - diff --git a/vendor/github.com/gobuffalo/packr/.gometalinter.json b/vendor/github.com/gobuffalo/packr/.gometalinter.json deleted file mode 100644 index e4f65a36e..000000000 --- a/vendor/github.com/gobuffalo/packr/.gometalinter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Enable": ["vet", "golint", "goimports", "deadcode", "gotype", "ineffassign", "misspell", "nakedret", "unconvert", "megacheck", "varcheck"] -} diff --git a/vendor/github.com/gobuffalo/packr/.goreleaser.yml b/vendor/github.com/gobuffalo/packr/.goreleaser.yml deleted file mode 100644 index 288f4d5e4..000000000 --- a/vendor/github.com/gobuffalo/packr/.goreleaser.yml +++ /dev/null @@ -1,32 +0,0 @@ -# Code generated by github.com/gobuffalo/release. DO NOT EDIT. -# Edit .goreleaser.yml.plush instead - -builds: -- - goos: - - darwin - - linux - - windows - env: - - CGO_ENABLED=0 - main: ./packr/main.go - binary: packr - -checksum: - name_template: 'checksums.txt' - -snapshot: - name_template: "{{ .Tag }}-next" - -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' - -brew: - github: - owner: gobuffalo - name: homebrew-tap - diff --git a/vendor/github.com/gobuffalo/packr/.goreleaser.yml.plush b/vendor/github.com/gobuffalo/packr/.goreleaser.yml.plush deleted file mode 100644 index 1d25c9a74..000000000 --- a/vendor/github.com/gobuffalo/packr/.goreleaser.yml.plush +++ /dev/null @@ -1,29 +0,0 @@ -builds: -- - goos: - - darwin - - linux - - windows - env: - - CGO_ENABLED=0 - main: ./packr/main.go - binary: packr - -checksum: - name_template: 'checksums.txt' - -snapshot: - name_template: "{{ .Tag }}-next" - -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' -<%= if (brew) { %> -brew: - github: - owner: gobuffalo - name: homebrew-tap -<% } %> diff --git a/vendor/github.com/gobuffalo/packr/LICENSE.txt b/vendor/github.com/gobuffalo/packr/LICENSE.txt deleted file mode 100644 index 3ccb336a0..000000000 --- a/vendor/github.com/gobuffalo/packr/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2016 Mark Bates - -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/gobuffalo/packr/Makefile b/vendor/github.com/gobuffalo/packr/Makefile deleted file mode 100644 index b60c437dc..000000000 --- a/vendor/github.com/gobuffalo/packr/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: deps - echo "installing packr v1" - packr - $(GO_BIN) install -v ./packr - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - rm -rf packrd - rm -rf v2/packrd - $(GO_BIN) get github.com/gobuffalo/release - $(GO_BIN) get -tags ${TAGS} -t ./... - $(GO_BIN) install -v ./packr - packr clean - make tidy - -build: deps - packr - $(GO_BIN) build -v . - make tidy - -test: - packr clean - $(GO_BIN) test -tags ${TAGS} ./... - packr clean - -ci-deps: - rm -rf packrd - rm -rf v2/packrd - $(GO_BIN) get -tags ${TAGS} -t ./... - $(GO_BIN) install -v ./packr - packr clean - make tidy - -ci-test: - $(GO_BIN) test -v -tags ${TAGS} -race ./... - make tidy - cd ./v2 && make ci-test - -lint: - gometalinter --vendor ./... --deadline=1m --skip=internal - -update: - $(GO_BIN) get -u -tags ${TAGS} - make tidy - packr - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -release: - release -y -f version.go - make tidy diff --git a/vendor/github.com/gobuffalo/packr/README.md b/vendor/github.com/gobuffalo/packr/README.md deleted file mode 100644 index 89529f4de..000000000 --- a/vendor/github.com/gobuffalo/packr/README.md +++ /dev/null @@ -1,205 +0,0 @@ -# packr (v1) - -[![GoDoc](https://godoc.org/github.com/gobuffalo/packr?status.svg)](https://godoc.org/github.com/gobuffalo/packr) - -## Packr has been updated to `v2`! Please read the `./v2/README.md` file for more details. - ---- - -Packr is a simple solution for bundling static assets inside of Go binaries. Most importantly it does it in a way that is friendly to developers while they are developing. - -## Intro Video - -To get an idea of the what and why of packr, please enjoy this short video: [https://vimeo.com/219863271](https://vimeo.com/219863271). - -## Installation - -To install Packr utility - -```text -$ go get -u github.com/gobuffalo/packr/packr -``` - -To get the dependency - -```text -$ go get -u github.com/gobuffalo/packr -``` - -## Usage - -### In Code - -The first step in using Packr is to create a new box. A box represents a folder on disk. Once you have a box you can get `string` or `[]byte` representations of the file. - -```go -// set up a new box by giving it a (relative) path to a folder on disk: -box := packr.NewBox("./templates") - -// Get the string representation of a file, or an error if it doesn't exist: -html, err := box.FindString("index.html") - -// Get the []byte representation of a file, or an error if it doesn't exist: -html, err := box.FindBytes("index.html") -``` - -### What is a Box? - -A box represents a folder, and any sub-folders, on disk that you want to have access to in your binary. When compiling a binary using the `packr` CLI the contents of the folder will be converted into Go files that can be compiled inside of a "standard" go binary. Inside of the compiled binary the files will be read from memory. When working locally the files will be read directly off of disk. This is a seamless switch that doesn't require any special attention on your part. - -#### Example - -Assume the follow directory structure: - -``` -├── main.go -└── templates - ├── admin - │   └── index.html - └── index.html -``` - -The following program will read the `./templates/admin/index.html` file and print it out. - -```go -package main - -import ( - "fmt" - - "github.com/gobuffalo/packr" -) - -func main() { - box := packr.NewBox("./templates") - - s, err := box.FindString("admin/index.html") - if err != nil { - log.Fatal(err) - } - fmt.Println(s) -} -``` - -### Development Made Easy - -In order to get static files into a Go binary, those files must first be converted to Go code. To do that, Packr, ships with a few tools to help build binaries. See below. - -During development, however, it is painful to have to keep running a tool to compile those files. - -Packr uses the following resolution rules when looking for a file: - -1. Look for the file in-memory (inside a Go binary) -1. Look for the file on disk (during development) - -Because Packr knows how to fall through to the file system, developers don't need to worry about constantly compiling their static files into a binary. They can work unimpeded. - -Packr takes file resolution a step further. When declaring a new box you use a relative path, `./templates`. When Packr receives this call it calculates out the absolute path to that directory. By doing this it means you can be guaranteed that Packr can find your files correctly, even if you're not running in the directory that the box was created in. This helps with the problem of testing, where Go changes the `pwd` for each package, making relative paths difficult to work with. This is not a problem when using Packr. - ---- - -## Usage with HTTP - -A box implements the [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystem) interface, meaning it can be used to serve static files. - -```go -package main - -import ( - "net/http" - - "github.com/gobuffalo/packr" -) - -func main() { - box := packr.NewBox("./templates") - - http.Handle("/", http.FileServer(box)) - http.ListenAndServe(":3000", nil) -} -``` - ---- - -## Building a Binary (the easy way) - -When it comes time to build, or install, your Go binary, simply use `packr build` or `packr install` just as you would `go build` or `go install`. All flags for the `go` tool are supported and everything works the way you expect, the only difference is your static assets are now bundled in the generated binary. If you want more control over how this happens, looking at the following section on building binaries (the hard way). - -## Building a Binary (the hard way) - -Before you build your Go binary, run the `packr` command first. It will look for all the boxes in your code and then generate `.go` files that pack the static files into bytes that can be bundled into the Go binary. - -``` -$ packr -``` - -Then run your `go build command` like normal. - -*NOTE*: It is not recommended to check-in these generated `-packr.go` files. They can be large, and can easily become out of date if not careful. It is recommended that you always run `packr clean` after running the `packr` tool. - -#### Cleaning Up - -When you're done it is recommended that you run the `packr clean` command. This will remove all of the generated files that Packr created for you. - -``` -$ packr clean -``` - -Why do you want to do this? Packr first looks to the information stored in these generated files, if the information isn't there it looks to disk. This makes it easy to work with in development. - ---- - -## Building/Moving a portable release - -When it comes to building multiple releases you typically want that release to be built in a specific directory. - -For example: `./releases` - -However, because passing a `.go` file requires absolute paths, we must compile the release in the appropriate absolute path. - -```bash -GOOS=linux GOARCH=amd64 packr build -``` - -Now your `project_name` binary will be built at the root of your project dir. Great! - -All that is left to do is to move that binary to your release dir: - -Linux/macOS/Windows (bash) - -```bash -mv ./project_name ./releases -``` - -Windows (cmd): - -```cmd -move ./project_name ./releases -``` - -Powershell: - -```powershell -Move-Item -Path .\project_name -Destination .\releases\ -``` - -If you _target_ for Windows when building don't forget that it's `project_name.exe` - -Now you can make multiple releases and all of your needed static files will be available! - -#### Summing it up: - -Example Script for building to 3 common targets: - -```bash -GOOS=darwin GOARCH=amd64 packr build && mv ./project_name ./releases/darwin-project_name \ - && GOOS=linux GOARCH=amd64 packr build && mv ./project_name ./releases/linux-project_name \ - && GOOS=windows GOARCH=386 packr build && mv ./project_name.exe ./releases/project_name.exe \ - && packr clean -``` - ---- - -## Debugging - -The `packr` command passes all arguments down to the underlying `go` command, this includes the `-v` flag to print out `go build` information. Packr looks for the `-v` flag, and will turn on its own verbose logging. This is very useful for trying to understand what the `packr` command is doing when it is run. diff --git a/vendor/github.com/gobuffalo/packr/SHOULDERS.md b/vendor/github.com/gobuffalo/packr/SHOULDERS.md deleted file mode 100644 index 26900074d..000000000 --- a/vendor/github.com/gobuffalo/packr/SHOULDERS.md +++ /dev/null @@ -1,18 +0,0 @@ -# github.com/gobuffalo/packr Stands on the Shoulders of Giants - -github.com/gobuffalo/packr does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/gobuffalo/envy](https://godoc.org/github.com/gobuffalo/envy) - -* [github.com/gobuffalo/packd](https://godoc.org/github.com/gobuffalo/packd) - -* [github.com/gobuffalo/packr/v2](https://godoc.org/github.com/gobuffalo/packr/v2) - -* [github.com/spf13/cobra](https://godoc.org/github.com/spf13/cobra) - -* [github.com/stretchr/testify](https://godoc.org/github.com/stretchr/testify) - -* [golang.org/x/sync](https://godoc.org/golang.org/x/sync) diff --git a/vendor/github.com/gobuffalo/packr/azure-pipelines.yml b/vendor/github.com/gobuffalo/packr/azure-pipelines.yml deleted file mode 100644 index 417e2c579..000000000 --- a/vendor/github.com/gobuffalo/packr/azure-pipelines.yml +++ /dev/null @@ -1,71 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/packr/azure-tests.yml b/vendor/github.com/gobuffalo/packr/azure-tests.yml deleted file mode 100644 index 58300d13c..000000000 --- a/vendor/github.com/gobuffalo/packr/azure-tests.yml +++ /dev/null @@ -1,24 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - go install -v ./packr - cd v2 - go get -t -v ./... - go test -race ./... - go install -v ./packr2 - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/packr/box.go b/vendor/github.com/gobuffalo/packr/box.go deleted file mode 100644 index 4922ebbe8..000000000 --- a/vendor/github.com/gobuffalo/packr/box.go +++ /dev/null @@ -1,228 +0,0 @@ -package packr - -import ( - "bytes" - "compress/gzip" - "fmt" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "runtime" - "strings" - - "github.com/gobuffalo/packd" -) - -var ( - // ErrResOutsideBox gets returned in case of the requested resources being outside the box - ErrResOutsideBox = fmt.Errorf("Can't find a resource outside the box") -) - -var _ packd.Box = Box{} -var _ packd.HTTPBox = Box{} -var _ packd.Lister = Box{} -var _ packd.Addable = Box{} -var _ packd.Walkable = Box{} -var _ packd.Finder = Box{} -var _ packd.LegacyBox = Box{} - -// NewBox returns a Box that can be used to -// retrieve files from either disk or the embedded -// binary. -func NewBox(path string) Box { - var cd string - if !filepath.IsAbs(path) { - _, filename, _, _ := runtime.Caller(1) - cd = filepath.Dir(filename) - } - - // this little hack courtesy of the `-cover` flag!! - cov := filepath.Join("_test", "_obj_test") - cd = strings.Replace(cd, string(filepath.Separator)+cov, "", 1) - if !filepath.IsAbs(cd) && cd != "" { - cd = filepath.Join(GoPath(), "src", cd) - } - - return Box{ - Path: path, - callingDir: cd, - data: map[string][]byte{}, - } -} - -// Box represent a folder on a disk you want to -// have access to in the built Go binary. -type Box struct { - Path string - callingDir string - data map[string][]byte - directories map[string]bool -} - -// AddString converts t to a byteslice and delegates to AddBytes to add to b.data -func (b Box) AddString(path string, t string) error { - b.AddBytes(path, []byte(t)) - return nil -} - -// AddBytes sets t in b.data by the given path -func (b Box) AddBytes(path string, t []byte) error { - b.data[path] = t - return nil -} - -// Deprecated: Use FindString instead. -func (b Box) String(name string) string { - bb, _ := b.FindString(name) - return bb -} - -// Deprecated: Use FindString instead. -func (b Box) MustString(name string) (string, error) { - return b.FindString(name) -} - -// Deprecated: Use Find instead. -func (b Box) Bytes(name string) []byte { - bb, _ := b.Find(name) - return bb -} - -// Deprecated: Use Find instead. -func (b Box) MustBytes(name string) ([]byte, error) { - return b.Find(name) -} - -// FindString returns either the string of the requested -// file or an error if it can not be found. -func (b Box) FindString(name string) (string, error) { - bb, err := b.Find(name) - return string(bb), err -} - -// Find returns either the byte slice of the requested -// file or an error if it can not be found. -func (b Box) Find(name string) ([]byte, error) { - f, err := b.find(name) - if err == nil { - bb := &bytes.Buffer{} - bb.ReadFrom(f) - return bb.Bytes(), err - } - return nil, err -} - -// Has returns true if the resource exists in the box -func (b Box) Has(name string) bool { - _, err := b.find(name) - if err != nil { - return false - } - return true -} - -func (b Box) decompress(bb []byte) []byte { - reader, err := gzip.NewReader(bytes.NewReader(bb)) - if err != nil { - return bb - } - defer reader.Close() - - data, err := ioutil.ReadAll(reader) - if err != nil { - return bb - } - return data -} - -func (b Box) find(name string) (File, error) { - if bb, ok := b.data[name]; ok { - return packd.NewFile(name, bytes.NewReader(bb)) - } - - if b.directories == nil { - b.indexDirectories() - } - - cleanName := filepath.ToSlash(filepath.Clean(name)) - // Ensure name is not outside the box - if strings.HasPrefix(cleanName, "../") { - return nil, ErrResOutsideBox - } - // Absolute name is considered as relative to the box root - cleanName = strings.TrimPrefix(cleanName, "/") - - if _, ok := data[b.Path]; ok { - if bb, ok := data[b.Path][cleanName]; ok { - bb = b.decompress(bb) - return packd.NewFile(cleanName, bytes.NewReader(bb)) - } - if _, ok := b.directories[cleanName]; ok { - return packd.NewDir(cleanName) - } - if filepath.Ext(cleanName) != "" { - // The Handler created by http.FileSystem checks for those errors and - // returns http.StatusNotFound instead of http.StatusInternalServerError. - return nil, os.ErrNotExist - } - return nil, os.ErrNotExist - } - - // Not found in the box virtual fs, try to get it from the file system - cleanName = filepath.FromSlash(cleanName) - p := filepath.Join(b.callingDir, b.Path, cleanName) - return fileFor(p, cleanName) -} - -// Open returns a File using the http.File interface -func (b Box) Open(name string) (http.File, error) { - return b.find(name) -} - -// List shows "What's in the box?" -func (b Box) List() []string { - var keys []string - - if b.data == nil || len(b.data) == 0 { - b.Walk(func(path string, info File) error { - finfo, _ := info.FileInfo() - if !finfo.IsDir() { - keys = append(keys, finfo.Name()) - } - return nil - }) - } else { - for k := range b.data { - keys = append(keys, k) - } - } - return keys -} - -func (b *Box) indexDirectories() { - b.directories = map[string]bool{} - if _, ok := data[b.Path]; ok { - for name := range data[b.Path] { - prefix, _ := path.Split(name) - // Even on Windows the suffix appears to be a / - prefix = strings.TrimSuffix(prefix, "/") - b.directories[prefix] = true - } - } -} - -func fileFor(p string, name string) (File, error) { - fi, err := os.Stat(p) - if err != nil { - return nil, err - } - if fi.IsDir() { - return packd.NewDir(p) - } - if bb, err := ioutil.ReadFile(p); err == nil { - return packd.NewFile(name, bytes.NewReader(bb)) - } - return nil, os.ErrNotExist -} diff --git a/vendor/github.com/gobuffalo/packr/env.go b/vendor/github.com/gobuffalo/packr/env.go deleted file mode 100644 index 8ec70b56e..000000000 --- a/vendor/github.com/gobuffalo/packr/env.go +++ /dev/null @@ -1,13 +0,0 @@ -package packr - -import ( - "github.com/gobuffalo/envy" -) - -// GoPath returns the current GOPATH env var -// or if it's missing, the default. -var GoPath = envy.GoPath - -// GoBin returns the current GO_BIN env var -// or if it's missing, a default of "go" -var GoBin = envy.GoBin diff --git a/vendor/github.com/gobuffalo/packr/file.go b/vendor/github.com/gobuffalo/packr/file.go deleted file mode 100644 index 8d24b7303..000000000 --- a/vendor/github.com/gobuffalo/packr/file.go +++ /dev/null @@ -1,5 +0,0 @@ -package packr - -import "github.com/gobuffalo/packd" - -type File = packd.File diff --git a/vendor/github.com/gobuffalo/packr/go.mod b/vendor/github.com/gobuffalo/packr/go.mod deleted file mode 100644 index a8281f3a1..000000000 --- a/vendor/github.com/gobuffalo/packr/go.mod +++ /dev/null @@ -1,12 +0,0 @@ -module github.com/gobuffalo/packr - -go 1.12 - -require ( - github.com/gobuffalo/envy v1.7.0 - github.com/gobuffalo/packd v0.3.0 - github.com/gobuffalo/packr/v2 v2.5.1 - github.com/spf13/cobra v0.0.5 - github.com/stretchr/testify v1.3.0 - golang.org/x/sync v0.0.0-20190423024810-112230192c58 -) diff --git a/vendor/github.com/gobuffalo/packr/go.sum b/vendor/github.com/gobuffalo/packr/go.sum deleted file mode 100644 index 162813101..000000000 --- a/vendor/github.com/gobuffalo/packr/go.sum +++ /dev/null @@ -1,79 +0,0 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/logger v1.0.0 h1:xw9Ko9EcC5iAFprrjJ6oZco9UpzS5MQ4jAwghsLHdy4= -github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/gobuffalo/packr/v2 v2.5.1 h1:TFOeY2VoGamPjQLiNDT3mn//ytzk236VMO2j7iHxJR4= -github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= -github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -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 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -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/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -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/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-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-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c h1:KfpJVdWhuRqNk4XVXzjXf2KAV4TBEP77SYdFGjeGuIE= -golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gobuffalo/packr/packr.go b/vendor/github.com/gobuffalo/packr/packr.go deleted file mode 100644 index 6ccc6c15c..000000000 --- a/vendor/github.com/gobuffalo/packr/packr.go +++ /dev/null @@ -1,74 +0,0 @@ -package packr - -import ( - "bytes" - "compress/gzip" - "encoding/json" - "runtime" - "strings" - "sync" -) - -var gil = &sync.Mutex{} -var data = map[string]map[string][]byte{} - -// PackBytes packs bytes for a file into a box. -func PackBytes(box string, name string, bb []byte) { - gil.Lock() - defer gil.Unlock() - if _, ok := data[box]; !ok { - data[box] = map[string][]byte{} - } - data[box][name] = bb -} - -// PackBytesGzip packets the gzipped compressed bytes into a box. -func PackBytesGzip(box string, name string, bb []byte) error { - var buf bytes.Buffer - w := gzip.NewWriter(&buf) - _, err := w.Write(bb) - if err != nil { - return err - } - err = w.Close() - if err != nil { - return err - } - PackBytes(box, name, buf.Bytes()) - return nil -} - -// PackJSONBytes packs JSON encoded bytes for a file into a box. -func PackJSONBytes(box string, name string, jbb string) error { - var bb []byte - err := json.Unmarshal([]byte(jbb), &bb) - if err != nil { - return err - } - PackBytes(box, name, bb) - return nil -} - -// UnpackBytes unpacks bytes for specific box. -func UnpackBytes(box string) { - gil.Lock() - defer gil.Unlock() - delete(data, box) -} - -func osPaths(paths ...string) []string { - if runtime.GOOS == "windows" { - for i, path := range paths { - paths[i] = strings.Replace(path, "/", "\\", -1) - } - } - - return paths -} - -func osPath(path string) string { - if runtime.GOOS == "windows" { - return strings.Replace(path, "/", "\\", -1) - } - return path -} diff --git a/vendor/github.com/gobuffalo/packr/v2/.gometalinter.json b/vendor/github.com/gobuffalo/packr/v2/.gometalinter.json deleted file mode 100644 index e4f65a36e..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/.gometalinter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Enable": ["vet", "golint", "goimports", "deadcode", "gotype", "ineffassign", "misspell", "nakedret", "unconvert", "megacheck", "varcheck"] -} diff --git a/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml b/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml deleted file mode 100644 index a0c56e8e8..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml +++ /dev/null @@ -1,41 +0,0 @@ -# Code generated by github.com/gobuffalo/release. DO NOT EDIT. -# Edit .goreleaser.yml.plush instead - -builds: -- - goos: - - darwin - - linux - - windows - goarch: - - ppc64le - - 386 - - amd64 - env: - - CGO_ENABLED=0 - ignore: - - goos: darwin - goarch: ppc64le - - goos: windows - goarch: ppc64le - main: ./packr2/main.go - binary: packr2 - -checksum: - name_template: 'checksums.txt' - -snapshot: - name_template: "{{ .Tag }}-next" - -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' - -brew: - github: - owner: gobuffalo - name: homebrew-tap - diff --git a/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml.plush b/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml.plush deleted file mode 100644 index 79e030def..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/.goreleaser.yml.plush +++ /dev/null @@ -1,38 +0,0 @@ -builds: -- - goos: - - darwin - - linux - - windows - goarch: - - ppc64le - - 386 - - amd64 - env: - - CGO_ENABLED=0 - ignore: - - goos: darwin - goarch: ppc64le - - goos: windows - goarch: ppc64le - main: ./packr2/main.go - binary: packr2 - -checksum: - name_template: 'checksums.txt' - -snapshot: - name_template: "{{ .Tag }}-next" - -changelog: - sort: asc - filters: - exclude: - - '^docs:' - - '^test:' -<%= if (brew) { %> -brew: - github: - owner: gobuffalo - name: homebrew-tap -<% } %> diff --git a/vendor/github.com/gobuffalo/packr/v2/LICENSE.txt b/vendor/github.com/gobuffalo/packr/v2/LICENSE.txt deleted file mode 100644 index 3ccb336a0..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/LICENSE.txt +++ /dev/null @@ -1,8 +0,0 @@ -The MIT License (MIT) -Copyright (c) 2016 Mark Bates - -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/gobuffalo/packr/v2/Makefile b/vendor/github.com/gobuffalo/packr/v2/Makefile deleted file mode 100644 index 8de26c88b..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/Makefile +++ /dev/null @@ -1,47 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: deps - echo "installing packr v2" - packr2 - $(GO_BIN) install -v ./packr2 - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get github.com/gobuffalo/release - $(GO_BIN) get -tags ${TAGS} -t ./... - $(GO_BIN) install -v ./packr2 - make tidy - -build: deps - packr2 - $(GO_BIN) build -v ./packr2 - make tidy - -test: - packr2 - $(GO_BIN) test -tags ${TAGS} ./... - make tidy - -lint: - gometalinter --vendor ./... --deadline=1m --skip=internal - -update: - $(GO_BIN) get -u -tags ${TAGS} ./... - make tidy - make install - make test - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -release: - release -y -f version.go - make tidy diff --git a/vendor/github.com/gobuffalo/packr/v2/README.md b/vendor/github.com/gobuffalo/packr/v2/README.md deleted file mode 100644 index 659115535..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/README.md +++ /dev/null @@ -1,235 +0,0 @@ -# Packr (v2) - -[![GoDoc](https://godoc.org/github.com/gobuffalo/packr/v2?status.svg)](https://godoc.org/github.com/gobuffalo/packr/v2) - -Packr is a simple solution for bundling static assets inside of Go binaries. Most importantly it does it in a way that is friendly to developers while they are developing. - -## Intro Video - -To get an idea of the what and why of Packr, please enjoy this short video: [https://vimeo.com/219863271](https://vimeo.com/219863271). - -## Library Installation - -```text -$ go get -u github.com/gobuffalo/packr/v2/... -``` - -## Binary Installation - -```text -$ go get -u github.com/gobuffalo/packr/v2/packr2 -``` - -## New File Format FAQs - -In version `v2.0.0` the file format changed and is not backward compatible with the `packr-v1.x` library. - -#### Can `packr-v1.x` read the new format? - -No, it can not. Because of the way the new file format works porting it to `packr-v1.x` would be difficult. PRs are welcome though. :) - -#### Can `packr-v2.x` read `packr-v1.x` files? - -Yes it can, but that ability will eventually be phased out. Because of that we recommend moving to the new format. - -#### Can `packr-v2.x` generate `packr-v1.x` files? - -Yes it can, but that ability will eventually be phased out. Because of that we recommend moving to the new format. - -The `--legacy` command is available on all commands that generate `-packr.go` files. - -```bash -$ packr2 --legacy -``` - -## Usage - -### In Code - -The first step in using Packr is to create a new box. A box represents a folder on disk. Once you have a box you can get `string` or `[]byte` representations of the file. - -```go -// set up a new box by giving it a name and an optional (relative) path to a folder on disk: -box := packr.New("My Box", "./templates") - -// Get the string representation of a file, or an error if it doesn't exist: -html, err := box.FindString("index.html") - -// Get the []byte representation of a file, or an error if it doesn't exist: -html, err := box.Find("index.html") -``` - -### What is a Box? - -A box represents a folder, and any sub-folders, on disk that you want to have access to in your binary. When compiling a binary using the `packr2` CLI the contents of the folder will be converted into Go files that can be compiled inside of a "standard" go binary. Inside of the compiled binary the files will be read from memory. When working locally the files will be read directly off of disk. This is a seamless switch that doesn't require any special attention on your part. - -#### Example - -Assume the follow directory structure: - -``` -├── main.go -└── templates - ├── admin - │   └── index.html - └── index.html -``` - -The following program will read the `./templates/admin/index.html` file and print it out. - -```go -package main - -import ( - "fmt" - - "github.com/gobuffalo/packr/v2" -) - -func main() { - box := packr.New("myBox", "./templates") - - s, err := box.FindString("admin/index.html") - if err != nil { - log.Fatal(err) - } - fmt.Println(s) -} -``` - -### Development Made Easy - -In order to get static files into a Go binary, those files must first be converted to Go code. To do that, Packr, ships with a few tools to help build binaries. See below. - -During development, however, it is painful to have to keep running a tool to compile those files. - -Packr uses the following resolution rules when looking for a file: - -1. Look for the file in-memory (inside a Go binary) -1. Look for the file on disk (during development) - -Because Packr knows how to fall through to the file system, developers don't need to worry about constantly compiling their static files into a binary. They can work unimpeded. - -Packr takes file resolution a step further. When declaring a new box you use a relative path, `./templates`. When Packr receives this call it calculates out the absolute path to that directory. By doing this it means you can be guaranteed that Packr can find your files correctly, even if you're not running in the directory that the box was created in. This helps with the problem of testing, where Go changes the `pwd` for each package, making relative paths difficult to work with. This is not a problem when using Packr. - ---- - -## Usage with HTTP - -A box implements the [`http.FileSystem`](https://golang.org/pkg/net/http/#FileSystem) interface, meaning it can be used to serve static files. - -```go -package main - -import ( - "net/http" - - "github.com/gobuffalo/packr/v2" -) - -func main() { - box := packr.New("someBoxName", "./templates") - - http.Handle("/", http.FileServer(box)) - http.ListenAndServe(":3000", nil) -} -``` - ---- - -## Building a Binary - -Before you build your Go binary, run the `packr2` command first. It will look for all the boxes in your code and then generate `.go` files that pack the static files into bytes that can be bundled into the Go binary. - -``` -$ packr2 -``` - -Then run your `go build command` like normal. - -*NOTE*: It is not recommended to check-in these generated `-packr.go` files. They can be large, and can easily become out of date if not careful. It is recommended that you always run `packr2 clean` after running the `packr2` tool. - -#### Cleaning Up - -When you're done it is recommended that you run the `packr2 clean` command. This will remove all of the generated files that Packr created for you. - -``` -$ packr2 clean -``` - -Why do you want to do this? Packr first looks to the information stored in these generated files, if the information isn't there it looks to disk. This makes it easy to work with in development. - ---- - -## Debugging - -The `packr2` command passes all arguments down to the underlying `go` command, this includes the `-v` flag to print out `go build` information. Packr looks for the `-v` flag, and will turn on its own verbose logging. This is very useful for trying to understand what the `packr` command is doing when it is run. - ---- - -## FAQ - -### Compilation Errors with Go Templates - -Q: I have a program with Go template files, those files are named `foo.go` and look like the following: - -``` -// Copyright {{.Year}} {{.Author}}. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package {{.Project}} -``` - -When I run `packr2` I get errors like: - -``` -expected 'IDENT', found '{' -``` - -A: Packr works by searching your `.go` files for [`github.com/gobuffalo/packr/v2#New`](https://godoc.org/github.com/gobuffalo/packr/v2#New) or [`github.com/gobuffalo/packr/v2#NewBox`](https://godoc.org/github.com/gobuffalo/packr/v2#NewBox) calls. Because those files aren't "proper" Go files, Packr can't parse them to find the box declarations. To fix this you need to tell Packr to ignore those files when searching for boxes. A couple solutions to this problem are: - -* Name the files something else. The `.tmpl` extension is the idiomatic way of naming these types of files. -* Rename the folder containing these files to start with an `_`, for example `_templates`. Packr, like Go, will ignore folders starting with the `_` character when searching for boxes. - -### Dynamic Box Paths - -Q: I need to set the path of a box using a variable, but `packr.New("foo", myVar)` doesn't work correctly. - -A: Packr attempts to "automagically" set it's resolution directory when using [`github.com/gobuffalo/packr/v2#New`](https://godoc.org/github.com/gobuffalo/packr/v2#New), however, for dynamic paths you need to set it manually: - -```go -box := packr.New("foo", "|") -box.ResolutionDir = myVar -``` - -### I don't want to pack files, but still use the Packr interface. - -Q: I want to write code that using the Packr tools, but doesn't actually pack the files into my binary. How can I do that? - -A: Using [`github.com/gobuffalo/packr/v2#Folder`](https://godoc.org/github.com/gobuffalo/packr/v2#Folder) gives you back a `*packr.Box` that can be used as normal, but is excluded by the Packr tool when compiling. - -### Packr Finds No Boxes - -Q: I run `packr2 -v` but it doesn't find my boxes: - -``` -DEBU[2019-03-18T18:48:52+01:00] *parser.Parser#NewFromRoots found prospects=0 -DEBU[2019-03-18T18:48:52+01:00] found 0 boxes -``` - -A: Packr works by parsing `.go` files to find [`github.com/gobuffalo/packr/v2#Box`](https://godoc.org/github.com/gobuffalo/packr/v2#Box) and [`github.com/gobuffalo/packr/v2#NewBox`](https://godoc.org/github.com/gobuffalo/packr/v2#NewBox) declarations. If there aren't any `.go` in the folder that `packr2` is run in it can not find those declarations. To fix this problem run the `packr2` command in the directory containing your `.go` files. - -### Box Interfaces - -Q: I want to be able to easily test my applications by passing in mock boxes. How do I do that? - -A: Packr boxes and files conform to the interfaces found at [`github.com/gobuffalo/packd`](https://godoc.org/github.com/gobuffalo/packd). Change your application to use those interfaces instead of the concrete Packr types. - -```go -// using concrete type -func myFunc(box *packr.Box) {} - -// using interfaces -func myFunc(box packd.Box) {} -``` diff --git a/vendor/github.com/gobuffalo/packr/v2/SHOULDERS.md b/vendor/github.com/gobuffalo/packr/v2/SHOULDERS.md deleted file mode 100644 index dbca4627b..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/SHOULDERS.md +++ /dev/null @@ -1,26 +0,0 @@ -# github.com/gobuffalo/packr/v2 Stands on the Shoulders of Giants - -github.com/gobuffalo/packr/v2 does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/gobuffalo/envy](https://godoc.org/github.com/gobuffalo/envy) - -* [github.com/gobuffalo/logger](https://godoc.org/github.com/gobuffalo/logger) - -* [github.com/gobuffalo/packd](https://godoc.org/github.com/gobuffalo/packd) - -* [github.com/karrick/godirwalk](https://godoc.org/github.com/karrick/godirwalk) - -* [github.com/rogpeppe/go-internal](https://godoc.org/github.com/rogpeppe/go-internal) - -* [github.com/sirupsen/logrus](https://godoc.org/github.com/sirupsen/logrus) - -* [github.com/spf13/cobra](https://godoc.org/github.com/spf13/cobra) - -* [github.com/stretchr/testify](https://godoc.org/github.com/stretchr/testify) - -* [golang.org/x/sync](https://godoc.org/golang.org/x/sync) - -* [golang.org/x/tools](https://godoc.org/golang.org/x/tools) diff --git a/vendor/github.com/gobuffalo/packr/v2/box.go b/vendor/github.com/gobuffalo/packr/v2/box.go deleted file mode 100644 index 2e37f4053..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/box.go +++ /dev/null @@ -1,235 +0,0 @@ -package packr - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "net/http" - "os" - "path" - "path/filepath" - "sort" - "strings" - - "github.com/gobuffalo/packd" - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/plog" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer" -) - -var _ packd.Box = &Box{} -var _ packd.HTTPBox = &Box{} -var _ packd.Addable = &Box{} -var _ packd.Walkable = &Box{} -var _ packd.Finder = &Box{} - -// Box represent a folder on a disk you want to -// have access to in the built Go binary. -type Box struct { - Path string `json:"path"` - Name string `json:"name"` - ResolutionDir string `json:"resolution_dir"` - DefaultResolver resolver.Resolver `json:"default_resolver"` - resolvers resolversMap - dirs dirsMap -} - -// NewBox returns a Box that can be used to -// retrieve files from either disk or the embedded -// binary. -// Deprecated: Use New instead. -func NewBox(path string) *Box { - oncer.Deprecate(0, "packr.NewBox", "Use packr.New instead.") - return New(path, path) -} - -// New returns a new Box with the name of the box -// and the path of the box. -func New(name string, path string) *Box { - plog.Debug("packr", "New", "name", name, "path", path) - b, _ := findBox(name) - if b != nil { - return b - } - - b = construct(name, path) - plog.Debug(b, "New", "Box", b, "ResolutionDir", b.ResolutionDir) - b, err := placeBox(b) - if err != nil { - panic(err) - } - - return b -} - -// Folder returns a Box that will NOT be packed. -// This is useful for writing tests or tools that -// need to work with a folder at runtime. -func Folder(path string) *Box { - return New(path, path) -} - -// SetResolver allows for the use of a custom resolver for -// the specified file -func (b *Box) SetResolver(file string, res resolver.Resolver) { - d := filepath.Dir(file) - b.dirs.Store(d, true) - plog.Debug(b, "SetResolver", "file", file, "resolver", fmt.Sprintf("%T", res)) - b.resolvers.Store(resolver.Key(file), res) -} - -// AddString converts t to a byteslice and delegates to AddBytes to add to b.data -func (b *Box) AddString(path string, t string) error { - return b.AddBytes(path, []byte(t)) -} - -// AddBytes sets t in b.data by the given path -func (b *Box) AddBytes(path string, t []byte) error { - m := map[string]file.File{} - f, err := file.NewFile(path, t) - if err != nil { - return err - } - m[resolver.Key(path)] = f - res := resolver.NewInMemory(m) - b.SetResolver(path, res) - return nil -} - -// FindString returns either the string of the requested -// file or an error if it can not be found. -func (b *Box) FindString(name string) (string, error) { - bb, err := b.Find(name) - return string(bb), err -} - -// Find returns either the byte slice of the requested -// file or an error if it can not be found. -func (b *Box) Find(name string) ([]byte, error) { - f, err := b.Resolve(name) - if err != nil { - return []byte(""), err - } - bb := &bytes.Buffer{} - io.Copy(bb, f) - return bb.Bytes(), nil -} - -// Has returns true if the resource exists in the box -func (b *Box) Has(name string) bool { - _, err := b.Find(name) - return err == nil -} - -// HasDir returns true if the directory exists in the box -func (b *Box) HasDir(name string) bool { - oncer.Do("packr2/box/HasDir"+b.Name, func() { - for _, f := range b.List() { - for d := filepath.Dir(f); d != "."; d = filepath.Dir(d) { - b.dirs.Store(d, true) - } - } - }) - if name == "/" { - return b.Has("index.html") - } - _, ok := b.dirs.Load(name) - return ok -} - -// Open returns a File using the http.File interface -func (b *Box) Open(name string) (http.File, error) { - plog.Debug(b, "Open", "name", name) - f, err := b.Resolve(name) - if err != nil { - if len(filepath.Ext(name)) == 0 { - return b.openWoExt(name) - } - return f, err - } - f, err = file.NewFileR(name, f) - plog.Debug(b, "Open", "name", f.Name(), "file", f.Name()) - return f, err -} - -func (b *Box) openWoExt(name string) (http.File, error) { - if !b.HasDir(name) { - id := path.Join(name, "index.html") - if b.Has(id) { - return b.Open(id) - } - return nil, os.ErrNotExist - } - d, err := file.NewDir(name) - plog.Debug(b, "Open", "name", name, "dir", d) - return d, err -} - -// List shows "What's in the box?" -func (b *Box) List() []string { - var keys []string - - b.Walk(func(path string, info File) error { - if info == nil { - return nil - } - finfo, _ := info.FileInfo() - if !finfo.IsDir() { - keys = append(keys, path) - } - return nil - }) - sort.Strings(keys) - return keys -} - -// Resolve will attempt to find the file in the box, -// returning an error if the find can not be found. -func (b *Box) Resolve(key string) (file.File, error) { - key = strings.TrimPrefix(key, "/") - - var r resolver.Resolver - - b.resolvers.Range(func(k string, vr resolver.Resolver) bool { - lk := strings.ToLower(resolver.Key(k)) - lkey := strings.ToLower(resolver.Key(key)) - if lk == lkey { - r = vr - return false - } - return true - }) - - if r == nil { - r = b.DefaultResolver - if r == nil { - r = resolver.DefaultResolver - if r == nil { - return nil, fmt.Errorf("resolver.DefaultResolver is nil") - } - } - } - plog.Debug(r, "Resolve", "box", b.Name, "key", key) - - f, err := r.Resolve(b.Name, key) - if err != nil { - z := filepath.Join(resolver.OsPath(b.ResolutionDir), filepath.FromSlash(path.Clean("/"+resolver.OsPath(key)))) - f, err = r.Resolve(b.Name, z) - if err != nil { - plog.Debug(r, "Resolve", "box", b.Name, "key", z, "err", err) - return f, err - } - b, err := ioutil.ReadAll(f) - if err != nil { - return f, err - } - f, err = file.NewFile(key, b) - if err != nil { - return f, err - } - } - plog.Debug(r, "Resolve", "box", b.Name, "key", key, "file", f.Name()) - return f, nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/box_map.go b/vendor/github.com/gobuffalo/packr/v2/box_map.go deleted file mode 100644 index aafeffa1d..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/box_map.go +++ /dev/null @@ -1,73 +0,0 @@ -//go:generate mapgen -name "box" -zero "nil" -go-type "*Box" -pkg "" -a "New(`test-a`, ``)" -b "New(`test-b`, ``)" -c "New(`test-c`, ``)" -bb "New(`test-bb`, ``)" -destination "packr" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package packr - -import ( - "sort" - "sync" -) - -// boxMap wraps sync.Map and uses the following types: -// key: string -// value: *Box -type boxMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *boxMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns *Box or bool. -// A false return indicates either the key was not found -// or the value is not of type *Box -func (m *boxMap) Load(key string) (*Box, bool) { - i, ok := m.data.Load(key) - if !ok { - return nil, false - } - s, ok := i.(*Box) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *boxMap) LoadOrStore(key string, value *Box) (*Box, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.(*Box) - return s, ok -} - -// Range over the *Box values in the map -func (m *boxMap) Range(f func(key string, value *Box) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(*Box) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a *Box in the map -func (m *boxMap) Store(key string, value *Box) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *boxMap) Keys() []string { - var keys []string - m.Range(func(key string, value *Box) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/vendor/github.com/gobuffalo/packr/v2/deprecated.go b/vendor/github.com/gobuffalo/packr/v2/deprecated.go deleted file mode 100644 index 25f5b3449..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/deprecated.go +++ /dev/null @@ -1,79 +0,0 @@ -package packr - -import ( - "encoding/json" - "fmt" - - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer" -) - -// File has been deprecated and file.File should be used instead -type File = file.File - -var ( - // ErrResOutsideBox gets returned in case of the requested resources being outside the box - // Deprecated - ErrResOutsideBox = fmt.Errorf("can't find a resource outside the box") -) - -// PackBytes packs bytes for a file into a box. -// Deprecated -func PackBytes(box string, name string, bb []byte) { - b := NewBox(box) - d := resolver.NewInMemory(map[string]file.File{}) - f, err := file.NewFile(name, bb) - if err != nil { - panic(err) - } - if err := d.Pack(name, f); err != nil { - panic(err) - } - b.SetResolver(name, d) -} - -// PackBytesGzip packets the gzipped compressed bytes into a box. -// Deprecated -func PackBytesGzip(box string, name string, bb []byte) error { - // TODO: this function never did what it was supposed to do! - PackBytes(box, name, bb) - return nil -} - -// PackJSONBytes packs JSON encoded bytes for a file into a box. -// Deprecated -func PackJSONBytes(box string, name string, jbb string) error { - var bb []byte - err := json.Unmarshal([]byte(jbb), &bb) - if err != nil { - return err - } - PackBytes(box, name, bb) - return nil -} - -// Bytes is deprecated. Use Find instead -func (b *Box) Bytes(name string) []byte { - bb, _ := b.Find(name) - oncer.Deprecate(0, "github.com/gobuffalo/packr/v2#Box.Bytes", "Use github.com/gobuffalo/packr/v2#Box.Find instead.") - return bb -} - -// MustBytes is deprecated. Use Find instead. -func (b *Box) MustBytes(name string) ([]byte, error) { - oncer.Deprecate(0, "github.com/gobuffalo/packr/v2#Box.MustBytes", "Use github.com/gobuffalo/packr/v2#Box.Find instead.") - return b.Find(name) -} - -// String is deprecated. Use FindString instead -func (b *Box) String(name string) string { - oncer.Deprecate(0, "github.com/gobuffalo/packr/v2#Box.String", "Use github.com/gobuffalo/packr/v2#Box.FindString instead.") - return string(b.Bytes(name)) -} - -// MustString is deprecated. Use FindString instead -func (b *Box) MustString(name string) (string, error) { - oncer.Deprecate(0, "github.com/gobuffalo/packr/v2#Box.MustString", "Use github.com/gobuffalo/packr/v2#Box.FindString instead.") - return b.FindString(name) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/dirs_map.go b/vendor/github.com/gobuffalo/packr/v2/dirs_map.go deleted file mode 100644 index 9e6491399..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/dirs_map.go +++ /dev/null @@ -1,82 +0,0 @@ -//go:generate mapgen -name "dirs" -zero "false" -go-type "bool" -pkg "" -a "nil" -b "nil" -c "nil" -bb "nil" -destination "packr" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package packr - -import ( - "sort" - "strings" - "sync" -) - -// dirsMap wraps sync.Map and uses the following types: -// key: string -// value: bool -type dirsMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *dirsMap) Delete(key string) { - m.data.Delete(m.normalizeKey(key)) -} - -// Load the key from the map. -// Returns bool or bool. -// A false return indicates either the key was not found -// or the value is not of type bool -func (m *dirsMap) Load(key string) (bool, bool) { - i, ok := m.data.Load(m.normalizeKey(key)) - if !ok { - return false, false - } - s, ok := i.(bool) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *dirsMap) LoadOrStore(key string, value bool) (bool, bool) { - i, _ := m.data.LoadOrStore(m.normalizeKey(key), value) - s, ok := i.(bool) - return s, ok -} - -// Range over the bool values in the map -func (m *dirsMap) Range(f func(key string, value bool) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(bool) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a bool in the map -func (m *dirsMap) Store(key string, value bool) { - d := m.normalizeKey(key) - m.data.Store(d, value) - m.data.Store(strings.TrimPrefix(d, "/"), value) -} - -// Keys returns a list of keys in the map -func (m *dirsMap) Keys() []string { - var keys []string - m.Range(func(key string, value bool) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} - -func (m *dirsMap) normalizeKey(key string) string { - key = strings.Replace(key, "\\", "/", -1) - - return key -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/file.go b/vendor/github.com/gobuffalo/packr/v2/file/file.go deleted file mode 100644 index bef50c8dd..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/file.go +++ /dev/null @@ -1,32 +0,0 @@ -package file - -import ( - "bytes" - "io" - - "github.com/gobuffalo/packd" -) - -// File represents a virtual, or physical, backing of -// a file object in a Box -type File = packd.File - -// FileMappable types are capable of returning a map of -// path => File -type FileMappable interface { - FileMap() map[string]File -} - -// NewFile returns a virtual File implementation -func NewFile(name string, b []byte) (File, error) { - return packd.NewFile(name, bytes.NewReader(b)) -} - -// NewDir returns a virtual dir implementation -func NewDir(name string) (File, error) { - return packd.NewDir(name) -} - -func NewFileR(name string, r io.Reader) (File, error) { - return packd.NewFile(name, r) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/info.go b/vendor/github.com/gobuffalo/packr/v2/file/info.go deleted file mode 100644 index 45ae8351b..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/info.go +++ /dev/null @@ -1,38 +0,0 @@ -package file - -import ( - "os" - "time" -) - -type info struct { - Path string - Contents []byte - size int64 - modTime time.Time - isDir bool -} - -func (f info) Name() string { - return f.Path -} - -func (f info) Size() int64 { - return f.size -} - -func (f info) Mode() os.FileMode { - return 0444 -} - -func (f info) ModTime() time.Time { - return f.modTime -} - -func (f info) IsDir() bool { - return f.isDir -} - -func (f info) Sys() interface{} { - return nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/disk.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/disk.go deleted file mode 100644 index 9afe8a058..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/disk.go +++ /dev/null @@ -1,80 +0,0 @@ -package resolver - -import ( - "io/ioutil" - "os" - "path/filepath" - "strings" - "sync" - - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/plog" - "github.com/karrick/godirwalk" -) - -var _ Resolver = &Disk{} - -type Disk struct { - Root string -} - -func (d Disk) String() string { - return String(&d) -} - -func (d *Disk) Resolve(box string, name string) (file.File, error) { - path := OsPath(name) - if !filepath.IsAbs(path) { - path = filepath.Join(OsPath(d.Root), path) - } - fi, err := os.Stat(path) - if err != nil { - return nil, err - } - if fi.IsDir() { - return file.NewDir(OsPath(name)) - } - if bb, err := ioutil.ReadFile(path); err == nil { - return file.NewFile(OsPath(name), bb) - } - return nil, os.ErrNotExist -} - -var _ file.FileMappable = &Disk{} - -func (d *Disk) FileMap() map[string]file.File { - moot := &sync.Mutex{} - m := map[string]file.File{} - root := OsPath(d.Root) - if _, err := os.Stat(root); err != nil { - return m - } - callback := func(path string, de *godirwalk.Dirent) error { - if _, err := os.Stat(root); err != nil { - return nil - } - if !de.IsRegular() { - return nil - } - moot.Lock() - name := strings.TrimPrefix(path, root+string(filepath.Separator)) - b, err := ioutil.ReadFile(path) - if err != nil { - return err - } - m[name], err = file.NewFile(name, b) - if err != nil { - return err - } - moot.Unlock() - return nil - } - err := godirwalk.Walk(root, &godirwalk.Options{ - FollowSymbolicLinks: true, - Callback: callback, - }) - if err != nil { - plog.Logger.Errorf("[%s] error walking %v", root, err) - } - return m -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/encoding/hex/hex.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/encoding/hex/hex.go deleted file mode 100644 index aad1f0d8c..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/encoding/hex/hex.go +++ /dev/null @@ -1,314 +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 hex implements hexadecimal encoding and decoding. -package hex - -import ( - "bytes" - "fmt" - "io" -) - -const hextable = "0123456789abcdef" - -// EncodedLen returns the length of an encoding of n source bytes. -// Specifically, it returns n * 2. -func EncodedLen(n int) int { return n * 2 } - -// Encode encodes src into EncodedLen(len(src)) -// bytes of dst. As a convenience, it returns the number -// of bytes written to dst, but this value is always EncodedLen(len(src)). -// Encode implements hexadecimal encoding. -func Encode(dst, src []byte) int { - for i, v := range src { - dst[i*2] = hextable[v>>4] - dst[i*2+1] = hextable[v&0x0f] - } - - return len(src) * 2 -} - -// ErrLength reports an attempt to decode an odd-length input -// using Decode or DecodeString. -// The stream-based Decoder returns io.ErrUnexpectedEOF instead of ErrLength. -var ErrLength = fmt.Errorf("encoding/hex: odd length hex string") - -// InvalidByteError values describe errors resulting from an invalid byte in a hex string. -type InvalidByteError byte - -func (e InvalidByteError) Error() string { - return fmt.Sprintf("encoding/hex: invalid byte: %#U", rune(e)) -} - -// DecodedLen returns the length of a decoding of x source bytes. -// Specifically, it returns x / 2. -func DecodedLen(x int) int { return x / 2 } - -// Decode decodes src into DecodedLen(len(src)) bytes, -// returning the actual number of bytes written to dst. -// -// Decode expects that src contains only hexadecimal -// characters and that src has even length. -// If the input is malformed, Decode returns the number -// of bytes decoded before the error. -func Decode(dst, src []byte) (int, error) { - var i int - for i = 0; i < len(src)/2; i++ { - a, ok := fromHexChar(src[i*2]) - if !ok { - return i, InvalidByteError(src[i*2]) - } - b, ok := fromHexChar(src[i*2+1]) - if !ok { - return i, InvalidByteError(src[i*2+1]) - } - dst[i] = (a << 4) | b - } - if len(src)%2 == 1 { - // Check for invalid char before reporting bad length, - // since the invalid char (if present) is an earlier problem. - if _, ok := fromHexChar(src[i*2]); !ok { - return i, InvalidByteError(src[i*2]) - } - return i, ErrLength - } - return i, nil -} - -// fromHexChar converts a hex character into its value and a success flag. -func fromHexChar(c byte) (byte, bool) { - switch { - case '0' <= c && c <= '9': - return c - '0', true - case 'a' <= c && c <= 'f': - return c - 'a' + 10, true - case 'A' <= c && c <= 'F': - return c - 'A' + 10, true - } - - return 0, false -} - -// EncodeToString returns the hexadecimal encoding of src. -func EncodeToString(src []byte) string { - dst := make([]byte, EncodedLen(len(src))) - Encode(dst, src) - return string(dst) -} - -// DecodeString returns the bytes represented by the hexadecimal string s. -// -// DecodeString expects that src contains only hexadecimal -// characters and that src has even length. -// If the input is malformed, DecodeString returns -// the bytes decoded before the error. -func DecodeString(s string) ([]byte, error) { - src := []byte(s) - // We can use the source slice itself as the destination - // because the decode loop increments by one and then the 'seen' byte is not used anymore. - n, err := Decode(src, src) - return src[:n], err -} - -// Dump returns a string that contains a hex dump of the given data. The format -// of the hex dump matches the output of `hexdump -C` on the command line. -func Dump(data []byte) string { - var buf bytes.Buffer - dumper := Dumper(&buf) - dumper.Write(data) - dumper.Close() - return buf.String() -} - -// bufferSize is the number of hexadecimal characters to buffer in encoder and decoder. -const bufferSize = 1024 - -type encoder struct { - w io.Writer - err error - out [bufferSize]byte // output buffer -} - -// NewEncoder returns an io.Writer that writes lowercase hexadecimal characters to w. -func NewEncoder(w io.Writer) io.Writer { - return &encoder{w: w} -} - -func (e *encoder) Write(p []byte) (n int, err error) { - for len(p) > 0 && e.err == nil { - chunkSize := bufferSize / 2 - if len(p) < chunkSize { - chunkSize = len(p) - } - - var written int - encoded := Encode(e.out[:], p[:chunkSize]) - written, e.err = e.w.Write(e.out[:encoded]) - n += written / 2 - p = p[chunkSize:] - } - return n, e.err -} - -type decoder struct { - r io.Reader - err error - in []byte // input buffer (encoded form) - arr [bufferSize]byte // backing array for in -} - -// NewDecoder returns an io.Reader that decodes hexadecimal characters from r. -// NewDecoder expects that r contain only an even number of hexadecimal characters. -func NewDecoder(r io.Reader) io.Reader { - return &decoder{r: r} -} - -func (d *decoder) Read(p []byte) (n int, err error) { - // Fill internal buffer with sufficient bytes to decode - if len(d.in) < 2 && d.err == nil { - var numCopy, numRead int - numCopy = copy(d.arr[:], d.in) // Copies either 0 or 1 bytes - numRead, d.err = d.r.Read(d.arr[numCopy:]) - d.in = d.arr[:numCopy+numRead] - if d.err == io.EOF && len(d.in)%2 != 0 { - if _, ok := fromHexChar(d.in[len(d.in)-1]); !ok { - d.err = InvalidByteError(d.in[len(d.in)-1]) - } else { - d.err = io.ErrUnexpectedEOF - } - } - } - - // Decode internal buffer into output buffer - if numAvail := len(d.in) / 2; len(p) > numAvail { - p = p[:numAvail] - } - numDec, err := Decode(p, d.in[:len(p)*2]) - d.in = d.in[2*numDec:] - if err != nil { - d.in, d.err = nil, err // Decode error; discard input remainder - } - - if len(d.in) < 2 { - return numDec, d.err // Only expose errors when buffer fully consumed - } - return numDec, nil -} - -// Dumper returns a WriteCloser that writes a hex dump of all written data to -// w. The format of the dump matches the output of `hexdump -C` on the command -// line. -func Dumper(w io.Writer) io.WriteCloser { - return &dumper{w: w} -} - -type dumper struct { - w io.Writer - rightChars [18]byte - buf [14]byte - used int // number of bytes in the current line - n uint // number of bytes, total - closed bool -} - -func toChar(b byte) byte { - if b < 32 || b > 126 { - return '.' - } - return b -} - -func (h *dumper) Write(data []byte) (n int, err error) { - if h.closed { - return 0, fmt.Errorf("encoding/hex: dumper closed") - } - - // Output lines look like: - // 00000010 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d |./0123456789:;<=| - // ^ offset ^ extra space ^ ASCII of line. - for i := range data { - if h.used == 0 { - // At the beginning of a line we print the current - // offset in hex. - h.buf[0] = byte(h.n >> 24) - h.buf[1] = byte(h.n >> 16) - h.buf[2] = byte(h.n >> 8) - h.buf[3] = byte(h.n) - Encode(h.buf[4:], h.buf[:4]) - h.buf[12] = ' ' - h.buf[13] = ' ' - _, err = h.w.Write(h.buf[4:]) - if err != nil { - return - } - } - Encode(h.buf[:], data[i:i+1]) - h.buf[2] = ' ' - l := 3 - if h.used == 7 { - // There's an additional space after the 8th byte. - h.buf[3] = ' ' - l = 4 - } else if h.used == 15 { - // At the end of the line there's an extra space and - // the bar for the right column. - h.buf[3] = ' ' - h.buf[4] = '|' - l = 5 - } - _, err = h.w.Write(h.buf[:l]) - if err != nil { - return - } - n++ - h.rightChars[h.used] = toChar(data[i]) - h.used++ - h.n++ - if h.used == 16 { - h.rightChars[16] = '|' - h.rightChars[17] = '\n' - _, err = h.w.Write(h.rightChars[:]) - if err != nil { - return - } - h.used = 0 - } - } - return -} - -func (h *dumper) Close() (err error) { - // See the comments in Write() for the details of this format. - if h.closed { - return - } - h.closed = true - if h.used == 0 { - return - } - h.buf[0] = ' ' - h.buf[1] = ' ' - h.buf[2] = ' ' - h.buf[3] = ' ' - h.buf[4] = '|' - nBytes := h.used - for h.used < 16 { - l := 3 - if h.used == 7 { - l = 4 - } else if h.used == 15 { - l = 5 - } - _, err = h.w.Write(h.buf[:l]) - if err != nil { - return - } - h.used++ - } - h.rightChars[nBytes] = '|' - h.rightChars[nBytes+1] = '\n' - _, err = h.w.Write(h.rightChars[:nBytes+2]) - return -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/hex_gzip.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/hex_gzip.go deleted file mode 100644 index 251b2dda2..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/hex_gzip.go +++ /dev/null @@ -1,112 +0,0 @@ -package resolver - -import ( - "bytes" - "compress/gzip" - "io" - "io/ioutil" - "os" - "strings" - "sync" - - "github.com/gobuffalo/packr/v2/file/resolver/encoding/hex" - "github.com/gobuffalo/packr/v2/plog" - - "github.com/gobuffalo/packr/v2/file" -) - -var _ Resolver = &HexGzip{} - -type HexGzip struct { - packed map[string]string - unpacked map[string]string - moot *sync.RWMutex -} - -func (hg HexGzip) String() string { - return String(&hg) -} - -var _ file.FileMappable = &HexGzip{} - -func (hg *HexGzip) FileMap() map[string]file.File { - hg.moot.RLock() - var names []string - for k := range hg.packed { - names = append(names, k) - } - hg.moot.RUnlock() - m := map[string]file.File{} - for _, n := range names { - if f, err := hg.Resolve("", n); err == nil { - m[n] = f - } - } - return m -} - -func (hg *HexGzip) Resolve(box string, name string) (file.File, error) { - plog.Debug(hg, "Resolve", "box", box, "name", name) - hg.moot.Lock() - defer hg.moot.Unlock() - - if s, ok := hg.unpacked[name]; ok { - return file.NewFile(name, []byte(s)) - } - packed, ok := hg.packed[name] - if !ok { - return nil, os.ErrNotExist - } - - unpacked, err := UnHexGzipString(packed) - if err != nil { - return nil, err - } - - f, err := file.NewFile(OsPath(name), []byte(unpacked)) - if err != nil { - return nil, err - } - hg.unpacked[name] = f.String() - return f, nil -} - -func NewHexGzip(files map[string]string) (*HexGzip, error) { - if files == nil { - files = map[string]string{} - } - - hg := &HexGzip{ - packed: files, - unpacked: map[string]string{}, - moot: &sync.RWMutex{}, - } - - return hg, nil -} - -func HexGzipString(s string) (string, error) { - bb := &bytes.Buffer{} - enc := hex.NewEncoder(bb) - zw := gzip.NewWriter(enc) - io.Copy(zw, strings.NewReader(s)) - zw.Close() - - return bb.String(), nil -} - -func UnHexGzipString(packed string) (string, error) { - br := bytes.NewBufferString(packed) - dec := hex.NewDecoder(br) - zr, err := gzip.NewReader(dec) - if err != nil { - return "", err - } - defer zr.Close() - - b, err := ioutil.ReadAll(zr) - if err != nil { - return "", err - } - return string(b), nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/ident.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/ident.go deleted file mode 100644 index 0b90d1f4d..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/ident.go +++ /dev/null @@ -1,21 +0,0 @@ -package resolver - -import ( - "path/filepath" - "runtime" - "strings" -) - -func Key(s string) string { - s = strings.Replace(s, "\\", "/", -1) - return s -} - -func OsPath(s string) string { - if runtime.GOOS == "windows" { - s = strings.Replace(s, "/", string(filepath.Separator), -1) - } else { - s = strings.Replace(s, "\\", string(filepath.Separator), -1) - } - return s -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/in_memory.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/in_memory.go deleted file mode 100644 index 9b11a4e87..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/in_memory.go +++ /dev/null @@ -1,63 +0,0 @@ -package resolver - -import ( - "io/ioutil" - - "github.com/gobuffalo/packd" - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/plog" -) - -var _ Resolver = &InMemory{} - -type InMemory struct { - *packd.MemoryBox -} - -func (d InMemory) String() string { - return String(&d) -} - -func (d *InMemory) Resolve(box string, name string) (file.File, error) { - b, err := d.MemoryBox.Find(name) - if err != nil { - return nil, err - } - return file.NewFile(name, b) -} - -func (d *InMemory) Pack(name string, f file.File) error { - plog.Debug(d, "Pack", "name", name) - b, err := ioutil.ReadAll(f) - if err != nil { - return err - } - d.AddBytes(name, b) - return nil -} - -func (d *InMemory) FileMap() map[string]file.File { - m := map[string]file.File{} - d.Walk(func(path string, file file.File) error { - m[path] = file - return nil - }) - return m -} - -func NewInMemory(files map[string]file.File) *InMemory { - if files == nil { - files = map[string]file.File{} - } - box := packd.NewMemoryBox() - - for p, f := range files { - if b, err := ioutil.ReadAll(f); err == nil { - box.AddBytes(p, b) - } - } - - return &InMemory{ - MemoryBox: box, - } -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/packable.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/packable.go deleted file mode 100644 index ee551fcc0..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/packable.go +++ /dev/null @@ -1,7 +0,0 @@ -package resolver - -import "github.com/gobuffalo/packr/v2/file" - -type Packable interface { - Pack(name string, f file.File) error -} diff --git a/vendor/github.com/gobuffalo/packr/v2/file/resolver/resolver.go b/vendor/github.com/gobuffalo/packr/v2/file/resolver/resolver.go deleted file mode 100644 index 8b00397ab..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/file/resolver/resolver.go +++ /dev/null @@ -1,33 +0,0 @@ -package resolver - -import ( - "encoding/json" - "fmt" - "os" - - "github.com/gobuffalo/packr/v2/file" -) - -type Resolver interface { - Resolve(string, string) (file.File, error) -} - -func defaultResolver() Resolver { - pwd, _ := os.Getwd() - return &Disk{ - Root: pwd, - } -} - -var DefaultResolver = defaultResolver() - -func String(r Resolver) string { - m := map[string]interface{}{ - "name": fmt.Sprintf("%T", r), - } - if fm, ok := r.(file.FileMappable); ok { - m["files"] = fm - } - b, _ := json.Marshal(m) - return string(b) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/go.mod b/vendor/github.com/gobuffalo/packr/v2/go.mod deleted file mode 100644 index 306ea555b..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/go.mod +++ /dev/null @@ -1,16 +0,0 @@ -module github.com/gobuffalo/packr/v2 - -go 1.12 - -require ( - github.com/gobuffalo/envy v1.7.0 - github.com/gobuffalo/logger v1.0.0 - github.com/gobuffalo/packd v0.3.0 - github.com/karrick/godirwalk v1.10.12 - github.com/rogpeppe/go-internal v1.3.0 - github.com/sirupsen/logrus v1.4.2 - github.com/spf13/cobra v0.0.5 - github.com/stretchr/testify v1.3.0 - golang.org/x/sync v0.0.0-20190423024810-112230192c58 - golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c -) diff --git a/vendor/github.com/gobuffalo/packr/v2/go.sum b/vendor/github.com/gobuffalo/packr/v2/go.sum deleted file mode 100644 index 6309043e1..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/go.sum +++ /dev/null @@ -1,77 +0,0 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -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/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= -github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= -github.com/gobuffalo/logger v1.0.0 h1:xw9Ko9EcC5iAFprrjJ6oZco9UpzS5MQ4jAwghsLHdy4= -github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs= -github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4= -github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= -github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= -github.com/karrick/godirwalk v1.10.12 h1:BqUm+LuJcXjGv1d2mj3gBiQyrQ57a0rYoAmhvJQ7RDU= -github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -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 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -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/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -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/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -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/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/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-20190621222207-cc06ce4a13d4 h1:ydJNl0ENAG67pFbB+9tfhiL2pYqLhfoaZFw/cjLhY4A= -golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -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/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/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-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-20190515120540-06a5c4944438 h1:khxRGsvPk4n2y8I/mLLjp7e5dMTJmH75wvqS6nMwUtY= -golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c h1:KfpJVdWhuRqNk4XVXzjXf2KAV4TBEP77SYdFGjeGuIE= -golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gobuffalo/packr/v2/helpers.go b/vendor/github.com/gobuffalo/packr/v2/helpers.go deleted file mode 100644 index 072afcb8f..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/helpers.go +++ /dev/null @@ -1,73 +0,0 @@ -package packr - -import ( - "os" - "path/filepath" - "runtime" - "strings" - - "github.com/gobuffalo/envy" - "github.com/gobuffalo/packr/v2/plog" -) - -func construct(name string, path string) *Box { - return &Box{ - Path: path, - Name: name, - ResolutionDir: resolutionDir(path), - resolvers: resolversMap{}, - dirs: dirsMap{}, - } -} - -func resolutionDirTestFilename(filename, og string) (string, bool) { - ng := filepath.Join(filepath.Dir(filename), og) - - // // this little hack courtesy of the `-cover` flag!! - cov := filepath.Join("_test", "_obj_test") - ng = strings.Replace(ng, string(filepath.Separator)+cov, "", 1) - - if resolutionDirExists(ng, og) { - return ng, true - } - - ng = filepath.Join(envy.GoPath(), "src", ng) - if resolutionDirExists(ng, og) { - return ng, true - } - - return og, false -} - -func resolutionDirExists(s, og string) bool { - _, err := os.Stat(s) - if err != nil { - return false - } - plog.Debug("packr", "resolutionDir", "original", og, "resolved", s) - return true -} - -func resolutionDir(og string) string { - ng, _ := filepath.Abs(og) - - if resolutionDirExists(ng, og) { - return ng - } - - // packr.New - _, filename, _, _ := runtime.Caller(3) - ng, ok := resolutionDirTestFilename(filename, og) - if ok { - return ng - } - - // packr.NewBox (deprecated) - _, filename, _, _ = runtime.Caller(4) - ng, ok = resolutionDirTestFilename(filename, og) - if ok { - return ng - } - - return og -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/.gitignore b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/LICENSE b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/LICENSE deleted file mode 100644 index 649efd437..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Mark Bates - -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/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/Makefile b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/Makefile deleted file mode 100644 index 0ac539f1c..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/Makefile +++ /dev/null @@ -1,61 +0,0 @@ -TAGS ?= "" -GO_BIN ?= "go" - -install: - $(GO_BIN) install -tags ${TAGS} -v . - make tidy - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - make tidy - -build: - $(GO_BIN) build -v . - make tidy - -test: - $(GO_BIN) test -cover -tags ${TAGS} ./... - make tidy - -ci-deps: - $(GO_BIN) get -tags ${TAGS} -t ./... - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - go get github.com/golangci/golangci-lint/cmd/golangci-lint - golangci-lint run --enable-all - make tidy - -update: -ifeq ($(GO111MODULE),on) - rm go.* - $(GO_BIN) mod init - $(GO_BIN) mod tidy -else - $(GO_BIN) get -u -tags ${TAGS} -endif - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -release: - $(GO_BIN) get github.com/gobuffalo/release - make tidy - release -y -f version.go --skip-packr - make tidy - - - diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/SHOULDERS.md b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/SHOULDERS.md deleted file mode 100644 index b19072e9f..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/SHOULDERS.md +++ /dev/null @@ -1,6 +0,0 @@ -# github.com/markbates/errx Stands on the Shoulders of Giants - -github.com/markbates/errx does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants, this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-pipelines.yml b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-pipelines.yml deleted file mode 100644 index 417e2c579..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-pipelines.yml +++ /dev/null @@ -1,71 +0,0 @@ -variables: - GOBIN: "$(GOPATH)/bin" # Go binaries path - GOPATH: "$(system.defaultWorkingDirectory)/gopath" # Go workspace path - modulePath: "$(GOPATH)/src/github.com/$(build.repository.name)" # Path to the module"s code - -jobs: -- job: Windows - pool: - vmImage: "vs2017-win2016" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: macOS - pool: - vmImage: "macOS-10.13" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml - -- job: Linux - pool: - vmImage: "ubuntu-16.04" - strategy: - matrix: - go 1.10: - go_version: "1.10" - go 1.11 (on): - go_version: "1.11.5" - GO111MODULE: "on" - go 1.11 (off): - go_version: "1.11.5" - GO111MODULE: "off" - go 1.12 (on): - go_version: "1.12" - GO111MODULE: "on" - go 1.12 (off): - go_version: "1.12" - GO111MODULE: "off" - steps: - - template: azure-tests.yml diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-tests.yml b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-tests.yml deleted file mode 100644 index eea5822fa..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/azure-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -steps: - - task: GoTool@0 - inputs: - version: $(go_version) - - task: Bash@3 - inputs: - targetType: inline - script: | - mkdir -p "$(GOBIN)" - mkdir -p "$(GOPATH)/pkg" - mkdir -p "$(modulePath)" - shopt -s extglob - mv !(gopath) "$(modulePath)" - displayName: "Setup Go Workspace" - - script: | - go get -t -v ./... - go test -race ./... - workingDirectory: "$(modulePath)" - displayName: "Tests" diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/errx.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/errx.go deleted file mode 100644 index 5a6f6398c..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/errx.go +++ /dev/null @@ -1,23 +0,0 @@ -package errx - -// go2 errors -type Wrapper interface { - Unwrap() error -} - -// pkg/errors -type Causer interface { - Cause() error -} - -func Unwrap(err error) error { - switch e := err.(type) { - case Wrapper: - return e.Unwrap() - case Causer: - return e.Cause() - } - return err -} - -var Cause = Unwrap diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/version.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/version.go deleted file mode 100644 index 82e25a1a9..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package errx - -// Version of errx -const Version = "v1.0.0" diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/.gitignore b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/LICENSE b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/LICENSE deleted file mode 100644 index a538bcbf2..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Mark Bates - -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/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/Makefile b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/Makefile deleted file mode 100644 index 187cb8a3f..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/Makefile +++ /dev/null @@ -1,40 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: - packr - $(GO_BIN) install -v . - -deps: - $(GO_BIN) get github.com/gobuffalo/release - $(GO_BIN) get github.com/gobuffalo/packr/packr - $(GO_BIN) get -tags ${TAGS} -t ./... - $(GO_BIN) mod tidy - -build: - packr - $(GO_BIN) build -v . - -test: - packr - $(GO_BIN) test -tags ${TAGS} ./... - -ci-test: deps - $(GO_BIN) test -tags ${TAGS} -race ./... - -lint: - gometalinter --vendor ./... --deadline=1m --skip=internal - -update: - $(GO_BIN) get -u -tags ${TAGS} - $(GO_BIN) mod tidy - packr - make test - make install - $(GO_BIN) mod tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - -release: - release -y -f version.go diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/deprecate.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/deprecate.go deleted file mode 100644 index 4eb3a443e..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/deprecate.go +++ /dev/null @@ -1,20 +0,0 @@ -package oncer - -import ( - "fmt" - "io" - "os" -) - -const deprecated = "DEPRECATED" - -var deprecationWriter io.Writer = os.Stdout - -func Deprecate(depth int, name string, msg string) { - Do(deprecated+name, func() { - fmt.Fprintf(deprecationWriter, "[%s] %s has been deprecated.\n", deprecated, name) - if len(msg) > 0 { - fmt.Fprintf(deprecationWriter, "\t%s\n", msg) - } - }) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log.go deleted file mode 100644 index ed4346396..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log.go +++ /dev/null @@ -1,7 +0,0 @@ -//+build !debug - -package oncer - -func log(name string, fn func()) func() { - return fn -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log_debug.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log_debug.go deleted file mode 100644 index 76d0e1149..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/log_debug.go +++ /dev/null @@ -1,19 +0,0 @@ -//+build debug - -package oncer - -import ( - "fmt" - "time" -) - -func log(name string, fn func()) func() { - return func() { - start := time.Now() - if len(name) > 80 { - name = name[(len(name) - 80):] - } - defer fmt.Println(name, time.Now().Sub(start)) - fn() - } -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/oncer.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/oncer.go deleted file mode 100644 index 5b3ab8df0..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer/oncer.go +++ /dev/null @@ -1,26 +0,0 @@ -package oncer - -import ( - "sync" -) - -var onces = &sync.Map{} - -func Do(name string, fn func()) { - o, _ := onces.LoadOrStore(name, &sync.Once{}) - if once, ok := o.(*sync.Once); ok { - once.Do(log(name, fn)) - } -} - -func Reset(names ...string) { - if len(names) == 0 { - onces = &sync.Map{} - return - } - - for _, n := range names { - onces.Delete(n) - onces.Delete(deprecated + n) - } -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gitignore b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gitignore deleted file mode 100644 index 368971859..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -*.log -.DS_Store -doc -tmp -pkg -*.gem -*.pid -coverage -coverage.data -build/* -*.pbxuser -*.mode1v3 -.svn -profile -.console_history -.sass-cache/* -.rake_tasks~ -*.log.lck -solr/ -.jhw-cache/ -jhw.* -*.sublime* -node_modules/ -dist/ -generated/ -.vendor/ -bin/* -gin-bin -.idea/ diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gometalinter.json b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gometalinter.json deleted file mode 100644 index e4f65a36e..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.gometalinter.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Enable": ["vet", "golint", "goimports", "deadcode", "gotype", "ineffassign", "misspell", "nakedret", "unconvert", "megacheck", "varcheck"] -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.travis.yml b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.travis.yml deleted file mode 100644 index cf1d2c7d4..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/.travis.yml +++ /dev/null @@ -1,26 +0,0 @@ -language: go - -sudo: false - -matrix: - include: - - go: "1.9.x" - - go: "1.10.x" - - go: "1.11.x" - env: - - GO111MODULE=off - - go: "1.11.x" - env: - - GO111MODULE=on - - go: "tip" - env: - - GO111MODULE=off - - go: "tip" - env: - - GO111MODULE=on - allow_failures: - - go: "tip" - -install: make deps - -script: make ci-test diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/LICENSE b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/LICENSE deleted file mode 100644 index a538bcbf2..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Mark Bates - -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/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/Makefile b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/Makefile deleted file mode 100644 index e0e2f3baa..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/Makefile +++ /dev/null @@ -1,55 +0,0 @@ -TAGS ?= "sqlite" -GO_BIN ?= go - -install: - packr - $(GO_BIN) install -tags ${TAGS} -v . - make tidy - -tidy: -ifeq ($(GO111MODULE),on) - $(GO_BIN) mod tidy -else - echo skipping go mod tidy -endif - -deps: - $(GO_BIN) get github.com/gobuffalo/release - $(GO_BIN) get github.com/gobuffalo/packr/packr - $(GO_BIN) get -tags ${TAGS} -t ./... - make tidy - -build: - packr - $(GO_BIN) build -v . - make tidy - -test: - packr - $(GO_BIN) test -tags ${TAGS} ./... - make tidy - -ci-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -lint: - gometalinter --vendor ./... --deadline=1m --skip=internal - make tidy - -update: - $(GO_BIN) get -u -tags ${TAGS} - make tidy - packr - make test - make install - make tidy - -release-test: - $(GO_BIN) test -tags ${TAGS} -race ./... - make tidy - -release: - make tidy - release -y -f version.go - make tidy diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/safe.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/safe.go deleted file mode 100644 index a40d2083e..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/safe.go +++ /dev/null @@ -1,33 +0,0 @@ -package safe - -import ( - "errors" - "fmt" -) - -// Run the function safely knowing that if it panics -// the panic will be caught and returned as an error -func Run(fn func()) (err error) { - return RunE(func() error { - fn() - return nil - }) -} - -// Run the function safely knowing that if it panics -// the panic will be caught and returned as an error -func RunE(fn func() error) (err error) { - defer func() { - if err != nil { - return - } - if ex := recover(); ex != nil { - if e, ok := ex.(error); ok { - err = e - return - } - err = errors.New(fmt.Sprint(ex)) - } - }() - return fn() -} diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/shoulders.md b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/shoulders.md deleted file mode 100644 index a3821f2ad..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/shoulders.md +++ /dev/null @@ -1,8 +0,0 @@ -# github.com/markbates/safe Stands on the Shoulders of Giants - -github.com/markbates/safe does not try to reinvent the wheel! Instead, it uses the already great wheels developed by the Go community and puts them all together in the best way possible. Without these giants this project would not be possible. Please make sure to check them out and thank them for all of their hard work. - -Thank you to the following **GIANTS**: - - -* [github.com/markbates/safe](https://godoc.org/github.com/markbates/safe) diff --git a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/version.go b/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/version.go deleted file mode 100644 index e655dc5e3..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package safe - -const Version = "v1.0.1" diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/pack.go b/vendor/github.com/gobuffalo/packr/v2/jam/pack.go deleted file mode 100644 index 71191a5d3..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/pack.go +++ /dev/null @@ -1,113 +0,0 @@ -package jam - -import ( - "context" - "encoding/json" - "io" - "os" - "os/exec" - "time" - - "github.com/gobuffalo/packr/v2/jam/parser" - "github.com/gobuffalo/packr/v2/jam/store" - "github.com/gobuffalo/packr/v2/plog" -) - -// PackOptions ... -type PackOptions struct { - IgnoreImports bool - Legacy bool - StoreCmd string - Roots []string - RootsOptions *parser.RootsOptions -} - -// Pack the roots given + PWD -func Pack(opts PackOptions) error { - pwd, err := os.Getwd() - if err != nil { - return err - } - - opts.Roots = append(opts.Roots, pwd) - if err := Clean(opts.Roots...); err != nil { - return err - } - - if opts.RootsOptions == nil { - opts.RootsOptions = &parser.RootsOptions{} - } - - if opts.IgnoreImports { - opts.RootsOptions.IgnoreImports = true - } - - p, err := parser.NewFromRoots(opts.Roots, opts.RootsOptions) - if err != nil { - return err - } - boxes, err := p.Run() - if err != nil { - return err - } - - // reduce boxes - remove ones we don't want - // MB: current assumption is we want all these - // boxes, just adding a comment suggesting they're - // might be a reason to exclude some - - plog.Logger.Debugf("found %d boxes", len(boxes)) - - if len(opts.StoreCmd) != 0 { - return ShellPack(opts, boxes) - } - - var st store.Store = store.NewDisk("", "") - - if opts.Legacy { - st = store.NewLegacy() - } - - for _, b := range boxes { - if b.Name == store.DISK_GLOBAL_KEY { - continue - } - if err := st.Pack(b); err != nil { - return err - } - } - if cl, ok := st.(io.Closer); ok { - return cl.Close() - } - return nil -} - -// ShellPack ... -func ShellPack(opts PackOptions, boxes parser.Boxes) error { - b, err := json.Marshal(boxes) - if err != nil { - return err - } - ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) - defer cancel() - c := exec.CommandContext(ctx, opts.StoreCmd, string(b)) - c.Stdout = os.Stdout - c.Stderr = os.Stderr - return c.Run() - -} - -// Clean ... -func Clean(args ...string) error { - pwd, err := os.Getwd() - if err != nil { - return err - } - args = append(args, pwd) - for _, root := range args { - if err := store.Clean(root); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/args.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/args.go deleted file mode 100644 index 00ee164c7..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/args.go +++ /dev/null @@ -1,52 +0,0 @@ -package parser - -import ( - "encoding/json" - "fmt" -) - -// FromArgs is useful when writing packr store-cmd binaries. -/* - package main - - import ( - "log" - "os" - - "github.com/gobuffalo/packr/v2/jam/parser" - "github.com/markbates/s3packr/s3packr" - ) - - func main() { - err := parser.FromArgs(os.Args[1:], func(boxes parser.Boxes) error { - for _, box := range boxes { - s3 := s3packr.New(box) - if err := s3.Pack(box); err != nil { - return err - } - } - return nil - }) - - if err != nil { - log.Fatal(err) - } - } -*/ -func FromArgs(args []string, fn func(Boxes) error) error { - if len(args) == 0 { - return fmt.Errorf("you must supply a payload") - } - payload := args[0] - if len(payload) == 0 { - return fmt.Errorf("you must supply a payload") - } - - var boxes Boxes - err := json.Unmarshal([]byte(payload), &boxes) - if err != nil { - return err - } - - return fn(boxes) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/box.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/box.go deleted file mode 100644 index 1e64a5808..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/box.go +++ /dev/null @@ -1,40 +0,0 @@ -package parser - -import ( - "encoding/json" - "os" - "strings" -) - -// Box found while parsing a file -type Box struct { - Name string // name of the box - Path string // relative path of folder NewBox("./templates") - AbsPath string // absolute path of Path - Package string // the package name the box was found in - PWD string // the PWD when the parser was run - PackageDir string // the absolute path of the package where the box was found -} - -type Boxes []*Box - -// String - json returned -func (b Box) String() string { - x, _ := json.Marshal(b) - return string(x) -} - -// NewBox stub from the name and the path provided -func NewBox(name string, path string) *Box { - if len(name) == 0 { - name = path - } - name = strings.Replace(name, "\"", "", -1) - pwd, _ := os.Getwd() - box := &Box{ - Name: name, - Path: path, - PWD: pwd, - } - return box -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/file.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/file.go deleted file mode 100644 index 742da4816..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/file.go +++ /dev/null @@ -1,54 +0,0 @@ -package parser - -import ( - "bytes" - "io" - "io/ioutil" - "path/filepath" -) - -// File that is to be parsed -type File struct { - io.Reader - Path string - AbsPath string -} - -// Name of the file "app.go" -func (f File) Name() string { - return f.Path -} - -// String returns the contents of the reader -func (f *File) String() string { - src, _ := ioutil.ReadAll(f) - f.Reader = bytes.NewReader(src) - return string(src) -} - -func (s *File) Write(p []byte) (int, error) { - bb := &bytes.Buffer{} - i, err := bb.Write(p) - s.Reader = bb - return i, err -} - -// NewFile takes the name of the file you want to -// write to and a reader to reader from -func NewFile(path string, r io.Reader) *File { - if r == nil { - r = &bytes.Buffer{} - } - if seek, ok := r.(io.Seeker); ok { - seek.Seek(0, 0) - } - abs := path - if !filepath.IsAbs(path) { - abs, _ = filepath.Abs(path) - } - return &File{ - Reader: r, - Path: path, - AbsPath: abs, - } -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/finder.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/finder.go deleted file mode 100644 index db194ddbf..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/finder.go +++ /dev/null @@ -1,101 +0,0 @@ -package parser - -import ( - "fmt" - "go/build" - "path/filepath" - "strings" - "time" - - "github.com/gobuffalo/packr/v2/plog" - "github.com/karrick/godirwalk" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer" -) - -type finder struct { - id time.Time -} - -func (fd *finder) key(m, dir string) string { - return fmt.Sprintf("%s-*parser.finder#%s-%s", fd.id, m, dir) -} - -// findAllGoFiles *.go files for a given diretory -func (fd *finder) findAllGoFiles(dir string) ([]string, error) { - var err error - var names []string - oncer.Do(fd.key("findAllGoFiles", dir), func() { - plog.Debug(fd, "findAllGoFiles", "dir", dir) - - callback := func(path string, do *godirwalk.Dirent) error { - ext := filepath.Ext(path) - if ext != ".go" { - return nil - } - names = append(names, path) - return nil - } - err = godirwalk.Walk(dir, &godirwalk.Options{ - FollowSymbolicLinks: true, - Callback: callback, - }) - }) - - return names, err -} - -func (fd *finder) findAllGoFilesImports(dir string) ([]string, error) { - var err error - var names []string - oncer.Do(fd.key("findAllGoFilesImports", dir), func() { - ctx := build.Default - - if len(ctx.SrcDirs()) == 0 { - err = fmt.Errorf("no src directories found") - return - } - - pkg, err := ctx.ImportDir(dir, 0) - if strings.HasPrefix(pkg.ImportPath, "github.com/gobuffalo/packr") { - return - } - - if err != nil { - if !strings.Contains(err.Error(), "cannot find package") { - if _, ok := errx.Unwrap(err).(*build.NoGoError); !ok { - err = err - return - } - } - } - - if pkg.Goroot { - return - } - if len(pkg.GoFiles) <= 0 { - return - } - - plog.Debug(fd, "findAllGoFilesImports", "dir", dir) - - names, _ = fd.findAllGoFiles(dir) - for _, n := range pkg.GoFiles { - names = append(names, filepath.Join(pkg.Dir, n)) - } - for _, imp := range pkg.Imports { - if len(ctx.SrcDirs()) == 0 { - continue - } - d := ctx.SrcDirs()[len(ctx.SrcDirs())-1] - ip := filepath.Join(d, imp) - n, err := fd.findAllGoFilesImports(ip) - if err != nil && len(n) != 0 { - names = n - return - } - names = append(names, n...) - } - }) - return names, err -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/gogen.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/gogen.go deleted file mode 100644 index e57964543..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/gogen.go +++ /dev/null @@ -1,43 +0,0 @@ -package parser - -import ( - "go/ast" - "go/parser" - "go/token" - "io" - "strings" - - "github.com/gobuffalo/packd" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx" -) - -// ParsedFile ... -type ParsedFile struct { - File packd.SimpleFile - FileSet *token.FileSet - Ast *ast.File - Lines []string -} - -// ParseFileMode ... -func ParseFileMode(gf packd.SimpleFile, mode parser.Mode) (ParsedFile, error) { - pf := ParsedFile{ - FileSet: token.NewFileSet(), - File: gf, - } - - src := gf.String() - f, err := parser.ParseFile(pf.FileSet, gf.Name(), src, mode) - if err != nil && errx.Unwrap(err) != io.EOF { - return pf, err - } - pf.Ast = f - - pf.Lines = strings.Split(src, "\n") - return pf, nil -} - -// ParseFile ... -func ParseFile(gf packd.SimpleFile) (ParsedFile, error) { - return ParseFileMode(gf, 0) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/parser.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/parser.go deleted file mode 100644 index eb1af7578..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/parser.go +++ /dev/null @@ -1,46 +0,0 @@ -package parser - -import ( - "os" - "sort" - "strings" - - "github.com/gobuffalo/packr/v2/plog" -) - -// Parser to find boxes -type Parser struct { - Prospects []*File // a list of files to check for boxes - IgnoreImports bool -} - -// Run the parser and run any boxes found -func (p *Parser) Run() (Boxes, error) { - var boxes Boxes - for _, pros := range p.Prospects { - plog.Debug(p, "Run", "parsing", pros.Name()) - v := NewVisitor(pros) - pbr, err := v.Run() - if err != nil { - return boxes, err - } - for _, b := range pbr { - plog.Debug(p, "Run", "file", pros.Name(), "box", b.Name) - boxes = append(boxes, b) - } - } - - pwd, _ := os.Getwd() - sort.Slice(boxes, func(a, b int) bool { - b1 := boxes[a] - return !strings.HasPrefix(b1.AbsPath, pwd) - }) - return boxes, nil -} - -// New Parser from a list of File -func New(prospects ...*File) *Parser { - return &Parser{ - Prospects: prospects, - } -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/prospect.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/prospect.go deleted file mode 100644 index 652db5b3f..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/prospect.go +++ /dev/null @@ -1,77 +0,0 @@ -package parser - -import ( - "os" - "path/filepath" - "strings" - - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/plog" -) - -var DefaultIgnoredFolders = []string{".", "_", "vendor", "node_modules", "_fixtures", "testdata"} - -func IsProspect(path string, ignore ...string) (status bool) { - // plog.Debug("parser", "IsProspect", "path", path, "ignore", ignore) - defer func() { - if status { - plog.Debug("parser", "IsProspect (TRUE)", "path", path, "status", status) - } - }() - if path == "." { - return true - } - - ext := filepath.Ext(path) - dir := filepath.Dir(path) - - fi, _ := os.Stat(path) - if fi != nil { - if fi.IsDir() { - dir = filepath.Base(path) - } else { - if len(ext) > 0 { - dir = filepath.Base(filepath.Dir(path)) - } - } - } - - path = strings.ToLower(path) - dir = strings.ToLower(dir) - - if strings.HasSuffix(path, "-packr.go") { - return false - } - - if strings.HasSuffix(path, "_test.go") { - return false - } - - ignore = append(ignore, DefaultIgnoredFolders...) - for i, x := range ignore { - ignore[i] = strings.TrimSpace(strings.ToLower(x)) - } - - parts := strings.Split(resolver.OsPath(path), string(filepath.Separator)) - if len(parts) == 0 { - return false - } - - for _, i := range ignore { - for _, p := range parts { - if strings.HasPrefix(p, i) { - return false - } - } - } - - un := filepath.Base(path) - if len(ext) != 0 { - un = filepath.Base(filepath.Dir(path)) - } - if strings.HasPrefix(un, "_") { - return false - } - - return ext == ".go" -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/roots.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/roots.go deleted file mode 100644 index ad4e09ff0..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/roots.go +++ /dev/null @@ -1,89 +0,0 @@ -package parser - -import ( - "bytes" - "encoding/json" - "io/ioutil" - "os" - "path/filepath" - "time" - - "github.com/gobuffalo/packr/v2/plog" - "github.com/karrick/godirwalk" -) - -type RootsOptions struct { - IgnoreImports bool - Ignores []string -} - -func (r RootsOptions) String() string { - x, _ := json.Marshal(r) - return string(x) -} - -// NewFromRoots scans the file roots provided and returns a -// new Parser containing the prospects -func NewFromRoots(roots []string, opts *RootsOptions) (*Parser, error) { - if opts == nil { - opts = &RootsOptions{} - } - - if len(roots) == 0 { - pwd, _ := os.Getwd() - roots = append(roots, pwd) - } - p := New() - plog.Debug(p, "NewFromRoots", "roots", roots, "options", opts) - callback := func(path string, de *godirwalk.Dirent) error { - if IsProspect(path, opts.Ignores...) { - if de.IsDir() { - return nil - } - roots = append(roots, path) - return nil - } - if de.IsDir() { - return filepath.SkipDir - } - return nil - } - wopts := &godirwalk.Options{ - FollowSymbolicLinks: true, - Callback: callback, - } - for _, root := range roots { - plog.Debug(p, "NewFromRoots", "walking", root) - err := godirwalk.Walk(root, wopts) - if err != nil { - return p, err - } - } - - dd := map[string]string{} - fd := &finder{id: time.Now()} - for _, r := range roots { - var names []string - if opts.IgnoreImports { - names, _ = fd.findAllGoFiles(r) - } else { - names, _ = fd.findAllGoFilesImports(r) - } - for _, n := range names { - if IsProspect(n) { - plog.Debug(p, "NewFromRoots", "mapping", n) - dd[n] = n - } - } - } - for path := range dd { - plog.Debug(p, "NewFromRoots", "reading file", path) - b, err := ioutil.ReadFile(path) - if err != nil { - return nil, err - } - p.Prospects = append(p.Prospects, NewFile(path, bytes.NewReader(b))) - } - plog.Debug(p, "NewFromRoots", "found prospects", len(p.Prospects)) - return p, nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/parser/visitor.go b/vendor/github.com/gobuffalo/packr/v2/jam/parser/visitor.go deleted file mode 100644 index bc96244d4..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/parser/visitor.go +++ /dev/null @@ -1,324 +0,0 @@ -package parser - -import ( - "fmt" - "go/ast" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/gobuffalo/packd" -) - -type Visitor struct { - File packd.SimpleFile - Package string - boxes map[string]*Box - errors []error -} - -func NewVisitor(f *File) *Visitor { - return &Visitor{ - File: f, - boxes: map[string]*Box{}, - errors: []error{}, - } -} - -func (v *Visitor) Run() (Boxes, error) { - var boxes Boxes - pf, err := ParseFile(v.File) - if err != nil { - return boxes, err - } - - v.Package = pf.Ast.Name.Name - ast.Walk(v, pf.Ast) - - for _, vb := range v.boxes { - boxes = append(boxes, vb) - } - - sort.Slice(boxes, func(i, j int) bool { - return boxes[i].Name < boxes[j].Name - }) - - if len(v.errors) > 0 { - s := make([]string, len(v.errors)) - for i, e := range v.errors { - s[i] = e.Error() - } - return boxes, err - } - return boxes, nil -} - -func (v *Visitor) Visit(node ast.Node) ast.Visitor { - if node == nil { - return v - } - if err := v.eval(node); err != nil { - v.errors = append(v.errors, err) - } - - return v -} - -func (v *Visitor) eval(node ast.Node) error { - switch t := node.(type) { - case *ast.CallExpr: - return v.evalExpr(t) - case *ast.Ident: - return v.evalIdent(t) - case *ast.GenDecl: - for _, n := range t.Specs { - if err := v.eval(n); err != nil { - return err - } - } - case *ast.FuncDecl: - if t.Body == nil { - return nil - } - for _, b := range t.Body.List { - if err := v.evalStmt(b); err != nil { - return err - } - } - return nil - case *ast.ValueSpec: - for _, e := range t.Values { - if err := v.evalExpr(e); err != nil { - return err - } - } - } - return nil -} - -func (v *Visitor) evalStmt(stmt ast.Stmt) error { - switch t := stmt.(type) { - case *ast.ExprStmt: - return v.evalExpr(t.X) - case *ast.AssignStmt: - for _, e := range t.Rhs { - if err := v.evalArgs(e); err != nil { - return err - } - } - } - return nil -} - -func (v *Visitor) evalExpr(expr ast.Expr) error { - switch t := expr.(type) { - case *ast.CallExpr: - if t.Fun == nil { - return nil - } - for _, a := range t.Args { - switch at := a.(type) { - case *ast.CallExpr: - if sel, ok := t.Fun.(*ast.SelectorExpr); ok { - return v.evalSelector(at, sel) - } - - if err := v.evalArgs(at); err != nil { - return err - } - case *ast.CompositeLit: - for _, e := range at.Elts { - if err := v.evalExpr(e); err != nil { - return err - } - } - } - } - if ft, ok := t.Fun.(*ast.SelectorExpr); ok { - return v.evalSelector(t, ft) - } - case *ast.KeyValueExpr: - return v.evalExpr(t.Value) - } - return nil -} - -func (v *Visitor) evalArgs(expr ast.Expr) error { - switch at := expr.(type) { - case *ast.CompositeLit: - for _, e := range at.Elts { - if err := v.evalExpr(e); err != nil { - return err - } - } - case *ast.CallExpr: - if at.Fun == nil { - return nil - } - switch st := at.Fun.(type) { - case *ast.SelectorExpr: - if err := v.evalSelector(at, st); err != nil { - return err - } - case *ast.Ident: - return v.evalIdent(st) - } - for _, a := range at.Args { - if err := v.evalArgs(a); err != nil { - return err - } - } - } - return nil -} - -func (v *Visitor) evalSelector(expr *ast.CallExpr, sel *ast.SelectorExpr) error { - x, ok := sel.X.(*ast.Ident) - if !ok { - return nil - } - if x.Name == "packr" { - switch sel.Sel.Name { - case "New": - if len(expr.Args) != 2 { - return fmt.Errorf("`New` requires two arguments") - } - - zz := func(e ast.Expr) (string, error) { - switch at := e.(type) { - case *ast.Ident: - switch at.Obj.Kind { - case ast.Var: - if as, ok := at.Obj.Decl.(*ast.AssignStmt); ok { - return v.fromVariable(as) - } - case ast.Con: - if vs, ok := at.Obj.Decl.(*ast.ValueSpec); ok { - return v.fromConstant(vs) - } - } - return "", v.evalIdent(at) - case *ast.BasicLit: - return at.Value, nil - case *ast.CallExpr: - return "", v.evalExpr(at) - } - return "", fmt.Errorf("can't handle %T", e) - } - - k1, err := zz(expr.Args[0]) - if err != nil { - return err - } - k2, err := zz(expr.Args[1]) - if err != nil { - return err - } - v.addBox(k1, k2) - - return nil - case "NewBox": - for _, e := range expr.Args { - switch at := e.(type) { - case *ast.Ident: - switch at.Obj.Kind { - case ast.Var: - if as, ok := at.Obj.Decl.(*ast.AssignStmt); ok { - v.addVariable("", as) - } - case ast.Con: - if vs, ok := at.Obj.Decl.(*ast.ValueSpec); ok { - v.addConstant("", vs) - } - } - return v.evalIdent(at) - case *ast.BasicLit: - v.addBox("", at.Value) - case *ast.CallExpr: - return v.evalExpr(at) - } - } - } - } - - return nil -} - -func (v *Visitor) evalIdent(i *ast.Ident) error { - if i.Obj == nil { - return nil - } - if s, ok := i.Obj.Decl.(*ast.AssignStmt); ok { - return v.evalStmt(s) - } - return nil -} - -func (v *Visitor) addBox(name string, path string) { - if len(name) == 0 { - name = path - } - name = strings.Replace(name, "\"", "", -1) - path = strings.Replace(path, "\"", "", -1) - abs := path - if _, ok := v.boxes[name]; !ok { - box := NewBox(name, path) - box.Package = v.Package - - pd := filepath.Dir(v.File.Name()) - pwd, _ := os.Getwd() - if !filepath.IsAbs(pd) { - pd = filepath.Join(pwd, pd) - } - box.PackageDir = pd - - if !filepath.IsAbs(abs) { - abs = filepath.Join(pd, abs) - } - box.AbsPath = abs - v.boxes[name] = box - } -} -func (v *Visitor) fromVariable(as *ast.AssignStmt) (string, error) { - if len(as.Rhs) == 1 { - if bs, ok := as.Rhs[0].(*ast.BasicLit); ok { - return bs.Value, nil - } - } - return "", fmt.Errorf("unable to find value from variable %v", as) -} - -func (v *Visitor) addVariable(bn string, as *ast.AssignStmt) error { - bv, err := v.fromVariable(as) - if err != nil { - return nil - } - if len(bn) == 0 { - bn = bv - } - v.addBox(bn, bv) - return nil -} - -func (v *Visitor) fromConstant(vs *ast.ValueSpec) (string, error) { - if len(vs.Values) == 1 { - if bs, ok := vs.Values[0].(*ast.BasicLit); ok { - return bs.Value, nil - } - } - return "", fmt.Errorf("unable to find value from constant %v", vs) -} - -func (v *Visitor) addConstant(bn string, vs *ast.ValueSpec) error { - if len(vs.Values) == 1 { - if bs, ok := vs.Values[0].(*ast.BasicLit); ok { - bv := bs.Value - if len(bn) == 0 { - bn = bv - } - v.addBox(bn, bv) - } - } - return nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/clean.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/clean.go deleted file mode 100644 index 9346a6db6..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/clean.go +++ /dev/null @@ -1,75 +0,0 @@ -package store - -import ( - "os" - "path/filepath" - "strings" - - "github.com/gobuffalo/packr/v2/jam/parser" -) - -func Clean(root string) error { - defer func() { - packd := filepath.Join(root, "packrd") - os.RemoveAll(packd) - }() - - p, err := parser.NewFromRoots([]string{root}, &parser.RootsOptions{}) - if err != nil { - return err - } - - boxes, err := p.Run() - if err != nil { - return err - } - - d := NewDisk("", "") - for _, box := range boxes { - if err := d.Clean(box); err != nil { - return err - } - } - return nil -} - -func clean(root string) error { - if len(root) == 0 { - pwd, err := os.Getwd() - if err != nil { - return err - } - root = pwd - } - if _, err := os.Stat(root); err != nil { - return nil - } - defer func() { - packd := filepath.Join(root, "packrd") - os.RemoveAll(packd) - }() - - err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info.IsDir() { - if filepath.Base(path) == "packrd" { - os.RemoveAll(path) - return filepath.SkipDir - } - } - if strings.HasSuffix(path, "-packr.go") { - err := os.RemoveAll(path) - if err != nil { - return err - } - } - return nil - }) - if err != nil { - return err - } - - return nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/disk.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/disk.go deleted file mode 100644 index 50ac912af..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/disk.go +++ /dev/null @@ -1,347 +0,0 @@ -package store - -import ( - "bytes" - "compress/gzip" - "crypto/md5" - "fmt" - "go/build" - "html/template" - "io" - "io/ioutil" - "os" - "os/exec" - "path" - "path/filepath" - "sort" - "strings" - "sync" - - "github.com/gobuffalo/envy" - "github.com/gobuffalo/packr/v2/file/resolver/encoding/hex" - "github.com/gobuffalo/packr/v2/plog" - "github.com/rogpeppe/go-internal/modfile" - - "github.com/gobuffalo/packr/v2/jam/parser" - "github.com/karrick/godirwalk" - "golang.org/x/sync/errgroup" -) - -var _ Store = &Disk{} - -const DISK_GLOBAL_KEY = "__packr_global__" - -type Disk struct { - DBPath string - DBPackage string - global map[string]string - boxes map[string]*parser.Box - moot *sync.RWMutex -} - -func NewDisk(path string, pkg string) *Disk { - if len(path) == 0 { - path = "packrd" - } - if len(pkg) == 0 { - pkg = "packrd" - } - if !filepath.IsAbs(path) { - path, _ = filepath.Abs(path) - } - return &Disk{ - DBPath: path, - DBPackage: pkg, - global: map[string]string{}, - boxes: map[string]*parser.Box{}, - moot: &sync.RWMutex{}, - } -} - -func (d *Disk) FileNames(box *parser.Box) ([]string, error) { - path := box.AbsPath - if len(box.AbsPath) == 0 { - path = box.Path - } - var names []string - if _, err := os.Stat(path); err != nil { - return names, nil - } - err := godirwalk.Walk(path, &godirwalk.Options{ - FollowSymbolicLinks: true, - Callback: func(path string, de *godirwalk.Dirent) error { - if !de.IsRegular() { - return nil - } - names = append(names, path) - return nil - }, - }) - return names, err -} - -func (d *Disk) Files(box *parser.Box) ([]*parser.File, error) { - var files []*parser.File - names, err := d.FileNames(box) - if err != nil { - return files, err - } - for _, n := range names { - b, err := ioutil.ReadFile(n) - if err != nil { - return files, err - } - f := parser.NewFile(n, bytes.NewReader(b)) - files = append(files, f) - } - return files, nil -} - -func (d *Disk) Pack(box *parser.Box) error { - plog.Debug(d, "Pack", "box", box.Name) - d.boxes[box.Name] = box - names, err := d.FileNames(box) - if err != nil { - return err - } - for _, n := range names { - _, ok := d.global[n] - if ok { - continue - } - k := makeKey(box, n) - // not in the global, so add it! - d.global[n] = k - } - return nil -} - -func (d *Disk) Clean(box *parser.Box) error { - root := box.PackageDir - if len(root) == 0 { - return fmt.Errorf("can't clean an empty box.PackageDir") - } - plog.Debug(d, "Clean", "box", box.Name, "root", root) - return clean(root) -} - -type options struct { - Package string - GlobalFiles map[string]string - Boxes []optsBox - GK string -} - -type optsBox struct { - Name string - Path string -} - -// Close ... -func (d *Disk) Close() error { - if len(d.boxes) == 0 { - return nil - } - - xb := &parser.Box{Name: DISK_GLOBAL_KEY} - opts := options{ - Package: d.DBPackage, - GlobalFiles: map[string]string{}, - GK: makeKey(xb, d.DBPath), - } - - wg := errgroup.Group{} - for k, v := range d.global { - func(k, v string) { - wg.Go(func() error { - bb := &bytes.Buffer{} - enc := hex.NewEncoder(bb) - zw := gzip.NewWriter(enc) - f, err := os.Open(k) - if err != nil { - return err - } - defer f.Close() - io.Copy(zw, f) - if err := zw.Close(); err != nil { - return err - } - d.moot.Lock() - opts.GlobalFiles[makeKey(xb, k)] = bb.String() - d.moot.Unlock() - return nil - }) - }(k, v) - } - - if err := wg.Wait(); err != nil { - return err - } - - for _, b := range d.boxes { - ob := optsBox{ - Name: b.Name, - } - opts.Boxes = append(opts.Boxes, ob) - } - - sort.Slice(opts.Boxes, func(a, b int) bool { - return opts.Boxes[a].Name < opts.Boxes[b].Name - }) - - fm := template.FuncMap{ - "printBox": func(ob optsBox) (template.HTML, error) { - box := d.boxes[ob.Name] - if box == nil { - return "", fmt.Errorf("could not find box %s", ob.Name) - } - fn, err := d.FileNames(box) - if err != nil { - return "", err - } - if len(fn) == 0 { - return "", nil - } - - type file struct { - Resolver string - ForwardPath string - } - - tmpl, err := template.New("box.go").Parse(diskGlobalBoxTmpl) - if err != nil { - return "", err - } - - var files []file - for _, s := range fn { - p := strings.TrimPrefix(s, box.AbsPath) - p = strings.TrimPrefix(p, string(filepath.Separator)) - files = append(files, file{ - Resolver: strings.Replace(p, "\\", "/", -1), - ForwardPath: makeKey(box, s), - }) - } - opts := map[string]interface{}{ - "Box": box, - "Files": files, - } - - bb := &bytes.Buffer{} - if err := tmpl.Execute(bb, opts); err != nil { - return "", err - } - return template.HTML(bb.String()), nil - }, - } - - os.MkdirAll(d.DBPath, 0755) - fp := filepath.Join(d.DBPath, "packed-packr.go") - global, err := os.Create(fp) - if err != nil { - return err - } - defer global.Close() - - tmpl := template.New(fp).Funcs(fm) - tmpl, err = tmpl.Parse(diskGlobalTmpl) - if err != nil { - return err - } - - if err := tmpl.Execute(global, opts); err != nil { - return err - } - - var ip string - if envy.Mods() { - // Starting in 1.12, we can rely on Go's method for - // resolving where go.mod resides. Prior versions will - // simply return an empty string. - cmd := exec.Command("go", "env", "GOMOD") - out, err := cmd.Output() - if err != nil { - return fmt.Errorf("go.mod cannot be read or does not exist while go module is enabled") - } - mp := strings.TrimSpace(string(out)) - if mp == "" { - // We are on a prior version of Go; try and do - // the resolution ourselves. - mp = filepath.Join(filepath.Dir(d.DBPath), "go.mod") - if _, err := os.Stat(mp); err != nil { - mp = filepath.Join(d.DBPath, "go.mod") - } - } - - moddata, err := ioutil.ReadFile(mp) - if err != nil { - return fmt.Errorf("go.mod cannot be read or does not exist while go module is enabled") - } - ip = modfile.ModulePath(moddata) - if ip == "" { - return fmt.Errorf("go.mod is malformed") - } - ip = filepath.Join(ip, strings.TrimPrefix(filepath.Dir(d.DBPath), filepath.Dir(mp))) - ip = strings.Replace(ip, "\\", "/", -1) - } else { - ip = filepath.Dir(d.DBPath) - srcs := envy.GoPaths() - srcs = append(srcs, build.Default.SrcDirs()...) - for _, x := range srcs { - ip = strings.TrimPrefix(ip, "/private") - ip = strings.TrimPrefix(ip, x) - } - ip = strings.TrimPrefix(ip, string(filepath.Separator)) - ip = strings.TrimPrefix(ip, "src") - ip = strings.TrimPrefix(ip, string(filepath.Separator)) - - ip = strings.Replace(ip, "\\", "/", -1) - } - ip = path.Join(ip, d.DBPackage) - - for _, n := range opts.Boxes { - b := d.boxes[n.Name] - if b == nil { - continue - } - p := filepath.Join(b.PackageDir, b.Package+"-packr.go") - f, err := os.Create(p) - if err != nil { - return err - } - defer f.Close() - - o := struct { - Package string - Import string - }{ - Package: b.Package, - Import: ip, - } - - tmpl, err := template.New(p).Parse(diskImportTmpl) - if err != nil { - return err - } - if err := tmpl.Execute(f, o); err != nil { - return err - } - - } - - return nil -} - -// resolve file paths (only) for the boxes -// compile "global" db -// resolve files for boxes to point at global db -// write global db to disk (default internal/packr) -// write boxes db to disk (default internal/packr) -// write -packr.go files in each package (1 per package) that init the global db - -func makeKey(box *parser.Box, path string) string { - w := md5.New() - fmt.Fprint(w, path) - h := hex.EncodeToString(w.Sum(nil)) - return h -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/disk_tmpl.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/disk_tmpl.go deleted file mode 100644 index cae5ba850..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/disk_tmpl.go +++ /dev/null @@ -1,52 +0,0 @@ -package store - -const diskGlobalTmpl = `// +build !skippackr -// Code generated by github.com/gobuffalo/packr/v2. DO NOT EDIT. - -// You can use the "packr2 clean" command to clean up this, -// and any other packr generated files. -package {{.Package}} - -import ( - "github.com/gobuffalo/packr/v2" - "github.com/gobuffalo/packr/v2/file/resolver" -) - -var _ = func() error { - const gk = "{{.GK}}" - g := packr.New(gk, "") - hgr, err := resolver.NewHexGzip(map[string]string{ - {{- range $k, $v := .GlobalFiles }} - "{{$k}}": "{{$v}}", - {{- end }} - }) - if err != nil { - panic(err) - } - g.DefaultResolver = hgr - - {{- range $box := .Boxes}} -{{ printBox $box -}} - {{ end }} - return nil -}() -` - -const diskImportTmpl = `// +build !skippackr -// Code generated by github.com/gobuffalo/packr/v2. DO NOT EDIT. - -// You can use the "packr clean" command to clean up this, -// and any other packr generated files. -package {{.Package}} - -import _ "{{.Import}}" -` - -const diskGlobalBoxTmpl = ` - func() { - b := packr.New("{{.Box.Name}}", "{{.Box.Path}}") - {{ range $file := .Files -}} - b.SetResolver("{{$file.Resolver}}", packr.Pointer{ForwardBox: gk, ForwardPath: "{{$file.ForwardPath}}"}) - {{ end -}} - }() -` diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/env.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/env.go deleted file mode 100644 index 9a65e6dfa..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/env.go +++ /dev/null @@ -1,39 +0,0 @@ -package store - -import ( - "os" - "os/exec" - "path/filepath" - "strings" - "sync" -) - -var goPath = filepath.Join(os.Getenv("HOME"), "go") - -func init() { - var once sync.Once - once.Do(func() { - cmd := exec.Command("go", "env", "GOPATH") - b, err := cmd.CombinedOutput() - if err != nil { - return - } - goPath = strings.TrimSpace(string(b)) - }) -} - -// GoPath returns the current GOPATH env var -// or if it's missing, the default. -func GoPath() string { - return goPath -} - -// GoBin returns the current GO_BIN env var -// or if it's missing, a default of "go" -func GoBin() string { - go_bin := os.Getenv("GO_BIN") - if go_bin == "" { - return "go" - } - return go_bin -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/fn.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/fn.go deleted file mode 100644 index c9f5ea99a..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/fn.go +++ /dev/null @@ -1,44 +0,0 @@ -package store - -import ( - "fmt" - - "github.com/gobuffalo/packr/v2/jam/parser" -) - -var _ Store = &FnStore{} - -type FnStore struct { - FileNamesFn func(*parser.Box) ([]string, error) - FilesFn func(*parser.Box) ([]*parser.File, error) - PackFn func(*parser.Box) error - CleanFn func(*parser.Box) error -} - -func (f *FnStore) FileNames(box *parser.Box) ([]string, error) { - if f.FileNamesFn == nil { - return []string{}, fmt.Errorf("FileNames not implemented") - } - return f.FileNames(box) -} - -func (f *FnStore) Files(box *parser.Box) ([]*parser.File, error) { - if f.FilesFn == nil { - return []*parser.File{}, fmt.Errorf("Files not implemented") - } - return f.FilesFn(box) -} - -func (f *FnStore) Pack(box *parser.Box) error { - if f.PackFn == nil { - return fmt.Errorf("Pack not implemented") - } - return f.PackFn(box) -} - -func (f *FnStore) Clean(box *parser.Box) error { - if f.CleanFn == nil { - return fmt.Errorf("Clean not implemented") - } - return f.Clean(box) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/legacy.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/legacy.go deleted file mode 100644 index afff64a55..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/legacy.go +++ /dev/null @@ -1,129 +0,0 @@ -package store - -import ( - "bytes" - "encoding/json" - "html/template" - "io" - "os" - "path/filepath" - "sort" - "strings" - - "github.com/gobuffalo/packr/v2/jam/parser" -) - -var _ Store = &Legacy{} - -type Legacy struct { - *Disk - boxes map[string][]legacyBox -} - -func NewLegacy() *Legacy { - return &Legacy{ - Disk: NewDisk("", ""), - boxes: map[string][]legacyBox{}, - } -} - -func (l *Legacy) Pack(box *parser.Box) error { - files, err := l.Files(box) - if err != nil { - return err - } - - var fcs []legacyFile - - for _, f := range files { - n := strings.TrimPrefix(f.Name(), box.AbsPath+string(filepath.Separator)) - c, err := l.prepFile(f) - if err != nil { - return err - } - fcs = append(fcs, legacyFile{Name: n, Contents: c}) - } - - sort.Slice(fcs, func(a, b int) bool { - return fcs[a].Name < fcs[b].Name - }) - - lbs := l.boxes[box.PackageDir] - lbs = append(lbs, legacyBox{ - Box: box, - Files: fcs, - }) - l.boxes[box.PackageDir] = lbs - return nil -} - -func (l *Legacy) prepFile(r io.Reader) (string, error) { - bb := &bytes.Buffer{} - if _, err := io.Copy(bb, r); err != nil { - return "", err - } - b, err := json.Marshal(bb.Bytes()) - if err != nil { - return "", err - } - return strings.Replace(string(b), "\"", "\\\"", -1), nil -} - -// Close ... -func (l *Legacy) Close() error { - for _, b := range l.boxes { - if len(b) == 0 { - continue - } - bx := b[0].Box - pkg := bx.Package - opts := map[string]interface{}{ - "Package": pkg, - "Boxes": b, - } - p := filepath.Join(bx.PackageDir, "a_"+bx.Package+"-packr.go.tmpl") - tmpl, err := template.New(p).Parse(legacyTmpl) - - if err != nil { - return err - } - - f, err := os.Create(p) - if err != nil { - return err - } - - if err := tmpl.Execute(f, opts); err != nil { - return err - } - - } - return nil -} - -type legacyBox struct { - Box *parser.Box - Files []legacyFile -} - -type legacyFile struct { - Name string - Contents string -} - -var legacyTmpl = `// Code generated by github.com/gobuffalo/packr. DO NOT EDIT. - -package {{.Package}} - -import "github.com/gobuffalo/packr" - -// You can use the "packr clean" command to clean up this, -// and any other packr generated files. -func init() { - {{- range $box := .Boxes }} - {{- range $box.Files }} - packr.PackJSONBytes("{{$box.Box.Name}}", "{{.Name}}", "{{.Contents}}") - {{- end }} - {{- end }} -} -` diff --git a/vendor/github.com/gobuffalo/packr/v2/jam/store/store.go b/vendor/github.com/gobuffalo/packr/v2/jam/store/store.go deleted file mode 100644 index 35c0781fc..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/jam/store/store.go +++ /dev/null @@ -1,12 +0,0 @@ -package store - -import ( - "github.com/gobuffalo/packr/v2/jam/parser" -) - -type Store interface { - FileNames(*parser.Box) ([]string, error) - Files(*parser.Box) ([]*parser.File, error) - Pack(*parser.Box) error - Clean(*parser.Box) error -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr.go b/vendor/github.com/gobuffalo/packr/v2/packr.go deleted file mode 100644 index 0c670b6fb..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr.go +++ /dev/null @@ -1,56 +0,0 @@ -package packr - -import ( - "fmt" - - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe" - "github.com/gobuffalo/packr/v2/jam/parser" - "github.com/gobuffalo/packr/v2/plog" -) - -var boxes = &boxMap{} - -var _ = safe.Run(func() { - p, err := parser.NewFromRoots([]string{}, nil) - if err != nil { - plog.Logger.Error(err) - return - } - boxes, err := p.Run() - if err != nil { - plog.Logger.Error(err) - return - } - for _, box := range boxes { - b := construct(box.Name, box.AbsPath) - _, err = placeBox(b) - if err != nil { - plog.Logger.Error(err) - return - } - } - -}) - -func findBox(name string) (*Box, error) { - key := resolver.Key(name) - plog.Debug("packr", "findBox", "name", name, "key", key) - - b, ok := boxes.Load(key) - if !ok { - plog.Debug("packr", "findBox", "name", name, "key", key, "found", ok) - return nil, fmt.Errorf("could not find box %s", name) - } - - plog.Debug(b, "found", "box", b) - return b, nil -} - -func placeBox(b *Box) (*Box, error) { - key := resolver.Key(b.Name) - eb, _ := boxes.LoadOrStore(key, b) - - plog.Debug("packr", "placeBox", "name", eb.Name, "path", eb.Path, "resolution directory", eb.ResolutionDir) - return eb, nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/LICENSE b/vendor/github.com/gobuffalo/packr/v2/packr2/LICENSE deleted file mode 100644 index aab0dd47a..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright © 2018 Mark Bates - -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/gobuffalo/packr/v2/packr2/cmd/build.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/build.go deleted file mode 100644 index 747c460a8..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/build.go +++ /dev/null @@ -1,28 +0,0 @@ -package cmd - -import ( - "fmt" - - "github.com/gobuffalo/packr/v2/jam" - "github.com/spf13/cobra" -) - -var buildCmd = &cobra.Command{ - Use: "build", - Short: "Wraps the go build command with packr", - DisableFlagParsing: true, - RunE: func(cmd *cobra.Command, args []string) error { - cargs := parseArgs(args) - if globalOptions.Verbose { - fmt.Println(dont) - } - if err := jam.Pack(globalOptions.PackOptions); err != nil { - return err - } - return goCmd("build", cargs...) - }, -} - -func init() { - rootCmd.AddCommand(buildCmd) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/clean.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/clean.go deleted file mode 100644 index 7d08855f2..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/clean.go +++ /dev/null @@ -1,18 +0,0 @@ -package cmd - -import ( - "github.com/gobuffalo/packr/v2/jam" - "github.com/spf13/cobra" -) - -var cleanCmd = &cobra.Command{ - Use: "clean", - Short: "removes any *-packr.go files", - RunE: func(cmd *cobra.Command, args []string) error { - return jam.Clean(args...) - }, -} - -func init() { - rootCmd.AddCommand(cleanCmd) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix.go deleted file mode 100644 index f7d3a9802..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix.go +++ /dev/null @@ -1,23 +0,0 @@ -package cmd - -import ( - "fmt" - - packr "github.com/gobuffalo/packr/v2" - "github.com/gobuffalo/packr/v2/packr2/cmd/fix" - "github.com/spf13/cobra" -) - -// fixCmd represents the info command -var fixCmd = &cobra.Command{ - Use: "fix", - Short: fmt.Sprintf("will attempt to fix a application's API to match packr version %s", packr.Version), - RunE: func(cmd *cobra.Command, args []string) error { - return fix.Run() - }, -} - -func init() { - fixCmd.Flags().BoolVarP(&fix.YesToAll, "y", "", false, "update all without asking for confirmation") - rootCmd.AddCommand(fixCmd) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/fix.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/fix.go deleted file mode 100644 index 9053b14f7..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/fix.go +++ /dev/null @@ -1,52 +0,0 @@ -package fix - -import ( - "bufio" - "fmt" - "os" - "strings" - - "github.com/gobuffalo/envy" - "github.com/gobuffalo/packr/v2/jam/store" -) - -var modsOn = (strings.TrimSpace(envy.Get("GO111MODULE", "off")) == "on") - -//YesToAll will be used by the command to skip the questions -var YesToAll bool - -var replace = map[string]string{ - "github.com/gobuffalo/packr": "github.com/gobuffalo/packr/v2", -} - -var ic = ImportConverter{ - Data: replace, -} - -var checks = []Check{ - // packrClean, - ic.Process, -} - -func packrClean(r *Runner) error { - pwd, err := os.Getwd() - if err != nil { - return err - } - store.Clean(pwd) - return nil -} - -func ask(q string) bool { - if YesToAll { - return true - } - - fmt.Printf("? %s [y/n]\n", q) - - reader := bufio.NewReader(os.Stdin) - text, _ := reader.ReadString('\n') - - text = strings.ToLower(strings.TrimSpace(text)) - return text == "y" || text == "yes" -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/imports.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/imports.go deleted file mode 100644 index 76380dde4..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/imports.go +++ /dev/null @@ -1,251 +0,0 @@ -package fix - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "io/ioutil" - "os" - "path/filepath" - "strconv" - "strings" - - "golang.org/x/tools/go/ast/astutil" -) - -// ImportConverter will changes imports from a -> b -type ImportConverter struct { - Data map[string]string -} - -// Process will walk all the .go files in an application, excluding ./vendor. -// It will then attempt to convert any old import paths to any new import paths -// used by this version Buffalo. -func (c ImportConverter) Process(r *Runner) error { - fmt.Println("~~~ Rewriting Imports ~~~") - - err := filepath.Walk(".", c.processFile) - if err != nil { - return err - } - - if _, err := os.Stat("Gopkg.toml"); err != nil { - return nil - } - - b, err := ioutil.ReadFile("Gopkg.toml") - if err != nil { - return err - } - - for k := range c.Data { - if bytes.Contains(b, []byte(k)) { - r.Warnings = append(r.Warnings, fmt.Sprintf("Your Gopkg.toml contains the following import that need to be changed MANUALLY: %s", k)) - } - } - - return nil -} - -func (c ImportConverter) processFile(p string, info os.FileInfo, err error) error { - er := onlyRelevantFiles(p, info, err, func(p string) error { - err := c.rewriteFile(p) - if err != nil { - err = err - } - - return err - }) - - return er -} - -func (c ImportConverter) rewriteFile(name string) error { - // create an empty fileset. - fset := token.NewFileSet() - - // parse the .go file. - // we are parsing the entire file with comments, so we don't lose anything - // if we need to write it back out. - f, err := parser.ParseFile(fset, name, nil, parser.ParseComments) - if err != nil { - e := err.Error() - msg := "expected 'package', found 'EOF'" - if e[len(e)-len(msg):] == msg { - return nil - } - return err - } - - changed := false - funcs := []*ast.FuncDecl{} - for _, d := range f.Decls { - if fn, isFn := d.(*ast.FuncDecl); isFn { - funcs = append(funcs, fn) - } - } - - for _, fun := range funcs { - ast.Inspect(fun, func(node ast.Node) bool { - switch n := node.(type) { - case *ast.CallExpr: - fn, ok := n.Fun.(*ast.SelectorExpr) - if !ok || fn.Sel == nil { - return true - } - - sel := fn.Sel - i, ok := fn.X.(*ast.Ident) - if !ok { - return true - } - if i.Name != "packr" { - return true - } - if sel.Name == "NewBox" { - sel.Name = "New" - n.Args = append(n.Args, n.Args[0]) - changed = true - } - if sel.Name == "MustBytes" { - sel.Name = "Find" - changed = true - } - if sel.Name == "MustBytes" { - sel.Name = "Find" - changed = true - } - } - return true - }) - } - - for key, value := range c.Data { - if !astutil.DeleteImport(fset, f, key) { - continue - } - - astutil.AddImport(fset, f, value) - changed = true - } - - commentsChanged, err := c.handleFileComments(f) - if err != nil { - return err - } - - changed = changed || commentsChanged - - // if no change occurred, then we don't need to write to disk, just return. - if !changed { - return nil - } - - // since the imports changed, resort them. - ast.SortImports(fset, f) - - // create a temporary file, this easily avoids conflicts. - temp, err := writeTempResult(name, fset, f) - if err != nil { - return err - } - - // rename the .temp to .go - return os.Rename(temp, name) -} - -func (c ImportConverter) handleFileComments(f *ast.File) (bool, error) { - change := false - - for _, cg := range f.Comments { - for _, cl := range cg.List { - if !strings.HasPrefix(cl.Text, "// import \"") { - continue - } - - // trim off extra comment stuff - ctext := cl.Text - ctext = strings.TrimPrefix(ctext, "// import") - ctext = strings.TrimSpace(ctext) - - // unquote the comment import path value - ctext, err := strconv.Unquote(ctext) - if err != nil { - return false, err - } - - // match the comment import path with the given replacement map - if ctext, ok := c.match(ctext); ok { - cl.Text = "// import " + strconv.Quote(ctext) - change = true - } - - } - } - - return change, nil -} - -// match takes an import path and replacement map. -func (c ImportConverter) match(importpath string) (string, bool) { - for key, value := range c.Data { - if !strings.HasPrefix(importpath, key) { - continue - } - - result := strings.Replace(importpath, key, value, 1) - return result, true - } - - return importpath, false -} - -//onlyRelevantFiles processes only .go files excluding folders like node_modules and vendor. -func onlyRelevantFiles(p string, fi os.FileInfo, err error, fn func(p string) error) error { - if err != nil { - return err - } - - if fi.IsDir() && p != "." { - for _, n := range []string{"_", ".", "vendor", "node_modules", ".git"} { - base := filepath.Base(p) - if strings.HasPrefix(base, n) { - return filepath.SkipDir - } - } - - return nil - } - - ext := filepath.Ext(p) - if ext != ".go" { - return nil - } - - return fn(p) -} - -func writeTempResult(name string, fset *token.FileSet, f *ast.File) (string, error) { - temp := name + ".temp" - w, err := os.Create(temp) - if err != nil { - return "", err - } - - // write changes to .temp file, and include proper formatting. - err = (&printer.Config{Mode: printer.TabIndent | printer.UseSpaces, Tabwidth: 8}).Fprint(w, fset, f) - if err != nil { - return "", err - } - - // close the writer - err = w.Close() - if err != nil { - return "", err - } - - return temp, nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/runner.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/runner.go deleted file mode 100644 index c9a790806..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/fix/runner.go +++ /dev/null @@ -1,47 +0,0 @@ -package fix - -import ( - "fmt" - - packr "github.com/gobuffalo/packr/v2" -) - -// Check interface for runnable checker functions -type Check func(*Runner) error - -// Runner will run all compatible checks -type Runner struct { - Warnings []string -} - -// Run all compatible checks -func Run() error { - fmt.Printf("! This updater will attempt to update your application to packr version: %s\n", packr.Version) - if !ask("Do you wish to continue?") { - fmt.Println("~~~ cancelling update ~~~") - return nil - } - - r := &Runner{ - Warnings: []string{}, - } - - defer func() { - if len(r.Warnings) == 0 { - return - } - - fmt.Println("\n\n----------------------------") - fmt.Printf("!!! (%d) Warnings Were Found !!!\n\n", len(r.Warnings)) - for _, w := range r.Warnings { - fmt.Printf("[WARNING]: %s\n", w) - } - }() - - for _, c := range checks { - if err := c(r); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/gocmd.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/gocmd.go deleted file mode 100644 index eb2e2f7c1..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/gocmd.go +++ /dev/null @@ -1,64 +0,0 @@ -package cmd - -import ( - "io/ioutil" - "os" - "os/exec" - "path/filepath" - "strings" - - "github.com/gobuffalo/envy" - "github.com/gobuffalo/packr/v2/plog" -) - -func goCmd(name string, args ...string) error { - cargs := []string{name} - cargs = append(cargs, args...) - if len(args) > 0 { - err := func() error { - path := "." - - pwd, err := os.Getwd() - if err != nil { - return err - } - - if fi, err := os.Stat(filepath.Join(pwd, args[len(args)-1])); err == nil { - if fi.IsDir() { - return nil - } - path = fi.Name() - } - - if filepath.Ext(path) != ".go" { - return nil - } - - path, err = filepath.Abs(filepath.Dir(path)) - if err != nil { - return err - } - - files, err := ioutil.ReadDir(path) - if err != nil { - return err - } - for _, f := range files { - if strings.HasSuffix(f.Name(), "-packr.go") { - cargs = append(cargs, f.Name()) - } - } - return nil - }() - if err != nil { - return err - } - } - - cp := exec.Command(envy.Get("GO_BIN", "go"), cargs...) - plog.Logger.Debug(strings.Join(cp.Args, " ")) - cp.Stderr = os.Stderr - cp.Stdin = os.Stdin - cp.Stdout = os.Stdout - return cp.Run() -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/install.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/install.go deleted file mode 100644 index 1924614ed..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/install.go +++ /dev/null @@ -1,43 +0,0 @@ -package cmd - -import ( - "fmt" - - "github.com/gobuffalo/packr/v2/jam" - "github.com/spf13/cobra" -) - -const dont = `Please don't. -The following commands have been deprecated and should not be used: - -* packr2 build -* packr2 install - -They are, I'll be kind and say, "problematic" and cause more issues -than than the actually solve. Sorry about that. My bad. - -It is recommended you use two commands instead: - -$ packr2 -$ go build/install -` - -var installCmd = &cobra.Command{ - Use: "install", - Short: "Don't. ru", - DisableFlagParsing: true, - RunE: func(cmd *cobra.Command, args []string) error { - cargs := parseArgs(args) - if globalOptions.Verbose { - fmt.Println(dont) - } - if err := jam.Pack(globalOptions.PackOptions); err != nil { - return err - } - return goCmd("install", cargs...) - }, -} - -func init() { - rootCmd.AddCommand(installCmd) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/pack.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/pack.go deleted file mode 100644 index ee46d208c..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/pack.go +++ /dev/null @@ -1,25 +0,0 @@ -package cmd - -func parseArgs(args []string) []string { - var cargs []string - for _, a := range args { - if a == "--legacy" { - globalOptions.Legacy = true - continue - } - if a == "--verbose" { - globalOptions.Verbose = true - continue - } - if a == "--silent" { - globalOptions.Silent = true - continue - } - if a == "--ignore-imports" { - globalOptions.IgnoreImports = true - continue - } - cargs = append(cargs, a) - } - return cargs -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/root.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/root.go deleted file mode 100644 index 409a9b034..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/root.go +++ /dev/null @@ -1,82 +0,0 @@ -package cmd - -import ( - "os" - "path/filepath" - - "github.com/gobuffalo/logger" - "github.com/gobuffalo/packr/v2/jam" - "github.com/gobuffalo/packr/v2/plog" - "github.com/spf13/cobra" -) - -var globalOptions = struct { - jam.PackOptions - Verbose bool - Silent bool -}{ - PackOptions: jam.PackOptions{}, -} - -var rootCmd = &cobra.Command{ - Use: "packr2", - Short: "Packr is a simple solution for bundling static assets inside of Go binaries.", - PersistentPreRunE: func(cmd *cobra.Command, args []string) error { - for _, a := range args { - if a == "--legacy" { - globalOptions.Legacy = true - continue - } - if a == "-v" || a == "--verbose" { - globalOptions.Verbose = true - continue - } - } - - // if the last argument is a .go file or directory we should - // find boxes from there, not from the current directory. - // packr2 build -v cmd/main.go - if len(args) > 0 { - i := len(args) - 1 - dir := args[i] - if _, err := os.Stat(dir); err == nil { - if filepath.Ext(dir) == ".go" { - dir = filepath.Dir(dir) - } - os.Chdir(dir) - args[i] = filepath.Base(args[i]) - } - } - - if globalOptions.Verbose { - plog.Logger = logger.New(logger.DebugLevel) - } - if globalOptions.Silent { - plog.Logger = logger.New(logger.FatalLevel) - } - return nil - }, - RunE: func(cmd *cobra.Command, args []string) error { - opts := globalOptions.PackOptions - roots := opts.Roots - roots = append(roots, args...) - opts.Roots = roots - return jam.Pack(opts) - }, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := rootCmd.Execute(); err != nil { - os.Exit(1) - } -} - -func init() { - rootCmd.PersistentFlags().BoolVarP(&globalOptions.Verbose, "verbose", "v", false, "enables verbose logging") - rootCmd.PersistentFlags().BoolVar(&globalOptions.Legacy, "legacy", false, "uses the legacy resolution and packing system (assumes first arg || pwd for input path)") - rootCmd.PersistentFlags().BoolVar(&globalOptions.Silent, "silent", false, "silences all output") - rootCmd.PersistentFlags().BoolVar(&globalOptions.IgnoreImports, "ignore-imports", false, "when set to true packr won't resolve imports for boxes") - rootCmd.PersistentFlags().StringVar(&globalOptions.StoreCmd, "store-cmd", "", "sub command to use for packing") -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/version.go b/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/version.go deleted file mode 100644 index e8b80bed9..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/cmd/version.go +++ /dev/null @@ -1,21 +0,0 @@ -package cmd - -import ( - "fmt" - - packr "github.com/gobuffalo/packr/v2" - "github.com/spf13/cobra" -) - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "shows packr version", - RunE: func(cmd *cobra.Command, args []string) error { - fmt.Print(packr.Version) - return nil - }, -} - -func init() { - rootCmd.AddCommand(versionCmd) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/packr2/main.go b/vendor/github.com/gobuffalo/packr/v2/packr2/main.go deleted file mode 100644 index efb252840..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/packr2/main.go +++ /dev/null @@ -1,7 +0,0 @@ -package main - -import "github.com/gobuffalo/packr/v2/packr2/cmd" - -func main() { - cmd.Execute() -} diff --git a/vendor/github.com/gobuffalo/packr/v2/plog/plog.go b/vendor/github.com/gobuffalo/packr/v2/plog/plog.go deleted file mode 100644 index 8b1eec109..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/plog/plog.go +++ /dev/null @@ -1,41 +0,0 @@ -package plog - -import ( - "encoding/json" - "fmt" - - "github.com/gobuffalo/logger" - "github.com/sirupsen/logrus" -) - -var Logger = logger.New(logger.ErrorLevel) - -func Debug(t interface{}, m string, args ...interface{}) { - if len(args)%2 == 1 { - args = append(args, "") - } - f := logrus.Fields{} - for i := 0; i < len(args); i += 2 { - k := fmt.Sprint(args[i]) - v := args[i+1] - if s, ok := v.(fmt.Stringer); ok { - f[k] = s.String() - continue - } - if s, ok := v.(string); ok { - f[k] = s - continue - } - if b, err := json.Marshal(v); err == nil { - f[k] = string(b) - continue - } - f[k] = v - } - e := Logger.WithFields(f) - if s, ok := t.(string); ok { - e.Debugf("%s#%s", s, m) - return - } - e.Debugf("%T#%s", t, m) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/pointer.go b/vendor/github.com/gobuffalo/packr/v2/pointer.go deleted file mode 100644 index d342fe62b..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/pointer.go +++ /dev/null @@ -1,32 +0,0 @@ -package packr - -import ( - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/plog" -) - -// Pointer is a resolvr which resolves -// a file from a different box. -type Pointer struct { - ForwardBox string - ForwardPath string -} - -var _ resolver.Resolver = Pointer{} - -// Resolve attempts to find the file in the specific box -// with the specified key -func (p Pointer) Resolve(box string, path string) (file.File, error) { - plog.Debug(p, "Resolve", "box", box, "path", path, "forward-box", p.ForwardBox, "forward-path", p.ForwardPath) - b, err := findBox(p.ForwardBox) - if err != nil { - return nil, err - } - f, err := b.Resolve(p.ForwardPath) - if err != nil { - return f, err - } - plog.Debug(p, "Resolve", "box", box, "path", path, "file", f) - return file.NewFileR(path, f) -} diff --git a/vendor/github.com/gobuffalo/packr/v2/resolvers_map.go b/vendor/github.com/gobuffalo/packr/v2/resolvers_map.go deleted file mode 100644 index 24a042671..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/resolvers_map.go +++ /dev/null @@ -1,75 +0,0 @@ -//go:generate mapgen -name "resolvers" -zero "nil" -go-type "resolver.Resolver" -pkg "" -a "nil" -b "nil" -c "nil" -bb "nil" -destination "packr" -// Code generated by github.com/gobuffalo/mapgen. DO NOT EDIT. - -package packr - -import ( - "sort" - "sync" - - "github.com/gobuffalo/packr/v2/file/resolver" -) - -// resolversMap wraps sync.Map and uses the following types: -// key: string -// value: resolver.Resolver -type resolversMap struct { - data sync.Map -} - -// Delete the key from the map -func (m *resolversMap) Delete(key string) { - m.data.Delete(key) -} - -// Load the key from the map. -// Returns resolver.Resolver or bool. -// A false return indicates either the key was not found -// or the value is not of type resolver.Resolver -func (m *resolversMap) Load(key string) (resolver.Resolver, bool) { - i, ok := m.data.Load(key) - if !ok { - return nil, false - } - s, ok := i.(resolver.Resolver) - return s, ok -} - -// LoadOrStore will return an existing key or -// store the value if not already in the map -func (m *resolversMap) LoadOrStore(key string, value resolver.Resolver) (resolver.Resolver, bool) { - i, _ := m.data.LoadOrStore(key, value) - s, ok := i.(resolver.Resolver) - return s, ok -} - -// Range over the resolver.Resolver values in the map -func (m *resolversMap) Range(f func(key string, value resolver.Resolver) bool) { - m.data.Range(func(k, v interface{}) bool { - key, ok := k.(string) - if !ok { - return false - } - value, ok := v.(resolver.Resolver) - if !ok { - return false - } - return f(key, value) - }) -} - -// Store a resolver.Resolver in the map -func (m *resolversMap) Store(key string, value resolver.Resolver) { - m.data.Store(key, value) -} - -// Keys returns a list of keys in the map -func (m *resolversMap) Keys() []string { - var keys []string - m.Range(func(key string, value resolver.Resolver) bool { - keys = append(keys, key) - return true - }) - sort.Strings(keys) - return keys -} diff --git a/vendor/github.com/gobuffalo/packr/v2/version.go b/vendor/github.com/gobuffalo/packr/v2/version.go deleted file mode 100644 index 6e6fb38c8..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/version.go +++ /dev/null @@ -1,4 +0,0 @@ -package packr - -// Version of Packr -const Version = "v2.5.1" diff --git a/vendor/github.com/gobuffalo/packr/v2/walk.go b/vendor/github.com/gobuffalo/packr/v2/walk.go deleted file mode 100644 index 514631c26..000000000 --- a/vendor/github.com/gobuffalo/packr/v2/walk.go +++ /dev/null @@ -1,80 +0,0 @@ -package packr - -import ( - "sort" - "strings" - - "github.com/gobuffalo/packd" - "github.com/gobuffalo/packr/v2/file" - "github.com/gobuffalo/packr/v2/file/resolver" - "github.com/gobuffalo/packr/v2/plog" -) - -// WalkFunc is used to walk a box -type WalkFunc = packd.WalkFunc - -// Walk will traverse the box and call the WalkFunc for each file in the box/folder. -func (b *Box) Walk(wf WalkFunc) error { - m := map[string]file.File{} - - dr := b.DefaultResolver - if dr == nil { - cd := resolver.OsPath(b.ResolutionDir) - dr = &resolver.Disk{Root: cd} - } - if fm, ok := dr.(file.FileMappable); ok { - for n, f := range fm.FileMap() { - m[n] = f - } - } - var err error - b.resolvers.Range(func(n string, r resolver.Resolver) bool { - var f file.File - f, err = r.Resolve("", n) - if err != nil { - return false - } - keep := true - for k := range m { - if strings.EqualFold(k, n) { - keep = false - } - } - if keep { - m[n] = f - } - return true - }) - if err != nil { - return err - } - - var keys = make([]string, 0, len(m)) - for k := range m { - keys = append(keys, k) - } - sort.Strings(keys) - - for _, k := range keys { - osPath := resolver.OsPath(k) - plog.Debug(b, "Walk", "path", k, "osPath", osPath) - if err := wf(osPath, m[k]); err != nil { - return err - } - } - return nil -} - -// WalkPrefix will call box.Walk and call the WalkFunc when it finds paths that have a matching prefix -func (b *Box) WalkPrefix(prefix string, wf WalkFunc) error { - ipref := resolver.OsPath(prefix) - return b.Walk(func(path string, f File) error { - ipath := resolver.OsPath(path) - if strings.HasPrefix(ipath, ipref) { - if err := wf(path, f); err != nil { - return err - } - } - return nil - }) -} diff --git a/vendor/github.com/gobuffalo/packr/version.go b/vendor/github.com/gobuffalo/packr/version.go deleted file mode 100644 index bf736a701..000000000 --- a/vendor/github.com/gobuffalo/packr/version.go +++ /dev/null @@ -1,3 +0,0 @@ -package packr - -const Version = "v1.30.1" diff --git a/vendor/github.com/gobuffalo/packr/walk.go b/vendor/github.com/gobuffalo/packr/walk.go deleted file mode 100644 index f03f19626..000000000 --- a/vendor/github.com/gobuffalo/packr/walk.go +++ /dev/null @@ -1,63 +0,0 @@ -package packr - -import ( - "os" - "path/filepath" - "strings" - - "github.com/gobuffalo/packd" -) - -type WalkFunc = packd.WalkFunc - -// Walk will traverse the box and call the WalkFunc for each file in the box/folder. -func (b Box) Walk(wf WalkFunc) error { - if data[b.Path] == nil { - base, err := filepath.EvalSymlinks(filepath.Join(b.callingDir, b.Path)) - if err != nil { - return err - } - return filepath.Walk(base, func(path string, info os.FileInfo, err error) error { - cleanName, err := filepath.Rel(base, path) - if err != nil { - cleanName = strings.TrimPrefix(path, base) - } - cleanName = filepath.ToSlash(filepath.Clean(cleanName)) - cleanName = strings.TrimPrefix(cleanName, "/") - cleanName = filepath.FromSlash(cleanName) - if info == nil || info.IsDir() { - return nil - } - - file, err := fileFor(path, cleanName) - if err != nil { - return err - } - return wf(cleanName, file) - }) - } - for n := range data[b.Path] { - f, err := b.find(n) - if err != nil { - return err - } - err = wf(n, f) - if err != nil { - return err - } - } - return nil -} - -// WalkPrefix will call box.Walk and call the WalkFunc when it finds paths that have a matching prefix -func (b Box) WalkPrefix(prefix string, wf WalkFunc) error { - opre := osPath(prefix) - return b.Walk(func(path string, f File) error { - if strings.HasPrefix(osPath(path), opre) { - if err := wf(path, f); err != nil { - return err - } - } - return nil - }) -} diff --git a/vendor/github.com/hashicorp/go-multierror/.travis.yml b/vendor/github.com/hashicorp/go-multierror/.travis.yml index 304a83595..24b80388f 100644 --- a/vendor/github.com/hashicorp/go-multierror/.travis.yml +++ b/vendor/github.com/hashicorp/go-multierror/.travis.yml @@ -9,4 +9,4 @@ branches: only: - master -script: make test testrace +script: env GO111MODULE=on make test testrace diff --git a/vendor/github.com/hashicorp/go-multierror/README.md b/vendor/github.com/hashicorp/go-multierror/README.md index ead5830f7..e92fa614c 100644 --- a/vendor/github.com/hashicorp/go-multierror/README.md +++ b/vendor/github.com/hashicorp/go-multierror/README.md @@ -14,9 +14,10 @@ be a list of errors. If the caller knows this, they can unwrap the list and access the errors. If the caller doesn't know, the error formats to a nice human-readable format. -`go-multierror` implements the -[errwrap](https://github.com/hashicorp/errwrap) interface so that it can -be used with that library, as well. +`go-multierror` is fully compatible with the Go standard library +[errors](https://golang.org/pkg/errors/) package, including the +functions `As`, `Is`, and `Unwrap`. This provides a standardized approach +for introspecting on error values. ## Installation and Docs @@ -81,6 +82,39 @@ if err := something(); err != nil { } ``` +You can also use the standard [`errors.Unwrap`](https://golang.org/pkg/errors/#Unwrap) +function. This will continue to unwrap into subsequent errors until none exist. + +**Extracting an error** + +The standard library [`errors.As`](https://golang.org/pkg/errors/#As) +function can be used directly with a multierror to extract a specific error: + +```go +// Assume err is a multierror value +err := somefunc() + +// We want to know if "err" has a "RichErrorType" in it and extract it. +var errRich RichErrorType +if errors.As(err, &errRich) { + // It has it, and now errRich is populated. +} +``` + +**Checking for an exact error value** + +Some errors are returned as exact errors such as the [`ErrNotExist`](https://golang.org/pkg/os/#pkg-variables) +error in the `os` package. You can check if this error is present by using +the standard [`errors.Is`](https://golang.org/pkg/errors/#Is) function. + +```go +// Assume err is a multierror value +err := somefunc() +if errors.Is(err, os.ErrNotExist) { + // err contains os.ErrNotExist +} +``` + **Returning a multierror only if there are errors** If you build a `multierror.Error`, you can use the `ErrorOrNil` function diff --git a/vendor/github.com/hashicorp/go-multierror/go.mod b/vendor/github.com/hashicorp/go-multierror/go.mod index 2534331d5..0afe8e6f9 100644 --- a/vendor/github.com/hashicorp/go-multierror/go.mod +++ b/vendor/github.com/hashicorp/go-multierror/go.mod @@ -1,3 +1,5 @@ module github.com/hashicorp/go-multierror +go 1.14 + require github.com/hashicorp/errwrap v1.0.0 diff --git a/vendor/github.com/hashicorp/go-multierror/go.sum b/vendor/github.com/hashicorp/go-multierror/go.sum index 85b1f8ff3..e8238e9ec 100644 --- a/vendor/github.com/hashicorp/go-multierror/go.sum +++ b/vendor/github.com/hashicorp/go-multierror/go.sum @@ -1,4 +1,2 @@ -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce h1:prjrVgOk2Yg6w+PflHoszQNLTUh4kaByUcEWM/9uin4= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= diff --git a/vendor/github.com/hashicorp/go-multierror/group.go b/vendor/github.com/hashicorp/go-multierror/group.go new file mode 100644 index 000000000..9c29efb7f --- /dev/null +++ b/vendor/github.com/hashicorp/go-multierror/group.go @@ -0,0 +1,38 @@ +package multierror + +import "sync" + +// Group is a collection of goroutines which return errors that need to be +// coalesced. +type Group struct { + mutex sync.Mutex + err *Error + wg sync.WaitGroup +} + +// Go calls the given function in a new goroutine. +// +// If the function returns an error it is added to the group multierror which +// is returned by Wait. +func (g *Group) Go(f func() error) { + g.wg.Add(1) + + go func() { + defer g.wg.Done() + + if err := f(); err != nil { + g.mutex.Lock() + g.err = Append(g.err, err) + g.mutex.Unlock() + } + }() +} + +// Wait blocks until all function calls from the Go method have returned, then +// returns the multierror. +func (g *Group) Wait() *Error { + g.wg.Wait() + g.mutex.Lock() + defer g.mutex.Unlock() + return g.err +} diff --git a/vendor/github.com/hashicorp/go-multierror/multierror.go b/vendor/github.com/hashicorp/go-multierror/multierror.go index 89b1422d1..d05dd9269 100644 --- a/vendor/github.com/hashicorp/go-multierror/multierror.go +++ b/vendor/github.com/hashicorp/go-multierror/multierror.go @@ -1,6 +1,7 @@ package multierror import ( + "errors" "fmt" ) @@ -49,3 +50,69 @@ func (e *Error) GoString() string { func (e *Error) WrappedErrors() []error { return e.Errors } + +// Unwrap returns an error from Error (or nil if there are no errors). +// This error returned will further support Unwrap to get the next error, +// etc. The order will match the order of Errors in the multierror.Error +// at the time of calling. +// +// The resulting error supports errors.As/Is/Unwrap so you can continue +// to use the stdlib errors package to introspect further. +// +// This will perform a shallow copy of the errors slice. Any errors appended +// to this error after calling Unwrap will not be available until a new +// Unwrap is called on the multierror.Error. +func (e *Error) Unwrap() error { + // If we have no errors then we do nothing + if e == nil || len(e.Errors) == 0 { + return nil + } + + // If we have exactly one error, we can just return that directly. + if len(e.Errors) == 1 { + return e.Errors[0] + } + + // Shallow copy the slice + errs := make([]error, len(e.Errors)) + copy(errs, e.Errors) + return chain(errs) +} + +// chain implements the interfaces necessary for errors.Is/As/Unwrap to +// work in a deterministic way with multierror. A chain tracks a list of +// errors while accounting for the current represented error. This lets +// Is/As be meaningful. +// +// Unwrap returns the next error. In the cleanest form, Unwrap would return +// the wrapped error here but we can't do that if we want to properly +// get access to all the errors. Instead, users are recommended to use +// Is/As to get the correct error type out. +// +// Precondition: []error is non-empty (len > 0) +type chain []error + +// Error implements the error interface +func (e chain) Error() string { + return e[0].Error() +} + +// Unwrap implements errors.Unwrap by returning the next error in the +// chain or nil if there are no more errors. +func (e chain) Unwrap() error { + if len(e) == 1 { + return nil + } + + return e[1:] +} + +// As implements errors.As by attempting to map to the current value. +func (e chain) As(target interface{}) bool { + return errors.As(e[0], target) +} + +// Is implements errors.Is by comparing the current value directly. +func (e chain) Is(target error) bool { + return errors.Is(e[0], target) +} diff --git a/vendor/github.com/huandu/xstrings/common.go b/vendor/github.com/huandu/xstrings/common.go index 2aff57aab..f427cc84e 100644 --- a/vendor/github.com/huandu/xstrings/common.go +++ b/vendor/github.com/huandu/xstrings/common.go @@ -3,15 +3,11 @@ package xstrings -import ( - "bytes" -) - const bufferMaxInitGrowSize = 2048 // Lazy initialize a buffer. -func allocBuffer(orig, cur string) *bytes.Buffer { - output := &bytes.Buffer{} +func allocBuffer(orig, cur string) *stringBuilder { + output := &stringBuilder{} maxSize := len(orig) * 4 // Avoid to reserve too much memory at once. diff --git a/vendor/github.com/huandu/xstrings/convert.go b/vendor/github.com/huandu/xstrings/convert.go index 3d58fa81a..3d5a34950 100644 --- a/vendor/github.com/huandu/xstrings/convert.go +++ b/vendor/github.com/huandu/xstrings/convert.go @@ -4,7 +4,6 @@ package xstrings import ( - "bytes" "math/rand" "unicode" "unicode/utf8" @@ -23,7 +22,7 @@ func ToCamelCase(str string) string { return "" } - buf := &bytes.Buffer{} + buf := &stringBuilder{} var r0, r1 rune var size int @@ -112,7 +111,7 @@ func camelCaseToLowerCase(str string, connector rune) string { return "" } - buf := &bytes.Buffer{} + buf := &stringBuilder{} wt, word, remaining := nextWord(str) for len(remaining) > 0 { @@ -374,7 +373,7 @@ func nextValidRune(str string, prev rune) (r rune, size int) { return } -func toLower(buf *bytes.Buffer, wt wordType, str string, connector rune) { +func toLower(buf *stringBuilder, wt wordType, str string, connector rune) { buf.Grow(buf.Len() + len(str)) if wt != upperCaseWord && wt != connectorWord { @@ -401,7 +400,7 @@ func SwapCase(str string) string { var r rune var size int - buf := &bytes.Buffer{} + buf := &stringBuilder{} for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -435,7 +434,7 @@ func FirstRuneToUpper(str string) string { return str } - buf := &bytes.Buffer{} + buf := &stringBuilder{} buf.WriteRune(unicode.ToUpper(r)) buf.WriteString(str[size:]) return buf.String() @@ -453,7 +452,7 @@ func FirstRuneToLower(str string) string { return str } - buf := &bytes.Buffer{} + buf := &stringBuilder{} buf.WriteRune(unicode.ToLower(r)) buf.WriteString(str[size:]) return buf.String() @@ -566,7 +565,7 @@ func Successor(str string) string { // Needs to add one character for carry. if i < 0 && carry != ' ' { - buf := &bytes.Buffer{} + buf := &stringBuilder{} buf.Grow(l + 4) // Reserve enough space for write. if lastAlphanumeric != 0 { diff --git a/vendor/github.com/huandu/xstrings/format.go b/vendor/github.com/huandu/xstrings/format.go index 2d02df1c0..8cd76c525 100644 --- a/vendor/github.com/huandu/xstrings/format.go +++ b/vendor/github.com/huandu/xstrings/format.go @@ -4,7 +4,6 @@ package xstrings import ( - "bytes" "unicode/utf8" ) @@ -28,7 +27,7 @@ func ExpandTabs(str string, tabSize int) string { var r rune var i, size, column, expand int - var output *bytes.Buffer + var output *stringBuilder orig := str @@ -43,7 +42,7 @@ func ExpandTabs(str string, tabSize int) string { } for i = 0; i < expand; i++ { - output.WriteByte(byte(' ')) + output.WriteRune(' ') } column += expand @@ -88,7 +87,7 @@ func LeftJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) output.WriteString(str) writePadString(output, pad, padLen, remains) @@ -114,7 +113,7 @@ func RightJustify(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains) output.WriteString(str) @@ -140,7 +139,7 @@ func Center(str string, length int, pad string) string { remains := length - l padLen := Len(pad) - output := &bytes.Buffer{} + output := &stringBuilder{} output.Grow(len(str) + (remains/padLen+1)*len(pad)) writePadString(output, pad, padLen, remains/2) output.WriteString(str) @@ -148,7 +147,7 @@ func Center(str string, length int, pad string) string { return output.String() } -func writePadString(output *bytes.Buffer, pad string, padLen, remains int) { +func writePadString(output *stringBuilder, pad string, padLen, remains int) { var r rune var size int diff --git a/vendor/github.com/huandu/xstrings/manipulate.go b/vendor/github.com/huandu/xstrings/manipulate.go index 0eefb43ed..64075f9bb 100644 --- a/vendor/github.com/huandu/xstrings/manipulate.go +++ b/vendor/github.com/huandu/xstrings/manipulate.go @@ -4,7 +4,6 @@ package xstrings import ( - "bytes" "strings" "unicode/utf8" ) @@ -131,7 +130,7 @@ func Insert(dst, src string, index int) string { // Scrub scrubs invalid utf8 bytes with repl string. // Adjacent invalid bytes are replaced only once. func Scrub(str, repl string) string { - var buf *bytes.Buffer + var buf *stringBuilder var r rune var size, pos int var hasError bool @@ -144,7 +143,7 @@ func Scrub(str, repl string) string { if r == utf8.RuneError { if !hasError { if buf == nil { - buf = &bytes.Buffer{} + buf = &stringBuilder{} } buf.WriteString(origin[:pos]) diff --git a/vendor/github.com/huandu/xstrings/stringbuilder.go b/vendor/github.com/huandu/xstrings/stringbuilder.go new file mode 100644 index 000000000..bb0919d32 --- /dev/null +++ b/vendor/github.com/huandu/xstrings/stringbuilder.go @@ -0,0 +1,7 @@ +//+build go1.10 + +package xstrings + +import "strings" + +type stringBuilder = strings.Builder diff --git a/vendor/github.com/huandu/xstrings/stringbuilder_go110.go b/vendor/github.com/huandu/xstrings/stringbuilder_go110.go new file mode 100644 index 000000000..dac389d13 --- /dev/null +++ b/vendor/github.com/huandu/xstrings/stringbuilder_go110.go @@ -0,0 +1,9 @@ +//+build !go1.10 + +package xstrings + +import "bytes" + +type stringBuilder struct { + bytes.Buffer +} diff --git a/vendor/github.com/huandu/xstrings/translate.go b/vendor/github.com/huandu/xstrings/translate.go index 66e23f86d..42e694fb1 100644 --- a/vendor/github.com/huandu/xstrings/translate.go +++ b/vendor/github.com/huandu/xstrings/translate.go @@ -4,7 +4,6 @@ package xstrings import ( - "bytes" "unicode" "unicode/utf8" ) @@ -152,12 +151,12 @@ func NewTranslator(from, to string) *Translator { continue } - fromStart, toStart = tr.addRuneRange(fromStart, fromEnd, toStart, toStart, singleRunes) + _, toStart = tr.addRuneRange(fromStart, fromEnd, toStart, toStart, singleRunes) fromEnd = utf8.RuneError } if fromEnd != utf8.RuneError { - singleRunes = tr.addRune(fromEnd, toStart, singleRunes) + tr.addRune(fromEnd, toStart, singleRunes) } tr.reverted = reverted @@ -303,7 +302,7 @@ func (tr *Translator) Translate(str string) string { orig := str - var output *bytes.Buffer + var output *stringBuilder for len(str) > 0 { r, size = utf8.DecodeRuneInString(str) @@ -500,7 +499,7 @@ func Squeeze(str, pattern string) string { var size int var skipSqueeze, matched bool var tr *Translator - var output *bytes.Buffer + var output *stringBuilder orig := str last = -1 diff --git a/vendor/github.com/joho/godotenv/.gitignore b/vendor/github.com/joho/godotenv/.gitignore deleted file mode 100644 index e43b0f988..000000000 --- a/vendor/github.com/joho/godotenv/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.DS_Store diff --git a/vendor/github.com/joho/godotenv/.travis.yml b/vendor/github.com/joho/godotenv/.travis.yml deleted file mode 100644 index f0db1adcd..000000000 --- a/vendor/github.com/joho/godotenv/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: go - -go: - - 1.x - -os: - - linux - - osx diff --git a/vendor/github.com/joho/godotenv/LICENCE b/vendor/github.com/joho/godotenv/LICENCE deleted file mode 100644 index e7ddd51be..000000000 --- a/vendor/github.com/joho/godotenv/LICENCE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2013 John Barton - -MIT License - -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/joho/godotenv/README.md b/vendor/github.com/joho/godotenv/README.md deleted file mode 100644 index 4e8fcf2e9..000000000 --- a/vendor/github.com/joho/godotenv/README.md +++ /dev/null @@ -1,163 +0,0 @@ -# GoDotEnv [![Build Status](https://travis-ci.org/joho/godotenv.svg?branch=master)](https://travis-ci.org/joho/godotenv) [![Build status](https://ci.appveyor.com/api/projects/status/9v40vnfvvgde64u4?svg=true)](https://ci.appveyor.com/project/joho/godotenv) [![Go Report Card](https://goreportcard.com/badge/github.com/joho/godotenv)](https://goreportcard.com/report/github.com/joho/godotenv) - -A Go (golang) port of the Ruby dotenv project (which loads env vars from a .env file) - -From the original Library: - -> Storing configuration in the environment is one of the tenets of a twelve-factor app. Anything that is likely to change between deployment environments–such as resource handles for databases or credentials for external services–should be extracted from the code into environment variables. -> -> But it is not always practical to set environment variables on development machines or continuous integration servers where multiple projects are run. Dotenv load variables from a .env file into ENV when the environment is bootstrapped. - -It can be used as a library (for loading in env for your own daemons etc) or as a bin command. - -There is test coverage and CI for both linuxish and windows environments, but I make no guarantees about the bin version working on windows. - -## Installation - -As a library - -```shell -go get github.com/joho/godotenv -``` - -or if you want to use it as a bin command -```shell -go get github.com/joho/godotenv/cmd/godotenv -``` - -## Usage - -Add your application configuration to your `.env` file in the root of your project: - -```shell -S3_BUCKET=YOURS3BUCKET -SECRET_KEY=YOURSECRETKEYGOESHERE -``` - -Then in your Go app you can do something like - -```go -package main - -import ( - "github.com/joho/godotenv" - "log" - "os" -) - -func main() { - err := godotenv.Load() - if err != nil { - log.Fatal("Error loading .env file") - } - - s3Bucket := os.Getenv("S3_BUCKET") - secretKey := os.Getenv("SECRET_KEY") - - // now do something with s3 or whatever -} -``` - -If you're even lazier than that, you can just take advantage of the autoload package which will read in `.env` on import - -```go -import _ "github.com/joho/godotenv/autoload" -``` - -While `.env` in the project root is the default, you don't have to be constrained, both examples below are 100% legit - -```go -_ = godotenv.Load("somerandomfile") -_ = godotenv.Load("filenumberone.env", "filenumbertwo.env") -``` - -If you want to be really fancy with your env file you can do comments and exports (below is a valid env file) - -```shell -# I am a comment and that is OK -SOME_VAR=someval -FOO=BAR # comments at line end are OK too -export BAR=BAZ -``` - -Or finally you can do YAML(ish) style - -```yaml -FOO: bar -BAR: baz -``` - -as a final aside, if you don't want godotenv munging your env you can just get a map back instead - -```go -var myEnv map[string]string -myEnv, err := godotenv.Read() - -s3Bucket := myEnv["S3_BUCKET"] -``` - -... or from an `io.Reader` instead of a local file - -```go -reader := getRemoteFile() -myEnv, err := godotenv.Parse(reader) -``` - -... or from a `string` if you so desire - -```go -content := getRemoteFileContent() -myEnv, err := godotenv.Unmarshal(content) -``` - -### Command Mode - -Assuming you've installed the command as above and you've got `$GOPATH/bin` in your `$PATH` - -``` -godotenv -f /some/path/to/.env some_command with some args -``` - -If you don't specify `-f` it will fall back on the default of loading `.env` in `PWD` - -### Writing Env Files - -Godotenv can also write a map representing the environment to a correctly-formatted and escaped file - -```go -env, err := godotenv.Unmarshal("KEY=value") -err := godotenv.Write(env, "./.env") -``` - -... or to a string - -```go -env, err := godotenv.Unmarshal("KEY=value") -content, err := godotenv.Marshal(env) -``` - -## Contributing - -Contributions are most welcome! The parser itself is pretty stupidly naive and I wouldn't be surprised if it breaks with edge cases. - -*code changes without tests will not be accepted* - -1. Fork it -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Commit your changes (`git commit -am 'Added some feature'`) -4. Push to the branch (`git push origin my-new-feature`) -5. Create new Pull Request - -## Releases - -Releases should follow [Semver](http://semver.org/) though the first couple of releases are `v1` and `v1.1`. - -Use [annotated tags for all releases](https://github.com/joho/godotenv/issues/30). Example `git tag -a v1.2.1` - -## CI - -Linux: [![Build Status](https://travis-ci.org/joho/godotenv.svg?branch=master)](https://travis-ci.org/joho/godotenv) Windows: [![Build status](https://ci.appveyor.com/api/projects/status/9v40vnfvvgde64u4)](https://ci.appveyor.com/project/joho/godotenv) - -## Who? - -The original library [dotenv](https://github.com/bkeepers/dotenv) was written by [Brandon Keepers](http://opensoul.org/), and this port was done by [John Barton](https://johnbarton.co/) based off the tests/fixtures in the original library. diff --git a/vendor/github.com/joho/godotenv/godotenv.go b/vendor/github.com/joho/godotenv/godotenv.go deleted file mode 100644 index 29b436c77..000000000 --- a/vendor/github.com/joho/godotenv/godotenv.go +++ /dev/null @@ -1,346 +0,0 @@ -// Package godotenv is a go port of the ruby dotenv library (https://github.com/bkeepers/dotenv) -// -// Examples/readme can be found on the github page at https://github.com/joho/godotenv -// -// The TL;DR is that you make a .env file that looks something like -// -// SOME_ENV_VAR=somevalue -// -// and then in your go code you can call -// -// godotenv.Load() -// -// and all the env vars declared in .env will be available through os.Getenv("SOME_ENV_VAR") -package godotenv - -import ( - "bufio" - "errors" - "fmt" - "io" - "os" - "os/exec" - "regexp" - "sort" - "strings" -) - -const doubleQuoteSpecialChars = "\\\n\r\"!$`" - -// Load will read your env file(s) and load them into ENV for this process. -// -// Call this function as close as possible to the start of your program (ideally in main) -// -// If you call Load without any args it will default to loading .env in the current path -// -// You can otherwise tell it which files to load (there can be more than one) like -// -// godotenv.Load("fileone", "filetwo") -// -// It's important to note that it WILL NOT OVERRIDE an env variable that already exists - consider the .env file to set dev vars or sensible defaults -func Load(filenames ...string) (err error) { - filenames = filenamesOrDefault(filenames) - - for _, filename := range filenames { - err = loadFile(filename, false) - if err != nil { - return // return early on a spazout - } - } - return -} - -// Overload will read your env file(s) and load them into ENV for this process. -// -// Call this function as close as possible to the start of your program (ideally in main) -// -// If you call Overload without any args it will default to loading .env in the current path -// -// You can otherwise tell it which files to load (there can be more than one) like -// -// godotenv.Overload("fileone", "filetwo") -// -// It's important to note this WILL OVERRIDE an env variable that already exists - consider the .env file to forcefilly set all vars. -func Overload(filenames ...string) (err error) { - filenames = filenamesOrDefault(filenames) - - for _, filename := range filenames { - err = loadFile(filename, true) - if err != nil { - return // return early on a spazout - } - } - return -} - -// Read all env (with same file loading semantics as Load) but return values as -// a map rather than automatically writing values into env -func Read(filenames ...string) (envMap map[string]string, err error) { - filenames = filenamesOrDefault(filenames) - envMap = make(map[string]string) - - for _, filename := range filenames { - individualEnvMap, individualErr := readFile(filename) - - if individualErr != nil { - err = individualErr - return // return early on a spazout - } - - for key, value := range individualEnvMap { - envMap[key] = value - } - } - - return -} - -// Parse reads an env file from io.Reader, returning a map of keys and values. -func Parse(r io.Reader) (envMap map[string]string, err error) { - envMap = make(map[string]string) - - var lines []string - scanner := bufio.NewScanner(r) - for scanner.Scan() { - lines = append(lines, scanner.Text()) - } - - if err = scanner.Err(); err != nil { - return - } - - for _, fullLine := range lines { - if !isIgnoredLine(fullLine) { - var key, value string - key, value, err = parseLine(fullLine, envMap) - - if err != nil { - return - } - envMap[key] = value - } - } - return -} - -//Unmarshal reads an env file from a string, returning a map of keys and values. -func Unmarshal(str string) (envMap map[string]string, err error) { - return Parse(strings.NewReader(str)) -} - -// Exec loads env vars from the specified filenames (empty map falls back to default) -// then executes the cmd specified. -// -// Simply hooks up os.Stdin/err/out to the command and calls Run() -// -// If you want more fine grained control over your command it's recommended -// that you use `Load()` or `Read()` and the `os/exec` package yourself. -func Exec(filenames []string, cmd string, cmdArgs []string) error { - Load(filenames...) - - command := exec.Command(cmd, cmdArgs...) - command.Stdin = os.Stdin - command.Stdout = os.Stdout - command.Stderr = os.Stderr - return command.Run() -} - -// Write serializes the given environment and writes it to a file -func Write(envMap map[string]string, filename string) error { - content, error := Marshal(envMap) - if error != nil { - return error - } - file, error := os.Create(filename) - if error != nil { - return error - } - _, err := file.WriteString(content) - return err -} - -// Marshal outputs the given environment as a dotenv-formatted environment file. -// Each line is in the format: KEY="VALUE" where VALUE is backslash-escaped. -func Marshal(envMap map[string]string) (string, error) { - lines := make([]string, 0, len(envMap)) - for k, v := range envMap { - lines = append(lines, fmt.Sprintf(`%s="%s"`, k, doubleQuoteEscape(v))) - } - sort.Strings(lines) - return strings.Join(lines, "\n"), nil -} - -func filenamesOrDefault(filenames []string) []string { - if len(filenames) == 0 { - return []string{".env"} - } - return filenames -} - -func loadFile(filename string, overload bool) error { - envMap, err := readFile(filename) - if err != nil { - return err - } - - currentEnv := map[string]bool{} - rawEnv := os.Environ() - for _, rawEnvLine := range rawEnv { - key := strings.Split(rawEnvLine, "=")[0] - currentEnv[key] = true - } - - for key, value := range envMap { - if !currentEnv[key] || overload { - os.Setenv(key, value) - } - } - - return nil -} - -func readFile(filename string) (envMap map[string]string, err error) { - file, err := os.Open(filename) - if err != nil { - return - } - defer file.Close() - - return Parse(file) -} - -func parseLine(line string, envMap map[string]string) (key string, value string, err error) { - if len(line) == 0 { - err = errors.New("zero length string") - return - } - - // ditch the comments (but keep quoted hashes) - if strings.Contains(line, "#") { - segmentsBetweenHashes := strings.Split(line, "#") - quotesAreOpen := false - var segmentsToKeep []string - for _, segment := range segmentsBetweenHashes { - if strings.Count(segment, "\"") == 1 || strings.Count(segment, "'") == 1 { - if quotesAreOpen { - quotesAreOpen = false - segmentsToKeep = append(segmentsToKeep, segment) - } else { - quotesAreOpen = true - } - } - - if len(segmentsToKeep) == 0 || quotesAreOpen { - segmentsToKeep = append(segmentsToKeep, segment) - } - } - - line = strings.Join(segmentsToKeep, "#") - } - - firstEquals := strings.Index(line, "=") - firstColon := strings.Index(line, ":") - splitString := strings.SplitN(line, "=", 2) - if firstColon != -1 && (firstColon < firstEquals || firstEquals == -1) { - //this is a yaml-style line - splitString = strings.SplitN(line, ":", 2) - } - - if len(splitString) != 2 { - err = errors.New("Can't separate key from value") - return - } - - // Parse the key - key = splitString[0] - if strings.HasPrefix(key, "export") { - key = strings.TrimPrefix(key, "export") - } - key = strings.Trim(key, " ") - - // Parse the value - value = parseValue(splitString[1], envMap) - return -} - -func parseValue(value string, envMap map[string]string) string { - - // trim - value = strings.Trim(value, " ") - - // check if we've got quoted values or possible escapes - if len(value) > 1 { - rs := regexp.MustCompile(`\A'(.*)'\z`) - singleQuotes := rs.FindStringSubmatch(value) - - rd := regexp.MustCompile(`\A"(.*)"\z`) - doubleQuotes := rd.FindStringSubmatch(value) - - if singleQuotes != nil || doubleQuotes != nil { - // pull the quotes off the edges - value = value[1 : len(value)-1] - } - - if doubleQuotes != nil { - // expand newlines - escapeRegex := regexp.MustCompile(`\\.`) - value = escapeRegex.ReplaceAllStringFunc(value, func(match string) string { - c := strings.TrimPrefix(match, `\`) - switch c { - case "n": - return "\n" - case "r": - return "\r" - default: - return match - } - }) - // unescape characters - e := regexp.MustCompile(`\\([^$])`) - value = e.ReplaceAllString(value, "$1") - } - - if singleQuotes == nil { - value = expandVariables(value, envMap) - } - } - - return value -} - -func expandVariables(v string, m map[string]string) string { - r := regexp.MustCompile(`(\\)?(\$)(\()?\{?([A-Z0-9_]+)?\}?`) - - return r.ReplaceAllStringFunc(v, func(s string) string { - submatch := r.FindStringSubmatch(s) - - if submatch == nil { - return s - } - if submatch[1] == "\\" || submatch[2] == "(" { - return submatch[0][1:] - } else if submatch[4] != "" { - return m[submatch[4]] - } - return s - }) -} - -func isIgnoredLine(line string) bool { - trimmedLine := strings.Trim(line, " \n\t") - return len(trimmedLine) == 0 || strings.HasPrefix(trimmedLine, "#") -} - -func doubleQuoteEscape(line string) string { - for _, c := range doubleQuoteSpecialChars { - toReplace := "\\" + string(c) - if c == '\n' { - toReplace = `\n` - } - if c == '\r' { - toReplace = `\r` - } - line = strings.Replace(line, string(c), toReplace, -1) - } - return line -} diff --git a/vendor/github.com/karrick/godirwalk/.gitignore b/vendor/github.com/karrick/godirwalk/.gitignore deleted file mode 100644 index ea2d9ece6..000000000 --- a/vendor/github.com/karrick/godirwalk/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ - -examples/remove-empty-directories/remove-empty-directories -examples/sizes/sizes -examples/walk-fast/walk-fast -examples/walk-stdlib/walk-stdlib diff --git a/vendor/github.com/karrick/godirwalk/LICENSE b/vendor/github.com/karrick/godirwalk/LICENSE deleted file mode 100644 index 01ce194c8..000000000 --- a/vendor/github.com/karrick/godirwalk/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -BSD 2-Clause License - -Copyright (c) 2017, Karrick McDermott -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. - -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/karrick/godirwalk/README.md b/vendor/github.com/karrick/godirwalk/README.md deleted file mode 100644 index dfe540660..000000000 --- a/vendor/github.com/karrick/godirwalk/README.md +++ /dev/null @@ -1,207 +0,0 @@ -# godirwalk - -`godirwalk` is a library for traversing a directory tree on a file -system. - -[![GoDoc](https://godoc.org/github.com/karrick/godirwalk?status.svg)](https://godoc.org/github.com/karrick/godirwalk) [![Build Status](https://dev.azure.com/microsoft0235/microsoft/_apis/build/status/karrick.godirwalk?branchName=master)](https://dev.azure.com/microsoft0235/microsoft/_build/latest?definitionId=1&branchName=master) - -In short, why do I use this library? - -1. It's faster than `filepath.Walk`. -1. It's more correct on Windows than `filepath.Walk`. -1. It's more easy to use than `filepath.Walk`. -1. It's more flexible than `filepath.Walk`. - -## Usage Example - -Additional examples are provided in the `examples/` subdirectory. - -This library will normalize the provided top level directory name -based on the os-specific path separator by calling `filepath.Clean` on -its first argument. However it always provides the pathname created by -using the correct os-specific path separator when invoking the -provided callback function. - -```Go - dirname := "some/directory/root" - err := godirwalk.Walk(dirname, &godirwalk.Options{ - Callback: func(osPathname string, de *godirwalk.Dirent) error { - fmt.Printf("%s %s\n", de.ModeType(), osPathname) - return nil - }, - Unsorted: true, // (optional) set true for faster yet non-deterministic enumeration (see godoc) - }) -``` - -This library not only provides functions for traversing a file system -directory tree, but also for obtaining a list of immediate descendants -of a particular directory, typically much more quickly than using -`os.ReadDir` or `os.ReadDirnames`. - -## Description - -Here's why I use `godirwalk` in preference to `filepath.Walk`, -`os.ReadDir`, and `os.ReadDirnames`. - -### It's faster than `filepath.Walk` - -When compared against `filepath.Walk` in benchmarks, it has been -observed to run between five and ten times the speed on darwin, at -speeds comparable to the that of the unix `find` utility; about twice -the speed on linux; and about four times the speed on Windows. - -How does it obtain this performance boost? It does less work to give -you nearly the same output. This library calls the same `syscall` -functions to do the work, but it makes fewer calls, does not throw -away information that it might need, and creates less memory churn -along the way by reusing the same scratch buffer rather than -reallocating a new buffer every time it reads data from the operating -system. - -While traversing a file system directory tree, `filepath.Walk` obtains -the list of immediate descendants of a directory, and throws away the -file system node type information provided by the operating system -that comes with the node's name. Then, immediately prior to invoking -the callback function, `filepath.Walk` invokes `os.Stat` for each -node, and passes the returned `os.FileInfo` information to the -callback. - -While the `os.FileInfo` information provided by `os.Stat` is extremely -helpful--and even includes the `os.FileMode` data--providing it -requires an additional system call for each node. - -Because most callbacks only care about what the node type is, this -library does not throw the type information away, but rather provides -that information to the callback function in the form of a -`os.FileMode` value. Note that the provided `os.FileMode` value that -this library provides only has the node type information, and does not -have the permission bits, sticky bits, or other information from the -file's mode. If the callback does care about a particular node's -entire `os.FileInfo` data structure, the callback can easiy invoke -`os.Stat` when needed, and only when needed. - -#### Benchmarks - -##### macOS - -```Bash -go test -bench=. -goos: darwin -goarch: amd64 -pkg: github.com/karrick/godirwalk -BenchmarkFilepathWalk-8 1 3001274570 ns/op -BenchmarkGoDirWalk-8 3 465573172 ns/op -BenchmarkFlameGraphFilepathWalk-8 1 6957916936 ns/op -BenchmarkFlameGraphGoDirWalk-8 1 4210582571 ns/op -PASS -ok github.com/karrick/godirwalk 16.822s -``` - -##### Linux - -```Bash -go test -bench=. -goos: linux -goarch: amd64 -pkg: github.com/karrick/godirwalk -BenchmarkFilepathWalk-12 1 1609189170 ns/op -BenchmarkGoDirWalk-12 5 211336628 ns/op -BenchmarkFlameGraphFilepathWalk-12 1 3968119932 ns/op -BenchmarkFlameGraphGoDirWalk-12 1 2139598998 ns/op -PASS -ok github.com/karrick/godirwalk 9.007s -``` - -### It's more correct on Windows than `filepath.Walk` - -I did not previously care about this either, but humor me. We all love -how we can write once and run everywhere. It is essential for the -language's adoption, growth, and success, that the software we create -can run unmodified on all architectures and operating systems -supported by Go. - -When the traversed file system has a logical loop caused by symbolic -links to directories, on unix `filepath.Walk` ignores symbolic links -and traverses the entire directory tree without error. On Windows -however, `filepath.Walk` will continue following directory symbolic -links, even though it is not supposed to, eventually causing -`filepath.Walk` to terminate early and return an error when the -pathname gets too long from concatenating endless loops of symbolic -links onto the pathname. This error comes from Windows, passes through -`filepath.Walk`, and to the upstream client running `filepath.Walk`. - -The takeaway is that behavior is different based on which platform -`filepath.Walk` is running. While this is clearly not intentional, -until it is fixed in the standard library, it presents a compatibility -problem. - -This library correctly identifies symbolic links that point to -directories and will only follow them when `FollowSymbolicLinks` is -set to true. Behavior on Windows and other operating systems is -identical. - -### It's more easy to use than `filepath.Walk` - -Since this library does not invoke `os.Stat` on every file system node -it encounters, there is no possible error event for the callback -function to filter on. The third argument in the `filepath.WalkFunc` -function signature to pass the error from `os.Stat` to the callback -function is no longer necessary, and thus eliminated from signature of -the callback function from this library. - -Also, `filepath.Walk` invokes the callback function with a solidus -delimited pathname regardless of the os-specific path separator. This -library invokes the callback function with the os-specific pathname -separator, obviating a call to `filepath.Clean` in the callback -function for each node prior to actually using the provided pathname. - -In other words, even on Windows, `filepath.Walk` will invoke the -callback with `some/path/to/foo.txt`, requiring well written clients -to perform pathname normalization for every file prior to working with -the specified file. In truth, many clients developed on unix and not -tested on Windows neglect this subtlety, and will result in software -bugs when running on Windows. This library would invoke the callback -function with `some\path\to\foo.txt` for the same file when running on -Windows, eliminating the need to normalize the pathname by the client, -and lessen the likelyhood that a client will work on unix but not on -Windows. - -### It's more flexible than `filepath.Walk` - -#### Configurable Handling of Symbolic Links - -The default behavior of this library is to ignore symbolic links to -directories when walking a directory tree, just like `filepath.Walk` -does. However, it does invoke the callback function with each node it -finds, including symbolic links. If a particular use case exists to -follow symbolic links when traversing a directory tree, this library -can be invoked in manner to do so, by setting the -`FollowSymbolicLinks` parameter to true. - -#### Configurable Sorting of Directory Children - -The default behavior of this library is to always sort the immediate -descendants of a directory prior to visiting each node, just like -`filepath.Walk` does. This is usually the desired behavior. However, -this does come at a performance penalty to sort the names when a -directory node has many entries. If a particular use case exists that -does not require sorting the directory's immediate descendants prior -to visiting its nodes, this library will skip the sorting step when -the `Unsorted` parameter is set to true. - -#### Configurable Post Children Callback - -This library provides upstream code with the ability to specify a -callback to be invoked for each directory after its children are -processed. This has been used to recursively delete empty directories -after traversing the file system in a more efficient manner. See the -`examples/clean-empties` directory for an example of this usage. - -#### Configurable Error Callback - -This library provides upstream code with the ability to specify a -callback to be invoked for errors that the operating system returns, -allowing the upstream code to determine the next course of action to -take, whether to halt walking the hierarchy, as it would do were no -error callback provided, or skip the node that caused the error. See -the `examples/walk-fast` directory for an example of this usage. diff --git a/vendor/github.com/karrick/godirwalk/azure-pipelines.yml b/vendor/github.com/karrick/godirwalk/azure-pipelines.yml deleted file mode 100644 index 64d1d0629..000000000 --- a/vendor/github.com/karrick/godirwalk/azure-pipelines.yml +++ /dev/null @@ -1,56 +0,0 @@ -# Go -# Build your Go project. -# Add steps that test, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/go - -trigger: -- master - -variables: - GOVERSION: 1.12 - -jobs: - - job: Linux - pool: - vmImage: 'Ubuntu-16.04' - - steps: - - task: GoTool@0 - displayName: 'Use Go $(GOVERSION)' - inputs: - version: $(GOVERSION) - - task: Go@0 - inputs: - command: test - arguments: -v ./... - displayName: 'Execute Tests' - - - job: Mac - pool: - vmImage: 'macos-10.13' - - steps: - - task: GoTool@0 - displayName: 'Use Go $(GOVERSION)' - inputs: - version: $(GOVERSION) - - task: Go@0 - inputs: - command: test - arguments: -v ./... - displayName: 'Execute Tests' - - - job: Windows - pool: - vmImage: 'vs2017-win2016' - - steps: - - task: GoTool@0 - displayName: 'Use Go $(GOVERSION)' - inputs: - version: $(GOVERSION) - - task: Go@0 - inputs: - command: test - arguments: -v ./... - displayName: 'Execute Tests' diff --git a/vendor/github.com/karrick/godirwalk/dirent.go b/vendor/github.com/karrick/godirwalk/dirent.go deleted file mode 100644 index 419ba2f2d..000000000 --- a/vendor/github.com/karrick/godirwalk/dirent.go +++ /dev/null @@ -1,76 +0,0 @@ -package godirwalk - -import ( - "os" - "path/filepath" -) - -// Dirent stores the name and file system mode type of discovered file system -// entries. -type Dirent struct { - name string - modeType os.FileMode -} - -// NewDirent returns a newly initialized Dirent structure, or an error. This -// function does not follow symbolic links. -// -// This function is rarely used, as Dirent structures are provided by other -// functions in this library that read and walk directories, but is provided, -// however, for the occasion when a program needs to create a Dirent. -func NewDirent(osPathname string) (*Dirent, error) { - fi, err := os.Lstat(osPathname) - if err != nil { - return nil, err - } - return &Dirent{ - name: filepath.Base(osPathname), - modeType: fi.Mode() & os.ModeType, - }, nil -} - -// Name returns the basename of the file system entry. -func (de Dirent) Name() string { return de.name } - -// ModeType returns the mode bits that specify the file system node type. We -// could make our own enum-like data type for encoding the file type, but Go's -// runtime already gives us architecture independent file modes, as discussed in -// `os/types.go`: -// -// Go's runtime FileMode type has same definition on all systems, so that -// information about files can be moved from one system to another portably. -func (de Dirent) ModeType() os.FileMode { return de.modeType } - -// IsDir returns true if and only if the Dirent represents a file system -// directory. Note that on some operating systems, more than one file mode bit -// may be set for a node. For instance, on Windows, a symbolic link that points -// to a directory will have both the directory and the symbolic link bits set. -func (de Dirent) IsDir() bool { return de.modeType&os.ModeDir != 0 } - -// IsRegular returns true if and only if the Dirent represents a regular file. -// That is, it ensures that no mode type bits are set. -func (de Dirent) IsRegular() bool { return de.modeType&os.ModeType == 0 } - -// IsSymlink returns true if and only if the Dirent represents a file system -// symbolic link. Note that on some operating systems, more than one file mode -// bit may be set for a node. For instance, on Windows, a symbolic link that -// points to a directory will have both the directory and the symbolic link bits -// set. -func (de Dirent) IsSymlink() bool { return de.modeType&os.ModeSymlink != 0 } - -// IsDevice returns true if and only if the Dirent represents a device file. -func (de Dirent) IsDevice() bool { return de.modeType&os.ModeDevice != 0 } - -// Dirents represents a slice of Dirent pointers, which are sortable by -// name. This type satisfies the `sort.Interface` interface. -type Dirents []*Dirent - -// Len returns the count of Dirent structures in the slice. -func (l Dirents) Len() int { return len(l) } - -// Less returns true if and only if the Name of the element specified by the -// first index is lexicographically less than that of the second index. -func (l Dirents) Less(i, j int) bool { return l[i].name < l[j].name } - -// Swap exchanges the two Dirent entries specified by the two provided indexes. -func (l Dirents) Swap(i, j int) { l[i], l[j] = l[j], l[i] } diff --git a/vendor/github.com/karrick/godirwalk/doc.go b/vendor/github.com/karrick/godirwalk/doc.go deleted file mode 100644 index 119748220..000000000 --- a/vendor/github.com/karrick/godirwalk/doc.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -Package godirwalk provides functions to read and traverse directory trees. - -In short, why do I use this library? - -* It's faster than `filepath.Walk`. - -* It's more correct on Windows than `filepath.Walk`. - -* It's more easy to use than `filepath.Walk`. - -* It's more flexible than `filepath.Walk`. - -USAGE - -This library will normalize the provided top level directory name based on the -os-specific path separator by calling `filepath.Clean` on its first -argument. However it always provides the pathname created by using the correct -os-specific path separator when invoking the provided callback function. - - dirname := "some/directory/root" - err := godirwalk.Walk(dirname, &godirwalk.Options{ - Callback: func(osPathname string, de *godirwalk.Dirent) error { - fmt.Printf("%s %s\n", de.ModeType(), osPathname) - return nil - }, - }) - -This library not only provides functions for traversing a file system directory -tree, but also for obtaining a list of immediate descendants of a particular -directory, typically much more quickly than using `os.ReadDir` or -`os.ReadDirnames`. - - dirname := "some/directory" - names, err := godirwalk.ReadDirnames() -*/ -package godirwalk diff --git a/vendor/github.com/karrick/godirwalk/go.mod b/vendor/github.com/karrick/godirwalk/go.mod deleted file mode 100644 index 68668c9fc..000000000 --- a/vendor/github.com/karrick/godirwalk/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/karrick/godirwalk - -go 1.12 diff --git a/vendor/github.com/karrick/godirwalk/go.sum b/vendor/github.com/karrick/godirwalk/go.sum deleted file mode 100644 index e69de29bb..000000000 diff --git a/vendor/github.com/karrick/godirwalk/inoWithFileno.go b/vendor/github.com/karrick/godirwalk/inoWithFileno.go deleted file mode 100644 index 1dc04a717..000000000 --- a/vendor/github.com/karrick/godirwalk/inoWithFileno.go +++ /dev/null @@ -1,9 +0,0 @@ -// +build dragonfly freebsd openbsd netbsd - -package godirwalk - -import "syscall" - -func inoFromDirent(de *syscall.Dirent) uint64 { - return uint64(de.Fileno) -} diff --git a/vendor/github.com/karrick/godirwalk/inoWithIno.go b/vendor/github.com/karrick/godirwalk/inoWithIno.go deleted file mode 100644 index 0ec7c52c7..000000000 --- a/vendor/github.com/karrick/godirwalk/inoWithIno.go +++ /dev/null @@ -1,10 +0,0 @@ -// +build aix darwin linux nacl solaris - -package godirwalk - -import "syscall" - -func inoFromDirent(de *syscall.Dirent) uint64 { - // cast necessary on file systems that store ino as different type - return uint64(de.Ino) -} diff --git a/vendor/github.com/karrick/godirwalk/modeTypeWithType.go b/vendor/github.com/karrick/godirwalk/modeTypeWithType.go deleted file mode 100644 index 6fbecf080..000000000 --- a/vendor/github.com/karrick/godirwalk/modeTypeWithType.go +++ /dev/null @@ -1,47 +0,0 @@ -// +build darwin dragonfly freebsd linux netbsd openbsd - -package godirwalk - -import ( - "os" - "path/filepath" - "syscall" -) - -// modeType converts a syscall defined constant, which is in purview of OS, to a -// constant defined by Go, assumed by this project to be stable. -// -// When the syscall constant is not recognized, this function falls back to a -// Stat on the file system. -func modeType(de *syscall.Dirent, osDirname, osChildname string) (os.FileMode, error) { - switch de.Type { - case syscall.DT_REG: - return 0, nil - case syscall.DT_DIR: - return os.ModeDir, nil - case syscall.DT_LNK: - return os.ModeSymlink, nil - case syscall.DT_CHR: - return os.ModeDevice | os.ModeCharDevice, nil - case syscall.DT_BLK: - return os.ModeDevice, nil - case syscall.DT_FIFO: - return os.ModeNamedPipe, nil - case syscall.DT_SOCK: - return os.ModeSocket, nil - default: - // If syscall returned unknown type (e.g., DT_UNKNOWN, DT_WHT), - // then resolve actual mode by getting stat. - fi, err := os.Lstat(filepath.Join(osDirname, osChildname)) - if err != nil { - return 0, err - } - // Even though the stat provided all file mode bits, we want to - // ensure same values returned to caller regardless of whether - // we obtained file mode bits from syscall or stat call. - // Therefore mask out the additional file mode bits that are - // provided by stat but not by the syscall, so users can rely on - // their values. - return fi.Mode() & os.ModeType, nil - } -} diff --git a/vendor/github.com/karrick/godirwalk/modeTypeWithoutType.go b/vendor/github.com/karrick/godirwalk/modeTypeWithoutType.go deleted file mode 100644 index 1c801d1b9..000000000 --- a/vendor/github.com/karrick/godirwalk/modeTypeWithoutType.go +++ /dev/null @@ -1,28 +0,0 @@ -// +build aix js nacl solaris - -package godirwalk - -import ( - "os" - "path/filepath" - "syscall" -) - -// modeType converts a syscall defined constant, which is in purview of OS, to a -// constant defined by Go, assumed by this project to be stable. -// -// Because some operating system syscall.Dirent structure does not include a -// Type field, fall back on Stat of the file system. -func modeType(_ *syscall.Dirent, osDirname, osChildname string) (os.FileMode, error) { - fi, err := os.Lstat(filepath.Join(osDirname, osChildname)) - if err != nil { - return 0, err - } - // Even though the stat provided all file mode bits, we want to - // ensure same values returned to caller regardless of whether - // we obtained file mode bits from syscall or stat call. - // Therefore mask out the additional file mode bits that are - // provided by stat but not by the syscall, so users can rely on - // their values. - return fi.Mode() & os.ModeType, nil -} diff --git a/vendor/github.com/karrick/godirwalk/nameWithNamlen.go b/vendor/github.com/karrick/godirwalk/nameWithNamlen.go deleted file mode 100644 index 2c0231eea..000000000 --- a/vendor/github.com/karrick/godirwalk/nameWithNamlen.go +++ /dev/null @@ -1,29 +0,0 @@ -// +build aix darwin dragonfly freebsd netbsd openbsd - -package godirwalk - -import ( - "reflect" - "syscall" - "unsafe" -) - -func nameFromDirent(de *syscall.Dirent) []byte { - // Because this GOOS' syscall.Dirent provides a Namlen field that says how - // long the name is, this function does not need to search for the NULL - // byte. - ml := int(de.Namlen) - - // Convert syscall.Dirent.Name, which is array of int8, to []byte, by - // overwriting Cap, Len, and Data slice header fields to values from - // syscall.Dirent fields. Setting the Cap, Len, and Data field values for - // the slice header modifies what the slice header points to, and in this - // case, the name buffer. - var name []byte - sh := (*reflect.SliceHeader)(unsafe.Pointer(&name)) - sh.Cap = ml - sh.Len = ml - sh.Data = uintptr(unsafe.Pointer(&de.Name[0])) - - return name -} diff --git a/vendor/github.com/karrick/godirwalk/nameWithoutNamlen.go b/vendor/github.com/karrick/godirwalk/nameWithoutNamlen.go deleted file mode 100644 index f776fbc76..000000000 --- a/vendor/github.com/karrick/godirwalk/nameWithoutNamlen.go +++ /dev/null @@ -1,42 +0,0 @@ -// +build nacl linux js solaris - -package godirwalk - -import ( - "bytes" - "reflect" - "syscall" - "unsafe" -) - -// nameOffset is a compile time constant -const nameOffset = int(unsafe.Offsetof(syscall.Dirent{}.Name)) - -func nameFromDirent(de *syscall.Dirent) (name []byte) { - // Because this GOOS' syscall.Dirent does not provide a field that specifies - // the name length, this function must first calculate the max possible name - // length, and then search for the NULL byte. - ml := int(de.Reclen) - nameOffset - - // Convert syscall.Dirent.Name, which is array of int8, to []byte, by - // overwriting Cap, Len, and Data slice header fields to the max possible - // name length computed above, and finding the terminating NULL byte. - sh := (*reflect.SliceHeader)(unsafe.Pointer(&name)) - sh.Cap = ml - sh.Len = ml - sh.Data = uintptr(unsafe.Pointer(&de.Name[0])) - - if index := bytes.IndexByte(name, 0); index >= 0 { - // Found NULL byte; set slice's cap and len accordingly. - sh.Cap = index - sh.Len = index - return - } - - // NOTE: This branch is not expected, but included for defensive - // programming, and provides a hard stop on the name based on the structure - // field array size. - sh.Cap = len(de.Name) - sh.Len = sh.Cap - return -} diff --git a/vendor/github.com/karrick/godirwalk/readdir.go b/vendor/github.com/karrick/godirwalk/readdir.go deleted file mode 100644 index 0c1910848..000000000 --- a/vendor/github.com/karrick/godirwalk/readdir.go +++ /dev/null @@ -1,49 +0,0 @@ -package godirwalk - -// ReadDirents returns a sortable slice of pointers to Dirent structures, each -// representing the file system name and mode type for one of the immediate -// descendant of the specified directory. If the specified directory is a -// symbolic link, it will be resolved. -// -// If an optional scratch buffer is provided that is at least one page of -// memory, it will be used when reading directory entries from the file system. -// -// children, err := godirwalk.ReadDirents(osDirname, nil) -// if err != nil { -// return nil, errors.Wrap(err, "cannot get list of directory children") -// } -// sort.Sort(children) -// for _, child := range children { -// fmt.Printf("%s %s\n", child.ModeType, child.Name) -// } -func ReadDirents(osDirname string, scratchBuffer []byte) (Dirents, error) { - // Invokes build flag enabled version of this function. - return readdirents(osDirname, scratchBuffer) -} - -// ReadDirnames returns a slice of strings, representing the immediate -// descendants of the specified directory. If the specified directory is a -// symbolic link, it will be resolved. -// -// If an optional scratch buffer is provided that is at least one page of -// memory, it will be used when reading directory entries from the file system. -// -// Note that this function, depending on operating system, may or may not invoke -// the ReadDirents function, in order to prepare the list of immediate -// descendants. Therefore, if your program needs both the names and the file -// system mode types of descendants, it will always be faster to invoke -// ReadDirents directly, rather than calling this function, then looping over -// the results and calling os.Stat for each child. -// -// children, err := godirwalk.ReadDirnames(osDirname, nil) -// if err != nil { -// return nil, errors.Wrap(err, "cannot get list of directory children") -// } -// sort.Strings(children) -// for _, child := range children { -// fmt.Printf("%s\n", child) -// } -func ReadDirnames(osDirname string, scratchBuffer []byte) ([]string, error) { - // Invokes build flag enabled version of this function. - return readdirnames(osDirname, scratchBuffer) -} diff --git a/vendor/github.com/karrick/godirwalk/readdir_unix.go b/vendor/github.com/karrick/godirwalk/readdir_unix.go deleted file mode 100644 index 3bedc6519..000000000 --- a/vendor/github.com/karrick/godirwalk/readdir_unix.go +++ /dev/null @@ -1,115 +0,0 @@ -// +build !windows - -package godirwalk - -import ( - "os" - "syscall" - "unsafe" -) - -func readdirents(osDirname string, scratchBuffer []byte) (Dirents, error) { - dh, err := os.Open(osDirname) - if err != nil { - return nil, err - } - fd := int(dh.Fd()) - - if len(scratchBuffer) < MinimumScratchBufferSize { - scratchBuffer = make([]byte, DefaultScratchBufferSize) - } - - var entries Dirents - var de *syscall.Dirent - - for { - n, err := syscall.ReadDirent(fd, scratchBuffer) - if err != nil { - _ = dh.Close() // ignore potential error returned by Close - return nil, err - } - if n <= 0 { - break // end of directory reached - } - // Loop over the bytes returned by reading the directory entries. - buf := scratchBuffer[:n] - for len(buf) > 0 { - de = (*syscall.Dirent)(unsafe.Pointer(&buf[0])) // point entry to first syscall.Dirent in buffer - buf = buf[de.Reclen:] // advance buffer for next iteration through loop - - if inoFromDirent(de) == 0 { - continue // this item has been deleted, but its entry not yet removed from directory listing - } - - nameSlice := nameFromDirent(de) - namlen := len(nameSlice) - if (namlen == 0) || (namlen == 1 && nameSlice[0] == '.') || (namlen == 2 && nameSlice[0] == '.' && nameSlice[1] == '.') { - continue // skip unimportant entries - } - osChildname := string(nameSlice) - - mode, err := modeType(de, osDirname, osChildname) - if err != nil { - _ = dh.Close() // ignore potential error returned by Close - return nil, err - } - - entries = append(entries, &Dirent{name: osChildname, modeType: mode}) - } - } - - if err = dh.Close(); err != nil { - return nil, err - } - return entries, nil -} - -func readdirnames(osDirname string, scratchBuffer []byte) ([]string, error) { - dh, err := os.Open(osDirname) - if err != nil { - return nil, err - } - fd := int(dh.Fd()) - - if len(scratchBuffer) < MinimumScratchBufferSize { - scratchBuffer = make([]byte, DefaultScratchBufferSize) - } - - var entries []string - var de *syscall.Dirent - - for { - n, err := syscall.ReadDirent(fd, scratchBuffer) - if err != nil { - _ = dh.Close() // ignore potential error returned by Close - return nil, err - } - if n <= 0 { - break // end of directory reached - } - // Loop over the bytes returned by reading the directory entries. - buf := scratchBuffer[:n] - for len(buf) > 0 { - de = (*syscall.Dirent)(unsafe.Pointer(&buf[0])) // point entry to first syscall.Dirent in buffer - buf = buf[de.Reclen:] // advance buffer for next iteration through loop - - if inoFromDirent(de) == 0 { - continue // this item has been deleted, but its entry not yet removed from directory listing - } - - nameSlice := nameFromDirent(de) - namlen := len(nameSlice) - if (namlen == 0) || (namlen == 1 && nameSlice[0] == '.') || (namlen == 2 && nameSlice[0] == '.' && nameSlice[1] == '.') { - continue // skip unimportant entries - } - osChildname := string(nameSlice) - - entries = append(entries, osChildname) - } - } - - if err = dh.Close(); err != nil { - return nil, err - } - return entries, nil -} diff --git a/vendor/github.com/karrick/godirwalk/readdir_windows.go b/vendor/github.com/karrick/godirwalk/readdir_windows.go deleted file mode 100644 index 0327bdfb8..000000000 --- a/vendor/github.com/karrick/godirwalk/readdir_windows.go +++ /dev/null @@ -1,51 +0,0 @@ -package godirwalk - -// The functions in this file are mere wrappers of what is already provided by -// standard library, in order to provide the same API as this library provides. -// -// The scratch buffer parameter in these functions is the underscore because -// presently that parameter is ignored by the functions for this architecture. -// -// Please send PR or link to article if you know of a more performant way of -// enumerating directory contents and mode types on Windows. - -import "os" - -func readdirents(osDirname string, _ []byte) (Dirents, error) { - dh, err := os.Open(osDirname) - if err != nil { - return nil, err - } - - fileinfos, err := dh.Readdir(0) - if er := dh.Close(); err == nil { - err = er - } - if err != nil { - return nil, err - } - - entries := make(Dirents, len(fileinfos)) - for i, info := range fileinfos { - entries[i] = &Dirent{name: info.Name(), modeType: info.Mode() & os.ModeType} - } - - return entries, nil -} - -func readdirnames(osDirname string, _ []byte) ([]string, error) { - dh, err := os.Open(osDirname) - if err != nil { - return nil, err - } - - entries, err := dh.Readdirnames(0) - if er := dh.Close(); err == nil { - err = er - } - if err != nil { - return nil, err - } - - return entries, nil -} diff --git a/vendor/github.com/karrick/godirwalk/symdir.go b/vendor/github.com/karrick/godirwalk/symdir.go deleted file mode 100644 index d3f7eb086..000000000 --- a/vendor/github.com/karrick/godirwalk/symdir.go +++ /dev/null @@ -1,22 +0,0 @@ -package godirwalk - -import "os" - -func isDirectoryOrSymlinkToDirectory(de *Dirent, osPathname string) (bool, error) { - if de.IsDir() { - return true, nil - } - return isSymlinkToDirectory(de, osPathname) -} - -func isSymlinkToDirectory(de *Dirent, osPathname string) (bool, error) { - if !de.IsSymlink() { - return false, nil - } - // Need to resolve the symbolic link's referent in order to respond. - info, err := os.Stat(osPathname) - if err != nil { - return false, err - } - return info.IsDir(), nil -} diff --git a/vendor/github.com/karrick/godirwalk/walk.go b/vendor/github.com/karrick/godirwalk/walk.go deleted file mode 100644 index 10aa2b4e1..000000000 --- a/vendor/github.com/karrick/godirwalk/walk.go +++ /dev/null @@ -1,317 +0,0 @@ -package godirwalk - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "sort" -) - -// DefaultScratchBufferSize specifies the size of the scratch buffer that will -// be allocated by Walk, ReadDirents, or ReadDirnames when a scratch buffer is -// not provided or the scratch buffer that is provided is smaller than -// MinimumScratchBufferSize bytes. This may seem like a large value; however, -// when a program intends to enumerate large directories, having a larger -// scratch buffer results in fewer operating system calls. -const DefaultScratchBufferSize = 64 * 1024 - -// MinimumScratchBufferSize specifies the minimum size of the scratch buffer -// that Walk, ReadDirents, and ReadDirnames will use when reading file entries -// from the operating system. It is initialized to the result from calling -// `os.Getpagesize()` during program startup. -var MinimumScratchBufferSize int - -func init() { - MinimumScratchBufferSize = os.Getpagesize() -} - -// Options provide parameters for how the Walk function operates. -type Options struct { - // ErrorCallback specifies a function to be invoked in the case of an error - // that could potentially be ignored while walking a file system - // hierarchy. When set to nil or left as its zero-value, any error condition - // causes Walk to immediately return the error describing what took - // place. When non-nil, this user supplied function is invoked with the OS - // pathname of the file system object that caused the error along with the - // error that took place. The return value of the supplied ErrorCallback - // function determines whether the error will cause Walk to halt immediately - // as it would were no ErrorCallback value provided, or skip this file - // system node yet continue on with the remaining nodes in the file system - // hierarchy. - // - // ErrorCallback is invoked both for errors that are returned by the - // runtime, and for errors returned by other user supplied callback - // functions. - ErrorCallback func(string, error) ErrorAction - - // FollowSymbolicLinks specifies whether Walk will follow symbolic links - // that refer to directories. When set to false or left as its zero-value, - // Walk will still invoke the callback function with symbolic link nodes, - // but if the symbolic link refers to a directory, it will not recurse on - // that directory. When set to true, Walk will recurse on symbolic links - // that refer to a directory. - FollowSymbolicLinks bool - - // Unsorted controls whether or not Walk will sort the immediate descendants - // of a directory by their relative names prior to visiting each of those - // entries. - // - // When set to false or left at its zero-value, Walk will get the list of - // immediate descendants of a particular directory, sort that list by - // lexical order of their names, and then visit each node in the list in - // sorted order. This will cause Walk to always traverse the same directory - // tree in the same order, however may be inefficient for directories with - // many immediate descendants. - // - // When set to true, Walk skips sorting the list of immediate descendants - // for a directory, and simply visits each node in the order the operating - // system enumerated them. This will be more fast, but with the side effect - // that the traversal order may be different from one invocation to the - // next. - Unsorted bool - - // Callback is a required function that Walk will invoke for every file - // system node it encounters. - Callback WalkFunc - - // PostChildrenCallback is an option function that Walk will invoke for - // every file system directory it encounters after its children have been - // processed. - PostChildrenCallback WalkFunc - - // ScratchBuffer is an optional byte slice to use as a scratch buffer for - // Walk to use when reading directory entries, to reduce amount of garbage - // generation. Not all architectures take advantage of the scratch - // buffer. If omitted or the provided buffer has fewer bytes than - // MinimumScratchBufferSize, then a buffer with DefaultScratchBufferSize - // bytes will be created and used once per Walk invocation. - ScratchBuffer []byte -} - -// ErrorAction defines a set of actions the Walk function could take based on -// the occurrence of an error while walking the file system. See the -// documentation for the ErrorCallback field of the Options structure for more -// information. -type ErrorAction int - -const ( - // Halt is the ErrorAction return value when the upstream code wants to halt - // the walk process when a runtime error takes place. It matches the default - // action the Walk function would take were no ErrorCallback provided. - Halt ErrorAction = iota - - // SkipNode is the ErrorAction return value when the upstream code wants to - // ignore the runtime error for the current file system node, skip - // processing of the node that caused the error, and continue walking the - // file system hierarchy with the remaining nodes. - SkipNode -) - -// WalkFunc is the type of the function called for each file system node visited -// by Walk. The pathname argument will contain the argument to Walk as a prefix; -// that is, if Walk is called with "dir", which is a directory containing the -// file "a", the provided WalkFunc will be invoked with the argument "dir/a", -// using the correct os.PathSeparator for the Go Operating System architecture, -// GOOS. The directory entry argument is a pointer to a Dirent for the node, -// providing access to both the basename and the mode type of the file system -// node. -// -// If an error is returned by the Callback or PostChildrenCallback functions, -// and no ErrorCallback function is provided, processing stops. If an -// ErrorCallback function is provided, then it is invoked with the OS pathname -// of the node that caused the error along along with the error. The return -// value of the ErrorCallback function determines whether to halt processing, or -// skip this node and continue processing remaining file system nodes. -// -// The exception is when the function returns the special value -// filepath.SkipDir. If the function returns filepath.SkipDir when invoked on a -// directory, Walk skips the directory's contents entirely. If the function -// returns filepath.SkipDir when invoked on a non-directory file system node, -// Walk skips the remaining files in the containing directory. Note that any -// supplied ErrorCallback function is not invoked with filepath.SkipDir when the -// Callback or PostChildrenCallback functions return that special value. -type WalkFunc func(osPathname string, directoryEntry *Dirent) error - -// Walk walks the file tree rooted at the specified directory, calling the -// specified callback function for each file system node in the tree, including -// root, symbolic links, and other node types. The nodes are walked in lexical -// order, which makes the output deterministic but means that for very large -// directories this function can be inefficient. -// -// This function is often much faster than filepath.Walk because it does not -// invoke os.Stat for every node it encounters, but rather obtains the file -// system node type when it reads the parent directory. -// -// If a runtime error occurs, either from the operating system or from the -// upstream Callback or PostChildrenCallback functions, processing typically -// halts. However, when an ErrorCallback function is provided in the provided -// Options structure, that function is invoked with the error along with the OS -// pathname of the file system node that caused the error. The ErrorCallback -// function's return value determines the action that Walk will then take. -// -// func main() { -// dirname := "." -// if len(os.Args) > 1 { -// dirname = os.Args[1] -// } -// err := godirwalk.Walk(dirname, &godirwalk.Options{ -// Callback: func(osPathname string, de *godirwalk.Dirent) error { -// fmt.Printf("%s %s\n", de.ModeType(), osPathname) -// return nil -// }, -// ErrorCallback: func(osPathname string, err error) godirwalk.ErrorAction { -// // Your program may want to log the error somehow. -// fmt.Fprintf(os.Stderr, "ERROR: %s\n", err) -// -// // For the purposes of this example, a simple SkipNode will suffice, -// // although in reality perhaps additional logic might be called for. -// return godirwalk.SkipNode -// }, -// }) -// if err != nil { -// fmt.Fprintf(os.Stderr, "%s\n", err) -// os.Exit(1) -// } -// } -func Walk(pathname string, options *Options) error { - if options.Callback == nil { - return errors.New("cannot walk without a specified Callback function") - } - - pathname = filepath.Clean(pathname) - - var fi os.FileInfo - var err error - - if options.FollowSymbolicLinks { - fi, err = os.Stat(pathname) - if err != nil { - return err - } - } else { - fi, err = os.Lstat(pathname) - if err != nil { - return err - } - } - - mode := fi.Mode() - if mode&os.ModeDir == 0 { - return fmt.Errorf("cannot Walk non-directory: %s", pathname) - } - - // If ErrorCallback is nil, set to a default value that halts the walk - // process on all operating system errors. This is done to allow error - // handling to be more succinct in the walk code. - if options.ErrorCallback == nil { - options.ErrorCallback = defaultErrorCallback - } - - if len(options.ScratchBuffer) < MinimumScratchBufferSize { - options.ScratchBuffer = make([]byte, DefaultScratchBufferSize) - } - - dirent := &Dirent{ - name: filepath.Base(pathname), - modeType: mode & os.ModeType, - } - - err = walk(pathname, dirent, options) - if err == filepath.SkipDir { - return nil // silence SkipDir for top level - } - return err -} - -// defaultErrorCallback always returns Halt because if the upstream code did not -// provide an ErrorCallback function, walking the file system hierarchy ought to -// halt upon any operating system error. -func defaultErrorCallback(_ string, _ error) ErrorAction { return Halt } - -// walk recursively traverses the file system node specified by pathname and the -// Dirent. -func walk(osPathname string, dirent *Dirent, options *Options) error { - err := options.Callback(osPathname, dirent) - if err != nil { - if err == filepath.SkipDir { - return err - } - if action := options.ErrorCallback(osPathname, err); action == SkipNode { - return nil - } - return err - } - - if dirent.IsSymlink() { - if !options.FollowSymbolicLinks { - return nil - } - isDir, err := isSymlinkToDirectory(dirent, osPathname) - if err != nil { - if action := options.ErrorCallback(osPathname, err); action == SkipNode { - return nil - } - return err - } - if !isDir { - return nil - } - } else if !dirent.IsDir() { - return nil - } - - // If get here, then specified pathname refers to a directory or a - // symbolic link to a directory. - deChildren, err := ReadDirents(osPathname, options.ScratchBuffer) - if err != nil { - if action := options.ErrorCallback(osPathname, err); action == SkipNode { - return nil - } - return err - } - - if !options.Unsorted { - sort.Sort(deChildren) // sort children entries unless upstream says to leave unsorted - } - - for _, deChild := range deChildren { - osChildname := filepath.Join(osPathname, deChild.name) - err = walk(osChildname, deChild, options) - if err == nil { - continue - } - if err != filepath.SkipDir { - return err - } - // When received SkipDir on a directory or a symbolic link to a - // directory, stop processing that directory but continue processing - // siblings. When received on a non-directory, stop processing - // remaining siblings. - isDir, err := isDirectoryOrSymlinkToDirectory(deChild, osChildname) - if err != nil { - if action := options.ErrorCallback(osChildname, err); action == SkipNode { - continue // ignore and continue with next sibling - } - return err // caller does not approve of this error - } - if !isDir { - break // stop processing remaining siblings, but allow post children callback - } - // continue processing remaining siblings - } - - if options.PostChildrenCallback == nil { - return nil - } - - err = options.PostChildrenCallback(osPathname, dirent) - if err == nil || err == filepath.SkipDir { - return err - } - - if action := options.ErrorCallback(osPathname, err); action == SkipNode { - return nil - } - return err -} diff --git a/vendor/github.com/onsi/ginkgo/CHANGELOG.md b/vendor/github.com/onsi/ginkgo/CHANGELOG.md index 6092fcb63..a733f95fc 100644 --- a/vendor/github.com/onsi/ginkgo/CHANGELOG.md +++ b/vendor/github.com/onsi/ginkgo/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.14.2 + +### Fixes +- correct handling windows backslash in import path (#721) [97f3d51] +- Add additional methods to GinkgoT() to improve compatibility with the testing.TB interface [b5fe44d] + ## 1.14.1 ### Fixes diff --git a/vendor/github.com/onsi/ginkgo/config/config.go b/vendor/github.com/onsi/ginkgo/config/config.go index feef2bcd6..3220c095c 100644 --- a/vendor/github.com/onsi/ginkgo/config/config.go +++ b/vendor/github.com/onsi/ginkgo/config/config.go @@ -20,7 +20,7 @@ import ( "fmt" ) -const VERSION = "1.14.1" +const VERSION = "1.14.2" type GinkgoConfigType struct { RandomSeed int64 diff --git a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go b/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go index 4099f99a8..99557048a 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo/generate_command.go @@ -233,18 +233,20 @@ func getPackageImportPath() string { panic(err.Error()) } + sep := string(filepath.Separator) + // Try go.mod file first modRoot := findModuleRoot(workingDir) if modRoot != "" { modName := moduleName(modRoot) if modName != "" { cd := strings.Replace(workingDir, modRoot, "", -1) + cd = strings.ReplaceAll(cd, sep, "/") return modName + cd } } // Fallback to GOPATH structure - sep := string(filepath.Separator) paths := strings.Split(workingDir, sep+"src"+sep) if len(paths) == 1 { fmt.Printf("\nCouldn't identify package import path.\n\n\tginkgo generate\n\nMust be run within a package directory under $GOPATH/src/...\nYou're going to have to change UNKNOWN_PACKAGE_PATH in the generated file...\n\n") diff --git a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go index 30ff86f59..7e8a48708 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go @@ -93,26 +93,36 @@ func GinkgoT(optionalOffset ...int) GinkgoTInterface { if len(optionalOffset) > 0 { offset = optionalOffset[0] } - return testingtproxy.New(GinkgoWriter, Fail, offset) + failedFunc := func() bool { + return CurrentGinkgoTestDescription().Failed + } + nameFunc := func() string { + return CurrentGinkgoTestDescription().FullTestText + } + return testingtproxy.New(GinkgoWriter, Fail, Skip, failedFunc, nameFunc, offset) } //The interface returned by GinkgoT(). This covers most of the methods //in the testing package's T. type GinkgoTInterface interface { - Fail() + Cleanup(func()) Error(args ...interface{}) Errorf(format string, args ...interface{}) + Fail() FailNow() + Failed() bool Fatal(args ...interface{}) Fatalf(format string, args ...interface{}) + Helper() Log(args ...interface{}) Logf(format string, args ...interface{}) - Failed() bool + Name() string Parallel() Skip(args ...interface{}) - Skipf(format string, args ...interface{}) SkipNow() + Skipf(format string, args ...interface{}) Skipped() bool + TempDir() string } //Custom Ginkgo test reporters must implement the Reporter interface. diff --git a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go b/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go index 090445d08..d7bbb7a96 100644 --- a/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go +++ b/vendor/github.com/onsi/ginkgo/internal/testingtproxy/testing_t_proxy.go @@ -6,21 +6,34 @@ import ( ) type failFunc func(message string, callerSkip ...int) +type skipFunc func(message string, callerSkip ...int) +type failedFunc func() bool +type nameFunc func() string -func New(writer io.Writer, fail failFunc, offset int) *ginkgoTestingTProxy { +func New(writer io.Writer, fail failFunc, skip skipFunc, failed failedFunc, name nameFunc, offset int) *ginkgoTestingTProxy { return &ginkgoTestingTProxy{ fail: fail, offset: offset, writer: writer, + skip: skip, + failed: failed, + name: name, } } type ginkgoTestingTProxy struct { fail failFunc + skip skipFunc + failed failedFunc + name nameFunc offset int writer io.Writer } +func (t *ginkgoTestingTProxy) Cleanup(func()) { + // No-op +} + func (t *ginkgoTestingTProxy) Error(args ...interface{}) { t.fail(fmt.Sprintln(args...), t.offset) } @@ -37,6 +50,10 @@ func (t *ginkgoTestingTProxy) FailNow() { t.fail("failed", t.offset) } +func (t *ginkgoTestingTProxy) Failed() bool { + return t.failed() +} + func (t *ginkgoTestingTProxy) Fatal(args ...interface{}) { t.fail(fmt.Sprintln(args...), t.offset) } @@ -45,6 +62,10 @@ func (t *ginkgoTestingTProxy) Fatalf(format string, args ...interface{}) { t.fail(fmt.Sprintf(format, args...), t.offset) } +func (t *ginkgoTestingTProxy) Helper() { + // No-op +} + func (t *ginkgoTestingTProxy) Log(args ...interface{}) { fmt.Fprintln(t.writer, args...) } @@ -53,24 +74,31 @@ func (t *ginkgoTestingTProxy) Logf(format string, args ...interface{}) { t.Log(fmt.Sprintf(format, args...)) } -func (t *ginkgoTestingTProxy) Failed() bool { - return false +func (t *ginkgoTestingTProxy) Name() string { + return t.name() } func (t *ginkgoTestingTProxy) Parallel() { + // No-op } func (t *ginkgoTestingTProxy) Skip(args ...interface{}) { - fmt.Println(args...) + t.skip(fmt.Sprintln(args...), t.offset) } -func (t *ginkgoTestingTProxy) Skipf(format string, args ...interface{}) { - t.Skip(fmt.Sprintf(format, args...)) +func (t *ginkgoTestingTProxy) SkipNow() { + t.skip("skip", t.offset) } -func (t *ginkgoTestingTProxy) SkipNow() { +func (t *ginkgoTestingTProxy) Skipf(format string, args ...interface{}) { + t.skip(fmt.Sprintf(format, args...), t.offset) } func (t *ginkgoTestingTProxy) Skipped() bool { return false } + +func (t *ginkgoTestingTProxy) TempDir() string { + // No-op + return "" +} diff --git a/vendor/github.com/rogpeppe/go-internal/LICENSE b/vendor/github.com/rogpeppe/go-internal/LICENSE deleted file mode 100644 index 49ea0f928..000000000 --- a/vendor/github.com/rogpeppe/go-internal/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2018 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/rogpeppe/go-internal/modfile/gopkgin.go b/vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go deleted file mode 100644 index c94b3848a..000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/gopkgin.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2018 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. - -// TODO: Figure out what gopkg.in should do. - -package modfile - -import "strings" - -// ParseGopkgIn splits gopkg.in import paths into their constituent parts -func ParseGopkgIn(path string) (root, repo, major, subdir string, ok bool) { - if !strings.HasPrefix(path, "gopkg.in/") { - return - } - f := strings.Split(path, "/") - if len(f) >= 2 { - if elem, v, ok := dotV(f[1]); ok { - root = strings.Join(f[:2], "/") - repo = "github.com/go-" + elem + "/" + elem - major = v - subdir = strings.Join(f[2:], "/") - return root, repo, major, subdir, true - } - } - if len(f) >= 3 { - if elem, v, ok := dotV(f[2]); ok { - root = strings.Join(f[:3], "/") - repo = "github.com/" + f[1] + "/" + elem - major = v - subdir = strings.Join(f[3:], "/") - return root, repo, major, subdir, true - } - } - return -} - -func dotV(name string) (elem, v string, ok bool) { - i := len(name) - 1 - for i >= 0 && '0' <= name[i] && name[i] <= '9' { - i-- - } - if i <= 2 || i+1 >= len(name) || name[i-1] != '.' || name[i] != 'v' || name[i+1] == '0' && len(name) != i+2 { - return "", "", false - } - return name[:i-1], name[i:], true -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/print.go b/vendor/github.com/rogpeppe/go-internal/modfile/print.go deleted file mode 100644 index 7b1dd8f95..000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/print.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2018 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 modfile implements parsing and formatting for -// go.mod files. -package modfile - -import ( - "bytes" - "fmt" - "strings" -) - -func Format(f *FileSyntax) []byte { - pr := &printer{} - pr.file(f) - return pr.Bytes() -} - -// A printer collects the state during printing of a file or expression. -type printer struct { - bytes.Buffer // output buffer - comment []Comment // pending end-of-line comments - margin int // left margin (indent), a number of tabs -} - -// printf prints to the buffer. -func (p *printer) printf(format string, args ...interface{}) { - fmt.Fprintf(p, format, args...) -} - -// indent returns the position on the current line, in bytes, 0-indexed. -func (p *printer) indent() int { - b := p.Bytes() - n := 0 - for n < len(b) && b[len(b)-1-n] != '\n' { - n++ - } - return n -} - -// newline ends the current line, flushing end-of-line comments. -func (p *printer) newline() { - if len(p.comment) > 0 { - p.printf(" ") - for i, com := range p.comment { - if i > 0 { - p.trim() - p.printf("\n") - for i := 0; i < p.margin; i++ { - p.printf("\t") - } - } - p.printf("%s", strings.TrimSpace(com.Token)) - } - p.comment = p.comment[:0] - } - - p.trim() - p.printf("\n") - for i := 0; i < p.margin; i++ { - p.printf("\t") - } -} - -// trim removes trailing spaces and tabs from the current line. -func (p *printer) trim() { - // Remove trailing spaces and tabs from line we're about to end. - b := p.Bytes() - n := len(b) - for n > 0 && (b[n-1] == '\t' || b[n-1] == ' ') { - n-- - } - p.Truncate(n) -} - -// file formats the given file into the print buffer. -func (p *printer) file(f *FileSyntax) { - for _, com := range f.Before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - for i, stmt := range f.Stmt { - switch x := stmt.(type) { - case *CommentBlock: - // comments already handled - p.expr(x) - - default: - p.expr(x) - p.newline() - } - - for _, com := range stmt.Comment().After { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - - if i+1 < len(f.Stmt) { - p.newline() - } - } -} - -func (p *printer) expr(x Expr) { - // Emit line-comments preceding this expression. - if before := x.Comment().Before; len(before) > 0 { - // Want to print a line comment. - // Line comments must be at the current margin. - p.trim() - if p.indent() > 0 { - // There's other text on the line. Start a new line. - p.printf("\n") - } - // Re-indent to margin. - for i := 0; i < p.margin; i++ { - p.printf("\t") - } - for _, com := range before { - p.printf("%s", strings.TrimSpace(com.Token)) - p.newline() - } - } - - switch x := x.(type) { - default: - panic(fmt.Errorf("printer: unexpected type %T", x)) - - case *CommentBlock: - // done - - case *LParen: - p.printf("(") - case *RParen: - p.printf(")") - - case *Line: - sep := "" - for _, tok := range x.Token { - p.printf("%s%s", sep, tok) - sep = " " - } - - case *LineBlock: - for _, tok := range x.Token { - p.printf("%s ", tok) - } - p.expr(&x.LParen) - p.margin++ - for _, l := range x.Line { - p.newline() - p.expr(l) - } - p.margin-- - p.newline() - p.expr(&x.RParen) - } - - // Queue end-of-line comments for printing when we - // reach the end of the line. - p.comment = append(p.comment, x.Comment().Suffix...) -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/read.go b/vendor/github.com/rogpeppe/go-internal/modfile/read.go deleted file mode 100644 index 1d81ff1ab..000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/read.go +++ /dev/null @@ -1,869 +0,0 @@ -// Copyright 2018 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. - -// Module file parser. -// This is a simplified copy of Google's buildifier parser. - -package modfile - -import ( - "bytes" - "fmt" - "os" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// A Position describes the position between two bytes of input. -type Position struct { - Line int // line in input (starting at 1) - LineRune int // rune in line (starting at 1) - Byte int // byte in input (starting at 0) -} - -// add returns the position at the end of s, assuming it starts at p. -func (p Position) add(s string) Position { - p.Byte += len(s) - if n := strings.Count(s, "\n"); n > 0 { - p.Line += n - s = s[strings.LastIndex(s, "\n")+1:] - p.LineRune = 1 - } - p.LineRune += utf8.RuneCountInString(s) - return p -} - -// An Expr represents an input element. -type Expr interface { - // Span returns the start and end position of the expression, - // excluding leading or trailing comments. - Span() (start, end Position) - - // Comment returns the comments attached to the expression. - // This method would normally be named 'Comments' but that - // would interfere with embedding a type of the same name. - Comment() *Comments -} - -// A Comment represents a single // comment. -type Comment struct { - Start Position - Token string // without trailing newline - Suffix bool // an end of line (not whole line) comment -} - -// Comments collects the comments associated with an expression. -type Comments struct { - Before []Comment // whole-line comments before this expression - Suffix []Comment // end-of-line comments after this expression - - // For top-level expressions only, After lists whole-line - // comments following the expression. - After []Comment -} - -// Comment returns the receiver. This isn't useful by itself, but -// a Comments struct is embedded into all the expression -// implementation types, and this gives each of those a Comment -// method to satisfy the Expr interface. -func (c *Comments) Comment() *Comments { - return c -} - -// A FileSyntax represents an entire go.mod file. -type FileSyntax struct { - Name string // file path - Comments - Stmt []Expr -} - -func (x *FileSyntax) Span() (start, end Position) { - if len(x.Stmt) == 0 { - return - } - start, _ = x.Stmt[0].Span() - _, end = x.Stmt[len(x.Stmt)-1].Span() - return start, end -} - -func (x *FileSyntax) addLine(hint Expr, tokens ...string) *Line { - if hint == nil { - // If no hint given, add to the last statement of the given type. - Loop: - for i := len(x.Stmt) - 1; i >= 0; i-- { - stmt := x.Stmt[i] - switch stmt := stmt.(type) { - case *Line: - if stmt.Token != nil && stmt.Token[0] == tokens[0] { - hint = stmt - break Loop - } - case *LineBlock: - if stmt.Token[0] == tokens[0] { - hint = stmt - break Loop - } - } - } - } - - if hint != nil { - for i, stmt := range x.Stmt { - switch stmt := stmt.(type) { - case *Line: - if stmt == hint { - // Convert line to line block. - stmt.InBlock = true - block := &LineBlock{Token: stmt.Token[:1], Line: []*Line{stmt}} - stmt.Token = stmt.Token[1:] - x.Stmt[i] = block - new := &Line{Token: tokens[1:], InBlock: true} - block.Line = append(block.Line, new) - return new - } - case *LineBlock: - if stmt == hint { - new := &Line{Token: tokens[1:], InBlock: true} - stmt.Line = append(stmt.Line, new) - return new - } - for j, line := range stmt.Line { - if line == hint { - // Add new line after hint. - stmt.Line = append(stmt.Line, nil) - copy(stmt.Line[j+2:], stmt.Line[j+1:]) - new := &Line{Token: tokens[1:], InBlock: true} - stmt.Line[j+1] = new - return new - } - } - } - } - } - - new := &Line{Token: tokens} - x.Stmt = append(x.Stmt, new) - return new -} - -func (x *FileSyntax) updateLine(line *Line, tokens ...string) { - if line.InBlock { - tokens = tokens[1:] - } - line.Token = tokens -} - -func (x *FileSyntax) removeLine(line *Line) { - line.Token = nil -} - -// Cleanup cleans up the file syntax x after any edit operations. -// To avoid quadratic behavior, removeLine marks the line as dead -// by setting line.Token = nil but does not remove it from the slice -// in which it appears. After edits have all been indicated, -// calling Cleanup cleans out the dead lines. -func (x *FileSyntax) Cleanup() { - w := 0 - for _, stmt := range x.Stmt { - switch stmt := stmt.(type) { - case *Line: - if stmt.Token == nil { - continue - } - case *LineBlock: - ww := 0 - for _, line := range stmt.Line { - if line.Token != nil { - stmt.Line[ww] = line - ww++ - } - } - if ww == 0 { - continue - } - if ww == 1 { - // Collapse block into single line. - line := &Line{ - Comments: Comments{ - Before: commentsAdd(stmt.Before, stmt.Line[0].Before), - Suffix: commentsAdd(stmt.Line[0].Suffix, stmt.Suffix), - After: commentsAdd(stmt.Line[0].After, stmt.After), - }, - Token: stringsAdd(stmt.Token, stmt.Line[0].Token), - } - x.Stmt[w] = line - w++ - continue - } - stmt.Line = stmt.Line[:ww] - } - x.Stmt[w] = stmt - w++ - } - x.Stmt = x.Stmt[:w] -} - -func commentsAdd(x, y []Comment) []Comment { - return append(x[:len(x):len(x)], y...) -} - -func stringsAdd(x, y []string) []string { - return append(x[:len(x):len(x)], y...) -} - -// A CommentBlock represents a top-level block of comments separate -// from any rule. -type CommentBlock struct { - Comments - Start Position -} - -func (x *CommentBlock) Span() (start, end Position) { - return x.Start, x.Start -} - -// A Line is a single line of tokens. -type Line struct { - Comments - Start Position - Token []string - InBlock bool - End Position -} - -func (x *Line) Span() (start, end Position) { - return x.Start, x.End -} - -// A LineBlock is a factored block of lines, like -// -// require ( -// "x" -// "y" -// ) -// -type LineBlock struct { - Comments - Start Position - LParen LParen - Token []string - Line []*Line - RParen RParen -} - -func (x *LineBlock) Span() (start, end Position) { - return x.Start, x.RParen.Pos.add(")") -} - -// An LParen represents the beginning of a parenthesized line block. -// It is a place to store suffix comments. -type LParen struct { - Comments - Pos Position -} - -func (x *LParen) Span() (start, end Position) { - return x.Pos, x.Pos.add(")") -} - -// An RParen represents the end of a parenthesized line block. -// It is a place to store whole-line (before) comments. -type RParen struct { - Comments - Pos Position -} - -func (x *RParen) Span() (start, end Position) { - return x.Pos, x.Pos.add(")") -} - -// An input represents a single input file being parsed. -type input struct { - // Lexing state. - filename string // name of input file, for errors - complete []byte // entire input - remaining []byte // remaining input - token []byte // token being scanned - lastToken string // most recently returned token, for error messages - pos Position // current input position - comments []Comment // accumulated comments - endRule int // position of end of current rule - - // Parser state. - file *FileSyntax // returned top-level syntax tree - parseError error // error encountered during parsing - - // Comment assignment state. - pre []Expr // all expressions, in preorder traversal - post []Expr // all expressions, in postorder traversal -} - -func newInput(filename string, data []byte) *input { - return &input{ - filename: filename, - complete: data, - remaining: data, - pos: Position{Line: 1, LineRune: 1, Byte: 0}, - } -} - -// parse parses the input file. -func parse(file string, data []byte) (f *FileSyntax, err error) { - in := newInput(file, data) - // The parser panics for both routine errors like syntax errors - // and for programmer bugs like array index errors. - // Turn both into error returns. Catching bug panics is - // especially important when processing many files. - defer func() { - if e := recover(); e != nil { - if e == in.parseError { - err = in.parseError - } else { - err = fmt.Errorf("%s:%d:%d: internal error: %v", in.filename, in.pos.Line, in.pos.LineRune, e) - } - } - }() - - // Invoke the parser. - in.parseFile() - if in.parseError != nil { - return nil, in.parseError - } - in.file.Name = in.filename - - // Assign comments to nearby syntax. - in.assignComments() - - return in.file, nil -} - -// Error is called to report an error. -// The reason s is often "syntax error". -// Error does not return: it panics. -func (in *input) Error(s string) { - if s == "syntax error" && in.lastToken != "" { - s += " near " + in.lastToken - } - in.parseError = fmt.Errorf("%s:%d:%d: %v", in.filename, in.pos.Line, in.pos.LineRune, s) - panic(in.parseError) -} - -// eof reports whether the input has reached end of file. -func (in *input) eof() bool { - return len(in.remaining) == 0 -} - -// peekRune returns the next rune in the input without consuming it. -func (in *input) peekRune() int { - if len(in.remaining) == 0 { - return 0 - } - r, _ := utf8.DecodeRune(in.remaining) - return int(r) -} - -// peekPrefix reports whether the remaining input begins with the given prefix. -func (in *input) peekPrefix(prefix string) bool { - // This is like bytes.HasPrefix(in.remaining, []byte(prefix)) - // but without the allocation of the []byte copy of prefix. - for i := 0; i < len(prefix); i++ { - if i >= len(in.remaining) || in.remaining[i] != prefix[i] { - return false - } - } - return true -} - -// readRune consumes and returns the next rune in the input. -func (in *input) readRune() int { - if len(in.remaining) == 0 { - in.Error("internal lexer error: readRune at EOF") - } - r, size := utf8.DecodeRune(in.remaining) - in.remaining = in.remaining[size:] - if r == '\n' { - in.pos.Line++ - in.pos.LineRune = 1 - } else { - in.pos.LineRune++ - } - in.pos.Byte += size - return int(r) -} - -type symType struct { - pos Position - endPos Position - text string -} - -// startToken marks the beginning of the next input token. -// It must be followed by a call to endToken, once the token has -// been consumed using readRune. -func (in *input) startToken(sym *symType) { - in.token = in.remaining - sym.text = "" - sym.pos = in.pos -} - -// endToken marks the end of an input token. -// It records the actual token string in sym.text if the caller -// has not done that already. -func (in *input) endToken(sym *symType) { - if sym.text == "" { - tok := string(in.token[:len(in.token)-len(in.remaining)]) - sym.text = tok - in.lastToken = sym.text - } - sym.endPos = in.pos -} - -// lex is called from the parser to obtain the next input token. -// It returns the token value (either a rune like '+' or a symbolic token _FOR) -// and sets val to the data associated with the token. -// For all our input tokens, the associated data is -// val.Pos (the position where the token begins) -// and val.Token (the input string corresponding to the token). -func (in *input) lex(sym *symType) int { - // Skip past spaces, stopping at non-space or EOF. - countNL := 0 // number of newlines we've skipped past - for !in.eof() { - // Skip over spaces. Count newlines so we can give the parser - // information about where top-level blank lines are, - // for top-level comment assignment. - c := in.peekRune() - if c == ' ' || c == '\t' || c == '\r' { - in.readRune() - continue - } - - // Comment runs to end of line. - if in.peekPrefix("//") { - in.startToken(sym) - - // Is this comment the only thing on its line? - // Find the last \n before this // and see if it's all - // spaces from there to here. - i := bytes.LastIndex(in.complete[:in.pos.Byte], []byte("\n")) - suffix := len(bytes.TrimSpace(in.complete[i+1:in.pos.Byte])) > 0 - in.readRune() - in.readRune() - - // Consume comment. - for len(in.remaining) > 0 && in.readRune() != '\n' { - } - in.endToken(sym) - - sym.text = strings.TrimRight(sym.text, "\n") - in.lastToken = "comment" - - // If we are at top level (not in a statement), hand the comment to - // the parser as a _COMMENT token. The grammar is written - // to handle top-level comments itself. - if !suffix { - // Not in a statement. Tell parser about top-level comment. - return _COMMENT - } - - // Otherwise, save comment for later attachment to syntax tree. - if countNL > 1 { - in.comments = append(in.comments, Comment{sym.pos, "", false}) - } - in.comments = append(in.comments, Comment{sym.pos, sym.text, suffix}) - countNL = 1 - return _EOL - } - - if in.peekPrefix("/*") { - in.Error(fmt.Sprintf("mod files must use // comments (not /* */ comments)")) - } - - // Found non-space non-comment. - break - } - - // Found the beginning of the next token. - in.startToken(sym) - defer in.endToken(sym) - - // End of file. - if in.eof() { - in.lastToken = "EOF" - return _EOF - } - - // Punctuation tokens. - switch c := in.peekRune(); c { - case '\n': - in.readRune() - return c - - case '(': - in.readRune() - return c - - case ')': - in.readRune() - return c - - case '"', '`': // quoted string - quote := c - in.readRune() - for { - if in.eof() { - in.pos = sym.pos - in.Error("unexpected EOF in string") - } - if in.peekRune() == '\n' { - in.Error("unexpected newline in string") - } - c := in.readRune() - if c == quote { - break - } - if c == '\\' && quote != '`' { - if in.eof() { - in.pos = sym.pos - in.Error("unexpected EOF in string") - } - in.readRune() - } - } - in.endToken(sym) - return _STRING - } - - // Checked all punctuation. Must be identifier token. - if c := in.peekRune(); !isIdent(c) { - in.Error(fmt.Sprintf("unexpected input character %#q", c)) - } - - // Scan over identifier. - for isIdent(in.peekRune()) { - if in.peekPrefix("//") { - break - } - if in.peekPrefix("/*") { - in.Error(fmt.Sprintf("mod files must use // comments (not /* */ comments)")) - } - in.readRune() - } - return _IDENT -} - -// isIdent reports whether c is an identifier rune. -// We treat nearly all runes as identifier runes. -func isIdent(c int) bool { - return c != 0 && !unicode.IsSpace(rune(c)) -} - -// Comment assignment. -// We build two lists of all subexpressions, preorder and postorder. -// The preorder list is ordered by start location, with outer expressions first. -// The postorder list is ordered by end location, with outer expressions last. -// We use the preorder list to assign each whole-line comment to the syntax -// immediately following it, and we use the postorder list to assign each -// end-of-line comment to the syntax immediately preceding it. - -// order walks the expression adding it and its subexpressions to the -// preorder and postorder lists. -func (in *input) order(x Expr) { - if x != nil { - in.pre = append(in.pre, x) - } - switch x := x.(type) { - default: - panic(fmt.Errorf("order: unexpected type %T", x)) - case nil: - // nothing - case *LParen, *RParen: - // nothing - case *CommentBlock: - // nothing - case *Line: - // nothing - case *FileSyntax: - for _, stmt := range x.Stmt { - in.order(stmt) - } - case *LineBlock: - in.order(&x.LParen) - for _, l := range x.Line { - in.order(l) - } - in.order(&x.RParen) - } - if x != nil { - in.post = append(in.post, x) - } -} - -// assignComments attaches comments to nearby syntax. -func (in *input) assignComments() { - const debug = false - - // Generate preorder and postorder lists. - in.order(in.file) - - // Split into whole-line comments and suffix comments. - var line, suffix []Comment - for _, com := range in.comments { - if com.Suffix { - suffix = append(suffix, com) - } else { - line = append(line, com) - } - } - - if debug { - for _, c := range line { - fmt.Fprintf(os.Stderr, "LINE %q :%d:%d #%d\n", c.Token, c.Start.Line, c.Start.LineRune, c.Start.Byte) - } - } - - // Assign line comments to syntax immediately following. - for _, x := range in.pre { - start, _ := x.Span() - if debug { - fmt.Printf("pre %T :%d:%d #%d\n", x, start.Line, start.LineRune, start.Byte) - } - xcom := x.Comment() - for len(line) > 0 && start.Byte >= line[0].Start.Byte { - if debug { - fmt.Fprintf(os.Stderr, "ASSIGN LINE %q #%d\n", line[0].Token, line[0].Start.Byte) - } - xcom.Before = append(xcom.Before, line[0]) - line = line[1:] - } - } - - // Remaining line comments go at end of file. - in.file.After = append(in.file.After, line...) - - if debug { - for _, c := range suffix { - fmt.Fprintf(os.Stderr, "SUFFIX %q :%d:%d #%d\n", c.Token, c.Start.Line, c.Start.LineRune, c.Start.Byte) - } - } - - // Assign suffix comments to syntax immediately before. - for i := len(in.post) - 1; i >= 0; i-- { - x := in.post[i] - - start, end := x.Span() - if debug { - fmt.Printf("post %T :%d:%d #%d :%d:%d #%d\n", x, start.Line, start.LineRune, start.Byte, end.Line, end.LineRune, end.Byte) - } - - // Do not assign suffix comments to end of line block or whole file. - // Instead assign them to the last element inside. - switch x.(type) { - case *FileSyntax: - continue - } - - // Do not assign suffix comments to something that starts - // on an earlier line, so that in - // - // x ( y - // z ) // comment - // - // we assign the comment to z and not to x ( ... ). - if start.Line != end.Line { - continue - } - xcom := x.Comment() - for len(suffix) > 0 && end.Byte <= suffix[len(suffix)-1].Start.Byte { - if debug { - fmt.Fprintf(os.Stderr, "ASSIGN SUFFIX %q #%d\n", suffix[len(suffix)-1].Token, suffix[len(suffix)-1].Start.Byte) - } - xcom.Suffix = append(xcom.Suffix, suffix[len(suffix)-1]) - suffix = suffix[:len(suffix)-1] - } - } - - // We assigned suffix comments in reverse. - // If multiple suffix comments were appended to the same - // expression node, they are now in reverse. Fix that. - for _, x := range in.post { - reverseComments(x.Comment().Suffix) - } - - // Remaining suffix comments go at beginning of file. - in.file.Before = append(in.file.Before, suffix...) -} - -// reverseComments reverses the []Comment list. -func reverseComments(list []Comment) { - for i, j := 0, len(list)-1; i < j; i, j = i+1, j-1 { - list[i], list[j] = list[j], list[i] - } -} - -func (in *input) parseFile() { - in.file = new(FileSyntax) - var sym symType - var cb *CommentBlock - for { - tok := in.lex(&sym) - switch tok { - case '\n': - if cb != nil { - in.file.Stmt = append(in.file.Stmt, cb) - cb = nil - } - case _COMMENT: - if cb == nil { - cb = &CommentBlock{Start: sym.pos} - } - com := cb.Comment() - com.Before = append(com.Before, Comment{Start: sym.pos, Token: sym.text}) - case _EOF: - if cb != nil { - in.file.Stmt = append(in.file.Stmt, cb) - } - return - default: - in.parseStmt(&sym) - if cb != nil { - in.file.Stmt[len(in.file.Stmt)-1].Comment().Before = cb.Before - cb = nil - } - } - } -} - -func (in *input) parseStmt(sym *symType) { - start := sym.pos - end := sym.endPos - token := []string{sym.text} - for { - tok := in.lex(sym) - switch tok { - case '\n', _EOF, _EOL: - in.file.Stmt = append(in.file.Stmt, &Line{ - Start: start, - Token: token, - End: end, - }) - return - case '(': - in.file.Stmt = append(in.file.Stmt, in.parseLineBlock(start, token, sym)) - return - default: - token = append(token, sym.text) - end = sym.endPos - } - } -} - -func (in *input) parseLineBlock(start Position, token []string, sym *symType) *LineBlock { - x := &LineBlock{ - Start: start, - Token: token, - LParen: LParen{Pos: sym.pos}, - } - var comments []Comment - for { - tok := in.lex(sym) - switch tok { - case _EOL: - // ignore - case '\n': - if len(comments) == 0 && len(x.Line) > 0 || len(comments) > 0 && comments[len(comments)-1].Token != "" { - comments = append(comments, Comment{}) - } - case _COMMENT: - comments = append(comments, Comment{Start: sym.pos, Token: sym.text}) - case _EOF: - in.Error(fmt.Sprintf("syntax error (unterminated block started at %s:%d:%d)", in.filename, x.Start.Line, x.Start.LineRune)) - case ')': - x.RParen.Before = comments - x.RParen.Pos = sym.pos - tok = in.lex(sym) - if tok != '\n' && tok != _EOF && tok != _EOL { - in.Error("syntax error (expected newline after closing paren)") - } - return x - default: - l := in.parseLine(sym) - x.Line = append(x.Line, l) - l.Comment().Before = comments - comments = nil - } - } -} - -func (in *input) parseLine(sym *symType) *Line { - start := sym.pos - end := sym.endPos - token := []string{sym.text} - for { - tok := in.lex(sym) - switch tok { - case '\n', _EOF, _EOL: - return &Line{ - Start: start, - Token: token, - End: end, - InBlock: true, - } - default: - token = append(token, sym.text) - end = sym.endPos - } - } -} - -const ( - _EOF = -(1 + iota) - _EOL - _IDENT - _STRING - _COMMENT -) - -var ( - slashSlash = []byte("//") - moduleStr = []byte("module") -) - -// ModulePath returns the module path from the gomod file text. -// If it cannot find a module path, it returns an empty string. -// It is tolerant of unrelated problems in the go.mod file. -func ModulePath(mod []byte) string { - for len(mod) > 0 { - line := mod - mod = nil - if i := bytes.IndexByte(line, '\n'); i >= 0 { - line, mod = line[:i], line[i+1:] - } - if i := bytes.Index(line, slashSlash); i >= 0 { - line = line[:i] - } - line = bytes.TrimSpace(line) - if !bytes.HasPrefix(line, moduleStr) { - continue - } - line = line[len(moduleStr):] - n := len(line) - line = bytes.TrimSpace(line) - if len(line) == n || len(line) == 0 { - continue - } - - if line[0] == '"' || line[0] == '`' { - p, err := strconv.Unquote(string(line)) - if err != nil { - return "" // malformed quoted string or multiline module path - } - return p - } - - return string(line) - } - return "" // missing module path -} diff --git a/vendor/github.com/rogpeppe/go-internal/modfile/rule.go b/vendor/github.com/rogpeppe/go-internal/modfile/rule.go deleted file mode 100644 index 24d275f12..000000000 --- a/vendor/github.com/rogpeppe/go-internal/modfile/rule.go +++ /dev/null @@ -1,724 +0,0 @@ -// Copyright 2018 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 modfile - -import ( - "bytes" - "errors" - "fmt" - "path/filepath" - "regexp" - "sort" - "strconv" - "strings" - "unicode" - - "github.com/rogpeppe/go-internal/module" - "github.com/rogpeppe/go-internal/semver" -) - -// A File is the parsed, interpreted form of a go.mod file. -type File struct { - Module *Module - Go *Go - Require []*Require - Exclude []*Exclude - Replace []*Replace - - Syntax *FileSyntax -} - -// A Module is the module statement. -type Module struct { - Mod module.Version - Syntax *Line -} - -// A Go is the go statement. -type Go struct { - Version string // "1.23" - Syntax *Line -} - -// A Require is a single require statement. -type Require struct { - Mod module.Version - Indirect bool // has "// indirect" comment - Syntax *Line -} - -// An Exclude is a single exclude statement. -type Exclude struct { - Mod module.Version - Syntax *Line -} - -// A Replace is a single replace statement. -type Replace struct { - Old module.Version - New module.Version - Syntax *Line -} - -func (f *File) AddModuleStmt(path string) error { - if f.Syntax == nil { - f.Syntax = new(FileSyntax) - } - if f.Module == nil { - f.Module = &Module{ - Mod: module.Version{Path: path}, - Syntax: f.Syntax.addLine(nil, "module", AutoQuote(path)), - } - } else { - f.Module.Mod.Path = path - f.Syntax.updateLine(f.Module.Syntax, "module", AutoQuote(path)) - } - return nil -} - -func (f *File) AddComment(text string) { - if f.Syntax == nil { - f.Syntax = new(FileSyntax) - } - f.Syntax.Stmt = append(f.Syntax.Stmt, &CommentBlock{ - Comments: Comments{ - Before: []Comment{ - { - Token: text, - }, - }, - }, - }) -} - -type VersionFixer func(path, version string) (string, error) - -// Parse parses the data, reported in errors as being from file, -// into a File struct. It applies fix, if non-nil, to canonicalize all module versions found. -func Parse(file string, data []byte, fix VersionFixer) (*File, error) { - return parseToFile(file, data, fix, true) -} - -// ParseLax is like Parse but ignores unknown statements. -// It is used when parsing go.mod files other than the main module, -// under the theory that most statement types we add in the future will -// only apply in the main module, like exclude and replace, -// and so we get better gradual deployments if old go commands -// simply ignore those statements when found in go.mod files -// in dependencies. -func ParseLax(file string, data []byte, fix VersionFixer) (*File, error) { - return parseToFile(file, data, fix, false) -} - -func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (*File, error) { - fs, err := parse(file, data) - if err != nil { - return nil, err - } - f := &File{ - Syntax: fs, - } - - var errs bytes.Buffer - for _, x := range fs.Stmt { - switch x := x.(type) { - case *Line: - f.add(&errs, x, x.Token[0], x.Token[1:], fix, strict) - - case *LineBlock: - if len(x.Token) > 1 { - if strict { - fmt.Fprintf(&errs, "%s:%d: unknown block type: %s\n", file, x.Start.Line, strings.Join(x.Token, " ")) - } - continue - } - switch x.Token[0] { - default: - if strict { - fmt.Fprintf(&errs, "%s:%d: unknown block type: %s\n", file, x.Start.Line, strings.Join(x.Token, " ")) - } - continue - case "module", "require", "exclude", "replace": - for _, l := range x.Line { - f.add(&errs, l, x.Token[0], l.Token, fix, strict) - } - } - } - } - - if errs.Len() > 0 { - return nil, errors.New(strings.TrimRight(errs.String(), "\n")) - } - return f, nil -} - -var goVersionRE = regexp.MustCompile(`([1-9][0-9]*)\.(0|[1-9][0-9]*)`) - -func (f *File) add(errs *bytes.Buffer, line *Line, verb string, args []string, fix VersionFixer, strict bool) { - // If strict is false, this module is a dependency. - // We ignore all unknown directives as well as main-module-only - // directives like replace and exclude. It will work better for - // forward compatibility if we can depend on modules that have unknown - // statements (presumed relevant only when acting as the main module) - // and simply ignore those statements. - if !strict { - switch verb { - case "module", "require", "go": - // want these even for dependency go.mods - default: - return - } - } - - switch verb { - default: - fmt.Fprintf(errs, "%s:%d: unknown directive: %s\n", f.Syntax.Name, line.Start.Line, verb) - - case "go": - if f.Go != nil { - fmt.Fprintf(errs, "%s:%d: repeated go statement\n", f.Syntax.Name, line.Start.Line) - return - } - if len(args) != 1 || !goVersionRE.MatchString(args[0]) { - fmt.Fprintf(errs, "%s:%d: usage: go 1.23\n", f.Syntax.Name, line.Start.Line) - return - } - f.Go = &Go{Syntax: line} - f.Go.Version = args[0] - case "module": - if f.Module != nil { - fmt.Fprintf(errs, "%s:%d: repeated module statement\n", f.Syntax.Name, line.Start.Line) - return - } - f.Module = &Module{Syntax: line} - if len(args) != 1 { - - fmt.Fprintf(errs, "%s:%d: usage: module module/path [version]\n", f.Syntax.Name, line.Start.Line) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - f.Module.Mod = module.Version{Path: s} - case "require", "exclude": - if len(args) != 2 { - fmt.Fprintf(errs, "%s:%d: usage: %s module/path v1.2.3\n", f.Syntax.Name, line.Start.Line, verb) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - old := args[1] - v, err := parseVersion(s, &args[1], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %q: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - pathMajor, err := modulePathMajor(s) - if err != nil { - fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - if !module.MatchPathMajor(v, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v) - return - } - if verb == "require" { - f.Require = append(f.Require, &Require{ - Mod: module.Version{Path: s, Version: v}, - Syntax: line, - Indirect: isIndirect(line), - }) - } else { - f.Exclude = append(f.Exclude, &Exclude{ - Mod: module.Version{Path: s, Version: v}, - Syntax: line, - }) - } - case "replace": - arrow := 2 - if len(args) >= 2 && args[1] == "=>" { - arrow = 1 - } - if len(args) < arrow+2 || len(args) > arrow+3 || args[arrow] != "=>" { - fmt.Fprintf(errs, "%s:%d: usage: %s module/path [v1.2.3] => other/module v1.4\n\t or %s module/path [v1.2.3] => ../local/directory\n", f.Syntax.Name, line.Start.Line, verb, verb) - return - } - s, err := parseString(&args[0]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - pathMajor, err := modulePathMajor(s) - if err != nil { - fmt.Fprintf(errs, "%s:%d: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - var v string - if arrow == 2 { - old := args[1] - v, err = parseVersion(s, &args[1], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - if !module.MatchPathMajor(v, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - fmt.Fprintf(errs, "%s:%d: invalid module: %s should be %s, not %s (%s)\n", f.Syntax.Name, line.Start.Line, s, pathMajor, semver.Major(v), v) - return - } - } - ns, err := parseString(&args[arrow+1]) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid quoted string: %v\n", f.Syntax.Name, line.Start.Line, err) - return - } - nv := "" - if len(args) == arrow+2 { - if !IsDirectoryPath(ns) { - fmt.Fprintf(errs, "%s:%d: replacement module without version must be directory path (rooted or starting with ./ or ../)\n", f.Syntax.Name, line.Start.Line) - return - } - if filepath.Separator == '/' && strings.Contains(ns, `\`) { - fmt.Fprintf(errs, "%s:%d: replacement directory appears to be Windows path (on a non-windows system)\n", f.Syntax.Name, line.Start.Line) - return - } - } - if len(args) == arrow+3 { - old := args[arrow+1] - nv, err = parseVersion(ns, &args[arrow+2], fix) - if err != nil { - fmt.Fprintf(errs, "%s:%d: invalid module version %v: %v\n", f.Syntax.Name, line.Start.Line, old, err) - return - } - if IsDirectoryPath(ns) { - fmt.Fprintf(errs, "%s:%d: replacement module directory path %q cannot have version\n", f.Syntax.Name, line.Start.Line, ns) - return - } - } - f.Replace = append(f.Replace, &Replace{ - Old: module.Version{Path: s, Version: v}, - New: module.Version{Path: ns, Version: nv}, - Syntax: line, - }) - } -} - -// isIndirect reports whether line has a "// indirect" comment, -// meaning it is in go.mod only for its effect on indirect dependencies, -// so that it can be dropped entirely once the effective version of the -// indirect dependency reaches the given minimum version. -func isIndirect(line *Line) bool { - if len(line.Suffix) == 0 { - return false - } - f := strings.Fields(line.Suffix[0].Token) - return (len(f) == 2 && f[1] == "indirect" || len(f) > 2 && f[1] == "indirect;") && f[0] == "//" -} - -// setIndirect sets line to have (or not have) a "// indirect" comment. -func setIndirect(line *Line, indirect bool) { - if isIndirect(line) == indirect { - return - } - if indirect { - // Adding comment. - if len(line.Suffix) == 0 { - // New comment. - line.Suffix = []Comment{{Token: "// indirect", Suffix: true}} - return - } - // Insert at beginning of existing comment. - com := &line.Suffix[0] - space := " " - if len(com.Token) > 2 && com.Token[2] == ' ' || com.Token[2] == '\t' { - space = "" - } - com.Token = "// indirect;" + space + com.Token[2:] - return - } - - // Removing comment. - f := strings.Fields(line.Suffix[0].Token) - if len(f) == 2 { - // Remove whole comment. - line.Suffix = nil - return - } - - // Remove comment prefix. - com := &line.Suffix[0] - i := strings.Index(com.Token, "indirect;") - com.Token = "//" + com.Token[i+len("indirect;"):] -} - -// IsDirectoryPath reports whether the given path should be interpreted -// as a directory path. Just like on the go command line, relative paths -// and rooted paths are directory paths; the rest are module paths. -func IsDirectoryPath(ns string) bool { - // Because go.mod files can move from one system to another, - // we check all known path syntaxes, both Unix and Windows. - return strings.HasPrefix(ns, "./") || strings.HasPrefix(ns, "../") || strings.HasPrefix(ns, "/") || - strings.HasPrefix(ns, `.\`) || strings.HasPrefix(ns, `..\`) || strings.HasPrefix(ns, `\`) || - len(ns) >= 2 && ('A' <= ns[0] && ns[0] <= 'Z' || 'a' <= ns[0] && ns[0] <= 'z') && ns[1] == ':' -} - -// MustQuote reports whether s must be quoted in order to appear as -// a single token in a go.mod line. -func MustQuote(s string) bool { - for _, r := range s { - if !unicode.IsPrint(r) || r == ' ' || r == '"' || r == '\'' || r == '`' { - return true - } - } - return s == "" || strings.Contains(s, "//") || strings.Contains(s, "/*") -} - -// AutoQuote returns s or, if quoting is required for s to appear in a go.mod, -// the quotation of s. -func AutoQuote(s string) string { - if MustQuote(s) { - return strconv.Quote(s) - } - return s -} - -func parseString(s *string) (string, error) { - t := *s - if strings.HasPrefix(t, `"`) { - var err error - if t, err = strconv.Unquote(t); err != nil { - return "", err - } - } else if strings.ContainsAny(t, "\"'`") { - // Other quotes are reserved both for possible future expansion - // and to avoid confusion. For example if someone types 'x' - // we want that to be a syntax error and not a literal x in literal quotation marks. - return "", fmt.Errorf("unquoted string cannot contain quote") - } - *s = AutoQuote(t) - return t, nil -} - -func parseVersion(path string, s *string, fix VersionFixer) (string, error) { - t, err := parseString(s) - if err != nil { - return "", err - } - if fix != nil { - var err error - t, err = fix(path, t) - if err != nil { - return "", err - } - } - if v := module.CanonicalVersion(t); v != "" { - *s = v - return *s, nil - } - return "", fmt.Errorf("version must be of the form v1.2.3") -} - -func modulePathMajor(path string) (string, error) { - _, major, ok := module.SplitPathVersion(path) - if !ok { - return "", fmt.Errorf("invalid module path") - } - return major, nil -} - -func (f *File) Format() ([]byte, error) { - return Format(f.Syntax), nil -} - -// Cleanup cleans up the file f after any edit operations. -// To avoid quadratic behavior, modifications like DropRequire -// clear the entry but do not remove it from the slice. -// Cleanup cleans out all the cleared entries. -func (f *File) Cleanup() { - w := 0 - for _, r := range f.Require { - if r.Mod.Path != "" { - f.Require[w] = r - w++ - } - } - f.Require = f.Require[:w] - - w = 0 - for _, x := range f.Exclude { - if x.Mod.Path != "" { - f.Exclude[w] = x - w++ - } - } - f.Exclude = f.Exclude[:w] - - w = 0 - for _, r := range f.Replace { - if r.Old.Path != "" { - f.Replace[w] = r - w++ - } - } - f.Replace = f.Replace[:w] - - f.Syntax.Cleanup() -} - -func (f *File) AddRequire(path, vers string) error { - need := true - for _, r := range f.Require { - if r.Mod.Path == path { - if need { - r.Mod.Version = vers - f.Syntax.updateLine(r.Syntax, "require", AutoQuote(path), vers) - need = false - } else { - f.Syntax.removeLine(r.Syntax) - *r = Require{} - } - } - } - - if need { - f.AddNewRequire(path, vers, false) - } - return nil -} - -func (f *File) AddNewRequire(path, vers string, indirect bool) { - line := f.Syntax.addLine(nil, "require", AutoQuote(path), vers) - setIndirect(line, indirect) - f.Require = append(f.Require, &Require{module.Version{Path: path, Version: vers}, indirect, line}) -} - -func (f *File) SetRequire(req []*Require) { - need := make(map[string]string) - indirect := make(map[string]bool) - for _, r := range req { - need[r.Mod.Path] = r.Mod.Version - indirect[r.Mod.Path] = r.Indirect - } - - for _, r := range f.Require { - if v, ok := need[r.Mod.Path]; ok { - r.Mod.Version = v - r.Indirect = indirect[r.Mod.Path] - } - } - - var newStmts []Expr - for _, stmt := range f.Syntax.Stmt { - switch stmt := stmt.(type) { - case *LineBlock: - if len(stmt.Token) > 0 && stmt.Token[0] == "require" { - var newLines []*Line - for _, line := range stmt.Line { - if p, err := parseString(&line.Token[0]); err == nil && need[p] != "" { - line.Token[1] = need[p] - delete(need, p) - setIndirect(line, indirect[p]) - newLines = append(newLines, line) - } - } - if len(newLines) == 0 { - continue // drop stmt - } - stmt.Line = newLines - } - - case *Line: - if len(stmt.Token) > 0 && stmt.Token[0] == "require" { - if p, err := parseString(&stmt.Token[1]); err == nil && need[p] != "" { - stmt.Token[2] = need[p] - delete(need, p) - setIndirect(stmt, indirect[p]) - } else { - continue // drop stmt - } - } - } - newStmts = append(newStmts, stmt) - } - f.Syntax.Stmt = newStmts - - for path, vers := range need { - f.AddNewRequire(path, vers, indirect[path]) - } - f.SortBlocks() -} - -func (f *File) DropRequire(path string) error { - for _, r := range f.Require { - if r.Mod.Path == path { - f.Syntax.removeLine(r.Syntax) - *r = Require{} - } - } - return nil -} - -func (f *File) AddExclude(path, vers string) error { - var hint *Line - for _, x := range f.Exclude { - if x.Mod.Path == path && x.Mod.Version == vers { - return nil - } - if x.Mod.Path == path { - hint = x.Syntax - } - } - - f.Exclude = append(f.Exclude, &Exclude{Mod: module.Version{Path: path, Version: vers}, Syntax: f.Syntax.addLine(hint, "exclude", AutoQuote(path), vers)}) - return nil -} - -func (f *File) DropExclude(path, vers string) error { - for _, x := range f.Exclude { - if x.Mod.Path == path && x.Mod.Version == vers { - f.Syntax.removeLine(x.Syntax) - *x = Exclude{} - } - } - return nil -} - -func (f *File) AddReplace(oldPath, oldVers, newPath, newVers string) error { - need := true - old := module.Version{Path: oldPath, Version: oldVers} - new := module.Version{Path: newPath, Version: newVers} - tokens := []string{"replace", AutoQuote(oldPath)} - if oldVers != "" { - tokens = append(tokens, oldVers) - } - tokens = append(tokens, "=>", AutoQuote(newPath)) - if newVers != "" { - tokens = append(tokens, newVers) - } - - var hint *Line - for _, r := range f.Replace { - if r.Old.Path == oldPath && (oldVers == "" || r.Old.Version == oldVers) { - if need { - // Found replacement for old; update to use new. - r.New = new - f.Syntax.updateLine(r.Syntax, tokens...) - need = false - continue - } - // Already added; delete other replacements for same. - f.Syntax.removeLine(r.Syntax) - *r = Replace{} - } - if r.Old.Path == oldPath { - hint = r.Syntax - } - } - if need { - f.Replace = append(f.Replace, &Replace{Old: old, New: new, Syntax: f.Syntax.addLine(hint, tokens...)}) - } - return nil -} - -func (f *File) DropReplace(oldPath, oldVers string) error { - for _, r := range f.Replace { - if r.Old.Path == oldPath && r.Old.Version == oldVers { - f.Syntax.removeLine(r.Syntax) - *r = Replace{} - } - } - return nil -} - -func (f *File) SortBlocks() { - f.removeDups() // otherwise sorting is unsafe - - for _, stmt := range f.Syntax.Stmt { - block, ok := stmt.(*LineBlock) - if !ok { - continue - } - sort.Slice(block.Line, func(i, j int) bool { - li := block.Line[i] - lj := block.Line[j] - for k := 0; k < len(li.Token) && k < len(lj.Token); k++ { - if li.Token[k] != lj.Token[k] { - return li.Token[k] < lj.Token[k] - } - } - return len(li.Token) < len(lj.Token) - }) - } -} - -func (f *File) removeDups() { - have := make(map[module.Version]bool) - kill := make(map[*Line]bool) - for _, x := range f.Exclude { - if have[x.Mod] { - kill[x.Syntax] = true - continue - } - have[x.Mod] = true - } - var excl []*Exclude - for _, x := range f.Exclude { - if !kill[x.Syntax] { - excl = append(excl, x) - } - } - f.Exclude = excl - - have = make(map[module.Version]bool) - // Later replacements take priority over earlier ones. - for i := len(f.Replace) - 1; i >= 0; i-- { - x := f.Replace[i] - if have[x.Old] { - kill[x.Syntax] = true - continue - } - have[x.Old] = true - } - var repl []*Replace - for _, x := range f.Replace { - if !kill[x.Syntax] { - repl = append(repl, x) - } - } - f.Replace = repl - - var stmts []Expr - for _, stmt := range f.Syntax.Stmt { - switch stmt := stmt.(type) { - case *Line: - if kill[stmt] { - continue - } - case *LineBlock: - var lines []*Line - for _, line := range stmt.Line { - if !kill[line] { - lines = append(lines, line) - } - } - stmt.Line = lines - if len(lines) == 0 { - continue - } - } - stmts = append(stmts, stmt) - } - f.Syntax.Stmt = stmts -} diff --git a/vendor/github.com/rogpeppe/go-internal/module/module.go b/vendor/github.com/rogpeppe/go-internal/module/module.go deleted file mode 100644 index 3ff6d9bf5..000000000 --- a/vendor/github.com/rogpeppe/go-internal/module/module.go +++ /dev/null @@ -1,540 +0,0 @@ -// Copyright 2018 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 module defines the module.Version type -// along with support code. -package module - -// IMPORTANT NOTE -// -// This file essentially defines the set of valid import paths for the go command. -// There are many subtle considerations, including Unicode ambiguity, -// security, network, and file system representations. -// -// This file also defines the set of valid module path and version combinations, -// another topic with many subtle considerations. -// -// Changes to the semantics in this file require approval from rsc. - -import ( - "fmt" - "sort" - "strings" - "unicode" - "unicode/utf8" - - "github.com/rogpeppe/go-internal/semver" -) - -// A Version is defined by a module path and version pair. -type Version struct { - Path string - - // Version is usually a semantic version in canonical form. - // There are two exceptions to this general rule. - // First, the top-level target of a build has no specific version - // and uses Version = "". - // Second, during MVS calculations the version "none" is used - // to represent the decision to take no version of a given module. - Version string `json:",omitempty"` -} - -// Check checks that a given module path, version pair is valid. -// In addition to the path being a valid module path -// and the version being a valid semantic version, -// the two must correspond. -// For example, the path "yaml/v2" only corresponds to -// semantic versions beginning with "v2.". -func Check(path, version string) error { - if err := CheckPath(path); err != nil { - return err - } - if !semver.IsValid(version) { - return fmt.Errorf("malformed semantic version %v", version) - } - _, pathMajor, _ := SplitPathVersion(path) - if !MatchPathMajor(version, pathMajor) { - if pathMajor == "" { - pathMajor = "v0 or v1" - } - if pathMajor[0] == '.' { // .v1 - pathMajor = pathMajor[1:] - } - return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor) - } - return nil -} - -// firstPathOK reports whether r can appear in the first element of a module path. -// The first element of the path must be an LDH domain name, at least for now. -// To avoid case ambiguity, the domain name must be entirely lower case. -func firstPathOK(r rune) bool { - return r == '-' || r == '.' || - '0' <= r && r <= '9' || - 'a' <= r && r <= 'z' -} - -// pathOK reports whether r can appear in an import path element. -// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~. -// This matches what "go get" has historically recognized in import paths. -// TODO(rsc): We would like to allow Unicode letters, but that requires additional -// care in the safe encoding (see note below). -func pathOK(r rune) bool { - if r < utf8.RuneSelf { - return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' || - '0' <= r && r <= '9' || - 'A' <= r && r <= 'Z' || - 'a' <= r && r <= 'z' - } - return false -} - -// fileNameOK reports whether r can appear in a file name. -// For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters. -// If we expand the set of allowed characters here, we have to -// work harder at detecting potential case-folding and normalization collisions. -// See note about "safe encoding" below. -func fileNameOK(r rune) bool { - if r < utf8.RuneSelf { - // Entire set of ASCII punctuation, from which we remove characters: - // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ - // We disallow some shell special characters: " ' * < > ? ` | - // (Note that some of those are disallowed by the Windows file system as well.) - // We also disallow path separators / : and \ (fileNameOK is only called on path element characters). - // We allow spaces (U+0020) in file names. - const allowed = "!#$%&()+,-.=@[]^_{}~ " - if '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' { - return true - } - for i := 0; i < len(allowed); i++ { - if rune(allowed[i]) == r { - return true - } - } - return false - } - // It may be OK to add more ASCII punctuation here, but only carefully. - // For example Windows disallows < > \, and macOS disallows :, so we must not allow those. - return unicode.IsLetter(r) -} - -// CheckPath checks that a module path is valid. -func CheckPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed module path %q: %v", path, err) - } - i := strings.Index(path, "/") - if i < 0 { - i = len(path) - } - if i == 0 { - return fmt.Errorf("malformed module path %q: leading slash", path) - } - if !strings.Contains(path[:i], ".") { - return fmt.Errorf("malformed module path %q: missing dot in first path element", path) - } - if path[0] == '-' { - return fmt.Errorf("malformed module path %q: leading dash in first path element", path) - } - for _, r := range path[:i] { - if !firstPathOK(r) { - return fmt.Errorf("malformed module path %q: invalid char %q in first path element", path, r) - } - } - if _, _, ok := SplitPathVersion(path); !ok { - return fmt.Errorf("malformed module path %q: invalid version", path) - } - return nil -} - -// CheckImportPath checks that an import path is valid. -func CheckImportPath(path string) error { - if err := checkPath(path, false); err != nil { - return fmt.Errorf("malformed import path %q: %v", path, err) - } - return nil -} - -// checkPath checks that a general path is valid. -// It returns an error describing why but not mentioning path. -// Because these checks apply to both module paths and import paths, -// the caller is expected to add the "malformed ___ path %q: " prefix. -// fileName indicates whether the final element of the path is a file name -// (as opposed to a directory name). -func checkPath(path string, fileName bool) error { - if !utf8.ValidString(path) { - return fmt.Errorf("invalid UTF-8") - } - if path == "" { - return fmt.Errorf("empty string") - } - if strings.Contains(path, "..") { - return fmt.Errorf("double dot") - } - if strings.Contains(path, "//") { - return fmt.Errorf("double slash") - } - if path[len(path)-1] == '/' { - return fmt.Errorf("trailing slash") - } - elemStart := 0 - for i, r := range path { - if r == '/' { - if err := checkElem(path[elemStart:i], fileName); err != nil { - return err - } - elemStart = i + 1 - } - } - if err := checkElem(path[elemStart:], fileName); err != nil { - return err - } - return nil -} - -// checkElem checks whether an individual path element is valid. -// fileName indicates whether the element is a file name (not a directory name). -func checkElem(elem string, fileName bool) error { - if elem == "" { - return fmt.Errorf("empty path element") - } - if strings.Count(elem, ".") == len(elem) { - return fmt.Errorf("invalid path element %q", elem) - } - if elem[0] == '.' && !fileName { - return fmt.Errorf("leading dot in path element") - } - if elem[len(elem)-1] == '.' { - return fmt.Errorf("trailing dot in path element") - } - charOK := pathOK - if fileName { - charOK = fileNameOK - } - for _, r := range elem { - if !charOK(r) { - return fmt.Errorf("invalid char %q", r) - } - } - - // Windows disallows a bunch of path elements, sadly. - // See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file - short := elem - if i := strings.Index(short, "."); i >= 0 { - short = short[:i] - } - for _, bad := range badWindowsNames { - if strings.EqualFold(bad, short) { - return fmt.Errorf("disallowed path element %q", elem) - } - } - return nil -} - -// CheckFilePath checks whether a slash-separated file path is valid. -func CheckFilePath(path string) error { - if err := checkPath(path, true); err != nil { - return fmt.Errorf("malformed file path %q: %v", path, err) - } - return nil -} - -// badWindowsNames are the reserved file path elements on Windows. -// See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file -var badWindowsNames = []string{ - "CON", - "PRN", - "AUX", - "NUL", - "COM1", - "COM2", - "COM3", - "COM4", - "COM5", - "COM6", - "COM7", - "COM8", - "COM9", - "LPT1", - "LPT2", - "LPT3", - "LPT4", - "LPT5", - "LPT6", - "LPT7", - "LPT8", - "LPT9", -} - -// SplitPathVersion returns prefix and major version such that prefix+pathMajor == path -// and version is either empty or "/vN" for N >= 2. -// As a special case, gopkg.in paths are recognized directly; -// they require ".vN" instead of "/vN", and for all N, not just N >= 2. -func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) { - if strings.HasPrefix(path, "gopkg.in/") { - return splitGopkgIn(path) - } - - i := len(path) - dot := false - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9' || path[i-1] == '.') { - if path[i-1] == '.' { - dot = true - } - i-- - } - if i <= 1 || path[i-1] != 'v' || path[i-2] != '/' { - return path, "", true - } - prefix, pathMajor = path[:i-2], path[i-2:] - if dot || len(pathMajor) <= 2 || pathMajor[2] == '0' || pathMajor == "/v1" { - return path, "", false - } - return prefix, pathMajor, true -} - -// splitGopkgIn is like SplitPathVersion but only for gopkg.in paths. -func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) { - if !strings.HasPrefix(path, "gopkg.in/") { - return path, "", false - } - i := len(path) - if strings.HasSuffix(path, "-unstable") { - i -= len("-unstable") - } - for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9') { - i-- - } - if i <= 1 || path[i-1] != 'v' || path[i-2] != '.' { - // All gopkg.in paths must end in vN for some N. - return path, "", false - } - prefix, pathMajor = path[:i-2], path[i-2:] - if len(pathMajor) <= 2 || pathMajor[2] == '0' && pathMajor != ".v0" { - return path, "", false - } - return prefix, pathMajor, true -} - -// MatchPathMajor reports whether the semantic version v -// matches the path major version pathMajor. -func MatchPathMajor(v, pathMajor string) bool { - if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") { - pathMajor = strings.TrimSuffix(pathMajor, "-unstable") - } - if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" { - // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1. - // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405. - return true - } - m := semver.Major(v) - if pathMajor == "" { - return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible" - } - return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:] -} - -// CanonicalVersion returns the canonical form of the version string v. -// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible". -func CanonicalVersion(v string) string { - cv := semver.Canonical(v) - if semver.Build(v) == "+incompatible" { - cv += "+incompatible" - } - return cv -} - -// Sort sorts the list by Path, breaking ties by comparing Versions. -func Sort(list []Version) { - sort.Slice(list, func(i, j int) bool { - mi := list[i] - mj := list[j] - if mi.Path != mj.Path { - return mi.Path < mj.Path - } - // To help go.sum formatting, allow version/file. - // Compare semver prefix by semver rules, - // file by string order. - vi := mi.Version - vj := mj.Version - var fi, fj string - if k := strings.Index(vi, "/"); k >= 0 { - vi, fi = vi[:k], vi[k:] - } - if k := strings.Index(vj, "/"); k >= 0 { - vj, fj = vj[:k], vj[k:] - } - if vi != vj { - return semver.Compare(vi, vj) < 0 - } - return fi < fj - }) -} - -// Safe encodings -// -// Module paths appear as substrings of file system paths -// (in the download cache) and of web server URLs in the proxy protocol. -// In general we cannot rely on file systems to be case-sensitive, -// nor can we rely on web servers, since they read from file systems. -// That is, we cannot rely on the file system to keep rsc.io/QUOTE -// and rsc.io/quote separate. Windows and macOS don't. -// Instead, we must never require two different casings of a file path. -// Because we want the download cache to match the proxy protocol, -// and because we want the proxy protocol to be possible to serve -// from a tree of static files (which might be stored on a case-insensitive -// file system), the proxy protocol must never require two different casings -// of a URL path either. -// -// One possibility would be to make the safe encoding be the lowercase -// hexadecimal encoding of the actual path bytes. This would avoid ever -// needing different casings of a file path, but it would be fairly illegible -// to most programmers when those paths appeared in the file system -// (including in file paths in compiler errors and stack traces) -// in web server logs, and so on. Instead, we want a safe encoding that -// leaves most paths unaltered. -// -// The safe encoding is this: -// replace every uppercase letter with an exclamation mark -// followed by the letter's lowercase equivalent. -// -// For example, -// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go. -// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy -// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus. -// -// Import paths that avoid upper-case letters are left unchanged. -// Note that because import paths are ASCII-only and avoid various -// problematic punctuation (like : < and >), the safe encoding is also ASCII-only -// and avoids the same problematic punctuation. -// -// Import paths have never allowed exclamation marks, so there is no -// need to define how to encode a literal !. -// -// Although paths are disallowed from using Unicode (see pathOK above), -// the eventual plan is to allow Unicode letters as well, to assume that -// file systems and URLs are Unicode-safe (storing UTF-8), and apply -// the !-for-uppercase convention. Note however that not all runes that -// are different but case-fold equivalent are an upper/lower pair. -// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin) -// are considered to case-fold to each other. When we do add Unicode -// letters, we must not assume that upper/lower are the only case-equivalent pairs. -// Perhaps the Kelvin symbol would be disallowed entirely, for example. -// Or perhaps it would encode as "!!k", or perhaps as "(212A)". -// -// Also, it would be nice to allow Unicode marks as well as letters, -// but marks include combining marks, and then we must deal not -// only with case folding but also normalization: both U+00E9 ('é') -// and U+0065 U+0301 ('e' followed by combining acute accent) -// look the same on the page and are treated by some file systems -// as the same path. If we do allow Unicode marks in paths, there -// must be some kind of normalization to allow only one canonical -// encoding of any character used in an import path. - -// EncodePath returns the safe encoding of the given module path. -// It fails if the module path is invalid. -func EncodePath(path string) (encoding string, err error) { - if err := CheckPath(path); err != nil { - return "", err - } - - return encodeString(path) -} - -// EncodeVersion returns the safe encoding of the given module version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func EncodeVersion(v string) (encoding string, err error) { - if err := checkElem(v, true); err != nil || strings.Contains(v, "!") { - return "", fmt.Errorf("disallowed version string %q", v) - } - return encodeString(v) -} - -func encodeString(s string) (encoding string, err error) { - haveUpper := false - for _, r := range s { - if r == '!' || r >= utf8.RuneSelf { - // This should be disallowed by CheckPath, but diagnose anyway. - // The correctness of the encoding loop below depends on it. - return "", fmt.Errorf("internal error: inconsistency in EncodePath") - } - if 'A' <= r && r <= 'Z' { - haveUpper = true - } - } - - if !haveUpper { - return s, nil - } - - var buf []byte - for _, r := range s { - if 'A' <= r && r <= 'Z' { - buf = append(buf, '!', byte(r+'a'-'A')) - } else { - buf = append(buf, byte(r)) - } - } - return string(buf), nil -} - -// DecodePath returns the module path of the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid path. -func DecodePath(encoding string) (path string, err error) { - path, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid module path encoding %q", encoding) - } - if err := CheckPath(path); err != nil { - return "", fmt.Errorf("invalid module path encoding %q: %v", encoding, err) - } - return path, nil -} - -// DecodeVersion returns the version string for the given safe encoding. -// It fails if the encoding is invalid or encodes an invalid version. -// Versions are allowed to be in non-semver form but must be valid file names -// and not contain exclamation marks. -func DecodeVersion(encoding string) (v string, err error) { - v, ok := decodeString(encoding) - if !ok { - return "", fmt.Errorf("invalid version encoding %q", encoding) - } - if err := checkElem(v, true); err != nil { - return "", fmt.Errorf("disallowed version string %q", v) - } - return v, nil -} - -func decodeString(encoding string) (string, bool) { - var buf []byte - - bang := false - for _, r := range encoding { - if r >= utf8.RuneSelf { - return "", false - } - if bang { - bang = false - if r < 'a' || 'z' < r { - return "", false - } - buf = append(buf, byte(r+'A'-'a')) - continue - } - if r == '!' { - bang = true - continue - } - if 'A' <= r && r <= 'Z' { - return "", false - } - buf = append(buf, byte(r)) - } - if bang { - return "", false - } - return string(buf), true -} diff --git a/vendor/github.com/rogpeppe/go-internal/semver/semver.go b/vendor/github.com/rogpeppe/go-internal/semver/semver.go deleted file mode 100644 index 4af7118e5..000000000 --- a/vendor/github.com/rogpeppe/go-internal/semver/semver.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2018 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 semver implements comparison of semantic version strings. -// In this package, semantic version strings must begin with a leading "v", -// as in "v1.0.0". -// -// The general form of a semantic version string accepted by this package is -// -// vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]] -// -// where square brackets indicate optional parts of the syntax; -// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros; -// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers -// using only alphanumeric characters and hyphens; and -// all-numeric PRERELEASE identifiers must not have leading zeros. -// -// This package follows Semantic Versioning 2.0.0 (see semver.org) -// with two exceptions. First, it requires the "v" prefix. Second, it recognizes -// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes) -// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0. -package semver - -// parsed returns the parsed form of a semantic version string. -type parsed struct { - major string - minor string - patch string - short string - prerelease string - build string - err string -} - -// IsValid reports whether v is a valid semantic version string. -func IsValid(v string) bool { - _, ok := parse(v) - return ok -} - -// Canonical returns the canonical formatting of the semantic version v. -// It fills in any missing .MINOR or .PATCH and discards build metadata. -// Two semantic versions compare equal only if their canonical formattings -// are identical strings. -// The canonical invalid semantic version is the empty string. -func Canonical(v string) string { - p, ok := parse(v) - if !ok { - return "" - } - if p.build != "" { - return v[:len(v)-len(p.build)] - } - if p.short != "" { - return v + p.short - } - return v -} - -// Major returns the major version prefix of the semantic version v. -// For example, Major("v2.1.0") == "v2". -// If v is an invalid semantic version string, Major returns the empty string. -func Major(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return v[:1+len(pv.major)] -} - -// MajorMinor returns the major.minor version prefix of the semantic version v. -// For example, MajorMinor("v2.1.0") == "v2.1". -// If v is an invalid semantic version string, MajorMinor returns the empty string. -func MajorMinor(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - i := 1 + len(pv.major) - if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor { - return v[:j] - } - return v[:i] + "." + pv.minor -} - -// Prerelease returns the prerelease suffix of the semantic version v. -// For example, Prerelease("v2.1.0-pre+meta") == "-pre". -// If v is an invalid semantic version string, Prerelease returns the empty string. -func Prerelease(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.prerelease -} - -// Build returns the build suffix of the semantic version v. -// For example, Build("v2.1.0+meta") == "+meta". -// If v is an invalid semantic version string, Build returns the empty string. -func Build(v string) string { - pv, ok := parse(v) - if !ok { - return "" - } - return pv.build -} - -// Compare returns an integer comparing two versions according to -// according to semantic version precedence. -// The result will be 0 if v == w, -1 if v < w, or +1 if v > w. -// -// An invalid semantic version string is considered less than a valid one. -// All invalid semantic version strings compare equal to each other. -func Compare(v, w string) int { - pv, ok1 := parse(v) - pw, ok2 := parse(w) - if !ok1 && !ok2 { - return 0 - } - if !ok1 { - return -1 - } - if !ok2 { - return +1 - } - if c := compareInt(pv.major, pw.major); c != 0 { - return c - } - if c := compareInt(pv.minor, pw.minor); c != 0 { - return c - } - if c := compareInt(pv.patch, pw.patch); c != 0 { - return c - } - return comparePrerelease(pv.prerelease, pw.prerelease) -} - -// Max canonicalizes its arguments and then returns the version string -// that compares greater. -func Max(v, w string) string { - v = Canonical(v) - w = Canonical(w) - if Compare(v, w) > 0 { - return v - } - return w -} - -func parse(v string) (p parsed, ok bool) { - if v == "" || v[0] != 'v' { - p.err = "missing v prefix" - return - } - p.major, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad major version" - return - } - if v == "" { - p.minor = "0" - p.patch = "0" - p.short = ".0.0" - return - } - if v[0] != '.' { - p.err = "bad minor prefix" - ok = false - return - } - p.minor, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad minor version" - return - } - if v == "" { - p.patch = "0" - p.short = ".0" - return - } - if v[0] != '.' { - p.err = "bad patch prefix" - ok = false - return - } - p.patch, v, ok = parseInt(v[1:]) - if !ok { - p.err = "bad patch version" - return - } - if len(v) > 0 && v[0] == '-' { - p.prerelease, v, ok = parsePrerelease(v) - if !ok { - p.err = "bad prerelease" - return - } - } - if len(v) > 0 && v[0] == '+' { - p.build, v, ok = parseBuild(v) - if !ok { - p.err = "bad build" - return - } - } - if v != "" { - p.err = "junk on end" - ok = false - return - } - ok = true - return -} - -func parseInt(v string) (t, rest string, ok bool) { - if v == "" { - return - } - if v[0] < '0' || '9' < v[0] { - return - } - i := 1 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - if v[0] == '0' && i != 1 { - return - } - return v[:i], v[i:], true -} - -func parsePrerelease(v string) (t, rest string, ok bool) { - // "A pre-release version MAY be denoted by appending a hyphen and - // a series of dot separated identifiers immediately following the patch version. - // Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-]. - // Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes." - if v == "" || v[0] != '-' { - return - } - i := 1 - start := 1 - for i < len(v) && v[i] != '+' { - if !isIdentChar(v[i]) && v[i] != '.' { - return - } - if v[i] == '.' { - if start == i || isBadNum(v[start:i]) { - return - } - start = i + 1 - } - i++ - } - if start == i || isBadNum(v[start:i]) { - return - } - return v[:i], v[i:], true -} - -func parseBuild(v string) (t, rest string, ok bool) { - if v == "" || v[0] != '+' { - return - } - i := 1 - start := 1 - for i < len(v) { - if !isIdentChar(v[i]) { - return - } - if v[i] == '.' { - if start == i { - return - } - start = i + 1 - } - i++ - } - if start == i { - return - } - return v[:i], v[i:], true -} - -func isIdentChar(c byte) bool { - return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-' -} - -func isBadNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) && i > 1 && v[0] == '0' -} - -func isNum(v string) bool { - i := 0 - for i < len(v) && '0' <= v[i] && v[i] <= '9' { - i++ - } - return i == len(v) -} - -func compareInt(x, y string) int { - if x == y { - return 0 - } - if len(x) < len(y) { - return -1 - } - if len(x) > len(y) { - return +1 - } - if x < y { - return -1 - } else { - return +1 - } -} - -func comparePrerelease(x, y string) int { - // "When major, minor, and patch are equal, a pre-release version has - // lower precedence than a normal version. - // Example: 1.0.0-alpha < 1.0.0. - // Precedence for two pre-release versions with the same major, minor, - // and patch version MUST be determined by comparing each dot separated - // identifier from left to right until a difference is found as follows: - // identifiers consisting of only digits are compared numerically and - // identifiers with letters or hyphens are compared lexically in ASCII - // sort order. Numeric identifiers always have lower precedence than - // non-numeric identifiers. A larger set of pre-release fields has a - // higher precedence than a smaller set, if all of the preceding - // identifiers are equal. - // Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < - // 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0." - if x == y { - return 0 - } - if x == "" { - return +1 - } - if y == "" { - return -1 - } - for x != "" && y != "" { - x = x[1:] // skip - or . - y = y[1:] // skip - or . - var dx, dy string - dx, x = nextIdent(x) - dy, y = nextIdent(y) - if dx != dy { - ix := isNum(dx) - iy := isNum(dy) - if ix != iy { - if ix { - return -1 - } else { - return +1 - } - } - if ix { - if len(dx) < len(dy) { - return -1 - } - if len(dx) > len(dy) { - return +1 - } - } - if dx < dy { - return -1 - } else { - return +1 - } - } - } - if x == "" { - return -1 - } else { - return +1 - } -} - -func nextIdent(x string) (dx, rest string) { - i := 0 - for i < len(x) && x[i] != '.' { - i++ - } - return x[:i], x[i:] -} diff --git a/vendor/golang.org/x/lint/README.md b/vendor/golang.org/x/lint/README.md index 4968b13ae..ba4956f60 100644 --- a/vendor/golang.org/x/lint/README.md +++ b/vendor/golang.org/x/lint/README.md @@ -1,5 +1,6 @@ Golint is a linter for Go source code. +[![Go Reference](https://pkg.go.dev/badge/golang.org/x/lint.svg)](https://pkg.go.dev/golang.org/x/lint) [![Build Status](https://travis-ci.org/golang/lint.svg?branch=master)](https://travis-ci.org/golang/lint) ## Installation diff --git a/vendor/golang.org/x/sync/AUTHORS b/vendor/golang.org/x/sync/AUTHORS deleted file mode 100644 index 15167cd74..000000000 --- a/vendor/golang.org/x/sync/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/golang.org/x/sync/CONTRIBUTORS b/vendor/golang.org/x/sync/CONTRIBUTORS deleted file mode 100644 index 1c4577e96..000000000 --- a/vendor/golang.org/x/sync/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE deleted file mode 100644 index 6a66aea5e..000000000 --- a/vendor/golang.org/x/sync/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2009 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/golang.org/x/sync/PATENTS b/vendor/golang.org/x/sync/PATENTS deleted file mode 100644 index 733099041..000000000 --- a/vendor/golang.org/x/sync/PATENTS +++ /dev/null @@ -1,22 +0,0 @@ -Additional IP Rights Grant (Patents) - -"This implementation" means the copyrightable works distributed by -Google as part of the Go project. - -Google 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, -transfer and otherwise run, modify and propagate the contents of this -implementation of Go, where such license applies only to those patent -claims, both currently owned or controlled by Google and acquired in -the future, licensable by Google that are necessarily infringed by this -implementation of Go. This grant does not include claims that would be -infringed only as a consequence of further modification of this -implementation. If you or your agent or exclusive licensee institute or -order or agree to the institution of patent litigation against any -entity (including a cross-claim or counterclaim in a lawsuit) alleging -that this implementation of Go or any code incorporated within this -implementation of Go constitutes direct or contributory patent -infringement, or inducement of patent infringement, then any patent -rights granted to you under this License for this implementation of Go -shall terminate as of the date such litigation is filed. diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go deleted file mode 100644 index 9857fe53d..000000000 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2016 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 errgroup provides synchronization, error propagation, and Context -// cancelation for groups of goroutines working on subtasks of a common task. -package errgroup - -import ( - "context" - "sync" -) - -// A Group is a collection of goroutines working on subtasks that are part of -// the same overall task. -// -// A zero Group is valid and does not cancel on error. -type Group struct { - cancel func() - - wg sync.WaitGroup - - errOnce sync.Once - err error -} - -// WithContext returns a new Group and an associated Context derived from ctx. -// -// The derived Context is canceled the first time a function passed to Go -// returns a non-nil error or the first time Wait returns, whichever occurs -// first. -func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) - return &Group{cancel: cancel}, ctx -} - -// Wait blocks until all function calls from the Go method have returned, then -// returns the first non-nil error (if any) from them. -func (g *Group) Wait() error { - g.wg.Wait() - if g.cancel != nil { - g.cancel() - } - return g.err -} - -// Go calls the given function in a new goroutine. -// -// The first call to return a non-nil error cancels the group; its error will be -// returned by Wait. -func (g *Group) Go(f func() error) { - g.wg.Add(1) - - go func() { - defer g.wg.Done() - - if err := f(); err != nil { - g.errOnce.Do(func() { - g.err = err - if g.cancel != nil { - g.cancel() - } - }) - } - }() -} diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go index 8dcd8bbb7..e8cba6b23 100644 --- a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go +++ b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go @@ -491,7 +491,7 @@ func (p *parser) parseMapType(parent *types.Package) types.Type { // // For unqualified and anonymous names, the returned package is the parent // package unless parent == nil, in which case the returned package is the -// package being imported. (The parent package is not nil if the the name +// package being imported. (The parent package is not nil if the name // is an unqualified struct field or interface method name belonging to a // type declared in another package.) // diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 6e91391ce..bc04503c1 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -89,6 +89,10 @@ type golistState struct { rootDirsError error rootDirs map[string]string + goVersionOnce sync.Once + goVersionError error + goVersion string // third field of 'go version' + // vendorDirs caches the (non)existence of vendor directories. vendorDirs map[string]bool } @@ -242,6 +246,21 @@ extractQueries: } } } + // Add root for any package that matches a pattern. This applies only to + // packages that are modified by overlays, since they are not added as + // roots automatically. + for _, pattern := range restPatterns { + match := matchPattern(pattern) + for _, pkgID := range modifiedPkgs { + pkg, ok := response.seenPackages[pkgID] + if !ok { + continue + } + if match(pkg.PkgPath) { + response.addRoot(pkg.ID) + } + } + } sizeswg.Wait() if sizeserr != nil { @@ -635,6 +654,39 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse pkg.CompiledGoFiles = pkg.GoFiles } + // Temporary work-around for golang/go#39986. Parse filenames out of + // error messages. This happens if there are unrecoverable syntax + // errors in the source, so we can't match on a specific error message. + if err := p.Error; err != nil && state.shouldAddFilenameFromError(p) { + addFilenameFromPos := func(pos string) bool { + split := strings.Split(pos, ":") + if len(split) < 1 { + return false + } + filename := strings.TrimSpace(split[0]) + if filename == "" { + return false + } + if !filepath.IsAbs(filename) { + filename = filepath.Join(state.cfg.Dir, filename) + } + info, _ := os.Stat(filename) + if info == nil { + return false + } + pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, filename) + pkg.GoFiles = append(pkg.GoFiles, filename) + return true + } + found := addFilenameFromPos(err.Pos) + // In some cases, go list only reports the error position in the + // error text, not the error position. One such case is when the + // file's package name is a keyword (see golang.org/issue/39763). + if !found { + addFilenameFromPos(err.Err) + } + } + if p.Error != nil { msg := strings.TrimSpace(p.Error.Err) // Trim to work around golang.org/issue/32363. // Address golang.org/issue/35964 by appending import stack to error message. @@ -664,7 +716,60 @@ func (state *golistState) createDriverResponse(words ...string) (*driverResponse return &response, nil } -// getPkgPath finds the package path of a directory if it's relative to a root directory. +func (state *golistState) shouldAddFilenameFromError(p *jsonPackage) bool { + if len(p.GoFiles) > 0 || len(p.CompiledGoFiles) > 0 { + return false + } + + goV, err := state.getGoVersion() + if err != nil { + return false + } + + // On Go 1.14 and earlier, only add filenames from errors if the import stack is empty. + // The import stack behaves differently for these versions than newer Go versions. + if strings.HasPrefix(goV, "go1.13") || strings.HasPrefix(goV, "go1.14") { + return len(p.Error.ImportStack) == 0 + } + + // On Go 1.15 and later, only parse filenames out of error if there's no import stack, + // or the current package is at the top of the import stack. This is not guaranteed + // to work perfectly, but should avoid some cases where files in errors don't belong to this + // package. + return len(p.Error.ImportStack) == 0 || p.Error.ImportStack[len(p.Error.ImportStack)-1] == p.ImportPath +} + +func (state *golistState) getGoVersion() (string, error) { + state.goVersionOnce.Do(func() { + var b *bytes.Buffer + // Invoke go version. Don't use invokeGo because it will supply build flags, and + // go version doesn't expect build flags. + inv := gocommand.Invocation{ + Verb: "version", + Env: state.cfg.Env, + Logf: state.cfg.Logf, + } + gocmdRunner := state.cfg.gocmdRunner + if gocmdRunner == nil { + gocmdRunner = &gocommand.Runner{} + } + b, _, _, state.goVersionError = gocmdRunner.RunRaw(state.cfg.Context, inv) + if state.goVersionError != nil { + return + } + + sp := strings.Split(b.String(), " ") + if len(sp) < 3 { + state.goVersionError = fmt.Errorf("go version output: expected 'go version ', got '%s'", b.String()) + return + } + state.goVersion = sp[2] + }) + return state.goVersion, state.goVersionError +} + +// getPkgPath finds the package path of a directory if it's relative to a root +// directory. func (state *golistState) getPkgPath(dir string) (string, bool, error) { absDir, err := filepath.Abs(dir) if err != nil { diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go index b82c90d7c..885aec3ec 100644 --- a/vendor/golang.org/x/tools/go/packages/golist_overlay.go +++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go @@ -8,9 +8,12 @@ import ( "log" "os" "path/filepath" + "regexp" "sort" "strconv" "strings" + + "golang.org/x/tools/internal/gocommand" ) // processGolistOverlay provides rudimentary support for adding @@ -89,9 +92,19 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif // because the file is generated in another directory. testVariantOf = p continue nextPackage + } else if !isTestFile && hasTestFiles(p) { + // We're examining a test variant, but the overlaid file is + // a non-test file. Because the overlay implementation + // (currently) only adds a file to one package, skip this + // package, so that we can add the file to the production + // variant of the package. (https://golang.org/issue/36857 + // tracks handling overlays on both the production and test + // variant of a package). + continue nextPackage } - // We must have already seen the package of which this is a test variant. if pkg != nil && p != pkg && pkg.PkgPath == p.PkgPath { + // We have already seen the production version of the + // for which p is a test variant. if hasTestFiles(p) { testVariantOf = pkg } @@ -102,8 +115,11 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif } } } - // The overlay could have included an entirely new package. - if pkg == nil { + // The overlay could have included an entirely new package or an + // ad-hoc package. An ad-hoc package is one that we have manually + // constructed from inadequate `go list` results for a file= query. + // It will have the ID command-line-arguments. + if pkg == nil || pkg.ID == "command-line-arguments" { // Try to find the module or gopath dir the file is contained in. // Then for modules, add the module opath to the beginning. pkgPath, ok, err := state.getPkgPath(dir) @@ -113,42 +129,55 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif if !ok { break } + var forTest string // only set for x tests isXTest := strings.HasSuffix(pkgName, "_test") if isXTest { + forTest = pkgPath pkgPath += "_test" } id := pkgPath - if isTestFile && !isXTest { - id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath) - } - // Try to reclaim a package with the same ID, if it exists in the response. - for _, p := range response.dr.Packages { - if reclaimPackage(p, id, opath, contents) { - pkg = p - break + if isTestFile { + if isXTest { + id = fmt.Sprintf("%s [%s.test]", pkgPath, forTest) + } else { + id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath) } } - // Otherwise, create a new package. - if pkg == nil { - pkg = &Package{ - PkgPath: pkgPath, - ID: id, - Name: pkgName, - Imports: make(map[string]*Package), + if pkg != nil { + // TODO(rstambler): We should change the package's path and ID + // here. The only issue is that this messes with the roots. + } else { + // Try to reclaim a package with the same ID, if it exists in the response. + for _, p := range response.dr.Packages { + if reclaimPackage(p, id, opath, contents) { + pkg = p + break + } } - response.addPackage(pkg) - havePkgs[pkg.PkgPath] = id - // Add the production package's sources for a test variant. - if isTestFile && !isXTest && testVariantOf != nil { - pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) - // Add the package under test and its imports to the test variant. - pkg.forTest = testVariantOf.PkgPath - for k, v := range testVariantOf.Imports { - pkg.Imports[k] = &Package{ID: v.ID} + // Otherwise, create a new package. + if pkg == nil { + pkg = &Package{ + PkgPath: pkgPath, + ID: id, + Name: pkgName, + Imports: make(map[string]*Package), + } + response.addPackage(pkg) + havePkgs[pkg.PkgPath] = id + // Add the production package's sources for a test variant. + if isTestFile && !isXTest && testVariantOf != nil { + pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) + pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) + // Add the package under test and its imports to the test variant. + pkg.forTest = testVariantOf.PkgPath + for k, v := range testVariantOf.Imports { + pkg.Imports[k] = &Package{ID: v.ID} + } + } + if isXTest { + pkg.forTest = forTest } } - // TODO(rstambler): Handle forTest for x_tests. } } if !fileExists { @@ -224,7 +253,7 @@ func (state *golistState) processGolistOverlay(response *responseDeduper) (modif return modifiedPkgs, needPkgs, err } -// resolveImport finds the the ID of a package given its import path. +// resolveImport finds the ID of a package given its import path. // In particular, it will find the right vendored copy when in GOPATH mode. func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { env, err := state.getEnv() @@ -299,24 +328,25 @@ func (state *golistState) determineRootDirs() (map[string]string, error) { } func (state *golistState) determineRootDirsModules() (map[string]string, error) { - // This will only return the root directory for the main module. - // For now we only support overlays in main modules. + // List all of the modules--the first will be the directory for the main + // module. Any replaced modules will also need to be treated as roots. // Editing files in the module cache isn't a great idea, so we don't - // plan to ever support that, but editing files in replaced modules - // is something we may want to support. To do that, we'll want to - // do a go list -m to determine the replaced module's module path and - // directory, and then a go list -m {{with .Replace}}{{.Dir}}{{end}} - // from the main module to determine if that module is actually a replacement. - // See bcmills's comment here: https://github.com/golang/go/issues/37629#issuecomment-594179751 - // for more information. - out, err := state.invokeGo("list", "-m", "-json") + // plan to ever support that. + out, err := state.invokeGo("list", "-m", "-json", "all") if err != nil { - return nil, err + // 'go list all' will fail if we're outside of a module and + // GO111MODULE=on. Try falling back without 'all'. + var innerErr error + out, innerErr = state.invokeGo("list", "-m", "-json") + if innerErr != nil { + return nil, err + } } - m := map[string]string{} - type jsonMod struct{ Path, Dir string } + roots := map[string]string{} + modules := map[string]string{} + var i int for dec := json.NewDecoder(out); dec.More(); { - mod := new(jsonMod) + mod := new(gocommand.ModuleJSON) if err := dec.Decode(mod); err != nil { return nil, err } @@ -326,10 +356,15 @@ func (state *golistState) determineRootDirsModules() (map[string]string, error) if err != nil { return nil, err } - m[absDir] = mod.Path + modules[absDir] = mod.Path + // The first result is the main module. + if i == 0 || mod.Replace != nil && mod.Replace.Path != "" { + roots[absDir] = mod.Path + } } + i++ } - return m, nil + return roots, nil } func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { @@ -455,3 +490,79 @@ func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) p.Name = newName } } + +// This function is copy-pasted from +// https://github.com/golang/go/blob/9706f510a5e2754595d716bd64be8375997311fb/src/cmd/go/internal/search/search.go#L360. +// It should be deleted when we remove support for overlays from go/packages. +// +// NOTE: This does not handle any ./... or ./ style queries, as this function +// doesn't know the working directory. +// +// matchPattern(pattern)(name) reports whether +// name matches pattern. Pattern is a limited glob +// pattern in which '...' means 'any string' and there +// is no other special syntax. +// Unfortunately, there are two special cases. Quoting "go help packages": +// +// First, /... at the end of the pattern can match an empty string, +// so that net/... matches both net and packages in its subdirectories, like net/http. +// Second, any slash-separated pattern element containing a wildcard never +// participates in a match of the "vendor" element in the path of a vendored +// package, so that ./... does not match packages in subdirectories of +// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. +// Note, however, that a directory named vendor that itself contains code +// is not a vendored package: cmd/vendor would be a command named vendor, +// and the pattern cmd/... matches it. +func matchPattern(pattern string) func(name string) bool { + // Convert pattern to regular expression. + // The strategy for the trailing /... is to nest it in an explicit ? expression. + // The strategy for the vendor exclusion is to change the unmatchable + // vendor strings to a disallowed code point (vendorChar) and to use + // "(anything but that codepoint)*" as the implementation of the ... wildcard. + // This is a bit complicated but the obvious alternative, + // namely a hand-written search like in most shell glob matchers, + // is too easy to make accidentally exponential. + // Using package regexp guarantees linear-time matching. + + const vendorChar = "\x00" + + if strings.Contains(pattern, vendorChar) { + return func(name string) bool { return false } + } + + re := regexp.QuoteMeta(pattern) + re = replaceVendor(re, vendorChar) + switch { + case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`): + re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)` + case re == vendorChar+`/\.\.\.`: + re = `(/vendor|/` + vendorChar + `/\.\.\.)` + case strings.HasSuffix(re, `/\.\.\.`): + re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?` + } + re = strings.ReplaceAll(re, `\.\.\.`, `[^`+vendorChar+`]*`) + + reg := regexp.MustCompile(`^` + re + `$`) + + return func(name string) bool { + if strings.Contains(name, vendorChar) { + return false + } + return reg.MatchString(replaceVendor(name, vendorChar)) + } +} + +// replaceVendor returns the result of replacing +// non-trailing vendor path elements in x with repl. +func replaceVendor(x, repl string) string { + if !strings.Contains(x, "vendor") { + return x + } + elem := strings.Split(x, "/") + for i := 0; i < len(elem)-1; i++ { + if elem[i] == "vendor" { + elem[i] = repl + } + } + return strings.Join(elem, "/") +} diff --git a/vendor/golang.org/x/tools/imports/forward.go b/vendor/golang.org/x/tools/imports/forward.go index dbe5b49a9..a4e40adba 100644 --- a/vendor/golang.org/x/tools/imports/forward.go +++ b/vendor/golang.org/x/tools/imports/forward.go @@ -3,10 +3,10 @@ package imports // import "golang.org/x/tools/imports" import ( - "go/build" + "io/ioutil" "log" - "os" + "golang.org/x/tools/internal/gocommand" intimp "golang.org/x/tools/internal/imports" ) @@ -31,31 +31,34 @@ var Debug = false var LocalPrefix string // Process formats and adjusts imports for the provided file. -// If opt is nil the defaults are used. +// If opt is nil the defaults are used, and if src is nil the source +// is read from the filesystem. // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. // To process data ``as if'' it were in filename, pass the data as a non-nil src. func Process(filename string, src []byte, opt *Options) ([]byte, error) { + var err error + if src == nil { + src, err = ioutil.ReadFile(filename) + if err != nil { + return nil, err + } + } if opt == nil { opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} } intopt := &intimp.Options{ Env: &intimp.ProcessEnv{ - GOPATH: build.Default.GOPATH, - GOROOT: build.Default.GOROOT, - GOFLAGS: os.Getenv("GOFLAGS"), - GO111MODULE: os.Getenv("GO111MODULE"), - GOPROXY: os.Getenv("GOPROXY"), - GOSUMDB: os.Getenv("GOSUMDB"), - LocalPrefix: LocalPrefix, + GocmdRunner: &gocommand.Runner{}, }, - AllErrors: opt.AllErrors, - Comments: opt.Comments, - FormatOnly: opt.FormatOnly, - Fragment: opt.Fragment, - TabIndent: opt.TabIndent, - TabWidth: opt.TabWidth, + LocalPrefix: LocalPrefix, + AllErrors: opt.AllErrors, + Comments: opt.Comments, + FormatOnly: opt.FormatOnly, + Fragment: opt.Fragment, + TabIndent: opt.TabIndent, + TabWidth: opt.TabWidth, } if Debug { intopt.Env.Logf = log.Printf diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index ff4f9d5aa..f516e1762 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -23,9 +23,24 @@ import ( // An Runner will run go command invocations and serialize // them if it sees a concurrency error. type Runner struct { - // LoadMu guards packages.Load calls and associated state. - loadMu sync.Mutex - serializeLoads int + // once guards the runner initialization. + once sync.Once + + // inFlight tracks available workers. + inFlight chan struct{} + + // serialized guards the ability to run a go command serially, + // to avoid deadlocks when claiming workers. + serialized chan struct{} +} + +const maxInFlight = 10 + +func (runner *Runner) initialize() { + runner.once.Do(func() { + runner.inFlight = make(chan struct{}, maxInFlight) + runner.serialized = make(chan struct{}, 1) + }) } // 1.13: go: updates to go.mod needed, but contents have changed @@ -35,7 +50,7 @@ var modConcurrencyError = regexp.MustCompile(`go:.*go.mod.*contents have changed // Run is a convenience wrapper around RunRaw. // It returns only stdout and a "friendly" error. func (runner *Runner) Run(ctx context.Context, inv Invocation) (*bytes.Buffer, error) { - stdout, _, friendly, _ := runner.runRaw(ctx, inv) + stdout, _, friendly, _ := runner.RunRaw(ctx, inv) return stdout, friendly } @@ -49,55 +64,65 @@ func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stde // RunRaw runs the invocation, serializing requests only if they fight over // go.mod changes. func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { - return runner.runRaw(ctx, inv) -} + // Make sure the runner is always initialized. + runner.initialize() -func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) (error, error) { - runner.loadMu.Lock() - runner.serializeLoads++ + // First, try to run the go command concurrently. + stdout, stderr, friendlyErr, err := runner.runConcurrent(ctx, inv) - defer func() { - runner.serializeLoads-- - runner.loadMu.Unlock() - }() + // If we encounter a load concurrency error, we need to retry serially. + if friendlyErr == nil || !modConcurrencyError.MatchString(friendlyErr.Error()) { + return stdout, stderr, friendlyErr, err + } + event.Error(ctx, "Load concurrency error, will retry serially", err) - return inv.runWithFriendlyError(ctx, stdout, stderr) + // Run serially by calling runPiped. + stdout.Reset() + stderr.Reset() + friendlyErr, err = runner.runPiped(ctx, inv, stdout, stderr) + return stdout, stderr, friendlyErr, err } -func (runner *Runner) runRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { - // We want to run invocations concurrently as much as possible. However, - // if go.mod updates are needed, only one can make them and the others will - // fail. We need to retry in those cases, but we don't want to thrash so - // badly we never recover. To avoid that, once we've seen one concurrency - // error, start serializing everything until the backlog has cleared out. - runner.loadMu.Lock() - var locked bool // If true, we hold the mutex and have incremented. - if runner.serializeLoads == 0 { - runner.loadMu.Unlock() - } else { - locked = true - runner.serializeLoads++ +func (runner *Runner) runConcurrent(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { + // Wait for 1 worker to become available. + select { + case <-ctx.Done(): + return nil, nil, nil, ctx.Err() + case runner.inFlight <- struct{}{}: + defer func() { <-runner.inFlight }() } - defer func() { - if locked { - locked = false - runner.serializeLoads-- - runner.loadMu.Unlock() - } - }() - for { - stdout, stderr := &bytes.Buffer{}, &bytes.Buffer{} - friendlyErr, err := inv.runWithFriendlyError(ctx, stdout, stderr) - if friendlyErr == nil || !modConcurrencyError.MatchString(friendlyErr.Error()) { - return stdout, stderr, friendlyErr, err - } - event.Error(ctx, "Load concurrency error, will retry serially", err) - if !locked { - runner.loadMu.Lock() - runner.serializeLoads++ + stdout, stderr := &bytes.Buffer{}, &bytes.Buffer{} + friendlyErr, err := inv.runWithFriendlyError(ctx, stdout, stderr) + return stdout, stderr, friendlyErr, err +} + +func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) (error, error) { + // Make sure the runner is always initialized. + runner.initialize() + + // Acquire the serialization lock. This avoids deadlocks between two + // runPiped commands. + select { + case <-ctx.Done(): + return nil, ctx.Err() + case runner.serialized <- struct{}{}: + defer func() { <-runner.serialized }() + } + + // Wait for all in-progress go commands to return before proceeding, + // to avoid load concurrency errors. + for i := 0; i < maxInFlight; i++ { + select { + case <-ctx.Done(): + return nil, ctx.Err() + case runner.inFlight <- struct{}{}: + // Make sure we always "return" any workers we took. + defer func() { <-runner.inFlight }() } } + + return inv.runWithFriendlyError(ctx, stdout, stderr) } // An Invocation represents a call to the go command. @@ -160,7 +185,6 @@ func (i *Invocation) run(ctx context.Context, stdout, stderr io.Writer) error { cmd.Env = append(cmd.Env, "PWD="+i.WorkingDir) cmd.Dir = i.WorkingDir } - defer func(start time.Time) { log("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now()) return runCmdContext(ctx, cmd) diff --git a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go index 390cb9db7..925ff5356 100644 --- a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go +++ b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go @@ -10,7 +10,6 @@ import ( "bufio" "bytes" "fmt" - "go/build" "io/ioutil" "log" "os" @@ -47,16 +46,6 @@ type Root struct { Type RootType } -// SrcDirsRoots returns the roots from build.Default.SrcDirs(). Not modules-compatible. -func SrcDirsRoots(ctx *build.Context) []Root { - var roots []Root - roots = append(roots, Root{filepath.Join(ctx.GOROOT, "src"), RootGOROOT}) - for _, p := range filepath.SplitList(ctx.GOPATH) { - roots = append(roots, Root{filepath.Join(p, "src"), RootGOPATH}) - } - return roots -} - // Walk walks Go source directories ($GOROOT, $GOPATH, etc) to find packages. // For each package found, add will be called (concurrently) with the absolute // paths of the containing source directory and the package directory. diff --git a/vendor/golang.org/x/tools/internal/imports/fix.go b/vendor/golang.org/x/tools/internal/imports/fix.go index 36292d79a..675d16c87 100644 --- a/vendor/golang.org/x/tools/internal/imports/fix.go +++ b/vendor/golang.org/x/tools/internal/imports/fix.go @@ -7,6 +7,7 @@ package imports import ( "bytes" "context" + "encoding/json" "fmt" "go/ast" "go/build" @@ -31,25 +32,25 @@ import ( // importToGroup is a list of functions which map from an import path to // a group number. -var importToGroup = []func(env *ProcessEnv, importPath string) (num int, ok bool){ - func(env *ProcessEnv, importPath string) (num int, ok bool) { - if env.LocalPrefix == "" { +var importToGroup = []func(localPrefix, importPath string) (num int, ok bool){ + func(localPrefix, importPath string) (num int, ok bool) { + if localPrefix == "" { return } - for _, p := range strings.Split(env.LocalPrefix, ",") { + for _, p := range strings.Split(localPrefix, ",") { if strings.HasPrefix(importPath, p) || strings.TrimSuffix(p, "/") == importPath { return 3, true } } return }, - func(_ *ProcessEnv, importPath string) (num int, ok bool) { + func(_, importPath string) (num int, ok bool) { if strings.HasPrefix(importPath, "appengine") { return 2, true } return }, - func(_ *ProcessEnv, importPath string) (num int, ok bool) { + func(_, importPath string) (num int, ok bool) { firstComponent := strings.Split(importPath, "/")[0] if strings.Contains(firstComponent, ".") { return 1, true @@ -58,9 +59,9 @@ var importToGroup = []func(env *ProcessEnv, importPath string) (num int, ok bool }, } -func importGroup(env *ProcessEnv, importPath string) int { +func importGroup(localPrefix, importPath string) int { for _, fn := range importToGroup { - if n, ok := fn(env, importPath); ok { + if n, ok := fn(localPrefix, importPath); ok { return n } } @@ -277,7 +278,12 @@ func (p *pass) loadPackageNames(imports []*ImportInfo) error { unknown = append(unknown, imp.ImportPath) } - names, err := p.env.GetResolver().loadPackageNames(unknown, p.srcDir) + resolver, err := p.env.GetResolver() + if err != nil { + return err + } + + names, err := resolver.loadPackageNames(unknown, p.srcDir) if err != nil { return err } @@ -567,7 +573,9 @@ func getFixes(fset *token.FileSet, f *ast.File, filename string, env *ProcessEnv return fixes, nil } - addStdlibCandidates(p, p.missingRefs) + if err := addStdlibCandidates(p, p.missingRefs); err != nil { + return nil, err + } p.assumeSiblingImportsValid() if fixes, done := p.fix(); done { return fixes, nil @@ -595,15 +603,19 @@ func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filena notSelf := func(p *pkg) bool { return p.packageName != filePkg || p.dir != filepath.Dir(filename) } + goenv, err := env.goEnv() + if err != nil { + return err + } // Start off with the standard library. for importPath, exports := range stdlib { p := &pkg{ - dir: filepath.Join(env.GOROOT, "src", importPath), + dir: filepath.Join(goenv["GOROOT"], "src", importPath), importPathShort: importPath, packageName: path.Base(importPath), relevance: MaxRelevance, } - if notSelf(p) && wrappedCallback.packageNameLoaded(p) { + if notSelf(p) && wrappedCallback.dirFound(p) && wrappedCallback.packageNameLoaded(p) { wrappedCallback.exportsLoaded(p, exports) } } @@ -639,15 +651,23 @@ func getCandidatePkgs(ctx context.Context, wrappedCallback *scanCallback, filena wrappedCallback.exportsLoaded(pkg, exports) }, } - return env.GetResolver().scan(ctx, scanFilter) + resolver, err := env.GetResolver() + if err != nil { + return err + } + return resolver.scan(ctx, scanFilter) } -func ScoreImportPaths(ctx context.Context, env *ProcessEnv, paths []string) map[string]int { +func ScoreImportPaths(ctx context.Context, env *ProcessEnv, paths []string) (map[string]int, error) { result := make(map[string]int) + resolver, err := env.GetResolver() + if err != nil { + return nil, err + } for _, path := range paths { - result[path] = env.GetResolver().scoreImportPath(ctx, path) + result[path] = resolver.scoreImportPath(ctx, path) } - return result + return result, nil } func PrimeCache(ctx context.Context, env *ProcessEnv) error { @@ -673,8 +693,9 @@ func candidateImportName(pkg *pkg) string { return "" } -// getAllCandidates gets all of the candidates to be imported, regardless of if they are needed. -func getAllCandidates(ctx context.Context, wrapped func(ImportFix), searchPrefix, filename, filePkg string, env *ProcessEnv) error { +// GetAllCandidates calls wrapped for each package whose name starts with +// searchPrefix, and can be imported from filename with the package name filePkg. +func GetAllCandidates(ctx context.Context, wrapped func(ImportFix), searchPrefix, filename, filePkg string, env *ProcessEnv) error { callback := &scanCallback{ rootFound: func(gopathwalk.Root) bool { return true @@ -707,13 +728,43 @@ func getAllCandidates(ctx context.Context, wrapped func(ImportFix), searchPrefix return getCandidatePkgs(ctx, callback, filename, filePkg, env) } +// GetImportPaths calls wrapped for each package whose import path starts with +// searchPrefix, and can be imported from filename with the package name filePkg. +func GetImportPaths(ctx context.Context, wrapped func(ImportFix), searchPrefix, filename, filePkg string, env *ProcessEnv) error { + callback := &scanCallback{ + rootFound: func(gopathwalk.Root) bool { + return true + }, + dirFound: func(pkg *pkg) bool { + if !canUse(filename, pkg.dir) { + return false + } + return strings.HasPrefix(pkg.importPathShort, searchPrefix) + }, + packageNameLoaded: func(pkg *pkg) bool { + wrapped(ImportFix{ + StmtInfo: ImportInfo{ + ImportPath: pkg.importPathShort, + Name: candidateImportName(pkg), + }, + IdentName: pkg.packageName, + FixType: AddImport, + Relevance: pkg.relevance, + }) + return false + }, + } + return getCandidatePkgs(ctx, callback, filename, filePkg, env) +} + // A PackageExport is a package and its exports. type PackageExport struct { Fix *ImportFix Exports []string } -func getPackageExports(ctx context.Context, wrapped func(PackageExport), searchPkg, filename, filePkg string, env *ProcessEnv) error { +// GetPackageExports returns all known packages with name pkg and their exports. +func GetPackageExports(ctx context.Context, wrapped func(PackageExport), searchPkg, filename, filePkg string, env *ProcessEnv) error { callback := &scanCallback{ rootFound: func(gopathwalk.Root) bool { return true @@ -743,85 +794,152 @@ func getPackageExports(ctx context.Context, wrapped func(PackageExport), searchP return getCandidatePkgs(ctx, callback, filename, filePkg, env) } +var RequiredGoEnvVars = []string{"GO111MODULE", "GOFLAGS", "GOINSECURE", "GOMOD", "GOMODCACHE", "GONOPROXY", "GONOSUMDB", "GOPATH", "GOPROXY", "GOROOT", "GOSUMDB"} + // ProcessEnv contains environment variables and settings that affect the use of // the go command, the go/build package, etc. type ProcessEnv struct { - LocalPrefix string - GocmdRunner *gocommand.Runner BuildFlags []string - // If non-empty, these will be used instead of the - // process-wide values. - GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS, GOSUMDB string - WorkingDir string + // Env overrides the OS environment, and can be used to specify + // GOPROXY, GO111MODULE, etc. PATH cannot be set here, because + // exec.Command will not honor it. + // Specifying all of RequiredGoEnvVars avoids a call to `go env`. + Env map[string]string + + WorkingDir string // If Logf is non-nil, debug logging is enabled through this function. Logf func(format string, args ...interface{}) + initialized bool + resolver Resolver } +func (e *ProcessEnv) goEnv() (map[string]string, error) { + if err := e.init(); err != nil { + return nil, err + } + return e.Env, nil +} + +func (e *ProcessEnv) matchFile(dir, name string) (bool, error) { + bctx, err := e.buildContext() + if err != nil { + return false, err + } + return bctx.MatchFile(dir, name) +} + // CopyConfig copies the env's configuration into a new env. func (e *ProcessEnv) CopyConfig() *ProcessEnv { - copy := *e - copy.resolver = nil - return © + copy := &ProcessEnv{ + GocmdRunner: e.GocmdRunner, + initialized: e.initialized, + BuildFlags: e.BuildFlags, + Logf: e.Logf, + WorkingDir: e.WorkingDir, + resolver: nil, + Env: map[string]string{}, + } + for k, v := range e.Env { + copy.Env[k] = v + } + return copy } -func (e *ProcessEnv) env() []string { - env := os.Environ() - add := func(k, v string) { - if v != "" { - env = append(env, k+"="+v) +func (e *ProcessEnv) init() error { + if e.initialized { + return nil + } + + foundAllRequired := true + for _, k := range RequiredGoEnvVars { + if _, ok := e.Env[k]; !ok { + foundAllRequired = false + break } } - add("GOPATH", e.GOPATH) - add("GOROOT", e.GOROOT) - add("GO111MODULE", e.GO111MODULE) - add("GOPROXY", e.GOPROXY) - add("GOFLAGS", e.GOFLAGS) - add("GOSUMDB", e.GOSUMDB) - if e.WorkingDir != "" { - add("PWD", e.WorkingDir) + if foundAllRequired { + e.initialized = true + return nil + } + + if e.Env == nil { + e.Env = map[string]string{} + } + + goEnv := map[string]string{} + stdout, err := e.invokeGo(context.TODO(), "env", append([]string{"-json"}, RequiredGoEnvVars...)...) + if err != nil { + return err + } + if err := json.Unmarshal(stdout.Bytes(), &goEnv); err != nil { + return err + } + for k, v := range goEnv { + e.Env[k] = v + } + e.initialized = true + return nil +} + +func (e *ProcessEnv) env() []string { + var env []string // the gocommand package will prepend os.Environ. + for k, v := range e.Env { + env = append(env, k+"="+v) } return env } -func (e *ProcessEnv) GetResolver() Resolver { +func (e *ProcessEnv) GetResolver() (Resolver, error) { if e.resolver != nil { - return e.resolver + return e.resolver, nil } - out, err := e.invokeGo(context.TODO(), "env", "GOMOD") - if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 { + if err := e.init(); err != nil { + return nil, err + } + if len(e.Env["GOMOD"]) == 0 { e.resolver = newGopathResolver(e) - return e.resolver + return e.resolver, nil } e.resolver = newModuleResolver(e) - return e.resolver + return e.resolver, nil } -func (e *ProcessEnv) buildContext() *build.Context { +func (e *ProcessEnv) buildContext() (*build.Context, error) { ctx := build.Default - ctx.GOROOT = e.GOROOT - ctx.GOPATH = e.GOPATH + goenv, err := e.goEnv() + if err != nil { + return nil, err + } + ctx.GOROOT = goenv["GOROOT"] + ctx.GOPATH = goenv["GOPATH"] // As of Go 1.14, build.Context has a Dir field // (see golang.org/issue/34860). // Populate it only if present. rc := reflect.ValueOf(&ctx).Elem() dir := rc.FieldByName("Dir") - if !dir.IsValid() { - // Working drafts of Go 1.14 named the field "WorkingDir" instead. - // TODO(bcmills): Remove this case after the Go 1.14 beta has been released. - dir = rc.FieldByName("WorkingDir") - } if dir.IsValid() && dir.Kind() == reflect.String { dir.SetString(e.WorkingDir) } - return &ctx + // Since Go 1.11, go/build.Context.Import may invoke 'go list' depending on + // the value in GO111MODULE in the process's environment. We always want to + // run in GOPATH mode when calling Import, so we need to prevent this from + // happening. In Go 1.16, GO111MODULE defaults to "on", so this problem comes + // up more frequently. + // + // HACK: setting any of the Context I/O hooks prevents Import from invoking + // 'go list', regardless of GO111MODULE. This is undocumented, but it's + // unlikely to change before GOPATH support is removed. + ctx.ReadDir = ioutil.ReadDir + + return &ctx, nil } func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string) (*bytes.Buffer, error) { @@ -836,10 +954,14 @@ func (e *ProcessEnv) invokeGo(ctx context.Context, verb string, args ...string) return e.GocmdRunner.Run(ctx, inv) } -func addStdlibCandidates(pass *pass, refs references) { +func addStdlibCandidates(pass *pass, refs references) error { + goenv, err := pass.env.goEnv() + if err != nil { + return err + } add := func(pkg string) { // Prevent self-imports. - if path.Base(pkg) == pass.f.Name.Name && filepath.Join(pass.env.GOROOT, "src", pkg) == pass.srcDir { + if path.Base(pkg) == pass.f.Name.Name && filepath.Join(goenv["GOROOT"], "src", pkg) == pass.srcDir { return } exports := copyExports(stdlib[pkg]) @@ -860,6 +982,7 @@ func addStdlibCandidates(pass *pass, refs references) { } } } + return nil } // A Resolver does the build-system-specific parts of goimports. @@ -924,10 +1047,13 @@ func addExternalCandidates(pass *pass, refs references, filename string) error { return false // We'll do our own loading after we sort. }, } - err := pass.env.GetResolver().scan(context.Background(), callback) + resolver, err := pass.env.GetResolver() if err != nil { return err } + if err = resolver.scan(context.Background(), callback); err != nil { + return err + } // Search for imports matching potential package references. type result struct { @@ -1053,21 +1179,24 @@ func (r *gopathResolver) ClearForNewScan() { func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) { names := map[string]string{} + bctx, err := r.env.buildContext() + if err != nil { + return nil, err + } for _, path := range importPaths { - names[path] = importPathToName(r.env, path, srcDir) + names[path] = importPathToName(bctx, path, srcDir) } return names, nil } // importPathToName finds out the actual package name, as declared in its .go files. -// If there's a problem, it returns "". -func importPathToName(env *ProcessEnv, importPath, srcDir string) (packageName string) { +func importPathToName(bctx *build.Context, importPath, srcDir string) string { // Fast path for standard library without going to disk. if _, ok := stdlib[importPath]; ok { return path.Base(importPath) // stdlib packages always match their paths. } - buildPkg, err := env.buildContext().Import(importPath, srcDir, build.FindOnly) + buildPkg, err := bctx.Import(importPath, srcDir, build.FindOnly) if err != nil { return "" } @@ -1228,8 +1357,18 @@ func (r *gopathResolver) scan(ctx context.Context, callback *scanCallback) error } stop := r.cache.ScanAndListen(ctx, processDir) defer stop() + + goenv, err := r.env.goEnv() + if err != nil { + return err + } + var roots []gopathwalk.Root + roots = append(roots, gopathwalk.Root{filepath.Join(goenv["GOROOT"], "src"), gopathwalk.RootGOROOT}) + for _, p := range filepath.SplitList(goenv["GOPATH"]) { + roots = append(roots, gopathwalk.Root{filepath.Join(p, "src"), gopathwalk.RootGOPATH}) + } // The callback is not necessarily safe to use in the goroutine below. Process roots eagerly. - roots := filterRoots(gopathwalk.SrcDirsRoots(r.env.buildContext()), callback.rootFound) + roots = filterRoots(roots, callback.rootFound) // We can't cancel walks, because we need them to finish to have a usable // cache. Instead, run them in a separate goroutine and detach. scanDone := make(chan struct{}) @@ -1289,8 +1428,6 @@ func VendorlessPath(ipath string) string { } func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, includeTest bool) (string, []string, error) { - var exports []string - // Look for non-test, buildable .go files which could provide exports. all, err := ioutil.ReadDir(dir) if err != nil { @@ -1302,7 +1439,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl if !strings.HasSuffix(name, ".go") || (!includeTest && strings.HasSuffix(name, "_test.go")) { continue } - match, err := env.buildContext().MatchFile(dir, fi.Name()) + match, err := env.matchFile(dir, fi.Name()) if err != nil || !match { continue } @@ -1314,6 +1451,7 @@ func loadExportsFromFiles(ctx context.Context, env *ProcessEnv, dir string, incl } var pkgName string + var exports []string fset := token.NewFileSet() for _, fi := range files { select { @@ -1368,6 +1506,10 @@ func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgNa pass.env.Logf("%s candidate %d/%d: %v in %v", pkgName, i+1, len(candidates), c.pkg.importPathShort, c.pkg.dir) } } + resolver, err := pass.env.GetResolver() + if err != nil { + return nil, err + } // Collect exports for packages with matching names. rescv := make([]chan *pkg, len(candidates)) @@ -1406,7 +1548,7 @@ func findImport(ctx context.Context, pass *pass, candidates []pkgDistance, pkgNa } // If we're an x_test, load the package under test's test variant. includeTest := strings.HasSuffix(pass.f.Name.Name, "_test") && c.pkg.dir == pass.srcDir - _, exports, err := pass.env.GetResolver().loadExports(ctx, c.pkg, includeTest) + _, exports, err := resolver.loadExports(ctx, c.pkg, includeTest) if err != nil { if pass.env.Logf != nil { pass.env.Logf("loading exports in dir %s (seeking package %s): %v", c.pkg.dir, pkgName, err) diff --git a/vendor/golang.org/x/tools/internal/imports/imports.go b/vendor/golang.org/x/tools/internal/imports/imports.go index f43d6b22e..2815edc33 100644 --- a/vendor/golang.org/x/tools/internal/imports/imports.go +++ b/vendor/golang.org/x/tools/internal/imports/imports.go @@ -11,29 +11,29 @@ package imports import ( "bufio" "bytes" - "context" "fmt" "go/ast" - "go/build" "go/format" "go/parser" "go/printer" "go/token" "io" - "io/ioutil" - "os" "regexp" "strconv" "strings" "golang.org/x/tools/go/ast/astutil" - "golang.org/x/tools/internal/gocommand" ) // Options is golang.org/x/tools/imports.Options with extra internal-only options. type Options struct { Env *ProcessEnv // The environment to use. Note: this contains the cached module and filesystem state. + // LocalPrefix is a comma-separated string of import path prefixes, which, if + // set, instructs Process to sort the import paths with the given prefixes + // into another group after 3rd-party packages. + LocalPrefix string + Fragment bool // Accept fragment of a source file (no package statement) AllErrors bool // Report all errors (not just the first 10 on different lines) @@ -44,13 +44,8 @@ type Options struct { FormatOnly bool // Disable the insertion and deletion of imports } -// Process implements golang.org/x/tools/imports.Process with explicit context in env. +// Process implements golang.org/x/tools/imports.Process with explicit context in opt.Env. func Process(filename string, src []byte, opt *Options) (formatted []byte, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - fileSet := token.NewFileSet() file, adjust, err := parse(fileSet, filename, src, opt) if err != nil { @@ -66,16 +61,12 @@ func Process(filename string, src []byte, opt *Options) (formatted []byte, err e } // FixImports returns a list of fixes to the imports that, when applied, -// will leave the imports in the same state as Process. +// will leave the imports in the same state as Process. src and opt must +// be specified. // // Note that filename's directory influences which imports can be chosen, // so it is important that filename be accurate. func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - fileSet := token.NewFileSet() file, _, err := parse(fileSet, filename, src, opt) if err != nil { @@ -86,13 +77,9 @@ func FixImports(filename string, src []byte, opt *Options) (fixes []*ImportFix, } // ApplyFixes applies all of the fixes to the file and formats it. extraMode -// is added in when parsing the file. +// is added in when parsing the file. src and opts must be specified, but no +// env is needed. func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, extraMode parser.Mode) (formatted []byte, err error) { - src, opt, err = initialize(filename, src, opt) - if err != nil { - return nil, err - } - // Don't use parse() -- we don't care about fragments or statement lists // here, and we need to work with unparseable files. fileSet := token.NewFileSet() @@ -116,63 +103,9 @@ func ApplyFixes(fixes []*ImportFix, filename string, src []byte, opt *Options, e return formatFile(fileSet, file, src, nil, opt) } -// GetAllCandidates gets all of the packages starting with prefix that can be -// imported by filename, sorted by import path. -func GetAllCandidates(ctx context.Context, callback func(ImportFix), searchPrefix, filename, filePkg string, opt *Options) error { - _, opt, err := initialize(filename, []byte{}, opt) - if err != nil { - return err - } - return getAllCandidates(ctx, callback, searchPrefix, filename, filePkg, opt.Env) -} - -// GetPackageExports returns all known packages with name pkg and their exports. -func GetPackageExports(ctx context.Context, callback func(PackageExport), searchPkg, filename, filePkg string, opt *Options) error { - _, opt, err := initialize(filename, []byte{}, opt) - if err != nil { - return err - } - return getPackageExports(ctx, callback, searchPkg, filename, filePkg, opt.Env) -} - -// initialize sets the values for opt and src. -// If they are provided, they are not changed. Otherwise opt is set to the -// default values and src is read from the file system. -func initialize(filename string, src []byte, opt *Options) ([]byte, *Options, error) { - // Use defaults if opt is nil. - if opt == nil { - opt = &Options{Comments: true, TabIndent: true, TabWidth: 8} - } - - // Set the env if the user has not provided it. - if opt.Env == nil { - opt.Env = &ProcessEnv{ - GOPATH: build.Default.GOPATH, - GOROOT: build.Default.GOROOT, - GOFLAGS: os.Getenv("GOFLAGS"), - GO111MODULE: os.Getenv("GO111MODULE"), - GOPROXY: os.Getenv("GOPROXY"), - GOSUMDB: os.Getenv("GOSUMDB"), - } - } - // Set the gocmdRunner if the user has not provided it. - if opt.Env.GocmdRunner == nil { - opt.Env.GocmdRunner = &gocommand.Runner{} - } - if src == nil { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, nil, err - } - src = b - } - - return src, opt, nil -} - func formatFile(fileSet *token.FileSet, file *ast.File, src []byte, adjust func(orig []byte, src []byte) []byte, opt *Options) ([]byte, error) { - mergeImports(opt.Env, fileSet, file) - sortImports(opt.Env, fileSet, file) + mergeImports(fileSet, file) + sortImports(opt.LocalPrefix, fileSet, file) imps := astutil.Imports(fileSet, file) var spacesBefore []string // import paths we need spaces before for _, impSection := range imps { @@ -183,7 +116,7 @@ func formatFile(fileSet *token.FileSet, file *ast.File, src []byte, adjust func( lastGroup := -1 for _, importSpec := range impSection { importPath, _ := strconv.Unquote(importSpec.Path.Value) - groupNum := importGroup(opt.Env, importPath) + groupNum := importGroup(opt.LocalPrefix, importPath) if groupNum != lastGroup && lastGroup != -1 { spacesBefore = append(spacesBefore, importPath) } diff --git a/vendor/golang.org/x/tools/internal/imports/mod.go b/vendor/golang.org/x/tools/internal/imports/mod.go index 4e816e8bc..94880d616 100644 --- a/vendor/golang.org/x/tools/internal/imports/mod.go +++ b/vendor/golang.org/x/tools/internal/imports/mod.go @@ -53,6 +53,10 @@ func (r *ModuleResolver) init() error { return nil } + goenv, err := r.env.goEnv() + if err != nil { + return err + } inv := gocommand.Invocation{ BuildFlags: r.env.BuildFlags, Env: r.env.env(), @@ -79,7 +83,11 @@ func (r *ModuleResolver) init() error { r.initAllMods() } - r.moduleCacheDir = filepath.Join(filepath.SplitList(r.env.GOPATH)[0], "/pkg/mod") + if gmc := r.env.Env["GOMODCACHE"]; gmc != "" { + r.moduleCacheDir = gmc + } else { + r.moduleCacheDir = filepath.Join(filepath.SplitList(goenv["GOPATH"])[0], "/pkg/mod") + } sort.Slice(r.modsByModPath, func(i, j int) bool { count := func(x int) int { @@ -95,7 +103,7 @@ func (r *ModuleResolver) init() error { }) r.roots = []gopathwalk.Root{ - {filepath.Join(r.env.GOROOT, "/src"), gopathwalk.RootGOROOT}, + {filepath.Join(goenv["GOROOT"], "/src"), gopathwalk.RootGOROOT}, } if r.main != nil { r.roots = append(r.roots, gopathwalk.Root{r.main.Dir, gopathwalk.RootCurrentModule}) @@ -236,7 +244,7 @@ func (r *ModuleResolver) findPackage(importPath string) (*gocommand.ModuleJSON, // files in that directory. If not, it could be provided by an // outer module. See #29736. for _, fi := range pkgFiles { - if ok, _ := r.env.buildContext().MatchFile(pkgDir, fi.Name()); ok { + if ok, _ := r.env.matchFile(pkgDir, fi.Name()); ok { return m, pkgDir } } diff --git a/vendor/golang.org/x/tools/internal/imports/sortimports.go b/vendor/golang.org/x/tools/internal/imports/sortimports.go index 226279471..be8ffa25f 100644 --- a/vendor/golang.org/x/tools/internal/imports/sortimports.go +++ b/vendor/golang.org/x/tools/internal/imports/sortimports.go @@ -15,7 +15,7 @@ import ( // sortImports sorts runs of consecutive import lines in import blocks in f. // It also removes duplicate imports when it is possible to do so without data loss. -func sortImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { +func sortImports(localPrefix string, fset *token.FileSet, f *ast.File) { for i, d := range f.Decls { d, ok := d.(*ast.GenDecl) if !ok || d.Tok != token.IMPORT { @@ -40,11 +40,11 @@ func sortImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { for j, s := range d.Specs { if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line { // j begins a new run. End this one. - specs = append(specs, sortSpecs(env, fset, f, d.Specs[i:j])...) + specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:j])...) i = j } } - specs = append(specs, sortSpecs(env, fset, f, d.Specs[i:])...) + specs = append(specs, sortSpecs(localPrefix, fset, f, d.Specs[i:])...) d.Specs = specs // Deduping can leave a blank line before the rparen; clean that up. @@ -60,7 +60,7 @@ func sortImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { // mergeImports merges all the import declarations into the first one. // Taken from golang.org/x/tools/ast/astutil. -func mergeImports(env *ProcessEnv, fset *token.FileSet, f *ast.File) { +func mergeImports(fset *token.FileSet, f *ast.File) { if len(f.Decls) <= 1 { return } @@ -142,7 +142,7 @@ type posSpan struct { End token.Pos } -func sortSpecs(env *ProcessEnv, fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec { +func sortSpecs(localPrefix string, fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec { // Can't short-circuit here even if specs are already sorted, // since they might yet need deduplication. // A lone import, however, may be safely ignored. @@ -191,7 +191,7 @@ func sortSpecs(env *ProcessEnv, fset *token.FileSet, f *ast.File, specs []ast.Sp // Reassign the import paths to have the same position sequence. // Reassign each comment to abut the end of its spec. // Sort the comments by new position. - sort.Sort(byImportSpec{env, specs}) + sort.Sort(byImportSpec{localPrefix, specs}) // Dedup. Thanks to our sorting, we can just consider // adjacent pairs of imports. @@ -245,8 +245,8 @@ func sortSpecs(env *ProcessEnv, fset *token.FileSet, f *ast.File, specs []ast.Sp } type byImportSpec struct { - env *ProcessEnv - specs []ast.Spec // slice of *ast.ImportSpec + localPrefix string + specs []ast.Spec // slice of *ast.ImportSpec } func (x byImportSpec) Len() int { return len(x.specs) } @@ -255,8 +255,8 @@ func (x byImportSpec) Less(i, j int) bool { ipath := importPath(x.specs[i]) jpath := importPath(x.specs[j]) - igroup := importGroup(x.env, ipath) - jgroup := importGroup(x.env, jpath) + igroup := importGroup(x.localPrefix, ipath) + jgroup := importGroup(x.localPrefix, jpath) if igroup != jgroup { return igroup < jgroup } diff --git a/vendor/golang.org/x/tools/internal/imports/zstdlib.go b/vendor/golang.org/x/tools/internal/imports/zstdlib.go index 16252111f..7b573b983 100644 --- a/vendor/golang.org/x/tools/internal/imports/zstdlib.go +++ b/vendor/golang.org/x/tools/internal/imports/zstdlib.go @@ -56,6 +56,7 @@ var stdlib = map[string][]string{ }, "bufio": []string{ "ErrAdvanceTooFar", + "ErrBadReadCount", "ErrBufferFull", "ErrFinalToken", "ErrInvalidUnreadByte", @@ -303,7 +304,9 @@ var stdlib = map[string][]string{ "PrivateKey", "PublicKey", "Sign", + "SignASN1", "Verify", + "VerifyASN1", }, "crypto/ed25519": []string{ "GenerateKey", @@ -322,11 +325,13 @@ var stdlib = map[string][]string{ "CurveParams", "GenerateKey", "Marshal", + "MarshalCompressed", "P224", "P256", "P384", "P521", "Unmarshal", + "UnmarshalCompressed", }, "crypto/hmac": []string{ "Equal", @@ -432,6 +437,7 @@ var stdlib = map[string][]string{ "CurveP521", "Dial", "DialWithDialer", + "Dialer", "ECDSAWithP256AndSHA256", "ECDSAWithP384AndSHA384", "ECDSAWithP521AndSHA512", @@ -507,6 +513,7 @@ var stdlib = map[string][]string{ "ConstraintViolationError", "CreateCertificate", "CreateCertificateRequest", + "CreateRevocationList", "DSA", "DSAWithSHA1", "DSAWithSHA256", @@ -581,6 +588,7 @@ var stdlib = map[string][]string{ "PublicKeyAlgorithm", "PureEd25519", "RSA", + "RevocationList", "SHA1WithRSA", "SHA256WithRSA", "SHA256WithRSAPSS", @@ -694,6 +702,7 @@ var stdlib = map[string][]string{ "String", "Tx", "TxOptions", + "Validator", "Value", "ValueConverter", "Valuer", @@ -2349,6 +2358,27 @@ var stdlib = map[string][]string{ "IMAGE_DIRECTORY_ENTRY_RESOURCE", "IMAGE_DIRECTORY_ENTRY_SECURITY", "IMAGE_DIRECTORY_ENTRY_TLS", + "IMAGE_DLLCHARACTERISTICS_APPCONTAINER", + "IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE", + "IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY", + "IMAGE_DLLCHARACTERISTICS_GUARD_CF", + "IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA", + "IMAGE_DLLCHARACTERISTICS_NO_BIND", + "IMAGE_DLLCHARACTERISTICS_NO_ISOLATION", + "IMAGE_DLLCHARACTERISTICS_NO_SEH", + "IMAGE_DLLCHARACTERISTICS_NX_COMPAT", + "IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE", + "IMAGE_DLLCHARACTERISTICS_WDM_DRIVER", + "IMAGE_FILE_32BIT_MACHINE", + "IMAGE_FILE_AGGRESIVE_WS_TRIM", + "IMAGE_FILE_BYTES_REVERSED_HI", + "IMAGE_FILE_BYTES_REVERSED_LO", + "IMAGE_FILE_DEBUG_STRIPPED", + "IMAGE_FILE_DLL", + "IMAGE_FILE_EXECUTABLE_IMAGE", + "IMAGE_FILE_LARGE_ADDRESS_AWARE", + "IMAGE_FILE_LINE_NUMS_STRIPPED", + "IMAGE_FILE_LOCAL_SYMS_STRIPPED", "IMAGE_FILE_MACHINE_AM33", "IMAGE_FILE_MACHINE_AMD64", "IMAGE_FILE_MACHINE_ARM", @@ -2371,6 +2401,25 @@ var stdlib = map[string][]string{ "IMAGE_FILE_MACHINE_THUMB", "IMAGE_FILE_MACHINE_UNKNOWN", "IMAGE_FILE_MACHINE_WCEMIPSV2", + "IMAGE_FILE_NET_RUN_FROM_SWAP", + "IMAGE_FILE_RELOCS_STRIPPED", + "IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP", + "IMAGE_FILE_SYSTEM", + "IMAGE_FILE_UP_SYSTEM_ONLY", + "IMAGE_SUBSYSTEM_EFI_APPLICATION", + "IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER", + "IMAGE_SUBSYSTEM_EFI_ROM", + "IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER", + "IMAGE_SUBSYSTEM_NATIVE", + "IMAGE_SUBSYSTEM_NATIVE_WINDOWS", + "IMAGE_SUBSYSTEM_OS2_CUI", + "IMAGE_SUBSYSTEM_POSIX_CUI", + "IMAGE_SUBSYSTEM_UNKNOWN", + "IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION", + "IMAGE_SUBSYSTEM_WINDOWS_CE_GUI", + "IMAGE_SUBSYSTEM_WINDOWS_CUI", + "IMAGE_SUBSYSTEM_WINDOWS_GUI", + "IMAGE_SUBSYSTEM_XBOX", "ImportDirectory", "NewFile", "Open", @@ -4188,6 +4237,7 @@ var stdlib = map[string][]string{ "DevNull", "Environ", "ErrClosed", + "ErrDeadlineExceeded", "ErrExist", "ErrInvalid", "ErrNoDeadline", @@ -4646,6 +4696,7 @@ var stdlib = map[string][]string{ "ErrRange", "ErrSyntax", "FormatBool", + "FormatComplex", "FormatFloat", "FormatInt", "FormatUint", @@ -4655,6 +4706,7 @@ var stdlib = map[string][]string{ "Itoa", "NumError", "ParseBool", + "ParseComplex", "ParseFloat", "ParseInt", "ParseUint", diff --git a/vendor/modules.txt b/vendor/modules.txt index f0fb18638..47bad0866 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -38,7 +38,7 @@ github.com/gardener/etcd-druid/api/v1alpha1 # github.com/gardener/external-dns-management v0.7.18 github.com/gardener/external-dns-management/pkg/apis/dns github.com/gardener/external-dns-management/pkg/apis/dns/v1alpha1 -# github.com/gardener/gardener v1.19.1 +# github.com/gardener/gardener v1.21.0 ## explicit github.com/gardener/gardener/.github github.com/gardener/gardener/.github/ISSUE_TEMPLATE @@ -82,9 +82,11 @@ github.com/gardener/gardener/pkg/client/core/clientset/versioned github.com/gardener/gardener/pkg/client/core/clientset/versioned/scheme github.com/gardener/gardener/pkg/client/core/clientset/versioned/typed/core/v1alpha1 github.com/gardener/gardener/pkg/client/core/clientset/versioned/typed/core/v1beta1 +github.com/gardener/gardener/pkg/client/core/listers/core/internalversion github.com/gardener/gardener/pkg/client/core/listers/core/v1beta1 github.com/gardener/gardener/pkg/client/extensions/clientset/versioned/scheme github.com/gardener/gardener/pkg/client/kubernetes +github.com/gardener/gardener/pkg/client/kubernetes/cache github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/scheme github.com/gardener/gardener/pkg/client/seedmanagement/clientset/versioned/typed/seedmanagement/v1alpha1 @@ -97,22 +99,19 @@ github.com/gardener/gardener/pkg/gardenlet/apis/config/v1alpha1 github.com/gardener/gardener/pkg/logger github.com/gardener/gardener/pkg/operation/common github.com/gardener/gardener/pkg/utils -github.com/gardener/gardener/pkg/utils/chart github.com/gardener/gardener/pkg/utils/context github.com/gardener/gardener/pkg/utils/errors github.com/gardener/gardener/pkg/utils/flow -github.com/gardener/gardener/pkg/utils/imagevector +github.com/gardener/gardener/pkg/utils/gardener github.com/gardener/gardener/pkg/utils/infodata github.com/gardener/gardener/pkg/utils/kubernetes github.com/gardener/gardener/pkg/utils/kubernetes/health -github.com/gardener/gardener/pkg/utils/managedresources github.com/gardener/gardener/pkg/utils/retry github.com/gardener/gardener/pkg/utils/secrets github.com/gardener/gardener/pkg/utils/version # github.com/gardener/gardener-resource-manager v0.18.0 github.com/gardener/gardener-resource-manager/pkg/apis/resources github.com/gardener/gardener-resource-manager/pkg/apis/resources/v1alpha1 -github.com/gardener/gardener-resource-manager/pkg/manager # github.com/gardener/hvpa-controller v0.3.1 github.com/gardener/hvpa-controller/api/v1alpha1 # github.com/ghodss/yaml v1.0.0 @@ -129,34 +128,8 @@ github.com/go-openapi/jsonreference github.com/go-openapi/spec # github.com/go-openapi/swag v0.19.5 github.com/go-openapi/swag -# github.com/gobuffalo/envy v1.7.0 -github.com/gobuffalo/envy # github.com/gobuffalo/flect v0.2.0 github.com/gobuffalo/flect -# github.com/gobuffalo/logger v1.0.0 -github.com/gobuffalo/logger -# github.com/gobuffalo/packd v0.3.0 -github.com/gobuffalo/packd -github.com/gobuffalo/packd/internal/takeon/github.com/markbates/errx -# github.com/gobuffalo/packr v1.30.1 -## explicit -github.com/gobuffalo/packr -# github.com/gobuffalo/packr/v2 v2.5.1 -## explicit -github.com/gobuffalo/packr/v2 -github.com/gobuffalo/packr/v2/file -github.com/gobuffalo/packr/v2/file/resolver -github.com/gobuffalo/packr/v2/file/resolver/encoding/hex -github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/errx -github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/oncer -github.com/gobuffalo/packr/v2/internal/takeon/github.com/markbates/safe -github.com/gobuffalo/packr/v2/jam -github.com/gobuffalo/packr/v2/jam/parser -github.com/gobuffalo/packr/v2/jam/store -github.com/gobuffalo/packr/v2/packr2 -github.com/gobuffalo/packr/v2/packr2/cmd -github.com/gobuffalo/packr/v2/packr2/cmd/fix -github.com/gobuffalo/packr/v2/plog # github.com/gobwas/glob v0.2.3 github.com/gobwas/glob github.com/gobwas/glob/compiler @@ -223,23 +196,19 @@ github.com/googleapis/gnostic/jsonschema github.com/googleapis/gnostic/openapiv2 # github.com/hashicorp/errwrap v1.0.0 github.com/hashicorp/errwrap -# github.com/hashicorp/go-multierror v1.0.0 +# github.com/hashicorp/go-multierror v1.1.0 github.com/hashicorp/go-multierror # github.com/hashicorp/golang-lru v0.5.4 github.com/hashicorp/golang-lru github.com/hashicorp/golang-lru/simplelru -# github.com/huandu/xstrings v1.3.1 +# github.com/huandu/xstrings v1.3.2 github.com/huandu/xstrings # github.com/imdario/mergo v0.3.10 github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.0.0 github.com/inconshreveable/mousetrap -# github.com/joho/godotenv v1.3.0 -github.com/joho/godotenv # github.com/json-iterator/go v1.1.10 github.com/json-iterator/go -# github.com/karrick/godirwalk v1.10.12 -github.com/karrick/godirwalk # github.com/konsorten/go-windows-terminal-sequences v1.0.3 github.com/konsorten/go-windows-terminal-sequences # github.com/mailru/easyjson v0.7.0 @@ -266,7 +235,7 @@ github.com/nxadm/tail/ratelimiter github.com/nxadm/tail/util github.com/nxadm/tail/watch github.com/nxadm/tail/winfile -# github.com/onsi/ginkgo v1.14.1 +# github.com/onsi/ginkgo v1.14.2 ## explicit github.com/onsi/ginkgo github.com/onsi/ginkgo/config @@ -324,10 +293,6 @@ github.com/prometheus/common/model github.com/prometheus/procfs github.com/prometheus/procfs/internal/fs github.com/prometheus/procfs/internal/util -# github.com/rogpeppe/go-internal v1.3.0 -github.com/rogpeppe/go-internal/modfile -github.com/rogpeppe/go-internal/module -github.com/rogpeppe/go-internal/semver # github.com/russross/blackfriday/v2 v2.0.1 github.com/russross/blackfriday/v2 # github.com/shurcooL/sanitized_anchor_name v1.0.0 @@ -363,7 +328,7 @@ golang.org/x/crypto/scrypt golang.org/x/crypto/ssh golang.org/x/crypto/ssh/internal/bcrypt_pbkdf golang.org/x/crypto/ssh/terminal -# golang.org/x/lint v0.0.0-20200302205851-738671d3881b +# golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 golang.org/x/lint golang.org/x/lint/golint # golang.org/x/mod v0.3.0 @@ -384,8 +349,6 @@ golang.org/x/net/idna # golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/oauth2 golang.org/x/oauth2/internal -# golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e -golang.org/x/sync/errgroup # golang.org/x/sys v0.0.0-20201112073958-5cba982894dd golang.org/x/sys/cpu golang.org/x/sys/internal/unsafeheader @@ -415,7 +378,7 @@ golang.org/x/text/unicode/norm golang.org/x/text/width # golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e golang.org/x/time/rate -# golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5 +# golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d golang.org/x/tools/go/ast/astutil golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/gcimporter