From 69171fd6b24a06597e1a0e25aeafa81285bb572e Mon Sep 17 00:00:00 2001 From: Gerrit Date: Fri, 15 Jan 2021 14:01:09 +0100 Subject: [PATCH] Add support for Lightbits duros storage. (#140) --- charts/images.yaml | 4 + .../templates/accounting-exporter.yaml | 13 - .../templates/duros-controller.yaml | 123 ++++++++ charts/internal/control-plane/values.yaml | 13 + charts/internal/crds-storage/Chart.yaml | 4 + .../storage.metal-stack.io_duros.yaml | 85 +++++ .../internal/metal-crds/charts/crds-storage | 1 + .../templates/network-policies.yaml | 21 ++ .../templates/rbac-duros.yaml | 118 +++++++ .../internal/shoot-control-plane/values.yaml | 4 + .../provider-metal/templates/configmap.yaml | 7 + charts/provider-metal/templates/rbac.yaml | 6 + charts/provider-metal/values.yaml | 4 + example/controller-registration.yaml | 4 +- go.mod | 17 +- go.sum | 44 ++- pkg/apis/config/types.go | 38 +++ pkg/apis/config/v1alpha1/types.go | 39 +++ .../v1alpha1/zz_generated.conversion.go | 142 +++++++++ .../config/v1alpha1/zz_generated.deepcopy.go | 83 +++++ pkg/apis/config/zz_generated.deepcopy.go | 83 +++++ pkg/apis/metal/install/install.go | 4 + pkg/apis/metal/types_infrastructure.go | 13 +- .../metal/v1alpha1/types_infrastructure.go | 13 +- .../metal/v1alpha1/zz_generated.conversion.go | 6 +- .../metal/v1alpha1/zz_generated.deepcopy.go | 5 - .../metal/validation/firewall_controller.go | 55 ++-- .../validation/firewall_controller_test.go | 39 +-- pkg/apis/metal/validation/infrastructure.go | 8 +- pkg/apis/metal/zz_generated.deepcopy.go | 5 - pkg/controller/controlplane/valuesprovider.go | 291 ++++++++++++++++-- pkg/imagevector/packrd/packed-packr.go | 28 +- pkg/metal/types.go | 3 + 33 files changed, 1174 insertions(+), 149 deletions(-) create mode 100644 charts/internal/control-plane/templates/duros-controller.yaml create mode 100644 charts/internal/crds-storage/Chart.yaml create mode 100644 charts/internal/crds-storage/templates/storage.metal-stack.io_duros.yaml create mode 120000 charts/internal/metal-crds/charts/crds-storage create mode 100644 charts/internal/shoot-control-plane/templates/rbac-duros.yaml diff --git a/charts/images.yaml b/charts/images.yaml index 1e9331bce..1dbe218c0 100644 --- a/charts/images.yaml +++ b/charts/images.yaml @@ -35,6 +35,10 @@ images: sourceRepository: https://github.com/metal-stack/kubernetes-splunk-audit-webhook repository: ghcr.io/metal-stack/kubernetes-splunk-audit-webhook tag: "v0.1.4" +- name: duros-controller + sourceRepository: https://github.com/metal-stack/duros-controller + repository: ghcr.io/metal-stack/duros-controller + tag: "v0.1.1" # firewall-controller tag must be semver compatible with golang dependency! - name: firewall-controller sourceRepository: https://github.com/metal-stack/firewall-controller diff --git a/charts/internal/control-plane/templates/accounting-exporter.yaml b/charts/internal/control-plane/templates/accounting-exporter.yaml index 6063d4a09..f8cc2cb8a 100644 --- a/charts/internal/control-plane/templates/accounting-exporter.yaml +++ b/charts/internal/control-plane/templates/accounting-exporter.yaml @@ -106,17 +106,4 @@ spec: ports: - protocol: TCP port: 9000 ---- -apiVersion: metal-stack.io/v1 -kind: ClusterwideNetworkPolicy -metadata: - name: egress-allow-accounting-api - namespace: firewall -spec: - egress: - - ports: - - port: 9000 - protocol: TCP - to: - - cidr: 0.0.0.0/0 {{- end }} diff --git a/charts/internal/control-plane/templates/duros-controller.yaml b/charts/internal/control-plane/templates/duros-controller.yaml new file mode 100644 index 000000000..4056d07dc --- /dev/null +++ b/charts/internal/control-plane/templates/duros-controller.yaml @@ -0,0 +1,123 @@ +{{- if .Values.duros.enabled }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: duros-controller + namespace: {{ .Release.Namespace }} +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: duros-controller + namespace: {{ .Release.Namespace }} +rules: +- apiGroups: + - storage.metal-stack.io + resources: + - duros + - duros/status + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - configmaps + verbs: + - create + - get + - update +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: duros-controller + namespace: {{ .Release.Namespace }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: duros-controller +subjects: +- kind: ServiceAccount + name: duros-controller + namespace: {{ .Release.Namespace }} +--- +apiVersion: v1 +kind: Secret +metadata: + labels: + app: duros-controller + name: duros-admin + namespace: {{ .Release.Namespace }} +type: Opaque +data: + admin-key: {{ required ".Values.duros.controller.adminKey is required" (b64enc .Values.duros.controller.adminKey) }} + admin-token: {{ required ".Values.duros.controller.adminToken is required" (b64enc .Values.duros.controller.adminToken) }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: duros-controller + namespace: {{ .Release.Namespace }} + labels: + app: duros-controller +spec: + selector: + matchLabels: + app: duros-controller + replicas: 1 + template: + metadata: + labels: + app: duros-controller + spec: + serviceAccountName: duros-controller + containers: + - name: duros-controller + args: + - -endpoints={{ join "," .Values.duros.controller.endpoints }} + - -namespace={{ .Release.Namespace }} + - -enable-leader-election + - -admin-token=/duros/admin-token + - -admin-key=/duros/admin-key + - -shoot-kubeconfig=/duros/client/kubeconfig + image: {{ index .Values.images "duros-controller" }} + imagePullPolicy: Always + resources: + limits: + cpu: 400m + memory: 100Mi + requests: + cpu: 100m + memory: 20Mi + volumeMounts: + - name: duros-admin + mountPath: /duros + - name: kubeconfig + mountPath: /duros/client + volumes: + - name: duros-admin + secret: + secretName: duros-admin + - name: kubeconfig + secret: + secretName: duros-controller +--- +apiVersion: storage.metal-stack.io/v1 +kind: Duros +metadata: + namespace: {{ .Release.Namespace }} + name: shoot-default-storage +spec: + metalProjectID: {{ required ".Values.duros.projectID is required" .Values.duros.projectID }} +{{- if .Values.duros.storageClasses }} + storageClasses: +{{ toYaml .Values.duros.storageClasses | indent 4 }} +{{- end }} +{{- end }} diff --git a/charts/internal/control-plane/values.yaml b/charts/internal/control-plane/values.yaml index 9e5c2be42..7f1fa3040 100644 --- a/charts/internal/control-plane/values.yaml +++ b/charts/internal/control-plane/values.yaml @@ -8,6 +8,7 @@ images: splunk-audit-webhook: image-repository:image-tag group-rolebinding-controller: image-repository:image-tag accounting-exporter: image-repository:image-tag + duros-controller: image-repository:image-tag cloudControllerManager: additionalParameters: [] @@ -82,3 +83,15 @@ accountingExporter: -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- + +duros: + enabled: false + storageClasses: [] + projectID: project-id + controller: + endpoints: + - ip:port + - ip:port + - ip:port + adminKey: KEY + adminToken: tok diff --git a/charts/internal/crds-storage/Chart.yaml b/charts/internal/crds-storage/Chart.yaml new file mode 100644 index 000000000..2367de55c --- /dev/null +++ b/charts/internal/crds-storage/Chart.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +description: Helm chart for Storage CRDs required by the extension-provider-metal +name: crds-storage +version: 0.1.0 diff --git a/charts/internal/crds-storage/templates/storage.metal-stack.io_duros.yaml b/charts/internal/crds-storage/templates/storage.metal-stack.io_duros.yaml new file mode 100644 index 000000000..559356e36 --- /dev/null +++ b/charts/internal/crds-storage/templates/storage.metal-stack.io_duros.yaml @@ -0,0 +1,85 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.0 + creationTimestamp: null + name: duros.storage.metal-stack.io +spec: + group: storage.metal-stack.io + names: + kind: Duros + listKind: DurosList + plural: duros + singular: duros + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.metalProjectID + name: ProjectID + type: string + - jsonPath: .spec.storageClasses + name: StorageClasses + type: string + name: v1 + schema: + openAPIV3Schema: + description: Duros is the Schema for the Duros API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: DurosSpec defines the desired state of Duros + properties: + metalProjectID: + description: MetalProjectID is the projectID of this deployment + type: string + storageClasses: + description: StorageClasses defines what storageclasses should be + deployed + items: + description: StorageClass defines the storageClass parameters + properties: + compression: + type: boolean + name: + type: string + replicas: + type: integer + required: + - compression + - name + - replicas + type: object + type: array + type: object + status: + description: DurosStatus defines the observed state of Duros + properties: + secret: + description: SecretRef to the create JWT Token TODO, this can be used + to detect required key rotation + type: string + type: object + type: object + served: true + storage: true + subresources: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/internal/metal-crds/charts/crds-storage b/charts/internal/metal-crds/charts/crds-storage new file mode 120000 index 000000000..a10afbc76 --- /dev/null +++ b/charts/internal/metal-crds/charts/crds-storage @@ -0,0 +1 @@ +../../crds-storage \ No newline at end of file diff --git a/charts/internal/shoot-control-plane/templates/network-policies.yaml b/charts/internal/shoot-control-plane/templates/network-policies.yaml index 3b9b948fe..cea8f25d3 100644 --- a/charts/internal/shoot-control-plane/templates/network-policies.yaml +++ b/charts/internal/shoot-control-plane/templates/network-policies.yaml @@ -67,3 +67,24 @@ spec: ports: - protocol: UDP port: 123 +{{- if .Values.duros.enabled }} +--- +apiVersion: metal-stack.io/v1 +kind: ClusterwideNetworkPolicy +metadata: + name: allow-to-storage + namespace: firewall +spec: + egress: + - ports: + - port: 443 + protocol: TCP + - port: 4420 + protocol: TCP + - port: 8009 + protocol: TCP + to: +{{ range $i, $endpoint := .Values.duros.endpoints }} + - cidr: {{ (split ":" $endpoint)._0 }}/32 +{{- end }} +{{- end }} diff --git a/charts/internal/shoot-control-plane/templates/rbac-duros.yaml b/charts/internal/shoot-control-plane/templates/rbac-duros.yaml new file mode 100644 index 000000000..97a4dd160 --- /dev/null +++ b/charts/internal/shoot-control-plane/templates/rbac-duros.yaml @@ -0,0 +1,118 @@ +{{- if .Values.duros.enabled }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: duros-controller +rules: +- apiGroups: + - storage.k8s.io + resources: + - storageclasses + verbs: + - create + - delete + - get + - list + - patch + - update +- apiGroups: + - "" + resources: + - secrets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - storage.k8s.io + resources: + - csidrivers + - csinodes + - volumeattachments + - storageclasses + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "policy" + resources: + - podsecuritypolicies + verbs: + - create + - delete + - get + - list + - patch + - update + - watch + - use +- apiGroups: + - "rbac.authorization.k8s.io" + resources: + - clusterroles + - clusterrolebindings + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "apps" + resources: + - statefulsets + - daemonsets + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - "" + resources: + - configmaps + - events + - secrets + - serviceaccounts + - nodes + - persistentvolumes + - persistentvolumeclaims + - persistentvolumeclaims/status + - pods + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: duros-controller +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: duros-controller +subjects: +- kind: User + name: system:duros-controller + apiGroup: "" +{{- end }} diff --git a/charts/internal/shoot-control-plane/values.yaml b/charts/internal/shoot-control-plane/values.yaml index 8bb36f6b3..5a28e071d 100644 --- a/charts/internal/shoot-control-plane/values.yaml +++ b/charts/internal/shoot-control-plane/values.yaml @@ -22,3 +22,7 @@ limitValidatingWebhook: enabled: false ca: ABCDEF url: https://replace-this-webhook/validate + +duros: + enabled: false + endpoints: [] diff --git a/charts/provider-metal/templates/configmap.yaml b/charts/provider-metal/templates/configmap.yaml index 99f1698f5..d4bd535a6 100644 --- a/charts/provider-metal/templates/configmap.yaml +++ b/charts/provider-metal/templates/configmap.yaml @@ -55,4 +55,11 @@ data: {{ .Values.config.accountingExporter.clientConfig.cert | indent 10 }} certKey: | {{ .Values.config.accountingExporter.clientConfig.certkey | indent 10 }} +{{- end }} + storage: + duros: + enabled: {{ .Values.config.storage.duros.enabled }} +{{- if .Values.config.storage.duros.enabled }} + seedConfig: +{{ toYaml .Values.config.storage.duros.seedConfig | indent 12 }} {{- end }} diff --git a/charts/provider-metal/templates/rbac.yaml b/charts/provider-metal/templates/rbac.yaml index 3b9428e22..b7c44bb2d 100644 --- a/charts/provider-metal/templates/rbac.yaml +++ b/charts/provider-metal/templates/rbac.yaml @@ -87,6 +87,12 @@ rules: - clusterwidenetworkpolicies verbs: - "*" +- apiGroups: + - storage.metal-stack.io + resources: + - duros + verbs: + - "*" --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding diff --git a/charts/provider-metal/values.yaml b/charts/provider-metal/values.yaml index 2f5a189f8..41fd45d6d 100644 --- a/charts/provider-metal/values.yaml +++ b/charts/provider-metal/values.yaml @@ -67,6 +67,10 @@ config: enabled: false hecURL: hecToken: + storage: + duros: + enabled: false + seedConfig: {} gardener: seed: diff --git a/example/controller-registration.yaml b/example/controller-registration.yaml index aa4ba1a2c..5e6ca0a73 100644 --- a/example/controller-registration.yaml +++ b/example/controller-registration.yaml @@ -14,7 +14,7 @@ spec: deployment: type: helm providerConfig: - chart: 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 + chart: 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 values: image: - tag: v0.13.0 + tag: v0.15.0 diff --git a/go.mod b/go.mod index 338766746..78fa1cd0a 100644 --- a/go.mod +++ b/go.mod @@ -22,26 +22,27 @@ require ( github.com/google/go-cmp v0.5.2 github.com/google/uuid v1.1.2 github.com/imdario/mergo v0.3.11 + github.com/metal-stack/duros-controller v0.1.1 github.com/metal-stack/firewall-controller v1.0.1 github.com/metal-stack/machine-controller-manager-provider-metal v0.1.3 - github.com/metal-stack/metal-go v0.11.1 - github.com/metal-stack/metal-lib v0.6.6 + github.com/metal-stack/metal-go v0.11.2 + github.com/metal-stack/metal-lib v0.6.7 github.com/onsi/ginkgo v1.14.2 - github.com/onsi/gomega v1.10.2 + github.com/onsi/gomega v1.10.3 github.com/pkg/errors v0.9.1 - github.com/spf13/cobra v1.0.0 + github.com/spf13/cobra v1.1.1 github.com/spf13/pflag v1.0.5 github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50 // indirect go4.org v0.0.0-20180809161055-417644f6feb5 // indirect - k8s.io/api v0.18.9 - k8s.io/apiextensions-apiserver v0.18.9 - k8s.io/apimachinery v0.18.9 + k8s.io/api v0.19.4 + k8s.io/apiextensions-apiserver v0.19.4 + k8s.io/apimachinery v0.19.4 k8s.io/apiserver v0.17.11 k8s.io/client-go v11.0.1-0.20190409021438-1a26190bd76a+incompatible k8s.io/code-generator v0.17.11 k8s.io/component-base v0.17.11 k8s.io/kubelet v0.17.11 - sigs.k8s.io/controller-runtime v0.6.3 + sigs.k8s.io/controller-runtime v0.6.4 ) replace ( diff --git a/go.sum b/go.sum index de1578d4c..ef4405a07 100644 --- a/go.sum +++ b/go.sum @@ -115,6 +115,7 @@ github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190603021944-12ad9f921c0b h1:eQd github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190603021944-12ad9f921c0b/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -162,6 +163,7 @@ github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cloudflare-go v0.11.4/go.mod h1:ZB+hp7VycxPLpp0aiozQQezat46npDXhzHi1DVtRCn4= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -247,6 +249,7 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.0.0-20200808040245-162e5629780b/go.mod h1:NAJj0yf/KaRKURN6nyi7A9IZydMivZEm9oQLWNjfKDc= github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M= @@ -455,12 +458,15 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/googleapis v1.4.0 h1:zgVt4UpGxcqVOw97aRGxT4svlcmdK35fynLNctY32zI= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/status v1.1.0 h1:+eIkrewn5q6b30y+g/BJINVVdi2xH7je5MPJ3ZPK3JA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -575,11 +581,15 @@ github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:Fecb github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.11.3 h1:h8+NsYENhxNTuq+dobk3+ODoJtwY4Fu0WQXsxJfL8aM= github.com/grpc-ecosystem/grpc-gateway v1.11.3/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -743,6 +753,10 @@ github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqc github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= github.com/mdlayher/netlink v1.1.1 h1:VqG+Voq9V4uZ+04vjIrcSCWDpf91B1xxbP4QBUmUJE8= github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= +github.com/metal-stack/duros-controller v0.1.1 h1:CB6Gp3vCGjYfBDTM+q3GbaL0PlWjV8/MGn9Eyr6w3hI= +github.com/metal-stack/duros-controller v0.1.1/go.mod h1:ScRRfJ+Py9o7UO2ek1X00MueLxeY5N4a3zQ/hE1SyY8= +github.com/metal-stack/duros-go v0.0.0-20201208143156-29e7483921aa h1:lSRdmhnCL37vjZ2UOg69pos5EhbJg2KsqLbdMwgjOM0= +github.com/metal-stack/duros-go v0.0.0-20201208143156-29e7483921aa/go.mod h1:LMGXU7SzrI4TBhJ0lnMstfobEmekl3hmED/voLzHOMg= github.com/metal-stack/firewall-controller v1.0.1 h1:FRUYs5USa2CklxP0KYwpJ696b7VCDCC7zy8kW4EXtuU= github.com/metal-stack/firewall-controller v1.0.1/go.mod h1:RAAxEvW8AWyi4K9xNK5T4EqDSOJXssUrMGVDdeXEAuM= github.com/metal-stack/machine-controller-manager-provider-metal v0.1.3 h1:/5+LjHPMUiRpaHnrtQdKK8K5jp3SUYOCzapIqj6ynR4= @@ -753,15 +767,16 @@ github.com/metal-stack/masterdata-api v0.8.3 h1:Hb4TDDp1HwJUalG1SKp14lctWyUWi2Xx github.com/metal-stack/masterdata-api v0.8.3/go.mod h1:vNzStBft4l8ItkUNu7mrdHbSF6kcPLhulByXBifYLkA= github.com/metal-stack/metal-go v0.8.3 h1:qY0QVkegUOh8l+wMVvVwDWNekntiD7ZuXuTeKjxrQjY= github.com/metal-stack/metal-go v0.8.3/go.mod h1:5emMVOjVD2tj6OxCBUYB8Xo1ruBnoP6idwypVV1pzec= -github.com/metal-stack/metal-go v0.11.1 h1:aBv/JolspX3YYQDgLrfDAolJpm0HsQ5yf7H4Kv/o/hE= -github.com/metal-stack/metal-go v0.11.1/go.mod h1:A1ZZSxY8gLIH+cHboUytRxzt42hgnNSCHzfzXwCrRe8= +github.com/metal-stack/metal-go v0.11.2 h1:RvDCikF2COQ2nWyU1F+O9649uuPe0WaGXg/lJWklDNs= +github.com/metal-stack/metal-go v0.11.2/go.mod h1:A1ZZSxY8gLIH+cHboUytRxzt42hgnNSCHzfzXwCrRe8= github.com/metal-stack/metal-lib v0.5.0/go.mod h1:Vxr1OwM8fef1gtIv9fUiVU4Gq5mkd4ElHMpTjfuuSFQ= github.com/metal-stack/metal-lib v0.6.0/go.mod h1:r8qhfX72eAzClR/pEaQvdwM//Otx9gegYoOphLPmmQ4= github.com/metal-stack/metal-lib v0.6.1/go.mod h1:r8qhfX72eAzClR/pEaQvdwM//Otx9gegYoOphLPmmQ4= github.com/metal-stack/metal-lib v0.6.4 h1:7lvQcjGrZa3gUIzlbFi61fqFatDzlmWWMvXoqOi5HHM= github.com/metal-stack/metal-lib v0.6.4/go.mod h1:r8qhfX72eAzClR/pEaQvdwM//Otx9gegYoOphLPmmQ4= -github.com/metal-stack/metal-lib v0.6.6 h1:5ajMDUGHruYOmRqn3r373rbIKbTtQkfVfKLKmRatJnE= github.com/metal-stack/metal-lib v0.6.6/go.mod h1:r8qhfX72eAzClR/pEaQvdwM//Otx9gegYoOphLPmmQ4= +github.com/metal-stack/metal-lib v0.6.7 h1:tHmFjzr3+wdl2WoY8+M7l7CVyvBay2uslkq+ULnW2CI= +github.com/metal-stack/metal-lib v0.6.7/go.mod h1:r8qhfX72eAzClR/pEaQvdwM//Otx9gegYoOphLPmmQ4= github.com/metal-stack/security v0.3.0 h1:YJL0qlsXlvA9O3iIWuk5YqF02IX9f6I60n93FkQpV4k= github.com/metal-stack/security v0.3.0/go.mod h1:xa0eka4HttrfhDTJPzcSDBGgaFyNBGXhz0B5YGqtKuU= github.com/metal-stack/security v0.4.0 h1:NrPm5srgmgeS9UdQmGKLEJ3P7BSsV2Gm7P781LmM0Xo= @@ -845,6 +860,8 @@ github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2 h1:aY/nuoWlKJud2J6U0E3NWsjlg+0GtwXxgEqthRdzlcs= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= @@ -929,6 +946,7 @@ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqn github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -970,6 +988,8 @@ github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= +github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1126,6 +1146,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5 h1:FR+oGxGfbQu1d+jglI3rCkjAjUnhRSZcUxr+DqlDLNo= +golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1184,6 +1206,7 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -1198,10 +1221,13 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTiq8voBeTuweGVkY6Puw= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201207224615-747e23833adb h1:xj2oMIbduz83x7tzglytWT7spn6rP+9hvKjTpro6/pM= +golang.org/x/net v0.0.0-20201207224615-747e23833adb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1278,6 +1304,7 @@ golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1292,6 +1319,8 @@ golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634 h1:bNEHhJCnrwMKNMmOx3yAynp5vs5/gRy+XWFtZFu7NBM= golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d h1:MiWWjyhUzZ+jvhZvloX6ZrUsdEghn8a64Upd8EMHglE= +golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1451,8 +1480,10 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1463,6 +1494,9 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhK google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201119123407-9b1e624d6bc4/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201207150747-9ee31aac76e7 h1:MrlntRhz7JNWmR2J5pRYZFgfR0IuuhELDhxo2aBZVsg= +google.golang.org/genproto v0.0.0-20201207150747-9ee31aac76e7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1483,7 +1517,10 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1525,6 +1562,7 @@ gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRN gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/pkg/apis/config/types.go b/pkg/apis/config/types.go index efa163044..8553ad088 100644 --- a/pkg/apis/config/types.go +++ b/pkg/apis/config/types.go @@ -45,6 +45,9 @@ type ControllerConfiguration struct { // HealthCheckConfig is the config for the health check controller HealthCheckConfig *healthcheckconfig.HealthCheckConfig + + // Storage is the configuration for storage. + Storage StorageConfiguration } // MachineImage is a mapping from logical names and versions to GCP-specific identifiers. @@ -130,3 +133,38 @@ type AccountingExporterClientConfiguration struct { // CertKey is the client certificate key used for communicating with the accounting api CertKey string } + +// StorageConfiguration contains the configuration for provider specfic storage solutions. +type StorageConfiguration struct { + // Duros contains the configuration for duros cloud storage + Duros DurosConfiguration +} + +// DurosConfiguration contains the configuration for lightbits duros storage. +type DurosConfiguration struct { + // Enabled enables duros storage when set to true. + Enabled bool + // SeedConfig is a map of a seed name to the duros seed configuration + SeedConfig map[string]DurosSeedConfiguration +} + +// DurosSeedConfiguration is the configuration for duros for a particular seed +type DurosSeedConfiguration struct { + // Endpoints is the list of endpoints of the duros API + Endpoints []string + // AdminKey is the key used for generating storage credentials + AdminKey string + // AdminToken is the token used by the duros-controller to authenticate against the duros API + AdminToken string + // StorageClasses contain information on the storage classes that the duros-controller creates in the shoot cluster + StorageClasses []DurosSeedStorageClass +} + +type DurosSeedStorageClass struct { + // Name is the name of the storage class + Name string + // ReplicaCount is the amount of replicas in the storage backend for this storage class + ReplicaCount int + // Compression enables compression for this storage class + Compression bool +} diff --git a/pkg/apis/config/v1alpha1/types.go b/pkg/apis/config/v1alpha1/types.go index 3b3412dbc..a0a1ab73c 100644 --- a/pkg/apis/config/v1alpha1/types.go +++ b/pkg/apis/config/v1alpha1/types.go @@ -32,6 +32,9 @@ type ControllerConfiguration struct { // HealthCheckConfig is the config for the health check controller // +optional HealthCheckConfig *healthcheckconfigv1alpha1.HealthCheckConfig `json:"healthCheckConfig,omitempty"` + + // Storage is the configuration for storage. + Storage StorageConfiguration `json:"storage,omitempty"` } // MachineImage is a mapping from logical names and versions to GCP-specific identifiers. @@ -120,3 +123,39 @@ type AccountingExporterClientConfiguration struct { // CertKey is the client certificate key used for communicating with the accounting api. CertKey string `json:"certKey"` } + +// StorageConfiguration contains the configuration for provider specfic storage solutions. +type StorageConfiguration struct { + // Duros contains the configuration for duros cloud storage + Duros DurosConfiguration `json:"duros"` +} + +// DurosConfiguration contains the configuration for lightbits duros storage. +type DurosConfiguration struct { + // Enabled enables duros storage when set to true. + Enabled bool `json:"enabled"` + + // SeedConfig is a map of a seed name to the duros seed configuration + SeedConfig map[string]DurosSeedConfiguration `json:"seedConfig"` +} + +// DurosSeedConfiguration is the configuration for duros for a particular seed +type DurosSeedConfiguration struct { + // Endpoints is the list of endpoints of the duros API + Endpoints []string `json:"endpoints"` + // AdminKey is the key used for generating storage credentials + AdminKey string `json:"adminKey"` + // AdminToken is the token used by the duros-controller to authenticate against the duros API + AdminToken string `json:"adminToken"` + // StorageClasses contain information on the storage classes that the duros-controller creates in the shoot cluster + StorageClasses []DurosSeedStorageClass `json:"storageClasses"` +} + +type DurosSeedStorageClass struct { + // Name is the name of the storage class + Name string `json:"name"` + // ReplicaCount is the amount of replicas in the storage backend for this storage class + ReplicaCount int `json:"replicaCount"` + // Compression enables compression for this storage class + Compression bool `json:"compression"` +} diff --git a/pkg/apis/config/v1alpha1/zz_generated.conversion.go b/pkg/apis/config/v1alpha1/zz_generated.conversion.go index 7c652a4c6..df84987c8 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/config/v1alpha1/zz_generated.conversion.go @@ -88,6 +88,36 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*DurosConfiguration)(nil), (*config.DurosConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration(a.(*DurosConfiguration), b.(*config.DurosConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.DurosConfiguration)(nil), (*DurosConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration(a.(*config.DurosConfiguration), b.(*DurosConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*DurosSeedConfiguration)(nil), (*config.DurosSeedConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_DurosSeedConfiguration_To_config_DurosSeedConfiguration(a.(*DurosSeedConfiguration), b.(*config.DurosSeedConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.DurosSeedConfiguration)(nil), (*DurosSeedConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_DurosSeedConfiguration_To_v1alpha1_DurosSeedConfiguration(a.(*config.DurosSeedConfiguration), b.(*DurosSeedConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*DurosSeedStorageClass)(nil), (*config.DurosSeedStorageClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_DurosSeedStorageClass_To_config_DurosSeedStorageClass(a.(*DurosSeedStorageClass), b.(*config.DurosSeedStorageClass), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.DurosSeedStorageClass)(nil), (*DurosSeedStorageClass)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_DurosSeedStorageClass_To_v1alpha1_DurosSeedStorageClass(a.(*config.DurosSeedStorageClass), b.(*DurosSeedStorageClass), scope) + }); err != nil { + return err + } if err := s.AddGeneratedConversionFunc((*ETCD)(nil), (*config.ETCD)(nil), func(a, b interface{}, scope conversion.Scope) error { return Convert_v1alpha1_ETCD_To_config_ETCD(a.(*ETCD), b.(*config.ETCD), scope) }); err != nil { @@ -138,6 +168,16 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } + if err := s.AddGeneratedConversionFunc((*StorageConfiguration)(nil), (*config.StorageConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration(a.(*StorageConfiguration), b.(*config.StorageConfiguration), scope) + }); err != nil { + return err + } + if err := s.AddGeneratedConversionFunc((*config.StorageConfiguration)(nil), (*StorageConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { + return Convert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration(a.(*config.StorageConfiguration), b.(*StorageConfiguration), scope) + }); err != nil { + return err + } return nil } @@ -260,6 +300,9 @@ func autoConvert_v1alpha1_ControllerConfiguration_To_config_ControllerConfigurat return err } out.HealthCheckConfig = (*healthcheckconfig.HealthCheckConfig)(unsafe.Pointer(in.HealthCheckConfig)) + if err := Convert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration(&in.Storage, &out.Storage, s); err != nil { + return err + } return nil } @@ -283,6 +326,9 @@ func autoConvert_config_ControllerConfiguration_To_v1alpha1_ControllerConfigurat return err } out.HealthCheckConfig = (*configv1alpha1.HealthCheckConfig)(unsafe.Pointer(in.HealthCheckConfig)) + if err := Convert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration(&in.Storage, &out.Storage, s); err != nil { + return err + } return nil } @@ -291,6 +337,78 @@ func Convert_config_ControllerConfiguration_To_v1alpha1_ControllerConfiguration( return autoConvert_config_ControllerConfiguration_To_v1alpha1_ControllerConfiguration(in, out, s) } +func autoConvert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration(in *DurosConfiguration, out *config.DurosConfiguration, s conversion.Scope) error { + out.Enabled = in.Enabled + out.SeedConfig = *(*map[string]config.DurosSeedConfiguration)(unsafe.Pointer(&in.SeedConfig)) + return nil +} + +// Convert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration(in *DurosConfiguration, out *config.DurosConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration(in, out, s) +} + +func autoConvert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration(in *config.DurosConfiguration, out *DurosConfiguration, s conversion.Scope) error { + out.Enabled = in.Enabled + out.SeedConfig = *(*map[string]DurosSeedConfiguration)(unsafe.Pointer(&in.SeedConfig)) + return nil +} + +// Convert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration is an autogenerated conversion function. +func Convert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration(in *config.DurosConfiguration, out *DurosConfiguration, s conversion.Scope) error { + return autoConvert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration(in, out, s) +} + +func autoConvert_v1alpha1_DurosSeedConfiguration_To_config_DurosSeedConfiguration(in *DurosSeedConfiguration, out *config.DurosSeedConfiguration, s conversion.Scope) error { + out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) + out.AdminKey = in.AdminKey + out.AdminToken = in.AdminToken + out.StorageClasses = *(*[]config.DurosSeedStorageClass)(unsafe.Pointer(&in.StorageClasses)) + return nil +} + +// Convert_v1alpha1_DurosSeedConfiguration_To_config_DurosSeedConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_DurosSeedConfiguration_To_config_DurosSeedConfiguration(in *DurosSeedConfiguration, out *config.DurosSeedConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_DurosSeedConfiguration_To_config_DurosSeedConfiguration(in, out, s) +} + +func autoConvert_config_DurosSeedConfiguration_To_v1alpha1_DurosSeedConfiguration(in *config.DurosSeedConfiguration, out *DurosSeedConfiguration, s conversion.Scope) error { + out.Endpoints = *(*[]string)(unsafe.Pointer(&in.Endpoints)) + out.AdminKey = in.AdminKey + out.AdminToken = in.AdminToken + out.StorageClasses = *(*[]DurosSeedStorageClass)(unsafe.Pointer(&in.StorageClasses)) + return nil +} + +// Convert_config_DurosSeedConfiguration_To_v1alpha1_DurosSeedConfiguration is an autogenerated conversion function. +func Convert_config_DurosSeedConfiguration_To_v1alpha1_DurosSeedConfiguration(in *config.DurosSeedConfiguration, out *DurosSeedConfiguration, s conversion.Scope) error { + return autoConvert_config_DurosSeedConfiguration_To_v1alpha1_DurosSeedConfiguration(in, out, s) +} + +func autoConvert_v1alpha1_DurosSeedStorageClass_To_config_DurosSeedStorageClass(in *DurosSeedStorageClass, out *config.DurosSeedStorageClass, s conversion.Scope) error { + out.Name = in.Name + out.ReplicaCount = in.ReplicaCount + out.Compression = in.Compression + return nil +} + +// Convert_v1alpha1_DurosSeedStorageClass_To_config_DurosSeedStorageClass is an autogenerated conversion function. +func Convert_v1alpha1_DurosSeedStorageClass_To_config_DurosSeedStorageClass(in *DurosSeedStorageClass, out *config.DurosSeedStorageClass, s conversion.Scope) error { + return autoConvert_v1alpha1_DurosSeedStorageClass_To_config_DurosSeedStorageClass(in, out, s) +} + +func autoConvert_config_DurosSeedStorageClass_To_v1alpha1_DurosSeedStorageClass(in *config.DurosSeedStorageClass, out *DurosSeedStorageClass, s conversion.Scope) error { + out.Name = in.Name + out.ReplicaCount = in.ReplicaCount + out.Compression = in.Compression + return nil +} + +// Convert_config_DurosSeedStorageClass_To_v1alpha1_DurosSeedStorageClass is an autogenerated conversion function. +func Convert_config_DurosSeedStorageClass_To_v1alpha1_DurosSeedStorageClass(in *config.DurosSeedStorageClass, out *DurosSeedStorageClass, s conversion.Scope) error { + return autoConvert_config_DurosSeedStorageClass_To_v1alpha1_DurosSeedStorageClass(in, out, s) +} + func autoConvert_v1alpha1_ETCD_To_config_ETCD(in *ETCD, out *config.ETCD, s conversion.Scope) error { if err := Convert_v1alpha1_ETCDStorage_To_config_ETCDStorage(&in.Storage, &out.Storage, s); err != nil { return err @@ -412,3 +530,27 @@ func autoConvert_config_SplunkAudit_To_v1alpha1_SplunkAudit(in *config.SplunkAud func Convert_config_SplunkAudit_To_v1alpha1_SplunkAudit(in *config.SplunkAudit, out *SplunkAudit, s conversion.Scope) error { return autoConvert_config_SplunkAudit_To_v1alpha1_SplunkAudit(in, out, s) } + +func autoConvert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration(in *StorageConfiguration, out *config.StorageConfiguration, s conversion.Scope) error { + if err := Convert_v1alpha1_DurosConfiguration_To_config_DurosConfiguration(&in.Duros, &out.Duros, s); err != nil { + return err + } + return nil +} + +// Convert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration is an autogenerated conversion function. +func Convert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration(in *StorageConfiguration, out *config.StorageConfiguration, s conversion.Scope) error { + return autoConvert_v1alpha1_StorageConfiguration_To_config_StorageConfiguration(in, out, s) +} + +func autoConvert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration(in *config.StorageConfiguration, out *StorageConfiguration, s conversion.Scope) error { + if err := Convert_config_DurosConfiguration_To_v1alpha1_DurosConfiguration(&in.Duros, &out.Duros, s); err != nil { + return err + } + return nil +} + +// Convert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration is an autogenerated conversion function. +func Convert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration(in *config.StorageConfiguration, out *StorageConfiguration, s conversion.Scope) error { + return autoConvert_config_StorageConfiguration_To_v1alpha1_StorageConfiguration(in, out, s) +} diff --git a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go index e74afc8c7..bd0c0cdb4 100644 --- a/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/config/v1alpha1/zz_generated.deepcopy.go @@ -114,6 +114,7 @@ func (in *ControllerConfiguration) DeepCopyInto(out *ControllerConfiguration) { *out = new(configv1alpha1.HealthCheckConfig) **out = **in } + in.Storage.DeepCopyInto(&out.Storage) return } @@ -135,6 +136,71 @@ func (in *ControllerConfiguration) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosConfiguration) DeepCopyInto(out *DurosConfiguration) { + *out = *in + if in.SeedConfig != nil { + in, out := &in.SeedConfig, &out.SeedConfig + *out = make(map[string]DurosSeedConfiguration, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosConfiguration. +func (in *DurosConfiguration) DeepCopy() *DurosConfiguration { + if in == nil { + return nil + } + out := new(DurosConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosSeedConfiguration) DeepCopyInto(out *DurosSeedConfiguration) { + *out = *in + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.StorageClasses != nil { + in, out := &in.StorageClasses, &out.StorageClasses + *out = make([]DurosSeedStorageClass, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosSeedConfiguration. +func (in *DurosSeedConfiguration) DeepCopy() *DurosSeedConfiguration { + if in == nil { + return nil + } + out := new(DurosSeedConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosSeedStorageClass) DeepCopyInto(out *DurosSeedStorageClass) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosSeedStorageClass. +func (in *DurosSeedStorageClass) DeepCopy() *DurosSeedStorageClass { + if in == nil { + return nil + } + out := new(DurosSeedStorageClass) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ETCD) DeepCopyInto(out *ETCD) { *out = *in @@ -236,3 +302,20 @@ func (in *SplunkAudit) DeepCopy() *SplunkAudit { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StorageConfiguration) DeepCopyInto(out *StorageConfiguration) { + *out = *in + in.Duros.DeepCopyInto(&out.Duros) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageConfiguration. +func (in *StorageConfiguration) DeepCopy() *StorageConfiguration { + if in == nil { + return nil + } + out := new(StorageConfiguration) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/config/zz_generated.deepcopy.go b/pkg/apis/config/zz_generated.deepcopy.go index 5957218ee..0f30ce1d8 100644 --- a/pkg/apis/config/zz_generated.deepcopy.go +++ b/pkg/apis/config/zz_generated.deepcopy.go @@ -114,6 +114,7 @@ func (in *ControllerConfiguration) DeepCopyInto(out *ControllerConfiguration) { *out = new(healthcheckconfig.HealthCheckConfig) **out = **in } + in.Storage.DeepCopyInto(&out.Storage) return } @@ -135,6 +136,71 @@ func (in *ControllerConfiguration) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosConfiguration) DeepCopyInto(out *DurosConfiguration) { + *out = *in + if in.SeedConfig != nil { + in, out := &in.SeedConfig, &out.SeedConfig + *out = make(map[string]DurosSeedConfiguration, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosConfiguration. +func (in *DurosConfiguration) DeepCopy() *DurosConfiguration { + if in == nil { + return nil + } + out := new(DurosConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosSeedConfiguration) DeepCopyInto(out *DurosSeedConfiguration) { + *out = *in + if in.Endpoints != nil { + in, out := &in.Endpoints, &out.Endpoints + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.StorageClasses != nil { + in, out := &in.StorageClasses, &out.StorageClasses + *out = make([]DurosSeedStorageClass, len(*in)) + copy(*out, *in) + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosSeedConfiguration. +func (in *DurosSeedConfiguration) DeepCopy() *DurosSeedConfiguration { + if in == nil { + return nil + } + out := new(DurosSeedConfiguration) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *DurosSeedStorageClass) DeepCopyInto(out *DurosSeedStorageClass) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new DurosSeedStorageClass. +func (in *DurosSeedStorageClass) DeepCopy() *DurosSeedStorageClass { + if in == nil { + return nil + } + out := new(DurosSeedStorageClass) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *ETCD) DeepCopyInto(out *ETCD) { *out = *in @@ -236,3 +302,20 @@ func (in *SplunkAudit) DeepCopy() *SplunkAudit { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StorageConfiguration) DeepCopyInto(out *StorageConfiguration) { + *out = *in + in.Duros.DeepCopyInto(&out.Duros) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StorageConfiguration. +func (in *StorageConfiguration) DeepCopy() *StorageConfiguration { + if in == nil { + return nil + } + out := new(StorageConfiguration) + in.DeepCopyInto(out) + return out +} diff --git a/pkg/apis/metal/install/install.go b/pkg/apis/metal/install/install.go index 893bffcb1..69aa0c16a 100644 --- a/pkg/apis/metal/install/install.go +++ b/pkg/apis/metal/install/install.go @@ -15,6 +15,8 @@ package install import ( + durosv1 "github.com/metal-stack/duros-controller/api/v1" + firewallv1 "github.com/metal-stack/firewall-controller/api/v1" "github.com/metal-stack/gardener-extension-provider-metal/pkg/apis/metal" "github.com/metal-stack/gardener-extension-provider-metal/pkg/apis/metal/v1alpha1" @@ -27,6 +29,8 @@ var ( v1alpha1.AddToScheme, metal.AddToScheme, setVersionPriority, + durosv1.AddToScheme, + firewallv1.AddToScheme, ) // AddToScheme adds all APIs to the scheme. diff --git a/pkg/apis/metal/types_infrastructure.go b/pkg/apis/metal/types_infrastructure.go index f267c6bb8..61390812c 100644 --- a/pkg/apis/metal/types_infrastructure.go +++ b/pkg/apis/metal/types_infrastructure.go @@ -15,13 +15,12 @@ type InfrastructureConfig struct { } type Firewall struct { - Size string - Image string - Networks []string - RateLimits []RateLimit - EgressRules []EgressRule - ControllerVersion *string - ControllerVersionAutoUpdate bool + Size string + Image string + Networks []string + RateLimits []RateLimit + EgressRules []EgressRule + ControllerVersion string } type RateLimit struct { diff --git a/pkg/apis/metal/v1alpha1/types_infrastructure.go b/pkg/apis/metal/v1alpha1/types_infrastructure.go index 376f26ae8..d4ae30a8f 100644 --- a/pkg/apis/metal/v1alpha1/types_infrastructure.go +++ b/pkg/apis/metal/v1alpha1/types_infrastructure.go @@ -15,13 +15,12 @@ type InfrastructureConfig struct { } type Firewall struct { - Size string `json:"size"` - Image string `json:"image"` - Networks []string `json:"networks"` - RateLimits []RateLimit `json:"rateLimits"` - EgressRules []EgressRule `json:"egressRules"` - ControllerVersion *string `json:"controllerVersion"` - ControllerVersionAutoUpdate bool `json:"controllerVersionAutoUpdate"` + Size string `json:"size"` + Image string `json:"image"` + Networks []string `json:"networks"` + RateLimits []RateLimit `json:"rateLimits"` + EgressRules []EgressRule `json:"egressRules"` + ControllerVersion string `json:"controllerVersion"` } type RateLimit struct { diff --git a/pkg/apis/metal/v1alpha1/zz_generated.conversion.go b/pkg/apis/metal/v1alpha1/zz_generated.conversion.go index 99890f144..10daa433b 100644 --- a/pkg/apis/metal/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/metal/v1alpha1/zz_generated.conversion.go @@ -385,8 +385,7 @@ func autoConvert_v1alpha1_Firewall_To_metal_Firewall(in *Firewall, out *metal.Fi out.Networks = *(*[]string)(unsafe.Pointer(&in.Networks)) out.RateLimits = *(*[]metal.RateLimit)(unsafe.Pointer(&in.RateLimits)) out.EgressRules = *(*[]metal.EgressRule)(unsafe.Pointer(&in.EgressRules)) - out.ControllerVersion = (*string)(unsafe.Pointer(in.ControllerVersion)) - out.ControllerVersionAutoUpdate = in.ControllerVersionAutoUpdate + out.ControllerVersion = in.ControllerVersion return nil } @@ -401,8 +400,7 @@ func autoConvert_metal_Firewall_To_v1alpha1_Firewall(in *metal.Firewall, out *Fi out.Networks = *(*[]string)(unsafe.Pointer(&in.Networks)) out.RateLimits = *(*[]RateLimit)(unsafe.Pointer(&in.RateLimits)) out.EgressRules = *(*[]EgressRule)(unsafe.Pointer(&in.EgressRules)) - out.ControllerVersion = (*string)(unsafe.Pointer(in.ControllerVersion)) - out.ControllerVersionAutoUpdate = in.ControllerVersionAutoUpdate + out.ControllerVersion = in.ControllerVersion return nil } diff --git a/pkg/apis/metal/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/metal/v1alpha1/zz_generated.deepcopy.go index 5cea97f9a..0d08aecab 100644 --- a/pkg/apis/metal/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/metal/v1alpha1/zz_generated.deepcopy.go @@ -199,11 +199,6 @@ func (in *Firewall) DeepCopyInto(out *Firewall) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.ControllerVersion != nil { - in, out := &in.ControllerVersion, &out.ControllerVersion - *out = new(string) - **out = **in - } return } diff --git a/pkg/apis/metal/validation/firewall_controller.go b/pkg/apis/metal/validation/firewall_controller.go index 7869e6a01..c2849d929 100644 --- a/pkg/apis/metal/validation/firewall_controller.go +++ b/pkg/apis/metal/validation/firewall_controller.go @@ -9,48 +9,42 @@ import ( "github.com/metal-stack/firewall-controller/pkg/updater" ) +const ( + FirewallControllerVersionAuto = "auto" +) + var ( ErrSpecVersionUndefined = fmt.Errorf("firewall-controller version was not specified in the spec") - ErrSpecVersionEmpty = fmt.Errorf("firewall-controller version must not be empty") ErrNoSemver = fmt.Errorf("firewall-controller versions must adhere to semver spec") ErrControllerTooOld = fmt.Errorf("firewall-controller on machine is too old") ) -func ValidateFirewallControllerVersion(iv imagevector.ImageVector, specVersion *string, autoUpdate bool) (*string, error) { - versionTag, err := validateFirewallControllerVersionWithoutGithub(iv, specVersion, autoUpdate) +func ValidateFirewallControllerVersion(iv imagevector.ImageVector, specVersion string) (string, error) { + versionTag, err := validateFirewallControllerVersionWithoutGithub(iv, specVersion) if err != nil { - return nil, err - } - - if versionTag == nil { - return nil, nil + return "", err } - _, err = updater.DetermineGithubAsset(*versionTag) + _, err = updater.DetermineGithubAsset(versionTag) if err != nil { - return nil, fmt.Errorf("firewall-controller version must be a github release but version %v was not found", *versionTag) + return "", fmt.Errorf("firewall-controller version must be a github release but version %v was not found", versionTag) } return versionTag, nil } -func validateFirewallControllerVersionWithoutGithub(iv imagevector.ImageVector, specVersion *string, autoUpdate bool) (*string, error) { +func validateFirewallControllerVersionWithoutGithub(iv imagevector.ImageVector, specVersion string) (string, error) { imageVectorVersion, err := getImageVectorVersion(iv) if err != nil { - return nil, err + return "", err } - wantedVersion, err := determineWantedVersion(specVersion, imageVectorVersion, autoUpdate) + wantedVersion, err := determineWantedVersion(specVersion, imageVectorVersion) if err != nil { - return nil, err - } - - if wantedVersion == nil { - return nil, nil + return "", err } - versionTag := fmt.Sprintf("v%s", wantedVersion.String()) - return &versionTag, nil + return fmt.Sprintf("v%s", wantedVersion.String()), nil } func getImageVectorVersion(imageVector imagevector.ImageVector) (*semver.Version, error) { @@ -67,28 +61,23 @@ func getImageVectorVersion(imageVector imagevector.ImageVector) (*semver.Version return &semv, nil } -func determineWantedVersion(specVersion *string, ivSemv *semver.Version, autoUpdate bool) (*semver.Version, error) { - if specVersion == nil { +func determineWantedVersion(specVersion string, ivSemv *semver.Version) (*semver.Version, error) { + if specVersion == "" { return nil, ErrSpecVersionUndefined } - if specVersion != nil && *specVersion == "" { - return nil, ErrSpecVersionEmpty - } - var wantedSemv *semver.Version - specSemv, err := semver.Make(strings.TrimPrefix(*specVersion, "v")) - if err != nil { - return nil, ErrNoSemver - } - - if autoUpdate { + if specVersion == FirewallControllerVersionAuto { wantedSemv = ivSemv } else { + specSemv, err := semver.Make(strings.TrimPrefix(specVersion, "v")) + if err != nil { + return nil, ErrNoSemver + } wantedSemv = &specSemv } - if specSemv.Major != ivSemv.Major { + if wantedSemv.Major != ivSemv.Major { return nil, ErrControllerTooOld } diff --git a/pkg/apis/metal/validation/firewall_controller_test.go b/pkg/apis/metal/validation/firewall_controller_test.go index 1c40d8850..efd85c488 100644 --- a/pkg/apis/metal/validation/firewall_controller_test.go +++ b/pkg/apis/metal/validation/firewall_controller_test.go @@ -14,9 +14,8 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { tests := []struct { name string iv imagevector.ImageVector - specVersion *string - autoUpdate bool - want *string + specVersion string + want string wantErr error }{ { @@ -27,9 +26,8 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &v0_2_0, }, }, - specVersion: nil, - autoUpdate: false, - want: nil, + specVersion: "", + want: "", wantErr: ErrSpecVersionUndefined, }, { @@ -40,9 +38,8 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &v0_2_0, }, }, - specVersion: &v0_1_0, - autoUpdate: true, - want: &v0_2_0, + specVersion: FirewallControllerVersionAuto, + want: v0_2_0, }, { name: "downgrade to older minor version given in image vector", @@ -52,9 +49,8 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &v0_1_0, }, }, - specVersion: &v0_2_0, - autoUpdate: true, - want: &v0_1_0, + specVersion: FirewallControllerVersionAuto, + want: v0_1_0, }, { name: "major version updates may contain api changes btw. gepm and firewall-controller and are not supported", @@ -64,8 +60,7 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &v1_0_0, }, }, - specVersion: &v0_1_0, - autoUpdate: true, + specVersion: v0_1_0, wantErr: ErrControllerTooOld, }, { @@ -76,8 +71,7 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &v0_1_0, }, }, - specVersion: &abc, - autoUpdate: true, + specVersion: abc, wantErr: ErrNoSemver, }, { @@ -88,24 +82,19 @@ func Test_validateFirewallControllerVersionWithoutGithub(t *testing.T) { Tag: &abc, }, }, - specVersion: &v0_1_0, - autoUpdate: true, + specVersion: v0_1_0, wantErr: ErrNoSemver, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := validateFirewallControllerVersionWithoutGithub(tt.iv, tt.specVersion, tt.autoUpdate) + got, err := validateFirewallControllerVersionWithoutGithub(tt.iv, tt.specVersion) if err != tt.wantErr { t.Errorf("validateFirewallControllerVersionWithoutGithub() error = %v, wantErr %v", err, tt.wantErr) return } - if tt.want == nil || got == nil { - if tt.want != nil || got != nil { - t.Errorf("error") - } - } else if *got != *tt.want { - t.Errorf("validateFirewallControllerVersionWithoutGithub() = %v, want %v", *got, *tt.want) + if got != tt.want { + t.Errorf("validateFirewallControllerVersionWithoutGithub() = %v, want %v", got, tt.want) } }) } diff --git a/pkg/apis/metal/validation/infrastructure.go b/pkg/apis/metal/validation/infrastructure.go index ead76f83b..109e44d53 100644 --- a/pkg/apis/metal/validation/infrastructure.go +++ b/pkg/apis/metal/validation/infrastructure.go @@ -96,11 +96,9 @@ func ValidateInfrastructureConfig(infra *apismetal.InfrastructureConfig) field.E allErrs = append(allErrs, field.Required(firewallPath.Child("size"), "firewall size must be specified")) } - if infra.Firewall.ControllerVersion != nil { - _, err := ValidateFirewallControllerVersion(imagevector.ImageVector(), infra.Firewall.ControllerVersion, infra.Firewall.ControllerVersionAutoUpdate) - if err != nil { - allErrs = append(allErrs, field.Required(field.NewPath("controllerVersion"), err.Error())) - } + _, err := ValidateFirewallControllerVersion(imagevector.ImageVector(), infra.Firewall.ControllerVersion) + if err != nil && err != ErrSpecVersionUndefined { + allErrs = append(allErrs, field.Required(field.NewPath("controllerVersion"), err.Error())) } availableNetworks := sets.NewString() diff --git a/pkg/apis/metal/zz_generated.deepcopy.go b/pkg/apis/metal/zz_generated.deepcopy.go index 9c1e91fa9..23c9a5819 100644 --- a/pkg/apis/metal/zz_generated.deepcopy.go +++ b/pkg/apis/metal/zz_generated.deepcopy.go @@ -198,11 +198,6 @@ func (in *Firewall) DeepCopyInto(out *Firewall) { (*in)[i].DeepCopyInto(&(*out)[i]) } } - if in.ControllerVersion != nil { - in, out := &in.ControllerVersion, &out.ControllerVersion - *out = new(string) - **out = **in - } return } diff --git a/pkg/controller/controlplane/valuesprovider.go b/pkg/controller/controlplane/valuesprovider.go index 7ecc482d7..a6c1d4e9e 100644 --- a/pkg/controller/controlplane/valuesprovider.go +++ b/pkg/controller/controlplane/valuesprovider.go @@ -4,14 +4,18 @@ import ( "context" "encoding/base64" "fmt" + "strings" "github.com/gardener/gardener/extensions/pkg/util" + "github.com/metal-stack/metal-go/api/models" "github.com/metal-stack/metal-lib/pkg/tag" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/manager" "path/filepath" gardenerkubernetes "github.com/gardener/gardener/pkg/client/kubernetes" + durosv1 "github.com/metal-stack/duros-controller/api/v1" firewallv1 "github.com/metal-stack/firewall-controller/api/v1" extensionscontroller "github.com/gardener/gardener/extensions/pkg/controller" @@ -34,6 +38,7 @@ import ( policyv1beta1 "k8s.io/api/policy/v1beta1" storagev1 "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" apierrors "k8s.io/apimachinery/pkg/api/errors" @@ -83,6 +88,20 @@ var controlPlaneSecrets = &secrets.Secrets{ APIServerURL: v1alpha1constants.DeploymentNameKubeAPIServer, }, }, + &secrets.ControlPlaneSecretConfig{ + CertificateSecretConfig: &secrets.CertificateSecretConfig{ + Name: metal.DurosControllerDeploymentName, + CommonName: "system:duros-controller", + DNSNames: kutil.DNSNamesForService(metal.DurosControllerDeploymentName, clusterName), + Organization: []string{user.SystemPrivilegedGroup}, + CertType: secrets.ClientCert, + SigningCA: cas[v1alpha1constants.SecretNameCACluster], + }, + KubeConfigRequest: &secrets.KubeConfigRequest{ + ClusterName: clusterName, + APIServerURL: v1alpha1constants.DeploymentNameKubeAPIServer, + }, + }, &secrets.ControlPlaneSecretConfig{ CertificateSecretConfig: &secrets.CertificateSecretConfig{ Name: metal.GroupRolebindingControllerName, @@ -241,6 +260,8 @@ var storageClassChart = &chart.Chart{ }, } +type networkMap map[string]*models.V1NetworkResponse + // NewValuesProvider creates a new ValuesProvider for the generic actuator. func NewValuesProvider(mgr manager.Manager, logger logr.Logger, controllerConfig config.ControllerConfiguration) genericactuator.ValuesProvider { if controllerConfig.Auth.Enabled { @@ -293,6 +314,23 @@ func NewValuesProvider(mgr manager.Manager, logger logr.Logger, controllerConfig {Type: &networkingv1.NetworkPolicy{}, Name: "kubeapi2splunk-audit-webhook"}, }...) } + if controllerConfig.Storage.Duros.Enabled { + controlPlaneChart.Images = append(controlPlaneChart.Images, []string{metal.DurosControllerImageName}...) + controlPlaneChart.Objects = append(controlPlaneChart.Objects, []*chart.Object{ + // duros storage + {Type: &corev1.ServiceAccount{}, Name: "duros-controller"}, + {Type: &rbacv1.Role{}, Name: "duros-controller"}, + {Type: &rbacv1.RoleBinding{}, Name: "duros-controller"}, + {Type: &corev1.Secret{}, Name: "duros-admin"}, + {Type: &appsv1.Deployment{}, Name: "duros-controller"}, + {Type: &durosv1.Duros{}, Name: "shoot-default-storage"}, + {Type: &firewallv1.ClusterwideNetworkPolicy{}, Name: "allow-to-storage"}, + }...) + cpShootChart.Objects = append(cpShootChart.Objects, []*chart.Object{ + {Type: &rbacv1.ClusterRole{}, Name: "system:duros-controller"}, + {Type: &rbacv1.ClusterRoleBinding{}, Name: "system:duros-controller"}, + }...) + } return &valuesProvider{ mgr: mgr, @@ -421,6 +459,17 @@ func (vp *valuesProvider) GetControlPlaneChartValues( return nil, err } + resp, err := mclient.NetworkList() + if err != nil { + return nil, errors.Wrap(err, "could not retrieve networks from metal-api") + } + + nws := networkMap{} + for _, n := range resp.Networks { + n := n + nws[*n.ID] = n + } + // TODO: this is a workaround to speed things for the time being... // the infrastructure controller writes the nodes cidr back into the infrastructure status, but the cluster resource does not contain it immediately // it would need the start of another reconcilation until the node cidr can be picked up from the cluster resource @@ -430,8 +479,7 @@ func (vp *valuesProvider) GetControlPlaneChartValues( return nil, err } - // Get CCM chart values - chartValues, err := getCCMChartValues(cpConfig, infrastructureConfig, infrastructure, cp, cluster, checksums, scaledDown, mclient, metalControlPlane) + chartValues, err := getCCMChartValues(cpConfig, infrastructureConfig, infrastructure, cp, cluster, checksums, scaledDown, mclient, metalControlPlane, nws) if err != nil { return nil, err } @@ -446,17 +494,17 @@ func (vp *valuesProvider) GetControlPlaneChartValues( return nil, err } - accValues, err := getAccountingExporterChartValues(vp.controllerConfig.AccountingExporter, cluster, infrastructureConfig, mclient) + accValues, err := getAccountingExporterChartValues(ctx, vp.client, vp.controllerConfig.AccountingExporter, cluster, infrastructureConfig, mclient) if err != nil { return nil, err } - lvwValues, err := getLimitValidationWebhookControlPlaneChartValues(cluster) + storageValues, err := getStorageControlPlaneChartValues(ctx, vp.client, vp.logger, vp.controllerConfig.Storage, cluster, infrastructureConfig, nws) if err != nil { return nil, err } - merge(chartValues, authValues, splunkAuditValues, accValues, lvwValues) + merge(chartValues, authValues, splunkAuditValues, accValues, storageValues) return chartValues, nil } @@ -481,11 +529,40 @@ func (vp *valuesProvider) GetControlPlaneExposureChartValues( // GetControlPlaneShootChartValues returns the values for the control plane shoot chart applied by the generic actuator. func (vp *valuesProvider) GetControlPlaneShootChartValues(ctx context.Context, cp *extensionsv1alpha1.ControlPlane, cluster *extensionscontroller.Cluster, checksums map[string]string) (map[string]interface{}, error) { - vp.logger.Info("GetControlPlaneShootChartValues") + infrastructureConfig := &apismetal.InfrastructureConfig{} + if _, _, err := vp.decoder.Decode(cluster.Shoot.Spec.Provider.InfrastructureConfig.Raw, nil, infrastructureConfig); err != nil { + return nil, errors.Wrapf(err, "could not decode providerConfig of infrastructure") + } - values, err := vp.getControlPlaneShootChartValues(ctx, cp, cluster) + cloudProfileConfig, err := helper.CloudProfileConfigFromCluster(cluster) if err != nil { - vp.logger.Error(err, "Error getting LimitValidationWebhookChartValues") + return nil, err + } + + metalControlPlane, _, err := helper.FindMetalControlPlane(cloudProfileConfig, infrastructureConfig.PartitionID) + if err != nil { + return nil, err + } + + mclient, err := metalclient.NewClient(ctx, vp.client, metalControlPlane.Endpoint, &cp.Spec.SecretRef) + if err != nil { + return nil, err + } + + resp, err := mclient.NetworkList() + if err != nil { + return nil, errors.Wrap(err, "could not retrieve networks from metal-api") + } + + nws := networkMap{} + for _, n := range resp.Networks { + n := n + nws[*n.ID] = n + } + + values, err := vp.getControlPlaneShootChartValues(ctx, cp, cluster, nws, infrastructureConfig) + if err != nil { + vp.logger.Error(err, "Error getting shoot control plane chart values") return nil, err } @@ -498,7 +575,7 @@ func (vp *valuesProvider) GetControlPlaneShootChartValues(ctx context.Context, c } // getControlPlaneShootChartValues returns the values for the shoot control plane chart. -func (vp *valuesProvider) getControlPlaneShootChartValues(ctx context.Context, cp *extensionsv1alpha1.ControlPlane, cluster *extensionscontroller.Cluster) (map[string]interface{}, error) { +func (vp *valuesProvider) getControlPlaneShootChartValues(ctx context.Context, cp *extensionsv1alpha1.ControlPlane, cluster *extensionscontroller.Cluster, nws networkMap, infrastructure *apismetal.InfrastructureConfig) (map[string]interface{}, error) { namespace := cluster.ObjectMeta.Name secret, err := vp.getSecret(ctx, namespace, metal.SplunkAuditWebhookServerName) @@ -519,6 +596,10 @@ func (vp *valuesProvider) getControlPlaneShootChartValues(ctx context.Context, c return nil, errors.Wrap(err, "could not sign firewall values") } + durosValues := map[string]interface{}{ + "enabled": vp.controllerConfig.Storage.Duros.Enabled, + } + values := map[string]interface{}{ "firewallSpec": fwSpec, "groupRolebindingController": map[string]interface{}{ @@ -532,6 +613,26 @@ func (vp *valuesProvider) getControlPlaneShootChartValues(ctx context.Context, c "url": splunkURL, "ca": splunkCABundle, }, + "duros": durosValues, + } + + if vp.controllerConfig.Storage.Duros.Enabled { + if cluster.Shoot.Spec.SeedName == nil { + return nil, fmt.Errorf("shoot resource has not seed name") + } + + seedConfig, ok := vp.controllerConfig.Storage.Duros.SeedConfig[*cluster.Shoot.Spec.SeedName] + + found, err := hasDurosStorageNetwork(infrastructure, nws) + if err != nil { + return nil, errors.Wrap(err, "unable to determine storage network") + } + + if found && ok { + durosValues["endpoints"] = seedConfig.Endpoints + } else { + durosValues["enabled"] = false + } } return values, nil @@ -624,15 +725,12 @@ func (vp *valuesProvider) getFirewallSpec(ctx context.Context, cp *extensionsv1a }, } - fwcv, err := validation.ValidateFirewallControllerVersion(imagevector.ImageVector(), infrastructureConfig.Firewall.ControllerVersion, infrastructureConfig.Firewall.ControllerVersionAutoUpdate) - if err != nil { + fwcv, err := validation.ValidateFirewallControllerVersion(imagevector.ImageVector(), infrastructureConfig.Firewall.ControllerVersion) + if err != nil && err != validation.ErrSpecVersionUndefined { return nil, fmt.Errorf("could not validate firewall controller version: %w", err) } - if fwcv != nil { - spec.ControllerVersion = *fwcv - } - + spec.ControllerVersion = fwcv return &spec, nil } @@ -738,7 +836,6 @@ func (vp *valuesProvider) deployControlPlaneShootDroptailerCerts(ctx context.Con // getSecret returns the secret with the given namespace/secretName func (vp *valuesProvider) getSecret(ctx context.Context, namespace string, secretName string) (*corev1.Secret, error) { key := kutil.Key(namespace, secretName) - vp.logger.Info("GetSecret", "key", key) secret := &corev1.Secret{} err := vp.mgr.GetClient().Get(ctx, key, secret) if err != nil { @@ -768,6 +865,7 @@ func getCCMChartValues( scaledDown bool, mclient *metalgo.Driver, mcp *apismetal.MetalControlPlane, + nws networkMap, ) (map[string]interface{}, error) { projectID := infrastructureConfig.ProjectID nodeCIDR := infrastructure.Status.NodesCIDR @@ -798,11 +896,11 @@ func getCCMChartValues( } } else { for _, networkID := range infrastructureConfig.Firewall.Networks { - resp, err := mclient.NetworkGet(networkID) - if err != nil { - return nil, errors.Wrap(err, "could not retrieve network for finding default external network for metal-ccm deployment") + nw, ok := nws[networkID] + if !ok { + return nil, fmt.Errorf("network defined in firewall networks does not exist in metal-api") } - for k := range resp.Network.Labels { + for k := range nw.Labels { if k == tag.NetworkDefaultExternal { defaultExternalNetwork = networkID break @@ -896,7 +994,7 @@ func getSplunkAuditChartValues(cpConfig *apismetal.ControlPlaneConfig, cluster * return values, nil } -func getAccountingExporterChartValues(accountingConfig config.AccountingExporterConfiguration, cluster *extensionscontroller.Cluster, infrastructure *apismetal.InfrastructureConfig, mclient *metalgo.Driver) (map[string]interface{}, error) { +func getAccountingExporterChartValues(ctx context.Context, client client.Client, accountingConfig config.AccountingExporterConfiguration, cluster *extensionscontroller.Cluster, infrastructure *apismetal.InfrastructureConfig, mclient *metalgo.Driver) (map[string]interface{}, error) { annotations := cluster.Shoot.GetAnnotations() partitionID := infrastructure.PartitionID projectID := infrastructure.ProjectID @@ -904,6 +1002,42 @@ func getAccountingExporterChartValues(accountingConfig config.AccountingExporter clusterName := annotations[tag.ClusterName] tenant := annotations[tag.ClusterTenant] + if accountingConfig.Enabled { + cp := &firewallv1.ClusterwideNetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "egress-allow-accounting-api", + Namespace: "firewall", + }, + } + + _, err := controllerutil.CreateOrUpdate(ctx, client, cp, func() error { + port9000 := intstr.FromInt(9000) + tcp := corev1.ProtocolTCP + + cp.Spec.Egress = []firewallv1.EgressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Port: &port9000, + Protocol: &tcp, + }, + }, + To: []networkingv1.IPBlock{ + { + CIDR: "0.0.0.0/0", + }, + }, + }, + } + + return nil + }) + + if err != nil { + return nil, errors.Wrap(err, "unable to deploy clusterwide network policy for accounting-api into firewall namespace") + } + } + values := map[string]interface{}{ "accountingExporter": map[string]interface{}{ "enabled": accountingConfig.Enabled, @@ -930,10 +1064,101 @@ func getAccountingExporterChartValues(accountingConfig config.AccountingExporter return values, nil } -func getLimitValidationWebhookControlPlaneChartValues(cluster *extensionscontroller.Cluster) (map[string]interface{}, error) { +func getStorageControlPlaneChartValues(ctx context.Context, client client.Client, logger logr.Logger, storageConfig config.StorageConfiguration, cluster *extensionscontroller.Cluster, infrastructure *apismetal.InfrastructureConfig, nws networkMap) (map[string]interface{}, error) { + if cluster.Shoot.Spec.SeedName == nil { + return nil, fmt.Errorf("shoot resource has not seed name") + } + + disabledValues := map[string]interface{}{ + "duros": map[string]interface{}{ + "enabled": false, + }, + } + + seedConfig, ok := storageConfig.Duros.SeedConfig[*cluster.Shoot.Spec.SeedName] + if !ok { + logger.Info("skipping duros storage deployment because no storage configuration found for seed", "seed", *cluster.Shoot.Spec.SeedName) + return disabledValues, nil + } + + found, err := hasDurosStorageNetwork(infrastructure, nws) + if err != nil { + return nil, errors.Wrap(err, "unable to determine storage network") + } + + if !found { + logger.Info("skipping duros storage deployment because no storage network found for partition") + return disabledValues, nil + } + + if storageConfig.Duros.Enabled { + cp := &firewallv1.ClusterwideNetworkPolicy{ + ObjectMeta: metav1.ObjectMeta{ + Name: "allow-to-storage", + Namespace: "firewall", + }, + } + + _, err := controllerutil.CreateOrUpdate(ctx, client, cp, func() error { + var to []networkingv1.IPBlock + for _, e := range seedConfig.Endpoints { + withoutPort := strings.Split(e, ":") + to = append(to, networkingv1.IPBlock{ + CIDR: withoutPort[0] + "/32", + }) + } + + port443 := intstr.FromInt(443) + port4420 := intstr.FromInt(4420) + port8009 := intstr.FromInt(8009) + tcp := corev1.ProtocolTCP + + cp.Spec.Egress = []firewallv1.EgressRule{ + { + Ports: []networkingv1.NetworkPolicyPort{ + { + Port: &port443, + Protocol: &tcp, + }, + { + Port: &port4420, + Protocol: &tcp, + }, + { + Port: &port8009, + Protocol: &tcp, + }, + }, + To: to, + }, + } + + return nil + }) + if err != nil { + return nil, errors.Wrap(err, "unable to deploy clusterwide network policy for duros storage into firewall namespace") + } + } + + var scs []map[string]interface{} + for _, sc := range seedConfig.StorageClasses { + scs = append(scs, map[string]interface{}{ + "name": sc.Name, + "replicas": sc.ReplicaCount, + "compression": sc.Compression, + }) + } + values := map[string]interface{}{ - "limitValidatingWebhook": map[string]interface{}{ - "enabled": false, // TODO: Add to opts + "duros": map[string]interface{}{ + "enabled": storageConfig.Duros.Enabled, + "storageClasses": scs, + "projectID": infrastructure.ProjectID, + "controller": map[string]interface{}{ + "endpoints": seedConfig.Endpoints, + "adminKey": seedConfig.AdminKey, + "adminToken": seedConfig.AdminToken, + }, }, } @@ -943,3 +1168,21 @@ func getLimitValidationWebhookControlPlaneChartValues(cluster *extensionscontrol func clusterTag(clusterID string) string { return fmt.Sprintf("%s=%s", tag.ClusterID, clusterID) } + +func hasDurosStorageNetwork(infrastructure *apismetal.InfrastructureConfig, nws networkMap) (bool, error) { + for _, networkID := range infrastructure.Firewall.Networks { + nw, ok := nws[networkID] + if !ok { + return false, fmt.Errorf("network defined in firewall networks does not exist in metal-api") + } + if nw.Partitionid != infrastructure.PartitionID { + continue + } + for k := range nw.Labels { + if k == tag.NetworkPartitionStorage { + return true, nil + } + } + } + return false, nil +} diff --git a/pkg/imagevector/packrd/packed-packr.go b/pkg/imagevector/packrd/packed-packr.go index eeea220a2..6ea6355a7 100644 --- a/pkg/imagevector/packrd/packed-packr.go +++ b/pkg/imagevector/packrd/packed-packr.go @@ -37,12 +37,13 @@ var _ = func() error { "382731237e4d35be98d00347013af1da": "1f8b08000000000000ff9490b16a33311084fb7d8ac5bdf4f37741655ca437c4fdde69ed6cac5b1dbb5220317ef770771007428ab4c3ccf0cd5caf01e584f148a5b3c7b3d53e1f6ae141348b9ef7559bd552d8222b0d8533de6e1042808b684eb82fdd1bdb9278dc1240b31cd95caa26b481c648bdbd54930f6a52355e1e3c4afdf7f61f266e94a951024444a58913fabb379ed28a11ecce11c62f10f03ebcf2d83c41c08de2d9d9e02f158834cbd3e248b8dbc1e23af06903f931ec1bdeb8a981f224baeaf79e5fb7c2f231ebfadc67000000ffffbbf0e6b36f010000", "38c12bda86f4d2d9fea5abe8351051f1": "1f8b08000000000000ff3c8eb10ec2300c44f77c857fa055bb76432c2c5dd94d6a4824c7ae6c5389bf4714b5e3e9de9d1eaef54ee65565826d4c0b79b6bac69e2f70236e900b5ac0530d660ae41973a94257467772c82a61ca4c0b3c3e1085a0fd81ee6cac6b28f822832a3be1453520f3db832c09369a8e55fedda6ed501afab11fd2370000ffff6d4a3193a5000000", "3b42ac1a4a108d13f110e0f6d0659827": "1f8b08000000000000ff848fb14a04311445fb7cc5657b07c4c122ed543632a86c9fcd5cd7b0d924e4bd199175ff5d32a360b75d38399ccb7325ec5925e464b1dc9b534893c52beb123ccd99ea26a7ce1a20b9332d2e1784e4e33c11bb4676e870bdfe7e4b717e73ba17463a61f7fc87372bba03a358f33fb3b116fa46481393a26fb614fa36ac5f8516439c45599f46030823bde67ab3f3b8ad965c555aea6e7d5af4fd83018052b3669fa3c5db30ae445d3d52c7d56a77ec5d9c29dd270f1f399f869cdec3b113d685b549adff130000ffff34dedd7d42010000", - "3c3ab9b466e8b80e79b5c935c03d5f3d": "1f8b08000000000000ffbc92c14a03311086ef798a7981b45d7705c9b59ea507f53e24a3864d332119bbf8f6b2b10bda45c4434a2e93e19f90ef63b4d60a937fa65c3c470347120cba08da71e3797bead4e8a333b00fef45284fded103c9c4793c70f0f643cd030e058d028878240318024f5a589f523c374b424b065e7ca609435025919d07e835532973a52171965a2e170343df0db50190320b5b0e069eee0f7f871ef75f21e1e545eb5d36b0dbd4b3dda996e02e967f80fffec7caf443cbca029c2ddcf6abc8e2e05ba425f49b486a8e7dc9340ceda1aecd74d77639637ba2cbe5ec6e7af5190000ffffc3d3cc2e69040000", + "3c3ab9b466e8b80e79b5c935c03d5f3d": "1f8b08000000000000ffbc94516bc23010c7dffb290ef16183a556db810becc93d0f1f365f47d69c2e1893909c9651fadd47aba2539c8c91d197ebf57f477fff3b8e319608a766e883b286c30a4968164894cb54d9c166982c95911c267a1d087da5243e2355d62fa756abf233690ba420c113002356c841686d2b46966d9cd92583132572982b8f95d03a090ecbb600171e43682306ce7aeac2fd0b87221f165d02c0794bb6b49ac3ebd3f4bae865b21591dd772c95f41cb2b47b065912135c9af00bf0cbffd8317db3e5cc05d8b9709f9f49f61e1c4962427f10b9e8d8a74c45111feabf99c67197d3c4273a5dcee1284fea9a819a433a137a8d21956b6f438a46bc6b94d034519103592f16f8c76354e417cfcc4133caae8ac659f6f0e3c1aa6bf0c22c10faea0efa68a4b3ca10f0c733f7b65f42ebdff190ea1a6e82d38aa0c77b870eb7e95b064d33c847dd34d074c61f855f010000ffffb78d66b80d060000", "3cf70b764b66f97c0a3292cba04930b1": "1f8b08000000000000ff4a2cc80c4b2d2acecccfb3522833e44a492d4e2eca2c2801f33d527372159233128b4a14d2f28b149273f24b537493f3f34a8af27372528b747313f312d3538bb8f2127353ad704aeb1667e4e7977095c16c31d033d433e002040000ffffc6e18a3478000000", - "3cf97f8d9a804f48ae015d0c9eba62fd": "1f8b08000000000000ff9c56418fda3c10bde7578cb8e3ef43ea29b76ad543d576556de94a3dceda03b170c65edbd92e62f9ef9513020102219c80c97b6fdeccd843d0e967f2415bcee16d96ad34ab1c1e2c2ff4f207baaca4880a23e619006349396c36a0599a4a114c52640202b6dba9ac2925ba1d3038940d5a3c91210c241edb306cb71980c1173221cfba824d2c497e8066451ce15342b7169a2c628da5c9e1230300984ea7f567b790e4da08e7ed9b56e405bd47e2f424889dc012bd22262fa4b195faef6d86c61538ab85f62d88de1a43be6946e5316acbd9663305bd00f18ca6a2bd9e349a383e58669209d65408701acfeb28004a492ec523719caf1d85ba559e5e2bed49c164405f9c0b800e7bfe64c85f1f7f67b96e721b1de9aac31c67a74bdcfb787563bbf2ea46b62111f6f95e2a1fe2c88c35675cce86b2ddd6478958b55fcf4f5589b2d04c5f4b5c1ee67314ac6f4fb47fb034d7c9c7d7a99339495294aa3d99215a8f4b6a7fa6238c213cb657ff2449628a1d45ec91879602487428755c0fb377c0ce3c50ae2a7770126441aa32978d3404d1e2ba36149988bf185d286cfc495e5b3524d3436915b18a45eb8b185f0cf5aa2598d83dbf3ce5535423db2eaf393172bca87e0ceb996d70a6e2d5e74ae97883e30e7ad8f8057093a420f9fbe9fb508e0675c49adb15f10dbc1ad753304a692b8e9a975fde9df591fc2d933a23dd30b7ab9c262553fc6bfd6aee71b1d0f27094c759395639cf02a0399267348f0df2da5e18d63f153b2c8fd9ff9d7f8976af2df4f250586143e40bcba227735744b4dc6e6109778f568a1dafa1f4be305e47627ff5009292b3bb34c9c76baadf687dbff08ad6a7da9d0bf22f0000ffff834beb67ee090000", + "3cf97f8d9a804f48ae015d0c9eba62fd": "1f8b08000000000000ff9c564d6f1a3110bdf32b46dc714bd513b72aeaa16a1b55298dd4e3c41ec0c28c1ddb9b0611fe7be55d0cbbb0cbb23925ccbef7e6cdc70ea0d38fe483b63c8397e968ad59cde0cef2422f7fa21b6d28a2c288b31100e38666b0db8166690a45304e913108d8ef27b2a46cd01d80c1a1acd0e2810c6120719fc3b0df8f000c3e9109b3515db08a25c937d0ac88237c4ee86ca1ca22b6b83133781b01004c2693f26fbd90e4da08e7ed8b56e405bd46e2f4248883c012bd22262fa4b185faf03245e356382d858e2d88de1a43be6a46e1316acba3dd6e027a01e2114d41473d693471bcb3cc2413acaa10e03c3e2ba3002825b9148fc471be7514ca56797a2eb42705e31e7d7129003a1cf9e33e7f6dfc83e5b2c9393ad0558d39cc4e9d78f4f1ec8676e5d90d6c43221cf33d153ec481194bceb09c1565bf2f578958e57f2fb76a8372a599be6d70799a4f2358be3dd1fec58db94e6ebe4eb5cc4992a254793343b41e97943fa615c610eef3ab7f962431c581228ec8534b01243a943a6efbd907606d1e28d7853b39097245aa30dd462a82c8b8ba0d4526e26f46175636fe22afadea9369a164452ce22afb22c62743ad6a09260ecfbba77c8eaa64f3f19a1323c74ef526ac65b6c19982d75f0aa5e30d8e6be87ee31de02ac98ae49f871f7d392a548335b76be21b7825aea56094d2161c352fbfbe3aeb23f95b267541ba616e5739554aa6f8cffaf5dce362a1e56995875969aa5c6601d01cc9339afb0a79ed2ef4eb9f8b9d8ec7f463ed5b22dfb5855e9e0a5bd910b9e358b464ae8b88ccad179670efd14ab1e6194abf1786eb486caf1e405272f62e4df2f19aea77dabe5f784ddb73edf38bd0bcf0aaf036dcb499f952978c1bce4317fc78cf8954de9fce756daa9c28b5223f9d15f93f0000ffff40512d4ed30a0000", "3dc5e16512d42ef9684f1c8829d9b5e9": "1f8b08000000000000ff7c90314b04311085fbfc8ac7f51b10acd25aab60b1ad8c9bb963303b5992dc8ae4f2df25bbae6863373ce67defcdd43a40ceb023852b672b335d78e4a9c4f4bc72fa485218ad195a64e49425aac37a67de45bdc343d4b35c1e69313317f254c819406966875a213a85ab679cba7282456bc3c65f37fe108f806f535e68da9df685035366fb74c8bd0310e88d4376e6377cd73afe0651cf5a70dfb78f3a5b627efd09b39f3407875b87fc7bf55f5cff13abefe357000000ffff638effc133010000", "3f2db9e2324bea2f9957ec1235ef2dc0": "1f8b08000000000000ffec57cd6e1b3710befb2906ee21a795e4a82982057408123429901fa13502f43826475ac25c921dceaeabba79f782bb2b2d654bb61c24400edd93c4f9e697331fc9dbdb02cc0a269fd13614279a82f59b4f9f2ee1cb97b3a228ce3098cfc4d17857028610a7edc5d9b571ba84371db426276735096a142ccf001cd654428daa328e0ae59db0b796b8a8d1e19a7880c4808a4ab8bd85c9ef6409234d3e6e97936f008b5764633209b046d6e48827cafa464fd95b2a61b01d2c3aea50184209d7cd15b123a1d8adf5d007c289815472c2d49a94e63b13c5f3e6bda98d9430eb24c11a85b18f7628d476b18f359225259efb686b1455bdcfc23f1cda09c10108d5c1a2d060392b7467d6392f28c6bb9d2780a82ad28d259ea00d154e46b713e3a78a8d1885b6085e97f0ecd9d99d0e085ebf1aada6f46e6f41fc9f58db63987fc1384d4ee0650f2f809cee0b933ebb57895337f378d54eaa5bff39921bcfd7c6ad2777bc8a2fb48b25a0b5fe86f4691aa1b9b2461503e6c9da6c5a14fa5af548a40b0c2612b7c44f55aebc97afd35eb1af8bc0be26a9a8c9a2bedf387dcf1fed9941fc60bb6cc7b1fb4ddc1a45af94f28d938f8f134bfa84b836aeebccb78c8a96c4c6eb3f4879a763092f0658d247e388778d593c4a5da90aadd1698104edae76a6c675cf6529b1bf772977eb11ce4fb6783e0ecd6075d958bbf4d6a84d09bfad3e7a5932c544b95b94f2758d4e8fd355c0647adf61262eb6cb459a2ce5ddcaac17c6bdb64d14e2d7ddff3db820af4972f4b4459e5a7375c0d136b3e908df33b6d360eaf6a81053936f64f17c561f046a4693a1aa83a08ad04ab5435dcc662f8f988bb822d98c93504441691265aaeb9dfe7c169fae1cba465b5c3ce8d773a8d0156d1db7f8f99d407787e3e281b3718407cfb2c8cea59a848d8a4bcff2fc2eb65dcc77ffad69c9518c4bf65734760fc00a8d6d982e2ba65879ab4b9867d24a24bc25c91500024a55c2b4df847ff6459e65efdc3c161f0c07579ac0779797cb4c609c1183f60d59dcece6783ecb10617fc62f72596c94a218b37c2e32e9b0e3f7e8618f473e508c6916fb3435b5d34c5858bf7e486918de5f8d1dcfb5d6dba6a60f89d5623eb9755a19dc3c3e62591a275cbab61f13ea4fce6e4a106ee864eefb0664f7fdd8ed5e904f64b99f402a136165710dda5304e705d271082bcfdda5cba65157d770450a9b487043e0a825861b6202bf5a1965d0da0d24ae62a2cc748a459325a1a2366b46213db2a0c51817d9467c07c6fd76847217fa3f973fc2e577155ae2ee2266dcfa888b01d984c5f343ebdadfb8c5c58f4cea3f34a7a7c0f7087760bd3efcccc4ee76b83c39d5c05ebcf2b684cbd763a64cd137ac28967b14fc574351e27ec155684a78917510740fbedaf3a6845f7efe6032814dafd343fae7f3f383faf3d96c9659f8e10ea03ea027dcc5c7d72e29deefdd7ee5d1e742f6f0f82f0000ffff0c25951505110000", "41aee2059fc1b83092cf184b6aa32ad5": "1f8b08000000000000ffb4d1b14e6b310cc6f13d4fe11748aeee8632b2b051a982eeee89db9a2676e42415e5e8bc3b3aa22a5b375ee0ef9ff5cdb3073e806887b0c33ca8854435eb75b379836571de7b879577648d5522d81ea780a39fd4f80b3bab84f3530bacff2effdd992545d86aa66796c47274853a26ec181d8060a108f4d949d6560b47b4444216a6ac23c579be13aae98513d92b1682658905a7130bf949a59be64ce60b0a1ec96edd5671a208e7b127dfaead5371a699b674582f63e517d3511ff01dc0affecfb06dec3f68ea2d3a7f3bf7deee3f44f8913f0aac7391a47599ef000000ffffc839458bba010000", + "4787cb877ff989b4782fb43163be27c1": "1f8b08000000000000ff34cd3d0ec2301044e1dea7d80b244adab4505083446fec81588a7f985d2cb83d0244f99aeff996cea0a65a16e9b38bd0c0d4ecdb076c59c2ea6972ad949355fa1b6477dcab10f74722a25c5e622b044f43f9304363ed29824386f9cd159fb14860d4417f80ebffe134cee3e4de010000ffff7db33fac83000000", "4d7ee2a76b9a975f422e840eb186bb23": "1f8b08000000000000ff4a2cc80c4b2d2acecccfb3522833e44a492d4e2eca2c2801f33d527372159233128b4a14d2f28b14b24b93528bf2524b528b159273f24b53740b8af2cb3253528b7493f3f3d232d3b9f2127353ad70c895c12c31d033d433e002040000ffffd8a9807277000000", "4e41d9e7aabfb536bbe7998bfd0a270e": "1f8b08000000000000ff8490cd6aeb301085f77e8a79012be4ae2ede15ba6d1342c97e229da422b24695c686e0e6dd8bff68da4d77d2391fd237330c35f933455132470e1d8a7148416ebbdd1bddefd5d2af5d9fd820f229c08d2d277f442e5e6243dca914cbc1c78bb9fe2fc6cba6df9ea0fcafbafae81a3a22abb71cf6e29e1616b96aa1ec58b9a98822b768a865fbee236a2b51b384805cb71cf9825cf78917ac24b6686818c81c10c005e6758d47b39260c72795f3057ac079bc10fd104ea96cfaed94cf86cfd3e42da24ee15f3a1551971c2bf612bcbdcd3fccc98bb8c5ee61718fb0f9e6e8933e3a51aceb4674bf8e5f010000ffffa33f0049a5010000", "4e5b1dcf947817d2b8d3987e1daf2102": "1f8b08000000000000ffb458db6e1b390fbef75308462f2b3b69f1033f06f00286e334d926a9e138dd5d608140d1d0b6361a49a038d3b869df7da139d83376e253b3736548e4f751244552164e7d05f4ca9a8865a7ad4765e288dd02664a422b0112b12011b51833228188496dd3984b6b08add6803c1146cc004b01ef8484883d3fb3ce1834080f9d9b6a99fdfcd9624c8b07d03e0032269c8bd863fa006880c0e76b68f5361aef4006655a3888d840a79e002f472dc664f53b6237d6408b31679172265e1a9f00a192054fd8cc0d5546ea3406d67e8db31344dbac53d8cf98434b565a1db1c920107bd020c9e2d167e29cb7ea6110cef9ee321667e0b45d2460e8bf0ec74c600ca6e385cb613bca764bcb0b7ca745eed75f0a1c42a6c2312f94278b8b2b95288ad849bee3b492c217f67e153a05dfc9f1064bb8eb3224956c718866041241727e553bd7cbf6eeb4983182c4694150e22ebdfffccc999aeeb2d1d9b86f8c2541ca1a5f650f6362b518a018d9bf44a20f44fbc19489c110fb7f000e068189571cba71fc4342fbbabbf67058f119a06f161f9599750a5ec0e254dd29da843bb409d01c521f31a1b5fd06f11eaa64796c0ed5f0736b890ba73c600678a0b64b1fb492bc9459e3aef2397c64356015d1628933984e41522846c3279029addc6b5d90b618b1e193f254f937785428035803d979cb8b4f25620665358be169994bf9ba67ed90ba5acaa4bdca905269946a3db25ac945c4fafa9b58aca22d6d920813af9288b34e3747e23b0de28c97420e6da662c05eaed910c8ddc95343623683b890ef11a6b00693d7752e558cbddd95c1d9f8a60858fdac75a0e0d33d804af1502f3790ac91292218e2bee894dc2f8cf4bdd393a55c5e2376b69629084a113e09021f5acc0f46a892db743a554facfdbebd76cfeb4684fb29ad99aa59af9b09ec6af5d07d8da7bb126e6068103120cfcb67d3f36589f3906480039b3881c0dabff5d869e7f4637be9bb559128bbd7ba951e648ac0430bed1dd36c2b9c1ca0e9dd46c1db6ef187032c1629cdc19092f9857e133707488beafbdb2192f65c02129f2a0dbb617851ff76ed7724d2068d43950902fe088b37667b84c5b6802ecfa9dc3c28a58ac037926815cb0e693fc8e56e73b1e22e8529214c3aedbf4dbbbc4de17a8d10aaebb546977a58de6821a54d0d7189102ea012da3764b3de8786f528cc0cd8bbbc00bf67ef9c4091b0a8c7deeda833228e55c80ba147410508d037ed7a7eaee0d6d27dcd6160b255b15e758febe1a47f75df1f5ddedf8daf6afb8c65c1b07dc6adbc7677c0c4ce2a4375ce0d9abbc9c5fdc5757fb049748e36891acb61729308f419166398aeef3566dcaa8d6cc83cc2221fec85ee8f2e2fae857cd5b4d1f8cbefc3c1e4fef2ec382738b4ff80a4cbb36de71ff5c793cbc9e5979be36904529e10db896e86933fbe8c3f1f4d534e35db49065777b793e1f86892ea4db695e46c78debfbb9adc0fff9c0cc7376f70b418a622d5347c224023f40be380561918f07e84f601ea793727729f809aa9e804cd23d69d83d034ffded87a8b36193e2fe7103c7231998c6e3718407bd8a6b1a9d02c0cec97debb255f2a25783f9923f8b9d571c44e6bbb53a1748a50dbfd50db554685fa79065a2c6e433b8b7dc44eff57937080cac6abbd93da1ea9046c4a2f291260a24cde56afc1fb30cf16b18a21ebd636b9b6b36d4ae5007caef4c604b4f321ea6d8a121a257bb978c0fb6e05b41cf94e4f7614fcccea3481ebd0a67c7d4cdff3d5c05812544b97edeaea7be397edfd489a756dbea30bd4b13d66dd97e462e3ab1097ff189d2bf4d5a883e04920bdf80a0ab72c4e75f10c88585959f872b9b591529f50481835d3f96395ce45c00e7fdf156db25e958a959b7dd40f8dd771644d94ed51db8361a9f36f000000ffffc7c306c9a0140000", @@ -50,10 +51,11 @@ var _ = func() error { "58c837145291f389757664f81a2ba54c": "1f8b08000000000000ff4a2cc80c4b2d2acecccfb3522833e44a492d4e2eca2c2801f3434b3273149233128b4a14d2f28b1492330b32528b748b4b334b528bb9f2127353ad144a4b32738a754b728a755165cb60661ae819ea197001020000ffff816d487666000000", "5ba0f6784fa5c9e89d1d73458e750212": "1f8b08000000000000ffec58518fdb360c7ecfaf2052600714e7047d1bbca7a205ba016b51a45df7ccc88c2d44963c89762ecdf2df07598ee3f86c275dbb1b0af45eee4efa4cf1a3a88f940e8708e406169f5095e416ae50a5debe2c13c97fd23a3366bb208d6b45091c8f332ce427b24e1a1d43f562b6953a89e195d11b99bec562961363828cf10c40634e310473117a7bd12e188c44fd418371050a8ae17080c58a14a1a3c5bbd3b05ff2642f98288c9262bfd863ae62f87b0600104551fdbbeb5b0d5e6c7f760b6996d58b3531bea841c1e3f7b5957ac0968a5c5cff09f00c3e66041ba394d9499d82a5bf4a72ec60479620475da2527b900969961b4909a0834ca659541955e604a81350661759e9b6f7ad516720b1a600ce285f34a31128aa48c5f0ce686ac6002c39535a71f62840536bca2286f9bc333a020e1f904e0a2335bb47338e6c25058d4f2c1d2397e7f9d291edb973e7f68e298fb7e59aa2c29a87fd5d3b5f915df7e03b6491cd9e84b736c900b57a7488d71b6f7f845cfdd124af94789a559bdebd0febb885659e60e7af6da0309aad518a6c94a3c694ecdd38d8898c92528d619a2442214ca939ee108d4f8e75d6bb1addeeff659120d313a551bb711353fd841a406ca446253fd32d7b8185f4d1bb212aadaebc36fa8e4199147e7dff1236c422f3aa95135b29dcd728cdc94450d06f924a376cb1926e901d67e4082c611219adf6f0c7eaf72becb4d1ab86a007f75c5e66848ab3cfcf2f93785985f2d103bb1da629d9e77743ae51459a5d5b289e48ddeb45cfee78a9aa4b4f6112085909029572b0b1260ff20768e951a912a8614da0d0a6740f49cbca922b8c76e460632cd043418229698e60d76a9fee2ac4a1f5d8e4923f30a67dca0d6e45826445c97f5307c60e6861925baa9ccf68d5cbd06e71f0956fad288f1262126cbe5c12af581938318d085eb019acaedff5467c5d59be16a36790f87d25e1854ab034ba392c5f781a5a9d0ff6a4d1dffc384ce8ed545a9d1cbbb5d4f6e3718ed4071296d8dd9f7b7c775f2bc747b325bda24ad22e04ce2f85528323ed24cb8ae027584b8d760fbe83bf68866b11f79145f6da0e6f9b6b4308db230d3d4dffefc9ec42341e8d87fb4c8e851bb28f2567febe20d0c7b65f52af2cc93ece36c4b90de11b62b054b89094ddb4fd05dc568e5c349e5012cedc935c3a5f532da5d2b11d09c1195f487a609f42463fea3e2e71375bfc77bb720134567ebe01679c4025753a34bdae2568604290f57749e12beb84f97358bea05feb2034f1ced8add4e904a838df8b7b33768d62716b289a4bc2f45a8e98a54ea77c766c2ca6d447dcda497607769715e0356db0541c8e462deb5b6d761a5ebeff6d4cc4574d15f8717e7e9c9feff3fc4c643f2a058633b2e33799afa8c2838f80be63098573ea21afea3edbbd3abd1b0208553aee3447d169a4eb4bb84fc7303f1ca6de374babe078ec9ebf4e4e45cda6f13e86f992582c83859a4cc365e9f16e2970212c9fed8cbf80060a46333d70974218e95238b11a37137e7ca7d803b50f0a373b545a4bcd038d77631c5958da9025edc50c0ec7195cf6aad1d04a7d776a8f5bd7ea3e27867968b1e6b3c3a17eca82e371f64f000000ffffcd6b58b9a1160000", "5ce61dbf66a518f6853f3cce091688c8": "1f8b08000000000000ff4cccb10ac2301485e13d4f71e8030404a76cbe808382fb3539c3c5f4b6346997da77971005d7ff7c1c99f5c1a5e86401dbc9bdd452c09dcba6919718a7d5aa1b59254995e000939101fb0eb598d7440cad0cf0388eef5c6689ddf81b33a5d05f7fb9ab2c4fe612dcff4d6fede80db544ab3837fd090000ffff9758e0e9a1000000", - "5cf20567ec019d8e4f9ac24d52c085dd": "1f8b08000000000000ffb455318fdb3c0cddfd2b848c1f601f3ea04391adedd0ed862bd09d961887175914242a697bbdff5ec8b213dfd93d17283a857e7c92c8c727a5aeeb0a3c7dc51089dd5e85167403498e1ce80708b16b4eef63437c77febf3a91337bf5c9a628181ed862d5a38001817da594831ef7eae94991d3361954bb8cec54a39e9f2ba52cb468e3be9a130a96293f1539834ed4bbcc0ec962dc57b5024f9f03271ff301b5c26f822e171a9b0e824187a1d19693a9940a1839058d2355972ae3f041ee10204a485a52c055ec2e0a482a29cd4e025b6fc1e10a32a75e389ca653c6f8963e6368c7723a94e1d7522cc105441f87c85fa3e40d082edbbeb6b6d9750f0e3a3457f46511bbff76cbcd77bb15f1d81da8ebc1c759ee1efa29ef039fc960a8f3fc6d6d11f2075ad4d931eb9d5f5eb779eb7dbda68cfaa26c7b5dfb5b7f9605a6a798fd11b0a3286149f034f3d02ce150f2f8c87537f49528d9cdd1831e2d81677452c2883aa0c4a574b542673cd34434e82d7fef670bc399a60dc70fd09ad344185d1cd8e20268c919725dc16f8c45ea91db127836b7e0ce72572c9304845c77c1f6c87c2af5a722dd78668ac2fda486c10339ba6547e53c5bd2f4478eeb411fc96113c10f365e553bafdcde0a9270d460df9adb19839006ebd94cf4726337eb1ccc1d05f46975e30305bc80b52f2673a17c41b724f9ab57f76399ee3f7b7cd9e2031ef2ae93206f545829b5fc5bd8a827a6f611b50c2f7c59fca578ff43f1fe763fd7bb38709a07b408119bfb09ceac5f010000ffffc6552678db060000", + "5cf20567ec019d8e4f9ac24d52c085dd": "1f8b08000000000000ffb455318fdb3a0cdefd2b848c0fb00f0f78c343b6b643b71bae40775a621c5e6451a0a8a4edf5fe7ba1c84e7217f7d2a2e814eae3478aa43ec66ddb3610e9334a220e6b233dd80eb26e59e81b2871e876ffa78ef86eff6fb3a3e0d6e683cf49511ed86333a282038575634c8011d7e6e9c950b03e3b34ab82ac4c679e9f1b633cf4e8d3bab92454ac50be1b0a0e839aff0a5bb2c7b46e5a03913e0ae798ca05adc12f8aa1149aba01c46140e9ace7ec1a63041367b138516dad321d0f14360249255bcd828bd85d52d05c5d96830afbe821e00272493db0ece65b26fbecdea3f4533903eaf1d753aac601d46e8f563c59393a50bc6efbd4dacdae470830a03ba12f8b58fdb3ba4ebe5a2d0c8fc386861162baf0ddc338fba3f09e1c4a5bdedfb71ea11cd0a32d8a59eefcf0bacd73efcb351534d6c9f6a7d89feab306b89152d187e04049e59a10e94243178e805a9e8fc270465f0da5a83945b09324708f41ab99d00a6aba1e5d6b30b8c834131d46cf5fc78b40d9d39c703a80b59c67c2a462618f57404fc151182a7e665cb91eb9af46647736ee3c0f55325941290c07ecb7ccbb5a7faea39beecc49799ca7e1704381cede6972913d59fa25c58d60b714b04b108f325e9c7689bc9d0ab272b2e0df7ab73d8a92051fd9cdf4bab137eb3c8a3b29d8dd62e20d091ec0fb172f73a0b2a0bf3b92a42c306077eb4a978597f2fdd1bff8fbaa96bff667ce1e1f7053b2ce5dbf516163ccf567e6463d29f78f68f5f8c5a8c19fea2ebdabbb74bb9fd36e1f39dd037a8484ddfd0c17d68f000000ffffad74990b2b070000", "5d94fbff4f7a9e1295064ac3bc2906e5": "1f8b08000000000000ff348d3b0ac33010057b9d622f2063b7eed2e504e917e9110bf4e3692d92db87185c0ec330dad30b1ca9d55de6e6224660ea76f1439ec845c2a134b126113db7afd801792b232ae8f131d47f3efcd49ca25aa32f30cdc2b35a2a1022ab210a31dac980e1aa16ecb777f3feafcbb6acee170000ffff3fb561e092000000", - "5dc8d2706b8b1aaaa6390b86d1afc17c": "1f8b08000000000000ffbc575173da38107ee757ecf0d2eb834c3a7773d3f31b019272498d8738bd4746c80bd6214baa24933299fcf71bd90444a09094cc390f319276bf6f57dfecae1f1f09f01944dfa8a8d04694315549c7e57cf0432be3d04428e954600e4f4f2d42488b6afe0d8de54ac6b0fcd45a7099c77087cca06b95e8684e1d8d5b00824e5158ff0640b58e61eb9ae0da770b40d2120fee1127ec7adf6aca3086c74788c628905a8c92e7654fcbad34c630d2f47b85ad677c46238d656d65f07bc50de6d03e12e676a99b0e234681db8d611b7e9bfef9074a762c4f2f1d7cf4d40098e028dd595cd0b873d9a0713b7cc80257e772bac1d53bd0bac1d5c743daa25adbce46607dd442ad4a94bb22fba97a5ea99c5d992e3e5bf253a95a8dcc1fb3289039651a93923a56dc063e4e780170586a411daeed8360fc23765c9d74d63c270f48740fca2cb89c47736a7294682226549577664695441b55a22bb0b2315021d403e6af30758ae4f2ad16b650ca11aab945b344f3466b5d4d0567647d660f9b4aa91c755cc9208396159857c26b4fe882468b6a8a46a2431b71d561863bcea8205ae5317cf8509b3d5fb57f98928e728966e392002fe9bc51159739fed8e8bd5eb7d03e7015ed466dcd539f4b2b215225385bc5d0150f7465b73938a2eab54cf812255a9b1a35c56dac008573fa1a5db804a0a92b62e81448852b7677947131fc7e7171b1b3ec73e6297cc9b234d898512e2a835961d0164ae4317cdaec1aa439ffbf29f9b3c15593ed6da5fb5e502ec3a34d926fee2f0793dee83ec906e3c9e530e94fbafdfe38405efaab8de122aaff8edba7dd7136cc86a364dfde57a0632dd67056f8ea66234d8de35ec3c37ea8998380d920e926d939680e2595ee24503a1efd3de8659361ffacd08cfa17997b4560bddbfb3bffff3c3c262aebd0bc012fe97e1dbc03a2ef312731fd8fde28b91a5eef237696d474049f760e14818eaf604cc9199f1f07e8f6eab761723de9a6c3c997d15df62bf1edb6ec4259275f13de0bf474343e20d4f65ba0fd223c3db58fe32683ec9fd1f866928dbb5757c3de6490742f6f07077474027bdd6432436733ce8229788bbf54a22af1abb7b4fba5e558fd0628fd5eda54c123971d780d2dfce064036f0d62b86ad03a6adcc10ed3f00e1ada69c2b61ef0c31adeac24272cc9016abfe0adfe1878392106a3c2e273ddcd37e362d26c35d11f9818716ed05a528f0f24c0a39abf72727c9e11b4caefce9c0875cd325be9e64a080c6a762d58d36c169d6adc11e0fa5228b6d8a68ff1dc6c5a54a76952416b24a08d728a291143d67bee9e4d9ffdcb77c89789f5f912c43aca163b59ed35d5ed81e7f86e099e71830f54884d42c3987783d8125e47b017d536472f53e23f7351d61fb1ff050000ffffa48a3e95f20e0000", + "5dc8d2706b8b1aaaa6390b86d1afc17c": "1f8b08000000000000ffbc575173da38107ee757ecf0d2eb834c3a7773d3f31b0137f525351ee2f41e19212f58872ca9924cca64f2df6f641330890b49e99cf310b3d2eef7adf4cdeefae181005f40f0958a0a6d40195395745c2ea3ef5a1987264049e70273787cec11427a54f3af682c573284f587de8acb3c845b64065daf444773ea68d80310748ec2fa3700aa7508fbd004b7b17b009296d8b9469cb0db75ab29c3101e1e2098a2406a31489ecc9e96db680c61a2e9b70a7b4ff88c061acbdacbe0b78a1bcca17f24cdbd6998c601a3c0edceb10fbfcdfffc03253b764ecf03bcf7d40098e028dd595cd0b873d9a071077cc80a37e772bac6cd2fa0758d9bf75ddaa25adbc14e6063d4426d4a948722fba17a5ea99c4399ae3e5af243a95a8dcc6fb3289039651a97923a56dcb4629c8802e0b0d4823adcfab792f18f3808753258f39cdc20d1dd2bb3e272192ca9c951a2099850553e581855126d5489aec0ca86408550f798bfc2d52992cbb77ad8422947a8e616cd1acd1bbd7535179c91ed9e17d8544ae5a8e34ab64ed0b202f34a78ed095dd06055cdd148746803ae06cc70c7191544ab3c8477ef6ab7a7abf60f53d2512ed1ec4212e0255d36aae232c7ef3bbdd7760bfd8eabe8376a6b9e7a5f5a09912ac1d92684a1b8a71bbb3f8323aadeca84af51a2b5a95173dce70a5038a7afd0b54d009aba2284418154b8e270451917c2ef17171707667f669ec2e72c4b5b0b0bca4565302b0cda42893c840fbb558334e7ff3725bfb775d5647f5be9cb2828d7edadcd215fdf5d46b3d1e42ec9a2e9ec324ec6b3e1783c6d21affdd5867011d47fc7fdd3e1348bb37892bcf4f715e8588b359c15bebad94053e3b8d7703c6e6ba613308b9261929d83e65052e94e02a5d3c9dfd1289bc5e3b35233ea5f64ee15898d6eee6efdfff3f098a8ac43f306bc64f825fa0588bec79cc4f43f4693e4537cf51271b0a66620f87cd0510406be823125177c791c6038aadfe2e46a364ce3d9e7c96df633f91db6ec4259275f93de33f47432ed106aff2dd0de088f8ffde3b84994fd33995ecfb2e9f0d3a778348b92e1e54dd4a1a313d8db269319ba5870d69a82f7f86b25aa12bf784ffbb2b41cabdf00a55f4b9b2a78e4b25b51db1e7e70b2ad680d62db6ad03a6a5c67876978b71ada69c2b61ef0db35bcb124273c4907b59f88567f0c3c9f105ba3c2ea63ddcd77e362d22c35d9774c8cb834682da9c707d2c2a39abf72727c9a11b4ca6fcf9c0875cd32dbe8e64a084435bb1e6c693646a79a7004b8be148aadf6c7c7786e762d6ad034a9566b24a08d728a291142367aea9e4d9ffdcb7748ff0d88b2fec2fb2f0000ffffbb4b38ed0f0e0000", "609264cb2ebc675409b4bdd14f774311": "1f8b08000000000000ffa456416fe33613bdfb570cfc7d8716a8e4ec62bb2804e4e03a6a1b34890d27c8a2a780a1c6366b8a6449ca8990f8bf1714259972e4d89bea927866decc23e77148a2d83d6ac3a448802865469b4f833513590217a8b82c73147690a32519b1241900089263022f2fc004e5458630749621c4b0ddd66ea308f531f11c391283f14d63f6519c3c2237c9204ce36d2ed12b3091a1b0f0c5451b85d415d6b8618ee71fcc58a9cb2b96339bc059e5519c51627cc97bc20b34716d9cc842585fd420476aa576c9007262e9eaea341e5f7d028bb9e2c4629d20d814f71121a4259649611a13c0cb4b046cd192623959e27dc562ba41fda499ad77c47f7485746d8a7c44a558b0654e54e4caf0a8026e2a60241b64a70d3f28cd8485ffc77735cbf857627046ec0a8641bade447149723efcb15ab25991cf3f7f35451ef272cb40911da1da2f8ac8077c80ec115a278ae89706d108a9622f85254ca06e7b151d53b6ffaafd4b601828ad3239bd49c39c3261bb4ddeb82d59c2763bece699159ccf2467b4ec48d72354ebec6cbbcc7322b29dc222182d89ce50a08ef0d9a27067a456cdaa54a88348a5e58665a86bb7db042d39770622c8b2131bd57d8b168ce3f9082d1df56f4dddaffa4fd5b3fd34ae8ae2446094936767a085d6286ca4d1fd601ccd79b0fe1daff6ff0a1def90b7a5a026dc175789898526c6ea82da427fa056177fb4da52488d9154a8ab531fed06c0c1021564da20c62d603ff793d4ebaa2bdfb9028f3bc6fc091f5752ae9b06b723fbfc9d897d106d506f50474a6a1bb2aaa3265e143e6826b5ddcf9631431e39065aec2cae764f765e7885bf251330fc697828575dbb2fd1b7da75200b8a4d78b2fc44b84ac717e9fc21bd4a277797d39b879bf1757a3b1b4fd2361260e3aafca6659e04468005439ecd71d1b5d67637ee92f61a89db367cf4f268f85e5e8f7f4fefd3c9dd74fe30bd4fe7dfe697776fb82630a22ba2ad79686f815155203074cf72cf1de09a6ede6e58a310dff5a0723b759d123a23ef14b9809b5f5652c913b89bcc067bdba3d1c84253ecc8bd3556d784957f919cf7205e41d4b7c5a73307ef59eb46f222c76bf79ce859b23f0c01d5dc05fa0e1f9f9dffb5e3bd97fa01326fba1ec46924d954f03201ab0b3cdc79d71f46714ca94b7c73fcdefc1f90c5820966cba4b538f9646361d9b8c7e5b8fc53308dd945a19958ded215660567627959cdd0da9c3e232ddc00ed6223ff36b8ed3cf81a27348fbff4596934267cb0ed22225863d95d957f5bc444a9788de5defa769fbf10a44ee052f4b8abd3d753d0953c50ad82f4d6b352492e97e59f8eeb705d3ca216689d72e468258dad1a310805fce6bdb3a740fff39aa87064bdf7328adae75a00c870410a6eaf6586097cf97c36d809e964799f26eeefe77becb0bcc3bd3e04ff060000ffff6e134402340d0000", + "6708cf6d63f8ac6cef9029fe0bf53e98": "1f8b08000000000000ffb456c18edb3610bdeb2b06e92197484ed01e0add026f0fdb36c922bbd81e8a1e28726c33a648963374eb16fdf782a4b4b66479372850de381cce0cdf9b375255d77525bc7ec440dad91684d7f827a34d3b6af6df53a3ddeaf0aeda6bab5a584762d77f46723148bcc18db69ab5b3558f2c9460d15600c25ac72299296d01a4b31c9c3118ea2dda661f3beca2360a430e3ea63ebc6dbe6bde56003260befea07b2416bd6fc146632a002b7a6c41c5e0a82176416cb149a94d4d2ce4bed1ae228f32a5dd06177d0b57bc4aa8a1bef2b69b1435ef8d26fee964fb591367bb37310833e4cf16d2761b8d08271b49e7b1858f29ba1712550530bc3067ab4128953113e62e68cb18d6cec47ec4aa862fe4ec9de05d0b4d7a4ba9fc2eb82f28f9f6263b8d40ccad7c4cb98983b6db2bd1063cd64610214da2dd2f1d5d842cbe8777e5fd7287bd68075fe7d1bebfbb7dfcf67e620650483268cf99e68c296802de21144fd8b890b7e5ecfdddedd3551f9cc7c07ae4aaacb38e3db3ce12bd4eb5142f50a955b1e41ce84035940f6e03bcd304017d40425b9a7712189293b0e0ba047803f7185218a09d8b46a50e3f60600828ddd6eabf9e6213b0cb498d601cdae8b432fd5618380813f10d08aba017470898b240b467f1b20b35f0c105046d37ae851db3a776b5da6a1e952a5ddf47abf9b8caa2d35d641768a5f08066457a5b8b20779a51720cb8125ed7b9749bd5daf4ea9b30689b5e4f6abd6883b2b2729e6120a928512d86abe51527a09329a1f3f987fb0718536732e6e867dc4f17e94441024cdb0d8642e226b83ec744abbcd396f3461a8d760e3fc5aed79c78ff3d2271e2aa81751e5fd02144af04a36ae0d6c25af468d682f07f2720214d7502f6eb28389fbc73e782dad9c1381caff095e577ef514ef4a29074481dcd8231e9e03429c7b5acd2b1bcd3f49a9fcef27f98388f33c23f1946a12af4c61dfb4b46afa2941f3f996f2f94321d864f78fcb1133c0692c3d930033abc880843a5f92b305d9ab15fa8e1992a269c9cbf05bc08a247c63057cdf3d494255d9f3475394be79876ce1914f3b15856fe283c7b7b9191b2027aa3a5b852df1820cdca2d86059f24dfd4a04bf7ebf3f72d9ea7d2170fc6b2160eafa8ebfc5084208e5f2549161ce9455166af490bb88ed204fc8fba249401f9251164a7cfb819bf62f9cf0ce1c75f1ee0c1edd1c2c3a79b4f6f8a28a5b0796ad242b7430aa090cb0c2f74c11e8f10dce2c7f699ae5984f1c258a06981432cec0e8239b7c4eee963d7c2dfff5427268494e819d5c7f93fe2ab57931fc1bc95ce961f3a6ae1d7dfaa920ad5e3f8d3978cff060000ffff9ac759f0670b0000", "6d5a3abc835585a68c7ad0a7cfafa07d": "1f8b08000000000000ff648d3b0a02311086fb39c55c20112d73004b1b61c1f2271961d8bcd8442dd6bdbb28acc8da7f0f630ca1ea2053d3921ddff7346a0e8e4f48d22abc50928e800e47cc19491c5f75920762a4adfd46a3691d7eb45a76dfd87115b6adcfe127f8776855bca379e65e2e4891ed8078936657e05cc5f3933507c99d0fbc2cf40a0000ffff70916521d3000000", "6f8838139b82603038efff9639c6eb45": "1f8b08000000000000ff8cd0314b04311005e07e7fc5709516ae2c88454ab51411c1eb6793f11c9c9d84cde450d6fbef3204c1ceebc2cbe37b24db7605fc0607830b5683718fd2a88e2b15e188f7b9a95dc204a7d38085f7b456ce1aa064e1f8757d9c66329c860fd614e039a707ae6b2bc659ef5a3a900d0b1926340c0380e24201b60d58a3b444b0f36407a3ebfdba168cbd33be9010561a9f7ee3de129c496a18fe323d73e81b5813a9c18db76ba1e8c30b7ebe2a1e910567e97c6df3bf0f06a824142daf8e3863f1fdf1bcfd5b07fc6f49931f7f020000ffff7e315e9867010000", "703fbc76a57a5b13a17ad4fcc018d9f8": "1f8b08000000000000ff4a2cc80c4b2d2acecccfb3522833e44a492d4e2eca2c2801f3434b3273149233128b4a14d2f28b1492330b32528b748b4b334b528bb9f2127353ad144a4b32738a754b728a755165cb60661ae819ea197001020000ffff816d487666000000", @@ -64,22 +66,24 @@ var _ = func() error { "81d95b7d0c3746a56c0351d53b5a2557": "1f8b08000000000000ff3c90c16a03310c44effe0a91bb5d7a2bfe81de1a282577c59e26265e6b91ecd074d97f2f1b969e348c6078bc65f154be299cb80e58c898ab3c8ec72f5a57e7bd773c9713d48ab4487ae61478f4ab68f9e55ea485db9b85222ff757772b2d47fa940a37a173e6ced111359e60332744ba8d33bc3dac63da1f91f0d3d1b6750b17d68c060da9cac87159fea166957bc9d00f9e40eb1a274ed7d2e093b4ae522bd44fdcf802753a2a2c3a4f3c97779531db06e1e97070440a93a1097b67488a6e8ee80e3def655270c7336654ecf182febcb558779b32b4bc19fa0b0000ffff27ba722d3e010000", "81fa11ab5f7276b08db4a1be8fcdee3e": "1f8b08000000000000ffb492418fd4300c85eff915d11c91d21537941b70e0be48dc5dc7db0d93c691e30c825f8fdaceee4aedcc6a468553235bfedeabfd9c73064afc415223676fa507eca0e9334bfc031a3977c74fb58bfc70fa688e31076fbfa65695e49113999114022878636d8691bcadbfabd2e891b30aa744e231710b2e7320f75635d212556f9c8512bf09b7522786b38783b156a87213a4736d9aadc6da13497f2e054aa4343f07d2f95b40f1797eb512e0dc4cb1ea1d220f5541db4a6b01df04a113655d8da3d08b9b8dc57debff12738879d873054ef4484fd3e0cbdfbd63c258bb8dc0bd92b5f53f0975befd42fb4e728a489f11b9657d055e1e5fbab50092b7c7d6935b84cdce5d5e58e262e04ddb8d9061d89fdd7703fbebb5787b7491f3531c46282ba1c387c3168012ba223cdd002145e48e65d8326381b14f8cc7157371f59f627b7de3ff2ea75735ee0ce605c2d56cfe0d0000ffff25c53a9466050000", "846d3a343236816df601edaf5fd44ba6": "1f8b08000000000000ffb4d1414a433110c6f17d4e311748c49d64a90b77168a763f7d99b663939930498af5f1ee2e0fa41ba13b2ff0fd7ff0cdb3073e806887b0c33ca8854435eb75b379876571de7b879577648d5522d81ea780a39fd4f81b3bab84f3530bac0f9747776649115ef2689d6cab999e5912cbd115ea98b0637400828522d0572759275b38a22512b230651d29cef34d524d2f9cc8deb0102c4b2c389d58c84f2add3467325f50f048e64c336de9b006b0f2abe9a877b00ee08ff5df686dec3f69ea2d3aff5bfd6864b75cbbb64ee5dec0fa11495aeff8090000ffff34f64a61af010000", + "849fb49004730bd92c44c0a6befee2bc": "1f8b08000000000000ffc4564b6fe33610beeb570c7cea02951c17415108c861db058aa2dd34488b057a1c5313872b8ae4f2e1adaafabf17a41e11bd92931601aa8b89e17cf37de43ce8aecb813f40f10185275b54de285b90c4bda00a4ea72ccff30c35ff40c672254b38eeb29acbaa84dfc81c39a3b78c292f5dd690c30a1d961980c4864a88a172a6a4334a0832c386d5c8a884ae83e29e04a1a5e276348f843dc3bd1294709b3db202bd7b5486ff858e2b59d4dfd982abed71f77a028c1764cb2c07d4fc47a3bcb621640ed62983072a0291c8ad4356175c650086acf286d1e017699f565bebd0f9603892d90f3ecc103aea9d48d0b03c908bbf82db7ea1d1b1c7b8f2ba1a019fa3f10b799bcd975298920ffcd0a05ea71f390782f4f6bfe7b2e2f2f07f244109baa78710673ce705ea0c605632abd4d6ef3f127331b98b45fc0aa5bbd22bcc50da2302f724623ac209f52ae7b88155c3e50b75b8565309bf6afce4291b096380bca636020d7df2dc50059bb4f39ff88b08f8995ae07672dfc057fb6faf49327816f6262819699daa49fe2be2df03e2bf5047e09ba574a0d6763be5e41d69a1da865e7376bd24ad56130bfb960431a74cefdb84a6fe65065eaf0a435a7086b6845d06e0a8d1021d0d616627099f4822aec7041865c575d215b76b3712be60402ec94c24f9fa150e1acc61a62800729295565c3a7bd375f05171099baf37eb799edcfb3b9f059a9274732147097178e872415891c96346b892a9cfac826fb6fd489f99967c6b6a53cf9adad4cf3e2ae5f2daefa91fd1a33b139ca4db3e6d4c30dee0a12f3d2e2bfa73ba9c68b7b039bfeecdfcacd1e9ce0b71a704676d096fc5676cedb49f3c1be32778c35d620160da97707d75d524d6861a65da12765757eff96c27b42ed9c518bbb518dfcc431c95f00dbd0f557856324ba371162c20eed03d96b01d9fe373ecc21d2f42879c647345333197a5d838f8d3f3f7b6db55d445812f0b38ebbaf321b8fc2f663616e3759d4fc4e7075fafb9afeb8a1ed00b970f5cd3c88b9c77468547f8a777179f033d7aa54fc09ad3e9942dfe911d14fc20d05a1ac6456a2bb3ae03a7fec0465cc6fe1d1b4f3ab81ed9485667cb7f020000ffffea53e5584d0b0000", "856246c2a75cb5281df92e719e0af0be": "1f8b08000000000000ffc453bb6edc3010ecf515847bc94817a84d912e0682c0fd1e39be634cee12cba5f238dcbf07a2641f924b912670a5d9a1b0f390783e8f2e3e391673d323a5863a0594243f1e1ebeb8cb6518c771a0121fa1350acf4e0fe4276a76128d3fc9a2f0f4fcbe4e51ee9777c373e430bb0fa955837e968421c32890d13c38c794313b7c37f0baab4e47d200864e3e490bf3f9fc6aa1a82c31403f5186bb5ce64cfe1419a317369594a06326a62374d09650e7617454e2479556eaaa35babbbbc1394595a61e3bc712503b028722916d9b142545dfd35c15b6a32261076b03d5c0b6486a197f677da298b7a30aafe8020bf4b03bf00a32741890f01bf4abac5f4d74f208ebcf14eb060a993f75d44a78d9f2ad93ff947e8d728f25be48dcdaba5973fd587da452eaeddebdbd8abdcd6a64786ae99508842c7c1dfbff95c16f55ce617ff78f1c5fe550771fc2fbf0ffddad17101cd6bbf62b0000ffff574f22648c030000", "8968e88b391e5e2931af24d70beb5bfc": "1f8b08000000000000ffb4543d6fb33010def91527e6175056d6776e870ee95075b83847e3400cb2cf492bca7fafce90a004d2a855ea09b8c7cf1796db36015d40bac4ca934bd1f3c63cd36a53d7654a065715ada1eb226cf492acd3b5c961bf884a6dd639fcaf4da1df1eb08976c4b846c63c020030b8a31c025572e8b91215b0a7b16b50510e6d0be91355848ed2c7e367d11bc9e668d2ad13239f0120ab3d3df52b1683710e716f31fe77391ff3086abf98221a4b0559328a5c9c43db4d00aaf28ec9caf4e562766967d821c145aef42b4ab6074eceb24d2c9ceb888959c0007364f701154ba973bfd3db0abaee8acc518c2ceb422b640aee6aabf943483362950d4e3341b94c61aa2cc7b3745df4fdfbeba44eef7ed5655f21367ac87fa54461bfd520d72585e3e04859ba5b30551ba677fefb73d2ebdc4a391ea79ff10fdb872227bddfab2c6f2d194ec630d75c4623a9dc6164c23df5150000fffff725b2f7cf040000", "8e02c8258186c2a4a3715281642737c5": "1f8b08000000000000ffec5acd6e23b911beeb290ace616700ab359e5d2c76754b3c3e18d98c05db994b9003459624c66cb297acb6ad0479f7a048b6d4ea1f59e39d0db0807992d86475d557ff859e4ea71351e92fe88376760ea2d2f84c68f95f281e7e0a8576b3c78b2592b8983c68abe670590772e52d06577b899f70a5ad26edeca444124a90984f0084b58e046f07fe0b209d25ef8c413f5da32d1eea252e6b6d14faf886e6fd8f1f8aef8b0f1300e9315ebfd72506126535075b1b3301b0a2c43948530742ffa4155aa427e71f2a67b4d4180ae6c34c0309f950683709154ae661ed5d5dcda1f334d1cb4c6601f7a43f27d20b26bd8d478c0ef4d7a3c77ed181e2d1cad45e9863acc66341db756d841f3dc82f0ed2553887cfcc6b25242adeab973e6b21f31f48501de6f09fff4e001e85d12a62981eba0aed9f17d75fbebf931b2c45da045018a4d7553c372a53549fd036006d90af688f2abe0e61e53c8886f74c1480494096029218400e9608a2aa8c4655e4a39577157ad28d0cbc5a16b9dbeb70fa1d8b92ce80621bc4c45bb624e62e8a096e05b4d1013c561e03da64952db2c0478405b7fc174a2ae00e3d1381b071b5512cf9237a028fd2adadfef78e726079f89546106695374b5b426f856125d4780ec22a28c5163cf23ba0b62d6af14828e06fce2368bb7273d81055613e9bad35353e285d59d656d376163d492f6b723ecc143ea29905bd9e0a2f379a5052ed71262a3d8d8cdbe88245a9feb43395ef5a9cd296ad2a90d776bddb8e5e308a3b1b3fe800225f4bfcefe1e52d46e5f6eaee1e9a9746151c621ed1de5f0b7be019286d57e893e256de9591225a55396d29fe9146a33d043dd4cb52136bfad71a03b17e0ab88c9188edaeae942054055c5bb814259a4b11f077879d110e5386f465e0db01f4f060426bb7dd84b4410d258fbdab501e3886af0d46938d9135b9adb66b8f2144f3c4f8b34574c831bb2f3b78d0e1e3d3fe4fb29795c7f8da32cb7d0e9a400a1b951350c172cb9c7668e654e07cf2e42408cb118835b7a94b61c1a350626910f0b932c246176fce57b5af5ce893dd0586da6001b7111eb9b3168ec1a4573ab1c56680968a0e91412df24a601e8587d304f3908eeed5d38a907053d3da4587f262b5d2123a4ec44b18e39e50818ed2b22d33d6a3819c3682d29d009a8ae6e000dd48ca71708b10285c89daf420d084654fd08ea85751444638ef2f9179ac84272d39f541c08845232633d9230951b22cadaba9d16fce3c70bfc11d81b20e04a520b981a5a30d54ce535f4488864fae2bd3b8ede7a74c6de8c1888a1506d2d928e3dde87caea3dc02ae84dc0c524d3083b6c962b9066130a42b979a535dcd350408306eada53070735bc07536ef9546a3c6a806c0b2a22d380fa50e213ae5ce2912801841cf7cbf6b00b66e4841bc3cb23fc86c357ced7d87197e6d8efa5101bbda6250e9bc0c0a46d262c4815944dbe2339b73c39bb3669bdda1d91ba1bb13905aaf609613d41891ee5b078cdb7d5a075670e07f0b267ee004bc412ec9f002bb009dc265bf8e1b6c3ee33c8d3f6567d8deac8e1d98e680c7d5cdba55eb8d9f1c088d87eb0029f6e088874be8aff5235a168d9c74a6807bd638270cd41cea8e90851846c1d625fae811cec73a5fede833f2aa6f984769726aa8bc7bd40a55f693ae8ba46e229ab5adcb25fa306c3e693d4fb90ff21609c3545b9a3a3f4d90cd817cddcf59cd6a3039a6ad3eb4f912bcbbbf5c9cc3df3f2dce1997bbcbfbc57b78da68b979d1fe78ed636b848f41e17a24e6caf3369a3963c4ac767fb93806c409d6325808f50f08efc576e039b9d705ece1581d5b865ecf73b8f85eabc0b8e6807118c239c58ec5f011a237b7dcc7f9c8da40583d219a8f1066033e10bb1dea3b41bd752ec6f6318d9d12f107627b66789cd11782fd705867ea636930851b72df24de5f2ffe629c7c182b752eaf3fddc2bbabe702ce2e7efe585cfcf85371515ccc3efe70767ef6f1c3878bb95afe3c9fcf7efce1ecfda8c3c422ae550de546b472aa8948514fe230f7704bf0dd7884ab9cba4383929c2f62bcc0678915015af2db96342c40482ca416799462534a5b696a850a9e346d742b718f4584539299d4ca9f1cfd22e6ed9eb5d7ad5e2f206aed68e4fb228c5680cfa2acb85867f7edea907dafa3c6df16f620abe16459af92d692b4464be458d5d3d991022ead01bd09bb83e914288e92efc3d4309ec621f0a48d6126d2c464d7df0c85f6fd62365c4d412b8c5a8d7af7c2aec733e90b9e9dd689c5ccf10c04b138feb5d61ed5d8eba6d1ae7f8f0c78e4f2d8b53c1d38a98b6d2609836decfdae7b6d22569f3db7cfa7af6b65cf7b346f6edb6402fa47f6067cae5cc8461d45875f9c504b618495e8f70d311b538fe4376a88afedb7ef88730ec818162fb7c39c890748aebc2bbfb621e63b5f515ee54164ae397340628359a6c98e90926d69681694566328af29b1c6ca8a56f3fc8a126bccdfbb6d7423fa91ea2a1d793f961c4f6da5070bab636cbeb2b07a7160816982fb565abd9556e3ebadb47a2badfea8a5d5d70f8453feeda6bf5228ccb94f73261c1df6b5a7de9d147825e4e6f8b07884e68b23e4df9efbfa23e4b161f1371e28e461f1ff2ff9bd8d90c7d6db08f96d84fcc71c217f75033d70a1b3b5ffeae962ff2f7adf347fe5141f40ec5d51b5141ac879b1c6bc933ffb9940cc1e15a1fadcfda6e92cd50ccd2749f1af7456e9f48916fce39f934415d597860fdefc5f000000ffff4ad2449120260000", - "965d4757eba36f144306ddee6a0ca638": "1f8b08000000000000ff9c9551929b300c86df3985ba7936c9769b4e8763f406c6a8c6c5588c6c93eeed3b9084355b28094f80d1ffeb93848d69a5465f64029c6cb1801683b44ab51980a7c80a7f6247de04e2f702b409752c7345ed718c133e48d5dceeaf224ec36bc5b9a1d5d82075012ffd293fe7e7970f02a96ae350287281c95a64d14a2735f21693965ca1433efed72225c498eb2be35d2b3aa6dfa8c28366d7124ef9db393f3d52c260df9b6a58181ab158511d42e78be371addb4f986f4ee309af695aafe9b42aa62e4863b7a793e69da9b62067c113c5d7944279236cdf26753c43b3a8dea25a144d74dff3b77fe9c6967a436e1fde5cfe28df5cb50c38ea6c297c87b259815bfb2a6d79bf7e82babffd309d92ff584abe31bbddf997073443f09d8dae11325626880b963551b3676b36b1447618d08b15cbada96d3b24dbf0db4b76805f86f122ad4dfa37c4401b7d8012c1386b1cc2c5841a3459e93454d8a1abd0a9f72f530b166cf67460d9e6c6fc9a9f8653323b80926e60bb9d3115f446c2f82702ea91d954586407b8b3c9186a37b5e0000b5ce32a7f7a1ed226369a297682c962695c659c4e2177bb4aa528ba30d8e19f8e383c6ff6370000ffff1eabd7ab84070000", + "965d4757eba36f144306ddee6a0ca638": "1f8b08000000000000ff9c955d96da300c85df59850acf0ed0293d3d594677e0386ae2625b3eb21d3abbef093f19332413c8136074af3ef922a2ad6c30942b014e5a2cc162944629bb02089458e16ff41474247e2fa1d1b14d55a1c86ecf752244a98ed7f71711e7e5ade242d3646d944d09eb6e571c8ac3fa8340aa563b148a5c6432065958e964833cc7d448aed1216fbfb4c8093115cd85f1a6159ee92faaf8a4d965845df1762876cf8cd0db77baee0ffa8b189da88dd18772bb9dbaed17cc67d378c16b486b9fa75533f928b5994f27ef7ba79a83bc2b1e28bee7142a68613a9bcdf10acda87a8e6a5434d0fd2cde1ee9ce571a34b96578f7f267f9ee55e380679da944f0288f137053bf4a53dd5e3f41ddbefd301d9aff1a6b3e93dde2fee301dd21046f923b0a996a1dc509ab96e8b864358fa9427618318809cbb9d4e61db235fc91ad61620a4baff0b6678f1eb3abf928c9f8f6ebd506fe68c6933426abea6bc0a610a14208683b645064bd8cba3208271d5b68c848d7408d1e5d8d4ebd7f1b661d715c32eeb8cd157f5fec7afcd50694743de6f5efb0864e4b383f34813a64d63596ab0ddcd8648aad1bd2dac008d7f9943f7deedb66360d53f282c960a55dad5d93432e76954a5172b1b7c37f9e38be6ef63f0000ffff7a39d14f2f080000", "9a551dc729ded6b79c956490a2ce9eef": "1f8b08000000000000ffd494cd6aeb301085f77a8a81bb9693dca410b46c9b42170da14d4bb7421e126145232435c118bf7b917f168da1d08503b617b68fce7898cfc7e29c33e9f407faa0c90ab0182fe40b6d0f59b10e99a6d979c10a6d7301db76694746ab929d30ca5c4629188095271480078f2170690c5d786e43b7109c5428a0aa207b45833260b6ed65a86b161caaf41247f91b1a5491bc80aa6e94d4695f3a0cc9c061d37460d0b56ac548e99aeeb4bb37a48af6311d4ae75ec03c6bced9bcd11df918fa0ae729922223e0fd71d795258380bbe5c0b27f185812bd7ff0f4fcf9b2018f273a23c4a30ee0bf0c8e8255daf24658ab9a8d958d638c6e5ae9b8fef4abd572543a9386b39e8fc6c64e0ccdf5aeb2f83f5e6ececede88cdcf61db1f62b958f5930ea6ffd5d4a7e70fc0bf030000ffff03632703b4060000", "9c1120e05c97a520680b28342fa38852": "1f8b08000000000000ffec5acd6e23b911beeb290ace616700ab359e5d2c76754b3c3e18d98c05db994b9003459624c66cb297acb6ad0479f7a048b6d4ea1f59e39d0db0807992d86475d557ff859e4ea71351e92fe88376760ea2d2f84c68f95f281e7e0a8576b3c78b2592b8983c68abe670590772e52d06577b899f70a5ad26edeca444124a90984f0084b58e046f07fe0b209d25ef8c413f5da32d1eea252e6b6d14faf886e6fd8f1f8aef8b0f1300e9315ebfd72506126535075b1b3301b0a2c43948530742ffa4155aa427e71f2a67b4d4180ae6c34c0309f950683709154ae661ed5d5dcda1f334d1cb4c6601f7a43f27d20b26bd8d478c0ef4d7a3c77ed181e2d1cad45e9863acc66341db756d841f3dc82f0ed2553887cfcc6b25242adeab973e6b21f31f48501de6f09fff4e001e85d12a62981eba0aed9f17d75fbebf931b2c45da045018a4d7553c372a53549fd036006d90af688f2abe0e61e53c8886f74c1480494096029218400e9608a2aa8c4655e4a39577157ad28d0cbc5a16b9dbeb70fa1d8b92ce80621bc4c45bb624e62e8a096e05b4d1013c561e03da64952db2c0478405b7fc174a2ae00e3d1381b071b5512cf9237a028fd2adadfef78e726079f89546106695374b5b426f856125d4780ec22a28c5163cf23ba0b62d6af14828e06fce2368bb7273d81055613e9bad35353e285d59d656d376163d492f6b723ecc143ea29905bd9e0a2f379a5052ed71262a3d8d8cdbe88245a9feb43395ef5a9cd296ad2a90d776bddb8e5e308a3b1b3fe800225f4bfcefe1e52d46e5f6eaee1e9a9746151c621ed1de5f0b7be019286d57e893e256de9591225a55396d29fe9146a33d043dd4cb52136bfad71a03b17e0ab88c9188edaeae942054055c5bb814259a4b11f077879d110e5386f465e0db01f4f060426bb7dd84b4410d258fbdab501e3886af0d46938d9135b9adb66b8f2144f3c4f8b34574c831bb2f3b78d0e1e3d3fe4fb29795c7f8da32cb7d0e9a400a1b951350c172cb9c7668e654e07cf2e42408cb118835b7a94b61c1a350626910f0b932c246176fce57b5af5ce893dd0586da6001b7111eb9b3168ec1a4573ab1c56680968a0e91412df24a601e8587d304f3908eeed5d38a907053d3da4587f262b5d2123a4ec44b18e39e50818ed2b22d33d6a3819c3682d29d009a8ae6e000dd48ca71708b10285c89daf420d084654fd08ea85751444638ef2f9179ac84272d39f541c08845232633d9230951b22cadaba9d16fce3c70bfc11d81b20e04a520b981a5a30d54ce535f4488864fae2bd3b8ede7a74c6de8c1888a1506d2d928e3dde87caea3dc02ae84dc0c524d3083b6c962b9066130a42b979a535dcd350408306eada53070735bc07536ef9546a3c6a806c0b2a22d380fa50e213ae5ce2912801841cf7cbf6b00b66e4841bc3cb23fc86c357ced7d87197e6d8efa5101bbda6250e9bc0c0a46d262c4815944dbe2339b73c39bb3669bdda1d91ba1bb13905aaf609613d41891ee5b078cdb7d5a075670e07f0b267ee004bc412ec9f002bb009dc265bf8e1b6c3ee33c8d3f6567d8deac8e1d98e680c7d5cdba55eb8d9f1c088d87eb0029f6e088874be8aff5235a168d9c74a6807bd638270cd41cea8e90851846c1d625fae811cec73a5fede833f2aa6f984769726aa8bc7bd40a55f693ae8ba46e229ab5adcb25fa306c3e693d4fb90ff21609c3545b9a3a3f4d90cd817cddcf59cd6a3039a6ad3eb4f912bcbbbf5c9cc3df3f2dce1997bbcbfbc57b78da68b979d1fe78ed636b848f41e17a24e6caf3369a3963c4ac767fb93806c409d6325808f50f08efc576e039b9d705ece1581d5b865ecf73b8f85eabc0b8e6807118c239c58ec5f011a237b7dcc7f9c8da40583d219a8f1066033e10bb1dea3b41bd752ec6f6318d9d12f107627b66789cd11782fd705867ea636930851b72df24de5f2ffe629c7c182b752eaf3fddc2bbabe702ce2e7efe585cfcf85371515ccc3efe70767ef6f1c3878bb95afe3c9fcf7efce1ecfda8c3c422ae550de546b472aa8948514fe230f7704bf0dd7884ab9cba4383929c2f62bcc0678915015af2db96342c40482ca416799462534a5b696a850a9e346d742b718f4584539299d4ca9f1cfd22e6ed9eb5d7ad5e2f206aed68e4fb228c5680cfa2acb85867f7edea907dafa3c6df16f620abe16459af92d692b4464be458d5d3d991022ead01bd09bb83e914288e92efc3d4309ec621f0a48d6126d2c464d7df0c85f6fd62365c4d412b8c5a8d7af7c2aec733e90b9e9dd689c5ccf10c04b138feb5d61ed5d8eba6d1ae7f8f0c78e4f2d8b53c1d38a98b6d2609836decfdae7b6d22569f3db7cfa7af6b65cf7b346f6edb6402fa47f6067cae5cc8461d45875f9c504b618495e8f70d311b538fe4376a88afedb7ef88730ec818162fb7c39c890748aebc2bbfb621e63b5f515ee54164ae397340628359a6c98e90926d69681694566328af29b1c6ca8a56f3fc8a126bccdfbb6d7423fa91ea2a1d793f961c4f6da5070bab636cbeb2b07a7160816982fb565abd9556e3ebadb47a2badfea8a5d5d70f8453feeda6bf5228ccb94f73261c1df6b5a7de9d147825e4e6f8b07884e68b23e4df9efbfa23e4b161f1371e28e461f1ff2ff9bd8d90c7d6db08f96d84fcc71c217f75033d70a1b3b5ffeae962ff2f7adf347fe5141f40ec5d51b5141ac879b1c6bc933ffb9940cc1e15a1fadcfda6e92cd50ccd2749f1af7456e9f48916fce39f934415d597860fdefc5f000000ffff4ad2449120260000", "a15c01cb34d1abbc4f6ffe6c57c145fd": "1f8b08000000000000ff9cce310e83300c85e13da7f0051cf66c3d4567135c85621284eda2debe22a87bd5d17efaa41f1103b9957ae7b1b4b6240800005c69149e123c4894fbcb774950cc364dc3b0f8c8f83c0cbbc5e3c2514b6b86282d9320aeef7e575a39ea2bc72caec67becf3704aae3667320e4137f1badc7c9aed5bf253c8e5904ef867c634db270000fffffbfa869506010000", "a23b646030831d7acf3dfd40a43993a9": "1f8b08000000000000ff4c8ec16a23310c86ef7a8a7f99cbeeb0781e22d9c39e5a48c9b57866145b894736b626697be8b3972484f6f2813e24f17578f6665cb5c1322468ae8c4b64c5b84a9a45038a9f4e3e7073d4e1254a435b4bc9d51a5ae49410521eb1789ba268f88bcac99b9c19c55bfce1bdced441397893acf85d2a1fe48d675cc4227efd7178d2f48eacb7cb6b120a57245176e4b6bbd79de5cad4619397252bf69b1d66a98d5c101b6ebce7931b3fea70e343c4305cf118db5987ef47a39f4e6bc1411237ea5dbb14eadde84fd43b5b0af59fd461efabe4b5e1fff65f23576a3ef264e464663fdcf76a3ed257000000ffffbc5b94774d010000", "a338db744df6eabcac0c721d27a33d46": "1f8b08000000000000ffaaaed65548494dcbcc4b5550ca2e4d4a2dca4b2d492dd62bc92976ce2cc8482d0a2ecd2c492d5652a8ade50af1098e777576f1708d0f0a768c0ff70cf18877740d8e3734b2887777f68d0ff670343235c3a5cac8d40ca6cad8c2049b2a670f47670f472383f8007f9f4843630353b0220cab9c9d9c4186604a826cc02989c591243a0fdd0a50c0a5e6a528e8d6d67201020000ffffdd460f0345010000", - "a37ca821ed3faae32ed6e16d83e07070": "1f8b08000000000000ff948fbf4e03310cc6f77b8abc405458b34129136228120c88c1977353ab6e1c39befe797bd40bd53154428cf9f9cbe79fbdf71ded21610d9d73ce0d2ac5801835b8897bc522954cf41c1a304853748f06ccbdaf0561f78f7c946c2afcd78a6e438a47607e2b189b1c65433d0007777f577f74cf3ae6e036c01527a260f8427bb21adce7d7fc2d0317c50d9d701e6052ac753df22f76ddfa8a7614ddb5410731ca988d725a9d8aa8a13623ccd0330e57812ea98c652d8c3de581725aceb7deccf3c5f41d9806b8947f60bf15d9ddcc5e5084e01e1e974fabe7e9392a07b7352b352c168a8521a2b72d557f6c458b43abc6ee3b0000ffffcce183abe8010000", + "a37ca821ed3faae32ed6e16d83e07070": "1f8b08000000000000ff9491bf4e03310cc6f73c455e202aacd9a0940931140906c4e0bb73af56dd38729cfe797bd44bab22510931decfdf7dfe25092138dac288253aefbd1f54b201316af4130f8a590a99e8313660304ed12d1a3077a16484cd3ff2bd2453e1bf56b81529ee81f92d63dfe42819ea0e38fafbbb72d63d6a4dd1af800b4e44c1f085b66425facfafeb6f09382baee880d7018e8aa52c2bff6097adaf687bd14d1b38e87ba9c9288d8b431635d46684093ac6e122e046959a97c2d8511a288df3eb596fe6f964fa0e4c039cca3fb05b8b6c6e664fa887e81f1ee74f8be7e9b32a47bf36cb25ce668a99a1c7606b2a61df8a66bb568dce0d55657ae35fb598862c94ce17f61d0000ffff79ec631a11020000", "a97b7bf091edb7f49ade2b55c317ab97": "1f8b08000000000000ffc45a5f93dbb6117fd7a7d8491ffc62ea92c6d3e9e8cd3e3b1d4f63e7e6eec62f9d3eacc0a5b411093000a88bdae977ef2c404aa204feb9c437c69b80e5ee0ffb7f492db22c5b60cd5fc83a367a055833fdee49cb2fb7dcfddd2dd9dcec7f58ec58e72bb86d9c37d53d39d35845efa960cd9e8d5e54e431478fab05006a6d3ccab6939f00ca686f4d5992cd36a497bb664deb86cb9c6c60de89de7fbf7cb3fc7e01a02c85c71fb922e7b1aa57a09bb25c0068ac6805055b7ac2b2744b115b66cea3da2dd92c5c4d4a446eac69ea155c9cc6c75b4cf13e3fb59cc256c9ceffb3b7fd333b1f8eeab2b1589e490ebb8ef5a629d19ef617004e999a56f05944d5a8285f00b4570ca233c03c0f4ac3f2ceb2f6646f4dd9549db232f8d5197d877ebb82a55c681968f61841763af8d8dff40711eabc65bd1963a3b1ac2d15fc3bb96b760151eff08a6da4deff10efafb654e1aaa53535e9b7771fbffcf8d0db06c8c929cbb50f46ee540becc06f09223114c6869f4705c3dbbb8f470eb5353559cf9df1e23a73dbb3dd0b79af0452a4825cfc95a2dcd62494b7b7005380dfb2034bb525473a7a708f3108116a30eb5f49f9253c901536e0b6a6297371f33d590f9694d968fecf91b7036f82d0123db51e755a9d5d608f6543af01750e151ec0924881469ff10b246e099f8c25605d98156cbdafddeae666c3be0b5765aaaad1ec0f3721f278dd7863dd4d4e7b2a6f1c6f32b46acb9e946f2cdd60cd5980ae43c82eabfc2fb60d70f7aa87f5ca1be20aa134620189293137b68fc65b9c142d5ba29dfb0f0f8fd0890ec6b8d47ed0fbe941773281288c7541361ab1b0a60a3c49e7b561edc30f5532e94bf5bb665db117bbffd690f362ab25dc861c066b82a6ced153be848f1a6eb1a2f2161dbdb80144d32e13c5ce33c179fabd248e5a3b3be8b2e480bdba087da849f5422627c7569cdaa32709855ef6ec563a56a1570692617b05e4f6921eb6a6cc5d2f4f6427a65d485f3105093f0922adb8a4e5d5f9804e031e7bb0cd14cef7f670df68e0021cf910ea56e2b88308b629c9015a02f129aceb92435548a1581b53125ede8136969cbb173e13583e9c28af08d95395787e90c3c3e7b78fadca111e425466b225f7497019367c2bbe1e38184176ae9aa481fa24682d1e92149afc93b13bce87a44cc890ec20ce9f7a3c93ab25f78f52533e990ecea9eb745ef539b29ef2879f2ec8cf4248775b3b6d9e3460cc91b167c29a1390639196f4dab976856acbfada1b060d3ae524e812d176945ea15f49bdfcdb9b512b4a45dd904dd2e4e43ceb50dbbb46e8db79e5b70d09f4e3c190ce45edc37f329e8e1c02dd1fe5f1ed2db8b7c54bfaeb78da4197324e96f2f1e7a52dbcce4853e92c3b3768f27c14cade165f2f475e4e3a1339f2d5e5f0133a242e0e47c8f0b465b50d255c19ed38279ba8e000a5515876cd7e8dd687390f8c85d007d026f477f068b128588137375da3ea684c3fd23c2b651aed290774a791c1b79c1e7f79ffcb0ab0e48d16f14a1ad54ca123c8c0920c6de9ae882f6efe6a7e261f0d9e09dbecb19cb04937de82d1adf2a5eb3876711c9cbb1bbcb658d7741d0a2308b9debf1186059789ecd343d21aab6d468f0df1d3962c890a9d9751400cbe214d568685c03e553ffb1da14ca4ec76cfc12dec7f6699572650df1f09c5f5cc9313c72d78d3d8a83953045e500a4d8ba730a914140c56a02277dd39cfeb288f58c20480ac63ff71213f7417d865916b59d3bdc3644deaa16a3ba28fefdb6867eab545add7b51eb64ec5cfc924f11ac9940073ea8cf098055a54d9bd39615d373e8a670d9ff8dd4d2a7540bf12fdf8d717a944e39541307ebdecee78a35106e7891078e8e8c4d98fa1873ecee3e4cee2757d807f7cb8fbf48cd130ad8eec046ed620eed1376ece281e087bc3b8593bb2fb3f318d97e8fc7d6ab6edbc25474f99e744e918f1e78a9cc34dc23423cfc80de6ce31a20977ca2347b30a0f769ed5750c8ca78d9cf6ac06a791b337b5e3b9e7f29540e02a604f584f10c36bc456f200b7a95c0721330f9fcd6b3f61d6c824cb3483c3c2d717e68d4f3508a7d56fdfde536d494920afe0511e7d7790f066073baa7da82b6b54bb27b4f950868c4b99aa46cf6b2ed91fae5ba197b9ee586285d8a6a7473039324daa538f67418ba3d97e20f5c2b037bb7787f8e3e4d6a7c3d6b9c3c797c15ab83eb48e0f035de92438cedd40c6806786ec9c20cbada9c75c719e47b3de63c9b9da92dab9666c269dcbb146b5a32125cc6734ed7da28011d7ecdf6b90b085fb47dd7182c0a6df8cc233fde139b4978d59535ea47b29d267293f76b78ef526f9f2b45bbaf0b896667ce0256b5c731c57d2990c8c768ce4ea8d7b78a27d49183f36c56275c4d5321de50963a67cde1d20a40c3f4d343f29c7352fca5aa8d3b1f6b210a6a234ae2c6a6a82663c12cf914d18711a5436e92d330425c32cd5028621b2d7640d8a3d9bc1c3075d54896fbdb331f6bb9123c47787b781ed34d401c1a1903aa99811df0a68b959022a45b57f1d12f36ba84dc9eaf01a2a74bf356431a774e3327a8b6153665d839c38e90a71e2c8263f400d62189ca6aed827595c6dc6d168153ec4c50d6fac8c25673bcdfaf895bb13dbce63f0dfff2d4ea3595437e59f2fff3bf2dd77e147f7d790f053191d4b885bc1bffebd888229ffd2fdff4336ff1f0000ffff62abc52073230000", + "ab5f2ecc69ec10add9d13ff5a5897f45": "1f8b08000000000000ffbc554d6fdb300cbdeb5708b9dbc56e838fdb61f702eb9d915e12adb224909487ace87f1ffc91b443dc60c3d29efc445222fdf8443d3d3536ec6cfb40b1425a5f394b8b44db086f9f9f4dd334864a78004bc8a9b3bc25d752d543e6f08b34e4d43e7e9636e4bbe193790cc977f66baca2e0fb1c617a287952ea8cb5897a7476cad0b89c94738c60c335423ad3582ae11be75a640c6eac6866da6339de58cb905cd9e14fbf8b240231d60ee0ede2730c524cd02362817be8f48d41665048dd6142b5f871c345119bcd4a623886de28e3087f4ec67f26c049f01c06b09c96297bcc8b21c7da8354c91d7a249577a3ecca0f6c4a8ec11d57282cd90b5ce5a0c72926dcbe9ac9286b2d7d53c22b85ba59cb9ce342ec2bc336241fd2fe0378a452644d884a8a5d8d82a5bf9ed0e7241f21ceb58be172da857d4f65ae06c38bf0ce5766c43c0407722ed793ff45b8651c34a2483a4b78ddea2285fe9aeb6ee4a6ca596c37e7e3bfc6e29759397f351d73c43d7663c4a90357b2196b2f67f09b674bddfe80d369f8cedbbe0bf81c2f4751f4ddc5b6d7956c36667c4190a6c7e277000000ffffdc97af234d060000", "ab66cc077d5ba1e24b974c6bff64adbd": "1f8b08000000000000ff548d310ec23010047bbf623f4094b4e9e87801fd611fd892e38bee96bc1f01a2a0dbd54833b2b7ab7a341b2b8e25158dec6de7e79f71d1be215771e26e8ea0b93c347789d000ab1051edd90b6e8a3682d2bb16d0c0aa6f644c43365dbffbf42f48c7af3c4fcb34a757000000ffffd227b0798c000000", "ac0be0695d9f4e731130e9281c657287": "1f8b08000000000000ff8490cb4ec3301045f7f98af981b82a2b941d125b6855a1eca7f66db0ea17f6245215faef288f8ad20d3bfbce917de68e634df644aa65d7a32883e4e265b7fba0ebb57a980d8915021f1dcc34e5645be4626368887b8945b3b3a153e7e7a26cdc0cdb23849faab30da6a11659ac66b78fe66565912b0f61c3c24d4514d8a321cffad306d43a06c9d139e4da73e00eb91e12af5849acd1d038923ac0810bd4fb2d9ecc4a829e9e14ce1de480d37421fa239c52d90cdb395f0c5fe7cd3d82cce17f3a15519f0c0bf6d1597d597e5892b76856bbbbe2ee61f5cbd1377df55170ab1bc13c1c7f020000ffff17067201a1010000", "ad69d46686990c21d89108e935a76f2a": "1f8b08000000000000ff7ccec109c3301044d1bbaad8066cecab2b4805b92fab492c9076cd4876fd01935c739c07035f8ff2047b09dfe45a5346379663dcfb81dac476e59057501cc8c842f43869b8ada9edc53159f860d40a4e4d5ddfa01497af8ad5b30f30b9366c7f3ee9faa52cf33a2fe9130000ffff60966c039d000000", "b4314dc84c968e48616fb5c23b28b85e": "1f8b08000000000000ffb491b14e03310c86f73c85d5fd829018d06dc0c0c65024765ff2b798a6c9c94e3a50faee282d959090e88098a27cf992d8bf8761703ccb0bd4a4e49174e2e0b9d5d7a2f2ce554af69b5bf352ae76d76e23398ef4909a55e8b224b82d2a47ae3c3aa2cc5b8cb4df93e4905a042d3a5990a7c3c111259e906c74df8513ebca07498ec8956ebaad2dc1463710cff2a8a5cdd63f182814855fb34664a80fa9b4e88814569a069ca58e672d2b493047b4834e5f476bd4e39ac4aafb5bebf792a3e4f5bf2550129658f557cf19fc52a123fa399b0bf5589bde10ea31e6d3e567e84e02ee42282dd7cbfdf48dcd1c4e8e5f22810dfee98cbbf5190000ffff571feaa860020000", - "b44ffd2c199965b7cd4eb8a159a49a12": "1f8b08000000000000ffb4544d6fe33610bdf3570c7c972c6fb2699737d75153218811b86e8aa2280a9a1cdbac2952e147e3a0ed7f2f484a7192da712fab83cd99791ccdc77b2a8a82ecc20aad468fee01ad9346539894df949fc91a990f166f984747e1af7f08912ddba0a304a045cf14e72d85e42b2c76c6496fec33cd0ecf36048005bfd5c513aeb6c6ecce605da782de152c08e9ffe7958d35a12bac51b8925a48bd29b8d1de1aa5d09eab8c7313b48f7770df19ebcfdc205c9920662fe9ef98661bb471164c08e9a5d14cdd33cb5af4681d855f7f23009d1153ad8d67319e870860b15392334761922173f44fc6ee284cbe7c2a2757df9655598d27573168cd1fc87d734d87632145f433ebd33b536430724ce76c31d21fb39fabe03cdae8ef8fd92f70cd82f2f5dea3d54cbd1483bda37893252d3e760d805a74466a4f8175b20856a5de9c0996679244f331a0f3bd05c0bb406152556d6fb7d8c631c3d5e59d4c2e255bf90efee9f37fe0175575270949eb5f1cb67fd84e4c809aad140a0a6ba61c1e0630672d1e46a0598b84249efedc73eed8ddc8100a9797176960abb0a1e06d88118f9ac51938d362918dbcb83fa540bbeca3837d409cae06c048c1f30ca47301ed4f5651d87adf393a1e7bb3439dfd6381fb57b09992a87d2328b4cfc39990acab6994d5f90e2faaaacaeac0ce37da210f16671843037058fb021f83b4e8f29bde629ce53f18e7298c321d606b9c07615a26f588006c91d7037b5203e17587b9e212f7aced1496c66ec609943aa7305ac6ffdfabfe298efc0ccf8890c4a807a6a46051eda747400e9f847af8221c1b146a2bf9b6453df0f494483f96e929e69c16eac79ce955bab46cbd967c50e8bbda0f2d4eef9b8c899bd129e170caa5273a7cc97400e08cc2dfbd0a8bf87c57df347398d58b65f37d339b2eebe4ed116559bec6d6f3ebe3489e48f375f2dee2f3d1d48b1fa770bf681ea6cb1a6eeb5fcea43f8afe370000ffff95f33b0536070000", + "b44ffd2c199965b7cd4eb8a159a49a12": "1f8b08000000000000ffb4554d6f1b3710bdf3570c7cdfd52a76dc863755d9a68261c350551741511414399258f163c38f4646dbff5e90dcf5daa914f9923d489c99c7d999e17bdcaaaac83eaed1190ce81fd079690d8569fd5dfd966c9085e8f0030be829fcfd2f2152b32d7a4a003406a638d714b2af72d8592f83758fb43802db120016c3ce549f71bdb3767f06eb3b15cdbe6251c8f0ca2d5b67635739ab702d8d90665b716b82b34aa13b5719e7369a90f6e0a1b32e9cdd21a2b3feb52f205cd928e64fe05b66d8165d1a1d134206690d53f7cc318d019da7f0dbef04a0b362668c0d2cc5cbcc011c764a72e6294c0be40ec367ebf614a6efded4d3ebefeba66e26d3eb1474f64fe461f19e0ecb4a8ae4672ee477e6c860949829d952a45f163f57d10774c9df2f8b5fe0864515da434067987a2a067b47f5224be649ea1a008de8ac348102eb64159dcabd791b1d2f9c4ae6a7883ef41600ef228569d3e8ded6a8d398e1faea566697925a7e017ff3f67ff0cba6b9958464b62c47b28ca79312a0616b8582c286298fe300ee98c6710486692424d3fad79ea2c7f6264251b8babacc035bc72d85e0628a04342ccdc05b8d5531cac1fd2505ba551f1dec1171ba1a002b052f3390de4774bf3845611742e7e96412ec1e4df14f041e9ec1e64aa2090b41413f0e6b428a0c674985e73bbc6c9aa68809bbb0301e797438c7141a80c3b12ff153940e7d79d34b8c77fc27eb03858b4207d8591f4058cda4b920003be4edc09edc407cde61a9b8c603d39dc2dabaed248372e7142e56e9ff8fa67faa233fc373414866d4035352b074399c1e01196f9076b8408e0d0a8d937ca7d10c3c3d25d2afcbf414734e0bf5eb9ce955ba726cb3917c50e817b58f2dceee1705934ec6e484c3aa949ee9f0aed00180330afff42aacd2f343fb617107f376b95afcb898cf566df6f688baae9f63dbbbf7c7913c93e6dbe4bdc1c7a3a9973fcfe07eb97898ad5ab8693f9e497f144df297e328397cb08e6d71ae98f7f8f415384110fee2be1a95d5f3aa02d9d1740e672d26b434b9e19bf6e3e85915bd04bb27ff050000ffff468b188018080000", "b6b209c99d6844cadfc0f2331e04fcda": "1f8b08000000000000ffec5acd6e23b911beeb290ace616700ab359e5d2c76754b3c3e18d98c05db994b9003459624c66cb297acb6ad0479f7a048b6d4ea1f59e39d0db0807992d86475d557ff859e4ea71351e92fe88376760ea2d2f84c68f95f281e7e0a8576b3c78b2592b8983c68abe670590772e52d06577b899f70a5ad26edeca444124a90984f0084b58e046f07fe0b209d25ef8c413f5da32d1eea252e6b6d14faf886e6fd8f1f8aef8b0f1300e9315ebfd72506126535075b1b3301b0a2c43948530742ffa4155aa427e71f2a67b4d4180ae6c34c0309f950683709154ae661ed5d5dcda1f334d1cb4c6601f7a43f27d20b26bd8d478c0ef4d7a3c77ed181e2d1cad45e9863acc66341db756d841f3dc82f0ed2553887cfcc6b25242adeab973e6b21f31f48501de6f09fff4e001e85d12a62981eba0aed9f17d75fbebf931b2c45da045018a4d7553c372a53549fd036006d90af688f2abe0e61e53c8886f74c1480494096029218400e9608a2aa8c4655e4a39577157ad28d0cbc5a16b9dbeb70fa1d8b92ce80621bc4c45bb624e62e8a096e05b4d1013c561e03da64952db2c0478405b7fc174a2ae00e3d1381b071b5512cf9237a028fd2adadfef78e726079f89546106695374b5b426f856125d4780ec22a28c5163cf23ba0b62d6af14828e06fce2368bb7273d81055613e9bad35353e285d59d656d376163d492f6b723ecc143ea29905bd9e0a2f379a5052ed71262a3d8d8cdbe88245a9feb43395ef5a9cd296ad2a90d776bddb8e5e308a3b1b3fe800225f4bfcefe1e52d46e5f6eaee1e9a9746151c621ed1de5f0b7be019286d57e893e256de9591225a55396d29fe9146a33d043dd4cb52136bfad71a03b17e0ab88c9188edaeae942054055c5bb814259a4b11f077879d110e5386f465e0db01f4f060426bb7dd84b4410d258fbdab501e3886af0d46938d9135b9adb66b8f2144f3c4f8b34574c831bb2f3b78d0e1e3d3fe4fb29795c7f8da32cb7d0e9a400a1b951350c172cb9c7668e654e07cf2e42408cb118835b7a94b61c1a350626910f0b932c246176fce57b5af5ce893dd0586da6001b7111eb9b3168ec1a4573ab1c56680968a0e91412df24a601e8587d304f3908eeed5d38a907053d3da4587f262b5d2123a4ec44b18e39e50818ed2b22d33d6a3819c3682d29d009a8ae6e000dd48ca71708b10285c89daf420d084654fd08ea85751444638ef2f9179ac84272d39f541c08845232633d9230951b22cadaba9d16fce3c70bfc11d81b20e04a520b981a5a30d54ce535f4488864fae2bd3b8ede7a74c6de8c1888a1506d2d928e3dde87caea3dc02ae84dc0c524d3083b6c962b9066130a42b979a535dcd350408306eada53070735bc07536ef9546a3c6a806c0b2a22d380fa50e213ae5ce2912801841cf7cbf6b00b66e4841bc3cb23fc86c357ced7d87197e6d8efa5101bbda6250e9bc0c0a46d262c4815944dbe2339b73c39bb3669bdda1d91ba1bb13905aaf609613d41891ee5b078cdb7d5a075670e07f0b267ee004bc412ec9f002bb009dc265bf8e1b6c3ee33c8d3f6567d8deac8e1d98e680c7d5cdba55eb8d9f1c088d87eb0029f6e088874be8aff5235a168d9c74a6807bd638270cd41cea8e90851846c1d625fae811cec73a5fede833f2aa6f984769726aa8bc7bd40a55f693ae8ba46e229ab5adcb25fa306c3e693d4fb90ff21609c3545b9a3a3f4d90cd817cddcf59cd6a3039a6ad3eb4f912bcbbbf5c9cc3df3f2dce1997bbcbfbc57b78da68b979d1fe78ed636b848f41e17a24e6caf3369a3963c4ac767fb93806c409d6325808f50f08efc576e039b9d705ece1581d5b865ecf73b8f85eabc0b8e6807118c239c58ec5f011a237b7dcc7f9c8da40583d219a8f1066033e10bb1dea3b41bd752ec6f6318d9d12f107627b66789cd11782fd705867ea636930851b72df24de5f2ffe629c7c182b752eaf3fddc2bbabe702ce2e7efe585cfcf85371515ccc3efe70767ef6f1c3878bb95afe3c9fcf7efce1ecfda8c3c422ae550de546b472aa8948514fe230f7704bf0dd7884ab9cba4383929c2f62bcc0678915015af2db96342c40482ca416799462534a5b696a850a9e346d742b718f4584539299d4ca9f1cfd22e6ed9eb5d7ad5e2f206aed68e4fb228c5680cfa2acb85867f7edea907dafa3c6df16f620abe16459af92d692b4464be458d5d3d991022ead01bd09bb83e914288e92efc3d4309ec621f0a48d6126d2c464d7df0c85f6fd62365c4d412b8c5a8d7af7c2aec733e90b9e9dd689c5ccf10c04b138feb5d61ed5d8eba6d1ae7f8f0c78e4f2d8b53c1d38a98b6d2609836decfdae7b6d22569f3db7cfa7af6b65cf7b346f6edb6402fa47f6067cae5cc8461d45875f9c504b618495e8f70d311b538fe4376a88afedb7ef88730ec818162fb7c39c890748aebc2bbfb621e63b5f515ee54164ae397340628359a6c98e90926d69681694566328af29b1c6ca8a56f3fc8a126bccdfbb6d7423fa91ea2a1d793f961c4f6da5070bab636cbeb2b07a7160816982fb565abd9556e3ebadb47a2badfea8a5d5d70f8453feeda6bf5228ccb94f73261c1df6b5a7de9d147825e4e6f8b07884e68b23e4df9efbfa23e4b161f1371e28e461f1ff2ff9bd8d90c7d6db08f96d84fcc71c217f75033d70a1b3b5ffeae962ff2f7adf347fe5141f40ec5d51b5141ac879b1c6bc933ffb9940cc1e15a1fadcfda6e92cd50ccd2749f1af7456e9f48916fce39f934415d597860fdefc5f000000ffff4ad2449120260000", "bc87ed2c02b0b772ad47f5b3b7d60887": "1f8b08000000000000ff9c54bd6ee33c10ecf5140bd7a684b4025c7cf80eb826171829d21cae58916b99f0f207fcb1631879f7032d47965338f26d45509cd9d1ec90a79300bd81fa0d3953acfbe0b27f754c9db64adbfe7f675370cc146ab2d83129f8f8a88410157afd46216a675b40ef63b37faa76daaa167e9067773464536528a1c2846d05c0d811c7b2820268e1dc4b846b3321c76e15804543b30e458f925a389da07e25268c54bf7c6e17b5d1932c6d0379d612630b4f15402426995c1804194c72fb3c51384f6322e319135d48267f5b8a6ff8e6310e65291d5cd869dbd73d064596422dd965d56c8233c20767286d29c71690d91d48cd802627947d1411b7ce25815e470a7b0a0fa27dee584b7139f3a5f7e75c4a150f505b0aa35d625e0086d206fb2102da2a7a1fe37cde8fb0b847b22819b9215a67e6b5632d8f2dfcc7073cc6f1bb74c66009f9ef457397f4cf75eaa19f64408010f42e392b1a431a57bbdc9188c798c82ccfebc1b8616d9d2271cef552d10633a72f6c9e6422f5b3c889cf3aa6152aa3ed92944ecbbda6c3cd71c939260ac5dc55b932df5ffc0ba2c89d5a55c88a3ee9ec46f7ab668fa161ddddb5a5b902469ebde36ce897cb36ddf8f4c0f8014c81af316d5b9825a49af6feb7cc459281523b1131ecbc7c4f511e5db2e7a7f46f000000ffffb65259d280050000", "bf02826cbaa5d5f9baaefd4970f908cd": "1f8b08000000000000ffa491b16e032110447bbe627e8093d2d2ba4a635b89e57ecd4d12640ed0822d5927ff7b84efae4d930ecdb0fb6677e7d9227c61384bbcb10e234bcc8fc3e184e7d3586b8d9470a6d69093c3fdcd5c431a1d3ea9f7e069263619a589334092890e93f89f90687d4e4d738c543b49926feafaa516f17498670c1f8c94ca61bfc99d0944b930d6de1290521caeb70b35b1b1be34cdf16f502df4bdbc3d0a1d76f1561bf5fd6800bfbd1df639d100256b7bb1ec36009b06bf90bab9445db7b39ac7ac6dc90a14cd2dfb1c1d4ebb8ea88cf42deb3ff2f793308d9df01b0000ffff05a7e2069e010000", @@ -88,11 +92,12 @@ var _ = func() error { "c067e4f0889cc8d62fdf791800d5d1a6": "1f8b08000000000000ff7c8e410a83301045f739c55c40d1ad27e809ba1f26bf1a4826f2337afe82d06d97efc183a7677983a374dfe45e53c63096331e7ea136b14319f2e9140732b210a35f343caea91dc53159f760af159c9abaeea0149750ee08b17a8d00936bc3f62749f7ef6499d77949df000000ffffcfcab6bf9c000000", "c45311486dcb9fc9ae2a8e75c5452a09": "1f8b08000000000000ff8c564f6fe3b613bdfb530cf2fb1d1214d62287f6a022a72dda53768162b197c5961893639b89f86787941337ce772f285136a5c8dee41271decc7b8f439ae4cbcb12f41aaaafd8b4142a45be71fbcf9fbfc0ebeb62b95c2ed0ebafc4413b5bc3ee76f1a8adaae1a3b36bbdb947bf30145161c47a0160d1500d06e5565b5a4a6723bba6215e1ab4b849ff9dd5d1b1b69b84aef52617058f926a787981ea6f6a0803559f8670f201d0e08a9a904400e839924d8642b5415664892bd9b8567de8495bc6d8d93dc92d068b41327a127d620d878e70090f6e257ee6be4b05d83aeb58643fb0c62650461edb15b1a54841049525b2e5a4c1aea11ac82aefb48d21c78b061c738fd11abe9debc9f79ccbd459792b175ccb9244d9b81e1022ad9928dd12efb4a4ae03171307f3c23b8ee374947dcf1f89fc31c8b4a1e74b3dfddd50642d8766fc0fa433c65918879747f66e3606df289c9f53df9debea979b339d816f33d5dea96e7af0fda814913714fbaa1abc5319e9ad8a77ae43a796988528b8f32cfeb936d2886e2b0bf45a30fd6829c420d6a81b5222ba88cde14cce09cced16a7768b35bb7fc98ed196996c1421626c83f05b0c344ae84f029372b27e46c2284d473273ea812ed615ec671812c114ca3fdfc4db320d405644a5c2a1701fb7c7d18f96dab40691acdc1fa39c968e4e354f8e1f85cac7c7e1add152a0088fa48af8ac68814fe40b64d648c035c53d7a9db636f1c8cd141b599a82b3bea649137353f88243c77e8b7667c28cc31336e3f0045e70784a9a7578822f39dc1187ad7351dbcd9cc9129ef359e2f326cb8c799f65c6bc551a6fb8341e9ba1335b2c0153519a6e2aeb54fec5745f3d73f739e6ec42035b3718f304923c38cddf3d571e8cd97270e0cbc331a36727290461f059ac55388e9d279b0237ff9fbf741600d810f73d6f9b747bf6d7fbf9eba7eaf2aa3d9a664806d8b06b7d7180ffec5dd0939ccef24ebab8463b5335dcf7041f8ff5f77df91feec916f73e3d7bae0157816cbc6efdcb835bdd5d9d17bf7a85bb3bb8bd2918d68e6bb8fdd514a1e92320fde50bf21d2f9e217f47ace3be06c93a6a89cd088e7b4f350422350aef74d02bdd7475ce136374252d5aeb62b7ec13778a8264edfbe5fdb225264026b00eb8b556dbcd601b4eb621db066d43442b2954f0c941f73383b4750348b4b022904c18497d30a86dc474f656e3b9b6c620ef8f8b362b1240b9275ba57da7306c570e5989618eefd87ccb6355f510d2340fcb457aedfda9d39efc8b225c1969ca37f3b8e00a0ea0ad221be1b7f4484e0f79b22a7dfe170000fffff50d4a27d40b0000", "c600cd3667c13d2cc0038503b3a01297": "1f8b08000000000000ff2a28ca2fcb4c492df24bcc4db55280f174d3f2f3b9b852520b72f22bfdfd43ac14d212738a53b900010000ffffaa485a6f2d000000", + "c638191fca4962f2df23ff3fabcac7c7": "1f8b08000000000000ffb456c18edb3610bdeb2b06e92197484ed01e0add026f0fdb36c922bbd81e8a1e28726c33a648963374eb16fdf782a4b4b66479372850de381cce0cdf9b375255d77525bc7ec440dad91684d7f827a34d3b6af6df53a3ddeaf0aeda6bab5a584762d77f46723148bcc18db69ab5b3558f2c9460d15600c25ac72299296d01a4b31c9c3118ea2dda661f3beca2360a430e3ea63ebc6dbe6bde56003260befea07b2416bd6fc146632a002b7a6c41c5e0a82176416cb149a94d4d2ce4bed1ae228f32a5dd06177d0b57bc4aa8a1bef2b69b1435ef8d26fee964fb591367bb37310833e4cf16d2761b8d08271b49e7b1858f29ba1712550530bc3067ab4128953113e62e68cb18d6cec47ec4aa862fe4ec9de05d0b4d7a4ba9fc2eb82f28f9f6263b8d40ccad7c4cb98983b6db2bd1063cd64610214da2dd2f1d5d842cbe8777e5fd7287bd68075fe7d1bebfbb7dfcf67e620650483268cf99e68c296802de21144fd8b890b7e5ecfdddedd3551f9cc7c07ae4aaacb38e3db3ce12bd4eb5142f50a955b1e41ce84035940f6e03bcd304017d40425b9a7712189293b0e0ba047803f7185218a09d8b46a50e3f60600828ddd6eabf9e6213b0cb498d601cdae8b432fd5618380813f10d08aba017470898b240b467f1b20b35f0c105046d37ae851db3a776b5da6a1e952a5ddf47abf9b8caa2d35d641768a5f08066457a5b8b20779a51720cb8125ed7b9749bd5daf4ea9b30689b5e4f6abd6883b2b2729e6120a928512d86abe51527a09329a1f3f987fb0718536732e6e867dc4f17e94441024cdb0d8642e226b83ec744abbcd396f3461a8d760e3fc5aed79c78ff3d2271e2aa81751e5fd02144af04a36ae0d6c25af468d682f07f2720214d7502f6eb28389fbc73e782dad9c1381caff095e577ef514ef4a29074481dcd8231e9e03429c7b5acd2b1bcd3f49a9fcef27f98388f33c23f1946a12af4c61dfb4b46afa2941f3f996f2f94321d864f78fcb1133c0692c3d930033abc880843a5f92b305d9ab15fa8e1992a269c9cbf05bc08a247c63057cdf3d494255d9f3475394be79876ce1914f3b15856fe283c7b7b9191b2027aa3a5b852df1820cdca2d86059f24dfd4a04bf7ebf3f72d9ea7d2170fc6b2160eafa8ebfc5084208e5f2549161ce9455166af490bb88ed204fc8fba249401f9251164a7cfb819bf62f9cf0ce1c75f1ee0c1edd1c2c3a79b4f6f8a28a5b0796ad242b7430aa090cb0c2f74c11e8f10dce2c7f699ae5984f1c258a06981432cec0e8239b7c4eee963d7c2dfff5427268494e819d5c7f93fe2ab57931fc1bc95ce961f3a6ae1d7dfaa920ad5e3f8d3978cff060000ffff9ac759f0670b0000", "c682dc02d18757e8adb0d0eb74858d9d": "1f8b08000000000000ffa4534d8f53310cbce75744ef8894aeb8a1778403f795e08238a4c9b46b9a2691edb4c0af47ef8bad5e455bb4b789657bc613db39677ca5af60a1927bcb5b1f36bee94b61faed954ade1c3ec886cad3e9bd39508ebdfd949a28f8b9249823d447afbe37d6667f446fe597288efd8e18679f920b252b9794c0865b82f4c6595fe9339756652873b6eb8cb50c298d03e6582d514620080c5d309f2860789cc0db393591e808ce5ec3cb63ed7142d6d73ef65bf7aefb7e5dea2be1a7220fdec86cc43f7b86265a8e4b306247990603afb43b8b1c6ba14b0563788f6990c0f08a11b61a17786fce0c3d173e50debf2a5d499c536a491468ede3c27e8f67f8f3e4447d38dc22a1f903974d58bd9e44bdb62918a68d3a53c44d857f952d522fdca9a3d8957b1109339c8779d3ba7fa41c29efff73eb4bc2337643ee62e40d5e63edf5953dc0226dfb0341c7f39a1a7c11f0239597b2bacefc090000ffff1dd04b8811040000", "c6b383666edb094089623bd854076baa": "1f8b08000000000000ffb4934f6fd43010c5eff91473e89135aa5471b0c4019503a82d8bb6b412c7a93d9b35ebd8c6e32c84b4df1d39ce56d97fda0bdcac99f77ef39c89fb7e066609e2116d4b2c3405ebbbf9fc1bbcbc54b917d1d50417c669fafd062e1a542be3e8da2233c8f7afbe699d389b67b35985c13c5264e39d84cd65b5364e4bb8271529550d25d4985056000e1b92d0f7bb7c91cb1955041c508d2ab1204bc824be6ceb4566f1892c6722408d5193138c4159df6a61fcdbd0c6e099248c53549e52a52e908479c09f2d55db442d53fc98cf87a978c82f06eab5774b53c3333cbdbb22a74a8a7c33fbe1ebe71bea4edb27a213f64f77a8cefbb3ea04e061717bdeffb0b8ddb1efaf6df4ee7cc7cd25dab0c2ed42ef26f8ffb0d610fdc6688af78154a6068cc9a421dc01fab557f86cfe1c0b90cb45601aac8f29867a9184e87f904ac78695ce78154abf7c5c1fbb6ee98c897875431dcbaaef21f9efd8d8fd6cbc5a53c7f00cf9c9b90457db9768967bd28435176a3e9d460eba431e399d8fe57f58d0f2df6f4c965f713a6d72fc1b0000ffff3604c9b27a040000", "caa999d221d24cd3a638f0b97b3f8b7d": "1f8b08000000000000ff8c564f6f1bb713bdeb530cfcfb1d1214dac087f6b0854f29da9313a00872095262448e24dacb1966c8f59fdafeee05772969254b8e7cf16ae6cd7b8f4372769f9ee6e097c092a1f98a5d4fa971143b79fcfcf90bbcbccce6f3f90ca3ff4a9abc700b7797b35bcfae858fc24bbfbac6380b94d161c67606c018a8858076ed99e65638ab741de93c20e3aafc17f659d4f3aa64977e558b52444b2d3c3d41f3377584899a4f9b70f101d0e182ba544400e821131743a959a13a62d2c676d2bb0f2369af9807bb3bb9d9c662b28a91cc086ce179209cc38d2ccccfdc0f5080b5b0a8a97e60895da29ab9ed17a44c999249ae4a54cb4543a5a316885d14cf39d5f8a4015bec36dac2b7533df95eb14a8395d772497ab564a68d1b13c6943d3353b7a477ded2d08137811bf3268ae67d38dab1e7b744711b545ad1c35b3dfd3d50566f37cdf81f58094118f6c3f32dfbb09a80af144eaf69eccebbe697f7273a03df8e544771c3f2e0fb5629a3ae288f552d447135335a3567eec3a056988d9970d755fcf32ed86086a36c307aa3f4a3a7949359a2efc8992c19bbe713985db2b6dbecda6d962aff12ef677b55e26c52c6dc2713d798680f304e82503055bf66d21ecc670ac7d413bd5d37a17f8be230572f7061ee956a22aa584ac9047c304b97b6bf25120f8152792f7afba3a79e0c3a37a5dc251cc5bc3e88d54c1d2a26911576c92c7a7b4bf93c6ceac379402b3d1f7296a733e58f435fab1fc71d13ef79e9d9a735b9b1a8620f509df08a5236da337b5e99da7ed113782d5786ea16bcfffff1193203c08e341742edbb320cc7697d7a9a3403ae79c4d06dc0002b953e4eeee3cfc6fc48b2bb9a83f4642a0ea65ab81e093e6eebafc7f23fe49e27639c1ea2b6808b449cdff5f1e946165717a7c52f5ee0ea0a2edf4f1896a22d5cfe1a26a1c3995efeeabc3be305b6c1df91fafcd882559fbdc56e2f9d1f23b59088dc5ef8ce27bff0dd50279114b34c699159f270aa0edc394a567d1cb7f7cb9a9400958005ea99d9d8869d6da8b6c173cac89652039f04d25a24038ba30416191604560933b90f013d67f44caed95f6b1f02eae376d38e8a247072cf4d39770ed37a21a8ce6cd678c6e19b6fab9a9b5496f93c9f9597f79fbe9cc9bf28c345b061fa09b45f7001cfe0d91167f8ad7cf3946f3362571eff0b0000ffffadbe4e10a7090000", "cd9e158057dc86d8fe9106c4fe1e1349": "1f8b08000000000000ffd454c16edc2010bdf3154fdab3379b6e2a451cdba4520f6d22755bf54af0ec9a1a3308c66b5951febdc2767a48ce96b67000e6bd79a0372336383cdc3de0d0b88ca3f3046b029e08893a3e530d176070eca54f8433a5ec38606828c0788fa34b3418ef333a774a46a88630a421041afea1b01c24b1f794d4a6a0b9e032706a11d93beb286370dec358e98df76311e70185412917cd3fec82aaaa4a99e87ecdcfd0af222e9cb6ed6dde3abe3a5fabd6855ae3fb0c3d16f9517524a63662b40282e948834e8972aea67baa3ae405c8d158d268fb27aaf298853a9523d99217b9fe419eac70d2787e992245fc3046ca8550e17e125558d4e7a07059cbcec54f9e6d3b1fcbb0ae4e1abbed34af76533c7292fc9a11130b5bf61a3fef1e97b442d0f8b87f47397c7e4729866df0e5ebef6ff74b4121a5d0a9f7b48a93268ceb39f9fcb25a073422f1e27be06d816f6ef6ab1af2bff971bb5bcd8e70f96ebcfd21ae3fecd5df000000ffff3760a955dd050000", - "ceb4d30165ad7dfaaa10e88a98e5c0d7": "1f8b08000000000000ffd454cf6f2c350cbee7af88facebbdba585432490aac20109bd57bd57e08010f264bc3361b276709cb62be07f47c9cc2c8ba0bd33a7e4b3c7f18fef7338c280ce582b9838076539393b8c5eb681774754889bace0a7dd00d223a16cf045917260da24e1a7d0a36c9a9fb156617036826256636d2a313e700cfee4ec5d7c8653364630c5e0e19e0ba9b37b2398b988c7ececef7f1ae399543846945c735aae2902b51c1be28b08927e3a91cfce7e6eac0d7410c82ac56b91b71c9f592694b7220dc4821f120a6860ba23626d27670f10331ad3870c5dc4fb8b44ed4f3faff08fd88dccd38c9977b675f707f4caf2e109e55982a2b37f9877d6ceb6ecda7963098ee86c82927153cb864028cd66eddca28f97030a3a966eebf9b89b4a8742a8982f8f5de46e7784ac28bbae84d8ef5ae8ddd7ec27944388b8c4fec7d8e7a90fcc43c45fce59e4f9df0d1cfb2f6e97dfdaa4af6eb6d7570bf084925b9ff6dbfd7efbf2ffae6affafaaaebefab256f6d96cd86eb7c63ccfb3be673a84a1722aa33ca13cb0a8b3b7b7378dcd8bc9c780a4f74c84bed1a95110bcc7545145d2c753aa2a80d404529d76bf66a695ababcb2b1ebfa5ececfefaba5dba22b9aaeba65e8fe0c740f8edccb6ca4b6b517d3fa79095655900eda10839bfaf435b0148e0839ee67b077e2a69b5653f625fe2d9b7c7a8f08920e591f50125707b04bcaf6a0f347cf3925874152052554cbf2aab42845a25fa28703804bfc6fd0fc7aa79452188efe75fd6ca2e5abdb4be7e2367a58baa6a1a7f57783ee1058aa213b6b2a1e8f86ac6eb0a7c4482bad1ce2b511b50599162a1e9aef4415f8d32a2fffee3776e3d3ff284e48c5957ee4c2e5c46b63ee1ecbc76ff0a0000ffff0fb1f56ec2050000", + "ceb4d30165ad7dfaaa10e88a98e5c0d7": "1f8b08000000000000ffd454416fdb3a0cbefb5708ed3976f3daf70e06de038abc1d060c6dd166db6118065a666ccd8aa85154d260db7f1f24db598aadbdcf2789a4687ee4f7d16ca1c3ba508ad15330427ca855d76b2e0d555b14b08b20a087aa036ed1212ff051d005436ee19976a6455ee4b8422981ae56160483144af968ed1d59a30fb5bab67b3884a260f4d66858517452ab65c11828b2c650abafdf8b429313266b9143aa69ba7a0b2ed7982d3a32a3938783d3a1567f174a19b76108c2514be49702f7c403f24b993a478cb71e19c490bb768e249f6ab5011bb0285a13a0b1b83a29547df8389bdf63d3130da3ad3857b9bbef500bf1ed0e79cf46b056df8a73a5465fa8f379a11c6cb1561e62c045820dc621679f52638bee4f0764a48f4da9695b0db1417628184e8f8da5a6da4210e4aa89c6b6554e5dfd4f7a40de188b53ee27631fa7de1175163f1dab08e3db056cdb7faea66779d26797e5c5d964d82187dca765b95c968f7f36aae52fa8cefefb3721fb6b7494655914fb71d62b721bd3254e05e41df21db1d4eaeaea32b37972696bd0c98a9c439de99429085aa34f564127eb834f2a009f059282aacf81dcccd539e499882f3ed46a7971912f4de490d47599ae5bd0bd71f87a645be2a55228ba1d4b08423c2d80fc230b21dca4a1cd06f0a08d1cc67b037a887ef605dd631bed31b6452bf0e0c0879ee40ed950fe09689dd46e5cf7ead113cb2c40744931edacac64722849a26b86cdc6e839ef6f0293e605d981bd199fccc84e5a3db53e7d3d057127a852193f111e4f7862459601336c88d23f5bf1bc02d7e8206db4e34a946c48acf036bae13ab6469ecdd2a37e7bffa69ecf6b1a3053e4c974dac8145eec49406c27e0799bce2b7b24274e239f4bacd5b8b67f040000ffff89c8eb3602060000", "d2a3631bbdf0c7302d30bc4b3c26833f": "1f8b08000000000000ff4cccb10ac2301485e13d4f71e8030404a76cbe808382fb3539c3c5f4b6346997da77971005d7ff7c1c99f5c1a5e86401dbc9bdd452c09dcba6919718a7d5aa1b59254995e000939101fb0eb598d7440cad0cf0388eef5c6689ddf81b33a5d05f7fb9ab2c4fe612dcff4d6fede80db544ab3837fd090000ffff9758e0e9a1000000", "d30f4bbe8221f290de4330451501530e": "1f8b08000000000000ff6c8eb10ec2300c0577bec2ca5e43c5c2024b0706767697be228b36a9e290a5eabf234a60623bc9e7b3e7b9a20ebd7a90b314a2dc711bc42c239a06efa85a96cd5bd29e0c63466cc2384904b9d3916aaef7d5ce11373249ab832685f1e5d9e2fad9e7b3a6826ba99ce0c7c158c336d76b1b83e1ffb84592e2f8eef7cb975f010000ffff9dc616febd000000", "d37943841d1023190d8a5689dccf20ea": "1f8b08000000000000ffbc585d6fdbb8127df7af18e83ef4dee0ca6efad4d59beba48581f803769ac52228029a9a385c53a440524abc45fffb8294644b9664cbce62f5b0eb70387386c3c39983fabedf23317b40a5991401a4d7bd0d1361005312a18e09c55e848684c490a0072048840150cd7c9e46bd43e79f3f8109ca9310c1d3462ab246ca89d669b6c1833efcfa95c75f66f691b51f8100204248430c93425b334039727f93ac500934a8fb4c0e98f6437c260937be3307e01995a0d78b954c99cd015500168dfbda10bab14e05542a7912e117264226d613196200bf1366be4af595296d4652e82442d553169a4573c919dd0670831c0dd66ab12be41255ca280e29958930ed47f5a9144649ce51e52657fef66aab15a17d929817a9d85fae40fdcd6757861df68827daa05a487ee41acbc02ae1a8839e0f2466df944c6257731f3caf07a050cb4451d401b8452143d4ee576c73d20685c98ae80a644d29aa55b17d8dc6fd9f339dfd782586be54b0a01d0c45184b264c3360be2ac34350efcaeb8c906216beec4f15128359f45aba6e39a7635efb86b865bee20545c9927b3328ecbdeb12827ba3997d4d548802553f562c651cd7185652d9d50769a298d9c696bdac948edb90e83a91cfa359fe7c3ab24d725ce0b3dd531cf7085e0fa0ceea23d175b2fa13a971746e7c8aef7d80248ef5be08371873b98df05d6f5cc748037771316794e800ae7b001a39522355d6ff22cb903bb2429e37445bbdb805c36014736230772d25663f5e89722c0e40919afb5d29e4b4fd88f6b30b8409543b20ff5855b28f45648df94409f10dfa0f8427b6c9db750d5eddd5b3b3a5e23e4f382fbaf490bf92added9a98c2222c2fdc97d181cc986a8b52eefd58628b3fb1b455a3666671b2dc74f770f93a7f962f6305e8e67d3dbc5d37438b95dce87a3dbdd6e80d49eebab9251505a047866c8c3fc6dd4d6e7c4bc04bbcbecef78d49ec4f7bbbba7f9ec6e3cfae3103a006ffc3c9566ae50a3305ea7838c27c36fb54374b8add218ae5cd721d6cdedc37874fb341fdedfdf2ea625a0ffc078329f2dee87d3fb00b63201eae48123277bde028157c6434a5408ffbdfa1f1003446c21969ad946024c80794108d1b257c35ac94dbfa1208310d38148237cfce8fff643b8ffee0b5369aac5c759c48caede168d93003e7d8c2a8b1146526d03f0ae3f7d9e30ef1fd00d0a539676ed59aeef6f07e9f50a0d29a0e6325ce673217b2fa7d1fc58c7c75b18e15cbece8b6974ab29e1ae9b076025590f603fa9764bcf3a1b02ae62568b04b048c4500fc5b6d94159eb778daac545e31d13c95b9b3589638eb66513be1fb60d1b7391910dc90f571f2e19922744d8c9bab649b346657074e037c887e62cdeaf0cba1dbaf381e1d1f37e5425d6a357d3826e4b2eb21ebd2befc7e91899f6ab3a66d2cffb3f784ef9d9306714a0fcbeba09a3d30cb84c2e35eaa432585928ed033b8ddc49379dd5803a92a673b9feb5529daf27cfaacb8198241849b1c48bfb7ed185cf938efb90efd08dfb20dd4563d9a78b62aceeef2e17db04484d2f9635d16e57d14b4752187c33e569df309bb2af220eeb4a6732fb3ebd9fcfc6d3fb8a4ad8291113c58530f53aa9d7d2095be56b563d9eeef570d63927f6627435ddc8ae6582b39c4c25dbec48962055a9e35c958cc93a9ffc5f58c81452fb07e1ad3021a64de133d1d6eac5d96a10c9d00e8d06efbaa5ea8d860e781a0d56846e92b821004fa306dba5472ce028a12fd88c56375d0aa61231e0926e06cdf7c6d3c85a2f802ac9a202f745ea0cb6122e3ece1fb38d31801b175faaed4c8d8a7f7539a040996127b00e49d419e380662760da58d715eed0f704dc119a7645ac13b923669d906740569d4f20b612f60c4047e9bf030000ffffd60541bcde160000", @@ -100,6 +105,7 @@ var _ = func() error { "d59b706b8c75b66e7e3d8d3d7e1b2447": "1f8b08000000000000ff94525d6fd340107cf7af58f5dd490a04a17b8b42902a2844a554e2092de76d73ca7d696f9dd4aafadf91e3e09c4342611f673de3d9992bcbb2c068ee8893095e01c698c69bcb626d7ca5e03d451b1a475e0a4782150aaa02c0a32305158728682cf11e4a113529b8374c5bb4b600b0f8936c6a2900eb77a9c41807bc1449b7db4496b404eebe74287af529a39e260308b96851684fcb1cb663070ae734ba39877b926de0b5f10fa307e48a3cf148db5057e37b0eae8c1c1cc98aeaa400ad0d5baa76d4df77b5a38317349eb8b7528271f8400a9e9ec0f88a1e617487b6a634dae1092e0e4e2ee0f9b977b35b2f6b6b97c11add2898d92d36e9e0f6cf5eba8981254ba284c841820e56c1ed7cd9e399d9656051309d4ca697fd3a91aed948330f5ee85154c6e3dacfd2b744ace0ed74fafa4dbf22bfc9ffdb39fcbab8b95bdcfc982f6e6eaf3e5ccd67b78b4c6ad346a160ac89c5dc1b8d42692c368d34cb39a58f8befffa2b0a6e6ac97d9ffd8d13870b309b676741d6a3f4cf9b88f32116fb25a005ccb59a2ac8eff90674b587df1b651205c53718053a85953ca7bb0c6191920003ad66d936e003a72811b05af26936b53f48a822c271f577762f6845fba2d91661abc910ef9fc622646c80d4e28614dcd09cea0cf76e22ec8e3a6ff2290973814186ef60247b51f18fbc5af000000ffff2b31c49d4d050000", "da4e4b079ffa0d407c9bf01f905b3285": "1f8b08000000000000ff9c92cd6ac3301084ef798ac590a3155a680f39f5094ae9a1f74d344e44e595d02a26c1e4dd8b5c6352e7e7d0a3d0cc37b3d2f67d4d168d135025dca2a2fa7c5eec385908528d6386a80b52c7143a6791ea1699fda2f82076502f2e219e37f06a3846f38dd32f6e381c3648820c352eac4ad41fc61d44c7fe3076ea7b72b2f5073b3535341a1f14b9f6ce0b16ca9aee28c6fc21e97a0a279a59b618ece6131eac30efdce266b3a99a6b79374e45546e5c437bd68f84c61da9d23d3fbfbcae2b325f255ecda037997734396272921baa96fab6d4b93221067539a4d32304bce21670fd6fa0d8cbb9e71f62117d38b590dc21959d9a964357ddd3e573fd040000ffff0ba3dbbc95020000", "dc697c5edd0e778fb0bf369895e79192": "1f8b08000000000000ff34cd3d8ec2301445e1deab781b7094b4696784a829e88d7da33cc97f5c1b03bb4720284ff31d57f50c362d7995b19880e6a9b57ffa8898c4ef8e5db6423928717731cadfe9bf0971bd2911e4f294be43f0e8c86fc75696a101b409dd45935dc22a9ea1d9ed2b98f15bced332cde6150000ffff1af98f5f85000000", + "e21fa37536a2cdaddff645aac64cb5ea": "1f8b08000000000000ff34cd3d0ec2301044e1dea7d80b244adab4505083446fec81588a7f985d2cb83d0244f99aeff996cea0a65a16e9b38bd0c0d4ecdb076c59c2ea6972ad949355fa1b6477dcab10f74722a25c5e622b044f43f9304363ed29824386f9cd159fb14860d4417f80ebffe134cee3e4de010000ffff7db33fac83000000", "e29d2e9b39cb76d7434bc70bf3b0a421": "1f8b08000000000000ff848f4d6ac3301085f73ec520c8d22a14da45563d4129bdc1247a7686ca63a3914382f1dd8b5d63d2fcb44ba1f7bdf7cd3094145089829c720347e5381635a700452a71ca509356ad3c7294c0b94d6583ccb198486898f3c5654de41da279ee3aff85f34fe1fce877488a0cf3d23e4d63bf3a1e541c39f68bd53090e83ef66175f5b4807f88dcb2d78253cb961e2496fd79e9f60a51cbac7bccb8ff44041bfc3b37b86bb6aa49c3f57215d1f423151dd83e122a3991b3033fbfbc6e1df9cc35ada12e89e68adcc6de36e6c82774ad496ed3f92a8868b8876dffc1345c6a8f63f11d0000ffff6b3ace2e1f020000", "e49feae8bb53519480384ab0620978f8": "1f8b08000000000000ff3c8d390ec23010457b9f6294de96dda6a38213d08fe20fb1e44de391c5f1111149f9d7c73d3d2123b5bad20c867bbfe4129c5f4cc4d824753dac1b3d900b6d3b8bd2ab09e90ebab34454081528679a9c53646d622a17acf4fec7161f45fd5d0f7b75ecb131f3647a179c37df000000ffff27a61be295000000", "e5e48f06c32e616c636e1a6954ba642e": "1f8b08000000000000ff9c90c14ef3301084ef798a554eff7f882524c4c1d7de41a252ef1b6748adb876ba760b51e477476ed21671026ef67abe99f1f26877906883d7747ea806eb3b4d5b1841aa0e48dc71625d11793e4053cfd2c1431a7c24f842c5e6ccce769c823445ef1a03492b104736d034cfa45ee1c011eaf93aa69c2b22c72d5c2c01443c8ef784cb44828326137c92e01ca439b0e77e7d347b96a4a92eee9b72be7853cecd7db27e8d72ae17c3a5c54a7ded7493ec213671ff5db3859cad5964691aa1e965e4e309d57541c945654aa17926c1f164051dd56ac7ee84a87a175a76ea1ded3e846113fc9bedd58a908d37a2a67fedd323bca19f90ff972596db80e9b7d103a63f460f982ed19f010000ffff8637462d3d020000", @@ -134,6 +140,7 @@ var _ = func() error { b.SetResolver("internal/control-plane/templates/accounting-exporter.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "5dc8d2706b8b1aaaa6390b86d1afc17c"}) b.SetResolver("internal/control-plane/templates/authn-webhook-deployment.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "352ec85bec763e87cc07742b51d597d4"}) b.SetResolver("internal/control-plane/templates/cloud-controller-manager.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "4e5b1dcf947817d2b8d3987e1daf2102"}) + b.SetResolver("internal/control-plane/templates/duros-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "849fb49004730bd92c44c0a6befee2bc"}) b.SetResolver("internal/control-plane/templates/group-rolebinding-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "bc87ed2c02b0b772ad47f5b3b7d60887"}) b.SetResolver("internal/control-plane/templates/network-policies.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "9a551dc729ded6b79c956490a2ce9eef"}) b.SetResolver("internal/control-plane/templates/splunk-auditlog-webhook-deployment.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "1f53abfd0e947ebf1e6a5506aeed3306"}) @@ -141,6 +148,8 @@ var _ = func() error { b.SetResolver("internal/crds-firewall/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "10e69259bc888ad9283e28656d823ff7"}) b.SetResolver("internal/crds-firewall/templates/metal-stack.io_clusterwidenetworkpolicies.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "8e02c8258186c2a4a3715281642737c5"}) b.SetResolver("internal/crds-firewall/templates/metal-stack.io_firewalls.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "a97b7bf091edb7f49ade2b55c317ab97"}) + b.SetResolver("internal/crds-storage/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "e21fa37536a2cdaddff645aac64cb5ea"}) + b.SetResolver("internal/crds-storage/templates/storage.metal-stack.io_duros.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "c638191fca4962f2df23ff3fabcac7c7"}) b.SetResolver("internal/machine-controller-manager/seed/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "ad69d46686990c21d89108e935a76f2a"}) b.SetResolver("internal/machine-controller-manager/seed/mcm-monitoring-dashboard.json", packr.Pointer{ForwardBox: gk, ForwardPath: "f5d0405fe2243802c3f63ac616f51f92"}) b.SetResolver("internal/machine-controller-manager/seed/templates/clusterrole.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "24aa3ccc1a995b6aade74632830adf5b"}) @@ -176,6 +185,8 @@ var _ = func() error { b.SetResolver("internal/metal-crds/charts/crds-firewall/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "582905e4a7564fada0ef5554be89b0fa"}) b.SetResolver("internal/metal-crds/charts/crds-firewall/templates/metal-stack.io_clusterwidenetworkpolicies.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "b6b209c99d6844cadfc0f2331e04fcda"}) b.SetResolver("internal/metal-crds/charts/crds-firewall/templates/metal-stack.io_firewalls.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "e846d251fa96468c371e5caf4adfd628"}) + b.SetResolver("internal/metal-crds/charts/crds-storage/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "4787cb877ff989b4782fb43163be27c1"}) + b.SetResolver("internal/metal-crds/charts/crds-storage/templates/storage.metal-stack.io_duros.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "6708cf6d63f8ac6cef9029fe0bf53e98"}) b.SetResolver("internal/shoot-control-plane/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "3cf70b764b66f97c0a3292cba04930b1"}) b.SetResolver("internal/shoot-control-plane/charts/crds-firewall/Chart.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "dc697c5edd0e778fb0bf369895e79192"}) b.SetResolver("internal/shoot-control-plane/charts/crds-firewall/templates/metal-stack.io_clusterwidenetworkpolicies.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "9c1120e05c97a520680b28342fa38852"}) @@ -187,6 +198,7 @@ var _ = func() error { b.SetResolver("internal/shoot-control-plane/templates/network-policies-legacy.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "cd9e158057dc86d8fe9106c4fe1e1349"}) b.SetResolver("internal/shoot-control-plane/templates/network-policies.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "3c3ab9b466e8b80e79b5c935c03d5f3d"}) b.SetResolver("internal/shoot-control-plane/templates/rbac-accounting-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "0220093f69aa82515d4a230dae75f312"}) + b.SetResolver("internal/shoot-control-plane/templates/rbac-duros.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "ab5f2ecc69ec10add9d13ff5a5897f45"}) b.SetResolver("internal/shoot-control-plane/templates/rbac-firewall-policy-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "ec402992fe62b9e446eaa2a92728d8de"}) b.SetResolver("internal/shoot-control-plane/templates/rbac-group-rolebinding-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "382731237e4d35be98d00347013af1da"}) b.SetResolver("internal/shoot-control-plane/templates/rbac-node-controller.yaml", packr.Pointer{ForwardBox: gk, ForwardPath: "81fa11ab5f7276b08db4a1be8fcdee3e"}) diff --git a/pkg/metal/types.go b/pkg/metal/types.go index 4e4db8586..67660f64d 100644 --- a/pkg/metal/types.go +++ b/pkg/metal/types.go @@ -30,6 +30,8 @@ const ( CSIControllerImageName = "csi-lvm-controller" // CSIProvisionerImageName is the name of the csi lvm provisioner to deploy to the seed's shoot namespace. CSIProvisionerImageName = "csi-lvm-provisioner" + // DurosControllerImageName is the name of the duros controller to deploy to the seed's shoot namespace. + DurosControllerImageName = "duros-controller" // APIKey is a constant for the key in a cloud provider secret. APIKey = "metalAPIKey" @@ -57,6 +59,7 @@ const ( SplunkAuditWebhookServerName = "splunk-audit-webhook-server" SplunkAuditWebHookConfigName = "splunk-audit-webhook-config" SplunkAuditWebHookCertName = "splunk-audit-webhook-cert" + DurosControllerDeploymentName = "duros-controller" ) var (