From dd15418c3e294de0b475d1bc812a9b49b4a75880 Mon Sep 17 00:00:00 2001 From: Pierre-Emmanuel Jacquier Date: Thu, 4 Apr 2019 17:46:12 +0200 Subject: [PATCH] Bump cluster-api to 0.1.0 and add k8s version to 1.13.5 (#20) Signed-off-by: Pierre-Emmanuel Jacquier --- Gopkg.lock | 31 +- Gopkg.toml | 12 +- vendor/k8s.io/api/Godeps/Godeps.json | 74 +- vendor/k8s.io/api/core/v1/generated.proto | 1 + vendor/k8s.io/api/core/v1/types.go | 1 + .../core/v1/types_swagger_doc_generated.go | 2 +- .../Godeps/Godeps.json | 686 +++++++++--------- vendor/k8s.io/apimachinery/Godeps/Godeps.json | 2 +- .../apimachinery/pkg/api/errors/errors.go | 24 + .../apimachinery/pkg/apis/meta/v1/types.go | 4 + .../k8s.io/apimachinery/pkg/runtime/codec.go | 20 + vendor/k8s.io/client-go/Godeps/Godeps.json | 170 ++--- .../k8s.io/client-go/tools/cache/reflector.go | 27 +- .../.github/ISSUE_TEMPLATE/bug_report.md | 1 + .../.github/ISSUE_TEMPLATE/feature_request.md | 7 - .../sigs.k8s.io/cluster-api/CONTRIBUTING.md | 4 + vendor/sigs.k8s.io/cluster-api/Dockerfile | 2 +- vendor/sigs.k8s.io/cluster-api/Gopkg.lock | 81 ++- vendor/sigs.k8s.io/cluster-api/Makefile | 4 +- vendor/sigs.k8s.io/cluster-api/README.md | 9 +- vendor/sigs.k8s.io/cluster-api/WORKSPACE | 14 +- .../sigs.k8s.io/cluster-api/architecture.png | Bin 197396 -> 0 bytes .../cluster-api/cmd/clusterctl/README.md | 18 +- .../clusterctl/clusterdeployer/BUILD.bazel | 1 - .../clusterdeployer/bootstrap/kind/kind.go | 16 +- .../bootstrap/minikube/minikube.go | 17 + .../clusterdeployer/clusterclient/BUILD.bazel | 1 + .../clusterclient/clusterclient.go | 579 ++++++++++++--- .../clusterdeployer/clusterdeployer.go | 164 +---- .../cmd/clusterctl/cmd/BUILD.bazel | 3 + .../alpha_phase_apply_boostrap_components.go | 80 ++ .../cmd/alpha_phase_get_kubeconfig.go | 2 +- .../cmd/clusterctl/cmd/alpha_phase_pivot.go | 100 +++ .../cmd/clusterctl/cmd/create_cluster.go | 25 +- .../cmd/clusterctl/cmd/delete_cluster.go | 7 +- .../cmd/clusterctl/phases/BUILD.bazel | 16 +- .../phases/applybootstrapcomponents.go | 32 + .../cmd/clusterctl/phases/applymachines.go | 2 +- .../cmd/clusterctl/phases/getkubeconfig.go | 19 +- .../cmd/clusterctl/phases/pivot.go | 424 +++++++++++ ...create-cluster-no-args-invalid-flag.golden | 3 +- .../testdata/create-cluster-no-args.golden | 3 +- ...delete-cluster-no-args-invalid-flag.golden | 1 - .../testdata/delete-cluster-no-args.golden | 1 - .../cmd/clusterctl/validation/BUILD.bazel | 2 - .../cluster-api/cmd/manager/main.go | 6 +- .../config/crds/cluster_v1alpha1_machine.yaml | 17 +- .../cluster_v1alpha1_machinedeployment.yaml | 10 +- .../crds/cluster_v1alpha1_machineset.yaml | 19 +- .../config/default/manager_image_patch.yaml | 2 +- .../cluster-api/config/rbac/rbac_role.yaml | 1 + .../cluster-api/docs/book/SUMMARY.md | 1 + .../docs/book/common_code/architecture.md | 2 +- .../docs/book/common_code/architecture.png | Bin 197396 -> 0 bytes .../docs/book/common_code/architecture.svg | 1 + .../book/common_code/cluster_controller.md | 19 +- .../activity_cluster_reconciliation.drawio | 1 + .../activity_cluster_reconciliation.svg | 2 + ...y_machine_controller_reconciliation.drawio | 1 + ...vity_machine_controller_reconciliation.svg | 2 + .../activity_machine_deletion_block.drawio | 1 + .../activity_machine_deletion_block.svg | 2 + ...ty_machinedeployment_reconciliation.drawio | 1 + ...ivity_machinedeployment_reconciliation.svg | 2 + .../activity_machineset_reconciliation.drawio | 1 + .../activity_machineset_reconciliation.svg | 2 + .../activity_node_reconciliation.drawio | 1 + .../images/activity_node_reconciliation.svg | 2 + .../images/sequence_cluster_creation.drawio | 1 + .../images/sequence_cluster_creation.svg | 2 + .../images/sequence_cluster_deletion.drawio | 1 + .../images/sequence_cluster_deletion.svg | 2 + .../images/sequence_machine_creation.drawio | 1 + .../images/sequence_machine_creation.svg | 2 + .../images/sequence_machine_deletion.drawio | 1 + .../images/sequence_machine_deletion.svg | 2 + .../book/common_code/machine_controller.md | 19 +- .../machinedeployment_controller.md | 20 + .../book/common_code/machineset_controller.md | 21 + .../docs/book/common_code/node_controller.md | 22 + .../getting_started/existing_providers.md | 3 +- .../building_running_and_testing.md | 20 +- .../register_schemes.md | 7 +- .../cluster-api/docs/developer/releasing.md | 44 ++ .../cluster-api/hack/verify-bazel.sh | 1 - .../cluster-api/hack/verify_clientset.sh | 1 - .../pkg/apis/cluster/common/consts.go | 7 + .../apis/cluster/v1alpha1/machine_types.go | 19 +- .../apis/cluster/v1alpha1/machineset_types.go | 35 + .../pkg/controller/machine/controller.go | 24 +- .../controller/machinedeployment/BUILD.bazel | 3 + .../machinedeployment/controller.go | 101 ++- .../pkg/controller/machineset/BUILD.bazel | 2 + .../pkg/controller/machineset/controller.go | 112 ++- .../controller/machineset/delete_policy.go | 111 ++- .../pkg/controller/machineset/machine.go | 3 + .../cluster-api/pkg/errors/machines.go | 7 + .../cluster-api/scripts/ci-integration.sh | 39 +- .../cluster-api/scripts/fetch_ext_bins.sh | 2 +- .../test/integration/cluster/BUILD.bazel | 19 + 100 files changed, 2525 insertions(+), 917 deletions(-) delete mode 100644 vendor/sigs.k8s.io/cluster-api/architecture.png create mode 100644 vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go create mode 100644 vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go create mode 100644 vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go create mode 100644 vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go delete mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md create mode 100644 vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md create mode 100644 vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel diff --git a/Gopkg.lock b/Gopkg.lock index 8e03c05b..2779def9 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -803,7 +803,7 @@ version = "v2.2.2" [[projects]] - digest = "1:b84a6534f40032bc9c7aa97b3c577306e3d97b9a7752f285abb29bf15b4fcf9b" + digest = "1:a361d526b77e9f68ba9f5d6f2f24e58e00d87f837b1d4cfc977047a37a7522cf" name = "k8s.io/api" packages = [ "admission/v1beta1", @@ -841,22 +841,22 @@ "storage/v1beta1", ] pruneopts = "T" - revision = "74b699b93c15473932b89e3d1818ba8282f3b5ab" - version = "kubernetes-1.13.3" + revision = "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:33786f45cdfd217b9beff0a5da5751d3cf81ca64d53dae6771543e83f423e4f0" + digest = "1:3ffb40da648cab1795da29295604aef4575862d57973278104937d1cd40b5a5f" name = "k8s.io/apiextensions-apiserver" packages = [ "pkg/apis/apiextensions", "pkg/apis/apiextensions/v1beta1", ] pruneopts = "T" - revision = "d4288ab6494571219e781fa423db363247635942" - version = "kubernetes-1.13.3" + revision = "475668423e9f8feb5e3cc53f37bfeb1ce37f2ce5" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:a7b151b4238f885a02d292c665ce15407429d748619a9c5f29078f63db0b1f78" + digest = "1:82717527f44f2cb9a2a784a427a7ab9bd7f883848bdfabcf70bef8e300b69fa5" name = "k8s.io/apimachinery" packages = [ "pkg/api/errors", @@ -905,11 +905,11 @@ "third_party/forked/golang/reflect", ] pruneopts = "T" - revision = "572dfc7bdfcb4531361a17d27b92851f59acf0dc" - version = "kubernetes-1.13.3" + revision = "86fb29eff6288413d76bd8506874fddd9fccdff0" + version = "kubernetes-1.13.5" [[projects]] - digest = "1:aed3bb8785aec725a564291f79abf365c5ba013e41c7c38c9287fb7d69e9affd" + digest = "1:2f627a97480c9cf291aabc20649c564cf26b2c666116a2e9a17d10c3aea4eae8" name = "k8s.io/client-go" packages = [ "discovery", @@ -986,8 +986,8 @@ "util/workqueue", ] pruneopts = "T" - revision = "6e4752048fde21176ab35eb54ec1117359830d8a" - version = "kubernetes-1.13.3" + revision = "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" + version = "kubernetes-1.13.5" [[projects]] branch = "master" @@ -1018,7 +1018,7 @@ ] pruneopts = "T" revision = "c2090bec4d9b1fb25de3812f868accc2bc9ecbae" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[projects]] branch = "master" @@ -1053,7 +1053,7 @@ revision = "d50a959ae76a85c7c262a9767ef29f37093c2b8a" [[projects]] - digest = "1:dc229e3d77af203b6b1c6b54c0112a75f2b04d91fe4698e70d9d83741a77a022" + digest = "1:bc04752ec8a48d212a0db41c2085bb468ae7c8c34bcb317f552b68f4fe34865b" name = "sigs.k8s.io/cluster-api" packages = [ "cmd/clusterctl/clientcmd", @@ -1081,7 +1081,7 @@ "pkg/util", ] pruneopts = "T" - revision = "c077c33e153abdff6b173d58bd548d059864e9c5" + revision = "0.1.0" [[projects]] digest = "1:5aa50779f75cc439edd3455a6dee7cf179b52f8dde764a47cc929693485d1afb" @@ -1169,7 +1169,6 @@ analyzer-version = 1 input-imports = [ "github.com/cenkalti/backoff", - "github.com/davecgh/go-spew/spew", "github.com/emicklei/go-restful", "github.com/exoscale/egoscale", "github.com/ghodss/yaml", diff --git a/Gopkg.toml b/Gopkg.toml index 53d87acf..1d4d1cb2 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -21,7 +21,7 @@ required = [ [[constraint]] name="sigs.k8s.io/cluster-api" - revision="c077c33e153abdff6b173d58bd548d059864e9c5" + revision="0.1.0" [[constraint]] name="github.com/exoscale/egoscale" @@ -37,23 +37,23 @@ required = [ [[override]] name = "k8s.io/code-generator" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/api" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/apiextensions-apiserver" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/apimachinery" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" [[override]] name = "k8s.io/client-go" - version = "kubernetes-1.13.3" + version = "kubernetes-1.13.5" # For dependency below: Refer to issue https://github.com/golang/dep/issues/1799 [[override]] diff --git a/vendor/k8s.io/api/Godeps/Godeps.json b/vendor/k8s.io/api/Godeps/Godeps.json index ea12c92a..f600497a 100644 --- a/vendor/k8s.io/api/Godeps/Godeps.json +++ b/vendor/k8s.io/api/Godeps/Godeps.json @@ -96,151 +96,151 @@ }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/api/core/v1/generated.proto b/vendor/k8s.io/api/core/v1/generated.proto index 165aa2a2..b13a2db7 100644 --- a/vendor/k8s.io/api/core/v1/generated.proto +++ b/vendor/k8s.io/api/core/v1/generated.proto @@ -3156,6 +3156,7 @@ message PodSpec { // EnableServiceLinks indicates whether information about services should be injected into pod's // environment variables, matching the syntax of Docker links. + // Optional: Defaults to true. // +optional optional bool enableServiceLinks = 30; } diff --git a/vendor/k8s.io/api/core/v1/types.go b/vendor/k8s.io/api/core/v1/types.go index 43e70b9b..87f3f0c5 100644 --- a/vendor/k8s.io/api/core/v1/types.go +++ b/vendor/k8s.io/api/core/v1/types.go @@ -2920,6 +2920,7 @@ type PodSpec struct { RuntimeClassName *string `json:"runtimeClassName,omitempty" protobuf:"bytes,29,opt,name=runtimeClassName"` // EnableServiceLinks indicates whether information about services should be injected into pod's // environment variables, matching the syntax of Docker links. + // Optional: Defaults to true. // +optional EnableServiceLinks *bool `json:"enableServiceLinks,omitempty" protobuf:"varint,30,opt,name=enableServiceLinks"` } diff --git a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 71f90685..13ea6d22 100644 --- a/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1540,7 +1540,7 @@ var map_PodSpec = map[string]string{ "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://github.com/kubernetes/community/blob/master/keps/sig-network/0007-pod-ready%2B%2B.md", "runtimeClassName": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://github.com/kubernetes/community/blob/master/keps/sig-node/0014-runtime-class.md This is an alpha feature and may change in the future.", - "enableServiceLinks": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links.", + "enableServiceLinks": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", } func (PodSpec) SwaggerDoc() map[string]string { diff --git a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json index f3bd56eb..4712c34d 100644 --- a/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json +++ b/vendor/k8s.io/apiextensions-apiserver/Godeps/Godeps.json @@ -384,7 +384,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/ghodss/yaml", @@ -940,1371 +940,1371 @@ }, { "ImportPath": "k8s.io/api/admission/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta/table", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/validation/path", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/duration", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/rand", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/uuid", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/waitgroup", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apiserver/pkg/admission", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/configuration", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/initializer", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/initialization", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/namespace/lifecycle", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/config/apis/webhookadmission/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/errors", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/generic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/mutating", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/namespace", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/request", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/rules", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/util", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/admission/plugin/webhook/validating", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/install", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/apiserver/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/install", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1alpha1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/v1beta1", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/apis/audit/validation", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/event", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/policy", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/audit/util", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticator", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/authenticatorfactory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/group", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/anonymous", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/bearertoken", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/headerrequest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/union", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/websocket", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/request/x509", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/serviceaccount", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/cache", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/token/tokenfile", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authentication/user", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizer", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/authorizerfactory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/path", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/authorization/union", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/discovery", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/filters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/negotiation", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/openapi", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/endpoints/request", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/features", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/registry", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/generic/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/registry/rest/resttest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/filters", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/healthz", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/httplog", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/mux", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/options", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/resourceconfig", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/routes/data/swagger", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/server/storage", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/cacher", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/errors", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/etcdtest", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/metrics", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd/testing/testingcert", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/etcd3", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/names", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/storagebackend/factory", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/storage/value", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/dryrun", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/feature/testing", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flag", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/flushwriter", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/logs", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/openapi", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/proxy", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/trace", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/pkg/util/wsstream", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/buffered", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/dynamic", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/dynamic/enforced", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/log", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/truncate", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/audit/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authenticator/token/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/apiserver/plugin/pkg/authorizer/webhook", - "Rev": "26bc712632e1faf9efc6b63f712325c760ad1ebe" + "Rev": "a4358799e4fec459cf9babfca7c5acf3eed2cef8" }, { "ImportPath": "k8s.io/client-go/discovery", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/discovery/fake", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/dynamic", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/certificates", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/coordination", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/core", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/events", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/extensions", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/internalinterfaces", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/networking", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/policy", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/settings", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/informers/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/scheme", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authentication/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/authorization/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/kubernetes/typed/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/admissionregistration/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/apps/v1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/auditregistration/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/autoscaling/v2beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/batch/v2alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/certificates/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/coordination/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/core/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/events/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/extensions/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/networking/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/policy/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/rbac/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/scheduling/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/settings/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/listers/storage/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/apis/clientauthentication/v1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/pkg/version", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/plugin/pkg/client/auth/exec", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/rest", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/rest/watch", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/restmapper", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsint", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/appsv1beta2", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/autoscalingv1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsint", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/scale/scheme/extensionsv1beta1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/testing", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/third_party/forked/golang/template", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/auth", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/cache", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/latest", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/clientcmd/api/v1", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/metrics", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/pager", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/record", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/tools/reference", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/transport", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/buffer", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/cert", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/connrotation", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/flowcontrol", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/homedir", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/integer", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/jsonpath", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/retry", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/client-go/util/workqueue", - "Rev": "6e4752048fde21176ab35eb54ec1117359830d8a" + "Rev": "7621a5ebb88b1e49ce7e7837ae8e99ca030a3c13" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/apimachinery/Godeps/Godeps.json b/vendor/k8s.io/apimachinery/Godeps/Godeps.json index 82e51c66..ecf1a2bc 100644 --- a/vendor/k8s.io/apimachinery/Godeps/Godeps.json +++ b/vendor/k8s.io/apimachinery/Godeps/Godeps.json @@ -24,7 +24,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", diff --git a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go index e736a986..48c1104d 100644 --- a/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go +++ b/vendor/k8s.io/apimachinery/pkg/api/errors/errors.go @@ -341,6 +341,17 @@ func NewTooManyRequestsError(message string) *StatusError { }} } +// NewRequestEntityTooLargeError returns an error indicating that the request +// entity was too large. +func NewRequestEntityTooLargeError(message string) *StatusError { + return &StatusError{metav1.Status{ + Status: metav1.StatusFailure, + Code: http.StatusRequestEntityTooLarge, + Reason: metav1.StatusReasonRequestEntityTooLarge, + Message: fmt.Sprintf("Request entity too large: %s", message), + }} +} + // NewGenericServerResponse returns a new error for server responses that are not in a recognizable form. func NewGenericServerResponse(code int, verb string, qualifiedResource schema.GroupResource, name, serverMessage string, retryAfterSeconds int, isUnexpectedResponse bool) *StatusError { reason := metav1.StatusReasonUnknown @@ -527,6 +538,19 @@ func IsTooManyRequests(err error) bool { return false } +// IsRequestEntityTooLargeError determines if err is an error which indicates +// the request entity is too large. +func IsRequestEntityTooLargeError(err error) bool { + if ReasonForError(err) == metav1.StatusReasonRequestEntityTooLarge { + return true + } + switch t := err.(type) { + case APIStatus: + return t.Status().Code == http.StatusRequestEntityTooLarge + } + return false +} + // IsUnexpectedServerError returns true if the server response was not in the expected API format, // and may be the result of another HTTP actor. func IsUnexpectedServerError(err error) bool { diff --git a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index 8f488ba7..65f87546 100644 --- a/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -713,6 +713,10 @@ const ( // Status code 406 StatusReasonNotAcceptable StatusReason = "NotAcceptable" + // StatusReasonRequestEntityTooLarge means that the request entity is too large. + // Status code 413 + StatusReasonRequestEntityTooLarge StatusReason = "RequestEntityTooLarge" + // StatusReasonUnsupportedMediaType means that the content type sent by the client is not acceptable // to the server - for instance, attempting to send protobuf for a resource that supports only json and yaml. // API calls that return UnsupportedMediaType can never succeed. diff --git a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go index 6b859b28..284e32bc 100644 --- a/vendor/k8s.io/apimachinery/pkg/runtime/codec.go +++ b/vendor/k8s.io/apimachinery/pkg/runtime/codec.go @@ -283,6 +283,7 @@ var _ GroupVersioner = multiGroupVersioner{} type multiGroupVersioner struct { target schema.GroupVersion acceptedGroupKinds []schema.GroupKind + coerce bool } // NewMultiGroupVersioner returns the provided group version for any kind that matches one of the provided group kinds. @@ -294,6 +295,22 @@ func NewMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKi return multiGroupVersioner{target: gv, acceptedGroupKinds: groupKinds} } +// NewCoercingMultiGroupVersioner returns the provided group version for any incoming kind. +// Incoming kinds that match the provided groupKinds are preferred. +// Kind may be empty in the provided group kind, in which case any kind will match. +// Examples: +// gv=mygroup/__internal, groupKinds=mygroup/Foo, anothergroup/Bar +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group/kind) +// +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, anothergroup/v1/Bar) -> mygroup/__internal/Bar (matched preferred group) +// +// gv=mygroup/__internal, groupKinds=mygroup, anothergroup +// KindForGroupVersionKinds(yetanother/v1/Baz, yetanother/v1/Bar) -> mygroup/__internal/Baz (no preferred group/kind match, uses first kind in list) +func NewCoercingMultiGroupVersioner(gv schema.GroupVersion, groupKinds ...schema.GroupKind) GroupVersioner { + return multiGroupVersioner{target: gv, acceptedGroupKinds: groupKinds, coerce: true} +} + // KindForGroupVersionKinds returns the target group version if any kind matches any of the original group kinds. It will // use the originating kind where possible. func (v multiGroupVersioner) KindForGroupVersionKinds(kinds []schema.GroupVersionKind) (schema.GroupVersionKind, bool) { @@ -308,5 +325,8 @@ func (v multiGroupVersioner) KindForGroupVersionKinds(kinds []schema.GroupVersio return v.target.WithKind(src.Kind), true } } + if v.coerce && len(kinds) > 0 { + return v.target.WithKind(kinds[0].Kind), true + } return schema.GroupVersionKind{}, false } diff --git a/vendor/k8s.io/client-go/Godeps/Godeps.json b/vendor/k8s.io/client-go/Godeps/Godeps.json index 9c0a3329..c4aa0ad9 100644 --- a/vendor/k8s.io/client-go/Godeps/Godeps.json +++ b/vendor/k8s.io/client-go/Godeps/Godeps.json @@ -56,7 +56,7 @@ }, { "ImportPath": "github.com/evanphx/json-patch", - "Rev": "36442dbdb585210f8d5a1b45e67aa323c197d5c4" + "Rev": "5858425f75500d40c52783dce87d085a483ce135" }, { "ImportPath": "github.com/gogo/protobuf/proto", @@ -272,339 +272,339 @@ }, { "ImportPath": "k8s.io/api/admissionregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/admissionregistration/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/apps/v1beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/auditregistration/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authentication/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/authorization/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/autoscaling/v2beta2", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/batch/v2alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/certificates/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/coordination/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/core/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/events/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/extensions/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/imagepolicy/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/networking/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/policy/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/rbac/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/scheduling/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/settings/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1alpha1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/api/storage/v1beta1", - "Rev": "74b699b93c15473932b89e3d1818ba8282f3b5ab" + "Rev": "5cb15d34447165a97c76ed5a60e4e99c8a01ecfe" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/apitesting/roundtrip", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/equality", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/meta", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/api/resource", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/fuzzer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/internalversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/apis/meta/v1beta1", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/conversion/queryparams", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/fields", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/labels", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/schema", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/protobuf", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/recognizer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/streaming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/runtime/serializer/versioning", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/selection", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/types", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/cache", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/clock", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/diff", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/errors", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/framer", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/httpstream/spdy", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/intstr", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/mergepatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/naming", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/net", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/remotecommand", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/runtime", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/sets", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/strategicpatch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/validation/field", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/wait", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/util/yaml", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/version", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/pkg/watch", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/json", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/netutil", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/apimachinery/third_party/forked/golang/reflect", - "Rev": "572dfc7bdfcb4531361a17d27b92851f59acf0dc" + "Rev": "86fb29eff6288413d76bd8506874fddd9fccdff0" }, { "ImportPath": "k8s.io/klog", diff --git a/vendor/k8s.io/client-go/tools/cache/reflector.go b/vendor/k8s.io/client-go/tools/cache/reflector.go index 12e2a334..56d0f523 100644 --- a/vendor/k8s.io/client-go/tools/cache/reflector.go +++ b/vendor/k8s.io/client-go/tools/cache/reflector.go @@ -24,10 +24,8 @@ import ( "net" "net/url" "reflect" - "strconv" "strings" "sync" - "sync/atomic" "syscall" "time" @@ -95,17 +93,10 @@ func NewReflector(lw ListerWatcher, expectedType interface{}, store Store, resyn return NewNamedReflector(naming.GetNameFromCallsite(internalPackages...), lw, expectedType, store, resyncPeriod) } -// reflectorDisambiguator is used to disambiguate started reflectors. -// initialized to an unstable value to ensure meaning isn't attributed to the suffix. -var reflectorDisambiguator = int64(time.Now().UnixNano() % 12345) - // NewNamedReflector same as NewReflector, but with a specified name for logging func NewNamedReflector(name string, lw ListerWatcher, expectedType interface{}, store Store, resyncPeriod time.Duration) *Reflector { - reflectorSuffix := atomic.AddInt64(&reflectorDisambiguator, 1) r := &Reflector{ - name: name, - // we need this to be unique per process (some names are still the same) but obvious who it belongs to - metrics: newReflectorMetrics(makeValidPrometheusMetricLabel(fmt.Sprintf("reflector_"+name+"_%d", reflectorSuffix))), + name: name, listerWatcher: lw, store: store, expectedType: reflect.TypeOf(expectedType), @@ -173,13 +164,10 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { // to be served from cache and potentially be delayed relative to // etcd contents. Reflector framework will catch up via Watch() eventually. options := metav1.ListOptions{ResourceVersion: "0"} - r.metrics.numberOfLists.Inc() - start := r.clock.Now() list, err := r.listerWatcher.List(options) if err != nil { return fmt.Errorf("%s: Failed to list %v: %v", r.name, r.expectedType, err) } - r.metrics.listDuration.Observe(time.Since(start).Seconds()) listMetaInterface, err := meta.ListAccessor(list) if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v: %v", r.name, list, err) @@ -189,7 +177,6 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { if err != nil { return fmt.Errorf("%s: Unable to understand list result %#v (%v)", r.name, list, err) } - r.metrics.numberOfItemsInList.Observe(float64(len(items))) if err := r.syncWith(items, resourceVersion); err != nil { return fmt.Errorf("%s: Unable to sync list result: %v", r.name, err) } @@ -239,7 +226,6 @@ func (r *Reflector) ListAndWatch(stopCh <-chan struct{}) error { TimeoutSeconds: &timeoutSeconds, } - r.metrics.numberOfWatches.Inc() w, err := r.listerWatcher.Watch(options) if err != nil { switch err { @@ -291,11 +277,6 @@ func (r *Reflector) watchHandler(w watch.Interface, resourceVersion *string, err // Stopping the watcher should be idempotent and if we return from this function there's no way // we're coming back in with the same watch interface. defer w.Stop() - // update metrics - defer func() { - r.metrics.numberOfItemsInWatch.Observe(float64(eventCount)) - r.metrics.watchDuration.Observe(time.Since(start).Seconds()) - }() loop: for { @@ -351,7 +332,6 @@ loop: watchDuration := r.clock.Now().Sub(start) if watchDuration < 1*time.Second && eventCount == 0 { - r.metrics.numberOfShortWatches.Inc() return fmt.Errorf("very short watch: %s: Unexpected watch close - watch lasted less than a second and no items received", r.name) } klog.V(4).Infof("%s: Watch close - %v total %v items received", r.name, r.expectedType, eventCount) @@ -370,9 +350,4 @@ func (r *Reflector) setLastSyncResourceVersion(v string) { r.lastSyncResourceVersionMutex.Lock() defer r.lastSyncResourceVersionMutex.Unlock() r.lastSyncResourceVersion = v - - rv, err := strconv.Atoi(v) - if err == nil { - r.metrics.lastResourceVersion.Set(float64(rv)) - } } diff --git a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md index 3a7d08c6..ab086f02 100644 --- a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md +++ b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/bug_report.md @@ -20,5 +20,6 @@ about: Tell us about a problem you are experiencing **Environment:** - Cluster-api version: +- Minikube/KIND version: - Kubernetes version: (use `kubectl version`): - OS (e.g. from `/etc/os-release`): diff --git a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md index fc06aa71..ec7c001b 100644 --- a/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md +++ b/vendor/sigs.k8s.io/cluster-api/.github/ISSUE_TEMPLATE/feature_request.md @@ -12,10 +12,3 @@ about: Suggest an idea for this project **Anything else you would like to add:** [Miscellaneous information that will assist in solving the issue.] - - -**Environment:** - -- Cluster-api version: -- Kubernetes version: (use `kubectl version`): -- OS (e.g. from `/etc/os-release`): diff --git a/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md b/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md index cc52280e..b0be9a45 100644 --- a/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md +++ b/vendor/sigs.k8s.io/cluster-api/CONTRIBUTING.md @@ -26,6 +26,10 @@ All changes must be code reviewed. Coding conventions and standards are explaine Cluster API maintainers may add "LGTM" (Looks Good To Me) or an equivalent comment to indicate that a PR is acceptable. Any change requires at least one LGTM. No pull requests can be merged until at least one Cluster API maintainer signs off with an LGTM. +### Google Doc Viewing Permissions + +To gain viewing permissions to google docs in this project, please join either the [kubernetes-dev](https://groups.google.com/forum/#!forum/kubernetes-dev) or [kubernetes-sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) google group. + ## Cloud Provider Developer Guide ### Overview diff --git a/vendor/sigs.k8s.io/cluster-api/Dockerfile b/vendor/sigs.k8s.io/cluster-api/Dockerfile index f0d00be9..e89f319d 100644 --- a/vendor/sigs.k8s.io/cluster-api/Dockerfile +++ b/vendor/sigs.k8s.io/cluster-api/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. # Build the manager binary -FROM golang:1.11.5 as builder +FROM golang:1.11.6 as builder # Copy in the go src WORKDIR $GOPATH/src/sigs.k8s.io/cluster-api diff --git a/vendor/sigs.k8s.io/cluster-api/Gopkg.lock b/vendor/sigs.k8s.io/cluster-api/Gopkg.lock index 0abd842c..724e64ff 100644 --- a/vendor/sigs.k8s.io/cluster-api/Gopkg.lock +++ b/vendor/sigs.k8s.io/cluster-api/Gopkg.lock @@ -896,12 +896,58 @@ revision = "b6aa1175dafa586b8042c7bfdcd1585f9ecfaa08" [[projects]] - digest = "1:b5f3e4ddbaa665650519fb6379bc95291f50a0d5b022ff31e430741caacd5ea6" + digest = "1:9e2617b6420a04f67a7b63938a238f43dd401f90a6c4d0f1f2470cd066e38928" name = "k8s.io/client-go" packages = [ "discovery", "discovery/fake", "dynamic", + "informers", + "informers/admissionregistration", + "informers/admissionregistration/v1alpha1", + "informers/admissionregistration/v1beta1", + "informers/apps", + "informers/apps/v1", + "informers/apps/v1beta1", + "informers/apps/v1beta2", + "informers/auditregistration", + "informers/auditregistration/v1alpha1", + "informers/autoscaling", + "informers/autoscaling/v1", + "informers/autoscaling/v2beta1", + "informers/autoscaling/v2beta2", + "informers/batch", + "informers/batch/v1", + "informers/batch/v1beta1", + "informers/batch/v2alpha1", + "informers/certificates", + "informers/certificates/v1beta1", + "informers/coordination", + "informers/coordination/v1beta1", + "informers/core", + "informers/core/v1", + "informers/events", + "informers/events/v1beta1", + "informers/extensions", + "informers/extensions/v1beta1", + "informers/internalinterfaces", + "informers/networking", + "informers/networking/v1", + "informers/policy", + "informers/policy/v1beta1", + "informers/rbac", + "informers/rbac/v1", + "informers/rbac/v1alpha1", + "informers/rbac/v1beta1", + "informers/scheduling", + "informers/scheduling/v1alpha1", + "informers/scheduling/v1beta1", + "informers/settings", + "informers/settings/v1alpha1", + "informers/storage", + "informers/storage/v1", + "informers/storage/v1alpha1", + "informers/storage/v1beta1", "kubernetes", "kubernetes/scheme", "kubernetes/typed/admissionregistration/v1alpha1", @@ -936,6 +982,34 @@ "kubernetes/typed/storage/v1", "kubernetes/typed/storage/v1alpha1", "kubernetes/typed/storage/v1beta1", + "listers/admissionregistration/v1alpha1", + "listers/admissionregistration/v1beta1", + "listers/apps/v1", + "listers/apps/v1beta1", + "listers/apps/v1beta2", + "listers/auditregistration/v1alpha1", + "listers/autoscaling/v1", + "listers/autoscaling/v2beta1", + "listers/autoscaling/v2beta2", + "listers/batch/v1", + "listers/batch/v1beta1", + "listers/batch/v2alpha1", + "listers/certificates/v1beta1", + "listers/coordination/v1beta1", + "listers/core/v1", + "listers/events/v1beta1", + "listers/extensions/v1beta1", + "listers/networking/v1", + "listers/policy/v1beta1", + "listers/rbac/v1", + "listers/rbac/v1alpha1", + "listers/rbac/v1beta1", + "listers/scheduling/v1alpha1", + "listers/scheduling/v1beta1", + "listers/settings/v1alpha1", + "listers/storage/v1", + "listers/storage/v1alpha1", + "listers/storage/v1beta1", "pkg/apis/clientauthentication", "pkg/apis/clientauthentication/v1alpha1", "pkg/apis/clientauthentication/v1beta1", @@ -1127,11 +1201,15 @@ input-imports = [ "github.com/davecgh/go-spew/spew", "github.com/emicklei/go-restful", + "github.com/onsi/ginkgo", + "github.com/onsi/gomega", "github.com/pkg/errors", "github.com/sergi/go-diff/diffmatchpatch", "github.com/spf13/cobra", "github.com/spf13/pflag", "golang.org/x/net/context", + "k8s.io/api/apps/v1", + "k8s.io/api/autoscaling/v1", "k8s.io/api/core/v1", "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1", "k8s.io/apimachinery/pkg/api/equality", @@ -1156,6 +1234,7 @@ "k8s.io/apiserver/pkg/storage/names", "k8s.io/client-go/discovery", "k8s.io/client-go/discovery/fake", + "k8s.io/client-go/informers", "k8s.io/client-go/kubernetes", "k8s.io/client-go/kubernetes/scheme", "k8s.io/client-go/kubernetes/typed/core/v1", diff --git a/vendor/sigs.k8s.io/cluster-api/Makefile b/vendor/sigs.k8s.io/cluster-api/Makefile index 7faece08..178bc617 100644 --- a/vendor/sigs.k8s.io/cluster-api/Makefile +++ b/vendor/sigs.k8s.io/cluster-api/Makefile @@ -22,7 +22,7 @@ export KUBEBUILDER_CONTROLPLANE_START_TIMEOUT ?=60s export KUBEBUILDER_CONTROLPLANE_STOP_TIMEOUT ?=60s # Image URL to use all building/pushing image targets -export CONTROLLER_IMG ?= gcr.io/k8s-cluster-api/cluster-api-controller:latest +export CONTROLLER_IMG ?= gcr.io/k8s-cluster-api/cluster-api-controller:0.1.0 export EXAMPLE_PROVIDER_IMG ?= gcr.io/k8s-cluster-api/example-provider-controller:latest all: test manager clusterctl @@ -84,6 +84,7 @@ lint-full: dep-ensure ## Run slower linters to detect possible issues .PHONY: generate generate: clientset dep-ensure ## Generate code go generate ./pkg/... ./cmd/... + $(MAKE) gazelle .PHONY: clientset clientset: ## Generate a typed clientset @@ -100,6 +101,7 @@ clientset: ## Generate a typed clientset --listers-package sigs.k8s.io/cluster-api/pkg/client/listers_generated \ --output-package sigs.k8s.io/cluster-api/pkg/client/informers_generated \ --go-header-file=./hack/boilerplate.go.txt + $(MAKE) gazelle .PHONY: clean clean: ## Remove all generated files diff --git a/vendor/sigs.k8s.io/cluster-api/README.md b/vendor/sigs.k8s.io/cluster-api/README.md index 91b12dcb..226ddd37 100644 --- a/vendor/sigs.k8s.io/cluster-api/README.md +++ b/vendor/sigs.k8s.io/cluster-api/README.md @@ -10,7 +10,7 @@ feedback on the API types themselves. All of the code here is to experiment with the API and demo its abilities, in order to drive more technical feedback to the API design. Because of this, all of the prototype code is rapidly changing. -![Cluster API Architecture](architecture.png "Cluster API Architecture") +![Cluster API Architecture](./docs/book/common_code/architecture.svg "Cluster API Architecture") To learn more, see the [Cluster API KEP][cluster-api-kep]. @@ -36,9 +36,9 @@ Provider specific code is being developed in separate repositories, some of whic are also sponsored by SIG-cluster-lifecycle: * AWS, https://github.com/kubernetes-sigs/cluster-api-provider-aws - * AWS/Openshift, https://github.com/openshift/cluster-operator * Azure, https://github.com/kubernetes-sigs/cluster-api-provider-azure * Baidu Cloud, https://github.com/baidu/cluster-api-provider-baiducloud + * Bare Metal, https://github.com/metalkube/cluster-api-provider-baremetal * DigitalOcean, https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean * GCE, https://github.com/kubernetes-sigs/cluster-api-provider-gcp * OpenStack, https://github.com/kubernetes-sigs/cluster-api-provider-openstack @@ -54,6 +54,11 @@ Following are the implementations managed by third-parties adopting the standard * Machine-controller-manager, https://github.com/gardener/machine-controller-manager/tree/cluster-api ## Getting Started + +### Resources + +* GitBook: [kubernetes-sigs.github.io/cluster-api](https://kubernetes-sigs.github.io/cluster-api) + ### Prerequisites * `kubectl` is required, see [here](http://kubernetes.io/docs/user-guide/prereqs/). * `clusterctl` is a SIG-cluster-lifecycle sponsored tool to manage Cluster API clusters. See [here](cmd/clusterctl) diff --git a/vendor/sigs.k8s.io/cluster-api/WORKSPACE b/vendor/sigs.k8s.io/cluster-api/WORKSPACE index 4de6ef87..710510fb 100644 --- a/vendor/sigs.k8s.io/cluster-api/WORKSPACE +++ b/vendor/sigs.k8s.io/cluster-api/WORKSPACE @@ -3,22 +3,22 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") http_archive( name = "io_bazel_rules_go", - sha256 = "ade51a315fa17347e5c31201fdc55aa5ffb913377aa315dceb56ee9725e620ee", - url = "https://github.com/bazelbuild/rules_go/releases/download/0.16.6/rules_go-0.16.6.tar.gz", + sha256 = "77dfd303492f2634de7a660445ee2d3de2960cbd52f97d8c0dffa9362d3ddef9", + url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.1/rules_go-0.18.1.tar.gz", ) http_archive( name = "bazel_gazelle", - sha256 = "6e875ab4b6bf64a38c352887760f21203ab054676d9c1b274963907e0768740d", - urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.15.0/bazel-gazelle-0.15.0.tar.gz"], + sha256 = "3c681998538231a2d24d0c07ed5a7658cb72bfb5fd4bf9911157c0e9ac6a2687", + urls = ["https://github.com/bazelbuild/bazel-gazelle/releases/download/0.17.0/bazel-gazelle-0.17.0.tar.gz"], ) -load("@io_bazel_rules_go//go:def.bzl", "go_register_toolchains", "go_rules_dependencies") +load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies") go_rules_dependencies() go_register_toolchains( - go_version = "1.11.5", + go_version = "1.11.6", ) load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") @@ -35,5 +35,5 @@ go_repository( name = "com_github_golangci_golangci-lint", build_file_generation = "on", importpath = "github.com/golangci/golangci-lint", - tag = "v1.13", + tag = "v1.15.0", ) diff --git a/vendor/sigs.k8s.io/cluster-api/architecture.png b/vendor/sigs.k8s.io/cluster-api/architecture.png deleted file mode 100644 index 8fe44100459fd052abda4ed1a5a51d83f7ed1b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197396 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

lLlg9U*S#Wa0 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 z%0A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%0AGj=iU+1aiDz^qfR=pWHsr(5?YT*>2}K7JsF z*)irtx)))i*^Hipl-Mdk#@Bx5e)MR5PiK)%Gf_~wnFgj}S-^1n?rS?F2!>n7E(`{P z`1F}6PjA_e86jOd7<-$94i8njCFrlE|3HU#;}PfDDzIaK3IQ5U`HLRqJLfuvNd0RW z%Rdf+@tEARY0ni}1pmS%1bnX)TWQ3hWcHdv0K3dc&VrlO2f}l%?7SMug9);ZWj3E> zgvTvS7=ryYJTSAjd@sI8WJkMMS6A@EcH8g-)e5G50{~vhmu$F9D5CL|k>&}dnx7*a zD3bwP94;&3av@WcmHscGqr1)YD2*gx1x1e{2@sQcxe#ydUeEyl4SAmtlvvwTm$)&r z=fa5g&sJeWv6qwa38+yrJS!=%WHt=j-ey(FBmFGZG*UKZF z+q=DMJ+jnC_I)aE6&#OB?Vi6=7y9rz>vF}#`%WfAn31NAL75#KWnslPxwyxc&lBI@ zAcVU2Y|Xj%qCyq&gb=d{*=>GjM zU_YSOqXag`l3T}s>?-ZpAVQ9+cn2!bp_o`#2Csn4slW`Xv@vHgfkx_+C7({jKk~$vz+q379SB35` zWntAl(gOkQ>xxQOwRU}DS+P^>vOB`x&6o-w3286Z#2*AfJy^LXDFY_rS#R}DHrv(H zqQyE!8Bpi>Etb5d)4qD#-#;>?1RB5oMQzSA(bbbHSM|n5L2FsP<76V66DK;vjLBpk zS*24>pFi#5z77P`NmqLE-F!(&nDp>%{Mv$w`(hU(hLnmNw-a{gc+%efE7UCEN+ebu zA|p$>rd|{#^~)GhR9HhX_kQ2QvSds7n?fJd!({tA)|!x5lWkitNat)U=t1bjb$ez+ z+0oahS6@qect<>*o1m!+ikX=tZPO-5vBXj@H*P{u(`zMV0}AcjrnM-a;Gq}(7-Tyw zcz)>{+bF7ZTs)4*?Bc5-4N2GHOLz4LBk})nQr=&NK^zX5d8nIQlG diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md index 9499ef26..33f2baba 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/README.md @@ -2,7 +2,7 @@ `clusterctl` is the SIG-cluster-lifecycle sponsored tool that implements the Cluster API. -Read the [experience doc here](https://docs.google.com/document/d/1-sYb3EdkRga49nULH1kSwuQFf1o6GvAw_POrsNo5d8c/edit#). +Read the [experience doc here](https://docs.google.com/document/d/1-sYb3EdkRga49nULH1kSwuQFf1o6GvAw_POrsNo5d8c/edit#). To gain viewing permissions, please join either the [kubernetes-dev](https://groups.google.com/forum/#!forum/kubernetes-dev) or [kubernetes-sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) google group. ## Getting Started @@ -13,8 +13,8 @@ this repository.** ### Prerequisites -1. Install [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/) -2. Install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) for minikube. For Linux, we recommend kvm2. For MacOS, we recommend VirtualBox. +1. Install [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) or [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/). [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) is preferred. +2. If you are using kind, go to step 3; If you are using minikube, install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) for minikube. For Linux, we recommend kvm2. For MacOS, we recommend VirtualBox. 2. Build the `clusterctl` tool ```bash @@ -41,10 +41,12 @@ https://github.com/kubernetes-sigs/cluster-api/issues/158 and https://github.com 1. Create a cluster: ```shell - ./clusterctl create cluster --provider -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml + ./clusterctl create cluster --provider --bootstrap-type -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml ``` -To choose a specific minikube driver, please use the `--vm-driver` command line parameter. For example to use the kvm2 driver with clusterctl you would add `--vm-driver kvm2` +Currently two `bootstrap-type` options are supported - `kind` and `minikube`. + +If you are using minikube, to choose a specific minikube driver, please use the `--bootstrap-flags vm-driver=xxx` command line parameter. For example to use the kvm2 driver with clusterctl you woud add `--bootstrap-flags vm-driver=kvm2`. Additional advanced flags can be found via help. @@ -54,6 +56,12 @@ Additional advanced flags can be found via help. ### Interacting with your cluster +If you are using kind, set the `KUBECONFIG` environment variable first before using kubectl: + +``` +export KUBECONFIG="$(kind get kubeconfig-path --name="clusterapi")" +``` + Once you have created a cluster, you can interact with the cluster and machine resources using kubectl: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel index c8bbe34b..0fdbfaaf 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/BUILD.bazel @@ -15,7 +15,6 @@ go_library( "//cmd/clusterctl/phases:go_default_library", "//cmd/clusterctl/providercomponents:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", - "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", "//vendor/k8s.io/client-go/kubernetes:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go index 24fec4b6..dcf1538a 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/kind/kind.go @@ -32,7 +32,7 @@ const ( var ( // ignoredOptions lists the options not supported by delete and kubeconfig-path. - ignoredOptions = []string{"config", "image", "retain"} + ignoredOptions = []string{"config", "image", "retain", "wait"} ) type Kind struct { @@ -46,9 +46,21 @@ func New() *Kind { } func WithOptions(options []string) *Kind { + // Set name if it is not provided. + if func() bool { + for _, opt := range options { + if strings.HasPrefix(opt, "name=") { + return false + } + } + return true + }() { + options = append(options, fmt.Sprintf("name=%s", kindClusterName)) + } + return &Kind{ execFunc: execFunc, - options: append(options, fmt.Sprintf("name=%s", kindClusterName)), + options: options, } } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go index fceb4df3..272bb939 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go @@ -27,6 +27,10 @@ import ( "k8s.io/klog" ) +const ( + minikubeClusterName = "clusterapi" +) + type Minikube struct { kubeconfigpath string options []string @@ -47,6 +51,19 @@ func WithOptionsAndKubeConfigPath(options []string, kubeconfigpath string) *Mini // Arbitrary file name. Can potentially be randomly generated. kubeconfigpath = "minikube.kubeconfig" } + + // Set profile if it is not provided. + if func() bool { + for _, opt := range options { + if strings.HasPrefix(opt, "p=") { + return false + } + } + return true + }() { + options = append(options, fmt.Sprintf("p=%s", minikubeClusterName)) + } + return &Minikube{ minikubeExec: minikubeExec, options: options, diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel index dcfccba8..69dad459 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/BUILD.bazel @@ -14,6 +14,7 @@ go_library( "//pkg/client/clientset_generated/clientset:go_default_library", "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/autoscaling/v1:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go index 12681a35..9bdd7a9f 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go @@ -17,16 +17,20 @@ limitations under the License. package clusterclient import ( + "fmt" + "io" "io/ioutil" "net" "os" "os/exec" + "reflect" "strconv" "strings" "sync" "time" "github.com/pkg/errors" + autoscalingv1 "k8s.io/api/autoscaling/v1" apiv1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -48,38 +52,49 @@ const ( timeoutResourceReady = 15 * time.Minute timeoutMachineReady = 30 * time.Minute timeoutResourceDelete = 15 * time.Minute + machineClusterLabelName = "cluster.k8s.io/cluster-name" ) // Provides interaction with a cluster type Client interface { - GetContextNamespace() string Apply(string) error + Close() error + CreateClusterObject(*clusterv1.Cluster) error + CreateMachineClass(*clusterv1.MachineClass) error + CreateMachineDeployments([]*clusterv1.MachineDeployment, string) error + CreateMachineSets([]*clusterv1.MachineSet, string) error + CreateMachines([]*clusterv1.Machine, string) error Delete(string) error + DeleteClusters(string) error + DeleteNamespace(string) error + DeleteMachineClasses(string) error + DeleteMachineClass(namespace, name string) error + DeleteMachineDeployments(string) error + DeleteMachineSets(string) error + DeleteMachines(string) error + ForceDeleteCluster(namespace, name string) error + ForceDeleteMachine(namespace, name string) error + ForceDeleteMachineSet(namespace, name string) error + ForceDeleteMachineDeployment(namespace, name string) error + EnsureNamespace(string) error + GetClusters(string) ([]*clusterv1.Cluster, error) + GetCluster(string, string) (*clusterv1.Cluster, error) + GetContextNamespace() string + GetMachineClasses(namespace string) ([]*clusterv1.MachineClass, error) + GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) + GetMachineDeploymentsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) + GetMachineDeployments(string) ([]*clusterv1.MachineDeployment, error) + GetMachineSet(namespace, name string) (*clusterv1.MachineSet, error) + GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) + GetMachineSetsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineSet, error) + GetMachineSetsForMachineDeployment(*clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) + GetMachines(namespace string) ([]*clusterv1.Machine, error) + GetMachinesForCluster(*clusterv1.Cluster) ([]*clusterv1.Machine, error) + GetMachinesForMachineSet(*clusterv1.MachineSet) ([]*clusterv1.Machine, error) + ScaleStatefulSet(namespace, name string, scale int32) error WaitForClusterV1alpha1Ready() error - GetClusterObjectsInNamespace(string) ([]*clusterv1.Cluster, error) - GetClusterObject(string, string) (*clusterv1.Cluster, error) - GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) - GetMachineDeploymentObjectsInNamespace(string) ([]*clusterv1.MachineDeployment, error) - GetMachineSetObjects() ([]*clusterv1.MachineSet, error) - GetMachineSetObjectsInNamespace(string) ([]*clusterv1.MachineSet, error) - GetMachineObjects() ([]*clusterv1.Machine, error) - GetMachineObjectsInNamespace(ns string) ([]*clusterv1.Machine, error) - CreateClusterObject(*clusterv1.Cluster) error - CreateMachineDeploymentObjects([]*clusterv1.MachineDeployment, string) error - CreateMachineSetObjects([]*clusterv1.MachineSet, string) error - CreateMachineObjects([]*clusterv1.Machine, string) error - DeleteClusterObjectsInNamespace(string) error - DeleteClusterObjects() error - DeleteMachineDeploymentObjectsInNamespace(string) error - DeleteMachineDeploymentObjects() error - DeleteMachineSetObjectsInNamespace(string) error - DeleteMachineSetObjects() error - DeleteMachineObjectsInNamespace(string) error - DeleteMachineObjects() error UpdateClusterObjectEndpoint(string, string, string) error - EnsureNamespace(string) error - DeleteNamespace(string) error - Close() error + WaitForResourceStatuses() error } type client struct { @@ -127,6 +142,27 @@ func (c *client) EnsureNamespace(namespaceName string) error { return nil } +func (c *client) ScaleStatefulSet(ns string, name string, scale int32) error { + clientset, err := clientcmd.NewCoreClientSetForDefaultSearchPath(c.kubeconfigFile, clientcmd.NewConfigOverrides()) + if err != nil { + return errors.Wrap(err, "error creating core clientset") + } + + _, err = clientset.AppsV1().StatefulSets(ns).UpdateScale(name, &autoscalingv1.Scale{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: ns, + Name: name, + }, + Spec: autoscalingv1.ScaleSpec{ + Replicas: scale, + }, + }) + if err != nil && !apierrors.IsNotFound(err) { + return err + } + return nil +} + func (c *client) DeleteNamespace(namespaceName string) error { if namespaceName == apiv1.NamespaceDefault { return nil @@ -181,8 +217,8 @@ func (c *client) GetContextNamespace() string { return c.configOverrides.Context.Namespace } -func (c *client) GetClusterObject(name, ns string) (*clusterv1.Cluster, error) { - clustersInNamespace, err := c.GetClusterObjectsInNamespace(ns) +func (c *client) GetCluster(name, ns string) (*clusterv1.Cluster, error) { + clustersInNamespace, err := c.GetClusters(ns) if err != nil { return nil, err } @@ -196,7 +232,27 @@ func (c *client) GetClusterObject(name, ns string) (*clusterv1.Cluster, error) { return cluster, nil } -func (c *client) GetClusterObjectsInNamespace(namespace string) ([]*clusterv1.Cluster, error) { +// ForceDeleteCluster removes the finalizer for a Cluster prior to deleting, this is used during pivot +func (c *client) ForceDeleteCluster(namespace, name string) error { + cluster, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return errors.Wrapf(err, "error getting cluster %s/%s", namespace, name) + } + + cluster.ObjectMeta.SetFinalizers([]string{}) + + if _, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Update(cluster); err != nil { + return errors.Wrapf(err, "error removing finalizer on cluster %s/%s", namespace, name) + } + + if err := c.clientSet.ClusterV1alpha1().Clusters(namespace).Delete(name, &metav1.DeleteOptions{}); err != nil { + return errors.Wrapf(err, "error deleting cluster %s/%s", namespace, name) + } + + return nil +} + +func (c *client) GetClusters(namespace string) ([]*clusterv1.Cluster, error) { clusters := []*clusterv1.Cluster{} clusterlist, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).List(metav1.ListOptions{}) if err != nil { @@ -209,7 +265,46 @@ func (c *client) GetClusterObjectsInNamespace(namespace string) ([]*clusterv1.Cl return clusters, nil } -func (c *client) GetMachineDeploymentObjectsInNamespace(namespace string) ([]*clusterv1.MachineDeployment, error) { +func (c *client) GetMachineClasses(namespace string) ([]*clusterv1.MachineClass, error) { + machineClassesList, err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).List(metav1.ListOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineClasses in namespace %q", namespace) + } + var machineClasses []*clusterv1.MachineClass + for i := 0; i < len(machineClassesList.Items); i++ { + machineClasses = append(machineClasses, &machineClassesList.Items[i]) + } + return machineClasses, nil +} + +func (c *client) GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) { + machineDeployment, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error getting MachineDeployment: %s/%s", namespace, name) + } + return machineDeployment, nil +} + +func (c *client) GetMachineDeploymentsForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) { + machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineDeployments for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machineDeployments []*clusterv1.MachineDeployment + for _, md := range machineDeploymentList.Items { + for _, or := range md.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machineDeployments = append(machineDeployments, &md) + continue + } + } + } + return machineDeployments, nil +} + +func (c *client) GetMachineDeployments(namespace string) ([]*clusterv1.MachineDeployment, error) { machineDeploymentList, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).List(metav1.ListOptions{}) if err != nil { return nil, errors.Wrapf(err, "error listing machine deployment objects in namespace %q", namespace) @@ -221,16 +316,18 @@ func (c *client) GetMachineDeploymentObjectsInNamespace(namespace string) ([]*cl return machineDeployments, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineDeploymentObjects() ([]*clusterv1.MachineDeployment, error) { - klog.V(2).Info("GetMachineDeploymentObjects API is deprecated, use GetMachineDeploymentObjectsInNamespace instead") - return c.GetMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachineSet(namespace, name string) (*clusterv1.MachineSet, error) { + machineSet, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return nil, errors.Wrapf(err, "error getting MachineSet: %s/%s", namespace, name) + } + return machineSet, nil } -func (c *client) GetMachineSetObjectsInNamespace(namespace string) ([]*clusterv1.MachineSet, error) { +func (c *client) GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) { machineSetList, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).List(metav1.ListOptions{}) if err != nil { - return nil, errors.Wrapf(err, "error listing machine set objects in namespace %q", namespace) + return nil, errors.Wrapf(err, "error listing MachineSets in namespace %q", namespace) } var machineSets []*clusterv1.MachineSet for i := 0; i < len(machineSetList.Items); i++ { @@ -239,17 +336,44 @@ func (c *client) GetMachineSetObjectsInNamespace(namespace string) ([]*clusterv1 return machineSets, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineSetObjects() ([]*clusterv1.MachineSet, error) { - klog.V(2).Info("GetMachineSetObjects API is deprecated, use GetMachineSetObjectsInNamespace instead") - return c.GetMachineSetObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachineSetsForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.MachineSet, error) { + machineSetList, err := c.clientSet.ClusterV1alpha1().MachineSets(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing MachineSets for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machineSets []*clusterv1.MachineSet + for _, ms := range machineSetList.Items { + for _, or := range ms.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machineSets = append(machineSets, &ms) + continue + } + } + } + return machineSets, nil } -func (c *client) GetMachineObjectsInNamespace(namespace string) ([]*clusterv1.Machine, error) { +func (c *client) GetMachineSetsForMachineDeployment(md *clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) { + machineSets, err := c.GetMachineSets(md.Namespace) + if err != nil { + return nil, err + } + var controlledMachineSets []*clusterv1.MachineSet + for _, ms := range machineSets { + if metav1.GetControllerOf(ms) != nil && metav1.IsControlledBy(ms, md) { + controlledMachineSets = append(controlledMachineSets, ms) + } + } + return controlledMachineSets, nil +} + +func (c *client) GetMachines(namespace string) ([]*clusterv1.Machine, error) { machines := []*clusterv1.Machine{} machineslist, err := c.clientSet.ClusterV1alpha1().Machines(namespace).List(metav1.ListOptions{}) if err != nil { - return nil, errors.Wrapf(err, "error listing machine objects in namespace %q", namespace) + return nil, errors.Wrapf(err, "error listing Machines in namespace %q", namespace) } for i := 0; i < len(machineslist.Items); i++ { @@ -258,10 +382,56 @@ func (c *client) GetMachineObjectsInNamespace(namespace string) ([]*clusterv1.Ma return machines, nil } -// Deprecated API. Please do not extend or use. -func (c *client) GetMachineObjects() ([]*clusterv1.Machine, error) { - klog.V(2).Info("GetMachineObjects API is deprecated, use GetMachineObjectsInNamespace instead") - return c.GetMachineObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) GetMachinesForCluster(cluster *clusterv1.Cluster) ([]*clusterv1.Machine, error) { + machineslist, err := c.clientSet.ClusterV1alpha1().Machines(cluster.Namespace).List(metav1.ListOptions{ + LabelSelector: fmt.Sprintf("%s=%s", machineClusterLabelName, cluster.Name), + }) + if err != nil { + return nil, errors.Wrapf(err, "error listing Machines for Cluster %s/%s", cluster.Namespace, cluster.Name) + } + var machines []*clusterv1.Machine + + for i := 0; i < len(machineslist.Items); i++ { + m := &machineslist.Items[i] + + for _, or := range m.GetOwnerReferences() { + if or.Kind == cluster.Kind && or.Name == cluster.Name { + machines = append(machines, m) + break + } + } + } + + return machines, nil +} + +func (c *client) GetMachinesForMachineSet(ms *clusterv1.MachineSet) ([]*clusterv1.Machine, error) { + machines, err := c.GetMachines(ms.Namespace) + if err != nil { + return nil, err + } + var controlledMachines []*clusterv1.Machine + for _, m := range machines { + if metav1.GetControllerOf(m) != nil && metav1.IsControlledBy(m, ms) { + controlledMachines = append(controlledMachines, m) + } + } + return controlledMachines, nil +} + +func (c *client) CreateMachineClass(machineClass *clusterv1.MachineClass) error { + _, err := c.clientSet.ClusterV1alpha1().MachineClasses(machineClass.Namespace).Create(machineClass) + if err != nil { + return errors.Wrapf(err, "error creating MachineClass %s/%s", machineClass.Namespace, machineClass.Name) + } + return nil +} + +func (c *client) DeleteMachineClass(namespace, name string) error { + if err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineClass %s/%s", namespace, name) + } + return nil } func (c *client) CreateClusterObject(cluster *clusterv1.Cluster) error { @@ -274,10 +444,10 @@ func (c *client) CreateClusterObject(cluster *clusterv1.Cluster) error { if err != nil { return errors.Wrapf(err, "error creating cluster in namespace %v", namespace) } - return err + return nil } -func (c *client) CreateMachineDeploymentObjects(deployments []*clusterv1.MachineDeployment, namespace string) error { +func (c *client) CreateMachineDeployments(deployments []*clusterv1.MachineDeployment, namespace string) error { for _, deploy := range deployments { // TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258 _, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Create(deploy) @@ -288,7 +458,7 @@ func (c *client) CreateMachineDeploymentObjects(deployments []*clusterv1.Machine return nil } -func (c *client) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet, namespace string) error { +func (c *client) CreateMachineSets(machineSets []*clusterv1.MachineSet, namespace string) error { for _, ms := range machineSets { // TODO: Run in parallel https://github.com/kubernetes-sigs/cluster-api/issues/258 _, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Create(ms) @@ -299,7 +469,7 @@ func (c *client) CreateMachineSetObjects(machineSets []*clusterv1.MachineSet, na return nil } -func (c *client) CreateMachineObjects(machines []*clusterv1.Machine, namespace string) error { +func (c *client) CreateMachines(machines []*clusterv1.Machine, namespace string) error { var ( wg sync.WaitGroup errOnce sync.Once @@ -329,74 +499,206 @@ func (c *client) CreateMachineObjects(machines []*clusterv1.Machine, namespace s return gerr } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteClusterObjects() error { - klog.V(2).Info("DeleteClusterObjects API is deprecated, use DeleteClusterObjectsInNamespace instead") - return c.DeleteClusterObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteClusters deletes all Clusters in a namespace. If the namespace is empty then all Clusters in all namespaces are deleted. +func (c *client) DeleteClusters(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + clusters, err := c.clientSet.ClusterV1alpha1().Clusters("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing Clusters in all namespaces") + } + for _, cluster := range clusters.Items { + if _, ok := seen[cluster.Namespace]; !ok { + seen[cluster.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().Clusters(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting Clusters in namespace %q", ns) + } + err = c.waitForClusterDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for Cluster(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteClusterObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().Clusters(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) - if err != nil { - return errors.Wrapf(err, "error deleting cluster objects in namespace %q", namespace) +// DeleteMachineClasses deletes all MachineClasses in a namespace. If the namespace is empty then all MachineClasses in all namespaces are deleted. +func (c *client) DeleteMachineClasses(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineClasses, err := c.clientSet.ClusterV1alpha1().MachineClasses("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineClasses in all namespaces") + } + for _, mc := range machineClasses.Items { + if _, ok := seen[mc.Namespace]; !ok { + seen[mc.Namespace] = true + } + } } - err = c.waitForClusterDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for cluster(s) deletion to complete in namespace %q", namespace) + + for ns := range seen { + if err := c.DeleteMachineClasses(ns); err != nil { + return err + } + err := c.clientSet.ClusterV1alpha1().MachineClasses(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineClasses in namespace %q", ns) + } + err = c.waitForMachineClassesDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineClass(es) deletion to complete in ns %q", ns) + } } + return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineDeploymentObjects() error { - klog.V(2).Info("DeleteMachineDeploymentObjects API is deprecated, use DeleteMachineDeploymentObjectsInNamespace instead") - return c.DeleteMachineDeploymentObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteMachineDeployments deletes all MachineDeployments in a namespace. If the namespace is empty then all MachineDeployments in all namespaces are deleted. +func (c *client) DeleteMachineDeployments(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineDeployments, err := c.clientSet.ClusterV1alpha1().MachineDeployments("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineDeployments in all namespaces") + } + for _, md := range machineDeployments.Items { + if _, ok := seen[md.Namespace]; !ok { + seen[md.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().MachineDeployments(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineDeployments in namespace %q", ns) + } + err = c.waitForMachineDeploymentsDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineDeployment(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteMachineDeploymentObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) - if err != nil { - return errors.Wrapf(err, "error deleting machine deployment objects in namespace %q", namespace) +// DeleteMachineSets deletes all MachineSets in a namespace. If the namespace is empty then all MachineSets in all namespaces are deleted. +func (c *client) DeleteMachineSets(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machineSets, err := c.clientSet.ClusterV1alpha1().MachineSets("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing MachineSets in all namespaces") + } + for _, ms := range machineSets.Items { + if _, ok := seen[ms.Namespace]; !ok { + seen[ms.Namespace] = true + } + } } - err = c.waitForMachineDeploymentsDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine deployment(s) deletion to complete in namespace %q", namespace) + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().MachineSets(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting MachineSets in namespace %q", ns) + } + err = c.waitForMachineSetsDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for MachineSet(s) deletion to complete in namespace %q", ns) + } } + return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineSetObjects() error { - klog.V(2).Info("DeleteMachineSetObjects API is deprecated, use DeleteMachineSetObjectsInNamespace instead") - return c.DeleteMachineSetObjectsInNamespace(apiv1.NamespaceDefault) +// DeleteMachines deletes all Machines in a namespace. If the namespace is empty then all Machines in all namespaces are deleted. +func (c *client) DeleteMachines(namespace string) error { + seen := make(map[string]bool) + + if namespace != "" { + seen[namespace] = true + } else { + machines, err := c.clientSet.ClusterV1alpha1().Machines("").List(metav1.ListOptions{}) + if err != nil { + return errors.Wrap(err, "error listing Machines in all namespaces") + } + for _, m := range machines.Items { + if _, ok := seen[m.Namespace]; !ok { + seen[m.Namespace] = true + } + } + } + for ns := range seen { + err := c.clientSet.ClusterV1alpha1().Machines(ns).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) + if err != nil { + return errors.Wrapf(err, "error deleting Machines in namespace %q", ns) + } + err = c.waitForMachinesDelete(ns) + if err != nil { + return errors.Wrapf(err, "error waiting for Machine(s) deletion to complete in namespace %q", ns) + } + } + + return nil } -func (c *client) DeleteMachineSetObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) +func (c *client) ForceDeleteMachine(namespace, name string) error { + machine, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Get(name, metav1.GetOptions{}) if err != nil { - return errors.Wrapf(err, "error deleting machine set objects in namespace %q", namespace) + return errors.Wrapf(err, "error getting Machine %s/%s", namespace, name) } - err = c.waitForMachineSetsDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine set(s) deletion to complete in namespace %q", namespace) + machine.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Update(machine); err != nil { + return errors.Wrapf(err, "error removing finalizer for Machine %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().Machines(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting Machine %s/%s", namespace, name) } return nil } -// Deprecated API. Please do not extend or use. -func (c *client) DeleteMachineObjects() error { - klog.V(2).Info("DeleteMachineObjects API is deprecated, use DeleteMachineObjectsInNamespace instead") - return c.DeleteMachineObjectsInNamespace(apiv1.NamespaceDefault) +func (c *client) ForceDeleteMachineSet(namespace, name string) error { + ms, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return errors.Wrapf(err, "error getting MachineSet %s/%s", namespace, name) + } + ms.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Update(ms); err != nil { + return errors.Wrapf(err, "error removing finalizer for MachineSet %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineSet %s/%s", namespace, name) + } + return nil } -func (c *client) DeleteMachineObjectsInNamespace(namespace string) error { - err := c.clientSet.ClusterV1alpha1().Machines(namespace).DeleteCollection(newDeleteOptions(), metav1.ListOptions{}) +func (c *client) ForceDeleteMachineDeployment(namespace, name string) error { + md, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Get(name, metav1.GetOptions{}) if err != nil { - return errors.Wrapf(err, "error deleting machine objects in namespace %q", namespace) + return errors.Wrapf(err, "error getting MachineDeployment %s/%s", namespace, name) } - err = c.waitForMachinesDelete(namespace) - if err != nil { - return errors.Wrapf(err, "error waiting for machine(s) deletion to complete in namespace %q", namespace) + md.SetFinalizers([]string{}) + if _, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Update(md); err != nil { + return errors.Wrapf(err, "error removing finalizer for MachineDeployment %s/%s", namespace, name) + } + if err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).Delete(name, newDeleteOptions()); err != nil { + return errors.Wrapf(err, "error deleting MachineDeployment %s/%s", namespace, name) } return nil } @@ -412,7 +714,7 @@ func newDeleteOptions() *metav1.DeleteOptions { // can be passed as hostname or hostname:port, if port is not present the default port 443 is applied. // TODO: Test this function func (c *client) UpdateClusterObjectEndpoint(clusterEndpoint, clusterName, namespace string) error { - cluster, err := c.GetClusterObject(clusterName, namespace) + cluster, err := c.GetCluster(clusterName, namespace) if err != nil { return err } @@ -440,9 +742,62 @@ func (c *client) WaitForClusterV1alpha1Ready() error { return waitForClusterResourceReady(c.clientSet) } +func (c *client) WaitForResourceStatuses() error { + deadline := time.Now().Add(timeoutResourceReady) + + timeout := time.Until(deadline) + return util.PollImmediate(retryIntervalResourceReady, timeout, func() (bool, error) { + klog.V(2).Info("Waiting for Cluster API resources to have statuses...") + clusters, err := c.clientSet.ClusterV1alpha1().Clusters("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, cluster := range clusters.Items { + if reflect.DeepEqual(clusterv1.ClusterStatus{}, cluster.Status) { + return false, nil + } + if cluster.Status.ProviderStatus == nil { + return false, nil + } + } + machineDeployments, err := c.clientSet.ClusterV1alpha1().MachineDeployments("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, md := range machineDeployments.Items { + if reflect.DeepEqual(clusterv1.MachineDeploymentStatus{}, md.Status) { + return false, nil + } + } + machineSets, err := c.clientSet.ClusterV1alpha1().MachineSets("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, ms := range machineSets.Items { + if reflect.DeepEqual(clusterv1.MachineSetStatus{}, ms.Status) { + return false, nil + } + } + machines, err := c.clientSet.ClusterV1alpha1().Machines("").List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + for _, m := range machines.Items { + if reflect.DeepEqual(clusterv1.MachineStatus{}, m.Status) { + return false, nil + } + if m.Status.ProviderStatus == nil { + return false, nil + } + } + + return true, nil + }) +} + func (c *client) waitForClusterDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for cluster objects to be deleted...") + klog.V(2).Infof("Waiting for Clusters to be deleted...") response, err := c.clientSet.ClusterV1alpha1().Clusters(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -454,9 +809,23 @@ func (c *client) waitForClusterDelete(namespace string) error { }) } +func (c *client) waitForMachineClassesDelete(namespace string) error { + return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { + klog.V(2).Infof("Waiting for MachineClasses to be deleted...") + response, err := c.clientSet.ClusterV1alpha1().MachineClasses(namespace).List(metav1.ListOptions{}) + if err != nil { + return false, nil + } + if len(response.Items) > 0 { + return false, nil + } + return true, nil + }) +} + func (c *client) waitForMachineDeploymentsDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine deployment objects to be deleted...") + klog.V(2).Infof("Waiting for MachineDeployments to be deleted...") response, err := c.clientSet.ClusterV1alpha1().MachineDeployments(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -470,7 +839,7 @@ func (c *client) waitForMachineDeploymentsDelete(namespace string) error { func (c *client) waitForMachineSetsDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine set objects to be deleted...") + klog.V(2).Infof("Waiting for MachineSets to be deleted...") response, err := c.clientSet.ClusterV1alpha1().MachineSets(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -484,7 +853,7 @@ func (c *client) waitForMachineSetsDelete(namespace string) error { func (c *client) waitForMachinesDelete(namespace string) error { return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { - klog.V(2).Infof("Waiting for machine objects to be deleted...") + klog.V(2).Infof("Waiting for Machines to be deleted...") response, err := c.clientSet.ClusterV1alpha1().Machines(namespace).List(metav1.ListOptions{}) if err != nil { return false, nil @@ -496,6 +865,20 @@ func (c *client) waitForMachinesDelete(namespace string) error { }) } +func (c *client) waitForMachineDelete(namespace, name string) error { + return util.PollImmediate(retryIntervalResourceDelete, timeoutResourceDelete, func() (bool, error) { + klog.V(2).Infof("Waiting for Machine %s/%s to be deleted...", namespace, name) + response, err := c.clientSet.ClusterV1alpha1().Machines(namespace).Get(name, metav1.GetOptions{}) + if err != nil { + return false, nil + } + if response != nil { + return false, nil + } + return true, nil + }) +} + func (c *client) kubectlDelete(manifest string) error { return c.kubectlManifestCmd("delete", manifest) } @@ -536,7 +919,7 @@ func (c *client) waitForKubectlApply(manifest string) error { klog.V(2).Infof("Waiting for kubectl apply...") err := c.kubectlApply(manifest) if err != nil { - if strings.Contains(err.Error(), "refused") { + if strings.Contains(err.Error(), io.EOF.Error()) || strings.Contains(err.Error(), "refused") { // Connection was refused, probably because the API server is not ready yet. klog.V(4).Infof("Waiting for kubectl apply... server not yet available: %v", err) return false, nil @@ -627,11 +1010,11 @@ func ifErrRemove(pErr *error, path string) { } func GetClusterAPIObject(client Client, clusterName, namespace string) (*clusterv1.Cluster, *clusterv1.Machine, []*clusterv1.Machine, error) { - machines, err := client.GetMachineObjectsInNamespace(namespace) + machines, err := client.GetMachines(namespace) if err != nil { return nil, nil, nil, errors.Wrap(err, "unable to fetch machines") } - cluster, err := client.GetClusterObject(clusterName, namespace) + cluster, err := client.GetCluster(clusterName, namespace) if err != nil { return nil, nil, nil, errors.Wrapf(err, "unable to fetch cluster %s/%s", namespace, clusterName) } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go index 272a8ad2..73d17b3e 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterdeployer.go @@ -27,7 +27,6 @@ import ( "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/provider" "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/cluster-api/pkg/util" ) type ClusterDeployer struct { @@ -35,6 +34,7 @@ type ClusterDeployer struct { clientFactory clusterclient.Factory providerComponents string addonComponents string + bootstrapComponents string cleanupBootstrapCluster bool } @@ -43,12 +43,14 @@ func New( clientFactory clusterclient.Factory, providerComponents string, addonComponents string, + bootstrapComponents string, cleanupBootstrapCluster bool) *ClusterDeployer { return &ClusterDeployer{ bootstrapProvisioner: bootstrapProvisioner, clientFactory: clientFactory, providerComponents: providerComponents, addonComponents: addonComponents, + bootstrapComponents: bootstrapComponents, cleanupBootstrapCluster: cleanupBootstrapCluster, } } @@ -67,6 +69,12 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster } defer closeClient(bootstrapClient, "bootstrap") + if d.bootstrapComponents != "" { + if err := phases.ApplyBootstrapComponents(bootstrapClient, d.bootstrapComponents); err != nil { + return errors.Wrap(err, "unable to apply bootstrap components to bootstrap cluster") + } + } + klog.Info("Applying Cluster API stack to bootstrap cluster") if err := phases.ApplyClusterAPIComponents(bootstrapClient, d.providerComponents); err != nil { return errors.Wrap(err, "unable to apply cluster api stack to bootstrap cluster") @@ -109,22 +117,9 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster } } - klog.Infof("Creating namespace %q on target cluster", cluster.Namespace) - addNamespaceToTarget := func() (bool, error) { - err = targetClient.EnsureNamespace(cluster.Namespace) - if err != nil { - return false, nil - } - return true, nil - } - - if err := util.Retry(addNamespaceToTarget, 0); err != nil { - return errors.Wrapf(err, "unable to ensure namespace %q in target cluster", cluster.Namespace) - } - - klog.Info("Applying Cluster API stack to target cluster") - if err := d.applyClusterAPIComponentsWithPivoting(targetClient, bootstrapClient, cluster.Namespace); err != nil { - return errors.Wrap(err, "unable to apply cluster api stack to target cluster") + klog.Info("Pivoting Cluster API stack to target cluster") + if err := phases.Pivot(bootstrapClient, targetClient, d.providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot cluster api stack to target cluster") } klog.Info("Saving provider components to the target cluster") @@ -150,7 +145,7 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster return nil } -func (d *ClusterDeployer) Delete(targetClient clusterclient.Client, namespace string) error { +func (d *ClusterDeployer) Delete(targetClient clusterclient.Client) error { klog.Info("Creating bootstrap cluster") bootstrapClient, cleanupBootstrapCluster, err := phases.CreateBootstrapCluster(d.bootstrapProvisioner, d.cleanupBootstrapCluster, d.clientFactory) defer cleanupBootstrapCluster() @@ -159,24 +154,18 @@ func (d *ClusterDeployer) Delete(targetClient clusterclient.Client, namespace st } defer closeClient(bootstrapClient, "bootstrap") - klog.Info("Applying Cluster API stack to bootstrap cluster") - if err := phases.ApplyClusterAPIComponents(bootstrapClient, d.providerComponents); err != nil { - return errors.Wrap(err, "unable to apply cluster api stack to bootstrap cluster") + klog.Info("Pivoting Cluster API stack to bootstrap cluster") + if err := phases.Pivot(targetClient, bootstrapClient, d.providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot Cluster API stack to bootstrap cluster") } - klog.Info("Deleting Cluster API Provider Components from target cluster") - if err = targetClient.Delete(d.providerComponents); err != nil { - klog.Infof("error while removing provider components from target cluster: %v", err) - klog.Infof("Continuing with a best effort delete") - } - - klog.Info("Copying objects from target cluster to bootstrap cluster") - if err = pivotNamespace(targetClient, bootstrapClient, namespace); err != nil { - return errors.Wrap(err, "unable to copy objects from target to bootstrap cluster") + // Verify that all pivoted resources have a status + if err := bootstrapClient.WaitForResourceStatuses(); err != nil { + return errors.Wrap(err, "error while waiting for Cluster API resources to contain statuses") } klog.Info("Deleting objects from bootstrap cluster") - if err = deleteObjectsInNamespace(bootstrapClient, namespace); err != nil { + if err := deleteClusterAPIObjectsInAllNamespaces(bootstrapClient); err != nil { return errors.Wrap(err, "unable to finish deleting objects in bootstrap cluster, resources may have been leaked") } @@ -220,112 +209,31 @@ func (d *ClusterDeployer) saveProviderComponentsToCluster(factory provider.Compo return nil } -func (d *ClusterDeployer) applyClusterAPIComponentsWithPivoting(client, source clusterclient.Client, namespace string) error { - klog.Info("Applying Cluster API Provider Components") - if err := client.Apply(d.providerComponents); err != nil { - return errors.Wrap(err, "unable to apply cluster api controllers") - } - - klog.Info("Pivoting Cluster API objects from bootstrap to target cluster.") - err := pivotNamespace(source, client, namespace) - if err != nil { - return errors.Wrap(err, "unable to pivot cluster API objects") - } - - return nil -} - -func pivotNamespace(from, to clusterclient.Client, namespace string) error { - if err := from.WaitForClusterV1alpha1Ready(); err != nil { - return errors.New("cluster v1alpha1 resource not ready on source cluster") - } - - if err := to.WaitForClusterV1alpha1Ready(); err != nil { - return errors.New("cluster v1alpha1 resource not ready on target cluster") - } - - clusters, err := from.GetClusterObjectsInNamespace(namespace) - if err != nil { - return err - } - - for _, cluster := range clusters { - // New objects cannot have a specified resource version. Clear it out. - cluster.SetResourceVersion("") - if err = to.CreateClusterObject(cluster); err != nil { - return errors.Wrapf(err, "error moving Cluster %q", cluster.GetName()) - } - klog.Infof("Moved Cluster '%s'", cluster.GetName()) - } - - fromDeployments, err := from.GetMachineDeploymentObjectsInNamespace(namespace) - if err != nil { - return err - } - for _, deployment := range fromDeployments { - // New objects cannot have a specified resource version. Clear it out. - deployment.SetResourceVersion("") - if err = to.CreateMachineDeploymentObjects([]*clusterv1.MachineDeployment{deployment}, namespace); err != nil { - return errors.Wrapf(err, "error moving MachineDeployment %q", deployment.GetName()) - } - klog.Infof("Moved MachineDeployment %v", deployment.GetName()) - } - - fromMachineSets, err := from.GetMachineSetObjectsInNamespace(namespace) - if err != nil { - return err - } - for _, machineSet := range fromMachineSets { - // New objects cannot have a specified resource version. Clear it out. - machineSet.SetResourceVersion("") - if err := to.CreateMachineSetObjects([]*clusterv1.MachineSet{machineSet}, namespace); err != nil { - return errors.Wrapf(err, "error moving MachineSet %q", machineSet.GetName()) - } - klog.Infof("Moved MachineSet %v", machineSet.GetName()) - } - - machines, err := from.GetMachineObjectsInNamespace(namespace) - if err != nil { - return err - } - - for _, machine := range machines { - // New objects cannot have a specified resource version. Clear it out. - machine.SetResourceVersion("") - machine.SetOwnerReferences(nil) - if err = to.CreateMachineObjects([]*clusterv1.Machine{machine}, namespace); err != nil { - return errors.Wrapf(err, "error moving Machine %q", machine.GetName()) - } - klog.Infof("Moved Machine '%s'", machine.GetName()) - } - return nil -} - -func deleteObjectsInNamespace(client clusterclient.Client, namespace string) error { +func deleteClusterAPIObjectsInAllNamespaces(client clusterclient.Client) error { var errorList []string - klog.Infof("Deleting machine deployments in namespace %q", namespace) - if err := client.DeleteMachineDeploymentObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machine deployments") + klog.Infof("Deleting MachineDeployments in all namespaces") + if err := client.DeleteMachineDeployments(""); err != nil { + err = errors.Wrap(err, "error deleting MachineDeployments") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting machine sets in namespace %q", namespace) - if err := client.DeleteMachineSetObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machine sets") + klog.Infof("Deleting MachineSets in all namespaces") + if err := client.DeleteMachineSets(""); err != nil { + err = errors.Wrap(err, "error deleting MachineSets") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting machines in namespace %q", namespace) - if err := client.DeleteMachineObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting machines") + klog.Infof("Deleting Machines in all namespaces") + if err := client.DeleteMachines(""); err != nil { + err = errors.Wrap(err, "error deleting Machines") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting clusters in namespace %q", namespace) - if err := client.DeleteClusterObjectsInNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting clusters") + klog.Infof("Deleting MachineClasses in all namespaces") + if err := client.DeleteMachineClasses(""); err != nil { + err = errors.Wrap(err, "error deleting MachineClasses") errorList = append(errorList, err.Error()) } - klog.Infof("Deleting namespace %q", namespace) - if err := client.DeleteNamespace(namespace); err != nil { - err = errors.Wrap(err, "error deleting namespace") + klog.Infof("Deleting Clusters in all namespaces") + if err := client.DeleteClusters(""); err != nil { + err = errors.Wrap(err, "error deleting Clusters") errorList = append(errorList, err.Error()) } if len(errorList) > 0 { diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel index da6d6d15..b215680d 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/BUILD.bazel @@ -5,11 +5,13 @@ go_library( srcs = [ "alpha.go", "alpha_phase_apply_addons.go", + "alpha_phase_apply_boostrap_components.go", "alpha_phase_apply_cluster.go", "alpha_phase_apply_cluster_api_components.go", "alpha_phase_apply_machines.go", "alpha_phase_create_bootstrap_cluster.go", "alpha_phase_get_kubeconfig.go", + "alpha_phase_pivot.go", "alpha_phases.go", "create.go", "create_cluster.go", @@ -38,6 +40,7 @@ go_library( "//vendor/github.com/spf13/cobra:go_default_library", "//vendor/github.com/spf13/pflag:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go new file mode 100644 index 00000000..0f4a42d0 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_apply_boostrap_components.go @@ -0,0 +1,80 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "io/ioutil" + + "github.com/pkg/errors" + "github.com/spf13/cobra" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" + "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" +) + +type AlphaPhaseApplyBootstrapComponentsOptions struct { + Kubeconfig string + BootstrapComponents string +} + +var pabco = &AlphaPhaseApplyBootstrapComponentsOptions{} + +var alphaPhaseApplyBootstrapComponentsCmd = &cobra.Command{ + Use: "apply-bootstrap-components", + Short: "Apply boostrap components", + Long: `Apply bootstrap components`, + Run: func(cmd *cobra.Command, args []string) { + if pabco.BootstrapComponents == "" { + exitWithHelp(cmd, "Please provide yaml file for bootstrap component definition.") + } + + if pabco.Kubeconfig == "" { + exitWithHelp(cmd, "Please provide a kubeconfig file.") + } + + if err := RunAlphaPhaseApplyBootstrapComponents(pabco); err != nil { + klog.Exit(err) + } + }, +} + +func RunAlphaPhaseApplyBootstrapComponents(pabco *AlphaPhaseApplyBootstrapComponentsOptions) error { + kubeconfig, err := ioutil.ReadFile(pabco.Kubeconfig) + if err != nil { + return err + } + + pc, err := ioutil.ReadFile(pabco.BootstrapComponents) + if err != nil { + return errors.Wrapf(err, "error loading provider components file %q", pabco.BootstrapComponents) + } + + clientFactory := clusterclient.NewFactory() + client, err := clientFactory.NewClientFromKubeconfig(string(kubeconfig)) + if err != nil { + return errors.Wrap(err, "unable to create cluster client") + } + + return phases.ApplyBootstrapComponents(client, string(pc)) +} + +func init() { + // Required flags + alphaPhaseApplyBootstrapComponentsCmd.Flags().StringVarP(&pabco.Kubeconfig, "kubeconfig", "", "", "Path for the kubeconfig file to use") + alphaPhaseApplyBootstrapComponentsCmd.Flags().StringVarP(&pabco.BootstrapComponents, "bootstrap-components", "b", "", "A yaml file containing bootstrap cluster components") + alphaPhasesCmd.AddCommand(alphaPhaseApplyBootstrapComponentsCmd) +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go index eb0decda..5dac0147 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_get_kubeconfig.go @@ -88,7 +88,7 @@ func init() { alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Kubeconfig, "kubeconfig", "", "", "Path for the kubeconfig file to use") alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.ClusterName, "cluster-name", "", "", "Cluster Name") // TODO: Remove as soon as code allows https://github.com/kubernetes-sigs/cluster-api/issues/157 - alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Provider, "provider", "", "", "Which provider deployment logic to use (google/vsphere/azure)") + alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.Provider, "provider", "", "", "Which provider deployment logic to use") // Optional flags alphaPhaseGetKubeconfigCmd.Flags().StringVarP(&pgko.KubeconfigOutput, "kubeconfig-out", "", "kubeconfig", "Where to output the kubeconfig for the provisioned cluster") diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go new file mode 100644 index 00000000..9f1984b2 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/alpha_phase_pivot.go @@ -0,0 +1,100 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cmd + +import ( + "fmt" + "io/ioutil" + + "github.com/spf13/cobra" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" + "sigs.k8s.io/cluster-api/cmd/clusterctl/phases" +) + +type AlphaPhasePivotOptions struct { + SourceKubeconfig string + TargetKubeconfig string + ProviderComponents string +} + +var ppo = &AlphaPhasePivotOptions{} + +var alphaPhasePivotCmd = &cobra.Command{ + Use: "pivot", + Short: "Pivot", + Long: `Pivot`, + Run: func(cmd *cobra.Command, args []string) { + if ppo.ProviderComponents == "" { + exitWithHelp(cmd, "Please provide yaml file for provider components definition.") + } + + if ppo.SourceKubeconfig == "" { + exitWithHelp(cmd, "Please provide a source kubeconfig file.") + } + + if ppo.TargetKubeconfig == "" { + exitWithHelp(cmd, "Please provide a target kubeconfig file.") + } + + if err := RunAlphaPhasePivot(ppo); err != nil { + klog.Exit(err) + } + }, +} + +func RunAlphaPhasePivot(ppo *AlphaPhasePivotOptions) error { + sourceKubeconfig, err := ioutil.ReadFile(ppo.SourceKubeconfig) + if err != nil { + return err + } + + targetKubeconfig, err := ioutil.ReadFile(ppo.TargetKubeconfig) + if err != nil { + return err + } + + providerComponents, err := ioutil.ReadFile(ppo.ProviderComponents) + if err != nil { + return fmt.Errorf("error loading addons file '%v': %v", ppo.ProviderComponents, err) + } + + clientFactory := clusterclient.NewFactory() + sourceClient, err := clientFactory.NewClientFromKubeconfig(string(sourceKubeconfig)) + if err != nil { + return fmt.Errorf("unable to create source cluster client: %v", err) + } + + targetClient, err := clientFactory.NewClientFromKubeconfig(string(targetKubeconfig)) + if err != nil { + return fmt.Errorf("unable to create target cluster client: %v", err) + } + + if err := phases.Pivot(sourceClient, targetClient, string(providerComponents)); err != nil { + return fmt.Errorf("unable to pivot Cluster API Components: %v", err) + } + + return nil +} + +func init() { + // Required flags + alphaPhasePivotCmd.Flags().StringVarP(&ppo.SourceKubeconfig, "source-kubeconfig", "s", "", "Path for the source kubeconfig file to use") + alphaPhasePivotCmd.Flags().StringVarP(&ppo.TargetKubeconfig, "target-kubeconfig", "t", "", "Path for the target kubeconfig file to use") + alphaPhasePivotCmd.Flags().StringVarP(&ppo.ProviderComponents, "provider-components", "p", "", "A yaml file containing provider components to apply to the cluster") + alphaPhasesCmd.AddCommand(alphaPhasePivotCmd) +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go index c2aa0c3e..a46bd4ef 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/create_cluster.go @@ -31,13 +31,14 @@ import ( ) type CreateOptions struct { - Cluster string - Machine string - ProviderComponents string - AddonComponents string - Provider string - KubeconfigOutput string - BootstrapFlags bootstrap.Options + Cluster string + Machine string + ProviderComponents string + AddonComponents string + BootstrapOnlyComponents string + Provider string + KubeconfigOutput string + BootstrapFlags bootstrap.Options } var co = &CreateOptions{} @@ -92,6 +93,12 @@ func RunCreate(co *CreateOptions) error { return errors.Wrapf(err, "error loading addons file %q", co.AddonComponents) } } + var bc []byte + if co.BootstrapOnlyComponents != "" { + if bc, err = ioutil.ReadFile(co.BootstrapOnlyComponents); err != nil { + return errors.Wrapf(err, "error loading bootstrap only component file %q", co.BootstrapOnlyComponents) + } + } pcsFactory := clusterdeployer.NewProviderComponentsStoreFactory() d := clusterdeployer.New( @@ -99,6 +106,7 @@ func RunCreate(co *CreateOptions) error { clusterclient.NewFactory(), string(pc), string(ac), + string(bc), co.BootstrapFlags.Cleanup) return d.Create(c, m, pd, co.KubeconfigOutput, pcsFactory) @@ -113,11 +121,12 @@ func init() { createClusterCmd.Flags().StringVarP(&co.ProviderComponents, "provider-components", "p", "", "A yaml file containing cluster api provider controllers and supporting objects. Required.") createClusterCmd.MarkFlagRequired("provider-components") // TODO: Remove as soon as code allows https://github.com/kubernetes-sigs/cluster-api/issues/157 - createClusterCmd.Flags().StringVarP(&co.Provider, "provider", "", "", "Which provider deployment logic to use (google/vsphere/azure). Required.") + createClusterCmd.Flags().StringVarP(&co.Provider, "provider", "", "", "Which provider deployment logic to use. Required.") createClusterCmd.MarkFlagRequired("provider") // Optional flags createClusterCmd.Flags().StringVarP(&co.AddonComponents, "addon-components", "a", "", "A yaml file containing cluster addons to apply to the internal cluster") + createClusterCmd.Flags().StringVarP(&co.BootstrapOnlyComponents, "bootstrap-only-components", "", "", "A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster") createClusterCmd.Flags().StringVarP(&co.KubeconfigOutput, "kubeconfig-out", "", "kubeconfig", "Where to output the kubeconfig for the provisioned cluster") co.BootstrapFlags.AddFlags(createClusterCmd.Flags()) diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go index 087e6e8a..1b683431 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/cmd/delete_cluster.go @@ -32,7 +32,6 @@ import ( type DeleteOptions struct { KubeconfigPath string ProviderComponents string - ClusterNamespace string KubeconfigOverrides tcmd.ConfigOverrides BootstrapFlags bootstrap.Options } @@ -61,9 +60,6 @@ func init() { deleteClusterCmd.Flags().StringVarP(&do.KubeconfigPath, "kubeconfig", "", "", "Path to the kubeconfig file to use for connecting to the cluster to be deleted, if empty, the default KUBECONFIG load path is used.") deleteClusterCmd.Flags().StringVarP(&do.ProviderComponents, "provider-components", "p", "", "A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store.") - // Optional flags - deleteClusterCmd.Flags().StringVarP(&do.ClusterNamespace, "cluster-namespace", "", v1.NamespaceDefault, "Namespace where the cluster to be deleted resides") - // BindContextFlags will bind the flags cluster, namespace, and user tcmd.BindContextFlags(&do.KubeconfigOverrides.Context, deleteClusterCmd.Flags(), tcmd.RecommendedContextOverrideFlags("")) @@ -92,9 +88,10 @@ func RunDelete() error { clusterclient.NewFactory(), providerComponents, "", + "", do.BootstrapFlags.Cleanup) - return deployer.Delete(clusterClient, do.ClusterNamespace) + return deployer.Delete(clusterClient) } func loadProviderComponents() (string, error) { diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel index af6dc871..716245bf 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/BUILD.bazel @@ -1,14 +1,16 @@ -load("@io_bazel_rules_go//go:def.bzl", "go_library") +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ "applyaddons.go", + "applybootstrapcomponents.go", "applycluster.go", "applyclusterapicomponents.go", "applymachines.go", "createbootstrapcluster.go", "getkubeconfig.go", + "pivot.go", ], importpath = "sigs.k8s.io/cluster-api/cmd/clusterctl/phases", visibility = ["//visibility:public"], @@ -19,6 +21,18 @@ go_library( "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/apps/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/yaml:go_default_library", "//vendor/k8s.io/klog:go_default_library", ], ) + +go_test( + name = "go_default_test", + srcs = ["pivot_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/apis/cluster/v1alpha1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + ], +) diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go new file mode 100644 index 00000000..20508526 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applybootstrapcomponents.go @@ -0,0 +1,32 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "github.com/pkg/errors" + "k8s.io/klog" + "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" +) + +func ApplyBootstrapComponents(client clusterclient.Client, components string) error { + klog.Info("Applying Bootstrap-only Components") + if err := client.Apply(components); err != nil { + return errors.Wrap(err, "unable to apply bootstrap-only components") + } + + return nil +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go index 2c11ccc0..ffc8f1af 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/applymachines.go @@ -34,7 +34,7 @@ func ApplyMachines(client clusterclient.Client, namespace string, machines []*cl } klog.Infof("Creating machines in namespace %q", namespace) - if err := client.CreateMachineObjects(machines, namespace); err != nil { + if err := client.CreateMachines(machines, namespace); err != nil { return err } diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go index fe5feee1..a119a883 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/getkubeconfig.go @@ -25,7 +25,6 @@ import ( "k8s.io/klog" "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/clusterclient" "sigs.k8s.io/cluster-api/cmd/clusterctl/clusterdeployer/provider" - clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/cluster-api/pkg/util" ) @@ -36,13 +35,8 @@ const ( // GetKubeconfig returns a kubeconfig for the target cluster func GetKubeconfig(bootstrapClient clusterclient.Client, provider provider.Deployer, kubeconfigOutput string, clusterName, namespace string) (string, error) { - cluster, controlPlane, _, err := clusterclient.GetClusterAPIObject(bootstrapClient, clusterName, namespace) - if err != nil { - return "", err - } - klog.V(1).Info("Getting target cluster kubeconfig.") - targetKubeconfig, err := waitForKubeconfigReady(provider, cluster, controlPlane) + targetKubeconfig, err := waitForKubeconfigReady(bootstrapClient, provider, clusterName, namespace) if err != nil { return "", fmt.Errorf("unable to get target cluster kubeconfig: %v", err) } @@ -54,11 +48,16 @@ func GetKubeconfig(bootstrapClient clusterclient.Client, provider provider.Deplo return targetKubeconfig, nil } -func waitForKubeconfigReady(provider provider.Deployer, cluster *clusterv1.Cluster, machine *clusterv1.Machine) (string, error) { +func waitForKubeconfigReady(bootstrapClient clusterclient.Client, provider provider.Deployer, clusterName, namespace string) (string, error) { kubeconfig := "" err := util.PollImmediate(retryKubeConfigReady, timeoutKubeconfigReady, func() (bool, error) { - klog.V(2).Infof("Waiting for kubeconfig on %v to become ready...", machine.Name) - k, err := provider.GetKubeConfig(cluster, machine) + cluster, controlPlane, _, err := clusterclient.GetClusterAPIObject(bootstrapClient, clusterName, namespace) + if err != nil { + return false, err + } + + klog.V(2).Infof("Waiting for kubeconfig on %v to become ready...", controlPlane.Name) + k, err := provider.GetKubeConfig(cluster, controlPlane) if err != nil { klog.V(4).Infof("error getting kubeconfig: %v", err) return false, nil diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go new file mode 100644 index 00000000..5ed41057 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/phases/pivot.go @@ -0,0 +1,424 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package phases + +import ( + "io" + "strings" + + "github.com/pkg/errors" + appsv1 "k8s.io/api/apps/v1" + "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/klog" + clusterv1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" +) + +type sourceClient interface { + Delete(string) error + DeleteMachineClass(namespace, name string) error + ForceDeleteCluster(string, string) error + ForceDeleteMachine(string, string) error + ForceDeleteMachineDeployment(string, string) error + ForceDeleteMachineSet(namespace, name string) error + GetClusters(string) ([]*clusterv1.Cluster, error) + GetMachineClasses(string) ([]*clusterv1.MachineClass, error) + GetMachineDeployments(string) ([]*clusterv1.MachineDeployment, error) + GetMachineDeploymentsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineDeployment, error) + GetMachines(namespace string) ([]*clusterv1.Machine, error) + GetMachineSets(namespace string) ([]*clusterv1.MachineSet, error) + GetMachineSetsForCluster(*clusterv1.Cluster) ([]*clusterv1.MachineSet, error) + GetMachineSetsForMachineDeployment(*clusterv1.MachineDeployment) ([]*clusterv1.MachineSet, error) + GetMachinesForCluster(*clusterv1.Cluster) ([]*clusterv1.Machine, error) + GetMachinesForMachineSet(*clusterv1.MachineSet) ([]*clusterv1.Machine, error) + ScaleStatefulSet(string, string, int32) error + WaitForClusterV1alpha1Ready() error +} + +type targetClient interface { + Apply(string) error + CreateClusterObject(*clusterv1.Cluster) error + CreateMachineClass(*clusterv1.MachineClass) error + CreateMachineDeployments([]*clusterv1.MachineDeployment, string) error + CreateMachines([]*clusterv1.Machine, string) error + CreateMachineSets([]*clusterv1.MachineSet, string) error + EnsureNamespace(string) error + GetMachineDeployment(namespace, name string) (*clusterv1.MachineDeployment, error) + GetMachineSet(string, string) (*clusterv1.MachineSet, error) + WaitForClusterV1alpha1Ready() error +} + +// Pivot deploys the provided provider components to a target cluster and then migrates +// all cluster-api resources from the source cluster to the target cluster +func Pivot(source sourceClient, target targetClient, providerComponents string) error { + klog.Info("Applying Cluster API Provider Components to Target Cluster") + if err := target.Apply(providerComponents); err != nil { + return errors.Wrap(err, "unable to apply cluster api controllers") + } + + klog.Info("Pivoting Cluster API objects from bootstrap to target cluster.") + if err := pivot(source, target, providerComponents); err != nil { + return errors.Wrap(err, "unable to pivot cluster API objects") + } + + return nil +} + +func pivot(from sourceClient, to targetClient, providerComponents string) error { + // TODO: Attempt to handle rollback in case of pivot failure + + klog.V(4).Info("Ensuring cluster v1alpha1 resources are available on the source cluster") + if err := from.WaitForClusterV1alpha1Ready(); err != nil { + return errors.New("cluster v1alpha1 resource not ready on source cluster") + } + + klog.V(4).Info("Ensuring cluster v1alpha1 resources are available on the target cluster") + if err := to.WaitForClusterV1alpha1Ready(); err != nil { + return errors.New("cluster v1alpha1 resource not ready on target cluster") + } + + klog.V(4).Info("Parsing list of cluster-api controllers from provider components") + controllers, err := parseControllers(providerComponents) + if err != nil { + return errors.Wrap(err, "Failed to extract Cluster API Controllers from the provider components") + } + + // Scale down the controller managers in the source cluster + for _, controller := range controllers { + klog.V(4).Infof("Scaling down controller %s/%s", controller.Namespace, controller.Name) + if err := from.ScaleStatefulSet(controller.Namespace, controller.Name, 0); err != nil { + return errors.Wrapf(err, "Failed to scale down %s/%s", controller.Namespace, controller.Name) + } + } + + klog.V(4).Info("Retrieving list of MachineClasses to move") + machineClasses, err := from.GetMachineClasses("") + if err != nil { + return err + } + + if err := copyMachineClasses(from, to, machineClasses); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of Clusters to move") + clusters, err := from.GetClusters("") + if err != nil { + return err + } + + if err := moveClusters(from, to, clusters); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of MachineDeployments not associated with a Cluster to move") + machineDeployments, err := from.GetMachineDeployments("") + if err != nil { + return err + } + if err := moveMachineDeployments(from, to, machineDeployments); err != nil { + return err + } + + klog.V(4).Info("Retrieving list of MachineSets not associated with a MachineDeployment or a Cluster to move") + machineSets, err := from.GetMachineSets("") + if err != nil { + return err + } + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of Machines not associated with a MachineSet or a Cluster to move") + machines, err := from.GetMachines("") + if err != nil { + return err + } + if err := moveMachines(from, to, machines); err != nil { + return err + } + + if err := deleteMachineClasses(from, machineClasses); err != nil { + return err + } + + klog.V(4).Infof("Deleting provider components from source cluster") + if err := from.Delete(providerComponents); err != nil { + klog.Warningf("Could not delete the provider components from the source cluster: %v", err) + } + + return nil +} + +func moveClusters(from sourceClient, to targetClient, clusters []*clusterv1.Cluster) error { + clusterNames := make([]string, 0, len(clusters)) + for _, c := range clusters { + clusterNames = append(clusterNames, c.Name) + } + klog.V(4).Infof("Preparing to move Clusters: %v", clusterNames) + + for _, c := range clusters { + if err := moveCluster(from, to, c); err != nil { + return errors.Wrapf(err, "Failed to move cluster: %s/%s", c.Namespace, c.Name) + } + } + return nil +} + +func deleteMachineClasses(client sourceClient, machineClasses []*clusterv1.MachineClass) error { + machineClassNames := make([]string, 0, len(machineClasses)) + for _, mc := range machineClasses { + machineClassNames = append(machineClassNames, mc.Name) + } + klog.V(4).Infof("Preparing to delete MachineClasses: %v", machineClassNames) + + for _, mc := range machineClasses { + if err := deleteMachineClass(client, mc); err != nil { + return errors.Wrapf(err, "failed to delete MachineClass %s:%s", mc.Namespace, mc.Name) + } + } + return nil +} + +func deleteMachineClass(client sourceClient, machineClass *clusterv1.MachineClass) error { + // New objects cannot have a specified resource version. Clear it out. + machineClass.SetResourceVersion("") + if err := client.DeleteMachineClass(machineClass.Namespace, machineClass.Name); err != nil { + return errors.Wrapf(err, "error deleting MachineClass %s/%s from source cluster", machineClass.Namespace, machineClass.Name) + } + + klog.V(4).Infof("Successfully deleted MachineClass %s/%s from source cluster", machineClass.Namespace, machineClass.Name) + return nil +} + +func copyMachineClasses(from sourceClient, to targetClient, machineClasses []*clusterv1.MachineClass) error { + machineClassNames := make([]string, 0, len(machineClasses)) + for _, mc := range machineClasses { + machineClassNames = append(machineClassNames, mc.Name) + } + klog.V(4).Infof("Preparing to copy MachineClasses: %v", machineClassNames) + + for _, mc := range machineClasses { + if err := copyMachineClass(from, to, mc); err != nil { + return errors.Wrapf(err, "failed to copy MachineClass %s:%s", mc.Namespace, mc.Name) + } + } + return nil +} + +func copyMachineClass(from sourceClient, to targetClient, machineClass *clusterv1.MachineClass) error { + // New objects cannot have a specified resource version. Clear it out. + machineClass.SetResourceVersion("") + if err := to.CreateMachineClass(machineClass); err != nil { + return errors.Wrapf(err, "error copying MachineClass %s/%s to target cluster", machineClass.Namespace, machineClass.Name) + } + + klog.V(4).Infof("Successfully copied MachineClass %s/%s", machineClass.Namespace, machineClass.Name) + return nil +} + +func moveCluster(from sourceClient, to targetClient, cluster *clusterv1.Cluster) error { + klog.V(4).Infof("Moving Cluster %s/%s", cluster.Namespace, cluster.Name) + + klog.V(4).Infof("Ensuring namespace %q exists on target cluster", cluster.Namespace) + if err := to.EnsureNamespace(cluster.Namespace); err != nil { + return errors.Wrapf(err, "unable to ensure namespace %q in target cluster", cluster.Namespace) + } + + // New objects cannot have a specified resource version. Clear it out. + cluster.SetResourceVersion("") + if err := to.CreateClusterObject(cluster); err != nil { + return errors.Wrapf(err, "error copying Cluster %s/%s to target cluster", cluster.Namespace, cluster.Name) + } + + klog.V(4).Infof("Retrieving list of MachineDeployments to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machineDeployments, err := from.GetMachineDeploymentsForCluster(cluster) + if err != nil { + return err + } + if err := moveMachineDeployments(from, to, machineDeployments); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of MachineSets not associated with a MachineDeployment to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machineSets, err := from.GetMachineSetsForCluster(cluster) + if err != nil { + return err + } + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + klog.V(4).Infof("Retrieving list of Machines not associated with a MachineSet to move for Cluster %s/%s", cluster.Namespace, cluster.Name) + machines, err := from.GetMachinesForCluster(cluster) + if err != nil { + return err + } + if err := moveMachines(from, to, machines); err != nil { + return err + } + + if err := from.ForceDeleteCluster(cluster.Namespace, cluster.Name); err != nil { + return errors.Wrapf(err, "error force deleting cluster %s/%s", cluster.Namespace, cluster.Name) + } + + klog.V(4).Infof("Successfully moved Cluster %s/%s", cluster.Namespace, cluster.Name) + return nil +} + +func moveMachineDeployments(from sourceClient, to targetClient, machineDeployments []*clusterv1.MachineDeployment) error { + machineDeploymentNames := make([]string, 0, len(machineDeployments)) + for _, md := range machineDeployments { + machineDeploymentNames = append(machineDeploymentNames, md.Name) + } + klog.V(4).Infof("Preparing to move MachineDeployments: %v", machineDeploymentNames) + + for _, md := range machineDeployments { + if err := moveMachineDeployment(from, to, md); err != nil { + return errors.Wrapf(err, "failed to move MachineDeployment %s:%s", md.Namespace, md.Name) + } + } + return nil +} + +func moveMachineDeployment(from sourceClient, to targetClient, md *clusterv1.MachineDeployment) error { + klog.V(4).Infof("Moving MachineDeployment %s/%s", md.Namespace, md.Name) + klog.V(4).Infof("Retrieving list of MachineSets for MachineDeployment %s/%s", md.Namespace, md.Name) + machineSets, err := from.GetMachineSetsForMachineDeployment(md) + if err != nil { + return err + } + + if err := moveMachineSets(from, to, machineSets); err != nil { + return err + } + + // New objects cannot have a specified resource version. Clear it out. + md.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner reference would be a Cluster. + md.SetOwnerReferences(nil) + + if err := to.CreateMachineDeployments([]*clusterv1.MachineDeployment{md}, md.Namespace); err != nil { + return errors.Wrapf(err, "error copying MachineDeployment %s/%s to target cluster", md.Namespace, md.Name) + } + + if err := from.ForceDeleteMachineDeployment(md.Namespace, md.Name); err != nil { + return errors.Wrapf(err, "error force deleting MachineDeployment %s/%s from source cluster", md.Namespace, md.Name) + } + klog.V(4).Infof("Successfully moved MachineDeployment %s/%s", md.Namespace, md.Name) + return nil +} + +func moveMachineSets(from sourceClient, to targetClient, machineSets []*clusterv1.MachineSet) error { + machineSetNames := make([]string, 0, len(machineSets)) + for _, ms := range machineSets { + machineSetNames = append(machineSetNames, ms.Name) + } + klog.V(4).Infof("Preparing to move MachineSets: %v", machineSetNames) + + for _, ms := range machineSets { + if err := moveMachineSet(from, to, ms); err != nil { + return errors.Wrapf(err, "failed to move MachineSet %s:%s", ms.Namespace, ms.Name) + } + } + return nil +} + +func moveMachineSet(from sourceClient, to targetClient, ms *clusterv1.MachineSet) error { + klog.V(4).Infof("Moving MachineSet %s/%s", ms.Namespace, ms.Name) + klog.V(4).Infof("Retrieving list of Machines for MachineSet %s/%s", ms.Namespace, ms.Name) + machines, err := from.GetMachinesForMachineSet(ms) + if err != nil { + return err + } + + if err := moveMachines(from, to, machines); err != nil { + return err + } + + // New objects cannot have a specified resource version. Clear it out. + ms.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner references would be a MachineDeployment and/or a Cluster. + ms.SetOwnerReferences(nil) + + if err := to.CreateMachineSets([]*clusterv1.MachineSet{ms}, ms.Namespace); err != nil { + return errors.Wrapf(err, "error copying MachineSet %s/%s to target cluster", ms.Namespace, ms.Name) + } + if err := from.ForceDeleteMachineSet(ms.Namespace, ms.Name); err != nil { + return errors.Wrapf(err, "error force deleting MachineSet %s/%s from source cluster", ms.Namespace, ms.Name) + } + klog.V(4).Infof("Successfully moved MachineSet %s/%s", ms.Namespace, ms.Name) + return nil +} + +func moveMachines(from sourceClient, to targetClient, machines []*clusterv1.Machine) error { + machineNames := make([]string, 0, len(machines)) + for _, m := range machines { + machineNames = append(machineNames, m.Name) + } + klog.V(4).Infof("Preparing to move Machines: %v", machineNames) + + for _, m := range machines { + if err := moveMachine(from, to, m); err != nil { + return errors.Wrapf(err, "failed to move Machine %s:%s", m.Namespace, m.Name) + } + } + return nil +} + +func moveMachine(from sourceClient, to targetClient, m *clusterv1.Machine) error { + klog.V(4).Infof("Moving Machine %s/%s", m.Namespace, m.Name) + + // New objects cannot have a specified resource version. Clear it out. + m.SetResourceVersion("") + + // Remove owner reference. This currently assumes that the only owner references would be a MachineSet and/or a Cluster. + m.SetOwnerReferences(nil) + + if err := to.CreateMachines([]*clusterv1.Machine{m}, m.Namespace); err != nil { + return errors.Wrapf(err, "error copying Machine %s/%s to target cluster", m.Namespace, m.Name) + } + if err := from.ForceDeleteMachine(m.Namespace, m.Name); err != nil { + return errors.Wrapf(err, "error force deleting Machine %s/%s from source cluster", m.Namespace, m.Name) + } + klog.V(4).Infof("Successfully moved Machine %s/%s", m.Namespace, m.Name) + return nil +} + +func parseControllers(providerComponents string) ([]*appsv1.StatefulSet, error) { + decoder := yaml.NewYAMLOrJSONDecoder(strings.NewReader(providerComponents), 32) + + controllers := []*appsv1.StatefulSet{} + + for { + var out appsv1.StatefulSet + err := decoder.Decode(&out) + + if err == io.EOF { + break + } else if err != nil { + return nil, err + } + + if out.TypeMeta.Kind == "StatefulSet" { + controllers = append(controllers, &out) + } + } + + return controllers, nil +} diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden index 034ee658..d1dae531 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden @@ -7,12 +7,13 @@ Flags: --bootstrap-cluster-cleanup Whether to cleanup the bootstrap cluster after bootstrap. (default true) -e, --bootstrap-cluster-kubeconfig string Sets the bootstrap cluster to be an existing Kubernetes cluster. --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper + --bootstrap-only-components string A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster --bootstrap-type string The cluster bootstrapper to use. (default "none") -c, --cluster string A yaml file containing cluster object definition. Required. -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s). Required. - --provider string Which provider deployment logic to use (google/vsphere/azure). Required. + --provider string Which provider deployment logic to use. Required. -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects. Required. Global Flags: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden index d5357360..520a03db 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/create-cluster-no-args.golden @@ -7,12 +7,13 @@ Flags: --bootstrap-cluster-cleanup Whether to cleanup the bootstrap cluster after bootstrap. (default true) -e, --bootstrap-cluster-kubeconfig string Sets the bootstrap cluster to be an existing Kubernetes cluster. --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper + --bootstrap-only-components string A yaml file containing components to apply only on the bootstrap cluster (before the provider components are applied) but not the provisioned cluster --bootstrap-type string The cluster bootstrapper to use. (default "none") -c, --cluster string A yaml file containing cluster object definition. Required. -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s). Required. - --provider string Which provider deployment logic to use (google/vsphere/azure). Required. + --provider string Which provider deployment logic to use. Required. -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects. Required. Global Flags: diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden index 9c0f8312..dc7a15fb 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden @@ -8,7 +8,6 @@ Flags: --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper --bootstrap-type string The cluster bootstrapper to use. (default "none") --cluster string The name of the kubeconfig cluster to use - --cluster-namespace string Namespace where the cluster to be deleted resides (default "default") -h, --help help for cluster -n, --namespace string If present, the namespace scope for this CLI request -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store. diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden index 40891e90..3eaea4c8 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/testdata/delete-cluster-no-args.golden @@ -10,7 +10,6 @@ Flags: --bootstrap-flags strings Command line flags to be passed to the chosen bootstrapper --bootstrap-type string The cluster bootstrapper to use. (default "none") --cluster string The name of the kubeconfig cluster to use - --cluster-namespace string Namespace where the cluster to be deleted resides (default "default") -h, --help help for cluster -n, --namespace string If present, the namespace scope for this CLI request -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects, if empty the value is loaded from the cluster's configuration store. diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel index 6077c3a8..20bc2c58 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/cmd/clusterctl/validation/BUILD.bazel @@ -13,7 +13,6 @@ go_library( "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/controller/noderefutil:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", @@ -34,7 +33,6 @@ go_test( "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/apis/cluster/v1alpha1/testutil:go_default_library", - "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go b/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go index 85baa98a..e46e7cbd 100644 --- a/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go +++ b/vendor/sigs.k8s.io/cluster-api/cmd/manager/main.go @@ -19,6 +19,7 @@ package main import ( "flag" "log" + "time" _ "k8s.io/client-go/plugin/pkg/client/auth/gcp" "k8s.io/klog" @@ -41,7 +42,10 @@ func main() { } // Create a new Cmd to provide shared dependencies and start components - mgr, err := manager.New(cfg, manager.Options{}) + syncPeriod := 10 * time.Minute + mgr, err := manager.New(cfg, manager.Options{ + SyncPeriod: &syncPeriod, + }) if err != nil { log.Fatal(err) } diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml index d513c9c1..8b77b8ff 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machine.yaml @@ -6,6 +6,15 @@ metadata: controller-tools.k8s.io: "1.0" name: machines.cluster.k8s.io spec: + additionalPrinterColumns: + - JSONPath: .spec.providerID + description: Provider ID + name: ProviderID + type: string + - JSONPath: .status.phase + description: Machine status such as Terminating/Pending/Running/Failed etc + name: Phase + type: string group: cluster.k8s.io names: kind: Machine @@ -47,15 +56,15 @@ spec: by the provider. This field must match the provider ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster - autoscaler with cluster-api as provider. Clean-up login in the autoscaler - compares machines v/s nodes to find out machines at provider which + autoscaler with cluster-api as provider. Clean-up logic in the autoscaler + compares machines to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view of the list of machines. - Another list of nodes is queries from the k8s apiserver and then comparison + Another list of nodes is queried from the k8s apiserver and then comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher level - entities like autoscaler who will be interfacing with cluster-api + entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml index f0d5bf73..488d76a3 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machinedeployment.yaml @@ -142,16 +142,16 @@ spec: ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as - provider. Clean-up login in the autoscaler compares machines - v/s nodes to find out machines at provider which could not + provider. Clean-up logic in the autoscaler compares machines + to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view - of the list of machines. Another list of nodes is queries - from the k8s apiserver and then comparison is done to find + of the list of machines. Another list of nodes is queried + from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher - level entities like autoscaler who will be interfacing with + level entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml index dcc20f00..fb69e275 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/crds/cluster_v1alpha1_machineset.yaml @@ -34,6 +34,15 @@ spec: type: object spec: properties: + deletePolicy: + description: DeletePolicy defines the policy used to identify nodes + to delete when downscaling. Defaults to "Random". Valid values are + "Random, "Newest", "Oldest" + enum: + - Random + - Newest + - Oldest + type: string minReadySeconds: description: MinReadySeconds is the minimum number of seconds for which a newly created machine should be ready. Defaults to 0 (machine will @@ -82,16 +91,16 @@ spec: ID as seen on the node object corresponding to this machine. This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler with cluster-api as - provider. Clean-up login in the autoscaler compares machines - v/s nodes to find out machines at provider which could not + provider. Clean-up logic in the autoscaler compares machines + to nodes to find out machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a generic out-of-tree provider for autoscaler, this field is required by autoscaler to be able to have a provider view - of the list of machines. Another list of nodes is queries - from the k8s apiserver and then comparison is done to find + of the list of machines. Another list of nodes is queried + from the k8s apiserver and then a comparison is done to find out unregistered machines and are marked for delete. This field will be set by the actuators and consumed by higher - level entities like autoscaler who will be interfacing with + level entities like autoscaler that will be interfacing with cluster-api as generic provider. type: string providerSpec: diff --git a/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml b/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml index 3996dded..194878cf 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/default/manager_image_patch.yaml @@ -7,5 +7,5 @@ spec: template: spec: containers: - - image: gcr.io/k8s-cluster-api/cluster-api-controller:latest + - image: gcr.io/k8s-cluster-api/cluster-api-controller:0.1.0 name: manager diff --git a/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml b/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml index e20560a6..f47b0616 100644 --- a/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml +++ b/vendor/sigs.k8s.io/cluster-api/config/rbac/rbac_role.yaml @@ -29,6 +29,7 @@ rules: - cluster.k8s.io resources: - machines + - machines/status verbs: - get - list diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md b/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md index dfdf2b3a..30ada6bd 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/SUMMARY.md @@ -14,6 +14,7 @@ * [Machine Controller](common_code/machine_controller.md) * [MachineSet Controller](common_code/machineset_controller.md) * [MachineDeployment Controller](common_code/machinedeployment_controller.md) +* [Node Controller](common_code/node_controller.md) ## Creating a New Provider diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md index 83070fec..cc88459c 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.md @@ -12,7 +12,7 @@ book in order to better understand this section. We need a new simple diagram here reflecting the move to CRDs. {% endpanel %} -![Architecture](architecture.png) +![Architecture](architecture.svg) ## Cluster API Resources diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.png deleted file mode 100644 index 8fe44100459fd052abda4ed1a5a51d83f7ed1b62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 197396 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

lLlg9U*S#Wa0 zKGF2s1K$^~_+blj4)>4ntx{=>XkZ`&?1C}Ylds)B|41q4OItMUTg7qwmXtTuzTH3coO7}NfQY%-O6EJ!9;FO58ZHuekKbxj$bU*)Ut3L zCvsJ_PCX}1h4$bXcb9utn~ys= zNMDdW8L3C92rucY<*V->rU}z(>9Dt03w4sJxg_g#l$(hw2eO2c3pQ97-D9lt@`RS& zy6TYFke28?dMG8vMZ#ED<1zb%S*rE+*J8=ut%o<&7OyYHiS$vL3>`&@QMsXONkxNa z6*g#xUgnrv+!YY3-*3Fp56ii&`mViTXv8^vIe%#Wy8;X^y7M?ZSW3F-&07BG48-$> zDW`{bytwzkr-i(=_(`*nH+3Ws1;@aTWp=_)>krB-d;Tr`4^w(RJ`DfZUr*7AKV21o z(@&Aj^7-L24c$X4KF}$|B-#%C3TTa8hpV=29u9l#;3Sl}+&n<5rY38cx)9q7M!H4V zhQ-P;CzyBDj;_b01#EO zMdfX@Me&5_)L(HMKbQhiJWm5-`eG^QLN|r?Y^fr|Bj?<1Z2)JcL&u|+B;oVBjPTH| z%OK#4y|y3>J0k)zAR8Sq*ubQXhz#1Ug-3WfA?D2L-7J1;;~sUVAodHS(GN)jBMv2i z#{uH9+sp$>J=iwVRe^&Byi;2@ASi2sse9y?TD|zMK(pho;&31WAk!)NftxAQ<=BLYnAJXwzPebuRHdqImF#2I{Dxn&SFJ2&4CiQaj z2~>J4dcRN!l&8FfoRS7Ls%3U}S#prAptJ~a4Ka5eEXKBB91irc*82DP~{Z+mQ<;@J^CaZqX6%~1G zme$#D@^Er~-0Hr!heCsv3dgOR-uFlpJ_|h1-@x7j5PCyQdJYS9NcZPv;wW(>5;)2F zC!ommNI;w3e^2*d+v=qlVA`Z#cu0$254FB7cu%+^ak1A9OxCa4%oVjh?tlC8r2`_} z4E(Cpo50)*%oh5JS#iP`4;HrHK@S_YNWjszrZQyuM;KrPBD}VELeBcWcWx{d($LTV zTQ|-4i$Y*3G&FpwrWR{_yZgqeZQ^-ruMoispb;^4)O!6wXYr8BW)vFO9Fn0X4#%7O z!LZKNkr9t*_|+Lf%BRx%r7qT+6RubBcO(mR`YDz>Q$x^pC2715jHXC0`Zh62i@g&b zq0>@Q_*eF1Nl)~MQp{tEFnijSheFY_$n+%B&X;XlFLj)VL+&n56li(%tsIUP$TXA2 zClR_7J;dA7d7`8x!7kD#Q>l|19Uc0^s=R9}B{(i?eeF-mEf%tOv}H{Z#?tx0=ch$ zXqz+n;L(F3XTG_y?Q(=Z4>~g>5N(pGUJG=mryZmnvDeQ0MQ8Z09#Hh7=mZMP-tn-p zQL94TZ*_}|{UjGpxkDS+N>9ss9oFk2qFdMJ77BpAiptANEbI(7QhJSus`c+PC|n+3xGty@fip- zL(mG)zV|6|2R7mkh$67q0{0K#efXTGYHBQPig#wG!N#3XtGx!`r;CWd2L$LWNxlp*%H}2rk;%VxJ4n%w!WAg?qq(sghG6r8fWXzE0 zYamX`*CaR|u(fw|ZZ9sJfQCDZ8@^Y6rTj$8t70)?J#jDDMBqnB?8x8KPpbmxUB#Z~QJoeN$a#=9OO zw6x1WE6M5mYuHMLKS_C*eEY}eW$fv- zpg;nI(X@znet5k_LfU4Y-LrdeG7XE~m8c1!6~tMJggcH@Il-vcql!dMbxYC7Pd$fz z5@H2%_cl%#voFK)g4~WoM(koDEDQXO2atZ3lvg~iSF7I*d>vEy=wC~kGB)p6)=Oy z0p=W7om7p%HmokN0qoZx3g}?qUh%&t*tHKa2Oy3 zoFrj$P}mX&*!*w-vb^dhk`et!2?NG8*;jTDFTnPlK;Q&s1;VE_XgmxNvt9rX0gFsG zP&i9VkPxtcqrI%A6(|S7^;xA3{;uFC%nq0x6z{Pl@W^7eQOpLeB2i#7Lvdin`wK{S zN+5r&85Y=z3km}}IPof2sRiJE3$lU({Dk%1ChSocC({$2`W+1ZsB}?;1s^DK9Oq0J z2wUnrdHFzk$|tBKjc;xIVpD1BbiONpIO4Fb;Wd%LL{eLenaQ*E#dwkP9(!){y+yVH zc3w4AHF@09udmXdvgGfN!On5;&ZHiza*l3zI~DK?sXqK^J#Iz92u=Bx+PNi{ zyfu^~Xk)={>Ld_h|2hIc|3*=?MT&t>RS`5I)_Id18f#%}03C>VYWje}?r~O>8=Ugl z-XjVIwH&J{D`GmwHbiv_pEu4o3eV_+vv(wOmkTTn@78#Gvbv)*X&E6N6puB@NL5CZ z4a6dH&CM6vY}RVEANF5;gp*{fa@?}@aL$ySsSy1Y6rtH?xC6745~7JNJxX~frZ<@B zxVkF6^>shdGySaQQ@y=84Ml`~?xULm1scm!j`{r72Ug9du2mH=0*|GgbGtI{!P);X z#0q3(e!Wlgl}R{qsZd)+OT_z;g0U^z{+pZ?Lp`3hEq+A6@<9c&=H;3GP{pZs0h7Qm-*?_dl7mJu3(~XNzNy?2RI21JBvRQo|77+hS{f~YCOTu zoQ86?wrrRWW44Np&b0#^Y2W$wylH-E!y*M=$?Oc4vbf2zdn@D}f2~zVbbrj7A-T@2 zs&G6VbmTf97_dLh^Cu9MXMD|F+cFTg{;hMFe`vI;0d0Fsm`|Z@bK*VvF#Yizvp5np-Pwsk z0Tv@IvVfacrPKNGl{58XI%d zPggh_^JCJmzPyaLD9W&sIVmllULtgUCisDLIQ}Ep&{k3>{GCTziT;OI&+_3@snNijO)FwG|bjhP%iF9 zbtIz+&r5&+N(RJR@EZ?`mk=el^_lw~+Z91R`I`FS*A{<*8TwTolwNj{U!0$rTU0YKE)0O>}?i68*kUyk6&45pvp~!P#l8wKydA4PIzEpD0o@T%0I6WX5lu zfQAK?((rlv1+eUp1|7_*NDu4g`n^U}QG9W~84aKf-6_ncxo18EU9QEa96{Yy;e5FY zgLRb*4XmUtF>8LzJh=ZLkR-T&#_<8ar-Q7=jy$j|2wwhn``A!jwmNuLt@+EQv$}!{ zPeoS*PTi?P7Jcz3x-i?GW)XUAPJ+ZA8da2H2aWWMvNC-kTNc;N&#Rj;&W%fy7S+H& z)+tx3D`t6P(8pV#x&mvApO2iVQ%J;r&b&*3Bs!JTEw|VlCqLH{dS4yjdXHAh_}smo zv+JzdXoKipHfOE;HUGUpFVzo-3SK_V`eB#%-?V_;vE9Xo4Ieg>?_6Iv-uRO`H@denypic3&=W$2XQKO* z$_o(6HZ{oiz2;PSzQBch23s6Kc93w4lK*SSGaMf4RM%jZoyGBP5DgY zI=`WlqUqBO>fHC?1Jk#5s5T$O(AEhzkL{jgXa~YOs=9`TJ?$jY5^J)6u~n~^|A9~X z$_olPUoYSZlzH^e-XEa;FX}D5S)ntTzgQFY2m8JvB|kcgKwalEed05=J_3yvu&tpS zJ0zBD=9vLz-3P(9_%fX*tHQzlIORQeLa+sys9t2K;P%qNbmfU`U46`anv`zKK4RN) zwpq#~mb_X!EM9lF4tV#fjHJr3VESL#uQo1R^DU-6O8WYNnqO8^!)8#oEpqksBBIZ4 z+{#=XTSuIl=DE`V5p5B)Ga7d0I0w1HRevmO$=*Y#)cFQFe$9eQ&ev8LzsG-xi=z!; zYtrZJX&Y*dEb7h4{nkU*Q+P%>9~Pb3U!Nw{c82wYz{@FH6PJxDx+o9(iT`=0L%$Ed zz~JuaKI$Nm;JMCYC(Xw;gDans&?v|w`UxZYa|Sq7A&Y^CoCKPKT6W%Nf&%#RO_VZMYgj^zJ|pAQ!!xS;r7AZki;@=ipqeQ0iwx;fXjsGw zUfe*ZsDbSvpu4o!4X}>WzE>sgW*($QhBmBn7%P&6m_K+!C29Yuv|J`ixbD55=dH}Z z@!XI_+GU4{)2~#;oc*DX(U#o7yFYDf{x725JD%$Q|NkdNL&zqp$POWUCZp_(kWDt( zD_h7GWp71J**e*hoxR7g_a4b!-}`yJKbPO{kJszc<&_u5IgjV#aev(Ix7+m|MRvJ2 z$rYj`4R`tZZcc;Kcdgq=-QV+bGO|*r^ie!DL(k2g=rA)Q`-$YRnvqGVIA4DD$c_*b z$2KnJj5b-}JECr@B@r<{VWOBQQ{htWWAAt)ZX>z)7gzD20v34q{~%G>fA^g;qKdRUEX_8^n+=}!l>HeiTNK{MU9oM zD97AIkx_{TKQ^c2 zvJbA+xLq=pd$<`q_Lp-wern7ZZC6=}^*1Mfqq1>O!^dc_CytV#tXP#jFj|UC#f7Ar zi7QXLJu?SXlBj&f!)IE218`_1&=qQJ}94sc2!6*0lTRS$^3+cIBZi+?Y zSt);@dew|fBgmSgkyj-)c8Dum{;iNC;=ei&#-(((9O=?a6Uz1a`Mu){U9ofC&f`6@ zw)U>sWa}^$5|U`yM!vL8^`CCPs59-Zurl6c>hby`+p65#*C+j5INs)E&k{&*>WcR$ zH?cM7$0xf!K8sUP|MZNA(U_wB3O||r-ALNCFSJi0$UwT%*H_{qzZx6YCY&141de@nbW_OJ|7fBHMzl-*K3Xf^#iPY*)=s2wejen-2CQbHJKmn*$mDWUw75u=G*C? zgLSKE{^KJT-UUtv(8sbnRpTLtfW%m_5f%iVA$bG+wHsi~1Iebn!cNX?IadtdTU4HY zGA{u{ZR)?^g8v}b_HGU=i(;?X2WDz*Q;vN*>}HRwFR|8ZFQ3_*;=dO=t&eaSkkM3b z-q^Z46*o@*xZ(PU*ZN{Vr^N1eg)2A?HhrxsZI;#Ga8x}uAjJ_pYX~`8{3SW{w%-46 z>dlNY4u0wOjOxYt%$+IAugm9H?M3+bw6kmtJw(jx_H5*A%od2K>=n`JL+U8i7j@W; z$jx%j4-ukghrXv+s0)?Ww;`03y>}i6mfZh}_!A*<$9F#{NFhZih$z+VB0(}Fh+^#$I z3wPT3;&TaMe=M?a8Uaub(D)d@BS7DLV085T^mZPERX|;M{g9mqF9hAO#6bIvAooJy zB*DkaYY&1G7z8lT;vGcaL@v+vw2SC}=)v}Ehl1FQ2e^y>yRT;&tsSTOmT4R~lLyas zA6CFeFZL5ML0}pEheArwNpO)npKhRg4Dh|}NcyL2ose#Yi@@)=Yd@O7lV`R@6$45a z#5@LV8?&TBK$C!^PM>H75pO5b*SFR6AVb)#@YRQr)t;p#v%?x#xX=X#f(auyc%OnZ zOUL&|x#?vy9f~R@p<0>q(`#+C@c}p`(H6YV(Q@NSe?kR7gia zE|v39!p!VcDPcaa7Mm7{1**td`OXM>|>5JHO98Q9n1HQ7MTtXdh?b`-i)Bjq5g1q^V)Mp#Jte z9`93+^59qauGbG1g{I}o*uyW6PsK|w+bqY0g?b;8pyn|}h>4F_k{+dTr#!2FU=I;K+E`Yn_E|`x|;yEgV~OeOf*RO-Cke= zX$x9Ws)$D{nhOHCG$=gad_r5~wNdd^=OAtkoH(_|K7dWp0piS+9nf7kVHesfc;kJ` z4~oj((a|v0s>~Q>WW2_Nw@!%_T#tK#F?;_;fSgb)0^)p+;$YXUDM}hfuPEgn3VHK4+NNog%z%^R0SI|Nrkcc z8Jm0~{VE!FmDTg_Eo#L>|G4u+!b!@r7>jBqcXLe9y*oNLaxg+-P@M#oM`0%ss{?nNa)15B9ha2fOwf^IiBlhcq zf}FCbAf&4mK2^>)wqS(Sk%<1^y|ambmFwC9hfWGg|5WF~7-gew*ViBUhqcE_M^p-Gt^3hyyXitK?of1d9Em3sq(Lb9+WVdTo zwyH=~2*jJ9DGJB$J(}pa_syZsE{~?LjpVTxG(JPB77Xc?6v1Px9vA5B>@5pu!(+)| z&%FpAhP=&A&*fPU*g2rG(W>_mm5*mfHzWW{1n`j*{JtAUB1bcU+9))iC!*0j!+ZGl z$tU=~2Gx|mXk=hd7^=bUrt=n1Z4<8Npl~|#h)_2e+N&g?BavIX!GGF!U^UC%a^wJf zNXF&aG8zYm4kS}-q7hT5i}bf!m~G=3ft4fO-aephO~Sdm2m(`;c6fqSSMp;^ZyR!K z5UXZj_p$6rnBI2dd4o<|-!rEb3UUh`&#V1e|51z@fwumw|AlNl5InNKuM>t|g@j>e z)z)CX8kU*ze-SEO%PYr}mw&q~C;0hk{Y0lLqx58jj=SG<6Rh#JR(Z_-sju+~j(1JU zHZRuqWa`A<%4qN63659c*0K!JdJ+CRQ(sq>Hpq1F<7-?|sa`HZi{xNi|IlDtHzO9Z zm0}$^@;gunn}*mWQ-O0+C;~!)Yg@o zvrDu-4Yvr9oDfPBo+vU)c~-}A^eNxMPC|orgd*ncbUqW!&xtEyG|?^lBYN_gUkRj# z-ZSAU46Ie!^>3A>IpTBZuF%m$tHmUw)R4tTz8p#9w!GiBWe00ThqHYCa5*+3E;{?` z%2fKGbTgwiQckh^pG69DSg>&l18#Vf99d*nSGoR5<~O#0Tn`lu5)?A@!CWFzk)1T> zn{aSmZ=iTjbhf2M*c0=YAG_tQ>P6p)ZcY*~x^k0`=+;fxtsUc%(msp$&ih}bD^dYn z-4r@Nz|;IMqMG)YXcrxSdOJBfdi_^I{n=uKZBhM&=i#XwL%{U*a!D&qPIh(xaMCIp zGVKKv;2ee!6dLGetF|`bR~z^QohxZMQ1T;?OZmpF;qC3+Qfi*=VMhE`wEadrc$oxD zCSgfnPRtl0U{g7@1h|r0nIQd#wwQp|N|$innSDQ$+mL;d?)OHkRd%<|Z~g^goHNlXCl-iJ_)%?oM8=OA+t? z#Vhr4?g%+MJ$c2GUh;uUr&%AnOkrTq^hplkJ>p}(`G;@pk!2t7a)>&(OKgawTKDP(#%;{DEwK)9%M)~P}$Y5 z>f7P6OaFLysH^0<{Drud!qWFUN?G=01eG#JRUx-SK*rtY(CAUb9eARljyv#+i?v}xvdYMUfZTO=FMURZ zR0%iUFrZKU_?hL(+MbU=+}71D=@M)a?Wv3pP~IXHST8AW>I7}apdA8zOgylCuQ-uA zZ~JwApqIr+}rf)J(E6KkR&2b*gTEB>jyq@p-N8L-EUE51Dh|(KcuU=BbHoWNcD%@o} z`iznp62j0iXRG7sFyda zu_R|Rv+5|5>T<7)s+oQ<-+FFyt+~`QSeGfhutH6H{3bHraE$cMmrv0;mud69UJ0jm zz7eRx%e(3iwA){e$h@KHo;~@z$Uar0Yy5%lucKpSmMKkDuCdMx_+6Wy3=lgjHghT9 zYBcjID&z%vS{a-=Iqi7tn;MMr#b4>OAk%8Eq;OGeMgCauinPl$=U(}W0B1}VGo=>k z<_8WPl#sx%bAY>uBs=7;NZc~CL?qvS4s4HO%vlxE&%jq4;)=ZLFhDm>jfKknl@W5| z$V<>7?DxBXD-jj`w{=%6aOg;*=l9$zw2a<*#b7LutO2l+YM3@V0RbkBw78xd*n*gC zkUcj2bzXK`T(K)^qX5c1SbOeGMf8v?Q&Ce3G$QxLwoyZkzAbD6G0?QLXVf5f*?s6G zqX8c%Kfp?)l{=V)^|y%ajlLHCBl_TiC*v47~GGY1X6%`7Ko1KTXx*M zb?eLZE`qLf(dr%-2nGSlAz!6`$6b-qcdcscDZaE+I)h=^j-oFqdw4;fZ`eQCi9sC#lff!YD{gl%H;uAXarL}IE-9Hq-M)wePeXb3{VEfO!F0cjLTfE#0K(!cBGf9G zJUGBuN6U*0Bi`D$EsKxPUdvpEN^dVtszMbiT?WF){-Mc8 zaZdc`+#G94ov5hDNdBz{@p1&=t*cQot$j1=3@lIfD3;avT!TsSo_D=_c5X7-?mU6C zy$f!JcTch;$(-8bA16G#)puhmP1r3eHa1qQKKL8lD-F4>|Kjx74fpvu39`WP@v+@f zL|p#C0V-(-SFPwZ@1;ZruO(p&JL}-9wVnN`)O&~d!7qxNlP>#{Zk5C8t9_}on=@-4 z^`XE!;hS;@D};vI=%b4PX9k_Q?w9o^8t6D6(H|Ib=7 z4qfEaA7)*Y(Cq_c4tOsJqg$PxX?H^fM$SdY-~V4a!YMu>!31^i`n)&4w6uS71kyq1 zufKXlU0ppUBSTqAs`2$^!W8r%i*4Udyf%aCOD_4`AZo9v-upSjl}Y@F}g^%Oa(p{b$4r-{Z<9N{FzD~${Cv_U;p zBXL%gC#AoiWSKnCbf04UL6S7$tFxP%6Y@u7P9)P;aj$o`sMDTSXSY|1KEr+{oTJBp zOOyfPLr*I>5lSAWY`I75k&RneSH~!{mE3Dx{z4~Co6&g*y7C!mG3bt~6xg#iX} zetb|Wl$4@`#aG;KK6#Gum&XqH;S$_2pT1+bpcz4!6B22Su#6yn#aVyGjiD^MuU@|l zR>I&@?`?72vTNdK+#TjvpbqRH06G09sBT~E1F{Adnu-Rg%`!V6Z>-~Cx-Bs|Bf@FL zyaaN3Qmt1f&FMFhC_AiJ%*jDq$wsbH&2ZPPJ=kQD`Vz*L`ZvOf=-2`K@^_(q>+fK; zK;!JhHd?ywJaHC)unn4>hc*F0wh#-OmKu!XAXg{8@m_y*^@_jbHWN4Gr>hMBuFDR$ zRcBY%ssT|nCUvy6`=HFST;t_Sg99hCJxH}zpH~4=4OWYQ$6p3;_+ZZ9h#xg*@$d5F z1Co>}-QBno>(`U(eHn3=r&O%+d8PSVB2E|Uj}TLD8o78buNHdNM9qyI&9{u@NI=8Gj^D)XxOM>^f zEAp1@CS+r^kU_Eo?L8f>K=-qvoSba;rq{bOS3-`+&bFr1&*0Qf^#1-v=H~IYLmoTO z4&dSl&>{dXnL<5;c3$c0Z{huLx#9v?C1p!X77!e^cGhi3eyXijZC%V#0*MKzgRmDu zs0$jYYZ05lbdM6Bw&sbgKt)0eJi3Kb4jQ${}!m zC82}P0J6dWIb_*vd;)mT5C{Yn1WZA9KpC^k5FF{R?vc^4!p@6J(*|Gw8vBpu@ zCNVIp<-)ZXfnWu0w=fk%zTR#;qSMA$L7Ro)FW?EP*!w044!)})X_>ZQ8iE(>ZI&Z= z_?G=tU03wXr~WicZX4GCkl_&FPUN#qJ`G0!eF=WIvT8*z(}iVMG)S0N58{i$s@4Ka z@c1JTi(~FcxDCtRzXN}q*(w788BXIxI|B_3mtD2tkLNE&_S5U_;eE6mnbU3kV(NVW zJ`OY#=*F*y{|2kQ|EDsGZ0g`P8iMgo`*fo60(#mIP>1}scF$yQZ_F@Lx1gsl!Q$D3 zTrHC~iSM5Sc8GU8Q0<2jemjKyA*8;h_55V*jAg6pGRMYlyeh#rvF^=U6~3F-9M@c80Oh{jF6q9YOZD6iP?4BUvX1tY2Z`5ng zVg>x%)dt?b#e~ONGMHL|%{#E;Bd>UEoofB&8McsGDMg59R}P!@)7&5DU_s|7&Z-uc0om`MTZu3?^tFzt|A^^= z%0Q~bXPk_p<&Jg9L-$_Zhk|UT%KjM(_WP#H{Yv`8h+K!leUXfJ5Pu$T%kRxA|KVns zj2)J3Oi7x1J55i|q6()T8qB_Ee9ds5()zJxH&7ic$t}X3`=n=pT2rG>dxJ+()|_c` zbJO|h{lwhR*7fG~-OmbYxxF;2pM`1YDL1z$Jc}Z}VJw($=hd`9%&7hh^TUu7JW` z*L><0ECXTnJlk*ULg+~VV0m+`PhEdi=jAa>XU_*78oN)cK-+Np3hdncQ`xuh=l~qj zHCzf_B!s~w0c}%uy~%x5&0*gjk(Xz7L>b%w`QJ&KNkD$!Q42i<834Yi8D#W;1%(59 z2=I0b2p>kOEv7lvLMxcD*(Z6}~J;}9b!fJph2)PJu^v%nb6 zPdKvX58!bgJNM9oY6mWf9v8>U+O?jKUmjY?fp{%K({rCmw*k}SNNV0SUnP8{`jdd!ar9}n}S48%J z4zC4o#5fO0=+lXeK#;}I#~~!O59^t*NZK84UcKFPJmvu$Xf)AiuSZ-NnuciA3QG1? znzsr|OTOtdG}^r z#JvHeZ6Ede@AA2o=N$iV8`0%>oWG>7_75F@x$=}77hZ%n0=L}xX)>a0TnLdTLavaem0JpE$OC#79YC{Ig-W1p0V5Y_6-Gv1t3h{&2i$5da1+XGPZH_=tnXVYVzV0 z*@qP&{;wsXq@;vbg~)pATr4@HJ{KwwZ)uc>Jt-<}-9mIjLf;57YMsDioa`)ZfC|?- zV?8V^3^JeMv|c-yu(t!<&=DXqP7u7@*OprZNzx&@5=gpYs8!tapat4(kR;LWGise$ zzzl(s|FxiC@q;YQGhqXy>m)D|CmcH-QuvyR0;(C!A!}qkgX5|j45eU!2I$QG+w?(X znuv#^iubSqs$9$XciSgm;oy$Uvdw+Mf`0) zpjW`pMFXptZhmXBdJ452H_A5K(@kfv~`?g-6LDP#a6bS|8Xk5<0Kf zL2GsZY5#?q8UW_8z{p3w>*KOicl+uU3jZGwq#}_*?9Ci(AG&-!?n5Z1s^j#LI1?9T&wix&!st@zwphn+;;ggK; zOW(Wq47w>iW}OlvE{9?TkTwUYnpE!MyEhslRprbAde2v&T=46Jx0N;l-{u{`{GR{`Je>4I#i3K%?-Q=UU;wl^Zs9$f z>Nzm1frjdAZ+_bs+7&`x-k%Of3vHUT8T@5_*B%fJ#8XgHTU2^j2nsfetj&m)&71ro zHE8^vpWsti!u}+VYcA33iu|+8Ifs!~V7k-y>v{F7RQoct-GfK9U3$QVKQR&aI)W^E z({$DURl(SeOe2)QwPF(K22BOrj_lnH;lZ=TYu&m6*BA~}C$staLZ9;ICSgPe5&2Om zOIvKD^Rf8_J!zcH@iLmd;^-vOWPC%R@jhr5p{*s^*vCHN@n5nLtYKG}S*zl4IS`0| zeCDr+AR~n6P?I9D#us7IyaM_s6+b==?=6SQn2_g&=2}}Ip1*n}tY1W?C~x+nB}Y|6 zj5aG?S=A*{%MCZ9M=FXF2aFi<2a4<;==!FDm-aKYV%GO&_dMT@=MpG0Kma0Eqed}K z*MK7|8}#aw?>2=21p=aveB?0x-sG8>W5Xih>~%>40T}lLUz6$RajL5s$_*+^?Mp*S zo9dHs-{LbLai4l$Id5S?+YTfLs?_Fu47&fY%Fu%tI?znTpWkgT?<;%Uf za85JRx-aM_R$oDOquqj z@NDOe4bwX4t(dCRYZ?6MVOy^M(rv$;m+twet487Wdl-7$e6OKZ zu5&>aB~xedN5$6bm>yZ{;rTTBxHlnhuW0(xxW$oY{2DT?*7M-{tGy!Hl6l|if75|2 z_p$m}PM-9fg(ojIYI1bXzmE-%RXP5s*DF_jeW2dGAQ8hBD!1>*;A}I$H6dkSfF~8Y+Ve#WrBAQYY!+?o+tk$fYtwrIdd0 z&WUV1c28cWiVK&%GA*}na#Ar}JcB2TU_>cJ(){Js$s8WZJ(Ka9ddEIh*?LW2Rs5-E zxb~5yY2Lw05Rze$)4}c{!AWuik*+4>p{88w13N217d0Ytp;r-CpqHXfJjXnGbK%Gl zesEFifKySca(pGk5G$V4p8f6E>Rp0z2Yr|T0vDYQ@T=nqdRLMBk3U4g%9U;g4=Ww! zQ?($$5sd*^R4PHo&(nK?>+5T4%rNZf)iSZ=AI;Hxw_hBOXGY&L?-@cr4gyIN5k?_I ziBu~>*!>3k+t7)Hu|6#ki_j~kNNQCwFzp!60C9VK9Uhj70j|$@jjjOxg>1ApGXKY8 z!PPS;b$Etfr{s)!kWRVJM@9s2C{5S?{li9q*@hl$v$+q;N~_wnK-hOPPFZZ#?7%U<^|I_bfOuq!{ zN>@)3Iyck{OlK3{S*rLhNQK>EB3cd0Mz__UGFnnrZD9gONtL~WL7cP5{K%6VBOh@y zli}7dGrDchn})l)yUHUPWNQotPXucdp##9b`X1hrR^2^uwAfy2%CUZ0Rh^`%{_ak+ znwFLvJB^ga8^ZDHS-FhL`_gpDVtNNzPxj4~SLDc*5OQ0T<b3PbWf`61Y}T3-U01Yf|tYHLSy5 zU(?mVy0JqoL^AuujiU!gn)5vG*u=BIzgT1j-nEu*z`NM9=N zll)du-^bLo7Y)c?NOs2M<+zn7hYPQ}vdZanD!e2=z64nYsU*HKq&R(cB22MaeU z`a9;o-(C5+J(T_=kftaBoS3OcN5m!WS2TupJiJHE_-#Mn*%06F(_~bTBTaybH!`xk z0WSxR872aH<{P*bZ8Tm#siP$c0@9B$qk^+W4jW;E96C>Ww0HKkO2$q}skH4jL3r~c z!W(lX0(DfJh{Bw8A!M>wH&N)-T+3K4MdOlDft#X?fJcANHhQwZeheMNHV_*uY;C_l z!~m51qf+x}FVY8uH>SJ~^?t6o!}vDz*uuT#!^?1eFd1#v?BT)n1uL_-IEK@ERbCfh zRsa%x`PqNzx${4c^nPKjVc}baoZTv$Ae*8`Ydor4f|~?sCLp(faX5Y3(H3B9IRu^d zpSwo{2*H~E$w9=t>iythCnP5pNc$nd@k#is3j80_?5fK?LP;_Cp3|toxAkB{7Yl3* z?0T+OZ0Ik{52=v44!9jz!wnC8?Ex_Cxsv6h!TY@V|2Lj)3Hx_o105I~89EX;6O4HQ zqW?Pap!inDJNhLpeqVL)UgW$ItFc)=Eq~}U7T%2;JVxEjO}KJ=Er;}-jis{6af;c6 z{PAsA9V@s$ktN?3oYHZdKBR{AT_LV!+QYLMxfgkn0sJ zlA(y4WL09gpN}FUzXVB)% zfE-#N%VcicPU$lp3wt#=&Z}7XkR$g;E!aLX*>38UkY}WxeWa)5bL^-|sn|UsJgXE; z42yg{Hi~>^{*tUJ9hb`r5xYTz%06CTdRmpeQiX%xdna^e_gLjVDFGk zLyJ$Lt)sPtk?Zx%-FN=kh}7F5eI!9z>`_ZY?eN7VeRGt#uj9A~ou3Nr{4+IQI&y5= zJps?7dXW2lC1@=16qq7S>>Tmh;GWNpQo>fBq$@!~Xd+@he8uJn-U27Mb6|8#rv*&u zGl6=T80N}U0_y)xEM^>f=)nKTG&u&;J7uhoZ#^Ww`T8nd+U!7}3lL!*-TGG#NnnXm z0tJ{~G5+HmMvhR#@$EO~+W?kkHR3|ZM?~;YW7}9=>G2M%D!h91JcJX`Xr9ih!a@!c zADuk=s2n$YyU$xDFjo%509y1vuz!7lZhXes0@FD*U5L&*nDzz(|L}bN#${AAqQ2}z z5E$2JmscibaMlMuc;FE@m3Qow>f(D{ZD8~<%-hqr{CkoFLhI7jdm4Ucxc{Wh z9?yZRUf;};<(UB0rrS9!e)-O5&$RL@SEMMOpDj6g8g&lkyR${>4Cp%w{Q|4SVZ+3V zsc^uY`t@frJFyRpKboGYmPr1vWxvHP-^h300>Lk8%_VO}Z(*S)yRtPJG~{xfhg2Ca z1?j~cd?h!?HeISDXLM9cYc!0ki|1N1Kh9;un@r+~h|TiG8&Oru@|s@VZNAPgctiU5 zbJ!@xerzt(e5#wE3aizh%YA0}hZr&>-+fq%yKmIX&VFXni%^PQbtXWHBEiThsR+QG2?OykkARMvR+6DcahIc;q!NT3@SY`- zo&lS326{v!)8|`moE|sd4F)g=+>6eAFCdA`IOD@Q}HU0nD+PYMt`0hS1CaSij(oH@sc!*vJL7 z$3tjTpr;^g`oIv0c(`|=Cx_N1NIiT~2FniS6FdWn1vH_Y7e7Ie#M#dxm-jt>^!nB< z_Y-UBj|yADSe%4EM~}?dK=W^{8q47z^!672bqc%a!|DsitM_Op|K4-?WI#S#mlKC+X*Bi-_gkFS+?5+;!W49+ zw%+--E(HEUj)$6G6xOwASxCBgIX-&6juG%vhZ z|NN)icYo~BSF!JarxZRm`)9*@59o76r}K*LDosZ)UMqe1;yR`1rVq=!Teu)soFC;Sq(T->FGFAld6?kkK0%yDNfSuD!i|Hf~3-`=?80{!Kx_ z%6C0!^w5iRxe$qCRA^e?-U&gRIx@i^UXW(j=C0?RZD_`V_c-j(|eEU#Hvm^sS{A4=xbQ?`nF z-jc026uyBlI2bAcwuOV+GWEZ<0Ghf1_7G@7p~d7J}}_HMnq-cmWdv9gUKB*m|z8aHrmt)SV0(*=6OTx z=Dn65Ygp8s7o4r=uI7CQHWP2q3p$UBTE&POWc|kRTbJBKrB!1w>r~U@+$&P)KHF+1 z_!P6_rG?oe>Baa)hSfsHkq_BBG9Nlb)O-Eq+_3sS!+%@(FRF3oO`vb96j zr!y+OXxjUT_i?LFXhE`8aI7nPqa0qEl8^RQ0>W7eh3WjN`92OYwe+>-gY0CXFKGUq{Tg~saHAyy$j~$;6d9B?(YM~sQ z8~KExzd0`hIkW2y3nGq5VP-sEEotGrqK4zXaWA2IU)q&DSkqcg7 z2t?Kz<>am%NBPeWT)6P>tgn`Be{WTxeXqXCefX zcvbG)-to?{*Vn2jTWtnH2iU8_Z115->T@@jcHO~%?K4hb)7t+<{&b=U3NbW=eQ$6Q zE<+~X+AnKiCIhHX=!o@0SR4ae8qleNlp!lhQ;Q#aO&)CNP|MlM_R=;39R&G6Ga^E<4y;|X3y4?-Mr_B+{H7U@3G8^ zkO%+j3k-=`HRqU-_$lF=C24{zZ-Wi1M;4L(<;bXnd!tIb=BVdp@t|Fj4wMQ`56ghV zoS6%lcQ^m;t-gN>i-RVkwd44}6^|b|(C?W(H;|X~wsF6cnWJTSNTt}~jdf0KL8Nu= zwUr2G^pf;+>?QsbKU_whD`~whI5+vo%R@{>9poXTCAY(0Q)8JcdaB^q{`2wo6T;oA z`WZMyBRGgKns6f&-;Ku1GPZ!ix2k?rMF}wG4w37B`}uFWcsaa2K3hdnw8T_rDKIgC<11rU88vhGZ zN;^YaP<6n*>IefFAby+(o(_W?wFGe0}mom(c!zc+QIB&=8XMpZq1}p=Z0n!BsH}IFeny{%r z`+KiBqKE6aT>78oQvJZUQ0(`>CB6JT z8WhbBx`koy3_Lar50=IPwGr*-5r@j^P7Pwue&^)8(zkgaNcA@J-XA3lu1yhbWZ>0y zLHvEw-8(22kvKVQx&n7cEk~sH=7PP=#yepHL#t{VVIJXqaT&e~{H`=oVNx_Oo3+(E-#=x4)@UI3l5hm(U??s^Y*5PRxcA2wYkIuX2FfP$# zrAlnYaMT{w#=&cpS#c}vO5*wcx9RPkHmc3_nn2qTiFFq}+J8I`(8jRkf5#>52UHz1 zCI)t?AEpogsNQ^12Vj&A-z>h-CY82Xn+-a1At~}ua>Q1n=0>_PZ#S1!Nb*5#oWI2w zS%_gua1xb%>I3?|en-`h*Ke|p3Xx(b_XU}`GVxr2_!@U!HgmheGp1kpI(%A!qK(CA z@?0f5hAa;3@{-Re9Bq>snHktPqBD*(pQGMVeo~k=bu_w%$erC?gPGaclX~UIbSBPe zWjFSg+Yicmc}b$vsg}NH2#1?BGR>0WQJ-EfYHeIqZdCZw(^_sTW+NhFR~QYKw`}I7 zs_Navg}HqXmPD>QdfQJ%oQVgrb84xjN4ON?LXVFV=Wqv<4 zWxg?I)t#5Rk#`kotANTDCY9A71}5I@WL2&a2qCU`@vk#S+ga+pDj`WCW}u{O5RuU& z{=bQv`H1Iq1TYo|*F&5|fF2!i*d3cWj8t3=3S<&a66d+>$9ERozj|-~%u9We=Y9x# zI#17WiryGDtu%&xSj`XX-}@fru&n?8Db{@|?q5Maw9Iu=0* zc|Y6Cam~_S(M}s5pAWN;dG4ap5$*Y>0!#|kb^kOP*NRjZ|GiYk64l3#x7~Zj{H|vn z2H6rxtF|4Uws*DPOXpJ6xUD!O5fpmu+QQO8FU4ld@^1eS^w#= zZu(nh^jz2fjhUIB7!JvWG3}+Se+>kE|0q4&aoocdhny~Y_pLnwv}&2Y7}d*zmh6r=Vilm<&Me!jQn;OGcmQ9dq@C%QTgK$(E|a> zfX(t=Y@2J4q6zu(t8!SgFy&Do1YXd-Wqo}P&;+Bpm2d|#b86GP>N7%#7~zqxL*7!@ zS%&I}a91FCJT56L(ny1&7CXmCMX8Ug*NS?tMt4*}5Z?(mr*Z2}T z$lpw=)HyuKr0;5Ue{VX7;mL;7Udmm&SMNCR*=W;^g(3!NoRyhrDd;@5nTYsl?)`gG zsm#_{?}3%p!Z^)baFiuuh*sb*(aMzpE(z7Q!9;MoOf(}_?5QX39AGbgtbU8#SX8o^ zoVDbmD~lcWLi4ZOpzK6H9Af&1Sp5_ww)vSlnF0;`4=8%o-$vHbC{x6U(if@5l09>C z<4=}l;`;I4%UA3|_wKFm?(XYk#%rB%49DKR*oK*>s~F))Fm#WLm1wi#~N{4QaK< z&Z2^}D@X0VA2B}v-;kvD#Nwl4zu#QiVf$>4;!@Lmmzyx2q~-8+NSHlJ;Z#^mqNX)C z*b^ct?y?}$-1zfNM2t|fjZ+dm(oBhCG_3m=_uWxVr zh;M&mlJ9R(lGjpKz#2HnW~m$tpJHIjP|&PJMx@^xtL32@zzU%VGX2O-5yNMf(r-qh zK(Qo}&P`_+p5QlJyB$52#l>*&f6 zp6be5?uko@laG>Z#m*%mGhsDM=0jTMELwmw-zd=sq>AXC@VR}o?-LCBBg>5z);Zt4 z-BKKR#2$AxA!36vej3gsxDi(I4e|BkY=E^@dK@>}{^{fKtI=}R_rn?rOG#^UC z2;p?cnpCS>$X1L(+tC2dGCeG4Jf#U&l?R zB~8Nb_pBTO&|eUs(AzQIw`*SuAeO_h@sx*WVe zZ_$%~F6n!Uk9}iJ2!WV$eN}X=Yg0z`*ZhHDB4e;6p~XL8Nd=y%rVX+7Xg@S@@_$dw zJMFSE|If$5i9*c&-=7vVo?ag3PF0l0oi4o6AY0fP!E-^RnX5@}-ti`?^m5lxxS7oy z7QlAzj-H@{#PP3L86VY}f^*|XzoO1vnD|pqc&`r+XE(p?tC_;vKBXl?Jv-$e#SLwl2 z0>ajRH|~sSCZKL7s?&-^to2)bee&lu$+Ue!;@Am z_|3Vy`}s4Yn$tgWPrB=jD>BR`s{9rl>d}m2cp6f5%9f+`O@(@YXqWC5``6u|XGqv=9y)}a5 zJ+HI6#7N*u6t?F9~Z^Wc*3Fh01k4?L4UL#a) z{=I!Wcc)Idd-QngRK}O4!a*YBpzn5E>qXUhdFo}n{HbHd7jOFbb9aXuJ+-RCvnH#N z!zx=*SMQanO-y)tEH873e!4fx(M(zR-GbF;5ZJt-_Wz9At^51nef6Y!23ck6kxX&DnhY)QNs&S9#H^zHL zB3;6&&GwWu>yctJ;%g+~ogN+qtgbPGRcBw92M>&=p2tB1&6t%@*2=1Fb?9z1O7Xc2 zcIb`JBP<_EFR_3sCB?2gHM_eO$1{2%(eTmOY3*?j4-LhBOnjpDOW7+GM|y}$o#ZhA#xGh# z%x1r?VE`h(LWJgH=3|`CG`QKP=j0sUk}DDLlPV@@6dIpuJpT5?W96hed@D_j^Buut zYR_^GF!v-@5}Ml)aNUKQ32$pSdeJu>uMS|DGlmxmlgCi>_;ymdw{(y6&CDm+?-oZW zZGYoG>Gft3&s$(Sj1c;=(W-VgVAE@4$u%@IzbQX7Gda=78nO0)BDF=;h7wR=tB~?sP7yL=;|rLTS<90#lBkaGXqoHhj^vuj@-$)4mEY@ zh{hqRLcu3=1Xm#_^1atuPYR1Mvr?DgEz$c!cY8~YD^-t8tAGrUS@>!!mPUDn4Nr0C zI`);TfkOLr*a2C;`Rtm6 z3Ih^*jG5&`T1kTU!eOIPUe(Qu#mpC=|N6@8I^UZj76<0%B4Nfls!t!-RA=6`xO&E1 zMe6fwX}d8#iAwg-nc-l_L0MQwq6PEU0&coZBnD)n@+-JB9u7_|Svv$o1yhjr@-znM zO!8p$TYXu*dSC6u3zf$tKbL;f;?5lMJJcZKE8ID6M@GV?5|{chB3nW?HAI3A`X55P z3E?KKQS+{q?+;suu3vqmIPm9+hVCH$U=~X+@pXc2SCi}yF){F-Jyp{P@FXyR4MkoG z|LQIygJCk`?(T5$dW8V~{_TC{=S0DUKyuc${kOqtU;(oP4sv*w5?x z^xDSerN=%+_3%%zqJ?gAera~$Pl!>zoc#7=Sx%P9F1iKStHc)fQVVhA2Cf?v32DC% zTgAJb$ES+oO znDUvD(*3^m2ZAi2M@IrtRKk?1bj;nGfbF{CBi`Ug%Q-9(N%ON6kxjk*Blrm$>%O8Q zGh*o@W|&j;BL$*2x;0Ln5_B`_Om3AE%!pvpN1kT@87W(j2EI?s{-qlJSlv^^?Th`dyKhz z^X;qDlm|jA{QlC@EA4a2Q7>LN_?SxRiwJy5A}V!1o-Ztz*}Rp=d!$DmDQS+^Y(JtO zGZ31CU9VFW!g(Qmk=1|vvBM-^8Z{ALv!0J-BDDO) znxpkE8BZ=Qn{sFyzf^JUhHQQ@Or#Xz;1Ws94YvH680NoLB-I+S_UDOe0d60iq;s|B z594=~pMwy3Z&e0)ag}LyE2n=aXK~6oCAQ&SYuwmQ(`IhG@^RAK{ms*DRwYY2g@J{m z-TBO4yC$veoqvAMAH<|4zUSwN^2?pIwz_Y4RnYYx`L2UQ1##ryf@y4A9G5DWOPWju zzWKPkv?RaciyD2H?0Acp?}Q7N8XlIWyX47t6$k9|S;Mkt4%~ZP*7c9h6~7{$bCFAE zJf29ttD$itQPT`T(_3Jxahn+K#R=JxU#qGL?`CC7TUm4~kw{}I-g+%Qj<3o8$LA{g zdipeEwQ6dqs-*?F{OD%z`F`b>TzLO!C(z}NKs8CE($ae4ccWU%UCL{s1zE#P!V5yl zv`PxgAw&cDhj-P7UR~eo7ShJujC}zy z^e2ptd(C5ci${4PS5w+{QhBZl+o;&=9o`Jf&tdgBbFpr4xn7@(DLMC#Ax{7oal=f6 z++l^$kkZe;Up+b;0}=m@+k)n^l8mbQoWi74pyg!-;lY>ebq-?11{I9v2=Z*(cig*N zmM-4i1U6q%@EVXgYco;{bN6XU>BATltaZ(aZHK`FZH0Ciw25z%gi zNFsuyS6Kg*tdvyRrw=RrPg?mT9A*zs9o~vm=yAM{meo)f;o$d|z-Z*{JI55+-SvA` z!z9M*oeQ(e=?Kb~{F-p*Lc<$*adkPqt>ALRWoDVIRekES7;l`HqDVu?^cIW7tyMkd z|7^@Uy!rp=dJCv5*KTW=5CjAf0V#_W4l7y9$eTj_pFb?Uq3RPJMGJdlPyW`Hx?}CF zffmx|vY%U;9=;~&*ebCu~E(?jV`vC76qws46Dx#MO&6Yp>}aI?p}o5Q|s z#LOI&b?pnsDya=_Q>bCoB_0gbQN=DA8!72Q-vhi5SLLSWw@^s$&Q4stXXm)7)EL93 z=%g9q^x9W-gx#8uu!-51aHtX22h*RRBS*PQQBk=REh%Uu^KAJ^nnh`MNuCH32Z5Zj zlJ3aOFeq+@5>G%p2NbcJ^z>m-QGp+lt}Qwf;9_P9sfCWOrInT4=uVy6a?MFf5@Ab2 z!^0D``tC&I(>V{wOxWIj$zRp8=8>R{;TcKG_;*NVP49a+vVV5S_1Tu$*jNlv zV2N`=cl>bR*3Z7UxN*8Z7&vb;_TnU1Co*&8(mU$;V?JE7d!{F30*g!~BhmH!%pX#? z%^ou|CznX#wsbrzd7uy=6(-9U6{Cu#%^|L?xQjxHN)u>N#jcd=%NbBD}%ArWM_Qv+P%SNkW{3SKh`(nX}?ay`+^6opY$pQL;*V z!=O_7BQ^{r=JDrzg8KURX|43+o^lAFn%Vs@vwNMIy0@@uVbtFu%5{R3D93UbRhL0j z^qm3CLmdy{AdBlHw%r@hW9zi*#2EFR%dAS5m1sw?#fp$}^D_DB3pVYs{e?JCZx4K zz@2Ou9Ww78&(J`;xDj%jXLjdI>AVED@hYAlkK8ae+K3v>ialf>=TYzJuy?q{?_A>Jl2VOV%lU!29G$V}bjhP14 z-Dc+aEW8$d+26Hm-w#vYrS-wSBsu&s*I$#&a|;M6l6^*I>jVf@3nUluCW8$WrH6IC z(9?y_gtW~&`&kTpA9`r5OX+Vo^JY6KlN@_XPsfHNE5#>EQC&T>cd;pz+1#d_EA(>; zBll4(Abv&FPp%3#GjMFmDZrBeUOq zA805jqQ+~wq%6&sgZo&DLy|zh1&5V<^PxkB9h578GJo&WgKVws}#QHAD7(! z*Q0&K-z)4aBkFzrC8%TmC6{xLBNJA1c=WeP{a&H9HW5m)uw+_8k`!K9E~17aE`nIU zkJhD)f?@t|Ci4b>*g=--ATL2fz;PYg(>Z@K2LfU$gmxKGDK%Hyjvy<>3 zH#R1DhHcJ*K{wTqD=|?d&olm#P>UEw<_aD*Jr}h1(Xo>Z=uez{tJKcvZoArBQ4vXr z>~DN4)3rD}C9L{ck)Dke5-(yd*eLx1%lSZ*;FsmCcezol zvN?vMYDs-KGns-JrnFf$W#8*72_Bn=*~o#c5X)4X;#wtjQ*Xa8w+;ufiZZH;aMe|V zk}6S*PdPgY<`p?9JU9d^)smQBbSuYuUJY@RFe;8K24rO%oOrQ6zb-=cL6`i^)Fl8;rezf{8$SO7!Wa(32x+^k}4sBgmXuz6rc2g{X zZ!Dp*^et^aP0?t1DoZHU&rVFJZhrOQ;3ZnpW|g&j`8UYjCq2BM4|W*wuq!FjHjN}N zPk1%aF#YpVR5N;KJ-*3j^<&<~M)>XjHBkO}tX(sIW-V&ATl%@&^@e|${!|dXt*Cwl zbhPZfn~$m!CYvSMBG5{-)IBG9`@E0MWRKT`2LF)7j(Vcq$&I2<>yL|GA~NIsn86|W z))z;OgG>cis&tP7RmHcWPnI%LDZuDRNe*3EDQC8?$`Y?0Q$-5T6iqt6~JR;e;7Wkpg1a^_u{6lM-9(qV~JajrtT{e;p(=H{%q^(UYJR< z&}zz)YI}nD+gg#oE=!Q5C#q>5&V5Wg z^cL>i<*^y#oUB*OIut&cp9Nq0_%45&bl;}s!g0c*v z)DmkXWR3g7pS&{Qr?y2TxgWmTGn3-msl*d0!d#(zIy}6Z z$6M$x;P>{`t4r7C=KCk9h?3ej((~%5l=~1dt(V( zZp@-oj1(70e6v!nFTN>8dmZyYIh;C@FQJv5dTYy`G|e|HGb78_FiS0w95c!w3RQ;{ zZ;)M)JKLs|oP5uQ(SS5fwfl#gTFleBz1l&%_@A%tqwSW;lJdk%hzfj3O=UM#)SsId z)}0zx{j4k>vSurK`^neSv#m_p!YXn%tVNk~XWFs0RnN|v%BDC0tJ z6&a5uQTyG6K8v@8q)_{t2rbFL=3!r5-QNWb?=YyhOl@jwNb0?EPl9iJDI633W}tgF zZAxUpayxQ!gj6IQDptmH8#@}+ht zs>SP{2ykIcC-hpfuIFV&;Z%rFoxG$;GrW#_DTlNWjg%f*l+sd|k{|!Ph9f~vN^c(Y z!-&z%vEVzd$wPWN`uA~5bonl}4n+=8{5C{*rMt4EBLVN5{GVsf&|V-O!BmL$sq49c ztRA^@kxAzb@U)_UK4G`>3mz~vLh;v+FX(NTO=at>~9@ znT(n4uWG|oD}632Qt~A_NTQ(+-0KFc<=~rwQE@xmnD|SfZELp}q@Er@<*kKoB$)^E z-?$u7P0SEzo(%zJV8j8oJl=inYG>>0Q>2*?WZ|~lYYXe{T$mAprw}pVbdE}F=GLFm!6yWc)NkX96HJ_x3 zee1H{&HVh&jT`Binb>l}f!odRKZXS|sQ9E!Eq<=+m)5lw@z2vn{jP|~lx(%RGSX+| zO>+&0hQ&OKXM%zVw}~c0d+d`qEh%%*Q#@?x!i{&s4<_0BBqg`I6&KQs=5Ryy-RG9Z zxndv9w{i&cMRu}M$vCIHWnm-jnedJuUh@m3A%pX--!LX^cGq3ogcI#cdU|=K{tL2q z_Q~~87tU0i+*w&_L_l80&&wp~$|r8Q#lj4aX!$0aR>qf6Tvuc6I1J`m=F~?gbgxEU z6&$}2B5yhprLugAS^1k;9alDxf8>ynL;mU3nq;Nt)?QR;<5h{}-Ca^t@0{vOJ|_Ee z4XN?bL^aA}zSa!+(exm2*f$aSidl19GS{!?W=NLq#C?v2VT%2vfW~r?VQwYdRJVur zebUBypXtQqq~yMRwM&0GCys4$rYV`~r-t#2OXU+?Nxe}NW7^APhH=lLCWY@@jp4m(^$$<7><7}XF# zqMKIpKNL!-jd(5{Qz)~|7gA65;G6X(*~;S+m0ua;ek3b<&$061rhBdtyLkKqee}8q z)N+kJ#I8H8o2_m0Z{DIyB{MCh=Ot6=e`ZS&tO@e9AypG6ml7Xb<>X9)>@fr*{gQn- z{lk?kV@6#34K>Ez_Y_!JjY!K4KHPEt9XT1^$r{suK`X7uZimuzZ06YA%+Xc1^`n^c z0P6!P)2nOobI#S#qMm}HiJ^cDp$pLIiFk8xFs^A&+#^sm19BZ>Gqc2P@0UbyG(1~B zxWszCKh1gaW9*sEiKA@(yG7qvMMt(*3N}Gb+wv@<7<}_}C#*!hmHNguTMW{Nv(3-F zgqi$!geVxh-aJ*2ui-kWN)6pRtZ-A|go&E%c{^xtfz!!5>Y!AAa5dp@f{%tP!Mi$( z@BDBGPAt^PsikX(QvF zQlFP;{C)|Ns`-*+PdnZO+_B2&>C=_sxTnN{+Z6LcF?06qfq=^Jf!A=$vA@hF(iL~iuu--s{iNAO#6+(&cM(T!`R9%4ePtCk#FzO1h&mL z=2mWIuuib@Rax}?w3Xn)g^dL{lDK7uAGZ3E?4c`dE^ra7apSVXL;5ajMUY*cc^Q)TxgV5Tk1c2=96eBQ_`qE!#QNI3zVYj>w1$IBzJ~te@}2K@4^K|R znVCZ`8%+|iU}a`5?V8zWxVl@Sh4zSU4-#vV`KE18zq>=LBBG_*R5bb3--sgFU}zct z{PDmS9e0yo$xBp3R(lV)hx7PzUvaLQCme9>)MiHYe7DB9%UzswU9gVl&bUhUVZ|zO zN0#&F`H&0)Yf?;`;SiR`$;mxBj?$6wnJ+Y+Hgqu z805q}DlIn&DG62iBpmPgW0(?S$f^F0j(+sOfs+;!pFUe!@brbrfS6Fo+qMvzyL7*T zchuD{BEuI>X51~h7uW1Z+3s~y5v`;(H_OnKp4b@)Dqp6vlQDD{njI~By%M?^yHa$R zZ@U}Bs6w0KXo1t)MfO!r!8*iA8KqCyo-ylj!Cn^;j@DtH6h~!`a;J|9NQMm#DXFqF z6;$Gs5*OnvT?;-As?R$Ys4WTz|4r#LZf!D0HoM0DQEkz3SnWAPzHB0|C~|bszZ=^4 zrRYSKdR$J>S7WebxFyXZrmW1v-7R`lDK$0CVL!KctoocKqIT zczbE~IyHUpDdVD(D$c&b6$Rx6kz#p4Fo24>HahL?x>T=f_EJQHyM>O6>Se1VN|M84 zzQ4WKVitw7VsGwOotRnCv(|Uz?@m zuPXRC2M0*wB72i2P#Mz_v1$LbuYGF&uGI8&QdL*tKLL!uD91Ji_Pq#d&OiR%zux}p zy&f#|cy7r`={U4_LFr^A3qO4tZZxf2#{tTv8gDneKc9?(ssL(eoT_9s;WgO?tzInP= zlDuH)Ki~Hzg2Se*Zf{ucUuS>!d1=c4#s3qFnQBWJi)pN3wU(wM1I`dr@~WVu?Nw(( z=2xL7PH1sK*#10hsW#*p{;|F__ED&clZ$)TR?WeUinj0mq$8Xbwi{cvIgnNUy)NJP z$J4fl3i4=!w;^w0IuUb4&QbG}{HT7jlU>3y$KN;G)I6@1@-{DVA37>XW4;;GA;P`+ z(B@pU*@9k~jZDU7Bf;2gH_$2axxirv9MKn18iq#C-)j}DF`f^YwecSc6%%_a1bhgh zht-ji_cr3!ch0`=Q)iRn@=sQM4a>CIHd@YW)Eh@m&GN9ipgiM>%VXx3^KJ6l*BtK2 zbGpc`kPNN}e!3&3s>E)eTtVb+j!qh;@@?@`w%vryv3__ z?TW0j{X0s68s!+jw`pW`Q&+uWl6Xn7m2fczRoHR+h)9_7Znomq-Bjhm8XjLSde*ic zfl8L=(kol%v}+Pf71JAo&!>2DG=4KHla8ZD&cWzP~-IH8CzJ z3BLk7c3*nazI%M9j6sR6bkPZ0l^(}dVky!RqA@a!SMMcQ1PzER#HkRyrn1NkrVsFQf$xD`&8vpWy`AJ3&aDqdHxz47LQ2v#qTScsd+3I)!GXuiVt07c@C8tiA+Yxka>ZQJG-J8qy}uhC-}YsSSZY+ZJ# zCYAeK|3>`O@zIt$ps_}br)~DDb{NxDmT2h5ySI3Lot)J$Ttq&^Ap%9B=L)4NPrI0d4F$OJP zBB1R}_uu$_Qfu_elUn2jd&+PSVdZ`7Q??ScK+ioxmu?^2^c6v#ws+fKr>ACyT||F& z{&85QSbih}aJCR??66`mEwCT$^mN_2EAWPeUSC32IqYq~?!v&8whwVjQiDcf0nc)r z5~s7Ev>>978!vx!oEiOklFLR}fcfrHzq3g(6m|X$v)Svd^nA)C6k#rI{laM#eDXq^ z8-ON@7iW-uZB=BO`p32^0RpJt`t;FbK>V8(+j7&NW7a^Y;_5ga<#3#gC?Be)$-K1|PP$5aB@Vwcb*aou6qk4pF@HZ=3nsuM$osQi^I<8*k5p|AEka9pE66hVfy@|CzBW@&X|@8VNn zW0SweNlOca>A@P(*H%#am8pMc+WJqrf;u% z2E3FK3w1NGLRPuQ|4ProH||F&DIjfwOju z9m++;#lRoa^Cwcz{Y_0xjoQmcFOHF2YUBom_iSvTm#JJ)3eZBKIGtWdC>9yu$Vh2D zJu2YCvvlg(ZV%y`BJEc|o?rTJd0PA8cA;St=GmXf`U1yAd9;@ekJi+|Kmt2-dna4H zEU2#e8#W(3fj0~+?l|3_R)DTv0}K-DNL^<#6d>_@_x-GeME{ZjDB2Tr)*sAWL8&`k zvqiT9z7eP@mVgHTG>hw4mk=_DmX?;D!yZ0p!Oj8ZzOP>;K%k9LGYp72Pq5!4uQhD+ZO{;VAf0Z=g%MHvcSAUf|BTcR#~j4 zLpP z=%RxBD~QvjuufOI*v1}%z#yW!W9bGwbUZvf|9Q>LMX~c}IF(qdmTpmbpV-5my0u^t z$7f503})XdaBiS)et#N@S^%nFX5;lR^h7sqe29vAXk>H?h+2_>9@Y02nTz}UAY`s; zB~NI>Hxv{#kY~T6QQ!mIHEHtk9U!7dP}n_Mf3_P4%ab|i?c4ZWxIymO0Ycerruq0W z4*at#P9PlkCfmkLK^sptK{y)Zrel45(dZQtWb^fEZ~0GL>7Ru4Tm1a@K*o00kIvCt z?KW7}D6YV|SqXeL@%u?fNA6T^KM4}Njw~3CU4IXx_Uz3r7EG^vjT}>!Mo1b#RsmXY zOt(OvOu9sHROhY z4BfEN7lR=_H!3a;w}Dt)rx8dhdhopuB!NbQk%`H$KSc`Rq5#6bAZXkG%50!Dg*?Hp zxI&xBDnd+CV7Ml%3EI;t@Kc}FFT~w>&S!6Lj|hq&OfLkT=OEd{{$lSL$cwlxM4Lqk zyK#b+;yi3z@@@XE)0xx1lx;w`t=E8#b%DMow(pe3>*kIFN7_*yw5zQyw5$saE*7l zuFC^8nhZ#p0&~sth`Tx!VPK+!yaNRXVaYMEvMwO6ob3b=&#ri(NGPIn4%gJuDm20X zHF6i(y!7IWEFTMuBSZ+K0_r&gB1Ljj)pAE15Y7|K6FLcMY z!QPL@AB5(7)ExX7gYIMV%XGFCvzUwMN%7bgy%gACpFaKSI<9~=`ZAlz4p19<^!RZQ z>40b5#YEk?V?30hgrf7jUkU}$`pYfLg?2KqQl`s8neohO2pt<#gaXB$eVsm-0GUWu zCtq;EnWWl)Ha&t>_c81ZWWa#G@+olaS4^%4HgIa}m+04fA)5%~ae4S=hgKzt1Oge*u`8!@he-_-?l7qEIz4bDyuq1OH-vL@(cBB0bj z92Dam7rK&xKN1`Be4hFoAtwXM9{$CGNIH7@BA_A%^N8@Cf@G7!b^5Q1y%?kd4!6@R z{`5)W3q*GTg~8{%ym!Od>Re9CDljG5CXUYP$nE2kTun^q1OxzSF6 zmvzbKz+mi->Tf6(h-jeY#)dDYq)7A{sMyfDsnZAv38Mv_nBS7HITzi`uUsH+ zAZLB%9f*uFJc_(s_ku$uLcM@5vU3eN0Ja-?(T{}1Die+v z1NJ532en(R6!GL)Q|SuSi^tw4^VB}X6YguJqpt89(M1E3$!XoqbOijMQ6evR)phJK z;7qtF>>36P&kha_aYnKRCMILABM~;+I?rP$h`Xazf^gcG;RJsC^vN)WKF#8ZrsgAH z-2%2P5!>Q`rZKW+YR?@41Gy{EzuyQmc(X8`a;CSV11$*{2HozCp&o!$Op}YnY=Bx3 z)Ro->pzTKMj-Ce5(C0X6-RK-U{_z^{_oBm;nX{M_--2qvEYl z6l`qlo_*N!KD%{1?mOmiG$PLrTyTs**SDT6{`zGPJmBH+@!gX2r%PCR?%7C;q@M#o%KnS`biLzG`*s=WrlwgqXj0gJ12J zsHcG?$a!>p{})J-S@G2H)kK9XRUiykK2F|iqmpo3BAOd;5BUgn*hlaSOm)2>STV37 zupMDzp_=o2;nz`9iy+)Q>bCU);QFo-@fyR!=Z)>g_ZzPA1KYB5-Pvxww1^&5oWs-C zz^Nx+@C;mbB4T2xJH^xcs|J7QB6Yq3<8y;me(gw>=QV*3omb^=z^VNgszH(ZWqzxv z%b>hC?}2dH04PF8NzxM|?`l7Q(SbDzur{4k^WYmR z18b1G9R#j`fgaIrbK71hw4D|OuBA-iWPeSf7r2{ij%dB`(*dV8BeoLUxcrSh=GQ zB&FCM?+JS%syvN z&kscKxKYg#i{E&j-mQm`{jq*5O>+(T4tc-Jp4aR+%0kB{mUt6*I8&f3ADX6|Z3FJ! zH``|DKf3$K^E?s!K({DT9qNTh%3FfP6H|mAz8V^a=+x!LzWNMFCN|0+@*wg5nWCvaJ^?h-YTKv;OLJYADprU4nh!|kWI@Kz;G@b#)IAY)!Jo!0-M_mF90Sy zsOn~pVJ_%zI4_`zL_5aguh(qLqpZV%3j8V`?=-BcUI_f$dakn=iy}62&2M^&V3DDA zD>LcXw-ERA*&KTo)#7v@ehuPbI7f_uqWRt70=dE4pjind|H$CZcFaoVM6&9VbF?&r zrPrctJ3B?|9!qpi=9E%;`1o;3O3K%EJL}N+U1&T86}Znm#RN9sq@eT&5J}ljSv4(w zv;Ga_?r$onj$L$J`nTEz{tffa;aZxT8zA;aRjvs+HywU;1eze$;l=*Cb!o3jq;Bg6 zI+=$uGFHTj9su_$KwSqJ!+5tIecfV!UGedcCUcW4Su29Z)%qv(UqGXz7rt`@c-2<+fbC)**I{4TidNai7( z)HoPmDSP|E?QM7npzFB-n02Mk9xVPXFIE66pw74`*LQXwupY1vBXS=Euj2(fy{z*z zi(8{*2Cm|i>!^X91{4O8vo+g2LONcDzrZ{JwQUy=%~LvMxPb8j{X`QuMQiqcSRs#X zH!HD-FJuO7;Zk6JD=RC3^g05-+cx5$1W>sLf+vCizZ-Wn8eHm+bwQ_;OvL?p^{82| zYBfl8@&IamoKm2VbxZC9O>==r62+sk;}xpOg(}J zsde8C+PxcCbEd&}?_YQOM>rrhA_0p|VDl!~+Wzt=98kcM?6vEJgySM38A_i?c`S$A zL`Ds?J=I=W@?YZ-Z_z z4ILd>Rn_4~7}M%`I=_Xlym|9xQMKXhg7P1s6DMf#^2zYl06Xd6dtk6@p``Slu&)$d z6XxLUx1aCIoZ_I_3bSL5#746YUTjTv?o#|!0w>fvbVMp&K*Y}i|&~yd(|x_ z^HG3su{+jm;pfjNP=(@@dHgtT9^g+#H*cx%JI{p8QS}4fJ>d#iIy_+5tq{xE)!xqG z2)Jo9&r=QzkSWbIyLXjvFqnze8j`#?bUyqJ!qd{M^LxZWA40sNw z1d`aiX$jRwy*FkU!jDs;CVPPOj&(W`+a-+OJsPm$G-=AI_ z;IQSvBmM)v87MH+Ts5&mfPl}Z*JN^V;u_n3{YAk!Vl zMNf+Rr(c?StBb3b{n>YROg!>t@LzB8d_&x7aFC`sTsLRb98vPXmj=;Qe{dz1bK)r! zvFuI%*3$w@fUml~XX)@C5R)sRkez@VQSd$s)QEWh9#M1w#$)7YLI&Y}WEe7=DTG>> z1lHr_wziJcP3)lkYh79cJ@H6b=5HrF^5K5EfBm@aLw>uNdqYmJeXJbo0V8;b>JK?p zyKKDsw=ojA_}|QJzc|DZgM))JR>0Ezm|znUs_u3Ic=?}lQutts%-^Rr{Q3%8DU#&I zjj~E8s0pSPs~dKJ7_W`pe+VgF@y9+QActJZ?dq6a(7r~TAc&9L0?N%vPmo>OU!Mee z^f$n<-5N@*ATExom(Mp6c|q)iyzFyqB*xjy#EFZpy5=h3X0}iGpHb+c|8F4iVqBh+ zJ*p-6&kvEWk|AHc7_f^!s)GOjf`%7g4`jXQVf^nRyB}%aQiTd(YhF%VKSZ*}ZQJzf zP5uVR0JZn_GB7ZtPo9Fx7MxQi;NL?Oo89Zg)gPA(n(Z9^riU&rwRAnmBF6M@`Ysk! zNY!$+hAj_W>b5Cs^dJ@m#MCd5;?q0Z?zIp@piuqv<@tY}d6DX{1au|iH$gf>T31g? z>&JqqzhMcEDB6Jsf)W4kia_}SudE0huNTFuVB~rCp+yg2vis|-UtIOStHHVY!mGD| z+7r5S*y2!{dV-< z)d+b>7A6Upv3L~-WVI#Z(s{8G|8qI4eiNNS8z1<9ec2NtI)u{q@AM9) zWm~GsAi=;mv?g|7x-@$x_MefSdq#Vah{5(ZRMgVyfOqikU8MbQ*nDu^3oT?l z`El{H`4m>$Sa_nPzZLX9ovX>f9MMX@TkZ4G%P;Si;DN!se<#OvUfI;!TPb#Baq^7E z=D0^Sn0d*&^#>8|^6L5WCKHCl{zvr>!?drPn-91~)*ata{zS)8xnsRADjUCbq1<5AlbZebV(cakdp!1Wy`bz= zMI~I`E`2XQ-}bicgpOLx)^9Sa?cYT^p)OC=>WKzd+ag4NY?{Qb@J2=mHMXsPTUTiJ zB9aLF{@)#e=EFiCYVezSz^=CJCL|v77as61|VCUltB~II9 z^+w9Bs`*UbV!Ft>ng~r7;nyGBt~_42D;v8dL*@3z#8-TB%yfiOVXOHoG0Mc*XE9Eg zFpd3w-UjlR$v>nn)8}aU`BS8Y=eql6Bq$1ZbO;L1bA%F%;44b{)8A+n>bgqE>WzPQ zTE%(_G3xtmUI5y4j;dU`%>b`m~4VMhK#b+}FQ=#N%f_W>Q;JUGFD4X!NFysM&0 zZHC-^XFEIYY+2PVz|o`H`fey?9ppIJGq#cc-V^!rvs39<@T6{sxx!C6!6Q0rc|PaZ zTzkl|EVbx}6ejLTjfZEpXu(F?3B%cALvioCDB)Yn9D4e-@8RQzuRJY_$IZQ8PbZp> zT2NQRh`>{2Id7U0h(|r$NCDhb9v%Eb&p{GmzMRa2)J>^f7<4GwC3H$F9LxQ%mqv84J=Ss%a zYuj@1oI!D`Dhpy;>hOCs&FJ4xjZ(uC%orMGi~MZ7fuh;Tr}NMc0}f^}zA$`?f;UbruZq>ISs}Y27P00RlXnaF zj9zrGj4A824@8bS^h$bT&XjHF5Eo9O*WXD?8R!UO8LtQ&?xg-=vvFQ9Qx}U;vAez) zC)*(M>(d>b8e~)=paa5_&UKFyx7>dnvHfBakwZovY$trNEl!m33DR1cF1%^4>pqBW-u-h~^Qf&lbNpBgmWx^Ui`e*_ z`vshIX5QWeuu|h+*cI%A5_Ly?gH^rVz((6!4^J3OIuZ%5p;>#<82B4)N>|_g>q-%N zn=|$6jrybb>t@v^`5w@sB{Owgx;>E#?~E+8vwD&rU7+=cWq4r-k@Fqo>H`2LPX;lKG|rOOxeQ8`aW%$MS+X=jDn|1_^H7B2VZeHoN`6K3j> zdX1jlw47{}c~tl>%!0X=7fj<7jJGtRqewR{Nq#0SVY;)_E4knEyhq4t!Pus5_Bskf z68ZWVgRRrM#81&*;TceqzLW^xA{~ur^Va*hQ`(uj)%}|g(%S49LZ0s1A(8iYe*X%`x%C5Q zGqhaPv;5io2t?kLivA>!)80JkGvdb(y8Xr zXIj1HST^MFt@iYe)XK5BmT2f+<=W~u14WmkZLnau3*#ld#l<-(lBZzq7b*T0XaEiz z#}@S^*6>)#Enk8x4Wu)z*UKT@i^$cU=m2a6AlPMHKIxzJ_(>I<#ovpv4a!R@OX9N4 z&OVGy>o=ElUTN=;O@4mtg<|&2Ql<%W|INYSTB-KS1r()<9ICa;lV5XPxAbhz`>8dz zr%V}yiVKp&z(l-^wXOO21^vDA4C};7HlM@FWUl~fdN{$|B*7$o)7bHV%c$1Qio3@5 zuk4kj+HO$gMvT3jeMhd^m-yB9i~#i;)GZVGbkg4d&ad`83s29_#d0Oi(t{(#qXgC> zY+#4c49?X9;!PaSr>|I3F$jk-gKx<5uipZU?Duu+Al}Hkk9`S^ps~&F!ri1pTDq)} zdk8J+;Bn(euZ_0h6j@J}i7kuXMdzdq(2Tace08Mc$DVQVa0AZFm?Jr>n@ygwu<_nL z$=3IcGp~U*3$mS(x2Y;BR8N;bDt)xpxu0ajWV$Pp8?^B%TR>~na%{?T*xH6#k8*rO ztubDiSX6d$WaLzktlWDaGPPuBZYRhK{F~0!CHwv8 zo}&SW$C7PHl2+%vNXov$XWI#C;}5PpPI#zhic@SVZ;DvQKNC7A$O#$FiaEe(zV}0n z4{d~fC)GQSgd=C1iu|TrNk?zL?}xI@U_otZPFA5?9#O&?n*I#27G&LVDV?aUXKc2D zr^I?u-+CNM$6o6=6e(*KpDZ%04u0*kTMp{@oI5fm^}eTMGkEah&r1%+X40q24^6WG zkcR#n6aWCsZ)Y&%L`W}d?pP1udEQ0$n>?0Kbtr?Je9B-%nykI;R(O1PWO*5ch<(_c zZ<>QX&{B-E+dn?aH;r3Xa^E_A7jHL@_MdHRPi4zD0qj-E4DDVE#_4zQM7^7<_IzIw zj8hhtQ3&LS{kC}1<52yF_kQBy2CQCf41+bRl6-+U%8Dyub!)}}REdEi9tXW_wIqce zgApR>&nKFjT@h>qU`FF)k*~d7J|xPo(1d1qJ%6=pC{T1#S&xio=_uD$=hA((9ZUpf zf^~OdwoJ5e_I{9^Qwx9rL5!IQ0B4~2>(QFOY=uI*BM>Z@Jq5R8aJ}X|AhYJ^BByb$ zh`Jiyxs~?}`f2*J@$&cj6Sn()4IFgSPGcn5b<_$2a9jo0_IpviKYvrcA?9;$4{r5g zt4xk;#Xc{Wdq*w6NQxEFAFY6B9TrB8x8eum%f2^OSFfM4frWaaKmAb45)B|8*UG!s z$Y&dqM`qWI#{xeEKaZa^NKjF{zWHI1GA{ZT6btMtk~)e@0VYh z_61Qh>QASobBi`%B_odk&m7U6`U@~{zH-A)e=9a~rvwE1ATT*rrqk`{P?bo&lB6KZ z!KEZjUfauK(aGl%fgr&0IIjd@&pN`4wVZ&B;sx(JOm`Q}&P6{@TCW)%1I&|86onW5 z84|nFHGQ!6BUe6g%5iiw-dO>lKKLNpN6R5yaogGrSu|8v-g%rQz>}sp)(w21;shOhYBadhegBy9OkA^W4DXpglx>xcW57_ z`tqeDu6=M(XazRHVSaiYwNet|A^tzg-a0JGuIn2fKtQBKM39saR1^e6I+RvIC8bNc zy9Wd$1pxsiB?M{d?v@z3y9OABW{4raJ$m2I`##@)FUR3^z&bjwqz1D9n;bJ>n zuo$q6o@n?QhBDWHTL(7jM(;Ldmuuk4imkRPlDXx#@P<=q`dD}ZFwN=foCyI`eWuTp?C3wRV^h6!1B z5zp5w!} zIrU(Fme5sJhJM4)!9s5(_xtY4`RMAD*PRg?j9H)?BF3E!xz_~DPr%8>DOK1u-!WVd-`vg6* zjgP+Eo>lMj_4%&-%*RfWq1?3(C5ZM3svH-UkvS%9B&pRIxOC(Ip(~pE2X}rTMDt!l zO2~mwl!Sw5Qj+Cg@dz&h&aD)1d=yPgJT>v|)h5tM(y0!J8AeE7NBcf(tOY(nz{Vyd z^M8E1oA7U*^k+PQ%G;|)qcjEbt((i3cfRLQ%m7qgI(s+m7mN!CPR*VKqt3x8D)XBnBINdg@a{FR0RnTcIZf#t@zR3GLcBkyW>fs)>A&n0IBHxk_{Cx6ri z3TXk1pX%vuTdEFJ0tA!WtEJa`F_1^_Zb^hS9wc3*>>l7_j%}55i?)YWJr0FhAxXsuEH|DHh6yNY2>4-c>&p9Ps4NZQE87LWuGkV&Yg@Mm9!|T#r^Er?6 z-)d>~0Gu(^Q+;y|?ex z4&^eeMto=T(ar0-nA%Sqe3JjRnMINo<$}S~AVrH0LU{cp|GU#H<{m`&}Ww%WhK~K6Yt`&v8A$YT7O zB+;qQY6xsn%aHiU`y!`+CDSA6^d|A_kHh*KEjBMlhO_uV&`&;5Rs=3r!|m=!{7-qVukoL>f1sfF?;d(1>1?+!N)zaaigC8 z*K2w{o?IBJLRzv@IjioJa!emu8ByV3(kC@Gh_M1|ynA5Ml@{(3YmgNJNea=icviqM zu}y<`+TD8(;BF|WayyqrB`u4)G3S!QJEPeo@*!`mi2P|>@wJh{CvHO}wibL)so}Kc zOeN~zwOFyOWOL*Z)D;?0tA)-Tx5BBpZxV9WB0Q>-LBe` z>#mj*IWAE5SZAYmh|0@(7B(YKu)6vc(gAm2xW}0jxdawrFDbs63iDnhnpTjn{HW*o zoNjGc{n(-T2&d`{-HK)DR@9f`xVyhY+#%~wyk5J*5AUHH_Rp;^$2{-)l{+0STb@Lh{I4<|g!g58i`&nAv(Lz~4!)$B`di(1yQin+gKSoxRr4W$8 z?-YXxO;iY0U~%15t~a5nWzcC4sDzGKOs+2p^aq_}g&KM39%4(-H~N)@9e`p3UD7XC zr9}b^Rmj!5>LecqU`4nI{#y89V(pc+)UF=blYFVjM^TI`}CiFbjyFjZv?@6-}@s`iXBjNGU=9oBd$MslPj=QB$Mi~5udo5J2 z{BSZ{>=ysfz-GC_`cC3R?JnKBjw9xsxt#ukX~zyKyx#hmNgFul+>f;aq_|beGU}`` z1GbmeXj@XamuS>4JFRq#*jf+z@QhA)Yy*|L&RcdsX*+PxF~|}bikv}aqj@V`2ZfBa zMOVsn$NTl_uolkgi{nS@%0)JJii)9)IIamSPS@>gFv|@KO-fP7eM$W%Xi`HUQrhb?+Jk0!@srK&yO*WFzm%7C$=?m zB&=V1>FV>Yz2uZeW3LU~>#^1H{8-H67nbiCvkxkccJ0iQa6{{h^eYqLPd2-erWM$` z$!wesg@Yuo3O&u$B_Z5(MI2Q=z5w+%cRC#Jb+)NH2emiN>y;L=Gc&!tJ?#;&8tE+! z=n4_)Du6Xnu{G)RZEJ=l+xxQP9;ev;T|jPGUI%1sZ>sD+R1YhSpX*<{kj|7zLKv%T z7jw&UHaxrvn0~dp*9($TptGn<-$yIXFfIUs1Ca(biQiaY^3UJoi2V?@49$cK%%QG& zjA0bT;er3;VMOlLw0sAJ1Z1MpO{6(vY{yG|-G8Q72~}ddCn$Ysua@{e44vW~Nv}>6 zQZqL~{9OAu{J;@**NDHtTnzv6kP-Y#BQNW|njBBE-Xh&w>}iqG+I|&Fn!@zl18R!x zN!ic}o+f?m9=qN&ws^n7GE+s7yJrx&?=$CC0?`zt{H*>?i)&Yv!}?u9aT7&47fqZs z^qr#C#OaLJQ}e%T6A~&bVqD~OdvU%b|3qUKaI@mb(D0Xek%zQ8D)u&?m5h=x&IL0WgW>c)YQtnIoo~#)Rp`Nmsm&+{qs6C zlBTMS3+A<3wC+;2)Rs8s2i2S>OBbOodA1CBWhMK!hL)J(NNb*k)#`qG`4WFk!D^C3 zg0IS}{|z+)o6LHhk0}|P?W5z7Vp~L%8j`&#UtMxxcXNj{d+}Q;P{!{nifdF=;k)?* z;FXdYds7=~jsvh{n+P6!q&Q(u8VeFhBq?1jC`y8?pgFh8wtMO`lGBy}J@7316_eq9 zm?9T#({bXI_(YUeR(2a8UoaSkdmwK;djTrudpAe(m{Bw!)$=#G3}8BJPu>js3iTnb z2}RgWDXsCg%F$0pO7!qyy+Kck4sp_ir#~90tH<#Lm!j-f-w-uMtXb3PJ7u%oK)^ONpc_TC{9gY343KWl5k{4j@Nlk`nP+iy zVrVhQ*{tY8i%(|!p7Y`CK|?#J5XCGta;gNol z5}tR+{Gq*~E8h~mqBK;gxAFWNsv}XUVL(;6v04}+nmd;-X%vkPXaB^1K|QDUaQQ4s z)cpr}6#=ca{!Y4Ua>JH@5s|lTqEpLaN}{bd+5EP}C(gP_0+TJBLz194TMHfE|!SBJ_Jo8BPF2olBzEq_X1{ww#;l?@W8li#{@$kMVI;u)owW z5Gz74+^?$^(Zr41vi>COgQI{SS?szfLz|Bs)Tw`}T;&eqIu218u&@+Cz- zA``rZ%-no8_+P<7B7Sr8-xq|3Q3#-E5+Wrg{R&5}<*Hl%+%JD}E%MpGPT@nc);MIt zHLCq}zNsy~+GPFuM!Jh1;V;A*D`rhmDk*YkT_n_p4(u7z2W_!vLbRm!SjLBfN-xeF zunr(ausZp+OH)qSgQAaPa%kUI=FK8X=1m=;PCpMkDk5j$o|MYf=>cFtA#O^fW4w#g zjuY+|Rh>trmozAJPbK_mccAy~8pdmZO&ZOFx^u=$n zFVwYWuW7V;YN?5#+G>*+$BuZ%Tu@2j^>~$+QeVe<&hSB>Xk)EU+J?9q7$f!S(hDc{ zLpfEA0bPb^3jxnwOOSsg#!ySn%^?Cz9;JSmb@?qdBZzupAEj>Pj%GKd5rR+`?(CMS z^=yf+NBI+57nWAHPH988+9pFp@TL2uCM)kfS!y_;@$au`3$JoHwvO}`MmL0QV_?fW zUT`4{;045qhfZ}>r=ePX-Q5PDB2F71IxroiLE0D|5L*gLUTWpKU@XuZK%wJxM!4KO*~DR8U$)53 zez*aSank!CF+QYX|9FZ0ypGq_Ivc2Ts?URw@43;qBlEz0YV_0`Gfb?|+JU5x6GAH$~xLzLNSS!`5^L8r!P+ zNDAC038*uiuM!`lPYU1osvqM{*v<0vVP$?sV=R*h9}T>w!Z%+S0d37}5YTEiglwv6 zDY?!0R4RqK*~rh@VXt&&pevxsuJvsgV&9+eVTnX`f?vDfQk;@Aso;MRgwbXPe%XqX+{s)9<5n2sjLEzFP${m?+4`ZV1b2oyVZ@m=Xc3o#d#G9Nz^ zUbj3hpld2Y`Z!V4((44Wi!{3{Hs2tEa@l@&)=?)im|t?H`_p8Fm;sz~<^{W9<9@)C z{CJg==b;Oi=s={UM zG;K98UrhTe-5LOESkT-4dWc>d*ML(7%o3`tchdSZ0|HN>3);yA>;pO|IG=z+Z>+yJ!jT zaTGRIe&I`GKbM*dx5i?P`@wD@iH{GVX z{hG0{@t3Hm!8C6bRqM)kpeQ4W*lSg09Vm$R!!jj^LDg%PH0BfUL-@pEK4#md8KVfF zZ3~6!&If=C294jFfRkcpM`+CtDeG)pqJgxJ2o6znMhy4wo{@iM& zPPELf8#AD)beEoH7kEi2T)>j^&E(J*nZ_5|ijNAvy0Jmb@l~b`DKqar-Em;c+be~k z1hAHOA=5yU52J<1lNz2m``3A9V=r{STFavp!_dh}UZa;+OIkq=rRFedVltqip10q9 zswc&2LPudiR>JrWrCQTqWo1V-6vBLko~|0cl_Z}JmQ(pB*ZC*w(;7Dti#i(Keg&i{ z`Z}$-*}?n1YI9nkA2QaG=~yB+k=GiyIU;+zUeTr);bzQF%K;nYTSBEP|BHl}QD7Jx z)_OCgG)IG<|r%rml%QVM}eK6y$jQJ)#RokPtX4h*fp*6#5Xx`B~LV1HEUen**7H{qI zBohq-$9aUmvQ+2Y3zAOJNgDgdzI|!(wM~Pc)R2{_6257TDOeg%U;YMrhAbO9uZ*L* z>GvPa<5$WBl&r!2g5RWwnr(Kz7qAzY@g@m0=p`J;-Y_8#ge6mU*vUtStMOz z7rS-C7gfpaW=WGX@6+|&s2s!Y=dCd}(+@yYPw>MEMg7BX(XD>goxp&-(cpIVL-{1D zz@m>Wqa=Uq;kqFVYVPUYEY0TYQ6V(BkV_{ydup$mXRu-_B=r`QNjbLsD+O1}PXw?G z(m+z%GJkTBMu8538-e&(Tcl-dH;6`T1iF5t>h&})DHT{%y)lXGBjG+njYwV_%O~Ac zv%6=n0VC0o=@Gcs%40S~lcH1G{wUoPX1k&I+N|8$GtkC2SpO{$)oi`=uWK^}p6VY< z?P~ZB$JGi_Rf<%+a0w+~ zB{&f7-E~>+HT1Ql$fH3sUA~`U=VGQ*zn*ANics0&D_YLYy|}8)vI80vD4ns)N z>fDC-LvnKpW`rURWD}07w|2WJsCjcP1!S?2bp55%;7v2ka)&z?i*RghNP%J!K$*Me z5%umaSJs)#&rt(8- zoz1694?L}x!^~b>w(s){Mi;lxHl`Uu);BJ=I>*K=H4kc%=amMu2OdoA6z%>%hxn)y zFbc|Gf0@;AmqW<6Z91?g7Aq* zX7WKEa*XpVuC){qd9ufc$6P|y8l;nL+~JywTxVfv zw5A84+!Ui3ys*CbsCA-9`u!7P77|3a>HPWf!{gV(ei{A8E?;Cmy9!O}c{jM)OWO7J z+uVS^Dv=(Zz@=&#^%0rVoU~~+O2d}U zA?W`yAC)HF+>KWNVIwa9@{4x9tg%mAw`znC-_GommHL?Pxbnh#XsAK6l>{N?n|RYuL*l#Jy^a?6 z^P7#o>~v+=XuOETj&}q3mb+hB@#))M88j!Sh&Pv3O6EHT9$j=_>o}U~Q0vKWI%^L8 zfbvR`8QXTa9MC82t4Q6ja~Ui!yW8xtK%c+4LWWdQunSF{xZ6JXX}_}5hod!h@{BXT zS4!vyUE%)dEkK9K0#6&gc1NG@Bwu)(Y;rQhc-J4%PVG2b8;s<-0@7rbniOFyZT*8RhXu>uOrFBR0Fe zCZzH7KITQi7sw_{EtIvuki~bA_zz`^lQN`dNi9zYgk?<1s-Foldwp~ER#0v$2l=ea z*G6uQ(lKK^ejpq#FxqP>`t14U?#^-iwo|TW?Q(xaj!yjJ_qPzNNuvOkOos{CNydZa zg?E*eOdg;>&?>pllVo@YB}a=kF5)RG{t&njLuO51x)N0%+#_dQd0k=u*IfV2K42#? zx|KEGWfI)t<6+_sYdGua>_09~Y}`ByTKz+D9~b~iAhzl&0)3ASywSh%Nz1{v*YcC{ zMI`5LECVAlx=syiEUtAt%{|zCK^AA!vLbE#dBvY_L5hudk|m7x)!)lzSuq{@T}uu8 zRUnzbAGgNYN54mI56l;c2Z)gJk-!d&0ssS&`{oKVu3{_OhvPFhh0sZ`i*Ly{-51$%2f>SWwj?k2EtKzMsq+o;TRXl|b4rdoA+=BS$XLN&zny|eKgKpBRiITzB84^9RJh6x54?*$@}*Y#Jk+zh zfUrTHZ|2Tnf|?*c$QE=w$^(*A1kdo?;YxaflhNc2ljrIs^cVTidqsK`i6G7NEkK17 zzfrgY1cFxbke%ODo_%RkA^l|Y+y3WKSl&X(+JeFSqWRy5xNvFg_k+%;FPr9-vV9Cfw#0Ie z^d5vUoU>Tyl|K%3eAJ<^1H*jxDMSA9kS(d<%;BY#_WOQt$?0QE$~9y_XZ7|r+13+* zUSOIhds>-FZ=e4PRmejLOr}+e2vw_IJr4*yEn79lZq<45i8z%SQzX>yjI*XY_6U;W zK1-zM#>2a_wJ@-+(EnSz_M>H)d@6Y{PiM>O)s|)3YNjCER)F&7lb!702f*DVL(-mr z;J6=Q?QaPXpzH!6$%%{gM-AU9^HuRix?h2~mPjMChhT0}H7MqWLsGba(8P+O68}b1 z_?oj2mR{{kmokW*>HQT`L1bwuCDI@sb&B6xn^bhUU(6FQlbq57EM9?0YhXWMoKn2r z(lvA`p;Z~}O9q9;X*L1apKhW-Vp|ySeRwNP=T?Ee&>WM>O@2Lbc&`9?f}%A!X-S*} zt`o+cUD{3h^}cG+@g^7);svxm?a6SEv93^hpLIG#R?}xWfv8hWVEAmLIMoQK_Gp$wCeh++4MiyxIAMYPaOA8 zKG1W-o^~ltH}jy-S*VjShI$*fT@(i$2Z;@%if7CT`gx#0xi|nPVy<3!a)j3Rn}vtcai@ z6YaYBK9&~^zuag0on`*Y|F+n;Cg9L8aqAxV2og&vZ`ilrB)J3K6pmROr${*kU~XV7j0Jy8{z*=hk~3BuuuKT4scnsJgYV<49E_!#uyGtmqK6}cOt>m zEq4gS7a}M5LZzE-I74-8re7&H$^DL2&E;H6uo0TZ|J`w?5e?!3zvw@MkZtr0hjbft z5YMQqzH3eL*($FHiP|8>0-gD{0x~^?|;CW=o;IT*}^^kw6$@St?;(hs>ohFDj#P+ zT@=i_bbS|WvN6?~4zeBI*PVn{9+$(c^&H(8AYaAM^nMu)YLga=-ZV&oax_X3W`0s? zUji%kW|$Uq)mF5S6boV~0)a`7`gwPH#jGnvZbW$}g@k5(L^@qY!SkeEp4qVm1&YpH z^--BJv2*v*cp1-~(6Q7fl_99!iX$)HZJ|x!E97h~s<6DkG`-+BdUxDEj%qxYAzerP zq`Gz9RB6P7QL^*F_p#fQI!Et8W4PpjQLHXZfKSikYXh!1$Pz!8_X?P$$=winR<631 z+BZP#Vk_J`=uf!oL!|Ly>ksu=j-aV zjm^kYkPcujTBjppaq6snFs;$oADQ>f&C#drrX@N7d2jJZ>~1@7<|YoRDFzaqUi;*^ z?10>oQLN}E?dZ>JbAgRqT@j>@GAgEZ;}ek9ss&RGeEJ`ZJeG8XdC^Zm_N==0LqGd|5O9qAV_(P06T*NaFHp?tCk(^3B*l@f;41psOdXPfMJB(%Zf2$38BUHbuQ zn7}wSkf#rwMvCTKv;d3F^WSJry&BG@OZfQP0~851h)C!NcM_O^B00kGUZHFp$}F4T z8(Hv;i(~?}d}^OUOWO%dSz#fm_@A3wHV+C+UrIvE1_Ix+J>E>W$Sv)|9Zz*TiSmw! z>2?CSZX1eTW!};EKIul1(~b4sEn(ATU%zddJL&;HM_btw{<~azC&abfeaj5785y_+ z?F|mAf`XLVk<2+umZzZhm(B)7AbTr`QRa^82I3*r{{wb{4%yq#O zTo?dsGk}?yVy5TKTr8TN*QFysW9|Q|?>?pnw)ffLA^@Bfj1kibJ{ya_k1099 zl!Q1D$TfpPY()(0e4(j}V74=oVII>^UO7vik(s&mbP{pouo|oGl6wmSr21P$V*mUL zku0d1xmG#dr>d^g4yGuB>9Xmdr3f2^q`ab{3F!F+aEzd%g$xFmrFyFMJ`_H#vuKmAb_Wl-J{m&EDx&O9~QUu6L&}d|= zNKXk&rk2|Q9UUgB9oaBcQBm=HEdIY=|I+E9dOpoPP|=YACSzhcYNb|MO@16lU{LkH zET*B;4>>taM{`yCVVKVXgc|6^0vdl}`t|*1H@iXgQ?TMhox5Y+2hbZH;5{pA=Q|mo zGZvEow8}#MUpQ-q$%F zfsvTuN1zzJAA^{=EFuvSi?^AF4H^;m!+2#77zom^&s+%kr|77-mGh*y1o7s9hJKj0 z=W)~Okm0Pzzc;0cf~-7r+p1A5w)uFINg8yunzHx~IxhlTGZDZ-^j%=^?P@&${rW2> z2XH1chKbi%|KS>waPTcBYKsz*KTueq_aP8a>)BamO(y^y3=e@2(aZ$Ba2Ft2kC#i; zy=#0V%gDtgnl=89==*8^LJROuy+i?qfWmnev<{gf5?51E0YW{!5P-aCK;N(Mqn}`T zPldwlFFJ*i?k#VSJk@pEcrfIVnX+#mK`+|Dwqv_JAj(z~2Ox>b3oC5|5-gs7Nqvd- z=eI2Ljv7D&_7#)Wj;154a&mIk{Toz(2SFFT5oZxk6pMhsX(p`EY2zJ)RWV7{#>OVU zcDe57gBy^41*iOBRvb?-z^;6^3+1so*L^Gzp)cR!zPAM1`(w!}%CXqW9_+&Nd1#vm z@tkv8KKaEXCzOzT9*_!~^XQDxP9fT=B*722`LtcJ;uRk2tGu}4ae4B0+u=N*Y!g!R zNdCd!ite>u{hL>5k02_x!rS48igeixh zov;6Jqxz!M$eZBbD?G-WK%03w-wFRd3T<7eM9*_W3HJE5`f);XI(PxmMwAu^5(s^M zq4aot#9oxcihfBXjith|E14aLJ4Itq150{d!oT@u#jh3Lu6>+y?c-~iL9s^4jqll_ z@@H1gnP*h1wV+TDo#>7(C!IW!LRjsAgL2<$W+IUM3rTbGDpQg@}P4Wg<$@ zmqF9B9ka~-K4RZx&cMX#`))?F#-Le{)vV0)H(_s|wi2-L_N!ytdHt>XxNbkMhcS!r z#2)slNGnlw6dcb46g5P_L?5hzeCJgXQTNg+;vvA={s-n)Y*TV`N!SD`OZn1??iA;$ zT810+A%K70m2V-Jt3JX0bYX9hpZK^&0Ekm-0zBt4in$G<$`qGn z^o?)2 zLac?8pj5Eg1GnndiABL$u@_z`Nxa?_Jm9WKdObK-;WBJ;3y-ud`8yexsnLm7g!l;K zyk7z{Rf9C#E4S0TMc^I|ugtIcGu)IEkr2eRkOgWjWX;!V(&Y&k+hW>^7+TX#5wWYf3`)+bn++SWadWUmfuA=+*r-)OdTs9;l z>Mk01oP@6Sf&|Xy1TE$?h@ate_33}v*W+9o7;3B#^!d|H`E*yEFiBs_?ao?P{ME~r zFMjX@7YO0(oQ^BB0-4m8a5vj?&vWF z1pj1i?2dFM58yY=oG%pu@Nym5&(1hNW7W!1tNPZ;d^&I(zAVzTR<2*-WjncJ)APiU z>7(6Zr@-Z6wwKGP(;*&1Xpa=^J)Zy~qVCA1&3^NFyx_biK56)M#fnV6lL_yu)@vl= z3)@jII?9J-0m(tU^tKJBkq1xxo5^*L3sWzcm`ME01b-!q+cJ}n&t-RfmBCiy-ZcJI zB1~*f`suIEnvhvd03JT=oIXMNU-c0iU44e9hSPo;ErI^kfs)6p7>v7LEN<0BAvCg! zMV?-)V$`Km?ELo5f}b(0&abMW9*doD@OYJ@>Bb!K8PbR)@<}F;5`XRpZ(p1HbLTu1 zh>3fa9Y=}-h5J8O4^J-}1v`sQI}`hlCwXkmD*Gs)94-x&Fao>7i=(ZRW+ezes<|^$ zN3gihXv9Zt>6!`>TUey9I(lJmDpf3 z=H#e|xrODXQW#EJZ|}fN0-&fYb3RS)lPNLTdgGUsdEy*x8&CD$Frc=D#T7>1UY?yJ z&W}#Vu`G4Fr0?txi+q!XCY+KJZ2{@#e6w5X5j;*=sgwqGB7RlhbIn za5l%YQAicf&<5WQS`jh?HriCN*X|*u-ojRlz=cJwdfl4#PBEz{Be;+1^XGn41E;I~ zLiJVFvGu%^eKi#tWvS!r8Myx3r}EHLMQvnPPpM%=#R*U2;?GpD_;k}EP8Y*eBv?F~ z!2PH?MsGPpl!GEg;oc~p!{M&|AD69cl$!|Rvf6KU`nVVoR&TxSxcD=p>S#`@tG`>n zBcRssKZ+wAgEI)=x0OmPBFmR=ih5geVf6$jW>KO6aM#p zyjN~9DN;P<6U9Bk+s>qFL4!-eOm4rRfXq2E37eKQr8iSB3s52`ksd0 z!*1l_{a1f3jr{G~@%v-M-EnQHrC(%+Rcn8qiS~pqcABEDMdtA1n343I!5tv<>{I8U4M_>!-IRO zzk1hJ6Nlb7A}&CUzkA2z6M-1#+jPHixi14a?h%s)0_{MF-!RkeXPU|em?T;L6=VMg zj`)ssf>tUK1FEab9_Xs<5!WAA2II~(?&r{wWMV{xzb}&0chng`=aSe}I|Mu;)!dX%i} zFXqfK9T_e4@-&YpYN{I*E`!@@r`BOltaEY=k0cSlGHhO{X8yX)XfOHki$uhCT5j@g z79VK%&bSv3Pc^N7T}ot7C+qyd!9|3st~*q8=eZdj{q@GUxi?kSGo{B0l9Hs2Ly4*r zQTZaA_dLRLfA2xz0Ycrr*~P`50hOtpI5aq9gBiaLO(;mR;|;C^i1%N!4+=D4ku{*M z9~XP(zpVZ^^h#bMIgBhS!VpruZ%6i=HEwCd^9lV#DMuuGOL5QHPye`fkEV{AkV&KC zq)~mHmjn>~xi@@Oyw-IHe)3TY99gFHT4SoESk}~-XWkD59ugB0<=qgG7G-xyZFuIH zLS=ZSNUff2@;H|IiPPpwl{kxgwshA#^=zw%wTKCSO@lH}d6=2RA=TLF~Rvmqteg|MGK+t$gYr zMM9GG3QASSRjdMn!Vui7W2oKhiN}${MIxeUoy%xbbaBszB_aCpi!7>73EZZ&H@YWR zA->1>53!#5vg8u~UHHnuczhd#+i~O7`i-y!UKH-iRf#eYHr9{T8B!K_wTO@g(LLg9 zR(6l${G$}G1JQV5L7~_bRywg}2ct|~TKH)%f5tt_w)b?A{XA~(>9LSp{=jv+T?+Cf zOJ1_Od$_7bzt}Aaz7D6JNjp26B3^O?yNM6>!Qg{wSag77vB$`ms=GQC+gl?es_oI+ zD!0ISw?FkFI;dz>HxgdhF#c@9&7K4+Xj**sB+K?uQ{Ak^gB3N>$2YaBif(ch(9$Cy zLj&NVRf^de{xVph;fbuIb0;J^c%7qL3%}X%(9uxh8^UsohPTRody1eC$K!Ry`<@SW z+f#BwWm0!&jVsVDM~)Iu4L@ZZnIGxmfjrEe)O5^*B-}No&ZvgD-PF?xmg~Gk5?B|v z57v}fpPyW~bwmW5HSIhQb61A{vl9QB_JgmCe(wWlCZAG1xmM*f(UpWgx*zL* z%J;~gs|Z_tR1hK_5Ai&CXianO1E}PSYG&(T4_`a{z^UYU0=7vIndEMX7S?LCJ!Z+1X`^@KOStRW`jV zvhOo@V{}`u{o%|@SM$nj{IQ242jO%C*%48)iKl*p6Cx=LB&qhCv(EezCL3&BI*sp% zm~j92T?}k>Z`*~2SCOXPAR_~`lyPVhOJ(+ie%0i;$|m)?Z)%5obLIEXEMD^c9G$yG zB~e=M9tzC0c2mzcY&|3ho`SkjK`OClZ>H<}vw~fxSurv0KiQ)`a!|0E6`M9p6 z?{{2$vE)8PnIImaC9RIfvZmqL+mgVOXGh?;xm}S~Y3xXv()CDsp%0(~gh4DI1W4>;lt4R1)C=FZpa4p&Q)#(w_xum-A=tjX2Yg+~OjSSd znO1N}fZ?AO)`~uzcFI*DDh0=|wBvnSwwt4~vEt5xe(s%RpDtdZ_Q|BQo|32}9THMD z%ky(STmDJD=EB>=81Zqy?)clWB=T*OnT1vP#)>H^xaIMbp4n}2df0&agN8fE@Dc50 z^9dP_jq#}4SujE)jGQ@e$=e$@GtGdBUw1PldULNrSvga&`5ME?aGZ=$U z0WNIceao-=t${Nj>&fi)IX%yLoewoU@TQWMF@@^Vs_l_qcA^p18nI(cxYl)fPrRO| zzjRs?Ro^Y|os{)6F?j@QFlm>@_4Iy`rMPMhZrOkK^|X!*#`?QOHBQsnTI!Iy+A7LP-zKqr8xr1q!_%dd z;fM`cTwXNqBU`h^7yJ2y_0Xr60TM#xfVPRx6d#y-H2y>pNe3_$}FV|6E zqhjDTqV71%OmusrRHWTh^BdE>Tc!|*{cwVj2NV|wxo>lNen4eId|Nj@5Z6@f9tF$F zw9WeHk$Y6#12i#M?;KmnlB#}H;Q&P0AnyQH_Z12U;zgkz4on|u_~o;H!bCO?zJ&4@ z8{0scG5!51`91saYykF~yPz<@qK+#$IUMDDIF4@%r3!feQBLG%^IICyi~5+-9tAwb zEI?dxW3PJOs0I%=wR&%{bP7&srJ4S|#9wO>jBsYmXFN>^xzVy+iKC^g9CJ0+I=Lbk zQ67TKEb@9rbhK})658k2tH6-T*Q-FJO)PaXh2z_uD+iJ8bR`)O8?Fh6#?#R{@eu!& zv7!Ow$F5y;gh-w&n~(0OgeDDwm9=$Xb0_5&2S08iI9%}4)gp+`uWw}daOeP`d-nmq z(_03TKsCZ_i1#ujgms+#b}kL>Cxqe{Zxs)P2liPxn}QB=+wdKHY3vAij@@O(VPtygyIhTjK0lCrL2 zr7{N2I5oW=w@mFByrQ>Adm7>Osob?q-QM-%Xmn!b_RMjzQ|b8Qp-mj~#pB^%*-pH` z+7UOd|Fh>1b#E%O!dHc?FR50I=QHQvbCxfEjE?p6uUy7$pTXr}dC&oBpb2ks9#EuD zg=*QAHS)ps-l?-;6ynO315k*IwajN0Z3(%TpE!E%_|E|aS~sjt5;#Lmp#Fy?O;3XA z`HvjrRCi_e0lJC`|9cC1KKWfJJUxM_^o^d*qx@L&h@7V}zeG=j{%t1M&2-K6n9|Q7 zKQ#`uRX>k@0Cc>Vs~Kc~q%#2Y3e+9{x7_w>1cfxQRY~aKqVZ8q<#E`}j|sU|*L;oQ zk46)YaukVBzj5A#(!U^)?t8Nx&!x1E)3peDxB%NRy?vh{UdUN7i@NXnaJ!DNb0l+sGZ$a- zBi`!9LWJsA&~M#Ub^G=u%`Zl^f{7x!8q9-0MD`epu%H97M2S_0%k%I*P}9S)Sbw`s`nZn~k`-yXkBT_~plGZ9JEe@}+ZrP)DqEc({|yXBUL6F?VXen_zZH(;dXZqcD70UoRd z8?toU@&!!)`vfiSfGg*nh`UuRuZjKyEaaK~?)}wjuS0+}+R^ro=tP*1QMaO8aWt84 zggA&J&H!*I#=)=^Nh;n@$*EFXg~MuJQ_qcb49?x?>2%X?+0@2(BT(z|j^C(=;MeRD z4lV-1N%>p_sp@VA%MuWLg0%h%D<~8E`XTfsP

;!5UI+`7~DG`auQx{4kL8%Xw9X#lsaju-DgF0^c~ojTxRNrPX#| zPIWsmx{YO~_YW52fk%6jrtWd76FIPhc%=>ITrgrkj`s0O3mXBzP}$kr>)(j7=hfy-&F0=LJ5vTidQ=>50hxw* z+NEvKjYP%RP=$B@QN_`(UREblfInVgb1ho7?uk&2-Ub%#$)P&$bJoqGNgfS`vJ2j+ zyEY01h-c3oiFP=Dg9OW}k??P!pSN3up7FZZEmEmBZid{)5BvS7feHw?6D?BHaO7q< zu*ST2J8)7jb9WYW-l+xNxj~ZwzjGZ;l&5A{gGv||=7OWjE}}~wO=$2nA70*&-`@BL zp0fM;-NQ9f$M#(k1^b1McY@jDoTi?i*DVblzR0|(h9Zf2-D0VnO8HjjSvBaXT2R|a zL^gQgY=4$deOya?7Xs`}qAGfB%52z23%D*s9Gy%9tS9RY##v>BgmtI`l>LhBHEG~> z%gA@VR@IFF1AifA;gOvb?E?pC4(yD%YmjpJ6IIH{%;L4i`9OD3AbbbMGn?AHNkT2`~;rn3fn7WUKk9CU)OV^5m z;)4jKMW%@}KDkK5M>PK~c7IAIfw3yKDGZR(5Pso;Y7M%CwA`DCkn+9X*1Ja`)E}`} z$V42HYF$2lUh1dj{Ir+}R{yo`DYjx18L5*za0EjmX&c$b|D0ZS;tQhCIUpVYkx=mn zSXsGauotSMQD;aA(f@OjO(lH`SmDg=1v$J8-jn3O=1T)S8f?Dmt4}Hf=sy)(6#C7w zer$oIh7#DOgUoDpWAfc9b6O0SG0Nr?$b2|lm0B~Fio_dJ20V((S6M8i66nLlEdrc8+qvAW%-58T>)g!=;l zcWRWVE~~`+rjd=I5p#9ru2rRz;0%BA$Heynb{nXGN!W^s$#d{<2!vx+FeBvi=fNs| z;?(W?pQ4;Io;+#Ysl5tNcXTb=p)~}w0XW!02Zs)ruE5jiu9=mWZY*3D@=m;4K=A7D z9p-SOdbPA!@OwdVZ^Zkpe)X)O_&D$T`HF1vPie{yU zk~_)UJ$)r9&QZ)4;XAkF`Idp7MRyvyHvNX-MCbow>MfwE+`8}K11KdSC|x2*N=kPq zNQ-n!BS=Vzv?85?q%Bkh^ z4AXU!PMAQ?DaM1)-j?!flNiyRPzAS(EqL4Rzs)Kn89JHYYRT^4gf1cB53zeAPO~~> zcT4`9hwQ{xNp_n%ZF%z@`ca$*U1EtIrAs}1nw%S~Rd{&$J=DRNfkPY*1(aaO3-yaX!D zfv-lQ^v4x{%M$t@#U@#3*8Z*G*{W0^%=2l^=xUljRN_DI;idNT^SO?GHp?M?H%|5P z<=m+3Ef|+KjmzNRV+J=s! z`kVo)*BCl7i$6MjeFvP_S2a%q!}d|&ICeK)zE?|TNzSJJJnMQV)A@gQGWun7OV zLfGHNE9*TI?<4z~=G7P~Be~4##HXM3%uv)m6!E3)WqwRVN`hDVYX>{Lu0lJv%y0LX z5Ta!#}OUmic!%NuymhW=GcagBDXujxiBW z_kND^Ja%pf@VnLvQDh&fqE_^iw^#g)8x5Mzos8YhWyAF=LJfeFmBmM^`H3vOYLV(N*l`HvMS9-?g`WHi1Kuu~hGIyI|x>%$MJOpAW9n zD&;WWZTpt7Oy%7K1+V56-}K?KldoOzqOxZ0MT)qY z78@l7NSq0#io9X4`zsjhMg_@I9@hFE^|@hVA^neZ8nepn**C0mDyA02`q?YGuRToY zE%-gZQl__#3kwW>&{EeX7-gcax?17ZC^*vIr@3Z>)9esQ*4`Z`*}$&NfNQ$+erT|j z5R25TWsm&6t8KtPJaN%8bIVvZ&EyT4S0jd&G5rbt_N%FRn#j?|9Hh;c_!3E#*i)Q8 z7fN@O@r?phNGkys{5Dv#IDOgjeF(!Pp)t@` z)=T$594af(NP8q|-IF@3yY?6#HXb)>XksD!XEO_3VD4&i$3o|IY%62K?q_|kT-4mo zZkNA#jCTJNcs1<84tfsrK<7QMID)W zre$0L?C3>?8S^Zi7ry8h=-jIvXe5*El#f!98LMj`dlf%`c9^?%_~E$97FoKq>T&O0 z{hS8u`)0U3PM9&|MN+$}EykCXBW0kE2@{OCRpHsVf$rA=9*x^anN9KiG+~ ze912#(}_v)QSLZ=O`wg^3%vTmcY0*7a3?aO;0EQGhsVTOd%((#6S{Y^-(y%uoEB&65Mx>}6Zwc@`Xu~n&B;vS@W+qR?^A+`E`6-|_)+;3 z)|oN!TJP(C>wHLzIHU_;CWxo-Wj=2%7|W*BjF)43k1A77Umefj44G{fyt!L*r|{N# zi8xzUjxf>;w=!V1sp~xOZ>JSfSfpS2{{1SA1`Q+y=ly7r!?uJ3T6FRI|AqjNj!ERH zJ;`7u^)MF5g`M1LPj)vWL$){H{`sN*E>(y%NDGQ?D{BFUcUPl@Yt(MXROZ@`8+w>}5&E?@J6Gu3-QJ`q?6sn;sp5_ImQ9Jj$HgEfuPaM^{RQ)l=Zy#k=OF>btC;nwewFhn7yf z^uEKa)_%{O5m@=gE`qsVT^eJ$1KWVPp!H}oALs7nb4b(Y@U>?%yi+ikLn+~T`ZC1C zBQd$PBAl6l**WuPhUwArpbM+66@u!%(YyjIk=6g7s$j09P0-fh>z^_ zYL|L{MB-31{^oFHeKYomY`($(x)R|l+Q-jiWPwg;Jlpn)0Uc8npZZltGhWwW71g7x z$IDRJ%pTaOY-$mUmvo&kzeKcjkLfIom%A*vyZI6sZygeNVl`sJkBH3V&9qNH$%f`W zl|`j-U-56sIoin}l+G)BqpB0iwOWFPIL10{>*}IZBk(}?_Z{rHy^`ym1cg|Jro!9l9a&pWTv+0Se)J=d15K{{(tr zuQo$v+3)qbZ10QqYlDhHTJMCU`W8UXh)So)|L8PY&q-$rXi}rwWcN||Dxc+1=qU^_|xm- z#$k_NP_2Wjw*$)T+IJrcd1Hb?z8u&r9@*oN70Wt1bnbR5sA2e8^X|osaBH7%C}s+%}t<4TH6obc4u`r)YkQv~@@rM&H8t+2@PdYolVIxZ-Kb)r&~3p!q_eQgN_J@A(8$ zCXskH5DGafD^C&r8o_%a#p_AUKGDZj**bVrt|+a-^WmUAN%V_u_rS=={fmBIbmW3dFyjj1V0(pG`-p;VB4OFWmX=tf zl;J{|ROam6+Smx4kxZisW{QXr$Dxq%I6IuyWc2XjGx4;}eLB^?4wwe=i9-C6pYcx&yeXH4Ea>af2#smRzgq0Q5UzhH zM&N%;{c$dob=P~J>WF4Y>V6EByRX>j+RP6U=eyp^Tn}qgqkX#XmEGaQ&pE9kL9W68 zJ-tl(w6Zg}LOv{vIM2Y2F;w!Xw)VOrt?}{35YE2FQf^+`^@VM?y`RC-sMErmi+eXd zevRIl()P9<+4e@PC?vY)o_0f!Ck0|-WDV?vr+*y2l z$lCXs<2hL*8z$O9y;1K{6(U3?WoIel~B|qavEz;rCt64 z@5gy_J5RoW((}_O$x)u;3`r{S??qbsN$2`}bAA)YyFVw+6Y~8&<~kzpQ8b|YM@Ete z`0?FDFw(Creo&4$Lz1rK^DTJ|s6R!;9Rx%0ARRtQG+Da+;b{Pm)mQh5X{@FVkm%;k>~hcD@ZeveZgoS%xs#aI5(q3di?lMl^kGgYtH^$mqw9S&wt#pVjA%EuN$tCeZ4qLF^iwSr%&QdJ3Te)#7!j zmqt16XH5gnnHPL_sD#<@jp@F%uGETNJR~c;U?XUV+~SCfsdpnbI}Ji0AU5^Hsx=Lw zNEs4L=lAhCj_{>-CKd99_5>vS3cp-XmU?5Pl_)x&>lH5T|21fQZa#E#cKY7cjOJXz zENutT$hzz36&tI5bvrc{hBC)Or&TtyB7FF;&}Byjx!RRjyJ0x1++8^*62cet?MdP$ z@**}}wakvmzYAVToQ#w|N>G@-m|xs`+*c0ygY?2FtFnS`=|dn0>427Nj7#a5l&)zkd^&|1bjPv5>vAmqxW zt~Fp@oXmP!Q*Mn57ki79gHD5NS5RcNeK!hBkohI3EHojjAd|h~Wq%SclBNS=yZ1<} zWZ?8>a=*5;OV%$p6KHo>#BN4IEzhit33{JAQ#H4opc)MNfd!{QAY>Hsz+8V{{D+H) zWzCOsNWR1~GNBEZa=rA~#xzVuK8-YQOiqr3S36nG<<;=+YM>e*-1w7LUl!DCMP~^H zJwQhgq&G0lT(nLFqanD&NvwX0k;!`%`TB8J5701apVzXlEFD_;9@cw2^VEJz{<%0g zx759|yu7W$TJ%=6Bev&*ztTpJnQAZIy;X-h^(f+Pr|%XM3aDtUCKJOb?>1A~yIwRc zQrjE zzZ7k0j*xoX$;vG@*VUz1v<8uGyKU>R7VJmZwdQNzdForPaOoHWfy(jn1$E5o72 zPf4T1N2{BVa4_QwOGDzLAYpqW=WZdmDSTJ+`Q*$Q3fNU!nQj+gK-cuhdqwE?m+b`Q zcI{nBYy=A5zPA<0uZN+^Ve19D)f70`HA41?Nr$@%%59xr<{vzG)n|i8-%s|wK_0jl zAe5*&<#)~)kNRfS7DS&?dowpNIozwl`~c0f14;(~9yE5jq*RYk&*}QN^8@~r>Dj+S zC^+V1xx+jmm+kkpdY&^t!{SY@1SixTAc+$nIeM`EO!_;qYZjwbz(H0>h0$QtQH6u= z7QOf2#Txqstk-u5;6w^jJlqteRIL?HE4dWuP-CqH1WYnHKxyV|nB!UX*4t6&!70RL zaqD>ax$I!NA4lo^--h(QiaC7}FvSRN;ltVCiCJQVlUl{>p8M1MB|?}$&NNh$wgp7>>8iil*!p4aW$J@~nnBrL^8 zQGrzt{@_-{_6>*J`hr<1sL%m*FQ4FMWBPq)(jRTlhJ#{YfVbrAH>!rePyV+klzYeh zPL}lX8uX!v%;TQt(6z<-Lm))Jpy!eN5MFToSXr$^16Xck}$YGM zysu>(6>69<0avwc%8EXLJihXY-$|#Z{Eq4+vSHo4E=gQ1udq$jqg=_HvV?S-PoqzAg?g7<8QiTKq*MZ*Rb>AlFbf?I1=vL>NvbrXg6`TlPJVX z;)$#Og}ceuL&>Lwjj#ICHTne=#eVsPd=h?IYw|Jy#(_J;C}%_g#!r6nV9wnVkp)e=MljgM)On0?9fPjVlRAY@P1BB70Lf$z0sMeT6LH(0rVZeug3rv?2%7w;VM2_0%(o3kldYZBwZvAK={%+@FLH#%+r0YPFtK zLik5q%?L-c`HGYbLtFWI>3uhSS@=YlFN2pz+r4_&Seb11eY0hKZ`nWUX~Swdt~IHO zjaG77GPsu^o7?YD9nk`4Y#`ly`q8gHUp&L<_4|IJ$Eg_ki<0;eUPD@)6!ZXeVUlgB zv)S2U^ffBr5S+2BuRbjdt71aF$EBltKqT$JA2cH~WtZ*s3W~Kl%`_W{nOhc6EMO6n zTHHNxvj(y^=8M2N8AJQ}5U|^QrJGZ}Z?As2+1~$t>N7Y!8FBb5Tcyo<)^1X~>Y1<3 zQ7km^>y{fCSd;j?aEr&HQj0BfYwB9^mw*;njE5-%+dQ^Ox;*RPq*S>2v8AkU)aUr# z@TY5Nh`G{8l03)6RI$N->iZh!8?0Ieh;KUI7gtINY=b{kdMi^M z-z;}>=86DhlR8Q5$E5U|An?UqC)YBcTf5TvH4RQ$_T%w}NpdC{KP}v3%97qCTt4#M zIq)$1SA&0(|Gn!ksuc!p_SzRo$=NMo(5z6!pu<@9|N1>JNj_{78{Fnr!{$S4`HQn| z;`%Hecly+`eQxUeN~M)$vvKV1wgI2xo(rXWcl94WxMVO@h7DQPxPRcL`Db~d zbT}I$f~3rS(d>mFFKxA9fg4_Q8Xq$8o9uG$Jmx53O>!2Vx5+?OD2*^$NjIkC&9ci# zRqroc&GE_o=Dc;x@FQP3j8*c?iyLvS>EJT-Hg7T$uKtczARt$4Vxy?fz&Dn+WiJL-{nC}lQZMPq05o_EMi~D4P zDt)dm0L&8j`*O%arT)R-JxEKnu#L`@D{*sE;5k1eSZV;lYct=Sn8ZzH6Z0m6?cqs8 zFqZ&ohj({3orLSL;ToZJlG%!~5B7pp^Nd0Q!{ zFsd$OW{+u^LT|Np zS?%jS+}7J@+t@5DW4+^s^>u3fxH)S8m@9cX~GyY80yCrdP7lm{_+oICR7ypZlu&o>J$w z!hA!-*!o}cd)A_2>3U%kyZ=i0etR=k4r*cSdIYJ<#zr%B=x!wop3PT~|J~&P%$!R8 z8Rug}1aAtZ{nr<}_%g1dbPa!Jd@EG!;kRw|=Jkrz_Q|4nKbT4c{u%??8rKcge@}NI zPEJ(n9nRxYZ4MZ`rqZE7*X^mI|Cehha5-a*LVkz(%f!Q23Bj=?DExWgVP0&Jk@z^u zCnM^0B);9`+8j!5(IliDB23ie^NjNS`Yd=o%zIrjfu{XHQXSBh{cjIbNvC?HYDEsr zNLF*^5R$|o>0jsCpLiPgs;_r|4~#Yt@f&1hMb(WwWKTfAKuM&+L5<6c#y`;^FD~m4 z8dl8_5<~afySl!O%6hG=xyB#6*@=-3ooLTm9s7oc&@wyXg?GfP-Kr6cMBv@#3N-4!Bra$=e{yY6?E4TEsGjtDz%&>KTV8=0Kfa^}n|C00K9MY1LC zd-eO$*utE0lzQX0Or`uUjQ+fW0tnsnCf|aJGBxr<(|qlWKWIKA+1w>LtTR3A<4>SH z%>MrOA?3h$S63GQ6_G)+_-e$=`3 zj|SYj?MZHwDxqZ9UFH&dkrx4)tC_ql!ff@al>WrDFe@!2$TNz=4>f}zdtxR9K{dfn z{ll5kd0%PgDZsn%ry7quMf9Fs0YACSan~*y;_r84h#hBj>M0t?1Z1U8Yt%qU1|`*= zPcEzf2zCslQVPlNy1%ORnV1g%aeKsfxobiLeJJZd;TJZ~WU z;bkY#VLH$;)VUkKGq~4hz;GSKCE1_vF7-vWcUI`ckY~Jhl=zOVWt>&xbNE@1$J2sP zi7+~ZlBfMrppdM(XsR~s#V8u$AAezf{Rf$f8EJ@#;K3yw;&RRor!B)C$6tA zA3kC6zLzY>`U_CTdBloX9?`?Tf$2InloI>!J&%&fx^AY-MfDFG(i`}f>yFZ1JTw59 z0C+K~7$I)i>|lAsDD!8b9i-LbXQ)8W{9!#}_rvpOpW}y`??)KCTABl?8sDjc}!93=4q)F*}VfBU4^$G%nqi4q_ z_O83cqh(YmP3LVV3jFZ4qr~@WFob}MA67|v(A{AZ-t%voV%<4Ha)&>3NzESDVjmy;;L~~;sQb74fcX@)6~<@k5g*}!%>6t8*zzHn(27zl zEmPj3v|f~uH~#kK*~_)cnPmolYguD& zJyEo57dhr8BELR|M^nEkn(4kZIz!tdAjG*b`L){h+qjOW%h+J@}^Q zGwlf!CF0iN9z{-poXd#>MO1UM1h#mN?Bd$mlXZE9+p!BbpWXf=boF$k^FN*JH z7TyL~p!E4cnkbj`%I%BktA-8l0%ZMC?@=fg{KhSR;X;iFxip9a=6qyeqQ?0#HW!r) zHW5Av>CFkYhQ~OSzh?pQ`J8O2NDrK=6`G> z?QKwkoPsOJm2qh@rtW6oN=ZhF?jC8b4m=|%F&rct`eBv*xV)s*(g<5RJBuDOKK_DZ zc44!4Tr#-uUY;6ijENBc5oggi;evUlukHPjLUO)1!ZFRIr?2^EMgDw~U5U^iMfv=D z(3<=|rZXgDt!WVkE?a*1XMZ9ZVrOT^${ApI^?#2af~Zg1d99e+))`KgHDSByW~{18z{|_~ zNL}4@T^{9hfJa^FG>CxtXo`x8WnM^!d`-6J?@LR$;P%ai%P)n6h2b=SQpPg46EuT} z`xWdvW#7e_v%J2jwDD z7uV9#qNk^CU6FA4j^;CAaX9=qCN|b=z5D;YBZ{o}Axl6&0GiYPUMd@Chhi||VAnqC z<3E4nxqEkD>!qry>fYhu11qbKBTXS8*h-S5sOR(ZLekRp#CDDTA;LEZUJl++5}-Em zArGMCK4zUEy?OHr7gs6e5cvDvkGvci87YGUF%B61`z)d#WJNHRwg>|Qg9vJ2Vz`w| zjqkb0+4=eA&D(78im2bgc(8DB1%LS>*#2)IKIi8w{s1^qr(~phX}V5-eFEhi88LEl zc77cfr_nf6Sp4|^EVj@8VWNZSF;JKL`zsE(|C?&cJE-YAn1=IlD8Dn$GHRJ|M9SqmT zU&g@?5E}dTB_~M}Fi9OzfW6GFm68GnD%A_0a+Wya#2j6$>#|2W= zp;N_U`dfRDFgm|8Ds=Kk`g?m@i}WhE?I!OAy+!sG%Z{O-SGX;4MGML)Q^z%4hwB~d zrtq1=aOaAND3)piYso&d)%7f3zmhY1faEC9A)YQ@oMW~4bB-jU!-68$DfAdLr) z0qsfOJ63Xj+nepEiC+}RH zH>nc3?48v#Hjbc-MrB?JL=PKRKwB3nFT0&hA=_I$;~;H|8K`cq^!Sr%-dPoT60-Ua7cFgkVlV;E0U~xI|@9A=Lx$j?7 zg#-5X_As?%V8TdY!m187ZTLvJj3XciVGIZVQ=}}u2@R1#XoQPDxN6oTu;qQb%ZslY zu61p9DeUr(U1Ydr?(yBzFkPNcmF1mdx`v`F<%BKwCd}itxz(bZzeU5!tRdeAL`N z0RnM%pa~CQ^Yd1BY|A6KdLAZz97Ne|B&GI>@x7GSX< z{6{xQ7Hm8OmHaI3BjYE2n7j_jfBq>yzXfh>sJw&9dS0mPs>v4L>jOEl?7&=|MkSf| z>htH%b!(im{>$D6!y;PxcQNgQ;@_}4moDD8yxy>V0~?X#c6b}{1XjTr=_CciyL8hiMrkr)|SBIfqJpOeJ~XIjxFu+9pm zPK#BsY1rA=%4|k%yY9}VX_TSt#CRPfh2{0!YG?fP;uHvOnRQm-lIC#sI#Kq_vhqNE zomb(OlpS@R?cHC|Ao?QyJOi2cj~vmn6uwp#9j<4ZMr1>3lkX6Si>2%$H)S1%4ePrT zmY#n?sX7t&=g9dxM}zRF$oo*3i7A{fE{5*~ok+i5kC)V9Loe-N>Zu5gisxk%xXY^YCk| zFfH=c8FZM1@{(IvWc`XGeXT^N4mw(ts=XzV)dim?9i|M%YatdZSz3Nf5+IzmoKr4bAqX9XN3(~8LzFJlt54)i6ME-0-DY?*|0-rTGS_+7Y@@@Xd6V`#mzRK9AqkeNNv2P+^ z;Y{b(MOE|q96o8ba&W8jtudTmd2TOV{Q*ND(?rSH@EZlH=*(2#NOyf45@~rQvF|{m zMi#$-lu8j>bI8UaM7p@TfSAqbL0Tb8D6Qpx@ClBO3y^_Pw{oXZsB4B4&Fy>Ufk(l6 z1q}@?ftKLyLu@+no6cvBT^ehb_YpwGWsYer<`TYGKoJtW(>H+9+5Ou%1!^Dth_u{y zw>q|br9Q@q#Ev_7t*ok8V;x@=N3!VI5tkJZm_2RAY8zb_~0PC2VEX zh@FdXEu+5N!o-JyB`&V69jh6BQM0p#sUmK;am;E~#}5h9F1=q|0o~2_82JSHZ(;#~ zlje^z)4GfGNK8`@21n`w_YcbXy@s+uiI4jZ!Y>-a{p>Blu5}{nH+-Rb{v#D%7M)^! zS+U`ab(iXJlSJEop4Cl{O7e0%+M&A-nwv{+L<=@tz!{Ijj8xJU1_maCy5G6X;mN!@?SwzayiDFec4_|WMot!Y3_0`vSY)7`P?l6}$mQ8~2!P?>Z zq~LM6@u0FY(bUc9jRze({jMVgrduun3V}d{^b}^_FZZMBJye}{cs+J~SAek1Bl;KW zHQw*vhen@&zttl>x3EbhuK3Sv5-tAX#S7(hv6<2KTLmL^=c}M9F^KheoZqFQD#TQa zo&?7Lh^;7j5D1Cj@Emcu3$JSgsXZ;7bls+>e!=E@l73xVQ`!5Y8m5re61z?JgKn&S z?3Rb<4DElbi-@7%Mv8{TE_%n%IYp3C{`b8Hbp%lTjDa<>R{RO)z4 z4Y|2fep*NEwY;z@yLBej&8E8Nw-G*N6qK1JFAB6=uA(;_{*WYd6r$I2aqgcr#ip)8 zZ)P%ldnM)?Gjgd8P=Kr2G~ZJ*0q+JK3+>668NDgb*>lS7zD=ESD8nc9HA|L+CIfYz zL`R;Q|TaKTNRJ0eWINZy#iX4G-z6J-5IL=7>H+~ z^&!Xi^p@Nqn@|xNx15&Bg@4cfzE7tN>D-O~YsFO{i=9k2j$w*p^d@M-h{ZQh-3K(z zS8l(a1)oRIOc3WwTb1I$Cszhjz9}{NU22^lY}oHV)!kQ$6>9X{&C3}uX5ed4A%2`< z`xwkn_Yd#E+hVdF^cS-{dqyGgIHwh*Oud4G>YU&Vbi-QbtEQ%=fQ|g)wYD1@;ny+m z-o1G*=y;ov@q@HcW$4=ey=-ec#@wIF3%z#az)JU*93^v zF(3smY?d~6U7Vl3O-Kj=)NFRRF_B+TP_W++PR6waf0F~0io$RBR02;0>XKeiW!WgG>m`V|nEt6st6X=HPw_=qy(G0FcdIA9vNi3E4Y{jrO1 zl<^1B9NJp@14NAIbjyfz^Vf+^J6ptw8@>5y&;qE`3r>%jph%T}KZKQj_dEsF6s-|; z;KE@Xm_qJbNh1Qq+TnmBTZe{*wq7!;rSpADfL;?oH&hb6lk$+B*N}5#4hGrD#jQ~; zkrt4FmztW=&dPwrR90;TN>F}Y)fdGDcMZ%$u`=Y8EncQSh!&hgN7Tt5oAvdu+?{hm zw?n4g7&<*Go&#E0VKO8Y1Sp`w+Ot_3_cL~*LZ%Q0c2cU|)d9IC(E9(7{YR5s->GNf zxkfoyK`cJ-PiWV8@Zjp`=&14z9AB6;gWzRm#$t=_TWK20Q)3Vjp}ap{148%o={gID zfj#Q+*)^5aV4*QJXGp93Y@_Jdiws%?79ULdZMkmCBeO=A0g(?hyq0rt#GQDx=AV3& zEvvUk>jl41r;=KrLYJwB>Lw|!!tvi{(YJaJQOGOAwha|@>Cf!#>En7cCu}2+u3}=Q zh!0InOl(OI5)z_1W%2v7B)=)Cz9xOM_J{&87rnuV@s!5WeT{a}?ziX1sM2-nEa!h+ zYd&WUCUou?uA7sCD@OqQ-iyQSG)T9<~6 zRpY@=I4RlAuz~Nt=Y_0gfthcuTGozpDMz|~!`r)?-q+(79Z^hu*)u^aTVID-2dZST4yEN#vdmdJwdi{CSic$ZA%9vBX6?b~Ym%-h$-Q<$s>xvpN+c!z6 zVwhj4d(fYFs&s6e;+EPuapYbflzrbiGl=$=BDY7V_;o-WhZuV50+CHaf{~Ub$?toL zZ@p@-aMJR6U<$W>ZT;9~*Kf3y$;#GU^-iX@rmx?XWneN4i5KAz!^#*p&7+4{TrsUiE5@XH*t{o+tR%VG7}gz5`1Y;DExrj4Dpxz`lKu$iIn#I z3%Fyu|LQqk$Lt;s)^N^e)Ck=&x)cw4F1@Yu}2n)!hG?H5iZ>hOZQXXhHIhi$h z%Rz76H_$=NBjR_!yG8X$y#FiuFqV#e-OJm)Mk0?1td@rf$%uyMwD1b52P6X@y9ra1 zxUb#gyaK^y+MR9TeHoo&RqA8mBcd37AZ=9m^~CSZyTtX5Cyra)Mhg@xZ#JLaF?*Cy z$$TR%eV?qf-1G=%#kdJgK9DA;nF@zl(Ch3-g^l3cX=Ke8Le8v*^p6?)8{`O9x{QDA z!Nfeza^gkVXMx5gsZ9sk*i47fDK$zOm*YG>p}OfT`v}2rT^`8|su14VP0z{wB{XUF zwV+LI>>+ zSQ>uH(I3?5;p}1C;5K9HR4jiCVrOM-T_4LsRZ3{KAo#{VRk%TW4=3ZkjgJomQK)r( zK7*z_l=2g}o3gv9?8=ui&KFt6bShA#55(5X!8JylTZGJ(W`OfB5d*#)lqetqmJXCx zi`vp1ETwy2$(m894~%=SF_?MF+~)m5$w4q0Qv>IRb%tA}Ef6fDDLB?U@8F8Skffz% z8cR>3H-@?7&h1at_37HTF=N|~NKJ8tYG)XJJ`o_ee8+?tqZ2n_cDV9>{`>(RL9nVL zAwmu*Uadg45#DxXh}s0cj5N#`U=S} zOR)VVyuG*o*gT&t^`VW_a_kBpVifu;L4(*Eki6Zoz-{Hq?txWLel-DN1y&tCgi#mA zHodRIpxDol^PwBMf4fYn^)ehj<5qjRvHqY!QP*{Dg~vXCYKV!6_cjVkC&`&`yK#Z0d*#n;f1hnvRd%f-&c1FfZtXB|~k^2HCvv1r) zUAX3@UM8!4=E@9UZ|^?s;J(l2dI7g4SOv0{{?46Fn|j4u88}2b7mlsD+XBLFDdDz% zvdKAt)I5zB#C+1J;Ii!*_&xOPUVX{gcA>}Yx;E1CWhTPJQT&4nvI zM5A$2#vxlcQr`c09JOgJcK1c< zg&!UX*G;#on=GWd1c&>< zEqI@Xxzz|i5%AzM+49{bl@fS5+A%t$`l7WuUCS*9-v(WzCahIgPa&{|HdhM!`#Xs) zl3;gdy9y-s+JY@_n#jYy$~2ox^l{!MrjI_^uobzvzQv6BwuFl~QB)T6 zTfVOSXnrV=QjRH3`je(i?qiDWYj}8YcwTUD@Qe=}s9t$s4lUdjkNR8SctSb6#_a+j z{h`Yz(~MSp&rk zqSQFV3>sD~!husoe0o2w~sPeL&XXLLb=0-=-R^9ci<$LM%jgTaL@gi{l1kF z(#3K8MD+nT=ug;eO~re~s^p528tR@eiPL!{K03z>g-+D0DrcDJ6e5OP5f014KqA%C zHmIfKuGEHJs@%ywjkc4Lz@#QQ*;CY&RgZbDZ+VnD+b{S?OYhDM(;Kh0cXnAkN{7E# zThgS8Iq@*67I)sc+*Mj?_E2yB)I!hZ`9_Dt4};jU%5emBbD~PGLLTOuKsZ>SD5W`YUCo!ux$F~sM3QI< z?HRPh<_nSnEk^XHeHW-slw914>bCJ;Okki$Rd*&9qQ+kaQdXQoBgk!OaT9KTEtwA9 za|WkzT<_YyjMOw65-z|Qt{HzC;(Mmr%;Z^i_kwEmBm-s}bIslB5X|9V z`#~VU&qH3k&NAEXqzop!rG40sVHJ(#54|kIi%rIewHZp7FYgO&$LC=}uqf2{gPn}%LWdXQ{yeua{fyD!18pF;YCWy{X|Dv&b7d8}b zdFC!#e(5cf(Q5R7NdUNp52~N2J+rHHH&?m%ZA(@3KHeYDt9Bzr^k}y8yMlfqK$-yi z0HPD4FuSXt1U5j_?t7OZ@FsCiYr)}W(|QG*@-}LYIczNecb=ajFNN4j;#jE3;H8zG z*}uZ1M6sy$liyeg?Cy9J7-t0Jgwv!$o8fEpQkD8kSyaxR-Z7PH`wlJD6{rD14vRl9 zU7a3CVR;!!=-txJ($_OEJ+6Oyd_gDQImA(!CkSck7V$Q5B<7aq!FY&@*ip^tA2n^NL9A&U5B8eMtl`) zkU!*^aBoqyrTXY!EttA~C#tEI`zd#cF_<#k`nVeYwUZDmh}rmv4r4v0W+}9$aYQ1^CuZ?ovs;*8rb|!E)aZ+ zw!>G=^XzOCzN<{eflS}7aE-@Z!olwXvW1*GEK{14fvwPAl8ZEoU;I|&j=SAbaOFbi0edVC=ydFyg<8a-7hSg+PqwEBtS_UiLQ} zJBIg5x$j&~_}^YFLyxsRXuEXlh`v;9K{W;&6#Ofk?lrNRsP!X;o^t!3_uG31K2o?Y z@-LNG+NxpgsD+^&jBBUv?%730`|3qXBrq}-_yJ~*#nI7Wm>w|{bn8P#kO zshdxh#x>9Q03v*{zDUHchgkHDB66{yqXW5v{DfG3ntudXNWQ}?i8FvbdRC5koB1;4 z01k1nY`IW03kD4z`?k8W&(&>f(dlIe!*mof*m^qr#dj14zoe#8Gcq$XaB$$$h`Qeg zd&uI-isrH~I96)FmH|8zCa{qIb%HIElar&-vasVZtppbs8t^(|$|tYW>4P1Yg`-f) z{|i`kK&d#8iu4mfcl50``8)_a20gAP5;1(fl28iWwiI-da3hhh%1SG_V6lKMDWcl0N*`{~qzj$V8fRxlZyW5fEOY+;H170L#E}fOXN`R-oNhXa zRAoIZ@WQjM5V}K4oX4|076&C`=aT5)_=;YFb&bK#`O`Fu=19?aviJzOmbIF)=x# zElN*k-6}wVfQ_RB=dU=qRqP?_<7coF52aEe9@ZK@T6RGZBjd+; z3>~GyFl3+qF}!ib#T@Sxb9?_2j{g9gugr9>mJ3WtqtOrUBmMUX(?Dxgs4ks#rvwrw zOXppN#c68k@<`>S85n;#0JV@-H%br%2usn8s~COAkfRZ@y^1m^gIK0m@_au<-&q-@ zeYH!pvrf0Y+ZOjT?gAR|`hMRR;0Ia1HUEzECK)YrQ-JNgk9b^Npo*;BV`u@bXMi zi{J7e59?1Wt}IAtJN7Yh#^pbq+_ut)DXz7@zkf9PK3w3aUJ&@mm&e??J5d`KQR)M@ z#TkVKfbIlx12(xm2S9+@KZoM5e(5xacmIE6y#-X2Th|7<5$O^TK~h0P8dO3_Nd+V% zr9%Pf?ot{BECfjb1!<6!+6V$7CDL6=cjxBL7tjCS|Bk!I_lr8Ags_GMy1{tz=%SIvL1@@x#hUzGet22_6C!cOP|$9k!!vH+ zhmSI zUYb-?1h)P3LQ^>Yn%h&TF)kn_l!s+_tW1%x@nyT?L*}6#{Mq`Sv55cFQVJN4)GoeJ zix~9DS-JTj!7|`?h0s3q((*XP1kfH7%4k(M5^2%BVU3Rj5uP&V58O5yo>E?%+J_`F z(&yQg|4E#f1d!vgPM#PIg#~C^g;r3cmk=7)NFc^ST05c76dGCe4p^YtNKPg$scybs z=G|knd8~8fV%cvMSixHi6!$&o*+;xc{^~1f&FUU6MIbA-){SvS?oCR*NEAHBRL>)6 zi-PkL%dB`vzU-0rlZQACB5jKl3*2_)MMYBJlAtaXs9Kj8RfPT?+;Sod*e5&(jh6Jy zL%vOmgV4?Fpgq@LNZ*skitB0}4l=ErF>{%J`}Ww8jf5a$b%6SKHM5p+6f{+v&Dg~1 zTa03yb#9iHf06)AW_88O%@QfNBmbAS8+D#eiK>e*dcC&r!EL}@6x-40JAj$qQoX5w z)MM-mLPMo^l;tsY+Segv=>Gbh$lOVM21nmmchRkuWhHpvE|nMIfSEy80L`+t@GTl! z@P$*ogLvVjn74H=BZ3ZUXU)}~5QX&48hS-okAM!<0R8rkvED3jbz=qELi5IEgHC1@ z0#~VjO-AA-&CVfge0RIhrjw-qN=qZ-L4ZLue!t2k<(itR)lP*9SU(w!RJpoa|I;?J(HFvW zIuQxRaBaL`r0W5HT|G@bj2Z(b0%F=XR1v%N0UcO~_69W--5=^!r*haii4;UY)Sp@F zi37#_lc_IHQ{W4`cr4KN4Y>j*tg(kqk`!f83k=U7izt&bL%6m0CmKxJ^VR8N?exjH z4@Nh3yIl$P`V|c>DnYhZ%siemchR-l#CU#uB+qcxu#;12u$^#E$Xy!hhTr*Z9WwKx z&mQ_o`0i4FIrndEyFa?#+JHNF0ksAJ^J%7+{YU2xz7%XSA~?L5aW^jCDkgBJBX4!X<{2yky=v0+MM4M{xC`1;0L0T{n@ z=yD#jIZB>h$`G72EH!Y@6~s74u@JeR6CKg4eDPv1Wb$C1(Gy688UrK-%@Bo@kgMfZ zURH!TSD(qP#)Zz5#qkBCe zgpC>CJIraJ$el^Ug?zP?m)C9OWKn_`1ss_3gX9bi4Gjg7wV@*PTtkIc*m?!<#v%D{ z_^vPi=iP|ILOb!N<;~Ud%#R=A#4^EmAs`@-8!px52A|FR|5Qf*^Axmls5qH&s$Aw@ z4{kznb=!&=ltuk>>Nycn+`jUrWnyvB+Q}%Cl%XxTKlkB{ACIoTIn*u7H3}6*a(%FF zd7RUA&kYo%w=82Y81v4eFJGh{J^I+?_UXYx>rL9zKdW@VsY`O*`Fd)X)q;zUx$;%` zcWyD8H2Div#+2j&0kN^vre< ze3Wo0FQii0yskXNoNPnba*d6R4bG;^M&RQuIG`?A_&2cYM3)}S-E$w~w zKTh&3+ric}V>!1?NaR)ARo=$NN*jC(sh7q2s$}P4V|9R&?j2_)%wx1VbG3kNM6V*b zaOY!|SvaFSA~L71xu;CTO)i^W;YSjT`KRU$2F> z2wbAQeh#zT;XvH0x^QOUy0gN*bvFa9zWoNLf%C|ce#$=q`_ z=uf%gMb8&dO~gbp^cbq!aa~h^G^ayeiL9REW5A z%1}59XI>=oJs{>V^7o{uJ#u4@Vq>Mjc}Z}OV9J#w@Q!qAtx*Us+JF#cN>gb(c&2)z zuT`#jfy0$%+X`hnBp$4?qqZ)y_NRPo3OX(F z8FgO>UfNNPOn~XPFm4F4@h{)MVGjvsVENciADt}xEYpkRZ7#`skE`Tau@A^$g{v3* zd2zjtPp+egV!7+$?^_q{`9J4Bso9_Ft`R~WRM2ibU?8>VwY5Kb-5XUmKyG$FN>MwD zvZ2{t{7_4u>Gzs=$j(uj9x;_`n0=rX$`NllBaOJ#I{ZT5x){YH-jf8)Jm> zgbdm1m``|X*Feu+@L#9)AN^a?6RWrm+ybR?2@E{;|Sy;XRe zw|m-4;-%rUzx<#mt+4Xq8;hy0nJG~1;bmc^nM#W~$4Fu4lAH6p-Ew%3pOVkMMSlrn zTdsq{u7qY3vnd%|;}w#i4iKlw>u6|iuuQ1DE0Nz`RUT&YXxq29KjdtH_^9`I3bpdq zOGFv=pdj;Mx`&VAh#^EYa%LtQ^pLbAQ!_C|Lu}mQ32d%)6^_%!j~mlYiyyp1@vW~B zR*U&gOwM4bxOd`eqHytW>1=Q0ing`21Qo>c;vPLl&2Ycxd>_KCgucK*dB3GL83(0W zaqY#9XQel-EoHr|`en2Gf1H}VcVCAyUjC=mqa`qWUyq@nJuE6p@M}R@niPdNt%8b5 zL8;ei9n73sSMlPT-I4}pxMb-~*WcfIKh80+s z@63!Ylru5XeGB!6spR9m|GdmC}A!Y zxl5k$kch;II7vbL2{Z#vhjJfBgfS8z3tMP`VjYNNuI{?7j0`S$f+9BW_aY`E!z1s_ z1uCT|eU63$N+AbejZ(1JdM|1x{{?qhqB`PY!X~%aA3Qk^UKjyyC29wQ+~v^MHKWJ6gy<1;FZ@k}dL1$vkaZ-|SG79LD_>F9^peD9s+3t0aS6bVT)ZR(- z6Pw`0wyKVvyt&ALwxdROw6)wERFboNSA1AL`q~kzZm8Y5>+q|gu*=rVigwLOt9k8v zkJOOSOg*S15qH6OW$rgEzp6bqbvuVktz#cScanYNq8x>Q8$2D~KQ<$|Lzu0;o?@ZD z4#XADU*y5!+^$&jT~i{J_ijDX*VgtV!j2uus;%8o3m7a?(lKx@MVKb4CGHYPe9CLt zRIceyQ|^4&ZGnq|>Fqj8H(0>*J}-zZ5FYjX^&ER0Y!m(#(RsR&3J(4C-#=on%!27y zr`K1Ijs2W2mz14TTvYb$MavC-xDaiLB9u9P`oXm-I}NepJOURP<;tGRz~6z^3lq*q zls#g)zyvvHRz%#n2Dd-8cpxv~GymyyEfn-NA)r0*2|GgFU{J823yvuY6#)0;jz%y9 z;yHbrM@L6UK6~nDfAbm-kDP~xaD#jrZQFQyQ}yV9@@pV_IX76(csaRjASUfw)D2pC zrCw8*NME8l05l;D*i7S-Ti0Pcz22b^DrzHchqUtC+5z zTtIf?z?BUkF}dYwHuPyfGV%K)N;{$e4t~QoO~2nqwaG>(-W9PjHSq^xqt+0>pl)m#TBBg z;^WD_o`dA5J0KPhWpDpj&Q&rLSzl<^EqIlhjY92J3;<2oy`+@{|MV{%od{tT>c4^8 z_4U5NrMNGPlHzGKZ;4a)Y7qNqGxAtDpuQe-f`8m;d@*Ae-F>eIrkn%m#xE(8z^95| z3i*r9Z-&JCbsQddWK)V;pyXCRWjLdHJbh$jA{&o(XAn1L(KQOx7kK{HtHzs#aEqkP z$VF~m$d;lid8}JB|KirGWoGN@nGfQD_XS(lw>M7Tc0kuXX}o$VB9eaos!dB* z@K4P-G3C>kxJ&xU!ByXwZ{@t+@g%{(*z#0Y9Vd8%@VegSotI!(Q3vebdka{X)Ol^# z?L?fih=E#1G2>h)&~SXpS2nF+OTsXCTJaAG#P-W}g*~im<6;Z%$ z5th(LziP`~_f3NvCjIwi-R6_leEN^cBNgaqyl`6`_%xrh#Qvl`e+dJ_{^4ATU@x90 z=UAy~&H^bJD&U+-cgn+lNxVd_f?%}@gfuA_eIbIXVB6QCQx2x3+(YALWIdS!o%ri$ zwDt8d{0raA;-YXIM;;At0>*8l|aBN5eRYHY!gc4q)?n zN~6HTH2oCV22clCO`sL(dexX--`7vz42gz6Hr=No1L_#$t>23C!#XYIx{Z2G&-LB< zU^h8AG%bWe@w&QFG-IJS$*2Y92CWGl7Z;B29QX(L0(T7%U&M(vsXVdPxFzgpn@=OI z=ct$$>OJkf+8%d|EK;z2W2e5sL88pH3^ zO$A@TIz6YF71zxy`4`^Hq@$%qYk`l?)bQs))@kYI4%lt^|8a^nmNMc6-A+>ss2ODM ztryvJ_|gR2L5)_;z|~^fl;MN$_nb6R)72EiVp>F=ua!1~483FIk~%5-?OJ|enfEN} z#bW-65^$Wz+TCLXNh&m{jup=Due>$Qn_}Llb5B=2oe7D3t~a4?ff<6s)zK@;j|td) z{VVbDWUbV_-lUY@7l0ecY>cm*wo}6Ep~Mb)+d+`907JV>jFRhqf#o}=-M>cu3(pe9 zZ;4By8BIWED5-ohkKdadD;o;iLb)|8n9^Qa zphB6eouCCu9+}m1w<^nBKC7?2b&!=f7UIbxhWlu@BMkC!Z%uRjSAmyoit*hF7GMkM zA9x`*_rM?tI9SB}$3{PU71jdj48pyXv8#OvWH+?CMA+@C(zu6tc`cy}$do7$b)X7G zWSKHBuQeiiMmBDbTL7V0%dTMG{k3w&jy;Zin$Ygn@3VXRZZG$AON#e80NX$`ZlA`% z*O~EOp|Sg)n!0PfOW%$5Rv}3ys~3nm8V!z!AUuEmd|g8Www9J_L0Fen=`{|HXR)!d zpO~J`rJkS6DR^*$3N>mEUsUKGLDt8JehL(5$oCmFQepqn7QoD2?57oBA~I9%;1SB+ zy75-?qqPGzWrKBrsQx3T_U4h-3dQPSK+6>tlZ=`;C7JMQvZy-|o}XE3V4irn(klp9`g&2)toq%|SE z2jEEq`+BFu$#-b^L!qv}Cx&8W%l>?W$k`Yuu7~!=yNZg~DCqxmSsA(L=jZp%?@C%| zMD%mzy029sS@{bgUyq2uJ?|S=3 zbMF%cuNysXs9v6!e8jEX(5E#*ArhS6HFJ<#b&5TZG~n1Ey_?`TfZsjGNjp6~o%$fl zO0<*D=PW8lAsB#@)U>H@DmPfY;`Z5X8&xe^?rbt7!6Wmngz6LPzYhNEI1|0;aNVHP zO?28kavEq`n6*~9nWmwKufOjZZRh-40ojq?J&wj>Rj*=&+#gCw%VaP{74?6S%XU%H)C<-vLP$z5#)x6w==r2Ag20qK0t&dko{xN`Ms{D_5}$OkfZk_LHc?R@8qY0kVMOkABkC|OL7A9-qrl}Mo=`MPS$jVEQ+vA4 z22tI^rbW$Bd`P*lVrNQdr=|9(%Mm=@AFB8KD_(+9U?j@#rFqvUH>WXrL&x0hc42xA zFx@Oj*TlznjaZBG2nxFt5yKnI1BXD-hjr%$uZ-4-GCL;ovaKn=6|qMUAg7x-IRwR>8p4 ztpQ}>LYh~0Zf=m4wO2b|sjlsgsPimJQcbO)0Y9xd1{5D+p@4c2Ar{KsGyPuTBsq)1 z^Kt(uLmUd8a?yrtG;ROm^R&eXNl_5zW6OEF=fQ`Bkx|9K!gEi|0AbxDHh32qTX{Rx z`z0|uuxWP3;;^i^d}HkGA^@sGep@r~j2*iW9;_W;lQWh1$O6t{+Ht5hVgb@`-@d%Q za6dPKw@;{?z{-P#(u7{B+}gRx)%{!3_usS$uub&`?~zcWU@8I#l-LoqChw2;Ss(_E zo+baQjp&+1avuS%gNM{BD{u)=S4De&7vNHeUuz!3mF{Pf3#9i3R!XW)kbACfd3 zS*wyd8?%>27NKU`Nuv*{?q#j?xo*~srs+(7VFuK%%emO#aE|pCL7)`=-r2%*rR^)A zGI`s3@E>PTfMp$BGGyp7Lxwb~i46`7At2&w_JL=NVqP$;4XW9)G~yF8U>uA!vmY1+5qD@RKJ-5xC4Lp*-XY;nk)h&kz#6EUSc@=#wo}%0oziKIWEn4w zYw<9O_;x38h$Ga5d7;IR?l)p={~{{^?kB{l298H$XMtUEj$Sngl*1J>Qs6=bZ%)vo z{Z7MGZm_@BqGjM`!GT)a$T>>@LmoMh0oF=9@X36tGLj^~35uZ5I4GgZ1DJ0=I7=3F zi7Z~^f{)-_s4@TBGuF;$;>v@XR-OzH=Mn=JrzRg?1|V9BD?jWYdkG$$>6mIct+Xu| z*$nP(1T#YgNT@J2V7Bqv7!y3Ms)=5x^Ci2qXbn3F6C1kBf={(%P-rM5((ga$g;5fd zlap%Go?>2GbFr3E8>@+!n&P(^=;Zhq{06Xu%bXX1pjl_AARPy zGMe1!KVk1eGC2TTf5J(cQCcfy=9wZyW;fhPOxk8{D;4;3QF0pP4p+gp1$vpZ-bPm~ zbZVtIug+A1z_iiLgq(;@N8~amJxcj{sp!DsY}`rW;zozkvH0f>&^h27NNam4(r12M z7uXtwWUm&$TOTuwBpnpHB`n9C9m+q2>ab{uQ;h1J!UT0KEd*vwFYZ9uCIn~X6clFw zf?Y(S>i^<3H4Tj*C=&Sbh$JQAUeCbD^N#lIuOaC*y$0H(y4k~94MRl%I&aT1wmIs{)OdGz=(4x~FhJUx34tF`iUAA0Q}ZllbutjAs9XV`)3 zf6Ep5?Y4x|9ahRcj(e7hSeoLAFWqpy&cD-6t@h!a;7uY@;-<6{J)849*@T)9wgvs! zgJ5rcaH&%%N}Jr%N>qAiWK$HA8?a*3HmcX)GH*ZN@Eh2x`7;18_ME^5?=@BG2?!yJrbClF zj{n|60LYN)n**O0x1T*Ga#(-BVF-YxAlG<6zfp2fk78C_>BRAEv3~evp?NoL%RWd( zo8EQm%AX>wQA_)_?Rpa*}N(6^MRuWr-zMF6Kfu}BnijLoLN#<<1P2S0Pov~y4&mn+W z3r+TMTlV3b&QwsA0s5*_X!BG!KaPhVL7|mmX>4?g$Wd!>x~xxGyQZW5--o>+%i0KG zIt_@W8^ZuQ0dcV8+IFm=kY_%`rZZ?ECOR#foAGJ%^fbgMRq8CPxxiZ3D^$Q*+2m_8 ziyAQ^|0Acfl+DUFE9JHYXj10Z&Z5Hlv%_=hdo2xGKd)UwN$zZOq3X7)7hx530QHpA ze*E(O0WlXzf9@5p5yx*>h)WNzN(<$yDKbmHbhcJ+p{xb-?npg2V_NxLQah`mGEd^0 z=41qXr8y@G5U1MVH3pu?`t?XwVN4!>4For`Ucs5f`apcJ(^3yad0`=(G%2!df4}6V zPl_L_!I9TNXm?~3+CyYc3H{p8x|lw#8A-FiD@|V2(2w75h@LFw0C()9`7ScC`Nv(4 zVFv(yiY)(Hgw0a~c3Y^VOBx`Oa+c1TE`9qV))Q=6Kz$Hxk&Vm`{m8} zmiA5@)LERKnr~*?g=>D-zN+a@`(6HSvoNq#8y!4nf;5QE@qn6y|Lq+dNI{wKel?UL zL587Wc$f|v=->GPQInSpe(H3@s-Nrw1zgl6H;;McfzQ;ZF}tAPWYmv8ggBcqp;%??5U*TyL7Gi|bYnn}YdM zB>U9yu9*s}jzwSwJe^CE3Kub(FF0*-6JS#F1=riG*a>A!4NXQ-5veS|z&thYr!w7Y zA8R_wyI2U=A3iB@zT?n(?fC8)l(|we`$OyX*WXIapH8~MdRm5}vgWA^ot97jv)tmp zEZ(&;V9n9>X)sZLNHMjuixBRbj<|0L{_G`IR#^)1Gm^Txv`$V=R-*PNnB&)LBusmb$J2^CK5=f1dk>7--IZaMOxEjzS-;AwiR~+FlXv)%dd|bEs?vxBRh+ap;mtp zgn4W*#R>R}!JHqjEBjvi%))#$NahI?0q8TW$YvrE6RliBQq5G%>M-EJdwXu$Pf)@! zJ`au#0RF^6&G_>h{a!MMRM~*5F`JZbFbo?Ep5>#Dg*<|tio5LUtQU0V3UHhPwMZcp zBonXhz8@w^w6k*&Z$Z_WPkK;UgyK6olq~fnRJ@+?Z*LMkwrRam+ zXw*bs4=utvd64l;j`DXrA%nBib1pG1;IrQuA}RnA0p57$QV@BblKhQKCxdatJT*o?F_?D;Bqket1 zy{#D$r$zdD8$T4tN55$tQxJkfYk4xM3EaGw?R1?>)(d4ZksQP)9CX0L92n_Jsbr86 zDox#5ICsk(RR>I|K^}tdQzrg``6%LBNQYQp9 zj2}Eu1l|bE6bRK*x8}c+_^Sa2Vkd|UX;GI38c1`do&z&`c+wl+U%>thpNr70qb{`# zlg>I3BJX||y- zGRwusp@1#Wkk4PkeIC+J41RTqUjQs;3*V^@(Fgl!pZxJg=t5Gbr>Lq{S_Jwr^wBV1 zPVb;AENo)&?{oFT*DuOiA3MDnZf9WXX2pffj?$Rf)Ihl0Fr<;=PR5RC>1v4=ZqPs) zF@LjmVLE$tzrG>^&5zwZ9_QFOF3^=8g3QXH{Qz8}svMu5-^0VfL9qR%O|RV*+aB&J zv*xI!p!-`dIRSQuRozpK0~tr0a{ws&#R(CL*13yZl>M$H5U~OBehF}Z9L%+*SBj4j zBKgh~_t5m37@9uK0{UD#?Fd}J5FLTdJ`VV{$1(Xv4k!NWze~x1D);jKxE}%m0w*^M zdngK$Vw= zY3j*yKpyF9d?@`C^c)!)K))gx0{{r+PRcSeljk|?FXzm4m~J_Va8?MEHUV5rvl&E5 zsKDt6+9yAIyZPhHJH-yB?!kMx9p^JFRwXj|D~)V2GvdniB4g1tQLz8=8bsdrPzR&0 zC@O?Xn>0&FwR?r2d`pBZ!zvX}RK{K1t)#3uh~i*8LOaAOh=>B8FC<_PN#x%;yA|^h z^^4^P7F>sl+~48TB%5V#lv;5Ec(4wvjoNbfhIX$Jl5IO%;auH#jR-&xRx^??kb@+FY><}8YEggn$6v-2e` zRh!b(z<`dh`T|hU1Vp{`oxijVo7{e*u`hE8xVFDta^eplUcZjH6E&iIqOaY1+l8ch zF?u7_NuvIAR9YxdoFYD(E`CfjtI(CieR$lLb@48t zkG_oqT!5)vsWm~s+=T@OAxWcPKlX65OZ8Qm!iF!z-N{jWHD!;0Y<|n0Q+~dkW9e=m z!sN_#OD70!f+^J$+`6ls0{ySNY_u&95F3Qs1_B1dNOh0>A`s6YVr?*8Ephtr9=GSQo6ZLckf!U-W#ZB)Hv+oZ z42YFuO+8{I;Y$!!v4 zOQmo@{dBbo|3Az8w7Njzyzkv}t>z(XzU)Q7AdFsbrOqfCBtc$=Grt{4xBPXK)$yMS z`Qz6c>^b}muJ||;dlRU@xS^`|6$Rce{g(AouT!9Q5_^q3_0{sMMHp*xC7PT6cBS|k zXiuj4#fh%4CmtM|{Yln)+BsVj5vD4kNcJ4*HU7r9%EXEwb)(o)!ReDdR=^bvDyspq zg;Op|a87HG7Wk8V(9zj|{wW6>+#VfACi!u-Stym@pOcv-jgX-Am0uijYNJ~)*SI%t zY0sLE7Iu;)-2i@X`Ip$3K4~Lca&GB3kf_Md70km$Ug3_+w85(w0t}2E zkuG4!y)33Oe#smtvQc$F0bS%^bU7aFeG&B5cb>s|uP6ae?$ZPn7AmlQC07jDEVz>h z;7R@}3S6+@e`%M=Qo9ZTLv?)1V5^@^O{47>-!zK_w@fEX{Ruw@&d$!Z=RdcgTcI*IT5{e9Wqc452pRE zX^^q(V%`N6^dFheo4{F<_x_80)fgbR9u7&8Mkp}2Vvv6PwhT;qR2sPMnootS3<*?k*%Q=cMmR z17mo5)YlB(fLe;*J$tA)QTxt^B;XGM^yRtCq{=eAGV=mv2pezxVEi@Dv5I+yfCsze z{cs|cM9>r-79A~r@7}$n&Mc@Ul#|1St_NtgSoC2efB5bna5`nANA!K0d>+FNwpYmi zX9F;;KR5W&a+5BhsaX6fEK)4~-|$oL)Ca0Pi)k(;-*U!<+M0$?vd|cyM_z^&3ggwW znki3k>LEqIkd~g#4TW_Ycm=M`O_2B;c$LeaZC7&MM4{xDz@cLi%fmo$y!JY8JSMDH zx>)L)Dhae|=k|XEMb{-g>FlK&5M4-qZiQs#`-b*HfMCmzHV=36U0WkW%SDTI%2$%_ zRWDitcw;#(bOxdrvZY(33}Rb#tN%@L(@=rR%)58*@_psy;ptfNghHLuevP+p&m&D5 z@ahuV);q#NNkVZOYNDB2Vr*NWK)-6EE`?=ZY6Bb1)-`?V=q$7h4bj3Bmq)#6QmK62 z$x7z6&vR;OYCbU`x*}{YS$BJy168*Xt!?~gj~t1Z%mGetdcQAcDHSuB_2&(g2Hts8 zb=Pq`%BXyL;?+173cYlU1Eqbx#B;IF^APec(f3#s{_%qKp&Oa_D&G~Z`V4u}-xnpM zW}_zFYeij4V2|t=-90pH5j&w6RrJA))Cvsxcvio)HYDve^WJ_*-AS?g?)v@MUCf@* zTU`84lGwKD&$w*~ua(5mN?yY+9(j(Jl%_*7Y!Z5F_FQMitdOG!bK?E2HqWbkvn1o5 zSEXFFGR3r3J}L)2v*arKX)FfpaNhUB>SSPd4))^|j)O|mWCzu6O^8L{Xy zo9qjG$i$zb~$vTVNVj#n_d(f*AV zw@&J&R(YHH(Dsc>q2^c)c>d+%f-o#}-QB;Q&ECFY_xj3`!*Kj^`*oc*PcghEhVe_Y z+w^TU&WsCm3+r7`(I`|=SJB>|Wm_i+$BuzH9bvu1>ptggG4PW(?^#jQ3SaklVr-|q ze(11$LQp2qXT#P89|)2g+(6R73uhrKckza~@leT=&-wXHYm*Iu`F`9oa&o4aqy54` z8%ryzXIeQV+n>&n!x(AbQd-5Ua)#YFZWn4zzPZ0s^e~+0mOv>U?yBE$0{1E&5YIf}}hysIE%GZONAPi*PZ1)>} zd{jdPytQ+Gy1;i!mYQ1n~rq`N$wwxp81SzIuWuC zJUkXI9c{}O3G4e3;Qi#?OPp2UU^yOzY0wL|)1Eo3?^1Klc%ScmIrhBE$9wM_N;2i; zl?Hhfa(j+;#T&{~E*SKt{$zP0HyLb%z7%S$*QpEJ*flb87Il4%c;=VHu#et?t$1hT ziN%~(^-)Eqv&6%Vwcb^Sv_%vrQcpY=;`-s}OtQ}jF{!pu{Xm7dhwVM$j9L%c0^aa% z*ySX3$bFz@w9f~=}@iWg^A&DuFst6M&My~;bp*hZg8BguKH zZ#?OB^Epwb!#@r;7{?wwx8)3(l=siOlb46X|Egwv7)Sb#xQed_?kcrl>Ll4ctYP$K zl{weYqgOBkhw-U)vFW+7s#sGINAXUxa5ulh#e{POYLhkgwCii{bQ}HBYT(+PM@{TA zka+mXW7A?@27xx}^D}Kc3|^6FGG+Fj4u2oGKHY*%4j&^rtL~h(b`*u1f?1ofdD2)f z#I<)+!O+})6^XNqGSI6W^booXg?^M*~iC9`Mj1AQxL0t--Nb* zL37w;j<(vrP6DkbR01Z$5hiyT`q(V#FolO);u3bvWmFA(E|T`bdi8w1A8AvV%FQO} zE?j(s0YP^ne?R`GkLBtYA@RK@^m3N<>wDg=9=5BVqPIA++k?%Obs6AT1D7NmPiAd% z326^t7DWs@7yH}iUp#m>rdpi&X%`2hNK$Jb3^JLw1{>Rk=Z4R%Qz7j2`waJ8pb& z?M0;XNztWb>O14SMWc6wH-;t6{ACHPjgZQ-+WWtruoJ|bt|IEi;#B`MvcdUG^ z2gVTg`k~_)f^*lCQd0O~Q46$se>l35FPr@Z@B}zE|^v}D;MHRNA?0=Y^Xq|o8 z+16k3P;IYX+5Pcf*rq>alQrHZ$AQxP*1lB8)`4ya3tx&f3FN_h-i1A48?`h{1kYPI zk5>eexMQ%o^V?kZM0Shh&F;j<-pi{*?2d^EH$~ek8xVUC`<}h@-@mr6t-o_=~IBo!3U^e57mw7tPm73bW~hiO@I9MUSMeFdrOr zn0S};iIq=-?D>XBo*WNfZ9F$ub}%jUb^CK^=>%pAUslyKqX-AN?tZsjFEJ*GF@< z+Wt0q@&dVPYtt{DBC0T>+GEJ#PU4PL?Vp8TVwafHqC7cgxlt<%&BihQyPZb(6HcX% zycBLD?o{kJeI1d%7h}7dJC(P|y~`j0p;=Qw#7vaaqYZe1k542#t1$~0#D1d!{LlN~ z)`{&-u~lsrZm;T5&8`%zM867W!9uCz?z84v zsu&;+x_0eaK(7_a_TzJ-g?3C`)F@T6D*Erf4;_ozkNt$%AMjL9)r{}$)zVN*l3r`= z&^P2hSd+-%c7MyUE28G^NjEI(ZrL|R_!E!hRYY%95_g`*!m7nueMjBqBhP%}<4Fl@ z@uC6`yB+T1^`qU;so+(zZ<7m(UzU?$m%oEKkSMH%`psY8d2Zu#hUx)w1VDp52DIe`Am+lAh1Y74a z;q~$ncPtdy=%(r~Td@WaazTvAHc;8+`Hx3b`3p0>CmRX(Ki*}+a?s`=l+fRk{<@lX zqkFAoMHCgQJzxkf@pYyO%3`MYU~rmEz%4jTJX!yHLRwcdwB2yBPN{^6y@xo?jQWN6 zi&|f2LyqPP{34dfim7Ie;Kz1J?{SM8U%-iaST%C&?}6`WGO4oCjK&;BJAeW}w5Yki zz4B*!A~>4MkRwkrE*^ZDl*EnZWoLh?o7eQ3Rq@<~3wy;$lx)hEBqWTAQsmOV)dv$v z``(igN;C-^v3Fka&ZG5*!d_(o;dLj>px|yonmd`dA^6OG{49i@dSllTM!Y~Z$a$<9 z;;)VpA#Q`e?EMN6fiq=9Jfi!Ui|A&rjpG|0>zLHACF+nAjPtc({58XIZ&Ex?o*z^R zHQ_I9z>plRBwya!mfuDUIe01SgF78+D}v~a{aau|2vZn}r&q@fNu{IvZu4z7c01{8 z;@=nkxj>Jo)h>PxeU~z3P}FX31t)jNeaXSKK-?K{WnSIX2o{mg`kOtf(jH!4U@pIJ zySY(r&F3g1Au8(n(uXS>EmAnT6-cAxxqcJzj8FE0NfockOd&TJ@sc)oD??q-6|D^U z7`-OR#L}uizZOZJr}499r6f{2D?C689;$A&und-Z%~@0Bl;TD*c@-{e zR#wipAV*593QpR+K7YmUN7w{~W{ZQkFX%*+ z8O=8KTK2{zFjOKE<4+k*2A(#K8@(9pp1mZ-YM^yJV*2?a`7#d5Rbm&-|8Upb#3vpr z;mZk=5*3@Vn01V^kr!F(g<0xDitU?7w(<7l#J524=)q;TL~&o*_4ReET@jbLmz`$N zu_%~80#%KvwOna*3UKO(J7KcSrqwpA6HHwzaaM$pE@Vw2hF zIA<8o`?+_X0|$p2@kMtt6=S%?Z348-()1v;L+{69K+#9P(n=cRK|U=OwPZh!EY9*StB-6yY9g zT_o7aaj0CPel}=Wi?|^gqZb-Xf_o~rWmAkc1zJtO3>xws&Uo&JS|6!5Dg$u=C zrJ`LxJL=LU7A*V04c>ESlT|x&_?JspaP4Hx&=NZT{C1GH2@a-qZtVLi_ZS=Di~`2@ z4VtLda(pD9X2nCz?|3;=HnrAe;VGi3J~$T)c3^x^3@2jMdy}!Rj_+W7S!u27>t`a< zba%~)cvE_}dYK<3xi3V=$1FZW82$Om3CU7gVidy9!_ZUZZvVO0Y5-;-z9gZ$;Nci@ zS^7-DGa<`gm(F$d_QFFA_a#X|Gy?Zr>fpZb`q0=WxZa~HmvZu6=GR;viy_^&UB#ru zuUnOW%F%v7dLhox&UyB*FmL*_QnY`nivJ&aBJEXq;%WOpT^)NR6NaqxFCL4>zI=IZ zp_RFEQf7;!K`6(r9!!QPIOxv>AD*Keq(fI({D@&nL_n&rp-AL$llaWrX!NT+$mP<> zQ6IE&_&qoN2+lgT{rG`G#VK7yty~^f&r}Xp=q>G)l@ZgF8RrAHJyHL@=fH+8h3 z`9;U;5P=hJ|3w~-+?D9`PG08XBE}8Gf`&L@?;Wn2wD+ra)N^_P?7_{rpMaat-nVib zHuuwI`<$sgc$dOUvB(3>rR;UYh0PHL1qZuw$Y^9~5W}=ZwJ_0sS=izqC-U z7yq}p7Cf!Tr>!E$b3jFH?7!yO(`qXjgR7!FB*5`wIA|kCFXBf0>C>k;QP1lLT>2nu zXr$AsG_A1k90>_YoUkKv2pLmUA)gL`Cg$|STsz%88_0z{dp1p@aF1>4YIwmFtdXsk! z6I=gEnV6(@PJ@oR@Ek`sPp~Ie)@@ zKFI0)WqGquHxI(_i#M)L_<>5qN>Nl$Al!aT-bJ!7N;cXp?qjGLQDr`QVPWPRxfP>+j!vG|+_o1os?DnO_MG37Cr@Z@TAo8jmsX8N0s8te zBg2WxhIxU))uJQ)^VSvAM7LNYtOUl~`K8(cGFz&?NUai5NgyMmecD27BV&_$LG;t5nEmt7+|3SYBv%bN0 z({6c^HXuW~(yZD4lg)>DTIVlZNXyP9L<%!?b#<$>%F1-O_-G^H^!^jq3TD94G?DFo zCVo;*wrlotStzvf{pq7hBZ-=Yv(Fo!0l&q5O_ya*m*w{_k6WLGgqw<7mXKhgjl>1O zop_rS&OI$_{*3sjI=xH6w!KX=6J{|KpKO(3VTOWy`!1+Ne&qZsGlb6qn;PZL%IM6&?1phuN?|*l?tF-=9=)Mdu!!!G(h&cVhfAHYJk+`;= z9#Pfk%I?=MU#?r04yhW^l8>T>X#KbyXavc-O8eJBKdK5n4ZC*bRCw-KmD18iHmy2` zhlgYBJ`WEk*wcSNG5&(0E5^EW&3e+FX_?H`89B1gq5tj|_=Q`C9#(XqB zjM_Q9cN*?7r|np+u34iBdy=Ic=UY^T-Xq87g(3w)^M#f0h zGhMC)rKJKr_bW_+K5KKfbM==vkR%`}8XwV<3AVJH)_I#JyYTp(_AB3SoD}i(+&>)$ zK}Y{D^-Cvdp;daJq3|INXpCEGDsO`kiSNgOnZy(GDl>@u_s7hx3^6WTJx4xT*!1ZI zVuE}aRlpkUm!fCWLy3u9yOCX)!)=CYJmjC}$h*kM$&a7e-C#~8GDHNltMuRR;Mbp% zbUUl*kWVvkuUO(hetY`*r&YCo*p<6`FvYgwgf@^bWSr`E(D1iTckXO#YcL!o{cRU~ zP+~CD9@IVPu{l35|MJm{vL+^%m)u0)=wHUiNBsElb~$R?e>N`Zs_?`3ex;=~5u_+xb%^f%V7qcA<(4e{vV zQ{V4)Pwanx*~5z10oRwKcCj(hW6yA23MOz*IRCqruqSejw-CSaF60|ByT9289*PQq z(F-^vVHBmYDjizoTZXw3kbW?D3LXk_1k3gP9BRON85}lu@D_0fB(CAR-l)`{vWONU4rcrXq9!U4p)Ol&Ya&6gi7rP~|-agmeLUeNG@GBWrHuMbj^s zgF!JM?*NX(|9Snd6;>0{)YcBIs1RNnF6ZsJ4?R)~H~+^bkG^d*ecEXHZDq7d8Zi!O z%G2~(>FGf_lY5H#=%vW}PBygw%(^9K5{LZC*|rN-=3U@G)^ z-oAT>m}xMCpvjOO^6~Ncbxco+2lM8PZvs}~Rl^8A2bjCmT13$GIeUo6k2gifgU2& zj!>=YA=iaO@C_z*WqLMYvLK=rSI1X(*P*oOn=#*>Z^xv=hmRk>uR1?|{1}WpDHvC< z!9wZ1RzOzC4+@?0c1JiRo9e@d;R6FYAYpr=_T|HBs;U#49yT^yA*2k1d0LC^hmy^k z086ME8AZeO0-h7ef_^ign1Wt@JLj#tDyF5nYMPqC@$t0#I{#*Yg99TqT1`4w<<6U{ zmE+@|kdQzWDc7)DB_l?IeK*a`>b5&U6p`{4QxBf+L2yIwRQ>)9Y8bI@b{Jae=|Xag zJ}O{S=v{0q9`U8c#YJq!Vkp$L{{dU@Lmq~zDkt3zUR&!pnKv&VewC6!Rws5)Z)EJT zGI9&NL(7}AGP1JY9$jx)#)6#IM6&nFt2=Q6e(=0^I+vZku62m4{$RHz#>MVP7JL5t z_k)3DHyYxQfYl@~LeL+b;)hCI{ZowaN#HQIrAVM#{~xB_103tVjT^s=sL06PqEg6+ z>^+-CX4zEsCVP}J6OzabiBd+g_sVt=viG>`&1HMfU-$FA|NnjT9LICiHTZqk`B~@p z%X0qk3aHQmFh$Ae=sdJ?nyd=ta{Jq+@nkeLp~_KbTYL+vyRaumr&@ji)2F-6VtKpN znYJ^f)L-Yr3Jyx*xMf65I3ni~wA86I24NiS@tUvmtu;9jf3@%5XxZry@v3z>qw zF>u%Clc#1-3PH0AqjC`eT~UDlAL`e+fHU%w)!Zl$e;kM~-SWnqJ5KxIt zR%}hGmm7Vbt<=ZMX!fP)br~Hc8*5{cdp9rw2F^}` zLD;S#O)+eU`0ywn3W$&QVF#}1N|i?pXV9H+AODHzK(1R%ymofu%QHk!&xWxpzisyC z?%Ew|80jBdi-I$h&wflo@Yb#CV}yXMp)RR|VgAPV@G?~w>S zJv|u(MF4!n-j6A`W%EU!RpXzGd+;~0st+yTAkha;@CEE!bqg-7s7>ftv^li$ zT>PqP@^{*AFvapLd#?VkwhSU=QG&iDffpD8VWF|zy!p_Mz2f9xskyyf0an=0f&%2D z;9Rb^D`vlR38$r{1x|OkprsM1rEh+m*^tD0vN1#};=tRQ=CbQ2f221Bq%_2lg z96G%`R>^QR`Wz88cgA5hM}zWwCMWtbR&P)ntK`9c7jhvNPF#C3Hqb5~*#6N%wNV3iCygU`u6 z1|G!iJ9naRKD&Lg%-1z8d~Cu;3uw?pkp5}k(`V1Fb|#4vrgsNJJW*o1OCD59hf;l~ zhP%GLQiAjsl-@FW^sW74MCCj-T!b4goE ztL2kgdUwr}o5&$|FP2B~-aR6Kipvr3@Yscfr~!h(3v(A;#NaH1?E<_f&Bh`E0u<2A zNzTqLC(RS~C+eD6hsPtljz$WHjr=_NCH}Cd$8|hY^ydytSsN-O@;?ml4yu1qQ6W)k z5B7gGef>8_N8Zp8CCEASqN^D(YYQ*`_+(A$G1*`7@A7CbDMAzmtzYx?B39be+&Ug- zuk)k(!b^${3=fWfqFMfrBAl}WQueVtBIG&eiOOvC`jquW289phEFZXLvy6VClha9|U2IxUe}@8b*k(RcQD+FfuWP zuM8Kbmz5zr+0BZA;gz3OKe;ruwd?GP&7f1_$`}ULAkVeLLoZ8Bzn)c%K(OF+{;k+y|3j-u>~hxO%tywgwB zm(Ny1nOh7$C(Ks}hYZ*V(Ybdf2&*!C4dj`?ei%h07TW)L)UF8#-KRUByDi>32ZfUP z?5$5a(TbA0!adV>oC-_U7Z{W`TSlU`P49^^Yzo{%c`BIMy47 zIVgumx3cx9nwFbyd2I<3&g35#HXr+tQy(eQ^9(Q!>@T{7ZlRA_I)d-K(M&u|Iu+#1 z@oOl#j_m=rLSuAG-qh?kDjFl@zHPn9yzFBiMjHbz96hSmx7y z%37pskTR{3tzr5L5D~h(!Bqq%V8}xGTlRdpuJj}LZsl}S1iO@!p<#7aJnjVvimrLoKvLz zm}_SD>2cipuA%NHiD~UdcRY)(O>v7!&2pl`HrfcaAuBJR^?{>f{_+`A6thOIWjtR2XBZMQ;wzsSj zzy31W=h6`OZa)b)Fs}9cdDx-0`hLq}F8GC1 z;qIbbEULbI8U$g3*(7O2Y2?#1mswl*C{b$fj9&jiXGawjk%grsutp>tn)2V3&Q(&- zWV!$7b5LdX3;RtK)1GuM$MK$p5=$G+SOWnR@}Und#PU7!WDFd?NgGs@BG;JeIdgKN z*U0Z|#QkA%dhg6RHB!yVuwvB-82rHPLgYefh0&m%h2?cQ!89vJn8hNFQ=37XY|t~x z=H@neUx0SD)+%91J+q(lQOHVT*K!fe`_iF8%!r?dhsV#lRoIJABl5|Wn6}-^b!dQ_ zivCyRgvgCc^?8=ZtBv@Ti!HElIrai}z%+`I|CM`hmb$H>9$bxj^q3d}$I;4a!dnLs zMg(JXsVdHzSNpE2Td*lq?9U}o4Ts1)+KxS|2Z4wgA%L|Akgj-pGIy!cp;nTUTS8)l zBawPMtcnVQC9%XaQ1$dIn{xc2&4q{VND!7!?>1iS{hIhEcwVdq^$u0SMXq?;y?@&5 z>8#P_D+?P>7hWqaddH$KrSGEEEXJfR$Oa$ZfJ8r?TWN9OR zvqatTIO_0_ZF#T9gxl|_Re4V7!pIfH#wT94Zt2%;N)x@_1*Wm z?eCW>ZG9zv>M-G>Al7yCui?1MbXIn@{C_bjzNfA4pRce}C*!cvEUy3U>SD!fZoP}O zVD%#^*<&xlevh~2g++;Ylc0KqEfDUf)g&(6A>Nj_K+A`!nI&_a?@E;#hEqxONQZm% zr*SPV5S1+^)28YSehoYBq?bs3J5N&ZS0H1>^w_w|YwWHnPb`stxu-h5&q-ZTS(%uJ z4}4B{foIovmq&C9ez+2Qy}lz0uGUje!bo`Ovw}w?`8hc`+BO`ku@*sD?-F587@rPX zX|QfLI;LZ2nnh^)z{)GB!jHg&!3;GPWg+(qwK z93*9@QH;XatBvamd1EHGZxT25m&S;c^}iIS=8%_UWh7Vk>FRYjcQ|&Vo+*s?R9^Zp zO7DnS_=FgGzfaPH5_1e=l7(D7rV}X2%nwhCO$!8$L{&u;*1cbbx^xEq5#C@~3pZj#~q}y3gEW8w-mXC}h-ibU1?kgo;uP zGsK6iNM_F+6_$VhP7J6`Hi#d)GOV-VV`F2}^*q?Pb-Xk^Ee*JV*(n~eq)v|S&{f>Z zx$p`3nCmTa_YdGqy+HN93LIEOuhmixi|XLersn3`k6f<>J|!CK3t_X_9#J9op{5G6 zCEt1)I=RkvmI~)fiBZ}L)S%DHD?7Yc4b5H{iktF0heHywinQTMpEEM{E5_it0J@?hPEom_Zxk#rEbaxiU4)yj&q zwXKccv?2JpEiZL)OLOx&Lz)L^HAto1L9?I$H)+ zo{o`E#z0P0m0>r_%PggB;Wv*(oPQf!o;)5Rr^>n-eW$b7B42l=BHpy5j24%7RaIU- z;QL$r5!nnl*)>oIj{lGQ0ThMM;U9$`ig;{ZCSjHcK3pwVtx5)*c9iS3HfG?94$j&F zw1=9l2=Vv2^#0_O(R0Kl$NJlP!${DW>?Ksz(RW&Cn@bIcio^OERhEcm#L#&xn*bd9 z#+~S`67M_JyXZ?_%7NFD-zN z5vK&>FX1vzmX?+_!?&4l)`aVzgHI5Tr=Cbr!uZak8hw+Nm@lEjeXBzl9_SO@Z0+pX zeZ`surm;dO6Y&A>zSIu%OyD!Yy?-@25&JN+r{#>BLV{!vH9GzlQE6%Ez|W^)#9Ix% zrd0~$Y@Vc1G|qaVUO%+6q2Qjuy(#dlJCFmHH>ZqJZU7u{806K{Uz|=IZJkBUjX~>3$k!-CW;Qu zXndS6fn2-PcQ@L19183na)LYt4pUDY1BltB-E+tyDt9Db?T|#v7bc($HXqTIXXotS zO%&0^2(%xzw|ud7vRjncuq=qvxl_??Z@o&F&=Dxi3 zXDwlSNaL@qi-RMyx3_mLcMw18A{3XykLS{lYNU-c2zp6DfTBO1?k*n&-0c5Z(;o=X8MiP-oFf zd5eH?-Y1Y1KBzrOoF-E>MF|+dZBI$SPayy)xmHUJb7T8*>S|u#rS>mT*&=+?TNde@ z0hQeTL#9>Cc4eKxx$H_xHC|R<1SOhrYg(KARs9=0 zkG{@FU@Ia`^W%2O`U3l!(3d>qexV(4ut&is+Y2;rXU=s8tA@YhvP_6btbbsZ9vLZw zpOK<-_^YFDN^XG}s}{}Q^DC)pF1y3XSnrvHb4RCYlJoYwdgJF+;O~^u)i*{9Yu1$H@LVeZH)I@k>tPLZUI*{aHXhUIB`|hp&c;DrNuaZPxgQZ$w zTRp769NR8AuAPwl^)nr7l)*mCczAu6)J3}2%C&16znqXh{OW`&g*ujclYSQN##mad zW{C3i7vIau{#83RpCjc0b?Jk#>!lC+x}7(d-nW}bMU)mx(``!tZk+88EFV4XVj8tp zm+%Grs8~LN)A5;bq}I5_T+4kmXJt>U_@QHk)Nvj8F7e>c zLEqddC|nSJ-s7UleZ5-Hq14@gmBvMl+>|5{himGfz|C9eu8jM6JHlrz9y#?3SW3?z z|1$2Q9&VCOXwo}F+mKm?xv(!*e32t;k>76h!2mW#TsMS{zb5ni=3AD_(?|gv9ZPD~ z`@^FlEfdNz!N5zAf@-C9B+nj4kcp)0CQ|VP|U-6#0S274m_xMM5m(?)FkM))Z-T0xRzMPYGLcYfiWW}=SQFFo z+nt5#HXnXwTi3+$5#6ckx`MA*^DqC1nD+0UT_P zRUuB0c~}e{LRQ0nc7m0UOF14k@IrbjRF+jr0Ely?c5qw+C7>_ykY)ji?Ro`nVq zRf!klM{~kJTvu)4LCZ9MYF@)P%gZ*jtMQQ$8oFdIN6fe@n5St6@E;{l*iq$t^&3<80sjDYbkfqs_6>pAu& zV{uJlS5w@yo0;-S?;YyTsOd!i$U94u&AoY8RsSpazUtOsPR8KdKy;OwgpkY0GLQXu zM!cA}_?j=u|JfM#&Iz`Xj#KzZ83()@&qA&mna^M}wYgyR0Zp9I;LPEkG)tJl5o#*M`};6{)Qyhk z?{htvQA1Q&t{L%eW3eVosH{MX$dkb)so}vludnIte4om1(YN=izx z`Wjiley0Q5(%VsT^>LC4qtAA%h~I>Dcg#v4u3?&M z>Edm``7EqlN!8JGe_s0TernUl2sdyetb91Ci?{2~)uH&O76WjwyC}RAU%|>i2t_X_iu!)-?i1!idmKh`mFHrit`1a7ma*&s9?#G)6s>%dr>u? zWCL(_m!QBw0biTa1T6ndo>NdgPC^GkcHhwI;Y_Zdm9=%$`}g=iw26SI92$BIP@|=( zBBcM0t?dm{Q`4g{GXRSK#Tli28T0e=X~kT!ydQ*CabLe4<#YYuUgEfo(Dd?Pf$!nN zM5D}}NieWj*w}0j2d*}Vd%uCH^y?mroRI%4VD#Ace2hShP zHyJi(rT^_meIw_+1dOe#mrSEjvAZ(hQITpv)O8@RES}?tS2nS`!Br zn6ez^B3=cmarNjnD`iw@TGXgb|iZkW%^!kn9gZ&WDdJ%|*&y&`s%( ze^SY;hc1s)O9_0AAJNd4?T!0aJCi~yVQiC5Z2Yf8 zgn9L~$kd+}=m)Afn#6>pf`p&vtx>m6m6`9Z8htDIFwjV9yw|EsDf=YvkpG}C*5~Ep zp4`*6HR~?|SoVLn)g(-B1Y7@$3L$9X9oxRlpId>|4FKFg8fX(0XfZIJn~{{>e)Hi zsF(!(DdjC!o|hA+H<rPqLRcp{4qKjFT3xX?)q=5LN*Q#!p6qN&B`edjDgYuc*hS^-uCJ!10e}x zWUBcm#UOYv4l~WH7BpUIa#^SkJyfPcTlaFk z^3H9^-j+LgDc1tvJ%4S>KZVl2d6ntgy($&{$c3dn*T$)Mbcj_av1oPRhe(i{U!ho1 z=(_r?hT|dUUOmT?n*M7>1th}NRfcxs-tDi_rF};1BP~aZh;B_kq{7LW!r zONM2MuUWXAxq^yIhO^@YPSsSSx(Ayhwxbd6Uf-j_ru!;aEhoH){>?7IdDl_8H{_ho zQ+m{gQ82~GsjEk!6Z%0)7s6N!Rr^)5dE<|ysE9MZ{m--HDxc!LdF})Eqn9iv>p`&7 zI+Z@@8-_y@j-~6_jlixv)k=ai0&I&LUGk(YWc-}1$Asls`uMC|<5yJ@ugRzW5_EI8 z^lkQtoCs7jdhSO*6$sR)PNzx~6+!OU-@>$673Jme(NTw*^qmAd^cwRSLmKwyPd>z$ z1Df91iA^~2 z-fJisC=C;ivw9Y0s$dh2LZg!<8KA-j<7KoDM~*aHyVLgJMm;zgW_ChPE@E|Uc)#5O z^^;QKXuW>3D!7XBP>-9s+UL5Vd>XH!UvLq@Qu%7yAUh+Yh^2Se`gPsDk1!)(1Dj_y zc&qN`N$z8sZoeQah=GcE45mfN!(vv_RgYxo@r zpxkIVIhkIED4yBOKVaIwxqK1x;B?uHI8o5hjyKT080L}Co53TocSgDay;$M4=VJ7o zoPkWmPbXGl(LFAE;`@bXSNDOr+gj_Ic> z-^01T_l#8OctLUBd$uh0sA$-C1iz!=5g+3~`1`~TwTOzNEo%YlqC+v98uf91y^{k@ zV#4S00`?!gD}*rVZAR7D)G4?~qF;yKu0JSrD|x@#cGEY})3I{o`3#FuBo@$dW62O4~C~r#I+SG== z`?EsDR5%f5*YOJ<|2XTY&qLGxtbomiQtJuZ*==H4_z0eA>X@LDIRQ$AJ`+>ZG;~FD z%`BfFtWE3RiO4X5Trxg<={ix4xH9_JzZC2E5LOcZZF z$=A*E!rCRlj^FHYX-?irLkoatA0Qz=g~^B|p+Je}?LO<}0oB-eFY4on~W zmUZ#Ij~~p8E1%=mR5eL)*S}t~LErKqDgG;6P4If$SrtdEU`O(@#17H+dD5UB_FnOm zwd$8A`?u6A(<0YmcF}`)bp@r?U%C(*MeC)eJt|csN)clAZD{CM+4-y7gExNH5~?>9~_f@qWyM zpWoECqv7`|VbSr*aQ=U$I!(AC11?-0%CS|n5OA2N@gH{YEQN)N@R7d92Q8R}Z+&bN z{NPz3Q`c-iqc{5amHU{pPH5ikMACJZC%a4iq@I;h#xjKZB!?9=*5ok}Y^W`gqK0WW zVBp+qNS5?Mp(w82SNk^^(*=@B#QtH3!E(+i%3DluTtMjQVP9Ol8{ z;fkOkn}+&>bfe7NW>?I0@bJ}_+SbuH@P6OPpuKL!1!bkItIywuhePkYQG zt@%f#Lw@h2EE4+IcS2W?TC6|7}t@@T2cz=`NvbV<{37cr%gW({gE`f)f( z`hQzn1k@U@>zxsOzC7T6sHmjWdZ)cIWb!_u94B4Dy|IRBpLA$OskF1qm#Pstl%}a^ z{tdx$ncgm7<($L4@eWr%M{L_J=xh;i!`JaTP3i+%N{PjRfEBO#{^Q5%$3Fs<(l;1v z;EqQI1`{ysfP?nq#{~^Zj3i3~# z1o(rsYQZBQKI<+~FbJlj%o5-H6wEP&&-J+*x!=FPKfd%*VPdn(V$A{kSr@_57AI(V zQR;A60GxUV0}XVx)Rv29ypZkVu2!WD&uyB6=Q`wO_8*M&idW>UBhN@F$jqqf)jsA+ zySvt0&lM18w=!$5qTr_>BV@BrN-kybNnb{pG5y(+SJvQxVFFRv9);!YSR-NT*t)VM z0bmgRCgEU3ql*QMZ!dK?&wI}_ybaga;NWmg(>dPC$?0uR=v$4csxN=%1Tn$~R#E~Xn(jW;RJ zE4?yF4s!}_)Y#k{*(wVu-A81y`X;C=TPJSg>#-4U`Hr*wZ$L-}B!(eupsv5nOifEe z!yzw+F2%*cuG^+}Uz5M?Cy}z1*ap`CwDx^|(N_OLGT?@zB+U2v|J*pUX*X(S*HtzD z;zSZnqiTRYqw1fdI|@0Wk^j|L1y~CJ_xp(bgdp%7Hv3Z4Hy&>!`gL!`H&iA2Xc`)V zUxdQNleNaJq%=!vyQ0ZdPd(|nAxputj(2NjpaC(e@E*vu&t5|m=|;286lu~4r@n6- z`PC&s$vz9B7*8+5h|zGdJ9LX)ym#641$CyghrdiV&|#33d#NW?22ynpszd) zyRTZW=v>I=O*yQ(_e?b?x5YW93C?H!2@gg0zg!ZG`HzVB^RrObMH8a(7Gp!rbc&m>V+gn)+Ft7@7+;|_fPD)5%P+bu6ad-1 zQA%gbS&6`mgn8{QgU3-(R`!MdxyOt;uY$)|=$8Ppifschq3TcTwgB%=p5Li2C^)!4 z9kFujWA$!?#HQ7za`0V>0> z_;dWF58sVl;J989^T7-u2JQk7%OK6*;2?mZI5AhNgyVTh??Gsq!#y`u8Ha9;T8&8{ zWs%~Rp9aU9Xm16eB9%-Em|#%O<>_)mi0Nho?!1vcB`#U?K6U!qfxnd*5rulT}*H3XT zusqjgpp@^NPN_H&|7)KW`}up?WCOU z`;IQU5LB=f)v=ZEh~kb#0P|QfRpfLQ(j!!GY7rk?cV)HJx{Ks_aB2+PMql61E1CdK z*2Z}lYHLLOdj0x!b4SOS36eL^affR>_YM86^Pp)XkP>9G{~#rA5IbgOW`a<9?*+Q+ zDJs;Y=SA?{(w1lr#G44i9`z!s)>w_ZjH6C%Z5O=Jx8}XBkk5^JtyNlBSVTHMe)jAc z+x6=$=DMX=ufnXXYjpY{S~Zg3pk#xr142~fLy3GpUJ#6E1uqLgeT5?H6%Z7_Gl2lf zjn&HT!^tfN;06f@P$_lujB%Wtodb4%n2%#H7a+FU#*b$wFNLX*MLua9P1%cc%t>FFq1y57Rq-{&I86B?Kq=jqJuF({hVO##K))K z^koz!AM(nJx9JVi9`J5;aR|{1|L|5|HfmoH**2O>_3jY!xPiwJ-qewss|;mVVywf& z=Z)L?mFEE+bnEJ$?~A-P5K)d^lB|B}1s%!viNa}= zXPmYq*P4;nY7hsyU)y}g%GTEQf@0A2VjmHTEUm{Vrbzmqx%~Bf+2)AB@N9qoG+K(h zd*^nAJxczD`kJV7V2RNxGdH`10FN8ht7qkIlBWgR$sq<9X)n0JUDAnzNR=_S6?qa!ofya z`N7BIM&fZAY8EZgKX(+eaM~R0ENLjH(>8IltHS%%plB!=&%nm{wTj`j{pi2fY4XT1 zn-bLyOGVgj9hxAZf|LWD#{g~IZu3&*iT|U`;2Oab%OyzY1ncc-^VOjVp9jT9J6fft zzc9NLVIx{4b2_JKXGtZ|Yn9hJfL!_|IIJ#s`obUEUNBm_s`UwjYtU2si&#-y!b1vE zs+zYiDeftKQTuo^l=|L9B+7;S*Bjo~*XQaUGhT$7YE3uyi=$@gcC-1-kCfS(ZdwCh z9)1<`S>_rnE&%8$M)kokWY=&y=GTf65%X)LkiM}dnP_;*x%_li$|P#Fd$#L@ugyGT zx~SpV4TaML<=P|6gUz_bC{K%Lqaj)C3!$&Am8y4dE&_V1O$Ek__^_BI?ev=D0ZC8V zToM*X-_WBpmxttBwr|L{{!<;EhKpaGqXXih{O7Z1U4fck*>NoHHC9HzJa9_Pw17Ho zZQVpMit z1>y5Sg{eJUdPXh$jYrWhv`1Foe0b(nUat{Uh%<@Dp1ZhT{a2R~Z-#z?971+rbKn(=y+`-#FM71G%Y*5Gt9|dj*1A4iE(Zk*4`hA);8~ znjn`%^^5<@m%i+HRv*OTdkwDv4mTi3M%>1IWObr{>2kw<9WzctN$EfWW=6L2R=}_6 z{<2UHqDez?Mm+zrg6Du(lj;itA{e9)S?qARTQ1t{`zug{(`2OfXDB3g2h8F`ou6eT z0A1E=iNwIfn*VQDM=70u!WV=k?d-laXRvlauK@U>#lUCiu&ZiD2d*JL$_hGo{~ElhfgcxK*T>p70AJ;5G(j55K8qJ=2UwQ6 zzV1+QwAq$w_ggDEI+|TN(g3z~Hgq7tULsNSeAc)r%%Nqnf zphi#Zlqe*AtXM{2?W!8!l(ablNl+_>Ob zX}A$rYizL22AE zSzE5%B4mH5v$hLQ0OBUNC?12d%fmAs9XzpZnLnly$Bt(Qd6O}lCu3W*W5Z|4r1F!n zSlgY9lAzkodoJna7CFB^RwRi;7gNx5^ntqEy!~(gZVB<)!9~5A-`2@kQRwx6ExSq@ z7=Bk**Wj?QCADBkf^`oJ1cU#^ZNUL%85(<|f6;Ai=SV6dt9*YZT9wc5#JfFFl%o9k z%6V7kBS^M3x3y`syZ-1|KJ4PxN5&R2zmiItTVWdw58gNOiCAH3lqz8*v)x8^#c z*Ai3`MP5Kn1~MB$%%UP=Vi4C|$}Y$l;K%ysI~s-j8lWvW_&4)`V)l?g0bht*$MP;Z zde#gaqCgg_wV%uBw%~J|QUJfpVPb!@N@jH5tK907vZ+!eN}ZW$2HyvSiY%}xzy?CV zCi2}oT$sS5(nnpHMliE)j0c7KeiV1(0n6RBwGgn2fw8zk+c62g8*H!dn|haa;)HDD zC6WhJwpSp$2Vn$0$m7_IR~dB2CLcl`2x1v~jM(g4xSHqOsVO zaZ>BG}5A~yTxl=9UwBB*2IB+I={Y8RbKBO#EM z-FF^*yI(aj)AIAlAsXKV);q8^!NPh0nl}*d$^_A{a-iFw5-{@+MN$9tW(RnItUUFd)lN2Ki^Xs zPlQlIe6%2)=79xSP)G==EJ3f*Epxe!YF;n?^hsvd6@*k`BM6Q)KvQ2`J5@IEWI{9Yk?$#;2U^9Qcd~Rb9O3iPDiNrsP!t!A33Wf zH>cHvsbsKa91xR!kuvu$MBH8I)NkMh(OKDWW=VRebV8$;K%xd)-RoLo8C~5t;zW?A zyHk zFf{NZke#3xv!r|u_O|bsnX#jq)zly-g#_^-E5j~*^w&ZVjN&4m+gUbYXY~Yb-b8w7 zcrYPh!DEy@$wh$w*&>F}=)s!=1*XoUt`XpTLVv^7*-`~f71LJWm9Izbbha~;(visk zho$!y{>3|jThCf@lP+99c&dFL5CzFyF--HLMx!6)-5#4cE@+9WWcOUJ?`4PqOUC%| zJb9xTz_BdltJhaEfHtIcKXh04lKJ{q<>*TCf4!UGbodQXSUzwVs|nZV!b7`!`7$E> zU*qD6jt~|UycT#q>~2}Ad{Ao>%rj^kO>hAh1=%q~!i7x)*#+Vx3L!&5Bh_b(Hp!)8pj=m8KHV?`UKN;3f2(^Ctaf-J%z017S;0ps zk_|1o)ER1@OX&77V!yDU#&P9ZAYDq!a7b9DO4}NGbud#TQ-lXaoFvTvCys@smC`+p zXtvK3@(H}!kGkCA{;oMZLstbe#)eAecb8~t5DurBz9MDxmyPBiVC)P(168r)83SDK5g2s?c zJo2Bb1{6$ixnq6&E$j7m0raafQK^PVOI283P(46;N$P6g{jfap68+a4ocO#3W%xCc zM+45jimImW0uv-u!}0g@xMe697_!|*#PtO}j>v|)xqfjY;|w(PBE3XC9I^!^oG58} z99Oq7A1mCQwz|Yr}8F#*Yp>_bXuzNhAZN z$VwyN`gVlCDBlIql*M|PCY=l2zvw7&WqKypD91Casvm9m;GW z{Hw9Rr~-O9VH%E64t=Y4vU@_JdF|HqE{OuFc;h>Jg-*_M*W*u_x#M%R)PDT7jh^2B zH)haL;_(md&X)cpSbuaoh%A?xY5yZp$5 zx6w6Nid;Uia@g@;+p?Ny1yU#%k%-zctDKr&UkFSR;D3L5_8!Jd9L~%o*lX)YpVd+f zUam|zE7%9}O<*;dpjz{A^eq;F+A_1^BPmYjvZJ!Tg@&k<@2^JFLmdIr=dthxq>r5k zms6AP$>oPmLg}a1DkaA9Q>4F&G=cu|bp1IfFe01LF}FRi4_?Q9mncg{X{6j|y(39mf=Ulc~GJ;@~22|g-6n#@(OjS{l8#k%S zRgBi*BPhwC8NIK5S+K79k?e2vV^q zb^OInWEIzer$TXJ4qfVFbg&&QJ*JhTlVEkL_oq% zF>lU*|5}yM$NLcR3f&4esZVoKdlfpS6@C&dN?sWvboJ_0upMc5cKTckR_hf|qmYj} zwxyxLFb{zv98yyB7gj5_R0IVDA!pmtmsWYGz}SCS23B&C8p-jDvum&rq4didFvJfW z1IF_l%BiI6?8VAl`R(kiH*j|?t>J2}7{nI1zx7#ptVsloi*?7yof}iwgfy6)U39tVrck#q$JA!me2qOc=5|QFlR)X=U z7c(?}Cq5~o7U+_bj?-k4jR0tW|IXlv_WtM1GZvsm&^pMr>ADM|AeQ0rxSLAbIT;16f+%yxI#ys@8IGeYOeAug*J+X}Xwm($N6Sz``&xi4hM|%{^NQQV!7{>V? z8=?Hc0!j8UnR+`J7>}pYIII0*k)j`A6A!Y-jILFU;TcV*l@6H)m!*$|!aid*FX`4c zIkeJud_u*}R;B`o2U4|ZKYu>VIp`ldhV~Q=8&irS-di1vfq+64WL=xq$<;`h2u4yh z3=NZsQySQ~K(Or#teF)(C%LfWiKOe{+ApZWk@g`oU1nh6ymIdYD>wIj?U4{;Zd(47 zNq{W;PnyY4H6Yj--~0%+mf1r-a^GZFt`P49rWc9+Kv@J~2-8a+0Z-_1Qv=$0bOs7* zB;Nh->&)GLaDl}fB7W)`b$o|0`S*$wm`92WqxSyd?QLysTcz6heh^Xs7ghi`|2PBf z!tUN7zsxM^gbxXJCBVG1=O>bV*r-2|*N;>N_2EUnNI&}!Yze?X!Z*XlLO{yQoh^-X zT3^*-kTKvEr%f&wB6^52o_IC<W}ZpD=;4A+#^ve zoO!^-5+!eTxH!eW;9QjE8)dDDT~q4ic)N;qb9-~AzW zJ-?@)<+k2ry6{qw0UyUzm&IfehEBt(4^f^9Z|^l`#QUjaOsM-mktys^Z&K0q_H<`WSEwzz}(>kT3IDi6 zb#NR76ia9DfJFi)()FNoVP^lDM?ukkQ=hp~J_R*P0?Y zo8g0^l9Ix~A=>Ku5sEf&RiR4cClPKtjt>XmR;X1kL}QRR>ZXM0+q)A^dDn2|yJN># zO2V2XvxPJ?G$2^^lmXxv;8XY|yV7Ys;f%yQOXf)y3m&?+_4wO-1)HTwW_#@2vsWHLlw=b-Ml}L(jRsXyb=#?MFBD3v7L`jvf za%(%e+=tm3YQ60P9mkVwdrDa&JpvVamOLXMr(tDxmsis}N*i)=;V|uJKYDaM(5%>e z#}QqX7aLRTwGp3v{ifu~w-E~TnQ+*^elB(=VAzC`;rkXe59y$sa(zh)J)!N2r$IcB z%0A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%0AGj=iU+1aiDz^qfR=pWHsr(5?YT*>2}K7JsF z*)irtx)))i*^Hipl-Mdk#@Bx5e)MR5PiK)%Gf_~wnFgj}S-^1n?rS?F2!>n7E(`{P z`1F}6PjA_e86jOd7<-$94i8njCFrlE|3HU#;}PfDDzIaK3IQ5U`HLRqJLfuvNd0RW z%Rdf+@tEARY0ni}1pmS%1bnX)TWQ3hWcHdv0K3dc&VrlO2f}l%?7SMug9);ZWj3E> zgvTvS7=ryYJTSAjd@sI8WJkMMS6A@EcH8g-)e5G50{~vhmu$F9D5CL|k>&}dnx7*a zD3bwP94;&3av@WcmHscGqr1)YD2*gx1x1e{2@sQcxe#ydUeEyl4SAmtlvvwTm$)&r z=fa5g&sJeWv6qwa38+yrJS!=%WHt=j-ey(FBmFGZG*UKZF z+q=DMJ+jnC_I)aE6&#OB?Vi6=7y9rz>vF}#`%WfAn31NAL75#KWnslPxwyxc&lBI@ zAcVU2Y|Xj%qCyq&gb=d{*=>GjM zU_YSOqXag`l3T}s>?-ZpAVQ9+cn2!bp_o`#2Csn4slW`Xv@vHgfkx_+C7({jKk~$vz+q379SB35` zWntAl(gOkQ>xxQOwRU}DS+P^>vOB`x&6o-w3286Z#2*AfJy^LXDFY_rS#R}DHrv(H zqQyE!8Bpi>Etb5d)4qD#-#;>?1RB5oMQzSA(bbbHSM|n5L2FsP<76V66DK;vjLBpk zS*24>pFi#5z77P`NmqLE-F!(&nDp>%{Mv$w`(hU(hLnmNw-a{gc+%efE7UCEN+ebu zA|p$>rd|{#^~)GhR9HhX_kQ2QvSds7n?fJd!({tA)|!x5lWkitNat)U=t1bjb$ez+ z+0oahS6@qect<>*o1m!+ikX=tZPO-5vBXj@H*P{u(`zMV0}AcjrnM-a;Gq}(7-Tyw zcz)>{+bF7ZTs)4*?Bc5-4N2GHOLz4LBk})nQr=&NK^zX5d8nIQlG diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg new file mode 100644 index 00000000..04ee410d --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/architecture.svg @@ -0,0 +1 @@ +KubernetesClusterBKubernetesClusterABootstrappingCLI,WebPortal,etc.AutoscalingUpgradetriggercluster.yamlmachines.yamlBootstrappingMachineCRDsControlPlaneMachinesWorkerMachinesManageClustersandMachineskubeadmkubeadmControlPlaneMachinesWorkerMachinesControllerManagerMachineControllerProviderConfigProviderMachineActuatorProvisionsBootstrappingMachineStatusUpdatesCreates,Upgrades,DeletesCluster/MachinesBareMetalInfrastructureProvidersProviderconfigMachineCRsOptionalPivotCRDsCRskubeadmkubeadm \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md index e24bfd82..32a248f4 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/cluster_controller.md @@ -87,13 +87,6 @@ If a `Cluster` resource is deleted, the controller will call the actuator's ## Cluster Controller Semantics -{% panel style="info", title="Logic sequence" %} -We need a diagram tracing the logic from resource creation through updates -and finally deletion. This was done using the sequences GitBook plugin. -Unfortunately there are (possibly personal) problems with phantomjs which -are making this difficult. -{% endpanel %} - 0. If the `Cluster` hasn't been deleted and doesn't have a finalizer, add one. - If the `Cluster` is being deleted, and there is no finalizer, we're done. - Call the provider specific `Delete()` method. @@ -101,3 +94,15 @@ are making this difficult. - If the `Cluster` has not been deleted, call the `Reconcile()` method. [cluster_source]: https://github.com/kubernetes-sigs/cluster-api/blob/master/pkg/apis/cluster/v1alpha1/cluster_types.go + +#### cluster object reconciliation logic + +![cluster object reconciliation logic](images/activity_cluster_reconciliation.svg) + +#### cluster object creation sequence + +![Cluster object creation](images/sequence_cluster_creation.svg) + +#### cluster object deletion sequence + +![Cluster object deletion](images/sequence_cluster_deletion.svg) diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio new file mode 100644 index 00000000..6d4d90f0 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.drawio @@ -0,0 +1 @@ +7VvLcqM4FP0aL9OFkQBnmc5rNj011anqxxKDMMwAcssitvvrW4olAxK2SQzC9jibwJV43XuOdHTAI3CfrZ6JP4+/4BClI9sKVyPwMLLt8fh2wv7xyFpErAncRGYkCUWsDLwkv5HsKKJFEqJFrSPFOKXJvB4McJ6jgNZiPiF4We8W4bR+1bk/Q1rgJfBTPfo9CWm8iU4cq4z/hZJZLK88tkRL5svOIrCI/RAvKyHwOAL3BGO62cpW9yjl2ZN52Rz3tKN1e2ME5bTNAbk1Bd9u7p7S5Muvr+sfxe+/89nN2Nmc5tVPC/HE4m7pWqaAnYZlm+18jmmWstiYbbKnmfP2BfUJfaE+5e1Rkqb3OMXk7UBgvf3xzpTg/1ClJYpEi/4Q4rleEaFoVQmJh3pGOEOUrFkX2WqJZxAQgyLfy7JcQITiSqVkzBcAmW1PXOaQbYg0vielbouUhgxkYhcTGuMZzv30sYxWU81TkTBE3qXJLGexKaYUZ6wB5eEdhzg/yRzlm4ig0ORjaV/gggSoBWD4E+ytDkGpT5PXOo2aki0O/Qcn7F7KqkrayIHDVerFcDdDVByllGx7G0dU0dOq+Iz4/QVpsaCIsC08/ZePOGptCS7yEIWieMs4oehl7r8ldckGyXptfRKIgkFelwjntIlACrEi9hf0TixXqYCtE2sbqzIL9sasyekzi6WbrH+woPXJkbs/+a7ceVjV9tZi7whGCqRuCLGv4+0w1NUA0Td1bzWYMFmCaILzke2mLEWfp4y/7oxv0SRDbA7L5vz+8lDvECUMP6zyRG/SqR/jbFosDtN+ED57SlmsBj5bDXz2+uKzxEmlUDk+jtG+YHKKIto3wWv0LtnePcFvWxJcDocHCS4AcSPu4Ei+b/ktgQUco3zfMqGE0ZotGfrEEcXzc5slWoOorcBTQKSo747nENByDtFOdFNfHGzHHHkeHEUL1A8sbQ2WfhjyNWg5o1yqdNSGBLlsGEw72uCMtOPY1NQik3BwVHCgGe0ILIX343a8Zxn315Vuc95hsfs6nqpRxZy1axhR+3terT/b2NxBtyOIbs6UQtbiypUK6aoqU7RKWJM+vpyTPgVN602z+lR3cq76dDdMDw4i0nIzrU+BAizHsD7VraSrPv0wiGDbmahbEKmCFBr2I23d+/IDWvgUk08PfFJAl6smFSPScRsmBrNiUneYTldMmqPwpC2FPTNiUuWsa3jgB7q/teXsVxTgPEjSC6atuggEYOhFINCdohPmrSn9JmF6WL8ZeoGgLgKh+q62b97qw/uiCALESfmk8/WkF1VwfGqrKqiPitdV1W4QHp5N7Zas7FYQO+py3fDkCq+uf4cgau3vNbv+0mU/ElNQUfpQdevbuv5O49317/lLLlZASdCvAhUXLPPUgcB1h5Z58Or178HmyXj9LlBlXrsZ5L1ev3odI969tKkqGIzZDVff/p2dllSIDhu+tGyUkqpV1h3R9Rck5yQlTakAicXeVEDHH5BAde3Rt5TU3/NcpeSHQSRtwIENesfwV4dQf8tztqaBquicwT0D/e3HOQ30xiRe20+BB/IMbNWQn/Sj+BzQfJ2dy8X9/XtSiLrLeD6zzskh2hl/DNHdGhgqwL2JIQPjvQxRZ0sjayJHt+wIyjDL9v/yo0jPGdoocXS76rjx5yJmUQnTkzFK1PdhnuFvTxzdy9Bhsu9HorzWQ/5EFEKnOYHd/0aU7ZY/6d0UoPxlNHj8Aw== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg new file mode 100644 index 00000000..2e41c5df --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_cluster_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get cluster object
Get cluster object
deletion
timestamp and
finalizer
[Not supported by viewer]
no
no
yes
yes
add finalizer
add finalizer
deletion timetstamp
exitst
deletion timetstamp<br>exitst
no
no
yes
yes
actuator.Delete
actuator.Delete
actuator.Reconcile
actuator.Reconcile
succeed?
succeed?
no
no
yes
yes
requeue
requeue
has finalizer?
has finalizer?
no
no
yes
yes
succeed?
succeed?
no
no
yes
yes
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio new file mode 100644 index 00000000..c9cebce8 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg new file mode 100644 index 00000000..4b58fed4 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_controller_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machine object
Get machine object
deletion
timestamp
[Not supported by viewer]
no
no
yes
yes
cluster exist && ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
add cluster to ownerRef
add cluster to ownerRef
add machine finalizer if not present
add machine finalizer if not present
cluster exist?
cluster exist?
no
no
yes
yes
add delete dependents finalizer if not present
add delete dependents finalizer if not present
machine/node deletion BLOCK
machine/node deletion BLOCK
machine needs deletion?
machine needs deletion?
no
no
yes
yes
machine exist?
machine exist?<br>
no
no
yes
yes
actuator.Update
actuator.Update
actuator.Create
actuator.Create
requeue
requeue
succeed?
succeed?
no
no
yes
yes
finalizer added
finalizer added<br>
no
no
yes
yes
update finalizer
update finalizer
succeed?
succeed?<br>
no
no
yes
yes
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio new file mode 100644 index 00000000..8461762e --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.drawio @@ -0,0 +1 @@ +7VxLc6M4EP41PiYFAhs4ZvKsqZ2a2aR2MzkqIBvNAvKAnNjz61cKEhiEbWLzTCWXSI2QRPfXD3UrmRiX4fo2hkv/G/FQMAGat54YVxMAdN2x2S9O2QiKZpspZRFjT9BywgP+g+RAQV1hDyWFgZSQgOJlkeiSKEIuLdBgHJPX4rA5CYqrLuECKYQHFwYq9RF71E+p9lTL6XcIL3y5sq6JJyGUgwUh8aFHXrdIxvXEuIwJoWkrXF+igHNP8iV972bH02xjMYponRdmf99dBNfW7ebfv+bm958/fv15QGdilhcYrMQHMwkiiknEGY1DlFAYLidgFrA1vjzHrLXgLbTGCft9Iz6NbiS/Yp+EzyvG9C+vPqboYQld/uSVwYPRfBoGrKez5hwHwSUJSPz2njFnP67G6AmNyX+o8ERjP+yJ+sFy9yimaL1FEgy4RSRENN6wIeKpI2Qh0Ti1zqcp5TUXbiZCf0uwlqBBgadFNnfOctYQXH+HBIAigYgoXEUeA6Xokpj6ZEEiGFzn1G3OwgAvItYO0JyLinMHM0BfCPIzoZSEXIaRd8E1hM+5RFFKERpo75UEE0C8+SmWe+s8sY7GeCm6V5zf2cirjejtlGBCVrGLDuOUwniB6J5xhpEO5AyrAwg5cYwCSPFLUemrZC1m+kEw+4RsGsMsAcsxilOkGxdv5Yhh/IebrWFLPiDZvc60DGCxzk3N8Y5ZGM8a6Q5y+GYsOh7RZgWiPXSP5lwu47QbtlNgoyW9U29WYzpmq6F1ZTXMmlZD78dqMPUswsqc1rIaTSnqTAHRBiWtooiSZUMQylHzVABNXxCyj0PQRtrpRgClG0VA2Xo9QCkTnRmFec5AyY6R+TxBrWDS+sTkYXM1SLABC5x3BrfDuwFWeTeprrdmTW0FuW9HKcRoPP5RIx6yijzkCZAeiHpg7Aowmhw7cxLRLSxqmsBiL8GRVTI6oPJQBSrCI7Ot8MhRZHGaCWk1GurKldl1zYtW07w0bEAcVWVbDoDkl27hJFm5LuJaOfIjiqP1n9rQ1ezS5yllNwq3FfPpcUq+/fP8iL9+de49evd0ZwXSjXd9SrGrcwidKamaIRtPSNgQhlo7wTYdEtqFaXUN9BsTFrfjWHVjwvfm5dQP17S9W2Mx22kvyFxBq5k8iaot1btHIXnhMW0IXR9HvDXHTNGYWsSqx/woIa5Z5j7oO8LV1SzraSbxQ4S4ErDN1QlOtIhTrWhobaOuQWxMh9UsnwqUIMDLpASIxIdL/jxhG6QPFFKkal+mla1qny61LWOionxGhe4ZrememqQanO6doEOzblRDL9fMZiV5ta0YasLGZ0tXe7axHwezQ15/h0E1JzOiw2B3he66WZqeKt3lmpWh1XNnp1a65TqDqnQDNX80nqNpZzFZXUSDI/Mb7ZY1DNuuBfAB1dCAmndzIb/QJQoSY3dmhm317MxkwPfpzPaqfu301UCcmSnl2rIzk+sMy5mpyZ5PZ3Y0ooE5RGc2rRmtDcmZqYku6NIVpCQ+vxIF9o+adixV1k3H7r2yDtSbh6eZiA+Rd5QgPWwWukqulBU/h05H6RWg5h1lbX3UwWfmm/sLPtX044iCz87K6hKAh3XSOc5VNxx8zuSGu1JQNf859HivAzAMMmyztLo3o4YUuKkJ3xj9XqEVz6xj/scgEXMGVe7go4Rv5arxTOs7ejPUhOVwo7d3pinQGtPsNdbeeov18pd4pwHv4tQ0KF1Vms1SzsDS6pXTTs1lzMAAE/OGmstQcb6v6M3B2mfJ27SKJW+n8lJ1W1XvfbcPq8z5gA24wvIKweyUgnL1Eag3D1oz4JVCACOy30dF+iUzWbTE+3B5zK3J1Ew0boqVvwbWQFNXZlk3/48B6fD8Hy8Y1/8D \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg new file mode 100644 index 00000000..3af105cb --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machine_deletion_block.svg @@ -0,0 +1,2 @@ + +
deletion timestamp
exist?
deletion timestamp<br>exist?
no
no
nodeRef exist?
nodeRef exist?
no
no
yes
yes
yes
yes
delete node
delete node
succeed?
succeed?
no
no
yes
yes
Remove machine finalizer
Remove machine finalizer
has machine finalizer?
has machine finalizer?
no
no
yes
yes
can delete?
can delete?
no
no
yes
yes
actuator.Delete
actuator.Delete
succeed
succeed
no
no
yes
yes
requeue if needed
requeue if needed
requeue
requeue
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio new file mode 100644 index 00000000..ef43b944 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.drawio @@ -0,0 +1 @@ +7Vxbc6M2GP01eUwGJDD4MZvbbmfSbjfT2fSpg42waTDyCnlt+usrgTAXQUwwBsw6D4klJMCfznfOkVC4gner3ROx1stnbCPvCij27greXwGgqlOT/eE1oahRTC2uWRDXFnVpxYv7H0oaitqNa6Mg15Bi7FF3na+cY99Hc5qrswjB23wzB3v5q66tBZIqXuaWJ9d+d226jGtNXUnrPyN3sUyurCriyMpKGouKYGnZeJupgg9X8I5gTONPq90d8nj0krjE/R4rju5vjCCf1umAfvv88uVx8+XRv//hE4q9tfPntTjLT8vbiC8sbpaGSQTYWViwWeHTkq48Vqeyj+zLrPnxgFqEvlCL8uOO63l32MMk6giV6Ic3pgS/ocwRxxFH5O+Q3BAiFO0yVeI7PSG8QpSErElyVNHjLgJhE1HcpqMFxQgsMwOV1FkCH4v9idMQsg8iih+IKKgRUZtBTBQxoUu8wL7lPaS12UjzSLgMj7eeu/BZ3QxTilfsAPLtWw5wfpI18uMakUDmu1FnwSbhK6tUbvSk+DcvJoX7Xa4UilLlaAV4Q+boMMwYWBaIvtMOxu14gN4de4I8i7o/8zlaNpSi61fsslveY8ZUcpBRJwUwxPcpOqV4YOG2wkyzNW8QVF9GBYXrADOfoR9rzz7Ed5CCcx+S5niFEl6fEI34a750fWSjtYfDFYruE8/+5RxbxDPBG99GtgDsdulS9LK2IkBsmSzk8WyRuQCpxjHlYJ+WcUaBSxz2Mz85l0wK8dfAjcwm+1HK0ol2KjrRLnRSidmDdKJ3QyfFvAUpbg4wSltJrEso8axZZMUC5LGUZWMWOZL5knupxysw8VjcPs1Y9WRB92ORzeklXs02weF87iVRjULAYWmiKiWJapwqUSfSEIQoOC5XLZGjHnJoSepSvD6zvNVr5q1RM28FGhJ7Eea5+Oiszp8W1s5q6VTXeYt6DQogxI4ToJMQgyGhchGp+9zbBBSRaEZEUrVP7uJXUHeo96/u5kXdKzF7kCWm/ai7pnet7lMJJWn6op0b8JtlQm6teDLGv6uK/iyIywre+oh8Q062r7ACXDfHZRA0aPRuEJIVrcww+vikBqHV7M/lfkoFrWf/tGb2q6CZSTiSDfZakCDL6JoNVHnNbqxOMyp9RcRlMUOkO2gNxH/mkabr5rm5zyRHM1CNrlQqPhXCpcQ9Zh6ev/3Bu92zGS11sT9eoypxzACcqiqvE16s6h7g7VFKT6Tx0aVtqBSu88Glbb2LpW1Vnv22YJy5aVNsTkKIjzzXJt5kZI5ZT2bL/flleXJ88cvVID9IQUBr5mpaNsz6VO/aMMvz57Ea5i5gpDSD0WnN8aRIQ8M3x0BeD7BsO6stNmKosVEkxIrjMjQy7HDtcp1Ih/jXWBMUIP/XWbWdmP17YSDPwI9jk1EIUTIEh5/K1mWQljnCMOtxxNHbPBSoFzB2AnObyHkGhNmHOOK5Tnb7RtGgxg54BE+DJYvRu3cF8gP5c/KuXZmOBMPtUUa73lVTJe9ai0Fay/HLpoIWQQTVZiBq17mCadHQwFqYGpBzhbL/EdLzzPRASE9RUw4o0SiFqMKsdipFEJyhFDVngwSb5yIphlpvgba13JXX8S+S0hhEsOGa2mklxVTqLrENSVTk+QxBls2DR3GZnPBFEnuMqmEqoG/NOO/pS1crHrCu89SGoTVmuguqK7W5TGDahNFkiGozBWenNUkkMrB0g2j0NsE4NEVK/d41RZMnjRdNGYxU6GbfUqHJ89SLVFSh40ykQpucv1TI82UGCIuiRSiLxJuPt/4Y5EOig/7lQ54eDl8+jkj02v/i2o9eGHrveiHPUS960RhGmjkEvZjA89cLecaLdmi+iTb0BKE/l5VgLDt1ICiOXslj+E436mjyBuDjCGIcU4xJ29pyZNrD4vtYlGK+trVrXbpQFzt1NHkjc0oJuferpM5yrByhG4PjCHl38OA44ohcNweW60WJP1muyxfqIteTMDZ+oRqHRJ+vUzO0qvHp4IVqof5N/2f1bNqb3e8K/esVfNrdlryijqAfG8QKQ2ZJKeIl41L7iSBI0rgLliwdBHlxbnAkedzsqsB7eWp9D5cl2VaTbNv3UYV/yoPayfaWlEZEnvoMf4mmqf3mW9ZexV3yz5lerJR24oUDSGvpTUrVID31YhAoLAZpTbc0qsb0Bpi6oWriN3j/vHGYGuCZFdMXr8bN0/fXwof/AQ== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg new file mode 100644 index 00000000..16f73843 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machinedeployment_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machinedeployment object
Get machinedeployment object
label selector matches?
label selector matches?<br>
yes
yes
get cluster for machineset
get cluster for machineset
cluster exist &&  ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
set ownerRef && set blockOwnerDeletion
set ownerRef && set blockOwnerDeletion
cluster exist &&  no delete timetamp
[Not supported by viewer]
no
no
yes
yes
add delete dependents finalizer if not present
add delete dependents finalizer if not present
machineset for deployment
exist?
machineset for deployment<br>exist?<br>
no
no
yes
yes
machineMap for
deployment
exit?
[Not supported by viewer]
no
no
yes
yes
ready to
deleted?
[Not supported by viewer]
no
no
yes
yes
is paused?
is paused?<br>
no
no
yes
yes
strategy
known?
[Not supported by viewer]
no
no
yes
yes
execute sync
execute sync
execute deployment strategy
execute deployment strategy
requeue
requeue
no
no
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio new file mode 100644 index 00000000..eafd93bf --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg new file mode 100644 index 00000000..0df75714 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_machineset_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get machineset object
Get machineset object
label selector matches?
label selector matches?<br>
no
no
yes
yes
get cluster for machineset
get cluster for machineset
cluster exist &&  ownerRef > 0
[Not supported by viewer]
no
no
yes
yes
set ownerRef && set blockOwnerDeletion
set ownerRef && set blockOwnerDeletion
filter machine BLOCK
filter machine BLOCK
sync Replica BLOCK
sync Replica BLOCK
update machineset status
update machineset status
succeed
succeed<br>
no
no
yes
yes
force resync after MinReadySeconds?
force resync after MinReadySeconds?
no
no
yes
yes
requeue
requeue
no linked
 cluster && no delete timestamp
[Not supported by viewer]
no
no
yes
yes
add delete dependent finalizer if needed
add delete dependent finalizer if needed
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio new file mode 100644 index 00000000..9a4b3992 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.drawio @@ -0,0 +1 @@ +7VnLcpswFP0aL5PhYRyydBwnmU47k9aLtkvZCFAjECPk2OTre2WEQcgPkphx29QbpKMn955zJa4H7iRZ33OUxV9YgOnAsYL1wL0dOI5tX/vwkEhRIa5bIhEngcJqYEZesAIthS5JgHOto2CMCpLp4IKlKV4IDUOcs5XeLWRUXzVDETaA2QJRE/1OAhGXqO9ZNf6ASRRXK9uWaklQ1VkBeYwCtmpA7nTgTjhjoiwl6wmm0nqVXcpxd3tatxvjOBVdBoz56vk+v/35IKbfxh55+fz46euFmuUZ0aV6YbVZUVQWgFnA2FC5iUVCAbOhCC+TyfZcIC5mAgnZHhJKJ4wyvhnoWpuf7Cw4e8KNljBULWp1zAVe730te2ssoBlmCRa8gC7VAMsrhyiGjVR1VXvLVR6IG46qMKT4EW0nrk0IBWXFV1jU6WDRACimqoyLmEUsRXRao01LS+MQ4OOYkigFbM6EYAk04DQYS4LLSTKclogSkH/Q6mBZXvwA0Lr0qupPWa0qt2utVqha+SJy94d9BS/LlnyBj/MO2BNhcaCfu9v3HFMkyLO+j12uVEMfGYEdbjnjWxpl7FGLDOW21KCaD2BuVDS6ZbJDvn8Z22mt4/i6Ql/XHwrlDmpybk3ydr66Bl/vsdxTCrEcHmz+S4bVNoU5W6YBDhRHVzEReJahjctXcBLoFEZ8oXg5lDQKWSp2hYlW+Ajht+g9fIxaJh86l2YA2TqmGUGGfUWQ4f8I0iGCuB0jiNdLBGlL1amuNUdCyKlU6xkcgZsXFoSlA2dEwR43cw6lSJYESTCc00lmNuE1yeF5Z7aYio9ZMl/mx9V+FhlftdxRibMpYmuHiK/6EvHIcFDK3idjpORLcSj6VrWm6Vri/ava66hq/yAbquvFO0W+ZVHFqjZbehb5lcGhAue9kkiw7G8/F7oyyLY6UajQD/sTHxtux5unMdGF/tFz4bTmYWGY415I6RukpCR9qi+Mgm0+fhcxSfG/e200QoN37lvj9Ye7NR4NBf7eKHI8OvTz4elab9P/qcRbZdUaLFmmun5DDl7+AAoe7fHE2QRsd8nF/TEKPskN8XiayNrj1vNJuH2ED3tKHhkE9Vvp3df17yd5ZJvZI5Ozh/LHknjnzB47vn6RcvtLH0O1TvaXDqj/M3GnvwE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg new file mode 100644 index 00000000..2ea20cdf --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/activity_node_reconciliation.svg @@ -0,0 +1,2 @@ + +
Get node object
Get node object
deletion
timestamp
exist?
[Not supported by viewer]
no
no
yes
yes
link node to machine
link node to machine
unlink node from machine
unlink node from machine
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio new file mode 100644 index 00000000..d9af4752 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.drawio @@ -0,0 +1 @@ +5VrLdtsgEP0aL9tjCcmPZeKm6aI9SZtFz+kOSyOLBgkFodju1xci9MSxHMcP5XhlcYEZmHs9jLAHaBatbjlOwh/MBzqwh/5qgL4MbNuyphP5oZB1gSCUIwtOfI1VwAP5BxocajQjPqSNgYIxKkjSBD0Wx+CJBoY5Z8vmsIDRptcEL8AAHjxMTfQ38UWYoxN3WOHfgCzCwrM11D0RLgZrIA2xz5Y1CN0M0IwzJvKnaDUDqqJXxCWf9/WV3nJhHGKxy4S7u/vnWXR3NUVB8icIHq2fT9YnbeUZ00xv+DGbyzhSvWaxLgIhl5+oxyyi30kAlMSydZ0AJxEI4LKHavi+wq6XIRHwkGBPTV1KjUgsFBGVLUs+StYEllN42aYUJymZv3gdSoSDl/GUPMMvSHNxKJRlQnmalaQr0AxIsTvgAlY1SAfoFphcJ1/LIbrX0VxptU50c1kxX/Ib1lh3ChBrtS1KyxUh8kFz8gZ+bJOfSaocJSQFLjd2mTxZo74RhQyiPJqlKrgvuUlwGbFLZauMem/YcrawxeZ/1e4vkinX7htT7hamsCcyLNiFfqtGvTusxiZXHLAAlQJz0j6vcWSWFrUgq+0TWX1dUbKIJTZnQrBIdkDsX6lyTmGUeY/bYpiyjHvQXfUIzBcguk9f8Bs1oslILeQFCxwoFlIKzYJ0Q8S1tXtG5C6qA85qklseeIWJfI96Vr3qaxuadhjKg2AYksHG69qwRA1Ityz4FT+VnnKLlbrK+O0vuIkhOIifMpCNs0vM3lFi07NJzEZNxux2XthVYmjcYehAEis33vJzVIlNDYltFthFHDltBs5/5BRpssaPDz1JAaj/KaBVQpS3Lu9OAc5xUoDTzlnOCVKAZV6SYN+XQEBiTOW3zixAe6s152xac1sVTWn3rVpz3Q5Dr2jtYHIw72RkFmaxR+gHSjpub4SA7D2FMHY6DB0o6YzszX6Om3TMC6Us8fOXqVRgkaXn15rb+6Qzap0Xzt5aG3cYOpTWWq9R6BSvUZZ5HcZBZDx+r8RYArLr2sdpCL6eJ7v1rzyTk4gP7Si+9yqtdSNtlLw7K83qMHQopTmb/RxXaeZ1Hi/K9SEJXmgoj9JhgOWnf/481/9CHrXIdPe9LnImHYaOVMg7JynkRx8wz9mnyV92uzxvv8HtqqBph529q3PZrH4sz4dX/zlAN/8B \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg new file mode 100644 index 00000000..c6a3e796 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_creation.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
cluster controller
cluster controller
cluster object
cluster object
cluster actuator
cluster actuator
create cluster.yaml
create cluster.yaml
enqueue
enqueue
queue
queue
dequeue
dequeue
add finalizer
add finalizer
reconcile
reconcile
update status
update status
return
return
requeue if reconcile failed
requeue if reconcile failed
return
return
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio new file mode 100644 index 00000000..1230c4e9 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.drawio @@ -0,0 +1 @@ +7VrLcpswFP0az7SLZHg6sEycR2faTtJkkZnsZJCNGoGIEH706ysZAQbZBts4dsddBY6kK+mew71XinvmIJw9UBAHP4kPcc/Q/FnPvO0Zhq67Dv8jkLlENMfKkDFFvsRK4AX9gXlHiabIh0mlIyMEMxRXQY9EEfRYBQOUkmm124jg6qwxGEMFePEAVtFX5LMgQx1bK/FvEI2DfGZdky0hyDtLIAmAT6ZLkHnXMweUEJY9hbMBxMJ7uV+ycfdrWouFURixNgMeH58mg/Dx2jVH8dto9K7/+tAvpJUJwKnc8Hs65H7Ecs1snjuCLz8Wj2mIf6ARxCjibzcxpCiEDFLegiX8VGI30wAx+BIDTwydco1wLGAh5m86f+SsMcCH0OIdYxAnaLiYVeMIhV5KEzSBzzDJxCFQkjIx06AgXYCqQ/LdQcrgbAmSDnqAhK+TznkX2WpJrqRaHfk6LZkv+A2WWLfycUCqbVxYLgnhD5KTLfgxVH6cREwUowRSvrHz5EnvnxpRpkKUh9NEOHcRmxjlHjtXtiztiGw9T0bgYqYxE+lv9y4dJq/h94u+wtYtxNy5X74qDC35VewY8dRwjdE44tiQMEZC3gAj/1rkGoFh4r2vdNsm2TBAx3BTPzvrB/1KtlI9vuTS3MsUYsA41dXUuMKj0toTQXzJBXl2lTvTqHGSkJR6UA5aTj81O7rZYCjzgWJowW+xw90/UGvDB0qGv4Xgz/LjtI1TC6X2BqaAx1LAyJkG0v7J1SdXClf+IpCKrJeRdjkHoVpNdhZVpQ+zKNRc6DYGWuNogVbXq+QWNc7WkdZtMLQm0nJng/lSt1h0SDYseM08pZ4yi52GcUcRnODz6PIyWsrLPZq8jFr+NbQd5WVeNRjqSF7FxmvzHFReriKvjxTyx7NMN3UGjp9udLWKo5ClNNo3ApAY8qYbHyQB9OU43izvo5y9YoPdMjaYLWPDnoGgXzs7W7sGgiu9wVBHgaBfO4Lk8lq3Ltvd2P8wgUNXj5Snr8y2WUv/HGUaNUEZ9TjSugKqXTi0PWtuXQGtORx3pbSVdxfqlW0iKiBtUXgjEglCecZJGAjjfcX3eYWR1VJi3RdGptWR6iy7wVBHquNx9tJeOdNBdWcouktjHzC1NjpZjR2x+K5dshR2ty6+tQZDXRXfdS07n6Awtbg7ibNd2zvaI8rLbch3reVVN2QfRl7KPJ+RONV7xQCI/6WNUAQwL6f4sev+31Hb8RKmVTsWmrsmTLvfYKgjtdm1DG92fFG1Um3qzSiFIZnAiuD+q61ZbfXjqtuR2hRDXZVnrl6dZ7/UyV/L34hk3cuf2ph3fwE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg new file mode 100644 index 00000000..316ece5b --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_cluster_deletion.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
cluster controller
cluster controller
Delete()
Delete()
cluster object
cluster object
cluster actuator
cluster actuator
delete cluster.yaml
delete cluster.yaml
get
get
queue
queue
return
return
return
return
set deletion timestamp
set deletion timestamp
update
update
get
get
has finalizer?
has finalizer?
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio new file mode 100644 index 00000000..86cbf774 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.drawio @@ -0,0 +1 @@ +5VpRc6IwEP41PvZGCCg+Xm17Nzd3M53rzN1zhFVyDYSGULW//pYSQIhWa9Hq+FT4kuwm+31u1rU9Mo4W3yRNwl8iAN6z+8GiR256tm1ZIw//5MiyRAgpkJlkgcZq4IG9gAb7Gs1YAGljohKCK5Y0QV/EMfiqgVEpxbw5bSp402tCZ2AADz7lJvqXBSosUM/t1/h3YLOw9Gz19UhEy8kaSEMaiPkKRG57ZCyFUMVTtBgDz6NXxqVYd7dhtNqYhFjtssC1Bt7dy9Xkyem//PizCIHcqCtt5ZnyTB/4MZtgHLnes1qWgcDtJ/ljFvGfbAqcxfh2nYBkESiQOMI1fF9j1/OQKXhIqJ8vnaNGEAtVxPHNwkdkTVFcIqt3zmmSssmr1z4iEvxMpuwZfkNaiCNHRaZyT+OK9BzURwGpYLExRlYVedQsCNynXOIUvcDRXC2br/Oa+YrfcIV1pwSpVtusslwTgg+ak3fwY5v8eGnuKGEpSDzrZfJkDU6NKGIQFVE/zIP/mpuUxIhdKltV1E+GLecNtsTkX376i2TKtU+NKfcNpqivMqrEhX6qBid3WQ0MrnwJVMFrNfRK2pcljczSYiXIeUQYVl9fOZvFiE2EUiLCAYiDr3k5l2Nc+I9VDCEwCrhWBNGXyKQP28sgReUM1Lbr2GRkJeSeDq4EThVKoVmQrom4tnYvGG66vuCsJrmW3SKtOJJetVr1tQ2NthgqzmwYwmDT5cq0JJ+QvrHhDX5qPRUWa3VV8dtfcENDcBA/ZYAvpycxe0eJeceSmE1ajA32lBgZbjHUkcSqg7f8HFRiniGx9QK7iCunzcDnXzkjg54ATjUDkJPLAK0Kwhp2lAHsNt8dZQCHrPdz0AxQ3sQrGqNBgMCUxZTjh86sP89Ha86xtOa2CppKe+/VmutuMbRBa53JwWyZwYKlGOS7M9aB+2k68PbUwdDZYqijnDOw1/s5bM4x20kSVCbjj0pMJIBD1wFNQwj0OhzWfXevW/G5O4qPrBffB5U2aPUIyb717dDaYqgrpTnr/RxWaWYrTJYVVJ9N82uOMo5aOd/cdrR6irQIdPf90u54WwwdqJ5yjlJPmS29M8xtGzpBH63I27dju5DeVUGj/Qryzjg2W4FZEhStwLxf2y8bg2ebVI5WMDmt71Zk36TSLpwNQ11dY2S9nz2TCr7Wv5EX0+t/NSC3/wE= \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg new file mode 100644 index 00000000..98e16510 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_creation.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
machine controller
machine controller
machine object
machine object
machine actuator
machine actuator
create machine.yaml
create machine.yaml
enqueue
enqueue
queue
queue
get
get
add finalizer
add finalizer
exist?
exist?
return
return
requeue if failed
requeue if failed
return
return
update or create
update or create
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio new file mode 100644 index 00000000..52183cde --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.drawio @@ -0,0 +1 @@ +5Zpbc6IwGIZ/jZftcBDEy609XWxnO9uZ3esIUbINhIbgYX/9fpEgh1ilVtGuV8KbkJDvfUi+ZOzZo2jxwFESPrEA055lBIuefduzLNMcevAjlaVSDK+fK1NOAqWVwgv5i4uKSs1IgNNaRcEYFSSpiz6LY+yLmoY4Z/N6tQmj9V4TNMWa8OIjqqu/SSDCXPUco9QfMZmGRc+moUoiVFRWQhqigM0rkn3Xs0ecMZFfRYsRpjJ6RVzy5+7fKV2/GMexaPPA46/Jj+VDvFiQq+XUdvy3p8n9lTJjhmimBvyajSGOVL2zWBaBgNdP5GUW0e9kgimJ4e4mwZxEWGAOJVTJz6V2Mw+JwC8J8uWjc2AEtFBEFO5MuATXBIJH+PqeUpSkZLzq1QCFYz/jKZnhnzjN4ZAqy4TsabQ2XYp6QFSMZpgLvKhIKkAPmMF78iVUUaV95dWyfjsvnV/7G1Zc7xcVkaJtum65NAQulCcf8MfR/fFS2VFCUsxhYJfpk+mem1GuZlSE/FAGfzU3CQ4Ru1S3+sa5uTXY4hYb/5Gjv0inHOvcnPK2OIV8kSHBLvSrcs9usRpqXkE6CMFdZUMr066XKNJTi0qQ5fAJZF/fKJnGoI2ZECyCAhwH32Q6JzXK/NdtMUxZxn28O+sRiE+x2L364qCWI+qOVELuqeByTJEAFOoJ6YaIq9aeGYFRlAucWTfXtBqm5WNUT1WzvmZDwx0N5UHQGoJgo2WlWiIrpFte+J1+Sp7yFku61vHbH7giSBXipKEn58tpyZdpngwwy2745e4JmD3Y0dCBAFsPvNHPcQErZuUSsLcMw+VFrjhNC06/4pjWeU4A7heYABrpgzk40ARgGceZAJq7iCIQx50AbA2wEMkN+ITEiMInB9/m/dfhbXAy3JxGQmM154S2uDnOjoYOhFuzH7uThEY/j7tVKfRXQcw7H8S8PREb9Hc0dCDE3MZu2+4kpdGPFDkWGY8/ixhLMBTdBCgNcaCeg2J1pO99Cj6vJXxuS/g+SZrrbjbu46SZOxo6FGnaCVwXpOmnbOdPWtutW78b0qzmnNZMrtqSNuwmSTObyWA9Sdt5ztFNUqcfVKVy12CsjqsIiyUAsElLBYqSo6+8DYTaMtrFimrbB6LP6WyPYG7s56g4Fat4BacsCVAHSdspto2HyuM1to6Ux8PAr52NPR0XCv3kiOOIzXBt7/gfAtJv7Ju0w5995wytoQ8DUjtq2uox3JZ/zMirl/9vse/+AQ== \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg new file mode 100644 index 00000000..ce600d79 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/images/sequence_machine_deletion.svg @@ -0,0 +1,2 @@ + +
kubectl
kubectl
k8s apiserver
k8s apiserver
machine controller
machine controller
machine object
machine object
machine actuator
machine actuator
delete machine.yaml
delete machine.yaml
get
get
queue
queue
get
get
has finalizer?
has finalizer?
Delete
Delete
return
return
return
return
set deletion timestamp
set deletion timestamp
update
update
remove finalizer
remove finalizer
\ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md index 198b3bae..b4770eeb 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machine_controller.md @@ -109,11 +109,6 @@ The definition of `Exists()` is determined by the provider. ## Machine Controller Semantics -{% panel style="info", title="Logic sequence" %} -We need a diagram tracing the logic from resource creation through updates -and finally deletion. -{% endpanel %} - 0. Determine the `Cluster` associated with the `Machine` from its `cluster.k8s.io/cluster-name` label. - If the `Machine` hasn't been deleted and doesn't have a finalizer, add one. - If the `Machine` is being deleted, and there is no finalizer, we're done @@ -142,6 +137,20 @@ There are two consequences of this: delete the `Machine`. Therefore `Machine`s must be deleted before `Cluster`s. {% endpanel %} +#### machine reconciliation logic +![machine reconciliation logic](images/activity_machine_controller_reconciliation.svg) + +#### machine deletion block +![machine deletion block](images/activity_machine_deletion_block.svg) + +#### machine object creation sequence + +![machine object creation](images/sequence_machine_creation.svg) + +#### machine object deletion sequence + +![machine object deletion](images/sequence_machine_deletion.svg) + --- [^1] One reason a `Machine` may not be deleted is if it corresponds to the diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md index e8d868ce..510ec510 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machinedeployment_controller.md @@ -15,8 +15,28 @@ {% endmethod %} {% method %} +## MachineDeploymentStrategy + +{% sample lang="go" %} +[import:'MachineDeploymentStrategy'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) +{% endmethod %} + +{% method %} +## MachineRollingUpdateDeployment + +{% sample lang="go" %} +[import:'MachineRollingUpdateDeployment'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) +{% endmethod %} + +{% method %} + ## MachineDeploymentStatus {% sample lang="go" %} [import:'MachineDeploymentStatus'](../../../pkg/apis/cluster/v1alpha1/machinedeployment_types.go) {% endmethod %} + +## MachineDeployment Controller Semantics + +![machinedeployment object reconciliation logic](images/activity_machinedeployment_reconciliation.svg) + diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md index c4ca6014..37cbeea9 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/machineset_controller.md @@ -32,3 +32,24 @@ which implement their intent by modifying provider-specific `Cluster` and {% sample lang="go" %} [import:'MachineSetStatus'](../../../pkg/apis/cluster/v1alpha1/machineset_types.go) {% endmethod %} + +## MachineSet Controller Semantics + +![machineset object reconciliation logic](images/activity_machineset_reconciliation.svg) + +#### filter machine BLOCK + +This code block examines all machines in the namespace of the machineset and filters out machines that do NOT +have all the following conditions (in this order): + +1. The machine has a controller and is controlled by the machineset. +2. The machine is not scheduled for deletion. +3. The machine's label selector matches that of the machineset. + +For machines that fails condition 1, an attempt is made to adopt the machine into the machineset. The result +of this code block is a filtered list of machines that will be processed in the next code block. + +#### sync replica BLOCK + +This code block looks at the filtered machine list and determines whether to scale up or down the number of +machines to match the replica count defined in the machineset. diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md new file mode 100644 index 00000000..d18d4994 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/common_code/node_controller.md @@ -0,0 +1,22 @@ +# Node Controller + +The node controller has one simple job. It links or unlinks a `Machine` to the underlying +core k8s `Node` object if an optional annotation `cluster.k8s.io/machine` is present on the `Node`. The +decision to add the annotation is left to each infrastructure-specific provider. When the +controller links a `Machine`, it assigns the machine's `Status.NodeRef` to the `Node`'s +objectRef. + +The simplest way for Infrastructure-specific providers to add this support is to annotate +nodes in their node bootup script as part of the `kubeadm join` operation (via a commandline +parameter). + +## Node Controller Semantics + +The node controller is very simple. In the current design, a `Machine` will exist before the +backing `Node` is created. When a node is created and ready, the controller checks if the +annotation exist. If it does, it links `Node` to the `Machine`. If the `Node` is slated for +deletion, it unlinks the `Node` from the `Machine`. + +#### node reconciliation logic + +![node object reconciliation logic](images/activity_node_reconciliation.svg) \ No newline at end of file diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md b/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md index c75a1c85..9949c905 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/getting_started/existing_providers.md @@ -3,7 +3,6 @@ A great way to become acquainted with the Cluster API is to start using it. There are multiple implementations of the Cluster API for different environments. These implementations are called _providers_. To find a partial list of the -existing providers see the Cluster API [Provider Implementations List][provider-implementations-list] +existing providers see the Cluster API [Provider Implementations List][provider-implementations-list]. [provider-implementations-list]: https://github.com/kubernetes-sigs/cluster-api/blob/master/README.md#provider-implementations -. diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md index 6ccb13b9..47bc0ef5 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/building_running_and_testing.md @@ -6,24 +6,24 @@ Apply the following patch: ```bash diff --git a/Makefile b/Makefile -index ac12c7e..9b4f945 100644 +index ac12c7e..cf44312 100644 --- a/Makefile +++ b/Makefile -@@ -22,12 +22,14 @@ install: manifests +@@ -22,12 +22,15 @@ install: manifests # Deploy controller in the configured Kubernetes cluster in ~/.kube/config deploy: manifests -- kubectl apply -f config/crds -- kustomize build config/default | kubectl apply -f - -+ cat provider-components.yaml | kubectl apply -f - +- kubectl apply -f config/crds +- kustomize build config/default | kubectl apply -f - ++ cat provider-components.yaml | kubectl apply -f - # Generate manifests e.g. CRD, RBAC etc. manifests: -- go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all -+ go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go crd -+ kustomize build config/default/ > provider-components.yaml -+ echo "---" >> provider-components.yaml -+ kustomize build vendor/sigs.k8s.io/cluster-api/config/default/ >> provider-components.yaml + go run vendor/sigs.k8s.io/controller-tools/cmd/controller-gen/main.go all ++ sed -i'' -e 's@^- manager_auth_proxy_patch.yaml.*@#&@' config/default/kustomization.yaml ++ kustomize build config/default/ > provider-components.yaml ++ echo "---" >> provider-components.yaml ++ kustomize build vendor/sigs.k8s.io/cluster-api/config/default/ >> provider-components.yaml # Run go fmt against code fmt: diff --git a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md index b6478594..50b53264 100644 --- a/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md +++ b/vendor/sigs.k8s.io/cluster-api/docs/book/provider_implementations/register_schemes.md @@ -28,6 +28,7 @@ import ( "fmt" "os" + "k8s.io/klog" "sigs.k8s.io/cluster-api-provider-solas/pkg/apis" "sigs.k8s.io/cluster-api-provider-solas/pkg/cloud/solas/actuators/cluster" "sigs.k8s.io/cluster-api-provider-solas/pkg/cloud/solas/actuators/machine" @@ -43,18 +44,22 @@ import ( ) func main() { + klog.InitFlags(nil) + cfg := config.GetConfigOrDie() if cfg == nil { panic(fmt.Errorf("GetConfigOrDie didn't die")) } + metricsAddr := flag.String("metrics-addr", ":8080", "The address the metric endpoint binds to.") flag.Parse() + log := logf.Log.WithName("solas-controller-manager") logf.SetLogger(logf.ZapLogger(false)) entryLog := log.WithName("entrypoint") // Setup a Manager - mgr, err := manager.New(cfg, manager.Options{}) + mgr, err := manager.New(cfg, manager.Options{MetricsBindAddress: *metricsAddr}) if err != nil { entryLog.Error(err, "unable to set up overall controller manager") os.Exit(1) diff --git a/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md b/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md new file mode 100644 index 00000000..979d82f7 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/docs/developer/releasing.md @@ -0,0 +1,44 @@ +# Releasing + +## Output + +### Expected artifacts + +1. A container image of the shared cluster-api controller manager +2. A git tag for providers to use + +### Artifact locations + +1. The container image is found in the registry `gcr.io/k8s-cluster-api` with an + image name of `cluster-api-controller` and a tag that matches the release + version. For example, in the `0.0.0-alpha.4` release, the container image + location is `gcr.io/k8s-cluster-api/cluster-api-controller:0.0.0-alpha.4` + +## Process + +1. Create a pull request that contains two changes: + 1. Change [the cluster api controller manager image + tag][managerimg] from `:latest` to whatever version is being released + 2. Change the `CONTROLLER_IMAGE` variable in the [Makefile][makefile] to the + version being released +2. Get the pull request merged +3. From the commit in step 1 (that is now in the master branch), build and push + the container image with `make docker-push` +4. Create a tag from this same commit and push the tag to the github repository +5. Revert the commit made in step 1 +6. Open a pull request with the revert change +7. Get that pull request merged +8. Create a release in github based on the tag created above +9. Manually create the release notes by going through the merged PRs since the + last release + +[managerimg]: https://github.com/kubernetes-sigs/cluster-api/blob/fab4c07ea9fb0f124a5abe3dd7fcfffc23f2a1b3/config/default/manager_image_patch.yaml +[makefile]: https://github.com/kubernetes-sigs/cluster-api/blob/fab4c07ea9fb0f124a5abe3dd7fcfffc23f2a1b3/Makefile + +### Permissions + +Releasing requires a particular set of permissions. + +* push access to the gcr bucket +* tag push access to the github repository +* release creation diff --git a/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh b/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh index 05a3d67b..0518bbca 100755 --- a/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh +++ b/vendor/sigs.k8s.io/cluster-api/hack/verify-bazel.sh @@ -16,7 +16,6 @@ set -o errexit set -o nounset set -o pipefail -set -o verbose if ! which bazel &>/dev/null; then echo "Bazel not available, skipping validation"; exit; fi diff --git a/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh b/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh index c8d36fb6..939c8734 100755 --- a/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh +++ b/vendor/sigs.k8s.io/cluster-api/hack/verify_clientset.sh @@ -39,7 +39,6 @@ make clientset echo "diffing ${DIFFROOT} against freshly generated codegen" ret=0 diff -Naupr "${DIFFROOT}" "${TMP_DIFFROOT}" -x '*.bazel' -x 'BUILD' || ret=$? -cp -a "${TMP_DIFFROOT}"/* "${DIFFROOT}" if [[ $ret -eq 0 ]] then echo "${DIFFROOT} up to date." diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go index 28748025..dfa87062 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/common/consts.go @@ -51,6 +51,13 @@ const ( // Example: timeout trying to connect to GCE. CreateMachineError MachineStatusError = "CreateError" + // There was an error while trying to update a Node that this + // Machine represents. This may indicate a transient problem that will be + // fixed automatically with time, such as a service outage, + // + // Example: error updating load balancers + UpdateMachineError MachineStatusError = "UpdateError" + // An error was encountered while trying to delete the Node that this // Machine represents. This could be a transient or terminal error, but // will only be observable if the provider's Machine controller has diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go index 60fd59ab..427e7a30 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machine_types.go @@ -38,6 +38,8 @@ const ( // Machine is the Schema for the machines API // +k8s:openapi-gen=true // +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="ProviderID",type="string",JSONPath=".spec.providerID",description="Provider ID" +// +kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase",description="Machine status such as Terminating/Pending/Running/Failed etc" type Machine struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` @@ -57,9 +59,12 @@ type MachineSpec struct { // +optional metav1.ObjectMeta `json:"metadata,omitempty"` - // Taints is the full, authoritative list of taints to apply to the corresponding - // Node. This list will overwrite any modifications made to the Node on - // an ongoing basis. + // The list of the taints to be applied to the corresponding Node in additive + // manner. This list will not overwrite any other taints added to the Node on + // an ongoing basis by other entities. These taints should be actively reconciled + // e.g. if you ask the machine controller to apply a taint and then manually remove + // the taint the machine controller will put it back) but not have the machine controller + // remove any taints // +optional Taints []corev1.Taint `json:"taints,omitempty"` @@ -87,12 +92,12 @@ type MachineSpec struct { // ProviderID is the identification ID of the machine provided by the provider. // This field must match the provider ID as seen on the node object corresponding to this machine. // This field is required by higher level consumers of cluster-api. Example use case is cluster autoscaler - // with cluster-api as provider. Clean-up login in the autoscaler compares machines v/s nodes to find out + // with cluster-api as provider. Clean-up logic in the autoscaler compares machines to nodes to find out // machines at provider which could not get registered as Kubernetes nodes. With cluster-api as a // generic out-of-tree provider for autoscaler, this field is required by autoscaler to be - // able to have a provider view of the list of machines. Another list of nodes is queries from the k8s apiserver - // and then comparison is done to find out unregistered machines and are marked for delete. - // This field will be set by the actuators and consumed by higher level entities like autoscaler who will + // able to have a provider view of the list of machines. Another list of nodes is queried from the k8s apiserver + // and then a comparison is done to find out unregistered machines and are marked for delete. + // This field will be set by the actuators and consumed by higher level entities like autoscaler that will // be interfacing with cluster-api as generic provider. // +optional ProviderID *string `json:"providerID,omitempty"` diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go index ded87688..6f907702 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1/machineset_types.go @@ -58,6 +58,11 @@ type MachineSetSpec struct { // +optional MinReadySeconds int32 `json:"minReadySeconds,omitempty"` + // DeletePolicy defines the policy used to identify nodes to delete when downscaling. + // Defaults to "Random". Valid values are "Random, "Newest", "Oldest" + // +kubebuilder:validation:Enum=Random,Newest,Oldest + DeletePolicy string `json:"deletePolicy,omitempty"` + // Selector is a label query over machines that should match the replica count. // Label keys and values that must match in order to be controlled by this MachineSet. // It must match the machine template's labels. @@ -70,6 +75,30 @@ type MachineSetSpec struct { Template MachineTemplateSpec `json:"template,omitempty"` } +// MachineSetDeletePolicy defines how priority is assigned to nodes to delete when +// downscaling a MachineSet. Defaults to "Random". +type MachineSetDeletePolicy string + +const ( + // RandomMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // Finally, it picks Machines at random to delete. + RandomMachineSetDeletePolicy MachineSetDeletePolicy = "Random" + + // NewestMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // It then prioritizes the newest Machines for deletion based on the Machine's CreationTimestamp. + NewestMachineSetDeletePolicy MachineSetDeletePolicy = "Newest" + + // OldestMachineSetDeletePolicy prioritizes both Machines that have the annotation + // "cluster.k8s.io/delete-machine=yes" and Machines that are unhealthy + // (Status.ErrorReason or Status.ErrorMessage are set to a non-empty value). + // It then prioritizes the oldest Machines for deletion based on the Machine's CreationTimestamp. + OldestMachineSetDeletePolicy MachineSetDeletePolicy = "Oldest" +) + /// [MachineSetSpec] // doxygen marker /// [MachineTemplateSpec] // doxygen marker @@ -170,6 +199,12 @@ func (m *MachineSet) Default() { if len(m.Namespace) == 0 { m.Namespace = metav1.NamespaceDefault } + + if m.Spec.DeletePolicy == "" { + randomPolicy := string(RandomMachineSetDeletePolicy) + log.Printf("Defaulting to %s\n", randomPolicy) + m.Spec.DeletePolicy = randomPolicy + } } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go index d9399446..3b657c1c 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machine/controller.go @@ -90,7 +90,7 @@ type ReconcileMachine struct { // Reconcile reads that state of the cluster for a Machine object and makes changes based on the state read // and what is in the Machine.Spec -// +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines;machines/status,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Result, error) { // TODO(mvladev): Can context be passed from Kubebuilder? ctx := context.TODO() @@ -178,6 +178,14 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{}, err } + if m.Status.NodeRef != nil { + klog.Infof("Deleting node %q for machine %q", m.Status.NodeRef.Name, m.Name) + if err := r.deleteNode(ctx, m.Status.NodeRef.Name); err != nil { + klog.Errorf("Error deleting node %q for machine %q", name, err) + return reconcile.Result{}, err + } + } + // Remove finalizer on successful deletion. m.ObjectMeta.Finalizers = util.Filter(m.ObjectMeta.Finalizers, clusterv1.MachineFinalizer) if err := r.Client.Update(context.Background(), m); err != nil { @@ -203,6 +211,7 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul return reconcile.Result{Requeue: true, RequeueAfter: requeueErr.RequeueAfter}, nil } + klog.Errorf(`Error updating machine "%s/%s": %v`, m.Namespace, name, err) return reconcile.Result{}, err } @@ -263,3 +272,16 @@ func (r *ReconcileMachine) isDeleteAllowed(machine *clusterv1.Machine) bool { // own machine. return node.UID != machine.Status.NodeRef.UID } + +func (r *ReconcileMachine) deleteNode(ctx context.Context, name string) error { + var node corev1.Node + if err := r.Client.Get(ctx, client.ObjectKey{Name: name}, &node); err != nil { + if apierrors.IsNotFound(err) { + klog.V(2).Infof("Node %q not found", name) + return nil + } + klog.Errorf("Failed to get node %q: %v", name, err) + return err + } + return r.Client.Delete(ctx, &node) +} diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel index 6901a984..44b74899 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/BUILD.bazel @@ -13,7 +13,9 @@ go_library( "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//pkg/controller/machinedeployment/util:go_default_library", + "//pkg/util:go_default_library", "//vendor/github.com/pkg/errors:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -21,6 +23,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/client-go/util/integer:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", "//vendor/k8s.io/klog:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go index 31ecdeb0..939dea58 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machinedeployment/controller.go @@ -21,14 +21,17 @@ import ( "reflect" "github.com/pkg/errors" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" "k8s.io/klog" "sigs.k8s.io/cluster-api/pkg/apis/cluster/common" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/cluster-api/pkg/util" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" @@ -42,15 +45,19 @@ var ( controllerKind = v1alpha1.SchemeGroupVersion.WithKind("MachineDeployment") ) +// controllerName is the name of this controller +const controllerName = "machinedeployment-controller" + // ReconcileMachineDeployment reconciles a MachineDeployment object. type ReconcileMachineDeployment struct { client.Client - scheme *runtime.Scheme + scheme *runtime.Scheme + recorder record.EventRecorder } // newReconciler returns a new reconcile.Reconciler. func newReconciler(mgr manager.Manager) *ReconcileMachineDeployment { - return &ReconcileMachineDeployment{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcileMachineDeployment{Client: mgr.GetClient(), scheme: mgr.GetScheme(), recorder: mgr.GetRecorder(controllerName)} } // Add creates a new MachineDeployment Controller and adds it to the Manager with default RBAC. @@ -62,7 +69,7 @@ func Add(mgr manager.Manager) error { // add adds a new Controller to mgr with r as the reconcile.Reconciler. func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFunc) error { // Create a new controller. - c, err := controller.New("machinedeployment-controller", mgr, controller.Options{Reconciler: r}) + c, err := controller.New(controllerName, mgr, controller.Options{Reconciler: r}) if err != nil { return err } @@ -106,15 +113,9 @@ func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.Mac return nil, err } - // TODO: flush out machine set adoption. - filteredMS := make([]*v1alpha1.MachineSet, 0, len(machineSets.Items)) for idx := range machineSets.Items { ms := &machineSets.Items[idx] - if metav1.GetControllerOf(ms) == nil || (metav1.GetControllerOf(ms) != nil && !metav1.IsControlledBy(ms, d)) { - klog.V(4).Infof("%s not controlled by %v", ms.Name, d.Name) - continue - } selector, err := metav1.LabelSelectorAsSelector(&d.Spec.Selector) if err != nil { @@ -133,18 +134,37 @@ func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.Mac continue } + // Attempt to adopt machine if it meets previous conditions and it has no controller references. + if metav1.GetControllerOf(ms) == nil { + if err := r.adoptOrphan(d, ms); err != nil { + klog.Warningf("Failed to adopt MachineSet %q into MachineDeployment %q: %v", ms.Name, d.Name, err) + continue + } + } + + if !metav1.IsControlledBy(ms, d) { + continue + } + filteredMS = append(filteredMS, ms) } return filteredMS, nil } +func (r *ReconcileMachineDeployment) adoptOrphan(deployment *v1alpha1.MachineDeployment, machineSet *v1alpha1.MachineSet) error { + newRef := *metav1.NewControllerRef(deployment, controllerKind) + machineSet.OwnerReferences = append(machineSet.OwnerReferences, newRef) + return r.Client.Update(context.Background(), machineSet) +} + // Reconcile reads that state of the cluster for a MachineDeployment object and makes changes based on the state read // and what is in the MachineDeployment.Spec // +kubebuilder:rbac:groups=cluster.k8s.io,resources=machinedeployments,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (reconcile.Result, error) { // Fetch the MachineDeployment instance d := &v1alpha1.MachineDeployment{} + ctx := context.TODO() if err := r.Get(context.TODO(), request.NamespacedName, d); err != nil { if apierrors.IsNotFound(err) { // Object not found, return. Created objects are automatically garbage collected. @@ -154,7 +174,16 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon // Error reading the object - requeue the request. return reconcile.Result{}, err } + result, err := r.reconcile(ctx, d) + if err != nil { + klog.Errorf("Failed to reconcile MachineDeployment %q: %v", request.NamespacedName, err) + r.recorder.Eventf(d, corev1.EventTypeWarning, "ReconcileError", "%v", err) + } + return result, err +} + +func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1.MachineDeployment) (reconcile.Result, error) { v1alpha1.PopulateDefaultsMachineDeployment(d) everything := metav1.LabelSelector{} @@ -180,6 +209,41 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon return reconcile.Result{}, errors.Errorf("failed validation on MachineDeployment %q label selector, cannot match any machines ", d.Name) } + // Cluster might be nil as some providers might not require a cluster object + // for machine management. + cluster, err := r.getCluster(d) + if err != nil { + return reconcile.Result{}, err + } + + // Set the ownerRef with foreground deletion if there is a linked cluster. + if cluster != nil && len(d.OwnerReferences) == 0 { + blockOwnerDeletion := true + d.OwnerReferences = append(d.OwnerReferences, metav1.OwnerReference{ + APIVersion: cluster.APIVersion, + Kind: cluster.Kind, + Name: cluster.Name, + UID: cluster.UID, + BlockOwnerDeletion: &blockOwnerDeletion, + }) + } + + // Add foregroundDeletion finalizer if MachineDeployment isn't deleted and linked to a cluster. + if cluster != nil && + d.ObjectMeta.DeletionTimestamp.IsZero() && + !util.Contains(d.Finalizers, metav1.FinalizerDeleteDependents) { + + d.Finalizers = append(d.ObjectMeta.Finalizers, metav1.FinalizerDeleteDependents) + + if err := r.Client.Update(context.Background(), d); err != nil { + klog.Infof("Failed to add finalizers to MachineSet %q: %v", d.Name, err) + return reconcile.Result{}, err + } + + // Since adding the finalizer updates the object return to avoid later update issues + return reconcile.Result{}, nil + } + msList, err := r.getMachineSetsForDeployment(d) if err != nil { return reconcile.Result{}, err @@ -206,6 +270,25 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon return reconcile.Result{}, errors.Errorf("unexpected deployment strategy type: %s", d.Spec.Strategy.Type) } +func (r *ReconcileMachineDeployment) getCluster(d *v1alpha1.MachineDeployment) (*v1alpha1.Cluster, error) { + if d.Spec.Template.Labels[v1alpha1.MachineClusterLabelName] == "" { + klog.Infof("Deployment %q in namespace %q doesn't specify %q label, assuming nil cluster", d.Name, v1alpha1.MachineClusterLabelName, d.Namespace) + return nil, nil + } + + cluster := &v1alpha1.Cluster{} + key := client.ObjectKey{ + Namespace: d.Namespace, + Name: d.Spec.Template.Labels[v1alpha1.MachineClusterLabelName], + } + + if err := r.Client.Get(context.Background(), key, cluster); err != nil { + return nil, err + } + + return cluster, nil +} + // getMachineDeploymentsForMachineSet returns a list of Deployments that potentially // match a MachineSet. func (r *ReconcileMachineDeployment) getMachineDeploymentsForMachineSet(ms *v1alpha1.MachineSet) []*v1alpha1.MachineDeployment { diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel index ea0b6ee3..dabadbad 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/BUILD.bazel @@ -20,6 +20,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/klog:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/controller:go_default_library", @@ -42,6 +43,7 @@ go_test( embed = [":go_default_library"], deps = [ "//pkg/apis:go_default_library", + "//pkg/apis/cluster/common:go_default_library", "//pkg/apis/cluster/v1alpha1:go_default_library", "//vendor/golang.org/x/net/context:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go index c42be30f..b61030c5 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/controller.go @@ -24,10 +24,12 @@ import ( "time" "github.com/pkg/errors" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/tools/record" "k8s.io/klog" clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/cluster-api/pkg/util" @@ -48,6 +50,9 @@ var ( // stateConfirmationInterval is the amount of time between polling for the desired state. // The polling is against a local memory cache. stateConfirmationInterval = 100 * time.Millisecond + + // controllerName is the name of this controller + controllerName = "machineset-controller" ) // Add creates a new MachineSet Controller and adds it to the Manager with default RBAC. @@ -59,13 +64,13 @@ func Add(mgr manager.Manager) error { // newReconciler returns a new reconcile.Reconciler. func newReconciler(mgr manager.Manager) *ReconcileMachineSet { - return &ReconcileMachineSet{Client: mgr.GetClient(), scheme: mgr.GetScheme()} + return &ReconcileMachineSet{Client: mgr.GetClient(), scheme: mgr.GetScheme(), recorder: mgr.GetRecorder(controllerName)} } // add adds a new Controller to mgr with r as the reconcile.Reconciler. func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFunc) error { // Create a new controller. - c, err := controller.New("machineset-controller", mgr, controller.Options{Reconciler: r}) + c, err := controller.New(controllerName, mgr, controller.Options{Reconciler: r}) if err != nil { return err } @@ -98,7 +103,8 @@ func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFu // ReconcileMachineSet reconciles a MachineSet object type ReconcileMachineSet struct { client.Client - scheme *runtime.Scheme + scheme *runtime.Scheme + recorder record.EventRecorder } func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconcile.Request { @@ -138,8 +144,9 @@ func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconc // +kubebuilder:rbac:groups=cluster.k8s.io,resources=machines,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Result, error) { // Fetch the MachineSet instance + ctx := context.TODO() machineSet := &clusterv1alpha1.MachineSet{} - if err := r.Get(context.TODO(), request.NamespacedName, machineSet); err != nil { + if err := r.Get(ctx, request.NamespacedName, machineSet); err != nil { if apierrors.IsNotFound(err) { // Object not found, return. Created objects are automatically garbage collected. // For additional cleanup logic use finalizers. @@ -149,6 +156,15 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, err } + result, err := r.reconcile(ctx, machineSet) + if err != nil { + klog.Errorf("Failed to reconcile MachineSet %q: %v", request.NamespacedName, err) + r.recorder.Eventf(machineSet, corev1.EventTypeWarning, "ReconcileError", "%v", err) + } + return result, err +} + +func (r *ReconcileMachineSet) reconcile(ctx context.Context, machineSet *clusterv1alpha1.MachineSet) (reconcile.Result, error) { klog.V(4).Infof("Reconcile machineset %v", machineSet.Name) allMachines := &clusterv1alpha1.MachineList{} @@ -167,6 +183,41 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, errors.Errorf("failed validation on MachineSet %q label selector, cannot match any machines ", machineSet.Name) } + // Cluster might be nil as some providers might not require a cluster object + // for machine management. + cluster, err := r.getCluster(machineSet) + if err != nil { + return reconcile.Result{}, err + } + + // Set the ownerRef with foreground deletion if there is a linked cluster. + if cluster != nil && len(machineSet.OwnerReferences) == 0 { + blockOwnerDeletion := true + machineSet.OwnerReferences = append(machineSet.OwnerReferences, metav1.OwnerReference{ + APIVersion: cluster.APIVersion, + Kind: cluster.Kind, + Name: cluster.Name, + UID: cluster.UID, + BlockOwnerDeletion: &blockOwnerDeletion, + }) + } + + // Add foregroundDeletion finalizer if MachineSet isn't deleted and linked to a cluster. + if cluster != nil && + machineSet.ObjectMeta.DeletionTimestamp.IsZero() && + !util.Contains(machineSet.Finalizers, metav1.FinalizerDeleteDependents) { + + machineSet.Finalizers = append(machineSet.ObjectMeta.Finalizers, metav1.FinalizerDeleteDependents) + + if err := r.Client.Update(context.Background(), machineSet); err != nil { + klog.Infof("Failed to add finalizers to MachineSet %q: %v", machineSet.Name, err) + return reconcile.Result{}, err + } + + // Since adding the finalizer updates the object return to avoid later update issues + return reconcile.Result{}, nil + } + // Filter out irrelevant machines (deleting/mismatch labels) and claim orphaned machines. filteredMachines := make([]*clusterv1alpha1.Machine, 0, len(allMachines.Items)) for idx := range allMachines.Items { @@ -175,10 +226,10 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re continue } - // Attempt to adopt machine if it meets previous conditions and it has no controller ref. + // Attempt to adopt machine if it meets previous conditions and it has no controller references. if metav1.GetControllerOf(machine) == nil { if err := r.adoptOrphan(machineSet, machine); err != nil { - klog.Warningf("failed to adopt machine %v into machineset %v. %v", machine.Name, machineSet.Name, err) + klog.Warningf("Failed to adopt MachineSet %q into MachineSet %q: %v", machine.Name, machineSet.Name, err) continue } } @@ -222,6 +273,25 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, nil } +func (r *ReconcileMachineSet) getCluster(ms *clusterv1alpha1.MachineSet) (*clusterv1alpha1.Cluster, error) { + if ms.Spec.Template.Labels[clusterv1alpha1.MachineClusterLabelName] == "" { + klog.Infof("MachineSet %q in namespace %q doesn't specify %q label, assuming nil cluster", ms.Name, clusterv1alpha1.MachineClusterLabelName, ms.Namespace) + return nil, nil + } + + cluster := &clusterv1alpha1.Cluster{} + key := client.ObjectKey{ + Namespace: ms.Namespace, + Name: ms.Spec.Template.Labels[clusterv1alpha1.MachineClusterLabelName], + } + + if err := r.Client.Get(context.Background(), key, cluster); err != nil { + return nil, err + } + + return cluster, nil +} + // syncReplicas essentially scales machine resources up and down. func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machines []*clusterv1alpha1.Machine) error { if ms.Spec.Replicas == nil { @@ -238,12 +308,12 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi var machineList []*clusterv1alpha1.Machine var errstrings []string for i := 0; i < diff; i++ { - klog.Infof("creating machine %d of %d, ( spec.replicas(%d) > currentMachineCount(%d) )", + klog.Infof("Creating machine %d of %d, ( spec.replicas(%d) > currentMachineCount(%d) )", i+1, diff, *(ms.Spec.Replicas), len(machines)) machine := r.createMachine(ms) if err := r.Client.Create(context.Background(), machine); err != nil { - klog.Errorf("unable to create a machine = %s, due to %v", machine.Name, err) + klog.Errorf("Unable to create Machine %q: %v", machine.Name, err) errstrings = append(errstrings, err.Error()) continue } @@ -260,8 +330,13 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi klog.Infof("Too many replicas for %v %s/%s, need %d, deleting %d", controllerKind, ms.Namespace, ms.Name, *(ms.Spec.Replicas), diff) + deletePriorityFunc, err := getDeletePriorityFunc(ms) + if err != nil { + return err + } + klog.Infof("Found %s delete policy", ms.Spec.DeletePolicy) // Choose which Machines to delete. - machinesToDelete := getMachinesToDeletePrioritized(machines, diff, simpleDeletePriority) + machinesToDelete := getMachinesToDeletePrioritized(machines, diff, deletePriorityFunc) // TODO: Add cap to limit concurrent delete calls. errCh := make(chan error, diff) @@ -272,7 +347,7 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi defer wg.Done() err := r.Client.Delete(context.Background(), targetMachine) if err != nil { - klog.Errorf("unable to delete a machine = %s, due to %v", targetMachine.Name, err) + klog.Errorf("Unable to delete Machine %s: %v", targetMachine.Name, err) errCh <- err } }(machine) @@ -333,22 +408,9 @@ func shouldExcludeMachine(machineSet *clusterv1alpha1.MachineSet, machine *clust } func (r *ReconcileMachineSet) adoptOrphan(machineSet *clusterv1alpha1.MachineSet, machine *clusterv1alpha1.Machine) error { - // Add controller reference. - ownerRefs := machine.ObjectMeta.GetOwnerReferences() - if ownerRefs == nil { - ownerRefs = []metav1.OwnerReference{} - } - newRef := *metav1.NewControllerRef(machineSet, controllerKind) - ownerRefs = append(ownerRefs, newRef) - machine.ObjectMeta.SetOwnerReferences(ownerRefs) - - if err := r.Client.Update(context.Background(), machine); err != nil { - klog.Warningf("Failed to update machine owner reference. %v", err) - return err - } - - return nil + machine.OwnerReferences = append(machine.OwnerReferences, newRef) + return r.Client.Update(context.Background(), machine) } func (r *ReconcileMachineSet) waitForMachineCreation(machineList []*clusterv1alpha1.Machine) error { diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go index b2d5acbc..91b79de0 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/delete_policy.go @@ -17,32 +17,90 @@ limitations under the License. package machineset import ( + "math" + "sort" + + "github.com/pkg/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) -type deletePriority int +type deletePriority float64 const ( - mustDelete deletePriority = 100 - betterDelete deletePriority = 50 - couldDelete deletePriority = 20 - // mustNotDelete deletePriority = 0 + + // DeleteNodeAnnotation marks nodes that will be given priority for deletion + // when a machineset scales down. This annotation is given top priority on all delete policies. + DeleteNodeAnnotation = "cluster.k8s.io/delete-machine" + + mustDelete deletePriority = 100.0 + betterDelete deletePriority = 50.0 + couldDelete deletePriority = 20.0 + mustNotDelete deletePriority = 0.0 + + secondsPerTenDays float64 = 864000 ) type deletePriorityFunc func(machine *v1alpha1.Machine) deletePriority -func simpleDeletePriority(machine *v1alpha1.Machine) deletePriority { +// maps the creation timestamp onto the 0-100 priority range +func oldestDeletePriority(machine *v1alpha1.Machine) deletePriority { + if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { + return mustDelete + } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return mustDelete + } + if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { + return mustDelete + } + if machine.ObjectMeta.CreationTimestamp.Time.IsZero() { + return mustNotDelete + } + d := metav1.Now().Sub(machine.ObjectMeta.CreationTimestamp.Time) + if d.Seconds() < 0 { + return mustNotDelete + } + return deletePriority(float64(mustDelete) * (1.0 - math.Exp(-d.Seconds()/secondsPerTenDays))) +} + +func newestDeletePriority(machine *v1alpha1.Machine) deletePriority { + if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { + return mustDelete + } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return mustDelete + } + if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { + return mustDelete + } + return mustDelete - oldestDeletePriority(machine) +} + +func randomDeletePolicy(machine *v1alpha1.Machine) deletePriority { if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { return mustDelete } + if machine.ObjectMeta.Annotations != nil && machine.ObjectMeta.Annotations[DeleteNodeAnnotation] != "" { + return betterDelete + } if machine.Status.ErrorReason != nil || machine.Status.ErrorMessage != nil { return betterDelete } return couldDelete } -// TODO: Define machines deletion policies. -// see: https://github.com/kubernetes/kube-deploy/issues/625 +type sortableMachines struct { + machines []*v1alpha1.Machine + priority deletePriorityFunc +} + +func (m sortableMachines) Len() int { return len(m.machines) } +func (m sortableMachines) Swap(i, j int) { m.machines[i], m.machines[j] = m.machines[j], m.machines[i] } +func (m sortableMachines) Less(i, j int) bool { + return m.priority(m.machines[j]) < m.priority(m.machines[i]) // high to low +} + func getMachinesToDeletePrioritized(filteredMachines []*v1alpha1.Machine, diff int, fun deletePriorityFunc) []*v1alpha1.Machine { if diff >= len(filteredMachines) { return filteredMachines @@ -50,24 +108,27 @@ func getMachinesToDeletePrioritized(filteredMachines []*v1alpha1.Machine, diff i return []*v1alpha1.Machine{} } - machines := make(map[deletePriority][]*v1alpha1.Machine) - - for _, machine := range filteredMachines { - priority := fun(machine) - machines[priority] = append(machines[priority], machine) + sortable := sortableMachines{ + machines: filteredMachines, + priority: fun, } + sort.Sort(sortable) - result := []*v1alpha1.Machine{} - for _, priority := range []deletePriority{ - mustDelete, - betterDelete, - couldDelete, - } { - result = append(result, machines[priority]...) - if len(result) >= diff { - break - } - } + return sortable.machines[:diff] +} - return result[:diff] +func getDeletePriorityFunc(ms *v1alpha1.MachineSet) (deletePriorityFunc, error) { + // Map the Spec.DeletePolicy value to the appropriate delete priority function + switch msdp := v1alpha1.MachineSetDeletePolicy(ms.Spec.DeletePolicy); msdp { + case v1alpha1.RandomMachineSetDeletePolicy: + return randomDeletePolicy, nil + case v1alpha1.NewestMachineSetDeletePolicy: + return newestDeletePriority, nil + case v1alpha1.OldestMachineSetDeletePolicy: + return oldestDeletePriority, nil + case "": + return randomDeletePolicy, nil + default: + return nil, errors.Errorf("Unsupported delete policy %s. Must be one of 'Random', 'Newest', or 'Oldest'", msdp) + } } diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go index 7776a7a8..c421da74 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/controller/machineset/machine.go @@ -60,14 +60,17 @@ func hasMatchingLabels(machineSet *v1alpha1.MachineSet, machine *v1alpha1.Machin klog.Warningf("unable to convert selector: %v", err) return false } + // If a deployment with a nil or empty selector creeps in, it should match nothing, not everything. if selector.Empty() { klog.V(2).Infof("%v machineset has empty selector", machineSet.Name) return false } + if !selector.Matches(labels.Set(machine.Labels)) { klog.V(4).Infof("%v machine has mismatch labels", machine.Name) return false } + return true } diff --git a/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go b/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go index fcd50f9f..b78877b3 100644 --- a/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go +++ b/vendor/sigs.k8s.io/cluster-api/pkg/errors/machines.go @@ -53,6 +53,13 @@ func CreateMachine(msg string, args ...interface{}) *MachineError { } } +func UpdateMachine(msg string, args ...interface{}) *MachineError { + return &MachineError{ + Reason: commonerrors.UpdateMachineError, + Message: fmt.Sprintf(msg, args...), + } +} + func DeleteMachine(msg string, args ...interface{}) *MachineError { return &MachineError{ Reason: commonerrors.DeleteMachineError, diff --git a/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh b/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh index 15c665eb..5d664c33 100755 --- a/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh +++ b/vendor/sigs.k8s.io/cluster-api/scripts/ci-integration.sh @@ -25,6 +25,7 @@ CRD_YAML="crd.yaml" BOOTSTRAP_CLUSTER_NAME="clusterapi-bootstrap" CONTROLLER_REPO="controller-ci" # use arbitrary repo name since we don't need to publish it EXAMPLE_PROVIDER_REPO="example-provider-ci" +INTEGRATION_TEST_DIR="./test/integration" install_kustomize() { go get sigs.k8s.io/kustomize @@ -67,12 +68,33 @@ delete_bootstrap() { kind delete cluster --name "${BOOTSTRAP_CLUSTER_NAME}" } -verify_cluster_api() { - echo "not implemented" - #TODO: verify cluster-api CRD on bootstrap cluster +wait_pod_running() { + retry=30 + INTERVAL=6 + until kubectl get pods "$1" -n "$2" --no-headers | awk -F" " '{s+=($3!="Running")} END {exit s}' + do + sleep ${INTERVAL}; + retry=$((retry - 1)) + if [ $retry -lt 0 ]; + then + kubectl describe pod "$1" -n "$2" + kubectl logs "$1" -n "$2" + exit 1 + fi; + kubectl get pods "$1" -n "$2" --no-headers; + done; +} + +ensure_docker_in_docker() { + if [ -z "${PROW_JOB_ID}" ] ; then + # start docker service in setup other than Prow + service docker start + fi + # DinD is configured at Prow } main() { + ensure_docker_in_docker build_containers install_kustomize @@ -81,9 +103,16 @@ main() { install_kubectl create_bootstrap - "${KUBECTL}" create -f "${CRD_YAML}" + "${KUBECTL}" create -f "${CRD_YAML}" + + set +e + wait_pod_running "cluster-api-controller-manager-0" "cluster-api-system" + wait_pod_running "provider-controller-manager-0" "provider-system" + set -e - verify_cluster_api + if [ -d "${INTEGRATION_TEST_DIR}" ] ; then + go test -v "${INTEGRATION_TEST_DIR}"/... + fi delete_bootstrap diff --git a/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh b/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh index 4dc2c389..7b0f2917 100755 --- a/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh +++ b/vendor/sigs.k8s.io/cluster-api/scripts/fetch_ext_bins.sh @@ -31,7 +31,7 @@ k8s_version=1.11.0 goarch=amd64 goos="unknown" -if [[ "$OSTYPE" == "linux-gnu" ]]; then +if [[ "$OSTYPE" == "linux"* ]]; then goos="linux" elif [[ "$OSTYPE" == "darwin"* ]]; then goos="darwin" diff --git a/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel b/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel new file mode 100644 index 00000000..8cc7fbe9 --- /dev/null +++ b/vendor/sigs.k8s.io/cluster-api/test/integration/cluster/BUILD.bazel @@ -0,0 +1,19 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_test") + +go_test( + name = "go_default_test", + srcs = ["cluster_test.go"], + deps = [ + "//pkg/apis/cluster/v1alpha1:go_default_library", + "//pkg/client/clientset_generated/clientset:go_default_library", + "//pkg/client/clientset_generated/clientset/typed/cluster/v1alpha1:go_default_library", + "//vendor/github.com/onsi/ginkgo:go_default_library", + "//vendor/github.com/onsi/gomega:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//vendor/k8s.io/client-go/informers:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/clientcmd:go_default_library", + ], +)