From 3980ab78ea37a3e32a1aab6f440937c5b59401e5 Mon Sep 17 00:00:00 2001 From: Jason DeTiberus Date: Thu, 9 Jul 2020 11:13:15 -0400 Subject: [PATCH] Update vendor and pull in necessary new paths for client-go --- cluster-autoscaler/go.mod | 60 +- cluster-autoscaler/go.sum | 13 +- .../containernetworking/cni/libcni/api.go | 236 +- .../containernetworking/cni/libcni/conf.go | 4 +- .../cni/pkg/invoke/args.go | 6 +- .../cni/pkg/invoke/raw_exec.go | 52 +- .../cni/pkg/types/020/types.go | 14 - .../containernetworking/cni/pkg/types/args.go | 2 +- .../cni/pkg/types/current/types.go | 17 - .../cni/pkg/types/types.go | 28 +- .../cni/pkg/utils/utils.go | 84 + .../vendor/github.com/go-logr/logr/README.md | 159 +- .../vendor/github.com/go-logr/logr/go.mod | 3 + .../vendor/github.com/go-logr/logr/logr.go | 147 +- .../k8s.io/api/admission/v1/generated.pb.go | 165 +- .../k8s.io/api/admission/v1/generated.proto | 7 + .../vendor/k8s.io/api/admission/v1/types.go | 7 + .../v1/types_swagger_doc_generated.go | 1 + .../api/admission/v1/zz_generated.deepcopy.go | 5 + .../api/admission/v1beta1/generated.pb.go | 165 +- .../api/admission/v1beta1/generated.proto | 7 + .../k8s.io/api/admission/v1beta1/types.go | 7 + .../v1beta1/types_swagger_doc_generated.go | 1 + .../v1beta1/zz_generated.deepcopy.go | 5 + .../api/core/v1/annotation_key_constants.go | 11 +- .../vendor/k8s.io/api/core/v1/generated.pb.go | 2115 ++++++++++------- .../vendor/k8s.io/api/core/v1/generated.proto | 55 +- .../vendor/k8s.io/api/core/v1/types.go | 66 +- .../core/v1/types_swagger_doc_generated.go | 16 +- .../api/core/v1/zz_generated.deepcopy.go | 31 + .../vendor/k8s.io/api/events/v1/BUILD | 37 + .../vendor/k8s.io/api/events/v1/doc.go | 23 + .../k8s.io/api/events/v1/generated.pb.go | 1406 +++++++++++ .../k8s.io/api/events/v1/generated.proto | 125 + .../vendor/k8s.io/api/events/v1/register.go | 53 + .../vendor/k8s.io/api/events/v1/types.go | 119 + .../events/v1/types_swagger_doc_generated.go | 72 + .../api/events/v1/zz_generated.deepcopy.go | 117 + .../k8s.io/api/events/v1beta1/generated.proto | 43 +- .../vendor/k8s.io/api/events/v1beta1/types.go | 43 +- .../v1beta1/types_swagger_doc_generated.go | 34 +- .../k8s.io/api/policy/v1beta1/generated.proto | 2 +- .../vendor/k8s.io/api/policy/v1beta1/types.go | 2 +- .../v1beta1/types_swagger_doc_generated.go | 2 +- .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 2 - .../k8s.io/apimachinery/pkg/api/meta/OWNERS | 2 - .../apimachinery/pkg/api/resource/OWNERS | 2 - .../apimachinery/pkg/apis/meta/v1/OWNERS | 1 - .../admission/plugin/webhook/mutating/BUILD | 1 + .../plugin/webhook/mutating/dispatcher.go | 4 + .../plugin/webhook/request/admissionreview.go | 3 + .../admission/plugin/webhook/validating/BUILD | 1 + .../plugin/webhook/validating/dispatcher.go | 4 + .../pkg/endpoints/filters/warning.go | 78 +- .../apiserver/pkg/registry/generic/OWNERS | 1 - .../k8s.io/apiserver/pkg/registry/rest/OWNERS | 2 - .../k8s.io/apiserver/pkg/server/signal.go | 16 +- .../client-go/discovery/cached/memory/BUILD | 47 + .../discovery/cached/memory/memcache.go | 243 ++ .../vendor/k8s.io/client-go/informers/BUILD | 1 + .../k8s.io/client-go/informers/events/BUILD | 2 + .../client-go/informers/events/interface.go | 8 + .../client-go/informers/events/v1/BUILD | 36 + .../client-go/informers/events/v1/event.go | 90 + .../informers/events/v1/interface.go | 45 + .../k8s.io/client-go/informers/generic.go | 5 + .../vendor/k8s.io/client-go/kubernetes/BUILD | 2 + .../k8s.io/client-go/kubernetes/clientset.go | 14 + .../k8s.io/client-go/kubernetes/fake/BUILD | 3 + .../kubernetes/fake/clientset_generated.go | 7 + .../client-go/kubernetes/fake/register.go | 2 + .../k8s.io/client-go/kubernetes/scheme/BUILD | 1 + .../client-go/kubernetes/scheme/register.go | 2 + .../kubernetes/typed/events/v1/BUILD | 39 + .../kubernetes/typed/events/v1/doc.go | 20 + .../kubernetes/typed/events/v1/event.go | 178 ++ .../typed/events/v1/events_client.go | 89 + .../kubernetes/typed/events/v1/fake/BUILD | 38 + .../kubernetes/typed/events/v1/fake/doc.go | 20 + .../typed/events/v1/fake/fake_event.go | 130 + .../events/v1/fake/fake_events_client.go | 40 + .../typed/events/v1/generated_expansion.go | 21 + .../k8s.io/client-go/listers/events/v1/BUILD | 32 + .../client-go/listers/events/v1/event.go | 99 + .../listers/events/v1/expansion_generated.go | 27 + .../vendor/k8s.io/client-go/restmapper/BUILD | 57 + .../restmapper/category_expansion.go | 119 + .../k8s.io/client-go/restmapper/discovery.go | 338 +++ .../k8s.io/client-go/restmapper/shortcut.go | 172 ++ .../vendor/k8s.io/client-go/scale/fake/BUILD | 31 + .../k8s.io/client-go/scale/fake/client.go | 81 + .../k8s.io/client-go/tools/cache/OWNERS | 2 - .../client-go/tools/clientcmd/config.go | 27 +- .../k8s.io/client-go/tools/events/BUILD | 7 +- .../tools/events/event_broadcaster.go | 99 +- .../client-go/tools/events/event_recorder.go | 12 +- .../client-go/tools/events/interfaces.go | 8 +- .../client-go/tools/leaderelection/OWNERS | 1 - .../k8s.io/client-go/tools/metrics/OWNERS | 1 - .../k8s.io/client-go/tools/record/OWNERS | 1 - .../vendor/k8s.io/cloud-provider/OWNERS | 2 - .../vendor/k8s.io/cloud-provider/go.mod | 2 +- .../vendor/k8s.io/cloud-provider/go.sum | 6 +- .../k8s.io/component-base/config/types.go | 8 + .../config/v1alpha1/conversion.go | 8 + .../config/v1alpha1/defaults.go | 15 + .../component-base/config/v1alpha1/types.go | 8 + .../v1alpha1/zz_generated.conversion.go | 20 + .../config/v1alpha1/zz_generated.deepcopy.go | 16 + .../config/zz_generated.deepcopy.go | 16 + .../k8s.io/component-base/logs/json/json.go | 63 +- .../vendor/k8s.io/csi-translation-lib/go.mod | 2 +- .../vendor/k8s.io/csi-translation-lib/go.sum | 6 +- .../vendor/k8s.io/klog/v2/go.mod | 2 +- .../vendor/k8s.io/klog/v2/go.sum | 4 +- .../vendor/k8s.io/klog/v2/klog.go | 26 +- .../k8s.io/kubelet/config/v1beta1/BUILD | 1 + .../k8s.io/kubelet/config/v1beta1/types.go | 11 + .../config/v1beta1/zz_generated.deepcopy.go | 6 + .../pkg/apis/deviceplugin/v1beta1/api.pb.go | 1594 ++++++++++--- .../pkg/apis/deviceplugin/v1beta1/api.proto | 75 +- .../cmd/kube-proxy/app/server_windows.go | 2 +- .../k8s.io/kubernetes/cmd/kubelet/app/BUILD | 1 + .../cmd/kubelet/app/options/options.go | 1 + .../kubernetes/cmd/kubelet/app/server.go | 29 +- .../k8s.io/kubernetes/pkg/api/service/OWNERS | 1 - .../k8s.io/kubernetes/pkg/apis/apps/OWNERS | 1 - .../kubernetes/pkg/apis/autoscaling/OWNERS | 1 - .../k8s.io/kubernetes/pkg/apis/batch/OWNERS | 1 - .../k8s.io/kubernetes/pkg/apis/core/OWNERS | 2 - .../pkg/apis/core/annotation_key_constants.go | 5 +- .../kubernetes/pkg/apis/core/install/OWNERS | 1 - .../kubernetes/pkg/apis/core/pods/helpers.go | 14 +- .../k8s.io/kubernetes/pkg/apis/core/types.go | 57 +- .../k8s.io/kubernetes/pkg/apis/core/v1/OWNERS | 2 - .../apis/core/v1/zz_generated.conversion.go | 36 + .../kubernetes/pkg/apis/core/validation/BUILD | 6 + .../pkg/apis/core/validation/OWNERS | 2 - .../pkg/apis/core/validation/events.go | 89 +- .../pkg/apis/core/validation/validation.go | 117 +- .../pkg/apis/core/zz_generated.deepcopy.go | 31 + .../kubernetes/pkg/apis/extensions/OWNERS | 1 - .../kubernetes/pkg/apis/policy/types.go | 2 +- .../scheduling/scheduler_assume_cache.go | 10 +- .../volume/scheduling/scheduler_binder.go | 75 +- .../kubernetes/pkg/credentialprovider/OWNERS | 2 - .../pkg/credentialprovider/aws/OWNERS | 1 - .../pkg/credentialprovider/gcp/OWNERS | 2 - .../kubernetes/pkg/features/kube_features.go | 2 +- .../kubernetes/pkg/kubelet/apis/config/BUILD | 1 + .../pkg/kubelet/apis/config/types.go | 6 + .../pkg/kubelet/apis/config/v1beta1/BUILD | 1 + .../kubelet/apis/config/v1beta1/defaults.go | 6 + .../config/v1beta1/zz_generated.conversion.go | 13 + .../pkg/kubelet/apis/config/validation/BUILD | 1 + .../apis/config/validation/validation.go | 8 + .../apis/config/zz_generated.deepcopy.go | 1 + .../certificate/bootstrap/bootstrap.go | 16 +- .../cm/devicemanager/device_plugin_stub.go | 66 +- .../pkg/kubelet/cm/devicemanager/endpoint.go | 17 + .../pkg/kubelet/cm/devicemanager/manager.go | 137 +- .../pkg/kubelet/dockershim/helpers.go | 4 +- .../pkg/kubelet/dockershim/helpers_linux.go | 8 +- .../k8s.io/kubernetes/pkg/kubelet/kubelet.go | 6 +- .../kubernetes/pkg/kubelet/kubelet_pods.go | 13 +- .../pkg/kubelet/kuberuntime/helpers.go | 62 +- .../kuberuntime/kuberuntime_sandbox.go | 4 +- .../kubelet/kuberuntime/security_context.go | 4 +- .../kubernetes/pkg/kubelet/server/server.go | 48 +- .../kubernetes/pkg/kubelet/types/types.go | 11 + .../k8s.io/kubernetes/pkg/proxy/endpoints.go | 26 +- .../kubernetes/pkg/proxy/iptables/proxier.go | 4 +- .../kubernetes/pkg/proxy/ipvs/proxier.go | 102 +- .../k8s.io/kubernetes/pkg/proxy/service.go | 22 +- .../kubernetes/pkg/proxy/winkernel/BUILD | 8 +- .../kubernetes/pkg/proxy/winkernel/proxier.go | 764 +++--- .../framework/plugins/defaultpreemption/BUILD | 5 +- .../defaultpreemption/default_preemption.go | 10 +- .../plugins/podtopologyspread/filtering.go | 2 +- .../plugins/podtopologyspread/plugin.go | 2 + .../pkg/scheduler/metrics/metrics.go | 5 +- .../kubernetes/pkg/scheduler/profile/BUILD | 2 +- .../kubernetes/pkg/util/iptables/OWNERS | 4 +- .../kubernetes/pkg/volume/csi/csi_block.go | 32 +- .../kubernetes/pkg/volume/csi/csi_client.go | 67 +- .../kubernetes/pkg/volume/csi/expander.go | 28 +- .../kubernetes/pkg/volume/iscsi/iscsi_util.go | 16 + .../kubernetes/pkg/volume/local/local.go | 9 +- .../k8s.io/kubernetes/pkg/volume/plugins.go | 3 + .../kubernetes/pkg/volume/rbd/attacher.go | 2 +- .../k8s.io/kubernetes/pkg/volume/rbd/rbd.go | 35 +- .../kubernetes/pkg/volume/rbd/rbd_util.go | 8 +- .../operationexecutor/operation_generator.go | 88 +- .../k8s.io/kubernetes/pkg/volume/volume.go | 9 +- .../azure/azure_instances.go | 25 +- .../azure/azure_routes.go | 8 +- cluster-autoscaler/vendor/modules.txt | 101 +- 197 files changed, 9421 insertions(+), 2665 deletions(-) create mode 100644 cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/utils/utils.go create mode 100644 cluster-autoscaler/vendor/github.com/go-logr/logr/go.mod create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/doc.go create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.pb.go create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.proto create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/register.go create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/types.go create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go create mode 100644 cluster-autoscaler/vendor/k8s.io/api/events/v1/zz_generated.deepcopy.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/event.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/interface.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/doc.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/events_client.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/doc.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_events_client.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/generated_expansion.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/event.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/expansion_generated.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/restmapper/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/restmapper/category_expansion.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/restmapper/discovery.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/restmapper/shortcut.go create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/BUILD create mode 100644 cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/client.go diff --git a/cluster-autoscaler/go.mod b/cluster-autoscaler/go.mod index 0167c232926e..9d4e4d645005 100644 --- a/cluster-autoscaler/go.mod +++ b/cluster-autoscaler/go.mod @@ -26,6 +26,7 @@ require ( github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.4.0 golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975 + golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 google.golang.org/api v0.15.1 gopkg.in/gcfg.v1 v1.2.0 @@ -36,7 +37,7 @@ require ( k8s.io/client-go v0.0.0 k8s.io/cloud-provider v0.0.0 k8s.io/component-base v0.0.0 - k8s.io/klog/v2 v2.1.0 + k8s.io/klog/v2 v2.2.0 k8s.io/kubernetes v0.0.0 k8s.io/legacy-cloud-providers v0.0.0 k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 @@ -108,7 +109,7 @@ replace ( github.com/containerd/go-runc => github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3 github.com/containerd/ttrpc => github.com/containerd/ttrpc v1.0.0 github.com/containerd/typeurl => github.com/containerd/typeurl v1.0.0 - github.com/containernetworking/cni => github.com/containernetworking/cni v0.7.1 + github.com/containernetworking/cni => github.com/containernetworking/cni v0.8.0 github.com/coredns/corefile-migration => github.com/coredns/corefile-migration v1.0.8 github.com/coreos/bbolt => github.com/coreos/bbolt v1.3.2 github.com/coreos/etcd => github.com/coreos/etcd v3.3.10+incompatible @@ -117,7 +118,6 @@ replace ( github.com/coreos/go-systemd => github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e github.com/coreos/go-systemd/v22 => github.com/coreos/go-systemd/v22 v22.1.0 github.com/coreos/pkg => github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f - github.com/cpuguy83/go-md2man => github.com/cpuguy83/go-md2man v1.0.10 github.com/cpuguy83/go-md2man/v2 => github.com/cpuguy83/go-md2man/v2 v2.0.0 github.com/creack/pty => github.com/creack/pty v1.1.7 github.com/cyphar/filepath-securejoin => github.com/cyphar/filepath-securejoin v0.2.2 @@ -151,7 +151,7 @@ replace ( github.com/go-ini/ini => github.com/go-ini/ini v1.9.0 github.com/go-kit/kit => github.com/go-kit/kit v0.9.0 github.com/go-logfmt/logfmt => github.com/go-logfmt/logfmt v0.4.0 - github.com/go-logr/logr => github.com/go-logr/logr v0.1.0 + github.com/go-logr/logr => github.com/go-logr/logr v0.2.0 github.com/go-openapi/analysis => github.com/go-openapi/analysis v0.19.5 github.com/go-openapi/errors => github.com/go-openapi/errors v0.19.2 github.com/go-openapi/jsonpointer => github.com/go-openapi/jsonpointer v0.19.3 @@ -360,34 +360,34 @@ replace ( gotest.tools => gotest.tools v2.2.0+incompatible gotest.tools/v3 => gotest.tools/v3 v3.0.2 honnef.co/go/tools => honnef.co/go/tools v0.0.1-2019.2.3 - k8s.io/api => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/api - k8s.io/apiextensions-apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apiextensions-apiserver - k8s.io/apimachinery => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apimachinery - k8s.io/apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apiserver - k8s.io/cli-runtime => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cli-runtime - k8s.io/client-go => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/client-go - k8s.io/cloud-provider => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cloud-provider - k8s.io/cluster-bootstrap => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cluster-bootstrap - k8s.io/code-generator => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/code-generator - k8s.io/component-base => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/component-base - k8s.io/controller-manager => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/controller-manager - k8s.io/cri-api => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cri-api - k8s.io/csi-translation-lib => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/csi-translation-lib + k8s.io/api => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/api + k8s.io/apiextensions-apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apiextensions-apiserver + k8s.io/apimachinery => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apimachinery + k8s.io/apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apiserver + k8s.io/cli-runtime => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cli-runtime + k8s.io/client-go => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/client-go + k8s.io/cloud-provider => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cloud-provider + k8s.io/cluster-bootstrap => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cluster-bootstrap + k8s.io/code-generator => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/code-generator + k8s.io/component-base => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/component-base + k8s.io/controller-manager => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/controller-manager + k8s.io/cri-api => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cri-api + k8s.io/csi-translation-lib => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/csi-translation-lib k8s.io/gengo => k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14 k8s.io/heapster => k8s.io/heapster v1.2.0-beta.1 - k8s.io/klog/v2 => k8s.io/klog/v2 v2.1.0 - k8s.io/kube-aggregator => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-aggregator - k8s.io/kube-controller-manager => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-controller-manager + k8s.io/klog/v2 => k8s.io/klog/v2 v2.2.0 + k8s.io/kube-aggregator => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-aggregator + k8s.io/kube-controller-manager => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-controller-manager k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 - k8s.io/kube-proxy => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-proxy - k8s.io/kube-scheduler => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-scheduler - k8s.io/kubectl => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubectl - k8s.io/kubelet => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubelet - k8s.io/legacy-cloud-providers => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/legacy-cloud-providers - k8s.io/metrics => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/metrics - k8s.io/sample-apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-apiserver - k8s.io/sample-cli-plugin => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-cli-plugin - k8s.io/sample-controller => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-controller + k8s.io/kube-proxy => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-proxy + k8s.io/kube-scheduler => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-scheduler + k8s.io/kubectl => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubectl + k8s.io/kubelet => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubelet + k8s.io/legacy-cloud-providers => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/legacy-cloud-providers + k8s.io/metrics => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/metrics + k8s.io/sample-apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-apiserver + k8s.io/sample-cli-plugin => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-cli-plugin + k8s.io/sample-controller => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-controller k8s.io/system-validators => k8s.io/system-validators v1.1.2 k8s.io/utils => k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 modernc.org/cc => modernc.org/cc v1.0.0 @@ -407,4 +407,4 @@ replace github.com/digitalocean/godo => github.com/digitalocean/godo v1.27.0 replace github.com/rancher/go-rancher => github.com/rancher/go-rancher v0.1.0 -replace k8s.io/kubernetes => /tmp/ca-update-vendor.qFYj/kubernetes +replace k8s.io/kubernetes => /tmp/ca-update-vendor.10L6/kubernetes diff --git a/cluster-autoscaler/go.sum b/cluster-autoscaler/go.sum index d82e59aa81a4..b395a11a947d 100644 --- a/cluster-autoscaler/go.sum +++ b/cluster-autoscaler/go.sum @@ -100,8 +100,8 @@ github.com/containerd/ttrpc v1.0.0 h1:NY8Zk2i7TpkLxrkOASo+KTFq9iNCEmMH2/ZG9OuOw6 github.com/containerd/ttrpc v1.0.0/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= github.com/containerd/typeurl v1.0.0 h1:7LMH7LfEmpWeCkGcIputvd4P0Rnd0LrIv1Jk2s5oobs= github.com/containerd/typeurl v1.0.0/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containernetworking/cni v0.7.1 h1:fE3r16wpSEyaqY4Z4oFrLMmIGfBYIKpPrHK31EJ9FzE= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0 h1:BT9lpgGoH4jw3lFC7Odz2prU5ruiYKcgAjMCbgybcKI= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/coredns/corefile-migration v1.0.8/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -114,7 +114,6 @@ github.com/coreos/go-systemd/v22 v22.1.0 h1:kq/SbG2BCKLkDKkjQf5OWwKWUKj1lgs3lFI4 github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/cyphar/filepath-securejoin v0.2.2 h1:jCwT2GTP+PY5nBz3c/YL5PAIbusElVrPujOBSCj8xRg= @@ -166,8 +165,8 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2 github.com/go-ini/ini v1.9.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= @@ -503,8 +502,8 @@ gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= -k8s.io/klog/v2 v2.1.0 h1:X3+Mru/L3jy4BI4vcAYkHvL6PyU+QBsuhEqwlI4mgkA= -k8s.io/klog/v2 v2.1.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 h1:5NC2ITmvg8RoxoH0wgmL4zn4VZqXGsKbxrikjaQx6s4= k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9/go.mod h1:bfCVj+qXcEaE5SCvzBaqpOySr6tuCcpPKqF6HD8nyCw= k8s.io/system-validators v1.1.2/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/api.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/api.go index 0f14d3427e92..7e52bd838734 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/api.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/api.go @@ -25,6 +25,7 @@ import ( "github.com/containernetworking/cni/pkg/invoke" "github.com/containernetworking/cni/pkg/types" + "github.com/containernetworking/cni/pkg/utils" "github.com/containernetworking/cni/pkg/version" ) @@ -32,6 +33,10 @@ var ( CacheDir = "/var/lib/cni" ) +const ( + CNICacheV1 = "cniCacheV1" +) + // A RuntimeConf holds the arguments to one invocation of a CNI plugin // excepting the network configuration, with the nested exception that // the `runtimeConfig` from the network configuration is included @@ -48,7 +53,7 @@ type RuntimeConf struct { // to the plugin CapabilityArgs map[string]interface{} - // A cache directory in which to library data. Defaults to CacheDir + // DEPRECATED. Will be removed in a future release. CacheDir string } @@ -70,19 +75,22 @@ type CNI interface { CheckNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error DelNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error GetNetworkListCachedResult(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error) + GetNetworkListCachedConfig(net *NetworkConfigList, rt *RuntimeConf) ([]byte, *RuntimeConf, error) AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error) CheckNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error DelNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error GetNetworkCachedResult(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) + GetNetworkCachedConfig(net *NetworkConfig, rt *RuntimeConf) ([]byte, *RuntimeConf, error) ValidateNetworkList(ctx context.Context, net *NetworkConfigList) ([]string, error) ValidateNetwork(ctx context.Context, net *NetworkConfig) ([]string, error) } type CNIConfig struct { - Path []string - exec invoke.Exec + Path []string + exec invoke.Exec + cacheDir string } // CNIConfig implements the CNI interface @@ -92,9 +100,18 @@ var _ CNI = &CNIConfig{} // in the given paths and use the given exec interface to run those plugins, // or if the exec interface is not given, will use a default exec handler. func NewCNIConfig(path []string, exec invoke.Exec) *CNIConfig { + return NewCNIConfigWithCacheDir(path, "", exec) +} + +// NewCNIConfigWithCacheDir returns a new CNIConfig object that will search for plugins +// in the given paths use the given exec interface to run those plugins, +// or if the exec interface is not given, will use a default exec handler. +// The given cache directory will be used for temporary data storage when needed. +func NewCNIConfigWithCacheDir(path []string, cacheDir string, exec invoke.Exec) *CNIConfig { return &CNIConfig{ - Path: path, - exec: exec, + Path: path, + cacheDir: cacheDir, + exec: exec, } } @@ -165,33 +182,122 @@ func (c *CNIConfig) ensureExec() invoke.Exec { return c.exec } -func getResultCacheFilePath(netName string, rt *RuntimeConf) string { - cacheDir := rt.CacheDir - if cacheDir == "" { - cacheDir = CacheDir +type cachedInfo struct { + Kind string `json:"kind"` + ContainerID string `json:"containerId"` + Config []byte `json:"config"` + IfName string `json:"ifName"` + NetworkName string `json:"networkName"` + CniArgs [][2]string `json:"cniArgs,omitempty"` + CapabilityArgs map[string]interface{} `json:"capabilityArgs,omitempty"` + RawResult map[string]interface{} `json:"result,omitempty"` + Result types.Result `json:"-"` +} + +// getCacheDir returns the cache directory in this order: +// 1) global cacheDir from CNIConfig object +// 2) deprecated cacheDir from RuntimeConf object +// 3) fall back to default cache directory +func (c *CNIConfig) getCacheDir(rt *RuntimeConf) string { + if c.cacheDir != "" { + return c.cacheDir + } + if rt.CacheDir != "" { + return rt.CacheDir + } + return CacheDir +} + +func (c *CNIConfig) getCacheFilePath(netName string, rt *RuntimeConf) (string, error) { + if netName == "" || rt.ContainerID == "" || rt.IfName == "" { + return "", fmt.Errorf("cache file path requires network name (%q), container ID (%q), and interface name (%q)", netName, rt.ContainerID, rt.IfName) } - return filepath.Join(cacheDir, "results", fmt.Sprintf("%s-%s-%s", netName, rt.ContainerID, rt.IfName)) + return filepath.Join(c.getCacheDir(rt), "results", fmt.Sprintf("%s-%s-%s", netName, rt.ContainerID, rt.IfName)), nil } -func setCachedResult(result types.Result, netName string, rt *RuntimeConf) error { +func (c *CNIConfig) cacheAdd(result types.Result, config []byte, netName string, rt *RuntimeConf) error { + cached := cachedInfo{ + Kind: CNICacheV1, + ContainerID: rt.ContainerID, + Config: config, + IfName: rt.IfName, + NetworkName: netName, + CniArgs: rt.Args, + CapabilityArgs: rt.CapabilityArgs, + } + + // We need to get type.Result into cachedInfo as JSON map + // Marshal to []byte, then Unmarshal into cached.RawResult data, err := json.Marshal(result) if err != nil { return err } - fname := getResultCacheFilePath(netName, rt) + + err = json.Unmarshal(data, &cached.RawResult) + if err != nil { + return err + } + + newBytes, err := json.Marshal(&cached) + if err != nil { + return err + } + + fname, err := c.getCacheFilePath(netName, rt) + if err != nil { + return err + } if err := os.MkdirAll(filepath.Dir(fname), 0700); err != nil { return err } - return ioutil.WriteFile(fname, data, 0600) + + return ioutil.WriteFile(fname, newBytes, 0600) } -func delCachedResult(netName string, rt *RuntimeConf) error { - fname := getResultCacheFilePath(netName, rt) +func (c *CNIConfig) cacheDel(netName string, rt *RuntimeConf) error { + fname, err := c.getCacheFilePath(netName, rt) + if err != nil { + // Ignore error + return nil + } return os.Remove(fname) } -func getCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, error) { - fname := getResultCacheFilePath(netName, rt) +func (c *CNIConfig) getCachedConfig(netName string, rt *RuntimeConf) ([]byte, *RuntimeConf, error) { + var bytes []byte + + fname, err := c.getCacheFilePath(netName, rt) + if err != nil { + return nil, nil, err + } + bytes, err = ioutil.ReadFile(fname) + if err != nil { + // Ignore read errors; the cached result may not exist on-disk + return nil, nil, nil + } + + unmarshaled := cachedInfo{} + if err := json.Unmarshal(bytes, &unmarshaled); err != nil { + return nil, nil, fmt.Errorf("failed to unmarshal cached network %q config: %v", netName, err) + } + if unmarshaled.Kind != CNICacheV1 { + return nil, nil, fmt.Errorf("read cached network %q config has wrong kind: %v", netName, unmarshaled.Kind) + } + + newRt := *rt + if unmarshaled.CniArgs != nil { + newRt.Args = unmarshaled.CniArgs + } + newRt.CapabilityArgs = unmarshaled.CapabilityArgs + + return unmarshaled.Config, &newRt, nil +} + +func (c *CNIConfig) getLegacyCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, error) { + fname, err := c.getCacheFilePath(netName, rt) + if err != nil { + return nil, err + } data, err := ioutil.ReadFile(fname) if err != nil { // Ignore read errors; the cached result may not exist on-disk @@ -222,16 +328,73 @@ func getCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, return result, err } +func (c *CNIConfig) getCachedResult(netName, cniVersion string, rt *RuntimeConf) (types.Result, error) { + fname, err := c.getCacheFilePath(netName, rt) + if err != nil { + return nil, err + } + fdata, err := ioutil.ReadFile(fname) + if err != nil { + // Ignore read errors; the cached result may not exist on-disk + return nil, nil + } + + cachedInfo := cachedInfo{} + if err := json.Unmarshal(fdata, &cachedInfo); err != nil || cachedInfo.Kind != CNICacheV1 { + return c.getLegacyCachedResult(netName, cniVersion, rt) + } + + newBytes, err := json.Marshal(&cachedInfo.RawResult) + if err != nil { + return nil, fmt.Errorf("failed to marshal cached network %q config: %v", netName, err) + } + + // Read the version of the cached result + decoder := version.ConfigDecoder{} + resultCniVersion, err := decoder.Decode(newBytes) + if err != nil { + return nil, err + } + + // Ensure we can understand the result + result, err := version.NewResult(resultCniVersion, newBytes) + if err != nil { + return nil, err + } + + // Convert to the config version to ensure plugins get prevResult + // in the same version as the config. The cached result version + // should match the config version unless the config was changed + // while the container was running. + result, err = result.GetAsVersion(cniVersion) + if err != nil && resultCniVersion != cniVersion { + return nil, fmt.Errorf("failed to convert cached result version %q to config version %q: %v", resultCniVersion, cniVersion, err) + } + return result, err +} + // GetNetworkListCachedResult returns the cached Result of the previous -// previous AddNetworkList() operation for a network list, or an error. +// AddNetworkList() operation for a network list, or an error. func (c *CNIConfig) GetNetworkListCachedResult(list *NetworkConfigList, rt *RuntimeConf) (types.Result, error) { - return getCachedResult(list.Name, list.CNIVersion, rt) + return c.getCachedResult(list.Name, list.CNIVersion, rt) } // GetNetworkCachedResult returns the cached Result of the previous -// previous AddNetwork() operation for a network, or an error. +// AddNetwork() operation for a network, or an error. func (c *CNIConfig) GetNetworkCachedResult(net *NetworkConfig, rt *RuntimeConf) (types.Result, error) { - return getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) + return c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) +} + +// GetNetworkListCachedConfig copies the input RuntimeConf to output +// RuntimeConf with fields updated with info from the cached Config. +func (c *CNIConfig) GetNetworkListCachedConfig(list *NetworkConfigList, rt *RuntimeConf) ([]byte, *RuntimeConf, error) { + return c.getCachedConfig(list.Name, rt) +} + +// GetNetworkCachedConfig copies the input RuntimeConf to output +// RuntimeConf with fields updated with info from the cached Config. +func (c *CNIConfig) GetNetworkCachedConfig(net *NetworkConfig, rt *RuntimeConf) ([]byte, *RuntimeConf, error) { + return c.getCachedConfig(net.Network.Name, rt) } func (c *CNIConfig) addNetwork(ctx context.Context, name, cniVersion string, net *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (types.Result, error) { @@ -240,6 +403,15 @@ func (c *CNIConfig) addNetwork(ctx context.Context, name, cniVersion string, net if err != nil { return nil, err } + if err := utils.ValidateContainerID(rt.ContainerID); err != nil { + return nil, err + } + if err := utils.ValidateNetworkName(name); err != nil { + return nil, err + } + if err := utils.ValidateInterfaceName(rt.IfName); err != nil { + return nil, err + } newConf, err := buildOneConfig(name, cniVersion, net, prevResult, rt) if err != nil { @@ -260,7 +432,7 @@ func (c *CNIConfig) AddNetworkList(ctx context.Context, list *NetworkConfigList, } } - if err = setCachedResult(result, list.Name, rt); err != nil { + if err = c.cacheAdd(result, list.Bytes, list.Name, rt); err != nil { return nil, fmt.Errorf("failed to set network %q cached result: %v", list.Name, err) } @@ -295,7 +467,7 @@ func (c *CNIConfig) CheckNetworkList(ctx context.Context, list *NetworkConfigLis return nil } - cachedResult, err := getCachedResult(list.Name, list.CNIVersion, rt) + cachedResult, err := c.getCachedResult(list.Name, list.CNIVersion, rt) if err != nil { return fmt.Errorf("failed to get network %q cached result: %v", list.Name, err) } @@ -332,7 +504,7 @@ func (c *CNIConfig) DelNetworkList(ctx context.Context, list *NetworkConfigList, if gtet, err := version.GreaterThanOrEqualTo(list.CNIVersion, "0.4.0"); err != nil { return err } else if gtet { - cachedResult, err = getCachedResult(list.Name, list.CNIVersion, rt) + cachedResult, err = c.getCachedResult(list.Name, list.CNIVersion, rt) if err != nil { return fmt.Errorf("failed to get network %q cached result: %v", list.Name, err) } @@ -344,7 +516,7 @@ func (c *CNIConfig) DelNetworkList(ctx context.Context, list *NetworkConfigList, return err } } - _ = delCachedResult(list.Name, rt) + _ = c.cacheDel(list.Name, rt) return nil } @@ -356,7 +528,7 @@ func (c *CNIConfig) AddNetwork(ctx context.Context, net *NetworkConfig, rt *Runt return nil, err } - if err = setCachedResult(result, net.Network.Name, rt); err != nil { + if err = c.cacheAdd(result, net.Bytes, net.Network.Name, rt); err != nil { return nil, fmt.Errorf("failed to set network %q cached result: %v", net.Network.Name, err) } @@ -372,7 +544,7 @@ func (c *CNIConfig) CheckNetwork(ctx context.Context, net *NetworkConfig, rt *Ru return fmt.Errorf("configuration version %q does not support the CHECK command", net.Network.CNIVersion) } - cachedResult, err := getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) + cachedResult, err := c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) if err != nil { return fmt.Errorf("failed to get network %q cached result: %v", net.Network.Name, err) } @@ -387,7 +559,7 @@ func (c *CNIConfig) DelNetwork(ctx context.Context, net *NetworkConfig, rt *Runt if gtet, err := version.GreaterThanOrEqualTo(net.Network.CNIVersion, "0.4.0"); err != nil { return err } else if gtet { - cachedResult, err = getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) + cachedResult, err = c.getCachedResult(net.Network.Name, net.Network.CNIVersion, rt) if err != nil { return fmt.Errorf("failed to get network %q cached result: %v", net.Network.Name, err) } @@ -396,7 +568,7 @@ func (c *CNIConfig) DelNetwork(ctx context.Context, net *NetworkConfig, rt *Runt if err := c.delNetwork(ctx, net.Network.Name, net.Network.CNIVersion, net, cachedResult, rt); err != nil { return err } - _ = delCachedResult(net.Network.Name, rt) + _ = c.cacheDel(net.Network.Name, rt) return nil } @@ -455,10 +627,14 @@ func (c *CNIConfig) ValidateNetwork(ctx context.Context, net *NetworkConfig) ([] // validatePlugin checks that an individual plugin's configuration is sane func (c *CNIConfig) validatePlugin(ctx context.Context, pluginName, expectedVersion string) error { - pluginPath, err := invoke.FindInPath(pluginName, c.Path) + c.ensureExec() + pluginPath, err := c.exec.FindInPath(pluginName, c.Path) if err != nil { return err } + if expectedVersion == "" { + expectedVersion = "0.1.0" + } vi, err := invoke.GetVersionInfo(ctx, pluginPath, c.exec) if err != nil { diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/conf.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/conf.go index ea56c509d017..d8920cf8cd56 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/conf.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/libcni/conf.go @@ -114,11 +114,11 @@ func ConfListFromBytes(bytes []byte) (*NetworkConfigList, error) { for i, conf := range plugins { newBytes, err := json.Marshal(conf) if err != nil { - return nil, fmt.Errorf("Failed to marshal plugin config %d: %v", i, err) + return nil, fmt.Errorf("failed to marshal plugin config %d: %v", i, err) } netConf, err := ConfFromBytes(newBytes) if err != nil { - return nil, fmt.Errorf("Failed to parse plugin config %d: %v", i, err) + return nil, fmt.Errorf("failed to parse plugin config %d: %v", i, err) } list.Plugins = append(list.Plugins, netConf) } diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/args.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/args.go index 913528c1d597..3cdb4bc8dadf 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/args.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/args.go @@ -32,7 +32,7 @@ type inherited struct{} var inheritArgsFromEnv inherited -func (_ *inherited) AsEnv() []string { +func (*inherited) AsEnv() []string { return nil } @@ -60,8 +60,8 @@ func (args *Args) AsEnv() []string { pluginArgsStr = stringify(args.PluginArgs) } - // Duplicated values which come first will be overrided, so we must put the - // custom values in the end to avoid being overrided by the process environments. + // Duplicated values which come first will be overridden, so we must put the + // custom values in the end to avoid being overridden by the process environments. env = append(env, "CNI_COMMAND="+args.Command, "CNI_CONTAINERID="+args.ContainerID, diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go index ad8498ba27df..5ab5cc885762 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/invoke/raw_exec.go @@ -21,6 +21,8 @@ import ( "fmt" "io" "os/exec" + "strings" + "time" "github.com/containernetworking/cni/pkg/types" ) @@ -31,30 +33,54 @@ type RawExec struct { func (e *RawExec) ExecPlugin(ctx context.Context, pluginPath string, stdinData []byte, environ []string) ([]byte, error) { stdout := &bytes.Buffer{} + stderr := &bytes.Buffer{} c := exec.CommandContext(ctx, pluginPath) c.Env = environ c.Stdin = bytes.NewBuffer(stdinData) c.Stdout = stdout - c.Stderr = e.Stderr - if err := c.Run(); err != nil { - return nil, pluginErr(err, stdout.Bytes()) + c.Stderr = stderr + + // Retry the command on "text file busy" errors + for i := 0; i <= 5; i++ { + err := c.Run() + + // Command succeeded + if err == nil { + break + } + + // If the plugin is currently about to be written, then we wait a + // second and try it again + if strings.Contains(err.Error(), "text file busy") { + time.Sleep(time.Second) + continue + } + + // All other errors except than the busy text file + return nil, e.pluginErr(err, stdout.Bytes(), stderr.Bytes()) } + // Copy stderr to caller's buffer in case plugin printed to both + // stdout and stderr for some reason. Ignore failures as stderr is + // only informational. + if e.Stderr != nil && stderr.Len() > 0 { + _, _ = stderr.WriteTo(e.Stderr) + } return stdout.Bytes(), nil } -func pluginErr(err error, output []byte) error { - if _, ok := err.(*exec.ExitError); ok { - emsg := types.Error{} - if len(output) == 0 { - emsg.Msg = "netplugin failed with no error message" - } else if perr := json.Unmarshal(output, &emsg); perr != nil { - emsg.Msg = fmt.Sprintf("netplugin failed but error parsing its diagnostic message %q: %v", string(output), perr) +func (e *RawExec) pluginErr(err error, stdout, stderr []byte) error { + emsg := types.Error{} + if len(stdout) == 0 { + if len(stderr) == 0 { + emsg.Msg = fmt.Sprintf("netplugin failed with no error message: %v", err) + } else { + emsg.Msg = fmt.Sprintf("netplugin failed: %q", string(stderr)) } - return &emsg + } else if perr := json.Unmarshal(stdout, &emsg); perr != nil { + emsg.Msg = fmt.Sprintf("netplugin failed but error parsing its diagnostic message %q: %v", string(stdout), perr) } - - return err + return &emsg } func (e *RawExec) FindInPath(plugin string, paths []string) (string, error) { diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/020/types.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/020/types.go index 53256167fad9..36f31678a8e6 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/020/types.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/020/types.go @@ -86,20 +86,6 @@ func (r *Result) PrintTo(writer io.Writer) error { return err } -// String returns a formatted string in the form of "[IP4: $1,][ IP6: $2,] DNS: $3" where -// $1 represents the receiver's IPv4, $2 represents the receiver's IPv6 and $3 the -// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. -func (r *Result) String() string { - var str string - if r.IP4 != nil { - str = fmt.Sprintf("IP4:%+v, ", *r.IP4) - } - if r.IP6 != nil { - str += fmt.Sprintf("IP6:%+v, ", *r.IP6) - } - return fmt.Sprintf("%sDNS:%+v", str, r.DNS) -} - // IPConfig contains values necessary to configure an interface type IPConfig struct { IP net.IPNet diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/args.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/args.go index bd8640fc969a..4eac64899470 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/args.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/args.go @@ -36,7 +36,7 @@ func (b *UnmarshallableBool) UnmarshalText(data []byte) error { case "0", "false": *b = false default: - return fmt.Errorf("Boolean unmarshal error: invalid input %s", s) + return fmt.Errorf("boolean unmarshal error: invalid input %s", s) } return nil } diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/current/types.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/current/types.go index 7267a2e6d1fa..754cc6e722ea 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/current/types.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/current/types.go @@ -207,23 +207,6 @@ func (r *Result) PrintTo(writer io.Writer) error { return err } -// String returns a formatted string in the form of "[Interfaces: $1,][ IP: $2,] DNS: $3" where -// $1 represents the receiver's Interfaces, $2 represents the receiver's IP addresses and $3 the -// receiver's DNS. If $1 or $2 are nil, they won't be present in the returned string. -func (r *Result) String() string { - var str string - if len(r.Interfaces) > 0 { - str += fmt.Sprintf("Interfaces:%+v, ", r.Interfaces) - } - if len(r.IPs) > 0 { - str += fmt.Sprintf("IP:%+v, ", r.IPs) - } - if len(r.Routes) > 0 { - str += fmt.Sprintf("Routes:%+v, ", r.Routes) - } - return fmt.Sprintf("%sDNS:%+v", str, r.DNS) -} - // Convert this old version result to the current CNI version result func (r *Result) Convert() (*Result, error) { return r, nil diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/types.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/types.go index d0d11006a050..3fa757a5d224 100644 --- a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/types.go +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/types/types.go @@ -16,7 +16,6 @@ package types import ( "encoding/json" - "errors" "fmt" "io" "net" @@ -101,9 +100,6 @@ type Result interface { // Prints the result in JSON format to provided writer PrintTo(writer io.Writer) error - - // Returns a JSON string representation of the result - String() string } func PrintResult(result Result, version string) error { @@ -134,9 +130,16 @@ func (r *Route) String() string { // Well known error codes // see https://github.com/containernetworking/cni/blob/master/SPEC.md#well-known-error-codes const ( - ErrUnknown uint = iota // 0 - ErrIncompatibleCNIVersion // 1 - ErrUnsupportedField // 2 + ErrUnknown uint = iota // 0 + ErrIncompatibleCNIVersion // 1 + ErrUnsupportedField // 2 + ErrUnknownContainer // 3 + ErrInvalidEnvironmentVariables // 4 + ErrIOFailure // 5 + ErrDecodingFailure // 6 + ErrInvalidNetworkConfig // 7 + ErrTryAgainLater uint = 11 + ErrInternal uint = 999 ) type Error struct { @@ -145,6 +148,14 @@ type Error struct { Details string `json:"details,omitempty"` } +func NewError(code uint, msg, details string) *Error { + return &Error{ + Code: code, + Msg: msg, + Details: details, + } +} + func (e *Error) Error() string { details := "" if e.Details != "" { @@ -194,6 +205,3 @@ func prettyPrint(obj interface{}) error { _, err = os.Stdout.Write(data) return err } - -// NotImplementedError is used to indicate that a method is not implemented for the given platform -var NotImplementedError = errors.New("Not Implemented") diff --git a/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/utils/utils.go b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/utils/utils.go new file mode 100644 index 000000000000..b8ec38874595 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/containernetworking/cni/pkg/utils/utils.go @@ -0,0 +1,84 @@ +// Copyright 2019 CNI 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 utils + +import ( + "bytes" + "fmt" + "regexp" + "unicode" + + "github.com/containernetworking/cni/pkg/types" +) + +const ( + // cniValidNameChars is the regexp used to validate valid characters in + // containerID and networkName + cniValidNameChars = `[a-zA-Z0-9][a-zA-Z0-9_.\-]` + + // maxInterfaceNameLength is the length max of a valid interface name + maxInterfaceNameLength = 15 +) + +var cniReg = regexp.MustCompile(`^` + cniValidNameChars + `*$`) + +// ValidateContainerID will validate that the supplied containerID is not empty does not contain invalid characters +func ValidateContainerID(containerID string) *types.Error { + + if containerID == "" { + return types.NewError(types.ErrUnknownContainer, "missing containerID", "") + } + if !cniReg.MatchString(containerID) { + return types.NewError(types.ErrInvalidEnvironmentVariables, "invalid characters in containerID", containerID) + } + return nil +} + +// ValidateNetworkName will validate that the supplied networkName does not contain invalid characters +func ValidateNetworkName(networkName string) *types.Error { + + if networkName == "" { + return types.NewError(types.ErrInvalidNetworkConfig, "missing network name:", "") + } + if !cniReg.MatchString(networkName) { + return types.NewError(types.ErrInvalidNetworkConfig, "invalid characters found in network name", networkName) + } + return nil +} + +// ValidateInterfaceName will validate the interface name based on the three rules below +// 1. The name must not be empty +// 2. The name must be less than 16 characters +// 3. The name must not be "." or ".." +// 3. The name must not contain / or : or any whitespace characters +// ref to https://github.com/torvalds/linux/blob/master/net/core/dev.c#L1024 +func ValidateInterfaceName(ifName string) *types.Error { + if len(ifName) == 0 { + return types.NewError(types.ErrInvalidEnvironmentVariables, "interface name is empty", "") + } + if len(ifName) > maxInterfaceNameLength { + return types.NewError(types.ErrInvalidEnvironmentVariables, "interface name is too long", fmt.Sprintf("interface name should be less than %d characters", maxInterfaceNameLength+1)) + } + if ifName == "." || ifName == ".." { + return types.NewError(types.ErrInvalidEnvironmentVariables, "interface name is . or ..", "") + } + for _, r := range bytes.Runes([]byte(ifName)) { + if r == '/' || r == ':' || unicode.IsSpace(r) { + return types.NewError(types.ErrInvalidEnvironmentVariables, "interface name contains / or : or whitespace characters", "") + } + } + + return nil +} diff --git a/cluster-autoscaler/vendor/github.com/go-logr/logr/README.md b/cluster-autoscaler/vendor/github.com/go-logr/logr/README.md index 26296d0240f6..aca17f382738 100644 --- a/cluster-autoscaler/vendor/github.com/go-logr/logr/README.md +++ b/cluster-autoscaler/vendor/github.com/go-logr/logr/README.md @@ -1,9 +1,9 @@ # A more minimal logging API for Go -Before you consider this package, please read [this blog post by the inimitable -Dave Cheney](http://dave.cheney.net/2015/11/05/lets-talk-about-logging). I -really appreciate what he has to say, and it largely aligns with my own -experiences. Too many choices of levels means inconsistent logs. +Before you consider this package, please read [this blog post by the +inimitable Dave Cheney][warning-makes-no-sense]. I really appreciate what +he has to say, and it largely aligns with my own experiences. Too many +choices of levels means inconsistent logs. This package offers a purely abstract interface, based on these ideas but with a few twists. Code can depend on just this interface and have the actual @@ -31,6 +31,151 @@ may feel very similar, but the primary difference is the lack of semantics. Because verbosity is a numerical value, it's safe to assume that an app running with higher verbosity means more (and less important) logs will be generated. -This is a BETA grade API. I have implemented it for -[glog](https://godoc.org/github.com/golang/glog). Until there is a significant -2nd implementation, I don't really know how it will change. +This is a BETA grade API. + +There are implementations for the following logging libraries: + +- **github.com/google/glog**: [glogr](https://github.com/go-logr/glogr) +- **k8s.io/klog**: [klogr](https://git.k8s.io/klog/klogr) +- **go.uber.org/zap**: [zapr](https://github.com/go-logr/zapr) +- **log** (the Go standard library logger): + [stdr](https://github.com/go-logr/stdr) +- **github.com/sirupsen/logrus**: [logrusr](https://github.com/bombsimon/logrusr) + +# FAQ + +## Conceptual + +## Why structured logging? + +- **Structured logs are more easily queriable**: Since you've got + key-value pairs, it's much easier to query your structured logs for + particular values by filtering on the contents of a particular key -- + think searching request logs for error codes, Kubernetes reconcilers for + the name and namespace of the reconciled object, etc + +- **Structured logging makes it easier to have cross-referencable logs**: + Similarly to searchability, if you maintain conventions around your + keys, it becomes easy to gather all log lines related to a particular + concept. + +- **Structured logs allow better dimensions of filtering**: if you have + structure to your logs, you've got more precise control over how much + information is logged -- you might choose in a particular configuration + to log certain keys but not others, only log lines where a certain key + matches a certain value, etc, instead of just having v-levels and names + to key off of. + +- **Structured logs better represent structured data**: sometimes, the + data that you want to log is inherently structured (think tuple-link + objects). Structured logs allow you to preserve that structure when + outputting. + +## Why V-levels? + +**V-levels give operators an easy way to control the chattiness of log +operations**. V-levels provide a way for a given package to distinguish +the relative importance or verbosity of a given log message. Then, if +a particular logger or package is logging too many messages, the user +of the package can simply change the v-levels for that library. + +## Why not more named levels, like Warning? + +Read [Dave Cheney's post][warning-makes-no-sense]. Then read [Differences +from Dave's ideas](#differences-from-daves-ideas). + +## Why not allow format strings, too? + +**Format strings negate many of the benefits of structured logs**: + +- They're not easily searchable without resorting to fuzzy searching, + regular expressions, etc + +- They don't store structured data well, since contents are flattened into + a string + +- They're not cross-referencable + +- They don't compress easily, since the message is not constant + +(unless you turn positional parameters into key-value pairs with numerical +keys, at which point you've gotten key-value logging with meaningless +keys) + +## Practical + +## Why key-value pairs, and not a map? + +Key-value pairs are *much* easier to optimize, especially around +allocations. Zap (a structured logger that inspired logr's interface) has +[performance measurements](https://github.com/uber-go/zap#performance) +that show this quite nicely. + +While the interface ends up being a little less obvious, you get +potentially better performance, plus avoid making users type +`map[string]string{}` every time they want to log. + +## What if my V-levels differ between libraries? + +That's fine. Control your V-levels on a per-logger basis, and use the +`WithName` function to pass different loggers to different libraries. + +Generally, you should take care to ensure that you have relatively +consistent V-levels within a given logger, however, as this makes deciding +on what verbosity of logs to request easier. + +## But I *really* want to use a format string! + +That's not actually a question. Assuming your question is "how do +I convert my mental model of logging with format strings to logging with +constant messages": + +1. figure out what the error actually is, as you'd write in a TL;DR style, + and use that as a message + +2. For every place you'd write a format specifier, look to the word before + it, and add that as a key value pair + +For instance, consider the following examples (all taken from spots in the +Kubernetes codebase): + +- `klog.V(4).Infof("Client is returning errors: code %v, error %v", + responseCode, err)` becomes `logger.Error(err, "client returned an + error", "code", responseCode)` + +- `klog.V(4).Infof("Got a Retry-After %ds response for attempt %d to %v", + seconds, retries, url)` becomes `logger.V(4).Info("got a retry-after + response when requesting url", "attempt", retries, "after + seconds", seconds, "url", url)` + +If you *really* must use a format string, place it as a key value, and +call `fmt.Sprintf` yourself -- for instance, `log.Printf("unable to +reflect over type %T")` becomes `logger.Info("unable to reflect over +type", "type", fmt.Sprintf("%T"))`. In general though, the cases where +this is necessary should be few and far between. + +## How do I choose my V-levels? + +This is basically the only hard constraint: increase V-levels to denote +more verbose or more debug-y logs. + +Otherwise, you can start out with `0` as "you always want to see this", +`1` as "common logging that you might *possibly* want to turn off", and +`10` as "I would like to performance-test your log collection stack". + +Then gradually choose levels in between as you need them, working your way +down from 10 (for debug and trace style logs) and up from 1 (for chattier +info-type logs). + +## How do I choose my keys + +- make your keys human-readable +- constant keys are generally a good idea +- be consistent across your codebase +- keys should naturally match parts of the message string + +While key names are mostly unrestricted (and spaces are acceptable), +it's generally a good idea to stick to printable ascii characters, or at +least match the general character set of your log lines. + +[warning-makes-no-sense]: http://dave.cheney.net/2015/11/05/lets-talk-about-logging diff --git a/cluster-autoscaler/vendor/github.com/go-logr/logr/go.mod b/cluster-autoscaler/vendor/github.com/go-logr/logr/go.mod new file mode 100644 index 000000000000..591884e91f14 --- /dev/null +++ b/cluster-autoscaler/vendor/github.com/go-logr/logr/go.mod @@ -0,0 +1,3 @@ +module github.com/go-logr/logr + +go 1.14 diff --git a/cluster-autoscaler/vendor/github.com/go-logr/logr/logr.go b/cluster-autoscaler/vendor/github.com/go-logr/logr/logr.go index ad72e788692d..520c4fe55980 100644 --- a/cluster-autoscaler/vendor/github.com/go-logr/logr/logr.go +++ b/cluster-autoscaler/vendor/github.com/go-logr/logr/logr.go @@ -1,3 +1,19 @@ +/* +Copyright 2019 The logr 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 logr defines abstract interfaces for logging. Packages can depend on // these interfaces and callers can implement logging in whatever way is // appropriate. @@ -13,22 +29,22 @@ // // Usage // -// Logging is done using a Logger. Loggers can have name prefixes and named values -// attached, so that all log messages logged with that Logger have some base context -// associated. +// Logging is done using a Logger. Loggers can have name prefixes and named +// values attached, so that all log messages logged with that Logger have some +// base context associated. // -// The term "key" is used to refer to the name associated with a particular value, to -// disambiguate it from the general Logger name. +// The term "key" is used to refer to the name associated with a particular +// value, to disambiguate it from the general Logger name. // -// For instance, suppose we're trying to reconcile the state of an object, and we want -// to log that we've made some decision. +// For instance, suppose we're trying to reconcile the state of an object, and +// we want to log that we've made some decision. // -// With the traditional log package, we might write +// With the traditional log package, we might write: // log.Printf( // "decided to set field foo to value %q for object %s/%s", // targetValue, object.Namespace, object.Name) // -// With logr's structured logging, we'd write +// With logr's structured logging, we'd write: // // elsewhere in the file, set up the logger to log with the prefix of "reconcilers", // // and the named value target-type=Foo, for extra context. // log := mainLogger.WithName("reconcilers").WithValues("target-type", "Foo") @@ -36,72 +52,95 @@ // // later on... // log.Info("setting field foo on object", "value", targetValue, "object", object) // -// Depending on our logging implementation, we could then make logging decisions based on field values -// (like only logging such events for objects in a certain namespace), or copy the structured -// information into a structured log store. +// Depending on our logging implementation, we could then make logging decisions +// based on field values (like only logging such events for objects in a certain +// namespace), or copy the structured information into a structured log store. // -// For logging errors, Logger has a method called Error. Suppose we wanted to log an -// error while reconciling. With the traditional log package, we might write +// For logging errors, Logger has a method called Error. Suppose we wanted to +// log an error while reconciling. With the traditional log package, we might +// write: // log.Errorf("unable to reconcile object %s/%s: %v", object.Namespace, object.Name, err) // -// With logr, we'd instead write +// With logr, we'd instead write: // // assuming the above setup for log // log.Error(err, "unable to reconcile object", "object", object) // // This functions similarly to: // log.Info("unable to reconcile object", "error", err, "object", object) // -// However, it ensures that a standard key for the error value ("error") is used across all -// error logging. Furthermore, certain implementations may choose to attach additional -// information (such as stack traces) on calls to Error, so it's preferred to use Error -// to log errors. +// However, it ensures that a standard key for the error value ("error") is used +// across all error logging. Furthermore, certain implementations may choose to +// attach additional information (such as stack traces) on calls to Error, so +// it's preferred to use Error to log errors. // // Parts of a log line // // Each log message from a Logger has four types of context: // logger name, log verbosity, log message, and the named values. // -// The Logger name constists of a series of name "segments" added by successive calls to WithName. -// These name segments will be joined in some way by the underlying implementation. It is strongly -// reccomended that name segements contain simple identifiers (letters, digits, and hyphen), and do -// not contain characters that could muddle the log output or confuse the joining operation (e.g. -// whitespace, commas, periods, slashes, brackets, quotes, etc). +// The Logger name constists of a series of name "segments" added by successive +// calls to WithName. These name segments will be joined in some way by the +// underlying implementation. It is strongly reccomended that name segements +// contain simple identifiers (letters, digits, and hyphen), and do not contain +// characters that could muddle the log output or confuse the joining operation +// (e.g. whitespace, commas, periods, slashes, brackets, quotes, etc). // -// Log verbosity represents how little a log matters. Level zero, the default, matters most. -// Increasing levels matter less and less. Try to avoid lots of different verbosity levels, -// and instead provide useful keys, logger names, and log messages for users to filter on. -// It's illegal to pass a log level below zero. +// Log verbosity represents how little a log matters. Level zero, the default, +// matters most. Increasing levels matter less and less. Try to avoid lots of +// different verbosity levels, and instead provide useful keys, logger names, +// and log messages for users to filter on. It's illegal to pass a log level +// below zero. // -// The log message consists of a constant message attached to the the log line. This -// should generally be a simple description of what's occuring, and should never be a format string. +// The log message consists of a constant message attached to the the log line. +// This should generally be a simple description of what's occuring, and should +// never be a format string. // -// Variable information can then be attached using named values (key/value pairs). Keys are arbitrary -// strings, while values may be any Go value. +// Variable information can then be attached using named values (key/value +// pairs). Keys are arbitrary strings, while values may be any Go value. // // Key Naming Conventions // -// While users are generally free to use key names of their choice, it's generally best to avoid -// using the following keys, as they're frequently used by implementations: +// Keys are not strictly required to conform to any specification or regex, but +// it is recommended that they: +// * be human-readable and meaningful (not auto-generated or simple ordinals) +// * be constant (not dependent on input data) +// * contain only printable characters +// * not contain whitespace or punctuation +// +// These guidelines help ensure that log data is processed properly regardless +// of the log implementation. For example, log implementations will try to +// output JSON data or will store data for later database (e.g. SQL) queries. +// +// While users are generally free to use key names of their choice, it's +// generally best to avoid using the following keys, as they're frequently used +// by implementations: // -// - `"error"`: the underlying error value in the `Error` method. -// - `"stacktrace"`: the stack trace associated with a particular log line or error -// (often from the `Error` message). // - `"caller"`: the calling information (file/line) of a particular log line. -// - `"msg"`: the log message. +// - `"error"`: the underlying error value in the `Error` method. // - `"level"`: the log level. +// - `"logger"`: the name of the associated logger. +// - `"msg"`: the log message. +// - `"stacktrace"`: the stack trace associated with a particular log line or +// error (often from the `Error` message). // - `"ts"`: the timestamp for a log line. // -// Implementations are encouraged to make use of these keys to represent the above -// concepts, when neccessary (for example, in a pure-JSON output form, it would be -// necessary to represent at least message and timestamp as ordinary named values). +// Implementations are encouraged to make use of these keys to represent the +// above concepts, when neccessary (for example, in a pure-JSON output form, it +// would be necessary to represent at least message and timestamp as ordinary +// named values). package logr // TODO: consider adding back in format strings if they're really needed // TODO: consider other bits of zap/zapcore functionality like ObjectMarshaller (for arbitrary objects) // TODO: consider other bits of glog functionality like Flush, InfoDepth, OutputStats -// InfoLogger represents the ability to log non-error messages, at a particular verbosity. -type InfoLogger interface { +// Logger represents the ability to log messages, both errors and not. +type Logger interface { + // Enabled tests whether this Logger is enabled. For example, commandline + // flags might be used to set the logging verbosity and disable some info + // logs. + Enabled() bool + // Info logs a non-error message with the given key/value pairs as context. // // The msg argument should be used to add some constant description to @@ -110,19 +149,6 @@ type InfoLogger interface { // keys and arbitrary values. Info(msg string, keysAndValues ...interface{}) - // Enabled tests whether this InfoLogger is enabled. For example, - // commandline flags might be used to set the logging verbosity and disable - // some info logs. - Enabled() bool -} - -// Logger represents the ability to log messages, both errors and not. -type Logger interface { - // All Loggers implement InfoLogger. Calling InfoLogger methods directly on - // a Logger value is equivalent to calling them on a V(0) InfoLogger. For - // example, logger.Info() produces the same result as logger.V(0).Info. - InfoLogger - // Error logs an error, with the given message and key/value pairs as context. // It functions similarly to calling Info with the "error" named value, but may // have unique behavior, and should be preferred for logging errors (see the @@ -133,10 +159,11 @@ type Logger interface { // triggered this log line, if present. Error(err error, msg string, keysAndValues ...interface{}) - // V returns an InfoLogger value for a specific verbosity level. A higher - // verbosity level means a log message is less important. It's illegal to - // pass a log level less than zero. - V(level int) InfoLogger + // V returns an Logger value for a specific verbosity level, relative to + // this Logger. In other words, V values are additive. V higher verbosity + // level means a log message is less important. It's illegal to pass a log + // level less than zero. + V(level int) Logger // WithValues adds some key-value pairs of context to a logger. // See Info for documentation on how key/value pairs work. diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.pb.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.pb.go index ed5b5dfe12cf..04eb206750d5 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.pb.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.pb.go @@ -143,64 +143,65 @@ func init() { } var fileDescriptor_4b73421fd5edef9f = []byte{ - // 898 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4d, 0x6f, 0x1b, 0x45, - 0x18, 0xf6, 0xc6, 0x89, 0xed, 0x1d, 0x87, 0xda, 0x9d, 0x82, 0x58, 0xf9, 0xb0, 0x36, 0x39, 0x20, - 0x17, 0xb5, 0xb3, 0x24, 0x82, 0x2a, 0xaa, 0x38, 0x34, 0x4b, 0x2a, 0x14, 0x90, 0x9a, 0x68, 0xda, - 0xa0, 0x8a, 0x03, 0xd2, 0xd8, 0x3b, 0xb5, 0x17, 0xdb, 0x33, 0xcb, 0xce, 0xac, 0x83, 0x6f, 0x9c, - 0x38, 0xf3, 0x0f, 0xf8, 0x1d, 0xfc, 0x83, 0x1c, 0x7b, 0xec, 0xc9, 0x22, 0xe6, 0x5f, 0x44, 0x42, - 0x42, 0x33, 0x3b, 0xfb, 0xd1, 0x7c, 0x88, 0xd0, 0xf4, 0xe4, 0x79, 0x3f, 0x9e, 0xe7, 0x7d, 0xfd, - 0xbc, 0x3b, 0xef, 0x80, 0x27, 0x93, 0x5d, 0x81, 0x42, 0xee, 0x4d, 0x92, 0x01, 0x8d, 0x19, 0x95, - 0x54, 0x78, 0x73, 0xca, 0x02, 0x1e, 0x7b, 0x26, 0x40, 0xa2, 0xd0, 0x23, 0xc1, 0x2c, 0x14, 0x22, - 0xe4, 0xcc, 0x9b, 0x6f, 0x7b, 0x23, 0xca, 0x68, 0x4c, 0x24, 0x0d, 0x50, 0x14, 0x73, 0xc9, 0xe1, - 0xc7, 0x69, 0x22, 0x22, 0x51, 0x88, 0xf2, 0x44, 0x34, 0xdf, 0xee, 0x3c, 0x1c, 0x85, 0x72, 0x9c, - 0x0c, 0xd0, 0x90, 0xcf, 0xbc, 0x11, 0x1f, 0x71, 0x4f, 0xe7, 0x0f, 0x92, 0x57, 0xda, 0xd2, 0x86, - 0x3e, 0xa5, 0x3c, 0x9d, 0x07, 0xe5, 0x82, 0x89, 0x1c, 0x53, 0x26, 0xc3, 0x21, 0x91, 0x57, 0x57, - 0xed, 0x7c, 0x51, 0x64, 0xcf, 0xc8, 0x70, 0x1c, 0x32, 0x1a, 0x2f, 0xbc, 0x68, 0x32, 0x52, 0x0e, - 0xe1, 0xcd, 0xa8, 0x24, 0x57, 0xa1, 0xbc, 0xeb, 0x50, 0x71, 0xc2, 0x64, 0x38, 0xa3, 0x97, 0x00, - 0x8f, 0xfe, 0x0b, 0x20, 0x86, 0x63, 0x3a, 0x23, 0x17, 0x71, 0x5b, 0x7f, 0xd8, 0xa0, 0xbd, 0x97, - 0x89, 0x81, 0xe9, 0xcf, 0x09, 0x15, 0x12, 0xfa, 0xa0, 0x9a, 0x84, 0x81, 0x63, 0xf5, 0xac, 0xbe, - 0xed, 0x7f, 0x7e, 0xba, 0xec, 0x56, 0x56, 0xcb, 0x6e, 0xf5, 0xf8, 0x60, 0xff, 0x7c, 0xd9, 0xfd, - 0xe4, 0xba, 0x42, 0x72, 0x11, 0x51, 0x81, 0x8e, 0x0f, 0xf6, 0xb1, 0x02, 0xc3, 0x97, 0x60, 0x7d, - 0x12, 0xb2, 0xc0, 0x59, 0xeb, 0x59, 0xfd, 0xe6, 0xce, 0x23, 0x54, 0x88, 0x9f, 0xc3, 0x50, 0x34, - 0x19, 0x29, 0x87, 0x40, 0x4a, 0x06, 0x34, 0xdf, 0x46, 0xdf, 0xc4, 0x3c, 0x89, 0xbe, 0xa7, 0xb1, - 0x6a, 0xe6, 0xbb, 0x90, 0x05, 0xfe, 0xa6, 0x29, 0xbe, 0xae, 0x2c, 0xac, 0x19, 0xe1, 0x18, 0x34, - 0x62, 0x2a, 0x78, 0x12, 0x0f, 0xa9, 0x53, 0xd5, 0xec, 0x8f, 0xff, 0x3f, 0x3b, 0x36, 0x0c, 0x7e, - 0xdb, 0x54, 0x68, 0x64, 0x1e, 0x9c, 0xb3, 0xc3, 0x2f, 0x41, 0x53, 0x24, 0x83, 0x2c, 0xe0, 0xac, - 0x6b, 0x3d, 0xee, 0x19, 0x40, 0xf3, 0x79, 0x11, 0xc2, 0xe5, 0x3c, 0x18, 0x82, 0x66, 0x9c, 0x2a, - 0xa9, 0xba, 0x76, 0x3e, 0xb8, 0x95, 0x02, 0x2d, 0x55, 0x0a, 0x17, 0x74, 0xb8, 0xcc, 0x0d, 0x17, - 0xa0, 0x65, 0xcc, 0xbc, 0xcb, 0x3b, 0xb7, 0x96, 0xe4, 0xde, 0x6a, 0xd9, 0x6d, 0xe1, 0xb7, 0x69, - 0xf1, 0xc5, 0x3a, 0xf0, 0x5b, 0x00, 0x8d, 0xab, 0x24, 0x84, 0xd3, 0xd2, 0x1a, 0x75, 0x8c, 0x46, - 0x10, 0x5f, 0xca, 0xc0, 0x57, 0xa0, 0x60, 0x0f, 0xac, 0x33, 0x32, 0xa3, 0xce, 0x86, 0x46, 0xe7, - 0x43, 0x7f, 0x46, 0x66, 0x14, 0xeb, 0x08, 0xf4, 0x80, 0xad, 0x7e, 0x45, 0x44, 0x86, 0xd4, 0xa9, - 0xe9, 0xb4, 0xbb, 0x26, 0xcd, 0x7e, 0x96, 0x05, 0x70, 0x91, 0x03, 0xbf, 0x02, 0x36, 0x8f, 0xd4, - 0xa7, 0x1e, 0x72, 0xe6, 0xd4, 0x35, 0xc0, 0xcd, 0x00, 0x87, 0x59, 0xe0, 0xbc, 0x6c, 0xe0, 0x02, - 0x00, 0x5f, 0x80, 0x46, 0x22, 0x68, 0x7c, 0xc0, 0x5e, 0x71, 0xa7, 0xa1, 0x05, 0xfd, 0x14, 0x95, - 0xd7, 0xc7, 0x5b, 0xd7, 0x5e, 0x09, 0x79, 0x6c, 0xb2, 0x8b, 0xef, 0x29, 0xf3, 0xe0, 0x9c, 0x09, - 0x1e, 0x83, 0x1a, 0x1f, 0xfc, 0x44, 0x87, 0xd2, 0xb1, 0x35, 0xe7, 0xc3, 0x6b, 0x87, 0x64, 0x6e, - 0x2d, 0xc2, 0xe4, 0xe4, 0xe9, 0x2f, 0x92, 0x32, 0x35, 0x1f, 0xff, 0x8e, 0xa1, 0xae, 0x1d, 0x6a, - 0x12, 0x6c, 0xc8, 0xe0, 0x8f, 0xc0, 0xe6, 0xd3, 0x20, 0x75, 0x3a, 0xe0, 0x5d, 0x98, 0x73, 0x29, - 0x0f, 0x33, 0x1e, 0x5c, 0x50, 0xc2, 0x2d, 0x50, 0x0b, 0xe2, 0x05, 0x4e, 0x98, 0xd3, 0xec, 0x59, - 0xfd, 0x86, 0x0f, 0x54, 0x0f, 0xfb, 0xda, 0x83, 0x4d, 0x04, 0xbe, 0x04, 0x75, 0x1e, 0x29, 0x31, - 0x84, 0xb3, 0xf9, 0x2e, 0x1d, 0xb4, 0x4c, 0x07, 0xf5, 0xc3, 0x94, 0x05, 0x67, 0x74, 0x5b, 0xff, - 0x54, 0xc1, 0xdd, 0xd2, 0x86, 0x12, 0x11, 0x67, 0x82, 0xbe, 0x97, 0x15, 0x75, 0x1f, 0xd4, 0xc9, - 0x74, 0xca, 0x4f, 0x68, 0xba, 0xa5, 0x1a, 0x45, 0x13, 0x7b, 0xa9, 0x1b, 0x67, 0x71, 0x78, 0x04, - 0x6a, 0x42, 0x12, 0x99, 0x08, 0xb3, 0x71, 0x1e, 0xdc, 0xec, 0x7a, 0x3d, 0xd7, 0x98, 0x54, 0x30, - 0x4c, 0x45, 0x32, 0x95, 0xd8, 0xf0, 0xc0, 0x2e, 0xd8, 0x88, 0x88, 0x1c, 0x8e, 0xf5, 0x56, 0xd9, - 0xf4, 0xed, 0xd5, 0xb2, 0xbb, 0x71, 0xa4, 0x1c, 0x38, 0xf5, 0xc3, 0x5d, 0x60, 0xeb, 0xc3, 0x8b, - 0x45, 0x94, 0x5d, 0x8c, 0x8e, 0x1a, 0xd1, 0x51, 0xe6, 0x3c, 0x2f, 0x1b, 0xb8, 0x48, 0x86, 0xbf, - 0x59, 0xa0, 0x4d, 0x92, 0x20, 0x94, 0x7b, 0x8c, 0x71, 0x49, 0xd2, 0xa9, 0xd4, 0x7a, 0xd5, 0x7e, - 0x73, 0xe7, 0x09, 0xba, 0xe6, 0x11, 0x44, 0x97, 0x24, 0x46, 0x7b, 0x17, 0x28, 0x9e, 0x32, 0x19, - 0x2f, 0x7c, 0xc7, 0x68, 0xd4, 0xbe, 0x18, 0xc6, 0x97, 0x6a, 0x76, 0xbe, 0x06, 0x1f, 0x5d, 0x49, - 0x02, 0xdb, 0xa0, 0x3a, 0xa1, 0x8b, 0x74, 0x7a, 0x58, 0x1d, 0xe1, 0x87, 0x60, 0x63, 0x4e, 0xa6, - 0x09, 0xd5, 0x93, 0xb0, 0x71, 0x6a, 0x3c, 0x5e, 0xdb, 0xb5, 0xb6, 0xfe, 0xb4, 0x40, 0xab, 0xd4, - 0xdc, 0x3c, 0xa4, 0x27, 0xf0, 0x08, 0xd4, 0xcd, 0x16, 0xd1, 0x1c, 0xcd, 0x9d, 0xfb, 0x37, 0xf9, - 0x5f, 0x1a, 0xe0, 0x37, 0xd5, 0x80, 0xb3, 0xed, 0x96, 0xd1, 0xa8, 0x0b, 0x1f, 0x9b, 0x3f, 0x6e, - 0x9e, 0xac, 0xcf, 0x6e, 0x2e, 0x95, 0xbf, 0x69, 0x1e, 0x10, 0x6d, 0xe1, 0x9c, 0xc9, 0xef, 0x9f, - 0x9e, 0xb9, 0x95, 0xd7, 0x67, 0x6e, 0xe5, 0xcd, 0x99, 0x5b, 0xf9, 0x75, 0xe5, 0x5a, 0xa7, 0x2b, - 0xd7, 0x7a, 0xbd, 0x72, 0xad, 0x37, 0x2b, 0xd7, 0xfa, 0x6b, 0xe5, 0x5a, 0xbf, 0xff, 0xed, 0x56, - 0x7e, 0x58, 0x9b, 0x6f, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x37, 0xc7, 0x3f, 0x71, 0xdf, 0x08, - 0x00, 0x00, + // 919 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4f, 0x6f, 0x1b, 0x45, + 0x14, 0xf7, 0xd6, 0x8e, 0xed, 0x1d, 0x87, 0xda, 0x9d, 0x82, 0x58, 0xf9, 0xb0, 0x36, 0x39, 0x20, + 0x17, 0xb5, 0xbb, 0x24, 0x82, 0x2a, 0xaa, 0x38, 0x34, 0x4b, 0x2a, 0x14, 0x90, 0x9a, 0x68, 0xda, + 0x40, 0xc5, 0x01, 0x69, 0xec, 0x9d, 0xda, 0x83, 0xed, 0x99, 0x65, 0x67, 0xd6, 0xc1, 0x37, 0x4e, + 0x9c, 0xf9, 0x06, 0x1c, 0xf9, 0x0c, 0x7c, 0x83, 0x1c, 0x7b, 0xec, 0xc9, 0x22, 0xe6, 0x5b, 0xe4, + 0x84, 0x66, 0x76, 0xf6, 0x4f, 0xf3, 0x47, 0x84, 0x96, 0x93, 0xf7, 0xfd, 0xf9, 0xfd, 0xde, 0xf3, + 0xef, 0xed, 0x7b, 0x0b, 0x1e, 0x4f, 0x77, 0x85, 0x47, 0xb9, 0x3f, 0x4d, 0x86, 0x24, 0x66, 0x44, + 0x12, 0xe1, 0x2f, 0x08, 0x0b, 0x79, 0xec, 0x9b, 0x00, 0x8e, 0xa8, 0x8f, 0xc3, 0x39, 0x15, 0x82, + 0x72, 0xe6, 0x2f, 0xb6, 0xfd, 0x31, 0x61, 0x24, 0xc6, 0x92, 0x84, 0x5e, 0x14, 0x73, 0xc9, 0xe1, + 0x87, 0x69, 0xa2, 0x87, 0x23, 0xea, 0xe5, 0x89, 0xde, 0x62, 0xbb, 0xfb, 0x60, 0x4c, 0xe5, 0x24, + 0x19, 0x7a, 0x23, 0x3e, 0xf7, 0xc7, 0x7c, 0xcc, 0x7d, 0x9d, 0x3f, 0x4c, 0x5e, 0x6a, 0x4b, 0x1b, + 0xfa, 0x29, 0xe5, 0xe9, 0xde, 0x2f, 0x17, 0x4c, 0xe4, 0x84, 0x30, 0x49, 0x47, 0x58, 0x5e, 0x5d, + 0xb5, 0xfb, 0x59, 0x91, 0x3d, 0xc7, 0xa3, 0x09, 0x65, 0x24, 0x5e, 0xfa, 0xd1, 0x74, 0xac, 0x1c, + 0xc2, 0x9f, 0x13, 0x89, 0xaf, 0x42, 0xf9, 0xd7, 0xa1, 0xe2, 0x84, 0x49, 0x3a, 0x27, 0x97, 0x00, + 0x0f, 0xff, 0x0d, 0x20, 0x46, 0x13, 0x32, 0xc7, 0x17, 0x71, 0x5b, 0xbf, 0xdb, 0xa0, 0xb3, 0x97, + 0x89, 0x81, 0xc8, 0x4f, 0x09, 0x11, 0x12, 0x06, 0xa0, 0x9a, 0xd0, 0xd0, 0xb1, 0xfa, 0xd6, 0xc0, + 0x0e, 0x3e, 0x3d, 0x5d, 0xf5, 0x2a, 0xeb, 0x55, 0xaf, 0x7a, 0x7c, 0xb0, 0x7f, 0xbe, 0xea, 0x7d, + 0x74, 0x5d, 0x21, 0xb9, 0x8c, 0x88, 0xf0, 0x8e, 0x0f, 0xf6, 0x91, 0x02, 0xc3, 0x17, 0xa0, 0x36, + 0xa5, 0x2c, 0x74, 0x6e, 0xf5, 0xad, 0x41, 0x6b, 0xe7, 0xa1, 0x57, 0x88, 0x9f, 0xc3, 0xbc, 0x68, + 0x3a, 0x56, 0x0e, 0xe1, 0x29, 0x19, 0xbc, 0xc5, 0xb6, 0xf7, 0x55, 0xcc, 0x93, 0xe8, 0x5b, 0x12, + 0xab, 0x66, 0xbe, 0xa1, 0x2c, 0x0c, 0x36, 0x4d, 0xf1, 0x9a, 0xb2, 0x90, 0x66, 0x84, 0x13, 0xd0, + 0x8c, 0x89, 0xe0, 0x49, 0x3c, 0x22, 0x4e, 0x55, 0xb3, 0x3f, 0xfa, 0xef, 0xec, 0xc8, 0x30, 0x04, + 0x1d, 0x53, 0xa1, 0x99, 0x79, 0x50, 0xce, 0x0e, 0x3f, 0x07, 0x2d, 0x91, 0x0c, 0xb3, 0x80, 0x53, + 0xd3, 0x7a, 0xdc, 0x35, 0x80, 0xd6, 0xb3, 0x22, 0x84, 0xca, 0x79, 0x90, 0x82, 0x56, 0x9c, 0x2a, + 0xa9, 0xba, 0x76, 0xde, 0x7b, 0x27, 0x05, 0xda, 0xaa, 0x14, 0x2a, 0xe8, 0x50, 0x99, 0x1b, 0x2e, + 0x41, 0xdb, 0x98, 0x79, 0x97, 0xb7, 0xdf, 0x59, 0x92, 0xbb, 0xeb, 0x55, 0xaf, 0x8d, 0xde, 0xa4, + 0x45, 0x17, 0xeb, 0xc0, 0xaf, 0x01, 0x34, 0xae, 0x92, 0x10, 0x4e, 0x5b, 0x6b, 0xd4, 0x35, 0x1a, + 0x41, 0x74, 0x29, 0x03, 0x5d, 0x81, 0x82, 0x7d, 0x50, 0x63, 0x78, 0x4e, 0x9c, 0x0d, 0x8d, 0xce, + 0x87, 0xfe, 0x14, 0xcf, 0x09, 0xd2, 0x11, 0xe8, 0x03, 0x5b, 0xfd, 0x8a, 0x08, 0x8f, 0x88, 0x53, + 0xd7, 0x69, 0x77, 0x4c, 0x9a, 0xfd, 0x34, 0x0b, 0xa0, 0x22, 0x07, 0x7e, 0x01, 0x6c, 0x1e, 0xa9, + 0x57, 0x9d, 0x72, 0xe6, 0x34, 0x34, 0xc0, 0xcd, 0x00, 0x87, 0x59, 0xe0, 0xbc, 0x6c, 0xa0, 0x02, + 0x00, 0x9f, 0x83, 0x66, 0x22, 0x48, 0x7c, 0xc0, 0x5e, 0x72, 0xa7, 0xa9, 0x05, 0xfd, 0xd8, 0x2b, + 0x9f, 0x8f, 0x37, 0xd6, 0x5e, 0x09, 0x79, 0x6c, 0xb2, 0x8b, 0xf7, 0x29, 0xf3, 0xa0, 0x9c, 0x09, + 0x1e, 0x83, 0x3a, 0x1f, 0xfe, 0x48, 0x46, 0xd2, 0xb1, 0x35, 0xe7, 0x83, 0x6b, 0x87, 0x64, 0xb6, + 0xd6, 0x43, 0xf8, 0xe4, 0xc9, 0xcf, 0x92, 0x30, 0x35, 0x9f, 0xe0, 0xb6, 0xa1, 0xae, 0x1f, 0x6a, + 0x12, 0x64, 0xc8, 0xe0, 0x0f, 0xc0, 0xe6, 0xb3, 0x30, 0x75, 0x3a, 0xe0, 0x6d, 0x98, 0x73, 0x29, + 0x0f, 0x33, 0x1e, 0x54, 0x50, 0xc2, 0x2d, 0x50, 0x0f, 0xe3, 0x25, 0x4a, 0x98, 0xd3, 0xea, 0x5b, + 0x83, 0x66, 0x00, 0x54, 0x0f, 0xfb, 0xda, 0x83, 0x4c, 0x04, 0xbe, 0x00, 0x0d, 0x1e, 0x29, 0x31, + 0x84, 0xb3, 0xf9, 0x36, 0x1d, 0xb4, 0x4d, 0x07, 0x8d, 0xc3, 0x94, 0x05, 0x65, 0x74, 0x5b, 0x7f, + 0xd4, 0xc0, 0x9d, 0xd2, 0x85, 0x12, 0x11, 0x67, 0x82, 0xfc, 0x2f, 0x27, 0xea, 0x1e, 0x68, 0xe0, + 0xd9, 0x8c, 0x9f, 0x90, 0xf4, 0x4a, 0x35, 0x8b, 0x26, 0xf6, 0x52, 0x37, 0xca, 0xe2, 0xf0, 0x08, + 0xd4, 0x85, 0xc4, 0x32, 0x11, 0xe6, 0xe2, 0xdc, 0xbf, 0xd9, 0x7a, 0x3d, 0xd3, 0x98, 0x54, 0x30, + 0x44, 0x44, 0x32, 0x93, 0xc8, 0xf0, 0xc0, 0x1e, 0xd8, 0x88, 0xb0, 0x1c, 0x4d, 0xf4, 0x55, 0xd9, + 0x0c, 0xec, 0xf5, 0xaa, 0xb7, 0x71, 0xa4, 0x1c, 0x28, 0xf5, 0xc3, 0x5d, 0x60, 0xeb, 0x87, 0xe7, + 0xcb, 0x28, 0x5b, 0x8c, 0xae, 0x1a, 0xd1, 0x51, 0xe6, 0x3c, 0x2f, 0x1b, 0xa8, 0x48, 0x86, 0xbf, + 0x5a, 0xa0, 0x83, 0x93, 0x90, 0xca, 0x3d, 0xc6, 0xb8, 0xc4, 0xe9, 0x54, 0xea, 0xfd, 0xea, 0xa0, + 0xb5, 0xf3, 0xd8, 0xbb, 0xe6, 0x23, 0xe8, 0x5d, 0x92, 0xd8, 0xdb, 0xbb, 0x40, 0xf1, 0x84, 0xc9, + 0x78, 0x19, 0x38, 0x46, 0xa3, 0xce, 0xc5, 0x30, 0xba, 0x54, 0x13, 0x0e, 0x40, 0xf3, 0x04, 0xc7, + 0x8c, 0xb2, 0xb1, 0x70, 0x1a, 0xfd, 0xaa, 0x5a, 0x6d, 0xb5, 0x19, 0xdf, 0x19, 0x1f, 0xca, 0xa3, + 0xdd, 0x2f, 0xc1, 0x07, 0x57, 0x96, 0x83, 0x1d, 0x50, 0x9d, 0x92, 0x65, 0x3a, 0x67, 0xa4, 0x1e, + 0xe1, 0xfb, 0x60, 0x63, 0x81, 0x67, 0x09, 0xd1, 0x33, 0xb3, 0x51, 0x6a, 0x3c, 0xba, 0xb5, 0x6b, + 0x6d, 0xfd, 0x69, 0x81, 0x76, 0xe9, 0x6f, 0x2c, 0x28, 0x39, 0x81, 0x47, 0xa0, 0x61, 0xee, 0x8d, + 0xe6, 0x68, 0xed, 0xdc, 0xbb, 0x89, 0x02, 0x1a, 0x10, 0xb4, 0xd4, 0xab, 0x90, 0xdd, 0xc1, 0x8c, + 0x46, 0x9d, 0x86, 0xd8, 0x48, 0x64, 0x3e, 0x6e, 0x9f, 0xdc, 0x5c, 0xd4, 0x54, 0x80, 0xcc, 0x42, + 0x39, 0x53, 0x30, 0x38, 0x3d, 0x73, 0x2b, 0xaf, 0xce, 0xdc, 0xca, 0xeb, 0x33, 0xb7, 0xf2, 0xcb, + 0xda, 0xb5, 0x4e, 0xd7, 0xae, 0xf5, 0x6a, 0xed, 0x5a, 0xaf, 0xd7, 0xae, 0xf5, 0xd7, 0xda, 0xb5, + 0x7e, 0xfb, 0xdb, 0xad, 0x7c, 0x7f, 0x6b, 0xb1, 0xfd, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x62, + 0xcb, 0x64, 0xf1, 0x09, 0x09, 0x00, 0x00, } func (m *AdmissionRequest) Marshal() (dAtA []byte, err error) { @@ -370,6 +371,15 @@ func (m *AdmissionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Warnings) > 0 { + for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Warnings[iNdEx]) + copy(dAtA[i:], m.Warnings[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Warnings[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } if len(m.AuditAnnotations) > 0 { keysForAuditAnnotations := make([]string, 0, len(m.AuditAnnotations)) for k := range m.AuditAnnotations { @@ -567,6 +577,12 @@ func (m *AdmissionResponse) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -638,6 +654,7 @@ func (this *AdmissionResponse) String() string { `Patch:` + valueToStringGenerated(this.Patch) + `,`, `PatchType:` + valueToStringGenerated(this.PatchType) + `,`, `AuditAnnotations:` + mapStringForAuditAnnotations + `,`, + `Warnings:` + fmt.Sprintf("%v", this.Warnings) + `,`, `}`, }, "") return s @@ -1508,6 +1525,38 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { } m.AuditAnnotations[mapkey] = mapvalue iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.proto index 8d960a17d326..079ab09f21fb 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.proto +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/generated.proto @@ -145,6 +145,13 @@ message AdmissionResponse { // the admission webhook to add additional context to the audit log for this request. // +optional map auditAnnotations = 6; + + // warnings is a list of warning messages to return to the requesting API client. + // Warning messages describe a problem the client making the API request should correct or be aware of. + // Limit warnings to 120 characters if possible. + // Warnings over 256 characters and large numbers of warnings may be truncated. + // +optional + repeated string warnings = 7; } // AdmissionReview describes an admission review request/response. diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types.go index a40cb0d52e27..556fd1ad54d5 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types.go @@ -140,6 +140,13 @@ type AdmissionResponse struct { // the admission webhook to add additional context to the audit log for this request. // +optional AuditAnnotations map[string]string `json:"auditAnnotations,omitempty" protobuf:"bytes,6,opt,name=auditAnnotations"` + + // warnings is a list of warning messages to return to the requesting API client. + // Warning messages describe a problem the client making the API request should correct or be aware of. + // Limit warnings to 120 characters if possible. + // Warnings over 256 characters and large numbers of warnings may be truncated. + // +optional + Warnings []string `json:"warnings,omitempty" protobuf:"bytes,7,rep,name=warnings"` } // PatchType is the type of patch being used to represent the mutated object diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types_swagger_doc_generated.go index 62351b161774..f81594c9123a 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types_swagger_doc_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/types_swagger_doc_generated.go @@ -58,6 +58,7 @@ var map_AdmissionResponse = map[string]string{ "patch": "The patch body. Currently we only support \"JSONPatch\" which implements RFC 6902.", "patchType": "The type of Patch. Currently we only allow \"JSONPatch\".", "auditAnnotations": "AuditAnnotations is an unstructured key value map set by remote admission controller (e.g. error=image-blacklisted). MutatingAdmissionWebhook and ValidatingAdmissionWebhook admission controller will prefix the keys with admission webhook name (e.g. imagepolicy.example.com/error=image-blacklisted). AuditAnnotations will be provided by the admission webhook to add additional context to the audit log for this request.", + "warnings": "warnings is a list of warning messages to return to the requesting API client. Warning messages describe a problem the client making the API request should correct or be aware of. Limit warnings to 120 characters if possible. Warnings over 256 characters and large numbers of warnings may be truncated.", } func (AdmissionResponse) SwaggerDoc() map[string]string { diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/zz_generated.deepcopy.go index 42954ca42727..f7369471a8c2 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1/zz_generated.deepcopy.go @@ -87,6 +87,11 @@ func (in *AdmissionResponse) DeepCopyInto(out *AdmissionResponse) { (*out)[key] = val } } + if in.Warnings != nil { + in, out := &in.Warnings, &out.Warnings + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.pb.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.pb.go index d694203fc6e5..ae82ff5996e0 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.pb.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.pb.go @@ -143,64 +143,65 @@ func init() { } var fileDescriptor_b87c2352de86eab9 = []byte{ - // 902 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xd6, 0x8e, 0xed, 0x1d, 0x87, 0xda, 0x9d, 0x82, 0xb4, 0xb2, 0xd0, 0xda, 0xe4, 0x80, - 0x82, 0xd4, 0xcc, 0x92, 0x08, 0xaa, 0xa8, 0xe2, 0x92, 0x25, 0x11, 0x0a, 0x48, 0x4d, 0x34, 0xad, - 0x51, 0xe1, 0x80, 0x34, 0xf6, 0x4e, 0xed, 0xc5, 0xf6, 0xcc, 0xb2, 0x33, 0xeb, 0xe0, 0x1b, 0xe2, - 0xca, 0x85, 0x6f, 0xc0, 0x87, 0xe1, 0x92, 0x63, 0x8f, 0x3d, 0x59, 0xc4, 0x7c, 0x8b, 0x9c, 0xd0, - 0xcc, 0xce, 0x7a, 0xb7, 0x76, 0x02, 0xfd, 0xc3, 0xc9, 0xf3, 0xfe, 0xfc, 0x7e, 0xef, 0xf9, 0xf7, - 0x76, 0xde, 0x80, 0x93, 0xf1, 0xa1, 0x40, 0x21, 0xf7, 0xc6, 0x49, 0x9f, 0xc6, 0x8c, 0x4a, 0x2a, - 0xbc, 0x19, 0x65, 0x01, 0x8f, 0x3d, 0x13, 0x20, 0x51, 0xe8, 0x91, 0x60, 0x1a, 0x0a, 0x11, 0x72, - 0xe6, 0xcd, 0xf6, 0xfb, 0x54, 0x92, 0x7d, 0x6f, 0x48, 0x19, 0x8d, 0x89, 0xa4, 0x01, 0x8a, 0x62, - 0x2e, 0x39, 0xfc, 0x30, 0xcd, 0x46, 0x24, 0x0a, 0xd1, 0x2a, 0x1b, 0x99, 0xec, 0xf6, 0xde, 0x30, - 0x94, 0xa3, 0xa4, 0x8f, 0x06, 0x7c, 0xea, 0x0d, 0xf9, 0x90, 0x7b, 0x1a, 0xd4, 0x4f, 0x9e, 0x6b, - 0x4b, 0x1b, 0xfa, 0x94, 0x92, 0xb5, 0x1f, 0x14, 0x4b, 0x27, 0x72, 0x44, 0x99, 0x0c, 0x07, 0x44, - 0xa6, 0xf5, 0xd7, 0x4b, 0xb7, 0x3f, 0xcb, 0xb3, 0xa7, 0x64, 0x30, 0x0a, 0x19, 0x8d, 0xe7, 0x5e, - 0x34, 0x1e, 0x2a, 0x87, 0xf0, 0xa6, 0x54, 0x92, 0x9b, 0x50, 0xde, 0x6d, 0xa8, 0x38, 0x61, 0x32, - 0x9c, 0xd2, 0x0d, 0xc0, 0xc3, 0xff, 0x02, 0x88, 0xc1, 0x88, 0x4e, 0xc9, 0x3a, 0x6e, 0xe7, 0x0f, - 0x1b, 0xb4, 0x8e, 0x32, 0x45, 0x30, 0xfd, 0x29, 0xa1, 0x42, 0x42, 0x1f, 0x94, 0x93, 0x30, 0x70, - 0xac, 0xae, 0xb5, 0x6b, 0xfb, 0x9f, 0x5e, 0x2e, 0x3a, 0xa5, 0xe5, 0xa2, 0x53, 0xee, 0x9d, 0x1e, - 0x5f, 0x2f, 0x3a, 0x1f, 0xdd, 0x56, 0x48, 0xce, 0x23, 0x2a, 0x50, 0xef, 0xf4, 0x18, 0x2b, 0x30, - 0x7c, 0x06, 0x2a, 0xe3, 0x90, 0x05, 0xce, 0x9d, 0xae, 0xb5, 0xdb, 0x38, 0x78, 0x88, 0xf2, 0x09, - 0xac, 0x60, 0x28, 0x1a, 0x0f, 0x95, 0x43, 0x20, 0x25, 0x03, 0x9a, 0xed, 0xa3, 0xaf, 0x62, 0x9e, - 0x44, 0xdf, 0xd2, 0x58, 0x35, 0xf3, 0x4d, 0xc8, 0x02, 0x7f, 0xdb, 0x14, 0xaf, 0x28, 0x0b, 0x6b, - 0x46, 0x38, 0x02, 0xf5, 0x98, 0x0a, 0x9e, 0xc4, 0x03, 0xea, 0x94, 0x35, 0xfb, 0xa3, 0x37, 0x67, - 0xc7, 0x86, 0xc1, 0x6f, 0x99, 0x0a, 0xf5, 0xcc, 0x83, 0x57, 0xec, 0xf0, 0x73, 0xd0, 0x10, 0x49, - 0x3f, 0x0b, 0x38, 0x15, 0xad, 0xc7, 0x7d, 0x03, 0x68, 0x3c, 0xc9, 0x43, 0xb8, 0x98, 0x07, 0x43, - 0xd0, 0x88, 0x53, 0x25, 0x55, 0xd7, 0xce, 0x7b, 0xef, 0xa4, 0x40, 0x53, 0x95, 0xc2, 0x39, 0x1d, - 0x2e, 0x72, 0xc3, 0x39, 0x68, 0x1a, 0x73, 0xd5, 0xe5, 0xdd, 0x77, 0x96, 0xe4, 0xfe, 0x72, 0xd1, - 0x69, 0xe2, 0x57, 0x69, 0xf1, 0x7a, 0x1d, 0xf8, 0x35, 0x80, 0xc6, 0x55, 0x10, 0xc2, 0x69, 0x6a, - 0x8d, 0xda, 0x46, 0x23, 0x88, 0x37, 0x32, 0xf0, 0x0d, 0x28, 0xd8, 0x05, 0x15, 0x46, 0xa6, 0xd4, - 0xd9, 0xd2, 0xe8, 0xd5, 0xd0, 0x1f, 0x93, 0x29, 0xc5, 0x3a, 0x02, 0x3d, 0x60, 0xab, 0x5f, 0x11, - 0x91, 0x01, 0x75, 0xaa, 0x3a, 0xed, 0x9e, 0x49, 0xb3, 0x1f, 0x67, 0x01, 0x9c, 0xe7, 0xc0, 0x2f, - 0x80, 0xcd, 0x23, 0xf5, 0xa9, 0x87, 0x9c, 0x39, 0x35, 0x0d, 0x70, 0x33, 0xc0, 0x59, 0x16, 0xb8, - 0x2e, 0x1a, 0x38, 0x07, 0xc0, 0xa7, 0xa0, 0x9e, 0x08, 0x1a, 0x9f, 0xb2, 0xe7, 0xdc, 0xa9, 0x6b, - 0x41, 0x3f, 0x46, 0xc5, 0x1d, 0xf2, 0xca, 0xb5, 0x57, 0x42, 0xf6, 0x4c, 0x76, 0xfe, 0x3d, 0x65, - 0x1e, 0xbc, 0x62, 0x82, 0x3d, 0x50, 0xe5, 0xfd, 0x1f, 0xe9, 0x40, 0x3a, 0xb6, 0xe6, 0xdc, 0xbb, - 0x75, 0x48, 0xe6, 0xd6, 0x22, 0x4c, 0x2e, 0x4e, 0x7e, 0x96, 0x94, 0xa9, 0xf9, 0xf8, 0x77, 0x0d, - 0x75, 0xf5, 0x4c, 0x93, 0x60, 0x43, 0x06, 0x7f, 0x00, 0x36, 0x9f, 0x04, 0xa9, 0xd3, 0x01, 0x6f, - 0xc3, 0xbc, 0x92, 0xf2, 0x2c, 0xe3, 0xc1, 0x39, 0x25, 0xdc, 0x01, 0xd5, 0x20, 0x9e, 0xe3, 0x84, - 0x39, 0x8d, 0xae, 0xb5, 0x5b, 0xf7, 0x81, 0xea, 0xe1, 0x58, 0x7b, 0xb0, 0x89, 0xc0, 0x67, 0xa0, - 0xc6, 0x23, 0x25, 0x86, 0x70, 0xb6, 0xdf, 0xa6, 0x83, 0xa6, 0xe9, 0xa0, 0x76, 0x96, 0xb2, 0xe0, - 0x8c, 0x6e, 0xe7, 0xd7, 0x0a, 0xb8, 0x57, 0xd8, 0x50, 0x22, 0xe2, 0x4c, 0xd0, 0xff, 0x65, 0x45, - 0x7d, 0x02, 0x6a, 0x64, 0x32, 0xe1, 0x17, 0x34, 0xdd, 0x52, 0xf5, 0xbc, 0x89, 0xa3, 0xd4, 0x8d, - 0xb3, 0x38, 0x3c, 0x07, 0x55, 0x21, 0x89, 0x4c, 0x84, 0xd9, 0x38, 0x0f, 0x5e, 0xef, 0x7a, 0x3d, - 0xd1, 0x98, 0x54, 0x30, 0x4c, 0x45, 0x32, 0x91, 0xd8, 0xf0, 0xc0, 0x0e, 0xd8, 0x8a, 0x88, 0x1c, - 0x8c, 0xf4, 0x56, 0xd9, 0xf6, 0xed, 0xe5, 0xa2, 0xb3, 0x75, 0xae, 0x1c, 0x38, 0xf5, 0xc3, 0x43, - 0x60, 0xeb, 0xc3, 0xd3, 0x79, 0x94, 0x5d, 0x8c, 0xb6, 0x1a, 0xd1, 0x79, 0xe6, 0xbc, 0x2e, 0x1a, - 0x38, 0x4f, 0x86, 0xbf, 0x59, 0xa0, 0x45, 0x92, 0x20, 0x94, 0x47, 0x8c, 0x71, 0x49, 0xd2, 0xa9, - 0x54, 0xbb, 0xe5, 0xdd, 0xc6, 0xc1, 0x09, 0xfa, 0xb7, 0x97, 0x10, 0x6d, 0xe8, 0x8c, 0x8e, 0xd6, - 0x78, 0x4e, 0x98, 0x8c, 0xe7, 0xbe, 0x63, 0x84, 0x6a, 0xad, 0x87, 0xf1, 0x46, 0xe1, 0xf6, 0x97, - 0xe0, 0x83, 0x1b, 0x49, 0x60, 0x0b, 0x94, 0xc7, 0x74, 0x9e, 0x8e, 0x10, 0xab, 0x23, 0x7c, 0x1f, - 0x6c, 0xcd, 0xc8, 0x24, 0xa1, 0x7a, 0x1c, 0x36, 0x4e, 0x8d, 0x47, 0x77, 0x0e, 0xad, 0x9d, 0x3f, - 0x2d, 0xd0, 0x2c, 0x34, 0x37, 0x0b, 0xe9, 0x05, 0xec, 0x81, 0x9a, 0x59, 0x25, 0x9a, 0xa3, 0x71, - 0x80, 0x5e, 0xfb, 0xcf, 0x69, 0x94, 0xdf, 0x50, 0xa3, 0xce, 0xf6, 0x5c, 0xc6, 0x05, 0xbf, 0xd3, - 0xcf, 0x8b, 0xfe, 0xf7, 0xe6, 0xf1, 0xf2, 0xde, 0x50, 0x34, 0x7f, 0xdb, 0xbc, 0x27, 0xda, 0xc2, - 0x2b, 0x3a, 0x7f, 0xef, 0xf2, 0xca, 0x2d, 0xbd, 0xb8, 0x72, 0x4b, 0x2f, 0xaf, 0xdc, 0xd2, 0x2f, - 0x4b, 0xd7, 0xba, 0x5c, 0xba, 0xd6, 0x8b, 0xa5, 0x6b, 0xbd, 0x5c, 0xba, 0xd6, 0x5f, 0x4b, 0xd7, - 0xfa, 0xfd, 0x6f, 0xb7, 0xf4, 0x7d, 0xcd, 0x10, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0x8b, 0xd1, - 0x27, 0x74, 0xfd, 0x08, 0x00, 0x00, + // 925 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xcb, 0x6e, 0x23, 0x45, + 0x17, 0x76, 0x8f, 0x1d, 0xdb, 0x5d, 0xce, 0x3f, 0xf6, 0xd4, 0xfc, 0x48, 0x2d, 0x0b, 0xb5, 0x4d, + 0x16, 0xc8, 0x48, 0x93, 0x6a, 0x12, 0xc1, 0x28, 0x1a, 0xb1, 0x49, 0x93, 0x08, 0x05, 0xa4, 0x49, + 0x54, 0x33, 0x86, 0x81, 0x05, 0x52, 0xd9, 0xae, 0xb1, 0x1b, 0xdb, 0x55, 0x4d, 0x57, 0xb5, 0x83, + 0x77, 0xec, 0xd9, 0xf0, 0x06, 0xbc, 0x00, 0x6f, 0xc1, 0x26, 0xcb, 0x59, 0xce, 0xca, 0x22, 0xe6, + 0x2d, 0xb2, 0x42, 0x55, 0x5d, 0x7d, 0x19, 0x27, 0x81, 0xb9, 0xb0, 0x72, 0x9f, 0xcb, 0xf7, 0x9d, + 0xe3, 0xef, 0xf4, 0x39, 0x0d, 0x8e, 0xa7, 0x07, 0x02, 0x05, 0xdc, 0x9b, 0xc6, 0x03, 0x1a, 0x31, + 0x2a, 0xa9, 0xf0, 0x16, 0x94, 0x8d, 0x78, 0xe4, 0x99, 0x00, 0x09, 0x03, 0x8f, 0x8c, 0xe6, 0x81, + 0x10, 0x01, 0x67, 0xde, 0x62, 0x6f, 0x40, 0x25, 0xd9, 0xf3, 0xc6, 0x94, 0xd1, 0x88, 0x48, 0x3a, + 0x42, 0x61, 0xc4, 0x25, 0x87, 0xef, 0x27, 0xd9, 0x88, 0x84, 0x01, 0xca, 0xb2, 0x91, 0xc9, 0x6e, + 0xef, 0x8e, 0x03, 0x39, 0x89, 0x07, 0x68, 0xc8, 0xe7, 0xde, 0x98, 0x8f, 0xb9, 0xa7, 0x41, 0x83, + 0xf8, 0xb9, 0xb6, 0xb4, 0xa1, 0x9f, 0x12, 0xb2, 0xf6, 0x83, 0x62, 0xe9, 0x58, 0x4e, 0x28, 0x93, + 0xc1, 0x90, 0xc8, 0xa4, 0xfe, 0x66, 0xe9, 0xf6, 0x27, 0x79, 0xf6, 0x9c, 0x0c, 0x27, 0x01, 0xa3, + 0xd1, 0xd2, 0x0b, 0xa7, 0x63, 0xe5, 0x10, 0xde, 0x9c, 0x4a, 0x72, 0x13, 0xca, 0xbb, 0x0d, 0x15, + 0xc5, 0x4c, 0x06, 0x73, 0x7a, 0x0d, 0xf0, 0xf0, 0xdf, 0x00, 0x62, 0x38, 0xa1, 0x73, 0xb2, 0x89, + 0xdb, 0xf9, 0xcd, 0x06, 0xad, 0xc3, 0x54, 0x11, 0x4c, 0x7f, 0x8c, 0xa9, 0x90, 0xd0, 0x07, 0xe5, + 0x38, 0x18, 0x39, 0x56, 0xd7, 0xea, 0xd9, 0xfe, 0xc7, 0x17, 0xab, 0x4e, 0x69, 0xbd, 0xea, 0x94, + 0xfb, 0x27, 0x47, 0x57, 0xab, 0xce, 0x07, 0xb7, 0x15, 0x92, 0xcb, 0x90, 0x0a, 0xd4, 0x3f, 0x39, + 0xc2, 0x0a, 0x0c, 0x9f, 0x81, 0xca, 0x34, 0x60, 0x23, 0xe7, 0x4e, 0xd7, 0xea, 0x35, 0xf6, 0x1f, + 0xa2, 0x7c, 0x02, 0x19, 0x0c, 0x85, 0xd3, 0xb1, 0x72, 0x08, 0xa4, 0x64, 0x40, 0x8b, 0x3d, 0xf4, + 0x45, 0xc4, 0xe3, 0xf0, 0x6b, 0x1a, 0xa9, 0x66, 0xbe, 0x0a, 0xd8, 0xc8, 0xdf, 0x36, 0xc5, 0x2b, + 0xca, 0xc2, 0x9a, 0x11, 0x4e, 0x40, 0x3d, 0xa2, 0x82, 0xc7, 0xd1, 0x90, 0x3a, 0x65, 0xcd, 0xfe, + 0xe8, 0xcd, 0xd9, 0xb1, 0x61, 0xf0, 0x5b, 0xa6, 0x42, 0x3d, 0xf5, 0xe0, 0x8c, 0x1d, 0x7e, 0x0a, + 0x1a, 0x22, 0x1e, 0xa4, 0x01, 0xa7, 0xa2, 0xf5, 0xb8, 0x6f, 0x00, 0x8d, 0x27, 0x79, 0x08, 0x17, + 0xf3, 0x60, 0x00, 0x1a, 0x51, 0xa2, 0xa4, 0xea, 0xda, 0xf9, 0xdf, 0x3b, 0x29, 0xd0, 0x54, 0xa5, + 0x70, 0x4e, 0x87, 0x8b, 0xdc, 0x70, 0x09, 0x9a, 0xc6, 0xcc, 0xba, 0xbc, 0xfb, 0xce, 0x92, 0xdc, + 0x5f, 0xaf, 0x3a, 0x4d, 0xfc, 0x2a, 0x2d, 0xde, 0xac, 0x03, 0xbf, 0x04, 0xd0, 0xb8, 0x0a, 0x42, + 0x38, 0x4d, 0xad, 0x51, 0xdb, 0x68, 0x04, 0xf1, 0xb5, 0x0c, 0x7c, 0x03, 0x0a, 0x76, 0x41, 0x85, + 0x91, 0x39, 0x75, 0xb6, 0x34, 0x3a, 0x1b, 0xfa, 0x63, 0x32, 0xa7, 0x58, 0x47, 0xa0, 0x07, 0x6c, + 0xf5, 0x2b, 0x42, 0x32, 0xa4, 0x4e, 0x55, 0xa7, 0xdd, 0x33, 0x69, 0xf6, 0xe3, 0x34, 0x80, 0xf3, + 0x1c, 0xf8, 0x19, 0xb0, 0x79, 0xa8, 0x5e, 0xf5, 0x80, 0x33, 0xa7, 0xa6, 0x01, 0x6e, 0x0a, 0x38, + 0x4d, 0x03, 0x57, 0x45, 0x03, 0xe7, 0x00, 0xf8, 0x14, 0xd4, 0x63, 0x41, 0xa3, 0x13, 0xf6, 0x9c, + 0x3b, 0x75, 0x2d, 0xe8, 0x87, 0xa8, 0x78, 0x43, 0x5e, 0x59, 0x7b, 0x25, 0x64, 0xdf, 0x64, 0xe7, + 0xef, 0x53, 0xea, 0xc1, 0x19, 0x13, 0xec, 0x83, 0x2a, 0x1f, 0xfc, 0x40, 0x87, 0xd2, 0xb1, 0x35, + 0xe7, 0xee, 0xad, 0x43, 0x32, 0x5b, 0x8b, 0x30, 0x39, 0x3f, 0xfe, 0x49, 0x52, 0xa6, 0xe6, 0xe3, + 0xdf, 0x35, 0xd4, 0xd5, 0x53, 0x4d, 0x82, 0x0d, 0x19, 0xfc, 0x1e, 0xd8, 0x7c, 0x36, 0x4a, 0x9c, + 0x0e, 0x78, 0x1b, 0xe6, 0x4c, 0xca, 0xd3, 0x94, 0x07, 0xe7, 0x94, 0x70, 0x07, 0x54, 0x47, 0xd1, + 0x12, 0xc7, 0xcc, 0x69, 0x74, 0xad, 0x5e, 0xdd, 0x07, 0xaa, 0x87, 0x23, 0xed, 0xc1, 0x26, 0x02, + 0x9f, 0x81, 0x1a, 0x0f, 0x95, 0x18, 0xc2, 0xd9, 0x7e, 0x9b, 0x0e, 0x9a, 0xa6, 0x83, 0xda, 0x69, + 0xc2, 0x82, 0x53, 0xba, 0x9d, 0xdf, 0x2b, 0xe0, 0x5e, 0xe1, 0x42, 0x89, 0x90, 0x33, 0x41, 0xff, + 0x93, 0x13, 0xf5, 0x11, 0xa8, 0x91, 0xd9, 0x8c, 0x9f, 0xd3, 0xe4, 0x4a, 0xd5, 0xf3, 0x26, 0x0e, + 0x13, 0x37, 0x4e, 0xe3, 0xf0, 0x0c, 0x54, 0x85, 0x24, 0x32, 0x16, 0xe6, 0xe2, 0x3c, 0x78, 0xbd, + 0xf5, 0x7a, 0xa2, 0x31, 0x89, 0x60, 0x98, 0x8a, 0x78, 0x26, 0xb1, 0xe1, 0x81, 0x1d, 0xb0, 0x15, + 0x12, 0x39, 0x9c, 0xe8, 0xab, 0xb2, 0xed, 0xdb, 0xeb, 0x55, 0x67, 0xeb, 0x4c, 0x39, 0x70, 0xe2, + 0x87, 0x07, 0xc0, 0xd6, 0x0f, 0x4f, 0x97, 0x61, 0xba, 0x18, 0x6d, 0x35, 0xa2, 0xb3, 0xd4, 0x79, + 0x55, 0x34, 0x70, 0x9e, 0x0c, 0x7f, 0xb1, 0x40, 0x8b, 0xc4, 0xa3, 0x40, 0x1e, 0x32, 0xc6, 0x25, + 0x49, 0xa6, 0x52, 0xed, 0x96, 0x7b, 0x8d, 0xfd, 0x63, 0xf4, 0x4f, 0x5f, 0x42, 0x74, 0x4d, 0x67, + 0x74, 0xb8, 0xc1, 0x73, 0xcc, 0x64, 0xb4, 0xf4, 0x1d, 0x23, 0x54, 0x6b, 0x33, 0x8c, 0xaf, 0x15, + 0x86, 0x3d, 0x50, 0x3f, 0x27, 0x11, 0x0b, 0xd8, 0x58, 0x38, 0xb5, 0x6e, 0x59, 0xed, 0xb7, 0x5a, + 0x8f, 0x6f, 0x8c, 0x0f, 0x67, 0xd1, 0xf6, 0xe7, 0xe0, 0xbd, 0x1b, 0xcb, 0xc1, 0x16, 0x28, 0x4f, + 0xe9, 0x32, 0x19, 0x36, 0x56, 0x8f, 0xf0, 0xff, 0x60, 0x6b, 0x41, 0x66, 0x31, 0xd5, 0x83, 0xb3, + 0x71, 0x62, 0x3c, 0xba, 0x73, 0x60, 0xed, 0xfc, 0x61, 0x81, 0x66, 0xe1, 0x6f, 0x2c, 0x02, 0x7a, + 0x0e, 0xfb, 0xa0, 0x66, 0x8e, 0x8e, 0xe6, 0x68, 0xec, 0xa3, 0xd7, 0x96, 0x41, 0xa3, 0xfc, 0x86, + 0x7a, 0x29, 0xd2, 0x8b, 0x98, 0x72, 0xc1, 0x6f, 0xf5, 0x87, 0x48, 0xeb, 0x64, 0x3e, 0x73, 0xde, + 0x1b, 0xca, 0x9b, 0x48, 0x91, 0x5a, 0x38, 0xa3, 0xf3, 0x77, 0x2f, 0x2e, 0xdd, 0xd2, 0x8b, 0x4b, + 0xb7, 0xf4, 0xf2, 0xd2, 0x2d, 0xfd, 0xbc, 0x76, 0xad, 0x8b, 0xb5, 0x6b, 0xbd, 0x58, 0xbb, 0xd6, + 0xcb, 0xb5, 0x6b, 0xfd, 0xb9, 0x76, 0xad, 0x5f, 0xff, 0x72, 0x4b, 0xdf, 0xd5, 0x0c, 0xf1, 0xdf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x6c, 0x23, 0xa1, 0xd9, 0x27, 0x09, 0x00, 0x00, } func (m *AdmissionRequest) Marshal() (dAtA []byte, err error) { @@ -370,6 +371,15 @@ func (m *AdmissionResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Warnings) > 0 { + for iNdEx := len(m.Warnings) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Warnings[iNdEx]) + copy(dAtA[i:], m.Warnings[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Warnings[iNdEx]))) + i-- + dAtA[i] = 0x3a + } + } if len(m.AuditAnnotations) > 0 { keysForAuditAnnotations := make([]string, 0, len(m.AuditAnnotations)) for k := range m.AuditAnnotations { @@ -567,6 +577,12 @@ func (m *AdmissionResponse) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.Warnings) > 0 { + for _, s := range m.Warnings { + l = len(s) + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -638,6 +654,7 @@ func (this *AdmissionResponse) String() string { `Patch:` + valueToStringGenerated(this.Patch) + `,`, `PatchType:` + valueToStringGenerated(this.PatchType) + `,`, `AuditAnnotations:` + mapStringForAuditAnnotations + `,`, + `Warnings:` + fmt.Sprintf("%v", this.Warnings) + `,`, `}`, }, "") return s @@ -1508,6 +1525,38 @@ func (m *AdmissionResponse) Unmarshal(dAtA []byte) error { } m.AuditAnnotations[mapkey] = mapvalue iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Warnings", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Warnings = append(m.Warnings, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.proto index 6999b80c27a0..2683850378c4 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.proto +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/generated.proto @@ -145,6 +145,13 @@ message AdmissionResponse { // the admission webhook to add additional context to the audit log for this request. // +optional map auditAnnotations = 6; + + // warnings is a list of warning messages to return to the requesting API client. + // Warning messages describe a problem the client making the API request should correct or be aware of. + // Limit warnings to 120 characters if possible. + // Warnings over 256 characters and large numbers of warnings may be truncated. + // +optional + repeated string warnings = 7; } // AdmissionReview describes an admission review request/response. diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types.go index 92017b345ff5..00c619d9986c 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types.go @@ -145,6 +145,13 @@ type AdmissionResponse struct { // the admission webhook to add additional context to the audit log for this request. // +optional AuditAnnotations map[string]string `json:"auditAnnotations,omitempty" protobuf:"bytes,6,opt,name=auditAnnotations"` + + // warnings is a list of warning messages to return to the requesting API client. + // Warning messages describe a problem the client making the API request should correct or be aware of. + // Limit warnings to 120 characters if possible. + // Warnings over 256 characters and large numbers of warnings may be truncated. + // +optional + Warnings []string `json:"warnings,omitempty" protobuf:"bytes,7,rep,name=warnings"` } // PatchType is the type of patch being used to represent the mutated object diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go index 2ef98db8729f..13067ad80d58 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/types_swagger_doc_generated.go @@ -58,6 +58,7 @@ var map_AdmissionResponse = map[string]string{ "patch": "The patch body. Currently we only support \"JSONPatch\" which implements RFC 6902.", "patchType": "The type of Patch. Currently we only allow \"JSONPatch\".", "auditAnnotations": "AuditAnnotations is an unstructured key value map set by remote admission controller (e.g. error=image-blacklisted). MutatingAdmissionWebhook and ValidatingAdmissionWebhook admission controller will prefix the keys with admission webhook name (e.g. imagepolicy.example.com/error=image-blacklisted). AuditAnnotations will be provided by the admission webhook to add additional context to the audit log for this request.", + "warnings": "warnings is a list of warning messages to return to the requesting API client. Warning messages describe a problem the client making the API request should correct or be aware of. Limit warnings to 120 characters if possible. Warnings over 256 characters and large numbers of warnings may be truncated.", } func (AdmissionResponse) SwaggerDoc() map[string]string { diff --git a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go index e4704c86dd31..4f3dd45beaa9 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/api/admission/v1beta1/zz_generated.deepcopy.go @@ -87,6 +87,11 @@ func (in *AdmissionResponse) DeepCopyInto(out *AdmissionResponse) { (*out)[key] = val } } + if in.Warnings != nil { + in, out := &in.Warnings, &out.Warnings + *out = make([]string, len(*in)) + copy(*out, *in) + } return } diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/annotation_key_constants.go b/cluster-autoscaler/vendor/k8s.io/api/core/v1/annotation_key_constants.go index 14f9ab965290..d3ebf862836a 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/annotation_key_constants.go +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/annotation_key_constants.go @@ -39,15 +39,24 @@ const ( // SeccompPodAnnotationKey represents the key of a seccomp profile applied // to all containers of a pod. + // Deprecated: set a pod security context `seccompProfile` field. SeccompPodAnnotationKey string = "seccomp.security.alpha.kubernetes.io/pod" // SeccompContainerAnnotationKeyPrefix represents the key of a seccomp profile applied // to one container of a pod. + // Deprecated: set a container security context `seccompProfile` field. SeccompContainerAnnotationKeyPrefix string = "container.seccomp.security.alpha.kubernetes.io/" // SeccompProfileRuntimeDefault represents the default seccomp profile used by container runtime. + // Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead. SeccompProfileRuntimeDefault string = "runtime/default" + // SeccompProfileNameUnconfined is the unconfined seccomp profile. + SeccompProfileNameUnconfined string = "unconfined" + + // SeccompLocalhostProfileNamePrefix is the prefix for specifying profiles loaded from the node's disk. + SeccompLocalhostProfileNamePrefix = "localhost/" + // AppArmorBetaContainerAnnotationKeyPrefix is the prefix to an annotation key specifying a container's apparmor profile. AppArmorBetaContainerAnnotationKeyPrefix = "container.apparmor.security.beta.kubernetes.io/" // AppArmorBetaDefaultProfileAnnotatoinKey is the annotation key specifying the default AppArmor profile. @@ -65,7 +74,7 @@ const ( AppArmorBetaProfileNameUnconfined = "unconfined" // DeprecatedSeccompProfileDockerDefault represents the default seccomp profile used by docker. - // This is now deprecated and should be replaced by SeccompProfileRuntimeDefault. + // Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead. DeprecatedSeccompProfileDockerDefault string = "docker/default" // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized) diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.pb.go b/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.pb.go index ea138ca67ce6..4de17ea5f121 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.pb.go +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.pb.go @@ -4697,10 +4697,38 @@ func (m *ScopedResourceSelectorRequirement) XXX_DiscardUnknown() { var xxx_messageInfo_ScopedResourceSelectorRequirement proto.InternalMessageInfo +func (m *SeccompProfile) Reset() { *m = SeccompProfile{} } +func (*SeccompProfile) ProtoMessage() {} +func (*SeccompProfile) Descriptor() ([]byte, []int) { + return fileDescriptor_83c10c24ec417dc9, []int{166} +} +func (m *SeccompProfile) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SeccompProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *SeccompProfile) XXX_Merge(src proto.Message) { + xxx_messageInfo_SeccompProfile.Merge(m, src) +} +func (m *SeccompProfile) XXX_Size() int { + return m.Size() +} +func (m *SeccompProfile) XXX_DiscardUnknown() { + xxx_messageInfo_SeccompProfile.DiscardUnknown(m) +} + +var xxx_messageInfo_SeccompProfile proto.InternalMessageInfo + func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} func (*Secret) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{166} + return fileDescriptor_83c10c24ec417dc9, []int{167} } func (m *Secret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4728,7 +4756,7 @@ var xxx_messageInfo_Secret proto.InternalMessageInfo func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} func (*SecretEnvSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{167} + return fileDescriptor_83c10c24ec417dc9, []int{168} } func (m *SecretEnvSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4756,7 +4784,7 @@ var xxx_messageInfo_SecretEnvSource proto.InternalMessageInfo func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} func (*SecretKeySelector) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{168} + return fileDescriptor_83c10c24ec417dc9, []int{169} } func (m *SecretKeySelector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4784,7 +4812,7 @@ var xxx_messageInfo_SecretKeySelector proto.InternalMessageInfo func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} func (*SecretList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{169} + return fileDescriptor_83c10c24ec417dc9, []int{170} } func (m *SecretList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4812,7 +4840,7 @@ var xxx_messageInfo_SecretList proto.InternalMessageInfo func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} func (*SecretProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{170} + return fileDescriptor_83c10c24ec417dc9, []int{171} } func (m *SecretProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4840,7 +4868,7 @@ var xxx_messageInfo_SecretProjection proto.InternalMessageInfo func (m *SecretReference) Reset() { *m = SecretReference{} } func (*SecretReference) ProtoMessage() {} func (*SecretReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{171} + return fileDescriptor_83c10c24ec417dc9, []int{172} } func (m *SecretReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4868,7 +4896,7 @@ var xxx_messageInfo_SecretReference proto.InternalMessageInfo func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} func (*SecretVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{172} + return fileDescriptor_83c10c24ec417dc9, []int{173} } func (m *SecretVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4896,7 +4924,7 @@ var xxx_messageInfo_SecretVolumeSource proto.InternalMessageInfo func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} func (*SecurityContext) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{173} + return fileDescriptor_83c10c24ec417dc9, []int{174} } func (m *SecurityContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4924,7 +4952,7 @@ var xxx_messageInfo_SecurityContext proto.InternalMessageInfo func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} func (*SerializedReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{174} + return fileDescriptor_83c10c24ec417dc9, []int{175} } func (m *SerializedReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4952,7 +4980,7 @@ var xxx_messageInfo_SerializedReference proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{175} + return fileDescriptor_83c10c24ec417dc9, []int{176} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4980,7 +5008,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} func (*ServiceAccount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{176} + return fileDescriptor_83c10c24ec417dc9, []int{177} } func (m *ServiceAccount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5008,7 +5036,7 @@ var xxx_messageInfo_ServiceAccount proto.InternalMessageInfo func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} func (*ServiceAccountList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{177} + return fileDescriptor_83c10c24ec417dc9, []int{178} } func (m *ServiceAccountList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5036,7 +5064,7 @@ var xxx_messageInfo_ServiceAccountList proto.InternalMessageInfo func (m *ServiceAccountTokenProjection) Reset() { *m = ServiceAccountTokenProjection{} } func (*ServiceAccountTokenProjection) ProtoMessage() {} func (*ServiceAccountTokenProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{178} + return fileDescriptor_83c10c24ec417dc9, []int{179} } func (m *ServiceAccountTokenProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5064,7 +5092,7 @@ var xxx_messageInfo_ServiceAccountTokenProjection proto.InternalMessageInfo func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} func (*ServiceList) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{179} + return fileDescriptor_83c10c24ec417dc9, []int{180} } func (m *ServiceList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5092,7 +5120,7 @@ var xxx_messageInfo_ServiceList proto.InternalMessageInfo func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} func (*ServicePort) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{180} + return fileDescriptor_83c10c24ec417dc9, []int{181} } func (m *ServicePort) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5120,7 +5148,7 @@ var xxx_messageInfo_ServicePort proto.InternalMessageInfo func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{181} + return fileDescriptor_83c10c24ec417dc9, []int{182} } func (m *ServiceProxyOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5148,7 +5176,7 @@ var xxx_messageInfo_ServiceProxyOptions proto.InternalMessageInfo func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} func (*ServiceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{182} + return fileDescriptor_83c10c24ec417dc9, []int{183} } func (m *ServiceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5176,7 +5204,7 @@ var xxx_messageInfo_ServiceSpec proto.InternalMessageInfo func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} func (*ServiceStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{183} + return fileDescriptor_83c10c24ec417dc9, []int{184} } func (m *ServiceStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5204,7 +5232,7 @@ var xxx_messageInfo_ServiceStatus proto.InternalMessageInfo func (m *SessionAffinityConfig) Reset() { *m = SessionAffinityConfig{} } func (*SessionAffinityConfig) ProtoMessage() {} func (*SessionAffinityConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{184} + return fileDescriptor_83c10c24ec417dc9, []int{185} } func (m *SessionAffinityConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5232,7 +5260,7 @@ var xxx_messageInfo_SessionAffinityConfig proto.InternalMessageInfo func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{185} + return fileDescriptor_83c10c24ec417dc9, []int{186} } func (m *StorageOSPersistentVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5260,7 +5288,7 @@ var xxx_messageInfo_StorageOSPersistentVolumeSource proto.InternalMessageInfo func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{186} + return fileDescriptor_83c10c24ec417dc9, []int{187} } func (m *StorageOSVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5288,7 +5316,7 @@ var xxx_messageInfo_StorageOSVolumeSource proto.InternalMessageInfo func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} func (*Sysctl) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{187} + return fileDescriptor_83c10c24ec417dc9, []int{188} } func (m *Sysctl) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5316,7 +5344,7 @@ var xxx_messageInfo_Sysctl proto.InternalMessageInfo func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} func (*TCPSocketAction) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{188} + return fileDescriptor_83c10c24ec417dc9, []int{189} } func (m *TCPSocketAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5344,7 +5372,7 @@ var xxx_messageInfo_TCPSocketAction proto.InternalMessageInfo func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} func (*Taint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{189} + return fileDescriptor_83c10c24ec417dc9, []int{190} } func (m *Taint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5372,7 +5400,7 @@ var xxx_messageInfo_Taint proto.InternalMessageInfo func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} func (*Toleration) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{190} + return fileDescriptor_83c10c24ec417dc9, []int{191} } func (m *Toleration) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5400,7 +5428,7 @@ var xxx_messageInfo_Toleration proto.InternalMessageInfo func (m *TopologySelectorLabelRequirement) Reset() { *m = TopologySelectorLabelRequirement{} } func (*TopologySelectorLabelRequirement) ProtoMessage() {} func (*TopologySelectorLabelRequirement) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{191} + return fileDescriptor_83c10c24ec417dc9, []int{192} } func (m *TopologySelectorLabelRequirement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5428,7 +5456,7 @@ var xxx_messageInfo_TopologySelectorLabelRequirement proto.InternalMessageInfo func (m *TopologySelectorTerm) Reset() { *m = TopologySelectorTerm{} } func (*TopologySelectorTerm) ProtoMessage() {} func (*TopologySelectorTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{192} + return fileDescriptor_83c10c24ec417dc9, []int{193} } func (m *TopologySelectorTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5456,7 +5484,7 @@ var xxx_messageInfo_TopologySelectorTerm proto.InternalMessageInfo func (m *TopologySpreadConstraint) Reset() { *m = TopologySpreadConstraint{} } func (*TopologySpreadConstraint) ProtoMessage() {} func (*TopologySpreadConstraint) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{193} + return fileDescriptor_83c10c24ec417dc9, []int{194} } func (m *TopologySpreadConstraint) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5484,7 +5512,7 @@ var xxx_messageInfo_TopologySpreadConstraint proto.InternalMessageInfo func (m *TypedLocalObjectReference) Reset() { *m = TypedLocalObjectReference{} } func (*TypedLocalObjectReference) ProtoMessage() {} func (*TypedLocalObjectReference) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{194} + return fileDescriptor_83c10c24ec417dc9, []int{195} } func (m *TypedLocalObjectReference) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5512,7 +5540,7 @@ var xxx_messageInfo_TypedLocalObjectReference proto.InternalMessageInfo func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} func (*Volume) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{195} + return fileDescriptor_83c10c24ec417dc9, []int{196} } func (m *Volume) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5540,7 +5568,7 @@ var xxx_messageInfo_Volume proto.InternalMessageInfo func (m *VolumeDevice) Reset() { *m = VolumeDevice{} } func (*VolumeDevice) ProtoMessage() {} func (*VolumeDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{196} + return fileDescriptor_83c10c24ec417dc9, []int{197} } func (m *VolumeDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5568,7 +5596,7 @@ var xxx_messageInfo_VolumeDevice proto.InternalMessageInfo func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} func (*VolumeMount) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{197} + return fileDescriptor_83c10c24ec417dc9, []int{198} } func (m *VolumeMount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5596,7 +5624,7 @@ var xxx_messageInfo_VolumeMount proto.InternalMessageInfo func (m *VolumeNodeAffinity) Reset() { *m = VolumeNodeAffinity{} } func (*VolumeNodeAffinity) ProtoMessage() {} func (*VolumeNodeAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{198} + return fileDescriptor_83c10c24ec417dc9, []int{199} } func (m *VolumeNodeAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5624,7 +5652,7 @@ var xxx_messageInfo_VolumeNodeAffinity proto.InternalMessageInfo func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} func (*VolumeProjection) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{199} + return fileDescriptor_83c10c24ec417dc9, []int{200} } func (m *VolumeProjection) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5652,7 +5680,7 @@ var xxx_messageInfo_VolumeProjection proto.InternalMessageInfo func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} func (*VolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{200} + return fileDescriptor_83c10c24ec417dc9, []int{201} } func (m *VolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5680,7 +5708,7 @@ var xxx_messageInfo_VolumeSource proto.InternalMessageInfo func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{201} + return fileDescriptor_83c10c24ec417dc9, []int{202} } func (m *VsphereVirtualDiskVolumeSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5708,7 +5736,7 @@ var xxx_messageInfo_VsphereVirtualDiskVolumeSource proto.InternalMessageInfo func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{202} + return fileDescriptor_83c10c24ec417dc9, []int{203} } func (m *WeightedPodAffinityTerm) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5736,7 +5764,7 @@ var xxx_messageInfo_WeightedPodAffinityTerm proto.InternalMessageInfo func (m *WindowsSecurityContextOptions) Reset() { *m = WindowsSecurityContextOptions{} } func (*WindowsSecurityContextOptions) ProtoMessage() {} func (*WindowsSecurityContextOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_83c10c24ec417dc9, []int{203} + return fileDescriptor_83c10c24ec417dc9, []int{204} } func (m *WindowsSecurityContextOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -5952,6 +5980,7 @@ func init() { proto.RegisterType((*ScaleIOVolumeSource)(nil), "k8s.io.api.core.v1.ScaleIOVolumeSource") proto.RegisterType((*ScopeSelector)(nil), "k8s.io.api.core.v1.ScopeSelector") proto.RegisterType((*ScopedResourceSelectorRequirement)(nil), "k8s.io.api.core.v1.ScopedResourceSelectorRequirement") + proto.RegisterType((*SeccompProfile)(nil), "k8s.io.api.core.v1.SeccompProfile") proto.RegisterType((*Secret)(nil), "k8s.io.api.core.v1.Secret") proto.RegisterMapType((map[string][]byte)(nil), "k8s.io.api.core.v1.Secret.DataEntry") proto.RegisterMapType((map[string]string)(nil), "k8s.io.api.core.v1.Secret.StringDataEntry") @@ -6000,866 +6029,871 @@ func init() { } var fileDescriptor_83c10c24ec417dc9 = []byte{ - // 13736 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x57, - 0x76, 0x18, 0xbc, 0x3d, 0x83, 0xc7, 0xcc, 0xc1, 0xfb, 0x82, 0xa4, 0x40, 0x88, 0x24, 0xa8, 0xe6, - 0x2e, 0x45, 0xad, 0x24, 0x70, 0x45, 0x49, 0x2b, 0x59, 0xd2, 0xca, 0x06, 0x30, 0x00, 0x39, 0x22, - 0x01, 0x8e, 0xee, 0x80, 0xe4, 0xae, 0xac, 0xdd, 0x6f, 0x1b, 0x33, 0x17, 0x40, 0x0b, 0x33, 0xdd, - 0xa3, 0xee, 0x1e, 0x80, 0xd0, 0x67, 0xd7, 0xe7, 0x6f, 0xfd, 0xdc, 0xcf, 0xf6, 0x57, 0x9b, 0x94, - 0x2b, 0x0f, 0xdb, 0xe5, 0x4a, 0x39, 0x4e, 0xd9, 0x1b, 0x27, 0xa9, 0x38, 0x76, 0x6c, 0xc7, 0xeb, - 0xc4, 0x8e, 0x9d, 0xa4, 0x9c, 0xfc, 0x70, 0x1c, 0x57, 0x92, 0x75, 0x95, 0x2b, 0x88, 0x4d, 0xa7, - 0xe2, 0xda, 0x1f, 0xb1, 0x5d, 0xb1, 0xf3, 0x23, 0x88, 0x2b, 0x4e, 0xdd, 0x67, 0xdf, 0xdb, 0xd3, - 0x3d, 0x33, 0xa0, 0x40, 0xac, 0xbc, 0xa5, 0x7f, 0x33, 0xf7, 0x9c, 0x7b, 0xee, 0xed, 0xfb, 0x38, - 0xf7, 0xdc, 0x73, 0xcf, 0x03, 0x5e, 0xdd, 0x79, 0x39, 0x9c, 0x77, 0xfd, 0xab, 0x3b, 0xed, 0x0d, - 0x12, 0x78, 0x24, 0x22, 0xe1, 0xd5, 0x5d, 0xe2, 0xd5, 0xfd, 0xe0, 0xaa, 0x00, 0x38, 0x2d, 0xf7, - 0x6a, 0xcd, 0x0f, 0xc8, 0xd5, 0xdd, 0xe7, 0xae, 0x6e, 0x11, 0x8f, 0x04, 0x4e, 0x44, 0xea, 0xf3, - 0xad, 0xc0, 0x8f, 0x7c, 0x84, 0x38, 0xce, 0xbc, 0xd3, 0x72, 0xe7, 0x29, 0xce, 0xfc, 0xee, 0x73, - 0xb3, 0xcf, 0x6e, 0xb9, 0xd1, 0x76, 0x7b, 0x63, 0xbe, 0xe6, 0x37, 0xaf, 0x6e, 0xf9, 0x5b, 0xfe, - 0x55, 0x86, 0xba, 0xd1, 0xde, 0x64, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7d, 0x21, 0x6e, - 0xa6, 0xe9, 0xd4, 0xb6, 0x5d, 0x8f, 0x04, 0xfb, 0x57, 0x5b, 0x3b, 0x5b, 0xac, 0xdd, 0x80, 0x84, - 0x7e, 0x3b, 0xa8, 0x91, 0x64, 0xc3, 0x5d, 0x6b, 0x85, 0x57, 0x9b, 0x24, 0x72, 0x52, 0xba, 0x3b, - 0x7b, 0x35, 0xab, 0x56, 0xd0, 0xf6, 0x22, 0xb7, 0xd9, 0xd9, 0xcc, 0x27, 0x7b, 0x55, 0x08, 0x6b, - 0xdb, 0xa4, 0xe9, 0x74, 0xd4, 0x7b, 0x3e, 0xab, 0x5e, 0x3b, 0x72, 0x1b, 0x57, 0x5d, 0x2f, 0x0a, - 0xa3, 0x20, 0x59, 0xc9, 0xfe, 0xaa, 0x05, 0x17, 0x17, 0xee, 0x55, 0x97, 0x1b, 0x4e, 0x18, 0xb9, - 0xb5, 0xc5, 0x86, 0x5f, 0xdb, 0xa9, 0x46, 0x7e, 0x40, 0xee, 0xfa, 0x8d, 0x76, 0x93, 0x54, 0xd9, - 0x40, 0xa0, 0x67, 0xa0, 0xb0, 0xcb, 0xfe, 0x97, 0x4b, 0x33, 0xd6, 0x45, 0xeb, 0x4a, 0x71, 0x71, - 0xf2, 0x37, 0x0e, 0xe6, 0x3e, 0xf2, 0xe0, 0x60, 0xae, 0x70, 0x57, 0x94, 0x63, 0x85, 0x81, 0x2e, - 0xc3, 0xd0, 0x66, 0xb8, 0xbe, 0xdf, 0x22, 0x33, 0x39, 0x86, 0x3b, 0x2e, 0x70, 0x87, 0x56, 0xaa, - 0xb4, 0x14, 0x0b, 0x28, 0xba, 0x0a, 0xc5, 0x96, 0x13, 0x44, 0x6e, 0xe4, 0xfa, 0xde, 0x4c, 0xfe, - 0xa2, 0x75, 0x65, 0x70, 0x71, 0x4a, 0xa0, 0x16, 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, - 0x38, 0xf5, 0xdb, 0x5e, 0x63, 0x7f, 0x66, 0xe0, 0xa2, 0x75, 0xa5, 0x10, 0x77, 0x03, 0x8b, 0x72, - 0xac, 0x30, 0xec, 0x1f, 0xce, 0x41, 0x61, 0x61, 0x73, 0xd3, 0xf5, 0xdc, 0x68, 0x1f, 0xdd, 0x85, - 0x51, 0xcf, 0xaf, 0x13, 0xf9, 0x9f, 0x7d, 0xc5, 0xc8, 0xb5, 0x8b, 0xf3, 0x9d, 0x4b, 0x69, 0x7e, - 0x4d, 0xc3, 0x5b, 0x9c, 0x7c, 0x70, 0x30, 0x37, 0xaa, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xd2, - 0xf2, 0xeb, 0x8a, 0x6c, 0x8e, 0x91, 0x9d, 0x4b, 0x23, 0x5b, 0x89, 0xd1, 0x16, 0x27, 0x1e, 0x1c, - 0xcc, 0x8d, 0x68, 0x05, 0x58, 0x27, 0x82, 0x36, 0x60, 0x82, 0xfe, 0xf5, 0x22, 0x57, 0xd1, 0xcd, - 0x33, 0xba, 0x97, 0xb2, 0xe8, 0x6a, 0xa8, 0x8b, 0xd3, 0x0f, 0x0e, 0xe6, 0x26, 0x12, 0x85, 0x38, - 0x49, 0xd0, 0x7e, 0x0f, 0xc6, 0x17, 0xa2, 0xc8, 0xa9, 0x6d, 0x93, 0x3a, 0x9f, 0x41, 0xf4, 0x02, - 0x0c, 0x78, 0x4e, 0x93, 0x88, 0xf9, 0xbd, 0x28, 0x06, 0x76, 0x60, 0xcd, 0x69, 0x92, 0xc3, 0x83, - 0xb9, 0xc9, 0x3b, 0x9e, 0xfb, 0x6e, 0x5b, 0xac, 0x0a, 0x5a, 0x86, 0x19, 0x36, 0xba, 0x06, 0x50, - 0x27, 0xbb, 0x6e, 0x8d, 0x54, 0x9c, 0x68, 0x5b, 0xcc, 0x37, 0x12, 0x75, 0xa1, 0xa4, 0x20, 0x58, - 0xc3, 0xb2, 0xef, 0x43, 0x71, 0x61, 0xd7, 0x77, 0xeb, 0x15, 0xbf, 0x1e, 0xa2, 0x1d, 0x98, 0x68, - 0x05, 0x64, 0x93, 0x04, 0xaa, 0x68, 0xc6, 0xba, 0x98, 0xbf, 0x32, 0x72, 0xed, 0x4a, 0xea, 0xc7, - 0x9a, 0xa8, 0xcb, 0x5e, 0x14, 0xec, 0x2f, 0x3e, 0x26, 0xda, 0x9b, 0x48, 0x40, 0x71, 0x92, 0xb2, - 0xfd, 0x2f, 0x72, 0x70, 0x7a, 0xe1, 0xbd, 0x76, 0x40, 0x4a, 0x6e, 0xb8, 0x93, 0x5c, 0xe1, 0x75, - 0x37, 0xdc, 0x59, 0x8b, 0x47, 0x40, 0x2d, 0xad, 0x92, 0x28, 0xc7, 0x0a, 0x03, 0x3d, 0x0b, 0xc3, - 0xf4, 0xf7, 0x1d, 0x5c, 0x16, 0x9f, 0x3c, 0x2d, 0x90, 0x47, 0x4a, 0x4e, 0xe4, 0x94, 0x38, 0x08, - 0x4b, 0x1c, 0xb4, 0x0a, 0x23, 0x35, 0xb6, 0x21, 0xb7, 0x56, 0xfd, 0x3a, 0x61, 0x93, 0x59, 0x5c, - 0x7c, 0x9a, 0xa2, 0x2f, 0xc5, 0xc5, 0x87, 0x07, 0x73, 0x33, 0xbc, 0x6f, 0x82, 0x84, 0x06, 0xc3, - 0x7a, 0x7d, 0x64, 0xab, 0xfd, 0x35, 0xc0, 0x28, 0x41, 0xca, 0xde, 0xba, 0xa2, 0x6d, 0x95, 0x41, - 0xb6, 0x55, 0x46, 0xd3, 0xb7, 0x09, 0x7a, 0x0e, 0x06, 0x76, 0x5c, 0xaf, 0x3e, 0x33, 0xc4, 0x68, - 0x9d, 0xa7, 0x73, 0x7e, 0xd3, 0xf5, 0xea, 0x87, 0x07, 0x73, 0x53, 0x46, 0x77, 0x68, 0x21, 0x66, - 0xa8, 0xf6, 0x9f, 0x5a, 0x30, 0xc7, 0x60, 0x2b, 0x6e, 0x83, 0x54, 0x48, 0x10, 0xba, 0x61, 0x44, - 0xbc, 0xc8, 0x18, 0xd0, 0x6b, 0x00, 0x21, 0xa9, 0x05, 0x24, 0xd2, 0x86, 0x54, 0x2d, 0x8c, 0xaa, - 0x82, 0x60, 0x0d, 0x8b, 0x32, 0x84, 0x70, 0xdb, 0x09, 0xd8, 0xfa, 0x12, 0x03, 0xab, 0x18, 0x42, - 0x55, 0x02, 0x70, 0x8c, 0x63, 0x30, 0x84, 0x7c, 0x2f, 0x86, 0x80, 0x3e, 0x05, 0x13, 0x71, 0x63, - 0x61, 0xcb, 0xa9, 0xc9, 0x01, 0x64, 0x5b, 0xa6, 0x6a, 0x82, 0x70, 0x12, 0xd7, 0xfe, 0xbb, 0x96, - 0x58, 0x3c, 0xf4, 0xab, 0x3f, 0xe0, 0xdf, 0x6a, 0xff, 0xa2, 0x05, 0xc3, 0x8b, 0xae, 0x57, 0x77, - 0xbd, 0x2d, 0xf4, 0x79, 0x28, 0xd0, 0xb3, 0xa9, 0xee, 0x44, 0x8e, 0xe0, 0x7b, 0x9f, 0xd0, 0xf6, - 0x96, 0x3a, 0x2a, 0xe6, 0x5b, 0x3b, 0x5b, 0xb4, 0x20, 0x9c, 0xa7, 0xd8, 0x74, 0xb7, 0xdd, 0xde, - 0x78, 0x87, 0xd4, 0xa2, 0x55, 0x12, 0x39, 0xf1, 0xe7, 0xc4, 0x65, 0x58, 0x51, 0x45, 0x37, 0x61, - 0x28, 0x72, 0x82, 0x2d, 0x12, 0x09, 0x06, 0x98, 0xca, 0xa8, 0x78, 0x4d, 0x4c, 0x77, 0x24, 0xf1, - 0x6a, 0x24, 0x3e, 0x16, 0xd6, 0x59, 0x55, 0x2c, 0x48, 0xd8, 0x3f, 0x38, 0x0c, 0x67, 0x97, 0xaa, - 0xe5, 0x8c, 0x75, 0x75, 0x19, 0x86, 0xea, 0x81, 0xbb, 0x4b, 0x02, 0x31, 0xce, 0x8a, 0x4a, 0x89, - 0x95, 0x62, 0x01, 0x45, 0x2f, 0xc3, 0x28, 0x3f, 0x90, 0x6e, 0x38, 0x5e, 0xbd, 0x21, 0x87, 0xf8, - 0x94, 0xc0, 0x1e, 0xbd, 0xab, 0xc1, 0xb0, 0x81, 0x79, 0xc4, 0x45, 0x75, 0x39, 0xb1, 0x19, 0xb3, - 0x0e, 0xbb, 0x2f, 0x5a, 0x30, 0xc9, 0x9b, 0x59, 0x88, 0xa2, 0xc0, 0xdd, 0x68, 0x47, 0x24, 0x9c, - 0x19, 0x64, 0x9c, 0x6e, 0x29, 0x6d, 0xb4, 0x32, 0x47, 0x60, 0xfe, 0x6e, 0x82, 0x0a, 0x67, 0x82, - 0x33, 0xa2, 0xdd, 0xc9, 0x24, 0x18, 0x77, 0x34, 0x8b, 0xbe, 0xd3, 0x82, 0xd9, 0x9a, 0xef, 0x45, - 0x81, 0xdf, 0x68, 0x90, 0xa0, 0xd2, 0xde, 0x68, 0xb8, 0xe1, 0x36, 0x5f, 0xa7, 0x98, 0x6c, 0x32, - 0x4e, 0x90, 0x31, 0x87, 0x0a, 0x49, 0xcc, 0xe1, 0x85, 0x07, 0x07, 0x73, 0xb3, 0x4b, 0x99, 0xa4, - 0x70, 0x97, 0x66, 0xd0, 0x0e, 0x20, 0x7a, 0x94, 0x56, 0x23, 0x67, 0x8b, 0xc4, 0x8d, 0x0f, 0xf7, - 0xdf, 0xf8, 0x99, 0x07, 0x07, 0x73, 0x68, 0xad, 0x83, 0x04, 0x4e, 0x21, 0x8b, 0xde, 0x85, 0x53, - 0xb4, 0xb4, 0xe3, 0x5b, 0x0b, 0xfd, 0x37, 0x37, 0xf3, 0xe0, 0x60, 0xee, 0xd4, 0x5a, 0x0a, 0x11, - 0x9c, 0x4a, 0x1a, 0x7d, 0x87, 0x05, 0x67, 0xe3, 0xcf, 0x5f, 0xbe, 0xdf, 0x72, 0xbc, 0x7a, 0xdc, - 0x70, 0xb1, 0xff, 0x86, 0x29, 0x4f, 0x3e, 0xbb, 0x94, 0x45, 0x09, 0x67, 0x37, 0x32, 0xbb, 0x04, - 0xa7, 0x53, 0x57, 0x0b, 0x9a, 0x84, 0xfc, 0x0e, 0xe1, 0x52, 0x50, 0x11, 0xd3, 0x9f, 0xe8, 0x14, - 0x0c, 0xee, 0x3a, 0x8d, 0xb6, 0xd8, 0x28, 0x98, 0xff, 0x79, 0x25, 0xf7, 0xb2, 0x65, 0xff, 0xcb, - 0x3c, 0x4c, 0x2c, 0x55, 0xcb, 0x0f, 0xb5, 0x0b, 0xf5, 0x63, 0x28, 0xd7, 0xf5, 0x18, 0x8a, 0x0f, - 0xb5, 0x7c, 0xe6, 0xa1, 0xf6, 0xff, 0xa4, 0x6c, 0xa1, 0x01, 0xb6, 0x85, 0xbe, 0x29, 0x63, 0x0b, - 0x1d, 0xf3, 0xc6, 0xd9, 0xcd, 0x58, 0x45, 0x83, 0x6c, 0x32, 0x53, 0x25, 0x96, 0x5b, 0x7e, 0xcd, - 0x69, 0x24, 0x59, 0xdf, 0x11, 0x97, 0xd2, 0xf1, 0xcc, 0x63, 0x0d, 0x46, 0x97, 0x9c, 0x96, 0xb3, - 0xe1, 0x36, 0xdc, 0xc8, 0x25, 0x21, 0x7a, 0x12, 0xf2, 0x4e, 0xbd, 0xce, 0xa4, 0xad, 0xe2, 0xe2, - 0xe9, 0x07, 0x07, 0x73, 0xf9, 0x85, 0x3a, 0x3d, 0xf6, 0x41, 0x61, 0xed, 0x63, 0x8a, 0x81, 0x3e, - 0x0e, 0x03, 0xf5, 0xc0, 0x6f, 0xcd, 0xe4, 0x18, 0x26, 0xdd, 0x75, 0x03, 0xa5, 0xc0, 0x6f, 0x25, - 0x50, 0x19, 0x8e, 0xfd, 0xab, 0x39, 0x38, 0xb7, 0x44, 0x5a, 0xdb, 0x2b, 0xd5, 0x0c, 0xfe, 0x7d, - 0x05, 0x0a, 0x4d, 0xdf, 0x73, 0x23, 0x3f, 0x08, 0x45, 0xd3, 0x6c, 0x45, 0xac, 0x8a, 0x32, 0xac, - 0xa0, 0xe8, 0x22, 0x0c, 0xb4, 0x62, 0xa1, 0x72, 0x54, 0x0a, 0xa4, 0x4c, 0x9c, 0x64, 0x10, 0x8a, - 0xd1, 0x0e, 0x49, 0x20, 0x56, 0x8c, 0xc2, 0xb8, 0x13, 0x92, 0x00, 0x33, 0x48, 0x7c, 0x32, 0xd3, - 0x33, 0x5b, 0x70, 0xe8, 0xc4, 0xc9, 0x4c, 0x21, 0x58, 0xc3, 0x42, 0x15, 0x28, 0x86, 0x89, 0x99, - 0xed, 0x6b, 0x9b, 0x8e, 0xb1, 0xa3, 0x5b, 0xcd, 0x64, 0x4c, 0xc4, 0x38, 0x51, 0x86, 0x7a, 0x1e, - 0xdd, 0x5f, 0xc9, 0x01, 0xe2, 0x43, 0xf8, 0x97, 0x6c, 0xe0, 0xee, 0x74, 0x0e, 0x5c, 0xff, 0x5b, - 0xe2, 0xb8, 0x46, 0xef, 0xcf, 0x2c, 0x38, 0xb7, 0xe4, 0x7a, 0x75, 0x12, 0x64, 0x2c, 0xc0, 0x47, - 0x73, 0x97, 0x3d, 0x9a, 0xd0, 0x60, 0x2c, 0xb1, 0x81, 0x63, 0x58, 0x62, 0xf6, 0x1f, 0x5b, 0x80, - 0xf8, 0x67, 0x7f, 0xe0, 0x3e, 0xf6, 0x4e, 0xe7, 0xc7, 0x1e, 0xc3, 0xb2, 0xb0, 0x6f, 0xc1, 0xf8, - 0x52, 0xc3, 0x25, 0x5e, 0x54, 0xae, 0x2c, 0xf9, 0xde, 0xa6, 0xbb, 0x85, 0x5e, 0x81, 0xf1, 0xc8, - 0x6d, 0x12, 0xbf, 0x1d, 0x55, 0x49, 0xcd, 0xf7, 0xd8, 0x4d, 0xd2, 0xba, 0x32, 0xb8, 0x88, 0x1e, - 0x1c, 0xcc, 0x8d, 0xaf, 0x1b, 0x10, 0x9c, 0xc0, 0xb4, 0x7f, 0x97, 0x8e, 0x9f, 0xdf, 0x6c, 0xf9, - 0x1e, 0xf1, 0xa2, 0x25, 0xdf, 0xab, 0x73, 0x8d, 0xc3, 0x2b, 0x30, 0x10, 0xd1, 0xf1, 0xe0, 0x63, - 0x77, 0x59, 0x6e, 0x14, 0x3a, 0x0a, 0x87, 0x07, 0x73, 0x67, 0x3a, 0x6b, 0xb0, 0x71, 0x62, 0x75, - 0xd0, 0x37, 0xc1, 0x50, 0x18, 0x39, 0x51, 0x3b, 0x14, 0xa3, 0xf9, 0x84, 0x1c, 0xcd, 0x2a, 0x2b, - 0x3d, 0x3c, 0x98, 0x9b, 0x50, 0xd5, 0x78, 0x11, 0x16, 0x15, 0xd0, 0x53, 0x30, 0xdc, 0x24, 0x61, - 0xe8, 0x6c, 0xc9, 0xd3, 0x70, 0x42, 0xd4, 0x1d, 0x5e, 0xe5, 0xc5, 0x58, 0xc2, 0xd1, 0x25, 0x18, - 0x24, 0x41, 0xe0, 0x07, 0x62, 0x8f, 0x8e, 0x09, 0xc4, 0xc1, 0x65, 0x5a, 0x88, 0x39, 0xcc, 0xfe, - 0xb7, 0x16, 0x4c, 0xa8, 0xbe, 0xf2, 0xb6, 0x4e, 0xe0, 0x56, 0xf0, 0x16, 0x40, 0x4d, 0x7e, 0x60, - 0xc8, 0x4e, 0x8f, 0x91, 0x6b, 0x97, 0x53, 0x0f, 0xea, 0x8e, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, - 0x6b, 0xd4, 0xec, 0x7f, 0x6a, 0xc1, 0x74, 0xe2, 0x8b, 0x6e, 0xb9, 0x61, 0x84, 0xde, 0xee, 0xf8, - 0xaa, 0xf9, 0xfe, 0xbe, 0x8a, 0xd6, 0x66, 0xdf, 0xa4, 0x96, 0xb2, 0x2c, 0xd1, 0xbe, 0xe8, 0x06, - 0x0c, 0xba, 0x11, 0x69, 0xca, 0x8f, 0xb9, 0xd4, 0xf5, 0x63, 0x78, 0xaf, 0xe2, 0x19, 0x29, 0xd3, - 0x9a, 0x98, 0x13, 0xb0, 0x7f, 0x35, 0x0f, 0x45, 0xbe, 0x6c, 0x57, 0x9d, 0xd6, 0x09, 0xcc, 0xc5, - 0xd3, 0x50, 0x74, 0x9b, 0xcd, 0x76, 0xe4, 0x6c, 0x08, 0x76, 0x5e, 0xe0, 0x5b, 0xab, 0x2c, 0x0b, - 0x71, 0x0c, 0x47, 0x65, 0x18, 0x60, 0x5d, 0xe1, 0x5f, 0xf9, 0x64, 0xfa, 0x57, 0x8a, 0xbe, 0xcf, - 0x97, 0x9c, 0xc8, 0xe1, 0x92, 0x94, 0x3a, 0x47, 0x68, 0x11, 0x66, 0x24, 0x90, 0x03, 0xb0, 0xe1, - 0x7a, 0x4e, 0xb0, 0x4f, 0xcb, 0x66, 0xf2, 0x8c, 0xe0, 0xb3, 0xdd, 0x09, 0x2e, 0x2a, 0x7c, 0x4e, - 0x56, 0x7d, 0x58, 0x0c, 0xc0, 0x1a, 0xd1, 0xd9, 0x97, 0xa0, 0xa8, 0x90, 0x8f, 0x22, 0x10, 0xcd, - 0x7e, 0x0a, 0x26, 0x12, 0x6d, 0xf5, 0xaa, 0x3e, 0xaa, 0xcb, 0x53, 0xbf, 0xc4, 0x58, 0x86, 0xe8, - 0xf5, 0xb2, 0xb7, 0x2b, 0x58, 0xee, 0x7b, 0x70, 0xaa, 0x91, 0xc2, 0xc9, 0xc4, 0xbc, 0xf6, 0xcf, - 0xf9, 0xce, 0x89, 0xcf, 0x3e, 0x95, 0x06, 0xc5, 0xa9, 0x6d, 0x50, 0x19, 0xc1, 0x6f, 0xd1, 0x0d, - 0xe2, 0x34, 0x74, 0x71, 0xfb, 0xb6, 0x28, 0xc3, 0x0a, 0x4a, 0xf9, 0xdd, 0x29, 0xd5, 0xf9, 0x9b, - 0x64, 0xbf, 0x4a, 0x1a, 0xa4, 0x16, 0xf9, 0xc1, 0xd7, 0xb5, 0xfb, 0xe7, 0xf9, 0xe8, 0x73, 0x76, - 0x39, 0x22, 0x08, 0xe4, 0x6f, 0x92, 0x7d, 0x3e, 0x15, 0xfa, 0xd7, 0xe5, 0xbb, 0x7e, 0xdd, 0xcf, - 0x58, 0x30, 0xa6, 0xbe, 0xee, 0x04, 0xf8, 0xc2, 0xa2, 0xc9, 0x17, 0xce, 0x77, 0x5d, 0xe0, 0x19, - 0x1c, 0xe1, 0x2b, 0x39, 0x38, 0xab, 0x70, 0xe8, 0xdd, 0x80, 0xff, 0x11, 0xab, 0xea, 0x2a, 0x14, - 0x3d, 0xa5, 0xb5, 0xb2, 0x4c, 0x75, 0x51, 0xac, 0xb3, 0x8a, 0x71, 0xa8, 0x88, 0xe7, 0xc5, 0xaa, - 0xa5, 0x51, 0x5d, 0x9d, 0x2b, 0x54, 0xb7, 0x8b, 0x90, 0x6f, 0xbb, 0x75, 0x71, 0xc0, 0x7c, 0x42, - 0x8e, 0xf6, 0x9d, 0x72, 0xe9, 0xf0, 0x60, 0xee, 0x89, 0xac, 0xa7, 0x04, 0x7a, 0xb2, 0x85, 0xf3, - 0x77, 0xca, 0x25, 0x4c, 0x2b, 0xa3, 0x05, 0x98, 0x90, 0xaf, 0x25, 0x77, 0xa9, 0xb8, 0xe5, 0x7b, - 0xe2, 0x1c, 0x52, 0x3a, 0x59, 0x6c, 0x82, 0x71, 0x12, 0x1f, 0x95, 0x60, 0x72, 0xa7, 0xbd, 0x41, - 0x1a, 0x24, 0xe2, 0x1f, 0x7c, 0x93, 0x70, 0x8d, 0x65, 0x31, 0xbe, 0x99, 0xdd, 0x4c, 0xc0, 0x71, - 0x47, 0x0d, 0xfb, 0x2f, 0xd8, 0x79, 0x20, 0x46, 0xaf, 0x12, 0xf8, 0x74, 0x61, 0x51, 0xea, 0x5f, - 0xcf, 0xe5, 0xdc, 0xcf, 0xaa, 0xb8, 0x49, 0xf6, 0xd7, 0x7d, 0x2a, 0x99, 0xa7, 0xaf, 0x0a, 0x63, - 0xcd, 0x0f, 0x74, 0x5d, 0xf3, 0x3f, 0x97, 0x83, 0xd3, 0x6a, 0x04, 0x0c, 0x21, 0xf0, 0x2f, 0xfb, - 0x18, 0x3c, 0x07, 0x23, 0x75, 0xb2, 0xe9, 0xb4, 0x1b, 0x91, 0x52, 0x9f, 0x0f, 0xf2, 0x27, 0x94, - 0x52, 0x5c, 0x8c, 0x75, 0x9c, 0x23, 0x0c, 0xdb, 0xff, 0x18, 0x61, 0x07, 0x71, 0xe4, 0xd0, 0x35, - 0xae, 0x76, 0x8d, 0x95, 0xb9, 0x6b, 0x2e, 0xc1, 0xa0, 0xdb, 0xa4, 0x82, 0x59, 0xce, 0x94, 0xb7, - 0xca, 0xb4, 0x10, 0x73, 0x18, 0xfa, 0x18, 0x0c, 0xd7, 0xfc, 0x66, 0xd3, 0xf1, 0xea, 0xec, 0xc8, - 0x2b, 0x2e, 0x8e, 0x50, 0xd9, 0x6d, 0x89, 0x17, 0x61, 0x09, 0x43, 0xe7, 0x60, 0xc0, 0x09, 0xb6, - 0xb8, 0x0e, 0xa3, 0xb8, 0x58, 0xa0, 0x2d, 0x2d, 0x04, 0x5b, 0x21, 0x66, 0xa5, 0xf4, 0x0a, 0xb6, - 0xe7, 0x07, 0x3b, 0xae, 0xb7, 0x55, 0x72, 0x03, 0xb1, 0x25, 0xd4, 0x59, 0x78, 0x4f, 0x41, 0xb0, - 0x86, 0x85, 0x56, 0x60, 0xb0, 0xe5, 0x07, 0x51, 0x38, 0x33, 0xc4, 0x86, 0xfb, 0x89, 0x0c, 0x46, - 0xc4, 0xbf, 0xb6, 0xe2, 0x07, 0x51, 0xfc, 0x01, 0xf4, 0x5f, 0x88, 0x79, 0x75, 0x74, 0x0b, 0x86, - 0x89, 0xb7, 0xbb, 0x12, 0xf8, 0xcd, 0x99, 0xe9, 0x6c, 0x4a, 0xcb, 0x1c, 0x85, 0x2f, 0xb3, 0x58, - 0x46, 0x15, 0xc5, 0x58, 0x92, 0x40, 0xdf, 0x04, 0x79, 0xe2, 0xed, 0xce, 0x0c, 0x33, 0x4a, 0xb3, - 0x19, 0x94, 0xee, 0x3a, 0x41, 0xcc, 0xf3, 0x97, 0xbd, 0x5d, 0x4c, 0xeb, 0xa0, 0xcf, 0x40, 0x51, - 0x32, 0x8c, 0x50, 0x28, 0xeb, 0x52, 0x17, 0xac, 0x64, 0x33, 0x98, 0xbc, 0xdb, 0x76, 0x03, 0xd2, - 0x24, 0x5e, 0x14, 0xc6, 0x1c, 0x52, 0x42, 0x43, 0x1c, 0x53, 0x43, 0x9f, 0x91, 0x1a, 0xe2, 0x55, - 0xbf, 0xed, 0x45, 0xe1, 0x4c, 0x91, 0x75, 0x2f, 0xf5, 0xed, 0xee, 0x6e, 0x8c, 0x97, 0x54, 0x21, - 0xf3, 0xca, 0xd8, 0x20, 0x85, 0x3e, 0x0b, 0x63, 0xfc, 0x3f, 0x7f, 0x01, 0x0b, 0x67, 0x4e, 0x33, - 0xda, 0x17, 0xb3, 0x69, 0x73, 0xc4, 0xc5, 0xd3, 0x82, 0xf8, 0x98, 0x5e, 0x1a, 0x62, 0x93, 0x1a, - 0xc2, 0x30, 0xd6, 0x70, 0x77, 0x89, 0x47, 0xc2, 0xb0, 0x12, 0xf8, 0x1b, 0x64, 0x06, 0xd8, 0xc0, - 0x9c, 0x4d, 0x7f, 0x31, 0xf3, 0x37, 0xc8, 0xe2, 0x14, 0xa5, 0x79, 0x4b, 0xaf, 0x83, 0x4d, 0x12, - 0xe8, 0x0e, 0x8c, 0xd3, 0x1b, 0x9b, 0x1b, 0x13, 0x1d, 0xe9, 0x45, 0x94, 0xdd, 0xab, 0xb0, 0x51, - 0x09, 0x27, 0x88, 0xa0, 0xdb, 0x30, 0x1a, 0x46, 0x4e, 0x10, 0xb5, 0x5b, 0x9c, 0xe8, 0x99, 0x5e, - 0x44, 0xd9, 0x83, 0x6b, 0x55, 0xab, 0x82, 0x0d, 0x02, 0xe8, 0x0d, 0x28, 0x36, 0xdc, 0x4d, 0x52, - 0xdb, 0xaf, 0x35, 0xc8, 0xcc, 0x28, 0xa3, 0x96, 0xca, 0x54, 0x6e, 0x49, 0x24, 0x2e, 0xe7, 0xaa, - 0xbf, 0x38, 0xae, 0x8e, 0xee, 0xc2, 0x99, 0x88, 0x04, 0x4d, 0xd7, 0x73, 0x28, 0x33, 0x10, 0x57, - 0x2b, 0xf6, 0x90, 0x39, 0xc6, 0x76, 0xdb, 0x05, 0x31, 0x1b, 0x67, 0xd6, 0x53, 0xb1, 0x70, 0x46, - 0x6d, 0x74, 0x1f, 0x66, 0x52, 0x20, 0x7e, 0xc3, 0xad, 0xed, 0xcf, 0x9c, 0x62, 0x94, 0x5f, 0x13, - 0x94, 0x67, 0xd6, 0x33, 0xf0, 0x0e, 0xbb, 0xc0, 0x70, 0x26, 0x75, 0x74, 0x1b, 0x26, 0x18, 0x07, - 0xaa, 0xb4, 0x1b, 0x0d, 0xd1, 0xe0, 0x38, 0x6b, 0xf0, 0x63, 0xf2, 0x3c, 0x2e, 0x9b, 0xe0, 0xc3, - 0x83, 0x39, 0x88, 0xff, 0xe1, 0x64, 0x6d, 0xb4, 0xc1, 0xde, 0xcc, 0xda, 0x81, 0x1b, 0xed, 0x53, - 0xbe, 0x41, 0xee, 0x47, 0x33, 0x13, 0x5d, 0xf5, 0x15, 0x3a, 0xaa, 0x7a, 0x58, 0xd3, 0x0b, 0x71, - 0x92, 0x20, 0x65, 0xa9, 0x61, 0x54, 0x77, 0xbd, 0x99, 0x49, 0x7e, 0x2f, 0x91, 0x1c, 0xa9, 0x4a, - 0x0b, 0x31, 0x87, 0xb1, 0xf7, 0x32, 0xfa, 0xe3, 0x36, 0x3d, 0xb9, 0xa6, 0x18, 0x62, 0xfc, 0x5e, - 0x26, 0x01, 0x38, 0xc6, 0xa1, 0xc2, 0x64, 0x14, 0xed, 0xcf, 0x20, 0x86, 0xaa, 0x18, 0xcb, 0xfa, - 0xfa, 0x67, 0x30, 0x2d, 0xb7, 0x37, 0x60, 0x5c, 0x31, 0x42, 0x36, 0x26, 0x68, 0x0e, 0x06, 0x99, - 0xf8, 0x24, 0xb4, 0x6b, 0x45, 0xda, 0x05, 0x26, 0x5a, 0x61, 0x5e, 0xce, 0xba, 0xe0, 0xbe, 0x47, - 0x16, 0xf7, 0x23, 0xc2, 0xef, 0xf4, 0x79, 0xad, 0x0b, 0x12, 0x80, 0x63, 0x1c, 0xfb, 0x7f, 0x73, - 0x31, 0x34, 0xe6, 0xb6, 0x7d, 0x9c, 0x2f, 0xcf, 0x40, 0x61, 0xdb, 0x0f, 0x23, 0x8a, 0xcd, 0xda, - 0x18, 0x8c, 0x05, 0xcf, 0x1b, 0xa2, 0x1c, 0x2b, 0x0c, 0xf4, 0x2a, 0x8c, 0xd5, 0xf4, 0x06, 0xc4, - 0xe1, 0xa8, 0xd8, 0x88, 0xd1, 0x3a, 0x36, 0x71, 0xd1, 0xcb, 0x50, 0x60, 0x36, 0x20, 0x35, 0xbf, - 0x21, 0xa4, 0x36, 0x79, 0xc2, 0x17, 0x2a, 0xa2, 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x36, 0xba, 0x0c, - 0x43, 0xb4, 0x0b, 0xe5, 0x8a, 0x38, 0x96, 0x94, 0xa2, 0xe8, 0x06, 0x2b, 0xc5, 0x02, 0x6a, 0xff, - 0xd5, 0x9c, 0x36, 0xca, 0xf4, 0x3e, 0x4c, 0x50, 0x05, 0x86, 0xf7, 0x1c, 0x37, 0x72, 0xbd, 0x2d, - 0x21, 0x7f, 0x3c, 0xd5, 0xf5, 0x8c, 0x62, 0x95, 0xee, 0xf1, 0x0a, 0xfc, 0x14, 0x15, 0x7f, 0xb0, - 0x24, 0x43, 0x29, 0x06, 0x6d, 0xcf, 0xa3, 0x14, 0x73, 0xfd, 0x52, 0xc4, 0xbc, 0x02, 0xa7, 0x28, - 0xfe, 0x60, 0x49, 0x06, 0xbd, 0x0d, 0x20, 0x77, 0x18, 0xa9, 0x0b, 0xdb, 0x8b, 0x67, 0x7a, 0x13, - 0x5d, 0x57, 0x75, 0x16, 0xc7, 0xe9, 0x19, 0x1d, 0xff, 0xc7, 0x1a, 0x3d, 0x3b, 0x62, 0x72, 0x5a, - 0x67, 0x67, 0xd0, 0xb7, 0xd2, 0x25, 0xee, 0x04, 0x11, 0xa9, 0x2f, 0x44, 0x62, 0x70, 0x3e, 0xde, - 0xdf, 0x25, 0x65, 0xdd, 0x6d, 0x12, 0x7d, 0x3b, 0x08, 0x22, 0x38, 0xa6, 0x67, 0xff, 0x42, 0x1e, - 0x66, 0xb2, 0xba, 0x4b, 0x17, 0x1d, 0xb9, 0xef, 0x46, 0x4b, 0x54, 0xbc, 0xb2, 0xcc, 0x45, 0xb7, - 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0xb3, 0x1f, 0xba, 0x5b, 0xf2, 0x8e, 0x39, 0x18, 0xcf, 0x7e, 0x95, - 0x95, 0x62, 0x01, 0xa5, 0x78, 0x01, 0x71, 0x42, 0x61, 0xdc, 0xa3, 0xad, 0x12, 0xcc, 0x4a, 0xb1, - 0x80, 0xea, 0xda, 0xae, 0x81, 0x1e, 0xda, 0x2e, 0x63, 0x88, 0x06, 0x8f, 0x77, 0x88, 0xd0, 0xe7, - 0x00, 0x36, 0x5d, 0xcf, 0x0d, 0xb7, 0x19, 0xf5, 0xa1, 0x23, 0x53, 0x57, 0xc2, 0xd9, 0x8a, 0xa2, - 0x82, 0x35, 0x8a, 0xe8, 0x45, 0x18, 0x51, 0x1b, 0xb0, 0x5c, 0x62, 0x2f, 0x9d, 0x9a, 0xe5, 0x48, - 0xcc, 0x8d, 0x4a, 0x58, 0xc7, 0xb3, 0xdf, 0x49, 0xae, 0x17, 0xb1, 0x03, 0xb4, 0xf1, 0xb5, 0xfa, - 0x1d, 0xdf, 0x5c, 0xf7, 0xf1, 0xb5, 0xbf, 0x96, 0x87, 0x09, 0xa3, 0xb1, 0x76, 0xd8, 0x07, 0xcf, - 0xba, 0x4e, 0x19, 0xb8, 0x13, 0x11, 0xb1, 0xff, 0xec, 0xde, 0x5b, 0x45, 0x67, 0xf2, 0x74, 0x07, - 0xf0, 0xfa, 0xe8, 0x73, 0x50, 0x6c, 0x38, 0x21, 0xd3, 0x9c, 0x11, 0xb1, 0xef, 0xfa, 0x21, 0x16, - 0x5f, 0x4c, 0x9c, 0x30, 0xd2, 0x4e, 0x4d, 0x4e, 0x3b, 0x26, 0x49, 0x4f, 0x1a, 0x2a, 0x9f, 0x48, - 0xeb, 0x31, 0xd5, 0x09, 0x2a, 0xc4, 0xec, 0x63, 0x0e, 0x43, 0x2f, 0xc3, 0x68, 0x40, 0xd8, 0xaa, - 0x58, 0xa2, 0xd2, 0x1c, 0x5b, 0x66, 0x83, 0xb1, 0xd8, 0x87, 0x35, 0x18, 0x36, 0x30, 0xe3, 0xbb, - 0xc1, 0x50, 0x97, 0xbb, 0xc1, 0x53, 0x30, 0xcc, 0x7e, 0xa8, 0x15, 0xa0, 0x66, 0xa3, 0xcc, 0x8b, - 0xb1, 0x84, 0x27, 0x17, 0x4c, 0xa1, 0xbf, 0x05, 0x43, 0x6f, 0x1f, 0x62, 0x51, 0xb3, 0x57, 0xe6, - 0x02, 0xe7, 0x72, 0x62, 0xc9, 0x63, 0x09, 0xb3, 0x3f, 0x0e, 0xe3, 0x25, 0x87, 0x34, 0x7d, 0x6f, - 0xd9, 0xab, 0xb7, 0x7c, 0xd7, 0x8b, 0xd0, 0x0c, 0x0c, 0xb0, 0x43, 0x84, 0xb3, 0x80, 0x01, 0xda, - 0x10, 0x1e, 0xa0, 0x17, 0x02, 0x7b, 0x0b, 0x4e, 0x97, 0xfc, 0x3d, 0x6f, 0xcf, 0x09, 0xea, 0x0b, - 0x95, 0xb2, 0x76, 0xbf, 0x5e, 0x93, 0xf7, 0x3b, 0x6e, 0xb4, 0x95, 0xca, 0x7a, 0xb5, 0x9a, 0x5c, - 0xac, 0x5d, 0x71, 0x1b, 0x24, 0x43, 0x0b, 0xf2, 0xd7, 0x73, 0x46, 0x4b, 0x31, 0xbe, 0x7a, 0xd5, - 0xb2, 0x32, 0x5f, 0xb5, 0xde, 0x84, 0xc2, 0xa6, 0x4b, 0x1a, 0x75, 0x4c, 0x36, 0xc5, 0x4a, 0x7c, - 0x32, 0xdb, 0x0e, 0x65, 0x85, 0x62, 0x4a, 0xad, 0x17, 0xbf, 0x1d, 0xae, 0x88, 0xca, 0x58, 0x91, - 0x41, 0x3b, 0x30, 0x29, 0x2f, 0x0c, 0x12, 0x2a, 0xd6, 0xe5, 0x53, 0xdd, 0x6e, 0x21, 0x26, 0xf1, - 0x53, 0x0f, 0x0e, 0xe6, 0x26, 0x71, 0x82, 0x0c, 0xee, 0x20, 0x4c, 0xaf, 0x83, 0x4d, 0xca, 0x81, - 0x07, 0xd8, 0xf0, 0xb3, 0xeb, 0x20, 0xbb, 0xd9, 0xb2, 0x52, 0xfb, 0x47, 0x2d, 0x78, 0xac, 0x63, - 0x64, 0xc4, 0x0d, 0xff, 0x98, 0x67, 0x21, 0x79, 0xe3, 0xce, 0xf5, 0xbe, 0x71, 0xdb, 0x7f, 0xcf, - 0x82, 0x53, 0xcb, 0xcd, 0x56, 0xb4, 0x5f, 0x72, 0xcd, 0x27, 0xa8, 0x97, 0x60, 0xa8, 0x49, 0xea, - 0x6e, 0xbb, 0x29, 0x66, 0x6e, 0x4e, 0x72, 0xa9, 0x55, 0x56, 0x7a, 0x78, 0x30, 0x37, 0x56, 0x8d, - 0xfc, 0xc0, 0xd9, 0x22, 0xbc, 0x00, 0x0b, 0x74, 0xc6, 0xeb, 0xdd, 0xf7, 0xc8, 0x2d, 0xb7, 0xe9, - 0x4a, 0xbb, 0xa2, 0xae, 0x3a, 0xbb, 0x79, 0x39, 0xa0, 0xf3, 0x6f, 0xb6, 0x1d, 0x2f, 0x72, 0xa3, - 0x7d, 0xf1, 0x7a, 0x24, 0x89, 0xe0, 0x98, 0x9e, 0xfd, 0x55, 0x0b, 0x26, 0xe4, 0xba, 0x5f, 0xa8, - 0xd7, 0x03, 0x12, 0x86, 0x68, 0x16, 0x72, 0x6e, 0x4b, 0xf4, 0x12, 0x44, 0x2f, 0x73, 0xe5, 0x0a, - 0xce, 0xb9, 0x2d, 0x29, 0x96, 0x31, 0x46, 0x98, 0x37, 0x1f, 0xd2, 0x6e, 0x88, 0x72, 0xac, 0x30, - 0xd0, 0x15, 0x28, 0x78, 0x7e, 0x9d, 0xdb, 0x76, 0xf1, 0x23, 0x8d, 0x2d, 0xb0, 0x35, 0x51, 0x86, - 0x15, 0x14, 0x55, 0xa0, 0xc8, 0xcd, 0x9e, 0xe2, 0x45, 0xdb, 0x97, 0xf1, 0x14, 0xfb, 0xb2, 0x75, - 0x59, 0x13, 0xc7, 0x44, 0xec, 0x5f, 0xb1, 0x60, 0x54, 0x7e, 0x59, 0x9f, 0x32, 0x27, 0xdd, 0x5a, - 0xb1, 0xbc, 0x19, 0x6f, 0x2d, 0x2a, 0x33, 0x32, 0x88, 0x21, 0x2a, 0xe6, 0x8f, 0x24, 0x2a, 0x3e, - 0x07, 0x23, 0x4e, 0xab, 0x55, 0x31, 0xe5, 0x4c, 0xb6, 0x94, 0x16, 0xe2, 0x62, 0xac, 0xe3, 0xd8, - 0x3f, 0x92, 0x83, 0x71, 0xf9, 0x05, 0xd5, 0xf6, 0x46, 0x48, 0x22, 0xb4, 0x0e, 0x45, 0x87, 0xcf, - 0x12, 0x91, 0x8b, 0xfc, 0x52, 0xba, 0x1e, 0xc1, 0x98, 0xd2, 0xf8, 0xc0, 0x5f, 0x90, 0xb5, 0x71, - 0x4c, 0x08, 0x35, 0x60, 0xca, 0xf3, 0x23, 0xc6, 0xfc, 0x15, 0xbc, 0xdb, 0xd3, 0x4e, 0x92, 0xfa, - 0x59, 0x41, 0x7d, 0x6a, 0x2d, 0x49, 0x05, 0x77, 0x12, 0x46, 0xcb, 0x52, 0x37, 0x93, 0xcf, 0x56, - 0x06, 0xe8, 0x13, 0x97, 0xae, 0x9a, 0xb1, 0x7f, 0xd9, 0x82, 0xa2, 0x44, 0x3b, 0x89, 0x57, 0xbc, - 0x55, 0x18, 0x0e, 0xd9, 0x24, 0xc8, 0xa1, 0xb1, 0xbb, 0x75, 0x9c, 0xcf, 0x57, 0x7c, 0xa6, 0xf1, - 0xff, 0x21, 0x96, 0x34, 0x98, 0x6a, 0x5e, 0x75, 0xff, 0x03, 0xa2, 0x9a, 0x57, 0xfd, 0xc9, 0x38, - 0x94, 0xfe, 0x90, 0xf5, 0x59, 0xd3, 0x75, 0x51, 0xd1, 0xab, 0x15, 0x90, 0x4d, 0xf7, 0x7e, 0x52, - 0xf4, 0xaa, 0xb0, 0x52, 0x2c, 0xa0, 0xe8, 0x6d, 0x18, 0xad, 0x49, 0x9d, 0x6c, 0xbc, 0xc3, 0x2f, - 0x77, 0x7d, 0x1f, 0x50, 0x4f, 0x49, 0x5c, 0x17, 0xb2, 0xa4, 0xd5, 0xc7, 0x06, 0x35, 0xd3, 0x8c, - 0x20, 0xdf, 0xcb, 0x8c, 0x20, 0xa6, 0x9b, 0xfd, 0xa8, 0xfe, 0x63, 0x16, 0x0c, 0x71, 0x5d, 0x5c, - 0x7f, 0xaa, 0x50, 0xed, 0x65, 0x2d, 0x1e, 0xbb, 0xbb, 0xb4, 0x50, 0xbc, 0x94, 0xa1, 0x55, 0x28, - 0xb2, 0x1f, 0x4c, 0x97, 0x98, 0xcf, 0xb6, 0xba, 0xe7, 0xad, 0xea, 0x1d, 0xbc, 0x2b, 0xab, 0xe1, - 0x98, 0x82, 0xfd, 0x43, 0x79, 0xca, 0xdd, 0x62, 0x54, 0xe3, 0xd0, 0xb7, 0x1e, 0xdd, 0xa1, 0x9f, - 0x7b, 0x54, 0x87, 0xfe, 0x16, 0x4c, 0xd4, 0xb4, 0x77, 0xb8, 0x78, 0x26, 0xaf, 0x74, 0x5d, 0x24, - 0xda, 0x93, 0x1d, 0xd7, 0xb2, 0x2c, 0x99, 0x44, 0x70, 0x92, 0x2a, 0xfa, 0x56, 0x18, 0xe5, 0xf3, - 0x2c, 0x5a, 0xe1, 0x96, 0x18, 0x1f, 0xcb, 0x5e, 0x2f, 0x7a, 0x13, 0x5c, 0x2b, 0xa7, 0x55, 0xc7, - 0x06, 0x31, 0xfb, 0x4f, 0x2c, 0x40, 0xcb, 0xad, 0x6d, 0xd2, 0x24, 0x81, 0xd3, 0x88, 0xd5, 0xe9, - 0xff, 0x9f, 0x05, 0x33, 0xa4, 0xa3, 0x78, 0xc9, 0x6f, 0x36, 0xc5, 0xa5, 0x25, 0xe3, 0x5e, 0xbd, - 0x9c, 0x51, 0x47, 0xb9, 0x25, 0xcc, 0x64, 0x61, 0xe0, 0xcc, 0xf6, 0xd0, 0x2a, 0x4c, 0xf3, 0x53, - 0x52, 0x01, 0x34, 0xdb, 0xeb, 0xc7, 0x05, 0xe1, 0xe9, 0xf5, 0x4e, 0x14, 0x9c, 0x56, 0xcf, 0xfe, - 0xae, 0x51, 0xc8, 0xec, 0xc5, 0x87, 0xef, 0x08, 0x1f, 0xbe, 0x23, 0x7c, 0xf8, 0x8e, 0xf0, 0xe1, - 0x3b, 0xc2, 0x87, 0xef, 0x08, 0xdf, 0xf0, 0xef, 0x08, 0x7f, 0x64, 0xc1, 0x74, 0xe7, 0x31, 0x70, - 0x12, 0x82, 0x79, 0x1b, 0xa6, 0x3b, 0xcf, 0xba, 0xae, 0x76, 0x76, 0x9d, 0xfd, 0x8c, 0xcf, 0xbd, - 0x94, 0x6f, 0xc0, 0x69, 0xf4, 0xed, 0x5f, 0x28, 0xc0, 0xe0, 0xf2, 0x2e, 0xf1, 0xa2, 0x13, 0xf8, - 0xc4, 0x1a, 0x8c, 0xbb, 0xde, 0xae, 0xdf, 0xd8, 0x25, 0x75, 0x0e, 0x3f, 0xca, 0x15, 0xf9, 0x8c, - 0x20, 0x3d, 0x5e, 0x36, 0x48, 0xe0, 0x04, 0xc9, 0x47, 0xa1, 0xa6, 0xbe, 0x0e, 0x43, 0xfc, 0x74, - 0x10, 0x3a, 0xea, 0xd4, 0xc3, 0x80, 0x0d, 0xa2, 0x38, 0xf3, 0x62, 0x15, 0x3a, 0x3f, 0x7d, 0x44, - 0x75, 0xf4, 0x0e, 0x8c, 0x6f, 0xba, 0x41, 0x18, 0xad, 0xbb, 0x4d, 0x12, 0x46, 0x4e, 0xb3, 0xf5, - 0x10, 0x6a, 0x69, 0x35, 0x0e, 0x2b, 0x06, 0x25, 0x9c, 0xa0, 0x8c, 0xb6, 0x60, 0xac, 0xe1, 0xe8, - 0x4d, 0x0d, 0x1f, 0xb9, 0x29, 0x75, 0xec, 0xdc, 0xd2, 0x09, 0x61, 0x93, 0x2e, 0xdd, 0xa7, 0x35, - 0xa6, 0x59, 0x2d, 0x30, 0x7d, 0x83, 0xda, 0xa7, 0x5c, 0xa5, 0xca, 0x61, 0x54, 0x82, 0x62, 0x96, - 0xb7, 0x45, 0x53, 0x82, 0xd2, 0xec, 0x6b, 0x3f, 0x0f, 0x45, 0x42, 0x87, 0x90, 0x12, 0x16, 0x27, - 0xd7, 0xd5, 0xfe, 0xfa, 0xba, 0xea, 0xd6, 0x02, 0xdf, 0x7c, 0x10, 0x58, 0x96, 0x94, 0x70, 0x4c, - 0x14, 0x2d, 0xc1, 0x50, 0x48, 0x02, 0x97, 0x84, 0xe2, 0x0c, 0xeb, 0x32, 0x8d, 0x0c, 0x8d, 0x3b, - 0xad, 0xf0, 0xdf, 0x58, 0x54, 0xa5, 0xcb, 0xcb, 0x61, 0xba, 0x52, 0x76, 0xca, 0x68, 0xcb, 0x6b, - 0x81, 0x95, 0x62, 0x01, 0x45, 0x6f, 0xc0, 0x70, 0x40, 0x1a, 0xec, 0xc5, 0x69, 0xac, 0xff, 0x45, - 0xce, 0x1f, 0xb0, 0x78, 0x3d, 0x2c, 0x09, 0xa0, 0x9b, 0x80, 0x02, 0x42, 0x25, 0x30, 0xd7, 0xdb, - 0x52, 0xf6, 0xa8, 0x82, 0x83, 0xab, 0x1d, 0x8f, 0x63, 0x0c, 0xe9, 0x3f, 0x84, 0x53, 0xaa, 0xa1, - 0xeb, 0x30, 0xa5, 0x4a, 0xcb, 0x5e, 0x18, 0x39, 0x94, 0x73, 0x4e, 0x30, 0x5a, 0x4a, 0x01, 0x82, - 0x93, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x65, 0x0b, 0xf8, 0x38, 0x9f, 0xc0, 0xb5, 0xff, 0x75, 0xf3, - 0xda, 0x7f, 0x36, 0x73, 0xe6, 0x32, 0xae, 0xfc, 0x5f, 0xb6, 0x60, 0x44, 0x9b, 0xd9, 0x78, 0xcd, - 0x5a, 0x5d, 0xd6, 0x6c, 0x1b, 0x26, 0xe9, 0x4a, 0xbf, 0xbd, 0x11, 0x92, 0x60, 0x97, 0xd4, 0xd9, - 0xc2, 0xcc, 0x3d, 0xdc, 0xc2, 0x54, 0xb6, 0x6f, 0xb7, 0x12, 0x04, 0x71, 0x47, 0x13, 0xf6, 0xe7, - 0x65, 0x57, 0x95, 0xa9, 0x60, 0x4d, 0xcd, 0x79, 0xc2, 0x54, 0x50, 0xcd, 0x2a, 0x8e, 0x71, 0xe8, - 0x56, 0xdb, 0xf6, 0xc3, 0x28, 0x69, 0x2a, 0x78, 0xc3, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0xf3, 0x00, - 0xcb, 0xf7, 0x49, 0x8d, 0xaf, 0x58, 0xfd, 0x56, 0x62, 0x65, 0xdf, 0x4a, 0xec, 0xdf, 0xb6, 0x60, - 0x7c, 0x65, 0xc9, 0xd0, 0x05, 0xcf, 0x03, 0xf0, 0xab, 0xd4, 0xbd, 0x7b, 0x6b, 0xf2, 0x9d, 0x9d, - 0x3f, 0x95, 0xaa, 0x52, 0xac, 0x61, 0xa0, 0xb3, 0x90, 0x6f, 0xb4, 0x3d, 0xa1, 0x97, 0x1c, 0xa6, - 0xe7, 0xee, 0xad, 0xb6, 0x87, 0x69, 0x99, 0xe6, 0xab, 0x90, 0xef, 0xdb, 0x57, 0xa1, 0x67, 0xcc, - 0x00, 0x34, 0x07, 0x83, 0x7b, 0x7b, 0x6e, 0x9d, 0x7b, 0x66, 0x0a, 0x1b, 0x80, 0x7b, 0xf7, 0xca, - 0xa5, 0x10, 0xf3, 0x72, 0xfb, 0x4b, 0x79, 0x98, 0x5d, 0x69, 0x90, 0xfb, 0xef, 0xd3, 0x3b, 0xb5, - 0x5f, 0x4f, 0x8b, 0xa3, 0x69, 0x78, 0x8e, 0xea, 0x4d, 0xd3, 0x7b, 0x3c, 0x36, 0x61, 0x98, 0x5b, - 0xca, 0x49, 0x5f, 0xd5, 0x57, 0xd3, 0x5a, 0xcf, 0x1e, 0x90, 0x79, 0x6e, 0x71, 0x27, 0x5c, 0xed, - 0xd4, 0x81, 0x29, 0x4a, 0xb1, 0x24, 0x3e, 0xfb, 0x0a, 0x8c, 0xea, 0x98, 0x47, 0xf2, 0x6b, 0xfb, - 0x7f, 0xf3, 0x30, 0x49, 0x7b, 0xf0, 0x48, 0x27, 0xe2, 0x4e, 0xe7, 0x44, 0x1c, 0xb7, 0x6f, 0x53, - 0xef, 0xd9, 0x78, 0x3b, 0x39, 0x1b, 0xcf, 0x65, 0xcd, 0xc6, 0x49, 0xcf, 0xc1, 0x77, 0x5a, 0x30, - 0xbd, 0xd2, 0xf0, 0x6b, 0x3b, 0x09, 0xff, 0xa3, 0x17, 0x61, 0x84, 0xb2, 0xe3, 0xd0, 0x70, 0x8d, - 0x37, 0x82, 0x25, 0x08, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0x77, 0xee, 0x94, 0x4b, 0x69, 0x31, 0x16, - 0x04, 0x08, 0xeb, 0x78, 0xf6, 0x6f, 0x5a, 0x70, 0xfe, 0xfa, 0xd2, 0x72, 0xbc, 0x14, 0x3b, 0xc2, - 0x3c, 0x5c, 0x86, 0xa1, 0x56, 0x5d, 0xeb, 0x4a, 0xac, 0xb7, 0x2d, 0xb1, 0x5e, 0x08, 0xe8, 0x07, - 0x25, 0x84, 0xc9, 0x4f, 0x59, 0x30, 0x7d, 0xdd, 0x8d, 0xe8, 0xe9, 0x9a, 0x0c, 0x38, 0x40, 0x8f, - 0xd7, 0xd0, 0x8d, 0xfc, 0x60, 0x3f, 0x19, 0x70, 0x00, 0x2b, 0x08, 0xd6, 0xb0, 0x78, 0xcb, 0xbb, - 0x2e, 0xb3, 0xd1, 0xce, 0x99, 0x2f, 0x58, 0x58, 0x94, 0x63, 0x85, 0x41, 0x3f, 0xac, 0xee, 0x06, - 0x4c, 0xf9, 0xb7, 0x2f, 0x38, 0xac, 0xfa, 0xb0, 0x92, 0x04, 0xe0, 0x18, 0x87, 0xde, 0x83, 0xe6, - 0xae, 0x37, 0xda, 0x61, 0x44, 0x82, 0xcd, 0x30, 0x83, 0x3b, 0x3e, 0x0f, 0x45, 0x22, 0x55, 0xed, - 0xa2, 0xd7, 0x4a, 0x62, 0x54, 0x3a, 0x78, 0x1e, 0xf7, 0x40, 0xe1, 0xf5, 0xe1, 0xcd, 0x78, 0x34, - 0x77, 0xb4, 0x15, 0x40, 0x44, 0x6f, 0x4b, 0x0f, 0x04, 0xc1, 0x3c, 0xca, 0x97, 0x3b, 0xa0, 0x38, - 0xa5, 0x86, 0xfd, 0xa3, 0x16, 0x9c, 0x56, 0x1f, 0xfc, 0x81, 0xfb, 0x4c, 0xfb, 0x67, 0x73, 0x30, - 0x76, 0x63, 0x7d, 0xbd, 0x72, 0x9d, 0x44, 0xe2, 0xd8, 0xee, 0xfd, 0x80, 0x8e, 0xb5, 0x77, 0xc0, - 0x6e, 0x97, 0xb9, 0x76, 0xe4, 0x36, 0xe6, 0x79, 0x3c, 0xa1, 0xf9, 0xb2, 0x17, 0xdd, 0x0e, 0xaa, - 0x51, 0xe0, 0x7a, 0x5b, 0xa9, 0x2f, 0x87, 0x52, 0xb8, 0xc8, 0x67, 0x09, 0x17, 0xe8, 0x79, 0x18, - 0x62, 0x01, 0x8d, 0xe4, 0x24, 0x3c, 0xae, 0xee, 0x42, 0xac, 0xf4, 0xf0, 0x60, 0xae, 0x78, 0x07, - 0x97, 0xf9, 0x1f, 0x2c, 0x50, 0xd1, 0x1d, 0x18, 0xd9, 0x8e, 0xa2, 0xd6, 0x0d, 0xe2, 0xd4, 0xe9, - 0xa5, 0x97, 0xb3, 0xc3, 0x0b, 0x69, 0xec, 0x90, 0x0e, 0x02, 0x47, 0x8b, 0x39, 0x48, 0x5c, 0x16, - 0x62, 0x9d, 0x8e, 0x5d, 0x05, 0x88, 0x61, 0xc7, 0xf4, 0x04, 0x62, 0xff, 0x81, 0x05, 0xc3, 0x3c, - 0xb6, 0x44, 0x80, 0x5e, 0x83, 0x01, 0x72, 0x9f, 0xd4, 0x84, 0xc4, 0x9b, 0xda, 0xe1, 0x58, 0xd2, - 0xe2, 0xaa, 0x5c, 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, 0x06, 0x0c, 0xd3, 0xde, 0x5e, 0x57, 0x81, 0x36, - 0x9e, 0xc8, 0xfa, 0x62, 0x35, 0xed, 0x5c, 0x38, 0x13, 0x45, 0x58, 0x56, 0x67, 0xef, 0xce, 0xb5, - 0x56, 0x95, 0x72, 0xec, 0xa8, 0x9b, 0x60, 0xb1, 0xbe, 0x54, 0xe1, 0x48, 0x82, 0x1a, 0x7f, 0x77, - 0x96, 0x85, 0x38, 0x26, 0x62, 0xaf, 0x43, 0x91, 0x4e, 0xea, 0x42, 0xc3, 0x75, 0xba, 0x3f, 0xa5, - 0x3f, 0x0d, 0x45, 0xf9, 0x50, 0x1e, 0x0a, 0x9f, 0x72, 0x46, 0x55, 0xbe, 0xa3, 0x87, 0x38, 0x86, - 0xdb, 0x9b, 0x70, 0x8a, 0x99, 0x3d, 0x3a, 0xd1, 0xb6, 0xb1, 0xc7, 0x7a, 0x2f, 0xe6, 0x67, 0xc4, - 0x05, 0x92, 0xcf, 0xcc, 0x8c, 0xe6, 0xb6, 0x39, 0x2a, 0x29, 0xc6, 0x97, 0x49, 0xfb, 0x6b, 0x03, - 0xf0, 0x78, 0xb9, 0x9a, 0x1d, 0x76, 0xe4, 0x65, 0x18, 0xe5, 0x72, 0x29, 0x5d, 0xda, 0x4e, 0x43, - 0xb4, 0xab, 0x74, 0xb8, 0xeb, 0x1a, 0x0c, 0x1b, 0x98, 0xe8, 0x3c, 0xe4, 0xdd, 0x77, 0xbd, 0xa4, - 0x53, 0x53, 0xf9, 0xcd, 0x35, 0x4c, 0xcb, 0x29, 0x98, 0x8a, 0xb8, 0xfc, 0xec, 0x50, 0x60, 0x25, - 0xe6, 0xbe, 0x0e, 0xe3, 0x6e, 0x58, 0x0b, 0xdd, 0xb2, 0x47, 0xf9, 0x8c, 0xc6, 0xa9, 0x94, 0x72, - 0x83, 0x76, 0x5a, 0x41, 0x71, 0x02, 0x5b, 0x3b, 0xc8, 0x06, 0xfb, 0x16, 0x93, 0x7b, 0x3a, 0x59, - 0xd3, 0x1b, 0x40, 0x8b, 0x7d, 0x5d, 0xc8, 0x94, 0xf1, 0xe2, 0x06, 0xc0, 0x3f, 0x38, 0xc4, 0x12, - 0x46, 0x6f, 0x8e, 0xb5, 0x6d, 0xa7, 0xb5, 0xd0, 0x8e, 0xb6, 0x4b, 0x6e, 0x58, 0xf3, 0x77, 0x49, - 0xb0, 0xcf, 0x2e, 0xfd, 0x85, 0xf8, 0xe6, 0xa8, 0x00, 0x4b, 0x37, 0x16, 0x2a, 0x14, 0x13, 0x77, - 0xd6, 0x41, 0x0b, 0x30, 0x21, 0x0b, 0xab, 0x24, 0x64, 0x47, 0xd8, 0x08, 0x23, 0xa3, 0xdc, 0x8c, - 0x44, 0xb1, 0x22, 0x92, 0xc4, 0x37, 0x25, 0x69, 0x38, 0x0e, 0x49, 0xfa, 0x25, 0x18, 0x73, 0x3d, - 0x37, 0x72, 0x9d, 0xc8, 0xe7, 0x2f, 0x49, 0xfc, 0x7e, 0xcf, 0x54, 0xe4, 0x65, 0x1d, 0x80, 0x4d, - 0x3c, 0xfb, 0xbf, 0x0c, 0xc0, 0x14, 0x9b, 0xb6, 0x0f, 0x57, 0xd8, 0x37, 0xd2, 0x0a, 0xbb, 0xd3, - 0xb9, 0xc2, 0x8e, 0xe3, 0x8a, 0xf0, 0xd0, 0xcb, 0xec, 0x1d, 0x28, 0x2a, 0xcf, 0x2a, 0xe9, 0x5a, - 0x69, 0x65, 0xb8, 0x56, 0xf6, 0x96, 0x3e, 0xa4, 0x71, 0x5a, 0x3e, 0xd5, 0x38, 0xed, 0x6f, 0x5a, - 0x10, 0x3f, 0x8d, 0xa0, 0x1b, 0x50, 0x6c, 0xf9, 0xcc, 0xe6, 0x32, 0x90, 0x86, 0xcc, 0x8f, 0xa7, - 0x1e, 0x54, 0xfc, 0x50, 0xe4, 0x1f, 0x5f, 0x91, 0x35, 0x70, 0x5c, 0x19, 0x2d, 0xc2, 0x70, 0x2b, - 0x20, 0xd5, 0x88, 0x45, 0x1f, 0xe9, 0x49, 0x87, 0xaf, 0x11, 0x8e, 0x8f, 0x65, 0x45, 0xfb, 0xe7, - 0x2c, 0x00, 0x6e, 0xff, 0xe5, 0x78, 0x5b, 0xe4, 0x04, 0xb4, 0xd6, 0x25, 0x18, 0x08, 0x5b, 0xa4, - 0xd6, 0xcd, 0x1a, 0x36, 0xee, 0x4f, 0xb5, 0x45, 0x6a, 0xf1, 0x80, 0xd3, 0x7f, 0x98, 0xd5, 0xb6, - 0xbf, 0x1b, 0x60, 0x3c, 0x46, 0x2b, 0x47, 0xa4, 0x89, 0x9e, 0x35, 0xa2, 0x11, 0x9c, 0x4d, 0x44, - 0x23, 0x28, 0x32, 0x6c, 0x4d, 0x41, 0xfa, 0x0e, 0xe4, 0x9b, 0xce, 0x7d, 0xa1, 0x01, 0x7b, 0xba, - 0x7b, 0x37, 0x28, 0xfd, 0xf9, 0x55, 0xe7, 0x3e, 0xbf, 0x24, 0x3e, 0x2d, 0x17, 0xc8, 0xaa, 0x73, - 0xff, 0x90, 0xdb, 0xbc, 0x32, 0x26, 0x75, 0xcb, 0x0d, 0xa3, 0x2f, 0xfc, 0xe7, 0xf8, 0x3f, 0x5b, - 0x76, 0xb4, 0x11, 0xd6, 0x96, 0xeb, 0x09, 0xd3, 0xa6, 0xbe, 0xda, 0x72, 0xbd, 0x64, 0x5b, 0xae, - 0xd7, 0x47, 0x5b, 0xae, 0x87, 0xde, 0x83, 0x61, 0x61, 0x79, 0x28, 0xa2, 0xff, 0x5c, 0xed, 0xa3, - 0x3d, 0x61, 0xb8, 0xc8, 0xdb, 0xbc, 0x2a, 0x2f, 0xc1, 0xa2, 0xb4, 0x67, 0xbb, 0xb2, 0x41, 0xf4, - 0xd7, 0x2c, 0x18, 0x17, 0xbf, 0x31, 0x79, 0xb7, 0x4d, 0xc2, 0x48, 0xc8, 0x9e, 0x9f, 0xec, 0xbf, - 0x0f, 0xa2, 0x22, 0xef, 0xca, 0x27, 0x25, 0x9b, 0x35, 0x81, 0x3d, 0x7b, 0x94, 0xe8, 0x05, 0xfa, - 0x07, 0x16, 0x9c, 0x6a, 0x3a, 0xf7, 0x79, 0x8b, 0xbc, 0x0c, 0x3b, 0x91, 0xeb, 0x8b, 0x17, 0xfc, - 0xd7, 0xfa, 0x9b, 0xfe, 0x8e, 0xea, 0xbc, 0x93, 0xf2, 0x99, 0xf1, 0x54, 0x1a, 0x4a, 0xcf, 0xae, - 0xa6, 0xf6, 0x6b, 0x76, 0x13, 0x0a, 0x72, 0xbd, 0xa5, 0xa8, 0x1a, 0x4a, 0xba, 0x60, 0x7d, 0x64, - 0xc3, 0x4f, 0xdd, 0xcb, 0x9f, 0xb6, 0x23, 0xd6, 0xda, 0x23, 0x6d, 0xe7, 0x1d, 0x18, 0xd5, 0xd7, - 0xd8, 0x23, 0x6d, 0xeb, 0x5d, 0x98, 0x4e, 0x59, 0x4b, 0x8f, 0xb4, 0xc9, 0x3d, 0x38, 0x9b, 0xb9, - 0x3e, 0x1e, 0x65, 0xc3, 0xf6, 0xcf, 0x5a, 0x3a, 0x1f, 0x3c, 0x81, 0xa7, 0x83, 0x25, 0xf3, 0xe9, - 0xe0, 0x42, 0xf7, 0x9d, 0x93, 0xf1, 0x7e, 0xf0, 0xb6, 0xde, 0x69, 0xca, 0xd5, 0xd1, 0x1b, 0x30, - 0xd4, 0xa0, 0x25, 0xd2, 0x7e, 0xd5, 0xee, 0xbd, 0x23, 0x63, 0x59, 0x8a, 0x95, 0x87, 0x58, 0x50, - 0xb0, 0x7f, 0xd1, 0x82, 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0xb3, 0x99, 0xa4, 0x45, 0x60, - 0xe2, 0x79, 0xec, 0xec, 0x2d, 0xdf, 0x8f, 0x88, 0x17, 0xb2, 0xab, 0x62, 0xea, 0xc0, 0xfc, 0x5f, - 0x30, 0x7d, 0xcb, 0x77, 0xea, 0x8b, 0x4e, 0xc3, 0xf1, 0x6a, 0x24, 0x28, 0x7b, 0x5b, 0x47, 0xb2, - 0xbd, 0xce, 0xf5, 0xb2, 0xbd, 0xb6, 0xb7, 0x01, 0xe9, 0x0d, 0x08, 0x27, 0x16, 0x0c, 0xc3, 0x2e, - 0x6f, 0x4a, 0x0c, 0xff, 0x93, 0xe9, 0xa2, 0x59, 0x47, 0xcf, 0x34, 0xf7, 0x0c, 0x5e, 0x80, 0x25, - 0x21, 0xfb, 0x65, 0x48, 0xf5, 0x84, 0xef, 0xad, 0x36, 0xb0, 0x3f, 0x03, 0x53, 0xac, 0xe6, 0x11, - 0xaf, 0xb4, 0x76, 0x42, 0x2b, 0x99, 0x12, 0x23, 0xcf, 0xfe, 0xa2, 0x05, 0x13, 0x6b, 0x89, 0xd0, - 0x61, 0x97, 0xd9, 0x3b, 0x66, 0x8a, 0x32, 0xbc, 0xca, 0x4a, 0xb1, 0x80, 0x1e, 0xbb, 0x0e, 0xea, - 0x2f, 0x2c, 0x88, 0x83, 0x53, 0x9c, 0x80, 0xe0, 0xb5, 0x64, 0x08, 0x5e, 0xa9, 0xba, 0x11, 0xd5, - 0x9d, 0x2c, 0xb9, 0x0b, 0xdd, 0x54, 0x61, 0x9b, 0xba, 0xa8, 0x45, 0x62, 0x32, 0x3c, 0xc8, 0xcf, - 0xb8, 0x19, 0xdb, 0x49, 0x06, 0x72, 0xb2, 0xff, 0x63, 0x0e, 0x90, 0xc2, 0xed, 0x3b, 0xac, 0x54, - 0x67, 0x8d, 0xe3, 0x09, 0x2b, 0xb5, 0x0b, 0x88, 0xbd, 0xc4, 0x07, 0x8e, 0x17, 0x72, 0xb2, 0xae, - 0xd0, 0xba, 0x1d, 0xed, 0x99, 0x7f, 0x56, 0x34, 0x89, 0x6e, 0x75, 0x50, 0xc3, 0x29, 0x2d, 0x68, - 0x16, 0x16, 0x83, 0xfd, 0x5a, 0x58, 0x0c, 0xf5, 0x70, 0x54, 0xfb, 0x19, 0x0b, 0xc6, 0xd4, 0x30, - 0x7d, 0x40, 0xcc, 0xc8, 0x55, 0x7f, 0x32, 0x58, 0x5f, 0x45, 0xeb, 0x32, 0x3b, 0x12, 0xbe, 0x99, - 0x39, 0x1c, 0x3a, 0x0d, 0xf7, 0x3d, 0xa2, 0x82, 0xfa, 0xcd, 0x09, 0x07, 0x42, 0x51, 0x7a, 0x78, - 0x30, 0x37, 0xa6, 0xfe, 0xf1, 0x20, 0xc2, 0x71, 0x15, 0xfb, 0x27, 0xe8, 0x66, 0x37, 0x97, 0x22, - 0x7a, 0x11, 0x06, 0x5b, 0xdb, 0x4e, 0x48, 0x12, 0xee, 0x36, 0x83, 0x15, 0x5a, 0x78, 0x78, 0x30, - 0x37, 0xae, 0x2a, 0xb0, 0x12, 0xcc, 0xb1, 0xfb, 0x0f, 0xd6, 0xd5, 0xb9, 0x38, 0x7b, 0x06, 0xeb, - 0xfa, 0x13, 0x0b, 0x06, 0xd6, 0xfc, 0xfa, 0x49, 0xb0, 0x80, 0xd7, 0x0d, 0x16, 0x70, 0x2e, 0x2b, - 0xbe, 0x7b, 0xe6, 0xee, 0x5f, 0x49, 0xec, 0xfe, 0x0b, 0x99, 0x14, 0xba, 0x6f, 0xfc, 0x26, 0x8c, - 0xb0, 0xa8, 0xf1, 0xc2, 0xb5, 0xe8, 0x79, 0x63, 0xc3, 0xcf, 0x25, 0x36, 0xfc, 0x84, 0x86, 0xaa, - 0xed, 0xf4, 0xa7, 0x60, 0x58, 0xf8, 0xaa, 0x24, 0xfd, 0x36, 0x05, 0x2e, 0x96, 0x70, 0xfb, 0xc7, - 0xf2, 0x60, 0x44, 0xa9, 0x47, 0xbf, 0x6c, 0xc1, 0x7c, 0xc0, 0x6d, 0x58, 0xeb, 0xa5, 0x76, 0xe0, - 0x7a, 0x5b, 0xd5, 0xda, 0x36, 0xa9, 0xb7, 0x1b, 0xae, 0xb7, 0x55, 0xde, 0xf2, 0x7c, 0x55, 0xbc, - 0x7c, 0x9f, 0xd4, 0xda, 0xec, 0xf9, 0xaa, 0x47, 0x48, 0x7c, 0x65, 0x0b, 0x7e, 0xed, 0xc1, 0xc1, - 0xdc, 0x3c, 0x3e, 0x12, 0x6d, 0x7c, 0xc4, 0xbe, 0xa0, 0xdf, 0xb4, 0xe0, 0x2a, 0x0f, 0xde, 0xde, - 0x7f, 0xff, 0xbb, 0xdc, 0x73, 0x2b, 0x92, 0x54, 0x4c, 0x64, 0x9d, 0x04, 0xcd, 0xc5, 0x97, 0xc4, - 0x80, 0x5e, 0xad, 0x1c, 0xad, 0x2d, 0x7c, 0xd4, 0xce, 0xd9, 0xff, 0x3c, 0x0f, 0x63, 0x22, 0xa8, - 0x93, 0x38, 0x03, 0x5e, 0x34, 0x96, 0xc4, 0x13, 0x89, 0x25, 0x31, 0x65, 0x20, 0x1f, 0x0f, 0xfb, - 0x0f, 0x61, 0x8a, 0x32, 0xe7, 0x1b, 0xc4, 0x09, 0xa2, 0x0d, 0xe2, 0x70, 0xc3, 0xa9, 0xfc, 0x91, - 0xb9, 0xbf, 0x52, 0xac, 0xdd, 0x4a, 0x12, 0xc3, 0x9d, 0xf4, 0xbf, 0x91, 0xce, 0x1c, 0x0f, 0x26, - 0x3b, 0xe2, 0x72, 0xbd, 0x05, 0x45, 0xe5, 0x68, 0x21, 0x98, 0x4e, 0xf7, 0xf0, 0x76, 0x49, 0x0a, - 0x5c, 0xf9, 0x15, 0x3b, 0xf9, 0xc4, 0xe4, 0xec, 0x7f, 0x98, 0x33, 0x1a, 0xe4, 0x93, 0xb8, 0x06, - 0x05, 0x27, 0x0c, 0xdd, 0x2d, 0x8f, 0xd4, 0xc5, 0x8e, 0xfd, 0x68, 0xd6, 0x8e, 0x35, 0x9a, 0x61, - 0xce, 0x2e, 0x0b, 0xa2, 0x26, 0x56, 0x34, 0xd0, 0x0d, 0x6e, 0x9e, 0xb6, 0x2b, 0x6f, 0x6a, 0xfd, - 0x51, 0x03, 0x69, 0xc0, 0xb6, 0x4b, 0xb0, 0xa8, 0x8f, 0x3e, 0xcb, 0xed, 0x07, 0x6f, 0x7a, 0xfe, - 0x9e, 0x77, 0xdd, 0xf7, 0x65, 0xe0, 0x84, 0xfe, 0x08, 0x4e, 0x49, 0xab, 0x41, 0x55, 0x1d, 0x9b, - 0xd4, 0xfa, 0x0b, 0x74, 0xf9, 0x6d, 0x30, 0x4d, 0x49, 0x9b, 0x7e, 0xcd, 0x21, 0x22, 0x30, 0x21, - 0x22, 0x86, 0xc9, 0x32, 0x31, 0x76, 0xa9, 0x97, 0x30, 0xb3, 0x76, 0xac, 0x01, 0xbe, 0x69, 0x92, - 0xc0, 0x49, 0x9a, 0xf6, 0x4f, 0x5a, 0xc0, 0x7c, 0x3c, 0x4f, 0x40, 0x1e, 0xf9, 0x94, 0x29, 0x8f, - 0xcc, 0x64, 0x0d, 0x72, 0x86, 0x28, 0xf2, 0x02, 0x5f, 0x59, 0x95, 0xc0, 0xbf, 0xbf, 0x2f, 0x8c, - 0x3e, 0x7a, 0xdf, 0x3f, 0xec, 0xff, 0x65, 0x71, 0x26, 0xa6, 0xdc, 0x20, 0xd0, 0xb7, 0x43, 0xa1, - 0xe6, 0xb4, 0x9c, 0x1a, 0x4f, 0xa9, 0x92, 0xa9, 0x8b, 0x33, 0x2a, 0xcd, 0x2f, 0x89, 0x1a, 0x5c, - 0xb7, 0x24, 0x23, 0xcf, 0x15, 0x64, 0x71, 0x4f, 0x7d, 0x92, 0x6a, 0x72, 0x76, 0x07, 0xc6, 0x0c, - 0x62, 0x8f, 0x54, 0x11, 0xf1, 0xed, 0xfc, 0x88, 0x55, 0x91, 0x12, 0x9b, 0x30, 0xe5, 0x69, 0xff, - 0xe9, 0x81, 0x22, 0x2f, 0x97, 0x1f, 0xed, 0x75, 0x88, 0xb2, 0xd3, 0x47, 0x73, 0x1f, 0x4d, 0x90, - 0xc1, 0x9d, 0x94, 0xed, 0x1f, 0xb7, 0xe0, 0x31, 0x1d, 0x51, 0xf3, 0x50, 0xe9, 0xa5, 0xdd, 0x2f, - 0x41, 0xc1, 0x6f, 0x91, 0xc0, 0x89, 0xfc, 0x40, 0x9c, 0x1a, 0x57, 0xe4, 0xa0, 0xdf, 0x16, 0xe5, - 0x87, 0x22, 0x20, 0xb9, 0xa4, 0x2e, 0xcb, 0xb1, 0xaa, 0x49, 0x6f, 0x9f, 0x6c, 0x30, 0x42, 0xe1, - 0x8b, 0xc4, 0x78, 0x00, 0x7b, 0xe8, 0x0e, 0xb1, 0x80, 0xd8, 0x5f, 0xb3, 0xf8, 0xc2, 0xd2, 0xbb, - 0x8e, 0xde, 0x85, 0xc9, 0xa6, 0x13, 0xd5, 0xb6, 0x97, 0xef, 0xb7, 0x02, 0xfe, 0x56, 0x22, 0xc7, - 0xe9, 0xe9, 0x5e, 0xe3, 0xa4, 0x7d, 0x64, 0x6c, 0x12, 0xb9, 0x9a, 0x20, 0x86, 0x3b, 0xc8, 0xa3, - 0x0d, 0x18, 0x61, 0x65, 0xcc, 0xcd, 0x2e, 0xec, 0x26, 0x1a, 0x64, 0xb5, 0xa6, 0x6c, 0x05, 0x56, - 0x63, 0x3a, 0x58, 0x27, 0x6a, 0xff, 0x74, 0x9e, 0xef, 0x76, 0x26, 0xca, 0x3f, 0x05, 0xc3, 0x2d, - 0xbf, 0xbe, 0x54, 0x2e, 0x61, 0x31, 0x0b, 0xea, 0x18, 0xa9, 0xf0, 0x62, 0x2c, 0xe1, 0xe8, 0x0a, - 0x14, 0xc4, 0x4f, 0xf9, 0xb6, 0xc5, 0x78, 0xb3, 0xc0, 0x0b, 0xb1, 0x82, 0xa2, 0x6b, 0x00, 0xad, - 0xc0, 0xdf, 0x75, 0xeb, 0x2c, 0xfc, 0x43, 0xde, 0x34, 0xf3, 0xa9, 0x28, 0x08, 0xd6, 0xb0, 0xd0, - 0xab, 0x30, 0xd6, 0xf6, 0x42, 0x2e, 0x8e, 0x68, 0xc1, 0x5e, 0x95, 0x01, 0xca, 0x1d, 0x1d, 0x88, - 0x4d, 0x5c, 0xb4, 0x00, 0x43, 0x91, 0xc3, 0xcc, 0x56, 0x06, 0xb3, 0xcd, 0x66, 0xd7, 0x29, 0x86, - 0x9e, 0xbd, 0x83, 0x56, 0xc0, 0xa2, 0x22, 0x7a, 0x4b, 0x7a, 0xbc, 0x72, 0xc6, 0x2e, 0xec, 0xd5, - 0xfb, 0x3b, 0x04, 0x34, 0x7f, 0x57, 0x61, 0x07, 0x6f, 0xd0, 0x42, 0xaf, 0x00, 0x90, 0xfb, 0x11, - 0x09, 0x3c, 0xa7, 0xa1, 0xac, 0xc2, 0x94, 0x5c, 0x50, 0xf2, 0xd7, 0xfc, 0xe8, 0x4e, 0x48, 0x96, - 0x15, 0x06, 0xd6, 0xb0, 0xed, 0xdf, 0x2c, 0x02, 0xc4, 0x72, 0x3b, 0x7a, 0xaf, 0x83, 0x71, 0x3d, - 0xd3, 0x5d, 0xd2, 0x3f, 0x3e, 0xae, 0x85, 0xbe, 0xc7, 0x82, 0x11, 0xa7, 0xd1, 0xf0, 0x6b, 0x0e, - 0x0f, 0xc7, 0x9b, 0xeb, 0xce, 0x38, 0x45, 0xfb, 0x0b, 0x71, 0x0d, 0xde, 0x85, 0xe7, 0xe5, 0x0a, - 0xd5, 0x20, 0x3d, 0x7b, 0xa1, 0x37, 0x8c, 0x3e, 0x21, 0xaf, 0x8a, 0x79, 0x63, 0x28, 0xd5, 0x55, - 0xb1, 0xc8, 0xce, 0x08, 0xfd, 0x96, 0x78, 0xc7, 0xb8, 0x25, 0x0e, 0x64, 0xbb, 0xf4, 0x19, 0xe2, - 0x6b, 0xaf, 0x0b, 0x22, 0xaa, 0xe8, 0xee, 0xfd, 0x83, 0xd9, 0xfe, 0x73, 0xda, 0x3d, 0xa9, 0x87, - 0x6b, 0xff, 0x3b, 0x30, 0x51, 0x37, 0x85, 0x00, 0xb1, 0x12, 0x9f, 0xcc, 0xa2, 0x9b, 0x90, 0x19, - 0xe2, 0x63, 0x3f, 0x01, 0xc0, 0x49, 0xc2, 0xa8, 0xc2, 0xa3, 0x3d, 0x94, 0xbd, 0x4d, 0x5f, 0xf8, - 0x4c, 0xd8, 0x99, 0x73, 0xb9, 0x1f, 0x46, 0xa4, 0x49, 0x31, 0xe3, 0xd3, 0x7d, 0x4d, 0xd4, 0xc5, - 0x8a, 0x0a, 0x7a, 0x03, 0x86, 0x98, 0x03, 0x55, 0x38, 0x53, 0xc8, 0xd6, 0x15, 0x9b, 0xe1, 0xcb, - 0xe2, 0x0d, 0xc9, 0xfe, 0x86, 0x58, 0x50, 0x40, 0x37, 0xa4, 0x7b, 0x62, 0x58, 0xf6, 0xee, 0x84, - 0x84, 0xb9, 0x27, 0x16, 0x17, 0x3f, 0x1a, 0x7b, 0x1e, 0xf2, 0xf2, 0xd4, 0x1c, 0x5f, 0x46, 0x4d, - 0x2a, 0x45, 0x89, 0xff, 0x32, 0x75, 0xd8, 0x0c, 0x64, 0x77, 0xcf, 0x4c, 0x2f, 0x16, 0x0f, 0xe7, - 0x5d, 0x93, 0x04, 0x4e, 0xd2, 0xa4, 0x12, 0x29, 0xdf, 0xf5, 0xc2, 0xeb, 0xa2, 0x17, 0xef, 0xe0, - 0x17, 0x71, 0x76, 0x1a, 0xf1, 0x12, 0x2c, 0xea, 0x9f, 0xa8, 0x78, 0x30, 0xeb, 0xc1, 0x64, 0x72, - 0x8b, 0x3e, 0x52, 0x71, 0xe4, 0x0f, 0x06, 0x60, 0xdc, 0x5c, 0x52, 0xe8, 0x2a, 0x14, 0x05, 0x11, - 0x15, 0xee, 0x5f, 0xed, 0x92, 0x55, 0x09, 0xc0, 0x31, 0x0e, 0xcb, 0xf2, 0xc0, 0xaa, 0x6b, 0x66, - 0xb6, 0x71, 0x96, 0x07, 0x05, 0xc1, 0x1a, 0x16, 0xbd, 0x58, 0x6d, 0xf8, 0x7e, 0xa4, 0x0e, 0x24, - 0xb5, 0xee, 0x16, 0x59, 0x29, 0x16, 0x50, 0x7a, 0x10, 0xed, 0x90, 0xc0, 0x23, 0x0d, 0x33, 0x30, - 0xb0, 0x3a, 0x88, 0x6e, 0xea, 0x40, 0x6c, 0xe2, 0xd2, 0xe3, 0xd4, 0x0f, 0xd9, 0x42, 0x16, 0xd7, - 0xb7, 0xd8, 0x6c, 0xb9, 0xca, 0x3d, 0xa4, 0x25, 0x1c, 0x7d, 0x06, 0x1e, 0x53, 0xc1, 0x8f, 0x30, - 0x7f, 0x87, 0x90, 0x2d, 0x0e, 0x19, 0xda, 0x96, 0xc7, 0x96, 0xd2, 0xd1, 0x70, 0x56, 0x7d, 0xf4, - 0x3a, 0x8c, 0x0b, 0x11, 0x5f, 0x52, 0x1c, 0x36, 0x4d, 0x63, 0x6e, 0x1a, 0x50, 0x9c, 0xc0, 0x96, - 0xa1, 0x8d, 0x99, 0x94, 0x2d, 0x29, 0x14, 0x3a, 0x43, 0x1b, 0xeb, 0x70, 0xdc, 0x51, 0x03, 0x2d, - 0xc0, 0x04, 0x97, 0xc1, 0x5c, 0x6f, 0x8b, 0xcf, 0x89, 0x70, 0x8a, 0x52, 0x5b, 0xea, 0xb6, 0x09, - 0xc6, 0x49, 0x7c, 0xf4, 0x32, 0x8c, 0x3a, 0x41, 0x6d, 0xdb, 0x8d, 0x48, 0x2d, 0x6a, 0x07, 0xdc, - 0x5b, 0x4a, 0xb3, 0x2d, 0x5a, 0xd0, 0x60, 0xd8, 0xc0, 0xb4, 0xdf, 0x83, 0xe9, 0x94, 0xd0, 0x09, - 0x74, 0xe1, 0x38, 0x2d, 0x57, 0x7e, 0x53, 0xc2, 0x00, 0x79, 0xa1, 0x52, 0x96, 0x5f, 0xa3, 0x61, - 0xd1, 0xd5, 0xc9, 0x42, 0x2c, 0x68, 0x99, 0x02, 0xd5, 0xea, 0x5c, 0x91, 0x00, 0x1c, 0xe3, 0xd8, - 0xff, 0x3d, 0x07, 0x13, 0x29, 0x6f, 0x2b, 0x2c, 0x5b, 0x5d, 0xe2, 0x92, 0x12, 0x27, 0xa7, 0x33, - 0x23, 0x65, 0xe7, 0x8e, 0x10, 0x29, 0x3b, 0xdf, 0x2b, 0x52, 0xf6, 0xc0, 0xfb, 0x89, 0x94, 0x6d, - 0x8e, 0xd8, 0x60, 0x5f, 0x23, 0x96, 0x12, 0x5d, 0x7b, 0xe8, 0x88, 0xd1, 0xb5, 0x8d, 0x41, 0x1f, - 0xee, 0x63, 0xd0, 0x7f, 0x28, 0x07, 0x93, 0x49, 0x1b, 0xc8, 0x13, 0xd0, 0xdb, 0xbe, 0x61, 0xe8, - 0x6d, 0xd3, 0x73, 0x3f, 0x26, 0x2d, 0x33, 0xb3, 0x74, 0xb8, 0x38, 0xa1, 0xc3, 0xfd, 0x78, 0x5f, - 0xd4, 0xba, 0xeb, 0x73, 0xff, 0x76, 0x0e, 0x4e, 0x27, 0xab, 0x2c, 0x35, 0x1c, 0xb7, 0x79, 0x02, - 0x63, 0x73, 0xdb, 0x18, 0x9b, 0x67, 0xfb, 0xf9, 0x1a, 0xd6, 0xb5, 0xcc, 0x01, 0xba, 0x97, 0x18, - 0xa0, 0xab, 0xfd, 0x93, 0xec, 0x3e, 0x4a, 0x5f, 0xcd, 0xc3, 0x85, 0xd4, 0x7a, 0xb1, 0xda, 0x73, - 0xc5, 0x50, 0x7b, 0x5e, 0x4b, 0xa8, 0x3d, 0xed, 0xee, 0xb5, 0x8f, 0x47, 0x0f, 0x2a, 0x1c, 0x5d, - 0x59, 0x1c, 0x80, 0x87, 0xd4, 0x81, 0x1a, 0x8e, 0xae, 0x8a, 0x10, 0x36, 0xe9, 0x7e, 0x23, 0xe9, - 0x3e, 0xff, 0xb5, 0x05, 0x67, 0x53, 0xe7, 0xe6, 0x04, 0x74, 0x5d, 0x6b, 0xa6, 0xae, 0xeb, 0xa9, - 0xbe, 0x57, 0x6b, 0x86, 0xf2, 0xeb, 0xd7, 0x07, 0x32, 0xbe, 0x85, 0xdd, 0xe4, 0x6f, 0xc3, 0x88, - 0x53, 0xab, 0x91, 0x30, 0x5c, 0xf5, 0xeb, 0x2a, 0x18, 0xf0, 0xb3, 0xec, 0x9e, 0x15, 0x17, 0x1f, - 0x1e, 0xcc, 0xcd, 0x26, 0x49, 0xc4, 0x60, 0xac, 0x53, 0x40, 0x9f, 0x85, 0x42, 0x28, 0xce, 0x4d, - 0x31, 0xf7, 0xcf, 0xf7, 0x39, 0x38, 0xce, 0x06, 0x69, 0x98, 0xd1, 0x8a, 0x94, 0xa6, 0x42, 0x91, - 0x34, 0x23, 0x9b, 0xe4, 0x8e, 0x35, 0xb2, 0xc9, 0x35, 0x80, 0x5d, 0x75, 0x19, 0x48, 0xea, 0x1f, - 0xb4, 0x6b, 0x82, 0x86, 0x85, 0xbe, 0x05, 0x26, 0x43, 0x1e, 0xce, 0x6f, 0xa9, 0xe1, 0x84, 0xcc, - 0xcd, 0x45, 0xac, 0x42, 0x16, 0x11, 0xa9, 0x9a, 0x80, 0xe1, 0x0e, 0x6c, 0xb4, 0x22, 0x5b, 0x65, - 0xb1, 0x07, 0xf9, 0xc2, 0xbc, 0x1c, 0xb7, 0x28, 0x72, 0xe5, 0x9e, 0x4a, 0x0e, 0x3f, 0x1b, 0x78, - 0xad, 0x26, 0xfa, 0x2c, 0x00, 0x5d, 0x3e, 0x42, 0x0f, 0x31, 0x9c, 0xcd, 0x3c, 0x29, 0x57, 0xa9, - 0xa7, 0x5a, 0xe5, 0x32, 0xdf, 0xd4, 0x92, 0x22, 0x82, 0x35, 0x82, 0xf6, 0x0f, 0x0d, 0xc0, 0xe3, - 0x5d, 0x78, 0x24, 0x5a, 0x30, 0xdf, 0x61, 0x9f, 0x4e, 0x5e, 0xae, 0x67, 0x53, 0x2b, 0x1b, 0xb7, - 0xed, 0xc4, 0x52, 0xcc, 0xbd, 0xef, 0xa5, 0xf8, 0xfd, 0x96, 0xa6, 0xf6, 0xe0, 0xb6, 0x9a, 0x9f, - 0x3a, 0x22, 0xef, 0x3f, 0x46, 0x3d, 0xc8, 0x66, 0x8a, 0x32, 0xe1, 0x5a, 0xdf, 0xdd, 0xe9, 0x5b, - 0xbb, 0x70, 0xb2, 0x5a, 0xe2, 0x2f, 0x58, 0xf0, 0x44, 0x6a, 0x7f, 0x0d, 0x8b, 0x9c, 0xab, 0x50, - 0xac, 0xd1, 0x42, 0xcd, 0x15, 0x31, 0xf6, 0xd1, 0x96, 0x00, 0x1c, 0xe3, 0x18, 0x86, 0x37, 0xb9, - 0x9e, 0x86, 0x37, 0xbf, 0x62, 0x41, 0xc7, 0xfe, 0x38, 0x01, 0x46, 0x5d, 0x36, 0x19, 0xf5, 0x47, - 0xfb, 0x99, 0xcb, 0x0c, 0x1e, 0xfd, 0xc7, 0x13, 0x70, 0x26, 0xc3, 0x15, 0x67, 0x17, 0xa6, 0xb6, - 0x6a, 0xc4, 0x74, 0xf2, 0x14, 0x1f, 0x93, 0xea, 0x0f, 0xdb, 0xd5, 0x23, 0x94, 0x25, 0xbe, 0x9c, - 0xea, 0x40, 0xc1, 0x9d, 0x4d, 0xa0, 0x2f, 0x58, 0x70, 0xca, 0xd9, 0x0b, 0x3b, 0x32, 0xe5, 0x8b, - 0x35, 0xf3, 0x42, 0xaa, 0x12, 0xa4, 0x47, 0x66, 0x7d, 0x9e, 0x09, 0x34, 0x0d, 0x0b, 0xa7, 0xb6, - 0x85, 0xb0, 0x08, 0x0f, 0x4f, 0xc5, 0xf9, 0x2e, 0x6e, 0xc8, 0x69, 0x3e, 0x53, 0xfc, 0x04, 0x91, - 0x10, 0xac, 0xe8, 0xa0, 0xcf, 0x43, 0x71, 0x4b, 0x3a, 0x32, 0xa6, 0x9c, 0x50, 0xf1, 0x40, 0x76, - 0x77, 0xef, 0xe4, 0x2f, 0x99, 0x0a, 0x09, 0xc7, 0x44, 0xd1, 0xeb, 0x90, 0xf7, 0x36, 0xc3, 0x6e, - 0xc9, 0x34, 0x13, 0x26, 0x6b, 0xdc, 0xd9, 0x7f, 0x6d, 0xa5, 0x8a, 0x69, 0x45, 0x74, 0x03, 0xf2, - 0xc1, 0x46, 0x5d, 0x68, 0xf0, 0x52, 0x79, 0x38, 0x5e, 0x2c, 0x65, 0xf4, 0x8a, 0x51, 0xc2, 0x8b, - 0x25, 0x4c, 0x49, 0xa0, 0x0a, 0x0c, 0x32, 0xff, 0x15, 0x71, 0x1e, 0xa4, 0x4a, 0xbe, 0x5d, 0xfc, - 0xc0, 0x78, 0x44, 0x00, 0x86, 0x80, 0x39, 0x21, 0xb4, 0x0e, 0x43, 0x35, 0x96, 0x78, 0x51, 0x84, - 0x15, 0xfb, 0x44, 0xaa, 0xae, 0xae, 0x4b, 0x46, 0x4a, 0xa1, 0xba, 0x62, 0x18, 0x58, 0xd0, 0x62, - 0x54, 0x49, 0x6b, 0x7b, 0x33, 0x14, 0x89, 0x82, 0xd3, 0xa9, 0x76, 0x49, 0xb4, 0x2a, 0xa8, 0x32, - 0x0c, 0x2c, 0x68, 0xa1, 0x57, 0x20, 0xb7, 0x59, 0x13, 0xbe, 0x29, 0xa9, 0x4a, 0x3b, 0x33, 0x5e, - 0xc3, 0xe2, 0xd0, 0x83, 0x83, 0xb9, 0xdc, 0xca, 0x12, 0xce, 0x6d, 0xd6, 0xd0, 0x1a, 0x0c, 0x6f, - 0x72, 0x0f, 0x6f, 0xa1, 0x97, 0x7b, 0x32, 0xdd, 0xf9, 0xbc, 0xc3, 0x09, 0x9c, 0xbb, 0x65, 0x08, - 0x00, 0x96, 0x44, 0x58, 0xb4, 0x75, 0xe5, 0xa9, 0x2e, 0x22, 0x70, 0xcd, 0x1f, 0x2d, 0xba, 0x00, - 0x3f, 0x9f, 0x63, 0x7f, 0x77, 0xac, 0x51, 0xa4, 0xab, 0xda, 0x91, 0xd9, 0xda, 0x45, 0x44, 0x95, - 0xd4, 0x55, 0xdd, 0x23, 0x91, 0x3d, 0x5f, 0xd5, 0x0a, 0x09, 0xc7, 0x44, 0xd1, 0x0e, 0x8c, 0xed, - 0x86, 0xad, 0x6d, 0x22, 0xb7, 0x34, 0x0b, 0xb0, 0x92, 0x71, 0x84, 0xdd, 0x15, 0x88, 0x6e, 0x10, - 0xb5, 0x9d, 0x46, 0x07, 0x17, 0x62, 0xcf, 0xdf, 0x77, 0x75, 0x62, 0xd8, 0xa4, 0x4d, 0x87, 0xff, - 0xdd, 0xb6, 0xbf, 0xb1, 0x1f, 0x11, 0x11, 0x38, 0x2b, 0x75, 0xf8, 0xdf, 0xe4, 0x28, 0x9d, 0xc3, - 0x2f, 0x00, 0x58, 0x12, 0x41, 0x77, 0xc5, 0xf0, 0x30, 0xee, 0x39, 0x99, 0x1d, 0xdd, 0x72, 0x41, - 0x22, 0x65, 0x0c, 0x0a, 0xe3, 0x96, 0x31, 0x29, 0xc6, 0x25, 0x5b, 0xdb, 0x7e, 0xe4, 0x7b, 0x09, - 0x0e, 0x3d, 0x95, 0xcd, 0x25, 0x2b, 0x29, 0xf8, 0x9d, 0x5c, 0x32, 0x0d, 0x0b, 0xa7, 0xb6, 0x85, - 0xea, 0x30, 0xde, 0xf2, 0x83, 0x68, 0xcf, 0x0f, 0xe4, 0xfa, 0x42, 0x5d, 0xf4, 0x0a, 0x06, 0xa6, - 0x68, 0x91, 0xc5, 0xa4, 0x33, 0x21, 0x38, 0x41, 0x13, 0x7d, 0x1a, 0x86, 0xc3, 0x9a, 0xd3, 0x20, - 0xe5, 0xdb, 0x33, 0xd3, 0xd9, 0xc7, 0x4f, 0x95, 0xa3, 0x64, 0xac, 0x2e, 0x1e, 0x9a, 0x9d, 0xa3, - 0x60, 0x49, 0x0e, 0xad, 0xc0, 0x20, 0xcb, 0xa6, 0xc5, 0xa2, 0xbc, 0x65, 0x04, 0xe9, 0xec, 0x30, - 0x20, 0xe6, 0xbc, 0x89, 0x15, 0x63, 0x5e, 0x9d, 0xee, 0x01, 0x21, 0x5e, 0xfb, 0xe1, 0xcc, 0xe9, - 0xec, 0x3d, 0x20, 0xa4, 0xf2, 0xdb, 0xd5, 0x6e, 0x7b, 0x40, 0x21, 0xe1, 0x98, 0x28, 0xe5, 0xcc, - 0x94, 0x9b, 0x9e, 0xe9, 0x62, 0xf9, 0x92, 0xc9, 0x4b, 0x19, 0x67, 0xa6, 0x9c, 0x94, 0x92, 0xb0, - 0x7f, 0x6f, 0xb8, 0x53, 0x66, 0x61, 0x17, 0xb2, 0xef, 0xb2, 0x3a, 0xde, 0xea, 0x3e, 0xd9, 0xaf, - 0x7e, 0xe8, 0x18, 0xa5, 0xd5, 0x2f, 0x58, 0x70, 0xa6, 0x95, 0xfa, 0x21, 0x42, 0x00, 0xe8, 0x4f, - 0xcd, 0xc4, 0x3f, 0x5d, 0x45, 0x04, 0x4c, 0x87, 0xe3, 0x8c, 0x96, 0x92, 0x37, 0x82, 0xfc, 0xfb, - 0xbe, 0x11, 0xac, 0x42, 0x81, 0x09, 0x99, 0x3d, 0x12, 0x11, 0x27, 0x2f, 0x46, 0x4c, 0x94, 0x58, - 0x12, 0x15, 0xb1, 0x22, 0x81, 0x7e, 0xc0, 0x82, 0xf3, 0xc9, 0xae, 0x63, 0xc2, 0xc0, 0x22, 0x8c, - 0x20, 0xbf, 0x0b, 0xae, 0x88, 0xef, 0x3f, 0x5f, 0xe9, 0x86, 0x7c, 0xd8, 0x0b, 0x01, 0x77, 0x6f, - 0x0c, 0x95, 0x52, 0x2e, 0xa3, 0x43, 0xa6, 0x02, 0xbe, 0x8f, 0x0b, 0xe9, 0x0b, 0x30, 0xda, 0xf4, - 0xdb, 0x5e, 0x24, 0x0c, 0x65, 0xc4, 0xa3, 0x3d, 0x7b, 0xac, 0x5e, 0xd5, 0xca, 0xb1, 0x81, 0x95, - 0xb8, 0xc6, 0x16, 0x1e, 0xfa, 0x1a, 0xfb, 0x36, 0x8c, 0x7a, 0x9a, 0x65, 0xa7, 0x90, 0x07, 0x2e, - 0x67, 0x87, 0x00, 0xd5, 0xed, 0x40, 0x79, 0x2f, 0xf5, 0x12, 0x6c, 0x50, 0x3b, 0xd9, 0xbb, 0xd1, - 0x97, 0xad, 0x14, 0xa1, 0x9e, 0xdf, 0x96, 0x5f, 0x33, 0x6f, 0xcb, 0x97, 0x93, 0xb7, 0xe5, 0x0e, - 0xe5, 0xab, 0x71, 0x51, 0xee, 0x3f, 0xc3, 0x49, 0xbf, 0xd1, 0xfe, 0xec, 0x06, 0x5c, 0xec, 0x75, - 0x2c, 0x31, 0x8b, 0xa9, 0xba, 0x7a, 0x6a, 0x8b, 0x2d, 0xa6, 0xea, 0xe5, 0x12, 0x66, 0x90, 0x7e, - 0xe3, 0xc8, 0xd8, 0xff, 0xcd, 0x82, 0x7c, 0xc5, 0xaf, 0x9f, 0x80, 0x32, 0xf9, 0x53, 0x86, 0x32, - 0xf9, 0xf1, 0xf4, 0x03, 0xb1, 0x9e, 0xa9, 0x3a, 0x5e, 0x4e, 0xa8, 0x8e, 0xcf, 0x67, 0x11, 0xe8, - 0xae, 0x28, 0xfe, 0x89, 0x3c, 0x8c, 0x54, 0xfc, 0xba, 0x32, 0x57, 0xfe, 0xf5, 0x87, 0x31, 0x57, - 0xce, 0x8c, 0xd3, 0xaf, 0x51, 0x66, 0x86, 0x56, 0xd2, 0xc7, 0xf2, 0x2f, 0x99, 0xd5, 0xf2, 0x3d, - 0xe2, 0x6e, 0x6d, 0x47, 0xa4, 0x9e, 0xfc, 0x9c, 0x93, 0xb3, 0x5a, 0xfe, 0xaf, 0x16, 0x4c, 0x24, - 0x5a, 0x47, 0x0d, 0x18, 0x6b, 0xe8, 0x8a, 0x49, 0xb1, 0x4e, 0x1f, 0x4a, 0xa7, 0x29, 0xac, 0x3e, - 0xb5, 0x22, 0x6c, 0x12, 0x47, 0xf3, 0x00, 0xea, 0xa5, 0x4e, 0x6a, 0xc0, 0x98, 0xd4, 0xaf, 0x9e, - 0xf2, 0x42, 0xac, 0x61, 0xa0, 0x17, 0x61, 0x24, 0xf2, 0x5b, 0x7e, 0xc3, 0xdf, 0xda, 0xbf, 0x49, - 0x64, 0xe4, 0x22, 0x65, 0xcb, 0xb5, 0x1e, 0x83, 0xb0, 0x8e, 0x67, 0xff, 0x54, 0x9e, 0x7f, 0xa8, - 0x17, 0xb9, 0x1f, 0xae, 0xc9, 0x0f, 0xf6, 0x9a, 0xfc, 0xaa, 0x05, 0x93, 0xb4, 0x75, 0x66, 0x2e, - 0x22, 0x0f, 0x5b, 0x15, 0xfa, 0xd7, 0xea, 0x12, 0xfa, 0xf7, 0x32, 0xe5, 0x5d, 0x75, 0xbf, 0x1d, - 0x09, 0x0d, 0x9a, 0xc6, 0x9c, 0x68, 0x29, 0x16, 0x50, 0x81, 0x47, 0x82, 0x40, 0xb8, 0xb8, 0xe9, - 0x78, 0x24, 0x08, 0xb0, 0x80, 0xca, 0xc8, 0xc0, 0x03, 0xe9, 0x91, 0x81, 0x79, 0x1c, 0x46, 0x61, - 0x58, 0x20, 0xc4, 0x1e, 0x2d, 0x0e, 0xa3, 0xb4, 0x38, 0x88, 0x71, 0xec, 0x9f, 0xcd, 0xc3, 0x68, - 0xc5, 0xaf, 0xc7, 0x6f, 0x65, 0x2f, 0x18, 0x6f, 0x65, 0x17, 0x13, 0x6f, 0x65, 0x93, 0x3a, 0xee, - 0x87, 0x2f, 0x63, 0x5f, 0xaf, 0x97, 0xb1, 0x7f, 0x66, 0xb1, 0x59, 0x2b, 0xad, 0x55, 0xb9, 0xf5, - 0x11, 0x7a, 0x0e, 0x46, 0x18, 0x43, 0x62, 0x3e, 0x95, 0xf2, 0x01, 0x89, 0x65, 0xbc, 0x59, 0x8b, - 0x8b, 0xb1, 0x8e, 0x83, 0xae, 0x40, 0x21, 0x24, 0x4e, 0x50, 0xdb, 0x56, 0x3c, 0x4e, 0xbc, 0xf6, - 0xf0, 0x32, 0xac, 0xa0, 0xe8, 0xcd, 0x38, 0x04, 0x60, 0x3e, 0xdb, 0x47, 0x4b, 0xef, 0x0f, 0xdf, - 0x22, 0xd9, 0x71, 0xff, 0xec, 0x7b, 0x80, 0x3a, 0xf1, 0xfb, 0x88, 0x7d, 0x35, 0x67, 0xc6, 0xbe, - 0x2a, 0x76, 0xc4, 0xbd, 0xfa, 0x73, 0x0b, 0xc6, 0x2b, 0x7e, 0x9d, 0x6e, 0xdd, 0x6f, 0xa4, 0x7d, - 0xaa, 0xc7, 0x3f, 0x1d, 0xea, 0x12, 0xff, 0xf4, 0x12, 0x0c, 0x56, 0xfc, 0x7a, 0xb9, 0xd2, 0xcd, - 0xb7, 0xd9, 0xfe, 0x3b, 0x16, 0x0c, 0x57, 0xfc, 0xfa, 0x09, 0x28, 0xe7, 0x5f, 0x33, 0x95, 0xf3, - 0x8f, 0x65, 0xac, 0x9b, 0x0c, 0x7d, 0xfc, 0xdf, 0x1a, 0x80, 0x31, 0xda, 0x4f, 0x7f, 0x4b, 0x4e, - 0xa5, 0x31, 0x6c, 0x56, 0x1f, 0xc3, 0x46, 0x65, 0x61, 0xbf, 0xd1, 0xf0, 0xf7, 0x92, 0xd3, 0xba, - 0xc2, 0x4a, 0xb1, 0x80, 0xa2, 0x67, 0xa0, 0xd0, 0x0a, 0xc8, 0xae, 0xeb, 0x0b, 0x21, 0x53, 0x7b, - 0xea, 0xa8, 0x88, 0x72, 0xac, 0x30, 0xe8, 0xe5, 0x2c, 0x74, 0xbd, 0x1a, 0xa9, 0x92, 0x9a, 0xef, - 0xd5, 0xb9, 0xfe, 0x3a, 0x2f, 0xa2, 0xff, 0x6b, 0xe5, 0xd8, 0xc0, 0x42, 0xf7, 0xa0, 0xc8, 0xfe, - 0x33, 0xb6, 0x73, 0xf4, 0x3c, 0x92, 0x22, 0xaf, 0x98, 0x20, 0x80, 0x63, 0x5a, 0xe8, 0x1a, 0x40, - 0x24, 0x03, 0x5d, 0x87, 0x22, 0xce, 0x91, 0x12, 0xc8, 0x55, 0x08, 0xec, 0x10, 0x6b, 0x58, 0xe8, - 0x69, 0x28, 0x46, 0x8e, 0xdb, 0xb8, 0xe5, 0x7a, 0x24, 0x64, 0x7a, 0xe9, 0xbc, 0x4c, 0xef, 0x25, - 0x0a, 0x71, 0x0c, 0xa7, 0x02, 0x11, 0x0b, 0x02, 0xc0, 0xb3, 0xd0, 0x16, 0x18, 0x36, 0x13, 0x88, - 0x6e, 0xa9, 0x52, 0xac, 0x61, 0xa0, 0x6d, 0x38, 0xe7, 0x7a, 0x2c, 0x52, 0x3e, 0xa9, 0xee, 0xb8, - 0xad, 0xf5, 0x5b, 0xd5, 0xbb, 0x24, 0x70, 0x37, 0xf7, 0x17, 0x9d, 0xda, 0x0e, 0xf1, 0x64, 0x86, - 0xc0, 0x8f, 0x8a, 0x2e, 0x9e, 0x2b, 0x77, 0xc1, 0xc5, 0x5d, 0x29, 0xd9, 0x2f, 0xc3, 0xe9, 0x8a, - 0x5f, 0xaf, 0xf8, 0x41, 0xb4, 0xe2, 0x07, 0x7b, 0x4e, 0x50, 0x97, 0x2b, 0x65, 0x4e, 0x26, 0x13, - 0xa1, 0xac, 0x70, 0x90, 0x33, 0x0a, 0x23, 0xa5, 0xd5, 0xf3, 0x4c, 0xf8, 0x3a, 0xa2, 0x33, 0x4a, - 0x8d, 0x89, 0x01, 0x2a, 0x6d, 0xc4, 0x75, 0x27, 0x22, 0xe8, 0x36, 0x4b, 0x87, 0x1b, 0x9f, 0x88, - 0xa2, 0xfa, 0x53, 0x5a, 0x3a, 0xdc, 0x18, 0x98, 0x7a, 0x84, 0x9a, 0xf5, 0xed, 0xbf, 0x32, 0xc8, - 0x98, 0x63, 0x22, 0xf5, 0x00, 0xfa, 0x1c, 0x8c, 0x87, 0xe4, 0x96, 0xeb, 0xb5, 0xef, 0x4b, 0x9d, - 0x40, 0x17, 0x77, 0xa2, 0xea, 0xb2, 0x8e, 0xc9, 0x35, 0x8b, 0x66, 0x19, 0x4e, 0x50, 0x43, 0x4d, - 0x18, 0xdf, 0x73, 0xbd, 0xba, 0xbf, 0x17, 0x4a, 0xfa, 0x85, 0x6c, 0x05, 0xe3, 0x3d, 0x8e, 0x99, - 0xe8, 0xa3, 0xd1, 0xdc, 0x3d, 0x83, 0x18, 0x4e, 0x10, 0xa7, 0x0b, 0x30, 0x68, 0x7b, 0x0b, 0xe1, - 0x9d, 0x90, 0x04, 0x22, 0xb1, 0x31, 0x5b, 0x80, 0x58, 0x16, 0xe2, 0x18, 0x4e, 0x17, 0x20, 0xfb, - 0x73, 0x3d, 0xf0, 0xdb, 0x3c, 0x1c, 0xbd, 0x58, 0x80, 0x58, 0x95, 0x62, 0x0d, 0x83, 0x6e, 0x50, - 0xf6, 0x6f, 0xcd, 0xf7, 0xb0, 0xef, 0x47, 0x72, 0x4b, 0xb3, 0x54, 0x9a, 0x5a, 0x39, 0x36, 0xb0, - 0xd0, 0x0a, 0xa0, 0xb0, 0xdd, 0x6a, 0x35, 0x98, 0x9d, 0x82, 0xd3, 0x60, 0xa4, 0xf8, 0x1b, 0x71, - 0x9e, 0x47, 0xe9, 0xac, 0x76, 0x40, 0x71, 0x4a, 0x0d, 0xca, 0xab, 0x37, 0x45, 0x57, 0x07, 0x59, - 0x57, 0xf9, 0x63, 0x44, 0x95, 0xf7, 0x53, 0xc2, 0xd0, 0x32, 0x0c, 0x87, 0xfb, 0x61, 0x2d, 0x12, - 0xe1, 0xc6, 0x32, 0xb2, 0xcb, 0x54, 0x19, 0x8a, 0x96, 0xdc, 0x8c, 0x57, 0xc1, 0xb2, 0x2e, 0xaa, - 0xc1, 0xb4, 0xa0, 0xb8, 0xb4, 0xed, 0x78, 0x2a, 0x57, 0x07, 0x37, 0xd7, 0x7c, 0xee, 0xc1, 0xc1, - 0xdc, 0xb4, 0x68, 0x59, 0x07, 0x1f, 0x1e, 0xcc, 0x9d, 0xa9, 0xf8, 0xf5, 0x14, 0x08, 0x4e, 0xa3, - 0x66, 0x7f, 0x3b, 0x93, 0x37, 0x58, 0xae, 0xdd, 0xa8, 0x1d, 0x10, 0xd4, 0x84, 0xb1, 0x16, 0x5b, - 0xc6, 0x22, 0x88, 0xbb, 0x58, 0x8b, 0x2f, 0xf4, 0xa9, 0x38, 0xd8, 0xa3, 0x6c, 0x5a, 0x29, 0xf6, - 0xd8, 0x8d, 0xac, 0xa2, 0x93, 0xc3, 0x26, 0x75, 0xfb, 0x47, 0x1f, 0x63, 0x27, 0x56, 0x95, 0x6b, - 0x03, 0x86, 0x85, 0xf5, 0xb6, 0xb8, 0xfa, 0xcc, 0x66, 0xab, 0xa5, 0xe2, 0x61, 0x13, 0x16, 0xe0, - 0x58, 0xd6, 0x45, 0x9f, 0x85, 0x71, 0x7a, 0x93, 0xd0, 0x92, 0x58, 0x9c, 0xca, 0xf6, 0xb2, 0x8f, - 0x73, 0x57, 0x68, 0x09, 0x1e, 0xf4, 0xca, 0x38, 0x41, 0x0c, 0xbd, 0xc9, 0xec, 0x0c, 0xcc, 0xfc, - 0x18, 0x3d, 0x48, 0xeb, 0x26, 0x05, 0x92, 0xac, 0x46, 0x24, 0x2b, 0xf7, 0x86, 0xfd, 0x68, 0x73, - 0x6f, 0xa0, 0x5b, 0x30, 0x26, 0x12, 0xce, 0x8a, 0x95, 0x95, 0x37, 0xb4, 0x65, 0x63, 0x58, 0x07, - 0x1e, 0x26, 0x0b, 0xb0, 0x59, 0x19, 0x6d, 0xc1, 0x79, 0x2d, 0x01, 0xcc, 0xf5, 0xc0, 0x61, 0x4f, - 0xde, 0x2e, 0x63, 0x77, 0xda, 0x59, 0xfa, 0xc4, 0x83, 0x83, 0xb9, 0xf3, 0xeb, 0xdd, 0x10, 0x71, - 0x77, 0x3a, 0xe8, 0x36, 0x9c, 0xe6, 0x3e, 0xa2, 0x25, 0xe2, 0xd4, 0x1b, 0xae, 0xa7, 0x0e, 0x6b, - 0xbe, 0x25, 0xcf, 0x3e, 0x38, 0x98, 0x3b, 0xbd, 0x90, 0x86, 0x80, 0xd3, 0xeb, 0xa1, 0xd7, 0xa0, - 0x58, 0xf7, 0x42, 0x31, 0x06, 0x43, 0x46, 0x8e, 0x9d, 0x62, 0x69, 0xad, 0xaa, 0xbe, 0x3f, 0xfe, - 0x83, 0xe3, 0x0a, 0x68, 0x8b, 0x6b, 0x54, 0x95, 0x02, 0x63, 0xb8, 0x23, 0xba, 0x4d, 0x52, 0x15, - 0x66, 0x78, 0x89, 0xf1, 0xa7, 0x04, 0x65, 0x3c, 0x6d, 0x38, 0x90, 0x19, 0x84, 0xd1, 0x1b, 0x80, - 0xa8, 0x84, 0xef, 0xd6, 0xc8, 0x42, 0x8d, 0x65, 0x08, 0x60, 0x0a, 0xe8, 0x82, 0xe9, 0xb7, 0x54, - 0xed, 0xc0, 0xc0, 0x29, 0xb5, 0xd0, 0x0d, 0x7a, 0xe4, 0xe8, 0xa5, 0x82, 0xab, 0xa8, 0x8c, 0x68, - 0x25, 0xd2, 0x0a, 0x48, 0xcd, 0x89, 0x48, 0xdd, 0xa4, 0x88, 0x13, 0xf5, 0x50, 0x1d, 0xce, 0x39, - 0xed, 0xc8, 0x67, 0xca, 0x6a, 0x13, 0x75, 0xdd, 0xdf, 0x21, 0x1e, 0x7b, 0x27, 0x2a, 0x2c, 0x5e, - 0xa4, 0xd2, 0xc0, 0x42, 0x17, 0x3c, 0xdc, 0x95, 0x0a, 0x95, 0xe2, 0x54, 0x0a, 0x54, 0x30, 0x83, - 0xf6, 0xa4, 0xa4, 0x41, 0x7d, 0x11, 0x46, 0xb6, 0xfd, 0x30, 0x5a, 0x23, 0xd1, 0x9e, 0x1f, 0xec, - 0x88, 0xd0, 0x8b, 0x71, 0xb8, 0xde, 0x18, 0x84, 0x75, 0x3c, 0x7a, 0x4d, 0x63, 0x56, 0x0c, 0xe5, - 0x12, 0x7b, 0x40, 0x2e, 0xc4, 0x3c, 0xe6, 0x06, 0x2f, 0xc6, 0x12, 0x2e, 0x51, 0xcb, 0x95, 0x25, - 0xf6, 0x18, 0x9c, 0x40, 0x2d, 0x57, 0x96, 0xb0, 0x84, 0xd3, 0xe5, 0x1a, 0x6e, 0x3b, 0x01, 0xa9, - 0x04, 0x7e, 0x8d, 0x84, 0x5a, 0x90, 0xe8, 0xc7, 0x79, 0x60, 0x49, 0xba, 0x5c, 0xab, 0x69, 0x08, - 0x38, 0xbd, 0x1e, 0x22, 0x9d, 0xc9, 0x8f, 0xc6, 0xb3, 0xb5, 0xf8, 0x9d, 0xf2, 0x46, 0x9f, 0xf9, - 0x8f, 0x3c, 0x98, 0x54, 0x69, 0x97, 0x78, 0x28, 0xc9, 0x70, 0x66, 0x82, 0xad, 0xed, 0xfe, 0xe3, - 0x50, 0xaa, 0x77, 0x91, 0x72, 0x82, 0x12, 0xee, 0xa0, 0x6d, 0xc4, 0x65, 0x9a, 0xec, 0x99, 0x13, - 0xf7, 0x2a, 0x14, 0xc3, 0xf6, 0x46, 0xdd, 0x6f, 0x3a, 0xae, 0xc7, 0x1e, 0x83, 0xb5, 0xfb, 0x42, - 0x55, 0x02, 0x70, 0x8c, 0x83, 0x56, 0xa0, 0xe0, 0xc8, 0x47, 0x0f, 0x94, 0x1d, 0xce, 0x43, 0x3d, - 0x75, 0x70, 0x0f, 0x77, 0xf9, 0xcc, 0xa1, 0xea, 0xa2, 0x57, 0x61, 0x4c, 0xf8, 0x38, 0x8a, 0x8c, - 0x7f, 0xd3, 0xa6, 0x23, 0x4a, 0x55, 0x07, 0x62, 0x13, 0x17, 0xdd, 0x81, 0x91, 0xc8, 0x6f, 0x30, - 0x6f, 0x0a, 0x2a, 0x86, 0x9d, 0xc9, 0x0e, 0x09, 0xb6, 0xae, 0xd0, 0x74, 0x7d, 0xa3, 0xaa, 0x8a, - 0x75, 0x3a, 0x68, 0x9d, 0xaf, 0x77, 0x16, 0x2c, 0x99, 0x84, 0x33, 0x8f, 0x65, 0x9f, 0x49, 0x2a, - 0xa6, 0xb2, 0xb9, 0x1d, 0x44, 0x4d, 0xac, 0x93, 0x41, 0xd7, 0x61, 0xaa, 0x15, 0xb8, 0x3e, 0x5b, - 0x13, 0xea, 0xbd, 0x6b, 0xc6, 0xcc, 0xd4, 0x52, 0x49, 0x22, 0xe0, 0xce, 0x3a, 0xcc, 0x45, 0x55, - 0x14, 0xce, 0x9c, 0xe5, 0x49, 0x81, 0xf9, 0xf5, 0x8b, 0x97, 0x61, 0x05, 0x45, 0xab, 0x8c, 0x13, - 0x73, 0xcd, 0xc1, 0xcc, 0x6c, 0x76, 0x04, 0x11, 0x5d, 0xc3, 0xc0, 0x85, 0x4b, 0xf5, 0x17, 0xc7, - 0x14, 0x50, 0x5d, 0xcb, 0x1e, 0x47, 0x25, 0xfa, 0x70, 0xe6, 0x5c, 0x17, 0x53, 0xb2, 0x84, 0xf8, - 0x1f, 0x0b, 0x04, 0x46, 0x71, 0x88, 0x13, 0x34, 0xd1, 0xb7, 0xc0, 0xa4, 0x88, 0x58, 0x16, 0x0f, - 0xd3, 0xf9, 0xd8, 0x46, 0x15, 0x27, 0x60, 0xb8, 0x03, 0x9b, 0x07, 0x91, 0x77, 0x36, 0x1a, 0x44, - 0xb0, 0xbe, 0x5b, 0xae, 0xb7, 0x13, 0xce, 0x5c, 0x60, 0xfc, 0x41, 0x04, 0x91, 0x4f, 0x42, 0x71, - 0x4a, 0x0d, 0xb4, 0x0e, 0x93, 0xad, 0x80, 0x90, 0x26, 0x13, 0xc4, 0xc5, 0x79, 0x36, 0xc7, 0x3d, - 0xb4, 0x69, 0x4f, 0x2a, 0x09, 0xd8, 0x61, 0x4a, 0x19, 0xee, 0xa0, 0x80, 0xf6, 0xa0, 0xe0, 0xef, - 0x92, 0x60, 0x9b, 0x38, 0xf5, 0x99, 0x8b, 0x5d, 0x6c, 0xa6, 0xc5, 0xe1, 0x76, 0x5b, 0xe0, 0x26, - 0xde, 0xc8, 0x65, 0x71, 0xef, 0x37, 0x72, 0xd9, 0x18, 0xfa, 0x41, 0x0b, 0xce, 0x4a, 0xb5, 0x7a, - 0xb5, 0x45, 0x47, 0x7d, 0xc9, 0xf7, 0xc2, 0x28, 0xe0, 0x3e, 0xc5, 0x4f, 0x64, 0xfb, 0xd9, 0xae, - 0x67, 0x54, 0x52, 0xca, 0xcb, 0xb3, 0x59, 0x18, 0x21, 0xce, 0x6e, 0x11, 0x2d, 0xc1, 0x54, 0x48, - 0x22, 0xc9, 0x8c, 0x16, 0xc2, 0x95, 0x37, 0x4b, 0x6b, 0x33, 0x97, 0xb8, 0x43, 0x34, 0xdd, 0x0c, - 0xd5, 0x24, 0x10, 0x77, 0xe2, 0xcf, 0x7e, 0x33, 0x4c, 0x75, 0x1c, 0xff, 0x47, 0x49, 0x8e, 0x31, - 0xbb, 0x03, 0x63, 0xc6, 0x10, 0x3f, 0xd2, 0x37, 0xd6, 0x7f, 0x35, 0x0c, 0x45, 0xf5, 0xfe, 0x86, - 0xae, 0x9a, 0xcf, 0xaa, 0x67, 0x93, 0xcf, 0xaa, 0x05, 0x7a, 0xef, 0xd6, 0x5f, 0x52, 0xd7, 0x53, - 0xc2, 0x40, 0x65, 0x6d, 0xe8, 0xfe, 0xfd, 0x7b, 0x35, 0x75, 0x6a, 0xbe, 0xef, 0xf7, 0xd9, 0x81, - 0xae, 0x1a, 0xda, 0xeb, 0x30, 0xe5, 0xf9, 0x4c, 0xe6, 0x24, 0x75, 0x29, 0x50, 0x30, 0xb9, 0xa1, - 0xa8, 0xc7, 0x55, 0x48, 0x20, 0xe0, 0xce, 0x3a, 0xb4, 0x41, 0x7e, 0xf0, 0x27, 0x55, 0xc2, 0x5c, - 0x2e, 0xc0, 0x02, 0x8a, 0x2e, 0xc1, 0x60, 0xcb, 0xaf, 0x97, 0x2b, 0x42, 0xde, 0xd4, 0xf2, 0x9d, - 0xd6, 0xcb, 0x15, 0xcc, 0x61, 0x68, 0x01, 0x86, 0xd8, 0x8f, 0x70, 0x66, 0x34, 0xdb, 0x81, 0x9e, - 0xd5, 0xd0, 0x52, 0x8f, 0xb0, 0x0a, 0x58, 0x54, 0x64, 0xaa, 0x29, 0x2a, 0xa4, 0x33, 0xd5, 0xd4, - 0xf0, 0x43, 0xaa, 0xa6, 0x24, 0x01, 0x1c, 0xd3, 0x42, 0xf7, 0xe1, 0xb4, 0x71, 0x31, 0xe2, 0x4b, - 0x84, 0x84, 0xc2, 0x89, 0xf7, 0x52, 0xd7, 0x1b, 0x91, 0x78, 0xcf, 0x3d, 0x2f, 0x3a, 0x7d, 0xba, - 0x9c, 0x46, 0x09, 0xa7, 0x37, 0x80, 0x1a, 0x30, 0x55, 0xeb, 0x68, 0xb5, 0xd0, 0x7f, 0xab, 0x6a, - 0x42, 0x3b, 0x5b, 0xec, 0x24, 0x8c, 0x5e, 0x85, 0xc2, 0xbb, 0x7e, 0xc8, 0x78, 0xb5, 0x90, 0x91, - 0xa5, 0x07, 0x68, 0xe1, 0xcd, 0xdb, 0x55, 0x56, 0x7e, 0x78, 0x30, 0x37, 0x52, 0xf1, 0xeb, 0xf2, - 0x2f, 0x56, 0x15, 0xd0, 0xf7, 0x5a, 0x30, 0xdb, 0x79, 0xf3, 0x52, 0x9d, 0x1e, 0xeb, 0xbf, 0xd3, - 0xb6, 0x68, 0x74, 0x76, 0x39, 0x93, 0x1c, 0xee, 0xd2, 0x94, 0xfd, 0x4b, 0xfc, 0xed, 0x55, 0xbc, - 0xd0, 0x90, 0xb0, 0xdd, 0x38, 0x89, 0x8c, 0x8b, 0xcb, 0xc6, 0xe3, 0xd1, 0x43, 0xbf, 0xef, 0xff, - 0x9a, 0xc5, 0xde, 0xf7, 0xd7, 0x49, 0xb3, 0xd5, 0x70, 0xa2, 0x93, 0x70, 0x20, 0x7c, 0x13, 0x0a, - 0x91, 0x68, 0xad, 0x5b, 0x92, 0x48, 0xad, 0x53, 0xcc, 0xc6, 0x41, 0x49, 0xac, 0xb2, 0x14, 0x2b, - 0x32, 0xf6, 0x3f, 0xe6, 0x33, 0x20, 0x21, 0x27, 0xa0, 0xa3, 0x2f, 0x99, 0x3a, 0xfa, 0xb9, 0x1e, - 0x5f, 0x90, 0xa1, 0xab, 0xff, 0x47, 0x66, 0xbf, 0x99, 0xa6, 0xe6, 0x83, 0x6e, 0x58, 0x62, 0xff, - 0xb0, 0x05, 0xa7, 0xd2, 0x2c, 0x31, 0xe9, 0x2d, 0x83, 0xeb, 0x89, 0x94, 0xa1, 0x8d, 0x1a, 0xc1, - 0xbb, 0xa2, 0x1c, 0x2b, 0x8c, 0xbe, 0x13, 0x37, 0x1d, 0x2d, 0x90, 0xe9, 0x6d, 0x18, 0xab, 0x04, - 0x44, 0x3b, 0xd0, 0x5e, 0xe7, 0x1e, 0xc1, 0xbc, 0x3f, 0xcf, 0x1c, 0xd9, 0x1b, 0xd8, 0xfe, 0xe9, - 0x1c, 0x9c, 0xe2, 0x2f, 0xe5, 0x0b, 0xbb, 0xbe, 0x5b, 0xaf, 0xf8, 0x75, 0x91, 0x74, 0xeb, 0x2d, - 0x18, 0x6d, 0x69, 0xca, 0xbd, 0x6e, 0x41, 0xf9, 0x74, 0x25, 0x60, 0xac, 0x8e, 0xd0, 0x4b, 0xb1, - 0x41, 0x0b, 0xd5, 0x61, 0x94, 0xec, 0xba, 0x35, 0xf5, 0xdc, 0x9a, 0x3b, 0xf2, 0xe1, 0xa2, 0x5a, - 0x59, 0xd6, 0xe8, 0x60, 0x83, 0xea, 0x23, 0x48, 0xa7, 0x6a, 0xff, 0x88, 0x05, 0x8f, 0x65, 0x84, - 0xf0, 0xa3, 0xcd, 0xed, 0x31, 0x9b, 0x04, 0x91, 0x99, 0x51, 0x35, 0xc7, 0x2d, 0x15, 0xb0, 0x80, - 0xa2, 0x4f, 0x03, 0x70, 0x4b, 0x03, 0x7a, 0xcd, 0xed, 0x15, 0xeb, 0xcc, 0x08, 0xd3, 0xa4, 0x45, - 0xdc, 0x91, 0xf5, 0xb1, 0x46, 0xcb, 0xfe, 0xc9, 0x3c, 0x0c, 0xf2, 0x9c, 0xd2, 0x2b, 0x30, 0xbc, - 0xcd, 0x53, 0x11, 0xf4, 0x93, 0xf5, 0x20, 0x56, 0x40, 0xf0, 0x02, 0x2c, 0x2b, 0xa3, 0x55, 0x98, - 0xe6, 0xa9, 0x1c, 0x1a, 0x25, 0xd2, 0x70, 0xf6, 0xa5, 0xb6, 0x8c, 0xa7, 0x41, 0x54, 0x5a, 0xc3, - 0x72, 0x27, 0x0a, 0x4e, 0xab, 0x87, 0x5e, 0x87, 0x71, 0x7a, 0x7b, 0xf1, 0xdb, 0x91, 0xa4, 0xc4, - 0x93, 0x38, 0xa8, 0xeb, 0xd2, 0xba, 0x01, 0xc5, 0x09, 0x6c, 0x7a, 0x81, 0x6e, 0x75, 0xe8, 0x05, - 0x07, 0xe3, 0x0b, 0xb4, 0xa9, 0x0b, 0x34, 0x71, 0x99, 0x09, 0x66, 0x9b, 0x19, 0x9c, 0xae, 0x6f, - 0x07, 0x24, 0xdc, 0xf6, 0x1b, 0x75, 0x26, 0x68, 0x0d, 0x6a, 0x26, 0x98, 0x09, 0x38, 0xee, 0xa8, - 0x41, 0xa9, 0x6c, 0x3a, 0x6e, 0xa3, 0x1d, 0x90, 0x98, 0xca, 0x90, 0x49, 0x65, 0x25, 0x01, 0xc7, - 0x1d, 0x35, 0xe8, 0x3a, 0x3a, 0x5d, 0x09, 0x7c, 0xca, 0xbc, 0x64, 0x5c, 0x12, 0x65, 0x57, 0x3b, - 0x2c, 0x5d, 0x28, 0xbb, 0x44, 0xf0, 0x12, 0x96, 0x87, 0x9c, 0x82, 0xf1, 0xa8, 0x5e, 0x15, 0xce, - 0x93, 0x92, 0x0a, 0x7a, 0x0e, 0x46, 0x44, 0x80, 0x7e, 0x66, 0xfe, 0xc9, 0xa7, 0x8e, 0x19, 0x01, - 0x94, 0xe2, 0x62, 0xac, 0xe3, 0xd8, 0xdf, 0x97, 0x83, 0xe9, 0x14, 0xfb, 0x7d, 0xce, 0xaa, 0xb6, - 0xdc, 0x30, 0x52, 0xa9, 0xde, 0x34, 0x56, 0xc5, 0xcb, 0xb1, 0xc2, 0xa0, 0xfb, 0x81, 0x33, 0xc3, - 0x24, 0x03, 0x14, 0xf6, 0xb1, 0x02, 0x7a, 0xc4, 0xa4, 0x69, 0x17, 0x61, 0xa0, 0x1d, 0x12, 0x19, - 0x7b, 0x4f, 0xf1, 0x6f, 0xf6, 0x36, 0xc4, 0x20, 0x54, 0x3c, 0xde, 0x52, 0xcf, 0x2c, 0x9a, 0x78, - 0xcc, 0x1f, 0x5a, 0x38, 0x8c, 0x76, 0x2e, 0x22, 0x9e, 0xe3, 0x45, 0x42, 0x88, 0x8e, 0x83, 0x48, - 0xb1, 0x52, 0x2c, 0xa0, 0xf6, 0x97, 0xf2, 0x70, 0x36, 0xd3, 0xa3, 0x87, 0x76, 0xbd, 0xe9, 0x7b, - 0x6e, 0xe4, 0x2b, 0xeb, 0x0a, 0x1e, 0x38, 0x8a, 0xb4, 0xb6, 0x57, 0x45, 0x39, 0x56, 0x18, 0xe8, - 0x32, 0x0c, 0x32, 0xcd, 0x55, 0x47, 0xd2, 0xbb, 0xc5, 0x12, 0x8f, 0x24, 0xc2, 0xc1, 0x7d, 0x27, - 0x14, 0xbd, 0x04, 0x03, 0x2d, 0xdf, 0x6f, 0x24, 0x99, 0x16, 0xed, 0xae, 0xef, 0x37, 0x30, 0x03, - 0xa2, 0x8f, 0x89, 0xf1, 0x4a, 0x98, 0x13, 0x60, 0xa7, 0xee, 0x87, 0xda, 0xa0, 0x3d, 0x05, 0xc3, - 0x3b, 0x64, 0x3f, 0x70, 0xbd, 0xad, 0xa4, 0x99, 0xc9, 0x4d, 0x5e, 0x8c, 0x25, 0xdc, 0xcc, 0x5f, - 0x34, 0x7c, 0xdc, 0x99, 0x40, 0x0b, 0x3d, 0x8f, 0xc0, 0xef, 0xcf, 0xc3, 0x04, 0x5e, 0x2c, 0x7d, - 0x38, 0x11, 0x77, 0x3a, 0x27, 0xe2, 0xb8, 0x33, 0x81, 0xf6, 0x9e, 0x8d, 0x9f, 0xb7, 0x60, 0x82, - 0xa5, 0x09, 0x10, 0x21, 0x87, 0x5c, 0xdf, 0x3b, 0x01, 0x11, 0xef, 0x12, 0x0c, 0x06, 0xb4, 0xd1, - 0x64, 0xb6, 0x3b, 0xd6, 0x13, 0xcc, 0x61, 0xe8, 0x1c, 0x0c, 0xb0, 0x2e, 0xd0, 0xc9, 0x1b, 0xe5, - 0x89, 0x82, 0x4a, 0x4e, 0xe4, 0x60, 0x56, 0xca, 0xe2, 0x68, 0x60, 0xd2, 0x6a, 0xb8, 0xbc, 0xd3, - 0xf1, 0xbb, 0xe2, 0x07, 0x23, 0x8e, 0x46, 0x6a, 0xd7, 0xde, 0x5f, 0x1c, 0x8d, 0x74, 0x92, 0xdd, - 0xaf, 0x4f, 0x7f, 0x94, 0x83, 0x0b, 0xa9, 0xf5, 0xfa, 0x8e, 0xa3, 0xd1, 0xbd, 0xf6, 0xa3, 0x0c, - 0x27, 0x9f, 0x3f, 0x41, 0x23, 0xbe, 0x81, 0x7e, 0x25, 0xcc, 0xc1, 0x3e, 0xc2, 0x5b, 0xa4, 0x0e, - 0xd9, 0x07, 0x24, 0xbc, 0x45, 0x6a, 0xdf, 0x32, 0xae, 0x7f, 0x7f, 0x91, 0xcb, 0xf8, 0x16, 0x76, - 0x11, 0xbc, 0x42, 0xf9, 0x0c, 0x03, 0x86, 0x42, 0x62, 0x1e, 0xe5, 0x3c, 0x86, 0x97, 0x61, 0x05, - 0x45, 0x0b, 0x30, 0xd1, 0x74, 0x3d, 0xca, 0x7c, 0xf6, 0x4d, 0xc1, 0x4f, 0x45, 0x1f, 0x5a, 0x35, - 0xc1, 0x38, 0x89, 0x8f, 0x5c, 0x2d, 0xf4, 0x45, 0x2e, 0x3b, 0x7f, 0x74, 0x66, 0x6f, 0xe7, 0xcd, - 0x37, 0x57, 0x35, 0x8a, 0x29, 0x61, 0x30, 0x56, 0xb5, 0xfb, 0x7f, 0xbe, 0xff, 0xfb, 0xff, 0x68, - 0xfa, 0xdd, 0x7f, 0xf6, 0x55, 0x18, 0x7b, 0x68, 0x85, 0xaf, 0xfd, 0xd5, 0x3c, 0x3c, 0xde, 0x65, - 0xdb, 0x73, 0x5e, 0x6f, 0xcc, 0x81, 0xc6, 0xeb, 0x3b, 0xe6, 0xa1, 0x02, 0xa7, 0x36, 0xdb, 0x8d, - 0xc6, 0x3e, 0xb3, 0x93, 0x27, 0x75, 0x89, 0x21, 0x64, 0xca, 0x73, 0x32, 0x35, 0xd3, 0x4a, 0x0a, - 0x0e, 0x4e, 0xad, 0x49, 0x05, 0x7a, 0x7a, 0x92, 0xec, 0x2b, 0x52, 0x09, 0x81, 0x1e, 0xeb, 0x40, - 0x6c, 0xe2, 0xa2, 0xeb, 0x30, 0xe5, 0xec, 0x3a, 0x2e, 0x8f, 0x1f, 0x2a, 0x09, 0x70, 0x89, 0x5e, - 0xe9, 0xe9, 0x16, 0x92, 0x08, 0xb8, 0xb3, 0x0e, 0x7a, 0x03, 0x90, 0x2f, 0xd2, 0xd8, 0x5f, 0x27, - 0x9e, 0x78, 0x1a, 0x63, 0x73, 0x97, 0x8f, 0x59, 0xc2, 0xed, 0x0e, 0x0c, 0x9c, 0x52, 0x2b, 0x11, - 0x4a, 0x62, 0x28, 0x3b, 0x94, 0x44, 0x77, 0xbe, 0xd8, 0x33, 0x93, 0xc1, 0x7f, 0xb2, 0xe8, 0xf1, - 0xc5, 0x85, 0x7c, 0x33, 0x22, 0xda, 0xab, 0xcc, 0xf4, 0x8c, 0xeb, 0xf0, 0xb4, 0xa8, 0x0e, 0xa7, - 0x35, 0xd3, 0xb3, 0x18, 0x88, 0x4d, 0x5c, 0xbe, 0x20, 0xc2, 0xd8, 0x99, 0xd0, 0x10, 0xf1, 0x45, - 0xd8, 0x16, 0x85, 0x81, 0x3e, 0x03, 0xc3, 0x75, 0x77, 0xd7, 0x0d, 0xfd, 0x40, 0xac, 0xf4, 0x23, - 0x3e, 0x17, 0xc4, 0x7c, 0xb0, 0xc4, 0xc9, 0x60, 0x49, 0xcf, 0xfe, 0xfe, 0x1c, 0x8c, 0xc9, 0x16, - 0xdf, 0x6c, 0xfb, 0x91, 0x73, 0x02, 0xc7, 0xf2, 0x75, 0xe3, 0x58, 0xfe, 0x58, 0xb7, 0xd8, 0x35, - 0xac, 0x4b, 0x99, 0xc7, 0xf1, 0xed, 0xc4, 0x71, 0xfc, 0x64, 0x6f, 0x52, 0xdd, 0x8f, 0xe1, 0x7f, - 0x62, 0xc1, 0x94, 0x81, 0x7f, 0x02, 0xa7, 0xc1, 0x8a, 0x79, 0x1a, 0x3c, 0xd1, 0xf3, 0x1b, 0x32, - 0x4e, 0x81, 0xef, 0xce, 0x27, 0xfa, 0xce, 0xb8, 0xff, 0xbb, 0x30, 0xb0, 0xed, 0x04, 0xf5, 0x6e, - 0xb1, 0xba, 0x3b, 0x2a, 0xcd, 0xdf, 0x70, 0x02, 0xf1, 0x36, 0xf8, 0x8c, 0x4a, 0xdf, 0xec, 0x04, - 0xbd, 0xdf, 0x05, 0x59, 0x53, 0xe8, 0x65, 0x18, 0x0a, 0x6b, 0x7e, 0x4b, 0x59, 0xb6, 0x5f, 0xe4, - 0xa9, 0x9d, 0x69, 0xc9, 0xe1, 0xc1, 0x1c, 0x32, 0x9b, 0xa3, 0xc5, 0x58, 0xe0, 0xa3, 0xb7, 0x60, - 0x8c, 0xfd, 0x52, 0x86, 0x3a, 0xf9, 0xec, 0xbc, 0x3e, 0x55, 0x1d, 0x91, 0x5b, 0xb1, 0x19, 0x45, - 0xd8, 0x24, 0x35, 0xbb, 0x05, 0x45, 0xf5, 0x59, 0x8f, 0xf4, 0x3d, 0xee, 0xdf, 0xe5, 0x61, 0x3a, - 0x65, 0xcd, 0xa1, 0xd0, 0x98, 0x89, 0xe7, 0xfa, 0x5c, 0xaa, 0xef, 0x73, 0x2e, 0x42, 0x76, 0x1b, - 0xaa, 0x8b, 0xb5, 0xd5, 0x77, 0xa3, 0x77, 0x42, 0x92, 0x6c, 0x94, 0x16, 0xf5, 0x6e, 0x94, 0x36, - 0x76, 0x62, 0x43, 0x4d, 0x1b, 0x52, 0x3d, 0x7d, 0xa4, 0x73, 0xfa, 0xa7, 0x79, 0x38, 0x95, 0x16, - 0x4e, 0x0b, 0x7d, 0x5b, 0x22, 0xc7, 0xdb, 0x0b, 0xfd, 0x06, 0xe2, 0xe2, 0x89, 0xdf, 0xb8, 0x0e, - 0x78, 0x71, 0xde, 0xcc, 0xfa, 0xd6, 0x73, 0x98, 0x45, 0x9b, 0xcc, 0x51, 0x3e, 0xe0, 0xb9, 0xf9, - 0x24, 0xfb, 0xf8, 0x64, 0xdf, 0x1d, 0x10, 0x49, 0xfd, 0xc2, 0x84, 0x11, 0x80, 0x2c, 0xee, 0x6d, - 0x04, 0x20, 0x5b, 0x9e, 0x75, 0x61, 0x44, 0xfb, 0x9a, 0x47, 0x3a, 0xe3, 0x3b, 0xf4, 0xb4, 0xd2, - 0xfa, 0xfd, 0x48, 0x67, 0xfd, 0x47, 0x2c, 0x48, 0xd8, 0x6d, 0x2b, 0xb5, 0x98, 0x95, 0xa9, 0x16, - 0xbb, 0x08, 0x03, 0x81, 0xdf, 0x20, 0xc9, 0x94, 0x6a, 0xd8, 0x6f, 0x10, 0xcc, 0x20, 0x14, 0x23, - 0x8a, 0x95, 0x1d, 0xa3, 0xfa, 0x45, 0x4e, 0x5c, 0xd1, 0x2e, 0xc1, 0x60, 0x83, 0xec, 0x92, 0x46, - 0x32, 0xf3, 0xc5, 0x2d, 0x5a, 0x88, 0x39, 0xcc, 0xfe, 0xf9, 0x01, 0x38, 0xdf, 0x35, 0xd4, 0x04, - 0xbd, 0x0e, 0x6d, 0x39, 0x11, 0xd9, 0x73, 0xf6, 0x93, 0x21, 0xea, 0xaf, 0xf3, 0x62, 0x2c, 0xe1, - 0xcc, 0xb3, 0x86, 0x47, 0x9a, 0x4d, 0x28, 0x11, 0x45, 0x80, 0x59, 0x01, 0x35, 0x95, 0x52, 0xf9, - 0xe3, 0x50, 0x4a, 0x5d, 0x03, 0x08, 0xc3, 0x06, 0xb7, 0x9e, 0xa9, 0x0b, 0x97, 0x9d, 0x38, 0x22, - 0x71, 0xf5, 0x96, 0x80, 0x60, 0x0d, 0x0b, 0x95, 0x60, 0xb2, 0x15, 0xf8, 0x11, 0xd7, 0xc9, 0x96, - 0xb8, 0x81, 0xd9, 0xa0, 0xe9, 0xe5, 0x5f, 0x49, 0xc0, 0x71, 0x47, 0x0d, 0xf4, 0x22, 0x8c, 0x08, - 0xcf, 0xff, 0x8a, 0xef, 0x37, 0x84, 0x1a, 0x48, 0xd9, 0x5c, 0x55, 0x63, 0x10, 0xd6, 0xf1, 0xb4, - 0x6a, 0x4c, 0xd1, 0x3b, 0x9c, 0x5a, 0x8d, 0x2b, 0x7b, 0x35, 0xbc, 0x44, 0x68, 0xbd, 0x42, 0x5f, - 0xa1, 0xf5, 0x62, 0xc5, 0x58, 0xb1, 0xef, 0xb7, 0x2d, 0xe8, 0xa9, 0x4a, 0xfa, 0x99, 0x01, 0x98, - 0x16, 0x0b, 0xe7, 0x51, 0x2f, 0x97, 0x3b, 0x9d, 0xcb, 0xe5, 0x38, 0x54, 0x67, 0x1f, 0xae, 0x99, - 0x93, 0x5e, 0x33, 0x3f, 0x60, 0x81, 0x29, 0x5e, 0xa1, 0xff, 0x3b, 0x33, 0xc7, 0xc7, 0x8b, 0x99, - 0xe2, 0x5a, 0x5d, 0x1e, 0x20, 0xef, 0x33, 0xdb, 0x87, 0xfd, 0x1f, 0x2c, 0x78, 0xa2, 0x27, 0x45, - 0xb4, 0x0c, 0x45, 0x26, 0x03, 0x6a, 0xb7, 0xb3, 0x27, 0x95, 0x01, 0xaa, 0x04, 0x64, 0x88, 0xa4, - 0x71, 0x4d, 0xb4, 0xdc, 0x91, 0x4c, 0xe5, 0xa9, 0x94, 0x64, 0x2a, 0xa7, 0x8d, 0xe1, 0x79, 0xc8, - 0x6c, 0x2a, 0x7f, 0x98, 0x87, 0x21, 0xbe, 0xe2, 0x4f, 0xe0, 0x1a, 0xf6, 0x34, 0x14, 0xdd, 0x66, - 0xb3, 0xcd, 0x53, 0x52, 0x0c, 0x72, 0xf7, 0x4c, 0x3a, 0x34, 0x65, 0x59, 0x88, 0x63, 0x38, 0x5a, - 0x11, 0x4a, 0xde, 0x2e, 0x81, 0xfe, 0x78, 0xc7, 0xe7, 0x4b, 0x4e, 0xe4, 0x70, 0x99, 0x42, 0x1d, - 0x6d, 0xb1, 0x3a, 0x18, 0x7d, 0x0e, 0x20, 0x8c, 0x02, 0xd7, 0xdb, 0xa2, 0x65, 0x22, 0x04, 0xe4, - 0xc7, 0xbb, 0x50, 0xab, 0x2a, 0x64, 0x4e, 0x33, 0xde, 0xe6, 0x0a, 0x80, 0x35, 0x8a, 0x68, 0xde, - 0x38, 0x5c, 0x67, 0x13, 0x5a, 0x52, 0xe0, 0x54, 0xe3, 0xa3, 0x76, 0xf6, 0x25, 0x28, 0x2a, 0xe2, - 0xbd, 0x54, 0x3e, 0xa3, 0xba, 0x24, 0xf2, 0x29, 0x98, 0x48, 0xf4, 0xed, 0x48, 0x1a, 0xa3, 0x5f, - 0xb0, 0x60, 0x82, 0x77, 0x66, 0xd9, 0xdb, 0x15, 0x0c, 0xf8, 0x3d, 0x38, 0xd5, 0x48, 0x61, 0x84, - 0x62, 0xfa, 0xfb, 0x67, 0x9c, 0x4a, 0x43, 0x94, 0x06, 0xc5, 0xa9, 0x6d, 0xa0, 0x2b, 0x74, 0x91, - 0x53, 0x46, 0xe7, 0x34, 0x84, 0xb7, 0xe6, 0x28, 0x5f, 0xe0, 0xbc, 0x0c, 0x2b, 0xa8, 0xfd, 0x3b, - 0x16, 0x4c, 0xf1, 0x9e, 0xdf, 0x24, 0xfb, 0x8a, 0x1d, 0x7c, 0x3d, 0xfb, 0x2e, 0x92, 0x21, 0xe5, - 0x32, 0x92, 0x21, 0xe9, 0x9f, 0x96, 0xef, 0xfa, 0x69, 0x3f, 0x6d, 0x81, 0x58, 0x21, 0x27, 0x70, - 0xef, 0xff, 0x66, 0xf3, 0xde, 0x3f, 0x9b, 0xbd, 0x09, 0x32, 0x2e, 0xfc, 0x7f, 0x6e, 0xc1, 0x24, - 0x47, 0x88, 0x1f, 0xa8, 0xbf, 0xae, 0xf3, 0xd0, 0x4f, 0xca, 0xd4, 0x9b, 0x64, 0x7f, 0xdd, 0xaf, - 0x38, 0xd1, 0x76, 0xfa, 0x47, 0x19, 0x93, 0x35, 0xd0, 0x75, 0xb2, 0xea, 0x72, 0x03, 0x1d, 0x21, - 0x0f, 0xf3, 0x91, 0x73, 0x05, 0xd8, 0x5f, 0xb3, 0x00, 0xf1, 0x66, 0x0c, 0x59, 0x89, 0x4a, 0x20, - 0xac, 0x54, 0x3b, 0x5b, 0x62, 0xd6, 0xa4, 0x20, 0x58, 0xc3, 0x3a, 0x96, 0xe1, 0x49, 0x58, 0x19, - 0xe4, 0x7b, 0x5b, 0x19, 0x1c, 0x61, 0x44, 0xff, 0x70, 0x10, 0x92, 0x3e, 0x27, 0xe8, 0x2e, 0x8c, - 0xd6, 0x9c, 0x96, 0xb3, 0xe1, 0x36, 0xdc, 0xc8, 0x25, 0x61, 0x37, 0xf3, 0xa4, 0x25, 0x0d, 0x4f, - 0xbc, 0x0b, 0x6b, 0x25, 0xd8, 0xa0, 0x83, 0xe6, 0x01, 0x5a, 0x81, 0xbb, 0xeb, 0x36, 0xc8, 0x16, - 0x53, 0x4f, 0x30, 0xff, 0x70, 0x6e, 0x73, 0x23, 0x4b, 0xb1, 0x86, 0x91, 0xe2, 0x80, 0x9b, 0x7f, - 0xc4, 0x0e, 0xb8, 0x70, 0x62, 0x0e, 0xb8, 0x03, 0x47, 0x72, 0xc0, 0x2d, 0x1c, 0xd9, 0x01, 0x77, - 0xb0, 0x2f, 0x07, 0x5c, 0x0c, 0x67, 0xa4, 0xb8, 0x47, 0xff, 0xaf, 0xb8, 0x0d, 0x22, 0x64, 0x7c, - 0xee, 0xd4, 0x3e, 0xfb, 0xe0, 0x60, 0xee, 0x0c, 0x4e, 0xc5, 0xc0, 0x19, 0x35, 0xd1, 0xa7, 0x61, - 0xc6, 0x69, 0x34, 0xfc, 0x3d, 0x35, 0xa9, 0xcb, 0x61, 0xcd, 0x69, 0x70, 0xbd, 0xff, 0x30, 0xa3, - 0x7a, 0xee, 0xc1, 0xc1, 0xdc, 0xcc, 0x42, 0x06, 0x0e, 0xce, 0xac, 0x8d, 0x5e, 0x83, 0x62, 0x2b, - 0xf0, 0x6b, 0xab, 0x9a, 0x63, 0xdc, 0x05, 0x3a, 0x80, 0x15, 0x59, 0x78, 0x78, 0x30, 0x37, 0xa6, - 0xfe, 0xb0, 0x03, 0x3f, 0xae, 0x60, 0xef, 0xc0, 0x74, 0x95, 0x04, 0x2e, 0xcb, 0xaa, 0x5c, 0x8f, - 0xf9, 0xc7, 0x3a, 0x14, 0x83, 0x04, 0xc7, 0xec, 0x2b, 0x38, 0x9e, 0x16, 0x54, 0x5d, 0x72, 0xc8, - 0x98, 0x90, 0xfd, 0x3f, 0x2d, 0x18, 0x16, 0x3e, 0x20, 0x27, 0x20, 0xd5, 0x2d, 0x18, 0xca, 0xf5, - 0xb9, 0xf4, 0x53, 0x85, 0x75, 0x26, 0x53, 0xad, 0x5e, 0x4e, 0xa8, 0xd5, 0x9f, 0xe8, 0x46, 0xa4, - 0xbb, 0x42, 0xfd, 0x6f, 0xe4, 0x61, 0xdc, 0x74, 0x16, 0x3c, 0x81, 0x21, 0x58, 0x83, 0xe1, 0x50, - 0x78, 0xc3, 0xe5, 0xb2, 0xcd, 0xb7, 0x93, 0x93, 0x18, 0x9b, 0x76, 0x09, 0xff, 0x37, 0x49, 0x24, - 0xd5, 0xcd, 0x2e, 0xff, 0x08, 0xdd, 0xec, 0x7a, 0xf9, 0x6b, 0x0e, 0x1c, 0x87, 0xbf, 0xa6, 0xfd, - 0x15, 0x76, 0xb2, 0xe9, 0xe5, 0x27, 0x20, 0xf4, 0x5c, 0x37, 0xcf, 0x40, 0xbb, 0xcb, 0xca, 0x12, - 0x9d, 0xca, 0x10, 0x7e, 0x7e, 0xce, 0x82, 0xf3, 0x29, 0x5f, 0xa5, 0x49, 0x42, 0xcf, 0x40, 0xc1, - 0x69, 0xd7, 0x5d, 0xb5, 0x97, 0xb5, 0x27, 0xb6, 0x05, 0x51, 0x8e, 0x15, 0x06, 0x5a, 0x82, 0x29, - 0x72, 0xbf, 0xe5, 0xf2, 0xd7, 0x45, 0xdd, 0xfe, 0x32, 0xcf, 0x1d, 0x87, 0x96, 0x93, 0x40, 0xdc, - 0x89, 0xaf, 0x62, 0x58, 0xe4, 0x33, 0x63, 0x58, 0xfc, 0x7d, 0x0b, 0x46, 0x94, 0x3f, 0xd8, 0x23, - 0x1f, 0xed, 0x6f, 0x31, 0x47, 0xfb, 0xf1, 0x2e, 0xa3, 0x9d, 0x31, 0xcc, 0xbf, 0x9d, 0x53, 0xfd, - 0xad, 0xf8, 0x41, 0xd4, 0x87, 0x84, 0xf5, 0x32, 0x14, 0x5a, 0x81, 0x1f, 0xf9, 0x35, 0xbf, 0x21, - 0x04, 0xac, 0x73, 0x71, 0x30, 0x17, 0x5e, 0x7e, 0xa8, 0xfd, 0xc6, 0x0a, 0x9b, 0xca, 0x36, 0x4e, - 0xab, 0x25, 0x01, 0xd2, 0x2c, 0x8b, 0x85, 0x3a, 0x8d, 0x8b, 0xb1, 0x8e, 0xc3, 0x06, 0xdc, 0x0f, - 0x22, 0x21, 0x07, 0xc5, 0x03, 0xee, 0x07, 0x11, 0x66, 0x10, 0x54, 0x07, 0x88, 0x9c, 0x60, 0x8b, - 0x44, 0xb4, 0x4c, 0xc4, 0x9b, 0xca, 0xe6, 0x37, 0xed, 0xc8, 0x6d, 0xcc, 0xbb, 0x5e, 0x14, 0x46, - 0xc1, 0x7c, 0xd9, 0x8b, 0x6e, 0x07, 0xfc, 0x8a, 0xa7, 0x05, 0x74, 0x51, 0xb4, 0xb0, 0x46, 0x57, - 0xfa, 0x3e, 0xb3, 0x36, 0x06, 0xcd, 0xf7, 0xfd, 0x35, 0x51, 0x8e, 0x15, 0x86, 0xfd, 0x12, 0x3b, - 0x7d, 0xd8, 0x98, 0x1e, 0x2d, 0x02, 0xca, 0x2f, 0x15, 0xd5, 0x6c, 0xb0, 0xc7, 0xbd, 0x92, 0x1e, - 0x67, 0xa5, 0x3b, 0xb3, 0xa7, 0x0d, 0xeb, 0x2e, 0x4c, 0x71, 0x30, 0x16, 0xf4, 0xad, 0x1d, 0x36, - 0x1b, 0xcf, 0xf6, 0x38, 0x35, 0x8e, 0x60, 0xa5, 0xc1, 0xf2, 0x1e, 0xb0, 0xa8, 0xf0, 0xe5, 0x8a, - 0xd8, 0x17, 0x5a, 0xde, 0x03, 0x01, 0xc0, 0x31, 0x0e, 0xba, 0x2a, 0x2e, 0xf0, 0x5c, 0xf5, 0xfd, - 0x78, 0xe2, 0x02, 0x2f, 0x3f, 0x5f, 0x53, 0x96, 0x3f, 0x07, 0x23, 0x2a, 0xeb, 0x67, 0x85, 0x27, - 0x93, 0x14, 0xcb, 0x66, 0x39, 0x2e, 0xc6, 0x3a, 0x0e, 0x5a, 0x87, 0x89, 0x90, 0xab, 0x92, 0x54, - 0x90, 0x55, 0xae, 0x92, 0xfb, 0xb8, 0x34, 0x74, 0xa9, 0x9a, 0xe0, 0x43, 0x56, 0xc4, 0xb9, 0x8d, - 0xf4, 0x37, 0x4e, 0x92, 0x40, 0xaf, 0xc3, 0x78, 0xc3, 0x77, 0xea, 0x8b, 0x4e, 0xc3, 0xf1, 0x6a, - 0xec, 0x7b, 0x0b, 0x66, 0xf2, 0xb8, 0x5b, 0x06, 0x14, 0x27, 0xb0, 0xa9, 0xb0, 0xa4, 0x97, 0x88, - 0xc0, 0xc0, 0x8e, 0xb7, 0x45, 0x42, 0x91, 0xc3, 0x91, 0x09, 0x4b, 0xb7, 0x32, 0x70, 0x70, 0x66, - 0x6d, 0xf4, 0x32, 0x8c, 0xca, 0xcf, 0xd7, 0xdc, 0xf3, 0x63, 0xdb, 0x7e, 0x0d, 0x86, 0x0d, 0x4c, - 0xb4, 0x07, 0xa7, 0xe5, 0xff, 0xf5, 0xc0, 0xd9, 0xdc, 0x74, 0x6b, 0xc2, 0x67, 0x95, 0x3b, 0xde, - 0x2d, 0x48, 0xef, 0xb0, 0xe5, 0x34, 0xa4, 0xc3, 0x83, 0xb9, 0x8b, 0x62, 0xd4, 0x52, 0xe1, 0x6c, - 0x12, 0xd3, 0xe9, 0xa3, 0x55, 0x98, 0xde, 0x26, 0x4e, 0x23, 0xda, 0x5e, 0xda, 0x26, 0xb5, 0x1d, - 0xb9, 0x89, 0x98, 0xd3, 0xbf, 0x66, 0x11, 0x7f, 0xa3, 0x13, 0x05, 0xa7, 0xd5, 0x43, 0x6f, 0xc3, - 0x4c, 0xab, 0xbd, 0xd1, 0x70, 0xc3, 0xed, 0x35, 0x3f, 0x62, 0xd6, 0x2e, 0x2a, 0x89, 0xa8, 0x88, - 0x0e, 0xa0, 0xc2, 0x2a, 0x54, 0x32, 0xf0, 0x70, 0x26, 0x05, 0xf4, 0x1e, 0x9c, 0x4e, 0x2c, 0x06, - 0xe1, 0x1f, 0x3d, 0x9e, 0x1d, 0x66, 0xbd, 0x9a, 0x56, 0x41, 0x84, 0x1a, 0x48, 0x03, 0xe1, 0xf4, - 0x26, 0xd0, 0x0b, 0x50, 0x70, 0x5b, 0x2b, 0x4e, 0xd3, 0x6d, 0xec, 0xb3, 0x38, 0xf1, 0x45, 0x16, - 0x3b, 0xbd, 0x50, 0xae, 0xf0, 0xb2, 0x43, 0xed, 0x37, 0x56, 0x98, 0xf4, 0x8a, 0xa0, 0x45, 0xc3, - 0x0c, 0x67, 0x26, 0x63, 0x63, 0x5e, 0x2d, 0x64, 0x66, 0x88, 0x0d, 0xac, 0xf7, 0x67, 0x23, 0xf5, - 0x2e, 0xad, 0xac, 0xc9, 0x8c, 0xe8, 0xf3, 0x30, 0xaa, 0xaf, 0x58, 0x71, 0xfe, 0x5d, 0x4e, 0x17, - 0xa9, 0xb4, 0x95, 0xcd, 0x25, 0x4e, 0xb5, 0x7a, 0x75, 0x18, 0x36, 0x28, 0xda, 0x04, 0xd2, 0xc7, - 0x12, 0xdd, 0x82, 0x42, 0xad, 0xe1, 0x12, 0x2f, 0x2a, 0x57, 0xba, 0x05, 0x72, 0x5a, 0x12, 0x38, - 0x62, 0x72, 0x44, 0x0c, 0x6c, 0x5e, 0x86, 0x15, 0x05, 0xfb, 0x57, 0x73, 0x30, 0xd7, 0x23, 0xa0, - 0x7a, 0x42, 0x95, 0x6f, 0xf5, 0xa5, 0xca, 0x5f, 0x90, 0xe9, 0x57, 0xd7, 0x12, 0x2a, 0x8b, 0x44, - 0x6a, 0xd5, 0x58, 0x71, 0x91, 0xc4, 0xef, 0xdb, 0xb4, 0x5a, 0x7f, 0x0d, 0x18, 0xe8, 0xe9, 0x1c, - 0x60, 0xbc, 0x02, 0x0e, 0xf6, 0x7f, 0x4f, 0xca, 0x7c, 0xd1, 0xb1, 0xbf, 0x92, 0x83, 0xd3, 0x6a, - 0x08, 0xbf, 0x71, 0x07, 0xee, 0x4e, 0xe7, 0xc0, 0x1d, 0xc3, 0x7b, 0x98, 0x7d, 0x1b, 0x86, 0x78, - 0x64, 0xaa, 0x3e, 0xe4, 0xb3, 0x4b, 0x66, 0x10, 0x47, 0x25, 0x12, 0x18, 0x81, 0x1c, 0xbf, 0xd7, - 0x82, 0x89, 0xf5, 0xa5, 0x4a, 0xd5, 0xaf, 0xed, 0x90, 0x68, 0x81, 0xcb, 0xd3, 0x58, 0xc8, 0x5a, - 0xd6, 0x43, 0xca, 0x50, 0x69, 0xd2, 0xd9, 0x45, 0x18, 0xd8, 0xf6, 0xc3, 0x28, 0xf9, 0x58, 0x7e, - 0xc3, 0x0f, 0x23, 0xcc, 0x20, 0xf6, 0xef, 0x5a, 0x30, 0xc8, 0x12, 0x8e, 0xf7, 0x4a, 0x79, 0xdf, - 0xcf, 0x77, 0xa1, 0x17, 0x61, 0x88, 0x6c, 0x6e, 0x92, 0x5a, 0x24, 0x66, 0x55, 0x7a, 0x37, 0x0f, - 0x2d, 0xb3, 0x52, 0x2a, 0x60, 0xb0, 0xc6, 0xf8, 0x5f, 0x2c, 0x90, 0xd1, 0x3d, 0x28, 0x46, 0x6e, - 0x93, 0x2c, 0xd4, 0xeb, 0xe2, 0xb9, 0xf1, 0x21, 0x3c, 0xb4, 0xd7, 0x25, 0x01, 0x1c, 0xd3, 0xb2, - 0xbf, 0x94, 0x03, 0x88, 0x43, 0x86, 0xf4, 0xfa, 0xc4, 0xc5, 0x8e, 0x87, 0xa8, 0xcb, 0x29, 0x0f, - 0x51, 0x28, 0x26, 0x98, 0xf2, 0x0a, 0xa5, 0x86, 0x29, 0xdf, 0xd7, 0x30, 0x0d, 0x1c, 0x65, 0x98, - 0x96, 0x60, 0x2a, 0x0e, 0x79, 0x62, 0x46, 0x7c, 0x62, 0x77, 0xa8, 0xf5, 0x24, 0x10, 0x77, 0xe2, - 0xdb, 0x04, 0x2e, 0xaa, 0xc8, 0x0f, 0xe2, 0xac, 0x61, 0xd6, 0xac, 0xfa, 0xc3, 0x5e, 0x8f, 0x71, - 0x8a, 0x5f, 0xda, 0x72, 0x99, 0x2f, 0x6d, 0x3f, 0x6e, 0xc1, 0xa9, 0x64, 0x3b, 0xcc, 0xbd, 0xf0, - 0x8b, 0x16, 0x9c, 0x66, 0xef, 0x8d, 0xac, 0xd5, 0xce, 0xd7, 0xcd, 0x17, 0xba, 0x46, 0xb3, 0xc8, - 0xe8, 0x71, 0xec, 0x46, 0xbf, 0x9a, 0x46, 0x1a, 0xa7, 0xb7, 0x68, 0xff, 0xfb, 0x1c, 0xcc, 0x64, - 0x85, 0xc1, 0x60, 0xc6, 0xee, 0xce, 0xfd, 0xea, 0x0e, 0xd9, 0x13, 0x26, 0xc5, 0xb1, 0xb1, 0x3b, - 0x2f, 0xc6, 0x12, 0x9e, 0x8c, 0x91, 0x9d, 0xeb, 0x2f, 0x46, 0x36, 0xda, 0x86, 0xa9, 0xbd, 0x6d, - 0xe2, 0xdd, 0xf1, 0x42, 0x27, 0x72, 0xc3, 0x4d, 0x97, 0x3d, 0x14, 0xf2, 0x75, 0xf3, 0x8a, 0x34, - 0xfc, 0xbd, 0x97, 0x44, 0x38, 0x3c, 0x98, 0x3b, 0x6f, 0x14, 0xc4, 0x5d, 0xe6, 0x8c, 0x04, 0x77, - 0x12, 0xed, 0x0c, 0x31, 0x3e, 0xf0, 0x08, 0x43, 0x8c, 0xdb, 0x5f, 0xb4, 0xe0, 0x6c, 0x66, 0x0a, - 0x40, 0x74, 0x05, 0x0a, 0x4e, 0xcb, 0xe5, 0xba, 0x56, 0xc1, 0x46, 0x99, 0xce, 0xa0, 0x52, 0xe6, - 0x9a, 0x56, 0x05, 0x55, 0xa9, 0x89, 0x73, 0x99, 0xa9, 0x89, 0x7b, 0x66, 0x1a, 0xb6, 0xbf, 0xc7, - 0x02, 0xe1, 0xa8, 0xd7, 0x07, 0xef, 0x7e, 0x4b, 0x66, 0x76, 0x37, 0xd2, 0x90, 0x5c, 0xcc, 0xf6, - 0x5c, 0x14, 0xc9, 0x47, 0x94, 0xac, 0x64, 0xa4, 0x1c, 0x31, 0x68, 0xd9, 0x75, 0x10, 0xd0, 0x12, - 0x61, 0x9a, 0xca, 0xde, 0xbd, 0xb9, 0x06, 0x50, 0x67, 0xb8, 0x5a, 0x7e, 0x67, 0x75, 0x32, 0x97, - 0x14, 0x04, 0x6b, 0x58, 0xf6, 0xbf, 0xc9, 0xc1, 0x88, 0x4c, 0x7b, 0xd1, 0xf6, 0xfa, 0xd1, 0x27, - 0x1c, 0x29, 0x0f, 0x1e, 0x4b, 0x88, 0x4e, 0x09, 0x57, 0x62, 0x35, 0x4c, 0x9c, 0x10, 0x5d, 0x02, - 0x70, 0x8c, 0x43, 0x77, 0x51, 0xd8, 0xde, 0x60, 0xe8, 0x09, 0xb7, 0xb2, 0x2a, 0x2f, 0xc6, 0x12, - 0x8e, 0x3e, 0x0d, 0x93, 0xbc, 0x5e, 0xe0, 0xb7, 0x9c, 0x2d, 0xae, 0xc4, 0x1e, 0x54, 0xfe, 0xe0, - 0x93, 0xab, 0x09, 0xd8, 0xe1, 0xc1, 0xdc, 0xa9, 0x64, 0x19, 0x7b, 0x9d, 0xe9, 0xa0, 0xc2, 0xcc, - 0x43, 0x78, 0x23, 0x74, 0xf7, 0x77, 0x58, 0x95, 0xc4, 0x20, 0xac, 0xe3, 0xd9, 0x9f, 0x07, 0xd4, - 0x99, 0x00, 0x04, 0xbd, 0xc1, 0x6d, 0x02, 0xdd, 0x80, 0xd4, 0xbb, 0xbd, 0xd6, 0xe8, 0x5e, 0xcf, - 0xd2, 0x23, 0x84, 0xd7, 0xc2, 0xaa, 0xbe, 0xfd, 0xff, 0xe7, 0x61, 0x32, 0xe9, 0x03, 0x8b, 0x6e, - 0xc0, 0x10, 0x17, 0x3d, 0x04, 0xf9, 0x2e, 0xc6, 0x00, 0x9a, 0xe7, 0x2c, 0x63, 0xc2, 0x42, 0x7a, - 0x11, 0xf5, 0xd1, 0xdb, 0x30, 0x52, 0xf7, 0xf7, 0xbc, 0x3d, 0x27, 0xa8, 0x2f, 0x54, 0xca, 0x62, - 0x39, 0xa7, 0xde, 0x96, 0x4a, 0x31, 0x9a, 0xee, 0x8d, 0xcb, 0x1e, 0xbe, 0x62, 0x10, 0xd6, 0xc9, - 0xa1, 0x75, 0x16, 0xaf, 0x78, 0xd3, 0xdd, 0x5a, 0x75, 0x5a, 0xdd, 0x0c, 0xc4, 0x97, 0x24, 0x92, - 0x46, 0x79, 0x4c, 0x04, 0x35, 0xe6, 0x00, 0x1c, 0x13, 0x42, 0xdf, 0x06, 0xd3, 0x61, 0x86, 0x4e, - 0x36, 0x2b, 0x1f, 0x54, 0x37, 0x35, 0xe5, 0xe2, 0x63, 0xf4, 0x1e, 0x9b, 0xa6, 0xbd, 0x4d, 0x6b, - 0xc6, 0xfe, 0xb5, 0x69, 0x30, 0x36, 0xb1, 0x91, 0x1e, 0xd0, 0x3a, 0xa6, 0xf4, 0x80, 0x18, 0x0a, - 0xa4, 0xd9, 0x8a, 0xf6, 0x4b, 0x6e, 0xd0, 0x2d, 0xbf, 0xec, 0xb2, 0xc0, 0xe9, 0xa4, 0x29, 0x21, - 0x58, 0xd1, 0x49, 0xcf, 0xe1, 0x98, 0xff, 0x3a, 0xe6, 0x70, 0x1c, 0x38, 0xc1, 0x1c, 0x8e, 0x6b, - 0x30, 0xbc, 0xe5, 0x46, 0x98, 0xb4, 0x7c, 0x21, 0xf4, 0xa7, 0xae, 0xc3, 0xeb, 0x1c, 0xa5, 0x33, - 0x5b, 0x98, 0x00, 0x60, 0x49, 0x04, 0xbd, 0xa1, 0x76, 0xe0, 0x50, 0xf6, 0x9d, 0xb9, 0xf3, 0xd5, - 0x3a, 0x75, 0x0f, 0x8a, 0x4c, 0x8d, 0xc3, 0x0f, 0x9b, 0xa9, 0x71, 0x45, 0xe6, 0x57, 0x2c, 0x64, - 0x7b, 0x73, 0xb0, 0xf4, 0x89, 0x3d, 0xb2, 0x2a, 0xde, 0xd5, 0x73, 0x52, 0x16, 0xb3, 0x39, 0x81, - 0x4a, 0x37, 0xd9, 0x67, 0x26, 0xca, 0xef, 0xb1, 0xe0, 0x74, 0x2b, 0x2d, 0x3d, 0xab, 0x78, 0xe0, - 0x7d, 0xb1, 0xef, 0xfc, 0xb3, 0x46, 0x83, 0x4c, 0x51, 0x93, 0x8a, 0x86, 0xd3, 0x9b, 0xa3, 0x03, - 0x1d, 0x6c, 0xd4, 0x45, 0x2a, 0xc5, 0x4b, 0x19, 0x29, 0x2d, 0xbb, 0x24, 0xb2, 0x5c, 0x4f, 0x49, - 0x9f, 0xf8, 0xd1, 0xac, 0xf4, 0x89, 0x7d, 0x27, 0x4d, 0x7c, 0x43, 0x25, 0xb3, 0x1c, 0xcb, 0x5e, - 0x4a, 0x3c, 0x55, 0x65, 0xcf, 0x14, 0x96, 0x6f, 0xa8, 0x14, 0x96, 0x5d, 0x82, 0x5d, 0xf2, 0x04, - 0x95, 0x3d, 0x13, 0x57, 0x6a, 0xc9, 0x27, 0x27, 0x8e, 0x27, 0xf9, 0xa4, 0x71, 0xd4, 0xf0, 0xfc, - 0x87, 0x4f, 0xf7, 0x38, 0x6a, 0x0c, 0xba, 0xdd, 0x0f, 0x1b, 0x9e, 0x68, 0x73, 0xea, 0xa1, 0x12, - 0x6d, 0xde, 0xd5, 0x13, 0x57, 0xa2, 0x1e, 0x99, 0x19, 0x29, 0x52, 0x9f, 0xe9, 0x2a, 0xef, 0xea, - 0x07, 0xe0, 0x74, 0x36, 0x5d, 0x75, 0xce, 0x75, 0xd2, 0x4d, 0x3d, 0x02, 0x3b, 0xd2, 0x60, 0x9e, - 0x3a, 0x99, 0x34, 0x98, 0xa7, 0x8f, 0x3d, 0x0d, 0xe6, 0x99, 0x13, 0x48, 0x83, 0xf9, 0xd8, 0x09, - 0xa6, 0xc1, 0xbc, 0xcb, 0xac, 0x22, 0x78, 0xb8, 0x13, 0x11, 0x9c, 0x33, 0x3d, 0x10, 0x64, 0x5a, - 0x4c, 0x14, 0xfe, 0x71, 0x0a, 0x84, 0x63, 0x52, 0x29, 0xe9, 0x35, 0x67, 0x1e, 0x41, 0x7a, 0xcd, - 0xb5, 0x38, 0xbd, 0xe6, 0xd9, 0xec, 0xa9, 0x4e, 0x31, 0x5d, 0xcf, 0x48, 0xaa, 0x79, 0x57, 0x4f, - 0x86, 0xf9, 0x78, 0x17, 0x55, 0x7c, 0x9a, 0xe2, 0xb1, 0x4b, 0x0a, 0xcc, 0xd7, 0x79, 0x0a, 0xcc, - 0x73, 0xd9, 0x9c, 0x3c, 0x79, 0xdc, 0x99, 0x89, 0x2f, 0xbf, 0x2f, 0x07, 0x17, 0xba, 0xef, 0x8b, - 0x58, 0xeb, 0x59, 0x89, 0x5f, 0x04, 0x13, 0x5a, 0x4f, 0x7e, 0xb7, 0x8a, 0xb1, 0xfa, 0x8e, 0x84, - 0x75, 0x1d, 0xa6, 0x94, 0x6d, 0x7a, 0xc3, 0xad, 0xed, 0x6b, 0xb9, 0xfe, 0x95, 0x3f, 0x6f, 0x35, - 0x89, 0x80, 0x3b, 0xeb, 0xa0, 0x05, 0x98, 0x30, 0x0a, 0xcb, 0x25, 0x71, 0x87, 0x52, 0x6a, 0xd6, - 0xaa, 0x09, 0xc6, 0x49, 0x7c, 0xfb, 0xcb, 0x16, 0x3c, 0x96, 0x91, 0x61, 0xaa, 0xef, 0x40, 0x4f, - 0x9b, 0x30, 0xd1, 0x32, 0xab, 0xf6, 0x88, 0x07, 0x67, 0xe4, 0xb1, 0x52, 0x7d, 0x4d, 0x00, 0x70, - 0x92, 0xa8, 0xfd, 0x67, 0x16, 0x9c, 0xef, 0x6a, 0xf9, 0x85, 0x30, 0x9c, 0xd9, 0x6a, 0x86, 0xce, - 0x52, 0x40, 0xea, 0xc4, 0x8b, 0x5c, 0xa7, 0x51, 0x6d, 0x91, 0x9a, 0xa6, 0xb7, 0x66, 0x26, 0x54, - 0xd7, 0x57, 0xab, 0x0b, 0x9d, 0x18, 0x38, 0xa3, 0x26, 0x5a, 0x01, 0xd4, 0x09, 0x11, 0x33, 0xcc, - 0x02, 0xcf, 0x76, 0xd2, 0xc3, 0x29, 0x35, 0xd0, 0x4b, 0x30, 0xa6, 0x2c, 0xca, 0xb4, 0x19, 0x67, - 0x0c, 0x18, 0xeb, 0x00, 0x6c, 0xe2, 0x2d, 0x5e, 0xf9, 0x8d, 0xdf, 0xbf, 0xf0, 0x91, 0xdf, 0xfa, - 0xfd, 0x0b, 0x1f, 0xf9, 0x9d, 0xdf, 0xbf, 0xf0, 0x91, 0xef, 0x78, 0x70, 0xc1, 0xfa, 0x8d, 0x07, - 0x17, 0xac, 0xdf, 0x7a, 0x70, 0xc1, 0xfa, 0x9d, 0x07, 0x17, 0xac, 0xdf, 0x7b, 0x70, 0xc1, 0xfa, - 0xd2, 0x1f, 0x5c, 0xf8, 0xc8, 0x5b, 0xb9, 0xdd, 0xe7, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, - 0xb2, 0xd6, 0x81, 0x33, 0xe4, 0xfd, 0x00, 0x00, + // 13809 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7b, 0x70, 0x1c, 0x47, + 0x7a, 0x18, 0x7e, 0xb3, 0x8b, 0xc7, 0xee, 0x87, 0x77, 0x83, 0xa4, 0x40, 0x88, 0x24, 0xa8, 0xe1, + 0x1d, 0x45, 0x9d, 0x24, 0xf0, 0xf4, 0x3a, 0xc9, 0x92, 0x4e, 0x3e, 0x00, 0x0b, 0x90, 0x2b, 0x12, + 0xe0, 0xaa, 0x17, 0x24, 0xef, 0x64, 0xdd, 0xfd, 0x6e, 0xb0, 0xdb, 0x00, 0x46, 0xd8, 0x9d, 0x59, + 0xcd, 0xcc, 0x82, 0x84, 0x7e, 0x76, 0xc5, 0x39, 0x3f, 0xcf, 0x8f, 0xd4, 0x55, 0xca, 0x95, 0x87, + 0xed, 0x72, 0xa5, 0x1c, 0xa7, 0xec, 0x8b, 0x93, 0x54, 0x1c, 0x3b, 0xb6, 0xe3, 0x73, 0x62, 0xc7, + 0xce, 0xc3, 0xc9, 0x1f, 0x8e, 0xe3, 0x4a, 0x72, 0xae, 0x72, 0x05, 0xb1, 0xe9, 0x54, 0x5c, 0xf7, + 0x47, 0x6c, 0x27, 0x76, 0xfe, 0x08, 0xe2, 0x8a, 0x53, 0xfd, 0x9c, 0xee, 0xd9, 0x99, 0xdd, 0x05, + 0x05, 0xe0, 0x74, 0x57, 0xfa, 0x6f, 0xb7, 0xbf, 0xaf, 0xbf, 0xee, 0xe9, 0xe7, 0xd7, 0xdf, 0x13, + 0x5e, 0xd9, 0x79, 0x29, 0x9c, 0x77, 0xfd, 0xab, 0x3b, 0xed, 0x0d, 0x12, 0x78, 0x24, 0x22, 0xe1, + 0xd5, 0x5d, 0xe2, 0xd5, 0xfd, 0xe0, 0xaa, 0x00, 0x38, 0x2d, 0xf7, 0x6a, 0xcd, 0x0f, 0xc8, 0xd5, + 0xdd, 0x67, 0xae, 0x6e, 0x11, 0x8f, 0x04, 0x4e, 0x44, 0xea, 0xf3, 0xad, 0xc0, 0x8f, 0x7c, 0x84, + 0x38, 0xce, 0xbc, 0xd3, 0x72, 0xe7, 0x29, 0xce, 0xfc, 0xee, 0x33, 0xb3, 0x4f, 0x6f, 0xb9, 0xd1, + 0x76, 0x7b, 0x63, 0xbe, 0xe6, 0x37, 0xaf, 0x6e, 0xf9, 0x5b, 0xfe, 0x55, 0x86, 0xba, 0xd1, 0xde, + 0x64, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x93, 0x98, 0x7d, 0x3e, 0x6e, 0xa6, 0xe9, 0xd4, 0xb6, 0x5d, + 0x8f, 0x04, 0x7b, 0x57, 0x5b, 0x3b, 0x5b, 0xac, 0xdd, 0x80, 0x84, 0x7e, 0x3b, 0xa8, 0x91, 0x64, + 0xc3, 0x5d, 0x6b, 0x85, 0x57, 0x9b, 0x24, 0x72, 0x52, 0xba, 0x3b, 0x7b, 0x35, 0xab, 0x56, 0xd0, + 0xf6, 0x22, 0xb7, 0xd9, 0xd9, 0xcc, 0xc7, 0x7b, 0x55, 0x08, 0x6b, 0xdb, 0xa4, 0xe9, 0x74, 0xd4, + 0x7b, 0x2e, 0xab, 0x5e, 0x3b, 0x72, 0x1b, 0x57, 0x5d, 0x2f, 0x0a, 0xa3, 0x20, 0x59, 0xc9, 0xfe, + 0x8a, 0x05, 0x17, 0x17, 0xee, 0x56, 0x97, 0x1b, 0x4e, 0x18, 0xb9, 0xb5, 0xc5, 0x86, 0x5f, 0xdb, + 0xa9, 0x46, 0x7e, 0x40, 0xee, 0xf8, 0x8d, 0x76, 0x93, 0x54, 0xd9, 0x40, 0xa0, 0xa7, 0xa0, 0xb0, + 0xcb, 0xfe, 0x97, 0x4b, 0x33, 0xd6, 0x45, 0xeb, 0x4a, 0x71, 0x71, 0xf2, 0x37, 0xf6, 0xe7, 0x3e, + 0xf4, 0x60, 0x7f, 0xae, 0x70, 0x47, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xc3, 0xd0, 0x66, 0xb8, 0xbe, + 0xd7, 0x22, 0x33, 0x39, 0x86, 0x3b, 0x2e, 0x70, 0x87, 0x56, 0xaa, 0xb4, 0x14, 0x0b, 0x28, 0xba, + 0x0a, 0xc5, 0x96, 0x13, 0x44, 0x6e, 0xe4, 0xfa, 0xde, 0x4c, 0xfe, 0xa2, 0x75, 0x65, 0x70, 0x71, + 0x4a, 0xa0, 0x16, 0x2b, 0x12, 0x80, 0x63, 0x1c, 0xda, 0x8d, 0x80, 0x38, 0xf5, 0x5b, 0x5e, 0x63, + 0x6f, 0x66, 0xe0, 0xa2, 0x75, 0xa5, 0x10, 0x77, 0x03, 0x8b, 0x72, 0xac, 0x30, 0xec, 0x1f, 0xce, + 0x41, 0x61, 0x61, 0x73, 0xd3, 0xf5, 0xdc, 0x68, 0x0f, 0xdd, 0x81, 0x51, 0xcf, 0xaf, 0x13, 0xf9, + 0x9f, 0x7d, 0xc5, 0xc8, 0xb3, 0x17, 0xe7, 0x3b, 0x97, 0xd2, 0xfc, 0x9a, 0x86, 0xb7, 0x38, 0xf9, + 0x60, 0x7f, 0x6e, 0x54, 0x2f, 0xc1, 0x06, 0x1d, 0x84, 0x61, 0xa4, 0xe5, 0xd7, 0x15, 0xd9, 0x1c, + 0x23, 0x3b, 0x97, 0x46, 0xb6, 0x12, 0xa3, 0x2d, 0x4e, 0x3c, 0xd8, 0x9f, 0x1b, 0xd1, 0x0a, 0xb0, + 0x4e, 0x04, 0x6d, 0xc0, 0x04, 0xfd, 0xeb, 0x45, 0xae, 0xa2, 0x9b, 0x67, 0x74, 0x2f, 0x65, 0xd1, + 0xd5, 0x50, 0x17, 0xa7, 0x1f, 0xec, 0xcf, 0x4d, 0x24, 0x0a, 0x71, 0x92, 0xa0, 0xfd, 0x2e, 0x8c, + 0x2f, 0x44, 0x91, 0x53, 0xdb, 0x26, 0x75, 0x3e, 0x83, 0xe8, 0x79, 0x18, 0xf0, 0x9c, 0x26, 0x11, + 0xf3, 0x7b, 0x51, 0x0c, 0xec, 0xc0, 0x9a, 0xd3, 0x24, 0x07, 0xfb, 0x73, 0x93, 0xb7, 0x3d, 0xf7, + 0x9d, 0xb6, 0x58, 0x15, 0xb4, 0x0c, 0x33, 0x6c, 0xf4, 0x2c, 0x40, 0x9d, 0xec, 0xba, 0x35, 0x52, + 0x71, 0xa2, 0x6d, 0x31, 0xdf, 0x48, 0xd4, 0x85, 0x92, 0x82, 0x60, 0x0d, 0xcb, 0xbe, 0x0f, 0xc5, + 0x85, 0x5d, 0xdf, 0xad, 0x57, 0xfc, 0x7a, 0x88, 0x76, 0x60, 0xa2, 0x15, 0x90, 0x4d, 0x12, 0xa8, + 0xa2, 0x19, 0xeb, 0x62, 0xfe, 0xca, 0xc8, 0xb3, 0x57, 0x52, 0x3f, 0xd6, 0x44, 0x5d, 0xf6, 0xa2, + 0x60, 0x6f, 0xf1, 0x11, 0xd1, 0xde, 0x44, 0x02, 0x8a, 0x93, 0x94, 0xed, 0x7f, 0x91, 0x83, 0xd3, + 0x0b, 0xef, 0xb6, 0x03, 0x52, 0x72, 0xc3, 0x9d, 0xe4, 0x0a, 0xaf, 0xbb, 0xe1, 0xce, 0x5a, 0x3c, + 0x02, 0x6a, 0x69, 0x95, 0x44, 0x39, 0x56, 0x18, 0xe8, 0x69, 0x18, 0xa6, 0xbf, 0x6f, 0xe3, 0xb2, + 0xf8, 0xe4, 0x69, 0x81, 0x3c, 0x52, 0x72, 0x22, 0xa7, 0xc4, 0x41, 0x58, 0xe2, 0xa0, 0x55, 0x18, + 0xa9, 0xb1, 0x0d, 0xb9, 0xb5, 0xea, 0xd7, 0x09, 0x9b, 0xcc, 0xe2, 0xe2, 0x93, 0x14, 0x7d, 0x29, + 0x2e, 0x3e, 0xd8, 0x9f, 0x9b, 0xe1, 0x7d, 0x13, 0x24, 0x34, 0x18, 0xd6, 0xeb, 0x23, 0x5b, 0xed, + 0xaf, 0x01, 0x46, 0x09, 0x52, 0xf6, 0xd6, 0x15, 0x6d, 0xab, 0x0c, 0xb2, 0xad, 0x32, 0x9a, 0xbe, + 0x4d, 0xd0, 0x33, 0x30, 0xb0, 0xe3, 0x7a, 0xf5, 0x99, 0x21, 0x46, 0xeb, 0x3c, 0x9d, 0xf3, 0x1b, + 0xae, 0x57, 0x3f, 0xd8, 0x9f, 0x9b, 0x32, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd4, 0x82, + 0x39, 0x06, 0x5b, 0x71, 0x1b, 0xa4, 0x42, 0x82, 0xd0, 0x0d, 0x23, 0xe2, 0x45, 0xc6, 0x80, 0x3e, + 0x0b, 0x10, 0x92, 0x5a, 0x40, 0x22, 0x6d, 0x48, 0xd5, 0xc2, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xe8, + 0x81, 0x10, 0x6e, 0x3b, 0x01, 0x5b, 0x5f, 0x62, 0x60, 0xd5, 0x81, 0x50, 0x95, 0x00, 0x1c, 0xe3, + 0x18, 0x07, 0x42, 0xbe, 0xd7, 0x81, 0x80, 0x3e, 0x01, 0x13, 0x71, 0x63, 0x61, 0xcb, 0xa9, 0xc9, + 0x01, 0x64, 0x5b, 0xa6, 0x6a, 0x82, 0x70, 0x12, 0xd7, 0xfe, 0xbb, 0x96, 0x58, 0x3c, 0xf4, 0xab, + 0xdf, 0xe7, 0xdf, 0x6a, 0xff, 0xa2, 0x05, 0xc3, 0x8b, 0xae, 0x57, 0x77, 0xbd, 0x2d, 0xf4, 0x39, + 0x28, 0xd0, 0xbb, 0xa9, 0xee, 0x44, 0x8e, 0x38, 0xf7, 0x3e, 0xa6, 0xed, 0x2d, 0x75, 0x55, 0xcc, + 0xb7, 0x76, 0xb6, 0x68, 0x41, 0x38, 0x4f, 0xb1, 0xe9, 0x6e, 0xbb, 0xb5, 0xf1, 0x36, 0xa9, 0x45, + 0xab, 0x24, 0x72, 0xe2, 0xcf, 0x89, 0xcb, 0xb0, 0xa2, 0x8a, 0x6e, 0xc0, 0x50, 0xe4, 0x04, 0x5b, + 0x24, 0x12, 0x07, 0x60, 0xea, 0x41, 0xc5, 0x6b, 0x62, 0xba, 0x23, 0x89, 0x57, 0x23, 0xf1, 0xb5, + 0xb0, 0xce, 0xaa, 0x62, 0x41, 0xc2, 0xfe, 0xc1, 0x61, 0x38, 0xbb, 0x54, 0x2d, 0x67, 0xac, 0xab, + 0xcb, 0x30, 0x54, 0x0f, 0xdc, 0x5d, 0x12, 0x88, 0x71, 0x56, 0x54, 0x4a, 0xac, 0x14, 0x0b, 0x28, + 0x7a, 0x09, 0x46, 0xf9, 0x85, 0x74, 0xdd, 0xf1, 0xea, 0x0d, 0x39, 0xc4, 0xa7, 0x04, 0xf6, 0xe8, + 0x1d, 0x0d, 0x86, 0x0d, 0xcc, 0x43, 0x2e, 0xaa, 0xcb, 0x89, 0xcd, 0x98, 0x75, 0xd9, 0x7d, 0xc1, + 0x82, 0x49, 0xde, 0xcc, 0x42, 0x14, 0x05, 0xee, 0x46, 0x3b, 0x22, 0xe1, 0xcc, 0x20, 0x3b, 0xe9, + 0x96, 0xd2, 0x46, 0x2b, 0x73, 0x04, 0xe6, 0xef, 0x24, 0xa8, 0xf0, 0x43, 0x70, 0x46, 0xb4, 0x3b, + 0x99, 0x04, 0xe3, 0x8e, 0x66, 0xd1, 0x77, 0x58, 0x30, 0x5b, 0xf3, 0xbd, 0x28, 0xf0, 0x1b, 0x0d, + 0x12, 0x54, 0xda, 0x1b, 0x0d, 0x37, 0xdc, 0xe6, 0xeb, 0x14, 0x93, 0x4d, 0x76, 0x12, 0x64, 0xcc, + 0xa1, 0x42, 0x12, 0x73, 0x78, 0xe1, 0xc1, 0xfe, 0xdc, 0xec, 0x52, 0x26, 0x29, 0xdc, 0xa5, 0x19, + 0xb4, 0x03, 0x88, 0x5e, 0xa5, 0xd5, 0xc8, 0xd9, 0x22, 0x71, 0xe3, 0xc3, 0xfd, 0x37, 0x7e, 0xe6, + 0xc1, 0xfe, 0x1c, 0x5a, 0xeb, 0x20, 0x81, 0x53, 0xc8, 0xa2, 0x77, 0xe0, 0x14, 0x2d, 0xed, 0xf8, + 0xd6, 0x42, 0xff, 0xcd, 0xcd, 0x3c, 0xd8, 0x9f, 0x3b, 0xb5, 0x96, 0x42, 0x04, 0xa7, 0x92, 0x46, + 0xdf, 0x6e, 0xc1, 0xd9, 0xf8, 0xf3, 0x97, 0xef, 0xb7, 0x1c, 0xaf, 0x1e, 0x37, 0x5c, 0xec, 0xbf, + 0x61, 0x7a, 0x26, 0x9f, 0x5d, 0xca, 0xa2, 0x84, 0xb3, 0x1b, 0x99, 0x5d, 0x82, 0xd3, 0xa9, 0xab, + 0x05, 0x4d, 0x42, 0x7e, 0x87, 0x70, 0x2e, 0xa8, 0x88, 0xe9, 0x4f, 0x74, 0x0a, 0x06, 0x77, 0x9d, + 0x46, 0x5b, 0x6c, 0x14, 0xcc, 0xff, 0xbc, 0x9c, 0x7b, 0xc9, 0xb2, 0xff, 0x65, 0x1e, 0x26, 0x96, + 0xaa, 0xe5, 0x87, 0xda, 0x85, 0xfa, 0x35, 0x94, 0xeb, 0x7a, 0x0d, 0xc5, 0x97, 0x5a, 0x3e, 0xf3, + 0x52, 0xfb, 0x4b, 0x29, 0x5b, 0x68, 0x80, 0x6d, 0xa1, 0x6f, 0xca, 0xd8, 0x42, 0x47, 0xbc, 0x71, + 0x76, 0x33, 0x56, 0xd1, 0x20, 0x9b, 0xcc, 0x54, 0x8e, 0xe5, 0xa6, 0x5f, 0x73, 0x1a, 0xc9, 0xa3, + 0xef, 0x90, 0x4b, 0xe9, 0x68, 0xe6, 0xb1, 0x06, 0xa3, 0x4b, 0x4e, 0xcb, 0xd9, 0x70, 0x1b, 0x6e, + 0xe4, 0x92, 0x10, 0x3d, 0x0e, 0x79, 0xa7, 0x5e, 0x67, 0xdc, 0x56, 0x71, 0xf1, 0xf4, 0x83, 0xfd, + 0xb9, 0xfc, 0x42, 0x9d, 0x5e, 0xfb, 0xa0, 0xb0, 0xf6, 0x30, 0xc5, 0x40, 0x1f, 0x85, 0x81, 0x7a, + 0xe0, 0xb7, 0x66, 0x72, 0x0c, 0x93, 0xee, 0xba, 0x81, 0x52, 0xe0, 0xb7, 0x12, 0xa8, 0x0c, 0xc7, + 0xfe, 0xd5, 0x1c, 0x9c, 0x5b, 0x22, 0xad, 0xed, 0x95, 0x6a, 0xc6, 0xf9, 0x7d, 0x05, 0x0a, 0x4d, + 0xdf, 0x73, 0x23, 0x3f, 0x08, 0x45, 0xd3, 0x6c, 0x45, 0xac, 0x8a, 0x32, 0xac, 0xa0, 0xe8, 0x22, + 0x0c, 0xb4, 0x62, 0xa6, 0x72, 0x54, 0x32, 0xa4, 0x8c, 0x9d, 0x64, 0x10, 0x8a, 0xd1, 0x0e, 0x49, + 0x20, 0x56, 0x8c, 0xc2, 0xb8, 0x1d, 0x92, 0x00, 0x33, 0x48, 0x7c, 0x33, 0xd3, 0x3b, 0x5b, 0x9c, + 0xd0, 0x89, 0x9b, 0x99, 0x42, 0xb0, 0x86, 0x85, 0x2a, 0x50, 0x0c, 0x13, 0x33, 0xdb, 0xd7, 0x36, + 0x1d, 0x63, 0x57, 0xb7, 0x9a, 0xc9, 0x98, 0x88, 0x71, 0xa3, 0x0c, 0xf5, 0xbc, 0xba, 0xbf, 0x9c, + 0x03, 0xc4, 0x87, 0xf0, 0xeb, 0x6c, 0xe0, 0x6e, 0x77, 0x0e, 0x5c, 0xff, 0x5b, 0xe2, 0xa8, 0x46, + 0xef, 0xcf, 0x2c, 0x38, 0xb7, 0xe4, 0x7a, 0x75, 0x12, 0x64, 0x2c, 0xc0, 0xe3, 0x79, 0xcb, 0x1e, + 0x8e, 0x69, 0x30, 0x96, 0xd8, 0xc0, 0x11, 0x2c, 0x31, 0xfb, 0x8f, 0x2d, 0x40, 0xfc, 0xb3, 0xdf, + 0x77, 0x1f, 0x7b, 0xbb, 0xf3, 0x63, 0x8f, 0x60, 0x59, 0xd8, 0x37, 0x61, 0x7c, 0xa9, 0xe1, 0x12, + 0x2f, 0x2a, 0x57, 0x96, 0x7c, 0x6f, 0xd3, 0xdd, 0x42, 0x2f, 0xc3, 0x78, 0xe4, 0x36, 0x89, 0xdf, + 0x8e, 0xaa, 0xa4, 0xe6, 0x7b, 0xec, 0x25, 0x69, 0x5d, 0x19, 0x5c, 0x44, 0x0f, 0xf6, 0xe7, 0xc6, + 0xd7, 0x0d, 0x08, 0x4e, 0x60, 0xda, 0xbf, 0x4b, 0xc7, 0xcf, 0x6f, 0xb6, 0x7c, 0x8f, 0x78, 0xd1, + 0x92, 0xef, 0xd5, 0xb9, 0xc4, 0xe1, 0x65, 0x18, 0x88, 0xe8, 0x78, 0xf0, 0xb1, 0xbb, 0x2c, 0x37, + 0x0a, 0x1d, 0x85, 0x83, 0xfd, 0xb9, 0x33, 0x9d, 0x35, 0xd8, 0x38, 0xb1, 0x3a, 0xe8, 0x9b, 0x60, + 0x28, 0x8c, 0x9c, 0xa8, 0x1d, 0x8a, 0xd1, 0x7c, 0x4c, 0x8e, 0x66, 0x95, 0x95, 0x1e, 0xec, 0xcf, + 0x4d, 0xa8, 0x6a, 0xbc, 0x08, 0x8b, 0x0a, 0xe8, 0x09, 0x18, 0x6e, 0x92, 0x30, 0x74, 0xb6, 0xe4, + 0x6d, 0x38, 0x21, 0xea, 0x0e, 0xaf, 0xf2, 0x62, 0x2c, 0xe1, 0xe8, 0x12, 0x0c, 0x92, 0x20, 0xf0, + 0x03, 0xb1, 0x47, 0xc7, 0x04, 0xe2, 0xe0, 0x32, 0x2d, 0xc4, 0x1c, 0x66, 0xff, 0x3b, 0x0b, 0x26, + 0x54, 0x5f, 0x79, 0x5b, 0x27, 0xf0, 0x2a, 0x78, 0x13, 0xa0, 0x26, 0x3f, 0x30, 0x64, 0xb7, 0xc7, + 0xc8, 0xb3, 0x97, 0x53, 0x2f, 0xea, 0x8e, 0x61, 0x8c, 0x29, 0xab, 0xa2, 0x10, 0x6b, 0xd4, 0xec, + 0x7f, 0x6a, 0xc1, 0x74, 0xe2, 0x8b, 0x6e, 0xba, 0x61, 0x84, 0xde, 0xea, 0xf8, 0xaa, 0xf9, 0xfe, + 0xbe, 0x8a, 0xd6, 0x66, 0xdf, 0xa4, 0x96, 0xb2, 0x2c, 0xd1, 0xbe, 0xe8, 0x3a, 0x0c, 0xba, 0x11, + 0x69, 0xca, 0x8f, 0xb9, 0xd4, 0xf5, 0x63, 0x78, 0xaf, 0xe2, 0x19, 0x29, 0xd3, 0x9a, 0x98, 0x13, + 0xb0, 0x7f, 0x35, 0x0f, 0x45, 0xbe, 0x6c, 0x57, 0x9d, 0xd6, 0x09, 0xcc, 0xc5, 0x93, 0x50, 0x74, + 0x9b, 0xcd, 0x76, 0xe4, 0x6c, 0x88, 0xe3, 0xbc, 0xc0, 0xb7, 0x56, 0x59, 0x16, 0xe2, 0x18, 0x8e, + 0xca, 0x30, 0xc0, 0xba, 0xc2, 0xbf, 0xf2, 0xf1, 0xf4, 0xaf, 0x14, 0x7d, 0x9f, 0x2f, 0x39, 0x91, + 0xc3, 0x39, 0x29, 0x75, 0x8f, 0xd0, 0x22, 0xcc, 0x48, 0x20, 0x07, 0x60, 0xc3, 0xf5, 0x9c, 0x60, + 0x8f, 0x96, 0xcd, 0xe4, 0x19, 0xc1, 0xa7, 0xbb, 0x13, 0x5c, 0x54, 0xf8, 0x9c, 0xac, 0xfa, 0xb0, + 0x18, 0x80, 0x35, 0xa2, 0xb3, 0x2f, 0x42, 0x51, 0x21, 0x1f, 0x86, 0x21, 0x9a, 0xfd, 0x04, 0x4c, + 0x24, 0xda, 0xea, 0x55, 0x7d, 0x54, 0xe7, 0xa7, 0x7e, 0x89, 0x1d, 0x19, 0xa2, 0xd7, 0xcb, 0xde, + 0xae, 0x38, 0x72, 0xdf, 0x85, 0x53, 0x8d, 0x94, 0x93, 0x4c, 0xcc, 0x6b, 0xff, 0x27, 0xdf, 0x39, + 0xf1, 0xd9, 0xa7, 0xd2, 0xa0, 0x38, 0xb5, 0x0d, 0xca, 0x23, 0xf8, 0x2d, 0xba, 0x41, 0x9c, 0x86, + 0xce, 0x6e, 0xdf, 0x12, 0x65, 0x58, 0x41, 0xe9, 0x79, 0x77, 0x4a, 0x75, 0xfe, 0x06, 0xd9, 0xab, + 0x92, 0x06, 0xa9, 0x45, 0x7e, 0xf0, 0x35, 0xed, 0xfe, 0x79, 0x3e, 0xfa, 0xfc, 0xb8, 0x1c, 0x11, + 0x04, 0xf2, 0x37, 0xc8, 0x1e, 0x9f, 0x0a, 0xfd, 0xeb, 0xf2, 0x5d, 0xbf, 0xee, 0x67, 0x2c, 0x18, + 0x53, 0x5f, 0x77, 0x02, 0xe7, 0xc2, 0xa2, 0x79, 0x2e, 0x9c, 0xef, 0xba, 0xc0, 0x33, 0x4e, 0x84, + 0x2f, 0xe7, 0xe0, 0xac, 0xc2, 0xa1, 0x6f, 0x03, 0xfe, 0x47, 0xac, 0xaa, 0xab, 0x50, 0xf4, 0x94, + 0xd4, 0xca, 0x32, 0xc5, 0x45, 0xb1, 0xcc, 0x2a, 0xc6, 0xa1, 0x2c, 0x9e, 0x17, 0x8b, 0x96, 0x46, + 0x75, 0x71, 0xae, 0x10, 0xdd, 0x2e, 0x42, 0xbe, 0xed, 0xd6, 0xc5, 0x05, 0xf3, 0x31, 0x39, 0xda, + 0xb7, 0xcb, 0xa5, 0x83, 0xfd, 0xb9, 0xc7, 0xb2, 0x54, 0x09, 0xf4, 0x66, 0x0b, 0xe7, 0x6f, 0x97, + 0x4b, 0x98, 0x56, 0x46, 0x0b, 0x30, 0x21, 0xb5, 0x25, 0x77, 0x28, 0xbb, 0xe5, 0x7b, 0xe2, 0x1e, + 0x52, 0x32, 0x59, 0x6c, 0x82, 0x71, 0x12, 0x1f, 0x95, 0x60, 0x72, 0xa7, 0xbd, 0x41, 0x1a, 0x24, + 0xe2, 0x1f, 0x7c, 0x83, 0x70, 0x89, 0x65, 0x31, 0x7e, 0x99, 0xdd, 0x48, 0xc0, 0x71, 0x47, 0x0d, + 0xfb, 0x2f, 0xd8, 0x7d, 0x20, 0x46, 0xaf, 0x12, 0xf8, 0x74, 0x61, 0x51, 0xea, 0x5f, 0xcb, 0xe5, + 0xdc, 0xcf, 0xaa, 0xb8, 0x41, 0xf6, 0xd6, 0x7d, 0xca, 0x99, 0xa7, 0xaf, 0x0a, 0x63, 0xcd, 0x0f, + 0x74, 0x5d, 0xf3, 0x3f, 0x97, 0x83, 0xd3, 0x6a, 0x04, 0x0c, 0x26, 0xf0, 0xeb, 0x7d, 0x0c, 0x9e, + 0x81, 0x91, 0x3a, 0xd9, 0x74, 0xda, 0x8d, 0x48, 0x89, 0xcf, 0x07, 0xb9, 0x0a, 0xa5, 0x14, 0x17, + 0x63, 0x1d, 0xe7, 0x10, 0xc3, 0xf6, 0xbf, 0x46, 0xd8, 0x45, 0x1c, 0x39, 0x74, 0x8d, 0xab, 0x5d, + 0x63, 0x65, 0xee, 0x9a, 0x4b, 0x30, 0xe8, 0x36, 0x29, 0x63, 0x96, 0x33, 0xf9, 0xad, 0x32, 0x2d, + 0xc4, 0x1c, 0x86, 0x3e, 0x02, 0xc3, 0x35, 0xbf, 0xd9, 0x74, 0xbc, 0x3a, 0xbb, 0xf2, 0x8a, 0x8b, + 0x23, 0x94, 0x77, 0x5b, 0xe2, 0x45, 0x58, 0xc2, 0xd0, 0x39, 0x18, 0x70, 0x82, 0x2d, 0x2e, 0xc3, + 0x28, 0x2e, 0x16, 0x68, 0x4b, 0x0b, 0xc1, 0x56, 0x88, 0x59, 0x29, 0x7d, 0x82, 0xdd, 0xf3, 0x83, + 0x1d, 0xd7, 0xdb, 0x2a, 0xb9, 0x81, 0xd8, 0x12, 0xea, 0x2e, 0xbc, 0xab, 0x20, 0x58, 0xc3, 0x42, + 0x2b, 0x30, 0xd8, 0xf2, 0x83, 0x28, 0x9c, 0x19, 0x62, 0xc3, 0xfd, 0x58, 0xc6, 0x41, 0xc4, 0xbf, + 0xb6, 0xe2, 0x07, 0x51, 0xfc, 0x01, 0xf4, 0x5f, 0x88, 0x79, 0x75, 0x74, 0x13, 0x86, 0x89, 0xb7, + 0xbb, 0x12, 0xf8, 0xcd, 0x99, 0xe9, 0x6c, 0x4a, 0xcb, 0x1c, 0x85, 0x2f, 0xb3, 0x98, 0x47, 0x15, + 0xc5, 0x58, 0x92, 0x40, 0xdf, 0x04, 0x79, 0xe2, 0xed, 0xce, 0x0c, 0x33, 0x4a, 0xb3, 0x19, 0x94, + 0xee, 0x38, 0x41, 0x7c, 0xe6, 0x2f, 0x7b, 0xbb, 0x98, 0xd6, 0x41, 0x9f, 0x86, 0xa2, 0x3c, 0x30, + 0x42, 0x21, 0xac, 0x4b, 0x5d, 0xb0, 0xf2, 0x98, 0xc1, 0xe4, 0x9d, 0xb6, 0x1b, 0x90, 0x26, 0xf1, + 0xa2, 0x30, 0x3e, 0x21, 0x25, 0x34, 0xc4, 0x31, 0x35, 0xf4, 0x69, 0x29, 0x21, 0x5e, 0xf5, 0xdb, + 0x5e, 0x14, 0xce, 0x14, 0x59, 0xf7, 0x52, 0x75, 0x77, 0x77, 0x62, 0xbc, 0xa4, 0x08, 0x99, 0x57, + 0xc6, 0x06, 0x29, 0xf4, 0x19, 0x18, 0xe3, 0xff, 0xb9, 0x06, 0x2c, 0x9c, 0x39, 0xcd, 0x68, 0x5f, + 0xcc, 0xa6, 0xcd, 0x11, 0x17, 0x4f, 0x0b, 0xe2, 0x63, 0x7a, 0x69, 0x88, 0x4d, 0x6a, 0x08, 0xc3, + 0x58, 0xc3, 0xdd, 0x25, 0x1e, 0x09, 0xc3, 0x4a, 0xe0, 0x6f, 0x90, 0x19, 0x60, 0x03, 0x73, 0x36, + 0x5d, 0x63, 0xe6, 0x6f, 0x90, 0xc5, 0x29, 0x4a, 0xf3, 0xa6, 0x5e, 0x07, 0x9b, 0x24, 0xd0, 0x6d, + 0x18, 0xa7, 0x2f, 0x36, 0x37, 0x26, 0x3a, 0xd2, 0x8b, 0x28, 0x7b, 0x57, 0x61, 0xa3, 0x12, 0x4e, + 0x10, 0x41, 0xb7, 0x60, 0x34, 0x8c, 0x9c, 0x20, 0x6a, 0xb7, 0x38, 0xd1, 0x33, 0xbd, 0x88, 0x32, + 0x85, 0x6b, 0x55, 0xab, 0x82, 0x0d, 0x02, 0xe8, 0x75, 0x28, 0x36, 0xdc, 0x4d, 0x52, 0xdb, 0xab, + 0x35, 0xc8, 0xcc, 0x28, 0xa3, 0x96, 0x7a, 0xa8, 0xdc, 0x94, 0x48, 0x9c, 0xcf, 0x55, 0x7f, 0x71, + 0x5c, 0x1d, 0xdd, 0x81, 0x33, 0x11, 0x09, 0x9a, 0xae, 0xe7, 0xd0, 0xc3, 0x40, 0x3c, 0xad, 0x98, + 0x22, 0x73, 0x8c, 0xed, 0xb6, 0x0b, 0x62, 0x36, 0xce, 0xac, 0xa7, 0x62, 0xe1, 0x8c, 0xda, 0xe8, + 0x3e, 0xcc, 0xa4, 0x40, 0xfc, 0x86, 0x5b, 0xdb, 0x9b, 0x39, 0xc5, 0x28, 0xbf, 0x2a, 0x28, 0xcf, + 0xac, 0x67, 0xe0, 0x1d, 0x74, 0x81, 0xe1, 0x4c, 0xea, 0xe8, 0x16, 0x4c, 0xb0, 0x13, 0xa8, 0xd2, + 0x6e, 0x34, 0x44, 0x83, 0xe3, 0xac, 0xc1, 0x8f, 0xc8, 0xfb, 0xb8, 0x6c, 0x82, 0x0f, 0xf6, 0xe7, + 0x20, 0xfe, 0x87, 0x93, 0xb5, 0xd1, 0x06, 0xd3, 0x99, 0xb5, 0x03, 0x37, 0xda, 0xa3, 0xe7, 0x06, + 0xb9, 0x1f, 0xcd, 0x4c, 0x74, 0x95, 0x57, 0xe8, 0xa8, 0x4a, 0xb1, 0xa6, 0x17, 0xe2, 0x24, 0x41, + 0x7a, 0xa4, 0x86, 0x51, 0xdd, 0xf5, 0x66, 0x26, 0xf9, 0xbb, 0x44, 0x9e, 0x48, 0x55, 0x5a, 0x88, + 0x39, 0x8c, 0xe9, 0xcb, 0xe8, 0x8f, 0x5b, 0xf4, 0xe6, 0x9a, 0x62, 0x88, 0xb1, 0xbe, 0x4c, 0x02, + 0x70, 0x8c, 0x43, 0x99, 0xc9, 0x28, 0xda, 0x9b, 0x41, 0x0c, 0x55, 0x1d, 0x2c, 0xeb, 0xeb, 0x9f, + 0xc6, 0xb4, 0xdc, 0xde, 0x80, 0x71, 0x75, 0x10, 0xb2, 0x31, 0x41, 0x73, 0x30, 0xc8, 0xd8, 0x27, + 0x21, 0x5d, 0x2b, 0xd2, 0x2e, 0x30, 0xd6, 0x0a, 0xf3, 0x72, 0xd6, 0x05, 0xf7, 0x5d, 0xb2, 0xb8, + 0x17, 0x11, 0xfe, 0xa6, 0xcf, 0x6b, 0x5d, 0x90, 0x00, 0x1c, 0xe3, 0xd8, 0xff, 0x97, 0xb3, 0xa1, + 0xf1, 0x69, 0xdb, 0xc7, 0xfd, 0xf2, 0x14, 0x14, 0xb6, 0xfd, 0x30, 0xa2, 0xd8, 0xac, 0x8d, 0xc1, + 0x98, 0xf1, 0xbc, 0x2e, 0xca, 0xb1, 0xc2, 0x40, 0xaf, 0xc0, 0x58, 0x4d, 0x6f, 0x40, 0x5c, 0x8e, + 0xea, 0x18, 0x31, 0x5a, 0xc7, 0x26, 0x2e, 0x7a, 0x09, 0x0a, 0xcc, 0x06, 0xa4, 0xe6, 0x37, 0x04, + 0xd7, 0x26, 0x6f, 0xf8, 0x42, 0x45, 0x94, 0x1f, 0x68, 0xbf, 0xb1, 0xc2, 0x46, 0x97, 0x61, 0x88, + 0x76, 0xa1, 0x5c, 0x11, 0xd7, 0x92, 0x12, 0x14, 0x5d, 0x67, 0xa5, 0x58, 0x40, 0xed, 0xbf, 0x9a, + 0xd3, 0x46, 0x99, 0xbe, 0x87, 0x09, 0xaa, 0xc0, 0xf0, 0x3d, 0xc7, 0x8d, 0x5c, 0x6f, 0x4b, 0xf0, + 0x1f, 0x4f, 0x74, 0xbd, 0xa3, 0x58, 0xa5, 0xbb, 0xbc, 0x02, 0xbf, 0x45, 0xc5, 0x1f, 0x2c, 0xc9, + 0x50, 0x8a, 0x41, 0xdb, 0xf3, 0x28, 0xc5, 0x5c, 0xbf, 0x14, 0x31, 0xaf, 0xc0, 0x29, 0x8a, 0x3f, + 0x58, 0x92, 0x41, 0x6f, 0x01, 0xc8, 0x1d, 0x46, 0xea, 0xc2, 0xf6, 0xe2, 0xa9, 0xde, 0x44, 0xd7, + 0x55, 0x9d, 0xc5, 0x71, 0x7a, 0x47, 0xc7, 0xff, 0xb1, 0x46, 0xcf, 0x8e, 0x18, 0x9f, 0xd6, 0xd9, + 0x19, 0xf4, 0x2d, 0x74, 0x89, 0x3b, 0x41, 0x44, 0xea, 0x0b, 0x91, 0x18, 0x9c, 0x8f, 0xf6, 0xf7, + 0x48, 0x59, 0x77, 0x9b, 0x44, 0xdf, 0x0e, 0x82, 0x08, 0x8e, 0xe9, 0xd9, 0xbf, 0x90, 0x87, 0x99, + 0xac, 0xee, 0xd2, 0x45, 0x47, 0xee, 0xbb, 0xd1, 0x12, 0x65, 0xaf, 0x2c, 0x73, 0xd1, 0x2d, 0x8b, + 0x72, 0xac, 0x30, 0xe8, 0xec, 0x87, 0xee, 0x96, 0x7c, 0x63, 0x0e, 0xc6, 0xb3, 0x5f, 0x65, 0xa5, + 0x58, 0x40, 0x29, 0x5e, 0x40, 0x9c, 0x50, 0x18, 0xf7, 0x68, 0xab, 0x04, 0xb3, 0x52, 0x2c, 0xa0, + 0xba, 0xb4, 0x6b, 0xa0, 0x87, 0xb4, 0xcb, 0x18, 0xa2, 0xc1, 0xa3, 0x1d, 0x22, 0xf4, 0x59, 0x80, + 0x4d, 0xd7, 0x73, 0xc3, 0x6d, 0x46, 0x7d, 0xe8, 0xd0, 0xd4, 0x15, 0x73, 0xb6, 0xa2, 0xa8, 0x60, + 0x8d, 0x22, 0x7a, 0x01, 0x46, 0xd4, 0x06, 0x2c, 0x97, 0x98, 0xa6, 0x53, 0xb3, 0x1c, 0x89, 0x4f, + 0xa3, 0x12, 0xd6, 0xf1, 0xec, 0xb7, 0x93, 0xeb, 0x45, 0xec, 0x00, 0x6d, 0x7c, 0xad, 0x7e, 0xc7, + 0x37, 0xd7, 0x7d, 0x7c, 0xed, 0xaf, 0xe6, 0x61, 0xc2, 0x68, 0xac, 0x1d, 0xf6, 0x71, 0x66, 0x5d, + 0xa3, 0x07, 0xb8, 0x13, 0x11, 0xb1, 0xff, 0xec, 0xde, 0x5b, 0x45, 0x3f, 0xe4, 0xe9, 0x0e, 0xe0, + 0xf5, 0xd1, 0x67, 0xa1, 0xd8, 0x70, 0x42, 0x26, 0x39, 0x23, 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0x7e, + 0x98, 0x38, 0x61, 0xa4, 0xdd, 0x9a, 0x9c, 0x76, 0x4c, 0x92, 0xde, 0x34, 0x94, 0x3f, 0x91, 0xd6, + 0x63, 0xaa, 0x13, 0x94, 0x89, 0xd9, 0xc3, 0x1c, 0x86, 0x5e, 0x82, 0xd1, 0x80, 0xb0, 0x55, 0xb1, + 0x44, 0xb9, 0x39, 0xb6, 0xcc, 0x06, 0x63, 0xb6, 0x0f, 0x6b, 0x30, 0x6c, 0x60, 0xc6, 0x6f, 0x83, + 0xa1, 0x2e, 0x6f, 0x83, 0x27, 0x60, 0x98, 0xfd, 0x50, 0x2b, 0x40, 0xcd, 0x46, 0x99, 0x17, 0x63, + 0x09, 0x4f, 0x2e, 0x98, 0x42, 0x7f, 0x0b, 0x86, 0xbe, 0x3e, 0xc4, 0xa2, 0x66, 0x5a, 0xe6, 0x02, + 0x3f, 0xe5, 0xc4, 0x92, 0xc7, 0x12, 0x66, 0x7f, 0x14, 0xc6, 0x4b, 0x0e, 0x69, 0xfa, 0xde, 0xb2, + 0x57, 0x6f, 0xf9, 0xae, 0x17, 0xa1, 0x19, 0x18, 0x60, 0x97, 0x08, 0x3f, 0x02, 0x06, 0x68, 0x43, + 0x78, 0x80, 0x3e, 0x08, 0xec, 0x2d, 0x38, 0x5d, 0xf2, 0xef, 0x79, 0xf7, 0x9c, 0xa0, 0xbe, 0x50, + 0x29, 0x6b, 0xef, 0xeb, 0x35, 0xf9, 0xbe, 0xe3, 0x46, 0x5b, 0xa9, 0x47, 0xaf, 0x56, 0x93, 0xb3, + 0xb5, 0x2b, 0x6e, 0x83, 0x64, 0x48, 0x41, 0xfe, 0x7a, 0xce, 0x68, 0x29, 0xc6, 0x57, 0x5a, 0x2d, + 0x2b, 0x53, 0xab, 0xf5, 0x06, 0x14, 0x36, 0x5d, 0xd2, 0xa8, 0x63, 0xb2, 0x29, 0x56, 0xe2, 0xe3, + 0xd9, 0x76, 0x28, 0x2b, 0x14, 0x53, 0x4a, 0xbd, 0xf8, 0xeb, 0x70, 0x45, 0x54, 0xc6, 0x8a, 0x0c, + 0xda, 0x81, 0x49, 0xf9, 0x60, 0x90, 0x50, 0xb1, 0x2e, 0x9f, 0xe8, 0xf6, 0x0a, 0x31, 0x89, 0x9f, + 0x7a, 0xb0, 0x3f, 0x37, 0x89, 0x13, 0x64, 0x70, 0x07, 0x61, 0xfa, 0x1c, 0x6c, 0xd2, 0x13, 0x78, + 0x80, 0x0d, 0x3f, 0x7b, 0x0e, 0xb2, 0x97, 0x2d, 0x2b, 0xb5, 0x7f, 0xd4, 0x82, 0x47, 0x3a, 0x46, + 0x46, 0xbc, 0xf0, 0x8f, 0x78, 0x16, 0x92, 0x2f, 0xee, 0x5c, 0xef, 0x17, 0xb7, 0xfd, 0xf7, 0x2c, + 0x38, 0xb5, 0xdc, 0x6c, 0x45, 0x7b, 0x25, 0xd7, 0x54, 0x41, 0xbd, 0x08, 0x43, 0x4d, 0x52, 0x77, + 0xdb, 0x4d, 0x31, 0x73, 0x73, 0xf2, 0x94, 0x5a, 0x65, 0xa5, 0x07, 0xfb, 0x73, 0x63, 0xd5, 0xc8, + 0x0f, 0x9c, 0x2d, 0xc2, 0x0b, 0xb0, 0x40, 0x67, 0x67, 0xbd, 0xfb, 0x2e, 0xb9, 0xe9, 0x36, 0x5d, + 0x69, 0x57, 0xd4, 0x55, 0x66, 0x37, 0x2f, 0x07, 0x74, 0xfe, 0x8d, 0xb6, 0xe3, 0x45, 0x6e, 0xb4, + 0x27, 0xb4, 0x47, 0x92, 0x08, 0x8e, 0xe9, 0xd9, 0x5f, 0xb1, 0x60, 0x42, 0xae, 0xfb, 0x85, 0x7a, + 0x3d, 0x20, 0x61, 0x88, 0x66, 0x21, 0xe7, 0xb6, 0x44, 0x2f, 0x41, 0xf4, 0x32, 0x57, 0xae, 0xe0, + 0x9c, 0xdb, 0x92, 0x6c, 0x19, 0x3b, 0x08, 0xf3, 0xa6, 0x22, 0xed, 0xba, 0x28, 0xc7, 0x0a, 0x03, + 0x5d, 0x81, 0x82, 0xe7, 0xd7, 0xb9, 0x6d, 0x17, 0xbf, 0xd2, 0xd8, 0x02, 0x5b, 0x13, 0x65, 0x58, + 0x41, 0x51, 0x05, 0x8a, 0xdc, 0xec, 0x29, 0x5e, 0xb4, 0x7d, 0x19, 0x4f, 0xb1, 0x2f, 0x5b, 0x97, + 0x35, 0x71, 0x4c, 0xc4, 0xfe, 0x15, 0x0b, 0x46, 0xe5, 0x97, 0xf5, 0xc9, 0x73, 0xd2, 0xad, 0x15, + 0xf3, 0x9b, 0xf1, 0xd6, 0xa2, 0x3c, 0x23, 0x83, 0x18, 0xac, 0x62, 0xfe, 0x50, 0xac, 0xe2, 0x33, + 0x30, 0xe2, 0xb4, 0x5a, 0x15, 0x93, 0xcf, 0x64, 0x4b, 0x69, 0x21, 0x2e, 0xc6, 0x3a, 0x8e, 0xfd, + 0x23, 0x39, 0x18, 0x97, 0x5f, 0x50, 0x6d, 0x6f, 0x84, 0x24, 0x42, 0xeb, 0x50, 0x74, 0xf8, 0x2c, + 0x11, 0xb9, 0xc8, 0x2f, 0xa5, 0xcb, 0x11, 0x8c, 0x29, 0x8d, 0x2f, 0xfc, 0x05, 0x59, 0x1b, 0xc7, + 0x84, 0x50, 0x03, 0xa6, 0x3c, 0x3f, 0x62, 0x87, 0xbf, 0x82, 0x77, 0x53, 0xed, 0x24, 0xa9, 0x9f, + 0x15, 0xd4, 0xa7, 0xd6, 0x92, 0x54, 0x70, 0x27, 0x61, 0xb4, 0x2c, 0x65, 0x33, 0xf9, 0x6c, 0x61, + 0x80, 0x3e, 0x71, 0xe9, 0xa2, 0x19, 0xfb, 0x97, 0x2d, 0x28, 0x4a, 0xb4, 0x93, 0xd0, 0xe2, 0xad, + 0xc2, 0x70, 0xc8, 0x26, 0x41, 0x0e, 0x8d, 0xdd, 0xad, 0xe3, 0x7c, 0xbe, 0xe2, 0x3b, 0x8d, 0xff, + 0x0f, 0xb1, 0xa4, 0xc1, 0x44, 0xf3, 0xaa, 0xfb, 0xef, 0x13, 0xd1, 0xbc, 0xea, 0x4f, 0xc6, 0xa5, + 0xf4, 0x87, 0xac, 0xcf, 0x9a, 0xac, 0x8b, 0xb2, 0x5e, 0xad, 0x80, 0x6c, 0xba, 0xf7, 0x93, 0xac, + 0x57, 0x85, 0x95, 0x62, 0x01, 0x45, 0x6f, 0xc1, 0x68, 0x4d, 0xca, 0x64, 0xe3, 0x1d, 0x7e, 0xb9, + 0xab, 0x7e, 0x40, 0xa9, 0x92, 0xb8, 0x2c, 0x64, 0x49, 0xab, 0x8f, 0x0d, 0x6a, 0xa6, 0x19, 0x41, + 0xbe, 0x97, 0x19, 0x41, 0x4c, 0x37, 0x5b, 0xa9, 0xfe, 0x63, 0x16, 0x0c, 0x71, 0x59, 0x5c, 0x7f, + 0xa2, 0x50, 0x4d, 0xb3, 0x16, 0x8f, 0xdd, 0x1d, 0x5a, 0x28, 0x34, 0x65, 0x68, 0x15, 0x8a, 0xec, + 0x07, 0x93, 0x25, 0xe6, 0xb3, 0xad, 0xee, 0x79, 0xab, 0x7a, 0x07, 0xef, 0xc8, 0x6a, 0x38, 0xa6, + 0x60, 0xff, 0x50, 0x9e, 0x9e, 0x6e, 0x31, 0xaa, 0x71, 0xe9, 0x5b, 0xc7, 0x77, 0xe9, 0xe7, 0x8e, + 0xeb, 0xd2, 0xdf, 0x82, 0x89, 0x9a, 0xa6, 0x87, 0x8b, 0x67, 0xf2, 0x4a, 0xd7, 0x45, 0xa2, 0xa9, + 0xec, 0xb8, 0x94, 0x65, 0xc9, 0x24, 0x82, 0x93, 0x54, 0xd1, 0xb7, 0xc0, 0x28, 0x9f, 0x67, 0xd1, + 0x0a, 0xb7, 0xc4, 0xf8, 0x48, 0xf6, 0x7a, 0xd1, 0x9b, 0xe0, 0x52, 0x39, 0xad, 0x3a, 0x36, 0x88, + 0xd9, 0x7f, 0x62, 0x01, 0x5a, 0x6e, 0x6d, 0x93, 0x26, 0x09, 0x9c, 0x46, 0x2c, 0x4e, 0xff, 0x3e, + 0x0b, 0x66, 0x48, 0x47, 0xf1, 0x92, 0xdf, 0x6c, 0x8a, 0x47, 0x4b, 0xc6, 0xbb, 0x7a, 0x39, 0xa3, + 0x8e, 0x72, 0x4b, 0x98, 0xc9, 0xc2, 0xc0, 0x99, 0xed, 0xa1, 0x55, 0x98, 0xe6, 0xb7, 0xa4, 0x02, + 0x68, 0xb6, 0xd7, 0x8f, 0x0a, 0xc2, 0xd3, 0xeb, 0x9d, 0x28, 0x38, 0xad, 0x9e, 0xfd, 0x9d, 0xa3, + 0x90, 0xd9, 0x8b, 0x0f, 0xf4, 0x08, 0x1f, 0xe8, 0x11, 0x3e, 0xd0, 0x23, 0x7c, 0xa0, 0x47, 0xf8, + 0x40, 0x8f, 0xf0, 0x0d, 0xaf, 0x47, 0xf8, 0x23, 0x0b, 0xa6, 0x3b, 0xaf, 0x81, 0x93, 0x60, 0xcc, + 0xdb, 0x30, 0xdd, 0x79, 0xd7, 0x75, 0xb5, 0xb3, 0xeb, 0xec, 0x67, 0x7c, 0xef, 0xa5, 0x7c, 0x03, + 0x4e, 0xa3, 0x6f, 0xff, 0x42, 0x01, 0x06, 0x97, 0x77, 0x89, 0x17, 0x9d, 0xc0, 0x27, 0xd6, 0x60, + 0xdc, 0xf5, 0x76, 0xfd, 0xc6, 0x2e, 0xa9, 0x73, 0xf8, 0x61, 0x9e, 0xc8, 0x67, 0x04, 0xe9, 0xf1, + 0xb2, 0x41, 0x02, 0x27, 0x48, 0x1e, 0x87, 0x98, 0xfa, 0x1a, 0x0c, 0xf1, 0xdb, 0x41, 0xc8, 0xa8, + 0x53, 0x2f, 0x03, 0x36, 0x88, 0xe2, 0xce, 0x8b, 0x45, 0xe8, 0xfc, 0xf6, 0x11, 0xd5, 0xd1, 0xdb, + 0x30, 0xbe, 0xe9, 0x06, 0x61, 0xb4, 0xee, 0x36, 0x49, 0x18, 0x39, 0xcd, 0xd6, 0x43, 0x88, 0xa5, + 0xd5, 0x38, 0xac, 0x18, 0x94, 0x70, 0x82, 0x32, 0xda, 0x82, 0xb1, 0x86, 0xa3, 0x37, 0x35, 0x7c, + 0xe8, 0xa6, 0xd4, 0xb5, 0x73, 0x53, 0x27, 0x84, 0x4d, 0xba, 0x74, 0x9f, 0xd6, 0x98, 0x64, 0xb5, + 0xc0, 0xe4, 0x0d, 0x6a, 0x9f, 0x72, 0x91, 0x2a, 0x87, 0x51, 0x0e, 0x8a, 0x59, 0xde, 0x16, 0x4d, + 0x0e, 0x4a, 0xb3, 0xaf, 0xfd, 0x1c, 0x14, 0x09, 0x1d, 0x42, 0x4a, 0x58, 0xdc, 0x5c, 0x57, 0xfb, + 0xeb, 0xeb, 0xaa, 0x5b, 0x0b, 0x7c, 0x53, 0x21, 0xb0, 0x2c, 0x29, 0xe1, 0x98, 0x28, 0x5a, 0x82, + 0xa1, 0x90, 0x04, 0x2e, 0x09, 0xc5, 0x1d, 0xd6, 0x65, 0x1a, 0x19, 0x1a, 0x77, 0x5a, 0xe1, 0xbf, + 0xb1, 0xa8, 0x4a, 0x97, 0x97, 0xc3, 0x64, 0xa5, 0xec, 0x96, 0xd1, 0x96, 0xd7, 0x02, 0x2b, 0xc5, + 0x02, 0x8a, 0x5e, 0x87, 0xe1, 0x80, 0x34, 0x98, 0xc6, 0x69, 0xac, 0xff, 0x45, 0xce, 0x15, 0x58, + 0xbc, 0x1e, 0x96, 0x04, 0xd0, 0x0d, 0x40, 0x01, 0xa1, 0x1c, 0x98, 0xeb, 0x6d, 0x29, 0x7b, 0x54, + 0x71, 0x82, 0xab, 0x1d, 0x8f, 0x63, 0x0c, 0xe9, 0x3f, 0x84, 0x53, 0xaa, 0xa1, 0x6b, 0x30, 0xa5, + 0x4a, 0xcb, 0x5e, 0x18, 0x39, 0xf4, 0xe4, 0x9c, 0x60, 0xb4, 0x94, 0x00, 0x04, 0x27, 0x11, 0x70, + 0x67, 0x1d, 0xfb, 0x4b, 0x16, 0xf0, 0x71, 0x3e, 0x81, 0x67, 0xff, 0x6b, 0xe6, 0xb3, 0xff, 0x6c, + 0xe6, 0xcc, 0x65, 0x3c, 0xf9, 0xbf, 0x64, 0xc1, 0x88, 0x36, 0xb3, 0xf1, 0x9a, 0xb5, 0xba, 0xac, + 0xd9, 0x36, 0x4c, 0xd2, 0x95, 0x7e, 0x6b, 0x23, 0x24, 0xc1, 0x2e, 0xa9, 0xb3, 0x85, 0x99, 0x7b, + 0xb8, 0x85, 0xa9, 0x6c, 0xdf, 0x6e, 0x26, 0x08, 0xe2, 0x8e, 0x26, 0xec, 0xcf, 0xc9, 0xae, 0x2a, + 0x53, 0xc1, 0x9a, 0x9a, 0xf3, 0x84, 0xa9, 0xa0, 0x9a, 0x55, 0x1c, 0xe3, 0xd0, 0xad, 0xb6, 0xed, + 0x87, 0x51, 0xd2, 0x54, 0xf0, 0xba, 0x1f, 0x46, 0x98, 0x41, 0xec, 0xe7, 0x00, 0x96, 0xef, 0x93, + 0x1a, 0x5f, 0xb1, 0xfa, 0xab, 0xc4, 0xca, 0x7e, 0x95, 0xd8, 0xbf, 0x6d, 0xc1, 0xf8, 0xca, 0x92, + 0x21, 0x0b, 0x9e, 0x07, 0xe0, 0x4f, 0xa9, 0xbb, 0x77, 0xd7, 0xa4, 0x9e, 0x9d, 0xab, 0x4a, 0x55, + 0x29, 0xd6, 0x30, 0xd0, 0x59, 0xc8, 0x37, 0xda, 0x9e, 0x90, 0x4b, 0x0e, 0xd3, 0x7b, 0xf7, 0x66, + 0xdb, 0xc3, 0xb4, 0x4c, 0xf3, 0x55, 0xc8, 0xf7, 0xed, 0xab, 0xd0, 0x33, 0x66, 0x00, 0x9a, 0x83, + 0xc1, 0x7b, 0xf7, 0xdc, 0x3a, 0xf7, 0xcc, 0x14, 0x36, 0x00, 0x77, 0xef, 0x96, 0x4b, 0x21, 0xe6, + 0xe5, 0xf6, 0x17, 0xf3, 0x30, 0xbb, 0xd2, 0x20, 0xf7, 0xdf, 0xa3, 0x77, 0x6a, 0xbf, 0x9e, 0x16, + 0x87, 0x93, 0xf0, 0x1c, 0xd6, 0x9b, 0xa6, 0xf7, 0x78, 0x6c, 0xc2, 0x30, 0xb7, 0x94, 0x93, 0xbe, + 0xaa, 0xaf, 0xa4, 0xb5, 0x9e, 0x3d, 0x20, 0xf3, 0xdc, 0xe2, 0x4e, 0xb8, 0xda, 0xa9, 0x0b, 0x53, + 0x94, 0x62, 0x49, 0x7c, 0xf6, 0x65, 0x18, 0xd5, 0x31, 0x0f, 0xe5, 0xd7, 0xf6, 0x97, 0xf3, 0x30, + 0x49, 0x7b, 0x70, 0xac, 0x13, 0x71, 0xbb, 0x73, 0x22, 0x8e, 0xda, 0xb7, 0xa9, 0xf7, 0x6c, 0xbc, + 0x95, 0x9c, 0x8d, 0x67, 0xb2, 0x66, 0xe3, 0xa4, 0xe7, 0xe0, 0x3b, 0x2c, 0x98, 0x5e, 0x69, 0xf8, + 0xb5, 0x9d, 0x84, 0xff, 0xd1, 0x0b, 0x30, 0x42, 0x8f, 0xe3, 0xd0, 0x70, 0x8d, 0x37, 0x82, 0x25, + 0x08, 0x10, 0xd6, 0xf1, 0xb4, 0x6a, 0xb7, 0x6f, 0x97, 0x4b, 0x69, 0x31, 0x16, 0x04, 0x08, 0xeb, + 0x78, 0xf6, 0x6f, 0x5a, 0x70, 0xfe, 0xda, 0xd2, 0x72, 0xbc, 0x14, 0x3b, 0xc2, 0x3c, 0x5c, 0x86, + 0xa1, 0x56, 0x5d, 0xeb, 0x4a, 0x2c, 0xb7, 0x2d, 0xb1, 0x5e, 0x08, 0xe8, 0xfb, 0x25, 0x84, 0xc9, + 0x4f, 0x59, 0x30, 0x7d, 0xcd, 0x8d, 0xe8, 0xed, 0x9a, 0x0c, 0x38, 0x40, 0xaf, 0xd7, 0xd0, 0x8d, + 0xfc, 0x60, 0x2f, 0x19, 0x70, 0x00, 0x2b, 0x08, 0xd6, 0xb0, 0x78, 0xcb, 0xbb, 0x2e, 0xb3, 0xd1, + 0xce, 0x99, 0x1a, 0x2c, 0x2c, 0xca, 0xb1, 0xc2, 0xa0, 0x1f, 0x56, 0x77, 0x03, 0x26, 0xfc, 0xdb, + 0x13, 0x27, 0xac, 0xfa, 0xb0, 0x92, 0x04, 0xe0, 0x18, 0x87, 0xbe, 0x83, 0xe6, 0xae, 0x35, 0xda, + 0x61, 0x44, 0x82, 0xcd, 0x30, 0xe3, 0x74, 0x7c, 0x0e, 0x8a, 0x44, 0x8a, 0xda, 0x45, 0xaf, 0x15, + 0xc7, 0xa8, 0x64, 0xf0, 0x3c, 0xee, 0x81, 0xc2, 0xeb, 0xc3, 0x9b, 0xf1, 0x70, 0xee, 0x68, 0x2b, + 0x80, 0x88, 0xde, 0x96, 0x1e, 0x08, 0x82, 0x79, 0x94, 0x2f, 0x77, 0x40, 0x71, 0x4a, 0x0d, 0xfb, + 0x47, 0x2d, 0x38, 0xad, 0x3e, 0xf8, 0x7d, 0xf7, 0x99, 0xf6, 0xcf, 0xe6, 0x60, 0xec, 0xfa, 0xfa, + 0x7a, 0xe5, 0x1a, 0x89, 0xc4, 0xb5, 0xdd, 0x5b, 0x81, 0x8e, 0x35, 0x3d, 0x60, 0xb7, 0xc7, 0x5c, + 0x3b, 0x72, 0x1b, 0xf3, 0x3c, 0x9e, 0xd0, 0x7c, 0xd9, 0x8b, 0x6e, 0x05, 0xd5, 0x28, 0x70, 0xbd, + 0xad, 0x54, 0xcd, 0xa1, 0x64, 0x2e, 0xf2, 0x59, 0xcc, 0x05, 0x7a, 0x0e, 0x86, 0x58, 0x40, 0x23, + 0x39, 0x09, 0x8f, 0xaa, 0xb7, 0x10, 0x2b, 0x3d, 0xd8, 0x9f, 0x2b, 0xde, 0xc6, 0x65, 0xfe, 0x07, + 0x0b, 0x54, 0x74, 0x1b, 0x46, 0xb6, 0xa3, 0xa8, 0x75, 0x9d, 0x38, 0x75, 0xfa, 0xe8, 0xe5, 0xc7, + 0xe1, 0x85, 0xb4, 0xe3, 0x90, 0x0e, 0x02, 0x47, 0x8b, 0x4f, 0x90, 0xb8, 0x2c, 0xc4, 0x3a, 0x1d, + 0xbb, 0x0a, 0x10, 0xc3, 0x8e, 0x48, 0x05, 0x62, 0xff, 0x81, 0x05, 0xc3, 0x3c, 0xb6, 0x44, 0x80, + 0x5e, 0x85, 0x01, 0x72, 0x9f, 0xd4, 0x04, 0xc7, 0x9b, 0xda, 0xe1, 0x98, 0xd3, 0xe2, 0xa2, 0x5c, + 0xfa, 0x1f, 0xb3, 0x5a, 0xe8, 0x3a, 0x0c, 0xd3, 0xde, 0x5e, 0x53, 0x81, 0x36, 0x1e, 0xcb, 0xfa, + 0x62, 0x35, 0xed, 0x9c, 0x39, 0x13, 0x45, 0x58, 0x56, 0x67, 0x7a, 0xe7, 0x5a, 0xab, 0x4a, 0x4f, + 0xec, 0xa8, 0x1b, 0x63, 0xb1, 0xbe, 0x54, 0xe1, 0x48, 0x82, 0x1a, 0xd7, 0x3b, 0xcb, 0x42, 0x1c, + 0x13, 0xb1, 0xd7, 0xa1, 0x48, 0x27, 0x75, 0xa1, 0xe1, 0x3a, 0xdd, 0x55, 0xe9, 0x4f, 0x42, 0x51, + 0x2a, 0xca, 0x43, 0xe1, 0x53, 0xce, 0xa8, 0x4a, 0x3d, 0x7a, 0x88, 0x63, 0xb8, 0xbd, 0x09, 0xa7, + 0x98, 0xd9, 0xa3, 0x13, 0x6d, 0x1b, 0x7b, 0xac, 0xf7, 0x62, 0x7e, 0x4a, 0x3c, 0x20, 0xf9, 0xcc, + 0xcc, 0x68, 0x6e, 0x9b, 0xa3, 0x92, 0x62, 0xfc, 0x98, 0xb4, 0xbf, 0x3a, 0x00, 0x8f, 0x96, 0xab, + 0xd9, 0x61, 0x47, 0x5e, 0x82, 0x51, 0xce, 0x97, 0xd2, 0xa5, 0xed, 0x34, 0x44, 0xbb, 0x4a, 0x86, + 0xbb, 0xae, 0xc1, 0xb0, 0x81, 0x89, 0xce, 0x43, 0xde, 0x7d, 0xc7, 0x4b, 0x3a, 0x35, 0x95, 0xdf, + 0x58, 0xc3, 0xb4, 0x9c, 0x82, 0x29, 0x8b, 0xcb, 0xef, 0x0e, 0x05, 0x56, 0x6c, 0xee, 0x6b, 0x30, + 0xee, 0x86, 0xb5, 0xd0, 0x2d, 0x7b, 0xf4, 0x9c, 0xd1, 0x4e, 0x2a, 0x25, 0xdc, 0xa0, 0x9d, 0x56, + 0x50, 0x9c, 0xc0, 0xd6, 0x2e, 0xb2, 0xc1, 0xbe, 0xd9, 0xe4, 0x9e, 0x4e, 0xd6, 0xf4, 0x05, 0xd0, + 0x62, 0x5f, 0x17, 0x32, 0x61, 0xbc, 0x78, 0x01, 0xf0, 0x0f, 0x0e, 0xb1, 0x84, 0xd1, 0x97, 0x63, + 0x6d, 0xdb, 0x69, 0x2d, 0xb4, 0xa3, 0xed, 0x92, 0x1b, 0xd6, 0xfc, 0x5d, 0x12, 0xec, 0xb1, 0x47, + 0x7f, 0x21, 0x7e, 0x39, 0x2a, 0xc0, 0xd2, 0xf5, 0x85, 0x0a, 0xc5, 0xc4, 0x9d, 0x75, 0xd0, 0x02, + 0x4c, 0xc8, 0xc2, 0x2a, 0x09, 0xd9, 0x15, 0x36, 0xc2, 0xc8, 0x28, 0x37, 0x23, 0x51, 0xac, 0x88, + 0x24, 0xf1, 0x4d, 0x4e, 0x1a, 0x8e, 0x82, 0x93, 0x7e, 0x11, 0xc6, 0x5c, 0xcf, 0x8d, 0x5c, 0x27, + 0xf2, 0xb9, 0x26, 0x89, 0xbf, 0xef, 0x99, 0x88, 0xbc, 0xac, 0x03, 0xb0, 0x89, 0x67, 0xff, 0xd7, + 0x01, 0x98, 0x62, 0xd3, 0xf6, 0xc1, 0x0a, 0xfb, 0x46, 0x5a, 0x61, 0xb7, 0x3b, 0x57, 0xd8, 0x51, + 0x3c, 0x11, 0x1e, 0x7a, 0x99, 0xbd, 0x0d, 0x45, 0xe5, 0x59, 0x25, 0x5d, 0x2b, 0xad, 0x0c, 0xd7, + 0xca, 0xde, 0xdc, 0x87, 0x34, 0x4e, 0xcb, 0xa7, 0x1a, 0xa7, 0xfd, 0x4d, 0x0b, 0x62, 0xd5, 0x08, + 0xba, 0x0e, 0xc5, 0x96, 0xcf, 0x6c, 0x2e, 0x03, 0x69, 0xc8, 0xfc, 0x68, 0xea, 0x45, 0xc5, 0x2f, + 0x45, 0xfe, 0xf1, 0x15, 0x59, 0x03, 0xc7, 0x95, 0xd1, 0x22, 0x0c, 0xb7, 0x02, 0x52, 0x8d, 0x58, + 0xf4, 0x91, 0x9e, 0x74, 0xf8, 0x1a, 0xe1, 0xf8, 0x58, 0x56, 0xb4, 0x7f, 0xce, 0x02, 0xe0, 0xf6, + 0x5f, 0x8e, 0xb7, 0x45, 0x4e, 0x40, 0x6a, 0x5d, 0x82, 0x81, 0xb0, 0x45, 0x6a, 0xdd, 0xac, 0x61, + 0xe3, 0xfe, 0x54, 0x5b, 0xa4, 0x16, 0x0f, 0x38, 0xfd, 0x87, 0x59, 0x6d, 0xfb, 0xbb, 0x00, 0xc6, + 0x63, 0xb4, 0x72, 0x44, 0x9a, 0xe8, 0x69, 0x23, 0x1a, 0xc1, 0xd9, 0x44, 0x34, 0x82, 0x22, 0xc3, + 0xd6, 0x04, 0xa4, 0x6f, 0x43, 0xbe, 0xe9, 0xdc, 0x17, 0x12, 0xb0, 0x27, 0xbb, 0x77, 0x83, 0xd2, + 0x9f, 0x5f, 0x75, 0xee, 0xf3, 0x47, 0xe2, 0x93, 0x72, 0x81, 0xac, 0x3a, 0xf7, 0x0f, 0xb8, 0xcd, + 0x2b, 0x3b, 0xa4, 0x6e, 0xba, 0x61, 0xf4, 0xf9, 0xff, 0x12, 0xff, 0x67, 0xcb, 0x8e, 0x36, 0xc2, + 0xda, 0x72, 0x3d, 0x61, 0xda, 0xd4, 0x57, 0x5b, 0xae, 0x97, 0x6c, 0xcb, 0xf5, 0xfa, 0x68, 0xcb, + 0xf5, 0xd0, 0xbb, 0x30, 0x2c, 0x2c, 0x0f, 0x45, 0xf4, 0x9f, 0xab, 0x7d, 0xb4, 0x27, 0x0c, 0x17, + 0x79, 0x9b, 0x57, 0xe5, 0x23, 0x58, 0x94, 0xf6, 0x6c, 0x57, 0x36, 0x88, 0xfe, 0x9a, 0x05, 0xe3, + 0xe2, 0x37, 0x26, 0xef, 0xb4, 0x49, 0x18, 0x09, 0xde, 0xf3, 0xe3, 0xfd, 0xf7, 0x41, 0x54, 0xe4, + 0x5d, 0xf9, 0xb8, 0x3c, 0x66, 0x4d, 0x60, 0xcf, 0x1e, 0x25, 0x7a, 0x81, 0xfe, 0x81, 0x05, 0xa7, + 0x9a, 0xce, 0x7d, 0xde, 0x22, 0x2f, 0xc3, 0x4e, 0xe4, 0xfa, 0x42, 0x83, 0xff, 0x6a, 0x7f, 0xd3, + 0xdf, 0x51, 0x9d, 0x77, 0x52, 0xaa, 0x19, 0x4f, 0xa5, 0xa1, 0xf4, 0xec, 0x6a, 0x6a, 0xbf, 0x66, + 0x37, 0xa1, 0x20, 0xd7, 0x5b, 0x8a, 0xa8, 0xa1, 0xa4, 0x33, 0xd6, 0x87, 0x36, 0xfc, 0xd4, 0xbd, + 0xfc, 0x69, 0x3b, 0x62, 0xad, 0x1d, 0x6b, 0x3b, 0x6f, 0xc3, 0xa8, 0xbe, 0xc6, 0x8e, 0xb5, 0xad, + 0x77, 0x60, 0x3a, 0x65, 0x2d, 0x1d, 0x6b, 0x93, 0xf7, 0xe0, 0x6c, 0xe6, 0xfa, 0x38, 0xce, 0x86, + 0xed, 0x9f, 0xb5, 0xf4, 0x73, 0xf0, 0x04, 0x54, 0x07, 0x4b, 0xa6, 0xea, 0xe0, 0x42, 0xf7, 0x9d, + 0x93, 0xa1, 0x3f, 0x78, 0x4b, 0xef, 0x34, 0x3d, 0xd5, 0xd1, 0xeb, 0x30, 0xd4, 0xa0, 0x25, 0xd2, + 0x7e, 0xd5, 0xee, 0xbd, 0x23, 0x63, 0x5e, 0x8a, 0x95, 0x87, 0x58, 0x50, 0xb0, 0x7f, 0xd1, 0x82, + 0x81, 0x13, 0x18, 0x09, 0x6c, 0x8e, 0xc4, 0xd3, 0x99, 0xa4, 0x45, 0x60, 0xe2, 0x79, 0xec, 0xdc, + 0x5b, 0xbe, 0x1f, 0x11, 0x2f, 0x64, 0x4f, 0xc5, 0xd4, 0x81, 0xf9, 0xff, 0x60, 0xfa, 0xa6, 0xef, + 0xd4, 0x17, 0x9d, 0x86, 0xe3, 0xd5, 0x48, 0x50, 0xf6, 0xb6, 0x0e, 0x65, 0x7b, 0x9d, 0xeb, 0x65, + 0x7b, 0x6d, 0x6f, 0x03, 0xd2, 0x1b, 0x10, 0x4e, 0x2c, 0x18, 0x86, 0x5d, 0xde, 0x94, 0x18, 0xfe, + 0xc7, 0xd3, 0x59, 0xb3, 0x8e, 0x9e, 0x69, 0xee, 0x19, 0xbc, 0x00, 0x4b, 0x42, 0xf6, 0x4b, 0x90, + 0xea, 0x09, 0xdf, 0x5b, 0x6c, 0x60, 0x7f, 0x1a, 0xa6, 0x58, 0xcd, 0x43, 0x3e, 0x69, 0xed, 0x84, + 0x54, 0x32, 0x25, 0x46, 0x9e, 0xfd, 0x05, 0x0b, 0x26, 0xd6, 0x12, 0xa1, 0xc3, 0x2e, 0x33, 0x3d, + 0x66, 0x8a, 0x30, 0xbc, 0xca, 0x4a, 0xb1, 0x80, 0x1e, 0xb9, 0x0c, 0xea, 0x2f, 0x2c, 0x88, 0x83, + 0x53, 0x9c, 0x00, 0xe3, 0xb5, 0x64, 0x30, 0x5e, 0xa9, 0xb2, 0x11, 0xd5, 0x9d, 0x2c, 0xbe, 0x0b, + 0xdd, 0x50, 0x61, 0x9b, 0xba, 0x88, 0x45, 0x62, 0x32, 0x3c, 0xc8, 0xcf, 0xb8, 0x19, 0xdb, 0x49, + 0x06, 0x72, 0xb2, 0xff, 0x53, 0x0e, 0x90, 0xc2, 0xed, 0x3b, 0xac, 0x54, 0x67, 0x8d, 0xa3, 0x09, + 0x2b, 0xb5, 0x0b, 0x88, 0x69, 0xe2, 0x03, 0xc7, 0x0b, 0x39, 0x59, 0x57, 0x48, 0xdd, 0x0e, 0xa7, + 0xe6, 0x9f, 0x15, 0x4d, 0xa2, 0x9b, 0x1d, 0xd4, 0x70, 0x4a, 0x0b, 0x9a, 0x85, 0xc5, 0x60, 0xbf, + 0x16, 0x16, 0x43, 0x3d, 0x1c, 0xd5, 0x7e, 0xc6, 0x82, 0x31, 0x35, 0x4c, 0xef, 0x13, 0x33, 0x72, + 0xd5, 0x9f, 0x8c, 0xa3, 0xaf, 0xa2, 0x75, 0x99, 0x5d, 0x09, 0xdf, 0xcc, 0x1c, 0x0e, 0x9d, 0x86, + 0xfb, 0x2e, 0x51, 0x41, 0xfd, 0xe6, 0x84, 0x03, 0xa1, 0x28, 0x3d, 0xd8, 0x9f, 0x1b, 0x53, 0xff, + 0x78, 0x10, 0xe1, 0xb8, 0x8a, 0xfd, 0x13, 0x74, 0xb3, 0x9b, 0x4b, 0x11, 0xbd, 0x00, 0x83, 0xad, + 0x6d, 0x27, 0x24, 0x09, 0x77, 0x9b, 0xc1, 0x0a, 0x2d, 0x3c, 0xd8, 0x9f, 0x1b, 0x57, 0x15, 0x58, + 0x09, 0xe6, 0xd8, 0xfd, 0x07, 0xeb, 0xea, 0x5c, 0x9c, 0x3d, 0x83, 0x75, 0xfd, 0x89, 0x05, 0x03, + 0x6b, 0x7e, 0xfd, 0x24, 0x8e, 0x80, 0xd7, 0x8c, 0x23, 0xe0, 0x5c, 0x56, 0x7c, 0xf7, 0xcc, 0xdd, + 0xbf, 0x92, 0xd8, 0xfd, 0x17, 0x32, 0x29, 0x74, 0xdf, 0xf8, 0x4d, 0x18, 0x61, 0x51, 0xe3, 0x85, + 0x6b, 0xd1, 0x73, 0xc6, 0x86, 0x9f, 0x4b, 0x6c, 0xf8, 0x09, 0x0d, 0x55, 0xdb, 0xe9, 0x4f, 0xc0, + 0xb0, 0xf0, 0x55, 0x49, 0xfa, 0x6d, 0x0a, 0x5c, 0x2c, 0xe1, 0xf6, 0x8f, 0xe5, 0xc1, 0x88, 0x52, + 0x8f, 0x7e, 0xd9, 0x82, 0xf9, 0x80, 0xdb, 0xb0, 0xd6, 0x4b, 0xed, 0xc0, 0xf5, 0xb6, 0xaa, 0xb5, + 0x6d, 0x52, 0x6f, 0x37, 0x5c, 0x6f, 0xab, 0xbc, 0xe5, 0xf9, 0xaa, 0x78, 0xf9, 0x3e, 0xa9, 0xb5, + 0x99, 0xfa, 0xaa, 0x47, 0x48, 0x7c, 0x65, 0x0b, 0xfe, 0xec, 0x83, 0xfd, 0xb9, 0x79, 0x7c, 0x28, + 0xda, 0xf8, 0x90, 0x7d, 0x41, 0xbf, 0x69, 0xc1, 0x55, 0x1e, 0xbc, 0xbd, 0xff, 0xfe, 0x77, 0x79, + 0xe7, 0x56, 0x24, 0xa9, 0x98, 0xc8, 0x3a, 0x09, 0x9a, 0x8b, 0x2f, 0x8a, 0x01, 0xbd, 0x5a, 0x39, + 0x5c, 0x5b, 0xf8, 0xb0, 0x9d, 0xb3, 0xff, 0x79, 0x1e, 0xc6, 0x44, 0x50, 0x27, 0x71, 0x07, 0xbc, + 0x60, 0x2c, 0x89, 0xc7, 0x12, 0x4b, 0x62, 0xca, 0x40, 0x3e, 0x9a, 0xe3, 0x3f, 0x84, 0x29, 0x7a, + 0x38, 0x5f, 0x27, 0x4e, 0x10, 0x6d, 0x10, 0x87, 0x1b, 0x4e, 0xe5, 0x0f, 0x7d, 0xfa, 0x2b, 0xc1, + 0xda, 0xcd, 0x24, 0x31, 0xdc, 0x49, 0xff, 0x1b, 0xe9, 0xce, 0xf1, 0x60, 0xb2, 0x23, 0x2e, 0xd7, + 0x9b, 0x50, 0x54, 0x8e, 0x16, 0xe2, 0xd0, 0xe9, 0x1e, 0xde, 0x2e, 0x49, 0x81, 0x0b, 0xbf, 0x62, + 0x27, 0x9f, 0x98, 0x9c, 0xfd, 0x0f, 0x73, 0x46, 0x83, 0x7c, 0x12, 0xd7, 0xa0, 0xe0, 0x84, 0xa1, + 0xbb, 0xe5, 0x91, 0xba, 0xd8, 0xb1, 0x1f, 0xce, 0xda, 0xb1, 0x46, 0x33, 0xcc, 0xd9, 0x65, 0x41, + 0xd4, 0xc4, 0x8a, 0x06, 0xba, 0xce, 0xcd, 0xd3, 0x76, 0xe5, 0x4b, 0xad, 0x3f, 0x6a, 0x20, 0x0d, + 0xd8, 0x76, 0x09, 0x16, 0xf5, 0xd1, 0x67, 0xb8, 0xfd, 0xe0, 0x0d, 0xcf, 0xbf, 0xe7, 0x5d, 0xf3, + 0x7d, 0x19, 0x38, 0xa1, 0x3f, 0x82, 0x53, 0xd2, 0x6a, 0x50, 0x55, 0xc7, 0x26, 0xb5, 0xfe, 0x02, + 0x5d, 0x7e, 0x2b, 0x4c, 0x53, 0xd2, 0xa6, 0x5f, 0x73, 0x88, 0x08, 0x4c, 0x88, 0x88, 0x61, 0xb2, + 0x4c, 0x8c, 0x5d, 0xea, 0x23, 0xcc, 0xac, 0x1d, 0x4b, 0x80, 0x6f, 0x98, 0x24, 0x70, 0x92, 0xa6, + 0xfd, 0x93, 0x16, 0x30, 0x1f, 0xcf, 0x13, 0xe0, 0x47, 0x3e, 0x61, 0xf2, 0x23, 0x33, 0x59, 0x83, + 0x9c, 0xc1, 0x8a, 0x3c, 0xcf, 0x57, 0x56, 0x25, 0xf0, 0xef, 0xef, 0x09, 0xa3, 0x8f, 0xde, 0xef, + 0x0f, 0xfb, 0xff, 0x58, 0xfc, 0x10, 0x53, 0x6e, 0x10, 0xe8, 0xdb, 0xa0, 0x50, 0x73, 0x5a, 0x4e, + 0x8d, 0xa7, 0x54, 0xc9, 0x94, 0xc5, 0x19, 0x95, 0xe6, 0x97, 0x44, 0x0d, 0x2e, 0x5b, 0x92, 0x91, + 0xe7, 0x0a, 0xb2, 0xb8, 0xa7, 0x3c, 0x49, 0x35, 0x39, 0xbb, 0x03, 0x63, 0x06, 0xb1, 0x63, 0x15, + 0x44, 0x7c, 0x1b, 0xbf, 0x62, 0x55, 0xa4, 0xc4, 0x26, 0x4c, 0x79, 0xda, 0x7f, 0x7a, 0xa1, 0xc8, + 0xc7, 0xe5, 0x87, 0x7b, 0x5d, 0xa2, 0xec, 0xf6, 0xd1, 0xdc, 0x47, 0x13, 0x64, 0x70, 0x27, 0x65, + 0xfb, 0xc7, 0x2d, 0x78, 0x44, 0x47, 0xd4, 0x3c, 0x54, 0x7a, 0x49, 0xf7, 0x4b, 0x50, 0xf0, 0x5b, + 0x24, 0x70, 0x22, 0x3f, 0x10, 0xb7, 0xc6, 0x15, 0x39, 0xe8, 0xb7, 0x44, 0xf9, 0x81, 0x08, 0x48, + 0x2e, 0xa9, 0xcb, 0x72, 0xac, 0x6a, 0xd2, 0xd7, 0x27, 0x1b, 0x8c, 0x50, 0xf8, 0x22, 0xb1, 0x33, + 0x80, 0x29, 0xba, 0x43, 0x2c, 0x20, 0xf6, 0x57, 0x2d, 0xbe, 0xb0, 0xf4, 0xae, 0xa3, 0x77, 0x60, + 0xb2, 0xe9, 0x44, 0xb5, 0xed, 0xe5, 0xfb, 0xad, 0x80, 0xeb, 0x4a, 0xe4, 0x38, 0x3d, 0xd9, 0x6b, + 0x9c, 0xb4, 0x8f, 0x8c, 0x4d, 0x22, 0x57, 0x13, 0xc4, 0x70, 0x07, 0x79, 0xb4, 0x01, 0x23, 0xac, + 0x8c, 0xb9, 0xd9, 0x85, 0xdd, 0x58, 0x83, 0xac, 0xd6, 0x94, 0xad, 0xc0, 0x6a, 0x4c, 0x07, 0xeb, + 0x44, 0xed, 0x9f, 0xce, 0xf3, 0xdd, 0xce, 0x58, 0xf9, 0x27, 0x60, 0xb8, 0xe5, 0xd7, 0x97, 0xca, + 0x25, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x15, 0x5e, 0x8c, 0x25, 0x1c, 0x5d, 0x81, 0x82, 0xf8, 0x29, + 0x75, 0x5b, 0xec, 0x6c, 0x16, 0x78, 0x21, 0x56, 0x50, 0xf4, 0x2c, 0x40, 0x2b, 0xf0, 0x77, 0xdd, + 0x3a, 0x0b, 0xff, 0x90, 0x37, 0xcd, 0x7c, 0x2a, 0x0a, 0x82, 0x35, 0x2c, 0xf4, 0x0a, 0x8c, 0xb5, + 0xbd, 0x90, 0xb3, 0x23, 0x5a, 0xb0, 0x57, 0x65, 0x80, 0x72, 0x5b, 0x07, 0x62, 0x13, 0x17, 0x2d, + 0xc0, 0x50, 0xe4, 0x30, 0xb3, 0x95, 0xc1, 0x6c, 0xb3, 0xd9, 0x75, 0x8a, 0xa1, 0x67, 0xef, 0xa0, + 0x15, 0xb0, 0xa8, 0x88, 0xde, 0x94, 0x1e, 0xaf, 0xfc, 0x60, 0x17, 0xf6, 0xea, 0xfd, 0x5d, 0x02, + 0x9a, 0xbf, 0xab, 0xb0, 0x83, 0x37, 0x68, 0xa1, 0x97, 0x01, 0xc8, 0xfd, 0x88, 0x04, 0x9e, 0xd3, + 0x50, 0x56, 0x61, 0x8a, 0x2f, 0x28, 0xf9, 0x6b, 0x7e, 0x74, 0x3b, 0x24, 0xcb, 0x0a, 0x03, 0x6b, + 0xd8, 0xf6, 0x6f, 0x16, 0x01, 0x62, 0xbe, 0x1d, 0xbd, 0xdb, 0x71, 0x70, 0x3d, 0xd5, 0x9d, 0xd3, + 0x3f, 0xba, 0x53, 0x0b, 0x7d, 0xb7, 0x05, 0x23, 0x4e, 0xa3, 0xe1, 0xd7, 0x1c, 0x1e, 0x8e, 0x37, + 0xd7, 0xfd, 0xe0, 0x14, 0xed, 0x2f, 0xc4, 0x35, 0x78, 0x17, 0x9e, 0x93, 0x2b, 0x54, 0x83, 0xf4, + 0xec, 0x85, 0xde, 0x30, 0xfa, 0x98, 0x7c, 0x2a, 0xe6, 0x8d, 0xa1, 0x54, 0x4f, 0xc5, 0x22, 0xbb, + 0x23, 0xf4, 0x57, 0xe2, 0x6d, 0xe3, 0x95, 0x38, 0x90, 0xed, 0xd2, 0x67, 0xb0, 0xaf, 0xbd, 0x1e, + 0x88, 0xa8, 0xa2, 0xbb, 0xf7, 0x0f, 0x66, 0xfb, 0xcf, 0x69, 0xef, 0xa4, 0x1e, 0xae, 0xfd, 0x6f, + 0xc3, 0x44, 0xdd, 0x64, 0x02, 0xc4, 0x4a, 0x7c, 0x3c, 0x8b, 0x6e, 0x82, 0x67, 0x88, 0xaf, 0xfd, + 0x04, 0x00, 0x27, 0x09, 0xa3, 0x0a, 0x8f, 0xf6, 0x50, 0xf6, 0x36, 0x7d, 0xe1, 0x33, 0x61, 0x67, + 0xce, 0xe5, 0x5e, 0x18, 0x91, 0x26, 0xc5, 0x8c, 0x6f, 0xf7, 0x35, 0x51, 0x17, 0x2b, 0x2a, 0xe8, + 0x75, 0x18, 0x62, 0x0e, 0x54, 0xe1, 0x4c, 0x21, 0x5b, 0x56, 0x6c, 0x86, 0x2f, 0x8b, 0x37, 0x24, + 0xfb, 0x1b, 0x62, 0x41, 0x01, 0x5d, 0x97, 0xee, 0x89, 0x61, 0xd9, 0xbb, 0x1d, 0x12, 0xe6, 0x9e, + 0x58, 0x5c, 0xfc, 0x70, 0xec, 0x79, 0xc8, 0xcb, 0x53, 0x73, 0x7c, 0x19, 0x35, 0x29, 0x17, 0x25, + 0xfe, 0xcb, 0xd4, 0x61, 0x33, 0x90, 0xdd, 0x3d, 0x33, 0xbd, 0x58, 0x3c, 0x9c, 0x77, 0x4c, 0x12, + 0x38, 0x49, 0x93, 0x72, 0xa4, 0x7c, 0xd7, 0x0b, 0xaf, 0x8b, 0x5e, 0x67, 0x07, 0x7f, 0x88, 0xb3, + 0xdb, 0x88, 0x97, 0x60, 0x51, 0xff, 0x44, 0xd9, 0x83, 0x59, 0x0f, 0x26, 0x93, 0x5b, 0xf4, 0x58, + 0xd9, 0x91, 0x3f, 0x18, 0x80, 0x71, 0x73, 0x49, 0xa1, 0xab, 0x50, 0x14, 0x44, 0x54, 0xb8, 0x7f, + 0xb5, 0x4b, 0x56, 0x25, 0x00, 0xc7, 0x38, 0x2c, 0xcb, 0x03, 0xab, 0xae, 0x99, 0xd9, 0xc6, 0x59, + 0x1e, 0x14, 0x04, 0x6b, 0x58, 0xf4, 0x61, 0xb5, 0xe1, 0xfb, 0x91, 0xba, 0x90, 0xd4, 0xba, 0x5b, + 0x64, 0xa5, 0x58, 0x40, 0xe9, 0x45, 0xb4, 0x43, 0x02, 0x8f, 0x34, 0xcc, 0xc0, 0xc0, 0xea, 0x22, + 0xba, 0xa1, 0x03, 0xb1, 0x89, 0x4b, 0xaf, 0x53, 0x3f, 0x64, 0x0b, 0x59, 0x3c, 0xdf, 0x62, 0xb3, + 0xe5, 0x2a, 0xf7, 0x90, 0x96, 0x70, 0xf4, 0x69, 0x78, 0x44, 0x05, 0x3f, 0xc2, 0x5c, 0x0f, 0x21, + 0x5b, 0x1c, 0x32, 0xa4, 0x2d, 0x8f, 0x2c, 0xa5, 0xa3, 0xe1, 0xac, 0xfa, 0xe8, 0x35, 0x18, 0x17, + 0x2c, 0xbe, 0xa4, 0x38, 0x6c, 0x9a, 0xc6, 0xdc, 0x30, 0xa0, 0x38, 0x81, 0x2d, 0x43, 0x1b, 0x33, + 0x2e, 0x5b, 0x52, 0x28, 0x74, 0x86, 0x36, 0xd6, 0xe1, 0xb8, 0xa3, 0x06, 0x5a, 0x80, 0x09, 0xce, + 0x83, 0xb9, 0xde, 0x16, 0x9f, 0x13, 0xe1, 0x14, 0xa5, 0xb6, 0xd4, 0x2d, 0x13, 0x8c, 0x93, 0xf8, + 0xe8, 0x25, 0x18, 0x75, 0x82, 0xda, 0xb6, 0x1b, 0x91, 0x5a, 0xd4, 0x0e, 0xb8, 0xb7, 0x94, 0x66, + 0x5b, 0xb4, 0xa0, 0xc1, 0xb0, 0x81, 0x69, 0xbf, 0x0b, 0xd3, 0x29, 0xa1, 0x13, 0xe8, 0xc2, 0x71, + 0x5a, 0xae, 0xfc, 0xa6, 0x84, 0x01, 0xf2, 0x42, 0xa5, 0x2c, 0xbf, 0x46, 0xc3, 0xa2, 0xab, 0x93, + 0x85, 0x58, 0xd0, 0x32, 0x05, 0xaa, 0xd5, 0xb9, 0x22, 0x01, 0x38, 0xc6, 0xb1, 0xff, 0x67, 0x0e, + 0x26, 0x52, 0x74, 0x2b, 0x2c, 0x5b, 0x5d, 0xe2, 0x91, 0x12, 0x27, 0xa7, 0x33, 0x23, 0x65, 0xe7, + 0x0e, 0x11, 0x29, 0x3b, 0xdf, 0x2b, 0x52, 0xf6, 0xc0, 0x7b, 0x89, 0x94, 0x6d, 0x8e, 0xd8, 0x60, + 0x5f, 0x23, 0x96, 0x12, 0x5d, 0x7b, 0xe8, 0x90, 0xd1, 0xb5, 0x8d, 0x41, 0x1f, 0xee, 0x63, 0xd0, + 0x7f, 0x28, 0x07, 0x93, 0x49, 0x1b, 0xc8, 0x13, 0x90, 0xdb, 0xbe, 0x6e, 0xc8, 0x6d, 0xd3, 0x73, + 0x3f, 0x26, 0x2d, 0x33, 0xb3, 0x64, 0xb8, 0x38, 0x21, 0xc3, 0xfd, 0x68, 0x5f, 0xd4, 0xba, 0xcb, + 0x73, 0xff, 0x76, 0x0e, 0x4e, 0x27, 0xab, 0x2c, 0x35, 0x1c, 0xb7, 0x79, 0x02, 0x63, 0x73, 0xcb, + 0x18, 0x9b, 0xa7, 0xfb, 0xf9, 0x1a, 0xd6, 0xb5, 0xcc, 0x01, 0xba, 0x9b, 0x18, 0xa0, 0xab, 0xfd, + 0x93, 0xec, 0x3e, 0x4a, 0x5f, 0xc9, 0xc3, 0x85, 0xd4, 0x7a, 0xb1, 0xd8, 0x73, 0xc5, 0x10, 0x7b, + 0x3e, 0x9b, 0x10, 0x7b, 0xda, 0xdd, 0x6b, 0x1f, 0x8d, 0x1c, 0x54, 0x38, 0xba, 0xb2, 0x38, 0x00, + 0x0f, 0x29, 0x03, 0x35, 0x1c, 0x5d, 0x15, 0x21, 0x6c, 0xd2, 0xfd, 0x46, 0x92, 0x7d, 0xfe, 0x1b, + 0x0b, 0xce, 0xa6, 0xce, 0xcd, 0x09, 0xc8, 0xba, 0xd6, 0x4c, 0x59, 0xd7, 0x13, 0x7d, 0xaf, 0xd6, + 0x0c, 0xe1, 0xd7, 0xaf, 0x0f, 0x64, 0x7c, 0x0b, 0x7b, 0xc9, 0xdf, 0x82, 0x11, 0xa7, 0x56, 0x23, + 0x61, 0xb8, 0xea, 0xd7, 0x55, 0x30, 0xe0, 0xa7, 0xd9, 0x3b, 0x2b, 0x2e, 0x3e, 0xd8, 0x9f, 0x9b, + 0x4d, 0x92, 0x88, 0xc1, 0x58, 0xa7, 0x80, 0x3e, 0x03, 0x85, 0x50, 0xdc, 0x9b, 0x62, 0xee, 0x9f, + 0xeb, 0x73, 0x70, 0x9c, 0x0d, 0xd2, 0x30, 0xa3, 0x15, 0x29, 0x49, 0x85, 0x22, 0x69, 0x46, 0x36, + 0xc9, 0x1d, 0x69, 0x64, 0x93, 0x67, 0x01, 0x76, 0xd5, 0x63, 0x20, 0x29, 0x7f, 0xd0, 0x9e, 0x09, + 0x1a, 0x16, 0xfa, 0x24, 0x4c, 0x86, 0x3c, 0x9c, 0xdf, 0x52, 0xc3, 0x09, 0x99, 0x9b, 0x8b, 0x58, + 0x85, 0x2c, 0x22, 0x52, 0x35, 0x01, 0xc3, 0x1d, 0xd8, 0x68, 0x45, 0xb6, 0xca, 0x62, 0x0f, 0xf2, + 0x85, 0x79, 0x39, 0x6e, 0x51, 0xe4, 0xca, 0x3d, 0x95, 0x1c, 0x7e, 0x36, 0xf0, 0x5a, 0x4d, 0xf4, + 0x19, 0x00, 0xba, 0x7c, 0x84, 0x1c, 0x62, 0x38, 0xfb, 0xf0, 0xa4, 0xa7, 0x4a, 0x3d, 0xd5, 0x2a, + 0x97, 0xf9, 0xa6, 0x96, 0x14, 0x11, 0xac, 0x11, 0xb4, 0x7f, 0x68, 0x00, 0x1e, 0xed, 0x72, 0x46, + 0xa2, 0x05, 0x53, 0x0f, 0xfb, 0x64, 0xf2, 0x71, 0x3d, 0x9b, 0x5a, 0xd9, 0x78, 0x6d, 0x27, 0x96, + 0x62, 0xee, 0x3d, 0x2f, 0xc5, 0xef, 0xb7, 0x34, 0xb1, 0x07, 0xb7, 0xd5, 0xfc, 0xc4, 0x21, 0xcf, + 0xfe, 0x23, 0x94, 0x83, 0x6c, 0xa6, 0x08, 0x13, 0x9e, 0xed, 0xbb, 0x3b, 0x7d, 0x4b, 0x17, 0x4e, + 0x56, 0x4a, 0xfc, 0x79, 0x0b, 0x1e, 0x4b, 0xed, 0xaf, 0x61, 0x91, 0x73, 0x15, 0x8a, 0x35, 0x5a, + 0xa8, 0xb9, 0x22, 0xc6, 0x3e, 0xda, 0x12, 0x80, 0x63, 0x1c, 0xc3, 0xf0, 0x26, 0xd7, 0xd3, 0xf0, + 0xe6, 0x57, 0x2c, 0xe8, 0xd8, 0x1f, 0x27, 0x70, 0x50, 0x97, 0xcd, 0x83, 0xfa, 0xc3, 0xfd, 0xcc, + 0x65, 0xc6, 0x19, 0xfd, 0xc7, 0x13, 0x70, 0x26, 0xc3, 0x15, 0x67, 0x17, 0xa6, 0xb6, 0x6a, 0xc4, + 0x74, 0xf2, 0x14, 0x1f, 0x93, 0xea, 0x0f, 0xdb, 0xd5, 0x23, 0x94, 0x25, 0xbe, 0x9c, 0xea, 0x40, + 0xc1, 0x9d, 0x4d, 0xa0, 0xcf, 0x5b, 0x70, 0xca, 0xb9, 0x17, 0x76, 0x64, 0xca, 0x17, 0x6b, 0xe6, + 0xf9, 0x54, 0x21, 0x48, 0x8f, 0xcc, 0xfa, 0x3c, 0x13, 0x68, 0x1a, 0x16, 0x4e, 0x6d, 0x0b, 0x61, + 0x11, 0x1e, 0x9e, 0xb2, 0xf3, 0x5d, 0xdc, 0x90, 0xd3, 0x7c, 0xa6, 0xf8, 0x0d, 0x22, 0x21, 0x58, + 0xd1, 0x41, 0x9f, 0x83, 0xe2, 0x96, 0x74, 0x64, 0x4c, 0xb9, 0xa1, 0xe2, 0x81, 0xec, 0xee, 0xde, + 0xc9, 0x35, 0x99, 0x0a, 0x09, 0xc7, 0x44, 0xd1, 0x6b, 0x90, 0xf7, 0x36, 0xc3, 0x6e, 0xc9, 0x34, + 0x13, 0x26, 0x6b, 0xdc, 0xd9, 0x7f, 0x6d, 0xa5, 0x8a, 0x69, 0x45, 0x74, 0x1d, 0xf2, 0xc1, 0x46, + 0x5d, 0x48, 0xf0, 0x52, 0xcf, 0x70, 0xbc, 0x58, 0xca, 0xe8, 0x15, 0xa3, 0x84, 0x17, 0x4b, 0x98, + 0x92, 0x40, 0x15, 0x18, 0x64, 0xfe, 0x2b, 0xe2, 0x3e, 0x48, 0xe5, 0x7c, 0xbb, 0xf8, 0x81, 0xf1, + 0x88, 0x00, 0x0c, 0x01, 0x73, 0x42, 0x68, 0x1d, 0x86, 0x6a, 0x2c, 0xf1, 0xa2, 0x08, 0x2b, 0xf6, + 0xb1, 0x54, 0x59, 0x5d, 0x97, 0x8c, 0x94, 0x42, 0x74, 0xc5, 0x30, 0xb0, 0xa0, 0xc5, 0xa8, 0x92, + 0xd6, 0xf6, 0x66, 0x28, 0x12, 0x05, 0xa7, 0x53, 0xed, 0x92, 0x68, 0x55, 0x50, 0x65, 0x18, 0x58, + 0xd0, 0x42, 0x2f, 0x43, 0x6e, 0xb3, 0x26, 0x7c, 0x53, 0x52, 0x85, 0x76, 0x66, 0xbc, 0x86, 0xc5, + 0xa1, 0x07, 0xfb, 0x73, 0xb9, 0x95, 0x25, 0x9c, 0xdb, 0xac, 0xa1, 0x35, 0x18, 0xde, 0xe4, 0x1e, + 0xde, 0x42, 0x2e, 0xf7, 0x78, 0xba, 0xf3, 0x79, 0x87, 0x13, 0x38, 0x77, 0xcb, 0x10, 0x00, 0x2c, + 0x89, 0xb0, 0x68, 0xeb, 0xca, 0x53, 0x5d, 0x44, 0xe0, 0x9a, 0x3f, 0x5c, 0x74, 0x01, 0x7e, 0x3f, + 0xc7, 0xfe, 0xee, 0x58, 0xa3, 0x48, 0x57, 0xb5, 0x23, 0xb3, 0xb5, 0x8b, 0x88, 0x2a, 0xa9, 0xab, + 0xba, 0x47, 0x22, 0x7b, 0xbe, 0xaa, 0x15, 0x12, 0x8e, 0x89, 0xa2, 0x1d, 0x18, 0xdb, 0x0d, 0x5b, + 0xdb, 0x44, 0x6e, 0x69, 0x16, 0x60, 0x25, 0xe3, 0x0a, 0xbb, 0x23, 0x10, 0xdd, 0x20, 0x6a, 0x3b, + 0x8d, 0x8e, 0x53, 0x88, 0xa9, 0xbf, 0xef, 0xe8, 0xc4, 0xb0, 0x49, 0x9b, 0x0e, 0xff, 0x3b, 0x6d, + 0x7f, 0x63, 0x2f, 0x22, 0x22, 0x70, 0x56, 0xea, 0xf0, 0xbf, 0xc1, 0x51, 0x3a, 0x87, 0x5f, 0x00, + 0xb0, 0x24, 0x82, 0xee, 0x88, 0xe1, 0x61, 0xa7, 0xe7, 0x64, 0x76, 0x74, 0xcb, 0x05, 0x89, 0x94, + 0x31, 0x28, 0xec, 0xb4, 0x8c, 0x49, 0xb1, 0x53, 0xb2, 0xb5, 0xed, 0x47, 0xbe, 0x97, 0x38, 0xa1, + 0xa7, 0xb2, 0x4f, 0xc9, 0x4a, 0x0a, 0x7e, 0xe7, 0x29, 0x99, 0x86, 0x85, 0x53, 0xdb, 0x42, 0x75, + 0x18, 0x6f, 0xf9, 0x41, 0x74, 0xcf, 0x0f, 0xe4, 0xfa, 0x42, 0x5d, 0xe4, 0x0a, 0x06, 0xa6, 0x68, + 0x91, 0xc5, 0xa4, 0x33, 0x21, 0x38, 0x41, 0x13, 0x7d, 0x0a, 0x86, 0xc3, 0x9a, 0xd3, 0x20, 0xe5, + 0x5b, 0x33, 0xd3, 0xd9, 0xd7, 0x4f, 0x95, 0xa3, 0x64, 0xac, 0x2e, 0x1e, 0x9a, 0x9d, 0xa3, 0x60, + 0x49, 0x0e, 0xad, 0xc0, 0x20, 0xcb, 0xa6, 0xc5, 0xa2, 0xbc, 0x65, 0x04, 0xe9, 0xec, 0x30, 0x20, + 0xe6, 0x67, 0x13, 0x2b, 0xc6, 0xbc, 0x3a, 0xdd, 0x03, 0x82, 0xbd, 0xf6, 0xc3, 0x99, 0xd3, 0xd9, + 0x7b, 0x40, 0x70, 0xe5, 0xb7, 0xaa, 0xdd, 0xf6, 0x80, 0x42, 0xc2, 0x31, 0x51, 0x7a, 0x32, 0xd3, + 0xd3, 0xf4, 0x4c, 0x17, 0xcb, 0x97, 0xcc, 0xb3, 0x94, 0x9d, 0xcc, 0xf4, 0x24, 0xa5, 0x24, 0xec, + 0xdf, 0x1b, 0xee, 0xe4, 0x59, 0xd8, 0x83, 0xec, 0x3b, 0xad, 0x0e, 0x5d, 0xdd, 0xc7, 0xfb, 0x95, + 0x0f, 0x1d, 0x21, 0xb7, 0xfa, 0x79, 0x0b, 0xce, 0xb4, 0x52, 0x3f, 0x44, 0x30, 0x00, 0xfd, 0x89, + 0x99, 0xf8, 0xa7, 0xab, 0x88, 0x80, 0xe9, 0x70, 0x9c, 0xd1, 0x52, 0xf2, 0x45, 0x90, 0x7f, 0xcf, + 0x2f, 0x82, 0x55, 0x28, 0x30, 0x26, 0xb3, 0x47, 0x22, 0xe2, 0xe4, 0xc3, 0x88, 0xb1, 0x12, 0x4b, + 0xa2, 0x22, 0x56, 0x24, 0xd0, 0x0f, 0x58, 0x70, 0x3e, 0xd9, 0x75, 0x4c, 0x18, 0x58, 0x84, 0x11, + 0xe4, 0x6f, 0xc1, 0x15, 0xf1, 0xfd, 0xe7, 0x2b, 0xdd, 0x90, 0x0f, 0x7a, 0x21, 0xe0, 0xee, 0x8d, + 0xa1, 0x52, 0xca, 0x63, 0x74, 0xc8, 0x14, 0xc0, 0xf7, 0xf1, 0x20, 0x7d, 0x1e, 0x46, 0x9b, 0x7e, + 0xdb, 0x8b, 0x84, 0xa1, 0x8c, 0x50, 0xda, 0x33, 0x65, 0xf5, 0xaa, 0x56, 0x8e, 0x0d, 0xac, 0xc4, + 0x33, 0xb6, 0xf0, 0xd0, 0xcf, 0xd8, 0xb7, 0x60, 0xd4, 0xd3, 0x2c, 0x3b, 0x05, 0x3f, 0x70, 0x39, + 0x3b, 0x04, 0xa8, 0x6e, 0x07, 0xca, 0x7b, 0xa9, 0x97, 0x60, 0x83, 0xda, 0xc9, 0xbe, 0x8d, 0xbe, + 0x64, 0xa5, 0x30, 0xf5, 0xfc, 0xb5, 0xfc, 0xaa, 0xf9, 0x5a, 0xbe, 0x9c, 0x7c, 0x2d, 0x77, 0x08, + 0x5f, 0x8d, 0x87, 0x72, 0xff, 0x19, 0x4e, 0xfa, 0x8d, 0xf6, 0x67, 0x37, 0xe0, 0x62, 0xaf, 0x6b, + 0x89, 0x59, 0x4c, 0xd5, 0x95, 0xaa, 0x2d, 0xb6, 0x98, 0xaa, 0x97, 0x4b, 0x98, 0x41, 0xfa, 0x8d, + 0x23, 0x63, 0xff, 0x77, 0x0b, 0xf2, 0x15, 0xbf, 0x7e, 0x02, 0xc2, 0xe4, 0x4f, 0x18, 0xc2, 0xe4, + 0x47, 0xd3, 0x2f, 0xc4, 0x7a, 0xa6, 0xe8, 0x78, 0x39, 0x21, 0x3a, 0x3e, 0x9f, 0x45, 0xa0, 0xbb, + 0xa0, 0xf8, 0x27, 0xf2, 0x30, 0x52, 0xf1, 0xeb, 0xca, 0x5c, 0xf9, 0xd7, 0x1f, 0xc6, 0x5c, 0x39, + 0x33, 0x4e, 0xbf, 0x46, 0x99, 0x19, 0x5a, 0x49, 0x1f, 0xcb, 0xaf, 0x33, 0xab, 0xe5, 0xbb, 0xc4, + 0xdd, 0xda, 0x8e, 0x48, 0x3d, 0xf9, 0x39, 0x27, 0x67, 0xb5, 0xfc, 0xdf, 0x2c, 0x98, 0x48, 0xb4, + 0x8e, 0x1a, 0x30, 0xd6, 0xd0, 0x05, 0x93, 0x62, 0x9d, 0x3e, 0x94, 0x4c, 0x53, 0x58, 0x7d, 0x6a, + 0x45, 0xd8, 0x24, 0x8e, 0xe6, 0x01, 0x94, 0xa6, 0x4e, 0x4a, 0xc0, 0x18, 0xd7, 0xaf, 0x54, 0x79, + 0x21, 0xd6, 0x30, 0xd0, 0x0b, 0x30, 0x12, 0xf9, 0x2d, 0xbf, 0xe1, 0x6f, 0xed, 0xdd, 0x20, 0x32, + 0x72, 0x91, 0xb2, 0xe5, 0x5a, 0x8f, 0x41, 0x58, 0xc7, 0xb3, 0x7f, 0x2a, 0xcf, 0x3f, 0xd4, 0x8b, + 0xdc, 0x0f, 0xd6, 0xe4, 0xfb, 0x7b, 0x4d, 0x7e, 0xc5, 0x82, 0x49, 0xda, 0x3a, 0x33, 0x17, 0x91, + 0x97, 0xad, 0x0a, 0xfd, 0x6b, 0x75, 0x09, 0xfd, 0x7b, 0x99, 0x9e, 0x5d, 0x75, 0xbf, 0x1d, 0x09, + 0x09, 0x9a, 0x76, 0x38, 0xd1, 0x52, 0x2c, 0xa0, 0x02, 0x8f, 0x04, 0x81, 0x70, 0x71, 0xd3, 0xf1, + 0x48, 0x10, 0x60, 0x01, 0x95, 0x91, 0x81, 0x07, 0xd2, 0x23, 0x03, 0xf3, 0x38, 0x8c, 0xc2, 0xb0, + 0x40, 0xb0, 0x3d, 0x5a, 0x1c, 0x46, 0x69, 0x71, 0x10, 0xe3, 0xd8, 0x3f, 0x9b, 0x87, 0xd1, 0x8a, + 0x5f, 0x8f, 0x75, 0x65, 0xcf, 0x1b, 0xba, 0xb2, 0x8b, 0x09, 0x5d, 0xd9, 0xa4, 0x8e, 0xfb, 0x81, + 0x66, 0xec, 0x6b, 0xa5, 0x19, 0xfb, 0x67, 0x16, 0x9b, 0xb5, 0xd2, 0x5a, 0x95, 0x5b, 0x1f, 0xa1, + 0x67, 0x60, 0x84, 0x1d, 0x48, 0xcc, 0xa7, 0x52, 0x2a, 0x90, 0x58, 0xc6, 0x9b, 0xb5, 0xb8, 0x18, + 0xeb, 0x38, 0xe8, 0x0a, 0x14, 0x42, 0xe2, 0x04, 0xb5, 0x6d, 0x75, 0xc6, 0x09, 0x6d, 0x0f, 0x2f, + 0xc3, 0x0a, 0x8a, 0xde, 0x88, 0x43, 0x00, 0xe6, 0xb3, 0x7d, 0xb4, 0xf4, 0xfe, 0xf0, 0x2d, 0x92, + 0x1d, 0xf7, 0xcf, 0xbe, 0x0b, 0xa8, 0x13, 0xbf, 0x8f, 0xd8, 0x57, 0x73, 0x66, 0xec, 0xab, 0x62, + 0x47, 0xdc, 0xab, 0x3f, 0xb7, 0x60, 0xbc, 0xe2, 0xd7, 0xe9, 0xd6, 0xfd, 0x46, 0xda, 0xa7, 0x7a, + 0xfc, 0xd3, 0xa1, 0x2e, 0xf1, 0x4f, 0x2f, 0xc1, 0x60, 0xc5, 0xaf, 0x97, 0x2b, 0xdd, 0x7c, 0x9b, + 0xed, 0xbf, 0x63, 0xc1, 0x70, 0xc5, 0xaf, 0x9f, 0x80, 0x70, 0xfe, 0x55, 0x53, 0x38, 0xff, 0x48, + 0xc6, 0xba, 0xc9, 0x90, 0xc7, 0xff, 0xad, 0x01, 0x18, 0xa3, 0xfd, 0xf4, 0xb7, 0xe4, 0x54, 0x1a, + 0xc3, 0x66, 0xf5, 0x31, 0x6c, 0x94, 0x17, 0xf6, 0x1b, 0x0d, 0xff, 0x5e, 0x72, 0x5a, 0x57, 0x58, + 0x29, 0x16, 0x50, 0xf4, 0x14, 0x14, 0x5a, 0x01, 0xd9, 0x75, 0x7d, 0xc1, 0x64, 0x6a, 0xaa, 0x8e, + 0x8a, 0x28, 0xc7, 0x0a, 0x83, 0x3e, 0xce, 0x42, 0xd7, 0xab, 0x91, 0x2a, 0xa9, 0xf9, 0x5e, 0x9d, + 0xcb, 0xaf, 0xf3, 0x22, 0xfa, 0xbf, 0x56, 0x8e, 0x0d, 0x2c, 0x74, 0x17, 0x8a, 0xec, 0x3f, 0x3b, + 0x76, 0x0e, 0x9f, 0x47, 0x52, 0xe4, 0x15, 0x13, 0x04, 0x70, 0x4c, 0x0b, 0x3d, 0x0b, 0x10, 0xc9, + 0x40, 0xd7, 0xa1, 0x88, 0x73, 0xa4, 0x18, 0x72, 0x15, 0x02, 0x3b, 0xc4, 0x1a, 0x16, 0x7a, 0x12, + 0x8a, 0x91, 0xe3, 0x36, 0x6e, 0xba, 0x1e, 0x09, 0x99, 0x5c, 0x3a, 0x2f, 0xd3, 0x7b, 0x89, 0x42, + 0x1c, 0xc3, 0x29, 0x43, 0xc4, 0x82, 0x00, 0xf0, 0x2c, 0xb4, 0x05, 0x86, 0xcd, 0x18, 0xa2, 0x9b, + 0xaa, 0x14, 0x6b, 0x18, 0x68, 0x1b, 0xce, 0xb9, 0x1e, 0x8b, 0x94, 0x4f, 0xaa, 0x3b, 0x6e, 0x6b, + 0xfd, 0x66, 0xf5, 0x0e, 0x09, 0xdc, 0xcd, 0xbd, 0x45, 0xa7, 0xb6, 0x43, 0x3c, 0x99, 0x21, 0xf0, + 0xc3, 0xa2, 0x8b, 0xe7, 0xca, 0x5d, 0x70, 0x71, 0x57, 0x4a, 0xf6, 0x4b, 0x70, 0xba, 0xe2, 0xd7, + 0x2b, 0x7e, 0x10, 0xad, 0xf8, 0xc1, 0x3d, 0x27, 0xa8, 0xcb, 0x95, 0x32, 0x27, 0x93, 0x89, 0xd0, + 0xa3, 0x70, 0x90, 0x1f, 0x14, 0x46, 0x4a, 0xab, 0xe7, 0x18, 0xf3, 0x75, 0x48, 0x67, 0x94, 0x1a, + 0x63, 0x03, 0x54, 0xda, 0x88, 0x6b, 0x4e, 0x44, 0xd0, 0x2d, 0x96, 0x0e, 0x37, 0xbe, 0x11, 0x45, + 0xf5, 0x27, 0xb4, 0x74, 0xb8, 0x31, 0x30, 0xf5, 0x0a, 0x35, 0xeb, 0xdb, 0xff, 0x63, 0x90, 0x1d, + 0x8e, 0x89, 0xd4, 0x03, 0xe8, 0xb3, 0x30, 0x1e, 0x92, 0x9b, 0xae, 0xd7, 0xbe, 0x2f, 0x65, 0x02, + 0x5d, 0xdc, 0x89, 0xaa, 0xcb, 0x3a, 0x26, 0x97, 0x2c, 0x9a, 0x65, 0x38, 0x41, 0x0d, 0x35, 0x61, + 0xfc, 0x9e, 0xeb, 0xd5, 0xfd, 0x7b, 0xa1, 0xa4, 0x5f, 0xc8, 0x16, 0x30, 0xde, 0xe5, 0x98, 0x89, + 0x3e, 0x1a, 0xcd, 0xdd, 0x35, 0x88, 0xe1, 0x04, 0x71, 0xba, 0x00, 0x83, 0xb6, 0xb7, 0x10, 0xde, + 0x0e, 0x49, 0x20, 0x12, 0x1b, 0xb3, 0x05, 0x88, 0x65, 0x21, 0x8e, 0xe1, 0x74, 0x01, 0xb2, 0x3f, + 0xd7, 0x02, 0xbf, 0xcd, 0xc3, 0xd1, 0x8b, 0x05, 0x88, 0x55, 0x29, 0xd6, 0x30, 0xe8, 0x06, 0x65, + 0xff, 0xd6, 0x7c, 0x0f, 0xfb, 0x7e, 0x24, 0xb7, 0x34, 0x4b, 0xa5, 0xa9, 0x95, 0x63, 0x03, 0x0b, + 0xad, 0x00, 0x0a, 0xdb, 0xad, 0x56, 0x83, 0xd9, 0x29, 0x38, 0x0d, 0x46, 0x8a, 0xeb, 0x88, 0xf3, + 0x3c, 0x4a, 0x67, 0xb5, 0x03, 0x8a, 0x53, 0x6a, 0xd0, 0xb3, 0x7a, 0x53, 0x74, 0x75, 0x90, 0x75, + 0x95, 0x2b, 0x23, 0xaa, 0xbc, 0x9f, 0x12, 0x86, 0x96, 0x61, 0x38, 0xdc, 0x0b, 0x6b, 0x91, 0x08, + 0x37, 0x96, 0x91, 0x5d, 0xa6, 0xca, 0x50, 0xb4, 0xe4, 0x66, 0xbc, 0x0a, 0x96, 0x75, 0x51, 0x0d, + 0xa6, 0x05, 0xc5, 0xa5, 0x6d, 0xc7, 0x53, 0xb9, 0x3a, 0xb8, 0xb9, 0xe6, 0x33, 0x0f, 0xf6, 0xe7, + 0xa6, 0x45, 0xcb, 0x3a, 0xf8, 0x60, 0x7f, 0xee, 0x4c, 0xc5, 0xaf, 0xa7, 0x40, 0x70, 0x1a, 0x35, + 0xbe, 0xf8, 0x6a, 0x35, 0xbf, 0xd9, 0xaa, 0x04, 0xfe, 0xa6, 0xdb, 0x20, 0xdd, 0x14, 0x3a, 0x55, + 0x03, 0x53, 0x2c, 0x3e, 0xa3, 0x0c, 0x27, 0xa8, 0xd9, 0xdf, 0xc6, 0xf8, 0x19, 0x96, 0xcb, 0x37, + 0x6a, 0x07, 0x04, 0x35, 0x61, 0xac, 0xc5, 0xb6, 0x89, 0x08, 0x12, 0x2f, 0xd6, 0xfa, 0xf3, 0x7d, + 0x0a, 0x26, 0xee, 0xd1, 0x6b, 0x40, 0x09, 0x0e, 0xd9, 0x8b, 0xaf, 0xa2, 0x93, 0xc3, 0x26, 0x75, + 0xfb, 0x47, 0x1f, 0x61, 0x37, 0x62, 0x95, 0x4b, 0x1b, 0x86, 0x85, 0x75, 0xb8, 0x78, 0x5a, 0xcd, + 0x66, 0x8b, 0xbd, 0xe2, 0x69, 0x11, 0x16, 0xe6, 0x58, 0xd6, 0x45, 0x9f, 0x81, 0x71, 0xfa, 0x52, + 0xd1, 0x92, 0x64, 0x9c, 0xca, 0xf6, 0xe2, 0x8f, 0x73, 0x63, 0x68, 0x09, 0x24, 0xf4, 0xca, 0x38, + 0x41, 0x0c, 0xbd, 0xc1, 0xec, 0x18, 0xcc, 0xfc, 0x1b, 0x3d, 0x48, 0xeb, 0x26, 0x0b, 0x92, 0xac, + 0x46, 0x24, 0x2b, 0xb7, 0x87, 0x7d, 0xbc, 0xb9, 0x3d, 0xd0, 0x4d, 0x18, 0x13, 0x09, 0x6d, 0xc5, + 0xca, 0xcd, 0x1b, 0xd2, 0xb8, 0x31, 0xac, 0x03, 0x0f, 0x92, 0x05, 0xd8, 0xac, 0x8c, 0xb6, 0xe0, + 0xbc, 0x96, 0x60, 0xe6, 0x5a, 0xe0, 0x30, 0x95, 0xba, 0xcb, 0x8e, 0x53, 0xed, 0xae, 0x7e, 0xec, + 0xc1, 0xfe, 0xdc, 0xf9, 0xf5, 0x6e, 0x88, 0xb8, 0x3b, 0x1d, 0x74, 0x0b, 0x4e, 0x73, 0x1f, 0xd4, + 0x12, 0x71, 0xea, 0x0d, 0xd7, 0x53, 0xcc, 0x00, 0xdf, 0xf2, 0x67, 0x1f, 0xec, 0xcf, 0x9d, 0x5e, + 0x48, 0x43, 0xc0, 0xe9, 0xf5, 0xd0, 0xab, 0x50, 0xac, 0x7b, 0xa1, 0x18, 0x83, 0x21, 0x23, 0x87, + 0x4f, 0xb1, 0xb4, 0x56, 0x55, 0xdf, 0x1f, 0xff, 0xc1, 0x71, 0x05, 0xb4, 0xc5, 0x25, 0xb6, 0x4a, + 0x40, 0x32, 0xdc, 0x11, 0x3d, 0x27, 0x29, 0x6a, 0x33, 0xbc, 0xd0, 0xb8, 0xaa, 0x42, 0x19, 0x67, + 0x1b, 0x0e, 0x6a, 0x06, 0x61, 0xf4, 0x3a, 0x20, 0xfa, 0x82, 0x70, 0x6b, 0x64, 0xa1, 0xc6, 0x32, + 0x10, 0x30, 0x01, 0x77, 0xc1, 0xf4, 0x8b, 0xaa, 0x76, 0x60, 0xe0, 0x94, 0x5a, 0xe8, 0x3a, 0x3d, + 0x55, 0xf4, 0x52, 0x71, 0x6a, 0xa9, 0x8c, 0x6b, 0x25, 0xd2, 0x0a, 0x48, 0xcd, 0x89, 0x48, 0xdd, + 0xa4, 0x88, 0x13, 0xf5, 0x50, 0x1d, 0xce, 0x39, 0xed, 0xc8, 0x67, 0xc2, 0x70, 0x13, 0x75, 0xdd, + 0xdf, 0x21, 0x1e, 0xd3, 0x43, 0x15, 0x16, 0x2f, 0x52, 0x6e, 0x63, 0xa1, 0x0b, 0x1e, 0xee, 0x4a, + 0x85, 0x72, 0x89, 0x2a, 0xc5, 0x2a, 0x98, 0x41, 0x81, 0x52, 0xd2, 0xac, 0xbe, 0x00, 0x23, 0xdb, + 0x7e, 0x18, 0xad, 0x91, 0xe8, 0x9e, 0x1f, 0xec, 0x88, 0xd0, 0x8e, 0x71, 0x38, 0xe0, 0x18, 0x84, + 0x75, 0x3c, 0xfa, 0x0c, 0x64, 0x56, 0x12, 0xe5, 0x12, 0x53, 0x50, 0x17, 0xe2, 0x33, 0xe6, 0x3a, + 0x2f, 0xc6, 0x12, 0x2e, 0x51, 0xcb, 0x95, 0x25, 0xa6, 0x6c, 0x4e, 0xa0, 0x96, 0x2b, 0x4b, 0x58, + 0xc2, 0xe9, 0x72, 0x0d, 0xb7, 0x9d, 0x80, 0x54, 0x02, 0xbf, 0x46, 0x42, 0x2d, 0x08, 0xf5, 0xa3, + 0x3c, 0x70, 0x25, 0x5d, 0xae, 0xd5, 0x34, 0x04, 0x9c, 0x5e, 0x0f, 0x91, 0xce, 0xe4, 0x4a, 0xe3, + 0xd9, 0x5a, 0x82, 0x4e, 0x7e, 0xa6, 0xcf, 0xfc, 0x4a, 0x1e, 0x4c, 0xaa, 0xb4, 0x4e, 0x3c, 0x54, + 0x65, 0x38, 0x33, 0xc1, 0xd6, 0x76, 0xff, 0x71, 0x2e, 0x95, 0xde, 0xa5, 0x9c, 0xa0, 0x84, 0x3b, + 0x68, 0x1b, 0x71, 0x9f, 0x26, 0x7b, 0xe6, 0xdc, 0xbd, 0x0a, 0xc5, 0xb0, 0xbd, 0x51, 0xf7, 0x9b, + 0x8e, 0xeb, 0x31, 0x65, 0xb3, 0xf6, 0x1e, 0xa9, 0x4a, 0x00, 0x8e, 0x71, 0xd0, 0x0a, 0x14, 0x1c, + 0xa9, 0x54, 0x41, 0xd9, 0xe1, 0x42, 0x94, 0x2a, 0x85, 0x7b, 0xd0, 0x4b, 0x35, 0x8a, 0xaa, 0x8b, + 0x5e, 0x81, 0x31, 0xe1, 0x43, 0x29, 0x32, 0x0a, 0x4e, 0x9b, 0x8e, 0x2e, 0x55, 0x1d, 0x88, 0x4d, + 0x5c, 0x74, 0x1b, 0x46, 0x22, 0xbf, 0xc1, 0xbc, 0x35, 0x28, 0x9b, 0x77, 0x26, 0x3b, 0xe4, 0xd8, + 0xba, 0x42, 0xd3, 0xe5, 0x99, 0xaa, 0x2a, 0xd6, 0xe9, 0xa0, 0x75, 0xbe, 0xde, 0x59, 0x30, 0x66, + 0x12, 0xce, 0x3c, 0x92, 0x7d, 0x27, 0xa9, 0x98, 0xcd, 0xe6, 0x76, 0x10, 0x35, 0xb1, 0x4e, 0x06, + 0x5d, 0x83, 0xa9, 0x56, 0xe0, 0xfa, 0x6c, 0x4d, 0x28, 0x7d, 0xda, 0x8c, 0x99, 0x09, 0xa6, 0x92, + 0x44, 0xc0, 0x9d, 0x75, 0x98, 0x0b, 0xac, 0x28, 0x9c, 0x39, 0xcb, 0x93, 0x0e, 0xf3, 0xe7, 0x1d, + 0x2f, 0xc3, 0x0a, 0x8a, 0x56, 0xd9, 0x49, 0xcc, 0x25, 0x13, 0x33, 0xb3, 0xd9, 0x11, 0x4a, 0x74, + 0x09, 0x06, 0x67, 0x5e, 0xd5, 0x5f, 0x1c, 0x53, 0x40, 0x75, 0x2d, 0x3b, 0x1d, 0x7d, 0x31, 0x84, + 0x33, 0xe7, 0xba, 0x98, 0xaa, 0x25, 0x9e, 0x17, 0x31, 0x43, 0x60, 0x14, 0x87, 0x38, 0x41, 0x13, + 0x7d, 0x12, 0x26, 0x45, 0x44, 0xb4, 0x78, 0x98, 0xce, 0xc7, 0x36, 0xb0, 0x38, 0x01, 0xc3, 0x1d, + 0xd8, 0x3c, 0x48, 0xbd, 0xb3, 0xd1, 0x20, 0xe2, 0xe8, 0xbb, 0xe9, 0x7a, 0x3b, 0xe1, 0xcc, 0x05, + 0x76, 0x3e, 0x88, 0x20, 0xf5, 0x49, 0x28, 0x4e, 0xa9, 0x81, 0xd6, 0x61, 0xb2, 0x15, 0x10, 0xd2, + 0x64, 0x8c, 0xbe, 0xb8, 0xcf, 0xe6, 0xb8, 0x07, 0x38, 0xed, 0x49, 0x25, 0x01, 0x3b, 0x48, 0x29, + 0xc3, 0x1d, 0x14, 0xd0, 0x3d, 0x28, 0xf8, 0xbb, 0x24, 0xd8, 0x26, 0x4e, 0x7d, 0xe6, 0x62, 0x17, + 0x9b, 0x6c, 0x71, 0xb9, 0xdd, 0x12, 0xb8, 0x09, 0x1d, 0xbc, 0x2c, 0xee, 0xad, 0x83, 0x97, 0x8d, + 0xa1, 0x1f, 0xb4, 0xe0, 0xac, 0x14, 0xdb, 0x57, 0x5b, 0x74, 0xd4, 0x97, 0x7c, 0x2f, 0x8c, 0x02, + 0xee, 0xb3, 0xfc, 0x58, 0xb6, 0x1f, 0xef, 0x7a, 0x46, 0x25, 0x25, 0x1c, 0x3d, 0x9b, 0x85, 0x11, + 0xe2, 0xec, 0x16, 0xd1, 0x12, 0x4c, 0x85, 0x24, 0x92, 0x87, 0xd1, 0x42, 0xb8, 0xf2, 0x46, 0x69, + 0x6d, 0xe6, 0x12, 0x77, 0xb8, 0xa6, 0x9b, 0xa1, 0x9a, 0x04, 0xe2, 0x4e, 0xfc, 0xd9, 0x6f, 0x86, + 0xa9, 0x8e, 0xeb, 0xff, 0x30, 0xc9, 0x37, 0x66, 0x77, 0x60, 0xcc, 0x18, 0xe2, 0x63, 0xd5, 0xe1, + 0xfe, 0xab, 0x61, 0x28, 0x2a, 0xfd, 0x1e, 0xba, 0x6a, 0xaa, 0x6d, 0xcf, 0x26, 0xd5, 0xb6, 0x05, + 0xfa, 0xae, 0xd7, 0x35, 0xb5, 0xeb, 0x29, 0x61, 0xa6, 0xb2, 0x36, 0x74, 0xff, 0xfe, 0xc3, 0x9a, + 0xb8, 0x36, 0xdf, 0xb7, 0xfe, 0x77, 0xa0, 0xab, 0x04, 0xf8, 0x1a, 0x4c, 0x79, 0x3e, 0xe3, 0x39, + 0x49, 0x5d, 0x32, 0x14, 0x8c, 0x6f, 0x28, 0xea, 0x71, 0x1b, 0x12, 0x08, 0xb8, 0xb3, 0x0e, 0x6d, + 0x90, 0x5f, 0xfc, 0x49, 0x91, 0x33, 0xe7, 0x0b, 0xb0, 0x80, 0xa2, 0x4b, 0x30, 0xd8, 0xf2, 0xeb, + 0xe5, 0x8a, 0xe0, 0x37, 0xb5, 0x7c, 0xaa, 0xf5, 0x72, 0x05, 0x73, 0x18, 0x5a, 0x80, 0x21, 0xf6, + 0x23, 0x9c, 0x19, 0xcd, 0x76, 0xd0, 0x67, 0x35, 0xb4, 0xd4, 0x26, 0xac, 0x02, 0x16, 0x15, 0x99, + 0xe8, 0x8b, 0x32, 0xe9, 0x4c, 0xf4, 0x35, 0xfc, 0x90, 0xa2, 0x2f, 0x49, 0x00, 0xc7, 0xb4, 0xd0, + 0x7d, 0x38, 0x6d, 0x3c, 0x8c, 0xf8, 0x12, 0x21, 0xa1, 0x70, 0x12, 0xbe, 0xd4, 0xf5, 0x45, 0x24, + 0xf4, 0xc5, 0xe7, 0x45, 0xa7, 0x4f, 0x97, 0xd3, 0x28, 0xe1, 0xf4, 0x06, 0x50, 0x03, 0xa6, 0x6a, + 0x1d, 0xad, 0x16, 0xfa, 0x6f, 0x55, 0x4d, 0x68, 0x67, 0x8b, 0x9d, 0x84, 0xd1, 0x2b, 0x50, 0x78, + 0xc7, 0x0f, 0xd9, 0x59, 0x2d, 0x78, 0x64, 0xe9, 0x61, 0x5a, 0x78, 0xe3, 0x56, 0x95, 0x95, 0x1f, + 0xec, 0xcf, 0x8d, 0x54, 0xfc, 0xba, 0xfc, 0x8b, 0x55, 0x05, 0xf4, 0x3d, 0x16, 0xcc, 0x76, 0xbe, + 0xbc, 0x54, 0xa7, 0xc7, 0xfa, 0xef, 0xb4, 0x2d, 0x1a, 0x9d, 0x5d, 0xce, 0x24, 0x87, 0xbb, 0x34, + 0x65, 0xff, 0x12, 0xd7, 0xed, 0x0a, 0x0d, 0x10, 0x09, 0xdb, 0x8d, 0x93, 0xc8, 0xe8, 0xb8, 0x6c, + 0x28, 0xa7, 0x1e, 0xda, 0x7e, 0xe0, 0xd7, 0x2c, 0x66, 0x3f, 0xb0, 0x4e, 0x9a, 0xad, 0x86, 0x13, + 0x9d, 0x84, 0x83, 0xe2, 0x1b, 0x50, 0x88, 0x44, 0x6b, 0xdd, 0x92, 0x50, 0x6a, 0x9d, 0x62, 0x36, + 0x14, 0x8a, 0x63, 0x95, 0xa5, 0x58, 0x91, 0xb1, 0xff, 0x31, 0x9f, 0x01, 0x09, 0x39, 0x01, 0x1d, + 0x40, 0xc9, 0xd4, 0x01, 0xcc, 0xf5, 0xf8, 0x82, 0x0c, 0x5d, 0xc0, 0x3f, 0x32, 0xfb, 0xcd, 0x24, + 0x35, 0xef, 0x77, 0xc3, 0x15, 0xfb, 0x87, 0x2d, 0x38, 0x95, 0x66, 0xe9, 0x49, 0x5f, 0x19, 0x5c, + 0x4e, 0xa4, 0x0c, 0x79, 0xd4, 0x08, 0xde, 0x11, 0xe5, 0x58, 0x61, 0xf4, 0x9d, 0x18, 0xea, 0x70, + 0x81, 0x52, 0x6f, 0xc1, 0x58, 0x25, 0x20, 0xda, 0x85, 0xf6, 0x1a, 0xf7, 0x38, 0xe6, 0xfd, 0x79, + 0xea, 0xd0, 0xde, 0xc6, 0xf6, 0x4f, 0xe7, 0xe0, 0x14, 0xd7, 0xc4, 0x2f, 0xec, 0xfa, 0x6e, 0xbd, + 0xe2, 0xd7, 0x45, 0x52, 0xaf, 0x37, 0x61, 0xb4, 0xa5, 0x09, 0xf7, 0xba, 0x05, 0xfd, 0xd3, 0x85, + 0x80, 0xb1, 0x38, 0x42, 0x2f, 0xc5, 0x06, 0x2d, 0x54, 0x87, 0x51, 0xb2, 0xeb, 0xd6, 0x94, 0x3a, + 0x37, 0x77, 0xe8, 0xcb, 0x45, 0xb5, 0xb2, 0xac, 0xd1, 0xc1, 0x06, 0xd5, 0x63, 0x48, 0xd7, 0x6a, + 0xff, 0x88, 0x05, 0x8f, 0x64, 0x84, 0x08, 0xa4, 0xcd, 0xdd, 0x63, 0x36, 0x0f, 0x22, 0xf3, 0xa3, + 0x6a, 0x8e, 0x5b, 0x42, 0x60, 0x01, 0x45, 0x9f, 0x02, 0xe0, 0x96, 0x0c, 0xf4, 0x99, 0xdb, 0x2b, + 0x96, 0x9a, 0x11, 0x06, 0x4a, 0x8b, 0xe8, 0x23, 0xeb, 0x63, 0x8d, 0x96, 0xfd, 0x93, 0x79, 0x18, + 0xe4, 0x39, 0xab, 0x57, 0x60, 0x78, 0x9b, 0xa7, 0x3a, 0xe8, 0x27, 0xab, 0x42, 0x2c, 0x80, 0xe0, + 0x05, 0x58, 0x56, 0x46, 0xab, 0x30, 0xcd, 0x53, 0x45, 0x34, 0x4a, 0xa4, 0xe1, 0xec, 0x49, 0x69, + 0x19, 0x4f, 0xb3, 0xa8, 0xa4, 0x86, 0xe5, 0x4e, 0x14, 0x9c, 0x56, 0x0f, 0xbd, 0x06, 0xe3, 0xf4, + 0xf5, 0xe2, 0xb7, 0x23, 0x49, 0x89, 0x27, 0x89, 0x50, 0xcf, 0xa5, 0x75, 0x03, 0x8a, 0x13, 0xd8, + 0xf4, 0x01, 0xdd, 0xea, 0x90, 0x0b, 0x0e, 0xc6, 0x0f, 0x68, 0x53, 0x16, 0x68, 0xe2, 0x32, 0x13, + 0xcf, 0x36, 0x33, 0x68, 0x5d, 0xdf, 0x0e, 0x48, 0xb8, 0xed, 0x37, 0xea, 0x8c, 0xd1, 0x1a, 0xd4, + 0x4c, 0x3c, 0x13, 0x70, 0xdc, 0x51, 0x83, 0x52, 0xd9, 0x74, 0xdc, 0x46, 0x3b, 0x20, 0x31, 0x95, + 0x21, 0x93, 0xca, 0x4a, 0x02, 0x8e, 0x3b, 0x6a, 0xd0, 0x75, 0x74, 0xba, 0x12, 0xf8, 0xf4, 0xf0, + 0x92, 0x71, 0x4f, 0x94, 0xdd, 0xee, 0xb0, 0x74, 0xd1, 0xec, 0x12, 0x21, 0x4c, 0x58, 0x36, 0x72, + 0x0a, 0x86, 0xd2, 0xbe, 0x2a, 0x9c, 0x33, 0x25, 0x15, 0xf4, 0x0c, 0x8c, 0x88, 0x04, 0x00, 0xcc, + 0xbc, 0x94, 0x4f, 0x1d, 0x33, 0x32, 0x28, 0xc5, 0xc5, 0x58, 0xc7, 0xb1, 0xbf, 0x37, 0x07, 0xd3, + 0x29, 0xfe, 0x01, 0xfc, 0xa8, 0xda, 0x72, 0xc3, 0x48, 0xa5, 0x92, 0xd3, 0x8e, 0x2a, 0x5e, 0x8e, + 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, 0x1e, 0x80, 0xc2, 0xfe, 0x56, 0x40, 0x0f, 0x99, 0x94, + 0xed, 0x22, 0x0c, 0xb4, 0x43, 0x22, 0x63, 0xfb, 0xa9, 0xf3, 0x9b, 0xe9, 0x9e, 0x18, 0x84, 0xb2, + 0xc7, 0x5b, 0x4a, 0x8d, 0xa3, 0xb1, 0xc7, 0x5c, 0x91, 0xc3, 0x61, 0xb4, 0x73, 0x11, 0xf1, 0x1c, + 0x2f, 0x12, 0x4c, 0x74, 0x1c, 0xa4, 0x8a, 0x95, 0x62, 0x01, 0xb5, 0xbf, 0x98, 0x87, 0xb3, 0x99, + 0x1e, 0x43, 0xb4, 0xeb, 0x4d, 0xdf, 0x73, 0x23, 0x5f, 0x59, 0x6f, 0xf0, 0xc0, 0x54, 0xa4, 0xb5, + 0xbd, 0x2a, 0xca, 0xb1, 0xc2, 0x40, 0x97, 0x61, 0x90, 0x49, 0xae, 0x3a, 0x92, 0xea, 0x2d, 0x96, + 0x78, 0xa4, 0x12, 0x0e, 0xee, 0x3b, 0x61, 0xe9, 0x25, 0x18, 0x68, 0xf9, 0x7e, 0x23, 0x79, 0x68, + 0xd1, 0xee, 0xfa, 0x7e, 0x03, 0x33, 0x20, 0xfa, 0x88, 0x18, 0xaf, 0x84, 0xb9, 0x02, 0x76, 0xea, + 0x7e, 0xa8, 0x0d, 0xda, 0x13, 0x30, 0xbc, 0x43, 0xf6, 0x02, 0xd7, 0xdb, 0x4a, 0x9a, 0xb1, 0xdc, + 0xe0, 0xc5, 0x58, 0xc2, 0xcd, 0xfc, 0x48, 0xc3, 0x47, 0x9d, 0x69, 0xb4, 0xd0, 0xf3, 0x0a, 0xfc, + 0xfe, 0x3c, 0x4c, 0xe0, 0xc5, 0xd2, 0x07, 0x13, 0x71, 0xbb, 0x73, 0x22, 0x8e, 0x3a, 0xd3, 0x68, + 0xef, 0xd9, 0xf8, 0x79, 0x0b, 0x26, 0x58, 0x1a, 0x02, 0x11, 0xd2, 0xc8, 0xf5, 0xbd, 0x13, 0x60, + 0xf1, 0x2e, 0xc1, 0x60, 0x40, 0x1b, 0x4d, 0x66, 0xd3, 0x63, 0x3d, 0xc1, 0x1c, 0x86, 0xce, 0xc1, + 0x00, 0xeb, 0x02, 0x9d, 0xbc, 0x51, 0x9e, 0x88, 0xa8, 0xe4, 0x44, 0x0e, 0x66, 0xa5, 0x2c, 0x4e, + 0x07, 0x26, 0xad, 0x86, 0xcb, 0x3b, 0x1d, 0xeb, 0x15, 0xdf, 0x1f, 0x71, 0x3a, 0x52, 0xbb, 0xf6, + 0xde, 0xe2, 0x74, 0xa4, 0x93, 0xec, 0xfe, 0x7c, 0xfa, 0xa3, 0x1c, 0x5c, 0x48, 0xad, 0xd7, 0x77, + 0x9c, 0x8e, 0xee, 0xb5, 0x8f, 0x33, 0x5c, 0x7d, 0xfe, 0x04, 0x8d, 0x04, 0x07, 0xfa, 0xe5, 0x30, + 0x07, 0xfb, 0x08, 0x9f, 0x91, 0x3a, 0x64, 0xef, 0x93, 0xf0, 0x19, 0xa9, 0x7d, 0xcb, 0x78, 0xfe, + 0xfd, 0x45, 0x2e, 0xe3, 0x5b, 0xd8, 0x43, 0xf0, 0x0a, 0x3d, 0x67, 0x18, 0x30, 0x14, 0x1c, 0xf3, + 0x28, 0x3f, 0x63, 0x78, 0x19, 0x56, 0x50, 0xb4, 0x00, 0x13, 0x4d, 0xd7, 0xa3, 0x87, 0xcf, 0x9e, + 0xc9, 0xf8, 0xa9, 0xe8, 0x46, 0xab, 0x26, 0x18, 0x27, 0xf1, 0x91, 0xab, 0x85, 0xd6, 0xc8, 0x65, + 0xe7, 0xa7, 0xce, 0xec, 0xed, 0xbc, 0xa9, 0x73, 0x55, 0xa3, 0x98, 0x12, 0x66, 0x63, 0x55, 0x7b, + 0xff, 0xe7, 0xfb, 0x7f, 0xff, 0x8f, 0xa6, 0xbf, 0xfd, 0x67, 0x5f, 0x81, 0xb1, 0x87, 0x16, 0xf8, + 0xda, 0x5f, 0xc9, 0xc3, 0xa3, 0x5d, 0xb6, 0x3d, 0x3f, 0xeb, 0x8d, 0x39, 0xd0, 0xce, 0xfa, 0x8e, + 0x79, 0xa8, 0xc0, 0xa9, 0xcd, 0x76, 0xa3, 0xb1, 0xc7, 0xec, 0xf0, 0x49, 0x5d, 0x62, 0x08, 0x9e, + 0xf2, 0x9c, 0x4c, 0xfd, 0xb4, 0x92, 0x82, 0x83, 0x53, 0x6b, 0x52, 0x86, 0x9e, 0xde, 0x24, 0x7b, + 0x8a, 0x54, 0x82, 0xa1, 0xc7, 0x3a, 0x10, 0x9b, 0xb8, 0xe8, 0x1a, 0x4c, 0x39, 0xbb, 0x8e, 0xcb, + 0xe3, 0x93, 0x4a, 0x02, 0x9c, 0xa3, 0x57, 0x72, 0xba, 0x85, 0x24, 0x02, 0xee, 0xac, 0x83, 0x5e, + 0x07, 0xe4, 0x8b, 0x34, 0xf9, 0xd7, 0x88, 0x27, 0x54, 0x63, 0x6c, 0xee, 0xf2, 0xf1, 0x91, 0x70, + 0xab, 0x03, 0x03, 0xa7, 0xd4, 0x4a, 0x84, 0xaa, 0x18, 0xca, 0x0e, 0x55, 0xd1, 0xfd, 0x5c, 0xec, + 0x99, 0x29, 0xe1, 0x3f, 0x5b, 0xf4, 0xfa, 0xe2, 0x4c, 0xbe, 0x19, 0x71, 0xed, 0x15, 0x66, 0xda, + 0xc6, 0x65, 0x78, 0x5a, 0xd4, 0x88, 0xd3, 0x9a, 0x69, 0x5b, 0x0c, 0xc4, 0x26, 0x2e, 0x5f, 0x10, + 0x61, 0xec, 0xac, 0x68, 0xb0, 0xf8, 0x22, 0x2c, 0x8c, 0xc2, 0x40, 0x9f, 0x86, 0xe1, 0xba, 0xbb, + 0xeb, 0x86, 0x7e, 0x20, 0x56, 0xfa, 0x21, 0xd5, 0x05, 0xf1, 0x39, 0x58, 0xe2, 0x64, 0xb0, 0xa4, + 0x67, 0x7f, 0x7f, 0x0e, 0xc6, 0x64, 0x8b, 0x6f, 0xb4, 0xfd, 0xc8, 0x39, 0x81, 0x6b, 0xf9, 0x9a, + 0x71, 0x2d, 0x7f, 0xa4, 0x5b, 0x6c, 0x1c, 0xd6, 0xa5, 0xcc, 0xeb, 0xf8, 0x56, 0xe2, 0x3a, 0x7e, + 0xbc, 0x37, 0xa9, 0xee, 0xd7, 0xf0, 0x3f, 0xb1, 0x60, 0xca, 0xc0, 0x3f, 0x81, 0xdb, 0x60, 0xc5, + 0xbc, 0x0d, 0x1e, 0xeb, 0xf9, 0x0d, 0x19, 0xb7, 0xc0, 0x77, 0xe5, 0x13, 0x7d, 0x67, 0xa7, 0xff, + 0x3b, 0x30, 0xb0, 0xed, 0x04, 0xf5, 0x6e, 0xb1, 0xc0, 0x3b, 0x2a, 0xcd, 0x5f, 0x77, 0x02, 0xa1, + 0x1b, 0x7c, 0x4a, 0xa5, 0x87, 0x76, 0x82, 0xde, 0x7a, 0x41, 0xd6, 0x14, 0x7a, 0x09, 0x86, 0xc2, + 0x9a, 0xdf, 0x52, 0x96, 0xf3, 0x17, 0x79, 0xea, 0x68, 0x5a, 0x72, 0xb0, 0x3f, 0x87, 0xcc, 0xe6, + 0x68, 0x31, 0x16, 0xf8, 0xe8, 0x4d, 0x18, 0x63, 0xbf, 0x94, 0xa1, 0x4e, 0x3e, 0x3b, 0x6f, 0x50, + 0x55, 0x47, 0xe4, 0x56, 0x6c, 0x46, 0x11, 0x36, 0x49, 0xcd, 0x6e, 0x41, 0x51, 0x7d, 0xd6, 0xb1, + 0xea, 0xe3, 0xfe, 0x7d, 0x1e, 0xa6, 0x53, 0xd6, 0x1c, 0x0a, 0x8d, 0x99, 0x78, 0xa6, 0xcf, 0xa5, + 0xfa, 0x1e, 0xe7, 0x22, 0x64, 0xaf, 0xa1, 0xba, 0x58, 0x5b, 0x7d, 0x37, 0x7a, 0x3b, 0x24, 0xc9, + 0x46, 0x69, 0x51, 0xef, 0x46, 0x69, 0x63, 0x27, 0x36, 0xd4, 0xb4, 0x21, 0xd5, 0xd3, 0x63, 0x9d, + 0xd3, 0x3f, 0xcd, 0xc3, 0xa9, 0xb4, 0x70, 0x5d, 0xe8, 0x5b, 0x13, 0x39, 0xe4, 0x9e, 0xef, 0x37, + 0xd0, 0x17, 0x4f, 0x2c, 0xc7, 0x65, 0xc0, 0x8b, 0xf3, 0x66, 0x56, 0xb9, 0x9e, 0xc3, 0x2c, 0xda, + 0x64, 0x8e, 0xf8, 0x01, 0xcf, 0xfd, 0x27, 0x8f, 0x8f, 0x8f, 0xf7, 0xdd, 0x01, 0x91, 0x34, 0x30, + 0x4c, 0x18, 0x01, 0xc8, 0xe2, 0xde, 0x46, 0x00, 0xb2, 0xe5, 0x59, 0x17, 0x46, 0xb4, 0xaf, 0x39, + 0xd6, 0x19, 0xdf, 0xa1, 0xb7, 0x95, 0xd6, 0xef, 0x63, 0x9d, 0xf5, 0x1f, 0xb1, 0x20, 0x61, 0x17, + 0xae, 0xc4, 0x62, 0x56, 0xa6, 0x58, 0xec, 0x22, 0x0c, 0x04, 0x7e, 0x83, 0x24, 0x53, 0xb6, 0x61, + 0xbf, 0x41, 0x30, 0x83, 0x50, 0x8c, 0x28, 0x16, 0x76, 0x8c, 0xea, 0x0f, 0x39, 0xf1, 0x44, 0xbb, + 0x04, 0x83, 0x0d, 0xb2, 0x4b, 0x1a, 0xc9, 0xcc, 0x1a, 0x37, 0x69, 0x21, 0xe6, 0x30, 0xfb, 0xe7, + 0x07, 0xe0, 0x7c, 0xd7, 0x50, 0x16, 0xf4, 0x39, 0xb4, 0xe5, 0x44, 0xe4, 0x9e, 0xb3, 0x97, 0x0c, + 0x81, 0x7f, 0x8d, 0x17, 0x63, 0x09, 0x67, 0x9e, 0x3b, 0x3c, 0x92, 0x6d, 0x42, 0x88, 0x28, 0x02, + 0xd8, 0x0a, 0xa8, 0x29, 0x94, 0xca, 0x1f, 0x85, 0x50, 0xea, 0x59, 0x80, 0x30, 0x6c, 0x70, 0xeb, + 0x99, 0xba, 0x70, 0x09, 0x8a, 0x23, 0x1e, 0x57, 0x6f, 0x0a, 0x08, 0xd6, 0xb0, 0x50, 0x09, 0x26, + 0x5b, 0x81, 0x1f, 0x71, 0x99, 0x6c, 0x89, 0x1b, 0x98, 0x0d, 0x9a, 0x51, 0x04, 0x2a, 0x09, 0x38, + 0xee, 0xa8, 0x81, 0x5e, 0x80, 0x11, 0x11, 0x59, 0xa0, 0xe2, 0xfb, 0x0d, 0x21, 0x06, 0x52, 0x36, + 0x57, 0xd5, 0x18, 0x84, 0x75, 0x3c, 0xad, 0x1a, 0x13, 0xf4, 0x0e, 0xa7, 0x56, 0xe3, 0xc2, 0x5e, + 0x0d, 0x2f, 0x11, 0xba, 0xaf, 0xd0, 0x57, 0xe8, 0xbe, 0x58, 0x30, 0x56, 0xec, 0x5b, 0xb7, 0x05, + 0x3d, 0x45, 0x49, 0x3f, 0x33, 0x00, 0xd3, 0x62, 0xe1, 0x1c, 0xf7, 0x72, 0xb9, 0xdd, 0xb9, 0x5c, + 0x8e, 0x42, 0x74, 0xf6, 0xc1, 0x9a, 0x39, 0xe9, 0x35, 0xf3, 0x03, 0x16, 0x98, 0xec, 0x15, 0xfa, + 0xff, 0x33, 0x73, 0x88, 0xbc, 0x90, 0xc9, 0xae, 0xd5, 0xe5, 0x05, 0xf2, 0x1e, 0xb3, 0x89, 0xd8, + 0xff, 0xd1, 0x82, 0xc7, 0x7a, 0x52, 0x44, 0xcb, 0x50, 0x64, 0x3c, 0xa0, 0xf6, 0x3a, 0x7b, 0x5c, + 0x19, 0xa0, 0x4a, 0x40, 0x06, 0x4b, 0x1a, 0xd7, 0x44, 0xcb, 0x1d, 0xc9, 0x5a, 0x9e, 0x48, 0x49, + 0xd6, 0x72, 0xda, 0x18, 0x9e, 0x87, 0xcc, 0xd6, 0xf2, 0x7d, 0xf4, 0xc6, 0x31, 0x9c, 0x3f, 0xd0, + 0xc7, 0x0d, 0xb1, 0x9f, 0x9d, 0x10, 0xfb, 0x21, 0x13, 0x5b, 0xbb, 0x43, 0x3e, 0x09, 0x93, 0x2c, + 0xe4, 0x10, 0x33, 0x87, 0x16, 0x6e, 0x29, 0xb9, 0xd8, 0xe4, 0xf1, 0x66, 0x02, 0x86, 0x3b, 0xb0, + 0xed, 0x3f, 0xcc, 0xc3, 0x10, 0xdf, 0x7e, 0x27, 0xf0, 0x26, 0x7c, 0x12, 0x8a, 0x6e, 0xb3, 0xd9, + 0xe6, 0xf9, 0x37, 0x06, 0xb9, 0x2f, 0x2a, 0x9d, 0xa7, 0xb2, 0x2c, 0xc4, 0x31, 0x1c, 0xad, 0x08, + 0x89, 0x73, 0x97, 0xa8, 0x86, 0xbc, 0xe3, 0xf3, 0x25, 0x27, 0x72, 0x38, 0x83, 0xa3, 0xee, 0xd9, + 0x58, 0x36, 0x8d, 0x3e, 0x0b, 0x10, 0x46, 0x81, 0xeb, 0x6d, 0xd1, 0x32, 0x11, 0xef, 0xf2, 0xa3, + 0x5d, 0xa8, 0x55, 0x15, 0x32, 0xa7, 0x19, 0x9f, 0x39, 0x0a, 0x80, 0x35, 0x8a, 0x68, 0xde, 0xb8, + 0xe9, 0x67, 0x13, 0x73, 0x07, 0x9c, 0x6a, 0x3c, 0x67, 0xb3, 0x2f, 0x42, 0x51, 0x11, 0xef, 0x25, + 0x7f, 0x1a, 0xd5, 0xd9, 0xa2, 0x4f, 0xc0, 0x44, 0xa2, 0x6f, 0x87, 0x12, 0x5f, 0xfd, 0x82, 0x05, + 0x13, 0xbc, 0x33, 0xcb, 0xde, 0xae, 0xb8, 0x0d, 0xde, 0x85, 0x53, 0x8d, 0x94, 0x53, 0x59, 0x4c, + 0x7f, 0xff, 0xa7, 0xb8, 0x12, 0x57, 0xa5, 0x41, 0x71, 0x6a, 0x1b, 0xe8, 0x0a, 0xdd, 0x71, 0xf4, + 0xd4, 0x75, 0x1a, 0xc2, 0x35, 0x75, 0x94, 0xef, 0x36, 0x5e, 0x86, 0x15, 0xd4, 0xfe, 0x1d, 0x0b, + 0xa6, 0x78, 0xcf, 0x6f, 0x90, 0x3d, 0x75, 0x36, 0x7d, 0x2d, 0xfb, 0x2e, 0x32, 0x3f, 0xe5, 0x32, + 0x32, 0x3f, 0xe9, 0x9f, 0x96, 0xef, 0xfa, 0x69, 0x3f, 0x6d, 0x81, 0x58, 0x21, 0x27, 0x20, 0x84, + 0xf8, 0x66, 0x53, 0x08, 0x31, 0x9b, 0xbd, 0x09, 0x32, 0xa4, 0x0f, 0x7f, 0x6e, 0xc1, 0x24, 0x47, + 0x88, 0xb5, 0xe5, 0x5f, 0xd3, 0x79, 0xe8, 0x27, 0x3f, 0xec, 0x0d, 0xb2, 0xb7, 0xee, 0x57, 0x9c, + 0x68, 0x3b, 0xfd, 0xa3, 0x8c, 0xc9, 0x1a, 0xe8, 0x3a, 0x59, 0x75, 0xb9, 0x81, 0x0e, 0x91, 0x74, + 0xfa, 0xd0, 0x89, 0x11, 0xec, 0xaf, 0x5a, 0x80, 0x78, 0x33, 0x06, 0xe3, 0x46, 0xd9, 0x21, 0x56, + 0xaa, 0x5d, 0x74, 0xf1, 0xd1, 0xa4, 0x20, 0x58, 0xc3, 0x3a, 0x92, 0xe1, 0x49, 0x98, 0x3c, 0xe4, + 0x7b, 0x9b, 0x3c, 0x1c, 0x62, 0x44, 0xff, 0xf5, 0x10, 0x24, 0x1d, 0x60, 0xd0, 0x1d, 0x18, 0xad, + 0x39, 0x2d, 0x67, 0xc3, 0x6d, 0xb8, 0x91, 0x4b, 0xc2, 0x6e, 0xb6, 0x52, 0x4b, 0x1a, 0x9e, 0x50, + 0x52, 0x6b, 0x25, 0xd8, 0xa0, 0x83, 0xe6, 0x01, 0x5a, 0x81, 0xbb, 0xeb, 0x36, 0xc8, 0x16, 0x93, + 0x95, 0x30, 0x67, 0x78, 0x6e, 0x00, 0x24, 0x4b, 0xb1, 0x86, 0x91, 0xe2, 0x6d, 0x9c, 0x3f, 0x66, + 0x6f, 0x63, 0x38, 0x31, 0x6f, 0xe3, 0x81, 0x43, 0x79, 0x1b, 0x17, 0x0e, 0xed, 0x6d, 0x3c, 0xd8, + 0x97, 0xb7, 0x31, 0x86, 0x33, 0x92, 0xf7, 0xa4, 0xff, 0x57, 0xdc, 0x06, 0x11, 0x0f, 0x0e, 0xee, + 0xc1, 0x3f, 0xfb, 0x60, 0x7f, 0xee, 0x0c, 0x4e, 0xc5, 0xc0, 0x19, 0x35, 0xd1, 0xa7, 0x60, 0xc6, + 0x69, 0x34, 0xfc, 0x7b, 0x6a, 0x52, 0x97, 0xc3, 0x9a, 0xd3, 0xe0, 0x4a, 0x88, 0x61, 0x46, 0xf5, + 0xdc, 0x83, 0xfd, 0xb9, 0x99, 0x85, 0x0c, 0x1c, 0x9c, 0x59, 0x1b, 0xbd, 0x0a, 0xc5, 0x56, 0xe0, + 0xd7, 0x56, 0x35, 0x2f, 0xbd, 0x0b, 0x74, 0x00, 0x2b, 0xb2, 0xf0, 0x60, 0x7f, 0x6e, 0x4c, 0xfd, + 0x61, 0x17, 0x7e, 0x5c, 0x21, 0xc5, 0x7d, 0x78, 0xe4, 0x48, 0xdd, 0x87, 0x77, 0x60, 0xba, 0x4a, + 0x02, 0x97, 0xa5, 0xa8, 0xae, 0xc7, 0xe7, 0xd3, 0x3a, 0x14, 0x83, 0xc4, 0x89, 0xdc, 0x57, 0xa4, + 0x41, 0x2d, 0x42, 0xbd, 0x3c, 0x81, 0x63, 0x42, 0xf6, 0xff, 0xb6, 0x60, 0x58, 0x38, 0xbc, 0x9c, + 0x00, 0xd7, 0xb8, 0x60, 0x68, 0x12, 0xe6, 0xd2, 0x07, 0x8c, 0x75, 0x26, 0x53, 0x87, 0x50, 0x4e, + 0xe8, 0x10, 0x1e, 0xeb, 0x46, 0xa4, 0xbb, 0xf6, 0xe0, 0x6f, 0xe4, 0x29, 0xf7, 0x6e, 0xb8, 0x5e, + 0x1e, 0xff, 0x10, 0xac, 0xc1, 0x70, 0x28, 0x5c, 0xff, 0x72, 0xd9, 0xb6, 0xea, 0xc9, 0x49, 0x8c, + 0xed, 0xd8, 0x84, 0xb3, 0x9f, 0x24, 0x92, 0xea, 0x53, 0x98, 0x3f, 0x46, 0x9f, 0xc2, 0x5e, 0xce, + 0xa9, 0x03, 0x47, 0xe1, 0x9c, 0x6a, 0x7f, 0x99, 0xdd, 0x9c, 0x7a, 0xf9, 0x09, 0x30, 0x55, 0xd7, + 0xcc, 0x3b, 0xd6, 0xee, 0xb2, 0xb2, 0x44, 0xa7, 0x32, 0x98, 0xab, 0x9f, 0xb3, 0xe0, 0x7c, 0xca, + 0x57, 0x69, 0x9c, 0xd6, 0x53, 0x50, 0x70, 0xda, 0x75, 0x57, 0xed, 0x65, 0x4d, 0x9f, 0xb8, 0x20, + 0xca, 0xb1, 0xc2, 0x40, 0x4b, 0x30, 0x45, 0xee, 0xb7, 0x5c, 0xae, 0x4a, 0xd5, 0x8d, 0x4d, 0xf3, + 0xdc, 0x4b, 0x6a, 0x39, 0x09, 0xc4, 0x9d, 0xf8, 0x2a, 0x20, 0x48, 0x3e, 0x33, 0x20, 0xc8, 0xdf, + 0xb7, 0x60, 0x44, 0x39, 0xbf, 0x1d, 0xfb, 0x68, 0x7f, 0xd2, 0x1c, 0xed, 0x47, 0xbb, 0x8c, 0x76, + 0xc6, 0x30, 0xff, 0x76, 0x4e, 0xf5, 0xb7, 0xe2, 0x07, 0x51, 0x1f, 0x1c, 0xdc, 0x4b, 0x50, 0x68, + 0x05, 0x7e, 0xe4, 0xd7, 0xfc, 0x86, 0x60, 0xe0, 0xce, 0xc5, 0x91, 0x71, 0x78, 0xf9, 0x81, 0xf6, + 0x1b, 0x2b, 0x6c, 0xca, 0x3b, 0x39, 0xad, 0x96, 0x04, 0x48, 0x1b, 0x34, 0x16, 0x37, 0x36, 0x2e, + 0xc6, 0x3a, 0x0e, 0x1b, 0x70, 0x3f, 0x88, 0x04, 0x9f, 0x15, 0x0f, 0xb8, 0x1f, 0x44, 0x98, 0x41, + 0x50, 0x1d, 0x20, 0x72, 0x82, 0x2d, 0x12, 0xd1, 0x32, 0x11, 0xbc, 0x2b, 0xfb, 0xbc, 0x69, 0x47, + 0x6e, 0x63, 0xde, 0xf5, 0xa2, 0x30, 0x0a, 0xe6, 0xcb, 0x5e, 0x74, 0x2b, 0xe0, 0x4f, 0x48, 0x2d, + 0x3a, 0x8e, 0xa2, 0x85, 0x35, 0xba, 0xd2, 0xd1, 0x9b, 0xb5, 0x31, 0x68, 0x1a, 0x33, 0xac, 0x89, + 0x72, 0xac, 0x30, 0xec, 0x17, 0xd9, 0xed, 0xc3, 0xc6, 0xf4, 0x70, 0xe1, 0x64, 0x7e, 0xa9, 0xa8, + 0x66, 0x83, 0x69, 0x32, 0x4b, 0x7a, 0xd0, 0x9a, 0xee, 0x87, 0x3d, 0x6d, 0x58, 0xf7, 0xd7, 0x8a, + 0x23, 0xdb, 0xa0, 0x6f, 0xe9, 0x30, 0x50, 0x79, 0xba, 0xc7, 0xad, 0x71, 0x08, 0x93, 0x14, 0x96, + 0x44, 0x82, 0x85, 0xd8, 0x2f, 0x57, 0xc4, 0xbe, 0xd0, 0x92, 0x48, 0x08, 0x00, 0x8e, 0x71, 0xd0, + 0x55, 0x21, 0x20, 0xe0, 0x72, 0xfe, 0x47, 0x13, 0x02, 0x02, 0xf9, 0xf9, 0x9a, 0x54, 0xe7, 0x19, + 0x18, 0x51, 0x29, 0x54, 0x2b, 0x3c, 0x33, 0xa7, 0x58, 0x36, 0xcb, 0x71, 0x31, 0xd6, 0x71, 0xd0, + 0x3a, 0x4c, 0x84, 0x5c, 0x6e, 0xa6, 0x22, 0xd6, 0x72, 0xf9, 0xe3, 0x47, 0xa5, 0x55, 0x4f, 0xd5, + 0x04, 0x1f, 0xb0, 0x22, 0x7e, 0xda, 0x48, 0xe7, 0xea, 0x24, 0x09, 0xf4, 0x1a, 0x8c, 0x37, 0x7c, + 0xa7, 0xbe, 0xe8, 0x34, 0x1c, 0xaf, 0xc6, 0xbe, 0xb7, 0x60, 0x66, 0xe2, 0xbb, 0x69, 0x40, 0x71, + 0x02, 0x9b, 0x32, 0x63, 0x7a, 0x89, 0x88, 0xb2, 0xec, 0x78, 0x5b, 0x24, 0x14, 0x09, 0x31, 0x19, + 0x33, 0x76, 0x33, 0x03, 0x07, 0x67, 0xd6, 0x46, 0x2f, 0xc1, 0xa8, 0xfc, 0x7c, 0x2d, 0x16, 0x41, + 0xec, 0xc8, 0xa0, 0xc1, 0xb0, 0x81, 0x89, 0xee, 0xc1, 0x69, 0xf9, 0x7f, 0x3d, 0x70, 0x36, 0x37, + 0xdd, 0x9a, 0x70, 0xd0, 0xe5, 0x5e, 0x86, 0x0b, 0xd2, 0x15, 0x6e, 0x39, 0x0d, 0xe9, 0x60, 0x7f, + 0xee, 0xa2, 0x18, 0xb5, 0x54, 0x38, 0x9b, 0xc4, 0x74, 0xfa, 0x68, 0x15, 0xa6, 0xb7, 0x89, 0xd3, + 0x88, 0xb6, 0x97, 0xb6, 0x49, 0x6d, 0x47, 0x6e, 0x22, 0x16, 0xe1, 0x40, 0x33, 0xff, 0xbf, 0xde, + 0x89, 0x82, 0xd3, 0xea, 0xa1, 0xb7, 0x60, 0xa6, 0xd5, 0xde, 0x68, 0xb8, 0xe1, 0xf6, 0x9a, 0x1f, + 0x31, 0xd3, 0x1e, 0x95, 0x91, 0x55, 0x84, 0x42, 0x50, 0x31, 0x24, 0x2a, 0x19, 0x78, 0x38, 0x93, + 0x02, 0x7a, 0x17, 0x4e, 0x27, 0x16, 0x83, 0x70, 0x06, 0x1f, 0xcf, 0x8e, 0x59, 0x5f, 0x4d, 0xab, + 0x20, 0xe2, 0x2a, 0xa4, 0x81, 0x70, 0x7a, 0x13, 0xe8, 0x79, 0x28, 0xb8, 0xad, 0x15, 0xa7, 0xe9, + 0x36, 0xf6, 0x58, 0xd0, 0xfd, 0x22, 0x0b, 0x44, 0x5f, 0x28, 0x57, 0x78, 0xd9, 0x81, 0xf6, 0x1b, + 0x2b, 0x4c, 0xfa, 0x04, 0xd1, 0x42, 0x8b, 0x86, 0x33, 0x93, 0xb1, 0xe5, 0xb2, 0x16, 0x7f, 0x34, + 0xc4, 0x06, 0xd6, 0x7b, 0x33, 0x08, 0x7b, 0x87, 0x56, 0xd6, 0x78, 0x46, 0xf4, 0x39, 0x18, 0xd5, + 0x57, 0xac, 0xb8, 0xff, 0x2e, 0xa7, 0xb3, 0x54, 0xda, 0xca, 0xe6, 0x1c, 0xa7, 0x5a, 0xbd, 0x3a, + 0x0c, 0x1b, 0x14, 0x6d, 0x02, 0xe9, 0x63, 0x89, 0x6e, 0x42, 0xa1, 0xd6, 0x70, 0x89, 0x17, 0x95, + 0x2b, 0xdd, 0xa2, 0x62, 0x2d, 0x09, 0x1c, 0x31, 0x39, 0x22, 0xa0, 0x38, 0x2f, 0xc3, 0x8a, 0x82, + 0xfd, 0xab, 0x39, 0x98, 0xeb, 0x11, 0x9d, 0x3e, 0xa1, 0xb7, 0xb0, 0xfa, 0xd2, 0x5b, 0x2c, 0xc8, + 0x5c, 0xb6, 0x6b, 0x09, 0x91, 0x48, 0x22, 0x4f, 0x6d, 0x2c, 0x18, 0x49, 0xe2, 0xf7, 0x6d, 0x47, + 0xae, 0xab, 0x3e, 0x06, 0x7a, 0x7a, 0x42, 0x18, 0x2a, 0xcf, 0xc1, 0xfe, 0xdf, 0x49, 0x99, 0xea, + 0x2b, 0xfb, 0xcb, 0x39, 0x38, 0xad, 0x86, 0xf0, 0x1b, 0x77, 0xe0, 0x6e, 0x77, 0x0e, 0xdc, 0x11, + 0x28, 0xff, 0xec, 0x5b, 0x30, 0xc4, 0xc3, 0x7c, 0xf5, 0xc1, 0x9f, 0x5d, 0x32, 0x23, 0x62, 0x2a, + 0x96, 0xc0, 0x88, 0x8a, 0xf9, 0x3d, 0x16, 0x4c, 0xac, 0x2f, 0x55, 0xaa, 0x7e, 0x6d, 0x87, 0x44, + 0x0b, 0x9c, 0x9f, 0xc6, 0x82, 0xd7, 0xb2, 0x1e, 0x92, 0x87, 0x4a, 0xe3, 0xce, 0x2e, 0xc2, 0xc0, + 0xb6, 0x1f, 0x46, 0x49, 0xcb, 0x80, 0xeb, 0x7e, 0x18, 0x61, 0x06, 0xb1, 0x7f, 0xd7, 0x82, 0x41, + 0x96, 0xbd, 0x5d, 0x4a, 0x91, 0xad, 0x0c, 0x29, 0x72, 0x3f, 0xdf, 0x85, 0x5e, 0x80, 0x21, 0xb2, + 0xb9, 0x49, 0x6a, 0x91, 0x98, 0x55, 0xe9, 0xca, 0x3d, 0xb4, 0xcc, 0x4a, 0x29, 0x83, 0xc1, 0x1a, + 0xe3, 0x7f, 0xb1, 0x40, 0x46, 0x77, 0xa1, 0x18, 0xb9, 0x4d, 0xb2, 0x50, 0xaf, 0x0b, 0xdd, 0xea, + 0x43, 0xb8, 0xa3, 0xaf, 0x4b, 0x02, 0x38, 0xa6, 0x65, 0x7f, 0x31, 0x07, 0x10, 0xc7, 0x47, 0xe9, + 0xf5, 0x89, 0x8b, 0x1d, 0x5a, 0xb7, 0xcb, 0x29, 0x5a, 0x37, 0x14, 0x13, 0x4c, 0x51, 0xb9, 0xa9, + 0x61, 0xca, 0xf7, 0x35, 0x4c, 0x03, 0x87, 0x19, 0xa6, 0x25, 0x98, 0x8a, 0xe3, 0xbb, 0x98, 0xe1, + 0xad, 0xd8, 0x1b, 0x6a, 0x3d, 0x09, 0xc4, 0x9d, 0xf8, 0x36, 0x81, 0x8b, 0x2a, 0xcc, 0x85, 0xb8, + 0x6b, 0x98, 0xe9, 0xae, 0xae, 0xc5, 0xec, 0x31, 0x4e, 0xb1, 0x5a, 0x31, 0x97, 0xa9, 0x56, 0xfc, + 0x71, 0x0b, 0x4e, 0x25, 0xdb, 0x61, 0xbe, 0x94, 0x5f, 0xb0, 0xe0, 0x34, 0x53, 0xae, 0xb2, 0x56, + 0x3b, 0x55, 0xb9, 0xcf, 0x77, 0x0d, 0xdd, 0x91, 0xd1, 0xe3, 0x38, 0x66, 0xc0, 0x6a, 0x1a, 0x69, + 0x9c, 0xde, 0xa2, 0xfd, 0x1f, 0x72, 0x30, 0x93, 0x15, 0xf3, 0x83, 0x59, 0xf6, 0x3b, 0xf7, 0xab, + 0x3b, 0xe4, 0x9e, 0xb0, 0x9f, 0x8e, 0x2d, 0xfb, 0x79, 0x31, 0x96, 0xf0, 0x64, 0xc0, 0xf1, 0x5c, + 0x7f, 0x01, 0xc7, 0xd1, 0x36, 0x4c, 0xdd, 0xdb, 0x26, 0xde, 0x6d, 0x2f, 0x74, 0x22, 0x37, 0xdc, + 0x74, 0x99, 0x22, 0x92, 0xaf, 0x9b, 0x97, 0xa5, 0x95, 0xf3, 0xdd, 0x24, 0xc2, 0xc1, 0xfe, 0xdc, + 0x79, 0xa3, 0x20, 0xee, 0x32, 0x3f, 0x48, 0x70, 0x27, 0xd1, 0xce, 0x78, 0xed, 0x03, 0xc7, 0x18, + 0xaf, 0xdd, 0xfe, 0x82, 0x05, 0x67, 0x33, 0xf3, 0x29, 0xa2, 0x2b, 0x50, 0x70, 0x5a, 0x2e, 0x97, + 0xe5, 0x8a, 0x63, 0x94, 0xc9, 0x0c, 0x2a, 0x65, 0x2e, 0xc9, 0x55, 0x50, 0x95, 0xe7, 0x39, 0x97, + 0x99, 0xe7, 0xb9, 0x67, 0xda, 0x66, 0xfb, 0xbb, 0x2d, 0x10, 0x5e, 0x89, 0x7d, 0x9c, 0xdd, 0x6f, + 0xca, 0x34, 0xf9, 0x46, 0x4e, 0x97, 0x8b, 0xd9, 0x6e, 0x9a, 0x22, 0x93, 0x8b, 0xe2, 0x95, 0x8c, + 0xfc, 0x2d, 0x06, 0x2d, 0xbb, 0x0e, 0x02, 0x5a, 0x22, 0x4c, 0x52, 0xd9, 0xbb, 0x37, 0xcf, 0x02, + 0xd4, 0x19, 0xae, 0x96, 0x2c, 0x5b, 0xdd, 0xcc, 0x25, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x6f, 0x73, + 0x30, 0x22, 0x73, 0x88, 0xb4, 0xbd, 0x7e, 0xe4, 0x09, 0x87, 0x4a, 0x2a, 0xc8, 0xb2, 0xcb, 0x53, + 0xc2, 0x95, 0x58, 0x0c, 0x13, 0x67, 0x97, 0x97, 0x00, 0x1c, 0xe3, 0xd0, 0x5d, 0x14, 0xb6, 0x37, + 0x18, 0x7a, 0xc2, 0x87, 0xae, 0xca, 0x8b, 0xb1, 0x84, 0xa3, 0x4f, 0xc1, 0x24, 0xaf, 0x17, 0xf8, + 0x2d, 0x67, 0x8b, 0x0b, 0xc9, 0x07, 0x95, 0xf3, 0xfb, 0xe4, 0x6a, 0x02, 0x76, 0xb0, 0x3f, 0x77, + 0x2a, 0x59, 0xc6, 0xb4, 0x3f, 0x1d, 0x54, 0x98, 0x2d, 0x0c, 0x6f, 0x84, 0xee, 0xfe, 0x0e, 0x13, + 0x9a, 0x18, 0x84, 0x75, 0x3c, 0xfb, 0x73, 0x80, 0x3a, 0xb3, 0xa9, 0xa0, 0xd7, 0xb9, 0x01, 0xa4, + 0x1b, 0x90, 0x7a, 0x37, 0x6d, 0x90, 0xee, 0xe2, 0x2d, 0xdd, 0x5f, 0x78, 0x2d, 0xac, 0xea, 0xdb, + 0x7f, 0x25, 0x0f, 0x93, 0x49, 0x87, 0x5f, 0x74, 0x1d, 0x86, 0x38, 0xeb, 0x21, 0xc8, 0x77, 0x31, + 0x36, 0xd0, 0xdc, 0x84, 0xd9, 0x21, 0x2c, 0xb8, 0x17, 0x51, 0x1f, 0xbd, 0x05, 0x23, 0x75, 0xff, + 0x9e, 0x77, 0xcf, 0x09, 0xea, 0x0b, 0x95, 0xb2, 0x58, 0xce, 0xa9, 0xaf, 0xa5, 0x52, 0x8c, 0xa6, + 0xbb, 0x1e, 0x33, 0xc5, 0x5a, 0x0c, 0xc2, 0x3a, 0x39, 0xb4, 0xce, 0x82, 0x3f, 0x6f, 0xba, 0x5b, + 0xab, 0x4e, 0xab, 0x9b, 0x35, 0xfc, 0x92, 0x44, 0xd2, 0x28, 0x8f, 0x89, 0x08, 0xd1, 0x1c, 0x80, + 0x63, 0x42, 0xe8, 0x5b, 0x61, 0x3a, 0xcc, 0x90, 0xc9, 0x66, 0x25, 0xd7, 0xea, 0x26, 0xa6, 0x5c, + 0x7c, 0x84, 0xbe, 0x63, 0xd3, 0xa4, 0xb7, 0x69, 0xcd, 0xd8, 0xbf, 0x36, 0x0d, 0xc6, 0x26, 0x36, + 0x72, 0x2d, 0x5a, 0x47, 0x94, 0x6b, 0x11, 0x43, 0x81, 0x34, 0x5b, 0xd1, 0x5e, 0xc9, 0x0d, 0xba, + 0x25, 0xeb, 0x5d, 0x16, 0x38, 0x9d, 0x34, 0x25, 0x04, 0x2b, 0x3a, 0xe9, 0x09, 0x31, 0xf3, 0x5f, + 0xc3, 0x84, 0x98, 0x03, 0x27, 0x98, 0x10, 0x73, 0x0d, 0x86, 0xb7, 0xdc, 0x08, 0x93, 0x96, 0x2f, + 0x98, 0xfe, 0xd4, 0x75, 0x78, 0x8d, 0xa3, 0x74, 0xa6, 0x5e, 0x13, 0x00, 0x2c, 0x89, 0xa0, 0xd7, + 0xd5, 0x0e, 0x1c, 0xca, 0x7e, 0x33, 0x77, 0x6a, 0xc5, 0x53, 0xf7, 0xa0, 0x48, 0x7b, 0x39, 0xfc, + 0xb0, 0x69, 0x2f, 0x57, 0x64, 0xb2, 0xca, 0x42, 0xb6, 0xeb, 0x0a, 0xcb, 0x45, 0xd9, 0x23, 0x45, + 0xe5, 0x1d, 0x3d, 0xc1, 0x67, 0x31, 0xfb, 0x24, 0x50, 0xb9, 0x3b, 0xfb, 0x4c, 0xeb, 0xf9, 0xdd, + 0x16, 0x9c, 0x6e, 0xa5, 0xe5, 0xba, 0x15, 0x0a, 0xe4, 0x17, 0xfa, 0x4e, 0xe6, 0x6b, 0x34, 0xc8, + 0x04, 0x35, 0xa9, 0x68, 0x38, 0xbd, 0x39, 0x3a, 0xd0, 0xc1, 0x46, 0x5d, 0x28, 0x32, 0x2f, 0x65, + 0xe4, 0x07, 0xed, 0x92, 0x15, 0x74, 0x3d, 0x25, 0x17, 0xe5, 0x87, 0xb3, 0x72, 0x51, 0xf6, 0x9d, + 0x81, 0xf2, 0x75, 0x95, 0x19, 0x74, 0x2c, 0x7b, 0x29, 0xf1, 0xbc, 0x9f, 0x3d, 0xf3, 0x81, 0xbe, + 0xae, 0xf2, 0x81, 0x76, 0x89, 0xec, 0xc9, 0xb3, 0x7d, 0xf6, 0xcc, 0x02, 0xaa, 0x65, 0xf2, 0x9c, + 0x38, 0x9a, 0x4c, 0x9e, 0xc6, 0x55, 0xc3, 0x93, 0x49, 0x3e, 0xd9, 0xe3, 0xaa, 0x31, 0xe8, 0x76, + 0xbf, 0x6c, 0x78, 0xd6, 0xd2, 0xa9, 0x87, 0xca, 0x5a, 0x7a, 0x47, 0xcf, 0x02, 0x8a, 0x7a, 0xa4, + 0xb9, 0xa4, 0x48, 0x7d, 0xe6, 0xfe, 0xbc, 0xa3, 0x5f, 0x80, 0xd3, 0xd9, 0x74, 0xd5, 0x3d, 0xd7, + 0x49, 0x37, 0xf5, 0x0a, 0xec, 0xc8, 0x29, 0x7a, 0xea, 0x64, 0x72, 0x8a, 0x9e, 0x3e, 0xf2, 0x9c, + 0xa2, 0x67, 0x4e, 0x20, 0xa7, 0xe8, 0x23, 0x27, 0x98, 0x53, 0xf4, 0x0e, 0xb3, 0xba, 0xe0, 0xb1, + 0x5d, 0x44, 0x24, 0xd2, 0xf4, 0xa8, 0x97, 0x69, 0x01, 0x60, 0xf8, 0xc7, 0x29, 0x10, 0x8e, 0x49, + 0xa5, 0xe4, 0x2a, 0x9d, 0x39, 0x86, 0x5c, 0xa5, 0x6b, 0x71, 0xae, 0xd2, 0xb3, 0xd9, 0x53, 0x9d, + 0x62, 0xa7, 0x9f, 0x91, 0xa1, 0xf4, 0x8e, 0x9e, 0x59, 0xf4, 0xd1, 0x2e, 0xa2, 0xf8, 0x34, 0xc1, + 0x63, 0x97, 0x7c, 0xa2, 0xaf, 0xf1, 0x7c, 0xa2, 0xe7, 0xb2, 0x4f, 0xf2, 0xe4, 0x75, 0x67, 0x66, + 0x11, 0xfd, 0xde, 0x1c, 0x5c, 0xe8, 0xbe, 0x2f, 0x62, 0xa9, 0x67, 0x25, 0xd6, 0x08, 0x26, 0xa4, + 0x9e, 0xfc, 0x6d, 0x15, 0x63, 0xf5, 0x1d, 0xf6, 0xeb, 0x1a, 0x4c, 0x29, 0x43, 0xfc, 0x86, 0x5b, + 0xdb, 0x5b, 0x8b, 0x5f, 0xa8, 0xca, 0x79, 0xb9, 0x9a, 0x44, 0xc0, 0x9d, 0x75, 0xd0, 0x02, 0x4c, + 0x18, 0x85, 0xe5, 0x92, 0x78, 0x43, 0x29, 0x31, 0x6b, 0xd5, 0x04, 0xe3, 0x24, 0xbe, 0xfd, 0x25, + 0x0b, 0x1e, 0xc9, 0x48, 0xd7, 0xd5, 0x77, 0x54, 0xab, 0x4d, 0x98, 0x68, 0x99, 0x55, 0x7b, 0x04, + 0xbf, 0x33, 0x92, 0x82, 0xa9, 0xbe, 0x26, 0x00, 0x38, 0x49, 0xd4, 0xfe, 0x33, 0x0b, 0xce, 0x77, + 0xb5, 0x2c, 0x43, 0x18, 0xce, 0x6c, 0x35, 0x43, 0x67, 0x29, 0x20, 0x75, 0xe2, 0x45, 0xae, 0xd3, + 0xa8, 0xb6, 0x48, 0x4d, 0x93, 0x5b, 0x33, 0x13, 0xad, 0x6b, 0xab, 0xd5, 0x85, 0x4e, 0x0c, 0x9c, + 0x51, 0x13, 0xad, 0x00, 0xea, 0x84, 0x88, 0x19, 0x66, 0x51, 0x76, 0x3b, 0xe9, 0xe1, 0x94, 0x1a, + 0xe8, 0x45, 0x18, 0x53, 0x16, 0x6b, 0xda, 0x8c, 0xb3, 0x03, 0x18, 0xeb, 0x00, 0x6c, 0xe2, 0x2d, + 0x5e, 0xf9, 0x8d, 0xdf, 0xbf, 0xf0, 0xa1, 0xdf, 0xfa, 0xfd, 0x0b, 0x1f, 0xfa, 0x9d, 0xdf, 0xbf, + 0xf0, 0xa1, 0x6f, 0x7f, 0x70, 0xc1, 0xfa, 0x8d, 0x07, 0x17, 0xac, 0xdf, 0x7a, 0x70, 0xc1, 0xfa, + 0x9d, 0x07, 0x17, 0xac, 0xdf, 0x7b, 0x70, 0xc1, 0xfa, 0xe2, 0x1f, 0x5c, 0xf8, 0xd0, 0x9b, 0xb9, + 0xdd, 0x67, 0xfe, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x5a, 0x63, 0x1f, 0xa1, 0x31, 0xff, 0x00, + 0x00, } func (m *AWSElasticBlockStoreVolumeSource) Marshal() (dAtA []byte, err error) { @@ -14519,6 +14553,18 @@ func (m *PodSecurityContext) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SeccompProfile != nil { + { + size, err := m.SeccompProfile.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x52 + } if m.FSGroupChangePolicy != nil { i -= len(*m.FSGroupChangePolicy) copy(dAtA[i:], *m.FSGroupChangePolicy) @@ -16815,6 +16861,41 @@ func (m *ScopedResourceSelectorRequirement) MarshalToSizedBuffer(dAtA []byte) (i return len(dAtA) - i, nil } +func (m *SeccompProfile) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SeccompProfile) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SeccompProfile) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.LocalhostProfile != nil { + i -= len(*m.LocalhostProfile) + copy(dAtA[i:], *m.LocalhostProfile) + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.LocalhostProfile))) + i-- + dAtA[i] = 0x12 + } + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *Secret) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -17218,6 +17299,18 @@ func (m *SecurityContext) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.SeccompProfile != nil { + { + size, err := m.SeccompProfile.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if m.WindowsOptions != nil { { size, err := m.WindowsOptions.MarshalToSizedBuffer(dAtA[:i]) @@ -21941,6 +22034,10 @@ func (m *PodSecurityContext) Size() (n int) { l = len(*m.FSGroupChangePolicy) n += 1 + l + sovGenerated(uint64(l)) } + if m.SeccompProfile != nil { + l = m.SeccompProfile.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -22733,6 +22830,21 @@ func (m *ScopedResourceSelectorRequirement) Size() (n int) { return n } +func (m *SeccompProfile) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + if m.LocalhostProfile != nil { + l = len(*m.LocalhostProfile) + n += 1 + l + sovGenerated(uint64(l)) + } + return n +} + func (m *Secret) Size() (n int) { if m == nil { return 0 @@ -22912,6 +23024,10 @@ func (m *SecurityContext) Size() (n int) { l = m.WindowsOptions.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.SeccompProfile != nil { + l = m.SeccompProfile.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -25705,6 +25821,7 @@ func (this *PodSecurityContext) String() string { `Sysctls:` + repeatedStringForSysctls + `,`, `WindowsOptions:` + strings.Replace(this.WindowsOptions.String(), "WindowsSecurityContextOptions", "WindowsSecurityContextOptions", 1) + `,`, `FSGroupChangePolicy:` + valueToStringGenerated(this.FSGroupChangePolicy) + `,`, + `SeccompProfile:` + strings.Replace(this.SeccompProfile.String(), "SeccompProfile", "SeccompProfile", 1) + `,`, `}`, }, "") return s @@ -26349,6 +26466,17 @@ func (this *ScopedResourceSelectorRequirement) String() string { }, "") return s } +func (this *SeccompProfile) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&SeccompProfile{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `LocalhostProfile:` + valueToStringGenerated(this.LocalhostProfile) + `,`, + `}`, + }, "") + return s +} func (this *Secret) String() string { if this == nil { return "nil" @@ -26483,6 +26611,7 @@ func (this *SecurityContext) String() string { `RunAsGroup:` + valueToStringGenerated(this.RunAsGroup) + `,`, `ProcMount:` + valueToStringGenerated(this.ProcMount) + `,`, `WindowsOptions:` + strings.Replace(this.WindowsOptions.String(), "WindowsSecurityContextOptions", "WindowsSecurityContextOptions", 1) + `,`, + `SeccompProfile:` + strings.Replace(this.SeccompProfile.String(), "SeccompProfile", "SeccompProfile", 1) + `,`, `}`, }, "") return s @@ -51849,6 +51978,42 @@ func (m *PodSecurityContext) Unmarshal(dAtA []byte) error { s := PodFSGroupChangePolicy(dAtA[iNdEx:postIndex]) m.FSGroupChangePolicy = &s iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SeccompProfile", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SeccompProfile == nil { + m.SeccompProfile = &SeccompProfile{} + } + if err := m.SeccompProfile.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -59329,6 +59494,124 @@ func (m *ScopedResourceSelectorRequirement) Unmarshal(dAtA []byte) error { } return nil } +func (m *SeccompProfile) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SeccompProfile: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SeccompProfile: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = SeccompProfileType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LocalhostProfile", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := string(dAtA[iNdEx:postIndex]) + m.LocalhostProfile = &s + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Secret) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -60801,6 +61084,42 @@ func (m *SecurityContext) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SeccompProfile", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SeccompProfile == nil { + m.SeccompProfile = &SeccompProfile{} + } + if err := m.SeccompProfile.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.proto index 7978ef05ef19..fa35727c4397 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.proto +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/generated.proto @@ -3293,6 +3293,10 @@ message PodSecurityContext { // Valid values are "OnRootMismatch" and "Always". If not specified defaults to "Always". // +optional optional string fsGroupChangePolicy = 9; + + // The seccomp options to use by the containers in this pod. + // +optional + optional SeccompProfile seccompProfile = 10; } // Describes the class of pods that should avoid this node. @@ -4301,6 +4305,27 @@ message ScopedResourceSelectorRequirement { repeated string values = 3; } +// SeccompProfile defines a pod/container's seccomp profile settings. +// Only one profile source may be set. +// +union +message SeccompProfile { + // type indicates which kind of seccomp profile will be applied. + // Valid options are: + // + // Localhost - a profile defined in a file on the node should be used. + // RuntimeDefault - the container runtime default profile should be used. + // Unconfined - no profile should be applied. + // +unionDiscriminator + optional string type = 1; + + // localhostProfile indicates a profile defined in a file on the node should be used. + // The profile must be preconfigured on the node to work. + // Must be a descending path, relative to the kubelet's configured seccomp profile location. + // Must only be set if type is "Localhost". + // +optional + optional string localhostProfile = 2; +} + // Secret holds secret data of a certain type. The total bytes of the values in // the Data field must be less than MaxSecretSize bytes. message Secret { @@ -4519,6 +4544,12 @@ message SecurityContext { // This requires the ProcMountType feature flag to be enabled. // +optional optional string procMount = 9; + + // The seccomp options to use by this container. If seccomp options are + // provided at both the pod & container level, the container options + // override the pod options. + // +optional + optional SeccompProfile seccompProfile = 11; } // SerializedReference is a reference to serialized object. @@ -4808,13 +4839,21 @@ message ServiceSpec { // +optional optional SessionAffinityConfig sessionAffinityConfig = 14; - // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. - // IPv6). If a specific IP family is requested, the clusterIP field will be allocated from that family, if it is - // available in the cluster. If no IP family is requested, the cluster's primary IP family will be used. - // Other IP fields (loadBalancerIP, loadBalancerSourceRanges, externalIPs) and controllers which - // allocate external load-balancers should use the same IP family. Endpoints for this Service will be of - // this family. This field is immutable after creation. Assigning a ServiceIPFamily not available in the - // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. + // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. + // IPv4 vs. IPv6) when the IPv6DualStack feature gate is enabled. In a dual-stack cluster, + // you can specify ipFamily when creating a ClusterIP Service to determine whether the + // controller will allocate an IPv4 or IPv6 IP for it, and you can specify ipFamily when + // creating a headless Service to determine whether it will have IPv4 or IPv6 Endpoints. In + // either case, if you do not specify an ipFamily explicitly, it will default to the + // cluster's primary IP family. + // This field is part of an alpha feature, and you should not make any assumptions about its + // semantics other than those described above. In particular, you should not assume that it + // can (or cannot) be changed after creation time; that it can only have the values "IPv4" + // and "IPv6"; or that its current value on a given Service correctly reflects the current + // state of that Service. (For ClusterIP Services, look at clusterIP to see if the Service + // is IPv4 or IPv6. For headless Services, look at the endpoints, which may be dual-stack in + // the future. For ExternalName Services, ipFamily has no meaning, but it may be set to an + // irrelevant value anyway.) // +optional optional string ipFamily = 15; @@ -5299,7 +5338,7 @@ message VolumeSource { // +optional optional StorageOSVolumeSource storageos = 27; - // CSI (Container Storage Interface) represents storage that is handled by an external CSI driver (Alpha feature). + // CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). // +optional optional CSIVolumeSource csi = 28; } diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/types.go b/cluster-autoscaler/vendor/k8s.io/api/core/v1/types.go index 2d76331e538f..e8009c4b4184 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/types.go @@ -153,7 +153,7 @@ type VolumeSource struct { // StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. // +optional StorageOS *StorageOSVolumeSource `json:"storageos,omitempty" protobuf:"bytes,27,opt,name=storageos"` - // CSI (Container Storage Interface) represents storage that is handled by an external CSI driver (Alpha feature). + // CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). // +optional CSI *CSIVolumeSource `json:"csi,omitempty" protobuf:"bytes,28,opt,name=csi"` } @@ -3226,8 +3226,45 @@ type PodSecurityContext struct { // Valid values are "OnRootMismatch" and "Always". If not specified defaults to "Always". // +optional FSGroupChangePolicy *PodFSGroupChangePolicy `json:"fsGroupChangePolicy,omitempty" protobuf:"bytes,9,opt,name=fsGroupChangePolicy"` + // The seccomp options to use by the containers in this pod. + // +optional + SeccompProfile *SeccompProfile `json:"seccompProfile,omitempty" protobuf:"bytes,10,opt,name=seccompProfile"` +} + +// SeccompProfile defines a pod/container's seccomp profile settings. +// Only one profile source may be set. +// +union +type SeccompProfile struct { + // type indicates which kind of seccomp profile will be applied. + // Valid options are: + // + // Localhost - a profile defined in a file on the node should be used. + // RuntimeDefault - the container runtime default profile should be used. + // Unconfined - no profile should be applied. + // +unionDiscriminator + Type SeccompProfileType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=SeccompProfileType"` + // localhostProfile indicates a profile defined in a file on the node should be used. + // The profile must be preconfigured on the node to work. + // Must be a descending path, relative to the kubelet's configured seccomp profile location. + // Must only be set if type is "Localhost". + // +optional + LocalhostProfile *string `json:"localhostProfile,omitempty" protobuf:"bytes,2,opt,name=localhostProfile"` } +// SeccompProfileType defines the supported seccomp profile types. +type SeccompProfileType string + +const ( + // SeccompProfileTypeUnconfined indicates no seccomp profile is applied (A.K.A. unconfined). + SeccompProfileTypeUnconfined SeccompProfileType = "Unconfined" + // SeccompProfileTypeRuntimeDefault represents the default container runtime seccomp profile. + SeccompProfileTypeRuntimeDefault SeccompProfileType = "RuntimeDefault" + // SeccompProfileTypeLocalhost indicates a profile defined in a file on the node should be used. + // The file's location is based off the kubelet's deprecated flag --seccomp-profile-root. + // Once the flag support is removed the location will be /seccomp. + SeccompProfileTypeLocalhost SeccompProfileType = "Localhost" +) + // PodQOSClass defines the supported qos classes of Pods. type PodQOSClass string @@ -3993,13 +4030,21 @@ type ServiceSpec struct { // +optional SessionAffinityConfig *SessionAffinityConfig `json:"sessionAffinityConfig,omitempty" protobuf:"bytes,14,opt,name=sessionAffinityConfig"` - // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. - // IPv6). If a specific IP family is requested, the clusterIP field will be allocated from that family, if it is - // available in the cluster. If no IP family is requested, the cluster's primary IP family will be used. - // Other IP fields (loadBalancerIP, loadBalancerSourceRanges, externalIPs) and controllers which - // allocate external load-balancers should use the same IP family. Endpoints for this Service will be of - // this family. This field is immutable after creation. Assigning a ServiceIPFamily not available in the - // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. + // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. + // IPv4 vs. IPv6) when the IPv6DualStack feature gate is enabled. In a dual-stack cluster, + // you can specify ipFamily when creating a ClusterIP Service to determine whether the + // controller will allocate an IPv4 or IPv6 IP for it, and you can specify ipFamily when + // creating a headless Service to determine whether it will have IPv4 or IPv6 Endpoints. In + // either case, if you do not specify an ipFamily explicitly, it will default to the + // cluster's primary IP family. + // This field is part of an alpha feature, and you should not make any assumptions about its + // semantics other than those described above. In particular, you should not assume that it + // can (or cannot) be changed after creation time; that it can only have the values "IPv4" + // and "IPv6"; or that its current value on a given Service correctly reflects the current + // state of that Service. (For ClusterIP Services, look at clusterIP to see if the Service + // is IPv4 or IPv6. For headless Services, look at the endpoints, which may be dual-stack in + // the future. For ExternalName Services, ipFamily has no meaning, but it may be set to an + // irrelevant value anyway.) // +optional IPFamily *IPFamily `json:"ipFamily,omitempty" protobuf:"bytes,15,opt,name=ipFamily,Configcasttype=IPFamily"` @@ -5850,6 +5895,11 @@ type SecurityContext struct { // This requires the ProcMountType feature flag to be enabled. // +optional ProcMount *ProcMountType `json:"procMount,omitempty" protobuf:"bytes,9,opt,name=procMount"` + // The seccomp options to use by this container. If seccomp options are + // provided at both the pod & container level, the container options + // override the pod options. + // +optional + SeccompProfile *SeccompProfile `json:"seccompProfile,omitempty" protobuf:"bytes,11,opt,name=seccompProfile"` } type ProcMountType string diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go index 79360f7d3577..08bf722d631f 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1583,6 +1583,7 @@ var map_PodSecurityContext = map[string]string{ "fsGroup": "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod:\n\n1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw ", "sysctls": "Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch.", "fsGroupChangePolicy": "fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are \"OnRootMismatch\" and \"Always\". If not specified defaults to \"Always\".", + "seccompProfile": "The seccomp options to use by the containers in this pod.", } func (PodSecurityContext) SwaggerDoc() map[string]string { @@ -2015,6 +2016,16 @@ func (ScopedResourceSelectorRequirement) SwaggerDoc() map[string]string { return map_ScopedResourceSelectorRequirement } +var map_SeccompProfile = map[string]string{ + "": "SeccompProfile defines a pod/container's seccomp profile settings. Only one profile source may be set.", + "type": "type indicates which kind of seccomp profile will be applied. Valid options are:\n\nLocalhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied.", + "localhostProfile": "localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is \"Localhost\".", +} + +func (SeccompProfile) SwaggerDoc() map[string]string { + return map_SeccompProfile +} + var map_Secret = map[string]string{ "": "Secret holds secret data of a certain type. The total bytes of the values in the Data field must be less than MaxSecretSize bytes.", "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", @@ -2101,6 +2112,7 @@ var map_SecurityContext = map[string]string{ "readOnlyRootFilesystem": "Whether this container has a read-only root filesystem. Default is false.", "allowPrivilegeEscalation": "AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN", "procMount": "procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled.", + "seccompProfile": "The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options.", } func (SecurityContext) SwaggerDoc() map[string]string { @@ -2208,7 +2220,7 @@ var map_ServiceSpec = map[string]string{ "healthCheckNodePort": "healthCheckNodePort specifies the healthcheck nodePort for the service. If not specified, HealthCheckNodePort is created by the service api backend with the allocated nodePort. Will use user-specified nodePort value if specified by the client. Only effects when Type is set to LoadBalancer and ExternalTrafficPolicy is set to Local.", "publishNotReadyAddresses": "publishNotReadyAddresses indicates that any agent which deals with endpoints for this Service should disregard any indications of ready/not-ready. The primary use case for setting this field is for a StatefulSet's Headless Service to propagate SRV DNS records for its Pods for the purpose of peer discovery. The Kubernetes controllers that generate Endpoints and EndpointSlice resources for Services interpret this to mean that all endpoints are considered \"ready\" even if the Pods themselves are not. Agents which consume only Kubernetes generated endpoints through the Endpoints or EndpointSlice resources can safely assume this behavior.", "sessionAffinityConfig": "sessionAffinityConfig contains the configurations of session affinity.", - "ipFamily": "ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. IPv6). If a specific IP family is requested, the clusterIP field will be allocated from that family, if it is available in the cluster. If no IP family is requested, the cluster's primary IP family will be used. Other IP fields (loadBalancerIP, loadBalancerSourceRanges, externalIPs) and controllers which allocate external load-balancers should use the same IP family. Endpoints for this Service will be of this family. This field is immutable after creation. Assigning a ServiceIPFamily not available in the cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment.", + "ipFamily": "ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. IPv6) when the IPv6DualStack feature gate is enabled. In a dual-stack cluster, you can specify ipFamily when creating a ClusterIP Service to determine whether the controller will allocate an IPv4 or IPv6 IP for it, and you can specify ipFamily when creating a headless Service to determine whether it will have IPv4 or IPv6 Endpoints. In either case, if you do not specify an ipFamily explicitly, it will default to the cluster's primary IP family. This field is part of an alpha feature, and you should not make any assumptions about its semantics other than those described above. In particular, you should not assume that it can (or cannot) be changed after creation time; that it can only have the values \"IPv4\" and \"IPv6\"; or that its current value on a given Service correctly reflects the current state of that Service. (For ClusterIP Services, look at clusterIP to see if the Service is IPv4 or IPv6. For headless Services, look at the endpoints, which may be dual-stack in the future. For ExternalName Services, ipFamily has no meaning, but it may be set to an irrelevant value anyway.)", "topologyKeys": "topologyKeys is a preference-order list of topology keys which implementations of services should use to preferentially sort endpoints when accessing this Service, it can not be used at the same time as externalTrafficPolicy=Local. Topology keys must be valid label keys and at most 16 keys may be specified. Endpoints are chosen based on the first topology key with available backends. If this field is specified and all entries have no backends that match the topology of the client, the service has no backends for that client and connections should fail. The special value \"*\" may be used to mean \"any topology\". This catch-all value, if used, only makes sense as the last value in the list. If this is not specified or empty, no topology constraints will be applied.", } @@ -2430,7 +2442,7 @@ var map_VolumeSource = map[string]string{ "portworxVolume": "PortworxVolume represents a portworx volume attached and mounted on kubelets host machine", "scaleIO": "ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes.", "storageos": "StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes.", - "csi": "CSI (Container Storage Interface) represents storage that is handled by an external CSI driver (Alpha feature).", + "csi": "CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature).", } func (VolumeSource) SwaggerDoc() map[string]string { diff --git a/cluster-autoscaler/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go index 1924b4309b0f..55ad86885c9c 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -3694,6 +3694,11 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { *out = new(PodFSGroupChangePolicy) **out = **in } + if in.SeccompProfile != nil { + in, out := &in.SeccompProfile, &out.SeccompProfile + *out = new(SeccompProfile) + (*in).DeepCopyInto(*out) + } return } @@ -4680,6 +4685,27 @@ func (in *ScopedResourceSelectorRequirement) DeepCopy() *ScopedResourceSelectorR return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeccompProfile) DeepCopyInto(out *SeccompProfile) { + *out = *in + if in.LocalhostProfile != nil { + in, out := &in.LocalhostProfile, &out.LocalhostProfile + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeccompProfile. +func (in *SeccompProfile) DeepCopy() *SeccompProfile { + if in == nil { + return nil + } + out := new(SeccompProfile) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Secret) DeepCopyInto(out *Secret) { *out = *in @@ -4941,6 +4967,11 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = new(ProcMountType) **out = **in } + if in.SeccompProfile != nil { + in, out := &in.SeccompProfile, &out.SeccompProfile + *out = new(SeccompProfile) + (*in).DeepCopyInto(*out) + } return } diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/BUILD b/cluster-autoscaler/vendor/k8s.io/api/events/v1/BUILD new file mode 100644 index 000000000000..15ecf48bbd82 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/BUILD @@ -0,0 +1,37 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "generated.pb.go", + "register.go", + "types.go", + "types_swagger_doc_generated.go", + "zz_generated.deepcopy.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/api/events/v1", + importpath = "k8s.io/api/events/v1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//vendor/github.com/gogo/protobuf/proto:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/doc.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/doc.go new file mode 100644 index 000000000000..6e320e06340c --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/doc.go @@ -0,0 +1,23 @@ +/* +Copyright 2020 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. +*/ + +// +k8s:deepcopy-gen=package +// +k8s:protobuf-gen=package +// +k8s:openapi-gen=true + +// +groupName=events.k8s.io + +package v1 // import "k8s.io/api/events/v1" diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.pb.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.pb.go new file mode 100644 index 000000000000..717137cffe58 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.pb.go @@ -0,0 +1,1406 @@ +/* +Copyright 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. +*/ + +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: k8s.io/kubernetes/vendor/k8s.io/api/events/v1/generated.proto + +package v1 + +import ( + fmt "fmt" + + io "io" + + proto "github.com/gogo/protobuf/proto" + v11 "k8s.io/api/core/v1" + + math "math" + math_bits "math/bits" + reflect "reflect" + strings "strings" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +func (m *Event) Reset() { *m = Event{} } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_ee2600587b650fac, []int{0} +} +func (m *Event) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(m, src) +} +func (m *Event) XXX_Size() int { + return m.Size() +} +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) +} + +var xxx_messageInfo_Event proto.InternalMessageInfo + +func (m *EventList) Reset() { *m = EventList{} } +func (*EventList) ProtoMessage() {} +func (*EventList) Descriptor() ([]byte, []int) { + return fileDescriptor_ee2600587b650fac, []int{1} +} +func (m *EventList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EventList) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventList.Merge(m, src) +} +func (m *EventList) XXX_Size() int { + return m.Size() +} +func (m *EventList) XXX_DiscardUnknown() { + xxx_messageInfo_EventList.DiscardUnknown(m) +} + +var xxx_messageInfo_EventList proto.InternalMessageInfo + +func (m *EventSeries) Reset() { *m = EventSeries{} } +func (*EventSeries) ProtoMessage() {} +func (*EventSeries) Descriptor() ([]byte, []int) { + return fileDescriptor_ee2600587b650fac, []int{2} +} +func (m *EventSeries) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *EventSeries) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventSeries.Merge(m, src) +} +func (m *EventSeries) XXX_Size() int { + return m.Size() +} +func (m *EventSeries) XXX_DiscardUnknown() { + xxx_messageInfo_EventSeries.DiscardUnknown(m) +} + +var xxx_messageInfo_EventSeries proto.InternalMessageInfo + +func init() { + proto.RegisterType((*Event)(nil), "k8s.io.api.events.v1.Event") + proto.RegisterType((*EventList)(nil), "k8s.io.api.events.v1.EventList") + proto.RegisterType((*EventSeries)(nil), "k8s.io.api.events.v1.EventSeries") +} + +func init() { + proto.RegisterFile("k8s.io/kubernetes/vendor/k8s.io/api/events/v1/generated.proto", fileDescriptor_ee2600587b650fac) +} + +var fileDescriptor_ee2600587b650fac = []byte{ + // 772 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x54, 0x4f, 0x6f, 0xe3, 0x44, + 0x14, 0x8f, 0xbb, 0x4d, 0xda, 0x4c, 0x76, 0xb7, 0xe9, 0x2c, 0x52, 0x87, 0xae, 0xe4, 0x84, 0xac, + 0x84, 0x22, 0x24, 0x6c, 0xb2, 0x42, 0x88, 0x0b, 0x12, 0xeb, 0xa6, 0xa0, 0xa2, 0x96, 0x4a, 0xd3, + 0x9e, 0x10, 0x87, 0x4e, 0x9c, 0x57, 0xd7, 0x24, 0x9e, 0xb1, 0x66, 0x26, 0x91, 0x7a, 0xe3, 0x82, + 0xc4, 0x91, 0x2f, 0xc0, 0x07, 0x40, 0x7c, 0x91, 0x1e, 0x7b, 0xec, 0x29, 0xa2, 0xe6, 0x8b, 0x20, + 0x8f, 0x9d, 0x38, 0xcd, 0x1f, 0x08, 0xda, 0x9b, 0xe7, 0xbd, 0xdf, 0x9f, 0xf7, 0x66, 0x9e, 0x1f, + 0xfa, 0x6a, 0xf0, 0xa5, 0x72, 0x42, 0xe1, 0x0e, 0x46, 0x3d, 0x90, 0x1c, 0x34, 0x28, 0x77, 0x0c, + 0xbc, 0x2f, 0xa4, 0x9b, 0x27, 0x58, 0x1c, 0xba, 0x30, 0x06, 0xae, 0x95, 0x3b, 0xee, 0xb8, 0x01, + 0x70, 0x90, 0x4c, 0x43, 0xdf, 0x89, 0xa5, 0xd0, 0x02, 0x7f, 0x90, 0xa1, 0x1c, 0x16, 0x87, 0x4e, + 0x86, 0x72, 0xc6, 0x9d, 0xc3, 0x4f, 0x83, 0x50, 0xdf, 0x8c, 0x7a, 0x8e, 0x2f, 0x22, 0x37, 0x10, + 0x81, 0x70, 0x0d, 0xb8, 0x37, 0xba, 0x36, 0x27, 0x73, 0x30, 0x5f, 0x99, 0xc8, 0x61, 0x6b, 0xce, + 0xca, 0x17, 0x12, 0x56, 0x18, 0x1d, 0x7e, 0x5e, 0x60, 0x22, 0xe6, 0xdf, 0x84, 0x1c, 0xe4, 0xad, + 0x1b, 0x0f, 0x82, 0x34, 0xa0, 0xdc, 0x08, 0x34, 0x5b, 0xc5, 0x72, 0xd7, 0xb1, 0xe4, 0x88, 0xeb, + 0x30, 0x82, 0x25, 0xc2, 0x17, 0xff, 0x45, 0x50, 0xfe, 0x0d, 0x44, 0x6c, 0x91, 0xd7, 0xfa, 0xbd, + 0x8a, 0xca, 0xc7, 0x69, 0xff, 0xf8, 0x0a, 0xed, 0xa6, 0xd5, 0xf4, 0x99, 0x66, 0xc4, 0x6a, 0x5a, + 0xed, 0xda, 0xdb, 0xcf, 0x9c, 0xe2, 0x92, 0x66, 0xa2, 0x4e, 0x3c, 0x08, 0xd2, 0x80, 0x72, 0x52, + 0xb4, 0x33, 0xee, 0x38, 0xe7, 0xbd, 0x9f, 0xc0, 0xd7, 0x67, 0xa0, 0x99, 0x87, 0xef, 0x26, 0x8d, + 0x52, 0x32, 0x69, 0xa0, 0x22, 0x46, 0x67, 0xaa, 0xf8, 0x0a, 0x55, 0xcd, 0x55, 0x5f, 0x86, 0x11, + 0x90, 0x2d, 0x63, 0xe1, 0x6e, 0x66, 0x71, 0x16, 0xfa, 0x52, 0xa4, 0x34, 0x6f, 0x3f, 0x77, 0xa8, + 0x1e, 0x4f, 0x95, 0x68, 0x21, 0x8a, 0x8f, 0x51, 0x45, 0x81, 0x0c, 0x41, 0x91, 0x67, 0x46, 0xfe, + 0x23, 0x67, 0xd5, 0x33, 0x3b, 0x86, 0x7b, 0x61, 0x80, 0x1e, 0x4a, 0x26, 0x8d, 0x4a, 0xf6, 0x4d, + 0x73, 0x32, 0x3e, 0x43, 0xaf, 0x24, 0xc4, 0x42, 0xea, 0x90, 0x07, 0x47, 0x82, 0x6b, 0x29, 0x86, + 0x43, 0x90, 0x64, 0xbb, 0x69, 0xb5, 0xab, 0xde, 0xeb, 0xbc, 0x82, 0x57, 0x74, 0x19, 0x42, 0x57, + 0xf1, 0xf0, 0xb7, 0x68, 0x7f, 0x16, 0x3e, 0xe1, 0x4a, 0x33, 0xee, 0x03, 0x29, 0x1b, 0xb1, 0x0f, + 0x73, 0xb1, 0x7d, 0xba, 0x08, 0xa0, 0xcb, 0x1c, 0xfc, 0x31, 0xaa, 0x30, 0x5f, 0x87, 0x82, 0x93, + 0x8a, 0x61, 0xbf, 0xcc, 0xd9, 0x95, 0x77, 0x26, 0x4a, 0xf3, 0x6c, 0x8a, 0x93, 0xc0, 0x94, 0xe0, + 0x64, 0xe7, 0x29, 0x8e, 0x9a, 0x28, 0xcd, 0xb3, 0xf8, 0x12, 0x55, 0x25, 0x04, 0x4c, 0xf6, 0x43, + 0x1e, 0x90, 0x5d, 0x73, 0x63, 0x6f, 0xe6, 0x6f, 0x2c, 0x9d, 0xe9, 0xe2, 0x85, 0x29, 0x5c, 0x83, + 0x04, 0xee, 0xcf, 0x3d, 0x02, 0x9d, 0xb2, 0x69, 0x21, 0x84, 0xbf, 0x43, 0x3b, 0x12, 0x86, 0xe9, + 0x8c, 0x91, 0xea, 0xe6, 0x9a, 0xb5, 0x64, 0xd2, 0xd8, 0xa1, 0x19, 0x8f, 0x4e, 0x05, 0x70, 0x13, + 0x6d, 0x73, 0xa1, 0x81, 0x20, 0xd3, 0xc7, 0xf3, 0xdc, 0x77, 0xfb, 0x7b, 0xa1, 0x81, 0x9a, 0x4c, + 0x8a, 0xd0, 0xb7, 0x31, 0x90, 0xda, 0x53, 0xc4, 0xe5, 0x6d, 0x0c, 0xd4, 0x64, 0x30, 0xa0, 0x7a, + 0x1f, 0x62, 0x09, 0x7e, 0xaa, 0x78, 0x21, 0x46, 0xd2, 0x07, 0xf2, 0xdc, 0x14, 0xd6, 0x58, 0x55, + 0x58, 0x36, 0x1c, 0x06, 0xe6, 0x91, 0x5c, 0xae, 0xde, 0x5d, 0x10, 0xa0, 0x4b, 0x92, 0xf8, 0x57, + 0x0b, 0x91, 0x22, 0xf8, 0x4d, 0x28, 0x95, 0x99, 0x49, 0xa5, 0x59, 0x14, 0x93, 0x17, 0xc6, 0xef, + 0x93, 0xcd, 0xa6, 0xdd, 0x0c, 0x7a, 0x33, 0xb7, 0x26, 0xdd, 0x35, 0x9a, 0x74, 0xad, 0x1b, 0xfe, + 0xc5, 0x42, 0x07, 0x45, 0xf2, 0x94, 0xcd, 0x57, 0xf2, 0xf2, 0x7f, 0x57, 0xd2, 0xc8, 0x2b, 0x39, + 0xe8, 0xae, 0x96, 0xa4, 0xeb, 0xbc, 0xf0, 0x3b, 0xb4, 0x57, 0xa4, 0x8e, 0xc4, 0x88, 0x6b, 0xb2, + 0xd7, 0xb4, 0xda, 0x65, 0xef, 0x20, 0x97, 0xdc, 0xeb, 0x3e, 0x4d, 0xd3, 0x45, 0x7c, 0xeb, 0x4f, + 0x0b, 0x65, 0xbf, 0xfa, 0x69, 0xa8, 0x34, 0xfe, 0x71, 0x69, 0x47, 0x39, 0x9b, 0x35, 0x92, 0xb2, + 0xcd, 0x86, 0xaa, 0xe7, 0xce, 0xbb, 0xd3, 0xc8, 0xdc, 0x7e, 0xfa, 0x1a, 0x95, 0x43, 0x0d, 0x91, + 0x22, 0x5b, 0xcd, 0x67, 0xed, 0xda, 0xdb, 0xd7, 0xff, 0xb2, 0x3c, 0xbc, 0x17, 0xb9, 0x4e, 0xf9, + 0x24, 0x65, 0xd0, 0x8c, 0xd8, 0xfa, 0xc3, 0x42, 0xb5, 0xb9, 0xe5, 0x82, 0xdf, 0xa0, 0xb2, 0x6f, + 0xda, 0xb6, 0x4c, 0xdb, 0x33, 0x52, 0xd6, 0x6c, 0x96, 0xc3, 0x23, 0x54, 0x1f, 0x32, 0xa5, 0xcf, + 0x7b, 0x0a, 0xe4, 0x18, 0xfa, 0xef, 0xb3, 0x1d, 0x67, 0xf3, 0x7a, 0xba, 0x20, 0x48, 0x97, 0x2c, + 0xbc, 0xf6, 0xdd, 0xa3, 0x5d, 0xba, 0x7f, 0xb4, 0x4b, 0x0f, 0x8f, 0x76, 0xe9, 0xe7, 0xc4, 0xb6, + 0xee, 0x12, 0xdb, 0xba, 0x4f, 0x6c, 0xeb, 0x21, 0xb1, 0xad, 0xbf, 0x12, 0xdb, 0xfa, 0xed, 0x6f, + 0xbb, 0xf4, 0xc3, 0xd6, 0xb8, 0xf3, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6b, 0xcb, 0x1e, 0x6e, + 0x6b, 0x07, 0x00, 0x00, +} + +func (m *Event) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.DeprecatedCount)) + i-- + dAtA[i] = 0x78 + { + size, err := m.DeprecatedLastTimestamp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x72 + { + size, err := m.DeprecatedFirstTimestamp.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x6a + { + size, err := m.DeprecatedSource.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x62 + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x5a + i -= len(m.Note) + copy(dAtA[i:], m.Note) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Note))) + i-- + dAtA[i] = 0x52 + if m.Related != nil { + { + size, err := m.Related.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + { + size, err := m.Regarding.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x42 + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i-- + dAtA[i] = 0x3a + i -= len(m.Action) + copy(dAtA[i:], m.Action) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Action))) + i-- + dAtA[i] = 0x32 + i -= len(m.ReportingInstance) + copy(dAtA[i:], m.ReportingInstance) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ReportingInstance))) + i-- + dAtA[i] = 0x2a + i -= len(m.ReportingController) + copy(dAtA[i:], m.ReportingController) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.ReportingController))) + i-- + dAtA[i] = 0x22 + if m.Series != nil { + { + size, err := m.Series.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size, err := m.EventTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *EventList) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + +func (m *EventSeries) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventSeries) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventSeries) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.LastObservedTime.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i = encodeVarintGenerated(dAtA, i, uint64(m.Count)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + +func encodeVarintGenerated(dAtA []byte, offset int, v uint64) int { + offset -= sovGenerated(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Event) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.EventTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Series != nil { + l = m.Series.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.ReportingController) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.ReportingInstance) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Action) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = m.Regarding.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Related != nil { + l = m.Related.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.Note) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = m.DeprecatedSource.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.DeprecatedFirstTimestamp.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.DeprecatedLastTimestamp.Size() + n += 1 + l + sovGenerated(uint64(l)) + n += 1 + sovGenerated(uint64(m.DeprecatedCount)) + return n +} + +func (m *EventList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + +func (m *EventSeries) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.Count)) + l = m.LastObservedTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func sovGenerated(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGenerated(x uint64) (n int) { + return sovGenerated(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (this *Event) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&Event{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v1.ObjectMeta", 1), `&`, ``, 1) + `,`, + `EventTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.EventTime), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, + `Series:` + strings.Replace(this.Series.String(), "EventSeries", "EventSeries", 1) + `,`, + `ReportingController:` + fmt.Sprintf("%v", this.ReportingController) + `,`, + `ReportingInstance:` + fmt.Sprintf("%v", this.ReportingInstance) + `,`, + `Action:` + fmt.Sprintf("%v", this.Action) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Regarding:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Regarding), "ObjectReference", "v11.ObjectReference", 1), `&`, ``, 1) + `,`, + `Related:` + strings.Replace(fmt.Sprintf("%v", this.Related), "ObjectReference", "v11.ObjectReference", 1) + `,`, + `Note:` + fmt.Sprintf("%v", this.Note) + `,`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `DeprecatedSource:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DeprecatedSource), "EventSource", "v11.EventSource", 1), `&`, ``, 1) + `,`, + `DeprecatedFirstTimestamp:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DeprecatedFirstTimestamp), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, + `DeprecatedLastTimestamp:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.DeprecatedLastTimestamp), "Time", "v1.Time", 1), `&`, ``, 1) + `,`, + `DeprecatedCount:` + fmt.Sprintf("%v", this.DeprecatedCount) + `,`, + `}`, + }, "") + return s +} +func (this *EventList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]Event{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "Event", "Event", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&EventList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v1.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} +func (this *EventSeries) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&EventSeries{`, + `Count:` + fmt.Sprintf("%v", this.Count) + `,`, + `LastObservedTime:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.LastObservedTime), "MicroTime", "v1.MicroTime", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func valueToStringGenerated(v interface{}) string { + rv := reflect.ValueOf(v) + if rv.IsNil() { + return "nil" + } + pv := reflect.Indirect(rv).Interface() + return fmt.Sprintf("*%v", pv) +} +func (m *Event) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Event: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.EventTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Series", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Series == nil { + m.Series = &EventSeries{} + } + if err := m.Series.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReportingController", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReportingController = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReportingInstance", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ReportingInstance = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Action", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Action = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Regarding", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Regarding.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Related", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Related == nil { + m.Related = &v11.ObjectReference{} + } + if err := m.Related.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 10: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Note", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Note = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 12: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedSource", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeprecatedSource.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 13: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedFirstTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeprecatedFirstTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 14: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedLastTimestamp", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.DeprecatedLastTimestamp.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 15: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field DeprecatedCount", wireType) + } + m.DeprecatedCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.DeprecatedCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventList) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Items = append(m.Items, Event{}) + if err := m.Items[len(m.Items)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventSeries) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: EventSeries: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventSeries: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Count", wireType) + } + m.Count = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Count |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastObservedTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastObservedTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGenerated(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGenerated + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGenerated + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGenerated + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGenerated + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGenerated = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGenerated = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGenerated = fmt.Errorf("proto: unexpected end of group") +) diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.proto new file mode 100644 index 000000000000..18e3d0182e06 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/generated.proto @@ -0,0 +1,125 @@ +/* +Copyright 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. +*/ + + +// This file was autogenerated by go-to-protobuf. Do not edit it manually! + +syntax = 'proto2'; + +package k8s.io.api.events.v1; + +import "k8s.io/api/core/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/generated.proto"; +import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; + +// Package-wide variables from generator "generated". +option go_package = "v1"; + +// Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. +message Event { + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + // eventTime is the time when this Event was first observed. It is required. + optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime eventTime = 2; + + // series is data about the Event series this event represents or nil if it's a singleton Event. + // +optional + optional EventSeries series = 3; + + // reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // This field cannot be empty for new Events. + // +optional + optional string reportingController = 4; + + // reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. + // This field cannot be empty for new Events and it can have at most 128 characters. + // +optional + optional string reportingInstance = 5; + + // action is what action was taken/failed regarding to the regarding object. It is machine-readable. + // This field can have at most 128 characters. + // +optional + optional string action = 6; + + // reason is why the action was taken. It is human-readable. + // This field can have at most 128 characters. + // +optional + optional string reason = 7; + + // regarding contains the object this Event is about. In most cases it's an Object reporting controller + // implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because + // it acts on some changes in a ReplicaSet object. + // +optional + optional k8s.io.api.core.v1.ObjectReference regarding = 8; + + // related is the optional secondary object for more complex actions. E.g. when regarding object triggers + // a creation or deletion of related object. + // +optional + optional k8s.io.api.core.v1.ObjectReference related = 9; + + // note is a human-readable description of the status of this operation. + // Maximal length of the note is 1kB, but libraries should be prepared to + // handle values up to 64kB. + // +optional + optional string note = 10; + + // type is the type of this event (Normal, Warning), new types could be added in the future. + // It is machine-readable. + // +optional + optional string type = 11; + + // deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + optional k8s.io.api.core.v1.EventSource deprecatedSource = 12; + + // deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deprecatedFirstTimestamp = 13; + + // deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deprecatedLastTimestamp = 14; + + // deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + optional int32 deprecatedCount = 15; +} + +// EventList is a list of Event objects. +message EventList { + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + // items is a list of schema objects. + repeated Event items = 2; +} + +// EventSeries contain information on series of events, i.e. thing that was/is happening +// continuously for some time. How often to update the EventSeries is up to the event reporters. +// The default event reporter in "k8s.io/client-go/tools/events/event_broadcaster.go" shows +// how this struct is updated on heartbeats and can guide customized reporter implementations. +message EventSeries { + // count is the number of occurrences in this series up to the last heartbeat time. + optional int32 count = 1; + + // lastObservedTime is the time when last Event from the series was seen before last heartbeat. + optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime lastObservedTime = 2; +} + diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/register.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/register.go new file mode 100644 index 000000000000..ca90e6cbeed9 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/register.go @@ -0,0 +1,53 @@ +/* +Copyright 2020 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 v1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" +) + +// GroupName is the group name use in this package +const GroupName = "events.k8s.io" + +// SchemeGroupVersion is group version used to register these objects +var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1"} + +// Resource takes an unqualified resource and returns a Group qualified GroupResource +func Resource(resource string) schema.GroupResource { + return SchemeGroupVersion.WithResource(resource).GroupResource() +} + +var ( + // TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. + // localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. + SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes) + localSchemeBuilder = &SchemeBuilder + AddToScheme = localSchemeBuilder.AddToScheme +) + +// Adds the list of known types to api.Scheme. +func addKnownTypes(scheme *runtime.Scheme) error { + scheme.AddKnownTypes(SchemeGroupVersion, + &Event{}, + &EventList{}, + ) + + metav1.AddToGroupVersion(scheme, SchemeGroupVersion) + return nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/types.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/types.go new file mode 100644 index 000000000000..07ede554224a --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/types.go @@ -0,0 +1,119 @@ +/* +Copyright 2020 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 v1 + +import ( + corev1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system. +type Event struct { + metav1.TypeMeta `json:",inline"` + // +optional + metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // eventTime is the time when this Event was first observed. It is required. + EventTime metav1.MicroTime `json:"eventTime" protobuf:"bytes,2,opt,name=eventTime"` + + // series is data about the Event series this event represents or nil if it's a singleton Event. + // +optional + Series *EventSeries `json:"series,omitempty" protobuf:"bytes,3,opt,name=series"` + + // reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // This field cannot be empty for new Events. + // +optional + ReportingController string `json:"reportingController,omitempty" protobuf:"bytes,4,opt,name=reportingController"` + + // reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. + // This field cannot be empty for new Events and it can have at most 128 characters. + // +optional + ReportingInstance string `json:"reportingInstance,omitempty" protobuf:"bytes,5,opt,name=reportingInstance"` + + // action is what action was taken/failed regarding to the regarding object. It is machine-readable. + // This field can have at most 128 characters. + // +optional + Action string `json:"action,omitempty" protobuf:"bytes,6,name=action"` + + // reason is why the action was taken. It is human-readable. + // This field can have at most 128 characters. + // +optional + Reason string `json:"reason,omitempty" protobuf:"bytes,7,name=reason"` + + // regarding contains the object this Event is about. In most cases it's an Object reporting controller + // implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because + // it acts on some changes in a ReplicaSet object. + // +optional + Regarding corev1.ObjectReference `json:"regarding,omitempty" protobuf:"bytes,8,opt,name=regarding"` + + // related is the optional secondary object for more complex actions. E.g. when regarding object triggers + // a creation or deletion of related object. + // +optional + Related *corev1.ObjectReference `json:"related,omitempty" protobuf:"bytes,9,opt,name=related"` + + // note is a human-readable description of the status of this operation. + // Maximal length of the note is 1kB, but libraries should be prepared to + // handle values up to 64kB. + // +optional + Note string `json:"note,omitempty" protobuf:"bytes,10,opt,name=note"` + + // type is the type of this event (Normal, Warning), new types could be added in the future. + // It is machine-readable. + // +optional + Type string `json:"type,omitempty" protobuf:"bytes,11,opt,name=type"` + + // deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + DeprecatedSource corev1.EventSource `json:"deprecatedSource,omitempty" protobuf:"bytes,12,opt,name=deprecatedSource"` + // deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + DeprecatedFirstTimestamp metav1.Time `json:"deprecatedFirstTimestamp,omitempty" protobuf:"bytes,13,opt,name=deprecatedFirstTimestamp"` + // deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + DeprecatedLastTimestamp metav1.Time `json:"deprecatedLastTimestamp,omitempty" protobuf:"bytes,14,opt,name=deprecatedLastTimestamp"` + // deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type. + // +optional + DeprecatedCount int32 `json:"deprecatedCount,omitempty" protobuf:"varint,15,opt,name=deprecatedCount"` +} + +// EventSeries contain information on series of events, i.e. thing that was/is happening +// continuously for some time. How often to update the EventSeries is up to the event reporters. +// The default event reporter in "k8s.io/client-go/tools/events/event_broadcaster.go" shows +// how this struct is updated on heartbeats and can guide customized reporter implementations. +type EventSeries struct { + // count is the number of occurrences in this series up to the last heartbeat time. + Count int32 `json:"count" protobuf:"varint,1,opt,name=count"` + // lastObservedTime is the time when last Event from the series was seen before last heartbeat. + LastObservedTime metav1.MicroTime `json:"lastObservedTime" protobuf:"bytes,2,opt,name=lastObservedTime"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object + +// EventList is a list of Event objects. +type EventList struct { + metav1.TypeMeta `json:",inline"` + // Standard list metadata. + // More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata + // +optional + metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` + + // items is a list of schema objects. + Items []Event `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go new file mode 100644 index 000000000000..e0467436ed02 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/types_swagger_doc_generated.go @@ -0,0 +1,72 @@ +/* +Copyright 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 v1 + +// This file contains a collection of methods that can be used from go-restful to +// generate Swagger API documentation for its models. Please read this PR for more +// information on the implementation: https://github.com/emicklei/go-restful/pull/215 +// +// TODOs are ignored from the parser (e.g. TODO(andronat):... || TODO:...) if and only if +// they are on one line! For multiple line or blocks that you want to ignore use ---. +// Any context after a --- is ignored. +// +// Those methods can be generated by using hack/update-generated-swagger-docs.sh + +// AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. +var map_Event = map[string]string{ + "": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system.", + "eventTime": "eventTime is the time when this Event was first observed. It is required.", + "series": "series is data about the Event series this event represents or nil if it's a singleton Event.", + "reportingController": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", + "reportingInstance": "reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.", + "action": "action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field can have at most 128 characters.", + "reason": "reason is why the action was taken. It is human-readable. This field can have at most 128 characters.", + "regarding": "regarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object.", + "related": "related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object.", + "note": "note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.", + "type": "type is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable.", + "deprecatedSource": "deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedFirstTimestamp": "deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedLastTimestamp": "deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedCount": "deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.", +} + +func (Event) SwaggerDoc() map[string]string { + return map_Event +} + +var map_EventList = map[string]string{ + "": "EventList is a list of Event objects.", + "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "items": "items is a list of schema objects.", +} + +func (EventList) SwaggerDoc() map[string]string { + return map_EventList +} + +var map_EventSeries = map[string]string{ + "": "EventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time. How often to update the EventSeries is up to the event reporters. The default event reporter in \"k8s.io/client-go/tools/events/event_broadcaster.go\" shows how this struct is updated on heartbeats and can guide customized reporter implementations.", + "count": "count is the number of occurrences in this series up to the last heartbeat time.", + "lastObservedTime": "lastObservedTime is the time when last Event from the series was seen before last heartbeat.", +} + +func (EventSeries) SwaggerDoc() map[string]string { + return map_EventSeries +} + +// AUTO-GENERATED FUNCTIONS END HERE diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1/zz_generated.deepcopy.go new file mode 100644 index 000000000000..19a3c5f77616 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1/zz_generated.deepcopy.go @@ -0,0 +1,117 @@ +// +build !ignore_autogenerated + +/* +Copyright 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. +*/ + +// Code generated by deepcopy-gen. DO NOT EDIT. + +package v1 + +import ( + corev1 "k8s.io/api/core/v1" + runtime "k8s.io/apimachinery/pkg/runtime" +) + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *Event) DeepCopyInto(out *Event) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.EventTime.DeepCopyInto(&out.EventTime) + if in.Series != nil { + in, out := &in.Series, &out.Series + *out = new(EventSeries) + (*in).DeepCopyInto(*out) + } + out.Regarding = in.Regarding + if in.Related != nil { + in, out := &in.Related, &out.Related + *out = new(corev1.ObjectReference) + **out = **in + } + out.DeprecatedSource = in.DeprecatedSource + in.DeprecatedFirstTimestamp.DeepCopyInto(&out.DeprecatedFirstTimestamp) + in.DeprecatedLastTimestamp.DeepCopyInto(&out.DeprecatedLastTimestamp) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Event. +func (in *Event) DeepCopy() *Event { + if in == nil { + return nil + } + out := new(Event) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Event) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EventList) DeepCopyInto(out *EventList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Event, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventList. +func (in *EventList) DeepCopy() *EventList { + if in == nil { + return nil + } + out := new(EventList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EventList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EventSeries) DeepCopyInto(out *EventSeries) { + *out = *in + in.LastObservedTime.DeepCopyInto(&out.LastObservedTime) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EventSeries. +func (in *EventSeries) DeepCopy() *EventSeries { + if in == nil { + return nil + } + out := new(EventSeries) + in.DeepCopyInto(out) + return out +} diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/generated.proto index 79cbf0670510..79bde87c4300 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/generated.proto +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/generated.proto @@ -34,63 +34,68 @@ message Event { // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; - // Required. Time when this Event was first observed. + // eventTime is the time when this Event was first observed. It is required. optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime eventTime = 2; - // Data about the Event series this event represents or nil if it's a singleton Event. + // series is data about the Event series this event represents or nil if it's a singleton Event. // +optional optional EventSeries series = 3; - // Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // This field cannot be empty for new Events. // +optional optional string reportingController = 4; - // ID of the controller instance, e.g. `kubelet-xyzf`. + // reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. + // This field cannot be empty for new Events and it can have at most 128 characters. // +optional optional string reportingInstance = 5; - // What action was taken/failed regarding to the regarding object. + // action is what action was taken/failed regarding to the regarding object. It is machine-readable. + // This field can have at most 128 characters. // +optional optional string action = 6; - // Why the action was taken. + // reason is why the action was taken. It is human-readable. + // This field can have at most 128 characters. + // +optional optional string reason = 7; - // The object this Event is about. In most cases it's an Object reporting controller implements. - // E.g. ReplicaSetController implements ReplicaSets and this event is emitted because + // regarding contains the object this Event is about. In most cases it's an Object reporting controller + // implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because // it acts on some changes in a ReplicaSet object. // +optional optional k8s.io.api.core.v1.ObjectReference regarding = 8; - // Optional secondary object for more complex actions. E.g. when regarding object triggers + // related is the optional secondary object for more complex actions. E.g. when regarding object triggers // a creation or deletion of related object. // +optional optional k8s.io.api.core.v1.ObjectReference related = 9; - // Optional. A human-readable description of the status of this operation. + // note is a human-readable description of the status of this operation. // Maximal length of the note is 1kB, but libraries should be prepared to // handle values up to 64kB. // +optional optional string note = 10; - // Type of this event (Normal, Warning), new types could be added in the - // future. + // type is the type of this event (Normal, Warning), new types could be added in the future. + // It is machine-readable. // +optional optional string type = 11; - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional optional k8s.io.api.core.v1.EventSource deprecatedSource = 12; - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deprecatedFirstTimestamp = 13; - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.Time deprecatedLastTimestamp = 14; - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional optional int32 deprecatedCount = 15; } @@ -102,17 +107,17 @@ message EventList { // +optional optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; - // Items is a list of schema objects. + // items is a list of schema objects. repeated Event items = 2; } // EventSeries contain information on series of events, i.e. thing that was/is happening // continuously for some time. message EventSeries { - // Number of occurrences in this series up to the last heartbeat time + // count is the number of occurrences in this series up to the last heartbeat time. optional int32 count = 1; - // Time when last Event from the series was seen before last heartbeat. + // lastObservedTime is the time when last Event from the series was seen before last heartbeat. optional k8s.io.apimachinery.pkg.apis.meta.v1.MicroTime lastObservedTime = 2; } diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types.go index 03a7518f5673..e2ed214b0639 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types.go @@ -32,60 +32,65 @@ type Event struct { // +optional metav1.ObjectMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Required. Time when this Event was first observed. + // eventTime is the time when this Event was first observed. It is required. EventTime metav1.MicroTime `json:"eventTime" protobuf:"bytes,2,opt,name=eventTime"` - // Data about the Event series this event represents or nil if it's a singleton Event. + // series is data about the Event series this event represents or nil if it's a singleton Event. // +optional Series *EventSeries `json:"series,omitempty" protobuf:"bytes,3,opt,name=series"` - // Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. + // This field cannot be empty for new Events. // +optional ReportingController string `json:"reportingController,omitempty" protobuf:"bytes,4,opt,name=reportingController"` - // ID of the controller instance, e.g. `kubelet-xyzf`. + // reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. + // This field cannot be empty for new Events and it can have at most 128 characters. // +optional ReportingInstance string `json:"reportingInstance,omitempty" protobuf:"bytes,5,opt,name=reportingInstance"` - // What action was taken/failed regarding to the regarding object. + // action is what action was taken/failed regarding to the regarding object. It is machine-readable. + // This field can have at most 128 characters. // +optional Action string `json:"action,omitempty" protobuf:"bytes,6,name=action"` - // Why the action was taken. + // reason is why the action was taken. It is human-readable. + // This field can have at most 128 characters. + // +optional Reason string `json:"reason,omitempty" protobuf:"bytes,7,name=reason"` - // The object this Event is about. In most cases it's an Object reporting controller implements. - // E.g. ReplicaSetController implements ReplicaSets and this event is emitted because + // regarding contains the object this Event is about. In most cases it's an Object reporting controller + // implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because // it acts on some changes in a ReplicaSet object. // +optional Regarding corev1.ObjectReference `json:"regarding,omitempty" protobuf:"bytes,8,opt,name=regarding"` - // Optional secondary object for more complex actions. E.g. when regarding object triggers + // related is the optional secondary object for more complex actions. E.g. when regarding object triggers // a creation or deletion of related object. // +optional Related *corev1.ObjectReference `json:"related,omitempty" protobuf:"bytes,9,opt,name=related"` - // Optional. A human-readable description of the status of this operation. + // note is a human-readable description of the status of this operation. // Maximal length of the note is 1kB, but libraries should be prepared to // handle values up to 64kB. // +optional Note string `json:"note,omitempty" protobuf:"bytes,10,opt,name=note"` - // Type of this event (Normal, Warning), new types could be added in the - // future. + // type is the type of this event (Normal, Warning), new types could be added in the future. + // It is machine-readable. // +optional Type string `json:"type,omitempty" protobuf:"bytes,11,opt,name=type"` - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional DeprecatedSource corev1.EventSource `json:"deprecatedSource,omitempty" protobuf:"bytes,12,opt,name=deprecatedSource"` - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional DeprecatedFirstTimestamp metav1.Time `json:"deprecatedFirstTimestamp,omitempty" protobuf:"bytes,13,opt,name=deprecatedFirstTimestamp"` - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional DeprecatedLastTimestamp metav1.Time `json:"deprecatedLastTimestamp,omitempty" protobuf:"bytes,14,opt,name=deprecatedLastTimestamp"` - // Deprecated field assuring backward compatibility with core.v1 Event type + // deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type. // +optional DeprecatedCount int32 `json:"deprecatedCount,omitempty" protobuf:"varint,15,opt,name=deprecatedCount"` } @@ -93,9 +98,9 @@ type Event struct { // EventSeries contain information on series of events, i.e. thing that was/is happening // continuously for some time. type EventSeries struct { - // Number of occurrences in this series up to the last heartbeat time + // count is the number of occurrences in this series up to the last heartbeat time. Count int32 `json:"count" protobuf:"varint,1,opt,name=count"` - // Time when last Event from the series was seen before last heartbeat. + // lastObservedTime is the time when last Event from the series was seen before last heartbeat. LastObservedTime metav1.MicroTime `json:"lastObservedTime" protobuf:"bytes,2,opt,name=lastObservedTime"` // +k8s:deprecated=state,protobuf=3 @@ -113,6 +118,6 @@ type EventList struct { // +optional metav1.ListMeta `json:"metadata,omitempty" protobuf:"bytes,1,opt,name=metadata"` - // Items is a list of schema objects. + // items is a list of schema objects. Items []Event `json:"items" protobuf:"bytes,2,rep,name=items"` } diff --git a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go index fc90897c2ca6..8c987f89963e 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go @@ -29,20 +29,20 @@ package v1beta1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_Event = map[string]string{ "": "Event is a report of an event somewhere in the cluster. It generally denotes some state change in the system.", - "eventTime": "Required. Time when this Event was first observed.", - "series": "Data about the Event series this event represents or nil if it's a singleton Event.", - "reportingController": "Name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`.", - "reportingInstance": "ID of the controller instance, e.g. `kubelet-xyzf`.", - "action": "What action was taken/failed regarding to the regarding object.", - "reason": "Why the action was taken.", - "regarding": "The object this Event is about. In most cases it's an Object reporting controller implements. E.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object.", - "related": "Optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object.", - "note": "Optional. A human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.", - "type": "Type of this event (Normal, Warning), new types could be added in the future.", - "deprecatedSource": "Deprecated field assuring backward compatibility with core.v1 Event type", - "deprecatedFirstTimestamp": "Deprecated field assuring backward compatibility with core.v1 Event type", - "deprecatedLastTimestamp": "Deprecated field assuring backward compatibility with core.v1 Event type", - "deprecatedCount": "Deprecated field assuring backward compatibility with core.v1 Event type", + "eventTime": "eventTime is the time when this Event was first observed. It is required.", + "series": "series is data about the Event series this event represents or nil if it's a singleton Event.", + "reportingController": "reportingController is the name of the controller that emitted this Event, e.g. `kubernetes.io/kubelet`. This field cannot be empty for new Events.", + "reportingInstance": "reportingInstance is the ID of the controller instance, e.g. `kubelet-xyzf`. This field cannot be empty for new Events and it can have at most 128 characters.", + "action": "action is what action was taken/failed regarding to the regarding object. It is machine-readable. This field can have at most 128 characters.", + "reason": "reason is why the action was taken. It is human-readable. This field can have at most 128 characters.", + "regarding": "regarding contains the object this Event is about. In most cases it's an Object reporting controller implements, e.g. ReplicaSetController implements ReplicaSets and this event is emitted because it acts on some changes in a ReplicaSet object.", + "related": "related is the optional secondary object for more complex actions. E.g. when regarding object triggers a creation or deletion of related object.", + "note": "note is a human-readable description of the status of this operation. Maximal length of the note is 1kB, but libraries should be prepared to handle values up to 64kB.", + "type": "type is the type of this event (Normal, Warning), new types could be added in the future. It is machine-readable.", + "deprecatedSource": "deprecatedSource is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedFirstTimestamp": "deprecatedFirstTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedLastTimestamp": "deprecatedLastTimestamp is the deprecated field assuring backward compatibility with core.v1 Event type.", + "deprecatedCount": "deprecatedCount is the deprecated field assuring backward compatibility with core.v1 Event type.", } func (Event) SwaggerDoc() map[string]string { @@ -52,7 +52,7 @@ func (Event) SwaggerDoc() map[string]string { var map_EventList = map[string]string{ "": "EventList is a list of Event objects.", "metadata": "Standard list metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "items": "Items is a list of schema objects.", + "items": "items is a list of schema objects.", } func (EventList) SwaggerDoc() map[string]string { @@ -61,8 +61,8 @@ func (EventList) SwaggerDoc() map[string]string { var map_EventSeries = map[string]string{ "": "EventSeries contain information on series of events, i.e. thing that was/is happening continuously for some time.", - "count": "Number of occurrences in this series up to the last heartbeat time", - "lastObservedTime": "Time when last Event from the series was seen before last heartbeat.", + "count": "count is the number of occurrences in this series up to the last heartbeat time.", + "lastObservedTime": "lastObservedTime is the time when last Event from the series was seen before last heartbeat.", } func (EventSeries) SwaggerDoc() map[string]string { diff --git a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/generated.proto b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/generated.proto index 56ba159c373d..30db726f9c9e 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/generated.proto +++ b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/generated.proto @@ -300,7 +300,7 @@ message PodSecurityPolicySpec { // AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. // An empty value indicates that any CSI driver can be used for inline ephemeral volumes. - // This is an alpha field, and is only honored if the API server enables the CSIInlineVolume feature gate. + // This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate. // +optional repeated AllowedCSIDriver allowedCSIDrivers = 23; diff --git a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types.go b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types.go index f4a95f45719f..d9a058175812 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types.go @@ -226,7 +226,7 @@ type PodSecurityPolicySpec struct { AllowedFlexVolumes []AllowedFlexVolume `json:"allowedFlexVolumes,omitempty" protobuf:"bytes,18,rep,name=allowedFlexVolumes"` // AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. // An empty value indicates that any CSI driver can be used for inline ephemeral volumes. - // This is an alpha field, and is only honored if the API server enables the CSIInlineVolume feature gate. + // This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate. // +optional AllowedCSIDrivers []AllowedCSIDriver `json:"allowedCSIDrivers,omitempty" protobuf:"bytes,23,rep,name=allowedCSIDrivers"` // allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. diff --git a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go index 7d64598900f8..05a503667f02 100644 --- a/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go @@ -179,7 +179,7 @@ var map_PodSecurityPolicySpec = map[string]string{ "allowPrivilegeEscalation": "allowPrivilegeEscalation determines if a pod can request to allow privilege escalation. If unspecified, defaults to true.", "allowedHostPaths": "allowedHostPaths is an allowlist of host paths. Empty indicates that all host paths may be used.", "allowedFlexVolumes": "allowedFlexVolumes is an allowlist of Flexvolumes. Empty or nil indicates that all Flexvolumes may be used. This parameter is effective only when the usage of the Flexvolumes is allowed in the \"volumes\" field.", - "allowedCSIDrivers": "AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is an alpha field, and is only honored if the API server enables the CSIInlineVolume feature gate.", + "allowedCSIDrivers": "AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. An empty value indicates that any CSI driver can be used for inline ephemeral volumes. This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate.", "allowedUnsafeSysctls": "allowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of allowed sysctls. Single * means all unsafe sysctls are allowed. Kubelet has to allowlist all allowed unsafe sysctls explicitly to avoid rejection.\n\nExamples: e.g. \"foo/*\" allows \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" allows \"foo.bar\", \"foo.baz\", etc.", "forbiddenSysctls": "forbiddenSysctls is a list of explicitly forbidden sysctls, defaults to none. Each entry is either a plain sysctl name or ends in \"*\" in which case it is considered as a prefix of forbidden sysctls. Single * means all sysctls are forbidden.\n\nExamples: e.g. \"foo/*\" forbids \"foo/bar\", \"foo/baz\", etc. e.g. \"foo.*\" forbids \"foo.bar\", \"foo.baz\", etc.", "allowedProcMountTypes": "AllowedProcMountTypes is an allowlist of allowed ProcMountTypes. Empty or nil indicates that only the DefaultProcMountType may be used. This requires the ProcMountType feature flag to be enabled.", diff --git a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS index 435297a8d513..d18a17885b60 100644 --- a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS @@ -17,9 +17,7 @@ reviewers: - saad-ali - janetkuo - tallclair -- eparis - dims - hongchaodeng - krousey - cjcullen -- david-mcmahon diff --git a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS index 96bccff1b23b..68b8d353ca90 100644 --- a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS @@ -14,10 +14,8 @@ reviewers: - gmarek - janetkuo - ncdc -- eparis - dims - krousey - resouer -- david-mcmahon - mfojtik - jianhuiz diff --git a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS index b5ab08259511..7ac0fe11a1fa 100644 --- a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS @@ -9,7 +9,5 @@ reviewers: - mikedanese - saad-ali - janetkuo -- eparis - xiang90 - mbohlool -- david-mcmahon diff --git a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS index 77cfb0c1aa36..15b4c875a301 100644 --- a/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS @@ -25,7 +25,6 @@ reviewers: - krousey - mml - mbohlool -- david-mcmahon - therc - mqliang - kevin-wangzefeng diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD index 2c97d163fe71..98ce88771065 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD @@ -30,6 +30,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/utils/trace:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go index c1a961340f0c..1fbe9d718b71 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go @@ -43,6 +43,7 @@ import ( webhookrequest "k8s.io/apiserver/pkg/admission/plugin/webhook/request" auditinternal "k8s.io/apiserver/pkg/apis/audit" webhookutil "k8s.io/apiserver/pkg/util/webhook" + "k8s.io/apiserver/pkg/warning" utiltrace "k8s.io/utils/trace" ) @@ -267,6 +268,9 @@ func (a *mutatingDispatcher) callAttrMutatingHook(ctx context.Context, h *admiss klog.Warningf("Failed to set admission audit annotation %s to %s for mutating webhook %s: %v", key, v, h.Name, err) } } + for _, w := range result.Warnings { + warning.AddWarning(ctx, "", w) + } if !result.Allowed { return false, &webhookutil.ErrWebhookRejection{Status: webhookerrors.ToStatusErr(h.Name, result.Result)} diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go index 5ea28d446b5a..c60d0fb9e75f 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/request/admissionreview.go @@ -36,6 +36,7 @@ type AdmissionResponse struct { Patch []byte PatchType admissionv1.PatchType Result *metav1.Status + Warnings []string } // VerifyAdmissionResponse checks the validity of the provided admission review object, and returns the @@ -93,6 +94,7 @@ func VerifyAdmissionResponse(uid types.UID, mutating bool, review runtime.Object Patch: patch, PatchType: patchType, Result: r.Response.Result, + Warnings: r.Response.Warnings, }, nil case *admissionv1beta1.AdmissionReview: @@ -118,6 +120,7 @@ func VerifyAdmissionResponse(uid types.UID, mutating bool, review runtime.Object Patch: patch, PatchType: patchType, Result: r.Response.Result, + Warnings: r.Response.Warnings, }, nil default: diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD index d4eec04a9ab2..b6a59f7a69e6 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD @@ -23,6 +23,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", "//vendor/k8s.io/utils/trace:go_default_library", ], diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go index 50454b999345..f065cdf5014c 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go @@ -33,6 +33,7 @@ import ( "k8s.io/apiserver/pkg/admission/plugin/webhook/generic" webhookrequest "k8s.io/apiserver/pkg/admission/plugin/webhook/request" webhookutil "k8s.io/apiserver/pkg/util/webhook" + "k8s.io/apiserver/pkg/warning" "k8s.io/klog/v2" utiltrace "k8s.io/utils/trace" ) @@ -227,6 +228,9 @@ func (d *validatingDispatcher) callHook(ctx context.Context, h *v1.ValidatingWeb klog.Warningf("Failed to set admission audit annotation %s to %s for validating webhook %s: %v", key, v, h.Name, err) } } + for _, w := range result.Warnings { + warning.AddWarning(ctx, "", w) + } if result.Allowed { return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/endpoints/filters/warning.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/endpoints/filters/warning.go index 323f634dcbfc..55e85f0b73b1 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/endpoints/filters/warning.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/endpoints/filters/warning.go @@ -17,10 +17,13 @@ limitations under the License. package filters import ( + "fmt" "net/http" "sync" + "unicode/utf8" "k8s.io/apimachinery/pkg/util/net" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apiserver/pkg/warning" ) @@ -33,10 +36,34 @@ func WithWarningRecorder(handler http.Handler) http.Handler { }) } +var ( + truncateAtTotalRunes = 4 * 1024 + truncateItemRunes = 256 +) + +type recordedWarning struct { + agent string + text string +} + type recorder struct { - lock sync.Mutex + // lock guards calls to AddWarning from multiple threads + lock sync.Mutex + + // recorded tracks whether AddWarning was already called with a given text recorded map[string]bool - writer http.ResponseWriter + + // ordered tracks warnings added so they can be replayed and truncated if needed + ordered []recordedWarning + + // written tracks how many runes of text have been added as warning headers + written int + + // truncating tracks if we have already exceeded truncateAtTotalRunes and are now truncating warning messages as we add them + truncating bool + + // writer is the response writer to add warning headers to + writer http.ResponseWriter } func (r *recorder) AddWarning(agent, text string) { @@ -47,6 +74,11 @@ func (r *recorder) AddWarning(agent, text string) { r.lock.Lock() defer r.lock.Unlock() + // if we've already exceeded our limit and are already truncating, return early + if r.written >= truncateAtTotalRunes && r.truncating { + return + } + // init if needed if r.recorded == nil { r.recorded = map[string]bool{} @@ -57,13 +89,45 @@ func (r *recorder) AddWarning(agent, text string) { return } r.recorded[text] = true + r.ordered = append(r.ordered, recordedWarning{agent: agent, text: text}) - // TODO(liggitt): track total message characters written: - // * if this takes us over 4k truncate individual messages to 256 chars and regenerate headers - // * if we're already truncating truncate this message to 256 chars - // * if we're still over 4k omit this message + // truncate on a rune boundary, if needed + textRuneLength := utf8.RuneCountInString(text) + if r.truncating && textRuneLength > truncateItemRunes { + text = string([]rune(text)[:truncateItemRunes]) + textRuneLength = truncateItemRunes + } + + // compute the header + header, err := net.NewWarningHeader(299, agent, text) + if err != nil { + return + } - if header, err := net.NewWarningHeader(299, agent, text); err == nil { + // if this fits within our limit, or we're already truncating, write and return + if r.written+textRuneLength <= truncateAtTotalRunes || r.truncating { + r.written += textRuneLength r.writer.Header().Add("Warning", header) + return + } + + // otherwise, enable truncation, reset, and replay the existing items as truncated warnings + r.truncating = true + r.written = 0 + r.writer.Header().Del("Warning") + utilruntime.HandleError(fmt.Errorf("exceeded max warning header size, truncating")) + for _, w := range r.ordered { + agent := w.agent + text := w.text + + textRuneLength := utf8.RuneCountInString(text) + if textRuneLength > truncateItemRunes { + text = string([]rune(text)[:truncateItemRunes]) + textRuneLength = truncateItemRunes + } + if header, err := net.NewWarningHeader(299, agent, text); err == nil { + r.written += textRuneLength + r.writer.Header().Add("Warning", header) + } } } diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS index 59bdd352d7a8..d0b6c002c865 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/generic/OWNERS @@ -18,7 +18,6 @@ reviewers: - janetkuo - pwittrock - ncdc -- eparis - piosz - dims - hongchaodeng diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS index 9ee8b8a53a38..fa526a8ba961 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/registry/rest/OWNERS @@ -14,13 +14,11 @@ reviewers: - gmarek - justinsb - ncdc -- eparis - dims - hongchaodeng - krousey - euank - ingvagabund -- david-mcmahon - jianhuiz - sdminonne - enj diff --git a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/server/signal.go b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/server/signal.go index 0ea19d6606d0..e5334ae4c15f 100644 --- a/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/server/signal.go +++ b/cluster-autoscaler/vendor/k8s.io/apiserver/pkg/server/signal.go @@ -17,6 +17,7 @@ limitations under the License. package server import ( + "context" "os" "os/signal" ) @@ -27,21 +28,30 @@ var shutdownHandler chan os.Signal // SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned // which is closed on one of these signals. If a second signal is caught, the program // is terminated with exit code 1. +// Only one of SetupSignalContext and SetupSignalHandler should be called, and only can +// be called once. func SetupSignalHandler() <-chan struct{} { + return SetupSignalContext().Done() +} + +// SetupSignalContext is same as SetupSignalHandler, but a context.Context is returned. +// Only one of SetupSignalContext and SetupSignalHandler should be called, and only can +// be called once. +func SetupSignalContext() context.Context { close(onlyOneSignalHandler) // panics when called twice shutdownHandler = make(chan os.Signal, 2) - stop := make(chan struct{}) + ctx, cancel := context.WithCancel(context.Background()) signal.Notify(shutdownHandler, shutdownSignals...) go func() { <-shutdownHandler - close(stop) + cancel() <-shutdownHandler os.Exit(1) // second signal. Exit directly. }() - return stop + return ctx } // RequestShutdown emulates a received event that is considered as shutdown signal (SIGTERM/SIGINT) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/BUILD new file mode 100644 index 000000000000..f72793758337 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/BUILD @@ -0,0 +1,47 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_test( + name = "go_default_test", + srcs = ["memcache_test.go"], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/client-go/discovery/fake:go_default_library", + ], +) + +go_library( + name = "go_default_library", + srcs = ["memcache.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/discovery/cached/memory", + importpath = "k8s.io/client-go/discovery/cached/memory", + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/client-go/discovery:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go b/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go new file mode 100644 index 000000000000..6e01066b0b08 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/discovery/cached/memory/memcache.go @@ -0,0 +1,243 @@ +/* +Copyright 2017 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 memory + +import ( + "errors" + "fmt" + "net" + "net/url" + "sync" + "syscall" + + openapi_v2 "github.com/googleapis/gnostic/openapiv2" + + errorsutil "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/version" + "k8s.io/client-go/discovery" + restclient "k8s.io/client-go/rest" +) + +type cacheEntry struct { + resourceList *metav1.APIResourceList + err error +} + +// memCacheClient can Invalidate() to stay up-to-date with discovery +// information. +// +// TODO: Switch to a watch interface. Right now it will poll after each +// Invalidate() call. +type memCacheClient struct { + delegate discovery.DiscoveryInterface + + lock sync.RWMutex + groupToServerResources map[string]*cacheEntry + groupList *metav1.APIGroupList + cacheValid bool +} + +// Error Constants +var ( + ErrCacheNotFound = errors.New("not found") +) + +var _ discovery.CachedDiscoveryInterface = &memCacheClient{} + +// isTransientConnectionError checks whether given error is "Connection refused" or +// "Connection reset" error which usually means that apiserver is temporarily +// unavailable. +func isTransientConnectionError(err error) bool { + urlError, ok := err.(*url.Error) + if !ok { + return false + } + opError, ok := urlError.Err.(*net.OpError) + if !ok { + return false + } + errno, ok := opError.Err.(syscall.Errno) + if !ok { + return false + } + return errno == syscall.ECONNREFUSED || errno == syscall.ECONNRESET +} + +func isTransientError(err error) bool { + if isTransientConnectionError(err) { + return true + } + + if t, ok := err.(errorsutil.APIStatus); ok && t.Status().Code >= 500 { + return true + } + + return errorsutil.IsTooManyRequests(err) +} + +// ServerResourcesForGroupVersion returns the supported resources for a group and version. +func (d *memCacheClient) ServerResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + d.lock.Lock() + defer d.lock.Unlock() + if !d.cacheValid { + if err := d.refreshLocked(); err != nil { + return nil, err + } + } + cachedVal, ok := d.groupToServerResources[groupVersion] + if !ok { + return nil, ErrCacheNotFound + } + + if cachedVal.err != nil && isTransientError(cachedVal.err) { + r, err := d.serverResourcesForGroupVersion(groupVersion) + if err != nil { + utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", groupVersion, err)) + } + cachedVal = &cacheEntry{r, err} + d.groupToServerResources[groupVersion] = cachedVal + } + + return cachedVal.resourceList, cachedVal.err +} + +// ServerResources returns the supported resources for all groups and versions. +// Deprecated: use ServerGroupsAndResources instead. +func (d *memCacheClient) ServerResources() ([]*metav1.APIResourceList, error) { + return discovery.ServerResources(d) +} + +// ServerGroupsAndResources returns the groups and supported resources for all groups and versions. +func (d *memCacheClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) { + return discovery.ServerGroupsAndResources(d) +} + +func (d *memCacheClient) ServerGroups() (*metav1.APIGroupList, error) { + d.lock.Lock() + defer d.lock.Unlock() + if !d.cacheValid { + if err := d.refreshLocked(); err != nil { + return nil, err + } + } + return d.groupList, nil +} + +func (d *memCacheClient) RESTClient() restclient.Interface { + return d.delegate.RESTClient() +} + +func (d *memCacheClient) ServerPreferredResources() ([]*metav1.APIResourceList, error) { + return discovery.ServerPreferredResources(d) +} + +func (d *memCacheClient) ServerPreferredNamespacedResources() ([]*metav1.APIResourceList, error) { + return discovery.ServerPreferredNamespacedResources(d) +} + +func (d *memCacheClient) ServerVersion() (*version.Info, error) { + return d.delegate.ServerVersion() +} + +func (d *memCacheClient) OpenAPISchema() (*openapi_v2.Document, error) { + return d.delegate.OpenAPISchema() +} + +func (d *memCacheClient) Fresh() bool { + d.lock.RLock() + defer d.lock.RUnlock() + // Return whether the cache is populated at all. It is still possible that + // a single entry is missing due to transient errors and the attempt to read + // that entry will trigger retry. + return d.cacheValid +} + +// Invalidate enforces that no cached data that is older than the current time +// is used. +func (d *memCacheClient) Invalidate() { + d.lock.Lock() + defer d.lock.Unlock() + d.cacheValid = false + d.groupToServerResources = nil + d.groupList = nil +} + +// refreshLocked refreshes the state of cache. The caller must hold d.lock for +// writing. +func (d *memCacheClient) refreshLocked() error { + // TODO: Could this multiplicative set of calls be replaced by a single call + // to ServerResources? If it's possible for more than one resulting + // APIResourceList to have the same GroupVersion, the lists would need merged. + gl, err := d.delegate.ServerGroups() + if err != nil || len(gl.Groups) == 0 { + utilruntime.HandleError(fmt.Errorf("couldn't get current server API group list: %v", err)) + return err + } + + wg := &sync.WaitGroup{} + resultLock := &sync.Mutex{} + rl := map[string]*cacheEntry{} + for _, g := range gl.Groups { + for _, v := range g.Versions { + gv := v.GroupVersion + wg.Add(1) + go func() { + defer wg.Done() + defer utilruntime.HandleCrash() + + r, err := d.serverResourcesForGroupVersion(gv) + if err != nil { + utilruntime.HandleError(fmt.Errorf("couldn't get resource list for %v: %v", gv, err)) + } + + resultLock.Lock() + defer resultLock.Unlock() + rl[gv] = &cacheEntry{r, err} + }() + } + } + wg.Wait() + + d.groupToServerResources, d.groupList = rl, gl + d.cacheValid = true + return nil +} + +func (d *memCacheClient) serverResourcesForGroupVersion(groupVersion string) (*metav1.APIResourceList, error) { + r, err := d.delegate.ServerResourcesForGroupVersion(groupVersion) + if err != nil { + return r, err + } + if len(r.APIResources) == 0 { + return r, fmt.Errorf("Got empty response for: %v", groupVersion) + } + return r, nil +} + +// NewMemCacheClient creates a new CachedDiscoveryInterface which caches +// discovery information in memory and will stay up-to-date if Invalidate is +// called with regularity. +// +// NOTE: The client will NOT resort to live lookups on cache misses. +func NewMemCacheClient(delegate discovery.DiscoveryInterface) discovery.CachedDiscoveryInterface { + return &memCacheClient{ + delegate: delegate, + groupToServerResources: map[string]*cacheEntry{}, + } +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/informers/BUILD index 592b640ab67e..da8912c009e8 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/informers/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/BUILD @@ -28,6 +28,7 @@ go_library( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/BUILD index 54d4d1413ad5..908ee177e79f 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/BUILD @@ -7,6 +7,7 @@ go_library( importpath = "k8s.io/client-go/informers/events", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/client-go/informers/events/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/events/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", ], @@ -23,6 +24,7 @@ filegroup( name = "all-srcs", srcs = [ ":package-srcs", + "//staging/src/k8s.io/client-go/informers/events/v1:all-srcs", "//staging/src/k8s.io/client-go/informers/events/v1beta1:all-srcs", ], tags = ["automanaged"], diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/interface.go b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/interface.go index af30a3913dcb..b350dde5b6c2 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/interface.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/interface.go @@ -19,12 +19,15 @@ limitations under the License. package events import ( + v1 "k8s.io/client-go/informers/events/v1" v1beta1 "k8s.io/client-go/informers/events/v1beta1" internalinterfaces "k8s.io/client-go/informers/internalinterfaces" ) // Interface provides access to each of this group's versions. type Interface interface { + // V1 provides access to shared informers for resources in V1. + V1() v1.Interface // V1beta1 provides access to shared informers for resources in V1beta1. V1beta1() v1beta1.Interface } @@ -40,6 +43,11 @@ func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakList return &group{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} } +// V1 returns a new v1.Interface. +func (g *group) V1() v1.Interface { + return v1.New(g.factory, g.namespace, g.tweakListOptions) +} + // V1beta1 returns a new v1beta1.Interface. func (g *group) V1beta1() v1beta1.Interface { return v1beta1.New(g.factory, g.namespace, g.tweakListOptions) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/BUILD new file mode 100644 index 000000000000..ec355a5c63b6 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/BUILD @@ -0,0 +1,36 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "event.go", + "interface.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/informers/events/v1", + importpath = "k8s.io/client-go/informers/events/v1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/events/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/informers/internalinterfaces:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes:go_default_library", + "//staging/src/k8s.io/client-go/listers/events/v1:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/event.go b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/event.go new file mode 100644 index 000000000000..f8d35ee15ccb --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/event.go @@ -0,0 +1,90 @@ +/* +Copyright 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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + time "time" + + eventsv1 "k8s.io/api/events/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" + kubernetes "k8s.io/client-go/kubernetes" + v1 "k8s.io/client-go/listers/events/v1" + cache "k8s.io/client-go/tools/cache" +) + +// EventInformer provides access to a shared informer and lister for +// Events. +type EventInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1.EventLister +} + +type eventInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewEventInformer constructs a new informer for Event type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewEventInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredEventInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredEventInformer constructs a new informer for Event type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredEventInformer(client kubernetes.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.EventsV1().Events(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.EventsV1().Events(namespace).Watch(context.TODO(), options) + }, + }, + &eventsv1.Event{}, + resyncPeriod, + indexers, + ) +} + +func (f *eventInformer) defaultInformer(client kubernetes.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredEventInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *eventInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&eventsv1.Event{}, f.defaultInformer) +} + +func (f *eventInformer) Lister() v1.EventLister { + return v1.NewEventLister(f.Informer().GetIndexer()) +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/interface.go b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/interface.go new file mode 100644 index 000000000000..cd06e2335935 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/events/v1/interface.go @@ -0,0 +1,45 @@ +/* +Copyright 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. +*/ + +// Code generated by informer-gen. DO NOT EDIT. + +package v1 + +import ( + internalinterfaces "k8s.io/client-go/informers/internalinterfaces" +) + +// Interface provides access to all the informers in this group version. +type Interface interface { + // Events returns a EventInformer. + Events() EventInformer +} + +type version struct { + factory internalinterfaces.SharedInformerFactory + namespace string + tweakListOptions internalinterfaces.TweakListOptionsFunc +} + +// New returns a new Interface. +func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface { + return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions} +} + +// Events returns a EventInformer. +func (v *version) Events() EventInformer { + return &eventInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/informers/generic.go b/cluster-autoscaler/vendor/k8s.io/client-go/informers/generic.go index 0f8e414f3f2f..2041e7b2d362 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/informers/generic.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/informers/generic.go @@ -39,6 +39,7 @@ import ( corev1 "k8s.io/api/core/v1" v1alpha1 "k8s.io/api/discovery/v1alpha1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" @@ -213,6 +214,10 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource case discoveryv1beta1.SchemeGroupVersion.WithResource("endpointslices"): return &genericInformer{resource: resource.GroupResource(), informer: f.Discovery().V1beta1().EndpointSlices().Informer()}, nil + // Group=events.k8s.io, Version=v1 + case eventsv1.SchemeGroupVersion.WithResource("events"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Events().V1().Events().Informer()}, nil + // Group=events.k8s.io, Version=v1beta1 case eventsv1beta1.SchemeGroupVersion.WithResource("events"): return &genericInformer{resource: resource.GroupResource(), informer: f.Events().V1beta1().Events().Informer()}, nil diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/BUILD index 62bec3d88ab3..37d236edf9e4 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/BUILD @@ -34,6 +34,7 @@ go_library( "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:go_default_library", @@ -92,6 +93,7 @@ filegroup( "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:all-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:all-srcs", "//staging/src/k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1:all-srcs", diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/clientset.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/clientset.go index 0b7681dc0643..064c24d12e4c 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/clientset.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/clientset.go @@ -44,6 +44,7 @@ import ( corev1 "k8s.io/client-go/kubernetes/typed/core/v1" discoveryv1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1" discoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" + eventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" eventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" extensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" flowcontrolv1alpha1 "k8s.io/client-go/kubernetes/typed/flowcontrol/v1alpha1" @@ -90,6 +91,7 @@ type Interface interface { CoreV1() corev1.CoreV1Interface DiscoveryV1alpha1() discoveryv1alpha1.DiscoveryV1alpha1Interface DiscoveryV1beta1() discoveryv1beta1.DiscoveryV1beta1Interface + EventsV1() eventsv1.EventsV1Interface EventsV1beta1() eventsv1beta1.EventsV1beta1Interface ExtensionsV1beta1() extensionsv1beta1.ExtensionsV1beta1Interface FlowcontrolV1alpha1() flowcontrolv1alpha1.FlowcontrolV1alpha1Interface @@ -136,6 +138,7 @@ type Clientset struct { coreV1 *corev1.CoreV1Client discoveryV1alpha1 *discoveryv1alpha1.DiscoveryV1alpha1Client discoveryV1beta1 *discoveryv1beta1.DiscoveryV1beta1Client + eventsV1 *eventsv1.EventsV1Client eventsV1beta1 *eventsv1beta1.EventsV1beta1Client extensionsV1beta1 *extensionsv1beta1.ExtensionsV1beta1Client flowcontrolV1alpha1 *flowcontrolv1alpha1.FlowcontrolV1alpha1Client @@ -266,6 +269,11 @@ func (c *Clientset) DiscoveryV1beta1() discoveryv1beta1.DiscoveryV1beta1Interfac return c.discoveryV1beta1 } +// EventsV1 retrieves the EventsV1Client +func (c *Clientset) EventsV1() eventsv1.EventsV1Interface { + return c.eventsV1 +} + // EventsV1beta1 retrieves the EventsV1beta1Client func (c *Clientset) EventsV1beta1() eventsv1beta1.EventsV1beta1Interface { return c.eventsV1beta1 @@ -465,6 +473,10 @@ func NewForConfig(c *rest.Config) (*Clientset, error) { if err != nil { return nil, err } + cs.eventsV1, err = eventsv1.NewForConfig(&configShallowCopy) + if err != nil { + return nil, err + } cs.eventsV1beta1, err = eventsv1beta1.NewForConfig(&configShallowCopy) if err != nil { return nil, err @@ -571,6 +583,7 @@ func NewForConfigOrDie(c *rest.Config) *Clientset { cs.coreV1 = corev1.NewForConfigOrDie(c) cs.discoveryV1alpha1 = discoveryv1alpha1.NewForConfigOrDie(c) cs.discoveryV1beta1 = discoveryv1beta1.NewForConfigOrDie(c) + cs.eventsV1 = eventsv1.NewForConfigOrDie(c) cs.eventsV1beta1 = eventsv1beta1.NewForConfigOrDie(c) cs.extensionsV1beta1 = extensionsv1beta1.NewForConfigOrDie(c) cs.flowcontrolV1alpha1 = flowcontrolv1alpha1.NewForConfigOrDie(c) @@ -619,6 +632,7 @@ func New(c rest.Interface) *Clientset { cs.coreV1 = corev1.New(c) cs.discoveryV1alpha1 = discoveryv1alpha1.New(c) cs.discoveryV1beta1 = discoveryv1beta1.New(c) + cs.eventsV1 = eventsv1.New(c) cs.eventsV1beta1 = eventsv1beta1.New(c) cs.extensionsV1beta1 = extensionsv1beta1.New(c) cs.flowcontrolV1alpha1 = flowcontrolv1alpha1.New(c) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/BUILD index 5e157972f1c7..5246e56628ae 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/BUILD @@ -33,6 +33,7 @@ go_library( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", @@ -104,6 +105,8 @@ go_library( "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1/fake:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1/fake:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/extensions/v1beta1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go index d9c2650f7df5..70c4ac6e4d32 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/clientset_generated.go @@ -68,6 +68,8 @@ import ( fakediscoveryv1alpha1 "k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake" discoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1" fakediscoveryv1beta1 "k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake" + eventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" + fakeeventsv1 "k8s.io/client-go/kubernetes/typed/events/v1/fake" eventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" fakeeventsv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1/fake" extensionsv1beta1 "k8s.io/client-go/kubernetes/typed/extensions/v1beta1" @@ -264,6 +266,11 @@ func (c *Clientset) DiscoveryV1beta1() discoveryv1beta1.DiscoveryV1beta1Interfac return &fakediscoveryv1beta1.FakeDiscoveryV1beta1{Fake: &c.Fake} } +// EventsV1 retrieves the EventsV1Client +func (c *Clientset) EventsV1() eventsv1.EventsV1Interface { + return &fakeeventsv1.FakeEventsV1{Fake: &c.Fake} +} + // EventsV1beta1 retrieves the EventsV1beta1Client func (c *Clientset) EventsV1beta1() eventsv1beta1.EventsV1beta1Interface { return &fakeeventsv1beta1.FakeEventsV1beta1{Fake: &c.Fake} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/register.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/register.go index 52e472435afa..00e71589bc68 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/register.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/fake/register.go @@ -41,6 +41,7 @@ import ( corev1 "k8s.io/api/core/v1" discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" @@ -92,6 +93,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ corev1.AddToScheme, discoveryv1alpha1.AddToScheme, discoveryv1beta1.AddToScheme, + eventsv1.AddToScheme, eventsv1beta1.AddToScheme, extensionsv1beta1.AddToScheme, flowcontrolv1alpha1.AddToScheme, diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/BUILD index dd847cf5482e..c7cb5d65f84e 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/BUILD @@ -32,6 +32,7 @@ go_library( "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/discovery/v1alpha1:go_default_library", "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/api/extensions/v1beta1:go_default_library", "//staging/src/k8s.io/api/flowcontrol/v1alpha1:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/register.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/register.go index 555d86e94fb9..2710bf2decd8 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/register.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/scheme/register.go @@ -41,6 +41,7 @@ import ( corev1 "k8s.io/api/core/v1" discoveryv1alpha1 "k8s.io/api/discovery/v1alpha1" discoveryv1beta1 "k8s.io/api/discovery/v1beta1" + eventsv1 "k8s.io/api/events/v1" eventsv1beta1 "k8s.io/api/events/v1beta1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" flowcontrolv1alpha1 "k8s.io/api/flowcontrol/v1alpha1" @@ -92,6 +93,7 @@ var localSchemeBuilder = runtime.SchemeBuilder{ corev1.AddToScheme, discoveryv1alpha1.AddToScheme, discoveryv1beta1.AddToScheme, + eventsv1.AddToScheme, eventsv1beta1.AddToScheme, extensionsv1beta1.AddToScheme, flowcontrolv1alpha1.AddToScheme, diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD new file mode 100644 index 000000000000..23530df9fb37 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/BUILD @@ -0,0 +1,39 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "event.go", + "events_client.go", + "generated_expansion.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1", + importpath = "k8s.io/client-go/kubernetes/typed/events/v1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/events/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1/fake:all-srcs", + ], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/doc.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/doc.go new file mode 100644 index 000000000000..3af5d054f102 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// This package has the automatically generated typed clients. +package v1 diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go new file mode 100644 index 000000000000..3b3496317fcc --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/event.go @@ -0,0 +1,178 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + "context" + "time" + + v1 "k8s.io/api/events/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + scheme "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +// EventsGetter has a method to return a EventInterface. +// A group's client should implement this interface. +type EventsGetter interface { + Events(namespace string) EventInterface +} + +// EventInterface has methods to work with Event resources. +type EventInterface interface { + Create(ctx context.Context, event *v1.Event, opts metav1.CreateOptions) (*v1.Event, error) + Update(ctx context.Context, event *v1.Event, opts metav1.UpdateOptions) (*v1.Event, error) + Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error + Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Event, error) + List(ctx context.Context, opts metav1.ListOptions) (*v1.EventList, error) + Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Event, err error) + EventExpansion +} + +// events implements EventInterface +type events struct { + client rest.Interface + ns string +} + +// newEvents returns a Events +func newEvents(c *EventsV1Client, namespace string) *events { + return &events{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the event, and returns the corresponding event object, and an error if there is any. +func (c *events) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.Event, err error) { + result = &v1.Event{} + err = c.client.Get(). + Namespace(c.ns). + Resource("events"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of Events that match those selectors. +func (c *events) List(ctx context.Context, opts metav1.ListOptions) (result *v1.EventList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1.EventList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("events"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested events. +func (c *events) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("events"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a event and creates it. Returns the server's representation of the event, and an error, if there is any. +func (c *events) Create(ctx context.Context, event *v1.Event, opts metav1.CreateOptions) (result *v1.Event, err error) { + result = &v1.Event{} + err = c.client.Post(). + Namespace(c.ns). + Resource("events"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(event). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a event and updates it. Returns the server's representation of the event, and an error, if there is any. +func (c *events) Update(ctx context.Context, event *v1.Event, opts metav1.UpdateOptions) (result *v1.Event, err error) { + result = &v1.Event{} + err = c.client.Put(). + Namespace(c.ns). + Resource("events"). + Name(event.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(event). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the event and deletes it. Returns an error if one occurs. +func (c *events) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("events"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *events) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("events"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched event. +func (c *events) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.Event, err error) { + result = &v1.Event{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("events"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/events_client.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/events_client.go new file mode 100644 index 000000000000..9230ca5ca7c6 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/events_client.go @@ -0,0 +1,89 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/events/v1" + "k8s.io/client-go/kubernetes/scheme" + rest "k8s.io/client-go/rest" +) + +type EventsV1Interface interface { + RESTClient() rest.Interface + EventsGetter +} + +// EventsV1Client is used to interact with features provided by the events.k8s.io group. +type EventsV1Client struct { + restClient rest.Interface +} + +func (c *EventsV1Client) Events(namespace string) EventInterface { + return newEvents(c, namespace) +} + +// NewForConfig creates a new EventsV1Client for the given config. +func NewForConfig(c *rest.Config) (*EventsV1Client, error) { + config := *c + if err := setConfigDefaults(&config); err != nil { + return nil, err + } + client, err := rest.RESTClientFor(&config) + if err != nil { + return nil, err + } + return &EventsV1Client{client}, nil +} + +// NewForConfigOrDie creates a new EventsV1Client for the given config and +// panics if there is an error in the config. +func NewForConfigOrDie(c *rest.Config) *EventsV1Client { + client, err := NewForConfig(c) + if err != nil { + panic(err) + } + return client +} + +// New creates a new EventsV1Client for the given RESTClient. +func New(c rest.Interface) *EventsV1Client { + return &EventsV1Client{c} +} + +func setConfigDefaults(config *rest.Config) error { + gv := v1.SchemeGroupVersion + config.GroupVersion = &gv + config.APIPath = "/apis" + config.NegotiatedSerializer = scheme.Codecs.WithoutConversion() + + if config.UserAgent == "" { + config.UserAgent = rest.DefaultKubernetesUserAgent() + } + + return nil +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *EventsV1Client) RESTClient() rest.Interface { + if c == nil { + return nil + } + return c.restClient +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD new file mode 100644 index 000000000000..26bfd8c2c49b --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/BUILD @@ -0,0 +1,38 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "doc.go", + "fake_event.go", + "fake_events_client.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake", + importpath = "k8s.io/client-go/kubernetes/typed/events/v1/fake", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/events/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/doc.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/doc.go new file mode 100644 index 000000000000..16f44399065e --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/doc.go @@ -0,0 +1,20 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +// Package fake has the automatically generated clients. +package fake diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go new file mode 100644 index 000000000000..73c3b4e02e20 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_event.go @@ -0,0 +1,130 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + + eventsv1 "k8s.io/api/events/v1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeEvents implements EventInterface +type FakeEvents struct { + Fake *FakeEventsV1 + ns string +} + +var eventsResource = schema.GroupVersionResource{Group: "events.k8s.io", Version: "v1", Resource: "events"} + +var eventsKind = schema.GroupVersionKind{Group: "events.k8s.io", Version: "v1", Kind: "Event"} + +// Get takes name of the event, and returns the corresponding event object, and an error if there is any. +func (c *FakeEvents) Get(ctx context.Context, name string, options v1.GetOptions) (result *eventsv1.Event, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(eventsResource, c.ns, name), &eventsv1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*eventsv1.Event), err +} + +// List takes label and field selectors, and returns the list of Events that match those selectors. +func (c *FakeEvents) List(ctx context.Context, opts v1.ListOptions) (result *eventsv1.EventList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(eventsResource, eventsKind, c.ns, opts), &eventsv1.EventList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &eventsv1.EventList{ListMeta: obj.(*eventsv1.EventList).ListMeta} + for _, item := range obj.(*eventsv1.EventList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested events. +func (c *FakeEvents) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(eventsResource, c.ns, opts)) + +} + +// Create takes the representation of a event and creates it. Returns the server's representation of the event, and an error, if there is any. +func (c *FakeEvents) Create(ctx context.Context, event *eventsv1.Event, opts v1.CreateOptions) (result *eventsv1.Event, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(eventsResource, c.ns, event), &eventsv1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*eventsv1.Event), err +} + +// Update takes the representation of a event and updates it. Returns the server's representation of the event, and an error, if there is any. +func (c *FakeEvents) Update(ctx context.Context, event *eventsv1.Event, opts v1.UpdateOptions) (result *eventsv1.Event, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(eventsResource, c.ns, event), &eventsv1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*eventsv1.Event), err +} + +// Delete takes name of the event and deletes it. Returns an error if one occurs. +func (c *FakeEvents) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(eventsResource, c.ns, name), &eventsv1.Event{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeEvents) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(eventsResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &eventsv1.EventList{}) + return err +} + +// Patch applies the patch and returns the patched event. +func (c *FakeEvents) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *eventsv1.Event, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(eventsResource, c.ns, name, pt, data, subresources...), &eventsv1.Event{}) + + if obj == nil { + return nil, err + } + return obj.(*eventsv1.Event), err +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_events_client.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_events_client.go new file mode 100644 index 000000000000..95ef2b307cc0 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/fake/fake_events_client.go @@ -0,0 +1,40 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + v1 "k8s.io/client-go/kubernetes/typed/events/v1" + rest "k8s.io/client-go/rest" + testing "k8s.io/client-go/testing" +) + +type FakeEventsV1 struct { + *testing.Fake +} + +func (c *FakeEventsV1) Events(namespace string) v1.EventInterface { + return &FakeEvents{c, namespace} +} + +// RESTClient returns a RESTClient that is used to communicate +// with API server by this client implementation. +func (c *FakeEventsV1) RESTClient() rest.Interface { + var ret *rest.RESTClient + return ret +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/generated_expansion.go b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/generated_expansion.go new file mode 100644 index 000000000000..2d5885584f54 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/kubernetes/typed/events/v1/generated_expansion.go @@ -0,0 +1,21 @@ +/* +Copyright 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. +*/ + +// Code generated by client-gen. DO NOT EDIT. + +package v1 + +type EventExpansion interface{} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/BUILD new file mode 100644 index 000000000000..7c0cb40e2997 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/BUILD @@ -0,0 +1,32 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = [ + "event.go", + "expansion_generated.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/listers/events/v1", + importpath = "k8s.io/client-go/listers/events/v1", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/events/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/client-go/tools/cache:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/event.go b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/event.go new file mode 100644 index 000000000000..4abe841e2653 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/event.go @@ -0,0 +1,99 @@ +/* +Copyright 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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +import ( + v1 "k8s.io/api/events/v1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// EventLister helps list Events. +// All objects returned here must be treated as read-only. +type EventLister interface { + // List lists all Events in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.Event, err error) + // Events returns an object that can list and get Events. + Events(namespace string) EventNamespaceLister + EventListerExpansion +} + +// eventLister implements the EventLister interface. +type eventLister struct { + indexer cache.Indexer +} + +// NewEventLister returns a new EventLister. +func NewEventLister(indexer cache.Indexer) EventLister { + return &eventLister{indexer: indexer} +} + +// List lists all Events in the indexer. +func (s *eventLister) List(selector labels.Selector) (ret []*v1.Event, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Event)) + }) + return ret, err +} + +// Events returns an object that can list and get Events. +func (s *eventLister) Events(namespace string) EventNamespaceLister { + return eventNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// EventNamespaceLister helps list and get Events. +// All objects returned here must be treated as read-only. +type EventNamespaceLister interface { + // List lists all Events in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1.Event, err error) + // Get retrieves the Event from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1.Event, error) + EventNamespaceListerExpansion +} + +// eventNamespaceLister implements the EventNamespaceLister +// interface. +type eventNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all Events in the indexer for a given namespace. +func (s eventNamespaceLister) List(selector labels.Selector) (ret []*v1.Event, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1.Event)) + }) + return ret, err +} + +// Get retrieves the Event from the indexer for a given namespace and name. +func (s eventNamespaceLister) Get(name string) (*v1.Event, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1.Resource("event"), name) + } + return obj.(*v1.Event), nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/expansion_generated.go b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/expansion_generated.go new file mode 100644 index 000000000000..348e784d7451 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/listers/events/v1/expansion_generated.go @@ -0,0 +1,27 @@ +/* +Copyright 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. +*/ + +// Code generated by lister-gen. DO NOT EDIT. + +package v1 + +// EventListerExpansion allows custom methods to be added to +// EventLister. +type EventListerExpansion interface{} + +// EventNamespaceListerExpansion allows custom methods to be added to +// EventNamespaceLister. +type EventNamespaceListerExpansion interface{} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/BUILD new file mode 100644 index 000000000000..a2301eede96c --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/BUILD @@ -0,0 +1,57 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = [ + "category_expansion.go", + "discovery.go", + "shortcut.go", + ], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/restmapper", + importpath = "k8s.io/client-go/restmapper", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/client-go/discovery:go_default_library", + "//vendor/k8s.io/klog/v2:go_default_library", + ], +) + +go_test( + name = "go_default_test", + srcs = [ + "category_expansion_test.go", + "discovery_test.go", + "shortcut_test.go", + ], + embed = [":go_default_library"], + deps = [ + "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/version:go_default_library", + "//staging/src/k8s.io/client-go/discovery:go_default_library", + "//staging/src/k8s.io/client-go/rest:go_default_library", + "//staging/src/k8s.io/client-go/rest/fake:go_default_library", + "//vendor/github.com/davecgh/go-spew/spew:go_default_library", + "//vendor/github.com/googleapis/gnostic/openapiv2:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/category_expansion.go b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/category_expansion.go new file mode 100644 index 000000000000..2537a2b4e25c --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/category_expansion.go @@ -0,0 +1,119 @@ +/* +Copyright 2017 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 restmapper + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" +) + +// CategoryExpander maps category strings to GroupResources. +// Categories are classification or 'tag' of a group of resources. +type CategoryExpander interface { + Expand(category string) ([]schema.GroupResource, bool) +} + +// SimpleCategoryExpander implements CategoryExpander interface +// using a static mapping of categories to GroupResource mapping. +type SimpleCategoryExpander struct { + Expansions map[string][]schema.GroupResource +} + +// Expand fulfills CategoryExpander +func (e SimpleCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + ret, ok := e.Expansions[category] + return ret, ok +} + +// discoveryCategoryExpander struct lets a REST Client wrapper (discoveryClient) to retrieve list of APIResourceList, +// and then convert to fallbackExpander +type discoveryCategoryExpander struct { + discoveryClient discovery.DiscoveryInterface +} + +// NewDiscoveryCategoryExpander returns a category expander that makes use of the "categories" fields from +// the API, found through the discovery client. In case of any error or no category found (which likely +// means we're at a cluster prior to categories support, fallback to the expander provided. +func NewDiscoveryCategoryExpander(client discovery.DiscoveryInterface) CategoryExpander { + if client == nil { + panic("Please provide discovery client to shortcut expander") + } + return discoveryCategoryExpander{discoveryClient: client} +} + +// Expand fulfills CategoryExpander +func (e discoveryCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + // Get all supported resources for groups and versions from server, if no resource found, fallback anyway. + apiResourceLists, _ := e.discoveryClient.ServerResources() + if len(apiResourceLists) == 0 { + return nil, false + } + + discoveredExpansions := map[string][]schema.GroupResource{} + for _, apiResourceList := range apiResourceLists { + gv, err := schema.ParseGroupVersion(apiResourceList.GroupVersion) + if err != nil { + continue + } + // Collect GroupVersions by categories + for _, apiResource := range apiResourceList.APIResources { + if categories := apiResource.Categories; len(categories) > 0 { + for _, category := range categories { + groupResource := schema.GroupResource{ + Group: gv.Group, + Resource: apiResource.Name, + } + discoveredExpansions[category] = append(discoveredExpansions[category], groupResource) + } + } + } + } + + ret, ok := discoveredExpansions[category] + return ret, ok +} + +// UnionCategoryExpander implements CategoryExpander interface. +// It maps given category string to union of expansions returned by all the CategoryExpanders in the list. +type UnionCategoryExpander []CategoryExpander + +// Expand fulfills CategoryExpander +func (u UnionCategoryExpander) Expand(category string) ([]schema.GroupResource, bool) { + ret := []schema.GroupResource{} + ok := false + + // Expand the category for each CategoryExpander in the list and merge/combine the results. + for _, expansion := range u { + curr, currOk := expansion.Expand(category) + + for _, currGR := range curr { + found := false + for _, existing := range ret { + if existing == currGR { + found = true + break + } + } + if !found { + ret = append(ret, currGR) + } + } + ok = ok || currOk + } + + return ret, ok +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/discovery.go b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/discovery.go new file mode 100644 index 000000000000..19ae95e1b5ba --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/discovery.go @@ -0,0 +1,338 @@ +/* +Copyright 2016 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 restmapper + +import ( + "fmt" + "strings" + "sync" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" + + "k8s.io/klog/v2" +) + +// APIGroupResources is an API group with a mapping of versions to +// resources. +type APIGroupResources struct { + Group metav1.APIGroup + // A mapping of version string to a slice of APIResources for + // that version. + VersionedResources map[string][]metav1.APIResource +} + +// NewDiscoveryRESTMapper returns a PriorityRESTMapper based on the discovered +// groups and resources passed in. +func NewDiscoveryRESTMapper(groupResources []*APIGroupResources) meta.RESTMapper { + unionMapper := meta.MultiRESTMapper{} + + var groupPriority []string + // /v1 is special. It should always come first + resourcePriority := []schema.GroupVersionResource{{Group: "", Version: "v1", Resource: meta.AnyResource}} + kindPriority := []schema.GroupVersionKind{{Group: "", Version: "v1", Kind: meta.AnyKind}} + + for _, group := range groupResources { + groupPriority = append(groupPriority, group.Group.Name) + + // Make sure the preferred version comes first + if len(group.Group.PreferredVersion.Version) != 0 { + preferred := group.Group.PreferredVersion.Version + if _, ok := group.VersionedResources[preferred]; ok { + resourcePriority = append(resourcePriority, schema.GroupVersionResource{ + Group: group.Group.Name, + Version: group.Group.PreferredVersion.Version, + Resource: meta.AnyResource, + }) + + kindPriority = append(kindPriority, schema.GroupVersionKind{ + Group: group.Group.Name, + Version: group.Group.PreferredVersion.Version, + Kind: meta.AnyKind, + }) + } + } + + for _, discoveryVersion := range group.Group.Versions { + resources, ok := group.VersionedResources[discoveryVersion.Version] + if !ok { + continue + } + + // Add non-preferred versions after the preferred version, in case there are resources that only exist in those versions + if discoveryVersion.Version != group.Group.PreferredVersion.Version { + resourcePriority = append(resourcePriority, schema.GroupVersionResource{ + Group: group.Group.Name, + Version: discoveryVersion.Version, + Resource: meta.AnyResource, + }) + + kindPriority = append(kindPriority, schema.GroupVersionKind{ + Group: group.Group.Name, + Version: discoveryVersion.Version, + Kind: meta.AnyKind, + }) + } + + gv := schema.GroupVersion{Group: group.Group.Name, Version: discoveryVersion.Version} + versionMapper := meta.NewDefaultRESTMapper([]schema.GroupVersion{gv}) + + for _, resource := range resources { + scope := meta.RESTScopeNamespace + if !resource.Namespaced { + scope = meta.RESTScopeRoot + } + + // if we have a slash, then this is a subresource and we shouldn't create mappings for those. + if strings.Contains(resource.Name, "/") { + continue + } + + plural := gv.WithResource(resource.Name) + singular := gv.WithResource(resource.SingularName) + // this is for legacy resources and servers which don't list singular forms. For those we must still guess. + if len(resource.SingularName) == 0 { + _, singular = meta.UnsafeGuessKindToResource(gv.WithKind(resource.Kind)) + } + + versionMapper.AddSpecific(gv.WithKind(strings.ToLower(resource.Kind)), plural, singular, scope) + versionMapper.AddSpecific(gv.WithKind(resource.Kind), plural, singular, scope) + // TODO this is producing unsafe guesses that don't actually work, but it matches previous behavior + versionMapper.Add(gv.WithKind(resource.Kind+"List"), scope) + } + // TODO why is this type not in discovery (at least for "v1") + versionMapper.Add(gv.WithKind("List"), meta.RESTScopeRoot) + unionMapper = append(unionMapper, versionMapper) + } + } + + for _, group := range groupPriority { + resourcePriority = append(resourcePriority, schema.GroupVersionResource{ + Group: group, + Version: meta.AnyVersion, + Resource: meta.AnyResource, + }) + kindPriority = append(kindPriority, schema.GroupVersionKind{ + Group: group, + Version: meta.AnyVersion, + Kind: meta.AnyKind, + }) + } + + return meta.PriorityRESTMapper{ + Delegate: unionMapper, + ResourcePriority: resourcePriority, + KindPriority: kindPriority, + } +} + +// GetAPIGroupResources uses the provided discovery client to gather +// discovery information and populate a slice of APIGroupResources. +func GetAPIGroupResources(cl discovery.DiscoveryInterface) ([]*APIGroupResources, error) { + gs, rs, err := cl.ServerGroupsAndResources() + if rs == nil || gs == nil { + return nil, err + // TODO track the errors and update callers to handle partial errors. + } + rsm := map[string]*metav1.APIResourceList{} + for _, r := range rs { + rsm[r.GroupVersion] = r + } + + var result []*APIGroupResources + for _, group := range gs { + groupResources := &APIGroupResources{ + Group: *group, + VersionedResources: make(map[string][]metav1.APIResource), + } + for _, version := range group.Versions { + resources, ok := rsm[version.GroupVersion] + if !ok { + continue + } + groupResources.VersionedResources[version.Version] = resources.APIResources + } + result = append(result, groupResources) + } + return result, nil +} + +// DeferredDiscoveryRESTMapper is a RESTMapper that will defer +// initialization of the RESTMapper until the first mapping is +// requested. +type DeferredDiscoveryRESTMapper struct { + initMu sync.Mutex + delegate meta.RESTMapper + cl discovery.CachedDiscoveryInterface +} + +// NewDeferredDiscoveryRESTMapper returns a +// DeferredDiscoveryRESTMapper that will lazily query the provided +// client for discovery information to do REST mappings. +func NewDeferredDiscoveryRESTMapper(cl discovery.CachedDiscoveryInterface) *DeferredDiscoveryRESTMapper { + return &DeferredDiscoveryRESTMapper{ + cl: cl, + } +} + +func (d *DeferredDiscoveryRESTMapper) getDelegate() (meta.RESTMapper, error) { + d.initMu.Lock() + defer d.initMu.Unlock() + + if d.delegate != nil { + return d.delegate, nil + } + + groupResources, err := GetAPIGroupResources(d.cl) + if err != nil { + return nil, err + } + + d.delegate = NewDiscoveryRESTMapper(groupResources) + return d.delegate, err +} + +// Reset resets the internally cached Discovery information and will +// cause the next mapping request to re-discover. +func (d *DeferredDiscoveryRESTMapper) Reset() { + klog.V(5).Info("Invalidating discovery information") + + d.initMu.Lock() + defer d.initMu.Unlock() + + d.cl.Invalidate() + d.delegate = nil +} + +// KindFor takes a partial resource and returns back the single match. +// It returns an error if there are multiple matches. +func (d *DeferredDiscoveryRESTMapper) KindFor(resource schema.GroupVersionResource) (gvk schema.GroupVersionKind, err error) { + del, err := d.getDelegate() + if err != nil { + return schema.GroupVersionKind{}, err + } + gvk, err = del.KindFor(resource) + if err != nil && !d.cl.Fresh() { + d.Reset() + gvk, err = d.KindFor(resource) + } + return +} + +// KindsFor takes a partial resource and returns back the list of +// potential kinds in priority order. +func (d *DeferredDiscoveryRESTMapper) KindsFor(resource schema.GroupVersionResource) (gvks []schema.GroupVersionKind, err error) { + del, err := d.getDelegate() + if err != nil { + return nil, err + } + gvks, err = del.KindsFor(resource) + if len(gvks) == 0 && !d.cl.Fresh() { + d.Reset() + gvks, err = d.KindsFor(resource) + } + return +} + +// ResourceFor takes a partial resource and returns back the single +// match. It returns an error if there are multiple matches. +func (d *DeferredDiscoveryRESTMapper) ResourceFor(input schema.GroupVersionResource) (gvr schema.GroupVersionResource, err error) { + del, err := d.getDelegate() + if err != nil { + return schema.GroupVersionResource{}, err + } + gvr, err = del.ResourceFor(input) + if err != nil && !d.cl.Fresh() { + d.Reset() + gvr, err = d.ResourceFor(input) + } + return +} + +// ResourcesFor takes a partial resource and returns back the list of +// potential resource in priority order. +func (d *DeferredDiscoveryRESTMapper) ResourcesFor(input schema.GroupVersionResource) (gvrs []schema.GroupVersionResource, err error) { + del, err := d.getDelegate() + if err != nil { + return nil, err + } + gvrs, err = del.ResourcesFor(input) + if len(gvrs) == 0 && !d.cl.Fresh() { + d.Reset() + gvrs, err = d.ResourcesFor(input) + } + return +} + +// RESTMapping identifies a preferred resource mapping for the +// provided group kind. +func (d *DeferredDiscoveryRESTMapper) RESTMapping(gk schema.GroupKind, versions ...string) (m *meta.RESTMapping, err error) { + del, err := d.getDelegate() + if err != nil { + return nil, err + } + m, err = del.RESTMapping(gk, versions...) + if err != nil && !d.cl.Fresh() { + d.Reset() + m, err = d.RESTMapping(gk, versions...) + } + return +} + +// RESTMappings returns the RESTMappings for the provided group kind +// in a rough internal preferred order. If no kind is found, it will +// return a NoResourceMatchError. +func (d *DeferredDiscoveryRESTMapper) RESTMappings(gk schema.GroupKind, versions ...string) (ms []*meta.RESTMapping, err error) { + del, err := d.getDelegate() + if err != nil { + return nil, err + } + ms, err = del.RESTMappings(gk, versions...) + if len(ms) == 0 && !d.cl.Fresh() { + d.Reset() + ms, err = d.RESTMappings(gk, versions...) + } + return +} + +// ResourceSingularizer converts a resource name from plural to +// singular (e.g., from pods to pod). +func (d *DeferredDiscoveryRESTMapper) ResourceSingularizer(resource string) (singular string, err error) { + del, err := d.getDelegate() + if err != nil { + return resource, err + } + singular, err = del.ResourceSingularizer(resource) + if err != nil && !d.cl.Fresh() { + d.Reset() + singular, err = d.ResourceSingularizer(resource) + } + return +} + +func (d *DeferredDiscoveryRESTMapper) String() string { + del, err := d.getDelegate() + if err != nil { + return fmt.Sprintf("DeferredDiscoveryRESTMapper{%v}", err) + } + return fmt.Sprintf("DeferredDiscoveryRESTMapper{\n\t%v\n}", del) +} + +// Make sure it satisfies the interface +var _ meta.RESTMapper = &DeferredDiscoveryRESTMapper{} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/shortcut.go b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/shortcut.go new file mode 100644 index 000000000000..6903ec8088d1 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/restmapper/shortcut.go @@ -0,0 +1,172 @@ +/* +Copyright 2016 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 restmapper + +import ( + "strings" + + "k8s.io/klog/v2" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" +) + +// shortcutExpander is a RESTMapper that can be used for Kubernetes resources. It expands the resource first, then invokes the wrapped +type shortcutExpander struct { + RESTMapper meta.RESTMapper + + discoveryClient discovery.DiscoveryInterface +} + +var _ meta.RESTMapper = &shortcutExpander{} + +// NewShortcutExpander wraps a restmapper in a layer that expands shortcuts found via discovery +func NewShortcutExpander(delegate meta.RESTMapper, client discovery.DiscoveryInterface) meta.RESTMapper { + return shortcutExpander{RESTMapper: delegate, discoveryClient: client} +} + +// KindFor fulfills meta.RESTMapper +func (e shortcutExpander) KindFor(resource schema.GroupVersionResource) (schema.GroupVersionKind, error) { + return e.RESTMapper.KindFor(e.expandResourceShortcut(resource)) +} + +// KindsFor fulfills meta.RESTMapper +func (e shortcutExpander) KindsFor(resource schema.GroupVersionResource) ([]schema.GroupVersionKind, error) { + return e.RESTMapper.KindsFor(e.expandResourceShortcut(resource)) +} + +// ResourcesFor fulfills meta.RESTMapper +func (e shortcutExpander) ResourcesFor(resource schema.GroupVersionResource) ([]schema.GroupVersionResource, error) { + return e.RESTMapper.ResourcesFor(e.expandResourceShortcut(resource)) +} + +// ResourceFor fulfills meta.RESTMapper +func (e shortcutExpander) ResourceFor(resource schema.GroupVersionResource) (schema.GroupVersionResource, error) { + return e.RESTMapper.ResourceFor(e.expandResourceShortcut(resource)) +} + +// ResourceSingularizer fulfills meta.RESTMapper +func (e shortcutExpander) ResourceSingularizer(resource string) (string, error) { + return e.RESTMapper.ResourceSingularizer(e.expandResourceShortcut(schema.GroupVersionResource{Resource: resource}).Resource) +} + +// RESTMapping fulfills meta.RESTMapper +func (e shortcutExpander) RESTMapping(gk schema.GroupKind, versions ...string) (*meta.RESTMapping, error) { + return e.RESTMapper.RESTMapping(gk, versions...) +} + +// RESTMappings fulfills meta.RESTMapper +func (e shortcutExpander) RESTMappings(gk schema.GroupKind, versions ...string) ([]*meta.RESTMapping, error) { + return e.RESTMapper.RESTMappings(gk, versions...) +} + +// getShortcutMappings returns a set of tuples which holds short names for resources. +// First the list of potential resources will be taken from the API server. +// Next we will append the hardcoded list of resources - to be backward compatible with old servers. +// NOTE that the list is ordered by group priority. +func (e shortcutExpander) getShortcutMappings() ([]*metav1.APIResourceList, []resourceShortcuts, error) { + res := []resourceShortcuts{} + // get server resources + // This can return an error *and* the results it was able to find. We don't need to fail on the error. + apiResList, err := e.discoveryClient.ServerResources() + if err != nil { + klog.V(1).Infof("Error loading discovery information: %v", err) + } + for _, apiResources := range apiResList { + gv, err := schema.ParseGroupVersion(apiResources.GroupVersion) + if err != nil { + klog.V(1).Infof("Unable to parse groupversion = %s due to = %s", apiResources.GroupVersion, err.Error()) + continue + } + for _, apiRes := range apiResources.APIResources { + for _, shortName := range apiRes.ShortNames { + rs := resourceShortcuts{ + ShortForm: schema.GroupResource{Group: gv.Group, Resource: shortName}, + LongForm: schema.GroupResource{Group: gv.Group, Resource: apiRes.Name}, + } + res = append(res, rs) + } + } + } + + return apiResList, res, nil +} + +// expandResourceShortcut will return the expanded version of resource +// (something that a pkg/api/meta.RESTMapper can understand), if it is +// indeed a shortcut. If no match has been found, we will match on group prefixing. +// Lastly we will return resource unmodified. +func (e shortcutExpander) expandResourceShortcut(resource schema.GroupVersionResource) schema.GroupVersionResource { + // get the shortcut mappings and return on first match. + if allResources, shortcutResources, err := e.getShortcutMappings(); err == nil { + // avoid expanding if there's an exact match to a full resource name + for _, apiResources := range allResources { + gv, err := schema.ParseGroupVersion(apiResources.GroupVersion) + if err != nil { + continue + } + if len(resource.Group) != 0 && resource.Group != gv.Group { + continue + } + for _, apiRes := range apiResources.APIResources { + if resource.Resource == apiRes.Name { + return resource + } + if resource.Resource == apiRes.SingularName { + return resource + } + } + } + + for _, item := range shortcutResources { + if len(resource.Group) != 0 && resource.Group != item.ShortForm.Group { + continue + } + if resource.Resource == item.ShortForm.Resource { + resource.Resource = item.LongForm.Resource + resource.Group = item.LongForm.Group + return resource + } + } + + // we didn't find exact match so match on group prefixing. This allows autoscal to match autoscaling + if len(resource.Group) == 0 { + return resource + } + for _, item := range shortcutResources { + if !strings.HasPrefix(item.ShortForm.Group, resource.Group) { + continue + } + if resource.Resource == item.ShortForm.Resource { + resource.Resource = item.LongForm.Resource + resource.Group = item.LongForm.Group + return resource + } + } + } + + return resource +} + +// ResourceShortcuts represents a structure that holds the information how to +// transition from resource's shortcut to its full name. +type resourceShortcuts struct { + ShortForm schema.GroupResource + LongForm schema.GroupResource +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/BUILD new file mode 100644 index 000000000000..10f707f89ad8 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/BUILD @@ -0,0 +1,31 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["client.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/client-go/scale/fake", + importpath = "k8s.io/client-go/scale/fake", + visibility = ["//visibility:public"], + deps = [ + "//staging/src/k8s.io/api/autoscaling/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/client-go/scale:go_default_library", + "//staging/src/k8s.io/client-go/testing:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/client.go b/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/client.go new file mode 100644 index 000000000000..005a4144dcd9 --- /dev/null +++ b/cluster-autoscaler/vendor/k8s.io/client-go/scale/fake/client.go @@ -0,0 +1,81 @@ +/* +Copyright 2017 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 fake provides a fake client interface to arbitrary Kubernetes +// APIs that exposes common high level operations and exposes common +// metadata. +package fake + +import ( + "context" + + autoscalingapi "k8s.io/api/autoscaling/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/scale" + "k8s.io/client-go/testing" +) + +// FakeScaleClient provides a fake implementation of scale.ScalesGetter. +type FakeScaleClient struct { + testing.Fake +} + +func (f *FakeScaleClient) Scales(namespace string) scale.ScaleInterface { + return &fakeNamespacedScaleClient{ + namespace: namespace, + fake: &f.Fake, + } +} + +type fakeNamespacedScaleClient struct { + namespace string + fake *testing.Fake +} + +func (f *fakeNamespacedScaleClient) Get(ctx context.Context, resource schema.GroupResource, name string, opts metav1.GetOptions) (*autoscalingapi.Scale, error) { + obj, err := f.fake. + Invokes(testing.NewGetSubresourceAction(resource.WithVersion(""), f.namespace, "scale", name), &autoscalingapi.Scale{}) + + if err != nil { + return nil, err + } + + return obj.(*autoscalingapi.Scale), err +} + +func (f *fakeNamespacedScaleClient) Update(ctx context.Context, resource schema.GroupResource, scale *autoscalingapi.Scale, opts metav1.UpdateOptions) (*autoscalingapi.Scale, error) { + obj, err := f.fake. + Invokes(testing.NewUpdateSubresourceAction(resource.WithVersion(""), f.namespace, "scale", scale), &autoscalingapi.Scale{}) + + if err != nil { + return nil, err + } + + return obj.(*autoscalingapi.Scale), err +} + +func (f *fakeNamespacedScaleClient) Patch(ctx context.Context, gvr schema.GroupVersionResource, name string, pt types.PatchType, patch []byte, opts metav1.PatchOptions) (*autoscalingapi.Scale, error) { + obj, err := f.fake. + Invokes(testing.NewPatchSubresourceAction(gvr, f.namespace, name, pt, patch, "scale"), &autoscalingapi.Scale{}) + + if err != nil { + return nil, err + } + + return obj.(*autoscalingapi.Scale), err +} diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/cache/OWNERS b/cluster-autoscaler/vendor/k8s.io/client-go/tools/cache/OWNERS index bd61bc76660d..7bbe635426a4 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/cache/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/cache/OWNERS @@ -26,7 +26,6 @@ reviewers: - pmorie - janetkuo - justinsb -- eparis - soltysh - jsafrane - dims @@ -38,7 +37,6 @@ reviewers: - ingvagabund - resouer - jessfraz -- david-mcmahon - mfojtik - mqliang - sdminonne diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/config.go b/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/config.go index 0babd45f8826..5f1660bf93b3 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/config.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/clientcmd/config.go @@ -58,6 +58,15 @@ type PathOptions struct { LoadingRules *ClientConfigLoadingRules } +var ( + // UseModifyConfigLock ensures that access to kubeconfig file using ModifyConfig method + // is being guarded by a lock file. + // This variable is intentionaly made public so other consumers of this library + // can modify its default behavior, but be caution when disabling it since + // this will make your code not threadsafe. + UseModifyConfigLock = true +) + func (o *PathOptions) GetEnvVarFiles() []string { if len(o.EnvVar) == 0 { return []string{} @@ -156,15 +165,17 @@ func NewDefaultPathOptions() *PathOptions { // that means that this code will only write into a single file. If you want to relativizePaths, you must provide a fully qualified path in any // modified element. func ModifyConfig(configAccess ConfigAccess, newConfig clientcmdapi.Config, relativizePaths bool) error { - possibleSources := configAccess.GetLoadingPrecedence() - // sort the possible kubeconfig files so we always "lock" in the same order - // to avoid deadlock (note: this can fail w/ symlinks, but... come on). - sort.Strings(possibleSources) - for _, filename := range possibleSources { - if err := lockFile(filename); err != nil { - return err + if UseModifyConfigLock { + possibleSources := configAccess.GetLoadingPrecedence() + // sort the possible kubeconfig files so we always "lock" in the same order + // to avoid deadlock (note: this can fail w/ symlinks, but... come on). + sort.Strings(possibleSources) + for _, filename := range possibleSources { + if err := lockFile(filename); err != nil { + return err + } + defer unlockFile(filename) } - defer unlockFile(filename) } startingConfig, err := configAccess.GetStartingConfig() diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/BUILD b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/BUILD index 7e992522dacb..fa0f66031f5b 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/BUILD @@ -14,10 +14,11 @@ go_library( visibility = ["//visibility:public"], deps = [ "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", @@ -27,7 +28,7 @@ go_library( "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", - "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1beta1:go_default_library", + "//staging/src/k8s.io/client-go/kubernetes/typed/events/v1:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", "//staging/src/k8s.io/client-go/tools/record/util:go_default_library", @@ -42,7 +43,7 @@ go_test( embed = [":go_default_library"], deps = [ "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_broadcaster.go b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_broadcaster.go index 6fdbaab6b3d9..3c6870a20d54 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_broadcaster.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_broadcaster.go @@ -17,27 +17,29 @@ limitations under the License. package events import ( + "context" + "fmt" "os" "sync" "time" corev1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/clock" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/watch" - restclient "k8s.io/client-go/rest" - - "k8s.io/api/events/v1beta1" "k8s.io/apimachinery/pkg/util/json" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/kubernetes/scheme" typedv1core "k8s.io/client-go/kubernetes/typed/core/v1" - typedv1beta1 "k8s.io/client-go/kubernetes/typed/events/v1beta1" + typedeventsv1 "k8s.io/client-go/kubernetes/typed/events/v1" + restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" "k8s.io/client-go/tools/record/util" "k8s.io/klog/v2" @@ -64,40 +66,49 @@ type eventKey struct { type eventBroadcasterImpl struct { *watch.Broadcaster mu sync.Mutex - eventCache map[eventKey]*v1beta1.Event + eventCache map[eventKey]*eventsv1.Event sleepDuration time.Duration sink EventSink } -// EventSinkImpl wraps EventInterface to implement EventSink. +// EventSinkImpl wraps EventsV1Interface to implement EventSink. // TODO: this makes it easier for testing purpose and masks the logic of performing API calls. // Note that rollbacking to raw clientset should also be transparent. type EventSinkImpl struct { - Interface typedv1beta1.EventInterface + Interface typedeventsv1.EventsV1Interface } -// Create is the same as CreateWithEventNamespace of the EventExpansion -func (e *EventSinkImpl) Create(event *v1beta1.Event) (*v1beta1.Event, error) { - return e.Interface.CreateWithEventNamespace(event) +// Create takes the representation of a event and creates it. Returns the server's representation of the event, and an error, if there is any. +func (e *EventSinkImpl) Create(event *eventsv1.Event) (*eventsv1.Event, error) { + if event.Namespace == "" { + return nil, fmt.Errorf("can't create an event with empty namespace") + } + return e.Interface.Events(event.Namespace).Create(context.TODO(), event, metav1.CreateOptions{}) } -// Update is the same as UpdateithEventNamespace of the EventExpansion -func (e *EventSinkImpl) Update(event *v1beta1.Event) (*v1beta1.Event, error) { - return e.Interface.UpdateWithEventNamespace(event) +// Update takes the representation of a event and updates it. Returns the server's representation of the event, and an error, if there is any. +func (e *EventSinkImpl) Update(event *eventsv1.Event) (*eventsv1.Event, error) { + if event.Namespace == "" { + return nil, fmt.Errorf("can't update an event with empty namespace") + } + return e.Interface.Events(event.Namespace).Update(context.TODO(), event, metav1.UpdateOptions{}) } -// Patch is the same as PatchWithEventNamespace of the EventExpansion -func (e *EventSinkImpl) Patch(event *v1beta1.Event, data []byte) (*v1beta1.Event, error) { - return e.Interface.PatchWithEventNamespace(event, data) +// Patch applies the patch and returns the patched event, and an error, if there is any. +func (e *EventSinkImpl) Patch(event *eventsv1.Event, data []byte) (*eventsv1.Event, error) { + if event.Namespace == "" { + return nil, fmt.Errorf("can't patch an event with empty namespace") + } + return e.Interface.Events(event.Namespace).Patch(context.TODO(), event.Name, types.StrategicMergePatchType, data, metav1.PatchOptions{}) } // NewBroadcaster Creates a new event broadcaster. func NewBroadcaster(sink EventSink) EventBroadcaster { - return newBroadcaster(sink, defaultSleepDuration, map[eventKey]*v1beta1.Event{}) + return newBroadcaster(sink, defaultSleepDuration, map[eventKey]*eventsv1.Event{}) } // NewBroadcasterForTest Creates a new event broadcaster for test purposes. -func newBroadcaster(sink EventSink, sleepDuration time.Duration, eventCache map[eventKey]*v1beta1.Event) EventBroadcaster { +func newBroadcaster(sink EventSink, sleepDuration time.Duration, eventCache map[eventKey]*eventsv1.Event) EventBroadcaster { return &eventBroadcasterImpl{ Broadcaster: watch.NewBroadcaster(maxQueuedEvents, watch.DropIfChannelFull), eventCache: eventCache, @@ -154,11 +165,11 @@ func (e *eventBroadcasterImpl) NewRecorder(scheme *runtime.Scheme, reportingCont return &recorderImpl{scheme, reportingController, reportingInstance, e.Broadcaster, clock.RealClock{}} } -func (e *eventBroadcasterImpl) recordToSink(event *v1beta1.Event, clock clock.Clock) { +func (e *eventBroadcasterImpl) recordToSink(event *eventsv1.Event, clock clock.Clock) { // Make a copy before modification, because there could be multiple listeners. eventCopy := event.DeepCopy() go func() { - evToRecord := func() *v1beta1.Event { + evToRecord := func() *eventsv1.Event { e.mu.Lock() defer e.mu.Unlock() eventKey := getKey(eventCopy) @@ -169,7 +180,7 @@ func (e *eventBroadcasterImpl) recordToSink(event *v1beta1.Event, clock clock.Cl isomorphicEvent.Series.LastObservedTime = metav1.MicroTime{Time: clock.Now()} return nil } - isomorphicEvent.Series = &v1beta1.EventSeries{ + isomorphicEvent.Series = &eventsv1.EventSeries{ Count: 1, LastObservedTime: metav1.MicroTime{Time: clock.Now()}, } @@ -190,7 +201,7 @@ func (e *eventBroadcasterImpl) recordToSink(event *v1beta1.Event, clock clock.Cl }() } -func (e *eventBroadcasterImpl) attemptRecording(event *v1beta1.Event) *v1beta1.Event { +func (e *eventBroadcasterImpl) attemptRecording(event *eventsv1.Event) *eventsv1.Event { tries := 0 for { if recordedEvent, retry := recordEvent(e.sink, event); !retry { @@ -207,8 +218,8 @@ func (e *eventBroadcasterImpl) attemptRecording(event *v1beta1.Event) *v1beta1.E } } -func recordEvent(sink EventSink, event *v1beta1.Event) (*v1beta1.Event, bool) { - var newEvent *v1beta1.Event +func recordEvent(sink EventSink, event *eventsv1.Event) (*eventsv1.Event, bool) { + var newEvent *eventsv1.Event var err error isEventSeries := event.Series != nil if isEventSeries { @@ -252,7 +263,7 @@ func recordEvent(sink EventSink, event *v1beta1.Event) (*v1beta1.Event, bool) { return nil, true } -func createPatchBytesForSeries(event *v1beta1.Event) ([]byte, error) { +func createPatchBytesForSeries(event *eventsv1.Event) ([]byte, error) { oldEvent := event.DeepCopy() oldEvent.Series = nil oldData, err := json.Marshal(oldEvent) @@ -263,10 +274,10 @@ func createPatchBytesForSeries(event *v1beta1.Event) ([]byte, error) { if err != nil { return nil, err } - return strategicpatch.CreateTwoWayMergePatch(oldData, newData, v1beta1.Event{}) + return strategicpatch.CreateTwoWayMergePatch(oldData, newData, eventsv1.Event{}) } -func getKey(event *v1beta1.Event) eventKey { +func getKey(event *eventsv1.Event) eventKey { key := eventKey{ action: event.Action, reason: event.Reason, @@ -305,9 +316,9 @@ func (e *eventBroadcasterImpl) StartRecordingToSink(stopCh <-chan struct{}) { e.finishSeries() }, finishTime, stopCh) eventHandler := func(obj runtime.Object) { - event, ok := obj.(*v1beta1.Event) + event, ok := obj.(*eventsv1.Event) if !ok { - klog.Errorf("unexpected type, expected v1beta1.Event") + klog.Errorf("unexpected type, expected eventsv1.Event") return } e.recordToSink(event, clock.RealClock{}) @@ -320,19 +331,19 @@ func (e *eventBroadcasterImpl) StartRecordingToSink(stopCh <-chan struct{}) { } type eventBroadcasterAdapterImpl struct { - coreClient typedv1core.EventsGetter - coreBroadcaster record.EventBroadcaster - v1beta1Client typedv1beta1.EventsGetter - v1beta1Broadcaster EventBroadcaster + coreClient typedv1core.EventsGetter + coreBroadcaster record.EventBroadcaster + eventsv1Client typedeventsv1.EventsV1Interface + eventsv1Broadcaster EventBroadcaster } // NewEventBroadcasterAdapter creates a wrapper around new and legacy broadcasters to simplify // migration of individual components to the new Event API. func NewEventBroadcasterAdapter(client clientset.Interface) EventBroadcasterAdapter { eventClient := &eventBroadcasterAdapterImpl{} - if _, err := client.Discovery().ServerResourcesForGroupVersion(v1beta1.SchemeGroupVersion.String()); err == nil { - eventClient.v1beta1Client = client.EventsV1beta1() - eventClient.v1beta1Broadcaster = NewBroadcaster(&EventSinkImpl{Interface: eventClient.v1beta1Client.Events("")}) + if _, err := client.Discovery().ServerResourcesForGroupVersion(eventsv1.SchemeGroupVersion.String()); err == nil { + eventClient.eventsv1Client = client.EventsV1() + eventClient.eventsv1Broadcaster = NewBroadcaster(&EventSinkImpl{Interface: eventClient.eventsv1Client}) } // Even though there can soon exist cases when coreBroadcaster won't really be needed, // we create it unconditionally because its overhead is minor and will simplify using usage @@ -344,8 +355,8 @@ func NewEventBroadcasterAdapter(client clientset.Interface) EventBroadcasterAdap // StartRecordingToSink starts sending events received from the specified eventBroadcaster to the given sink. func (e *eventBroadcasterAdapterImpl) StartRecordingToSink(stopCh <-chan struct{}) { - if e.v1beta1Broadcaster != nil && e.v1beta1Client != nil { - e.v1beta1Broadcaster.StartRecordingToSink(stopCh) + if e.eventsv1Broadcaster != nil && e.eventsv1Client != nil { + e.eventsv1Broadcaster.StartRecordingToSink(stopCh) } if e.coreBroadcaster != nil && e.coreClient != nil { e.coreBroadcaster.StartRecordingToSink(&typedv1core.EventSinkImpl{Interface: e.coreClient.Events("")}) @@ -353,8 +364,8 @@ func (e *eventBroadcasterAdapterImpl) StartRecordingToSink(stopCh <-chan struct{ } func (e *eventBroadcasterAdapterImpl) NewRecorder(name string) EventRecorder { - if e.v1beta1Broadcaster != nil && e.v1beta1Client != nil { - return e.v1beta1Broadcaster.NewRecorder(scheme.Scheme, name) + if e.eventsv1Broadcaster != nil && e.eventsv1Client != nil { + return e.eventsv1Broadcaster.NewRecorder(scheme.Scheme, name) } return record.NewEventRecorderAdapter(e.DeprecatedNewLegacyRecorder(name)) } @@ -367,7 +378,7 @@ func (e *eventBroadcasterAdapterImpl) Shutdown() { if e.coreBroadcaster != nil { e.coreBroadcaster.Shutdown() } - if e.v1beta1Broadcaster != nil { - e.v1beta1Broadcaster.Shutdown() + if e.eventsv1Broadcaster != nil { + e.eventsv1Broadcaster.Shutdown() } } diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_recorder.go b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_recorder.go index 0aa60356fea5..2837cc1603c6 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_recorder.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/event_recorder.go @@ -21,15 +21,14 @@ import ( "time" v1 "k8s.io/api/core/v1" + eventsv1 "k8s.io/api/events/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/clock" utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/watch" - "k8s.io/client-go/tools/reference" - - "k8s.io/api/events/v1beta1" "k8s.io/client-go/tools/record/util" + "k8s.io/client-go/tools/reference" "k8s.io/klog/v2" ) @@ -64,13 +63,13 @@ func (recorder *recorderImpl) Eventf(regarding runtime.Object, related runtime.O }() } -func (recorder *recorderImpl) makeEvent(refRegarding *v1.ObjectReference, refRelated *v1.ObjectReference, timestamp metav1.MicroTime, eventtype, reason, message string, reportingController string, reportingInstance string, action string) *v1beta1.Event { +func (recorder *recorderImpl) makeEvent(refRegarding *v1.ObjectReference, refRelated *v1.ObjectReference, timestamp metav1.MicroTime, eventtype, reason, message string, reportingController string, reportingInstance string, action string) *eventsv1.Event { t := metav1.Time{Time: recorder.clock.Now()} namespace := refRegarding.Namespace if namespace == "" { namespace = metav1.NamespaceDefault } - return &v1beta1.Event{ + return &eventsv1.Event{ ObjectMeta: metav1.ObjectMeta{ Name: fmt.Sprintf("%v.%x", refRegarding.Name, t.UnixNano()), Namespace: namespace, @@ -85,8 +84,5 @@ func (recorder *recorderImpl) makeEvent(refRegarding *v1.ObjectReference, refRel Related: refRelated, Note: message, Type: eventtype, - // TODO: remove this when we change conversion to convert eventSource - // to reportingController - DeprecatedSource: v1.EventSource{Component: reportingController}, } } diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/interfaces.go b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/interfaces.go index b54f7c9c5601..f1a523caa8e9 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/interfaces.go +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/events/interfaces.go @@ -17,7 +17,7 @@ limitations under the License. package events import ( - "k8s.io/api/events/v1beta1" + eventsv1 "k8s.io/api/events/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/tools/record" ) @@ -65,9 +65,9 @@ type EventBroadcaster interface { // It is assumed that EventSink will return the same sorts of errors as // client-go's REST client. type EventSink interface { - Create(event *v1beta1.Event) (*v1beta1.Event, error) - Update(event *v1beta1.Event) (*v1beta1.Event, error) - Patch(oldEvent *v1beta1.Event, data []byte) (*v1beta1.Event, error) + Create(event *eventsv1.Event) (*eventsv1.Event, error) + Update(event *eventsv1.Event) (*eventsv1.Event, error) + Patch(oldEvent *eventsv1.Event, data []byte) (*eventsv1.Event, error) } // EventBroadcasterAdapter is a auxiliary interface to simplify migration to diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/leaderelection/OWNERS b/cluster-autoscaler/vendor/k8s.io/client-go/tools/leaderelection/OWNERS index 44d93f84fa31..9ece5e1ea4b7 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/leaderelection/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/leaderelection/OWNERS @@ -8,7 +8,6 @@ reviewers: - deads2k - mikedanese - gmarek -- eparis - timothysc - ingvagabund - resouer diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/metrics/OWNERS b/cluster-autoscaler/vendor/k8s.io/client-go/tools/metrics/OWNERS index ad52d0c5cc01..77bcb5090cef 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/metrics/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/metrics/OWNERS @@ -2,6 +2,5 @@ reviewers: - wojtek-t -- eparis - krousey - jayunit100 diff --git a/cluster-autoscaler/vendor/k8s.io/client-go/tools/record/OWNERS b/cluster-autoscaler/vendor/k8s.io/client-go/tools/record/OWNERS index 6ce73bb5cd30..792f356b0db1 100644 --- a/cluster-autoscaler/vendor/k8s.io/client-go/tools/record/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/client-go/tools/record/OWNERS @@ -17,7 +17,6 @@ reviewers: - saad-ali - luxas - yifan-gu -- eparis - mwielgus - timothysc - jsafrane diff --git a/cluster-autoscaler/vendor/k8s.io/cloud-provider/OWNERS b/cluster-autoscaler/vendor/k8s.io/cloud-provider/OWNERS index b3ed1ca6640a..b5c5205c9d84 100644 --- a/cluster-autoscaler/vendor/k8s.io/cloud-provider/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/cloud-provider/OWNERS @@ -20,10 +20,8 @@ reviewers: - quinton-hoole - dchen1107 - saad-ali -- zmerlynn - luxas - justinsb -- eparis - piosz - jsafrane - dims diff --git a/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.mod b/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.mod index 5d827e4f64b5..1c7d615422ce 100644 --- a/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.mod +++ b/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.mod @@ -11,7 +11,7 @@ require ( k8s.io/apimachinery v0.0.0 k8s.io/client-go v0.0.0 k8s.io/component-base v0.0.0 - k8s.io/klog/v2 v2.1.0 + k8s.io/klog/v2 v2.2.0 k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 ) diff --git a/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.sum b/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.sum index 39f44acabe23..dd6c44b2a731 100644 --- a/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.sum +++ b/cluster-autoscaler/vendor/k8s.io/cloud-provider/go.sum @@ -68,6 +68,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= @@ -381,8 +383,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.1.0 h1:X3+Mru/L3jy4BI4vcAYkHvL6PyU+QBsuhEqwlI4mgkA= -k8s.io/klog/v2 v2.1.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 h1:5NC2ITmvg8RoxoH0wgmL4zn4VZqXGsKbxrikjaQx6s4= k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9/go.mod h1:bfCVj+qXcEaE5SCvzBaqpOySr6tuCcpPKqF6HD8nyCw= k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 h1:7Nu2dTj82c6IaWvL7hImJzcXoTPz1MsSCH7r+0m6rfo= diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/types.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/types.go index da11e03c2c6d..489cd880b159 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/types.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/types.go @@ -78,3 +78,11 @@ type DebuggingConfiguration struct { // enableProfiling is true. EnableContentionProfiling bool } + +// LoggingConfiguration contains logging options +type LoggingConfiguration struct { + // Format Flag specifies the structure of log messages. + // default value of format is `text` + // Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. + Format string +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/conversion.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/conversion.go index e2951e310d51..abf35c6d910c 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/conversion.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/conversion.go @@ -51,3 +51,11 @@ func Convert_v1alpha1_LeaderElectionConfiguration_To_config_LeaderElectionConfig func Convert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfiguration(in *config.LeaderElectionConfiguration, out *LeaderElectionConfiguration, s conversion.Scope) error { return autoConvert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionConfiguration(in, out, s) } + +func Convert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in *LoggingConfiguration, out *config.LoggingConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in, out, s) +} + +func Convert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in *config.LoggingConfiguration, out *LoggingConfiguration, s conversion.Scope) error { + return autoConvert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in, out, s) +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/defaults.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/defaults.go index 05ad82d3eb00..bbf08e11805f 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/defaults.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/defaults.go @@ -95,3 +95,18 @@ func NewRecommendedDebuggingConfiguration() *DebuggingConfiguration { RecommendedDebuggingConfiguration(ret) return ret } + +// RecommendedLoggingConfiguration defaults logging configuration. +// This will set the recommended default +// values, but they may be subject to change between API versions. This function +// is intentionally not registered in the scheme as a "normal" `SetDefaults_Foo` +// function to allow consumers of this type to set whatever defaults for their +// embedded configs. Forcing consumers to use these defaults would be problematic +// as defaulting in the scheme is done as part of the conversion, and there would +// be no easy way to opt-out. Instead, if you want to use this defaulting method +// run it in your wrapper struct of this type in its `SetDefaults_` method. +func RecommendedLoggingConfiguration(obj *LoggingConfiguration) { + if obj.Format == "" { + obj.Format = "text" + } +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/types.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/types.go index c9d05525d437..1bbbc691c72b 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/types.go @@ -80,3 +80,11 @@ type ClientConnectionConfiguration struct { // burst allows extra queries to accumulate when a client is exceeding its rate. Burst int32 `json:"burst"` } + +// LoggingConfiguration contains logging options +type LoggingConfiguration struct { + // Format Flag specifies the structure of log messages. + // default value of format is `text` + // Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. + Format string `json:"format,omitempty"` +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go index 4e4acf309eaa..00f287388696 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.conversion.go @@ -49,6 +49,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*config.LoggingConfiguration)(nil), (*LoggingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(a.(*config.LoggingConfiguration), b.(*LoggingConfiguration), scope) + }); err != nil { + return err + } if err := s.AddConversionFunc((*ClientConnectionConfiguration)(nil), (*config.ClientConnectionConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ClientConnectionConfiguration_To_config_ClientConnectionConfiguration(a.(*ClientConnectionConfiguration), b.(*config.ClientConnectionConfiguration), scope) }); err != nil { @@ -64,6 +69,11 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddConversionFunc((*LoggingConfiguration)(nil), (*config.LoggingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(a.(*LoggingConfiguration), b.(*config.LoggingConfiguration), scope) + }); err != nil { + return err + } return nil } @@ -130,3 +140,13 @@ func autoConvert_config_LeaderElectionConfiguration_To_v1alpha1_LeaderElectionCo out.ResourceNamespace = in.ResourceNamespace return nil } + +func autoConvert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(in *LoggingConfiguration, out *config.LoggingConfiguration, s conversion.Scope) error { + out.Format = in.Format + return nil +} + +func autoConvert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(in *config.LoggingConfiguration, out *LoggingConfiguration, s conversion.Scope) error { + out.Format = in.Format + return nil +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go index 629bf65f9d91..f5f2a0e91ee0 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/v1alpha1/zz_generated.deepcopy.go @@ -85,3 +85,19 @@ func (in *LeaderElectionConfiguration) DeepCopy() *LeaderElectionConfiguration { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LoggingConfiguration) DeepCopyInto(out *LoggingConfiguration) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoggingConfiguration. +func (in *LoggingConfiguration) DeepCopy() *LoggingConfiguration { + if in == nil { + return nil + } + out := new(LoggingConfiguration) + in.DeepCopyInto(out) + return out +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go index 9812234f1308..77260a06f00b 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/config/zz_generated.deepcopy.go @@ -70,3 +70,19 @@ func (in *LeaderElectionConfiguration) DeepCopy() *LeaderElectionConfiguration { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LoggingConfiguration) DeepCopyInto(out *LoggingConfiguration) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LoggingConfiguration. +func (in *LoggingConfiguration) DeepCopy() *LoggingConfiguration { + if in == nil { + return nil + } + out := new(LoggingConfiguration) + in.DeepCopyInto(out) + return out +} diff --git a/cluster-autoscaler/vendor/k8s.io/component-base/logs/json/json.go b/cluster-autoscaler/vendor/k8s.io/component-base/logs/json/json.go index 6f113807ef24..3d7f9187fabf 100644 --- a/cluster-autoscaler/vendor/k8s.io/component-base/logs/json/json.go +++ b/cluster-autoscaler/vendor/k8s.io/component-base/logs/json/json.go @@ -35,32 +35,23 @@ var ( timeNow = time.Now ) -type noopInfoLogger struct{} - -// Enabled func in noopInfoLogger always return false -func (l *noopInfoLogger) Enabled() bool { - return false -} - -func (l *noopInfoLogger) Info(_ string, _ ...interface{}) {} - -var disabledInfoLogger = &noopInfoLogger{} - -type infoLogger struct { - lvl zapcore.Level +// zapLogger is a logr.Logger that uses Zap to record log. +type zapLogger struct { + // NB: this looks very similar to zap.SugaredLogger, but + // deals with our desire to have multiple verbosity levels. l *zap.Logger + lvl zapcore.Level } -// implement logr.InfoLogger -var _ logr.InfoLogger = &infoLogger{} +// implement logr.Logger +var _ logr.Logger = &zapLogger{} -// Enabled always return true -func (l *infoLogger) Enabled() bool { - return true +func (l *zapLogger) Enabled() bool { + return l.l.Core().Enabled(l.lvl) } // Info write message to error level log -func (l *infoLogger) Info(msg string, keysAndVals ...interface{}) { +func (l *zapLogger) Info(msg string, keysAndVals ...interface{}) { if checkedEntry := l.l.Check(l.lvl, msg); checkedEntry != nil { checkedEntry.Time = timeNow() checkedEntry.Write(l.handleFields(keysAndVals)...) @@ -70,7 +61,7 @@ func (l *infoLogger) Info(msg string, keysAndVals ...interface{}) { // dPanic write message to DPanicLevel level log // we need implement this because unit test case need stub time.Now // otherwise the ts field always changed -func (l *infoLogger) dPanic(msg string, keysAndVals ...interface{}) { +func (l *zapLogger) dPanic(msg string, keysAndVals ...interface{}) { entry := zapcore.Entry{ Level: zapcore.DPanicLevel, Time: timeNow(), @@ -83,7 +74,7 @@ func (l *infoLogger) dPanic(msg string, keysAndVals ...interface{}) { // handleFields converts a bunch of arbitrary key-value pairs into Zap fields. It takes // additional pre-converted Zap fields, for use with automatically attached fields, like // `error`. -func (l *infoLogger) handleFields(args []interface{}, additional ...zap.Field) []zap.Field { +func (l *zapLogger) handleFields(args []interface{}, additional ...zap.Field) []zap.Field { // a slightly modified version of zap.SugaredLogger.sweetenFields if len(args) == 0 { // fast-return if we have no suggared fields. @@ -118,17 +109,6 @@ func (l *infoLogger) handleFields(args []interface{}, additional ...zap.Field) [ return append(fields, additional...) } -// zapLogger is a logr.Logger that uses Zap to record log. -type zapLogger struct { - // NB: this looks very similar to zap.SugaredLogger, but - // deals with our desire to have multiple verbosity levels. - l *zap.Logger - infoLogger -} - -// implement logr.Logger -var _ logr.Logger = &zapLogger{} - // Error write log message to error level func (l *zapLogger) Error(err error, msg string, keysAndVals ...interface{}) { entry := zapcore.Entry{ @@ -141,15 +121,11 @@ func (l *zapLogger) Error(err error, msg string, keysAndVals ...interface{}) { } // V return info logr.Logger with specified level -func (l *zapLogger) V(level int) logr.InfoLogger { - lvl := zapcore.Level(-1 * level) - if l.l.Core().Enabled(lvl) { - return &infoLogger{ - l: l.l, - lvl: lvl, - } +func (l *zapLogger) V(level int) logr.Logger { + return &zapLogger{ + lvl: l.lvl - zapcore.Level(level), + l: l.l, } - return disabledInfoLogger } // WithValues return logr.Logger with some keys And Values @@ -186,11 +162,8 @@ func NewJSONLogger(l *zap.Logger, w zapcore.WriteSyncer) logr.Logger { return zapcore.NewCore(zapcore.NewJSONEncoder(encoderConfig), zapcore.AddSync(w), zapcore.DebugLevel) })) return &zapLogger{ - l: log, - infoLogger: infoLogger{ - l: log, - lvl: zap.DebugLevel, - }, + l: log, + lvl: zap.DebugLevel, } } diff --git a/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.mod b/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.mod index 7d6a4eb32174..5d6aba4bfd40 100644 --- a/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.mod +++ b/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.mod @@ -9,7 +9,7 @@ require ( k8s.io/api v0.0.0 k8s.io/apimachinery v0.0.0 k8s.io/cloud-provider v0.0.0 - k8s.io/klog/v2 v2.1.0 + k8s.io/klog/v2 v2.2.0 ) replace ( diff --git a/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.sum b/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.sum index 86b208ee39f6..78a618d7d57b 100644 --- a/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.sum +++ b/cluster-autoscaler/vendor/k8s.io/csi-translation-lib/go.sum @@ -63,6 +63,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= @@ -354,8 +356,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0 h1:Foj74zO6RbjjP4hBEKjnYtjjAhGg4jNynUdYF6fJrok= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.1.0 h1:X3+Mru/L3jy4BI4vcAYkHvL6PyU+QBsuhEqwlI4mgkA= -k8s.io/klog/v2 v2.1.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.2.0 h1:XRvcwJozkgZ1UQJmfMGpvRthQHOvihEhYtDfAaxMz/A= +k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9/go.mod h1:bfCVj+qXcEaE5SCvzBaqpOySr6tuCcpPKqF6HD8nyCw= k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/cluster-autoscaler/vendor/k8s.io/klog/v2/go.mod b/cluster-autoscaler/vendor/k8s.io/klog/v2/go.mod index f50b2581499b..e396e31c0656 100644 --- a/cluster-autoscaler/vendor/k8s.io/klog/v2/go.mod +++ b/cluster-autoscaler/vendor/k8s.io/klog/v2/go.mod @@ -2,4 +2,4 @@ module k8s.io/klog/v2 go 1.13 -require github.com/go-logr/logr v0.1.0 +require github.com/go-logr/logr v0.2.0 diff --git a/cluster-autoscaler/vendor/k8s.io/klog/v2/go.sum b/cluster-autoscaler/vendor/k8s.io/klog/v2/go.sum index fb64d277a7af..8dfa7854289a 100644 --- a/cluster-autoscaler/vendor/k8s.io/klog/v2/go.sum +++ b/cluster-autoscaler/vendor/k8s.io/klog/v2/go.sum @@ -1,2 +1,2 @@ -github.com/go-logr/logr v0.1.0 h1:M1Tv3VzNlEHg6uyACnRdtrploV2P7wZqH8BoQMtz0cg= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= diff --git a/cluster-autoscaler/vendor/k8s.io/klog/v2/klog.go b/cluster-autoscaler/vendor/k8s.io/klog/v2/klog.go index d339ea8953ca..ae2b861382b1 100644 --- a/cluster-autoscaler/vendor/k8s.io/klog/v2/klog.go +++ b/cluster-autoscaler/vendor/k8s.io/klog/v2/klog.go @@ -687,7 +687,7 @@ func (buf *buffer) someDigits(i, d int) int { return copy(buf.tmp[i:], buf.tmp[j:]) } -func (l *loggingT) println(s severity, logr logr.InfoLogger, args ...interface{}) { +func (l *loggingT) println(s severity, logr logr.Logger, args ...interface{}) { buf, file, line := l.header(s, 0) // if logr is set, we clear the generated header as we rely on the backing // logr implementation to print headers @@ -699,11 +699,11 @@ func (l *loggingT) println(s severity, logr logr.InfoLogger, args ...interface{} l.output(s, logr, buf, file, line, false) } -func (l *loggingT) print(s severity, logr logr.InfoLogger, args ...interface{}) { +func (l *loggingT) print(s severity, logr logr.Logger, args ...interface{}) { l.printDepth(s, logr, 1, args...) } -func (l *loggingT) printDepth(s severity, logr logr.InfoLogger, depth int, args ...interface{}) { +func (l *loggingT) printDepth(s severity, logr logr.Logger, depth int, args ...interface{}) { buf, file, line := l.header(s, depth) // if logr is set, we clear the generated header as we rely on the backing // logr implementation to print headers @@ -718,7 +718,7 @@ func (l *loggingT) printDepth(s severity, logr logr.InfoLogger, depth int, args l.output(s, logr, buf, file, line, false) } -func (l *loggingT) printf(s severity, logr logr.InfoLogger, format string, args ...interface{}) { +func (l *loggingT) printf(s severity, logr logr.Logger, format string, args ...interface{}) { buf, file, line := l.header(s, 0) // if logr is set, we clear the generated header as we rely on the backing // logr implementation to print headers @@ -736,7 +736,7 @@ func (l *loggingT) printf(s severity, logr logr.InfoLogger, format string, args // printWithFileLine behaves like print but uses the provided file and line number. If // alsoLogToStderr is true, the log message always appears on standard error; it // will also appear in the log file unless --logtostderr is set. -func (l *loggingT) printWithFileLine(s severity, logr logr.InfoLogger, file string, line int, alsoToStderr bool, args ...interface{}) { +func (l *loggingT) printWithFileLine(s severity, logr logr.Logger, file string, line int, alsoToStderr bool, args ...interface{}) { buf := l.formatHeader(s, file, line) // if logr is set, we clear the generated header as we rely on the backing // logr implementation to print headers @@ -761,7 +761,7 @@ func (l *loggingT) errorS(err error, loggr logr.Logger, msg string, keysAndValue } // if loggr is specified, will call loggr.Info, otherwise output with logging module. -func (l *loggingT) infoS(loggr logr.InfoLogger, msg string, keysAndValues ...interface{}) { +func (l *loggingT) infoS(loggr logr.Logger, msg string, keysAndValues ...interface{}) { if loggr != nil { loggr.Info(msg, keysAndValues) return @@ -878,7 +878,7 @@ func LogToStderr(stderr bool) { } // output writes the data to the log files and releases the buffer. -func (l *loggingT) output(s severity, log logr.InfoLogger, buf *buffer, file string, line int, alsoToStderr bool) { +func (l *loggingT) output(s severity, log logr.Logger, buf *buffer, file string, line int, alsoToStderr bool) { l.mu.Lock() if l.traceLocation.isSet() { if l.traceLocation.match(file, line) { @@ -1231,7 +1231,7 @@ func (l *loggingT) setV(pc uintptr) Level { // See the documentation of V for more information. type Verbose struct { enabled bool - logr logr.InfoLogger + logr logr.Logger } func newVerbose(level Level, b bool) Verbose { @@ -1320,7 +1320,15 @@ func (v Verbose) Infof(format string, args ...interface{}) { // See the documentation of V for usage. func (v Verbose) InfoS(msg string, keysAndValues ...interface{}) { if v.enabled { - logging.infoS(v.logr, msg, keysAndValues) + logging.infoS(v.logr, msg, keysAndValues...) + } +} + +// Error is equivalent to the global Error function, guarded by the value of v. +// See the documentation of V for usage. +func (v Verbose) Error(err error, msg string, args ...interface{}) { + if v.enabled { + logging.errorS(err, v.logr, msg, args...) } } diff --git a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/BUILD b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/BUILD index 96809c85b2ad..8cb2ba27c0b4 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/BUILD @@ -16,6 +16,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/types.go b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/types.go index 144c1d371dd9..49e848077d74 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/types.go @@ -19,6 +19,7 @@ package v1beta1 import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + componentbaseconfigv1alpha1 "k8s.io/component-base/config/v1alpha1" ) // HairpinMode denotes how the kubelet should configure networking to handle @@ -793,6 +794,16 @@ type KubeletConfiguration struct { // Default: false // +optional KernelMemcgNotification bool `json:"kernelMemcgNotification,omitempty"` + // Logging specifies the options of logging. + // Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. + // Defaults: + // Format: text + // + optional + Logging componentbaseconfigv1alpha1.LoggingConfiguration `json:"logging,omitempty"` + // enableSystemLogHandler enables system logs via web interface host:port/logs/ + // Default: true + // +optional + EnableSystemLogHandler *bool `json:"enableSystemLogHandler,omitempty"` } type KubeletAuthorizationMode string diff --git a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go index 176d16432354..fd478f820503 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/kubelet/config/v1beta1/zz_generated.deepcopy.go @@ -295,6 +295,12 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { *out = make([]string, len(*in)) copy(*out, *in) } + out.Logging = in.Logging + if in.EnableSystemLogHandler != nil { + in, out := &in.EnableSystemLogHandler, &out.EnableSystemLogHandler + *out = new(bool) + **out = **in + } return } diff --git a/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go b/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go index baca61f198a5..5f0ff254fe52 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go +++ b/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.pb.go @@ -48,9 +48,11 @@ const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type DevicePluginOptions struct { // Indicates if PreStartContainer call is required before each container start - PreStartRequired bool `protobuf:"varint,1,opt,name=pre_start_required,json=preStartRequired,proto3" json:"pre_start_required,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_sizecache int32 `json:"-"` + PreStartRequired bool `protobuf:"varint,1,opt,name=pre_start_required,json=preStartRequired,proto3" json:"pre_start_required,omitempty"` + // Indicates if GetPreferredAllocation is implemented and available for calling + GetPreferredAllocationAvailable bool `protobuf:"varint,2,opt,name=get_preferred_allocation_available,json=getPreferredAllocationAvailable,proto3" json:"get_preferred_allocation_available,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *DevicePluginOptions) Reset() { *m = DevicePluginOptions{} } @@ -92,6 +94,13 @@ func (m *DevicePluginOptions) GetPreStartRequired() bool { return false } +func (m *DevicePluginOptions) GetGetPreferredAllocationAvailable() bool { + if m != nil { + return m.GetPreferredAllocationAvailable + } + return false +} + type RegisterRequest struct { // Version of the API the Device Plugin was built against Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` @@ -347,7 +356,7 @@ func (m *NUMANode) GetID() int64 { // Health: "Healthy", // Topology: // Node: -//ID: 1 +// ID: 1 //} type Device struct { // A unique ID assigned by the device plugin used @@ -502,6 +511,212 @@ func (m *PreStartContainerResponse) XXX_DiscardUnknown() { var xxx_messageInfo_PreStartContainerResponse proto.InternalMessageInfo +// PreferredAllocationRequest is passed via a call to GetPreferredAllocation() +// at pod admission time. The device plugin should take the list of +// `available_deviceIDs` and calculate a preferred allocation of size +// 'allocation_size' from them, making sure to include the set of devices +// listed in 'must_include_deviceIDs'. +type PreferredAllocationRequest struct { + ContainerRequests []*ContainerPreferredAllocationRequest `protobuf:"bytes,1,rep,name=container_requests,json=containerRequests,proto3" json:"container_requests,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PreferredAllocationRequest) Reset() { *m = PreferredAllocationRequest{} } +func (*PreferredAllocationRequest) ProtoMessage() {} +func (*PreferredAllocationRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{9} +} +func (m *PreferredAllocationRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PreferredAllocationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PreferredAllocationRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PreferredAllocationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_PreferredAllocationRequest.Merge(m, src) +} +func (m *PreferredAllocationRequest) XXX_Size() int { + return m.Size() +} +func (m *PreferredAllocationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_PreferredAllocationRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_PreferredAllocationRequest proto.InternalMessageInfo + +func (m *PreferredAllocationRequest) GetContainerRequests() []*ContainerPreferredAllocationRequest { + if m != nil { + return m.ContainerRequests + } + return nil +} + +type ContainerPreferredAllocationRequest struct { + // List of available deviceIDs from which to choose a preferred allocation + AvailableDeviceIDs []string `protobuf:"bytes,1,rep,name=available_deviceIDs,json=availableDeviceIDs,proto3" json:"available_deviceIDs,omitempty"` + // List of deviceIDs that must be included in the preferred allocation + MustIncludeDeviceIDs []string `protobuf:"bytes,2,rep,name=must_include_deviceIDs,json=mustIncludeDeviceIDs,proto3" json:"must_include_deviceIDs,omitempty"` + // Number of devices to include in the preferred allocation + AllocationSize int32 `protobuf:"varint,3,opt,name=allocation_size,json=allocationSize,proto3" json:"allocation_size,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContainerPreferredAllocationRequest) Reset() { *m = ContainerPreferredAllocationRequest{} } +func (*ContainerPreferredAllocationRequest) ProtoMessage() {} +func (*ContainerPreferredAllocationRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{10} +} +func (m *ContainerPreferredAllocationRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerPreferredAllocationRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContainerPreferredAllocationRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContainerPreferredAllocationRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerPreferredAllocationRequest.Merge(m, src) +} +func (m *ContainerPreferredAllocationRequest) XXX_Size() int { + return m.Size() +} +func (m *ContainerPreferredAllocationRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerPreferredAllocationRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerPreferredAllocationRequest proto.InternalMessageInfo + +func (m *ContainerPreferredAllocationRequest) GetAvailableDeviceIDs() []string { + if m != nil { + return m.AvailableDeviceIDs + } + return nil +} + +func (m *ContainerPreferredAllocationRequest) GetMustIncludeDeviceIDs() []string { + if m != nil { + return m.MustIncludeDeviceIDs + } + return nil +} + +func (m *ContainerPreferredAllocationRequest) GetAllocationSize() int32 { + if m != nil { + return m.AllocationSize + } + return 0 +} + +// PreferredAllocationResponse returns a preferred allocation, +// resulting from a PreferredAllocationRequest. +type PreferredAllocationResponse struct { + ContainerResponses []*ContainerPreferredAllocationResponse `protobuf:"bytes,1,rep,name=container_responses,json=containerResponses,proto3" json:"container_responses,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PreferredAllocationResponse) Reset() { *m = PreferredAllocationResponse{} } +func (*PreferredAllocationResponse) ProtoMessage() {} +func (*PreferredAllocationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{11} +} +func (m *PreferredAllocationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PreferredAllocationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PreferredAllocationResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *PreferredAllocationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_PreferredAllocationResponse.Merge(m, src) +} +func (m *PreferredAllocationResponse) XXX_Size() int { + return m.Size() +} +func (m *PreferredAllocationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_PreferredAllocationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_PreferredAllocationResponse proto.InternalMessageInfo + +func (m *PreferredAllocationResponse) GetContainerResponses() []*ContainerPreferredAllocationResponse { + if m != nil { + return m.ContainerResponses + } + return nil +} + +type ContainerPreferredAllocationResponse struct { + DeviceIDs []string `protobuf:"bytes,1,rep,name=deviceIDs,proto3" json:"deviceIDs,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ContainerPreferredAllocationResponse) Reset() { *m = ContainerPreferredAllocationResponse{} } +func (*ContainerPreferredAllocationResponse) ProtoMessage() {} +func (*ContainerPreferredAllocationResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_00212fb1f9d3bf1c, []int{12} +} +func (m *ContainerPreferredAllocationResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ContainerPreferredAllocationResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ContainerPreferredAllocationResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ContainerPreferredAllocationResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ContainerPreferredAllocationResponse.Merge(m, src) +} +func (m *ContainerPreferredAllocationResponse) XXX_Size() int { + return m.Size() +} +func (m *ContainerPreferredAllocationResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ContainerPreferredAllocationResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ContainerPreferredAllocationResponse proto.InternalMessageInfo + +func (m *ContainerPreferredAllocationResponse) GetDeviceIDs() []string { + if m != nil { + return m.DeviceIDs + } + return nil +} + // - Allocate is expected to be called during pod creation since allocation // failures for any container would result in pod startup failure. // - Allocate allows kubelet to exposes additional artifacts in a pod's @@ -517,7 +732,7 @@ type AllocateRequest struct { func (m *AllocateRequest) Reset() { *m = AllocateRequest{} } func (*AllocateRequest) ProtoMessage() {} func (*AllocateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{9} + return fileDescriptor_00212fb1f9d3bf1c, []int{13} } func (m *AllocateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -562,7 +777,7 @@ type ContainerAllocateRequest struct { func (m *ContainerAllocateRequest) Reset() { *m = ContainerAllocateRequest{} } func (*ContainerAllocateRequest) ProtoMessage() {} func (*ContainerAllocateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{10} + return fileDescriptor_00212fb1f9d3bf1c, []int{14} } func (m *ContainerAllocateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -615,7 +830,7 @@ type AllocateResponse struct { func (m *AllocateResponse) Reset() { *m = AllocateResponse{} } func (*AllocateResponse) ProtoMessage() {} func (*AllocateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{11} + return fileDescriptor_00212fb1f9d3bf1c, []int{15} } func (m *AllocateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -667,7 +882,7 @@ type ContainerAllocateResponse struct { func (m *ContainerAllocateResponse) Reset() { *m = ContainerAllocateResponse{} } func (*ContainerAllocateResponse) ProtoMessage() {} func (*ContainerAllocateResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{12} + return fileDescriptor_00212fb1f9d3bf1c, []int{16} } func (m *ContainerAllocateResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -740,7 +955,7 @@ type Mount struct { func (m *Mount) Reset() { *m = Mount{} } func (*Mount) ProtoMessage() {} func (*Mount) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{13} + return fileDescriptor_00212fb1f9d3bf1c, []int{17} } func (m *Mount) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -808,7 +1023,7 @@ type DeviceSpec struct { func (m *DeviceSpec) Reset() { *m = DeviceSpec{} } func (*DeviceSpec) ProtoMessage() {} func (*DeviceSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_00212fb1f9d3bf1c, []int{14} + return fileDescriptor_00212fb1f9d3bf1c, []int{18} } func (m *DeviceSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -868,6 +1083,10 @@ func init() { proto.RegisterType((*Device)(nil), "v1beta1.Device") proto.RegisterType((*PreStartContainerRequest)(nil), "v1beta1.PreStartContainerRequest") proto.RegisterType((*PreStartContainerResponse)(nil), "v1beta1.PreStartContainerResponse") + proto.RegisterType((*PreferredAllocationRequest)(nil), "v1beta1.PreferredAllocationRequest") + proto.RegisterType((*ContainerPreferredAllocationRequest)(nil), "v1beta1.ContainerPreferredAllocationRequest") + proto.RegisterType((*PreferredAllocationResponse)(nil), "v1beta1.PreferredAllocationResponse") + proto.RegisterType((*ContainerPreferredAllocationResponse)(nil), "v1beta1.ContainerPreferredAllocationResponse") proto.RegisterType((*AllocateRequest)(nil), "v1beta1.AllocateRequest") proto.RegisterType((*ContainerAllocateRequest)(nil), "v1beta1.ContainerAllocateRequest") proto.RegisterType((*AllocateResponse)(nil), "v1beta1.AllocateResponse") @@ -881,59 +1100,70 @@ func init() { func init() { proto.RegisterFile("api.proto", fileDescriptor_00212fb1f9d3bf1c) } var fileDescriptor_00212fb1f9d3bf1c = []byte{ - // 822 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0xdd, 0x8e, 0xdb, 0x44, - 0x14, 0x8e, 0x93, 0x6e, 0xe2, 0x9c, 0xa4, 0xbb, 0xd9, 0xd9, 0x52, 0x79, 0xdd, 0x62, 0x85, 0x41, - 0xc0, 0x22, 0xb5, 0x29, 0x9b, 0x4a, 0x2d, 0xea, 0x05, 0x22, 0x34, 0x0b, 0xac, 0x44, 0xb7, 0xd1, - 0x2c, 0x15, 0x37, 0x48, 0x91, 0xe3, 0x4c, 0x63, 0x0b, 0x67, 0xc6, 0x78, 0x26, 0x91, 0x72, 0xc7, - 0x05, 0x0f, 0xc0, 0x43, 0xf0, 0x18, 0x3c, 0x40, 0x2f, 0xb9, 0xe4, 0x92, 0x86, 0x17, 0x41, 0x1e, - 0x7b, 0x6c, 0xcb, 0xcd, 0x6e, 0x41, 0xea, 0x9d, 0xcf, 0xcf, 0x77, 0xe6, 0x9b, 0x73, 0xce, 0x7c, - 0x86, 0xb6, 0x1b, 0x05, 0x83, 0x28, 0xe6, 0x92, 0xa3, 0xd6, 0xfa, 0x74, 0x46, 0xa5, 0x7b, 0x6a, - 0xdf, 0x5f, 0x04, 0xd2, 0x5f, 0xcd, 0x06, 0x1e, 0x5f, 0x3e, 0x58, 0xf0, 0x05, 0x7f, 0xa0, 0xe2, - 0xb3, 0xd5, 0x4b, 0x65, 0x29, 0x43, 0x7d, 0xa5, 0x38, 0xfc, 0x14, 0x8e, 0xc6, 0x74, 0x1d, 0x78, - 0x74, 0x12, 0xae, 0x16, 0x01, 0x7b, 0x1e, 0xc9, 0x80, 0x33, 0x81, 0xee, 0x01, 0x8a, 0x62, 0x3a, - 0x15, 0xd2, 0x8d, 0xe5, 0x34, 0xa6, 0x3f, 0xaf, 0x82, 0x98, 0xce, 0x2d, 0xa3, 0x6f, 0x9c, 0x98, - 0xa4, 0x17, 0xc5, 0xf4, 0x32, 0x09, 0x90, 0xcc, 0x8f, 0x7f, 0x37, 0xe0, 0x80, 0xd0, 0x45, 0x20, - 0x24, 0x8d, 0x13, 0x27, 0x15, 0x12, 0x59, 0xd0, 0x5a, 0xd3, 0x58, 0x04, 0x9c, 0x29, 0x58, 0x9b, - 0x68, 0x13, 0xd9, 0x60, 0x52, 0x36, 0x8f, 0x78, 0xc0, 0xa4, 0x55, 0x57, 0xa1, 0xdc, 0x46, 0x1f, - 0xc2, 0xcd, 0x98, 0x0a, 0xbe, 0x8a, 0x3d, 0x3a, 0x65, 0xee, 0x92, 0x5a, 0x0d, 0x95, 0xd0, 0xd5, - 0xce, 0x0b, 0x77, 0x49, 0xd1, 0x23, 0x68, 0xf1, 0x94, 0xa7, 0x75, 0xa3, 0x6f, 0x9c, 0x74, 0x86, - 0x77, 0x07, 0xd9, 0xed, 0x07, 0x3b, 0xee, 0x42, 0x74, 0x32, 0x6e, 0xc1, 0xde, 0xd9, 0x32, 0x92, - 0x1b, 0x3c, 0x82, 0x5b, 0xdf, 0x05, 0x42, 0x8e, 0xd8, 0xfc, 0x07, 0x57, 0x7a, 0x3e, 0xa1, 0x22, - 0xe2, 0x4c, 0x50, 0xf4, 0x29, 0xb4, 0xe6, 0xaa, 0x80, 0xb0, 0x8c, 0x7e, 0xe3, 0xa4, 0x33, 0x3c, - 0xa8, 0x14, 0x26, 0x3a, 0x8e, 0x1f, 0x43, 0xf7, 0x7b, 0x1e, 0xf1, 0x90, 0x2f, 0x36, 0xe7, 0xec, - 0x25, 0x47, 0x9f, 0xc0, 0x1e, 0xe3, 0xf3, 0x1c, 0x78, 0x98, 0x03, 0x2f, 0x5e, 0x3c, 0x1b, 0x5d, - 0xf0, 0x39, 0x25, 0x69, 0x1c, 0xdb, 0x60, 0x6a, 0x17, 0xda, 0x87, 0xfa, 0xf9, 0x58, 0xb5, 0xa7, - 0x41, 0xea, 0xc1, 0x18, 0x7b, 0xd0, 0x4c, 0xcf, 0x29, 0x45, 0xda, 0x49, 0x04, 0xdd, 0x86, 0xa6, - 0x4f, 0xdd, 0x50, 0xfa, 0x59, 0xc7, 0x32, 0x0b, 0x9d, 0x82, 0x29, 0x33, 0x1a, 0xaa, 0x55, 0x9d, - 0xe1, 0x7b, 0xf9, 0xc9, 0x65, 0x7e, 0x24, 0x4f, 0xc3, 0x4f, 0xc0, 0x9a, 0x64, 0x03, 0x7c, 0xca, - 0x99, 0x74, 0x03, 0x56, 0x0c, 0xcd, 0x01, 0xc8, 0x2e, 0x78, 0x3e, 0x4e, 0xaf, 0xd2, 0x26, 0x25, - 0x0f, 0xbe, 0x03, 0xc7, 0x3b, 0xb0, 0x69, 0xf7, 0xb0, 0x07, 0x07, 0xa3, 0x30, 0xe4, 0x9e, 0x2b, - 0xa9, 0xae, 0x37, 0x01, 0xe4, 0xe9, 0x3c, 0xb5, 0x46, 0x54, 0x48, 0xdd, 0xa2, 0x0f, 0x72, 0xa2, - 0x79, 0xa9, 0x0a, 0x9c, 0x1c, 0x7a, 0x15, 0x82, 0x22, 0x61, 0x7f, 0x55, 0xfa, 0x5b, 0xd9, 0x2f, - 0xa0, 0x57, 0x40, 0xb2, 0x91, 0x5f, 0xc2, 0x51, 0x99, 0x61, 0xea, 0xd5, 0x14, 0xf1, 0x75, 0x14, - 0xd3, 0x54, 0x82, 0xbc, 0x6a, 0x23, 0x04, 0xfe, 0xb5, 0x01, 0xc7, 0x57, 0x22, 0xd0, 0x97, 0x70, - 0x83, 0xb2, 0xb5, 0x3e, 0xe3, 0xde, 0xdb, 0xcf, 0x18, 0x9c, 0xb1, 0xb5, 0x38, 0x63, 0x32, 0xde, - 0x10, 0x85, 0x44, 0x1f, 0x43, 0x73, 0xc9, 0x57, 0x4c, 0x0a, 0xab, 0xae, 0x6a, 0xec, 0xe7, 0x35, - 0x9e, 0x25, 0x6e, 0x92, 0x45, 0xd1, 0xfd, 0x62, 0x9f, 0x1b, 0x2a, 0xf1, 0xa8, 0xb2, 0xcf, 0x97, - 0x11, 0xf5, 0xf2, 0x9d, 0x46, 0x2f, 0xa0, 0xe3, 0x32, 0xc6, 0xa5, 0xab, 0xdf, 0x56, 0x02, 0x79, - 0xf8, 0x1f, 0xf8, 0x8d, 0x0a, 0x54, 0x4a, 0xb3, 0x5c, 0xc7, 0x7e, 0x0c, 0xed, 0xfc, 0x02, 0xa8, - 0x07, 0x8d, 0x9f, 0xe8, 0x26, 0xdb, 0xec, 0xe4, 0x13, 0xdd, 0x82, 0xbd, 0xb5, 0x1b, 0xae, 0x68, - 0xb6, 0xd9, 0xa9, 0xf1, 0xa4, 0xfe, 0xb9, 0x61, 0x7f, 0x01, 0xbd, 0x6a, 0xe5, 0xff, 0x83, 0xc7, - 0x3e, 0xec, 0xa9, 0x7e, 0xa0, 0x8f, 0x60, 0xbf, 0x18, 0x72, 0xe4, 0x4a, 0x3f, 0xc3, 0xdf, 0xcc, - 0xbd, 0x13, 0x57, 0xfa, 0xe8, 0x0e, 0xb4, 0x7d, 0x2e, 0x64, 0x9a, 0x91, 0x29, 0x53, 0xe2, 0xd0, - 0xc1, 0x98, 0xba, 0xf3, 0x29, 0x67, 0x61, 0xfa, 0xd4, 0x4c, 0x62, 0x26, 0x8e, 0xe7, 0x2c, 0xdc, - 0xe0, 0x18, 0xa0, 0x68, 0xe8, 0x3b, 0x39, 0xae, 0x0f, 0x9d, 0x88, 0xc6, 0xcb, 0x40, 0x08, 0x35, - 0x8b, 0x54, 0x06, 0xcb, 0xae, 0xe1, 0xd7, 0xd0, 0x4d, 0x35, 0x37, 0x56, 0xfd, 0x41, 0x8f, 0xc0, - 0xd4, 0x1a, 0x8c, 0xac, 0x7c, 0x68, 0x15, 0x59, 0xb6, 0x8b, 0x55, 0x49, 0xa5, 0xb0, 0x36, 0xfc, - 0xa3, 0x0e, 0xdd, 0xb2, 0x6c, 0xa2, 0x6f, 0xe1, 0xf6, 0x37, 0x54, 0xee, 0xfa, 0x2b, 0x54, 0xc0, - 0xf6, 0xb5, 0xba, 0x8b, 0x6b, 0x68, 0x04, 0xdd, 0xb2, 0xce, 0xbe, 0x81, 0x7f, 0x3f, 0xb7, 0x77, - 0xc9, 0x31, 0xae, 0x7d, 0x66, 0xa0, 0x11, 0x98, 0x7a, 0xdd, 0x4a, 0xb7, 0xaa, 0xbc, 0x7c, 0xfb, - 0x78, 0x47, 0x44, 0x17, 0x41, 0x3f, 0xc2, 0xe1, 0x1b, 0xa2, 0x85, 0x0a, 0xf5, 0xb9, 0x4a, 0x0c, - 0x6d, 0x7c, 0x5d, 0x8a, 0xae, 0xfe, 0xd5, 0xdd, 0x57, 0xaf, 0x1d, 0xe3, 0xaf, 0xd7, 0x4e, 0xed, - 0x97, 0xad, 0x63, 0xbc, 0xda, 0x3a, 0xc6, 0x9f, 0x5b, 0xc7, 0xf8, 0x7b, 0xeb, 0x18, 0xbf, 0xfd, - 0xe3, 0xd4, 0x66, 0x4d, 0xf5, 0x97, 0x7d, 0xf8, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x63, 0x60, - 0xe7, 0xf8, 0xaa, 0x07, 0x00, 0x00, + // 995 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0x5f, 0x6f, 0x1b, 0x45, + 0x10, 0xcf, 0xd9, 0x75, 0x6c, 0x8f, 0xdd, 0xfc, 0xd9, 0x84, 0xc8, 0xb9, 0x04, 0x93, 0x6e, 0x0a, + 0x0d, 0x52, 0xe3, 0x10, 0x17, 0xb5, 0x28, 0x0f, 0x08, 0x83, 0x03, 0x44, 0xd0, 0xd4, 0xba, 0x50, + 0xf1, 0x00, 0xc2, 0x3a, 0x9f, 0x37, 0xf6, 0x89, 0xf3, 0xee, 0x71, 0xbb, 0xb6, 0xe4, 0x4a, 0x48, + 0x3c, 0xf0, 0x01, 0xfa, 0x1d, 0xe0, 0x2b, 0xf0, 0x1d, 0xfa, 0xc8, 0x23, 0x8f, 0x34, 0x7c, 0x11, + 0x74, 0xbb, 0xb7, 0x77, 0xa7, 0xcb, 0xc5, 0x04, 0xa9, 0x6f, 0xde, 0x99, 0xf9, 0xcd, 0x9f, 0xdf, + 0x8c, 0x67, 0x0e, 0xaa, 0xb6, 0xef, 0xb6, 0xfc, 0x80, 0x09, 0x86, 0xca, 0xb3, 0xe3, 0x01, 0x11, + 0xf6, 0xb1, 0x79, 0x38, 0x72, 0xc5, 0x78, 0x3a, 0x68, 0x39, 0x6c, 0x72, 0x34, 0x62, 0x23, 0x76, + 0x24, 0xf5, 0x83, 0xe9, 0xa5, 0x7c, 0xc9, 0x87, 0xfc, 0xa5, 0x70, 0xf8, 0xa5, 0x01, 0x1b, 0x5d, + 0x32, 0x73, 0x1d, 0xd2, 0xf3, 0xa6, 0x23, 0x97, 0x3e, 0xf3, 0x85, 0xcb, 0x28, 0x47, 0x0f, 0x01, + 0xf9, 0x01, 0xe9, 0x73, 0x61, 0x07, 0xa2, 0x1f, 0x90, 0x9f, 0xa6, 0x6e, 0x40, 0x86, 0x0d, 0x63, + 0xcf, 0x38, 0xa8, 0x58, 0x6b, 0x7e, 0x40, 0x2e, 0x42, 0x85, 0x15, 0xc9, 0xd1, 0x57, 0x80, 0x47, + 0x44, 0xf4, 0xfd, 0x80, 0x5c, 0x92, 0x20, 0x20, 0xc3, 0xbe, 0xed, 0x79, 0xcc, 0xb1, 0x43, 0x57, + 0x7d, 0x7b, 0x66, 0xbb, 0x9e, 0x3d, 0xf0, 0x48, 0xa3, 0x20, 0xd1, 0xef, 0x8c, 0x88, 0xe8, 0x69, + 0xc3, 0x4e, 0x6c, 0xd7, 0xd1, 0x66, 0xf8, 0x77, 0x03, 0x56, 0x2d, 0x32, 0x72, 0xb9, 0x20, 0x41, + 0x18, 0x81, 0x70, 0x81, 0x1a, 0x50, 0x9e, 0x91, 0x80, 0xbb, 0x8c, 0xca, 0x1c, 0xaa, 0x96, 0x7e, + 0x22, 0x13, 0x2a, 0x84, 0x0e, 0x7d, 0xe6, 0x52, 0x21, 0x03, 0x54, 0xad, 0xf8, 0x8d, 0xf6, 0xe1, + 0x6e, 0x40, 0x38, 0x9b, 0x06, 0x0e, 0xe9, 0x53, 0x7b, 0x42, 0x1a, 0x45, 0x69, 0x50, 0xd7, 0xc2, + 0x73, 0x7b, 0x42, 0xd0, 0x63, 0x28, 0x33, 0x55, 0x74, 0xe3, 0xce, 0x9e, 0x71, 0x50, 0x6b, 0xef, + 0xb6, 0x22, 0x2e, 0x5b, 0x39, 0xc4, 0x58, 0xda, 0x18, 0x97, 0xa1, 0x74, 0x3a, 0xf1, 0xc5, 0x1c, + 0x77, 0x60, 0xf3, 0x6b, 0x97, 0x8b, 0x0e, 0x1d, 0x7e, 0x6b, 0x0b, 0x67, 0x6c, 0x11, 0xee, 0x33, + 0xca, 0x09, 0x7a, 0x1f, 0xca, 0x43, 0xe9, 0x80, 0x37, 0x8c, 0xbd, 0xe2, 0x41, 0xad, 0xbd, 0x9a, + 0x71, 0x6c, 0x69, 0x3d, 0x7e, 0x02, 0xf5, 0x6f, 0x98, 0xcf, 0x3c, 0x36, 0x9a, 0x9f, 0xd1, 0x4b, + 0x86, 0x1e, 0x40, 0x89, 0xb2, 0x61, 0x0c, 0x5c, 0x8f, 0x81, 0xe7, 0xcf, 0x9f, 0x76, 0xce, 0xd9, + 0x90, 0x58, 0x4a, 0x8f, 0x4d, 0xa8, 0x68, 0x11, 0x5a, 0x81, 0xc2, 0x59, 0x57, 0xd2, 0x53, 0xb4, + 0x0a, 0x6e, 0x17, 0x3b, 0xb0, 0xac, 0xe2, 0xa4, 0x34, 0xd5, 0x50, 0x83, 0xb6, 0x60, 0x79, 0x4c, + 0x6c, 0x4f, 0x8c, 0x23, 0xc6, 0xa2, 0x17, 0x3a, 0x86, 0x8a, 0x88, 0xd2, 0x90, 0x54, 0xd5, 0xda, + 0x6f, 0xc5, 0x91, 0xd3, 0xf9, 0x59, 0xb1, 0x19, 0x3e, 0x81, 0x46, 0x2f, 0x9a, 0x86, 0xcf, 0x18, + 0x15, 0xb6, 0x4b, 0x93, 0xa6, 0x35, 0x01, 0xa2, 0x02, 0xcf, 0xba, 0xaa, 0x94, 0xaa, 0x95, 0x92, + 0xe0, 0x1d, 0xd8, 0xce, 0xc1, 0x2a, 0xf6, 0xf0, 0x1c, 0xcc, 0x9c, 0x29, 0xd1, 0xae, 0xbf, 0x03, + 0xe4, 0x68, 0x88, 0x1c, 0x4f, 0xc2, 0x85, 0x66, 0xeb, 0x61, 0x9c, 0x73, 0xec, 0xf5, 0x66, 0x4f, + 0xd6, 0xba, 0x93, 0x49, 0x9b, 0xe3, 0x3f, 0x0c, 0xd8, 0xbf, 0x05, 0x14, 0x1d, 0xc1, 0x46, 0x3c, + 0xdc, 0x7d, 0x55, 0x57, 0x52, 0x28, 0x8a, 0x55, 0x5d, 0xad, 0x41, 0x1f, 0xc2, 0xd6, 0x64, 0xca, + 0x45, 0xdf, 0xa5, 0x8e, 0x37, 0x1d, 0xa6, 0x31, 0x05, 0x89, 0xd9, 0x0c, 0xb5, 0x67, 0x4a, 0x99, + 0xa0, 0x1e, 0xc0, 0x6a, 0xea, 0xef, 0xc4, 0xdd, 0x17, 0x6a, 0x8e, 0x4b, 0xd6, 0x4a, 0x22, 0xbe, + 0x70, 0x5f, 0x10, 0xfc, 0x33, 0xec, 0xe4, 0x66, 0x1b, 0xcd, 0xe3, 0x0f, 0xb0, 0x91, 0xe6, 0x4c, + 0x49, 0x35, 0x69, 0x87, 0xb7, 0x24, 0x4d, 0xa1, 0x2c, 0xe4, 0x64, 0x1b, 0xc6, 0x71, 0x17, 0xee, + 0xdf, 0x06, 0x8b, 0x76, 0xa1, 0x9a, 0x25, 0x2b, 0x11, 0x60, 0x07, 0x56, 0x23, 0x0c, 0xd1, 0x3c, + 0xf7, 0x16, 0x34, 0xfb, 0xde, 0xf5, 0xbc, 0x33, 0xf0, 0xbc, 0x0e, 0x9f, 0x40, 0xe3, 0x26, 0xf3, + 0xff, 0x9c, 0xda, 0x11, 0xac, 0x25, 0x90, 0xa8, 0xa4, 0x8b, 0x45, 0xd4, 0xe2, 0x45, 0x29, 0x2e, + 0xe0, 0xf3, 0xd7, 0x22, 0x6c, 0xdf, 0x88, 0x40, 0x9f, 0xc0, 0x1d, 0x42, 0x67, 0x0b, 0x66, 0x3e, + 0x8b, 0x68, 0x9d, 0xd2, 0x19, 0x3f, 0xa5, 0x22, 0x98, 0x5b, 0x12, 0x89, 0xde, 0x83, 0xe5, 0x09, + 0x9b, 0x52, 0xa1, 0xa6, 0xaf, 0xd6, 0x5e, 0x89, 0x7d, 0x3c, 0x0d, 0xc5, 0x56, 0xa4, 0x45, 0x87, + 0xc9, 0x1e, 0x2b, 0x4a, 0xc3, 0x8d, 0xcc, 0x1e, 0xbb, 0xf0, 0x89, 0x13, 0xef, 0x32, 0xf4, 0x1c, + 0x6a, 0x36, 0xa5, 0x4c, 0xd8, 0x7a, 0xa7, 0x86, 0x90, 0x47, 0xb7, 0xc8, 0xaf, 0x93, 0xa0, 0x54, + 0x9a, 0x69, 0x3f, 0xe6, 0x13, 0xa8, 0xc6, 0x05, 0xa0, 0x35, 0x28, 0xfe, 0x48, 0xe6, 0xd1, 0x46, + 0x0b, 0x7f, 0xa2, 0x4d, 0x28, 0xcd, 0x6c, 0x6f, 0x4a, 0xa2, 0x8d, 0xa6, 0x1e, 0x27, 0x85, 0x8f, + 0x0c, 0xf3, 0x63, 0x58, 0xcb, 0x7a, 0xfe, 0x3f, 0x78, 0x3c, 0x86, 0x92, 0xe4, 0x03, 0xbd, 0x0b, + 0x2b, 0x49, 0x93, 0x7d, 0x5b, 0x8c, 0x23, 0xfc, 0xdd, 0x58, 0xda, 0xb3, 0xc5, 0x18, 0xed, 0x40, + 0x75, 0xcc, 0xb8, 0x50, 0x16, 0xd1, 0x45, 0x0a, 0x05, 0x5a, 0x19, 0x10, 0x7b, 0xd8, 0x67, 0xd4, + 0x53, 0x2b, 0xb6, 0x62, 0x55, 0x42, 0xc1, 0x33, 0xea, 0xcd, 0x71, 0x00, 0x90, 0x10, 0xfa, 0x46, + 0xc2, 0xed, 0x41, 0xcd, 0x27, 0xc1, 0xc4, 0xe5, 0x5c, 0xf6, 0x42, 0x9d, 0xbf, 0xb4, 0xa8, 0xfd, + 0x39, 0xd4, 0xd5, 0xad, 0x0d, 0x24, 0x3f, 0xe8, 0x31, 0x54, 0xf4, 0xed, 0x45, 0x8d, 0xb8, 0x69, + 0x99, 0x73, 0x6c, 0x26, 0xa3, 0xa2, 0x4e, 0xe0, 0x52, 0xfb, 0xb7, 0x22, 0xd4, 0xd3, 0xe7, 0x12, + 0x7d, 0x09, 0x5b, 0x5f, 0x10, 0x91, 0xf7, 0x69, 0x91, 0x01, 0x9b, 0x0b, 0xef, 0x2d, 0x5e, 0x42, + 0x1d, 0xa8, 0xa7, 0xef, 0xeb, 0x35, 0xfc, 0xdb, 0xf1, 0x3b, 0xef, 0x0c, 0xe3, 0xa5, 0x0f, 0x0c, + 0x44, 0x64, 0x32, 0x39, 0x4b, 0x09, 0xed, 0xc7, 0xe0, 0x9b, 0x17, 0xbd, 0x79, 0x7f, 0xb1, 0x91, + 0x0e, 0x84, 0x3a, 0x50, 0xd1, 0x53, 0x9d, 0x22, 0x2f, 0xb3, 0x60, 0xcc, 0xed, 0x1c, 0x4d, 0xec, + 0xe2, 0x7b, 0x58, 0xbf, 0x76, 0x13, 0xd1, 0xbd, 0x74, 0xfc, 0xdc, 0x5b, 0x6b, 0xe2, 0x45, 0x26, + 0xda, 0xfb, 0xa7, 0xbb, 0xaf, 0x5e, 0x37, 0x8d, 0xbf, 0x5e, 0x37, 0x97, 0x7e, 0xb9, 0x6a, 0x1a, + 0xaf, 0xae, 0x9a, 0xc6, 0x9f, 0x57, 0x4d, 0xe3, 0xef, 0xab, 0xa6, 0xf1, 0xf2, 0x9f, 0xe6, 0xd2, + 0x60, 0x59, 0x7e, 0x12, 0x3e, 0xfa, 0x37, 0x00, 0x00, 0xff, 0xff, 0x86, 0x3c, 0xb9, 0x8e, 0x57, + 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1027,6 +1257,12 @@ type DevicePluginClient interface { // Whenever a Device state change or a Device disappears, ListAndWatch // returns the new list ListAndWatch(ctx context.Context, in *Empty, opts ...grpc.CallOption) (DevicePlugin_ListAndWatchClient, error) + // GetPreferredAllocation returns a preferred set of devices to allocate + // from a list of available ones. The resulting preferred allocation is not + // guaranteed to be the allocation ultimately performed by the + // devicemanager. It is only designed to help the devicemanager make a more + // informed allocation decision when possible. + GetPreferredAllocation(ctx context.Context, in *PreferredAllocationRequest, opts ...grpc.CallOption) (*PreferredAllocationResponse, error) // Allocate is called during container creation so that the Device // Plugin can run device specific operations and instruct Kubelet // of the steps to make the Device available in the container @@ -1086,6 +1322,15 @@ func (x *devicePluginListAndWatchClient) Recv() (*ListAndWatchResponse, error) { return m, nil } +func (c *devicePluginClient) GetPreferredAllocation(ctx context.Context, in *PreferredAllocationRequest, opts ...grpc.CallOption) (*PreferredAllocationResponse, error) { + out := new(PreferredAllocationResponse) + err := c.cc.Invoke(ctx, "/v1beta1.DevicePlugin/GetPreferredAllocation", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *devicePluginClient) Allocate(ctx context.Context, in *AllocateRequest, opts ...grpc.CallOption) (*AllocateResponse, error) { out := new(AllocateResponse) err := c.cc.Invoke(ctx, "/v1beta1.DevicePlugin/Allocate", in, out, opts...) @@ -1113,6 +1358,12 @@ type DevicePluginServer interface { // Whenever a Device state change or a Device disappears, ListAndWatch // returns the new list ListAndWatch(*Empty, DevicePlugin_ListAndWatchServer) error + // GetPreferredAllocation returns a preferred set of devices to allocate + // from a list of available ones. The resulting preferred allocation is not + // guaranteed to be the allocation ultimately performed by the + // devicemanager. It is only designed to help the devicemanager make a more + // informed allocation decision when possible. + GetPreferredAllocation(context.Context, *PreferredAllocationRequest) (*PreferredAllocationResponse, error) // Allocate is called during container creation so that the Device // Plugin can run device specific operations and instruct Kubelet // of the steps to make the Device available in the container @@ -1133,6 +1384,9 @@ func (*UnimplementedDevicePluginServer) GetDevicePluginOptions(ctx context.Conte func (*UnimplementedDevicePluginServer) ListAndWatch(req *Empty, srv DevicePlugin_ListAndWatchServer) error { return status.Errorf(codes.Unimplemented, "method ListAndWatch not implemented") } +func (*UnimplementedDevicePluginServer) GetPreferredAllocation(ctx context.Context, req *PreferredAllocationRequest) (*PreferredAllocationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetPreferredAllocation not implemented") +} func (*UnimplementedDevicePluginServer) Allocate(ctx context.Context, req *AllocateRequest) (*AllocateResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Allocate not implemented") } @@ -1183,6 +1437,24 @@ func (x *devicePluginListAndWatchServer) Send(m *ListAndWatchResponse) error { return x.ServerStream.SendMsg(m) } +func _DevicePlugin_GetPreferredAllocation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PreferredAllocationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DevicePluginServer).GetPreferredAllocation(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/v1beta1.DevicePlugin/GetPreferredAllocation", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DevicePluginServer).GetPreferredAllocation(ctx, req.(*PreferredAllocationRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _DevicePlugin_Allocate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(AllocateRequest) if err := dec(in); err != nil { @@ -1227,6 +1499,10 @@ var _DevicePlugin_serviceDesc = grpc.ServiceDesc{ MethodName: "GetDevicePluginOptions", Handler: _DevicePlugin_GetDevicePluginOptions_Handler, }, + { + MethodName: "GetPreferredAllocation", + Handler: _DevicePlugin_GetPreferredAllocation_Handler, + }, { MethodName: "Allocate", Handler: _DevicePlugin_Allocate_Handler, @@ -1266,6 +1542,16 @@ func (m *DevicePluginOptions) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.GetPreferredAllocationAvailable { + i-- + if m.GetPreferredAllocationAvailable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } if m.PreStartRequired { i-- if m.PreStartRequired { @@ -1564,7 +1850,7 @@ func (m *PreStartContainerResponse) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *AllocateRequest) Marshal() (dAtA []byte, err error) { +func (m *PreferredAllocationRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1574,12 +1860,12 @@ func (m *AllocateRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AllocateRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *PreferredAllocationRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PreferredAllocationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1601,7 +1887,7 @@ func (m *AllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ContainerAllocateRequest) Marshal() (dAtA []byte, err error) { +func (m *ContainerPreferredAllocationRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1611,21 +1897,35 @@ func (m *ContainerAllocateRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ContainerAllocateRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ContainerPreferredAllocationRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ContainerAllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ContainerPreferredAllocationRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.DevicesIDs) > 0 { - for iNdEx := len(m.DevicesIDs) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.DevicesIDs[iNdEx]) - copy(dAtA[i:], m.DevicesIDs[iNdEx]) - i = encodeVarintApi(dAtA, i, uint64(len(m.DevicesIDs[iNdEx]))) + if m.AllocationSize != 0 { + i = encodeVarintApi(dAtA, i, uint64(m.AllocationSize)) + i-- + dAtA[i] = 0x18 + } + if len(m.MustIncludeDeviceIDs) > 0 { + for iNdEx := len(m.MustIncludeDeviceIDs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.MustIncludeDeviceIDs[iNdEx]) + copy(dAtA[i:], m.MustIncludeDeviceIDs[iNdEx]) + i = encodeVarintApi(dAtA, i, uint64(len(m.MustIncludeDeviceIDs[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.AvailableDeviceIDs) > 0 { + for iNdEx := len(m.AvailableDeviceIDs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AvailableDeviceIDs[iNdEx]) + copy(dAtA[i:], m.AvailableDeviceIDs[iNdEx]) + i = encodeVarintApi(dAtA, i, uint64(len(m.AvailableDeviceIDs[iNdEx]))) i-- dAtA[i] = 0xa } @@ -1633,7 +1933,7 @@ func (m *ContainerAllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } -func (m *AllocateResponse) Marshal() (dAtA []byte, err error) { +func (m *PreferredAllocationResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1643,12 +1943,12 @@ func (m *AllocateResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AllocateResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *PreferredAllocationResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *PreferredAllocationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1670,7 +1970,7 @@ func (m *AllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ContainerAllocateResponse) Marshal() (dAtA []byte, err error) { +func (m *ContainerPreferredAllocationResponse) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1680,78 +1980,21 @@ func (m *ContainerAllocateResponse) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ContainerAllocateResponse) MarshalTo(dAtA []byte) (int, error) { +func (m *ContainerPreferredAllocationResponse) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ContainerAllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ContainerPreferredAllocationResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int _ = l - if len(m.Annotations) > 0 { - for k := range m.Annotations { - v := m.Annotations[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintApi(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintApi(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintApi(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Devices) > 0 { - for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Mounts) > 0 { - for iNdEx := len(m.Mounts) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Mounts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintApi(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Envs) > 0 { - for k := range m.Envs { - v := m.Envs[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintApi(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintApi(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintApi(dAtA, i, uint64(baseI-i)) + if len(m.DeviceIDs) > 0 { + for iNdEx := len(m.DeviceIDs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.DeviceIDs[iNdEx]) + copy(dAtA[i:], m.DeviceIDs[iNdEx]) + i = encodeVarintApi(dAtA, i, uint64(len(m.DeviceIDs[iNdEx]))) i-- dAtA[i] = 0xa } @@ -1759,7 +2002,202 @@ func (m *ContainerAllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *Mount) Marshal() (dAtA []byte, err error) { +func (m *AllocateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ContainerRequests) > 0 { + for iNdEx := len(m.ContainerRequests) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ContainerRequests[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ContainerAllocateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerAllocateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerAllocateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.DevicesIDs) > 0 { + for iNdEx := len(m.DevicesIDs) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.DevicesIDs[iNdEx]) + copy(dAtA[i:], m.DevicesIDs[iNdEx]) + i = encodeVarintApi(dAtA, i, uint64(len(m.DevicesIDs[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *AllocateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *AllocateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ContainerResponses) > 0 { + for iNdEx := len(m.ContainerResponses) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ContainerResponses[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ContainerAllocateResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ContainerAllocateResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ContainerAllocateResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Annotations) > 0 { + for k := range m.Annotations { + v := m.Annotations[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintApi(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintApi(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintApi(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x22 + } + } + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Mounts) > 0 { + for iNdEx := len(m.Mounts) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Mounts[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintApi(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Envs) > 0 { + for k := range m.Envs { + v := m.Envs[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintApi(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintApi(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintApi(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *Mount) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1870,6 +2308,9 @@ func (m *DevicePluginOptions) Size() (n int) { if m.PreStartRequired { n += 2 } + if m.GetPreferredAllocationAvailable { + n += 2 + } return n } @@ -1994,6 +2435,75 @@ func (m *PreStartContainerResponse) Size() (n int) { return n } +func (m *PreferredAllocationRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ContainerRequests) > 0 { + for _, e := range m.ContainerRequests { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + return n +} + +func (m *ContainerPreferredAllocationRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.AvailableDeviceIDs) > 0 { + for _, s := range m.AvailableDeviceIDs { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + if len(m.MustIncludeDeviceIDs) > 0 { + for _, s := range m.MustIncludeDeviceIDs { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + if m.AllocationSize != 0 { + n += 1 + sovApi(uint64(m.AllocationSize)) + } + return n +} + +func (m *PreferredAllocationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ContainerResponses) > 0 { + for _, e := range m.ContainerResponses { + l = e.Size() + n += 1 + l + sovApi(uint64(l)) + } + } + return n +} + +func (m *ContainerPreferredAllocationResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.DeviceIDs) > 0 { + for _, s := range m.DeviceIDs { + l = len(s) + n += 1 + l + sovApi(uint64(l)) + } + } + return n +} + func (m *AllocateRequest) Size() (n int) { if m == nil { return 0 @@ -2129,6 +2639,7 @@ func (this *DevicePluginOptions) String() string { } s := strings.Join([]string{`&DevicePluginOptions{`, `PreStartRequired:` + fmt.Sprintf("%v", this.PreStartRequired) + `,`, + `GetPreferredAllocationAvailable:` + fmt.Sprintf("%v", this.GetPreferredAllocationAvailable) + `,`, `}`, }, "") return s @@ -2226,11 +2737,63 @@ func (this *PreStartContainerResponse) String() string { }, "") return s } -func (this *AllocateRequest) String() string { +func (this *PreferredAllocationRequest) String() string { if this == nil { return "nil" } - repeatedStringForContainerRequests := "[]*ContainerAllocateRequest{" + repeatedStringForContainerRequests := "[]*ContainerPreferredAllocationRequest{" + for _, f := range this.ContainerRequests { + repeatedStringForContainerRequests += strings.Replace(f.String(), "ContainerPreferredAllocationRequest", "ContainerPreferredAllocationRequest", 1) + "," + } + repeatedStringForContainerRequests += "}" + s := strings.Join([]string{`&PreferredAllocationRequest{`, + `ContainerRequests:` + repeatedStringForContainerRequests + `,`, + `}`, + }, "") + return s +} +func (this *ContainerPreferredAllocationRequest) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerPreferredAllocationRequest{`, + `AvailableDeviceIDs:` + fmt.Sprintf("%v", this.AvailableDeviceIDs) + `,`, + `MustIncludeDeviceIDs:` + fmt.Sprintf("%v", this.MustIncludeDeviceIDs) + `,`, + `AllocationSize:` + fmt.Sprintf("%v", this.AllocationSize) + `,`, + `}`, + }, "") + return s +} +func (this *PreferredAllocationResponse) String() string { + if this == nil { + return "nil" + } + repeatedStringForContainerResponses := "[]*ContainerPreferredAllocationResponse{" + for _, f := range this.ContainerResponses { + repeatedStringForContainerResponses += strings.Replace(f.String(), "ContainerPreferredAllocationResponse", "ContainerPreferredAllocationResponse", 1) + "," + } + repeatedStringForContainerResponses += "}" + s := strings.Join([]string{`&PreferredAllocationResponse{`, + `ContainerResponses:` + repeatedStringForContainerResponses + `,`, + `}`, + }, "") + return s +} +func (this *ContainerPreferredAllocationResponse) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&ContainerPreferredAllocationResponse{`, + `DeviceIDs:` + fmt.Sprintf("%v", this.DeviceIDs) + `,`, + `}`, + }, "") + return s +} +func (this *AllocateRequest) String() string { + if this == nil { + return "nil" + } + repeatedStringForContainerRequests := "[]*ContainerAllocateRequest{" for _, f := range this.ContainerRequests { repeatedStringForContainerRequests += strings.Replace(f.String(), "ContainerAllocateRequest", "ContainerAllocateRequest", 1) + "," } @@ -2390,6 +2953,26 @@ func (m *DevicePluginOptions) Unmarshal(dAtA []byte) error { } } m.PreStartRequired = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GetPreferredAllocationAvailable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.GetPreferredAllocationAvailable = bool(v != 0) default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -2473,11 +3056,463 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Version = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: + m.Version = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Endpoint = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ResourceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Options == nil { + m.Options = &DevicePluginOptions{} + } + if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Empty) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Empty: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: ListAndWatchResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ListAndWatchResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, &Device{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TopologyInfo) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TopologyInfo: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TopologyInfo: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Nodes = append(m.Nodes, &NUMANode{}) + if err := m.Nodes[len(m.Nodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *NUMANode) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NUMANode: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NUMANode: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + } + m.ID = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ID |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipApi(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthApi + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Endpoint", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2505,11 +3540,11 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Endpoint = string(dAtA[iNdEx:postIndex]) + m.ID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Health", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2537,11 +3572,11 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ResourceName = string(dAtA[iNdEx:postIndex]) + m.Health = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Options", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -2568,10 +3603,10 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Options == nil { - m.Options = &DevicePluginOptions{} + if m.Topology == nil { + m.Topology = &TopologyInfo{} } - if err := m.Options.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Topology.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -2599,60 +3634,7 @@ func (m *RegisterRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *Empty) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipApi(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthApi - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { +func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2675,17 +3657,17 @@ func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ListAndWatchResponse: wiretype end group for non-group") + return fmt.Errorf("proto: PreStartContainerRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ListAndWatchResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreStartContainerRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DevicesIDs", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApi @@ -2695,25 +3677,23 @@ func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthApi } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthApi } if postIndex > l { return io.ErrUnexpectedEOF } - m.Devices = append(m.Devices, &Device{}) - if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.DevicesIDs = append(m.DevicesIDs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex default: iNdEx = preIndex @@ -2739,7 +3719,7 @@ func (m *ListAndWatchResponse) Unmarshal(dAtA []byte) error { } return nil } -func (m *TopologyInfo) Unmarshal(dAtA []byte) error { +func (m *PreStartContainerResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2762,46 +3742,12 @@ func (m *TopologyInfo) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TopologyInfo: wiretype end group for non-group") + return fmt.Errorf("proto: PreStartContainerResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TopologyInfo: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreStartContainerResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Nodes", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowApi - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Nodes = append(m.Nodes, &NUMANode{}) - if err := m.Nodes[len(m.Nodes)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -2826,7 +3772,7 @@ func (m *TopologyInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *NUMANode) Unmarshal(dAtA []byte) error { +func (m *PreferredAllocationRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2849,17 +3795,17 @@ func (m *NUMANode) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NUMANode: wiretype end group for non-group") + return fmt.Errorf("proto: PreferredAllocationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NUMANode: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreferredAllocationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContainerRequests", wireType) } - m.ID = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApi @@ -2869,11 +3815,26 @@ func (m *NUMANode) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.ID |= int64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } + if msglen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContainerRequests = append(m.ContainerRequests, &ContainerPreferredAllocationRequest{}) + if err := m.ContainerRequests[len(m.ContainerRequests)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -2898,7 +3859,7 @@ func (m *NUMANode) Unmarshal(dAtA []byte) error { } return nil } -func (m *Device) Unmarshal(dAtA []byte) error { +func (m *ContainerPreferredAllocationRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2921,15 +3882,15 @@ func (m *Device) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Device: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerPreferredAllocationRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerPreferredAllocationRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AvailableDeviceIDs", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2957,11 +3918,11 @@ func (m *Device) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ID = string(dAtA[iNdEx:postIndex]) + m.AvailableDeviceIDs = append(m.AvailableDeviceIDs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Health", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field MustIncludeDeviceIDs", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -2989,13 +3950,13 @@ func (m *Device) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Health = string(dAtA[iNdEx:postIndex]) + m.MustIncludeDeviceIDs = append(m.MustIncludeDeviceIDs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllocationSize", wireType) } - var msglen int + m.AllocationSize = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApi @@ -3005,28 +3966,11 @@ func (m *Device) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.AllocationSize |= int32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthApi - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthApi - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Topology == nil { - m.Topology = &TopologyInfo{} - } - if err := m.Topology.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) @@ -3051,7 +3995,7 @@ func (m *Device) Unmarshal(dAtA []byte) error { } return nil } -func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { +func (m *PreferredAllocationResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3074,17 +4018,17 @@ func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PreStartContainerRequest: wiretype end group for non-group") + return fmt.Errorf("proto: PreferredAllocationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PreStartContainerRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: PreferredAllocationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DevicesIDs", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ContainerResponses", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowApi @@ -3094,23 +4038,25 @@ func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthApi } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthApi } if postIndex > l { return io.ErrUnexpectedEOF } - m.DevicesIDs = append(m.DevicesIDs, string(dAtA[iNdEx:postIndex])) + m.ContainerResponses = append(m.ContainerResponses, &ContainerPreferredAllocationResponse{}) + if err := m.ContainerResponses[len(m.ContainerResponses)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -3136,7 +4082,7 @@ func (m *PreStartContainerRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *PreStartContainerResponse) Unmarshal(dAtA []byte) error { +func (m *ContainerPreferredAllocationResponse) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3159,12 +4105,44 @@ func (m *PreStartContainerResponse) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: PreStartContainerResponse: wiretype end group for non-group") + return fmt.Errorf("proto: ContainerPreferredAllocationResponse: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: PreStartContainerResponse: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ContainerPreferredAllocationResponse: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DeviceIDs", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowApi + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthApi + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthApi + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DeviceIDs = append(m.DeviceIDs, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipApi(dAtA[iNdEx:]) diff --git a/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.proto b/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.proto index c7e676e4788c..b03b754616ba 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.proto +++ b/cluster-autoscaler/vendor/k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1/api.proto @@ -25,8 +25,10 @@ service Registration { } message DevicePluginOptions { - // Indicates if PreStartContainer call is required before each container start + // Indicates if PreStartContainer call is required before each container start bool pre_start_required = 1; + // Indicates if GetPreferredAllocation is implemented and available for calling + bool get_preferred_allocation_available = 2; } message RegisterRequest { @@ -37,8 +39,8 @@ message RegisterRequest { string endpoint = 2; // Schedulable resource name. As of now it's expected to be a DNS Label string resource_name = 3; - // Options to be communicated with Device Manager - DevicePluginOptions options = 4; + // Options to be communicated with Device Manager + DevicePluginOptions options = 4; } message Empty { @@ -47,7 +49,7 @@ message Empty { // DevicePlugin is the service advertised by Device Plugins service DevicePlugin { // GetDevicePluginOptions returns options to be communicated with Device - // Manager + // Manager rpc GetDevicePluginOptions(Empty) returns (DevicePluginOptions) {} // ListAndWatch returns a stream of List of Devices @@ -55,14 +57,21 @@ service DevicePlugin { // returns the new list rpc ListAndWatch(Empty) returns (stream ListAndWatchResponse) {} + // GetPreferredAllocation returns a preferred set of devices to allocate + // from a list of available ones. The resulting preferred allocation is not + // guaranteed to be the allocation ultimately performed by the + // devicemanager. It is only designed to help the devicemanager make a more + // informed allocation decision when possible. + rpc GetPreferredAllocation(PreferredAllocationRequest) returns (PreferredAllocationResponse) {} + // Allocate is called during container creation so that the Device // Plugin can run device specific operations and instruct Kubelet // of the steps to make the Device available in the container rpc Allocate(AllocateRequest) returns (AllocateResponse) {} - // PreStartContainer is called, if indicated by Device Plugin during registeration phase, - // before each container start. Device plugin can run device specific operations - // such as resetting the device before making devices available to the container + // PreStartContainer is called, if indicated by Device Plugin during registeration phase, + // before each container start. Device plugin can run device specific operations + // such as resetting the device before making devices available to the container rpc PreStartContainer(PreStartContainerRequest) returns (PreStartContainerResponse) {} } @@ -78,7 +87,7 @@ message TopologyInfo { } message NUMANode { - int64 ID = 1; + int64 ID = 1; } /* E.g: @@ -87,7 +96,7 @@ message NUMANode { * Health: "Healthy", * Topology: * Node: - ID: 1 +* ID: 1 *} */ message Device { // A unique ID assigned by the device plugin used @@ -105,13 +114,41 @@ message Device { // - PreStartContainer allows Device Plugin to run device specific operations on // the Devices requested message PreStartContainerRequest { - repeated string devicesIDs = 1; + repeated string devicesIDs = 1; } // PreStartContainerResponse will be send by plugin in response to PreStartContainerRequest message PreStartContainerResponse { } +// PreferredAllocationRequest is passed via a call to GetPreferredAllocation() +// at pod admission time. The device plugin should take the list of +// `available_deviceIDs` and calculate a preferred allocation of size +// 'allocation_size' from them, making sure to include the set of devices +// listed in 'must_include_deviceIDs'. +message PreferredAllocationRequest { + repeated ContainerPreferredAllocationRequest container_requests = 1; +} + +message ContainerPreferredAllocationRequest { + // List of available deviceIDs from which to choose a preferred allocation + repeated string available_deviceIDs = 1; + // List of deviceIDs that must be included in the preferred allocation + repeated string must_include_deviceIDs = 2; + // Number of devices to include in the preferred allocation + int32 allocation_size = 3; +} + +// PreferredAllocationResponse returns a preferred allocation, +// resulting from a PreferredAllocationRequest. +message PreferredAllocationResponse { + repeated ContainerPreferredAllocationResponse container_responses = 1; +} + +message ContainerPreferredAllocationResponse { + repeated string deviceIDs = 1; +} + // - Allocate is expected to be called during pod creation since allocation // failures for any container would result in pod startup failure. // - Allocate allows kubelet to exposes additional artifacts in a pod's @@ -162,13 +199,13 @@ message Mount { // DeviceSpec specifies a host device to mount into a container. message DeviceSpec { - // Path of the device within the container. - string container_path = 1; - // Path of the device on the host. - string host_path = 2; - // Cgroups permissions of the device, candidates are one or more of - // * r - allows container to read from the specified device. - // * w - allows container to write to the specified device. - // * m - allows container to create device files that do not yet exist. - string permissions = 3; + // Path of the device within the container. + string container_path = 1; + // Path of the device on the host. + string host_path = 2; + // Cgroups permissions of the device, candidates are one or more of + // * r - allows container to read from the specified device. + // * w - allows container to write to the specified device. + // * m - allows container to create device files that do not yet exist. + string permissions = 3; } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go index 66ed52ccd596..8036c6ffe2db 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kube-proxy/app/server_windows.go @@ -174,7 +174,7 @@ func newProxyServer(config *proxyconfigapi.KubeProxyConfiguration, cleanupAndExi OOMScoreAdj: config.OOMScoreAdj, ConfigSyncPeriod: config.ConfigSyncPeriod.Duration, HealthzServer: healthzServer, - UseEndpointSlices: false, + UseEndpointSlices: utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying), }, nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD index 5d71a936ea94..7a175668c218 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/BUILD @@ -111,6 +111,7 @@ go_library( "//staging/src/k8s.io/component-base/cli/flag:go_default_library", "//staging/src/k8s.io/component-base/configz:go_default_library", "//staging/src/k8s.io/component-base/featuregate:go_default_library", + "//staging/src/k8s.io/component-base/logs:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//staging/src/k8s.io/component-base/version:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go index c09d3b63358e..9c5fa11b66b5 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/options/options.go @@ -540,6 +540,7 @@ func AddKubeletConfigFlags(mainfs *pflag.FlagSet, c *kubeletconfig.KubeletConfig fs.StringSliceVar(&c.EnforceNodeAllocatable, "enforce-node-allocatable", c.EnforceNodeAllocatable, "A comma separated list of levels of node allocatable enforcement to be enforced by kubelet. Acceptable options are 'none', 'pods', 'system-reserved', and 'kube-reserved'. If the latter two options are specified, '--system-reserved-cgroup' and '--kube-reserved-cgroup' must also be set, respectively. If 'none' is specified, no additional options should be set. See https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/ for more details.") fs.StringVar(&c.SystemReservedCgroup, "system-reserved-cgroup", c.SystemReservedCgroup, "Absolute name of the top level cgroup that is used to manage non-kubernetes components for which compute resources were reserved via '--system-reserved' flag. Ex. '/system-reserved'. [default='']") fs.StringVar(&c.KubeReservedCgroup, "kube-reserved-cgroup", c.KubeReservedCgroup, "Absolute name of the top level cgroup that is used to manage kubernetes components for which compute resources were reserved via '--kube-reserved' flag. Ex. '/kube-reserved'. [default='']") + fs.StringVar(&c.Logging.Format, "logging-format", c.Logging.Format, `Sets the log format. Permitted formats: "text", "json".\nNon-default formats don't honor these flags: -add_dir_header, --alsologtostderr, --log_backtrace_at, --log_dir, --log_file, --log_file_max_size, --logtostderr, --skip_headers, --skip_log_headers, --stderrthreshold, --log-flush-frequency.\nNon-default choices are currently alpha and subject to change without warning.`) // Graduated experimental flags, kept for backward compatibility fs.BoolVar(&c.KernelMemcgNotification, "experimental-kernel-memcg-notification", c.KernelMemcgNotification, "Use kernelMemcgNotification configuration, this flag will be removed in 1.23.") diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go index 7993ec8e8001..c0e220e2ec6a 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/cmd/kubelet/app/server.go @@ -63,6 +63,7 @@ import ( cliflag "k8s.io/component-base/cli/flag" "k8s.io/component-base/configz" "k8s.io/component-base/featuregate" + "k8s.io/component-base/logs" "k8s.io/component-base/metrics" "k8s.io/component-base/metrics/legacyregistry" "k8s.io/component-base/version" @@ -255,12 +256,12 @@ HTTP server: The kubelet can also listen for HTTP and respond to a simple API // add the kubelet config controller to kubeletDeps kubeletDeps.KubeletConfigController = kubeletConfigController - // set up stopCh here in order to be reused by kubelet and docker shim - stopCh := genericapiserver.SetupSignalHandler() + // set up signal context here in order to be reused by kubelet and docker shim + ctx := genericapiserver.SetupSignalContext() // run the kubelet klog.V(5).Infof("KubeletConfiguration: %#v", kubeletServer.KubeletConfiguration) - if err := Run(kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate, stopCh); err != nil { + if err := Run(ctx, kubeletServer, kubeletDeps, utilfeature.DefaultFeatureGate); err != nil { klog.Fatal(err) } }, @@ -402,13 +403,16 @@ func UnsecuredDependencies(s *options.KubeletServer, featureGate featuregate.Fea // The kubeDeps argument may be nil - if so, it is initialized from the settings on KubeletServer. // Otherwise, the caller is assumed to have set up the Dependencies object and a default one will // not be generated. -func Run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate, stopCh <-chan struct{}) error { +func Run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate) error { + logOption := logs.NewOptions() + logOption.LogFormat = s.Logging.Format + logOption.Apply() // To help debugging, immediately log version klog.Infof("Version: %+v", version.Get()) if err := initForOS(s.KubeletFlags.WindowsService); err != nil { return fmt.Errorf("failed OS init: %v", err) } - if err := run(s, kubeDeps, featureGate, stopCh); err != nil { + if err := run(ctx, s, kubeDeps, featureGate); err != nil { return fmt.Errorf("failed to run Kubelet: %v", err) } return nil @@ -465,7 +469,7 @@ func makeEventRecorder(kubeDeps *kubelet.Dependencies, nodeName types.NodeName) } } -func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate, stopCh <-chan struct{}) (err error) { +func run(ctx context.Context, s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate featuregate.FeatureGate) (err error) { // Set global feature gates based on the value on the initial KubeletServer err = utilfeature.DefaultMutableFeatureGate.SetFromMap(s.KubeletConfiguration.FeatureGates) if err != nil { @@ -548,7 +552,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate f klog.Warningf("standalone mode, no API client") case kubeDeps.KubeClient == nil, kubeDeps.EventClient == nil, kubeDeps.HeartbeatClient == nil: - clientConfig, closeAllConns, err := buildKubeletClientConfig(s, nodeName) + clientConfig, closeAllConns, err := buildKubeletClientConfig(ctx, s, nodeName) if err != nil { return err } @@ -593,7 +597,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate f return err } kubeDeps.Auth = auth - runAuthenticatorCAReload(stopCh) + runAuthenticatorCAReload(ctx.Done()) } var cgroupRoots []string @@ -795,7 +799,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate f select { case <-done: break - case <-stopCh: + case <-ctx.Done(): break } @@ -804,7 +808,7 @@ func run(s *options.KubeletServer, kubeDeps *kubelet.Dependencies, featureGate f // buildKubeletClientConfig constructs the appropriate client config for the kubelet depending on whether // bootstrapping is enabled or client certificate rotation is enabled. -func buildKubeletClientConfig(s *options.KubeletServer, nodeName types.NodeName) (*restclient.Config, func(), error) { +func buildKubeletClientConfig(ctx context.Context, s *options.KubeletServer, nodeName types.NodeName) (*restclient.Config, func(), error) { if s.RotateCertificates { // Rules for client rotation and the handling of kube config files: // @@ -874,7 +878,7 @@ func buildKubeletClientConfig(s *options.KubeletServer, nodeName types.NodeName) } if len(s.BootstrapKubeconfig) > 0 { - if err := bootstrap.LoadClientCert(s.KubeConfig, s.BootstrapKubeconfig, s.CertDirectory, nodeName); err != nil { + if err := bootstrap.LoadClientCert(ctx, s.KubeConfig, s.BootstrapKubeconfig, s.CertDirectory, nodeName); err != nil { return nil, nil, err } } @@ -1151,7 +1155,8 @@ func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubele // start the kubelet server if enableServer { - go k.ListenAndServe(net.ParseIP(kubeCfg.Address), uint(kubeCfg.Port), kubeDeps.TLSOptions, kubeDeps.Auth, enableCAdvisorJSONEndpoints, kubeCfg.EnableDebuggingHandlers, kubeCfg.EnableContentionProfiling) + go k.ListenAndServe(net.ParseIP(kubeCfg.Address), uint(kubeCfg.Port), kubeDeps.TLSOptions, kubeDeps.Auth, + enableCAdvisorJSONEndpoints, kubeCfg.EnableDebuggingHandlers, kubeCfg.EnableContentionProfiling, kubeCfg.EnableSystemLogHandler) } if kubeCfg.ReadOnlyPort > 0 { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/api/service/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/api/service/OWNERS index 6c0aa0e18313..0abbe713952d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/api/service/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/api/service/OWNERS @@ -3,4 +3,3 @@ reviewers: - justinsb - freehan -- david-mcmahon diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS index 4df32916544f..13db28cb0c00 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/apps/OWNERS @@ -15,7 +15,6 @@ reviewers: - mml - m1093782566 - mbohlool -- david-mcmahon - kevin-wangzefeng - jianhuiz labels: diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS index 3b2fc47dbac8..08814e0eb3e8 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/autoscaling/OWNERS @@ -16,5 +16,4 @@ reviewers: - madhusudancs - mml - mbohlool -- david-mcmahon - jianhuiz diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS index badef1377a05..ea5e31b74d09 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/batch/OWNERS @@ -16,7 +16,6 @@ reviewers: - errordeveloper - mml - mbohlool -- david-mcmahon - jianhuiz labels: - sig/apps diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS index 270e4c49962e..61f00cee0c96 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/OWNERS @@ -28,7 +28,6 @@ reviewers: - sttts - dchen1107 - saad-ali -- zmerlynn - luxas - janetkuo - justinsb @@ -36,7 +35,6 @@ reviewers: - ncdc - tallclair - yifan-gu -- eparis - mwielgus - soltysh - piosz diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go index 70b9ff7583ba..c1ceb1ea3e0a 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/annotation_key_constants.go @@ -39,17 +39,20 @@ const ( // SeccompPodAnnotationKey represents the key of a seccomp profile applied // to all containers of a pod. + // Deprecated: set a pod security context `seccompProfile` field. SeccompPodAnnotationKey string = "seccomp.security.alpha.kubernetes.io/pod" // SeccompContainerAnnotationKeyPrefix represents the key of a seccomp profile applied // to one container of a pod. + // Deprecated: set a container security context `seccompProfile` field. SeccompContainerAnnotationKeyPrefix string = "container.seccomp.security.alpha.kubernetes.io/" // SeccompProfileRuntimeDefault represents the default seccomp profile used by container runtime. + // Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead. SeccompProfileRuntimeDefault string = "runtime/default" // DeprecatedSeccompProfileDockerDefault represents the default seccomp profile used by docker. - // This is now deprecated and should be replaced by SeccompProfileRuntimeDefault. + // Deprecated: set a pod or container security context `seccompProfile` of type "RuntimeDefault" instead. DeprecatedSeccompProfileDockerDefault string = "docker/default" // PreferAvoidPodsAnnotationKey represents the key of preferAvoidPods data (json serialized) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS index eb1df9125339..dfbbe68a5165 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/install/OWNERS @@ -8,4 +8,3 @@ reviewers: - liggitt - nikhiljindal - dims -- david-mcmahon diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go index 1dfdb767d513..e05a313a1f16 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/pods/helpers.go @@ -34,23 +34,23 @@ type ContainerVisitorWithPath func(container *api.Container, path *field.Path) b // of every container in the given pod spec and the field.Path to that container. // If visitor returns false, visiting is short-circuited. VisitContainersWithPath returns true if visiting completes, // false if visiting was short-circuited. -func VisitContainersWithPath(podSpec *api.PodSpec, visitor ContainerVisitorWithPath) bool { - path := field.NewPath("spec", "initContainers") +func VisitContainersWithPath(podSpec *api.PodSpec, specPath *field.Path, visitor ContainerVisitorWithPath) bool { + fldPath := specPath.Child("initContainers") for i := range podSpec.InitContainers { - if !visitor(&podSpec.InitContainers[i], path.Index(i)) { + if !visitor(&podSpec.InitContainers[i], fldPath.Index(i)) { return false } } - path = field.NewPath("spec", "containers") + fldPath = specPath.Child("containers") for i := range podSpec.Containers { - if !visitor(&podSpec.Containers[i], path.Index(i)) { + if !visitor(&podSpec.Containers[i], fldPath.Index(i)) { return false } } if utilfeature.DefaultFeatureGate.Enabled(features.EphemeralContainers) { - path = field.NewPath("spec", "ephemeralContainers") + fldPath = specPath.Child("ephemeralContainers") for i := range podSpec.EphemeralContainers { - if !visitor((*api.Container)(&podSpec.EphemeralContainers[i].EphemeralContainerCommon), path.Index(i)) { + if !visitor((*api.Container)(&podSpec.EphemeralContainers[i].EphemeralContainerCommon), fldPath.Index(i)) { return false } } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/types.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/types.go index 901f83988246..7cc41887f3f4 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/types.go @@ -154,7 +154,7 @@ type VolumeSource struct { // StorageOS represents a StorageOS volume that is attached to the kubelet's host machine and mounted into the pod // +optional StorageOS *StorageOSVolumeSource - // CSI (Container Storage Interface) represents storage that is handled by an external CSI driver (Alpha feature). + // CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). // +optional CSI *CSIVolumeSource } @@ -2897,8 +2897,36 @@ type PodSecurityContext struct { // sysctls (by the container runtime) might fail to launch. // +optional Sysctls []Sysctl + // The seccomp options to use by the containers in this pod. + // +optional + SeccompProfile *SeccompProfile } +// SeccompProfile defines a pod/container's seccomp profile settings. +// Only one profile source may be set. +// +union +type SeccompProfile struct { + // +unionDiscriminator + Type SeccompProfileType + // Load a profile defined in static file on the node. + // The profile must be preconfigured on the node to work. + // LocalhostProfile cannot be an absolute nor a descending path. + // +optional + LocalhostProfile *string +} + +// SeccompProfileType defines the supported seccomp profile types. +type SeccompProfileType string + +const ( + // SeccompProfileTypeUnconfined is when no seccomp profile is applied (A.K.A. unconfined). + SeccompProfileTypeUnconfined SeccompProfileType = "Unconfined" + // SeccompProfileTypeRuntimeDefault represents the default container runtime seccomp profile. + SeccompProfileTypeRuntimeDefault SeccompProfileType = "RuntimeDefault" + // SeccompProfileTypeLocalhost represents custom made profiles stored on the node's disk. + SeccompProfileTypeLocalhost SeccompProfileType = "Localhost" +) + // PodQOSClass defines the supported qos classes of Pods. type PodQOSClass string @@ -3524,13 +3552,21 @@ type ServiceSpec struct { // +optional PublishNotReadyAddresses bool - // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. IPv4 vs. - // IPv6). If a specific IP family is requested, the clusterIP field will be allocated from that family, if it is - // available in the cluster. If no IP family is requested, the cluster's primary IP family will be used. - // Other IP fields (loadBalancerIP, loadBalancerSourceRanges, externalIPs) and controllers which - // allocate external load-balancers should use the same IP family. Endpoints for this Service will be of - // this family. This field is immutable after creation. Assigning a ServiceIPFamily not available in the - // cluster (e.g. IPv6 in IPv4 only cluster) is an error condition and will fail during clusterIP assignment. + // ipFamily specifies whether this Service has a preference for a particular IP family (e.g. + // IPv4 vs. IPv6) when the IPv6DualStack feature gate is enabled. In a dual-stack cluster, + // you can specify ipFamily when creating a ClusterIP Service to determine whether the + // controller will allocate an IPv4 or IPv6 IP for it, and you can specify ipFamily when + // creating a headless Service to determine whether it will have IPv4 or IPv6 Endpoints. In + // either case, if you do not specify an ipFamily explicitly, it will default to the + // cluster's primary IP family. + // This field is part of an alpha feature, and you should not make any assumptions about its + // semantics other than those described above. In particular, you should not assume that it + // can (or cannot) be changed after creation time; that it can only have the values "IPv4" + // and "IPv6"; or that its current value on a given Service correctly reflects the current + // state of that Service. (For ClusterIP Services, look at clusterIP to see if the Service + // is IPv4 or IPv6. For headless Services, look at the endpoints, which may be dual-stack in + // the future. For ExternalName Services, ipFamily has no meaning, but it may be set to an + // irrelevant value anyway.) // +optional IPFamily *IPFamily @@ -5077,6 +5113,11 @@ type SecurityContext struct { // readonly paths and masked paths. // +optional ProcMount *ProcMountType + // The seccomp options to use by this container. If seccomp options are + // provided at both the pod & container level, the container options + // override the pod options. + // +optional + SeccompProfile *SeccompProfile } // ProcMountType defines the type of proc mount diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS index 68232a5525c9..66ba3983fad3 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/OWNERS @@ -21,13 +21,11 @@ reviewers: - sttts - dchen1107 - saad-ali -- zmerlynn - luxas - janetkuo - justinsb - ncdc - tallclair -- eparis - piosz - jsafrane - dims diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go index e0935600e7ee..17e385adc009 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/v1/zz_generated.conversion.go @@ -1621,6 +1621,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*v1.SeccompProfile)(nil), (*core.SeccompProfile)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1_SeccompProfile_To_core_SeccompProfile(a.(*v1.SeccompProfile), b.(*core.SeccompProfile), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*core.SeccompProfile)(nil), (*v1.SeccompProfile)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_core_SeccompProfile_To_v1_SeccompProfile(a.(*core.SeccompProfile), b.(*v1.SeccompProfile), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*core.Secret)(nil), (*v1.Secret)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_core_Secret_To_v1_Secret(a.(*core.Secret), b.(*v1.Secret), scope) }); err != nil { @@ -5940,6 +5950,7 @@ func autoConvert_v1_PodSecurityContext_To_core_PodSecurityContext(in *v1.PodSecu out.FSGroup = (*int64)(unsafe.Pointer(in.FSGroup)) out.Sysctls = *(*[]core.Sysctl)(unsafe.Pointer(&in.Sysctls)) out.FSGroupChangePolicy = (*core.PodFSGroupChangePolicy)(unsafe.Pointer(in.FSGroupChangePolicy)) + out.SeccompProfile = (*core.SeccompProfile)(unsafe.Pointer(in.SeccompProfile)) return nil } @@ -5962,6 +5973,7 @@ func autoConvert_core_PodSecurityContext_To_v1_PodSecurityContext(in *core.PodSe out.FSGroup = (*int64)(unsafe.Pointer(in.FSGroup)) out.FSGroupChangePolicy = (*v1.PodFSGroupChangePolicy)(unsafe.Pointer(in.FSGroupChangePolicy)) out.Sysctls = *(*[]v1.Sysctl)(unsafe.Pointer(&in.Sysctls)) + out.SeccompProfile = (*v1.SeccompProfile)(unsafe.Pointer(in.SeccompProfile)) return nil } @@ -7000,6 +7012,28 @@ func Convert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelector return autoConvert_core_ScopedResourceSelectorRequirement_To_v1_ScopedResourceSelectorRequirement(in, out, s) } +func autoConvert_v1_SeccompProfile_To_core_SeccompProfile(in *v1.SeccompProfile, out *core.SeccompProfile, s conversion.Scope) error { + out.Type = core.SeccompProfileType(in.Type) + out.LocalhostProfile = (*string)(unsafe.Pointer(in.LocalhostProfile)) + return nil +} + +// Convert_v1_SeccompProfile_To_core_SeccompProfile is an autogenerated conversion function. +func Convert_v1_SeccompProfile_To_core_SeccompProfile(in *v1.SeccompProfile, out *core.SeccompProfile, s conversion.Scope) error { + return autoConvert_v1_SeccompProfile_To_core_SeccompProfile(in, out, s) +} + +func autoConvert_core_SeccompProfile_To_v1_SeccompProfile(in *core.SeccompProfile, out *v1.SeccompProfile, s conversion.Scope) error { + out.Type = v1.SeccompProfileType(in.Type) + out.LocalhostProfile = (*string)(unsafe.Pointer(in.LocalhostProfile)) + return nil +} + +// Convert_core_SeccompProfile_To_v1_SeccompProfile is an autogenerated conversion function. +func Convert_core_SeccompProfile_To_v1_SeccompProfile(in *core.SeccompProfile, out *v1.SeccompProfile, s conversion.Scope) error { + return autoConvert_core_SeccompProfile_To_v1_SeccompProfile(in, out, s) +} + func autoConvert_v1_Secret_To_core_Secret(in *v1.Secret, out *core.Secret, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Immutable = (*bool)(unsafe.Pointer(in.Immutable)) @@ -7205,6 +7239,7 @@ func autoConvert_v1_SecurityContext_To_core_SecurityContext(in *v1.SecurityConte out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) out.ProcMount = (*core.ProcMountType)(unsafe.Pointer(in.ProcMount)) + out.SeccompProfile = (*core.SeccompProfile)(unsafe.Pointer(in.SeccompProfile)) return nil } @@ -7224,6 +7259,7 @@ func autoConvert_core_SecurityContext_To_v1_SecurityContext(in *core.SecurityCon out.ReadOnlyRootFilesystem = (*bool)(unsafe.Pointer(in.ReadOnlyRootFilesystem)) out.AllowPrivilegeEscalation = (*bool)(unsafe.Pointer(in.AllowPrivilegeEscalation)) out.ProcMount = (*v1.ProcMountType)(unsafe.Pointer(in.ProcMount)) + out.SeccompProfile = (*v1.SeccompProfile)(unsafe.Pointer(in.SeccompProfile)) return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD index 4c2378e0a16e..8fb48c2400b6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/BUILD @@ -27,12 +27,14 @@ go_library( "//pkg/master/ports:go_default_library", "//pkg/security/apparmor:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/equality:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", @@ -57,6 +59,8 @@ go_test( "//pkg/capabilities:go_default_library", "//pkg/features:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", + "//staging/src/k8s.io/api/events/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", @@ -65,6 +69,8 @@ go_test( "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + "//vendor/github.com/stretchr/testify/assert:go_default_library", + "//vendor/github.com/stretchr/testify/require:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS index 37f2de1a33ac..861d1efdce89 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/OWNERS @@ -21,12 +21,10 @@ reviewers: - sttts - quinton-hoole - dchen1107 -- zmerlynn - janetkuo - justinsb - pwittrock - tallclair -- eparis - soltysh - piosz - jsafrane diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go index 971918d53720..0aa0bde368a6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/events.go @@ -18,9 +18,14 @@ package validation import ( "fmt" + "reflect" "time" + "k8s.io/api/core/v1" + eventsv1beta1 "k8s.io/api/events/v1beta1" + apimachineryvalidation "k8s.io/apimachinery/pkg/api/validation" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" "k8s.io/kubernetes/pkg/apis/core" @@ -33,8 +38,88 @@ const ( NoteLengthLimit = 1024 ) -// ValidateEvent makes sure that the event makes sense. -func ValidateEvent(event *core.Event) field.ErrorList { +func ValidateEventCreate(event *core.Event, requestVersion schema.GroupVersion) field.ErrorList { + // Make sure events always pass legacy validation. + allErrs := legacyValidateEvent(event) + if requestVersion == v1.SchemeGroupVersion || requestVersion == eventsv1beta1.SchemeGroupVersion { + // No further validation for backwards compatibility. + return allErrs + } + + // Strict validation applies to creation via events.k8s.io/v1 API and newer. + allErrs = append(allErrs, ValidateObjectMeta(&event.ObjectMeta, true, apimachineryvalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) + allErrs = append(allErrs, validateV1EventSeries(event)...) + zeroTime := time.Time{} + if event.EventTime.Time == zeroTime { + allErrs = append(allErrs, field.Required(field.NewPath("eventTime"), "")) + } + if event.Type != v1.EventTypeNormal && event.Type != v1.EventTypeWarning { + allErrs = append(allErrs, field.Invalid(field.NewPath("type"), "", fmt.Sprintf("has invalid value: %v", event.Type))) + } + if event.FirstTimestamp.Time != zeroTime { + allErrs = append(allErrs, field.Invalid(field.NewPath("firstTimestamp"), "", "needs to be unset")) + } + if event.LastTimestamp.Time != zeroTime { + allErrs = append(allErrs, field.Invalid(field.NewPath("lastTimestamp"), "", "needs to be unset")) + } + if event.Count != 0 { + allErrs = append(allErrs, field.Invalid(field.NewPath("count"), "", "needs to be unset")) + } + if event.Source.Component != "" || event.Source.Host != "" { + allErrs = append(allErrs, field.Invalid(field.NewPath("source"), "", "needs to be unset")) + } + return allErrs +} + +func ValidateEventUpdate(newEvent, oldEvent *core.Event, requestVersion schema.GroupVersion) field.ErrorList { + // Make sure the new event always passes legacy validation. + allErrs := legacyValidateEvent(newEvent) + if requestVersion == v1.SchemeGroupVersion || requestVersion == eventsv1beta1.SchemeGroupVersion { + // No further validation for backwards compatibility. + return allErrs + } + + // Strict validation applies to update via events.k8s.io/v1 API and newer. + allErrs = append(allErrs, ValidateObjectMetaUpdate(&newEvent.ObjectMeta, &oldEvent.ObjectMeta, field.NewPath("metadata"))...) + // if the series was modified, validate the new data + if !reflect.DeepEqual(newEvent.Series, oldEvent.Series) { + allErrs = append(allErrs, validateV1EventSeries(newEvent)...) + } + + allErrs = append(allErrs, ValidateImmutableField(newEvent.InvolvedObject, oldEvent.InvolvedObject, field.NewPath("involvedObject"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Reason, oldEvent.Reason, field.NewPath("reason"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Message, oldEvent.Message, field.NewPath("message"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Source, oldEvent.Source, field.NewPath("source"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.FirstTimestamp, oldEvent.FirstTimestamp, field.NewPath("firstTimestamp"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.LastTimestamp, oldEvent.LastTimestamp, field.NewPath("lastTimestamp"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Count, oldEvent.Count, field.NewPath("count"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Reason, oldEvent.Reason, field.NewPath("reason"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Type, oldEvent.Type, field.NewPath("type"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.EventTime, oldEvent.EventTime, field.NewPath("eventTime"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Action, oldEvent.Action, field.NewPath("action"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.Related, oldEvent.Related, field.NewPath("related"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.ReportingController, oldEvent.ReportingController, field.NewPath("reportingController"))...) + allErrs = append(allErrs, ValidateImmutableField(newEvent.ReportingInstance, oldEvent.ReportingInstance, field.NewPath("reportingInstance"))...) + + return allErrs +} + +func validateV1EventSeries(event *core.Event) field.ErrorList { + allErrs := field.ErrorList{} + zeroTime := time.Time{} + if event.Series != nil { + if event.Series.Count < 2 { + allErrs = append(allErrs, field.Invalid(field.NewPath("series.count"), "", fmt.Sprintf("should be at least 2"))) + } + if event.Series.LastObservedTime.Time == zeroTime { + allErrs = append(allErrs, field.Required(field.NewPath("series.lastObservedTime"), "")) + } + } + return allErrs +} + +// legacyValidateEvent makes sure that the event makes sense. +func legacyValidateEvent(event *core.Event) field.ErrorList { allErrs := field.ErrorList{} // Because go zeroTime := time.Time{} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go index e447b8b0ad5b..304dd4e6af77 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/validation/validation.go @@ -3550,15 +3550,40 @@ func validatePodAffinity(podAffinity *core.PodAffinity, fldPath *field.Path) fie return allErrs } +func validateSeccompProfileField(sp *core.SeccompProfile, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + if sp == nil { + return allErrs + } + + if err := validateSeccompProfileType(fldPath.Child("type"), sp.Type); err != nil { + allErrs = append(allErrs, err) + } + + if sp.Type == core.SeccompProfileTypeLocalhost { + if sp.LocalhostProfile == nil { + allErrs = append(allErrs, field.Required(fldPath.Child("localhostProfile"), "must be set when seccomp type is Localhost")) + } else { + allErrs = append(allErrs, validateLocalDescendingPath(*sp.LocalhostProfile, fldPath.Child("localhostProfile"))...) + } + } else { + if sp.LocalhostProfile != nil { + allErrs = append(allErrs, field.Invalid(fldPath.Child("localhostProfile"), sp, "can only be set when seccomp type is Localhost")) + } + } + + return allErrs +} + func ValidateSeccompProfile(p string, fldPath *field.Path) field.ErrorList { if p == core.SeccompProfileRuntimeDefault || p == core.DeprecatedSeccompProfileDockerDefault { return nil } - if p == "unconfined" { + if p == v1.SeccompProfileNameUnconfined { return nil } - if strings.HasPrefix(p, "localhost/") { - return validateLocalDescendingPath(strings.TrimPrefix(p, "localhost/"), fldPath) + if strings.HasPrefix(p, v1.SeccompLocalhostProfileNamePrefix) { + return validateLocalDescendingPath(strings.TrimPrefix(p, v1.SeccompLocalhostProfileNamePrefix), fldPath) } return field.ErrorList{field.Invalid(fldPath, p, "must be a valid seccomp profile")} } @@ -3577,6 +3602,18 @@ func ValidateSeccompPodAnnotations(annotations map[string]string, fldPath *field return allErrs } +// ValidateSeccompProfileType tests that the argument is a valid SeccompProfileType. +func validateSeccompProfileType(fldPath *field.Path, seccompProfileType core.SeccompProfileType) *field.Error { + switch seccompProfileType { + case core.SeccompProfileTypeLocalhost, core.SeccompProfileTypeRuntimeDefault, core.SeccompProfileTypeUnconfined: + return nil + case "": + return field.Required(fldPath, "type is required when seccompProfile is set") + default: + return field.NotSupported(fldPath, seccompProfileType, []string{string(core.SeccompProfileTypeLocalhost), string(core.SeccompProfileTypeRuntimeDefault), string(core.SeccompProfileTypeUnconfined)}) + } +} + func ValidateAppArmorPodAnnotations(annotations map[string]string, spec *core.PodSpec, fldPath *field.Path) field.ErrorList { allErrs := field.ErrorList{} for k, p := range annotations { @@ -3598,7 +3635,7 @@ func ValidateAppArmorPodAnnotations(annotations map[string]string, spec *core.Po func podSpecHasContainer(spec *core.PodSpec, containerName string) bool { var hasContainer bool - podshelper.VisitContainersWithPath(spec, func(c *core.Container, _ *field.Path) bool { + podshelper.VisitContainersWithPath(spec, field.NewPath("spec"), func(c *core.Container, _ *field.Path) bool { if c.Name == containerName { hasContainer = true return false @@ -3684,6 +3721,7 @@ func ValidatePodSecurityContext(securityContext *core.PodSecurityContext, spec * allErrs = append(allErrs, validateFSGroupChangePolicy(securityContext.FSGroupChangePolicy, fldPath.Child("fsGroupChangePolicy"))...) } + allErrs = append(allErrs, validateSeccompProfileField(securityContext.SeccompProfile, fldPath.Child("seccompProfile"))...) allErrs = append(allErrs, validateWindowsSecurityContextOptions(securityContext.WindowsOptions, fldPath.Child("windowsOptions"))...) } @@ -3720,10 +3758,77 @@ func ValidatePodCreate(pod *core.Pod, opts PodValidationOptions) field.ErrorList if len(pod.Spec.EphemeralContainers) > 0 { allErrs = append(allErrs, field.Forbidden(fldPath.Child("ephemeralContainers"), "cannot be set on create")) } + allErrs = append(allErrs, validateSeccompAnnotationsAndFields(pod.ObjectMeta, &pod.Spec, fldPath)...) return allErrs } +// ValidateSeccompAnnotationsAndFields iterates through all containers and ensure that when both seccompProfile and seccomp annotations exist they match. +func validateSeccompAnnotationsAndFields(objectMeta metav1.ObjectMeta, podSpec *core.PodSpec, specPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + + if podSpec.SecurityContext != nil && podSpec.SecurityContext.SeccompProfile != nil { + // If both seccomp annotations and fields are specified, the values must match. + if annotation, found := objectMeta.Annotations[v1.SeccompPodAnnotationKey]; found { + seccompPath := specPath.Child("securityContext").Child("seccompProfile") + err := validateSeccompAnnotationsAndFieldsMatch(annotation, podSpec.SecurityContext.SeccompProfile, seccompPath) + if err != nil { + allErrs = append(allErrs, err) + } + } + } + + podshelper.VisitContainersWithPath(podSpec, specPath, func(c *core.Container, cFldPath *field.Path) bool { + var field *core.SeccompProfile + if c.SecurityContext != nil { + field = c.SecurityContext.SeccompProfile + } + + if field == nil { + return true + } + + key := v1.SeccompContainerAnnotationKeyPrefix + c.Name + if annotation, found := objectMeta.Annotations[key]; found { + seccompPath := cFldPath.Child("securityContext").Child("seccompProfile") + err := validateSeccompAnnotationsAndFieldsMatch(annotation, field, seccompPath) + if err != nil { + allErrs = append(allErrs, err) + } + } + return true + }) + + return allErrs +} + +func validateSeccompAnnotationsAndFieldsMatch(annotationValue string, seccompField *core.SeccompProfile, fldPath *field.Path) *field.Error { + if seccompField == nil { + return nil + } + + switch seccompField.Type { + case core.SeccompProfileTypeUnconfined: + if annotationValue != v1.SeccompProfileNameUnconfined { + return field.Forbidden(fldPath.Child("type"), "seccomp type in annotation and field must match") + } + + case core.SeccompProfileTypeRuntimeDefault: + if annotationValue != v1.SeccompProfileRuntimeDefault && annotationValue != v1.DeprecatedSeccompProfileDockerDefault { + return field.Forbidden(fldPath.Child("type"), "seccomp type in annotation and field must match") + } + + case core.SeccompProfileTypeLocalhost: + if !strings.HasPrefix(annotationValue, v1.SeccompLocalhostProfileNamePrefix) { + return field.Forbidden(fldPath.Child("type"), "seccomp type in annotation and field must match") + } else if seccompField.LocalhostProfile == nil || strings.TrimPrefix(annotationValue, v1.SeccompLocalhostProfileNamePrefix) != *seccompField.LocalhostProfile { + return field.Forbidden(fldPath.Child("localhostProfile"), "seccomp profile in annotation and field must match") + } + } + + return nil +} + // ValidatePodUpdate tests to see if the update is legal for an end user to make. newPod is updated with fields // that cannot be changed. func ValidatePodUpdate(newPod, oldPod *core.Pod, opts PodValidationOptions) field.ErrorList { @@ -4389,6 +4494,7 @@ func ValidatePodTemplateSpec(spec *core.PodTemplateSpec, fldPath *field.Path) fi allErrs = append(allErrs, ValidateAnnotations(spec.Annotations, fldPath.Child("annotations"))...) allErrs = append(allErrs, ValidatePodSpecificAnnotations(spec.Annotations, &spec.Spec, fldPath.Child("annotations"))...) allErrs = append(allErrs, ValidatePodSpec(&spec.Spec, fldPath.Child("spec"))...) + allErrs = append(allErrs, validateSeccompAnnotationsAndFields(spec.ObjectMeta, &spec.Spec, fldPath.Child("spec"))...) if len(spec.Spec.EphemeralContainers) > 0 { allErrs = append(allErrs, field.Forbidden(fldPath.Child("spec", "ephemeralContainers"), "ephemeral containers not allowed in pod template")) @@ -5616,8 +5722,9 @@ func ValidateSecurityContext(sc *core.SecurityContext, fldPath *field.Path) fiel if err := ValidateProcMountType(fldPath.Child("procMount"), *sc.ProcMount); err != nil { allErrs = append(allErrs, err) } - } + } + allErrs = append(allErrs, validateSeccompProfileField(sc.SeccompProfile, fldPath.Child("seccompProfile"))...) if sc.AllowPrivilegeEscalation != nil && !*sc.AllowPrivilegeEscalation { if sc.Privileged != nil && *sc.Privileged { allErrs = append(allErrs, field.Invalid(fldPath, sc, "cannot set `allowPrivilegeEscalation` to false and `privileged` to true")) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go index cfb41f3c9f4d..36448c70be50 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/core/zz_generated.deepcopy.go @@ -3701,6 +3701,11 @@ func (in *PodSecurityContext) DeepCopyInto(out *PodSecurityContext) { *out = make([]Sysctl, len(*in)) copy(*out, *in) } + if in.SeccompProfile != nil { + in, out := &in.SeccompProfile, &out.SeccompProfile + *out = new(SeccompProfile) + (*in).DeepCopyInto(*out) + } return } @@ -4677,6 +4682,27 @@ func (in *ScopedResourceSelectorRequirement) DeepCopy() *ScopedResourceSelectorR return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SeccompProfile) DeepCopyInto(out *SeccompProfile) { + *out = *in + if in.LocalhostProfile != nil { + in, out := &in.LocalhostProfile, &out.LocalhostProfile + *out = new(string) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SeccompProfile. +func (in *SeccompProfile) DeepCopy() *SeccompProfile { + if in == nil { + return nil + } + out := new(SeccompProfile) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Secret) DeepCopyInto(out *Secret) { *out = *in @@ -4931,6 +4957,11 @@ func (in *SecurityContext) DeepCopyInto(out *SecurityContext) { *out = new(ProcMountType) **out = **in } + if in.SeccompProfile != nil { + in, out := &in.SeccompProfile, &out.SeccompProfile + *out = new(SeccompProfile) + (*in).DeepCopyInto(*out) + } return } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS index f2ab71a01879..6908d0fb0313 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/extensions/OWNERS @@ -30,7 +30,6 @@ reviewers: - mml - resouer - mbohlool -- david-mcmahon - therc - pweil- - mqliang diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go index 50805b808024..5dcee4cdac5f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/apis/policy/types.go @@ -210,7 +210,7 @@ type PodSecurityPolicySpec struct { AllowedFlexVolumes []AllowedFlexVolume // AllowedCSIDrivers is an allowlist of inline CSI drivers that must be explicitly set to be embedded within a pod spec. // An empty value indicates that any CSI driver can be used for inline ephemeral volumes. - // This is an alpha field, and is only honored if the API server enables the CSIInlineVolume feature gate. + // This is a beta field, and is only honored if the API server enables the CSIInlineVolume feature gate. // +optional AllowedCSIDrivers []AllowedCSIDriver // AllowedUnsafeSysctls is a list of explicitly allowed unsafe sysctls, defaults to none. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go index 88fbf45b7bc6..355da12aab67 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_assume_cache.go @@ -23,7 +23,7 @@ import ( "k8s.io/klog/v2" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/client-go/tools/cache" ) @@ -134,7 +134,11 @@ func NewAssumeCache(informer cache.SharedIndexInformer, description, indexName s indexFunc: indexFunc, indexName: indexName, } - c.store = cache.NewIndexer(objInfoKeyFunc, cache.Indexers{indexName: c.objInfoIndexFunc}) + indexers := cache.Indexers{} + if indexName != "" && indexFunc != nil { + indexers[indexName] = c.objInfoIndexFunc + } + c.store = cache.NewIndexer(objInfoKeyFunc, indexers) // Unit tests don't use informers if informer != nil { @@ -422,7 +426,7 @@ type pvcAssumeCache struct { // NewPVCAssumeCache creates a PVC assume cache. func NewPVCAssumeCache(informer cache.SharedIndexInformer) PVCAssumeCache { - return &pvcAssumeCache{NewAssumeCache(informer, "v1.PersistentVolumeClaim", "namespace", cache.MetaNamespaceIndexFunc)} + return &pvcAssumeCache{NewAssumeCache(informer, "v1.PersistentVolumeClaim", "", nil)} } func (c *pvcAssumeCache) GetPVC(pvcKey string) (*v1.PersistentVolumeClaim, error) { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go index 6dbab627f983..949db90e48ce 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/controller/volume/scheduling/scheduler_binder.go @@ -115,7 +115,7 @@ type InTreeToCSITranslator interface { // PV controller to fully bind and provision the PVCs. If binding fails, the Pod is sent // back through the scheduler. // ii. After BindPodVolumes() is complete, then the scheduler does the final Pod->Node binding. -// 2. Once all the assume operations are done in d), the scheduler processes the next Pod in the scheduler queue +// 2. Once all the assume operations are done in e), the scheduler processes the next Pod in the scheduler queue // while the actual binding operation occurs in the background. type SchedulerVolumeBinder interface { // GetPodVolumes returns a pod's PVCs separated into bound, unbound with delayed binding (including provisioning) @@ -160,14 +160,15 @@ type SchedulerVolumeBinder interface { } type volumeBinder struct { - kubeClient clientset.Interface - classLister storagelisters.StorageClassLister + kubeClient clientset.Interface - podLister corelisters.PodLister - nodeInformer coreinformers.NodeInformer - csiNodeInformer storageinformers.CSINodeInformer - pvcCache PVCAssumeCache - pvCache PVAssumeCache + classLister storagelisters.StorageClassLister + podLister corelisters.PodLister + nodeLister corelisters.NodeLister + csiNodeLister storagelisters.CSINodeLister + + pvcCache PVCAssumeCache + pvCache PVAssumeCache // Amount of time to wait for the bind operation to succeed bindTimeout time.Duration @@ -186,15 +187,15 @@ func NewVolumeBinder( storageClassInformer storageinformers.StorageClassInformer, bindTimeout time.Duration) SchedulerVolumeBinder { return &volumeBinder{ - kubeClient: kubeClient, - podLister: podInformer.Lister(), - classLister: storageClassInformer.Lister(), - nodeInformer: nodeInformer, - csiNodeInformer: csiNodeInformer, - pvcCache: NewPVCAssumeCache(pvcInformer.Informer()), - pvCache: NewPVAssumeCache(pvInformer.Informer()), - bindTimeout: bindTimeout, - translator: csitrans.New(), + kubeClient: kubeClient, + podLister: podInformer.Lister(), + classLister: storageClassInformer.Lister(), + nodeLister: nodeInformer.Lister(), + csiNodeLister: csiNodeInformer.Lister(), + pvcCache: NewPVCAssumeCache(pvcInformer.Informer()), + pvCache: NewPVAssumeCache(pvInformer.Informer()), + bindTimeout: bindTimeout, + translator: csitrans.New(), } } @@ -234,20 +235,20 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, boundClaims, claimsToBind []* }() var ( - matchedBindings []*BindingInfo - provisionedClaims []*v1.PersistentVolumeClaim + staticBindings []*BindingInfo + dynamicProvisions []*v1.PersistentVolumeClaim ) defer func() { // Although we do not distinguish nil from empty in this function, for // easier testing, we normalize empty to nil. - if len(matchedBindings) == 0 { - matchedBindings = nil + if len(staticBindings) == 0 { + staticBindings = nil } - if len(provisionedClaims) == 0 { - provisionedClaims = nil + if len(dynamicProvisions) == 0 { + dynamicProvisions = nil } - podVolumes.StaticBindings = matchedBindings - podVolumes.DynamicProvisions = provisionedClaims + podVolumes.StaticBindings = staticBindings + podVolumes.DynamicProvisions = dynamicProvisions }() // Check PV node affinity on bound volumes @@ -282,7 +283,7 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, boundClaims, claimsToBind []* // Find matching volumes if len(claimsToFindMatching) > 0 { var unboundClaims []*v1.PersistentVolumeClaim - unboundVolumesSatisfied, matchedBindings, unboundClaims, err = b.findMatchingVolumes(pod, claimsToFindMatching, node) + unboundVolumesSatisfied, staticBindings, unboundClaims, err = b.findMatchingVolumes(pod, claimsToFindMatching, node) if err != nil { return } @@ -291,7 +292,7 @@ func (b *volumeBinder) FindPodVolumes(pod *v1.Pod, boundClaims, claimsToBind []* // Check for claims to provision if len(claimsToProvision) > 0 { - unboundVolumesSatisfied, provisionedClaims, err = b.checkVolumeProvisions(pod, claimsToProvision, node) + unboundVolumesSatisfied, dynamicProvisions, err = b.checkVolumeProvisions(pod, claimsToProvision, node) if err != nil { return } @@ -452,7 +453,7 @@ func (b *volumeBinder) bindAPIUpdate(podName string, bindings []*BindingInfo, cl for _, binding = range bindings { klog.V(5).Infof("bindAPIUpdate: Pod %q, binding PV %q to PVC %q", podName, binding.pv.Name, binding.pvc.Name) // TODO: does it hurt if we make an api call and nothing needs to be updated? - claimKey := claimToClaimKey(binding.pvc) + claimKey := getPVCName(binding.pvc) klog.V(2).Infof("claim %q bound to volume %q", claimKey, binding.pv.Name) newPV, err := b.kubeClient.CoreV1().PersistentVolumes().Update(context.TODO(), binding.pv, metav1.UpdateOptions{}) if err != nil { @@ -504,12 +505,12 @@ func (b *volumeBinder) checkBindings(pod *v1.Pod, bindings []*BindingInfo, claim return false, fmt.Errorf("failed to get cached claims to provision for pod %q", podName) } - node, err := b.nodeInformer.Lister().Get(pod.Spec.NodeName) + node, err := b.nodeLister.Get(pod.Spec.NodeName) if err != nil { return false, fmt.Errorf("failed to get node %q: %v", pod.Spec.NodeName, err) } - csiNode, err := b.csiNodeInformer.Lister().Get(node.Name) + csiNode, err := b.csiNodeLister.Get(node.Name) if err != nil { // TODO: return the error once CSINode is created by default klog.V(4).Infof("Could not get a CSINode object for the node %q: %v", node.Name, err) @@ -711,7 +712,7 @@ func (b *volumeBinder) GetPodVolumes(pod *v1.Pod) (boundClaims []*v1.PersistentV } func (b *volumeBinder) checkBoundClaims(claims []*v1.PersistentVolumeClaim, node *v1.Node, podName string) (bool, error) { - csiNode, err := b.csiNodeInformer.Lister().Get(node.Name) + csiNode, err := b.csiNodeLister.Get(node.Name) if err != nil { // TODO: return the error once CSINode is created by default klog.V(4).Infof("Could not get a CSINode object for the node %q: %v", node.Name, err) @@ -786,9 +787,9 @@ func (b *volumeBinder) findMatchingVolumes(pod *v1.Pod, claimsToBind []*v1.Persi // checkVolumeProvisions checks given unbound claims (the claims have gone through func // findMatchingVolumes, and do not have matching volumes for binding), and return true // if all of the claims are eligible for dynamic provision. -func (b *volumeBinder) checkVolumeProvisions(pod *v1.Pod, claimsToProvision []*v1.PersistentVolumeClaim, node *v1.Node) (provisionSatisfied bool, provisionedClaims []*v1.PersistentVolumeClaim, err error) { +func (b *volumeBinder) checkVolumeProvisions(pod *v1.Pod, claimsToProvision []*v1.PersistentVolumeClaim, node *v1.Node) (provisionSatisfied bool, dynamicProvisions []*v1.PersistentVolumeClaim, err error) { podName := getPodName(pod) - provisionedClaims = []*v1.PersistentVolumeClaim{} + dynamicProvisions = []*v1.PersistentVolumeClaim{} for _, claim := range claimsToProvision { pvcName := getPVCName(claim) @@ -816,12 +817,12 @@ func (b *volumeBinder) checkVolumeProvisions(pod *v1.Pod, claimsToProvision []*v // TODO: Check if capacity of the node domain in the storage class // can satisfy resource requirement of given claim - provisionedClaims = append(provisionedClaims, claim) + dynamicProvisions = append(dynamicProvisions, claim) } klog.V(4).Infof("Provisioning for %d claims of pod %q that has no matching volumes on node %q ...", len(claimsToProvision), podName, node.Name) - return true, provisionedClaims, nil + return true, dynamicProvisions, nil } func (b *volumeBinder) revertAssumedPVs(bindings []*BindingInfo) { @@ -853,10 +854,6 @@ func (a byPVCSize) Less(i, j int) bool { return iSize.Cmp(jSize) == -1 } -func claimToClaimKey(claim *v1.PersistentVolumeClaim) string { - return fmt.Sprintf("%s/%s", claim.Namespace, claim.Name) -} - // isCSIMigrationOnForPlugin checks if CSI migrartion is enabled for a given plugin. func isCSIMigrationOnForPlugin(pluginName string) bool { switch pluginName { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS index d9b6fb8c6a83..2771f3a6beac 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/OWNERS @@ -16,11 +16,9 @@ reviewers: - pmorie - dchen1107 - justinsb -- eparis - dims - resouer - mbohlool -- david-mcmahon - mfojtik - therc - andrewsykim diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/OWNERS index b8c5ea16b832..b581d7c8b4ad 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/aws/OWNERS @@ -2,6 +2,5 @@ reviewers: - justinsb -- david-mcmahon - therc - chrislovecnm diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/OWNERS index 4c32e8bef5ce..d42107bcc36b 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/credentialprovider/gcp/OWNERS @@ -8,7 +8,5 @@ reviewers: - vishh - mikedanese - davidopp -- eparis - dims -- david-mcmahon - therc diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/features/kube_features.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/features/kube_features.go index b4b6469374f5..a8482c78d4a3 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/features/kube_features.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/features/kube_features.go @@ -286,7 +286,7 @@ const ( // Enables CSI to use raw block storage volumes CSIBlockVolume featuregate.Feature = "CSIBlockVolume" - // owner: @vladimirvivien + // owner: @pohly // alpha: v1.14 // beta: v1.16 // diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD index 5063004da2a8..53d67a8ee212 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/BUILD @@ -21,6 +21,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/component-base/config:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go index 6fa4370ca375..a7e2d5e1b234 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/types.go @@ -19,6 +19,7 @@ package config import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + componentbaseconfig "k8s.io/component-base/config" ) // HairpinMode denotes how the kubelet should configure networking to handle @@ -357,6 +358,11 @@ type KubeletConfiguration struct { // The purpose of this format is make sure you have the opportunity to notice if the next release hides additional metrics, // rather than being surprised when they are permanently removed in the release after that. ShowHiddenMetricsForVersion string + // Logging specifies the options of logging. + // Refer [Logs Options](https://github.com/kubernetes/component-base/blob/master/logs/options.go) for more information. + Logging componentbaseconfig.LoggingConfiguration + // EnableSystemLogHandler enables /logs handler. + EnableSystemLogHandler bool } // KubeletAuthorizationMode denotes the authorization mode for the kubelet diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD index c747871adbc0..40aac29fe9cd 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/BUILD @@ -27,6 +27,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/component-base/config/v1alpha1:go_default_library", "//staging/src/k8s.io/kubelet/config/v1beta1:go_default_library", "//vendor/k8s.io/utils/pointer:go_default_library", ], diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go index 880d028e3819..5cf26ad7a0d6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/defaults.go @@ -21,6 +21,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" kruntime "k8s.io/apimachinery/pkg/runtime" + componentbaseconfigv1alpha1 "k8s.io/component-base/config/v1alpha1" kubeletconfigv1beta1 "k8s.io/kubelet/config/v1beta1" // TODO: Cut references to k8s.io/kubernetes, eventually there should be none from this package "k8s.io/kubernetes/pkg/kubelet/qos" @@ -233,4 +234,9 @@ func SetDefaults_KubeletConfiguration(obj *kubeletconfigv1beta1.KubeletConfigura if obj.VolumePluginDir == "" { obj.VolumePluginDir = DefaultVolumePluginDir } + // Use the Default LoggingConfiguration option + componentbaseconfigv1alpha1.RecommendedLoggingConfiguration(&obj.Logging) + if obj.EnableSystemLogHandler == nil { + obj.EnableSystemLogHandler = utilpointer.BoolPtr(true) + } } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go index 8efd41941c13..e0b7608745b6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/v1beta1/zz_generated.conversion.go @@ -26,6 +26,7 @@ import ( v1 "k8s.io/apimachinery/pkg/apis/meta/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" + v1alpha1 "k8s.io/component-base/config/v1alpha1" v1beta1 "k8s.io/kubelet/config/v1beta1" config "k8s.io/kubernetes/pkg/kubelet/apis/config" ) @@ -342,6 +343,12 @@ func autoConvert_v1beta1_KubeletConfiguration_To_config_KubeletConfiguration(in out.VolumePluginDir = in.VolumePluginDir out.ProviderID = in.ProviderID out.KernelMemcgNotification = in.KernelMemcgNotification + if err := v1alpha1.Convert_v1alpha1_LoggingConfiguration_To_config_LoggingConfiguration(&in.Logging, &out.Logging, s); err != nil { + return err + } + if err := v1.Convert_Pointer_bool_To_bool(&in.EnableSystemLogHandler, &out.EnableSystemLogHandler, s); err != nil { + return err + } return nil } @@ -486,6 +493,12 @@ func autoConvert_config_KubeletConfiguration_To_v1beta1_KubeletConfiguration(in out.EnforceNodeAllocatable = *(*[]string)(unsafe.Pointer(&in.EnforceNodeAllocatable)) out.ReservedSystemCPUs = in.ReservedSystemCPUs out.ShowHiddenMetricsForVersion = in.ShowHiddenMetricsForVersion + if err := v1alpha1.Convert_config_LoggingConfiguration_To_v1alpha1_LoggingConfiguration(&in.Logging, &out.Logging, s); err != nil { + return err + } + if err := v1.Convert_bool_To_Pointer_bool(&in.EnableSystemLogHandler, &out.EnableSystemLogHandler, s); err != nil { + return err + } return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD index 36bb98442ff1..447b9d3b1a53 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/BUILD @@ -22,6 +22,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/logs:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go index 5e4d37f03fa6..9afa64205e04 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/validation/validation.go @@ -23,6 +23,7 @@ import ( utilerrors "k8s.io/apimachinery/pkg/util/errors" utilvalidation "k8s.io/apimachinery/pkg/util/validation" utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/component-base/logs" "k8s.io/component-base/metrics" "k8s.io/kubernetes/pkg/features" kubeletconfig "k8s.io/kubernetes/pkg/kubelet/apis/config" @@ -158,5 +159,12 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error allErrors = append(allErrors, err) } allErrors = append(allErrors, metrics.ValidateShowHiddenMetricsVersion(kc.ShowHiddenMetricsForVersion)...) + + logOption := logs.NewOptions() + if kc.Logging.Format != "" { + logOption.LogFormat = kc.Logging.Format + } + allErrors = append(allErrors, logOption.Validate()...) + return utilerrors.NewAggregate(allErrors) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go index 35acde4a0d68..87b3969325ce 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/apis/config/zz_generated.deepcopy.go @@ -185,6 +185,7 @@ func (in *KubeletConfiguration) DeepCopyInto(out *KubeletConfiguration) { *out = make([]string, len(*in)) copy(*out, *in) } + out.Logging = in.Logging return } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go index 02bf60563556..f6b129dc8696 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/certificate/bootstrap/bootstrap.go @@ -105,7 +105,7 @@ func LoadClientConfig(kubeconfigPath, bootstrapPath, certDir string) (certConfig // The kubeconfig at bootstrapPath is used to request a client certificate from the API server. // On success, a kubeconfig file referencing the generated key and obtained certificate is written to kubeconfigPath. // The certificate and key file are stored in certDir. -func LoadClientCert(kubeconfigPath, bootstrapPath, certDir string, nodeName types.NodeName) error { +func LoadClientCert(ctx context.Context, kubeconfigPath, bootstrapPath, certDir string, nodeName types.NodeName) error { // Short-circuit if the kubeconfig file exists and is valid. ok, err := isClientConfigStillValid(kubeconfigPath) if err != nil { @@ -156,11 +156,11 @@ func LoadClientCert(kubeconfigPath, bootstrapPath, certDir string, nodeName type } } - if err := waitForServer(*bootstrapClientConfig, 1*time.Minute); err != nil { + if err := waitForServer(ctx, *bootstrapClientConfig, 1*time.Minute); err != nil { klog.Warningf("Error waiting for apiserver to come up: %v", err) } - certData, err := requestNodeCertificate(bootstrapClient, keyData, nodeName) + certData, err := requestNodeCertificate(ctx, bootstrapClient, keyData, nodeName) if err != nil { return err } @@ -278,7 +278,7 @@ func verifyKeyData(data []byte) bool { return err == nil } -func waitForServer(cfg restclient.Config, deadline time.Duration) error { +func waitForServer(ctx context.Context, cfg restclient.Config, deadline time.Duration) error { cfg.NegotiatedSerializer = scheme.Codecs.WithoutConversion() cfg.Timeout = 1 * time.Second cli, err := restclient.UnversionedRESTClientFor(&cfg) @@ -286,12 +286,12 @@ func waitForServer(cfg restclient.Config, deadline time.Duration) error { return fmt.Errorf("couldn't create client: %v", err) } - ctx, cancel := context.WithTimeout(context.TODO(), deadline) + ctx, cancel := context.WithTimeout(ctx, deadline) defer cancel() var connected bool wait.JitterUntil(func() { - if _, err := cli.Get().AbsPath("/healthz").Do(context.TODO()).Raw(); err != nil { + if _, err := cli.Get().AbsPath("/healthz").Do(ctx).Raw(); err != nil { klog.Infof("Failed to connect to apiserver: %v", err) return } @@ -312,7 +312,7 @@ func waitForServer(cfg restclient.Config, deadline time.Duration) error { // certificate (pem-encoded). If there is any errors, or the watch timeouts, it // will return an error. This is intended for use on nodes (kubelet and // kubeadm). -func requestNodeCertificate(client clientset.Interface, privateKeyData []byte, nodeName types.NodeName) (certData []byte, err error) { +func requestNodeCertificate(ctx context.Context, client clientset.Interface, privateKeyData []byte, nodeName types.NodeName) (certData []byte, err error) { subject := &pkix.Name{ Organization: []string{"system:nodes"}, CommonName: "system:node:" + string(nodeName), @@ -349,7 +349,7 @@ func requestNodeCertificate(client clientset.Interface, privateKeyData []byte, n return nil, err } - ctx, cancel := context.WithTimeout(context.Background(), 3600*time.Second) + ctx, cancel := context.WithTimeout(ctx, 3600*time.Second) defer cancel() klog.V(2).Infof("Waiting for client certificate to be issued") diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go index fb5ec5c0c427..bf9e96a9c1b1 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/device_plugin_stub.go @@ -33,10 +33,11 @@ import ( // Stub implementation for DevicePlugin. type Stub struct { - devs []*pluginapi.Device - socket string - resourceName string - preStartContainerFlag bool + devs []*pluginapi.Device + socket string + resourceName string + preStartContainerFlag bool + getPreferredAllocationFlag bool stop chan interface{} wg sync.WaitGroup @@ -47,12 +48,24 @@ type Stub struct { // allocFunc is used for handling allocation request allocFunc stubAllocFunc + // getPreferredAllocFunc is used for handling getPreferredAllocation request + getPreferredAllocFunc stubGetPreferredAllocFunc + registrationStatus chan watcherapi.RegistrationStatus // for testing endpoint string // for testing } -// stubAllocFunc is the function called when receive an allocation request from Kubelet +// stubGetPreferredAllocFunc is the function called when a getPreferredAllocation request is received from Kubelet +type stubGetPreferredAllocFunc func(r *pluginapi.PreferredAllocationRequest, devs map[string]pluginapi.Device) (*pluginapi.PreferredAllocationResponse, error) + +func defaultGetPreferredAllocFunc(r *pluginapi.PreferredAllocationRequest, devs map[string]pluginapi.Device) (*pluginapi.PreferredAllocationResponse, error) { + var response pluginapi.PreferredAllocationResponse + + return &response, nil +} + +// stubAllocFunc is the function called when an allocation request is received from Kubelet type stubAllocFunc func(r *pluginapi.AllocateRequest, devs map[string]pluginapi.Device) (*pluginapi.AllocateResponse, error) func defaultAllocFunc(r *pluginapi.AllocateRequest, devs map[string]pluginapi.Device) (*pluginapi.AllocateResponse, error) { @@ -62,20 +75,27 @@ func defaultAllocFunc(r *pluginapi.AllocateRequest, devs map[string]pluginapi.De } // NewDevicePluginStub returns an initialized DevicePlugin Stub. -func NewDevicePluginStub(devs []*pluginapi.Device, socket string, name string, preStartContainerFlag bool) *Stub { +func NewDevicePluginStub(devs []*pluginapi.Device, socket string, name string, preStartContainerFlag bool, getPreferredAllocationFlag bool) *Stub { return &Stub{ - devs: devs, - socket: socket, - resourceName: name, - preStartContainerFlag: preStartContainerFlag, + devs: devs, + socket: socket, + resourceName: name, + preStartContainerFlag: preStartContainerFlag, + getPreferredAllocationFlag: getPreferredAllocationFlag, stop: make(chan interface{}), update: make(chan []*pluginapi.Device), - allocFunc: defaultAllocFunc, + allocFunc: defaultAllocFunc, + getPreferredAllocFunc: defaultGetPreferredAllocFunc, } } +// SetGetPreferredAllocFunc sets allocFunc of the device plugin +func (m *Stub) SetGetPreferredAllocFunc(f stubGetPreferredAllocFunc) { + m.getPreferredAllocFunc = f +} + // SetAllocFunc sets allocFunc of the device plugin func (m *Stub) SetAllocFunc(f stubAllocFunc) { m.allocFunc = f @@ -174,7 +194,10 @@ func (m *Stub) Register(kubeletEndpoint, resourceName string, pluginSockDir stri Version: pluginapi.Version, Endpoint: path.Base(m.socket), ResourceName: resourceName, - Options: &pluginapi.DevicePluginOptions{PreStartRequired: m.preStartContainerFlag}, + Options: &pluginapi.DevicePluginOptions{ + PreStartRequired: m.preStartContainerFlag, + GetPreferredAllocationAvailable: m.getPreferredAllocationFlag, + }, } _, err = client.Register(context.Background(), reqt) @@ -186,7 +209,11 @@ func (m *Stub) Register(kubeletEndpoint, resourceName string, pluginSockDir stri // GetDevicePluginOptions returns DevicePluginOptions settings for the device plugin. func (m *Stub) GetDevicePluginOptions(ctx context.Context, e *pluginapi.Empty) (*pluginapi.DevicePluginOptions, error) { - return &pluginapi.DevicePluginOptions{PreStartRequired: m.preStartContainerFlag}, nil + options := &pluginapi.DevicePluginOptions{ + PreStartRequired: m.preStartContainerFlag, + GetPreferredAllocationAvailable: m.getPreferredAllocationFlag, + } + return options, nil } // PreStartContainer resets the devices received @@ -216,6 +243,19 @@ func (m *Stub) Update(devs []*pluginapi.Device) { m.update <- devs } +// GetPreferredAllocation gets the preferred allocation from a set of available devices +func (m *Stub) GetPreferredAllocation(ctx context.Context, r *pluginapi.PreferredAllocationRequest) (*pluginapi.PreferredAllocationResponse, error) { + klog.Infof("GetPreferredAllocation, %+v", r) + + devs := make(map[string]pluginapi.Device) + + for _, dev := range m.devs { + devs[dev.ID] = *dev + } + + return m.getPreferredAllocFunc(r, devs) +} + // Allocate does a mock allocation func (m *Stub) Allocate(ctx context.Context, r *pluginapi.AllocateRequest) (*pluginapi.AllocateResponse, error) { klog.Infof("Allocate, %+v", r) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go index 18b212733ddd..eaef0df39aab 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/endpoint.go @@ -35,6 +35,7 @@ import ( type endpoint interface { run() stop() + getPreferredAllocation(available, mustInclude []string, size int) (*pluginapi.PreferredAllocationResponse, error) allocate(devs []string) (*pluginapi.AllocateResponse, error) preStartContainer(devs []string) (*pluginapi.PreStartContainerResponse, error) callback(resourceName string, devices []pluginapi.Device) @@ -138,6 +139,22 @@ func (e *endpointImpl) setStopTime(t time.Time) { e.stopTime = t } +// getPreferredAllocation issues GetPreferredAllocation gRPC call to the device plugin. +func (e *endpointImpl) getPreferredAllocation(available, mustInclude []string, size int) (*pluginapi.PreferredAllocationResponse, error) { + if e.isStopped() { + return nil, fmt.Errorf(errEndpointStopped, e) + } + return e.client.GetPreferredAllocation(context.Background(), &pluginapi.PreferredAllocationRequest{ + ContainerRequests: []*pluginapi.ContainerPreferredAllocationRequest{ + { + AvailableDeviceIDs: available, + MustIncludeDeviceIDs: mustInclude, + AllocationSize: int32(size), + }, + }, + }) +} + // allocate issues Allocate gRPC call to the device plugin. func (e *endpointImpl) allocate(devs []string) (*pluginapi.AllocateResponse, error) { if e.isStopped() { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go index 2d1b4a59f836..8f35d87a7611 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/manager.go @@ -43,7 +43,6 @@ import ( cputopology "k8s.io/kubernetes/pkg/kubelet/cm/cpumanager/topology" "k8s.io/kubernetes/pkg/kubelet/cm/devicemanager/checkpoint" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager" - "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/bitmask" "k8s.io/kubernetes/pkg/kubelet/config" "k8s.io/kubernetes/pkg/kubelet/lifecycle" "k8s.io/kubernetes/pkg/kubelet/metrics" @@ -658,49 +657,107 @@ func (m *ManagerImpl) devicesToAllocate(podUID, contName, resource string, requi return nil, nil } klog.V(3).Infof("Needs to allocate %d %q for pod %q container %q", needed, resource, podUID, contName) - // Needs to allocate additional devices. + // Check if resource registered with devicemanager if _, ok := m.healthyDevices[resource]; !ok { return nil, fmt.Errorf("can't allocate unregistered device %s", resource) } - devices = sets.NewString() - // Allocates from reusableDevices list first. - for device := range reusableDevices { - devices.Insert(device) - needed-- - if needed == 0 { - return devices, nil + + // Declare the list of allocated devices. + // This will be populated and returned below. + allocated := sets.NewString() + + // Create a closure to help with device allocation + // Returns 'true' once no more devices need to be allocated. + allocateRemainingFrom := func(devices sets.String) bool { + for device := range devices.Difference(allocated) { + m.allocatedDevices[resource].Insert(device) + allocated.Insert(device) + needed-- + if needed == 0 { + return true + } } + return false } + + // Allocates from reusableDevices list first. + if allocateRemainingFrom(reusableDevices) { + return allocated, nil + } + // Needs to allocate additional devices. if m.allocatedDevices[resource] == nil { m.allocatedDevices[resource] = sets.NewString() } + // Gets Devices in use. devicesInUse := m.allocatedDevices[resource] - // Gets a list of available devices. + // Gets Available devices. available := m.healthyDevices[resource].Difference(devicesInUse) if available.Len() < needed { return nil, fmt.Errorf("requested number of devices unavailable for %s. Requested: %d, Available: %d", resource, needed, available.Len()) } - // By default, pull devices from the unsorted list of available devices. - allocated := available.UnsortedList()[:needed] - // If topology alignment is desired, update allocated to the set of devices - // with the best alignment. - hint := m.topologyAffinityStore.GetAffinity(podUID, contName) - if m.deviceHasTopologyAlignment(resource) && hint.NUMANodeAffinity != nil { - allocated = m.takeByTopology(resource, available, hint.NUMANodeAffinity, needed) + + // Filters available Devices based on NUMA affinity. + aligned, unaligned, noAffinity := m.filterByAffinity(podUID, contName, resource, available) + + // If we can allocate all remaining devices from the set of aligned ones, then + // give the plugin the chance to influence which ones to allocate from that set. + if needed < aligned.Len() { + // First allocate from the preferred devices list (if available). + preferred, err := m.callGetPreferredAllocationIfAvailable(podUID, contName, resource, aligned.Union(allocated), allocated, required) + if err != nil { + return nil, err + } + if allocateRemainingFrom(preferred.Intersection(aligned.Union(allocated))) { + return allocated, nil + } + // Then fallback to allocate from the aligned set if no preferred list + // is returned (or not enough devices are returned in that list). + if allocateRemainingFrom(aligned) { + return allocated, nil + } + + return nil, fmt.Errorf("unexpectedly allocated less resources than required. Requested: %d, Got: %d", required, required-needed) + } + + // If we can't allocate all remaining devices from the set of aligned ones, + // then start by first allocating all of the aligned devices (to ensure + // that the alignment guaranteed by the TopologyManager is honored). + if allocateRemainingFrom(aligned) { + return allocated, nil + } + + // Then give the plugin the chance to influence the decision on any + // remaining devices to allocate. + preferred, err := m.callGetPreferredAllocationIfAvailable(podUID, contName, resource, available.Union(devices), devices, required) + if err != nil { + return nil, err + } + if allocateRemainingFrom(preferred.Intersection(available.Union(allocated))) { + return allocated, nil } - // Updates m.allocatedDevices with allocated devices to prevent them - // from being allocated to other pods/containers, given that we are - // not holding lock during the rpc call. - for _, device := range allocated { - m.allocatedDevices[resource].Insert(device) - devices.Insert(device) + + // Finally, if the plugin did not return a preferred allocation (or didn't + // return a large enough one), then fall back to allocating the remaining + // devices from the 'unaligned' and 'noAffinity' sets. + if allocateRemainingFrom(unaligned) { + return allocated, nil + } + if allocateRemainingFrom(noAffinity) { + return allocated, nil } - return devices, nil + + return nil, fmt.Errorf("unexpectedly allocated less resources than required. Requested: %d, Got: %d", required, required-needed) } -func (m *ManagerImpl) takeByTopology(resource string, available sets.String, affinity bitmask.BitMask, request int) []string { +func (m *ManagerImpl) filterByAffinity(podUID, contName, resource string, available sets.String) (sets.String, sets.String, sets.String) { + // If alignment information is not available, just pass the available list back. + hint := m.topologyAffinityStore.GetAffinity(podUID, contName) + if !m.deviceHasTopologyAlignment(resource) || hint.NUMANodeAffinity == nil { + return sets.NewString(), sets.NewString(), available + } + // Build a map of NUMA Nodes to the devices associated with them. A // device may be associated to multiple NUMA nodes at the same time. If an // available device does not have any NUMA Nodes associated with it, add it @@ -754,7 +811,7 @@ func (m *ManagerImpl) takeByTopology(resource string, available sets.String, aff if perNodeDevices[n].Has(d) { if n == nodeWithoutTopology { withoutTopology = append(withoutTopology, d) - } else if affinity.IsSet(n) { + } else if hint.NUMANodeAffinity.IsSet(n) { fromAffinity = append(fromAffinity, d) } else { notFromAffinity = append(notFromAffinity, d) @@ -764,8 +821,8 @@ func (m *ManagerImpl) takeByTopology(resource string, available sets.String, aff } } - // Concatenate the lists above return the first 'request' devices from it.. - return append(append(fromAffinity, notFromAffinity...), withoutTopology...)[:request] + // Return all three lists containing the full set of devices across them. + return sets.NewString(fromAffinity...), sets.NewString(notFromAffinity...), sets.NewString(withoutTopology...) } // allocateContainerResources attempts to allocate all of required device @@ -920,6 +977,30 @@ func (m *ManagerImpl) callPreStartContainerIfNeeded(podUID, contName, resource s return nil } +// callGetPreferredAllocationIfAvailable issues GetPreferredAllocation grpc +// call for device plugin resource with GetPreferredAllocationAvailable option set. +func (m *ManagerImpl) callGetPreferredAllocationIfAvailable(podUID, contName, resource string, available, mustInclude sets.String, size int) (sets.String, error) { + eI, ok := m.endpoints[resource] + if !ok { + return nil, fmt.Errorf("endpoint not found in cache for a registered resource: %s", resource) + } + + if eI.opts == nil || !eI.opts.GetPreferredAllocationAvailable { + klog.V(4).Infof("Plugin options indicate to skip GetPreferredAllocation for resource: %s", resource) + return nil, nil + } + + m.mutex.Unlock() + klog.V(4).Infof("Issuing a GetPreferredAllocation call for container, %s, of pod %s", contName, podUID) + resp, err := eI.e.getPreferredAllocation(available.UnsortedList(), mustInclude.UnsortedList(), size) + m.mutex.Lock() + if err != nil { + return nil, fmt.Errorf("device plugin GetPreferredAllocation rpc failed with err: %v", err) + } + // TODO: Add metrics support for init RPC + return sets.NewString(resp.ContainerResponses[0].DeviceIDs...), nil +} + // sanitizeNodeAllocatable scans through allocatedDevices in the device manager // and if necessary, updates allocatableResource in nodeInfo to at least equal to // the allocated capacity. This allows pods that have already been scheduled on diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go index b13dbceb8893..5bbae893e817 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers.go @@ -33,7 +33,7 @@ import ( dockernat "github.com/docker/go-connections/nat" "k8s.io/klog/v2" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" utilerrors "k8s.io/apimachinery/pkg/util/errors" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/kubernetes/pkg/credentialprovider" @@ -54,7 +54,7 @@ var ( // if a container starts but the executable file is not found, runc gives a message that matches startRE = regexp.MustCompile(`\\\\\\\"(.*)\\\\\\\": executable file not found`) - defaultSeccompOpt = []dockerOpt{{"seccomp", "unconfined", ""}} + defaultSeccompOpt = []dockerOpt{{"seccomp", v1.SeccompProfileNameUnconfined, ""}} ) // generateEnvList converts KeyValue list to a list of strings, in the form of diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go index e18692150a5e..68173119e9fd 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/dockershim/helpers_linux.go @@ -30,7 +30,7 @@ import ( "github.com/blang/semver" dockertypes "github.com/docker/docker/api/types" dockercontainer "github.com/docker/docker/api/types/container" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" ) @@ -49,7 +49,7 @@ func (ds *dockerService) getSecurityOpts(seccompProfile string, separator rune) } func getSeccompDockerOpts(seccompProfile string) ([]dockerOpt, error) { - if seccompProfile == "" || seccompProfile == "unconfined" { + if seccompProfile == "" || seccompProfile == v1.SeccompProfileNameUnconfined { // return early the default return defaultSeccompOpt, nil } @@ -59,12 +59,12 @@ func getSeccompDockerOpts(seccompProfile string) ([]dockerOpt, error) { return nil, nil } - if !strings.HasPrefix(seccompProfile, "localhost/") { + if !strings.HasPrefix(seccompProfile, v1.SeccompLocalhostProfileNamePrefix) { return nil, fmt.Errorf("unknown seccomp profile option: %s", seccompProfile) } // get the full path of seccomp profile when prefixed with 'localhost/'. - fname := strings.TrimPrefix(seccompProfile, "localhost/") + fname := strings.TrimPrefix(seccompProfile, v1.SeccompLocalhostProfileNamePrefix) if !filepath.IsAbs(fname) { return nil, fmt.Errorf("seccomp profile path must be absolute, but got relative path %q", fname) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go index 45bb2915bcb6..bcd9b9729310 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet.go @@ -196,7 +196,7 @@ type Bootstrap interface { GetConfiguration() kubeletconfiginternal.KubeletConfiguration BirthCry() StartGarbageCollection() - ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling bool) + ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler bool) ListenAndServeReadOnly(address net.IP, port uint, enableCAdvisorJSONEndpoints bool) ListenAndServePodResources() Run(<-chan kubetypes.PodUpdate) @@ -2153,8 +2153,8 @@ func (kl *Kubelet) ResyncInterval() time.Duration { } // ListenAndServe runs the kubelet HTTP server. -func (kl *Kubelet) ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling bool) { - server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, address, port, tlsOptions, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, kl.redirectContainerStreaming, kl.criHandler) +func (kl *Kubelet) ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler bool) { + server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, address, port, tlsOptions, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, kl.redirectContainerStreaming, enableSystemLogHandler, kl.criHandler) } // ListenAndServeReadOnly runs the kubelet HTTP server in read-only mode. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go index 19f1509f242e..fa00196a493b 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kubelet_pods.go @@ -1616,18 +1616,17 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon statuses[container.Name] = status } + // Sort the container statuses since clients of this interface expect the list + // of containers in a pod has a deterministic order. + if isInitContainer { + return kubetypes.SortStatusesOfInitContainers(pod, statuses) + } var containerStatuses []v1.ContainerStatus for _, status := range statuses { containerStatuses = append(containerStatuses, *status) } - // Sort the container statuses since clients of this interface expect the list - // of containers in a pod has a deterministic order. - if isInitContainer { - kubetypes.SortInitContainerStatuses(pod, containerStatuses) - } else { - sort.Sort(kubetypes.SortedContainerStatuses(containerStatuses)) - } + sort.Sort(kubetypes.SortedContainerStatuses(containerStatuses)) return containerStatuses } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go index 6aa074c64c6c..cdf4121a38c4 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/helpers.go @@ -22,7 +22,7 @@ import ( "strconv" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/klog/v2" @@ -202,31 +202,57 @@ func toKubeRuntimeStatus(status *runtimeapi.RuntimeStatus) *kubecontainer.Runtim return &kubecontainer.RuntimeStatus{Conditions: conditions} } -// getSeccompProfileFromAnnotations gets seccomp profile from annotations. -// It gets pod's profile if containerName is empty. -func (m *kubeGenericRuntimeManager) getSeccompProfileFromAnnotations(annotations map[string]string, containerName string) string { - // try the pod profile. - profile, profileOK := annotations[v1.SeccompPodAnnotationKey] +func fieldProfile(scmp *v1.SeccompProfile, profileRootPath string) string { + if scmp == nil { + return "" + } + if scmp.Type == v1.SeccompProfileTypeRuntimeDefault { + return v1.SeccompProfileRuntimeDefault + } + if scmp.Type == v1.SeccompProfileTypeLocalhost && scmp.LocalhostProfile != nil && len(*scmp.LocalhostProfile) > 0 { + fname := filepath.Join(profileRootPath, *scmp.LocalhostProfile) + return v1.SeccompLocalhostProfileNamePrefix + fname + } + if scmp.Type == v1.SeccompProfileTypeUnconfined { + return v1.SeccompProfileNameUnconfined + } + return "" +} + +func annotationProfile(profile, profileRootPath string) string { + if strings.HasPrefix(profile, v1.SeccompLocalhostProfileNamePrefix) { + name := strings.TrimPrefix(profile, v1.SeccompLocalhostProfileNamePrefix) + fname := filepath.Join(profileRootPath, filepath.FromSlash(name)) + return v1.SeccompLocalhostProfileNamePrefix + fname + } + return profile +} + +func (m *kubeGenericRuntimeManager) getSeccompProfile(annotations map[string]string, containerName string, + podSecContext *v1.PodSecurityContext, containerSecContext *v1.SecurityContext) string { + // container fields are applied first + if containerSecContext != nil && containerSecContext.SeccompProfile != nil { + return fieldProfile(containerSecContext.SeccompProfile, m.seccompProfileRoot) + } + + // if container field does not exist, try container annotation (deprecated) if containerName != "" { - // try the container profile. - cProfile, cProfileOK := annotations[v1.SeccompContainerAnnotationKeyPrefix+containerName] - if cProfileOK { - profile = cProfile - profileOK = cProfileOK + if profile, ok := annotations[v1.SeccompContainerAnnotationKeyPrefix+containerName]; ok { + return annotationProfile(profile, m.seccompProfileRoot) } } - if !profileOK { - return "" + // when container seccomp is not defined, try to apply from pod field + if podSecContext != nil && podSecContext.SeccompProfile != nil { + return fieldProfile(podSecContext.SeccompProfile, m.seccompProfileRoot) } - if strings.HasPrefix(profile, "localhost/") { - name := strings.TrimPrefix(profile, "localhost/") - fname := filepath.Join(m.seccompProfileRoot, filepath.FromSlash(name)) - return "localhost/" + fname + // as last resort, try to apply pod annotation (deprecated) + if profile, ok := annotations[v1.SeccompPodAnnotationKey]; ok { + return annotationProfile(profile, m.seccompProfileRoot) } - return profile + return "" } func ipcNamespaceForPod(pod *v1.Pod) runtimeapi.NamespaceMode { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go index 594a9b072dc5..c46436f2a41f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/kuberuntime_sandbox.go @@ -22,7 +22,7 @@ import ( "net/url" "sort" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" kubetypes "k8s.io/apimachinery/pkg/types" utilfeature "k8s.io/apiserver/pkg/util/feature" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" @@ -149,7 +149,7 @@ func (m *kubeGenericRuntimeManager) generatePodSandboxLinuxConfig(pod *v1.Pod) ( CgroupParent: cgroupParent, SecurityContext: &runtimeapi.LinuxSandboxSecurityContext{ Privileged: kubecontainer.HasPrivilegedContainer(pod), - SeccompProfilePath: m.getSeccompProfileFromAnnotations(pod.Annotations, ""), + SeccompProfilePath: m.getSeccompProfile(pod.Annotations, "", pod.Spec.SecurityContext, nil), }, } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go index 47d524256da7..c8ebe103dbf3 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/kuberuntime/security_context.go @@ -19,7 +19,7 @@ package kuberuntime import ( "fmt" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1alpha2" "k8s.io/kubernetes/pkg/security/apparmor" "k8s.io/kubernetes/pkg/securitycontext" @@ -37,7 +37,7 @@ func (m *kubeGenericRuntimeManager) determineEffectiveSecurityContext(pod *v1.Po } // set SeccompProfilePath. - synthesized.SeccompProfilePath = m.getSeccompProfileFromAnnotations(pod.Annotations, container.Name) + synthesized.SeccompProfilePath = m.getSeccompProfile(pod.Annotations, container.Name, pod.Spec.SecurityContext, container.SecurityContext) // set ApparmorProfile. synthesized.ApparmorProfile = apparmor.GetProfileNameFromPodAnnotations(pod.Annotations, container.Name) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go index ed86b630cac8..d8cf0175e540 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/server/server.go @@ -143,10 +143,11 @@ func ListenAndServeKubeletServer( enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, - redirectContainerStreaming bool, + redirectContainerStreaming, + enableSystemLogHandler bool, criHandler http.Handler) { klog.Infof("Starting to listen on %s:%d", address, port) - handler := NewServer(host, resourceAnalyzer, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, redirectContainerStreaming, criHandler) + handler := NewServer(host, resourceAnalyzer, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, redirectContainerStreaming, enableSystemLogHandler, criHandler) s := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), Handler: &handler, @@ -168,7 +169,7 @@ func ListenAndServeKubeletServer( // ListenAndServeKubeletReadOnlyServer initializes a server to respond to HTTP network requests on the Kubelet. func ListenAndServeKubeletReadOnlyServer(host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, port uint, enableCAdvisorJSONEndpoints bool) { klog.V(1).Infof("Starting to listen read-only on %s:%d", address, port) - s := NewServer(host, resourceAnalyzer, nil, enableCAdvisorJSONEndpoints, false, false, false, nil) + s := NewServer(host, resourceAnalyzer, nil, enableCAdvisorJSONEndpoints, false, false, false, false, nil) server := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), @@ -222,7 +223,8 @@ func NewServer( enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, - redirectContainerStreaming bool, + redirectContainerStreaming, + enableSystemLogHandler bool, criHandler http.Handler) Server { server := Server{ host: host, @@ -239,6 +241,9 @@ func NewServer( server.InstallDefaultHandlers(enableCAdvisorJSONEndpoints) if enableDebuggingHandlers { server.InstallDebuggingHandlers(criHandler) + // To maintain backward compatibility serve logs only when enableDebuggingHandlers is also enabled + // see https://github.com/kubernetes/kubernetes/pull/87273 + server.InstallSystemLogHandler(enableSystemLogHandler) if enableContentionProfiling { goruntime.SetBlockProfileRate(1) } @@ -470,19 +475,6 @@ func (s *Server) InstallDebuggingHandlers(criHandler http.Handler) { Operation("getPortForward")) s.restfulCont.Add(ws) - s.addMetricsBucketMatcher("logs") - ws = new(restful.WebService) - ws. - Path(logsPath) - ws.Route(ws.GET(""). - To(s.getLogs). - Operation("getLogs")) - ws.Route(ws.GET("/{logpath:*}"). - To(s.getLogs). - Operation("getLogs"). - Param(ws.PathParameter("logpath", "path to the log").DataType("string"))) - s.restfulCont.Add(ws) - s.addMetricsBucketMatcher("containerLogs") ws = new(restful.WebService) ws. @@ -561,6 +553,28 @@ func (s *Server) InstallDebuggingDisabledHandlers() { } } +// InstallSystemLogHandler registers the HTTP request patterns for logs endpoint. +func (s *Server) InstallSystemLogHandler(enableSystemLogHandler bool) { + s.addMetricsBucketMatcher("logs") + if enableSystemLogHandler { + ws := new(restful.WebService) + ws.Path(logsPath) + ws.Route(ws.GET(""). + To(s.getLogs). + Operation("getLogs")) + ws.Route(ws.GET("/{logpath:*}"). + To(s.getLogs). + Operation("getLogs"). + Param(ws.PathParameter("logpath", "path to the log").DataType("string"))) + s.restfulCont.Add(ws) + } else { + h := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + http.Error(w, "logs endpoint is disabled.", http.StatusMethodNotAllowed) + }) + s.restfulCont.Handle(logsPath, h) + } +} + // Checks if kubelet's sync loop that updates containers is working. func (s *Server) syncLoopHealthCheck(req *http.Request) error { duration := s.host.ResyncInterval() * 2 diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go index a840e7de84e6..b20d289a4b66 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/kubelet/types/types.go @@ -87,6 +87,17 @@ func SortInitContainerStatuses(p *v1.Pod, statuses []v1.ContainerStatus) { } } +func SortStatusesOfInitContainers(p *v1.Pod, statusMap map[string]*v1.ContainerStatus) []v1.ContainerStatus { + containers := p.Spec.InitContainers + statuses := []v1.ContainerStatus{} + for _, container := range containers { + if status, found := statusMap[container.Name]; found { + statuses = append(statuses, *status) + } + } + return statuses +} + // Reservation represents reserved resources for non-pod components. type Reservation struct { // System represents resources reserved for non-kubernetes components. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go index 6a2fc3809b8f..b797a01e10d9 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/endpoints.go @@ -94,6 +94,10 @@ func newBaseEndpointInfo(IP string, port int, isLocal bool, topology map[string] type makeEndpointFunc func(info *BaseEndpointInfo) Endpoint +// This handler is invoked by the apply function on every change. This function should not modify the +// EndpointsMap's but just use the changes for any Proxier specific cleanup. +type processEndpointsMapChangeFunc func(oldEndpointsMap, newEndpointsMap EndpointsMap) + // EndpointChangeTracker carries state about uncommitted changes to an arbitrary number of // Endpoints, keyed by their namespace and name. type EndpointChangeTracker struct { @@ -104,7 +108,8 @@ type EndpointChangeTracker struct { // items maps a service to is endpointsChange. items map[types.NamespacedName]*endpointsChange // makeEndpointInfo allows proxier to inject customized information when processing endpoint. - makeEndpointInfo makeEndpointFunc + makeEndpointInfo makeEndpointFunc + processEndpointsMapChange processEndpointsMapChangeFunc // endpointSliceCache holds a simplified version of endpoint slices. endpointSliceCache *EndpointSliceCache // isIPv6Mode indicates if change tracker is under IPv6/IPv4 mode. Nil means not applicable. @@ -116,14 +121,15 @@ type EndpointChangeTracker struct { } // NewEndpointChangeTracker initializes an EndpointsChangeMap -func NewEndpointChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc, isIPv6Mode *bool, recorder record.EventRecorder, endpointSlicesEnabled bool) *EndpointChangeTracker { +func NewEndpointChangeTracker(hostname string, makeEndpointInfo makeEndpointFunc, isIPv6Mode *bool, recorder record.EventRecorder, endpointSlicesEnabled bool, processEndpointsMapChange processEndpointsMapChangeFunc) *EndpointChangeTracker { ect := &EndpointChangeTracker{ - hostname: hostname, - items: make(map[types.NamespacedName]*endpointsChange), - makeEndpointInfo: makeEndpointInfo, - isIPv6Mode: isIPv6Mode, - recorder: recorder, - lastChangeTriggerTimes: make(map[types.NamespacedName][]time.Time), + hostname: hostname, + items: make(map[types.NamespacedName]*endpointsChange), + makeEndpointInfo: makeEndpointInfo, + isIPv6Mode: isIPv6Mode, + recorder: recorder, + lastChangeTriggerTimes: make(map[types.NamespacedName][]time.Time), + processEndpointsMapChange: processEndpointsMapChange, } if endpointSlicesEnabled { ect.endpointSliceCache = NewEndpointSliceCache(hostname, isIPv6Mode, recorder, makeEndpointInfo) @@ -388,6 +394,7 @@ func (ect *EndpointChangeTracker) endpointsToEndpointsMap(endpoints *v1.Endpoint // The changes map is cleared after applying them. // In addition it returns (via argument) and resets the lastChangeTriggerTimes for all endpoints // that were changed and will result in syncing the proxy rules. +// apply triggers processEndpointsMapChange on every change. func (em EndpointsMap) apply(ect *EndpointChangeTracker, staleEndpoints *[]ServiceEndpoint, staleServiceNames *[]ServicePortName, lastChangeTriggerTimes *map[types.NamespacedName][]time.Time) { if ect == nil { @@ -396,6 +403,9 @@ func (em EndpointsMap) apply(ect *EndpointChangeTracker, staleEndpoints *[]Servi changes := ect.checkoutChanges() for _, change := range changes { + if ect.processEndpointsMapChange != nil { + ect.processEndpointsMapChange(change.previous, change.current) + } em.unmerge(change.previous) em.merge(change.current) detectStaleConnections(change.previous, change.current, staleEndpoints, staleServiceNames) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go index 2cc09c314019..61161aecb5e0 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/iptables/proxier.go @@ -298,9 +298,9 @@ func NewProxier(ipt utiliptables.Interface, proxier := &Proxier{ portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), serviceMap: make(proxy.ServiceMap), - serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, &isIPv6, recorder), + serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, &isIPv6, recorder, nil), endpointsMap: make(proxy.EndpointsMap), - endpointsChanges: proxy.NewEndpointChangeTracker(hostname, newEndpointInfo, &isIPv6, recorder, endpointSlicesEnabled), + endpointsChanges: proxy.NewEndpointChangeTracker(hostname, newEndpointInfo, &isIPv6, recorder, endpointSlicesEnabled, nil), syncPeriod: syncPeriod, iptables: ipt, masqueradeAll: masqueradeAll, diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go index 2c40b46d5e53..872cbe990e7d 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/ipvs/proxier.go @@ -262,9 +262,10 @@ type Proxier struct { gracefuldeleteManager *GracefulTerminationManager } -// IPGetter helps get node network interface IP +// IPGetter helps get node network interface IP and IPs binded to the IPVS dummy interface type IPGetter interface { NodeIPs() ([]net.IP, error) + BindedIPs() (sets.String, error) } // realIPGetter is a real NodeIP handler, it implements IPGetter. @@ -300,6 +301,11 @@ func (r *realIPGetter) NodeIPs() (ips []net.IP, err error) { return ips, nil } +// BindedIPs returns all addresses that are binded to the IPVS dummy interface kube-ipvs0 +func (r *realIPGetter) BindedIPs() (sets.String, error) { + return r.nl.GetLocalAddresses(DefaultDummyDevice, "") +} + // Proxier implements proxy.Provider var _ proxy.Provider = &Proxier{} @@ -441,9 +447,9 @@ func NewProxier(ipt utiliptables.Interface, proxier := &Proxier{ portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), serviceMap: make(proxy.ServiceMap), - serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, &isIPv6, recorder), + serviceChanges: proxy.NewServiceChangeTracker(newServiceInfo, &isIPv6, recorder, nil), endpointsMap: make(proxy.EndpointsMap), - endpointsChanges: proxy.NewEndpointChangeTracker(hostname, nil, &isIPv6, recorder, endpointSlicesEnabled), + endpointsChanges: proxy.NewEndpointChangeTracker(hostname, nil, &isIPv6, recorder, endpointSlicesEnabled, nil), syncPeriod: syncPeriod, minSyncPeriod: minSyncPeriod, excludeCIDRs: parseExcludedCIDRs(excludeCIDRs), @@ -1089,6 +1095,11 @@ func (proxier *Proxier) syncProxyRules() { // activeBindAddrs represents ip address successfully bind to DefaultDummyDevice in this round of sync activeBindAddrs := map[string]bool{} + bindedAddresses, err := proxier.ipGetter.BindedIPs() + if err != nil { + klog.Errorf("error listing addresses binded to dummy interface, error: %v", err) + } + hasNodePort := false for _, svc := range proxier.serviceMap { svcInfo, ok := svc.(*serviceInfo) @@ -1197,7 +1208,7 @@ func (proxier *Proxier) syncProxyRules() { serv.Timeout = uint32(svcInfo.StickyMaxAgeSeconds()) } // We need to bind ClusterIP to dummy interface, so set `bindAddr` parameter to `true` in syncService() - if err := proxier.syncService(svcNameString, serv, true); err == nil { + if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true // ExternalTrafficPolicy only works for NodePort and external LB traffic, does not affect ClusterIP @@ -1278,7 +1289,7 @@ func (proxier *Proxier) syncProxyRules() { serv.Flags |= utilipvs.FlagPersistent serv.Timeout = uint32(svcInfo.StickyMaxAgeSeconds()) } - if err := proxier.syncService(svcNameString, serv, true); err == nil { + if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true @@ -1384,7 +1395,7 @@ func (proxier *Proxier) syncProxyRules() { serv.Flags |= utilipvs.FlagPersistent serv.Timeout = uint32(svcInfo.StickyMaxAgeSeconds()) } - if err := proxier.syncService(svcNameString, serv, true); err == nil { + if err := proxier.syncService(svcNameString, serv, true, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true activeBindAddrs[serv.Address.String()] = true if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { @@ -1541,7 +1552,7 @@ func (proxier *Proxier) syncProxyRules() { serv.Timeout = uint32(svcInfo.StickyMaxAgeSeconds()) } // There is no need to bind Node IP to dummy interface, so set parameter `bindAddr` to `false`. - if err := proxier.syncService(svcNameString, serv, false); err == nil { + if err := proxier.syncService(svcNameString, serv, false, bindedAddresses); err == nil { activeIPVSServices[serv.String()] = true if err := proxier.syncEndpoint(svcName, svcInfo.OnlyNodeLocalEndpoints(), serv); err != nil { klog.Errorf("Failed to sync endpoint for service: %v, err: %v", serv, err) @@ -1787,6 +1798,39 @@ func (proxier *Proxier) writeIptablesRules() { "-j", "ACCEPT", ) + // Install the kubernetes-specific postrouting rules. We use a whole chain for + // this so that it is easier to flush and change, for example if the mark + // value should ever change. + // NB: THIS MUST MATCH the corresponding code in the kubelet + writeLine(proxier.natRules, []string{ + "-A", string(kubePostroutingChain), + "-m", "mark", "!", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), + "-j", "RETURN", + }...) + // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack. + writeLine(proxier.natRules, []string{ + "-A", string(kubePostroutingChain), + // XOR proxier.masqueradeMark to unset it + "-j", "MARK", "--xor-mark", proxier.masqueradeMark, + }...) + masqRule := []string{ + "-A", string(kubePostroutingChain), + "-m", "comment", "--comment", `"kubernetes service traffic requiring SNAT"`, + "-j", "MASQUERADE", + } + if proxier.iptables.HasRandomFully() { + masqRule = append(masqRule, "--random-fully") + } + writeLine(proxier.natRules, masqRule...) + + // Install the kubernetes-specific masquerade mark rule. We use a whole chain for + // this so that it is easier to flush and change, for example if the mark + // value should ever change. + writeLine(proxier.natRules, []string{ + "-A", string(KubeMarkMasqChain), + "-j", "MARK", "--or-mark", proxier.masqueradeMark, + }...) + // Write the end-of-table markers. writeLine(proxier.filterRules, "COMMIT") writeLine(proxier.natRules, "COMMIT") @@ -1845,38 +1889,6 @@ func (proxier *Proxier) createAndLinkeKubeChain() { } } - // Install the kubernetes-specific postrouting rules. We use a whole chain for - // this so that it is easier to flush and change, for example if the mark - // value should ever change. - // NB: THIS MUST MATCH the corresponding code in the kubelet - writeLine(proxier.natRules, []string{ - "-A", string(kubePostroutingChain), - "-m", "mark", "!", "--mark", fmt.Sprintf("%s/%s", proxier.masqueradeMark, proxier.masqueradeMark), - "-j", "RETURN", - }...) - // Clear the mark to avoid re-masquerading if the packet re-traverses the network stack. - writeLine(proxier.natRules, []string{ - "-A", string(kubePostroutingChain), - // XOR proxier.masqueradeMark to unset it - "-j", "MARK", "--xor-mark", proxier.masqueradeMark, - }...) - masqRule := []string{ - "-A", string(kubePostroutingChain), - "-m", "comment", "--comment", `"kubernetes service traffic requiring SNAT"`, - "-j", "MASQUERADE", - } - if proxier.iptables.HasRandomFully() { - masqRule = append(masqRule, "--random-fully") - } - writeLine(proxier.natRules, masqRule...) - - // Install the kubernetes-specific masquerade mark rule. We use a whole chain for - // this so that it is easier to flush and change, for example if the mark - // value should ever change. - writeLine(proxier.natRules, []string{ - "-A", string(KubeMarkMasqChain), - "-j", "MARK", "--or-mark", proxier.masqueradeMark, - }...) } // getExistingChains get iptables-save output so we can check for existing chains and rules. @@ -1921,7 +1933,7 @@ func (proxier *Proxier) deleteEndpointConnections(connectionMap []proxy.ServiceE } } -func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, bindAddr bool) error { +func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, bindAddr bool, bindedAddresses sets.String) error { appliedVirtualServer, _ := proxier.ipvs.GetVirtualServer(vs) if appliedVirtualServer == nil || !appliedVirtualServer.Equal(vs) { if appliedVirtualServer == nil { @@ -1942,9 +1954,14 @@ func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, } } - // bind service address to dummy interface even if service not changed, - // in case that service IP was removed by other processes + // bind service address to dummy interface if bindAddr { + // always attempt to bind if bindedAddresses is nil, + // otherwise check if it's already binded and return early + if bindedAddresses != nil && bindedAddresses.Has(vs.Address.String()) { + return nil + } + klog.V(4).Infof("Bind addr %s", vs.Address.String()) _, err := proxier.netlinkHandle.EnsureAddressBind(vs.Address.String(), DefaultDummyDevice) if err != nil { @@ -1952,6 +1969,7 @@ func (proxier *Proxier) syncService(svcName string, vs *utilipvs.VirtualServer, return err } } + return nil } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/service.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/service.go index 9f66272463c6..189feab64e17 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/service.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/service.go @@ -198,6 +198,10 @@ func (sct *ServiceChangeTracker) newBaseServiceInfo(port *v1.ServicePort, servic type makeServicePortFunc func(*v1.ServicePort, *v1.Service, *BaseServiceInfo) ServicePort +// This handler is invoked by the apply function on every change. This function should not modify the +// ServiceMap's but just use the changes for any Proxier specific cleanup. +type processServiceMapChangeFunc func(previous, current ServiceMap) + // serviceChange contains all changes to services that happened since proxy rules were synced. For a single object, // changes are accumulated, i.e. previous is state from before applying the changes, // current is state after applying all of the changes. @@ -214,19 +218,21 @@ type ServiceChangeTracker struct { // items maps a service to its serviceChange. items map[types.NamespacedName]*serviceChange // makeServiceInfo allows proxier to inject customized information when processing service. - makeServiceInfo makeServicePortFunc + makeServiceInfo makeServicePortFunc + processServiceMapChange processServiceMapChangeFunc // isIPv6Mode indicates if change tracker is under IPv6/IPv4 mode. Nil means not applicable. isIPv6Mode *bool recorder record.EventRecorder } // NewServiceChangeTracker initializes a ServiceChangeTracker -func NewServiceChangeTracker(makeServiceInfo makeServicePortFunc, isIPv6Mode *bool, recorder record.EventRecorder) *ServiceChangeTracker { +func NewServiceChangeTracker(makeServiceInfo makeServicePortFunc, isIPv6Mode *bool, recorder record.EventRecorder, processServiceMapChange processServiceMapChangeFunc) *ServiceChangeTracker { return &ServiceChangeTracker{ - items: make(map[types.NamespacedName]*serviceChange), - makeServiceInfo: makeServiceInfo, - isIPv6Mode: isIPv6Mode, - recorder: recorder, + items: make(map[types.NamespacedName]*serviceChange), + makeServiceInfo: makeServiceInfo, + isIPv6Mode: isIPv6Mode, + recorder: recorder, + processServiceMapChange: processServiceMapChange, } } @@ -338,10 +344,14 @@ func (sct *ServiceChangeTracker) serviceToServiceMap(service *v1.Service) Servic // apply the changes to ServiceMap and update the stale udp cluster IP set. The UDPStaleClusterIP argument is passed in to store the // udp protocol service cluster ip when service is deleted from the ServiceMap. +// apply triggers processServiceMapChange on every change. func (sm *ServiceMap) apply(changes *ServiceChangeTracker, UDPStaleClusterIP sets.String) { changes.lock.Lock() defer changes.lock.Unlock() for _, change := range changes.items { + if changes.processServiceMapChange != nil { + changes.processServiceMapChange(change.previous, change.current) + } sm.merge(change.current) // filter out the Update event of current changes from previous changes before calling unmerge() so that can // skip deleting the Update events. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD index fae9fc2011ea..bd62aef52bd6 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/BUILD @@ -15,19 +15,20 @@ go_library( "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", ] + select({ "@io_bazel_rules_go//go/platform:windows": [ - "//pkg/api/v1/service:go_default_library", "//pkg/apis/core/v1/helper:go_default_library", + "//pkg/features:go_default_library", "//pkg/proxy:go_default_library", "//pkg/proxy/apis/config:go_default_library", "//pkg/proxy/config:go_default_library", "//pkg/proxy/healthcheck:go_default_library", "//pkg/proxy/metaproxier:go_default_library", "//pkg/proxy/metrics:go_default_library", + "//pkg/proxy/util:go_default_library", "//pkg/util/async:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", @@ -67,11 +68,14 @@ go_test( "@io_bazel_rules_go//go/platform:windows": [ "//pkg/proxy:go_default_library", "//pkg/proxy/healthcheck:go_default_library", + "//pkg/proxy/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/discovery/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library", "//vendor/github.com/Microsoft/hcsshim/hcn:go_default_library", + "//vendor/k8s.io/utils/pointer:go_default_library", ], "//conditions:default": [], }), diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go index 4c1cae087afa..04925251f1d4 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/proxy/winkernel/proxier.go @@ -23,33 +23,33 @@ import ( "fmt" "net" "os" - "reflect" + "strconv" "sync" "sync/atomic" "time" "github.com/Microsoft/hcsshim" "github.com/Microsoft/hcsshim/hcn" + discovery "k8s.io/api/discovery/v1beta1" "github.com/davecgh/go-spew/spew" - "k8s.io/klog/v2" - v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/intstr" - "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" genericfeatures "k8s.io/apiserver/pkg/features" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/tools/record" - apiservice "k8s.io/kubernetes/pkg/api/v1/service" + "k8s.io/klog/v2" "k8s.io/kubernetes/pkg/apis/core/v1/helper" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/proxy" "k8s.io/kubernetes/pkg/proxy/apis/config" proxyconfig "k8s.io/kubernetes/pkg/proxy/config" "k8s.io/kubernetes/pkg/proxy/healthcheck" "k8s.io/kubernetes/pkg/proxy/metaproxier" "k8s.io/kubernetes/pkg/proxy/metrics" + utilproxy "k8s.io/kubernetes/pkg/proxy/util" "k8s.io/kubernetes/pkg/util/async" utilnet "k8s.io/utils/net" ) @@ -108,25 +108,16 @@ type loadBalancerFlags struct { // internal struct for string service information type serviceInfo struct { - clusterIP net.IP - port int - protocol v1.Protocol - nodePort int - targetPort int - loadBalancerStatus v1.LoadBalancerStatus - sessionAffinityType v1.ServiceAffinity - stickyMaxAgeSeconds int - externalIPs []*externalIPInfo - loadBalancerIngressIPs []*loadBalancerIngressInfo - loadBalancerSourceRanges []string - onlyNodeLocalEndpoints bool - healthCheckNodePort int - hnsID string - nodePorthnsID string - policyApplied bool - remoteEndpoint *endpointsInfo - hns HostNetworkService - preserveDIP bool + *proxy.BaseServiceInfo + targetPort int + externalIPs []*externalIPInfo + loadBalancerIngressIPs []*loadBalancerIngressInfo + hnsID string + nodePorthnsID string + policyApplied bool + remoteEndpoint *endpointsInfo + hns HostNetworkService + preserveDIP bool } type hnsNetworkInfo struct { @@ -144,7 +135,7 @@ type remoteSubnetInfo struct { } func Log(v interface{}, message string, level klog.Level) { - klog.V(level).Infof("%s, %s", message, spew.Sdump(v)) + klog.V(level).Infof("%s, %s", message, spewSdump(v)) } func LogJson(v interface{}, message string, level klog.Level) { @@ -154,6 +145,12 @@ func LogJson(v interface{}, message string, level klog.Level) { } } +func spewSdump(v interface{}) string { + scs := spew.NewDefaultConfig() + scs.DisableMethods = true + return scs.Sdump(v) +} + // internal struct for endpoints information type endpointsInfo struct { ip string @@ -166,7 +163,37 @@ type endpointsInfo struct { hns HostNetworkService } -//Uses mac prefix and IP address to return a mac address +// String is part of proxy.Endpoint interface. +func (info *endpointsInfo) String() string { + return net.JoinHostPort(info.ip, strconv.Itoa(int(info.port))) +} + +// GetIsLocal is part of proxy.Endpoint interface. +func (info *endpointsInfo) GetIsLocal() bool { + return info.isLocal +} + +// GetTopology returns the topology information of the endpoint. +func (info *endpointsInfo) GetTopology() map[string]string { + return nil +} + +// IP returns just the IP part of the endpoint, it's a part of proxy.Endpoint interface. +func (info *endpointsInfo) IP() string { + return info.ip +} + +// Port returns just the Port part of the endpoint. +func (info *endpointsInfo) Port() (int, error) { + return int(info.port), nil +} + +// Equal is part of proxy.Endpoint interface. +func (info *endpointsInfo) Equal(other proxy.Endpoint) bool { + return info.String() == other.String() && info.GetIsLocal() == other.GetIsLocal() +} + +//Uses mac prefix and IPv4 address to return a mac address //This ensures mac addresses are unique for proper load balancing //There is a possibility of MAC collisions but this Mac address is used for remote endpoints only //and not sent on the wire. @@ -181,15 +208,97 @@ func conjureMac(macPrefix string, ip net.IP) string { return "02-11-22-33-44-55" } -func newEndpointInfo(ip string, port uint16, isLocal bool, hns HostNetworkService) *endpointsInfo { +func (proxier *Proxier) endpointsMapChange(oldEndpointsMap, newEndpointsMap proxy.EndpointsMap) { + for svcPortName := range oldEndpointsMap { + proxier.onEndpointsMapChange(&svcPortName) + } + + for svcPortName := range newEndpointsMap { + proxier.onEndpointsMapChange(&svcPortName) + } +} + +func (proxier *Proxier) onEndpointsMapChange(svcPortName *proxy.ServicePortName) { + + svc, exists := proxier.serviceMap[*svcPortName] + + if exists { + svcInfo, ok := svc.(*serviceInfo) + + if !ok { + klog.Errorf("Failed to cast serviceInfo %q", svcPortName.String()) + return + } + + klog.V(3).Infof("Endpoints are modified. Service [%v] is stale", *svcPortName) + svcInfo.cleanupAllPolicies(proxier.endpointsMap[*svcPortName]) + } else { + // If no service exists, just cleanup the remote endpoints + klog.V(3).Infof("Endpoints are orphaned. Cleaning up") + // Cleanup Endpoints references + epInfos, exists := proxier.endpointsMap[*svcPortName] + + if exists { + // Cleanup Endpoints references + for _, ep := range epInfos { + epInfo, ok := ep.(*endpointsInfo) + + if ok { + epInfo.Cleanup() + } + + } + } + } +} + +func (proxier *Proxier) serviceMapChange(previous, current proxy.ServiceMap) { + for svcPortName := range current { + proxier.onServiceMapChange(&svcPortName) + } + + for svcPortName := range previous { + if _, ok := current[svcPortName]; ok { + continue + } + proxier.onServiceMapChange(&svcPortName) + } +} + +func (proxier *Proxier) onServiceMapChange(svcPortName *proxy.ServicePortName) { + + svc, exists := proxier.serviceMap[*svcPortName] + + if exists { + svcInfo, ok := svc.(*serviceInfo) + + if !ok { + klog.Errorf("Failed to cast serviceInfo %q", svcPortName.String()) + return + } + + klog.V(3).Infof("Updating existing service port %q at %s:%d/%s", svcPortName, svcInfo.ClusterIP(), svcInfo.Port(), svcInfo.Protocol()) + svcInfo.cleanupAllPolicies(proxier.endpointsMap[*svcPortName]) + } +} + +// returns a new proxy.Endpoint which abstracts a endpointsInfo +func (proxier *Proxier) newEndpointInfo(baseInfo *proxy.BaseEndpointInfo) proxy.Endpoint { + + portNumber, err := baseInfo.Port() + + if err != nil { + portNumber = 0 + } + info := &endpointsInfo{ - ip: ip, - port: port, - isLocal: isLocal, - macAddress: conjureMac("02-11", net.ParseIP(ip)), + ip: baseInfo.IP(), + port: uint16(portNumber), + isLocal: baseInfo.GetIsLocal(), + macAddress: conjureMac("02-11", net.ParseIP(baseInfo.IP())), refCount: new(uint16), hnsID: "", - hns: hns, + hns: proxier.hns, } return info @@ -215,13 +324,13 @@ func (ep *endpointsInfo) Cleanup() { // Remove the remote hns endpoint, if no service is referring it // Never delete a Local Endpoint. Local Endpoints are already created by other entities. // Remove only remote endpoints created by this service - if (ep.refCount == nil || *ep.refCount <= 0) && !ep.isLocal { + if (ep.refCount == nil || *ep.refCount <= 0) && !ep.GetIsLocal() { klog.V(4).Infof("Removing endpoints for %v, since no one is referencing it", ep) err := ep.hns.deleteEndpoint(ep.hnsID) if err == nil { ep.hnsID = "" } else { - klog.Errorf("Endpoint deletion failed for %v: %v", ep.ip, err) + klog.Errorf("Endpoint deletion failed for %v: %v", ep.IP(), err) } } } @@ -235,21 +344,9 @@ func (refCountMap endPointsReferenceCountMap) getRefCount(hnsID string) *uint16 return refCount } -// returns a new serviceInfo struct -func newServiceInfo(svcPortName proxy.ServicePortName, port *v1.ServicePort, service *v1.Service, hns HostNetworkService) *serviceInfo { - onlyNodeLocalEndpoints := false - if apiservice.RequestsOnlyLocalTraffic(service) { - onlyNodeLocalEndpoints = true - } - - // set default session sticky max age 180min=10800s - stickyMaxAgeSeconds := 10800 - if service.Spec.SessionAffinity == v1.ServiceAffinityClientIP && service.Spec.SessionAffinityConfig != nil { - stickyMaxAgeSeconds = int(*service.Spec.SessionAffinityConfig.ClientIP.TimeoutSeconds) - } - - klog.Infof("Service %q preserve-destination: %v", svcPortName.NamespacedName.String(), service.Annotations["preserve-destination"]) - +// returns a new proxy.ServicePort which abstracts a serviceInfo +func (proxier *Proxier) newServiceInfo(port *v1.ServicePort, service *v1.Service, baseInfo *proxy.BaseServiceInfo) proxy.ServicePort { + info := &serviceInfo{BaseServiceInfo: baseInfo} preserveDIP := service.Annotations["preserve-destination"] == "true" err := hcn.DSRSupported() if err != nil { @@ -261,39 +358,18 @@ func newServiceInfo(svcPortName proxy.ServicePortName, port *v1.ServicePort, ser if port.TargetPort.Type == intstr.Int { targetPort = port.TargetPort.IntValue() } - info := &serviceInfo{ - clusterIP: net.ParseIP(service.Spec.ClusterIP), - port: int(port.Port), - protocol: port.Protocol, - nodePort: int(port.NodePort), - targetPort: targetPort, - // Deep-copy in case the service instance changes - loadBalancerStatus: *service.Status.LoadBalancer.DeepCopy(), - sessionAffinityType: service.Spec.SessionAffinity, - stickyMaxAgeSeconds: stickyMaxAgeSeconds, - loadBalancerSourceRanges: make([]string, len(service.Spec.LoadBalancerSourceRanges)), - onlyNodeLocalEndpoints: onlyNodeLocalEndpoints, - hns: hns, - preserveDIP: preserveDIP, - } - - copy(info.loadBalancerSourceRanges, service.Spec.LoadBalancerSourceRanges) + + info.preserveDIP = preserveDIP + info.targetPort = targetPort + info.hns = proxier.hns + for _, eip := range service.Spec.ExternalIPs { info.externalIPs = append(info.externalIPs, &externalIPInfo{ip: eip}) } + for _, ingress := range service.Status.LoadBalancer.Ingress { info.loadBalancerIngressIPs = append(info.loadBalancerIngressIPs, &loadBalancerIngressInfo{ip: ingress.IP}) } - - if apiservice.NeedsHealthCheck(service) { - p := service.Spec.HealthCheckNodePort - if p == 0 { - klog.Errorf("Service %q has no healthcheck nodeport", svcPortName.NamespacedName.String()) - } else { - info.healthCheckNodePort = int(p) - } - } - return info } @@ -315,180 +391,11 @@ func (network hnsNetworkInfo) findRemoteSubnetProviderAddress(ip string) string return providerAddress } -type endpointsChange struct { - previous proxyEndpointsMap - current proxyEndpointsMap -} - -type endpointsChangeMap struct { - lock sync.Mutex - hostname string - items map[types.NamespacedName]*endpointsChange -} - -type serviceChange struct { - previous proxyServiceMap - current proxyServiceMap -} - -type serviceChangeMap struct { - lock sync.Mutex - items map[types.NamespacedName]*serviceChange -} - -type updateEndpointMapResult struct { - hcEndpoints map[types.NamespacedName]int - staleEndpoints map[endpointServicePair]bool - staleServiceNames map[proxy.ServicePortName]bool -} - -type updateServiceMapResult struct { - hcServices map[types.NamespacedName]uint16 - staleServices sets.String -} -type proxyServiceMap map[proxy.ServicePortName]*serviceInfo -type proxyEndpointsMap map[proxy.ServicePortName][]*endpointsInfo type endPointsReferenceCountMap map[string]*uint16 -func newEndpointsChangeMap(hostname string) endpointsChangeMap { - return endpointsChangeMap{ - hostname: hostname, - items: make(map[types.NamespacedName]*endpointsChange), - } -} - -func (ecm *endpointsChangeMap) update(namespacedName *types.NamespacedName, previous, current *v1.Endpoints, hns HostNetworkService) bool { - ecm.lock.Lock() - defer ecm.lock.Unlock() - - change, exists := ecm.items[*namespacedName] - if !exists { - change = &endpointsChange{} - change.previous = endpointsToEndpointsMap(previous, ecm.hostname, hns) - ecm.items[*namespacedName] = change - } - change.current = endpointsToEndpointsMap(current, ecm.hostname, hns) - if reflect.DeepEqual(change.previous, change.current) { - delete(ecm.items, *namespacedName) - } - return len(ecm.items) > 0 -} - -func newServiceChangeMap() serviceChangeMap { - return serviceChangeMap{ - items: make(map[types.NamespacedName]*serviceChange), - } -} - -func (scm *serviceChangeMap) update(namespacedName *types.NamespacedName, previous, current *v1.Service, hns HostNetworkService) bool { - scm.lock.Lock() - defer scm.lock.Unlock() - - change, exists := scm.items[*namespacedName] - if !exists { - // Service is Added - change = &serviceChange{} - change.previous = serviceToServiceMap(previous, hns) - scm.items[*namespacedName] = change - } - change.current = serviceToServiceMap(current, hns) - if reflect.DeepEqual(change.previous, change.current) { - delete(scm.items, *namespacedName) - } - return len(scm.items) > 0 -} - -func (sm *proxyServiceMap) merge(other proxyServiceMap, curEndpoints proxyEndpointsMap) sets.String { - existingPorts := sets.NewString() - for svcPortName, info := range other { - existingPorts.Insert(svcPortName.Port) - svcInfo, exists := (*sm)[svcPortName] - if !exists { - klog.V(1).Infof("Adding new service port %q at %s:%d/%s", svcPortName, info.clusterIP, info.port, info.protocol) - } else { - klog.V(1).Infof("Updating existing service port %q at %s:%d/%s", svcPortName, info.clusterIP, info.port, info.protocol) - svcInfo.cleanupAllPolicies(curEndpoints[svcPortName]) - delete(*sm, svcPortName) - } - (*sm)[svcPortName] = info - } - return existingPorts -} - -func (sm *proxyServiceMap) unmerge(other proxyServiceMap, existingPorts, staleServices sets.String, curEndpoints proxyEndpointsMap) { - for svcPortName := range other { - if existingPorts.Has(svcPortName.Port) { - continue - } - info, exists := (*sm)[svcPortName] - if exists { - klog.V(1).Infof("Removing service port %q", svcPortName) - if info.protocol == v1.ProtocolUDP { - staleServices.Insert(info.clusterIP.String()) - } - info.cleanupAllPolicies(curEndpoints[svcPortName]) - delete(*sm, svcPortName) - } else { - klog.Errorf("Service port %q removed, but doesn't exists", svcPortName) - } - } -} - -func (em proxyEndpointsMap) merge(other proxyEndpointsMap, curServices proxyServiceMap) { - // Endpoint Update/Add - for svcPortName := range other { - epInfos, exists := em[svcPortName] - if exists { - // - info, exists := curServices[svcPortName] - klog.V(1).Infof("Updating existing service port %q at %s:%d/%s", svcPortName, info.clusterIP, info.port, info.protocol) - if exists { - klog.V(2).Infof("Endpoints are modified. Service [%v] is stale", svcPortName) - info.cleanupAllPolicies(epInfos) - } else { - // If no service exists, just cleanup the remote endpoints - klog.V(2).Infof("Endpoints are orphaned. Cleaning up") - // Cleanup Endpoints references - for _, ep := range epInfos { - ep.Cleanup() - } - - } - - delete(em, svcPortName) - } - em[svcPortName] = other[svcPortName] - } -} - -func (em proxyEndpointsMap) unmerge(other proxyEndpointsMap, curServices proxyServiceMap) { - // Endpoint Update/Removal - for svcPortName := range other { - info, exists := curServices[svcPortName] - if exists { - klog.V(2).Infof("Service [%v] is stale", info) - info.cleanupAllPolicies(em[svcPortName]) - } else { - // If no service exists, just cleanup the remote endpoints - klog.V(2).Infof("Endpoints are orphaned. Cleaning up") - // Cleanup Endpoints references - epInfos, exists := em[svcPortName] - if exists { - for _, ep := range epInfos { - ep.Cleanup() - } - } - } - - delete(em, svcPortName) - } -} - // Proxier is an hns based proxy for connections between a localhost:lport // and services that provide the actual backends. type Proxier struct { - // EndpointSlice support has not been added for this proxier yet. - proxyconfig.NoopEndpointSliceHandler // TODO(imroc): implement node handler for winkernel proxier. proxyconfig.NoopNodeHandler @@ -496,23 +403,22 @@ type Proxier struct { // services that happened since policies were synced. For a single object, // changes are accumulated, i.e. previous is state from before all of them, // current is state after applying all of those. - endpointsChanges endpointsChangeMap - serviceChanges serviceChangeMap - - mu sync.Mutex // protects the following fields - serviceMap proxyServiceMap - endpointsMap proxyEndpointsMap - portsMap map[localPort]closeable + endpointsChanges *proxy.EndpointChangeTracker + serviceChanges *proxy.ServiceChangeTracker endPointsRefCount endPointsReferenceCountMap + mu sync.Mutex // protects the following fields + serviceMap proxy.ServiceMap + endpointsMap proxy.EndpointsMap + portsMap map[utilproxy.LocalPort]utilproxy.Closeable // endpointsSynced and servicesSynced are set to true when corresponding // objects are synced after startup. This is used to avoid updating hns policies // with some partial data after kube-proxy restart. - endpointsSynced bool - servicesSynced bool - isIPv6Mode bool - initialized int32 - syncRunner *async.BoundedFrequencyRunner // governs calls to syncProxyRules - + endpointsSynced bool + endpointSlicesSynced bool + servicesSynced bool + isIPv6Mode bool + initialized int32 + syncRunner *async.BoundedFrequencyRunner // governs calls to syncProxyRules // These are effectively const and do not need the mutex to be held. masqueradeAll bool masqueradeMark string @@ -673,14 +579,12 @@ func NewProxier( } isIPv6 := utilnet.IsIPv6(nodeIP) - + endpointSlicesEnabled := utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) proxier := &Proxier{ - portsMap: make(map[localPort]closeable), - serviceMap: make(proxyServiceMap), - serviceChanges: newServiceChangeMap(), - endpointsMap: make(proxyEndpointsMap), - endpointsChanges: newEndpointsChangeMap(hostname), endPointsRefCount: make(endPointsReferenceCountMap), + portsMap: make(map[utilproxy.LocalPort]utilproxy.Closeable), + serviceMap: make(proxy.ServiceMap), + endpointsMap: make(proxy.EndpointsMap), masqueradeAll: masqueradeAll, masqueradeMark: masqueradeMark, clusterCIDR: clusterCIDR, @@ -698,11 +602,15 @@ func NewProxier( isIPv6Mode: isIPv6, } + serviceChanges := proxy.NewServiceChangeTracker(proxier.newServiceInfo, &isIPv6, recorder, proxier.serviceMapChange) + endPointChangeTracker := proxy.NewEndpointChangeTracker(hostname, proxier.newEndpointInfo, &isIPv6, recorder, endpointSlicesEnabled, proxier.endpointsMapChange) + proxier.endpointsChanges = endPointChangeTracker + proxier.serviceChanges = serviceChanges + burstSyncs := 2 klog.V(3).Infof("minSyncPeriod: %v, syncPeriod: %v, burstSyncs: %d", minSyncPeriod, syncPeriod, burstSyncs) proxier.syncRunner = async.NewBoundedFrequencyRunner("sync-runner", proxier.syncProxyRules, minSyncPeriod, syncPeriod, burstSyncs) return proxier, nil - } func NewDualStackProxier( @@ -748,13 +656,16 @@ func CleanupLeftovers() (encounteredError bool) { return encounteredError } -func (svcInfo *serviceInfo) cleanupAllPolicies(endpoints []*endpointsInfo) { +func (svcInfo *serviceInfo) cleanupAllPolicies(endpoints []proxy.Endpoint) { Log(svcInfo, "Service Cleanup", 3) // Skip the svcInfo.policyApplied check to remove all the policies svcInfo.deleteAllHnsLoadBalancerPolicy() // Cleanup Endpoints references for _, ep := range endpoints { - ep.Cleanup() + epInfo, ok := ep.(*endpointsInfo) + if ok { + epInfo.Cleanup() + } } if svcInfo.remoteEndpoint != nil { svcInfo.remoteEndpoint.Cleanup() @@ -846,17 +757,13 @@ func (proxier *Proxier) isInitialized() bool { // OnServiceAdd is called whenever creation of new service object // is observed. func (proxier *Proxier) OnServiceAdd(service *v1.Service) { - namespacedName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} - if proxier.serviceChanges.update(&namespacedName, nil, service, proxier.hns) && proxier.isInitialized() { - proxier.Sync() - } + proxier.OnServiceUpdate(nil, service) } // OnServiceUpdate is called whenever modification of an existing // service object is observed. func (proxier *Proxier) OnServiceUpdate(oldService, service *v1.Service) { - namespacedName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} - if proxier.serviceChanges.update(&namespacedName, oldService, service, proxier.hns) && proxier.isInitialized() { + if proxier.serviceChanges.Update(oldService, service) && proxier.isInitialized() { proxier.Sync() } } @@ -864,10 +771,7 @@ func (proxier *Proxier) OnServiceUpdate(oldService, service *v1.Service) { // OnServiceDelete is called whenever deletion of an existing service // object is observed. func (proxier *Proxier) OnServiceDelete(service *v1.Service) { - namespacedName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} - if proxier.serviceChanges.update(&namespacedName, service, nil, proxier.hns) && proxier.isInitialized() { - proxier.Sync() - } + proxier.OnServiceUpdate(service, nil) } // OnServiceSynced is called once all the initial event handlers were @@ -875,7 +779,11 @@ func (proxier *Proxier) OnServiceDelete(service *v1.Service) { func (proxier *Proxier) OnServiceSynced() { proxier.mu.Lock() proxier.servicesSynced = true - proxier.setInitialized(proxier.servicesSynced && proxier.endpointsSynced) + if utilfeature.DefaultFeatureGate.Enabled(features.EndpointSliceProxying) { + proxier.setInitialized(proxier.endpointSlicesSynced) + } else { + proxier.setInitialized(proxier.endpointsSynced) + } proxier.mu.Unlock() // Sync unconditionally - this is called once per lifetime. @@ -896,50 +804,17 @@ func shouldSkipService(svcName types.NamespacedName, service *v1.Service) bool { return false } -// is updated by this function (based on the given changes). -// map is cleared after applying them. -func (proxier *Proxier) updateServiceMap() (result updateServiceMapResult) { - result.staleServices = sets.NewString() - - serviceMap := proxier.serviceMap - changes := &proxier.serviceChanges - - func() { - changes.lock.Lock() - defer changes.lock.Unlock() - for _, change := range changes.items { - existingPorts := serviceMap.merge(change.current, proxier.endpointsMap) - serviceMap.unmerge(change.previous, existingPorts, result.staleServices, proxier.endpointsMap) - } - changes.items = make(map[types.NamespacedName]*serviceChange) - }() - - // TODO: If this will appear to be computationally expensive, consider - // computing this incrementally similarly to serviceMap. - result.hcServices = make(map[types.NamespacedName]uint16) - for svcPortName, info := range serviceMap { - if info.healthCheckNodePort != 0 { - result.hcServices[svcPortName.NamespacedName] = uint16(info.healthCheckNodePort) - } - } - - return result -} - // OnEndpointsAdd is called whenever creation of new endpoints object // is observed. func (proxier *Proxier) OnEndpointsAdd(endpoints *v1.Endpoints) { - namespacedName := types.NamespacedName{Namespace: endpoints.Namespace, Name: endpoints.Name} - if proxier.endpointsChanges.update(&namespacedName, nil, endpoints, proxier.hns) && proxier.isInitialized() { - proxier.Sync() - } + proxier.OnEndpointsUpdate(nil, endpoints) } // OnEndpointsUpdate is called whenever modification of an existing // endpoints object is observed. func (proxier *Proxier) OnEndpointsUpdate(oldEndpoints, endpoints *v1.Endpoints) { - namespacedName := types.NamespacedName{Namespace: endpoints.Namespace, Name: endpoints.Name} - if proxier.endpointsChanges.update(&namespacedName, oldEndpoints, endpoints, proxier.hns) && proxier.isInitialized() { + + if proxier.endpointsChanges.Update(oldEndpoints, endpoints) && proxier.isInitialized() { proxier.Sync() } } @@ -947,10 +822,7 @@ func (proxier *Proxier) OnEndpointsUpdate(oldEndpoints, endpoints *v1.Endpoints) // OnEndpointsDelete is called whenever deletion of an existing endpoints // object is observed. func (proxier *Proxier) OnEndpointsDelete(endpoints *v1.Endpoints) { - namespacedName := types.NamespacedName{Namespace: endpoints.Namespace, Name: endpoints.Name} - if proxier.endpointsChanges.update(&namespacedName, endpoints, nil, proxier.hns) && proxier.isInitialized() { - proxier.Sync() - } + proxier.OnEndpointsUpdate(endpoints, nil) } // OnEndpointsSynced is called once all the initial event handlers were @@ -965,135 +837,64 @@ func (proxier *Proxier) OnEndpointsSynced() { proxier.syncProxyRules() } -func (proxier *Proxier) cleanupAllPolicies() { - for svcName, svcInfo := range proxier.serviceMap { - svcInfo.cleanupAllPolicies(proxier.endpointsMap[svcName]) +// OnEndpointSliceAdd is called whenever creation of a new endpoint slice object +// is observed. +func (proxier *Proxier) OnEndpointSliceAdd(endpointSlice *discovery.EndpointSlice) { + if proxier.endpointsChanges.EndpointSliceUpdate(endpointSlice, false) && proxier.isInitialized() { + proxier.Sync() } } -func isNetworkNotFoundError(err error) bool { - if err == nil { - return false - } - if _, ok := err.(hcn.NetworkNotFoundError); ok { - return true - } - if _, ok := err.(hcsshim.NetworkNotFoundError); ok { - return true +// OnEndpointSliceUpdate is called whenever modification of an existing endpoint +// slice object is observed. +func (proxier *Proxier) OnEndpointSliceUpdate(_, endpointSlice *discovery.EndpointSlice) { + if proxier.endpointsChanges.EndpointSliceUpdate(endpointSlice, false) && proxier.isInitialized() { + proxier.Sync() } - return false } -// is updated by this function (based on the given changes). -// map is cleared after applying them. -func (proxier *Proxier) updateEndpointsMap() (result updateEndpointMapResult) { - result.staleEndpoints = make(map[endpointServicePair]bool) - result.staleServiceNames = make(map[proxy.ServicePortName]bool) - - endpointsMap := proxier.endpointsMap - changes := &proxier.endpointsChanges - - func() { - changes.lock.Lock() - defer changes.lock.Unlock() - for _, change := range changes.items { - endpointsMap.unmerge(change.previous, proxier.serviceMap) - endpointsMap.merge(change.current, proxier.serviceMap) - } - changes.items = make(map[types.NamespacedName]*endpointsChange) - }() - - // TODO: If this will appear to be computationally expensive, consider - // computing this incrementally similarly to endpointsMap. - result.hcEndpoints = make(map[types.NamespacedName]int) - localIPs := getLocalIPs(endpointsMap) - for nsn, ips := range localIPs { - result.hcEndpoints[nsn] = len(ips) +// OnEndpointSliceDelete is called whenever deletion of an existing endpoint slice +// object is observed. +func (proxier *Proxier) OnEndpointSliceDelete(endpointSlice *discovery.EndpointSlice) { + if proxier.endpointsChanges.EndpointSliceUpdate(endpointSlice, true) && proxier.isInitialized() { + proxier.Sync() } - - return result } -func getLocalIPs(endpointsMap proxyEndpointsMap) map[types.NamespacedName]sets.String { - localIPs := make(map[types.NamespacedName]sets.String) - for svcPortName := range endpointsMap { - for _, ep := range endpointsMap[svcPortName] { - if ep.isLocal { - nsn := svcPortName.NamespacedName - if localIPs[nsn] == nil { - localIPs[nsn] = sets.NewString() - } - localIPs[nsn].Insert(ep.ip) // just the IP part - } - } - } - return localIPs + +// OnEndpointSlicesSynced is called once all the initial event handlers were +// called and the state is fully propagated to local cache. +func (proxier *Proxier) OnEndpointSlicesSynced() { + proxier.mu.Lock() + proxier.endpointSlicesSynced = true + proxier.setInitialized(proxier.servicesSynced) + proxier.mu.Unlock() + + // Sync unconditionally - this is called once per lifetime. + proxier.syncProxyRules() } -// Translates single Endpoints object to proxyEndpointsMap. -// This function is used for incremental updated of endpointsMap. -// -// NOTE: endpoints object should NOT be modified. -func endpointsToEndpointsMap(endpoints *v1.Endpoints, hostname string, hns HostNetworkService) proxyEndpointsMap { - if endpoints == nil { - return nil - } - - endpointsMap := make(proxyEndpointsMap) - // We need to build a map of portname -> all ip:ports for that - // portname. Explode Endpoints.Subsets[*] into this structure. - for i := range endpoints.Subsets { - ss := &endpoints.Subsets[i] - for i := range ss.Ports { - port := &ss.Ports[i] - if port.Port == 0 { - klog.Warningf("Ignoring invalid endpoint port %s", port.Name) - continue - } - svcPortName := proxy.ServicePortName{ - NamespacedName: types.NamespacedName{Namespace: endpoints.Namespace, Name: endpoints.Name}, - Port: port.Name, - } - for i := range ss.Addresses { - addr := &ss.Addresses[i] - if addr.IP == "" { - klog.Warningf("Ignoring invalid endpoint port %s with empty host", port.Name) - continue - } - isLocal := addr.NodeName != nil && *addr.NodeName == hostname - epInfo := newEndpointInfo(addr.IP, uint16(port.Port), isLocal, hns) - endpointsMap[svcPortName] = append(endpointsMap[svcPortName], epInfo) - } - if klog.V(3).Enabled() { - newEPList := []*endpointsInfo{} - for _, ep := range endpointsMap[svcPortName] { - newEPList = append(newEPList, ep) - } - klog.Infof("Setting endpoints for %q to %+v", svcPortName, newEPList) - } +func (proxier *Proxier) cleanupAllPolicies() { + for svcName, svc := range proxier.serviceMap { + svcInfo, ok := svc.(*serviceInfo) + if !ok { + klog.Errorf("Failed to cast serviceInfo %q", svcName.String()) + continue } + svcInfo.cleanupAllPolicies(proxier.endpointsMap[svcName]) } - return endpointsMap } -// Translates single Service object to proxyServiceMap. -// -// NOTE: service object should NOT be modified. -func serviceToServiceMap(service *v1.Service, hns HostNetworkService) proxyServiceMap { - if service == nil { - return nil +func isNetworkNotFoundError(err error) bool { + if err == nil { + return false } - svcName := types.NamespacedName{Namespace: service.Namespace, Name: service.Name} - if shouldSkipService(svcName, service) { - return nil + if _, ok := err.(hcn.NetworkNotFoundError); ok { + return true } - - serviceMap := make(proxyServiceMap) - for i := range service.Spec.Ports { - servicePort := &service.Spec.Ports[i] - svcPortName := proxy.ServicePortName{NamespacedName: svcName, Port: servicePort.Name} - serviceMap[svcPortName] = newServiceInfo(svcPortName, servicePort, service, hns) + if _, ok := err.(hcsshim.NetworkNotFoundError); ok { + return true } - return serviceMap + return false } // This is where all of the hns save/restore calls happen. @@ -1108,7 +909,7 @@ func (proxier *Proxier) syncProxyRules() { klog.V(4).Infof("syncProxyRules took %v", time.Since(start)) }() // don't sync rules till we've received services and endpoints - if !proxier.endpointsSynced || !proxier.servicesSynced { + if !proxier.isInitialized() { klog.V(2).Info("Not syncing hns until Services and Endpoints have been received from master") return } @@ -1130,15 +931,15 @@ func (proxier *Proxier) syncProxyRules() { // We assume that if this was called, we really want to sync them, // even if nothing changed in the meantime. In other words, callers are // responsible for detecting no-op changes and not calling this function. - serviceUpdateResult := proxier.updateServiceMap() - endpointUpdateResult := proxier.updateEndpointsMap() + serviceUpdateResult := proxy.UpdateServiceMap(proxier.serviceMap, proxier.serviceChanges) + endpointUpdateResult := proxier.endpointsMap.Update(proxier.endpointsChanges) - staleServices := serviceUpdateResult.staleServices + staleServices := serviceUpdateResult.UDPStaleClusterIP // merge stale services gathered from updateEndpointsMap - for svcPortName := range endpointUpdateResult.staleServiceNames { - if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && svcInfo.protocol == v1.ProtocolUDP { - klog.V(2).Infof("Stale udp service %v -> %s", svcPortName, svcInfo.clusterIP.String()) - staleServices.Insert(svcInfo.clusterIP.String()) + for _, svcPortName := range endpointUpdateResult.StaleServiceNames { + if svcInfo, ok := proxier.serviceMap[svcPortName]; ok && svcInfo != nil && svcInfo.Protocol() == v1.ProtocolUDP { + klog.V(2).Infof("Stale udp service %v -> %s", svcPortName, svcInfo.ClusterIP().String()) + staleServices.Insert(svcInfo.ClusterIP().String()) } } @@ -1156,18 +957,24 @@ func (proxier *Proxier) syncProxyRules() { klog.V(3).Infof("Syncing Policies") // Program HNS by adding corresponding policies for each service. - for svcName, svcInfo := range proxier.serviceMap { + for svcName, svc := range proxier.serviceMap { + svcInfo, ok := svc.(*serviceInfo) + if !ok { + klog.Errorf("Failed to cast serviceInfo %q", svcName.String()) + continue + } + if svcInfo.policyApplied { - klog.V(4).Infof("Policy already applied for %s", spew.Sdump(svcInfo)) + klog.V(4).Infof("Policy already applied for %s", spewSdump(svcInfo)) continue } if proxier.network.networkType == "Overlay" { - serviceVipEndpoint, _ := hns.getEndpointByIpAddress(svcInfo.clusterIP.String(), hnsNetworkName) + serviceVipEndpoint, _ := hns.getEndpointByIpAddress(svcInfo.ClusterIP().String(), hnsNetworkName) if serviceVipEndpoint == nil { - klog.V(4).Infof("No existing remote endpoint for service VIP %v", svcInfo.clusterIP.String()) + klog.V(4).Infof("No existing remote endpoint for service VIP %v", svcInfo.ClusterIP().String()) hnsEndpoint := &endpointsInfo{ - ip: svcInfo.clusterIP.String(), + ip: svcInfo.ClusterIP().String(), isLocal: false, macAddress: proxier.hostMac, providerAddress: proxier.nodeIP.String(), @@ -1192,7 +999,14 @@ func (proxier *Proxier) syncProxyRules() { containsPublicIP := false containsNodeIP := false - for _, ep := range proxier.endpointsMap[svcName] { + for _, epInfo := range proxier.endpointsMap[svcName] { + + ep, ok := epInfo.(*endpointsInfo) + if !ok { + klog.Errorf("Failed to cast endpointsInfo %q", svcName.String()) + continue + } + var newHnsEndpoint *endpointsInfo hnsNetworkName := proxier.network.name var err error @@ -1212,11 +1026,11 @@ func (proxier *Proxier) syncProxyRules() { // First check if an endpoint resource exists for this IP, on the current host // A Local endpoint could exist here already // A remote endpoint was already created and proxy was restarted - newHnsEndpoint, err = hns.getEndpointByIpAddress(ep.ip, hnsNetworkName) + newHnsEndpoint, err = hns.getEndpointByIpAddress(ep.IP(), hnsNetworkName) } if newHnsEndpoint == nil { - if ep.isLocal { - klog.Errorf("Local endpoint not found for %v: err: %v on network %s", ep.ip, err, hnsNetworkName) + if ep.GetIsLocal() { + klog.Errorf("Local endpoint not found for %v: err: %v on network %s", ep.IP(), err, hnsNetworkName) continue } @@ -1230,11 +1044,9 @@ func (proxier *Proxier) syncProxyRules() { return } proxier.network = *updatedNetwork - - providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip) - + providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.IP()) if len(providerAddress) == 0 { - klog.Infof("Could not find provider address for %s. Assuming it is a public IP", ep.ip) + klog.Infof("Could not find provider address for %s. Assuming it is a public IP", ep.IP()) providerAddress = proxier.nodeIP.String() } @@ -1247,10 +1059,11 @@ func (proxier *Proxier) syncProxyRules() { newHnsEndpoint, err = hns.createEndpoint(hnsEndpoint, hnsNetworkName) if err != nil { - klog.Errorf("Remote endpoint creation failed: %v, %s", err, spew.Sdump(hnsEndpoint)) + klog.Errorf("Remote endpoint creation failed: %v, %s", err, spewSdump(hnsEndpoint)) continue } } else { + hnsEndpoint := &endpointsInfo{ ip: ep.ip, isLocal: false, @@ -1266,11 +1079,11 @@ func (proxier *Proxier) syncProxyRules() { } if proxier.network.networkType == "Overlay" { - providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.ip) + providerAddress := proxier.network.findRemoteSubnetProviderAddress(ep.IP()) - isNodeIP := (ep.ip == providerAddress) + isNodeIP := (ep.IP() == providerAddress) isPublicIP := (len(providerAddress) == 0) - klog.Infof("Endpoint %s on overlay network %s is classified as NodeIp: %v, Public Ip: %v", ep.ip, hnsNetworkName, isNodeIP, isPublicIP) + klog.Infof("Endpoint %s on overlay network %s is classified as NodeIp: %v, Public Ip: %v", ep.IP(), hnsNetworkName, isNodeIP, isPublicIP) containsNodeIP = containsNodeIP || isNodeIP containsPublicIP = containsPublicIP || isPublicIP @@ -1279,7 +1092,7 @@ func (proxier *Proxier) syncProxyRules() { // Save the hnsId for reference LogJson(newHnsEndpoint, "Hns Endpoint resource", 1) hnsEndpoints = append(hnsEndpoints, *newHnsEndpoint) - if newHnsEndpoint.isLocal { + if newHnsEndpoint.GetIsLocal() { hnsLocalEndpoints = append(hnsLocalEndpoints, *newHnsEndpoint) } else { // We only share the refCounts for remote endpoints @@ -1292,7 +1105,7 @@ func (proxier *Proxier) syncProxyRules() { Log(ep, "Endpoint resource found", 3) } - klog.V(3).Infof("Associated endpoints [%s] for service [%s]", spew.Sdump(hnsEndpoints), svcName) + klog.V(3).Infof("Associated endpoints [%s] for service [%s]", spewSdump(hnsEndpoints), svcName) if len(svcInfo.hnsID) > 0 { // This should not happen @@ -1304,14 +1117,14 @@ func (proxier *Proxier) syncProxyRules() { continue } - klog.V(4).Infof("Trying to Apply Policies for service %s", spew.Sdump(svcInfo)) + klog.V(4).Infof("Trying to Apply Policies for service %s", spewSdump(svcInfo)) var hnsLoadBalancer *loadBalancerInfo var sourceVip = proxier.sourceVip if containsPublicIP || containsNodeIP { sourceVip = proxier.nodeIP.String() } - sessionAffinityClientIP := svcInfo.sessionAffinityType == v1.ServiceAffinityClientIP + sessionAffinityClientIP := svcInfo.SessionAffinityType() == v1.ServiceAffinityClientIP if sessionAffinityClientIP && !proxier.supportedFeatures.SessionAffinity { klog.Warningf("Session Affinity is not supported on this version of Windows.") } @@ -1320,10 +1133,10 @@ func (proxier *Proxier) syncProxyRules() { hnsEndpoints, loadBalancerFlags{isDSR: proxier.isDSR, isIPv6: proxier.isIPv6Mode, sessionAffinity: sessionAffinityClientIP}, sourceVip, - svcInfo.clusterIP.String(), - Enum(svcInfo.protocol), + svcInfo.ClusterIP().String(), + Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), - uint16(svcInfo.port), + uint16(svcInfo.Port()), ) if err != nil { klog.Errorf("Policy creation failed: %v", err) @@ -1331,10 +1144,10 @@ func (proxier *Proxier) syncProxyRules() { } svcInfo.hnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for cluster ip resources %v, Id [%s]", svcInfo.clusterIP, hnsLoadBalancer.hnsID) + klog.V(3).Infof("Hns LoadBalancer resource created for cluster ip resources %v, Id [%s]", svcInfo.ClusterIP(), hnsLoadBalancer.hnsID) // If nodePort is specified, user should be able to use nodeIP:nodePort to reach the backend endpoints - if svcInfo.nodePort > 0 { + if svcInfo.NodePort() > 0 { // If the preserve-destination service annotation is present, we will disable routing mesh for NodePort. // This means that health services can use Node Port without falsely getting results from a different node. nodePortEndpoints := hnsEndpoints @@ -1346,9 +1159,9 @@ func (proxier *Proxier) syncProxyRules() { loadBalancerFlags{localRoutedVIP: true, sessionAffinity: sessionAffinityClientIP, isIPv6: proxier.isIPv6Mode}, sourceVip, "", - Enum(svcInfo.protocol), + Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), - uint16(svcInfo.nodePort), + uint16(svcInfo.NodePort()), ) if err != nil { klog.Errorf("Policy creation failed: %v", err) @@ -1356,7 +1169,7 @@ func (proxier *Proxier) syncProxyRules() { } svcInfo.nodePorthnsID = hnsLoadBalancer.hnsID - klog.V(3).Infof("Hns LoadBalancer resource created for nodePort resources %v, Id [%s]", svcInfo.clusterIP, hnsLoadBalancer.hnsID) + klog.V(3).Infof("Hns LoadBalancer resource created for nodePort resources %v, Id [%s]", svcInfo.ClusterIP(), hnsLoadBalancer.hnsID) } // Create a Load Balancer Policy for each external IP @@ -1367,9 +1180,9 @@ func (proxier *Proxier) syncProxyRules() { loadBalancerFlags{sessionAffinity: sessionAffinityClientIP, isIPv6: proxier.isIPv6Mode}, sourceVip, externalIP.ip, - Enum(svcInfo.protocol), + Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), - uint16(svcInfo.port), + uint16(svcInfo.Port()), ) if err != nil { klog.Errorf("Policy creation failed: %v", err) @@ -1390,9 +1203,9 @@ func (proxier *Proxier) syncProxyRules() { loadBalancerFlags{isDSR: svcInfo.preserveDIP || proxier.isDSR, useMUX: svcInfo.preserveDIP, preserveDIP: svcInfo.preserveDIP, sessionAffinity: sessionAffinityClientIP, isIPv6: proxier.isIPv6Mode}, sourceVip, lbIngressIP.ip, - Enum(svcInfo.protocol), + Enum(svcInfo.Protocol()), uint16(svcInfo.targetPort), - uint16(svcInfo.port), + uint16(svcInfo.Port()), ) if err != nil { klog.Errorf("Policy creation failed: %v", err) @@ -1413,10 +1226,10 @@ func (proxier *Proxier) syncProxyRules() { // Update service healthchecks. The endpoints list might include services that are // not "OnlyLocal", but the services list will not, and the serviceHealthServer // will just drop those endpoints. - if err := proxier.serviceHealthServer.SyncServices(serviceUpdateResult.hcServices); err != nil { + if err := proxier.serviceHealthServer.SyncServices(serviceUpdateResult.HCServiceNodePorts); err != nil { klog.Errorf("Error syncing healthcheck services: %v", err) } - if err := proxier.serviceHealthServer.SyncEndpoints(endpointUpdateResult.hcEndpoints); err != nil { + if err := proxier.serviceHealthServer.SyncEndpoints(endpointUpdateResult.HCEndpointsLocalIPSize); err != nil { klog.Errorf("Error syncing healthcheck endpoints: %v", err) } @@ -1434,8 +1247,3 @@ func (proxier *Proxier) syncProxyRules() { } } } - -type endpointServicePair struct { - endpoint string - servicePortName proxy.ServicePortName -} diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/BUILD index fd0417dbf36f..e740192d8a27 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/BUILD @@ -61,19 +61,16 @@ go_test( "//pkg/scheduler/internal/cache:go_default_library", "//pkg/scheduler/internal/queue:go_default_library", "//pkg/scheduler/testing:go_default_library", - "//pkg/scheduler/util:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/client-go/informers:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", "//staging/src/k8s.io/client-go/testing:go_default_library", "//staging/src/k8s.io/client-go/tools/events:go_default_library", "//staging/src/k8s.io/kube-scheduler/extender/v1:go_default_library", + "//vendor/github.com/google/go-cmp/cmp:go_default_library", ], ) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption.go index f902b0425c29..2af50951d5ef 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/defaultpreemption/default_preemption.go @@ -106,7 +106,7 @@ func preempt(ctx context.Context, fh framework.FrameworkHandle, state *framework return "", err } - if !podEligibleToPreemptOthers(pod, fh.SnapshotSharedLister().NodeInfos()) { + if !podEligibleToPreemptOthers(pod, fh.SnapshotSharedLister().NodeInfos(), m[pod.Status.NominatedNodeName]) { klog.V(5).Infof("Pod %v/%v is not eligible for more preemption.", pod.Namespace, pod.Name) return "", nil } @@ -189,13 +189,19 @@ func preempt(ctx context.Context, fh framework.FrameworkHandle, state *framework // considered for preemption. // We look at the node that is nominated for this pod and as long as there are // terminating pods on the node, we don't consider this for preempting more pods. -func podEligibleToPreemptOthers(pod *v1.Pod, nodeInfos framework.NodeInfoLister) bool { +func podEligibleToPreemptOthers(pod *v1.Pod, nodeInfos framework.NodeInfoLister, nominatedNodeStatus *framework.Status) bool { if pod.Spec.PreemptionPolicy != nil && *pod.Spec.PreemptionPolicy == v1.PreemptNever { klog.V(5).Infof("Pod %v/%v is not eligible for preemption because it has a preemptionPolicy of %v", pod.Namespace, pod.Name, v1.PreemptNever) return false } nomNodeName := pod.Status.NominatedNodeName if len(nomNodeName) > 0 { + // If the pod's nominated node is considered as UnschedulableAndUnresolvable by the filters, + // then the pod should be considered for preempting again. + if nominatedNodeStatus.Code() == framework.UnschedulableAndUnresolvable { + return true + } + if nodeInfo, _ := nodeInfos.Get(nomNodeName); nodeInfo != nil { podPriority := podutil.GetPodPriority(pod) for _, p := range nodeInfo.Pods { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go index 98705c5b380b..c6aa64149708 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/filtering.go @@ -295,7 +295,7 @@ func (pl *PodTopologySpread) Filter(ctx context.Context, cycleState *framework.C tpVal, ok := node.Labels[c.TopologyKey] if !ok { klog.V(5).Infof("node '%s' doesn't have required label '%s'", node.Name, tpKey) - return framework.NewStatus(framework.Unschedulable, ErrReasonConstraintsNotMatch) + return framework.NewStatus(framework.UnschedulableAndUnresolvable, ErrReasonNodeLabelNotMatch) } selfMatchNum := int32(0) diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go index 3d70276a03e0..581eb98a774e 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/framework/plugins/podtopologyspread/plugin.go @@ -31,6 +31,8 @@ import ( const ( // ErrReasonConstraintsNotMatch is used for PodTopologySpread filter error. ErrReasonConstraintsNotMatch = "node(s) didn't match pod topology spread constraints" + // ErrReasonNodeLabelNotMatch is used when the node doesn't hold the required label. + ErrReasonNodeLabelNotMatch = ErrReasonConstraintsNotMatch + " (missing required label)" ) // PodTopologySpread is a plugin that ensures pod's topologySpreadConstraints is satisfied. diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/metrics/metrics.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/metrics/metrics.go index 2416e8305783..e3623e1da091 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/metrics/metrics.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/metrics/metrics.go @@ -154,7 +154,7 @@ var ( StabilityLevel: metrics.ALPHA, }, []string{"work"}) - PodSchedulingDuration = metrics.NewHistogram( + PodSchedulingDuration = metrics.NewHistogramVec( &metrics.HistogramOpts{ Subsystem: SchedulerSubsystem, Name: "pod_scheduling_duration_seconds", @@ -162,7 +162,8 @@ var ( // Start with 1ms with the last bucket being [~16s, Inf) Buckets: metrics.ExponentialBuckets(0.001, 2, 15), StabilityLevel: metrics.ALPHA, - }) + }, + []string{"attempts"}) PodSchedulingAttempts = metrics.NewHistogram( &metrics.HistogramOpts{ diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/profile/BUILD b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/profile/BUILD index d88519500513..8dee306ce40f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/profile/BUILD +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/scheduler/profile/BUILD @@ -39,7 +39,7 @@ go_test( "//pkg/scheduler/framework/runtime:go_default_library", "//pkg/scheduler/framework/v1alpha1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", - "//staging/src/k8s.io/api/events/v1beta1:go_default_library", + "//staging/src/k8s.io/api/events/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library", "//staging/src/k8s.io/client-go/tools/events:go_default_library", diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/iptables/OWNERS b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/iptables/OWNERS index ceb274ac52e8..cc5f832961ad 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/iptables/OWNERS +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/util/iptables/OWNERS @@ -3,12 +3,12 @@ reviewers: - dcbw - thockin - - eparis - danwinship approvers: - dcbw - thockin - - eparis - danwinship +emeritus_approvers: + - eparis labels: - sig/network diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go index da14ea9b5cc5..e5ca3efec40a 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_block.go @@ -107,9 +107,9 @@ func (m *csiBlockMapper) GetGlobalMapPath(spec *volume.Spec) (string, error) { return dir, nil } -// getStagingPath returns a staging path for a directory (on the node) that should be used on NodeStageVolume/NodeUnstageVolume +// GetStagingPath returns a staging path for a directory (on the node) that should be used on NodeStageVolume/NodeUnstageVolume // Example: plugins/kubernetes.io/csi/volumeDevices/staging/{specName} -func (m *csiBlockMapper) getStagingPath() string { +func (m *csiBlockMapper) GetStagingPath() string { return filepath.Join(m.plugin.host.GetVolumeDevicePluginDir(CSIPluginName), "staging", m.specName) } @@ -143,7 +143,7 @@ func (m *csiBlockMapper) stageVolumeForBlock( ) (string, error) { klog.V(4).Infof(log("blockMapper.stageVolumeForBlock called")) - stagingPath := m.getStagingPath() + stagingPath := m.GetStagingPath() klog.V(4).Infof(log("blockMapper.stageVolumeForBlock stagingPath set [%s]", stagingPath)) // Check whether "STAGE_UNSTAGE_VOLUME" is set @@ -237,7 +237,7 @@ func (m *csiBlockMapper) publishVolumeForBlock( ctx, m.volumeID, m.readOnly, - m.getStagingPath(), + m.GetStagingPath(), publishPath, accessMode, publishVolumeInfo, @@ -255,26 +255,26 @@ func (m *csiBlockMapper) publishVolumeForBlock( } // SetUpDevice ensures the device is attached returns path where the device is located. -func (m *csiBlockMapper) SetUpDevice() error { +func (m *csiBlockMapper) SetUpDevice() (string, error) { if !m.plugin.blockEnabled { - return errors.New("CSIBlockVolume feature not enabled") + return "", errors.New("CSIBlockVolume feature not enabled") } klog.V(4).Infof(log("blockMapper.SetUpDevice called")) // Get csiSource from spec if m.spec == nil { - return errors.New(log("blockMapper.SetUpDevice spec is nil")) + return "", errors.New(log("blockMapper.SetUpDevice spec is nil")) } csiSource, err := getCSISourceFromSpec(m.spec) if err != nil { - return errors.New(log("blockMapper.SetUpDevice failed to get CSI persistent source: %v", err)) + return "", errors.New(log("blockMapper.SetUpDevice failed to get CSI persistent source: %v", err)) } driverName := csiSource.Driver skip, err := m.plugin.skipAttach(driverName) if err != nil { - return errors.New(log("blockMapper.SetupDevice failed to check CSIDriver for %s: %v", driverName, err)) + return "", errors.New(log("blockMapper.SetupDevice failed to check CSIDriver for %s: %v", driverName, err)) } var attachment *storage.VolumeAttachment @@ -284,7 +284,7 @@ func (m *csiBlockMapper) SetUpDevice() error { attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName) attachment, err = m.k8s.StorageV1().VolumeAttachments().Get(context.TODO(), attachID, meta.GetOptions{}) if err != nil { - return errors.New(log("blockMapper.SetupDevice failed to get volume attachment [id=%v]: %v", attachID, err)) + return "", errors.New(log("blockMapper.SetupDevice failed to get volume attachment [id=%v]: %v", attachID, err)) } } @@ -299,11 +299,11 @@ func (m *csiBlockMapper) SetUpDevice() error { csiClient, err := m.csiClientGetter.Get() if err != nil { - return errors.New(log("blockMapper.SetUpDevice failed to get CSI client: %v", err)) + return "", errors.New(log("blockMapper.SetUpDevice failed to get CSI client: %v", err)) } // Call NodeStageVolume - _, err = m.stageVolumeForBlock(ctx, csiClient, accessMode, csiSource, attachment) + stagingPath, err := m.stageVolumeForBlock(ctx, csiClient, accessMode, csiSource, attachment) if err != nil { if volumetypes.IsOperationFinishedError(err) { cleanupErr := m.cleanupOrphanDeviceFiles() @@ -312,10 +312,10 @@ func (m *csiBlockMapper) SetUpDevice() error { klog.V(4).Infof("Failed to clean up block volume directory %s", cleanupErr) } } - return err + return "", err } - return nil + return stagingPath, nil } func (m *csiBlockMapper) MapPodDevice() (string, error) { @@ -435,7 +435,7 @@ func (m *csiBlockMapper) TearDownDevice(globalMapPath, devicePath string) error } // Call NodeUnstageVolume - stagingPath := m.getStagingPath() + stagingPath := m.GetStagingPath() if _, err := os.Stat(stagingPath); err != nil { if os.IsNotExist(err) { klog.V(4).Infof(log("blockMapper.TearDownDevice stagingPath(%s) has already been deleted, skip calling NodeUnstageVolume", stagingPath)) @@ -471,7 +471,7 @@ func (m *csiBlockMapper) cleanupOrphanDeviceFiles() error { // Remove artifacts of NodeStage. // stagingPath: xxx/plugins/kubernetes.io/csi/volumeDevices/staging/ - stagingPath := m.getStagingPath() + stagingPath := m.GetStagingPath() if err := os.Remove(stagingPath); err != nil && !os.IsNotExist(err) { return errors.New(log("failed to delete volume staging path [%s]: %v", stagingPath, err)) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go index bb336691c0ee..9c06736f7902 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/csi_client.go @@ -54,7 +54,7 @@ type csiClient interface { fsType string, mountOptions []string, ) error - NodeExpandVolume(ctx context.Context, volumeid, volumePath string, newSize resource.Quantity) (resource.Quantity, error) + NodeExpandVolume(ctx context.Context, rsOpts csiResizeOptions) (resource.Quantity, error) NodeUnpublishVolume( ctx context.Context, volID string, @@ -95,6 +95,20 @@ type csiDriverClient struct { nodeV1ClientCreator nodeV1ClientCreator } +type csiResizeOptions struct { + volumeID string + // volumePath is path where volume is available. It could be: + // - path where node is staged if NodeExpandVolume is called after NodeStageVolume + // - path where volume is published if NodeExpandVolume is called after NodePublishVolume + // DEPRECATION NOTICE: in future NodeExpandVolume will be always called after NodePublish + volumePath string + stagingTargetPath string + fsType string + accessMode api.PersistentVolumeAccessMode + newSize resource.Quantity + mountOptions []string +} + var _ csiClient = &csiDriverClient{} type nodeV1ClientCreator func(addr csiAddr) ( @@ -245,36 +259,61 @@ func (c *csiDriverClient) NodePublishVolume( return err } -func (c *csiDriverClient) NodeExpandVolume(ctx context.Context, volumeID, volumePath string, newSize resource.Quantity) (resource.Quantity, error) { +func (c *csiDriverClient) NodeExpandVolume(ctx context.Context, opts csiResizeOptions) (resource.Quantity, error) { if c.nodeV1ClientCreator == nil { - return newSize, fmt.Errorf("version of CSI driver does not support volume expansion") + return opts.newSize, fmt.Errorf("version of CSI driver does not support volume expansion") } - if volumeID == "" { - return newSize, errors.New("missing volume id") + if opts.volumeID == "" { + return opts.newSize, errors.New("missing volume id") } - if volumePath == "" { - return newSize, errors.New("missing volume path") + if opts.volumePath == "" { + return opts.newSize, errors.New("missing volume path") } - if newSize.Value() < 0 { - return newSize, errors.New("size can not be less than 0") + if opts.newSize.Value() < 0 { + return opts.newSize, errors.New("size can not be less than 0") } nodeClient, closer, err := c.nodeV1ClientCreator(c.addr) if err != nil { - return newSize, err + return opts.newSize, err } defer closer.Close() req := &csipbv1.NodeExpandVolumeRequest{ - VolumeId: volumeID, - VolumePath: volumePath, - CapacityRange: &csipbv1.CapacityRange{RequiredBytes: newSize.Value()}, + VolumeId: opts.volumeID, + VolumePath: opts.volumePath, + CapacityRange: &csipbv1.CapacityRange{RequiredBytes: opts.newSize.Value()}, + VolumeCapability: &csipbv1.VolumeCapability{ + AccessMode: &csipbv1.VolumeCapability_AccessMode{ + Mode: asCSIAccessModeV1(opts.accessMode), + }, + }, + } + + // not all CSI drivers support NodeStageUnstage and hence the StagingTargetPath + // should only be set when available + if opts.stagingTargetPath != "" { + req.StagingTargetPath = opts.stagingTargetPath } + + if opts.fsType == fsTypeBlockName { + req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Block{ + Block: &csipbv1.VolumeCapability_BlockVolume{}, + } + } else { + req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Mount{ + Mount: &csipbv1.VolumeCapability_MountVolume{ + FsType: opts.fsType, + MountFlags: opts.mountOptions, + }, + } + } + resp, err := nodeClient.NodeExpandVolume(ctx, req) if err != nil { - return newSize, err + return opts.newSize, err } updatedQuantity := resource.NewQuantity(resp.CapacityBytes, resource.BinarySI) return *updatedQuantity, nil diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go index 8bb1718d98cd..aac2e31e059f 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/csi/expander.go @@ -94,12 +94,34 @@ func (c *csiPlugin) nodeExpandWithClient( return false, nil } - volumeTargetPath := resizeOptions.DeviceMountPath + pv := resizeOptions.VolumeSpec.PersistentVolume + if pv == nil { + return false, fmt.Errorf("Expander.NodeExpand failed to find associated PersistentVolume for plugin %s", c.GetPluginName()) + } + + opts := csiResizeOptions{ + volumePath: resizeOptions.DeviceMountPath, + stagingTargetPath: resizeOptions.DeviceStagePath, + volumeID: csiSource.VolumeHandle, + newSize: resizeOptions.NewSize, + fsType: csiSource.FSType, + accessMode: api.ReadWriteOnce, + mountOptions: pv.Spec.MountOptions, + } + if !fsVolume { - volumeTargetPath = resizeOptions.DevicePath + // for block volumes the volumePath in CSI NodeExpandvolumeRequest is + // basically same as DevicePath because block devices are not mounted and hence + // DeviceMountPath does not get populated in resizeOptions.DeviceMountPath + opts.volumePath = resizeOptions.DevicePath + opts.fsType = fsTypeBlockName + } + + if pv.Spec.AccessModes != nil { + opts.accessMode = pv.Spec.AccessModes[0] } - _, err = csClient.NodeExpandVolume(ctx, csiSource.VolumeHandle, volumeTargetPath, resizeOptions.NewSize) + _, err = csClient.NodeExpandVolume(ctx, opts) if err != nil { return false, fmt.Errorf("Expander.NodeExpand failed to expand the volume : %v", err) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi_util.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi_util.go index 986c2381a2b4..405ebf296eb7 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi_util.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/iscsi/iscsi_util.go @@ -491,6 +491,22 @@ func (util *ISCSIUtil) persistISCSI(b iscsiDiskMounter) error { klog.Errorf("iscsi: failed to mkdir %s, error", globalPDPath) return err } + + if b.volumeMode == v1.PersistentVolumeFilesystem { + notMnt, err := b.mounter.IsLikelyNotMountPoint(globalPDPath) + if err != nil { + return err + } + if !notMnt { + // The volume is already mounted, therefore the previous WaitForAttach must have + // persisted the volume metadata. In addition, the metadata is actually *inside* + // globalPDPath and we can't write it here, because it was shadowed by the volume + // mount. + klog.V(4).Infof("Skipping persistISCSI, the volume is already mounted at %s", globalPDPath) + return nil + } + } + // Persist iscsi disk config to json file for DetachDisk path return util.persistISCSIFile(*(b.iscsiDisk), globalPDPath) } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/local/local.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/local/local.go index 09ec2f202c87..8e4ae6f55cac 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/local/local.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/local/local.go @@ -610,8 +610,8 @@ var _ volume.BlockVolumeMapper = &localVolumeMapper{} var _ volume.CustomBlockVolumeMapper = &localVolumeMapper{} // SetUpDevice prepares the volume to the node by the plugin specific way. -func (m *localVolumeMapper) SetUpDevice() error { - return nil +func (m *localVolumeMapper) SetUpDevice() (string, error) { + return "", nil } // MapPodDevice provides physical device path for the local PV. @@ -621,6 +621,11 @@ func (m *localVolumeMapper) MapPodDevice() (string, error) { return globalPath, nil } +// GetStagingPath returns +func (m *localVolumeMapper) GetStagingPath() string { + return "" +} + // localVolumeUnmapper implements the BlockVolumeUnmapper interface for local volumes. type localVolumeUnmapper struct { *localVolume diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/plugins.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/plugins.go index c4546a4452d5..9feccd04286a 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/plugins.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/plugins.go @@ -115,6 +115,9 @@ type NodeResizeOptions struct { // it would be location where volume was mounted for the pod DeviceMountPath string + // DeviceStagingPath stores location where the volume is staged + DeviceStagePath string + NewSize resource.Quantity OldSize resource.Quantity diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go index 20de5472022d..3ed3f683bfba 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/attacher.go @@ -207,7 +207,7 @@ var _ volume.DeviceUnmounter = &rbdDetacher{} // This method is idempotent, callers are responsible for retrying on failure. func (detacher *rbdDetacher) UnmountDevice(deviceMountPath string) error { if pathExists, pathErr := mount.PathExists(deviceMountPath); pathErr != nil { - return fmt.Errorf("Error checking if path exists: %v", pathErr) + return fmt.Errorf("error checking if path exists: %v", pathErr) } else if !pathExists { klog.Warningf("Warning: Unmount skipped because path does not exist: %v", deviceMountPath) return nil diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go index 5702f9d5b2db..2de06c714fd3 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd.go @@ -37,7 +37,6 @@ import ( "k8s.io/apimachinery/pkg/util/uuid" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/volume" - "k8s.io/kubernetes/pkg/volume/util" volutil "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumepathhandler" ) @@ -199,7 +198,7 @@ func (plugin *rbdPlugin) ExpandVolumeDevice(spec *volume.Spec, newSize resource. } func (plugin *rbdPlugin) NodeExpand(resizeOptions volume.NodeResizeOptions) (bool, error) { - fsVolume, err := util.CheckVolumeModeFilesystem(resizeOptions.VolumeSpec) + fsVolume, err := volutil.CheckVolumeModeFilesystem(resizeOptions.VolumeSpec) if err != nil { return false, fmt.Errorf("error checking VolumeMode: %v", err) } @@ -268,11 +267,11 @@ func (plugin *rbdPlugin) createMounterFromVolumeSpecAndPod(spec *volume.Spec, po // if secret is provideded, retrieve it kubeClient := plugin.host.GetKubeClient() if kubeClient == nil { - return nil, fmt.Errorf("Cannot get kube client") + return nil, fmt.Errorf("cannot get kube client") } secrets, err := kubeClient.CoreV1().Secrets(secretNs).Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { - err = fmt.Errorf("Couldn't get secret %v/%v err: %v", secretNs, secretName, err) + err = fmt.Errorf("couldn't get secret %v/%v err: %v", secretNs, secretName, err) return nil, err } for _, data := range secrets.Data { @@ -301,11 +300,11 @@ func (plugin *rbdPlugin) NewMounter(spec *volume.Spec, pod *v1.Pod, _ volume.Vol // if secret is provideded, retrieve it kubeClient := plugin.host.GetKubeClient() if kubeClient == nil { - return nil, fmt.Errorf("Cannot get kube client") + return nil, fmt.Errorf("cannot get kube client") } secrets, err := kubeClient.CoreV1().Secrets(secretNs).Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { - err = fmt.Errorf("Couldn't get secret %v/%v err: %v", secretNs, secretName, err) + err = fmt.Errorf("couldn't get secret %v/%v err: %v", secretNs, secretName, err) return nil, err } for _, data := range secrets.Data { @@ -483,11 +482,11 @@ func (plugin *rbdPlugin) NewBlockVolumeMapper(spec *volume.Spec, pod *v1.Pod, _ // if secret is provideded, retrieve it kubeClient := plugin.host.GetKubeClient() if kubeClient == nil { - return nil, fmt.Errorf("Cannot get kube client") + return nil, fmt.Errorf("cannot get kube client") } secrets, err := kubeClient.CoreV1().Secrets(secretNs).Get(context.TODO(), secretName, metav1.GetOptions{}) if err != nil { - err = fmt.Errorf("Couldn't get secret %v/%v err: %v", secretNs, secretName, err) + err = fmt.Errorf("couldn't get secret %v/%v err: %v", secretNs, secretName, err) return nil, err } for _, data := range secrets.Data { @@ -862,7 +861,7 @@ func (c *rbdUnmounter) TearDown() error { func (c *rbdUnmounter) TearDownAt(dir string) error { klog.V(4).Infof("rbd: attempting to teardown at %s", dir) if pathExists, pathErr := mount.PathExists(dir); pathErr != nil { - return fmt.Errorf("Error checking if path exists: %v", pathErr) + return fmt.Errorf("error checking if path exists: %v", pathErr) } else if !pathExists { klog.Warningf("Warning: Unmount skipped because path does not exist: %v", dir) return nil @@ -996,7 +995,7 @@ func getVolumeSourceMonitors(spec *volume.Spec) ([]string, error) { return spec.PersistentVolume.Spec.RBD.CephMonitors, nil } - return nil, fmt.Errorf("Spec does not reference a RBD volume type") + return nil, fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourceImage(spec *volume.Spec) (string, error) { @@ -1007,7 +1006,7 @@ func getVolumeSourceImage(spec *volume.Spec) (string, error) { return spec.PersistentVolume.Spec.RBD.RBDImage, nil } - return "", fmt.Errorf("Spec does not reference a RBD volume type") + return "", fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourceFSType(spec *volume.Spec) (string, error) { @@ -1018,7 +1017,7 @@ func getVolumeSourceFSType(spec *volume.Spec) (string, error) { return spec.PersistentVolume.Spec.RBD.FSType, nil } - return "", fmt.Errorf("Spec does not reference a RBD volume type") + return "", fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourcePool(spec *volume.Spec) (string, error) { @@ -1029,7 +1028,7 @@ func getVolumeSourcePool(spec *volume.Spec) (string, error) { return spec.PersistentVolume.Spec.RBD.RBDPool, nil } - return "", fmt.Errorf("Spec does not reference a RBD volume type") + return "", fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourceUser(spec *volume.Spec) (string, error) { @@ -1040,7 +1039,7 @@ func getVolumeSourceUser(spec *volume.Spec) (string, error) { return spec.PersistentVolume.Spec.RBD.RadosUser, nil } - return "", fmt.Errorf("Spec does not reference a RBD volume type") + return "", fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourceKeyRing(spec *volume.Spec) (string, error) { @@ -1051,7 +1050,7 @@ func getVolumeSourceKeyRing(spec *volume.Spec) (string, error) { return spec.PersistentVolume.Spec.RBD.Keyring, nil } - return "", fmt.Errorf("Spec does not reference a RBD volume type") + return "", fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeSourceReadOnly(spec *volume.Spec) (bool, error) { @@ -1064,7 +1063,7 @@ func getVolumeSourceReadOnly(spec *volume.Spec) (bool, error) { return spec.ReadOnly, nil } - return false, fmt.Errorf("Spec does not reference a RBD volume type") + return false, fmt.Errorf("spec does not reference a RBD volume type") } func getVolumeAccessModes(spec *volume.Spec) ([]v1.PersistentVolumeAccessMode, error) { @@ -1073,7 +1072,7 @@ func getVolumeAccessModes(spec *volume.Spec) ([]v1.PersistentVolumeAccessMode, e if spec.PersistentVolume.Spec.RBD != nil { return spec.PersistentVolume.Spec.AccessModes, nil } - return nil, fmt.Errorf("Spec does not reference a RBD volume type") + return nil, fmt.Errorf("spec does not reference a RBD volume type") } return nil, nil @@ -1124,5 +1123,5 @@ func getSecretNameAndNamespace(spec *volume.Spec, defaultNamespace string) (stri } return "", "", nil } - return "", "", fmt.Errorf("Spec does not reference an RBD volume type") + return "", "", fmt.Errorf("spec does not reference an RBD volume type") } diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd_util.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd_util.go index 1db829b50957..4c001cb704b1 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd_util.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/rbd/rbd_util.go @@ -373,7 +373,7 @@ func (util *rbdUtil) AttachDisk(b rbdMounter) (string, error) { globalPDPath := util.MakeGlobalPDName(*b.rbd) if pathExists, pathErr := mount.PathExists(globalPDPath); pathErr != nil { - return "", fmt.Errorf("Error checking if path exists: %v", pathErr) + return "", fmt.Errorf("error checking if path exists: %v", pathErr) } else if !pathExists { if err := os.MkdirAll(globalPDPath, 0750); err != nil { return "", err @@ -459,7 +459,7 @@ func (util *rbdUtil) AttachDisk(b rbdMounter) (string, error) { devicePath, mapped = waitForPath(b.Pool, b.Image, 10 /*maxRetries*/, false /*useNbdDriver*/) } if !mapped { - return "", fmt.Errorf("Could not map image %s/%s, Timeout after 10s", b.Pool, b.Image) + return "", fmt.Errorf("could not map image %s/%s, Timeout after 10s", b.Pool, b.Image) } } return devicePath, nil @@ -515,7 +515,7 @@ func (util *rbdUtil) DetachDisk(plugin *rbdPlugin, deviceMountPath string, devic func (util *rbdUtil) DetachBlockDisk(disk rbdDiskUnmapper, mapPath string) error { if pathExists, pathErr := mount.PathExists(mapPath); pathErr != nil { - return fmt.Errorf("Error checking if path exists: %v", pathErr) + return fmt.Errorf("error checking if path exists: %v", pathErr) } else if !pathExists { klog.Warningf("Warning: Unmap skipped because path does not exist: %v", mapPath) return nil @@ -803,7 +803,7 @@ func (util *rbdUtil) rbdStatus(b *rbdMounter) (bool, string, error) { func getRbdImageInfo(deviceMountPath string) (*rbdImageInfo, error) { deviceMountedPathSeps := strings.Split(filepath.Base(deviceMountPath), "-image-") if len(deviceMountedPathSeps) != 2 { - return nil, fmt.Errorf("Can't found devicePath for %s ", deviceMountPath) + return nil, fmt.Errorf("can't found devicePath for %s ", deviceMountPath) } return &rbdImageInfo{ pool: deviceMountedPathSeps[0], diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go index e25008104547..7756578b808c 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/util/operationexecutor/operation_generator.go @@ -603,7 +603,12 @@ func (og *operationGenerator) GenerateMountVolumeFunc( return volumeToMount.GenerateError("MountVolume.MarkDeviceAsMounted failed", markDeviceMountedErr) } + // If volume expansion is performed after MountDevice but before SetUp then + // deviceMountPath and deviceStagePath is going to be the same. + // Deprecation: Calling NodeExpandVolume after NodeStage/MountDevice will be deprecated + // in a future version of k8s. resizeOptions.DeviceMountPath = deviceMountPath + resizeOptions.DeviceStagePath = deviceMountPath resizeOptions.CSIVolumePhase = volume.CSIVolumeStaged // NodeExpandVolume will resize the file system if user has requested a resize of @@ -946,6 +951,7 @@ func (og *operationGenerator) GenerateMapVolumeFunc( mapVolumeFunc := func() (simpleErr error, detailedErr error) { var devicePath string + var stagingPath string // Set up global map path under the given plugin directory using symbolic link globalMapPath, err := blockVolumeMapper.GetGlobalMapPath(volumeToMount.VolumeSpec) @@ -969,7 +975,8 @@ func (og *operationGenerator) GenerateMapVolumeFunc( } // Call SetUpDevice if blockVolumeMapper implements CustomBlockVolumeMapper if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok { - mapErr := customBlockVolumeMapper.SetUpDevice() + var mapErr error + stagingPath, mapErr = customBlockVolumeMapper.SetUpDevice() if mapErr != nil { og.markDeviceErrorState(volumeToMount, devicePath, globalMapPath, mapErr, actualStateOfWorld) // On failure, return error. Caller will log and retry. @@ -1072,8 +1079,9 @@ func (og *operationGenerator) GenerateMapVolumeFunc( klog.V(verbosity).Infof(detailedMsg) resizeOptions := volume.NodeResizeOptions{ - DevicePath: devicePath, - CSIVolumePhase: volume.CSIVolumePublished, + DevicePath: devicePath, + DeviceStagePath: stagingPath, + CSIVolumePhase: volume.CSIVolumePublished, } _, resizeError := og.nodeExpandVolume(volumeToMount, resizeOptions) if resizeError != nil { @@ -1490,40 +1498,64 @@ func (og *operationGenerator) GenerateExpandInUseVolumeFunc( var simpleErr, detailedErr error resizeOptions := volume.NodeResizeOptions{ VolumeSpec: volumeToMount.VolumeSpec, + DevicePath: volumeToMount.DevicePath, + } + fsVolume, err := util.CheckVolumeModeFilesystem(volumeToMount.VolumeSpec) + if err != nil { + return volumeToMount.GenerateError("NodeExpandvolume.CheckVolumeModeFilesystem failed", err) } - attachableVolumePlugin, _ := - og.volumePluginMgr.FindAttachablePluginBySpec(volumeToMount.VolumeSpec) + if fsVolume { + volumeMounter, newMounterErr := volumePlugin.NewMounter( + volumeToMount.VolumeSpec, + volumeToMount.Pod, + volume.VolumeOptions{}) + if newMounterErr != nil { + return volumeToMount.GenerateError("NodeExpandVolume.NewMounter initialization failed", newMounterErr) + } - if attachableVolumePlugin != nil { - volumeAttacher, _ := attachableVolumePlugin.NewAttacher() - if volumeAttacher != nil { - resizeOptions.CSIVolumePhase = volume.CSIVolumeStaged - resizeOptions.DevicePath = volumeToMount.DevicePath - dmp, err := volumeAttacher.GetDeviceMountPath(volumeToMount.VolumeSpec) + resizeOptions.DeviceMountPath = volumeMounter.GetPath() + + deviceMountableVolumePlugin, _ := og.volumePluginMgr.FindDeviceMountablePluginBySpec(volumeToMount.VolumeSpec) + var volumeDeviceMounter volume.DeviceMounter + if deviceMountableVolumePlugin != nil { + volumeDeviceMounter, _ = deviceMountableVolumePlugin.NewDeviceMounter() + } + + if volumeDeviceMounter != nil { + deviceStagePath, err := volumeDeviceMounter.GetDeviceMountPath(volumeToMount.VolumeSpec) if err != nil { return volumeToMount.GenerateError("NodeExpandVolume.GetDeviceMountPath failed", err) } - resizeOptions.DeviceMountPath = dmp - resizeDone, simpleErr, detailedErr = og.doOnlineExpansion(volumeToMount, actualStateOfWorld, resizeOptions) - if simpleErr != nil || detailedErr != nil { - return simpleErr, detailedErr - } - if resizeDone { - return nil, nil - } + resizeOptions.DeviceStagePath = deviceStagePath + } + } else { + // Get block volume mapper plugin + blockVolumePlugin, err := + og.volumePluginMgr.FindMapperPluginBySpec(volumeToMount.VolumeSpec) + if err != nil { + return volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed", err) + } + + if blockVolumePlugin == nil { + return volumeToMount.GenerateError("MapVolume.FindMapperPluginBySpec failed to find BlockVolumeMapper plugin. Volume plugin is nil.", nil) + } + + blockVolumeMapper, newMapperErr := blockVolumePlugin.NewBlockVolumeMapper( + volumeToMount.VolumeSpec, + volumeToMount.Pod, + volume.VolumeOptions{}) + if newMapperErr != nil { + return volumeToMount.GenerateError("MapVolume.NewBlockVolumeMapper initialization failed", newMapperErr) + } + + // if plugin supports custom mappers lets add DeviceStagePath + if customBlockVolumeMapper, ok := blockVolumeMapper.(volume.CustomBlockVolumeMapper); ok { + resizeOptions.DeviceStagePath = customBlockVolumeMapper.GetStagingPath() } - } - // if we are here that means volume plugin does not support attach interface - volumeMounter, newMounterErr := volumePlugin.NewMounter( - volumeToMount.VolumeSpec, - volumeToMount.Pod, - volume.VolumeOptions{}) - if newMounterErr != nil { - return volumeToMount.GenerateError("NodeExpandVolume.NewMounter initialization failed", newMounterErr) } - resizeOptions.DeviceMountPath = volumeMounter.GetPath() + // if we are doing online expansion then volume is already published resizeOptions.CSIVolumePhase = volume.CSIVolumePublished resizeDone, simpleErr, detailedErr = og.doOnlineExpansion(volumeToMount, actualStateOfWorld, resizeOptions) if simpleErr != nil || detailedErr != nil { diff --git a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/volume.go b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/volume.go index 9a2f08403d49..85b8c4aaa525 100644 --- a/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/volume.go +++ b/cluster-autoscaler/vendor/k8s.io/kubernetes/pkg/volume/volume.go @@ -174,14 +174,19 @@ type CustomBlockVolumeMapper interface { // For most in-tree plugins, attacher.Attach() and attacher.WaitForAttach() // will do necessary works. // This may be called more than once, so implementations must be idempotent. - SetUpDevice() error + // SetUpDevice returns stagingPath if device setup was successful + SetUpDevice() (stagingPath string, err error) // MapPodDevice maps the block device to a path and return the path. // Unique device path across kubelet node reboot is required to avoid // unexpected block volume destruction. // If empty string is returned, the path retuned by attacher.Attach() and // attacher.WaitForAttach() will be used. - MapPodDevice() (string, error) + MapPodDevice() (publishPath string, err error) + + // GetStagingPath returns path that was used for staging the volume + // it is mainly used by CSI plugins + GetStagingPath() string } // BlockVolumeUnmapper interface is an unmapper interface for block volume. diff --git a/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_instances.go b/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_instances.go index 53c582761261..b06c16a618c0 100644 --- a/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_instances.go +++ b/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_instances.go @@ -21,7 +21,7 @@ package azure import ( "context" "fmt" - "strconv" + "os" "strings" v1 "k8s.io/api/core/v1" @@ -36,6 +36,10 @@ const ( vmPowerStateStopped = "stopped" vmPowerStateDeallocated = "deallocated" vmPowerStateDeallocating = "deallocating" + + // nodeNameEnvironmentName is the environment variable name for getting node name. + // It is only used for out-of-tree cloud provider. + nodeNameEnvironmentName = "NODE_NAME" ) var ( @@ -310,17 +314,20 @@ func (az *Cloud) InstanceMetadataByProviderID(ctx context.Context, providerID st } func (az *Cloud) isCurrentInstance(name types.NodeName, metadataVMName string) (bool, error) { + var err error nodeName := mapNodeNameToVMName(name) + // VMSS vmName is not same with hostname, use hostname instead. if az.VMType == vmTypeVMSS { - // VMSS vmName is not same with hostname, construct the node name "{computer-name-prefix}{base-36-instance-id}". - // Refer https://docs.microsoft.com/en-us/azure/virtual-machine-scale-sets/virtual-machine-scale-sets-instance-ids#scale-set-vm-computer-name. - if ssName, instanceID, err := extractVmssVMName(metadataVMName); err == nil { - instance, err := strconv.ParseInt(instanceID, 10, 64) - if err != nil { - return false, fmt.Errorf("failed to parse VMSS instanceID %q: %v", instanceID, err) - } - metadataVMName = fmt.Sprintf("%s%06s", ssName, strconv.FormatInt(instance, 36)) + metadataVMName, err = os.Hostname() + if err != nil { + return false, err + } + + // Use name from env variable "NODE_NAME" if it is set. + nodeNameEnv := os.Getenv(nodeNameEnvironmentName) + if nodeNameEnv != "" { + metadataVMName = nodeNameEnv } } diff --git a/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_routes.go b/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_routes.go index a698db612350..d6797b28088d 100644 --- a/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_routes.go +++ b/cluster-autoscaler/vendor/k8s.io/legacy-cloud-providers/azure/azure_routes.go @@ -29,6 +29,7 @@ import ( "github.com/Azure/go-autorest/autorest/to" "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" cloudprovider "k8s.io/cloud-provider" "k8s.io/klog/v2" azcache "k8s.io/legacy-cloud-providers/azure/cache" @@ -90,9 +91,12 @@ func newDelayedRouteUpdater(az *Cloud, interval time.Duration) *delayedRouteUpda // run starts the updater reconciling loop. func (d *delayedRouteUpdater) run() { - for { + err := wait.PollImmediateInfinite(d.interval, func() (bool, error) { d.updateRoutes() - time.Sleep(d.interval) + return false, nil + }) + if err != nil { // this should never happen, if it does, panic + panic(err) } } diff --git a/cluster-autoscaler/vendor/modules.txt b/cluster-autoscaler/vendor/modules.txt index 1ca644b626a5..ca7ae44af315 100644 --- a/cluster-autoscaler/vendor/modules.txt +++ b/cluster-autoscaler/vendor/modules.txt @@ -159,12 +159,13 @@ github.com/containerd/containerd/namespaces github.com/containerd/containerd/pkg/dialer # github.com/containerd/ttrpc v1.0.0 => github.com/containerd/ttrpc v1.0.0 github.com/containerd/ttrpc -# github.com/containernetworking/cni v0.7.1 => github.com/containernetworking/cni v0.7.1 +# github.com/containernetworking/cni v0.8.0 => github.com/containernetworking/cni v0.8.0 github.com/containernetworking/cni/libcni github.com/containernetworking/cni/pkg/invoke github.com/containernetworking/cni/pkg/types github.com/containernetworking/cni/pkg/types/020 github.com/containernetworking/cni/pkg/types/current +github.com/containernetworking/cni/pkg/utils github.com/containernetworking/cni/pkg/version # github.com/coreos/go-semver v0.3.0 => github.com/coreos/go-semver v0.3.0 github.com/coreos/go-semver/semver @@ -232,7 +233,7 @@ github.com/fsnotify/fsnotify # github.com/ghodss/yaml v1.0.0 => github.com/ghodss/yaml v1.0.0 ## explicit github.com/ghodss/yaml -# github.com/go-logr/logr v0.1.0 => github.com/go-logr/logr v0.1.0 +# github.com/go-logr/logr v0.2.0 => github.com/go-logr/logr v0.2.0 github.com/go-logr/logr # github.com/go-openapi/jsonpointer v0.19.3 => github.com/go-openapi/jsonpointer v0.19.3 github.com/go-openapi/jsonpointer @@ -606,6 +607,7 @@ golang.org/x/crypto/pkcs12 golang.org/x/crypto/pkcs12/internal/rc2 golang.org/x/crypto/ssh/terminal # golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e => golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e +## explicit golang.org/x/net/bpf golang.org/x/net/context golang.org/x/net/context/ctxhttp @@ -768,7 +770,7 @@ gopkg.in/warnings.v0 # gopkg.in/yaml.v2 v2.2.8 => gopkg.in/yaml.v2 v2.2.8 ## explicit gopkg.in/yaml.v2 -# k8s.io/api v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/api +# k8s.io/api v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/api ## explicit k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -794,6 +796,7 @@ k8s.io/api/coordination/v1beta1 k8s.io/api/core/v1 k8s.io/api/discovery/v1alpha1 k8s.io/api/discovery/v1beta1 +k8s.io/api/events/v1 k8s.io/api/events/v1beta1 k8s.io/api/extensions/v1beta1 k8s.io/api/flowcontrol/v1alpha1 @@ -812,7 +815,7 @@ k8s.io/api/settings/v1alpha1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apimachinery v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apimachinery +# k8s.io/apimachinery v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apimachinery ## explicit k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -872,7 +875,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apiserver +# k8s.io/apiserver v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apiserver ## explicit k8s.io/apiserver/pkg/admission k8s.io/apiserver/pkg/admission/configuration @@ -974,9 +977,10 @@ k8s.io/apiserver/pkg/util/wsstream k8s.io/apiserver/pkg/warning k8s.io/apiserver/plugin/pkg/authenticator/token/webhook k8s.io/apiserver/plugin/pkg/authorizer/webhook -# k8s.io/client-go v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/client-go +# k8s.io/client-go v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/client-go ## explicit k8s.io/client-go/discovery +k8s.io/client-go/discovery/cached/memory k8s.io/client-go/discovery/fake k8s.io/client-go/dynamic k8s.io/client-go/dynamic/dynamicinformer @@ -1010,6 +1014,7 @@ k8s.io/client-go/informers/discovery k8s.io/client-go/informers/discovery/v1alpha1 k8s.io/client-go/informers/discovery/v1beta1 k8s.io/client-go/informers/events +k8s.io/client-go/informers/events/v1 k8s.io/client-go/informers/events/v1beta1 k8s.io/client-go/informers/extensions k8s.io/client-go/informers/extensions/v1beta1 @@ -1085,6 +1090,8 @@ k8s.io/client-go/kubernetes/typed/discovery/v1alpha1 k8s.io/client-go/kubernetes/typed/discovery/v1alpha1/fake k8s.io/client-go/kubernetes/typed/discovery/v1beta1 k8s.io/client-go/kubernetes/typed/discovery/v1beta1/fake +k8s.io/client-go/kubernetes/typed/events/v1 +k8s.io/client-go/kubernetes/typed/events/v1/fake k8s.io/client-go/kubernetes/typed/events/v1beta1 k8s.io/client-go/kubernetes/typed/events/v1beta1/fake k8s.io/client-go/kubernetes/typed/extensions/v1beta1 @@ -1139,6 +1146,7 @@ k8s.io/client-go/listers/coordination/v1beta1 k8s.io/client-go/listers/core/v1 k8s.io/client-go/listers/discovery/v1alpha1 k8s.io/client-go/listers/discovery/v1beta1 +k8s.io/client-go/listers/events/v1 k8s.io/client-go/listers/events/v1beta1 k8s.io/client-go/listers/extensions/v1beta1 k8s.io/client-go/listers/flowcontrol/v1alpha1 @@ -1168,7 +1176,9 @@ k8s.io/client-go/plugin/pkg/client/auth/exec k8s.io/client-go/rest k8s.io/client-go/rest/fake k8s.io/client-go/rest/watch +k8s.io/client-go/restmapper k8s.io/client-go/scale +k8s.io/client-go/scale/fake k8s.io/client-go/scale/scheme k8s.io/client-go/scale/scheme/appsint k8s.io/client-go/scale/scheme/appsv1beta1 @@ -1205,7 +1215,7 @@ k8s.io/client-go/util/homedir k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/cloud-provider v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cloud-provider +# k8s.io/cloud-provider v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cloud-provider ## explicit k8s.io/cloud-provider k8s.io/cloud-provider/api @@ -1214,7 +1224,7 @@ k8s.io/cloud-provider/service/helpers k8s.io/cloud-provider/volume k8s.io/cloud-provider/volume/errors k8s.io/cloud-provider/volume/helpers -# k8s.io/component-base v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/component-base +# k8s.io/component-base v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/component-base ## explicit k8s.io/component-base/cli/flag k8s.io/component-base/codec @@ -1233,13 +1243,13 @@ k8s.io/component-base/metrics/prometheus/restclient k8s.io/component-base/metrics/testutil k8s.io/component-base/version k8s.io/component-base/version/verflag -# k8s.io/cri-api v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cri-api +# k8s.io/cri-api v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cri-api k8s.io/cri-api/pkg/apis k8s.io/cri-api/pkg/apis/runtime/v1alpha2 -# k8s.io/csi-translation-lib v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/csi-translation-lib +# k8s.io/csi-translation-lib v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/csi-translation-lib k8s.io/csi-translation-lib k8s.io/csi-translation-lib/plugins -# k8s.io/klog/v2 v2.1.0 => k8s.io/klog/v2 v2.1.0 +# k8s.io/klog/v2 v2.2.0 => k8s.io/klog/v2 v2.2.0 ## explicit k8s.io/klog/v2 # k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 => k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 @@ -1249,19 +1259,19 @@ k8s.io/kube-openapi/pkg/handler k8s.io/kube-openapi/pkg/schemaconv k8s.io/kube-openapi/pkg/util k8s.io/kube-openapi/pkg/util/proto -# k8s.io/kube-proxy v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-proxy +# k8s.io/kube-proxy v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-proxy k8s.io/kube-proxy/config/v1alpha1 -# k8s.io/kube-scheduler v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-scheduler +# k8s.io/kube-scheduler v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-scheduler k8s.io/kube-scheduler/config/v1 k8s.io/kube-scheduler/config/v1beta1 k8s.io/kube-scheduler/extender/v1 -# k8s.io/kubectl v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubectl +# k8s.io/kubectl v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubectl k8s.io/kubectl/pkg/scale -# k8s.io/kubelet v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubelet +# k8s.io/kubelet v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubelet k8s.io/kubelet/config/v1beta1 k8s.io/kubelet/pkg/apis/deviceplugin/v1beta1 k8s.io/kubelet/pkg/apis/pluginregistration/v1 -# k8s.io/kubernetes v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes +# k8s.io/kubernetes v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes ## explicit k8s.io/kubernetes/cmd/kube-proxy/app k8s.io/kubernetes/cmd/kubelet/app @@ -1558,7 +1568,7 @@ k8s.io/kubernetes/pkg/volume/vsphere_volume k8s.io/kubernetes/pkg/windows/service k8s.io/kubernetes/test/utils k8s.io/kubernetes/third_party/forked/golang/expansion -# k8s.io/legacy-cloud-providers v0.0.0 => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/legacy-cloud-providers +# k8s.io/legacy-cloud-providers v0.0.0 => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/legacy-cloud-providers ## explicit k8s.io/legacy-cloud-providers/aws k8s.io/legacy-cloud-providers/azure @@ -1693,7 +1703,7 @@ sigs.k8s.io/yaml # github.com/containerd/go-runc => github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3 # github.com/containerd/ttrpc => github.com/containerd/ttrpc v1.0.0 # github.com/containerd/typeurl => github.com/containerd/typeurl v1.0.0 -# github.com/containernetworking/cni => github.com/containernetworking/cni v0.7.1 +# github.com/containernetworking/cni => github.com/containernetworking/cni v0.8.0 # github.com/coredns/corefile-migration => github.com/coredns/corefile-migration v1.0.8 # github.com/coreos/bbolt => github.com/coreos/bbolt v1.3.2 # github.com/coreos/etcd => github.com/coreos/etcd v3.3.10+incompatible @@ -1702,7 +1712,6 @@ sigs.k8s.io/yaml # github.com/coreos/go-systemd => github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e # github.com/coreos/go-systemd/v22 => github.com/coreos/go-systemd/v22 v22.1.0 # github.com/coreos/pkg => github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f -# github.com/cpuguy83/go-md2man => github.com/cpuguy83/go-md2man v1.0.10 # github.com/cpuguy83/go-md2man/v2 => github.com/cpuguy83/go-md2man/v2 v2.0.0 # github.com/creack/pty => github.com/creack/pty v1.1.7 # github.com/cyphar/filepath-securejoin => github.com/cyphar/filepath-securejoin v0.2.2 @@ -1736,7 +1745,7 @@ sigs.k8s.io/yaml # github.com/go-ini/ini => github.com/go-ini/ini v1.9.0 # github.com/go-kit/kit => github.com/go-kit/kit v0.9.0 # github.com/go-logfmt/logfmt => github.com/go-logfmt/logfmt v0.4.0 -# github.com/go-logr/logr => github.com/go-logr/logr v0.1.0 +# github.com/go-logr/logr => github.com/go-logr/logr v0.2.0 # github.com/go-openapi/analysis => github.com/go-openapi/analysis v0.19.5 # github.com/go-openapi/errors => github.com/go-openapi/errors v0.19.2 # github.com/go-openapi/jsonpointer => github.com/go-openapi/jsonpointer v0.19.3 @@ -1945,34 +1954,34 @@ sigs.k8s.io/yaml # gotest.tools => gotest.tools v2.2.0+incompatible # gotest.tools/v3 => gotest.tools/v3 v3.0.2 # honnef.co/go/tools => honnef.co/go/tools v0.0.1-2019.2.3 -# k8s.io/api => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/api -# k8s.io/apiextensions-apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apiextensions-apiserver -# k8s.io/apimachinery => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apimachinery -# k8s.io/apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/apiserver -# k8s.io/cli-runtime => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cli-runtime -# k8s.io/client-go => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/client-go -# k8s.io/cloud-provider => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cloud-provider -# k8s.io/cluster-bootstrap => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cluster-bootstrap -# k8s.io/code-generator => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/code-generator -# k8s.io/component-base => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/component-base -# k8s.io/controller-manager => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/controller-manager -# k8s.io/cri-api => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/cri-api -# k8s.io/csi-translation-lib => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/csi-translation-lib +# k8s.io/api => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/api +# k8s.io/apiextensions-apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apiextensions-apiserver +# k8s.io/apimachinery => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apimachinery +# k8s.io/apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/apiserver +# k8s.io/cli-runtime => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cli-runtime +# k8s.io/client-go => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/client-go +# k8s.io/cloud-provider => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cloud-provider +# k8s.io/cluster-bootstrap => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cluster-bootstrap +# k8s.io/code-generator => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/code-generator +# k8s.io/component-base => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/component-base +# k8s.io/controller-manager => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/controller-manager +# k8s.io/cri-api => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/cri-api +# k8s.io/csi-translation-lib => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/csi-translation-lib # k8s.io/gengo => k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14 # k8s.io/heapster => k8s.io/heapster v1.2.0-beta.1 -# k8s.io/klog/v2 => k8s.io/klog/v2 v2.1.0 -# k8s.io/kube-aggregator => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-aggregator -# k8s.io/kube-controller-manager => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-controller-manager +# k8s.io/klog/v2 => k8s.io/klog/v2 v2.2.0 +# k8s.io/kube-aggregator => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-aggregator +# k8s.io/kube-controller-manager => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-controller-manager # k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20200427153329-656914f816f9 -# k8s.io/kube-proxy => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-proxy -# k8s.io/kube-scheduler => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kube-scheduler -# k8s.io/kubectl => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubectl -# k8s.io/kubelet => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/kubelet -# k8s.io/legacy-cloud-providers => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/legacy-cloud-providers -# k8s.io/metrics => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/metrics -# k8s.io/sample-apiserver => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-apiserver -# k8s.io/sample-cli-plugin => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-cli-plugin -# k8s.io/sample-controller => /tmp/ca-update-vendor.qFYj/kubernetes/staging/src/k8s.io/sample-controller +# k8s.io/kube-proxy => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-proxy +# k8s.io/kube-scheduler => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kube-scheduler +# k8s.io/kubectl => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubectl +# k8s.io/kubelet => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/kubelet +# k8s.io/legacy-cloud-providers => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/legacy-cloud-providers +# k8s.io/metrics => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/metrics +# k8s.io/sample-apiserver => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-apiserver +# k8s.io/sample-cli-plugin => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-cli-plugin +# k8s.io/sample-controller => /tmp/ca-update-vendor.10L6/kubernetes/staging/src/k8s.io/sample-controller # k8s.io/system-validators => k8s.io/system-validators v1.1.2 # k8s.io/utils => k8s.io/utils v0.0.0-20200619165400-6e3d28b6ed19 # modernc.org/cc => modernc.org/cc v1.0.0 @@ -1988,4 +1997,4 @@ sigs.k8s.io/yaml # vbom.ml/util => vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc # github.com/digitalocean/godo => github.com/digitalocean/godo v1.27.0 # github.com/rancher/go-rancher => github.com/rancher/go-rancher v0.1.0 -# k8s.io/kubernetes => /tmp/ca-update-vendor.qFYj/kubernetes +# k8s.io/kubernetes => /tmp/ca-update-vendor.10L6/kubernetes