From b5c7c8cfa131a3198dfadcf7771910f24b5c031b Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Fri, 26 May 2017 09:35:07 -0400 Subject: [PATCH 01/14] Relax pvc spec requirement and add validation for pvc update --- pkg/api/validation/validation.go | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index f6bd510bfdd77..7d9dd79e98f59 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1468,10 +1468,28 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *api.PersistentVolumeCla oldPvc.Spec.VolumeName = newPvc.Spec.VolumeName defer func() { oldPvc.Spec.VolumeName = "" }() } - // changes to Spec are not allowed, but updates to label/and some annotations are OK. - // no-op updates pass validation. - if !apiequality.Semantic.DeepEqual(newPvc.Spec, oldPvc.Spec) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "field is immutable after creation")) + + oldSize := oldPvc.Spec.Resources.Requests["storage"] + newSize := newPvc.Spec.Resources.Requests["storage"] + + if newSize.Cmp(oldSize) < 0 { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "resources", "requests", "storage"), "field can not be lesser than previous value")) + } + + if !apiequality.Semantic.DeepEqual(newPvc.Spec.AccessModes, oldPvc.Spec.AccessModes) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "accessModes"), "field is immutable after creation")) + } + + if !apiequality.Semantic.DeepEqual(newPvc.Spec.Selector, oldPvc.Spec.Selector) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "selector"), "field is immutable after creation")) + } + + if !apiequality.Semantic.DeepEqual(newPvc.Spec.VolumeName, oldPvc.Spec.VolumeName) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeName"), "field is immutable after creation")) + } + + if !apiequality.Semantic.DeepEqual(newPvc.Spec.StorageClassName, oldPvc.Spec.StorageClassName) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "storageClassName"), "field is immutable after creation")) } // storageclass annotation should be immutable after creation From 0dab9c420ba87aadada0b11ba4ffdb463e43b6ce Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 19 Jul 2017 17:53:35 -0400 Subject: [PATCH 02/14] Introduce feature gate for expanding PVs --- pkg/features/kube_features.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index b18b106e8bd5c..2b900f226bd25 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -109,6 +109,11 @@ const ( // New local storage types to support local storage capacity isolation LocalStorageCapacityIsolation utilfeature.Feature = "LocalStorageCapacityIsolation" + // owner: @gnufied + // alpha: v1.8 + // Ability to Expand persistent volumes + ExpandPersistentVolumes utilfeature.Feature = "ExpandPersistentVolumes" + // owner: @verb // alpha: v1.8 // @@ -151,6 +156,7 @@ var defaultKubernetesFeatureGates = map[utilfeature.Feature]utilfeature.FeatureS DebugContainers: {Default: false, PreRelease: utilfeature.Alpha}, PodPriority: {Default: false, PreRelease: utilfeature.Alpha}, EnableEquivalenceClassCache: {Default: false, PreRelease: utilfeature.Alpha}, + ExpandPersistentVolumes: {Default: false, PreRelease: utilfeature.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: From 31ecbe5bd607a5a1476b7bf196b4bd1a0cb8c4c3 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 19 Jul 2017 18:19:26 -0400 Subject: [PATCH 03/14] Add new Conditions and feature tag pvc update --- pkg/api/types.go | 27 +++++++++++++++++ pkg/api/validation/validation.go | 40 +++++++++++++++---------- staging/src/k8s.io/api/core/v1/types.go | 35 ++++++++++++++++++++++ 3 files changed, 86 insertions(+), 16 deletions(-) diff --git a/pkg/api/types.go b/pkg/api/types.go index ab9b7056d4fe8..77adfb498678b 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -543,6 +543,31 @@ type PersistentVolumeClaimSpec struct { StorageClassName *string } +type PvcConditionType string + +// These are valid conditions of Pvc +const ( + // An user trigger resize of pvc has been started + PvcResizeStarted PvcConditionType = "ResizeStarted" + // PvcReady means an operation in progress on PVC is finished successfuly + PvcReady PvcConditionType = "Ready" + // PvcResizeFailed means user trigged resize of PVC has failed + PvcResizeFailed PvcConditionType = "ResizeFailed" +) + +type PvcCondition struct { + Type PvcConditionType + Status ConditionStatus + // +optional + LastProbeTime metav1.Time + // +optional + LastTransitionTime metav1.Time + // +optional + Reason string + // +optional + Message string +} + type PersistentVolumeClaimStatus struct { // Phase represents the current phase of PersistentVolumeClaim // +optional @@ -553,6 +578,8 @@ type PersistentVolumeClaimStatus struct { // Represents the actual resources of the underlying volume // +optional Capacity ResourceList + // +optional + Conditions []PvcCondition } type PersistentVolumeAccessMode string diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 7d9dd79e98f59..90fe34e51d198 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1469,27 +1469,35 @@ func ValidatePersistentVolumeClaimUpdate(newPvc, oldPvc *api.PersistentVolumeCla defer func() { oldPvc.Spec.VolumeName = "" }() } - oldSize := oldPvc.Spec.Resources.Requests["storage"] - newSize := newPvc.Spec.Resources.Requests["storage"] + if utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) { + oldSize := oldPvc.Spec.Resources.Requests["storage"] + newSize := newPvc.Spec.Resources.Requests["storage"] - if newSize.Cmp(oldSize) < 0 { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "resources", "requests", "storage"), "field can not be lesser than previous value")) - } + if newSize.Cmp(oldSize) < 0 { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "resources", "requests", "storage"), "field can not be lesser than previous value")) + } - if !apiequality.Semantic.DeepEqual(newPvc.Spec.AccessModes, oldPvc.Spec.AccessModes) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "accessModes"), "field is immutable after creation")) - } + if !apiequality.Semantic.DeepEqual(newPvc.Spec.AccessModes, oldPvc.Spec.AccessModes) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "accessModes"), "field is immutable after creation")) + } - if !apiequality.Semantic.DeepEqual(newPvc.Spec.Selector, oldPvc.Spec.Selector) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "selector"), "field is immutable after creation")) - } + if !apiequality.Semantic.DeepEqual(newPvc.Spec.Selector, oldPvc.Spec.Selector) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "selector"), "field is immutable after creation")) + } - if !apiequality.Semantic.DeepEqual(newPvc.Spec.VolumeName, oldPvc.Spec.VolumeName) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeName"), "field is immutable after creation")) - } + if !apiequality.Semantic.DeepEqual(newPvc.Spec.VolumeName, oldPvc.Spec.VolumeName) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "volumeName"), "field is immutable after creation")) + } - if !apiequality.Semantic.DeepEqual(newPvc.Spec.StorageClassName, oldPvc.Spec.StorageClassName) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "storageClassName"), "field is immutable after creation")) + if !apiequality.Semantic.DeepEqual(newPvc.Spec.StorageClassName, oldPvc.Spec.StorageClassName) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "storageClassName"), "field is immutable after creation")) + } + } else { + // changes to Spec are not allowed, but updates to label/and some annotations are OK. + // no-op updates pass validation. + if !apiequality.Semantic.DeepEqual(newPvc.Spec, oldPvc.Spec) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "field is immutable after creation")) + } } // storageclass annotation should be immutable after creation diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index c2c574e34467c..0cc5c87125121 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -626,6 +626,36 @@ type PersistentVolumeClaimSpec struct { StorageClassName *string `json:"storageClassName,omitempty" protobuf:"bytes,5,opt,name=storageClassName"` } +// PvcConditionType is a valid value of PvcCondition.Type +type PvcConditionType string + +const ( + // Ready means any pending operation on pvc is successfully completed + PvcReady PvcConditionType = "Ready" + // An user trigger resize of pvc has been started + PvcResizeStarted PvcConditionType = "ResizeStarted" + // PvcResizeFailed means user trigged resize of PVC has failed + PvcResizeFailed PvcConditionType = "ResizeFailed" +) + +// PvcCondition contails details about state of pvc +type PvcCondition struct { + Type PvcConditionType `json:"type" protobuf:"bytes,1,opt,name=type,casttype=PvcConditionType"` + Status ConditionStatus `json:"status" protobuf:"bytes,2,opt,name=status,casttype=ConditionStatus"` + // Last time we probed the condition. + // +optional + LastProbeTime metav1.Time `json:"lastProbeTime,omitempty" protobuf:"bytes,3,opt,name=lastProbeTime"` + // Last time the condition transitioned from one status to another. + // +optional + LastTransitionTime metav1.Time `json:"lastTransitionTime,omitempty" protobuf:"bytes,4,opt,name=lastTransitionTime"` + // Unique, one-word, CamelCase reason for the condition's last transition. + // +optional + Reason string `json:"reason,omitempty" protobuf:"bytes,5,opt,name=reason"` + // Human-readable message indicating details about last transition. + // +optional + Message string `json:"message,omitempty" protobuf:"bytes,6,opt,name=message"` +} + // PersistentVolumeClaimStatus is the current status of a persistent volume claim. type PersistentVolumeClaimStatus struct { // Phase represents the current phase of PersistentVolumeClaim. @@ -638,6 +668,11 @@ type PersistentVolumeClaimStatus struct { // Represents the actual resources of the underlying volume. // +optional Capacity ResourceList `json:"capacity,omitempty" protobuf:"bytes,3,rep,name=capacity,casttype=ResourceList,castkey=ResourceName"` + // Current service state of PVC + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + Conditions []PvcCondition `json:"conditions,omitempty" patchStrategy:"merge" patchMergeKey:"type" protobuf:"bytes,4,rep,name=conditions"` } type PersistentVolumeAccessMode string From 5c32b4893b2e033b04291354100ab4efef553b1b Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 19 Jul 2017 19:50:57 -0400 Subject: [PATCH 04/14] Update all generated code Update swagger and openapi definitions definitions Update api references Update bazel files --- api/openapi-spec/swagger.json | 40 + api/swagger-spec/apps_v1beta1.json | 39 + api/swagger-spec/apps_v1beta2.json | 39 + api/swagger-spec/v1.json | 39 + cmd/kube-controller-manager/app/BUILD | 1 + .../apps/v1beta1/definitions.html | 76 + .../apps/v1beta2/definitions.html | 76 + docs/api-reference/v1/definitions.html | 158 +- pkg/api/v1/zz_generated.conversion.go | 34 + pkg/api/zz_generated.deepcopy.go | 29 + pkg/controller/BUILD | 1 + pkg/controller/volume/expand/BUILD | 54 + pkg/controller/volume/expand/cache/BUILD | 37 + pkg/volume/glusterfs/BUILD | 1 + pkg/volume/util/operationexecutor/BUILD | 2 + .../api/apps/v1beta1/types.generated.go | 2 +- .../src/k8s.io/api/core/v1/generated.pb.go | 2172 ++++++++++------- .../src/k8s.io/api/core/v1/generated.proto | 29 + .../src/k8s.io/api/core/v1/types.generated.go | 754 +++++- .../core/v1/types_swagger_doc_generated.go | 13 + .../api/core/v1/zz_generated.deepcopy.go | 29 + 21 files changed, 2646 insertions(+), 979 deletions(-) create mode 100644 pkg/controller/volume/expand/BUILD create mode 100644 pkg/controller/volume/expand/cache/BUILD diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 13a9a6feef444..40d53bfbd025d 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -56127,6 +56127,15 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.api.resource.Quantity" } }, + "conditions": { + "description": "Current service state of PVC", + "type": "array", + "items": { + "$ref": "#/definitions/io.k8s.api.core.v1.PvcCondition" + }, + "x-kubernetes-patch-merge-key": "type", + "x-kubernetes-patch-strategy": "merge" + }, "phase": { "description": "Phase represents the current phase of PersistentVolumeClaim.", "type": "string" @@ -56892,6 +56901,37 @@ } } }, + "io.k8s.api.core.v1.PvcCondition": { + "description": "PvcCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "lastProbeTime": { + "description": "Last time we probed the condition.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "lastTransitionTime": { + "description": "Last time the condition transitioned from one status to another.", + "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Time" + }, + "message": { + "description": "Human-readable message indicating details about last transition.", + "type": "string" + }, + "reason": { + "description": "Unique, one-word, CamelCase reason for the condition's last transition.", + "type": "string" + }, + "status": { + "type": "string" + }, + "type": { + "type": "string" + } + } + }, "io.k8s.api.core.v1.QuobyteVolumeSource": { "description": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", "required": [ diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 3d19866302d85..0edba8f52504a 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -6043,6 +6043,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PvcCondition" + }, + "description": "Current service state of PVC" + } + } + }, + "v1.PvcCondition": { + "id": "v1.PvcCondition", + "description": "PvcCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, one-word, CamelCase reason for the condition's last transition." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/api/swagger-spec/apps_v1beta2.json b/api/swagger-spec/apps_v1beta2.json index 4a360f9e91bbe..f8c89ba6d7eb0 100644 --- a/api/swagger-spec/apps_v1beta2.json +++ b/api/swagger-spec/apps_v1beta2.json @@ -7662,6 +7662,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PvcCondition" + }, + "description": "Current service state of PVC" + } + } + }, + "v1.PvcCondition": { + "id": "v1.PvcCondition", + "description": "PvcCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, one-word, CamelCase reason for the condition's last transition." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index 84f650630fdd7..3e448298411fc 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -18746,6 +18746,45 @@ "capacity": { "type": "object", "description": "Represents the actual resources of the underlying volume." + }, + "conditions": { + "type": "array", + "items": { + "$ref": "v1.PvcCondition" + }, + "description": "Current service state of PVC" + } + } + }, + "v1.PvcCondition": { + "id": "v1.PvcCondition", + "description": "PvcCondition contails details about state of pvc", + "required": [ + "type", + "status" + ], + "properties": { + "type": { + "type": "string" + }, + "status": { + "type": "string" + }, + "lastProbeTime": { + "type": "string", + "description": "Last time we probed the condition." + }, + "lastTransitionTime": { + "type": "string", + "description": "Last time the condition transitioned from one status to another." + }, + "reason": { + "type": "string", + "description": "Unique, one-word, CamelCase reason for the condition's last transition." + }, + "message": { + "type": "string", + "description": "Human-readable message indicating details about last transition." } } }, diff --git a/cmd/kube-controller-manager/app/BUILD b/cmd/kube-controller-manager/app/BUILD index 9c3b6ef699aaa..78c02a76f5753 100644 --- a/cmd/kube-controller-manager/app/BUILD +++ b/cmd/kube-controller-manager/app/BUILD @@ -75,6 +75,7 @@ go_library( "//pkg/controller/statefulset:go_default_library", "//pkg/controller/ttl:go_default_library", "//pkg/controller/volume/attachdetach:go_default_library", + "//pkg/controller/volume/expand:go_default_library", "//pkg/controller/volume/persistentvolume:go_default_library", "//pkg/features:go_default_library", "//pkg/quota/install:go_default_library", diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 8730ab176a459..eb61e14521dc2 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -2457,6 +2457,13 @@

v1.PersistentVolumeClaimStatus

object

+ +

conditions

+

Current service state of PVC

+

false

+

v1.PvcCondition array

+ + @@ -5957,6 +5964,75 @@

v1.CinderVolumeSource

+ +
+

v1.PvcCondition

+
+

PvcCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, one-word, CamelCase reason for the condition’s last transition.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.SecurityContext

diff --git a/docs/api-reference/apps/v1beta2/definitions.html b/docs/api-reference/apps/v1beta2/definitions.html index ff723a3ac73af..b193eba068bdd 100755 --- a/docs/api-reference/apps/v1beta2/definitions.html +++ b/docs/api-reference/apps/v1beta2/definitions.html @@ -2656,6 +2656,13 @@

v1.PersistentVolumeClaimStatus

object

+ +

conditions

+

Current service state of PVC

+

false

+

v1.PvcCondition array

+ + @@ -6153,6 +6160,75 @@

v1.CinderVolumeSource

+
+
+

v1.PvcCondition

+
+

PvcCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, one-word, CamelCase reason for the condition’s last transition.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.SecurityContext

diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 3d3779e810556..7eac3b5c366ab 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -3187,6 +3187,47 @@

v1.ServiceAccount

+
+
+

v1.PersistentVolumeClaimVolumeSource

+
+

PersistentVolumeClaimVolumeSource references the user’s PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

claimName

ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims

true

string

readOnly

Will force the ReadOnly setting in VolumeMounts. Default false.

false

boolean

false

+

v1.NodeAddress

@@ -3372,47 +3413,6 @@

v1.FlockerVolumeSource

-
-
-

v1.PersistentVolumeClaimVolumeSource

-
-

PersistentVolumeClaimVolumeSource references the user’s PVC in the same namespace. This volume finds the bound PV and mounts that volume for the pod. A PersistentVolumeClaimVolumeSource is, essentially, a wrapper around another type of volume that is owned by someone else (the system).

-
- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDescriptionRequiredSchemaDefault

claimName

ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims

true

string

readOnly

Will force the ReadOnly setting in VolumeMounts. Default false.

false

boolean

false

-

v1.ResourceQuotaList

@@ -3513,6 +3513,13 @@

v1.PersistentVolumeClaimStatus

object

+ +

conditions

+

Current service state of PVC

+

false

+

v1.PvcCondition array

+ + @@ -8376,6 +8383,75 @@

v1.SecurityContext

+
+
+

v1.PvcCondition

+
+

PvcCondition contails details about state of pvc

+
+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionRequiredSchemaDefault

type

true

string

status

true

string

lastProbeTime

Last time we probed the condition.

false

string

lastTransitionTime

Last time the condition transitioned from one status to another.

false

string

reason

Unique, one-word, CamelCase reason for the condition’s last transition.

false

string

message

Human-readable message indicating details about last transition.

false

string

+

v1.AWSElasticBlockStoreVolumeSource

diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 3ba66d60ac613..0693f6423c6ae 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -292,6 +292,8 @@ func RegisterConversions(scheme *runtime.Scheme) error { Convert_api_Probe_To_v1_Probe, Convert_v1_ProjectedVolumeSource_To_api_ProjectedVolumeSource, Convert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource, + Convert_v1_PvcCondition_To_api_PvcCondition, + Convert_api_PvcCondition_To_v1_PvcCondition, Convert_v1_QuobyteVolumeSource_To_api_QuobyteVolumeSource, Convert_api_QuobyteVolumeSource_To_v1_QuobyteVolumeSource, Convert_v1_RBDVolumeSource_To_api_RBDVolumeSource, @@ -2943,6 +2945,7 @@ func autoConvert_v1_PersistentVolumeClaimStatus_To_api_PersistentVolumeClaimStat out.Phase = api.PersistentVolumeClaimPhase(in.Phase) out.AccessModes = *(*[]api.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) out.Capacity = *(*api.ResourceList)(unsafe.Pointer(&in.Capacity)) + out.Conditions = *(*[]api.PvcCondition)(unsafe.Pointer(&in.Conditions)) return nil } @@ -2955,6 +2958,7 @@ func autoConvert_api_PersistentVolumeClaimStatus_To_v1_PersistentVolumeClaimStat out.Phase = v1.PersistentVolumeClaimPhase(in.Phase) out.AccessModes = *(*[]v1.PersistentVolumeAccessMode)(unsafe.Pointer(&in.AccessModes)) out.Capacity = *(*v1.ResourceList)(unsafe.Pointer(&in.Capacity)) + out.Conditions = *(*[]v1.PvcCondition)(unsafe.Pointer(&in.Conditions)) return nil } @@ -3934,6 +3938,36 @@ func Convert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in *api.Proje return autoConvert_api_ProjectedVolumeSource_To_v1_ProjectedVolumeSource(in, out, s) } +func autoConvert_v1_PvcCondition_To_api_PvcCondition(in *v1.PvcCondition, out *api.PvcCondition, s conversion.Scope) error { + out.Type = api.PvcConditionType(in.Type) + out.Status = api.ConditionStatus(in.Status) + out.LastProbeTime = in.LastProbeTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_v1_PvcCondition_To_api_PvcCondition is an autogenerated conversion function. +func Convert_v1_PvcCondition_To_api_PvcCondition(in *v1.PvcCondition, out *api.PvcCondition, s conversion.Scope) error { + return autoConvert_v1_PvcCondition_To_api_PvcCondition(in, out, s) +} + +func autoConvert_api_PvcCondition_To_v1_PvcCondition(in *api.PvcCondition, out *v1.PvcCondition, s conversion.Scope) error { + out.Type = v1.PvcConditionType(in.Type) + out.Status = v1.ConditionStatus(in.Status) + out.LastProbeTime = in.LastProbeTime + out.LastTransitionTime = in.LastTransitionTime + out.Reason = in.Reason + out.Message = in.Message + return nil +} + +// Convert_api_PvcCondition_To_v1_PvcCondition is an autogenerated conversion function. +func Convert_api_PvcCondition_To_v1_PvcCondition(in *api.PvcCondition, out *v1.PvcCondition, s conversion.Scope) error { + return autoConvert_api_PvcCondition_To_v1_PvcCondition(in, out, s) +} + func autoConvert_v1_QuobyteVolumeSource_To_api_QuobyteVolumeSource(in *v1.QuobyteVolumeSource, out *api.QuobyteVolumeSource, s conversion.Scope) error { out.Registry = in.Registry out.Volume = in.Volume diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index c1ab6631d7bbd..7e138d7d9c710 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -545,6 +545,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*ProjectedVolumeSource).DeepCopyInto(out.(*ProjectedVolumeSource)) return nil }, InType: reflect.TypeOf(&ProjectedVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PvcCondition).DeepCopyInto(out.(*PvcCondition)) + return nil + }, InType: reflect.TypeOf(&PvcCondition{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*QuobyteVolumeSource).DeepCopyInto(out.(*QuobyteVolumeSource)) return nil @@ -3419,6 +3423,13 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]PvcCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -4582,6 +4593,24 @@ func (x *ProjectedVolumeSource) DeepCopy() *ProjectedVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PvcCondition) DeepCopyInto(out *PvcCondition) { + *out = *in + in.LastProbeTime.DeepCopyInto(&out.LastProbeTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, creating a new PvcCondition. +func (x *PvcCondition) DeepCopy() *PvcCondition { + if x == nil { + return nil + } + out := new(PvcCondition) + x.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *QuobyteVolumeSource) DeepCopyInto(out *QuobyteVolumeSource) { *out = *in diff --git a/pkg/controller/BUILD b/pkg/controller/BUILD index 4d2d889d8eea5..451429f6eae56 100644 --- a/pkg/controller/BUILD +++ b/pkg/controller/BUILD @@ -128,6 +128,7 @@ filegroup( "//pkg/controller/ttl:all-srcs", "//pkg/controller/volume/attachdetach:all-srcs", "//pkg/controller/volume/events:all-srcs", + "//pkg/controller/volume/expand:all-srcs", "//pkg/controller/volume/persistentvolume:all-srcs", ], tags = ["automanaged"], diff --git a/pkg/controller/volume/expand/BUILD b/pkg/controller/volume/expand/BUILD new file mode 100644 index 0000000000000..3da4d0f7fc715 --- /dev/null +++ b/pkg/controller/volume/expand/BUILD @@ -0,0 +1,54 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = [ + "expand_controller.go", + "sync_volume_resize.go", + ], + tags = ["automanaged"], + deps = [ + "//pkg/cloudprovider:go_default_library", + "//pkg/controller:go_default_library", + "//pkg/controller/volume/expand/cache:go_default_library", + "//pkg/util/io:go_default_library", + "//pkg/util/mount:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/util/operationexecutor:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//vendor/k8s.io/client-go/informers/core/v1:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/typed/core/v1:go_default_library", + "//vendor/k8s.io/client-go/listers/core/v1:go_default_library", + "//vendor/k8s.io/client-go/tools/cache:go_default_library", + "//vendor/k8s.io/client-go/tools/record:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [ + ":package-srcs", + "//pkg/controller/volume/expand/cache:all-srcs", + ], + tags = ["automanaged"], +) diff --git a/pkg/controller/volume/expand/cache/BUILD b/pkg/controller/volume/expand/cache/BUILD new file mode 100644 index 0000000000000..9b3ae7841b6d5 --- /dev/null +++ b/pkg/controller/volume/expand/cache/BUILD @@ -0,0 +1,37 @@ +package(default_visibility = ["//visibility:public"]) + +licenses(["notice"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", +) + +go_library( + name = "go_default_library", + srcs = ["volume_resize_map.go"], + tags = ["automanaged"], + deps = [ + "//pkg/util/strings:go_default_library", + "//pkg/volume:go_default_library", + "//pkg/volume/util/types:go_default_library", + "//vendor/github.com/golang/glog:go_default_library", + "//vendor/k8s.io/api/core/v1:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library", + "//vendor/k8s.io/client-go/kubernetes:go_default_library", + "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) diff --git a/pkg/volume/glusterfs/BUILD b/pkg/volume/glusterfs/BUILD index 081e5b6caf9f6..83345ad52d6ea 100644 --- a/pkg/volume/glusterfs/BUILD +++ b/pkg/volume/glusterfs/BUILD @@ -12,6 +12,7 @@ go_library( name = "go_default_library", srcs = [ "doc.go", + "expander.go", "glusterfs.go", "glusterfs_minmax.go", "glusterfs_util.go", diff --git a/pkg/volume/util/operationexecutor/BUILD b/pkg/volume/util/operationexecutor/BUILD index 031def0ad60c1..4a047bb654337 100644 --- a/pkg/volume/util/operationexecutor/BUILD +++ b/pkg/volume/util/operationexecutor/BUILD @@ -16,6 +16,7 @@ go_library( ], tags = ["automanaged"], deps = [ + "//pkg/controller/volume/expand/cache:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/events:go_default_library", "//pkg/util/mount:go_default_library", @@ -41,6 +42,7 @@ go_test( library = ":go_default_library", tags = ["automanaged"], deps = [ + "//pkg/controller/volume/expand/cache:go_default_library", "//pkg/util/mount:go_default_library", "//pkg/volume:go_default_library", "//pkg/volume/util/types:go_default_library", diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go index 52bd1fe32a008..d308144573aeb 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.generated.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.generated.go @@ -7857,7 +7857,7 @@ func (x codecSelfer1234) decSlicev1_PersistentVolumeClaim(v *[]pkg3_v1.Persisten yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 384) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 408) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index acbc4c2ccd498..17da6d23b46ac 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -152,6 +152,7 @@ limitations under the License. PreferredSchedulingTerm Probe ProjectedVolumeSource + PvcCondition QuobyteVolumeSource RBDVolumeSource RangeAllocation @@ -759,194 +760,198 @@ func (m *ProjectedVolumeSource) Reset() { *m = ProjectedVolum func (*ProjectedVolumeSource) ProtoMessage() {} func (*ProjectedVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{126} } +func (m *PvcCondition) Reset() { *m = PvcCondition{} } +func (*PvcCondition) ProtoMessage() {} +func (*PvcCondition) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } + func (m *QuobyteVolumeSource) Reset() { *m = QuobyteVolumeSource{} } func (*QuobyteVolumeSource) ProtoMessage() {} -func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{127} } +func (*QuobyteVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } func (m *RBDVolumeSource) Reset() { *m = RBDVolumeSource{} } func (*RBDVolumeSource) ProtoMessage() {} -func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{128} } +func (*RBDVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } func (m *RangeAllocation) Reset() { *m = RangeAllocation{} } func (*RangeAllocation) ProtoMessage() {} -func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{129} } +func (*RangeAllocation) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } func (m *ReplicationController) Reset() { *m = ReplicationController{} } func (*ReplicationController) ProtoMessage() {} -func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{130} } +func (*ReplicationController) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{131} } func (m *ReplicationControllerCondition) Reset() { *m = ReplicationControllerCondition{} } func (*ReplicationControllerCondition) ProtoMessage() {} func (*ReplicationControllerCondition) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{131} + return fileDescriptorGenerated, []int{132} } func (m *ReplicationControllerList) Reset() { *m = ReplicationControllerList{} } func (*ReplicationControllerList) ProtoMessage() {} func (*ReplicationControllerList) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{132} + return fileDescriptorGenerated, []int{133} } func (m *ReplicationControllerSpec) Reset() { *m = ReplicationControllerSpec{} } func (*ReplicationControllerSpec) ProtoMessage() {} func (*ReplicationControllerSpec) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{133} + return fileDescriptorGenerated, []int{134} } func (m *ReplicationControllerStatus) Reset() { *m = ReplicationControllerStatus{} } func (*ReplicationControllerStatus) ProtoMessage() {} func (*ReplicationControllerStatus) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{134} + return fileDescriptorGenerated, []int{135} } func (m *ResourceFieldSelector) Reset() { *m = ResourceFieldSelector{} } func (*ResourceFieldSelector) ProtoMessage() {} -func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{135} } +func (*ResourceFieldSelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } func (m *ResourceQuota) Reset() { *m = ResourceQuota{} } func (*ResourceQuota) ProtoMessage() {} -func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{136} } +func (*ResourceQuota) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } func (m *ResourceQuotaList) Reset() { *m = ResourceQuotaList{} } func (*ResourceQuotaList) ProtoMessage() {} -func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{137} } +func (*ResourceQuotaList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } func (m *ResourceQuotaSpec) Reset() { *m = ResourceQuotaSpec{} } func (*ResourceQuotaSpec) ProtoMessage() {} -func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{138} } +func (*ResourceQuotaSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } func (m *ResourceQuotaStatus) Reset() { *m = ResourceQuotaStatus{} } func (*ResourceQuotaStatus) ProtoMessage() {} -func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{139} } +func (*ResourceQuotaStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } func (m *ResourceRequirements) Reset() { *m = ResourceRequirements{} } func (*ResourceRequirements) ProtoMessage() {} -func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{140} } +func (*ResourceRequirements) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } func (m *SELinuxOptions) Reset() { *m = SELinuxOptions{} } func (*SELinuxOptions) ProtoMessage() {} -func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{141} } +func (*SELinuxOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } func (m *ScaleIOVolumeSource) Reset() { *m = ScaleIOVolumeSource{} } func (*ScaleIOVolumeSource) ProtoMessage() {} -func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{142} } +func (*ScaleIOVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } func (m *Secret) Reset() { *m = Secret{} } func (*Secret) ProtoMessage() {} -func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{143} } +func (*Secret) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } func (m *SecretEnvSource) Reset() { *m = SecretEnvSource{} } func (*SecretEnvSource) ProtoMessage() {} -func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{144} } +func (*SecretEnvSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } func (m *SecretKeySelector) Reset() { *m = SecretKeySelector{} } func (*SecretKeySelector) ProtoMessage() {} -func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{145} } +func (*SecretKeySelector) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } func (m *SecretList) Reset() { *m = SecretList{} } func (*SecretList) ProtoMessage() {} -func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{146} } +func (*SecretList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } func (m *SecretProjection) Reset() { *m = SecretProjection{} } func (*SecretProjection) ProtoMessage() {} -func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{147} } +func (*SecretProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } func (m *SecretVolumeSource) Reset() { *m = SecretVolumeSource{} } func (*SecretVolumeSource) ProtoMessage() {} -func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{148} } +func (*SecretVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } func (m *SecurityContext) Reset() { *m = SecurityContext{} } func (*SecurityContext) ProtoMessage() {} -func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{149} } +func (*SecurityContext) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } func (m *SerializedReference) Reset() { *m = SerializedReference{} } func (*SerializedReference) ProtoMessage() {} -func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{150} } +func (*SerializedReference) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} -func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{151} } +func (*Service) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } func (m *ServiceAccount) Reset() { *m = ServiceAccount{} } func (*ServiceAccount) ProtoMessage() {} -func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{152} } +func (*ServiceAccount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } func (m *ServiceAccountList) Reset() { *m = ServiceAccountList{} } func (*ServiceAccountList) ProtoMessage() {} -func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{153} } +func (*ServiceAccountList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } func (m *ServiceList) Reset() { *m = ServiceList{} } func (*ServiceList) ProtoMessage() {} -func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{154} } +func (*ServiceList) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } func (m *ServicePort) Reset() { *m = ServicePort{} } func (*ServicePort) ProtoMessage() {} -func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{155} } +func (*ServicePort) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } func (m *ServiceProxyOptions) Reset() { *m = ServiceProxyOptions{} } func (*ServiceProxyOptions) ProtoMessage() {} -func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{156} } +func (*ServiceProxyOptions) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } func (m *ServiceSpec) Reset() { *m = ServiceSpec{} } func (*ServiceSpec) ProtoMessage() {} -func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{157} } +func (*ServiceSpec) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } func (m *ServiceStatus) Reset() { *m = ServiceStatus{} } func (*ServiceStatus) ProtoMessage() {} -func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{158} } +func (*ServiceStatus) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{159} } func (m *StorageOSPersistentVolumeSource) Reset() { *m = StorageOSPersistentVolumeSource{} } func (*StorageOSPersistentVolumeSource) ProtoMessage() {} func (*StorageOSPersistentVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{159} + return fileDescriptorGenerated, []int{160} } func (m *StorageOSVolumeSource) Reset() { *m = StorageOSVolumeSource{} } func (*StorageOSVolumeSource) ProtoMessage() {} -func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{160} } +func (*StorageOSVolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } func (m *Sysctl) Reset() { *m = Sysctl{} } func (*Sysctl) ProtoMessage() {} -func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{161} } +func (*Sysctl) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } func (m *TCPSocketAction) Reset() { *m = TCPSocketAction{} } func (*TCPSocketAction) ProtoMessage() {} -func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{162} } +func (*TCPSocketAction) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } func (m *Taint) Reset() { *m = Taint{} } func (*Taint) ProtoMessage() {} -func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{163} } +func (*Taint) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } func (m *Toleration) Reset() { *m = Toleration{} } func (*Toleration) ProtoMessage() {} -func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{164} } +func (*Toleration) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } func (m *Volume) Reset() { *m = Volume{} } func (*Volume) ProtoMessage() {} -func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{165} } +func (*Volume) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } func (m *VolumeMount) Reset() { *m = VolumeMount{} } func (*VolumeMount) ProtoMessage() {} -func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{166} } +func (*VolumeMount) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } func (m *VolumeProjection) Reset() { *m = VolumeProjection{} } func (*VolumeProjection) ProtoMessage() {} -func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{167} } +func (*VolumeProjection) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } func (m *VolumeSource) Reset() { *m = VolumeSource{} } func (*VolumeSource) ProtoMessage() {} -func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{168} } +func (*VolumeSource) Descriptor() ([]byte, []int) { return fileDescriptorGenerated, []int{169} } func (m *VsphereVirtualDiskVolumeSource) Reset() { *m = VsphereVirtualDiskVolumeSource{} } func (*VsphereVirtualDiskVolumeSource) ProtoMessage() {} func (*VsphereVirtualDiskVolumeSource) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{169} + return fileDescriptorGenerated, []int{170} } func (m *WeightedPodAffinityTerm) Reset() { *m = WeightedPodAffinityTerm{} } func (*WeightedPodAffinityTerm) ProtoMessage() {} func (*WeightedPodAffinityTerm) Descriptor() ([]byte, []int) { - return fileDescriptorGenerated, []int{170} + return fileDescriptorGenerated, []int{171} } func init() { @@ -1077,6 +1082,7 @@ func init() { proto.RegisterType((*PreferredSchedulingTerm)(nil), "k8s.io.api.core.v1.PreferredSchedulingTerm") proto.RegisterType((*Probe)(nil), "k8s.io.api.core.v1.Probe") proto.RegisterType((*ProjectedVolumeSource)(nil), "k8s.io.api.core.v1.ProjectedVolumeSource") + proto.RegisterType((*PvcCondition)(nil), "k8s.io.api.core.v1.PvcCondition") proto.RegisterType((*QuobyteVolumeSource)(nil), "k8s.io.api.core.v1.QuobyteVolumeSource") proto.RegisterType((*RBDVolumeSource)(nil), "k8s.io.api.core.v1.RBDVolumeSource") proto.RegisterType((*RangeAllocation)(nil), "k8s.io.api.core.v1.RangeAllocation") @@ -5467,6 +5473,18 @@ func (m *PersistentVolumeClaimStatus) MarshalTo(dAtA []byte) (int, error) { i += n94 } } + if len(m.Conditions) > 0 { + for _, msg := range m.Conditions { + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } + } return i, nil } @@ -7179,6 +7197,56 @@ func (m *ProjectedVolumeSource) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *PvcCondition) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *PvcCondition) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + dAtA[i] = 0xa + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) + dAtA[i] = 0x12 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + dAtA[i] = 0x1a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastProbeTime.Size())) + n144, err := m.LastProbeTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n144 + dAtA[i] = 0x22 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) + n145, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n145 + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + dAtA[i] = 0x32 + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Message))) + i += copy(dAtA[i:], m.Message) + return i, nil +} + func (m *QuobyteVolumeSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7275,11 +7343,11 @@ func (m *RBDVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n144, err := m.SecretRef.MarshalTo(dAtA[i:]) + n146, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n144 + i += n146 } dAtA[i] = 0x40 i++ @@ -7310,11 +7378,11 @@ func (m *RangeAllocation) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n145, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n147, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n145 + i += n147 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Range))) @@ -7346,27 +7414,27 @@ func (m *ReplicationController) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n146, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n148, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n146 + i += n148 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n147, err := m.Spec.MarshalTo(dAtA[i:]) + n149, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n147 + i += n149 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n148, err := m.Status.MarshalTo(dAtA[i:]) + n150, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n148 + i += n150 return i, nil } @@ -7396,11 +7464,11 @@ func (m *ReplicationControllerCondition) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LastTransitionTime.Size())) - n149, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) + n151, err := m.LastTransitionTime.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n149 + i += n151 dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Reason))) @@ -7430,11 +7498,11 @@ func (m *ReplicationControllerList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n150, err := m.ListMeta.MarshalTo(dAtA[i:]) + n152, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n150 + i += n152 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7496,11 +7564,11 @@ func (m *ReplicationControllerSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Template.Size())) - n151, err := m.Template.MarshalTo(dAtA[i:]) + n153, err := m.Template.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n151 + i += n153 } dAtA[i] = 0x20 i++ @@ -7579,11 +7647,11 @@ func (m *ResourceFieldSelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Divisor.Size())) - n152, err := m.Divisor.MarshalTo(dAtA[i:]) + n154, err := m.Divisor.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n152 + i += n154 return i, nil } @@ -7605,27 +7673,27 @@ func (m *ResourceQuota) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n153, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n155, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n153 + i += n155 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n154, err := m.Spec.MarshalTo(dAtA[i:]) + n156, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n154 + i += n156 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n155, err := m.Status.MarshalTo(dAtA[i:]) + n157, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n155 + i += n157 return i, nil } @@ -7647,11 +7715,11 @@ func (m *ResourceQuotaList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n156, err := m.ListMeta.MarshalTo(dAtA[i:]) + n158, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n156 + i += n158 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -7706,11 +7774,11 @@ func (m *ResourceQuotaSpec) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n157, err := (&v).MarshalTo(dAtA[i:]) + n159, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n157 + i += n159 } } if len(m.Scopes) > 0 { @@ -7770,11 +7838,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n158, err := (&v).MarshalTo(dAtA[i:]) + n160, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n158 + i += n160 } } if len(m.Used) > 0 { @@ -7801,11 +7869,11 @@ func (m *ResourceQuotaStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n159, err := (&v).MarshalTo(dAtA[i:]) + n161, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n159 + i += n161 } } return i, nil @@ -7850,11 +7918,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n160, err := (&v).MarshalTo(dAtA[i:]) + n162, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n160 + i += n162 } } if len(m.Requests) > 0 { @@ -7881,11 +7949,11 @@ func (m *ResourceRequirements) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64((&v).Size())) - n161, err := (&v).MarshalTo(dAtA[i:]) + n163, err := (&v).MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n161 + i += n163 } } return i, nil @@ -7952,11 +8020,11 @@ func (m *ScaleIOVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n162, err := m.SecretRef.MarshalTo(dAtA[i:]) + n164, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n162 + i += n164 } dAtA[i] = 0x20 i++ @@ -8015,11 +8083,11 @@ func (m *Secret) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n163, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n165, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n163 + i += n165 if len(m.Data) > 0 { keysForData := make([]string, 0, len(m.Data)) for k := range m.Data { @@ -8095,11 +8163,11 @@ func (m *SecretEnvSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n164, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n166, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n164 + i += n166 if m.Optional != nil { dAtA[i] = 0x10 i++ @@ -8131,11 +8199,11 @@ func (m *SecretKeySelector) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n165, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n165 + i += n167 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Key))) @@ -8171,11 +8239,11 @@ func (m *SecretList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n166, err := m.ListMeta.MarshalTo(dAtA[i:]) + n168, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n166 + i += n168 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8209,11 +8277,11 @@ func (m *SecretProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LocalObjectReference.Size())) - n167, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) + n169, err := m.LocalObjectReference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n167 + i += n169 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8307,11 +8375,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Capabilities.Size())) - n168, err := m.Capabilities.MarshalTo(dAtA[i:]) + n170, err := m.Capabilities.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n168 + i += n170 } if m.Privileged != nil { dAtA[i] = 0x10 @@ -8327,11 +8395,11 @@ func (m *SecurityContext) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SELinuxOptions.Size())) - n169, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) + n171, err := m.SELinuxOptions.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n169 + i += n171 } if m.RunAsUser != nil { dAtA[i] = 0x20 @@ -8389,11 +8457,11 @@ func (m *SerializedReference) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Reference.Size())) - n170, err := m.Reference.MarshalTo(dAtA[i:]) + n172, err := m.Reference.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n170 + i += n172 return i, nil } @@ -8415,27 +8483,27 @@ func (m *Service) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n171, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n173, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n171 + i += n173 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Spec.Size())) - n172, err := m.Spec.MarshalTo(dAtA[i:]) + n174, err := m.Spec.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n172 + i += n174 dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Status.Size())) - n173, err := m.Status.MarshalTo(dAtA[i:]) + n175, err := m.Status.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n173 + i += n175 return i, nil } @@ -8457,11 +8525,11 @@ func (m *ServiceAccount) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ObjectMeta.Size())) - n174, err := m.ObjectMeta.MarshalTo(dAtA[i:]) + n176, err := m.ObjectMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n174 + i += n176 if len(m.Secrets) > 0 { for _, msg := range m.Secrets { dAtA[i] = 0x12 @@ -8517,11 +8585,11 @@ func (m *ServiceAccountList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n175, err := m.ListMeta.MarshalTo(dAtA[i:]) + n177, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n175 + i += n177 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8555,11 +8623,11 @@ func (m *ServiceList) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ListMeta.Size())) - n176, err := m.ListMeta.MarshalTo(dAtA[i:]) + n178, err := m.ListMeta.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n176 + i += n178 if len(m.Items) > 0 { for _, msg := range m.Items { dAtA[i] = 0x12 @@ -8604,11 +8672,11 @@ func (m *ServicePort) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TargetPort.Size())) - n177, err := m.TargetPort.MarshalTo(dAtA[i:]) + n179, err := m.TargetPort.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n177 + i += n179 dAtA[i] = 0x28 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NodePort)) @@ -8764,11 +8832,11 @@ func (m *ServiceStatus) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.LoadBalancer.Size())) - n178, err := m.LoadBalancer.MarshalTo(dAtA[i:]) + n180, err := m.LoadBalancer.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n178 + i += n180 return i, nil } @@ -8811,11 +8879,11 @@ func (m *StorageOSPersistentVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n179, err := m.SecretRef.MarshalTo(dAtA[i:]) + n181, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n179 + i += n181 } return i, nil } @@ -8859,11 +8927,11 @@ func (m *StorageOSVolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.SecretRef.Size())) - n180, err := m.SecretRef.MarshalTo(dAtA[i:]) + n182, err := m.SecretRef.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n180 + i += n182 } return i, nil } @@ -8912,11 +8980,11 @@ func (m *TCPSocketAction) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Port.Size())) - n181, err := m.Port.MarshalTo(dAtA[i:]) + n183, err := m.Port.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n181 + i += n183 dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host))) @@ -8954,11 +9022,11 @@ func (m *Taint) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.TimeAdded.Size())) - n182, err := m.TimeAdded.MarshalTo(dAtA[i:]) + n184, err := m.TimeAdded.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n182 + i += n184 return i, nil } @@ -9023,11 +9091,11 @@ func (m *Volume) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VolumeSource.Size())) - n183, err := m.VolumeSource.MarshalTo(dAtA[i:]) + n185, err := m.VolumeSource.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n183 + i += n185 return i, nil } @@ -9088,31 +9156,31 @@ func (m *VolumeProjection) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n184, err := m.Secret.MarshalTo(dAtA[i:]) + n186, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n184 + i += n186 } if m.DownwardAPI != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n185, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n187, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n185 + i += n187 } if m.ConfigMap != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n186, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n188, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n186 + i += n188 } return i, nil } @@ -9136,151 +9204,151 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0xa i++ i = encodeVarintGenerated(dAtA, i, uint64(m.HostPath.Size())) - n187, err := m.HostPath.MarshalTo(dAtA[i:]) + n189, err := m.HostPath.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n187 + i += n189 } if m.EmptyDir != nil { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.EmptyDir.Size())) - n188, err := m.EmptyDir.MarshalTo(dAtA[i:]) + n190, err := m.EmptyDir.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n188 + i += n190 } if m.GCEPersistentDisk != nil { dAtA[i] = 0x1a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GCEPersistentDisk.Size())) - n189, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) + n191, err := m.GCEPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n189 + i += n191 } if m.AWSElasticBlockStore != nil { dAtA[i] = 0x22 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AWSElasticBlockStore.Size())) - n190, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) + n192, err := m.AWSElasticBlockStore.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n190 + i += n192 } if m.GitRepo != nil { dAtA[i] = 0x2a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.GitRepo.Size())) - n191, err := m.GitRepo.MarshalTo(dAtA[i:]) + n193, err := m.GitRepo.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n191 + i += n193 } if m.Secret != nil { dAtA[i] = 0x32 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Secret.Size())) - n192, err := m.Secret.MarshalTo(dAtA[i:]) + n194, err := m.Secret.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n192 + i += n194 } if m.NFS != nil { dAtA[i] = 0x3a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.NFS.Size())) - n193, err := m.NFS.MarshalTo(dAtA[i:]) + n195, err := m.NFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n193 + i += n195 } if m.ISCSI != nil { dAtA[i] = 0x42 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ISCSI.Size())) - n194, err := m.ISCSI.MarshalTo(dAtA[i:]) + n196, err := m.ISCSI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n194 + i += n196 } if m.Glusterfs != nil { dAtA[i] = 0x4a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Glusterfs.Size())) - n195, err := m.Glusterfs.MarshalTo(dAtA[i:]) + n197, err := m.Glusterfs.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n195 + i += n197 } if m.PersistentVolumeClaim != nil { dAtA[i] = 0x52 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PersistentVolumeClaim.Size())) - n196, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) + n198, err := m.PersistentVolumeClaim.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n196 + i += n198 } if m.RBD != nil { dAtA[i] = 0x5a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.RBD.Size())) - n197, err := m.RBD.MarshalTo(dAtA[i:]) + n199, err := m.RBD.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n197 + i += n199 } if m.FlexVolume != nil { dAtA[i] = 0x62 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FlexVolume.Size())) - n198, err := m.FlexVolume.MarshalTo(dAtA[i:]) + n200, err := m.FlexVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n198 + i += n200 } if m.Cinder != nil { dAtA[i] = 0x6a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Cinder.Size())) - n199, err := m.Cinder.MarshalTo(dAtA[i:]) + n201, err := m.Cinder.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n199 + i += n201 } if m.CephFS != nil { dAtA[i] = 0x72 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.CephFS.Size())) - n200, err := m.CephFS.MarshalTo(dAtA[i:]) + n202, err := m.CephFS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n200 + i += n202 } if m.Flocker != nil { dAtA[i] = 0x7a i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Flocker.Size())) - n201, err := m.Flocker.MarshalTo(dAtA[i:]) + n203, err := m.Flocker.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n201 + i += n203 } if m.DownwardAPI != nil { dAtA[i] = 0x82 @@ -9288,11 +9356,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.DownwardAPI.Size())) - n202, err := m.DownwardAPI.MarshalTo(dAtA[i:]) + n204, err := m.DownwardAPI.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n202 + i += n204 } if m.FC != nil { dAtA[i] = 0x8a @@ -9300,11 +9368,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.FC.Size())) - n203, err := m.FC.MarshalTo(dAtA[i:]) + n205, err := m.FC.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n203 + i += n205 } if m.AzureFile != nil { dAtA[i] = 0x92 @@ -9312,11 +9380,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureFile.Size())) - n204, err := m.AzureFile.MarshalTo(dAtA[i:]) + n206, err := m.AzureFile.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n204 + i += n206 } if m.ConfigMap != nil { dAtA[i] = 0x9a @@ -9324,11 +9392,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ConfigMap.Size())) - n205, err := m.ConfigMap.MarshalTo(dAtA[i:]) + n207, err := m.ConfigMap.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n205 + i += n207 } if m.VsphereVolume != nil { dAtA[i] = 0xa2 @@ -9336,11 +9404,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.VsphereVolume.Size())) - n206, err := m.VsphereVolume.MarshalTo(dAtA[i:]) + n208, err := m.VsphereVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n206 + i += n208 } if m.Quobyte != nil { dAtA[i] = 0xaa @@ -9348,11 +9416,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Quobyte.Size())) - n207, err := m.Quobyte.MarshalTo(dAtA[i:]) + n209, err := m.Quobyte.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n207 + i += n209 } if m.AzureDisk != nil { dAtA[i] = 0xb2 @@ -9360,11 +9428,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.AzureDisk.Size())) - n208, err := m.AzureDisk.MarshalTo(dAtA[i:]) + n210, err := m.AzureDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n208 + i += n210 } if m.PhotonPersistentDisk != nil { dAtA[i] = 0xba @@ -9372,11 +9440,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PhotonPersistentDisk.Size())) - n209, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) + n211, err := m.PhotonPersistentDisk.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n209 + i += n211 } if m.PortworxVolume != nil { dAtA[i] = 0xc2 @@ -9384,11 +9452,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PortworxVolume.Size())) - n210, err := m.PortworxVolume.MarshalTo(dAtA[i:]) + n212, err := m.PortworxVolume.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n210 + i += n212 } if m.ScaleIO != nil { dAtA[i] = 0xca @@ -9396,11 +9464,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.ScaleIO.Size())) - n211, err := m.ScaleIO.MarshalTo(dAtA[i:]) + n213, err := m.ScaleIO.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n211 + i += n213 } if m.Projected != nil { dAtA[i] = 0xd2 @@ -9408,11 +9476,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.Projected.Size())) - n212, err := m.Projected.MarshalTo(dAtA[i:]) + n214, err := m.Projected.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n212 + i += n214 } if m.StorageOS != nil { dAtA[i] = 0xda @@ -9420,11 +9488,11 @@ func (m *VolumeSource) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x1 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.StorageOS.Size())) - n213, err := m.StorageOS.MarshalTo(dAtA[i:]) + n215, err := m.StorageOS.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n213 + i += n215 } return i, nil } @@ -9484,11 +9552,11 @@ func (m *WeightedPodAffinityTerm) MarshalTo(dAtA []byte) (int, error) { dAtA[i] = 0x12 i++ i = encodeVarintGenerated(dAtA, i, uint64(m.PodAffinityTerm.Size())) - n214, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) + n216, err := m.PodAffinityTerm.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i += n214 + i += n216 return i, nil } @@ -11099,6 +11167,12 @@ func (m *PersistentVolumeClaimStatus) Size() (n int) { n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.Conditions) > 0 { + for _, e := range m.Conditions { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } return n } @@ -11720,6 +11794,24 @@ func (m *ProjectedVolumeSource) Size() (n int) { return n } +func (m *PvcCondition) Size() (n int) { + var l int + _ = l + l = len(m.Type) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Status) + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastProbeTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.LastTransitionTime.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Reason) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Message) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *QuobyteVolumeSource) Size() (n int) { var l int _ = l @@ -13878,6 +13970,7 @@ func (this *PersistentVolumeClaimStatus) String() string { `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `AccessModes:` + fmt.Sprintf("%v", this.AccessModes) + `,`, `Capacity:` + mapStringForCapacity + `,`, + `Conditions:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.Conditions), "PvcCondition", "PvcCondition", 1), `&`, ``, 1) + `,`, `}`, }, "") return s @@ -14323,6 +14416,21 @@ func (this *ProjectedVolumeSource) String() string { }, "") return s } +func (this *PvcCondition) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&PvcCondition{`, + `Type:` + fmt.Sprintf("%v", this.Type) + `,`, + `Status:` + fmt.Sprintf("%v", this.Status) + `,`, + `LastProbeTime:` + strings.Replace(strings.Replace(this.LastProbeTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `LastTransitionTime:` + strings.Replace(strings.Replace(this.LastTransitionTime.String(), "Time", "k8s_io_apimachinery_pkg_apis_meta_v1.Time", 1), `&`, ``, 1) + `,`, + `Reason:` + fmt.Sprintf("%v", this.Reason) + `,`, + `Message:` + fmt.Sprintf("%v", this.Message) + `,`, + `}`, + }, "") + return s +} func (this *QuobyteVolumeSource) String() string { if this == nil { return "nil" @@ -30307,6 +30415,37 @@ func (m *PersistentVolumeClaimStatus) Unmarshal(dAtA []byte) error { m.Capacity[ResourceName(mapkey)] = mapvalue } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Conditions", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Conditions = append(m.Conditions, PvcCondition{}) + if err := m.Conditions[len(m.Conditions)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -36110,6 +36249,232 @@ func (m *ProjectedVolumeSource) Unmarshal(dAtA []byte) error { } return nil } +func (m *PvcCondition) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: PvcCondition: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PvcCondition: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Type = PvcConditionType(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = ConditionStatus(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastProbeTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastProbeTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field LastTransitionTime", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.LastTransitionTime.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Reason = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Message", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QuobyteVolumeSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -44495,720 +44860,723 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 11428 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x70, 0x24, 0xd7, - 0x75, 0x98, 0x7a, 0x06, 0xaf, 0x39, 0x78, 0xdf, 0x7d, 0x70, 0x16, 0x24, 0x17, 0xcb, 0xa6, 0x44, - 0x2e, 0x5f, 0x80, 0xb8, 0x24, 0x25, 0x4a, 0xa4, 0x28, 0x01, 0x18, 0x60, 0x17, 0xdc, 0xc5, 0xee, - 0xf0, 0x0e, 0x76, 0x69, 0x51, 0x34, 0xad, 0xde, 0xe9, 0x0b, 0xa0, 0x89, 0x46, 0xf7, 0xb0, 0xbb, - 0x07, 0xbb, 0x60, 0x59, 0x55, 0x89, 0x22, 0x2b, 0x0f, 0xf9, 0xc3, 0x95, 0x72, 0x25, 0x8e, 0xa5, - 0x38, 0x55, 0x79, 0x94, 0xad, 0x28, 0x49, 0xd9, 0x91, 0xe3, 0x87, 0xe4, 0x54, 0x12, 0xe7, 0x51, - 0xd2, 0x8f, 0x63, 0x7f, 0xa4, 0xa4, 0xaa, 0x54, 0x60, 0x0b, 0xaa, 0x4a, 0x2a, 0x1f, 0x49, 0xe5, - 0xf5, 0x13, 0xc4, 0x89, 0x52, 0xf7, 0xd9, 0xf7, 0xf6, 0x74, 0xcf, 0x0c, 0x96, 0x58, 0x90, 0x52, - 0xf9, 0x6f, 0xe6, 0x9c, 0x73, 0xcf, 0xbd, 0x7d, 0x1f, 0xe7, 0x9e, 0x73, 0xee, 0xb9, 0xe7, 0xc2, - 0x4b, 0xdb, 0x2f, 0xc6, 0x73, 0x5e, 0x38, 0xbf, 0xdd, 0xbe, 0x4d, 0xa2, 0x80, 0x24, 0x24, 0x9e, - 0xdf, 0x25, 0x81, 0x1b, 0x46, 0xf3, 0x02, 0xe1, 0xb4, 0xbc, 0xf9, 0x66, 0x18, 0x91, 0xf9, 0xdd, - 0x67, 0xe7, 0x37, 0x49, 0x40, 0x22, 0x27, 0x21, 0xee, 0x5c, 0x2b, 0x0a, 0x93, 0x10, 0x21, 0x4e, - 0x33, 0xe7, 0xb4, 0xbc, 0x39, 0x4a, 0x33, 0xb7, 0xfb, 0xec, 0xcc, 0x33, 0x9b, 0x5e, 0xb2, 0xd5, - 0xbe, 0x3d, 0xd7, 0x0c, 0x77, 0xe6, 0x37, 0xc3, 0xcd, 0x70, 0x9e, 0x91, 0xde, 0x6e, 0x6f, 0xb0, - 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x59, 0xcc, 0x3c, 0x9f, 0x56, 0xb3, 0xe3, 0x34, 0xb7, 0xbc, 0x80, - 0x44, 0x7b, 0xf3, 0xad, 0xed, 0x4d, 0x56, 0x6f, 0x44, 0xe2, 0xb0, 0x1d, 0x35, 0x49, 0xb6, 0xe2, - 0xae, 0xa5, 0xe2, 0xf9, 0x1d, 0x92, 0x38, 0x39, 0xcd, 0x9d, 0x99, 0x2f, 0x2a, 0x15, 0xb5, 0x83, - 0xc4, 0xdb, 0xe9, 0xac, 0xe6, 0x63, 0xbd, 0x0a, 0xc4, 0xcd, 0x2d, 0xb2, 0xe3, 0x74, 0x94, 0x7b, - 0xae, 0xa8, 0x5c, 0x3b, 0xf1, 0xfc, 0x79, 0x2f, 0x48, 0xe2, 0x24, 0xca, 0x16, 0xb2, 0xbf, 0x67, - 0xc1, 0x85, 0x85, 0xd7, 0x1b, 0xcb, 0xbe, 0x13, 0x27, 0x5e, 0x73, 0xd1, 0x0f, 0x9b, 0xdb, 0x8d, - 0x24, 0x8c, 0xc8, 0xad, 0xd0, 0x6f, 0xef, 0x90, 0x06, 0xeb, 0x08, 0xf4, 0x34, 0x8c, 0xec, 0xb2, - 0xff, 0xab, 0xb5, 0xaa, 0x75, 0xc1, 0xba, 0x58, 0x59, 0x9c, 0xfa, 0xce, 0xfe, 0xec, 0x87, 0x0e, - 0xf6, 0x67, 0x47, 0x6e, 0x09, 0x38, 0x56, 0x14, 0xe8, 0x31, 0x18, 0xda, 0x88, 0xd7, 0xf7, 0x5a, - 0xa4, 0x5a, 0x62, 0xb4, 0x13, 0x82, 0x76, 0x68, 0xa5, 0x41, 0xa1, 0x58, 0x60, 0xd1, 0x3c, 0x54, - 0x5a, 0x4e, 0x94, 0x78, 0x89, 0x17, 0x06, 0xd5, 0xf2, 0x05, 0xeb, 0xe2, 0xe0, 0xe2, 0xb4, 0x20, - 0xad, 0xd4, 0x25, 0x02, 0xa7, 0x34, 0xb4, 0x19, 0x11, 0x71, 0xdc, 0x1b, 0x81, 0xbf, 0x57, 0x1d, - 0xb8, 0x60, 0x5d, 0x1c, 0x49, 0x9b, 0x81, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0x97, 0x4b, 0x30, 0xb2, - 0xb0, 0xb1, 0xe1, 0x05, 0x5e, 0xb2, 0x87, 0x6e, 0xc1, 0x58, 0x10, 0xba, 0x44, 0xfe, 0x67, 0x5f, - 0x31, 0x7a, 0xe9, 0xc2, 0x5c, 0xe7, 0x54, 0x9a, 0xbb, 0xae, 0xd1, 0x2d, 0x4e, 0x1d, 0xec, 0xcf, - 0x8e, 0xe9, 0x10, 0x6c, 0xf0, 0x41, 0x18, 0x46, 0x5b, 0xa1, 0xab, 0xd8, 0x96, 0x18, 0xdb, 0xd9, - 0x3c, 0xb6, 0xf5, 0x94, 0x6c, 0x71, 0xf2, 0x60, 0x7f, 0x76, 0x54, 0x03, 0x60, 0x9d, 0x09, 0xba, - 0x0d, 0x93, 0xf4, 0x6f, 0x90, 0x78, 0x8a, 0x6f, 0x99, 0xf1, 0x7d, 0xb4, 0x88, 0xaf, 0x46, 0xba, - 0x78, 0xea, 0x60, 0x7f, 0x76, 0x32, 0x03, 0xc4, 0x59, 0x86, 0xf6, 0xbb, 0x30, 0xb1, 0x90, 0x24, - 0x4e, 0x73, 0x8b, 0xb8, 0x7c, 0x04, 0xd1, 0xf3, 0x30, 0x10, 0x38, 0x3b, 0x44, 0x8c, 0xef, 0x05, - 0xd1, 0xb1, 0x03, 0xd7, 0x9d, 0x1d, 0x72, 0xb8, 0x3f, 0x3b, 0x75, 0x33, 0xf0, 0xde, 0x69, 0x8b, - 0x59, 0x41, 0x61, 0x98, 0x51, 0xa3, 0x4b, 0x00, 0x2e, 0xd9, 0xf5, 0x9a, 0xa4, 0xee, 0x24, 0x5b, - 0x62, 0xbc, 0x91, 0x28, 0x0b, 0x35, 0x85, 0xc1, 0x1a, 0x95, 0x7d, 0x17, 0x2a, 0x0b, 0xbb, 0xa1, - 0xe7, 0xd6, 0x43, 0x37, 0x46, 0xdb, 0x30, 0xd9, 0x8a, 0xc8, 0x06, 0x89, 0x14, 0xa8, 0x6a, 0x5d, - 0x28, 0x5f, 0x1c, 0xbd, 0x74, 0x31, 0xf7, 0x63, 0x4d, 0xd2, 0xe5, 0x20, 0x89, 0xf6, 0x16, 0x1f, - 0x10, 0xf5, 0x4d, 0x66, 0xb0, 0x38, 0xcb, 0xd9, 0xfe, 0x57, 0x25, 0x38, 0xb3, 0xf0, 0x6e, 0x3b, - 0x22, 0x35, 0x2f, 0xde, 0xce, 0xce, 0x70, 0xd7, 0x8b, 0xb7, 0xaf, 0xa7, 0x3d, 0xa0, 0xa6, 0x56, - 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0xcf, 0xc0, 0x30, 0xfd, 0x7d, 0x13, 0xaf, 0x8a, 0x4f, 0x3e, 0x25, - 0x88, 0x47, 0x6b, 0x4e, 0xe2, 0xd4, 0x38, 0x0a, 0x4b, 0x1a, 0xb4, 0x06, 0xa3, 0x4d, 0xb6, 0x20, - 0x37, 0xd7, 0x42, 0x97, 0xb0, 0xc1, 0xac, 0x2c, 0x3e, 0x45, 0xc9, 0x97, 0x52, 0xf0, 0xe1, 0xfe, - 0x6c, 0x95, 0xb7, 0x4d, 0xb0, 0xd0, 0x70, 0x58, 0x2f, 0x8f, 0x6c, 0xb5, 0xbe, 0x06, 0x18, 0x27, - 0xc8, 0x59, 0x5b, 0x17, 0xb5, 0xa5, 0x32, 0xc8, 0x96, 0xca, 0x58, 0xfe, 0x32, 0x41, 0xcf, 0xc2, - 0xc0, 0xb6, 0x17, 0xb8, 0xd5, 0x21, 0xc6, 0xeb, 0x61, 0x3a, 0xe6, 0x57, 0xbd, 0xc0, 0x3d, 0xdc, - 0x9f, 0x9d, 0x36, 0x9a, 0x43, 0x81, 0x98, 0x91, 0xda, 0x7f, 0xdf, 0x12, 0xdd, 0xb8, 0xe2, 0xf9, - 0xa6, 0xa0, 0xb8, 0x04, 0x10, 0x93, 0x66, 0x44, 0x12, 0xad, 0x23, 0xd5, 0x74, 0x68, 0x28, 0x0c, - 0xd6, 0xa8, 0xa8, 0x18, 0x88, 0xb7, 0x9c, 0x88, 0xcd, 0x2a, 0xd1, 0x9d, 0x4a, 0x0c, 0x34, 0x24, - 0x02, 0xa7, 0x34, 0x86, 0x18, 0x28, 0xf7, 0x14, 0x03, 0xbf, 0x63, 0xc1, 0xf0, 0xa2, 0x17, 0xb8, - 0x5e, 0xb0, 0x89, 0x3e, 0x0f, 0x23, 0x54, 0x4a, 0xbb, 0x4e, 0xe2, 0x08, 0x09, 0xf0, 0x51, 0x6d, - 0x96, 0x29, 0xa1, 0x39, 0xd7, 0xda, 0xde, 0xa4, 0x80, 0x78, 0x8e, 0x52, 0xd3, 0x79, 0x77, 0xe3, - 0xf6, 0xdb, 0xa4, 0x99, 0xac, 0x91, 0xc4, 0x49, 0x3f, 0x27, 0x85, 0x61, 0xc5, 0x15, 0x5d, 0x85, - 0xa1, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x44, 0x41, 0xee, 0x92, 0xe5, 0x25, 0x31, 0x9d, 0x9b, 0x24, - 0x68, 0x92, 0x54, 0x40, 0xae, 0xb3, 0xa2, 0x58, 0xb0, 0xb0, 0x9b, 0x30, 0xb6, 0xe4, 0xb4, 0x9c, - 0xdb, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0xe3, 0x50, 0x76, 0x5c, 0x97, 0xad, 0x8f, 0xca, 0xe2, - 0x99, 0x83, 0xfd, 0xd9, 0xf2, 0x82, 0x4b, 0x07, 0x0a, 0x14, 0xd5, 0x1e, 0xa6, 0x14, 0xe8, 0x49, - 0x18, 0x70, 0xa3, 0xb0, 0x55, 0x2d, 0x31, 0xca, 0xb3, 0x74, 0x4c, 0x6b, 0x51, 0xd8, 0xca, 0x90, - 0x32, 0x1a, 0xfb, 0xdb, 0x25, 0x40, 0x4b, 0xa4, 0xb5, 0xb5, 0xd2, 0x30, 0x46, 0xf2, 0x22, 0x8c, - 0xec, 0x84, 0x81, 0x97, 0x84, 0x51, 0x2c, 0x2a, 0x64, 0x13, 0x68, 0x4d, 0xc0, 0xb0, 0xc2, 0xa2, - 0x0b, 0x30, 0xd0, 0x4a, 0x17, 0xff, 0x98, 0x14, 0x1c, 0x6c, 0xd9, 0x33, 0x0c, 0xa5, 0x68, 0xc7, - 0x24, 0x12, 0x13, 0x5f, 0x51, 0xdc, 0x8c, 0x49, 0x84, 0x19, 0x26, 0x9d, 0x37, 0x74, 0x46, 0x89, - 0x69, 0x9d, 0x99, 0x37, 0x14, 0x83, 0x35, 0x2a, 0x74, 0x13, 0x2a, 0xfc, 0x1f, 0x26, 0x1b, 0x6c, - 0x8e, 0x17, 0xc8, 0x8c, 0x6b, 0x61, 0xd3, 0xf1, 0xb3, 0x5d, 0x3e, 0xce, 0x66, 0x97, 0x2c, 0x8e, - 0x53, 0x4e, 0xc6, 0xec, 0x1a, 0xea, 0x39, 0xbb, 0x7e, 0xc9, 0x02, 0xb4, 0xe4, 0x05, 0x2e, 0x89, - 0x4e, 0x60, 0xc3, 0x3c, 0xda, 0xc4, 0xff, 0xf7, 0xb4, 0x69, 0xe1, 0x4e, 0x2b, 0x0c, 0x48, 0x90, - 0x2c, 0x85, 0x81, 0xcb, 0x37, 0xd1, 0x4f, 0xc2, 0x40, 0x42, 0xab, 0xe2, 0xcd, 0x7a, 0x4c, 0x0e, - 0x06, 0xad, 0xe0, 0x70, 0x7f, 0xf6, 0x6c, 0x67, 0x09, 0xd6, 0x04, 0x56, 0x06, 0x7d, 0x02, 0x86, - 0xe2, 0xc4, 0x49, 0xda, 0xb1, 0x68, 0xe8, 0x23, 0xb2, 0xa1, 0x0d, 0x06, 0x3d, 0xdc, 0x9f, 0x9d, - 0x54, 0xc5, 0x38, 0x08, 0x8b, 0x02, 0xe8, 0x09, 0x18, 0xde, 0x21, 0x71, 0xec, 0x6c, 0x4a, 0xf9, - 0x37, 0x29, 0xca, 0x0e, 0xaf, 0x71, 0x30, 0x96, 0x78, 0xf4, 0x28, 0x0c, 0x92, 0x28, 0x0a, 0x23, - 0x31, 0x0f, 0xc6, 0x05, 0xe1, 0xe0, 0x32, 0x05, 0x62, 0x8e, 0xb3, 0xff, 0xad, 0x05, 0x93, 0xaa, - 0xad, 0xbc, 0xae, 0x13, 0x58, 0xde, 0x6f, 0x00, 0x34, 0xe5, 0x07, 0xc6, 0x6c, 0x79, 0x8d, 0x5e, - 0x7a, 0x2c, 0x6f, 0xd2, 0x75, 0x76, 0x63, 0xca, 0x59, 0x81, 0x62, 0xac, 0x71, 0xb3, 0xff, 0xa9, - 0x05, 0xa7, 0x32, 0x5f, 0x74, 0xcd, 0x8b, 0x13, 0xf4, 0x66, 0xc7, 0x57, 0xcd, 0xf5, 0xf7, 0x55, - 0xb4, 0x34, 0xfb, 0x26, 0x35, 0x4b, 0x24, 0x44, 0xfb, 0xa2, 0x2b, 0x30, 0xe8, 0x25, 0x64, 0x47, - 0x7e, 0xcc, 0xa3, 0x5d, 0x3f, 0x86, 0xb7, 0x2a, 0x1d, 0x91, 0x55, 0x5a, 0x12, 0x73, 0x06, 0xf6, - 0x7f, 0xb7, 0xa0, 0xb2, 0x14, 0x06, 0x1b, 0xde, 0xe6, 0x9a, 0xd3, 0x3a, 0x81, 0xb1, 0x58, 0x85, - 0x01, 0xc6, 0x9d, 0x37, 0xfc, 0xf1, 0xfc, 0x86, 0x8b, 0xe6, 0xcc, 0xd1, 0x5d, 0x8c, 0x6b, 0x0b, - 0x4a, 0xfc, 0x50, 0x10, 0x66, 0x2c, 0x66, 0x3e, 0x0e, 0x15, 0x45, 0x80, 0xa6, 0xa0, 0xbc, 0x4d, - 0xb8, 0x86, 0x58, 0xc1, 0xf4, 0x27, 0x3a, 0x0d, 0x83, 0xbb, 0x8e, 0xdf, 0x16, 0xcb, 0x13, 0xf3, - 0x3f, 0x9f, 0x2c, 0xbd, 0x68, 0xd9, 0xdf, 0x62, 0x6b, 0x4c, 0x54, 0xb2, 0x1c, 0xec, 0x8a, 0xe5, - 0xff, 0x2e, 0x9c, 0xf6, 0x73, 0xa4, 0x8e, 0xe8, 0x88, 0xfe, 0xa5, 0xd4, 0x43, 0xa2, 0xad, 0xa7, - 0xf3, 0xb0, 0x38, 0xb7, 0x0e, 0x2a, 0xb8, 0xc3, 0x16, 0x9d, 0x51, 0x8e, 0xcf, 0xda, 0x2b, 0x76, - 0xfe, 0x1b, 0x02, 0x86, 0x15, 0x96, 0x0a, 0x88, 0xd3, 0xaa, 0xf1, 0x57, 0xc9, 0x5e, 0x83, 0xf8, - 0xa4, 0x99, 0x84, 0xd1, 0xfb, 0xda, 0xfc, 0x87, 0x79, 0xef, 0x73, 0xf9, 0x32, 0x2a, 0x18, 0x94, - 0xaf, 0x92, 0x3d, 0x3e, 0x14, 0xfa, 0xd7, 0x95, 0xbb, 0x7e, 0xdd, 0x6f, 0x58, 0x30, 0xae, 0xbe, - 0xee, 0x04, 0x16, 0xd2, 0xa2, 0xb9, 0x90, 0x1e, 0xee, 0x3a, 0x1f, 0x0b, 0x96, 0xd0, 0x8f, 0x98, - 0x08, 0x10, 0x34, 0xf5, 0x28, 0xa4, 0x5d, 0x43, 0x65, 0xf6, 0xfb, 0x39, 0x20, 0xfd, 0x7c, 0xd7, - 0x55, 0xb2, 0xb7, 0x1e, 0xd2, 0x0d, 0x3f, 0xff, 0xbb, 0x8c, 0x51, 0x1b, 0xe8, 0x3a, 0x6a, 0xbf, - 0x59, 0x82, 0x33, 0xaa, 0x07, 0x8c, 0x2d, 0xf5, 0xc7, 0xbd, 0x0f, 0x9e, 0x85, 0x51, 0x97, 0x6c, - 0x38, 0x6d, 0x3f, 0x51, 0x46, 0xc0, 0x20, 0x37, 0x04, 0x6b, 0x29, 0x18, 0xeb, 0x34, 0x47, 0xe8, - 0xb6, 0x7f, 0x0d, 0x4c, 0xf6, 0x26, 0x0e, 0x9d, 0xc1, 0x54, 0xdf, 0xd2, 0x4c, 0xb9, 0x31, 0xdd, - 0x94, 0x13, 0x66, 0xdb, 0xa3, 0x30, 0xe8, 0xed, 0xd0, 0xbd, 0xb8, 0x64, 0x6e, 0xb1, 0xab, 0x14, - 0x88, 0x39, 0x0e, 0x7d, 0x04, 0x86, 0x9b, 0xe1, 0xce, 0x8e, 0x13, 0xb8, 0xd5, 0x32, 0xd3, 0x00, - 0x47, 0xe9, 0x76, 0xbd, 0xc4, 0x41, 0x58, 0xe2, 0xd0, 0x43, 0x30, 0xe0, 0x44, 0x9b, 0x71, 0x75, - 0x80, 0xd1, 0x8c, 0xd0, 0x9a, 0x16, 0xa2, 0xcd, 0x18, 0x33, 0x28, 0xd5, 0xec, 0xee, 0x84, 0xd1, - 0xb6, 0x17, 0x6c, 0xd6, 0xbc, 0x88, 0xa9, 0x69, 0x9a, 0x66, 0xf7, 0xba, 0xc2, 0x60, 0x8d, 0x0a, - 0xad, 0xc0, 0x60, 0x2b, 0x8c, 0x92, 0xb8, 0x3a, 0xc4, 0xba, 0xfb, 0x91, 0x82, 0xa5, 0xc4, 0xbf, - 0xb6, 0x1e, 0x46, 0x49, 0xfa, 0x01, 0xf4, 0x5f, 0x8c, 0x79, 0x71, 0xf4, 0x09, 0x28, 0x93, 0x60, - 0xb7, 0x3a, 0xcc, 0xb8, 0xcc, 0xe4, 0x71, 0x59, 0x0e, 0x76, 0x6f, 0x39, 0x51, 0x2a, 0x67, 0x96, - 0x83, 0x5d, 0x4c, 0xcb, 0xa0, 0xcf, 0x42, 0x45, 0xba, 0x81, 0xe2, 0xea, 0x48, 0xf1, 0x14, 0xc3, - 0x82, 0x08, 0x93, 0x77, 0xda, 0x5e, 0x44, 0x76, 0x48, 0x90, 0xc4, 0xa9, 0xf9, 0x22, 0xb1, 0x31, - 0x4e, 0xb9, 0xa1, 0xcf, 0xc2, 0x18, 0xd7, 0xfc, 0xd6, 0xc2, 0x76, 0x90, 0xc4, 0xd5, 0x0a, 0x6b, - 0x5e, 0xae, 0xcf, 0xe0, 0x56, 0x4a, 0xb7, 0x78, 0x5a, 0x30, 0x1d, 0xd3, 0x80, 0x31, 0x36, 0x58, - 0x21, 0x0c, 0xe3, 0xbe, 0xb7, 0x4b, 0x02, 0x12, 0xc7, 0xf5, 0x28, 0xbc, 0x4d, 0xaa, 0xc0, 0x5a, - 0x7e, 0x2e, 0xdf, 0x94, 0x0e, 0x6f, 0x93, 0xc5, 0xe9, 0x83, 0xfd, 0xd9, 0xf1, 0x6b, 0x7a, 0x19, - 0x6c, 0xb2, 0x40, 0x37, 0x61, 0x82, 0xaa, 0x94, 0x5e, 0xca, 0x74, 0xb4, 0x17, 0x53, 0x74, 0xb0, - 0x3f, 0x3b, 0x81, 0x8d, 0x42, 0x38, 0xc3, 0x04, 0xbd, 0x0a, 0x15, 0xdf, 0xdb, 0x20, 0xcd, 0xbd, - 0xa6, 0x4f, 0xaa, 0x63, 0x8c, 0x63, 0xee, 0xb2, 0xba, 0x26, 0x89, 0xb8, 0xca, 0xae, 0xfe, 0xe2, - 0xb4, 0x38, 0xba, 0x05, 0x67, 0x13, 0x12, 0xed, 0x78, 0x81, 0x43, 0x97, 0x83, 0xd0, 0x27, 0x99, - 0x43, 0x62, 0x9c, 0xcd, 0xb7, 0xf3, 0xa2, 0xeb, 0xce, 0xae, 0xe7, 0x52, 0xe1, 0x82, 0xd2, 0xe8, - 0x06, 0x4c, 0xb2, 0x95, 0x50, 0x6f, 0xfb, 0x7e, 0x3d, 0xf4, 0xbd, 0xe6, 0x5e, 0x75, 0x82, 0x31, - 0xfc, 0x88, 0xf4, 0x38, 0xac, 0x9a, 0x68, 0x6a, 0x60, 0xa5, 0xff, 0x70, 0xb6, 0x34, 0xba, 0x0d, - 0x93, 0x31, 0x69, 0xb6, 0x23, 0x2f, 0xd9, 0xa3, 0xf3, 0x97, 0xdc, 0x4d, 0xaa, 0x93, 0xc5, 0x66, - 0x62, 0xc3, 0x24, 0xe5, 0x9e, 0x9d, 0x0c, 0x10, 0x67, 0x19, 0xd2, 0xa5, 0x1d, 0x27, 0xae, 0x17, - 0x54, 0xa7, 0x98, 0xc4, 0x50, 0x2b, 0xa3, 0x41, 0x81, 0x98, 0xe3, 0x98, 0xcd, 0x4d, 0x7f, 0xdc, - 0xa0, 0x12, 0x74, 0x9a, 0x11, 0xa6, 0x36, 0xb7, 0x44, 0xe0, 0x94, 0x86, 0x6e, 0xcb, 0x49, 0xb2, - 0x57, 0x45, 0x8c, 0x54, 0x2d, 0x97, 0xf5, 0xf5, 0xcf, 0x62, 0x0a, 0x47, 0xd7, 0x60, 0x98, 0x04, - 0xbb, 0x2b, 0x51, 0xb8, 0x53, 0x3d, 0x55, 0xbc, 0x66, 0x97, 0x39, 0x09, 0x17, 0xe8, 0xa9, 0x01, - 0x20, 0xc0, 0x58, 0xb2, 0x40, 0x77, 0xa1, 0x9a, 0x33, 0x22, 0x7c, 0x00, 0x4e, 0xb3, 0x01, 0x78, - 0x59, 0x94, 0xad, 0xae, 0x17, 0xd0, 0x1d, 0x76, 0xc1, 0xe1, 0x42, 0xee, 0xf6, 0x6d, 0x98, 0x50, - 0x82, 0x85, 0x8d, 0x2d, 0x9a, 0x85, 0x41, 0x2a, 0x31, 0xa5, 0x11, 0x5c, 0xa1, 0x5d, 0x49, 0x05, - 0x69, 0x8c, 0x39, 0x9c, 0x75, 0xa5, 0xf7, 0x2e, 0x59, 0xdc, 0x4b, 0x08, 0x37, 0x8b, 0xca, 0x5a, - 0x57, 0x4a, 0x04, 0x4e, 0x69, 0xec, 0xff, 0xc7, 0x15, 0x93, 0x54, 0x7a, 0xf5, 0x21, 0xaf, 0x9f, - 0x86, 0x91, 0xad, 0x30, 0x4e, 0x28, 0x35, 0xab, 0x63, 0x30, 0x55, 0x45, 0xae, 0x08, 0x38, 0x56, - 0x14, 0xe8, 0x25, 0x18, 0x6f, 0xea, 0x15, 0x88, 0xcd, 0xe6, 0x8c, 0x28, 0x62, 0xd6, 0x8e, 0x4d, - 0x5a, 0xf4, 0x22, 0x8c, 0x30, 0xcf, 0x70, 0x33, 0xf4, 0x85, 0x01, 0x26, 0x77, 0xcc, 0x91, 0xba, - 0x80, 0x1f, 0x6a, 0xbf, 0xb1, 0xa2, 0xa6, 0x66, 0x2c, 0x6d, 0xc2, 0x6a, 0x5d, 0x88, 0x79, 0x65, - 0xc6, 0x5e, 0x61, 0x50, 0x2c, 0xb0, 0xf6, 0x5f, 0x2d, 0x69, 0xbd, 0x4c, 0x4d, 0x0a, 0x82, 0xea, - 0x30, 0x7c, 0xc7, 0xf1, 0x12, 0x2f, 0xd8, 0x14, 0xfb, 0xf9, 0x13, 0x5d, 0x65, 0x3e, 0x2b, 0xf4, - 0x3a, 0x2f, 0xc0, 0x77, 0x25, 0xf1, 0x07, 0x4b, 0x36, 0x94, 0x63, 0xd4, 0x0e, 0x02, 0xca, 0xb1, - 0xd4, 0x2f, 0x47, 0xcc, 0x0b, 0x70, 0x8e, 0xe2, 0x0f, 0x96, 0x6c, 0xd0, 0x9b, 0x00, 0x72, 0xde, - 0x10, 0x57, 0x78, 0x64, 0x9f, 0xee, 0xcd, 0x74, 0x5d, 0x95, 0x59, 0x9c, 0xa0, 0x7b, 0x5e, 0xfa, - 0x1f, 0x6b, 0xfc, 0xec, 0x84, 0xe9, 0x3d, 0x9d, 0x8d, 0x41, 0x9f, 0xa3, 0x4b, 0xd5, 0x89, 0x12, - 0xe2, 0x2e, 0x24, 0xa2, 0x73, 0x9e, 0xec, 0x4f, 0x6d, 0x5d, 0xf7, 0x76, 0x88, 0xbe, 0xac, 0x05, - 0x13, 0x9c, 0xf2, 0xb3, 0x7f, 0xbb, 0x0c, 0xd5, 0xa2, 0xe6, 0xd2, 0x49, 0x47, 0xee, 0x7a, 0xc9, - 0x12, 0x55, 0x57, 0x2c, 0x73, 0xd2, 0x2d, 0x0b, 0x38, 0x56, 0x14, 0x74, 0xf4, 0x63, 0x6f, 0x53, - 0x5a, 0x1d, 0x83, 0xe9, 0xe8, 0x37, 0x18, 0x14, 0x0b, 0x2c, 0xa5, 0x8b, 0x88, 0x13, 0x0b, 0x97, - 0xbf, 0x36, 0x4b, 0x30, 0x83, 0x62, 0x81, 0xd5, 0x1d, 0x06, 0x03, 0x3d, 0x1c, 0x06, 0x46, 0x17, - 0x0d, 0x1e, 0x6f, 0x17, 0xa1, 0xb7, 0x00, 0x36, 0xbc, 0xc0, 0x8b, 0xb7, 0x18, 0xf7, 0xa1, 0x23, - 0x73, 0x57, 0xca, 0xce, 0x8a, 0xe2, 0x82, 0x35, 0x8e, 0xe8, 0x05, 0x18, 0x55, 0x0b, 0x70, 0xb5, - 0x56, 0x1d, 0x36, 0xfd, 0xc9, 0xa9, 0x34, 0xaa, 0x61, 0x9d, 0xce, 0x7e, 0x3b, 0x3b, 0x5f, 0xc4, - 0x0a, 0xd0, 0xfa, 0xd7, 0xea, 0xb7, 0x7f, 0x4b, 0xdd, 0xfb, 0xd7, 0xfe, 0xfd, 0x32, 0x4c, 0x1a, - 0x95, 0xb5, 0xe3, 0x3e, 0x64, 0xd6, 0x65, 0xba, 0x11, 0x39, 0x09, 0x11, 0xeb, 0xcf, 0xee, 0xbd, - 0x54, 0xf4, 0xcd, 0x8a, 0xae, 0x00, 0x5e, 0x1e, 0xbd, 0x05, 0x15, 0xdf, 0x89, 0x99, 0xf3, 0x81, - 0x88, 0x75, 0xd7, 0x0f, 0xb3, 0x54, 0xd1, 0x77, 0xe2, 0x44, 0xdb, 0x0b, 0x38, 0xef, 0x94, 0x25, - 0xdd, 0x31, 0xa9, 0x72, 0x22, 0xcf, 0x94, 0x54, 0x23, 0xa8, 0x06, 0xb3, 0x87, 0x39, 0x0e, 0xbd, - 0x08, 0x63, 0x11, 0x61, 0xb3, 0x62, 0x89, 0xea, 0x5a, 0x6c, 0x9a, 0x0d, 0xa6, 0x4a, 0x19, 0xd6, - 0x70, 0xd8, 0xa0, 0x4c, 0x75, 0xed, 0xa1, 0x2e, 0xba, 0xf6, 0x13, 0x30, 0xcc, 0x7e, 0xa8, 0x19, - 0xa0, 0x46, 0x63, 0x95, 0x83, 0xb1, 0xc4, 0x67, 0x27, 0xcc, 0x48, 0x9f, 0x13, 0xe6, 0x49, 0x98, - 0xa8, 0x39, 0x64, 0x27, 0x0c, 0x96, 0x03, 0xb7, 0x15, 0x7a, 0x41, 0x82, 0xaa, 0x30, 0xc0, 0x76, - 0x07, 0xbe, 0xb6, 0x07, 0x28, 0x07, 0x3c, 0x40, 0x35, 0x67, 0xfb, 0x8f, 0x4a, 0x30, 0x5e, 0x23, - 0x3e, 0x49, 0x08, 0xb7, 0x35, 0x62, 0xb4, 0x02, 0x68, 0x33, 0x72, 0x9a, 0xa4, 0x4e, 0x22, 0x2f, - 0x74, 0x1b, 0xa4, 0x19, 0x06, 0xec, 0xa4, 0x86, 0x6e, 0x77, 0x67, 0x0f, 0xf6, 0x67, 0xd1, 0xe5, - 0x0e, 0x2c, 0xce, 0x29, 0x81, 0xde, 0x80, 0xf1, 0x56, 0x44, 0x0c, 0x1f, 0x9a, 0x55, 0xa4, 0x2e, - 0xd4, 0x75, 0x42, 0xae, 0xa9, 0x1a, 0x20, 0x6c, 0xb2, 0x42, 0x9f, 0x81, 0xa9, 0x30, 0x6a, 0x6d, - 0x39, 0x41, 0x8d, 0xb4, 0x48, 0xe0, 0x52, 0x55, 0x5c, 0xf8, 0x08, 0x4e, 0x1f, 0xec, 0xcf, 0x4e, - 0xdd, 0xc8, 0xe0, 0x70, 0x07, 0x35, 0x7a, 0x03, 0xa6, 0x5b, 0x51, 0xd8, 0x72, 0x36, 0xd9, 0x44, - 0x11, 0x1a, 0x07, 0x97, 0x3e, 0x4f, 0x1f, 0xec, 0xcf, 0x4e, 0xd7, 0xb3, 0xc8, 0xc3, 0xfd, 0xd9, - 0x53, 0xac, 0xa3, 0x28, 0x24, 0x45, 0xe2, 0x4e, 0x36, 0xf6, 0x26, 0x9c, 0xa9, 0x85, 0x77, 0x82, - 0x3b, 0x4e, 0xe4, 0x2e, 0xd4, 0x57, 0x35, 0xe3, 0xfe, 0xba, 0x34, 0x2e, 0xf9, 0xb9, 0x57, 0xee, - 0x3e, 0xa5, 0x95, 0xe4, 0xea, 0xff, 0x8a, 0xe7, 0x93, 0x02, 0x27, 0xc2, 0x5f, 0x2f, 0x19, 0x35, - 0xa5, 0xf4, 0xca, 0x53, 0x6f, 0x15, 0x7a, 0xea, 0x5f, 0x83, 0x91, 0x0d, 0x8f, 0xf8, 0x2e, 0x26, - 0x1b, 0x62, 0x64, 0x1e, 0x2f, 0x3e, 0xc0, 0x58, 0xa1, 0x94, 0xd2, 0x69, 0xc4, 0x4d, 0xd3, 0x15, - 0x51, 0x18, 0x2b, 0x36, 0x68, 0x1b, 0xa6, 0xa4, 0xed, 0x23, 0xb1, 0x62, 0x11, 0x3f, 0xd1, 0xcd, - 0xa0, 0x32, 0x99, 0xb3, 0x01, 0xc4, 0x19, 0x36, 0xb8, 0x83, 0x31, 0xb5, 0x45, 0x77, 0xe8, 0x76, - 0x35, 0xc0, 0xa6, 0x34, 0xb3, 0x45, 0x99, 0x59, 0xcd, 0xa0, 0xf6, 0xd7, 0x2c, 0x78, 0xa0, 0xa3, - 0x67, 0x84, 0x7b, 0xe1, 0x98, 0x47, 0x21, 0x6b, 0xee, 0x97, 0x7a, 0x9b, 0xfb, 0xf6, 0xaf, 0x5b, - 0x70, 0x7a, 0x79, 0xa7, 0x95, 0xec, 0xd5, 0x3c, 0xf3, 0x34, 0xe1, 0xe3, 0x30, 0xb4, 0x43, 0x5c, - 0xaf, 0xbd, 0x23, 0x46, 0x6e, 0x56, 0x8a, 0xf4, 0x35, 0x06, 0x3d, 0xdc, 0x9f, 0x1d, 0x6f, 0x24, - 0x61, 0xe4, 0x6c, 0x12, 0x0e, 0xc0, 0x82, 0x1c, 0xfd, 0x0c, 0xd7, 0x4d, 0xaf, 0x79, 0x3b, 0x9e, - 0x3c, 0x90, 0xea, 0xea, 0xf2, 0x9a, 0x93, 0x1d, 0x3a, 0xf7, 0x5a, 0xdb, 0x09, 0x12, 0x2f, 0xd9, - 0x33, 0x75, 0x59, 0xc6, 0x08, 0xa7, 0x3c, 0xed, 0xef, 0x59, 0x30, 0x29, 0xe5, 0xc9, 0x82, 0xeb, - 0x46, 0x24, 0x8e, 0xd1, 0x0c, 0x94, 0xbc, 0x96, 0x68, 0x29, 0x88, 0xd2, 0xa5, 0xd5, 0x3a, 0x2e, - 0x79, 0x2d, 0x54, 0x87, 0x0a, 0x3f, 0xdb, 0x4a, 0x27, 0x58, 0x5f, 0x27, 0x64, 0xcc, 0xf6, 0x5b, - 0x97, 0x25, 0x71, 0xca, 0x44, 0x6a, 0xc6, 0x6c, 0x2f, 0x2a, 0x9b, 0x27, 0x2d, 0x57, 0x04, 0x1c, - 0x2b, 0x0a, 0x74, 0x11, 0x46, 0x82, 0xd0, 0xe5, 0x47, 0x8d, 0x7c, 0x5d, 0xb3, 0x69, 0x7b, 0x5d, - 0xc0, 0xb0, 0xc2, 0xda, 0x3f, 0x6f, 0xc1, 0x98, 0xfc, 0xb2, 0x3e, 0x95, 0x74, 0xba, 0xbc, 0x52, - 0x05, 0x3d, 0x5d, 0x5e, 0x54, 0xc9, 0x66, 0x18, 0x43, 0xb7, 0x2e, 0x1f, 0x45, 0xb7, 0xb6, 0xbf, - 0x5a, 0x82, 0x09, 0xd9, 0x9c, 0x46, 0xfb, 0x76, 0x4c, 0x12, 0xb4, 0x0e, 0x15, 0x87, 0x77, 0x39, - 0x91, 0xb3, 0xf6, 0xd1, 0x7c, 0xab, 0xcb, 0x18, 0x9f, 0x74, 0x44, 0x17, 0x64, 0x69, 0x9c, 0x32, - 0x42, 0x3e, 0x4c, 0x07, 0x61, 0xc2, 0xb6, 0x3e, 0x85, 0xef, 0x76, 0x36, 0x90, 0xe5, 0x7e, 0x4e, - 0x70, 0x9f, 0xbe, 0x9e, 0xe5, 0x82, 0x3b, 0x19, 0xa3, 0x65, 0xe9, 0xe9, 0x29, 0xb3, 0x1a, 0x2e, - 0x74, 0xab, 0xa1, 0xd8, 0xd1, 0x63, 0xff, 0x9e, 0x05, 0x15, 0x49, 0x76, 0x12, 0xc7, 0x40, 0x6b, - 0x30, 0x1c, 0xb3, 0x41, 0x90, 0x5d, 0x63, 0x77, 0x6b, 0x38, 0x1f, 0xaf, 0x74, 0x47, 0xe7, 0xff, - 0x63, 0x2c, 0x79, 0x30, 0x57, 0xb5, 0x6a, 0xfe, 0x07, 0xc4, 0x55, 0xad, 0xda, 0x53, 0xb0, 0xcb, - 0xfc, 0x27, 0xd6, 0x66, 0xcd, 0x9e, 0xa7, 0x8a, 0x67, 0x2b, 0x22, 0x1b, 0xde, 0xdd, 0xac, 0xe2, - 0x59, 0x67, 0x50, 0x2c, 0xb0, 0xe8, 0x4d, 0x18, 0x6b, 0x4a, 0x0f, 0x6f, 0x2a, 0x06, 0x1e, 0xeb, - 0xea, 0x2f, 0x57, 0x47, 0x2b, 0x3c, 0x20, 0x67, 0x49, 0x2b, 0x8f, 0x0d, 0x6e, 0x54, 0xc2, 0xa4, - 0xa7, 0xc2, 0xe5, 0xae, 0xce, 0x95, 0x88, 0x24, 0x29, 0xdf, 0xc2, 0x03, 0x61, 0xfb, 0x57, 0x2c, - 0x18, 0xe2, 0x7e, 0xc2, 0xfe, 0x1c, 0xab, 0xda, 0x51, 0x51, 0xda, 0x77, 0xb7, 0x28, 0x50, 0x9c, - 0x1c, 0xa1, 0x35, 0xa8, 0xb0, 0x1f, 0xcc, 0x5f, 0x52, 0x2e, 0x8e, 0x44, 0xe2, 0xb5, 0xea, 0x0d, - 0xbc, 0x25, 0x8b, 0xe1, 0x94, 0x83, 0xfd, 0x8b, 0x65, 0x2a, 0xaa, 0x52, 0x52, 0x63, 0x17, 0xb7, - 0xee, 0xdf, 0x2e, 0x5e, 0xba, 0x5f, 0xbb, 0xf8, 0x26, 0x4c, 0x36, 0xb5, 0x73, 0xa9, 0x74, 0x24, - 0x2f, 0x76, 0x9d, 0x24, 0xda, 0x11, 0x16, 0xf7, 0x95, 0x2d, 0x99, 0x4c, 0x70, 0x96, 0x2b, 0xfa, - 0x1c, 0x8c, 0xf1, 0x71, 0x16, 0xb5, 0x0c, 0xb0, 0x5a, 0x3e, 0x52, 0x3c, 0x5f, 0xf4, 0x2a, 0xd8, - 0x4c, 0x6c, 0x68, 0xc5, 0xb1, 0xc1, 0xcc, 0xfe, 0xf2, 0x20, 0x0c, 0x2e, 0xef, 0x92, 0x20, 0x39, - 0x01, 0x81, 0xd4, 0x84, 0x09, 0x2f, 0xd8, 0x0d, 0xfd, 0x5d, 0xe2, 0x72, 0xfc, 0x51, 0x36, 0xd7, - 0xb3, 0x82, 0xf5, 0xc4, 0xaa, 0xc1, 0x02, 0x67, 0x58, 0xde, 0x0f, 0xcb, 0xfd, 0x32, 0x0c, 0xf1, - 0xb1, 0x17, 0x66, 0x7b, 0xae, 0x17, 0x9c, 0x75, 0xa2, 0x58, 0x05, 0xa9, 0x57, 0x81, 0xbb, 0xdd, - 0x45, 0x71, 0xf4, 0x36, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x93, 0x3b, 0x4e, 0x9c, 0x9d, 0xd6, - 0x3d, 0x58, 0xea, 0xaa, 0x1f, 0x56, 0x0c, 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc2, 0x38, 0x35, 0x1e, - 0xd3, 0xaa, 0x86, 0x8f, 0x5c, 0x95, 0x72, 0xc5, 0x5d, 0xd3, 0x19, 0x61, 0x93, 0x2f, 0x15, 0x26, - 0x4d, 0x66, 0x6c, 0x8e, 0x30, 0x8d, 0x42, 0x09, 0x13, 0x6e, 0x65, 0x72, 0x1c, 0x95, 0x49, 0x2c, - 0x9e, 0xa3, 0x62, 0xca, 0xa4, 0x34, 0x6a, 0xc3, 0xfe, 0x3a, 0xdd, 0x1d, 0x69, 0x1f, 0x9e, 0xc0, - 0xd6, 0xf2, 0x8a, 0xb9, 0xb5, 0x9c, 0x2b, 0x1c, 0xcf, 0x82, 0x6d, 0xe5, 0xf3, 0x30, 0xaa, 0x0d, - 0x37, 0x9a, 0x87, 0x4a, 0x53, 0x06, 0x1f, 0x08, 0xa9, 0xab, 0xd4, 0x17, 0x15, 0x95, 0x80, 0x53, - 0x1a, 0xda, 0x1b, 0x54, 0xd9, 0xcb, 0x06, 0x23, 0x51, 0x55, 0x10, 0x33, 0x8c, 0xfd, 0x1c, 0xc0, - 0xf2, 0x5d, 0xd2, 0x5c, 0xe0, 0xc6, 0x97, 0x76, 0xc6, 0x65, 0x15, 0x9f, 0x71, 0xd1, 0x1d, 0x7a, - 0x62, 0x65, 0xc9, 0x50, 0xca, 0xe7, 0x00, 0xb8, 0x16, 0xfa, 0xfa, 0xeb, 0xd7, 0xa5, 0x77, 0x98, - 0x3b, 0xf8, 0x14, 0x14, 0x6b, 0x14, 0xe8, 0x1c, 0x94, 0xfd, 0x76, 0x20, 0x94, 0xc3, 0xe1, 0x83, - 0xfd, 0xd9, 0xf2, 0xb5, 0x76, 0x80, 0x29, 0x4c, 0x8b, 0xff, 0x29, 0xf7, 0x1d, 0xff, 0xd3, 0x3b, - 0xfe, 0xf5, 0xcf, 0x97, 0x61, 0x6a, 0xc5, 0x27, 0x77, 0x8d, 0x56, 0x3f, 0x06, 0x43, 0x6e, 0xe4, - 0xed, 0x92, 0x28, 0xbb, 0x49, 0xd7, 0x18, 0x14, 0x0b, 0x6c, 0xdf, 0x21, 0x49, 0x37, 0x3b, 0xb7, - 0xdb, 0xe3, 0x0e, 0xc2, 0xea, 0xf9, 0xa5, 0xe8, 0x4d, 0x18, 0xe6, 0x27, 0xa1, 0x71, 0x75, 0x90, - 0x4d, 0xbb, 0x67, 0xf3, 0x9a, 0x90, 0xed, 0x8b, 0x39, 0xe1, 0xdb, 0xe0, 0x61, 0x21, 0x4a, 0x46, - 0x09, 0x28, 0x96, 0x2c, 0x67, 0x3e, 0x09, 0x63, 0x3a, 0xe5, 0x91, 0xe2, 0x43, 0xfe, 0x82, 0x05, - 0xa7, 0x56, 0xfc, 0xb0, 0xb9, 0x9d, 0x89, 0x0f, 0x7b, 0x01, 0x46, 0xe9, 0x72, 0x89, 0x8d, 0x40, - 0x49, 0x23, 0x88, 0x54, 0xa0, 0xb0, 0x4e, 0xa7, 0x15, 0xbb, 0x79, 0x73, 0xb5, 0x96, 0x17, 0x7b, - 0x2a, 0x50, 0x58, 0xa7, 0xb3, 0xff, 0xc0, 0x82, 0x87, 0x2f, 0x2f, 0x2d, 0xd7, 0x49, 0x14, 0x7b, - 0x71, 0x42, 0x82, 0xa4, 0x23, 0xfc, 0x95, 0xea, 0x6e, 0xae, 0xd6, 0x94, 0x54, 0x77, 0xab, 0xb1, - 0x56, 0x08, 0xec, 0x07, 0x25, 0xb4, 0xfb, 0xd7, 0x2c, 0x38, 0x75, 0xd9, 0x4b, 0x30, 0x69, 0x85, - 0xd9, 0xf0, 0xd3, 0x88, 0xb4, 0xc2, 0xd8, 0x4b, 0xc2, 0x68, 0x2f, 0x1b, 0x7e, 0x8a, 0x15, 0x06, - 0x6b, 0x54, 0xbc, 0xe6, 0x5d, 0x2f, 0xa6, 0x2d, 0x2d, 0x99, 0x06, 0x24, 0x16, 0x70, 0xac, 0x28, - 0xe8, 0x87, 0xb9, 0x5e, 0xc4, 0x14, 0x80, 0x3d, 0xb1, 0x5a, 0xd5, 0x87, 0xd5, 0x24, 0x02, 0xa7, - 0x34, 0xf6, 0xd7, 0x2c, 0x38, 0x73, 0xd9, 0x6f, 0xc7, 0x09, 0x89, 0x36, 0x62, 0xa3, 0xb1, 0xcf, - 0x41, 0x85, 0x48, 0x25, 0x5b, 0xb4, 0x55, 0x6d, 0x0b, 0x4a, 0xfb, 0xe6, 0xb1, 0xaf, 0x8a, 0xae, - 0x8f, 0x60, 0xcb, 0xa3, 0x05, 0x09, 0x7e, 0xb3, 0x04, 0xe3, 0x57, 0xd6, 0xd7, 0xeb, 0x97, 0x49, - 0x22, 0x24, 0x62, 0x6f, 0x27, 0x11, 0xd6, 0xec, 0xdc, 0x6e, 0xaa, 0x4c, 0x3b, 0xf1, 0xfc, 0x39, - 0x7e, 0xed, 0x60, 0x6e, 0x35, 0x48, 0x6e, 0x44, 0x8d, 0x24, 0xf2, 0x82, 0xcd, 0x5c, 0xcb, 0x58, - 0xca, 0xed, 0x72, 0x91, 0xdc, 0x46, 0xcf, 0xc1, 0x10, 0xbb, 0xf7, 0x20, 0x95, 0x8a, 0x07, 0x95, - 0x26, 0xc0, 0xa0, 0x87, 0xfb, 0xb3, 0x95, 0x9b, 0x78, 0x95, 0xff, 0xc1, 0x82, 0x14, 0xdd, 0x84, - 0xd1, 0xad, 0x24, 0x69, 0x5d, 0x21, 0x8e, 0x4b, 0x22, 0x29, 0x1d, 0xce, 0xe7, 0x49, 0x07, 0xda, - 0x09, 0x9c, 0x2c, 0x5d, 0x50, 0x29, 0x2c, 0xc6, 0x3a, 0x1f, 0xbb, 0x01, 0x90, 0xe2, 0x8e, 0xc9, - 0x2a, 0xb0, 0x7f, 0x68, 0xc1, 0xf0, 0x15, 0x27, 0x70, 0x7d, 0x12, 0xa1, 0x97, 0x61, 0x80, 0xdc, - 0x25, 0x4d, 0xb1, 0x41, 0xe7, 0x36, 0x38, 0xdd, 0xc4, 0xb8, 0x9f, 0x8b, 0xfe, 0xc7, 0xac, 0x14, - 0xba, 0x02, 0xc3, 0xb4, 0xb5, 0x97, 0x55, 0x14, 0xf2, 0x23, 0x45, 0x5f, 0xac, 0x86, 0x9d, 0xef, - 0x7b, 0x02, 0x84, 0x65, 0x71, 0xe6, 0xaf, 0x69, 0xb6, 0x1a, 0x54, 0x80, 0x25, 0xdd, 0xac, 0xa9, - 0xf5, 0xa5, 0x3a, 0x27, 0x12, 0xdc, 0xb8, 0xbf, 0x46, 0x02, 0x71, 0xca, 0xc4, 0x5e, 0x87, 0x0a, - 0x1d, 0xd4, 0x05, 0xdf, 0x73, 0xba, 0xbb, 0x8a, 0x9e, 0x82, 0x8a, 0x74, 0xdb, 0xc4, 0x22, 0x90, - 0x99, 0x71, 0x95, 0x5e, 0x9d, 0x18, 0xa7, 0x78, 0xfb, 0x45, 0x38, 0xcd, 0xce, 0x41, 0x9d, 0x64, - 0xcb, 0x58, 0x63, 0x3d, 0x27, 0xb3, 0xfd, 0x8d, 0x01, 0x98, 0x5e, 0x6d, 0x2c, 0x35, 0x4c, 0x6f, - 0xe0, 0x8b, 0x30, 0xc6, 0xb7, 0x6e, 0x3a, 0x45, 0x1d, 0x5f, 0x94, 0x57, 0xde, 0xfe, 0x75, 0x0d, - 0x87, 0x0d, 0x4a, 0xf4, 0x30, 0x94, 0xbd, 0x77, 0x82, 0x6c, 0xfc, 0xda, 0xea, 0x6b, 0xd7, 0x31, - 0x85, 0x53, 0x34, 0xd5, 0x02, 0xb8, 0x48, 0x54, 0x68, 0xa5, 0x09, 0xbc, 0x02, 0x13, 0x5e, 0xdc, - 0x8c, 0xbd, 0xd5, 0x80, 0xca, 0x0b, 0xa7, 0x29, 0x27, 0x7b, 0xaa, 0xa2, 0xd3, 0xa6, 0x2a, 0x2c, - 0xce, 0x50, 0x6b, 0xf2, 0x79, 0xb0, 0x6f, 0x4d, 0xa2, 0x67, 0x90, 0x33, 0x55, 0x92, 0x5a, 0xec, - 0xeb, 0x62, 0x16, 0x4b, 0x23, 0x94, 0x24, 0xfe, 0xc1, 0x31, 0x96, 0x38, 0x74, 0x19, 0xa6, 0x9b, - 0x5b, 0x4e, 0x6b, 0xa1, 0x9d, 0x6c, 0xd5, 0xbc, 0xb8, 0x19, 0xee, 0x92, 0x68, 0x8f, 0xa9, 0xae, - 0x23, 0xa9, 0x57, 0x48, 0x21, 0x96, 0xae, 0x2c, 0xd4, 0x29, 0x25, 0xee, 0x2c, 0x63, 0x2a, 0x15, - 0x70, 0x6c, 0x4a, 0xc5, 0x02, 0x4c, 0xca, 0xba, 0x1a, 0x24, 0x66, 0x02, 0x7f, 0x94, 0xb5, 0x4e, - 0x5d, 0x20, 0x11, 0x60, 0xd5, 0xb6, 0x2c, 0xbd, 0xfd, 0x36, 0x54, 0x54, 0x9c, 0x97, 0x0c, 0x55, - 0xb4, 0x0a, 0x42, 0x15, 0x7b, 0x8b, 0x6a, 0xe9, 0xad, 0x2e, 0xe7, 0x7a, 0xab, 0xff, 0x86, 0x05, - 0x69, 0xb8, 0x0b, 0xba, 0x02, 0x95, 0x56, 0xc8, 0x4e, 0xac, 0x22, 0x79, 0x0c, 0xfc, 0x60, 0xee, - 0xaa, 0xe6, 0x12, 0x84, 0x77, 0x43, 0x5d, 0x96, 0xc0, 0x69, 0x61, 0xb4, 0x08, 0xc3, 0xad, 0x88, - 0x34, 0x12, 0x76, 0x3f, 0xa0, 0x27, 0x1f, 0x3e, 0xd4, 0x9c, 0x1e, 0xcb, 0x82, 0xf6, 0x6f, 0x5a, - 0x00, 0xdc, 0x19, 0xec, 0x04, 0x9b, 0xe4, 0x04, 0x0c, 0xdc, 0x1a, 0x0c, 0xc4, 0x2d, 0xd2, 0xec, - 0x76, 0x96, 0x98, 0xb6, 0xa7, 0xd1, 0x22, 0xcd, 0xb4, 0xc3, 0xe9, 0x3f, 0xcc, 0x4a, 0xdb, 0x3f, - 0x07, 0x30, 0x91, 0x92, 0x51, 0xc3, 0x03, 0x3d, 0x63, 0x84, 0xc3, 0x9f, 0xcb, 0x84, 0xc3, 0x57, - 0x18, 0xb5, 0x16, 0x01, 0xff, 0x36, 0x94, 0x77, 0x9c, 0xbb, 0xc2, 0xba, 0x79, 0xaa, 0x7b, 0x33, - 0x28, 0xff, 0xb9, 0x35, 0xe7, 0x2e, 0x57, 0x30, 0x9f, 0x92, 0x13, 0x64, 0xcd, 0xb9, 0x7b, 0xc8, - 0x4f, 0x0c, 0x99, 0xac, 0xa1, 0x46, 0xd4, 0x17, 0xff, 0x38, 0xfd, 0xcf, 0xb6, 0x0d, 0x5a, 0x09, - 0xab, 0xcb, 0x0b, 0x84, 0x6b, 0xb4, 0xaf, 0xba, 0xbc, 0x20, 0x5b, 0x97, 0x17, 0xf4, 0x51, 0x97, - 0x17, 0xa0, 0x77, 0x61, 0x58, 0x1c, 0x45, 0xb0, 0x38, 0xbe, 0xd1, 0x4b, 0xf3, 0x7d, 0xd4, 0x27, - 0x4e, 0x32, 0x78, 0x9d, 0xf3, 0x52, 0x81, 0x16, 0xd0, 0x9e, 0xf5, 0xca, 0x0a, 0xd1, 0x5f, 0xb3, - 0x60, 0x42, 0xfc, 0xc6, 0xe4, 0x9d, 0x36, 0x89, 0x13, 0xb1, 0x51, 0x7f, 0xac, 0xff, 0x36, 0x88, - 0x82, 0xbc, 0x29, 0x1f, 0x93, 0xd2, 0xd2, 0x44, 0xf6, 0x6c, 0x51, 0xa6, 0x15, 0xe8, 0x1f, 0x59, - 0x70, 0x7a, 0xc7, 0xb9, 0xcb, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, 0xe2, 0x12, 0x5f, 0xee, - 0x6f, 0xf8, 0x3b, 0x8a, 0xf3, 0x46, 0xca, 0x10, 0xa6, 0xd3, 0x79, 0x24, 0x3d, 0x9b, 0x9a, 0xdb, - 0xae, 0x99, 0x0d, 0x18, 0x91, 0xf3, 0x2d, 0xc7, 0x4c, 0xa9, 0xe9, 0x5a, 0xc8, 0x91, 0x4f, 0x82, - 0x34, 0xb3, 0x86, 0xd5, 0x23, 0xe6, 0xda, 0x7d, 0xad, 0xe7, 0x6d, 0x18, 0xd3, 0xe7, 0xd8, 0x7d, - 0xad, 0xeb, 0x1d, 0x38, 0x95, 0x33, 0x97, 0xee, 0x6b, 0x95, 0x77, 0xe0, 0x5c, 0xe1, 0xfc, 0xb8, - 0x9f, 0x15, 0xdb, 0xdf, 0xb4, 0x74, 0x39, 0x78, 0x02, 0x6e, 0xa1, 0x25, 0xd3, 0x2d, 0x74, 0xbe, - 0xfb, 0xca, 0x29, 0xf0, 0x0d, 0xbd, 0xa9, 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x2a, 0x0c, 0xf9, 0x14, - 0x22, 0xcf, 0xbf, 0xec, 0xde, 0x2b, 0x32, 0x55, 0x89, 0x18, 0x3c, 0xc6, 0x82, 0x83, 0xfd, 0x3b, - 0x16, 0x0c, 0x9c, 0x40, 0x4f, 0x60, 0xb3, 0x27, 0x9e, 0x29, 0x64, 0x2d, 0x2e, 0x7b, 0xcf, 0x61, - 0xe7, 0xce, 0xf2, 0xdd, 0x84, 0x04, 0x31, 0xd3, 0xab, 0x73, 0x3b, 0xe6, 0xff, 0x96, 0x60, 0x94, - 0x56, 0x25, 0x83, 0x35, 0x5e, 0x82, 0x71, 0xdf, 0xb9, 0x4d, 0x7c, 0xe9, 0xaa, 0xce, 0x5a, 0x97, - 0xd7, 0x74, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x0d, 0xdd, 0x6b, 0x2f, 0xf4, 0x17, 0x55, 0xd8, 0x70, - 0xe9, 0x63, 0x93, 0x96, 0x1a, 0x3a, 0x77, 0x9c, 0xa4, 0xb9, 0x25, 0x2c, 0x4f, 0xd5, 0xdc, 0xd7, - 0x29, 0x10, 0x73, 0x1c, 0xd5, 0xc3, 0xe4, 0xec, 0xbc, 0x45, 0x22, 0xa6, 0x87, 0x71, 0x2d, 0x57, - 0xe9, 0x61, 0xd8, 0x44, 0xe3, 0x2c, 0x3d, 0xfa, 0x24, 0x4c, 0xd0, 0xce, 0x09, 0xdb, 0x89, 0x0c, - 0x45, 0x19, 0x64, 0xa1, 0x28, 0x2c, 0xf2, 0x78, 0xdd, 0xc0, 0xe0, 0x0c, 0x25, 0xaa, 0xc3, 0x69, - 0x2f, 0x68, 0xfa, 0x6d, 0x97, 0xdc, 0x0c, 0xbc, 0xc0, 0x4b, 0x3c, 0xc7, 0xf7, 0xde, 0x25, 0xae, - 0xd0, 0x83, 0x55, 0xd4, 0xd0, 0x6a, 0x0e, 0x0d, 0xce, 0x2d, 0x69, 0xff, 0x0c, 0x9c, 0xba, 0x16, - 0x3a, 0xee, 0xa2, 0xe3, 0x3b, 0x41, 0x93, 0x44, 0xab, 0xc1, 0x66, 0xcf, 0x83, 0x70, 0xfd, 0xd8, - 0xba, 0xd4, 0xeb, 0xd8, 0xda, 0xde, 0x02, 0xa4, 0x57, 0x20, 0x42, 0xb0, 0x30, 0x0c, 0x7b, 0xbc, - 0x2a, 0x31, 0xfd, 0x1f, 0xcf, 0x57, 0x92, 0x3b, 0x5a, 0xa6, 0x05, 0x17, 0x71, 0x00, 0x96, 0x8c, - 0xa8, 0x21, 0x95, 0xa7, 0x55, 0xf7, 0xb6, 0x71, 0xed, 0x17, 0x60, 0x9a, 0x95, 0x3c, 0xa2, 0xfd, - 0xf5, 0x97, 0x2d, 0x98, 0xbc, 0x9e, 0xb9, 0x7b, 0xfa, 0x18, 0x0c, 0xc5, 0x24, 0xca, 0x71, 0x52, - 0x36, 0x18, 0x14, 0x0b, 0xec, 0xb1, 0x3b, 0x43, 0x7e, 0x64, 0x41, 0x85, 0xc5, 0xf6, 0xb6, 0xa8, - 0x2d, 0x75, 0xff, 0x95, 0xda, 0x25, 0x43, 0xa9, 0xcd, 0x35, 0xd2, 0x55, 0x73, 0x8a, 0x74, 0x5a, - 0x74, 0x55, 0xdd, 0xc9, 0xec, 0x62, 0x9f, 0xa7, 0x6c, 0xf8, 0x0d, 0xbe, 0x09, 0xf3, 0xe2, 0xa6, - 0xbc, 0xa5, 0xc9, 0x4e, 0xa2, 0x15, 0xed, 0x07, 0xe4, 0x24, 0x5a, 0xb5, 0xa7, 0x40, 0xfa, 0xd5, - 0xb5, 0x26, 0xb3, 0x5d, 0xe1, 0xd3, 0x2c, 0x62, 0x93, 0xad, 0x4d, 0x75, 0x79, 0x79, 0x56, 0x44, - 0x60, 0x0a, 0xe8, 0x21, 0x13, 0x64, 0xe2, 0x1f, 0xbf, 0x91, 0x9e, 0x16, 0xb1, 0xaf, 0xc0, 0x64, - 0xa6, 0xc3, 0xd0, 0x0b, 0x30, 0xd8, 0xda, 0x72, 0x62, 0x92, 0x89, 0xc0, 0x19, 0xac, 0x53, 0xe0, - 0xe1, 0xfe, 0xec, 0x84, 0x2a, 0xc0, 0x20, 0x98, 0x53, 0xdb, 0xff, 0xcd, 0x82, 0x81, 0xeb, 0xa1, - 0x7b, 0x12, 0x93, 0xe9, 0x15, 0x63, 0x32, 0x3d, 0x54, 0x94, 0xd9, 0xa2, 0x70, 0x1e, 0xad, 0x64, - 0xe6, 0xd1, 0xf9, 0x42, 0x0e, 0xdd, 0xa7, 0xd0, 0x0e, 0x8c, 0xb2, 0x7c, 0x19, 0x22, 0x1a, 0xe8, - 0x39, 0xc3, 0xbe, 0x9a, 0xcd, 0xd8, 0x57, 0x93, 0x1a, 0xa9, 0x66, 0x65, 0x3d, 0x01, 0xc3, 0x22, - 0x22, 0x25, 0x1b, 0x9b, 0x2a, 0x68, 0xb1, 0xc4, 0xdb, 0xbf, 0x52, 0x06, 0x23, 0x3f, 0x07, 0xfa, - 0x3d, 0x0b, 0xe6, 0x22, 0x7e, 0x1b, 0xc7, 0xad, 0xb5, 0x23, 0x2f, 0xd8, 0x6c, 0x34, 0xb7, 0x88, - 0xdb, 0xf6, 0xbd, 0x60, 0x73, 0x75, 0x33, 0x08, 0x15, 0x78, 0xf9, 0x2e, 0x69, 0xb6, 0x99, 0x83, - 0xba, 0x47, 0x32, 0x10, 0x75, 0xe2, 0x7b, 0xe9, 0x60, 0x7f, 0x76, 0x0e, 0x1f, 0x89, 0x37, 0x3e, - 0x62, 0x5b, 0xd0, 0x1f, 0x58, 0x30, 0xcf, 0xd3, 0x56, 0xf4, 0xdf, 0xfe, 0x2e, 0xd6, 0x68, 0x5d, - 0xb2, 0x4a, 0x99, 0xac, 0x93, 0x68, 0x67, 0xf1, 0xe3, 0xa2, 0x43, 0xe7, 0xeb, 0x47, 0xab, 0x0b, - 0x1f, 0xb5, 0x71, 0xf6, 0xbf, 0x28, 0xc3, 0x38, 0xed, 0xc5, 0xf4, 0x06, 0xfa, 0x0b, 0xc6, 0x94, - 0x78, 0x24, 0x33, 0x25, 0xa6, 0x0d, 0xe2, 0xe3, 0xb9, 0x7c, 0x1e, 0xc3, 0xb4, 0xef, 0xc4, 0xc9, - 0x15, 0xe2, 0x44, 0xc9, 0x6d, 0xe2, 0xb0, 0x23, 0x56, 0x31, 0xcd, 0x8f, 0x72, 0x6a, 0xab, 0xbc, - 0x58, 0xd7, 0xb2, 0xcc, 0x70, 0x27, 0x7f, 0xb4, 0x0b, 0x88, 0x1d, 0xe7, 0x46, 0x4e, 0x10, 0xf3, - 0x6f, 0xf1, 0x84, 0xf3, 0xfa, 0x68, 0xb5, 0xce, 0x88, 0x5a, 0xd1, 0xb5, 0x0e, 0x6e, 0x38, 0xa7, - 0x06, 0xed, 0x98, 0x7e, 0xb0, 0xdf, 0x63, 0xfa, 0xa1, 0x1e, 0x01, 0xe0, 0x3f, 0x0b, 0xa7, 0xe8, - 0xa8, 0x98, 0xf1, 0xc3, 0x31, 0x22, 0x30, 0xb9, 0xdd, 0xbe, 0x4d, 0x7c, 0x92, 0x48, 0x98, 0x58, - 0x4a, 0xb9, 0x7a, 0xb8, 0x59, 0x3a, 0x55, 0xf6, 0xae, 0x9a, 0x2c, 0x70, 0x96, 0xa7, 0xfd, 0xab, - 0x16, 0xb0, 0x08, 0xbd, 0x13, 0xd8, 0x8f, 0x3e, 0x65, 0xee, 0x47, 0xd5, 0x22, 0x91, 0x50, 0xb0, - 0x15, 0x3d, 0x0f, 0x53, 0x14, 0x5b, 0x8f, 0xc2, 0xbb, 0x7b, 0x52, 0x19, 0xef, 0xad, 0x02, 0xfd, - 0x1f, 0x8b, 0xaf, 0x10, 0x75, 0x5b, 0x10, 0x7d, 0x01, 0x46, 0x9a, 0x4e, 0xcb, 0x69, 0xf2, 0x4c, - 0x45, 0x85, 0xee, 0x18, 0xa3, 0xd0, 0xdc, 0x92, 0x28, 0xc1, 0xdd, 0x0b, 0x1f, 0x95, 0x5f, 0x29, - 0xc1, 0x3d, 0x5d, 0x0a, 0xaa, 0xca, 0x99, 0x6d, 0x18, 0x37, 0x98, 0xdd, 0x57, 0x5b, 0xf4, 0x0b, - 0x5c, 0x7e, 0x2b, 0x13, 0x62, 0x07, 0xa6, 0x03, 0xed, 0x3f, 0x95, 0x56, 0x52, 0xbf, 0xfd, 0x70, - 0x2f, 0x09, 0xcd, 0x44, 0x9b, 0x16, 0x81, 0x98, 0x61, 0x83, 0x3b, 0x39, 0xdb, 0x7f, 0xdb, 0x82, - 0x07, 0x74, 0x42, 0xed, 0x22, 0x67, 0x2f, 0x07, 0x6f, 0x0d, 0x46, 0xc2, 0x16, 0x89, 0x9c, 0xd4, - 0x48, 0xba, 0x28, 0x3b, 0xfd, 0x86, 0x80, 0x1f, 0xee, 0xcf, 0x9e, 0xd6, 0xb9, 0x4b, 0x38, 0x56, - 0x25, 0x91, 0x0d, 0x43, 0xac, 0x33, 0x62, 0x71, 0xc9, 0x96, 0x65, 0xf3, 0x61, 0x07, 0x43, 0x31, - 0x16, 0x18, 0xfb, 0xe7, 0x2c, 0x3e, 0xb1, 0xf4, 0xa6, 0xa3, 0x77, 0x60, 0x6a, 0x87, 0xda, 0x53, - 0xcb, 0x77, 0x5b, 0x11, 0x77, 0x4f, 0xcb, 0x7e, 0x7a, 0xaa, 0x57, 0x3f, 0x69, 0x1f, 0xb9, 0x58, - 0x15, 0x6d, 0x9e, 0x5a, 0xcb, 0x30, 0xc3, 0x1d, 0xec, 0xed, 0xbf, 0x59, 0xe2, 0x2b, 0x91, 0xa9, - 0x59, 0x4f, 0xc0, 0x70, 0x2b, 0x74, 0x97, 0x56, 0x6b, 0x58, 0xf4, 0x90, 0x92, 0x1f, 0x75, 0x0e, - 0xc6, 0x12, 0x8f, 0x2e, 0x01, 0x90, 0xbb, 0x09, 0x89, 0x02, 0xc7, 0x57, 0xc7, 0xd6, 0x4a, 0x9b, - 0x59, 0x56, 0x18, 0xac, 0x51, 0xd1, 0x32, 0xad, 0x28, 0xdc, 0xf5, 0x5c, 0x76, 0xcb, 0xa1, 0x6c, - 0x96, 0xa9, 0x2b, 0x0c, 0xd6, 0xa8, 0xa8, 0xed, 0xda, 0x0e, 0x62, 0xbe, 0x23, 0x39, 0xb7, 0x45, - 0x26, 0x99, 0x91, 0xd4, 0x76, 0xbd, 0xa9, 0x23, 0xb1, 0x49, 0x8b, 0x16, 0x60, 0x28, 0x71, 0xd8, - 0x61, 0xec, 0x60, 0x71, 0xec, 0xca, 0x3a, 0xa5, 0xd0, 0x13, 0xf6, 0xd0, 0x02, 0x58, 0x14, 0xb4, - 0xbf, 0x54, 0x01, 0x48, 0x55, 0x24, 0xf4, 0x6e, 0xc7, 0x32, 0x7e, 0xba, 0xbb, 0x52, 0x75, 0x7c, - 0x6b, 0x18, 0x7d, 0xd9, 0x82, 0x51, 0xc7, 0xf7, 0xc3, 0xa6, 0x93, 0xb0, 0x9e, 0x28, 0x75, 0x17, - 0x23, 0xa2, 0xfe, 0x85, 0xb4, 0x04, 0x6f, 0xc2, 0x73, 0xf2, 0x2c, 0x54, 0xc3, 0xf4, 0x6c, 0x85, - 0x5e, 0x31, 0xfa, 0xa8, 0xd4, 0x9c, 0xf9, 0x10, 0xce, 0x64, 0x35, 0xe7, 0x0a, 0x93, 0x98, 0x9a, - 0xd2, 0x8c, 0x6e, 0x1a, 0x49, 0x56, 0x06, 0x8a, 0xef, 0x93, 0x1a, 0x9a, 0x42, 0xaf, 0xfc, 0x2a, - 0xa8, 0xae, 0xc7, 0x4b, 0x0f, 0x16, 0x5f, 0xba, 0xd6, 0x54, 0xd2, 0x1e, 0xb1, 0xd2, 0x6f, 0xc3, - 0xa4, 0x6b, 0x6e, 0x89, 0x22, 0xea, 0xec, 0xf1, 0x22, 0xbe, 0x99, 0x1d, 0x34, 0xdd, 0x04, 0x33, - 0x08, 0x9c, 0x65, 0x8c, 0xea, 0x3c, 0x72, 0x7d, 0x35, 0xd8, 0x08, 0x45, 0xbc, 0x99, 0x5d, 0x38, - 0x96, 0x7b, 0x71, 0x42, 0x76, 0x28, 0x65, 0xba, 0xd7, 0x5d, 0x17, 0x65, 0xb1, 0xe2, 0x82, 0x5e, - 0x85, 0x21, 0x76, 0xa5, 0x28, 0xae, 0x8e, 0x14, 0x3b, 0xcf, 0xcc, 0xdb, 0xb0, 0xe9, 0xc4, 0x67, - 0x7f, 0x63, 0x2c, 0x38, 0xa0, 0x2b, 0xf2, 0x4e, 0x7b, 0xbc, 0x1a, 0xdc, 0x8c, 0x09, 0xbb, 0xd3, - 0x5e, 0x59, 0xfc, 0x70, 0x7a, 0x5d, 0x9d, 0xc3, 0x73, 0x13, 0xc9, 0x19, 0x25, 0xa9, 0x4e, 0x21, - 0xfe, 0xcb, 0xfc, 0x74, 0x55, 0x28, 0x6e, 0x9e, 0x99, 0xc3, 0x2e, 0xed, 0xce, 0x5b, 0x26, 0x0b, - 0x9c, 0xe5, 0x79, 0xa2, 0x5b, 0xdc, 0x4c, 0x00, 0x53, 0xd9, 0x85, 0x75, 0x5f, 0xb7, 0xd4, 0x1f, - 0x0e, 0xc0, 0x84, 0x39, 0x11, 0xd0, 0x3c, 0x54, 0x04, 0x13, 0x95, 0x91, 0x4a, 0xcd, 0xed, 0x35, - 0x89, 0xc0, 0x29, 0x0d, 0xcb, 0xc8, 0xc5, 0x8a, 0x6b, 0x91, 0x46, 0x69, 0x46, 0x2e, 0x85, 0xc1, - 0x1a, 0x15, 0xd5, 0x3c, 0x6f, 0x87, 0x61, 0xa2, 0xc4, 0xb5, 0x9a, 0x2d, 0x8b, 0x0c, 0x8a, 0x05, - 0x96, 0x8a, 0xe9, 0x6d, 0x12, 0x05, 0xc4, 0x37, 0xdd, 0x7f, 0x4a, 0x4c, 0x5f, 0xd5, 0x91, 0xd8, - 0xa4, 0xa5, 0xdb, 0x4e, 0x18, 0xb3, 0xe9, 0x27, 0xf4, 0xdb, 0x34, 0x72, 0xab, 0xc1, 0xaf, 0xd4, - 0x49, 0x3c, 0xfa, 0x2c, 0x3c, 0xa0, 0x6e, 0xc0, 0x61, 0xee, 0x4e, 0x95, 0x35, 0x0e, 0x19, 0xe6, - 0xe8, 0x03, 0x4b, 0xf9, 0x64, 0xb8, 0xa8, 0x3c, 0x7a, 0x05, 0x26, 0x84, 0x9a, 0x2a, 0x39, 0x0e, - 0x9b, 0x07, 0xf5, 0x57, 0x0d, 0x2c, 0xce, 0x50, 0xa3, 0x1a, 0x4c, 0x51, 0x08, 0xd3, 0x14, 0x25, - 0x07, 0x7e, 0x93, 0x4f, 0xed, 0xc7, 0x57, 0x33, 0x78, 0xdc, 0x51, 0x02, 0x2d, 0xc0, 0x24, 0xd7, - 0x23, 0xa8, 0x21, 0xc6, 0xc6, 0x41, 0x84, 0x81, 0xaa, 0x85, 0x70, 0xc3, 0x44, 0xe3, 0x2c, 0x3d, - 0x7a, 0x11, 0xc6, 0x9c, 0xa8, 0xb9, 0xe5, 0x25, 0xa4, 0x99, 0xb4, 0x23, 0x9e, 0x31, 0x42, 0x8b, - 0x74, 0x58, 0xd0, 0x70, 0xd8, 0xa0, 0xb4, 0xdf, 0x85, 0x53, 0x39, 0x11, 0xe4, 0x74, 0xe2, 0x38, - 0x2d, 0x4f, 0x7e, 0x53, 0x26, 0x06, 0x6b, 0xa1, 0xbe, 0x2a, 0xbf, 0x46, 0xa3, 0xa2, 0xb3, 0x93, - 0xf9, 0x91, 0xb5, 0x24, 0x92, 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0xef, 0x02, 0x68, - 0x5e, 0x90, 0x3e, 0x22, 0x70, 0x5e, 0x84, 0x31, 0x99, 0xf9, 0x54, 0xcb, 0x33, 0xa8, 0x3e, 0xf3, - 0xb2, 0x86, 0xc3, 0x06, 0x25, 0x6d, 0x5b, 0x20, 0x7d, 0x3b, 0xd9, 0x88, 0x2f, 0xe5, 0xf4, 0xc1, - 0x29, 0x0d, 0x7a, 0x1a, 0x46, 0x62, 0xe2, 0x6f, 0x5c, 0xf3, 0x82, 0x6d, 0x31, 0xb1, 0x95, 0x14, - 0x6e, 0x08, 0x38, 0x56, 0x14, 0x68, 0x11, 0xca, 0x6d, 0xcf, 0x15, 0x53, 0x59, 0x6e, 0xf8, 0xe5, - 0x9b, 0xab, 0xb5, 0xc3, 0xfd, 0xd9, 0x47, 0x8a, 0x12, 0xba, 0x52, 0x7b, 0x38, 0x9e, 0xa3, 0xcb, - 0x8f, 0x16, 0xce, 0x73, 0xa8, 0x0f, 0x1d, 0xd1, 0xa1, 0x7e, 0x09, 0x40, 0x7c, 0xb5, 0x9c, 0xcb, - 0xe5, 0x74, 0xd4, 0x2e, 0x2b, 0x0c, 0xd6, 0xa8, 0xa8, 0x55, 0xdd, 0x8c, 0x88, 0x23, 0x0d, 0x4f, - 0x1e, 0x0b, 0x3d, 0x72, 0xef, 0x56, 0xf5, 0x52, 0x96, 0x19, 0xee, 0xe4, 0x8f, 0x42, 0x98, 0x76, - 0xc5, 0x85, 0xcb, 0xb4, 0xd2, 0xca, 0xd1, 0x03, 0xb0, 0x59, 0x30, 0x4a, 0x96, 0x11, 0xee, 0xe4, - 0x8d, 0xde, 0x82, 0x19, 0x09, 0xec, 0xbc, 0xe3, 0xca, 0x96, 0x4b, 0x79, 0xf1, 0xfc, 0xc1, 0xfe, - 0xec, 0x4c, 0xad, 0x90, 0x0a, 0x77, 0xe1, 0x80, 0x30, 0x0c, 0xb1, 0x03, 0x98, 0xb8, 0x3a, 0xca, - 0xf6, 0xb9, 0x27, 0x8b, 0x43, 0xf6, 0xe9, 0x5c, 0x9f, 0x63, 0x87, 0x37, 0x22, 0x68, 0x35, 0x3d, - 0xcb, 0x62, 0x40, 0x2c, 0x38, 0xa1, 0x0d, 0x18, 0x75, 0x82, 0x20, 0x4c, 0x1c, 0xae, 0x42, 0x8d, - 0x15, 0xeb, 0x7e, 0x1a, 0xe3, 0x85, 0xb4, 0x04, 0xe7, 0xae, 0xe2, 0xe0, 0x34, 0x0c, 0xd6, 0x19, - 0xa3, 0x3b, 0x30, 0x19, 0xde, 0xa1, 0xc2, 0x51, 0x9e, 0x13, 0xc4, 0xd5, 0x71, 0x56, 0xd7, 0xf3, - 0x7d, 0x3a, 0x37, 0x8d, 0xc2, 0x9a, 0xd4, 0x32, 0x99, 0xe2, 0x6c, 0x2d, 0x68, 0xce, 0x70, 0xf1, - 0x4e, 0xa4, 0xc1, 0xd7, 0xa9, 0x8b, 0x57, 0xf7, 0xe8, 0xb2, 0x3b, 0xd3, 0x3c, 0x08, 0x93, 0xad, - 0xfe, 0xc9, 0xcc, 0x9d, 0xe9, 0x14, 0x85, 0x75, 0x3a, 0xb4, 0x05, 0x63, 0xe9, 0x39, 0x4f, 0x14, - 0xb3, 0x94, 0x2a, 0xa3, 0x97, 0x2e, 0xf5, 0xf7, 0x71, 0xab, 0x5a, 0x49, 0x7e, 0x59, 0x44, 0x87, - 0x60, 0x83, 0xf3, 0xcc, 0x27, 0x60, 0x54, 0x1b, 0xd8, 0xa3, 0xc4, 0x18, 0xcf, 0xbc, 0x02, 0x53, - 0xd9, 0xa1, 0x3b, 0x52, 0x8c, 0xf2, 0xff, 0x28, 0xc1, 0x64, 0xce, 0x71, 0x0f, 0x4b, 0x0a, 0x9b, - 0x11, 0xa8, 0x69, 0x0e, 0x58, 0x53, 0x2c, 0x96, 0xfa, 0x10, 0x8b, 0x52, 0x46, 0x97, 0x0b, 0x65, - 0xb4, 0x10, 0x85, 0x03, 0xef, 0x45, 0x14, 0x9a, 0xbb, 0xcf, 0x60, 0x5f, 0xbb, 0xcf, 0x31, 0x88, - 0x4f, 0x63, 0x03, 0x1b, 0xee, 0x63, 0x03, 0xfb, 0xc5, 0x12, 0x4c, 0xa5, 0xf1, 0xd8, 0x22, 0x05, - 0xf3, 0xfd, 0x3f, 0x24, 0x78, 0xd5, 0x38, 0x24, 0xc8, 0x4f, 0xb1, 0x9c, 0x69, 0x55, 0xe1, 0x81, - 0x01, 0xce, 0x1c, 0x18, 0x3c, 0xd9, 0x17, 0xb7, 0xee, 0x87, 0x07, 0x7f, 0xa7, 0x04, 0x67, 0xb2, - 0x45, 0x96, 0x7c, 0xc7, 0xdb, 0x39, 0x81, 0xbe, 0xb9, 0x61, 0xf4, 0xcd, 0x33, 0xfd, 0x7c, 0x0d, - 0x6b, 0x5a, 0x61, 0x07, 0xbd, 0x9e, 0xe9, 0xa0, 0xf9, 0xfe, 0x59, 0x76, 0xef, 0xa5, 0xef, 0x5a, - 0x70, 0x2e, 0xb7, 0xdc, 0x09, 0x78, 0x48, 0xaf, 0x9b, 0x1e, 0xd2, 0x27, 0xfa, 0xfe, 0xa6, 0x02, - 0x97, 0xe9, 0xd7, 0xca, 0x05, 0xdf, 0xc2, 0x7c, 0x4c, 0x37, 0x60, 0xd4, 0x69, 0x36, 0x49, 0x1c, - 0xaf, 0x85, 0xae, 0xca, 0xc1, 0xf4, 0x0c, 0xdb, 0x93, 0x52, 0xf0, 0xe1, 0xfe, 0xec, 0x4c, 0x96, - 0x45, 0x8a, 0xc6, 0x3a, 0x07, 0x33, 0xaf, 0x5b, 0xe9, 0x58, 0xf3, 0xba, 0x5d, 0x02, 0xd8, 0x55, - 0x56, 0x6d, 0xd6, 0x61, 0xa5, 0xd9, 0xbb, 0x1a, 0x15, 0xfa, 0x69, 0xa6, 0x2b, 0xf2, 0x38, 0x0b, - 0x7e, 0x32, 0xf0, 0x5c, 0x9f, 0x63, 0xa5, 0xc7, 0x6c, 0xf0, 0x5b, 0x9b, 0xca, 0xb9, 0xa7, 0x58, - 0xa2, 0xcf, 0xc0, 0x54, 0xcc, 0x13, 0x03, 0x2c, 0xf9, 0x4e, 0xcc, 0x2e, 0x13, 0x08, 0x99, 0xc8, - 0xae, 0x62, 0x36, 0x32, 0x38, 0xdc, 0x41, 0x6d, 0xff, 0x83, 0x32, 0x3c, 0xd8, 0x65, 0x8a, 0xa2, - 0x05, 0xf3, 0x5c, 0xf4, 0xa9, 0xac, 0x77, 0x67, 0x26, 0xb7, 0xb0, 0xe1, 0xee, 0xc9, 0x8c, 0x71, - 0xe9, 0x3d, 0x8f, 0xf1, 0x57, 0x2c, 0xcd, 0xef, 0xc6, 0xa3, 0x27, 0x3f, 0x75, 0xc4, 0xa5, 0xf7, - 0xe3, 0xea, 0x4c, 0xff, 0xa2, 0x05, 0x8f, 0xe4, 0x7e, 0x96, 0x11, 0x5f, 0x31, 0x0f, 0x95, 0x26, - 0x05, 0x6a, 0x17, 0x7e, 0xd2, 0x5b, 0x75, 0x12, 0x81, 0x53, 0x1a, 0x23, 0x8c, 0xa2, 0xd4, 0x33, - 0x8c, 0xe2, 0x9f, 0x59, 0x70, 0x3a, 0xdb, 0x88, 0x13, 0x90, 0x4c, 0xab, 0xa6, 0x64, 0xfa, 0x70, - 0x3f, 0x43, 0x5e, 0x20, 0x94, 0xfe, 0xdd, 0x04, 0x9c, 0xed, 0xd8, 0xb9, 0x78, 0xdf, 0xed, 0xc2, - 0xf4, 0x26, 0x53, 0xe1, 0xb5, 0xab, 0x54, 0xe2, 0x63, 0x72, 0x6f, 0x9d, 0x75, 0xbd, 0x77, 0xc5, - 0xcd, 0x90, 0x0e, 0x12, 0xdc, 0x59, 0x05, 0xfa, 0xa2, 0x05, 0xa7, 0x9d, 0x3b, 0x71, 0xc7, 0x3b, - 0x1d, 0x62, 0xce, 0x3c, 0x9f, 0xeb, 0x1d, 0xeb, 0xf1, 0xae, 0xc7, 0x62, 0xf5, 0x60, 0x7f, 0xf6, - 0x74, 0x1e, 0x15, 0xce, 0xad, 0x0b, 0x61, 0x91, 0x86, 0x8e, 0x6a, 0x39, 0x5d, 0x2e, 0xfb, 0xe5, - 0x5d, 0xc5, 0xe0, 0x32, 0x4a, 0x62, 0xb0, 0xe2, 0x83, 0x6e, 0x41, 0x65, 0x53, 0xde, 0x8f, 0x12, - 0x32, 0x30, 0x77, 0x53, 0xc9, 0xbd, 0x44, 0xc5, 0xc3, 0xdc, 0x15, 0x0a, 0xa7, 0xac, 0xd0, 0x2b, - 0x50, 0x0e, 0x36, 0x62, 0x71, 0xaf, 0x38, 0x3f, 0x28, 0xc6, 0x0c, 0x3b, 0xe2, 0x97, 0x32, 0xaf, - 0xaf, 0x34, 0x30, 0x2d, 0x48, 0xcb, 0x47, 0xb7, 0x5d, 0xe1, 0xd0, 0xcd, 0x2d, 0x8f, 0x17, 0x6b, - 0x9d, 0xe5, 0xf1, 0x62, 0x0d, 0xd3, 0x82, 0x68, 0x05, 0x06, 0xd9, 0xe5, 0x0c, 0xe1, 0xad, 0xcd, - 0xbd, 0x54, 0xde, 0x71, 0xf1, 0x84, 0xe7, 0x17, 0x64, 0x60, 0xcc, 0x8b, 0xa3, 0x57, 0x61, 0xa8, - 0xc9, 0x12, 0xcc, 0x0b, 0xd3, 0x3a, 0x3f, 0x51, 0x42, 0x47, 0x0a, 0x7a, 0x7e, 0x8e, 0xc4, 0xe1, - 0x58, 0x70, 0x60, 0xbc, 0x48, 0x6b, 0x6b, 0x23, 0x16, 0x16, 0x73, 0x3e, 0xaf, 0x8e, 0xc7, 0x00, - 0x04, 0x2f, 0x06, 0xc7, 0x82, 0x03, 0xfa, 0x24, 0x94, 0x36, 0x9a, 0xe2, 0x76, 0x46, 0xae, 0x6f, - 0xd6, 0xbc, 0x2f, 0xbb, 0x38, 0x74, 0xb0, 0x3f, 0x5b, 0x5a, 0x59, 0xc2, 0xa5, 0x8d, 0x26, 0xba, - 0x0e, 0xc3, 0x1b, 0xfc, 0x56, 0xa4, 0x48, 0x26, 0xfa, 0x78, 0xfe, 0x85, 0xcd, 0x8e, 0x8b, 0x93, - 0xfc, 0x3a, 0x82, 0x40, 0x60, 0xc9, 0x04, 0xad, 0x03, 0x6c, 0xa8, 0xdb, 0x9d, 0x22, 0x9b, 0xe8, - 0x87, 0xfb, 0xb9, 0x03, 0x2a, 0x8c, 0x46, 0x05, 0xc5, 0x1a, 0x1f, 0x3a, 0x33, 0x1d, 0xf9, 0xca, - 0x05, 0xcb, 0x24, 0x5a, 0x30, 0x33, 0x73, 0x9f, 0xc2, 0xe0, 0x33, 0x53, 0xa1, 0x70, 0xca, 0x0a, - 0x6d, 0xc3, 0xf8, 0x6e, 0xdc, 0xda, 0x22, 0x72, 0x31, 0xb2, 0xa4, 0xa2, 0xa6, 0x59, 0x99, 0x66, - 0x80, 0x15, 0x84, 0x5e, 0x94, 0xb4, 0x1d, 0xbf, 0x43, 0x7e, 0xb0, 0xa4, 0x58, 0xb7, 0x74, 0x66, - 0xd8, 0xe4, 0x4d, 0xbb, 0xfa, 0x9d, 0x76, 0x78, 0x7b, 0x2f, 0x21, 0x22, 0xd5, 0x68, 0x6e, 0x57, - 0xbf, 0xc6, 0x49, 0x3a, 0xbb, 0x5a, 0x20, 0xb0, 0x64, 0xa2, 0x3a, 0x85, 0xc9, 0xbd, 0xa9, 0x1e, - 0x9d, 0xd2, 0xd1, 0xde, 0xb4, 0x53, 0x98, 0x9c, 0x4b, 0x59, 0x31, 0xf9, 0xd6, 0xda, 0x0a, 0x93, - 0x30, 0xc8, 0xc8, 0xd6, 0xe9, 0x62, 0xf9, 0x56, 0xcf, 0xa1, 0xef, 0x94, 0x6f, 0x79, 0x54, 0x38, - 0xb7, 0x2e, 0xe4, 0xc2, 0x44, 0x2b, 0x8c, 0x92, 0x3b, 0x61, 0x24, 0xe7, 0x12, 0xea, 0x62, 0x28, - 0x19, 0x94, 0xa2, 0x46, 0x16, 0x80, 0x6a, 0x62, 0x70, 0x86, 0x27, 0x1d, 0x92, 0xb8, 0xe9, 0xf8, - 0x64, 0xf5, 0x46, 0xf5, 0x54, 0xf1, 0x90, 0x34, 0x38, 0x49, 0xe7, 0x90, 0x08, 0x04, 0x96, 0x4c, - 0xa8, 0xa4, 0x61, 0x59, 0xab, 0x59, 0x6e, 0xd4, 0x02, 0x49, 0xd3, 0x11, 0x9a, 0xc9, 0x25, 0x0d, - 0x03, 0x63, 0x5e, 0x1c, 0x7d, 0x1e, 0x2a, 0x42, 0xff, 0x0b, 0xe3, 0xea, 0x99, 0x0e, 0x6d, 0x34, - 0x6d, 0x19, 0x27, 0xba, 0xd1, 0xc8, 0xdf, 0x22, 0xc5, 0x0d, 0x2c, 0x49, 0x84, 0x53, 0xa6, 0xf6, - 0x97, 0x86, 0x3a, 0x35, 0x03, 0xa6, 0xe7, 0x7f, 0xc9, 0xea, 0x38, 0x2a, 0xfd, 0x58, 0xbf, 0xc6, - 0xe9, 0x31, 0x1e, 0x9a, 0x7e, 0xd1, 0x82, 0xb3, 0xad, 0xdc, 0x8f, 0x12, 0xdb, 0x6c, 0x7f, 0x36, - 0x2e, 0xef, 0x06, 0x95, 0x75, 0x38, 0x1f, 0x8f, 0x0b, 0x6a, 0xca, 0xea, 0xc3, 0xe5, 0xf7, 0xac, - 0x0f, 0xaf, 0xc1, 0x08, 0x53, 0xe5, 0xd2, 0x0c, 0x27, 0x7d, 0xa5, 0x05, 0x61, 0x1b, 0xf6, 0x92, - 0x28, 0x88, 0x15, 0x0b, 0xf4, 0xf3, 0x16, 0x3c, 0x9c, 0x6d, 0x3a, 0x26, 0x0c, 0x2d, 0x32, 0xe6, - 0x71, 0x13, 0x63, 0x45, 0x7c, 0xff, 0xc3, 0xf5, 0x6e, 0xc4, 0x87, 0xbd, 0x08, 0x70, 0xf7, 0xca, - 0x50, 0x2d, 0xc7, 0xc6, 0x19, 0x32, 0x4f, 0x52, 0x7a, 0xdb, 0x39, 0x27, 0xab, 0xa5, 0x7f, 0xdd, - 0xca, 0x51, 0x2f, 0xb9, 0x3d, 0xf5, 0xb2, 0x69, 0x4f, 0x3d, 0x96, 0xb5, 0xa7, 0x3a, 0xbc, 0x23, - 0x86, 0x29, 0xd5, 0x7f, 0x4e, 0xcf, 0x7e, 0x93, 0xb9, 0xd8, 0x3e, 0x5c, 0xe8, 0x25, 0x66, 0x59, - 0x88, 0x93, 0xab, 0xce, 0x15, 0xd3, 0x10, 0x27, 0x77, 0xb5, 0x86, 0x19, 0xa6, 0xdf, 0xbc, 0x01, - 0xf6, 0x7f, 0xb1, 0xa0, 0x5c, 0x0f, 0xdd, 0x13, 0xf0, 0xf6, 0x7c, 0xca, 0xf0, 0xf6, 0x3c, 0x58, - 0xf0, 0xb2, 0x5a, 0xa1, 0x6f, 0x67, 0x39, 0xe3, 0xdb, 0x79, 0xb8, 0x88, 0x41, 0x77, 0x4f, 0xce, - 0xdf, 0x2d, 0x83, 0xfe, 0x0e, 0x1c, 0xfa, 0x97, 0xf7, 0x12, 0xbc, 0x5a, 0xee, 0xf6, 0x34, 0x9c, - 0xe0, 0xcc, 0x22, 0xa3, 0xe4, 0xbd, 0xb8, 0x1f, 0xb3, 0x18, 0xd6, 0xd7, 0x89, 0xb7, 0xb9, 0x95, - 0x10, 0x37, 0xfb, 0x39, 0x27, 0x17, 0xc3, 0xfa, 0x1f, 0x2d, 0x98, 0xcc, 0xd4, 0x8e, 0xfc, 0xbc, - 0x4b, 0x36, 0xf7, 0xe8, 0xbf, 0x99, 0xee, 0x79, 0x2b, 0x67, 0x0e, 0x40, 0xb9, 0xd2, 0xa5, 0x8f, - 0x84, 0xe9, 0xae, 0xca, 0xd7, 0x1e, 0x63, 0x8d, 0x02, 0xbd, 0x00, 0xa3, 0x49, 0xd8, 0x0a, 0xfd, - 0x70, 0x73, 0xef, 0x2a, 0x91, 0x99, 0x2a, 0xd4, 0x81, 0xc7, 0x7a, 0x8a, 0xc2, 0x3a, 0x9d, 0xfd, - 0x6b, 0x65, 0xc8, 0xbe, 0x1d, 0xf8, 0x67, 0x73, 0xf2, 0x83, 0x39, 0x27, 0xbf, 0x67, 0xc1, 0x14, - 0xad, 0x9d, 0x45, 0xb4, 0xc8, 0x60, 0x53, 0x95, 0xfc, 0xdf, 0xea, 0x92, 0xfc, 0xff, 0x31, 0x2a, - 0xbb, 0xdc, 0xb0, 0x9d, 0x08, 0x5f, 0x8e, 0x26, 0x9c, 0x28, 0x14, 0x0b, 0xac, 0xa0, 0x23, 0x51, - 0x24, 0xae, 0xce, 0xe8, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0xb7, 0x01, 0x06, 0x0a, 0xde, 0x06, - 0x60, 0x39, 0x9c, 0x44, 0x14, 0x85, 0x50, 0x0d, 0xb4, 0x1c, 0x4e, 0x32, 0xbc, 0x22, 0xa5, 0xb1, - 0xbf, 0x59, 0x86, 0xb1, 0x7a, 0xe8, 0xa6, 0x01, 0xe3, 0xcf, 0x1b, 0x01, 0xe3, 0x17, 0x32, 0x01, - 0xe3, 0x53, 0x3a, 0xed, 0xf1, 0xc4, 0x8b, 0x8b, 0x0c, 0x5f, 0xec, 0xa5, 0x8a, 0x7b, 0x8c, 0x15, - 0x37, 0x32, 0x7c, 0x29, 0x46, 0xd8, 0xe4, 0xfb, 0x93, 0x14, 0x23, 0xfe, 0xa7, 0x16, 0x4c, 0xd4, - 0x43, 0x97, 0x4e, 0xd0, 0x9f, 0xa4, 0xd9, 0xa8, 0x67, 0x08, 0x1b, 0xea, 0x92, 0x21, 0xec, 0xef, - 0x59, 0x30, 0x5c, 0x0f, 0xdd, 0x13, 0xf0, 0x73, 0xbe, 0x6c, 0xfa, 0x39, 0x1f, 0x28, 0x90, 0xb2, - 0x05, 0xae, 0xcd, 0xdf, 0x2a, 0xc3, 0x38, 0x6d, 0x67, 0xb8, 0x29, 0x47, 0xc9, 0xe8, 0x11, 0xab, - 0x8f, 0x1e, 0xa1, 0xca, 0x5c, 0xe8, 0xfb, 0xe1, 0x9d, 0xec, 0x88, 0xad, 0x30, 0x28, 0x16, 0x58, - 0xf4, 0x34, 0x8c, 0xb4, 0x22, 0xb2, 0xeb, 0x85, 0xed, 0x38, 0x7b, 0xf9, 0xae, 0x2e, 0xe0, 0x58, - 0x51, 0xa0, 0xe7, 0x61, 0x2c, 0xf6, 0x82, 0x26, 0x91, 0x91, 0x15, 0x03, 0x2c, 0xb2, 0x82, 0x27, - 0x59, 0xd4, 0xe0, 0xd8, 0xa0, 0x42, 0xaf, 0x43, 0x85, 0xfd, 0x67, 0xeb, 0xe6, 0xe8, 0xa9, 0xff, - 0xb9, 0xa9, 0x2a, 0x19, 0xe0, 0x94, 0x17, 0xba, 0x04, 0x90, 0xc8, 0x18, 0x90, 0x58, 0xdc, 0x0d, - 0x55, 0x1a, 0xa5, 0x8a, 0x0e, 0x89, 0xb1, 0x46, 0x85, 0x9e, 0x82, 0x4a, 0xe2, 0x78, 0xfe, 0x35, - 0x2f, 0x20, 0xb1, 0x88, 0xa1, 0x11, 0x89, 0x8b, 0x05, 0x10, 0xa7, 0x78, 0xba, 0xa3, 0xb3, 0x9b, - 0xc7, 0xfc, 0xe1, 0x90, 0x11, 0x46, 0xcd, 0x76, 0xf4, 0x6b, 0x0a, 0x8a, 0x35, 0x0a, 0xfb, 0x45, - 0x38, 0x53, 0x0f, 0xdd, 0x7a, 0x18, 0x25, 0x2b, 0x61, 0x74, 0xc7, 0x89, 0x5c, 0x39, 0x7e, 0xb3, - 0x32, 0x87, 0x2e, 0xdd, 0x75, 0x07, 0xb9, 0x5d, 0x6f, 0x64, 0xc7, 0x7d, 0x8e, 0xed, 0xe9, 0x47, - 0xbc, 0x94, 0xf0, 0x6f, 0x4a, 0x80, 0xea, 0x2c, 0x4a, 0xc5, 0x78, 0x5d, 0xe6, 0x2d, 0x98, 0x88, - 0xc9, 0x35, 0x2f, 0x68, 0xdf, 0x15, 0xac, 0xba, 0xdd, 0xf8, 0x68, 0x2c, 0xeb, 0x94, 0xdc, 0x37, - 0x62, 0xc2, 0x70, 0x86, 0x1b, 0xed, 0xc2, 0xa8, 0x1d, 0x2c, 0xc4, 0x37, 0x63, 0x12, 0x89, 0xd7, - 0x54, 0x58, 0x17, 0x62, 0x09, 0xc4, 0x29, 0x9e, 0x4e, 0x19, 0xf6, 0xe7, 0x7a, 0x18, 0xe0, 0x30, - 0x4c, 0xe4, 0x24, 0x63, 0xf9, 0xf8, 0x35, 0x38, 0x36, 0xa8, 0xd0, 0x0a, 0xa0, 0xb8, 0xdd, 0x6a, - 0xf9, 0xec, 0x50, 0xcf, 0xf1, 0x2f, 0x47, 0x61, 0xbb, 0xc5, 0xc3, 0x8c, 0x45, 0x2a, 0xfb, 0x46, - 0x07, 0x16, 0xe7, 0x94, 0xa0, 0x82, 0x61, 0x23, 0x66, 0xbf, 0xc5, 0xe5, 0x63, 0xee, 0x9b, 0x6c, - 0x30, 0x10, 0x96, 0x38, 0xfb, 0x0b, 0x6c, 0x33, 0x63, 0x8f, 0x60, 0x24, 0xed, 0x88, 0xa0, 0x1d, - 0x18, 0x6f, 0xb1, 0x0d, 0x2b, 0x89, 0x42, 0xdf, 0x27, 0x52, 0x6f, 0xbc, 0xb7, 0x88, 0x19, 0x9e, - 0x14, 0x5f, 0x67, 0x87, 0x4d, 0xee, 0xf6, 0x97, 0x26, 0x99, 0x5c, 0x6a, 0x70, 0xa3, 0x65, 0x58, - 0xc4, 0xc1, 0x0a, 0x0d, 0x6d, 0xa6, 0xf8, 0xd1, 0xa9, 0x54, 0xd2, 0x8b, 0x58, 0x5a, 0x2c, 0xcb, - 0xa2, 0xd7, 0x58, 0x7c, 0x36, 0x17, 0x06, 0xbd, 0x9e, 0xbb, 0xe3, 0x54, 0x46, 0x6c, 0xb6, 0x28, - 0x88, 0x35, 0x26, 0xe8, 0x1a, 0x8c, 0x8b, 0x37, 0x13, 0x84, 0x0b, 0xa1, 0x6c, 0x98, 0xbf, 0xe3, - 0x58, 0x47, 0x1e, 0x66, 0x01, 0xd8, 0x2c, 0x8c, 0x36, 0xe1, 0x61, 0xed, 0x85, 0x9f, 0x9c, 0xa8, - 0x2d, 0x2e, 0x5b, 0x1e, 0x39, 0xd8, 0x9f, 0x7d, 0x78, 0xbd, 0x1b, 0x21, 0xee, 0xce, 0x07, 0xdd, - 0x80, 0x33, 0x4e, 0x33, 0xf1, 0x76, 0x49, 0x8d, 0x38, 0xae, 0xef, 0x05, 0xc4, 0xbc, 0x8d, 0x7e, - 0xee, 0x60, 0x7f, 0xf6, 0xcc, 0x42, 0x1e, 0x01, 0xce, 0x2f, 0x87, 0x5e, 0x86, 0x8a, 0x1b, 0xc4, - 0xa2, 0x0f, 0x86, 0x8c, 0xc7, 0xab, 0x2a, 0xb5, 0xeb, 0x0d, 0xf5, 0xfd, 0xe9, 0x1f, 0x9c, 0x16, - 0x40, 0x9b, 0xfc, 0x91, 0x73, 0x65, 0x91, 0x0c, 0x77, 0xa4, 0x18, 0xc8, 0xda, 0xb6, 0xc6, 0xad, - 0x10, 0xee, 0x3f, 0x53, 0x31, 0x91, 0xc6, 0x85, 0x11, 0x83, 0x31, 0x7a, 0x15, 0x50, 0x4c, 0xa2, - 0x5d, 0xaf, 0x49, 0x16, 0x9a, 0x2c, 0x0b, 0x29, 0xf3, 0xba, 0x8c, 0x18, 0x01, 0xfe, 0xa8, 0xd1, - 0x41, 0x81, 0x73, 0x4a, 0xa1, 0x2b, 0x54, 0xa2, 0xe8, 0x50, 0x11, 0xc2, 0x2a, 0xd5, 0xbc, 0x6a, - 0x8d, 0xb4, 0x22, 0xd2, 0x74, 0x12, 0xe2, 0x9a, 0x1c, 0x71, 0xa6, 0x1c, 0xdd, 0x6f, 0x54, 0x72, - 0x77, 0x30, 0x03, 0x2f, 0x3b, 0x13, 0xbc, 0x53, 0x0b, 0x69, 0x2b, 0x8c, 0x93, 0xeb, 0x24, 0xb9, - 0x13, 0x46, 0xdb, 0x22, 0x13, 0x54, 0x9a, 0xfa, 0x2d, 0x45, 0x61, 0x9d, 0x8e, 0x6a, 0x44, 0xec, - 0xe8, 0x6a, 0xb5, 0xc6, 0xce, 0x19, 0x46, 0xd2, 0x75, 0x72, 0x85, 0x83, 0xb1, 0xc4, 0x4b, 0xd2, - 0xd5, 0xfa, 0x12, 0x3b, 0x3d, 0xc8, 0x90, 0xae, 0xd6, 0x97, 0xb0, 0xc4, 0x23, 0xd2, 0xf9, 0x30, - 0xd8, 0x44, 0xf1, 0x09, 0x4d, 0xa7, 0x5c, 0xee, 0xf3, 0x6d, 0xb0, 0x00, 0xa6, 0xd4, 0x93, 0x64, - 0x3c, 0x45, 0x56, 0x5c, 0x9d, 0x2c, 0x7e, 0x6d, 0x3d, 0x37, 0xbf, 0x96, 0xf2, 0xaa, 0xad, 0x66, - 0x38, 0xe1, 0x0e, 0xde, 0x46, 0x96, 0x83, 0xa9, 0x9e, 0xc9, 0xf9, 0xe7, 0xa1, 0x12, 0xb7, 0x6f, - 0xbb, 0xe1, 0x8e, 0xe3, 0x05, 0xcc, 0xed, 0xaf, 0x3f, 0x04, 0x2e, 0x11, 0x38, 0xa5, 0x41, 0x2b, - 0x30, 0xe2, 0xc8, 0x17, 0xf2, 0x51, 0xf1, 0xb5, 0x67, 0xf5, 0x34, 0x3e, 0xf3, 0x68, 0xaa, 0x37, - 0xf1, 0x55, 0x59, 0xf4, 0x12, 0x8c, 0x8b, 0x8b, 0x40, 0x22, 0x3e, 0xf0, 0x94, 0x19, 0x8f, 0xde, - 0xd0, 0x91, 0xd8, 0xa4, 0x45, 0x3f, 0x0d, 0x13, 0x94, 0x4b, 0x2a, 0xd8, 0xaa, 0xa7, 0xfb, 0x91, - 0x88, 0x5a, 0xd2, 0x65, 0xbd, 0x30, 0xce, 0x30, 0x43, 0x2e, 0x3c, 0xe4, 0xb4, 0x93, 0x70, 0x87, - 0xce, 0x70, 0x73, 0xfe, 0xaf, 0x87, 0xdb, 0x24, 0x60, 0x7e, 0xfa, 0x91, 0xc5, 0x0b, 0x07, 0xfb, - 0xb3, 0x0f, 0x2d, 0x74, 0xa1, 0xc3, 0x5d, 0xb9, 0xa0, 0x9b, 0x30, 0x9a, 0x84, 0xbe, 0x08, 0xec, - 0x8d, 0xab, 0x67, 0x8b, 0xb3, 0xb4, 0xac, 0x2b, 0x32, 0xdd, 0x9d, 0xa0, 0x8a, 0x62, 0x9d, 0x0f, - 0x5a, 0xe7, 0x6b, 0x8c, 0x25, 0xfb, 0x23, 0x71, 0xf5, 0x81, 0xe2, 0x8e, 0x51, 0x39, 0x01, 0xcd, - 0x25, 0x28, 0x4a, 0x62, 0x9d, 0x0d, 0xba, 0x0c, 0xd3, 0xad, 0xc8, 0x0b, 0xd9, 0xc4, 0x56, 0x2e, - 0xdf, 0xaa, 0x91, 0xbf, 0x6b, 0xba, 0x9e, 0x25, 0xc0, 0x9d, 0x65, 0xd0, 0x45, 0xaa, 0xa0, 0x72, - 0x60, 0xf5, 0x1c, 0x7f, 0xb4, 0x81, 0x2b, 0xa7, 0x1c, 0x86, 0x15, 0x76, 0xe6, 0xd3, 0x30, 0xdd, - 0x21, 0x29, 0x8f, 0x14, 0x64, 0xf9, 0xeb, 0x83, 0x50, 0x51, 0xee, 0x40, 0x34, 0x6f, 0x7a, 0x79, - 0xcf, 0x65, 0xbd, 0xbc, 0x23, 0x54, 0x5f, 0xd3, 0x1d, 0xbb, 0xeb, 0x39, 0xef, 0x4e, 0x5f, 0x28, - 0x10, 0x0d, 0xfd, 0xdf, 0x88, 0x3a, 0xc2, 0x9b, 0xdc, 0xa9, 0xc1, 0x38, 0xd0, 0xd5, 0x60, 0xec, - 0xf3, 0x0d, 0x38, 0x6a, 0x1a, 0xb6, 0x42, 0x77, 0xb5, 0x9e, 0x7d, 0x14, 0xa9, 0x4e, 0x81, 0x98, - 0xe3, 0x98, 0x72, 0x4f, 0xb7, 0x75, 0xa6, 0xdc, 0x0f, 0xdf, 0xa3, 0x72, 0x2f, 0x19, 0xe0, 0x94, - 0x17, 0xf2, 0x61, 0xba, 0x69, 0xbe, 0x67, 0xa5, 0x6e, 0x41, 0x3d, 0xda, 0xf3, 0x65, 0xa9, 0xb6, - 0xf6, 0xc8, 0xc5, 0x52, 0x96, 0x0b, 0xee, 0x64, 0x8c, 0x5e, 0x82, 0x91, 0x77, 0xc2, 0x98, 0x4d, - 0x3b, 0xb1, 0xb7, 0xc9, 0x7b, 0x27, 0x23, 0xaf, 0xdd, 0x68, 0x30, 0xf8, 0xe1, 0xfe, 0xec, 0x68, - 0x3d, 0x74, 0xe5, 0x5f, 0xac, 0x0a, 0xa0, 0xbb, 0x70, 0xc6, 0x90, 0x08, 0xaa, 0xb9, 0xd0, 0x7f, - 0x73, 0x1f, 0x16, 0xd5, 0x9d, 0x59, 0xcd, 0xe3, 0x84, 0xf3, 0x2b, 0xb0, 0xbf, 0xc5, 0x9d, 0x9e, - 0xc2, 0x35, 0x42, 0xe2, 0xb6, 0x7f, 0x12, 0x99, 0xec, 0x97, 0x0d, 0xaf, 0xcd, 0x3d, 0x3b, 0xd6, - 0x7f, 0xdf, 0x62, 0x8e, 0xf5, 0x75, 0xb2, 0xd3, 0xf2, 0x9d, 0xe4, 0x24, 0x42, 0x6b, 0x5f, 0x83, - 0x91, 0x44, 0xd4, 0xd6, 0x2d, 0xf9, 0xbe, 0xd6, 0x28, 0x76, 0xb8, 0xa0, 0x36, 0x44, 0x09, 0xc5, - 0x8a, 0x8d, 0xfd, 0x4f, 0xf8, 0x08, 0x48, 0xcc, 0x09, 0xf8, 0x16, 0x6a, 0xa6, 0x6f, 0x61, 0xb6, - 0xc7, 0x17, 0x14, 0xf8, 0x18, 0xfe, 0xb1, 0xd9, 0x6e, 0x66, 0x7b, 0x7c, 0xd0, 0x4f, 0x74, 0xec, - 0x5f, 0xb6, 0xe0, 0x74, 0xde, 0x91, 0x3e, 0x55, 0x62, 0xb8, 0xe5, 0xa3, 0x4e, 0xb8, 0x54, 0x0f, - 0xde, 0x12, 0x70, 0xac, 0x28, 0xfa, 0xce, 0x90, 0x7d, 0xb4, 0xcc, 0x44, 0x37, 0xc0, 0x7c, 0xfa, - 0x0c, 0xbd, 0xc2, 0x63, 0xe5, 0x2d, 0xf5, 0x36, 0xd9, 0xd1, 0xe2, 0xe4, 0xed, 0x6f, 0x94, 0xe0, - 0x34, 0x77, 0x51, 0x2f, 0xec, 0x86, 0x9e, 0x5b, 0x0f, 0x5d, 0x71, 0x73, 0xe0, 0x0d, 0x18, 0x6b, - 0x69, 0xe6, 0x6a, 0xb7, 0xdc, 0x28, 0xba, 0x59, 0x9b, 0x9a, 0x0d, 0x3a, 0x14, 0x1b, 0xbc, 0x90, - 0x0b, 0x63, 0x64, 0xd7, 0x6b, 0x2a, 0x3f, 0x67, 0xe9, 0xc8, 0x22, 0x5d, 0xd5, 0xb2, 0xac, 0xf1, - 0xc1, 0x06, 0xd7, 0xfb, 0xf0, 0x4c, 0x85, 0xfd, 0x55, 0x0b, 0x1e, 0x28, 0xc8, 0xa4, 0x42, 0xab, - 0xbb, 0xc3, 0x0e, 0x03, 0xc4, 0x3b, 0x7a, 0xaa, 0x3a, 0x7e, 0x44, 0x80, 0x05, 0x16, 0xfd, 0x14, - 0x00, 0x77, 0xf1, 0xb3, 0x57, 0xcb, 0x4b, 0xc5, 0x31, 0x4a, 0x1d, 0x09, 0x0d, 0xb4, 0x5b, 0xef, - 0xea, 0x9d, 0x72, 0x8d, 0x97, 0xfd, 0xab, 0x65, 0x18, 0xe4, 0x8f, 0x2a, 0xaf, 0xc0, 0xf0, 0x16, - 0xcf, 0xdb, 0xda, 0x4f, 0x8a, 0xd8, 0xd4, 0x1c, 0xe1, 0x00, 0x2c, 0x0b, 0xa3, 0x35, 0x38, 0x25, - 0x6e, 0xa7, 0xd4, 0x88, 0xef, 0xec, 0x49, 0xab, 0x96, 0xbf, 0x5d, 0x20, 0x13, 0x6f, 0x9f, 0x5a, - 0xed, 0x24, 0xc1, 0x79, 0xe5, 0xd0, 0x2b, 0x1d, 0xd9, 0xda, 0x78, 0xc6, 0x5b, 0xa5, 0x03, 0xf7, - 0xc8, 0xd8, 0xf6, 0x12, 0x8c, 0xb7, 0x3a, 0xec, 0x77, 0xed, 0x3d, 0x5b, 0xd3, 0x66, 0x37, 0x69, - 0x59, 0x7c, 0x40, 0x9b, 0x45, 0x43, 0xac, 0x6f, 0x45, 0x24, 0xde, 0x0a, 0x7d, 0x57, 0x3c, 0xde, - 0x98, 0xc6, 0x07, 0x64, 0xf0, 0xb8, 0xa3, 0x04, 0xe5, 0xb2, 0xe1, 0x78, 0x7e, 0x3b, 0x22, 0x29, - 0x97, 0x21, 0x93, 0xcb, 0x4a, 0x06, 0x8f, 0x3b, 0x4a, 0xd0, 0x79, 0x74, 0x46, 0xbc, 0xfc, 0x27, - 0xef, 0x2c, 0xab, 0xa0, 0x8f, 0x61, 0x19, 0x95, 0xde, 0x25, 0xd7, 0x85, 0x38, 0xf2, 0x57, 0x6f, - 0x07, 0x6a, 0x6f, 0x4a, 0x89, 0x78, 0x74, 0xc9, 0xe5, 0x5e, 0xde, 0x9f, 0xfb, 0x13, 0x0b, 0x4e, - 0xe5, 0x04, 0x82, 0x71, 0x51, 0xb5, 0xe9, 0xc5, 0x89, 0xca, 0xa9, 0xaf, 0x89, 0x2a, 0x0e, 0xc7, - 0x8a, 0x82, 0xae, 0x07, 0x2e, 0x0c, 0xb3, 0x02, 0x50, 0x04, 0x6f, 0x08, 0xec, 0xd1, 0x04, 0x20, - 0xba, 0x00, 0x03, 0xed, 0x98, 0x44, 0xf2, 0xd1, 0x36, 0x29, 0xbf, 0x99, 0x47, 0x90, 0x61, 0xa8, - 0x46, 0xb9, 0xa9, 0x9c, 0x71, 0x9a, 0x46, 0xc9, 0xdd, 0x71, 0x1c, 0x67, 0x7f, 0xa5, 0x0c, 0x93, - 0x99, 0xb0, 0x4d, 0xda, 0x90, 0x9d, 0x30, 0xf0, 0x92, 0x50, 0x25, 0x0b, 0xe3, 0x6f, 0x4c, 0x91, - 0xd6, 0xd6, 0x9a, 0x80, 0x63, 0x45, 0x81, 0x1e, 0x33, 0x5f, 0xce, 0x4f, 0xdb, 0xbc, 0x58, 0x33, - 0x1e, 0xf4, 0xec, 0xf7, 0x4d, 0x8f, 0x47, 0x61, 0xa0, 0x15, 0xaa, 0xa7, 0x96, 0xd5, 0x78, 0xe2, - 0xc5, 0x5a, 0x3d, 0x0c, 0x7d, 0xcc, 0x90, 0xe8, 0x23, 0xe2, 0xeb, 0x33, 0xe7, 0x15, 0xd8, 0x71, - 0xc3, 0x58, 0xeb, 0x82, 0x27, 0x60, 0x78, 0x9b, 0xec, 0x45, 0x5e, 0xb0, 0x99, 0x3d, 0xad, 0xb9, - 0xca, 0xc1, 0x58, 0xe2, 0xcd, 0x14, 0xdb, 0xc3, 0xf7, 0xe5, 0xdd, 0x8e, 0x91, 0x9e, 0xbb, 0xda, - 0x6f, 0x59, 0x30, 0xc9, 0x12, 0x73, 0x8a, 0xdb, 0xf1, 0x5e, 0x18, 0x9c, 0x80, 0x9e, 0xf0, 0x28, - 0x0c, 0x46, 0xb4, 0xd2, 0x6c, 0x32, 0x7e, 0xd6, 0x12, 0xcc, 0x71, 0xe8, 0x21, 0x18, 0x60, 0x4d, - 0xa0, 0x83, 0x37, 0xc6, 0x53, 0x73, 0xd7, 0x9c, 0xc4, 0xc1, 0x0c, 0xca, 0xae, 0x29, 0x61, 0xd2, - 0xf2, 0x3d, 0xde, 0xe8, 0xd4, 0xdd, 0xfa, 0xc1, 0xb8, 0xa6, 0x94, 0xdb, 0xb4, 0xf7, 0x76, 0x4d, - 0x29, 0x9f, 0x65, 0x77, 0x1d, 0xfc, 0xbf, 0x96, 0xe0, 0x7c, 0x6e, 0xb9, 0xf4, 0x64, 0x77, 0xc5, - 0x38, 0xd9, 0xbd, 0x94, 0x39, 0xd9, 0xb5, 0xbb, 0x97, 0x3e, 0x9e, 0xb3, 0xde, 0xfc, 0x23, 0xd8, - 0xf2, 0x09, 0x1e, 0xc1, 0x0e, 0xf4, 0xab, 0xa6, 0x0c, 0xf6, 0x50, 0x53, 0xbe, 0x6b, 0xc1, 0xb9, - 0xdc, 0x2e, 0xfb, 0x80, 0xdc, 0x0b, 0xcb, 0x6d, 0x5b, 0x81, 0x0d, 0xf1, 0xa3, 0x52, 0xc1, 0xb7, - 0x30, 0x6b, 0xe2, 0x22, 0x95, 0x33, 0x0c, 0x19, 0x0b, 0xb5, 0x6b, 0x8c, 0xcb, 0x18, 0x0e, 0xc3, - 0x0a, 0x8b, 0x3c, 0xed, 0x86, 0x15, 0x6f, 0xda, 0x4b, 0x47, 0x5a, 0x32, 0x73, 0xa6, 0x77, 0x5c, - 0xbf, 0xca, 0x9f, 0xbd, 0x6d, 0xb5, 0xa6, 0x59, 0x80, 0xe5, 0xfe, 0x2d, 0xc0, 0xb1, 0x7c, 0xeb, - 0x0f, 0x2d, 0xc0, 0xe4, 0x8e, 0x17, 0xb0, 0x07, 0x33, 0x4d, 0xbd, 0x47, 0x5d, 0x4b, 0x5d, 0x33, - 0xd1, 0x38, 0x4b, 0x3f, 0xf3, 0x12, 0x8c, 0xdf, 0xbb, 0xcb, 0xea, 0x7b, 0x65, 0x78, 0xb0, 0xcb, - 0xb2, 0xe7, 0xb2, 0xde, 0x18, 0x03, 0x4d, 0xd6, 0x77, 0x8c, 0x43, 0x1d, 0x4e, 0x6f, 0xb4, 0x7d, - 0x7f, 0x8f, 0x45, 0x39, 0x11, 0x57, 0x52, 0x08, 0xc5, 0x44, 0x65, 0xdd, 0x5d, 0xc9, 0xa1, 0xc1, - 0xb9, 0x25, 0xd1, 0xab, 0x80, 0xc2, 0xdb, 0x2c, 0x13, 0xac, 0x9b, 0x26, 0x28, 0x60, 0x1d, 0x5f, - 0x4e, 0x17, 0xe3, 0x8d, 0x0e, 0x0a, 0x9c, 0x53, 0x8a, 0x6a, 0x98, 0xec, 0x99, 0x6f, 0xd5, 0xac, - 0x8c, 0x86, 0x89, 0x75, 0x24, 0x36, 0x69, 0xd1, 0x65, 0x98, 0x76, 0x76, 0x1d, 0x8f, 0x27, 0x95, - 0x92, 0x0c, 0xb8, 0x8a, 0xa9, 0x1c, 0x45, 0x0b, 0x59, 0x02, 0xdc, 0x59, 0x06, 0x6d, 0x18, 0x5e, - 0x3e, 0x9e, 0x64, 0xfe, 0x52, 0xdf, 0xb3, 0xb5, 0x6f, 0xbf, 0x9f, 0xfd, 0x1f, 0x2c, 0xba, 0x7d, - 0xe5, 0xbc, 0xd0, 0x48, 0xfb, 0x41, 0xf9, 0xaf, 0xb4, 0xdb, 0x61, 0xaa, 0x1f, 0x96, 0x74, 0x24, - 0x36, 0x69, 0xf9, 0x84, 0x88, 0xd3, 0x70, 0x69, 0x43, 0x4f, 0x14, 0xd7, 0x29, 0x15, 0x05, 0xfa, - 0x2c, 0x0c, 0xbb, 0xde, 0xae, 0x17, 0x87, 0x91, 0x58, 0x2c, 0x47, 0x7d, 0x99, 0x58, 0xc9, 0xc1, - 0x1a, 0x67, 0x83, 0x25, 0x3f, 0xfb, 0x2b, 0x25, 0x18, 0x97, 0x35, 0xbe, 0xd6, 0x0e, 0x13, 0xe7, - 0x04, 0xb6, 0xe5, 0xcb, 0xc6, 0xb6, 0xfc, 0x91, 0x6e, 0x77, 0x4a, 0x59, 0x93, 0x0a, 0xb7, 0xe3, - 0x1b, 0x99, 0xed, 0xf8, 0xf1, 0xde, 0xac, 0xba, 0x6f, 0xc3, 0xbf, 0x6b, 0xc1, 0xb4, 0x41, 0x7f, - 0x02, 0xbb, 0xc1, 0x8a, 0xb9, 0x1b, 0x3c, 0xd2, 0xf3, 0x1b, 0x0a, 0x76, 0x81, 0xaf, 0x97, 0x32, - 0x6d, 0x67, 0xd2, 0xff, 0x1d, 0x18, 0xd8, 0x72, 0x22, 0xb7, 0x5b, 0x6a, 0xc4, 0x8e, 0x42, 0x73, - 0x57, 0x9c, 0xc8, 0xe5, 0x32, 0xfc, 0x69, 0xf5, 0xba, 0x94, 0x13, 0xb9, 0x3d, 0x6f, 0x07, 0xb0, - 0xaa, 0xd0, 0x8b, 0x30, 0x14, 0x37, 0xc3, 0x96, 0x8a, 0xbd, 0xbc, 0xc0, 0x5f, 0x9e, 0xa2, 0x90, - 0xc3, 0xfd, 0x59, 0x64, 0x56, 0x47, 0xc1, 0x58, 0xd0, 0xcf, 0x6c, 0x42, 0x45, 0x55, 0x7d, 0x5f, - 0xa3, 0xca, 0xff, 0xa8, 0x0c, 0xa7, 0x72, 0xe6, 0x05, 0x8a, 0x8d, 0xde, 0x7a, 0xb6, 0xcf, 0xe9, - 0xf4, 0x1e, 0xfb, 0x2b, 0x66, 0x16, 0x8b, 0x2b, 0xc6, 0xbf, 0xef, 0x4a, 0x6f, 0xc6, 0x24, 0x5b, - 0x29, 0x05, 0xf5, 0xae, 0x94, 0x56, 0x76, 0x62, 0x5d, 0x4d, 0x2b, 0x52, 0x2d, 0xbd, 0xaf, 0x63, - 0xfa, 0x3f, 0xcb, 0x70, 0x3a, 0xef, 0x2a, 0x3a, 0xfa, 0xd9, 0xcc, 0xcb, 0x07, 0xcf, 0xf7, 0x7b, - 0x89, 0x9d, 0x3f, 0x87, 0x20, 0x32, 0xbc, 0xcc, 0x99, 0x6f, 0x21, 0xf4, 0xec, 0x66, 0x51, 0x27, - 0xbb, 0xae, 0x13, 0xf1, 0x17, 0x2b, 0xe4, 0x12, 0xff, 0x58, 0xdf, 0x0d, 0x10, 0x4f, 0x5d, 0xc4, - 0x99, 0xeb, 0x3a, 0x12, 0xdc, 0xfb, 0xba, 0x8e, 0xac, 0x79, 0xc6, 0x83, 0x51, 0xed, 0x6b, 0xee, - 0xeb, 0x88, 0x6f, 0xd3, 0x1d, 0x45, 0x6b, 0xf7, 0x7d, 0x1d, 0xf5, 0xaf, 0x5a, 0x90, 0x89, 0x93, - 0x52, 0xfe, 0x0f, 0xab, 0xd0, 0xff, 0x71, 0x01, 0x06, 0xa2, 0xd0, 0x27, 0xd9, 0x64, 0xf8, 0x38, - 0xf4, 0x09, 0x66, 0x18, 0xf5, 0x52, 0x6c, 0xb9, 0xe8, 0xa5, 0x58, 0x6a, 0x1a, 0xfb, 0x64, 0x97, - 0x48, 0x6f, 0x84, 0x92, 0xc9, 0xd7, 0x28, 0x10, 0x73, 0x9c, 0xfd, 0x1b, 0x03, 0x70, 0x2a, 0xe7, - 0x72, 0x1a, 0x35, 0x54, 0x36, 0x9d, 0x84, 0xdc, 0x71, 0xf6, 0xb2, 0xf9, 0x40, 0x2f, 0x73, 0x30, - 0x96, 0x78, 0x16, 0xcb, 0xc9, 0xd3, 0x95, 0x65, 0x7c, 0x44, 0x22, 0x4b, 0x99, 0xc0, 0xde, 0xaf, - 0xd7, 0x45, 0x2f, 0x01, 0xc4, 0xb1, 0xbf, 0x1c, 0x50, 0xe5, 0xcb, 0x15, 0x91, 0xa2, 0x69, 0x6e, - 0xbb, 0xc6, 0x35, 0x81, 0xc1, 0x1a, 0x15, 0xaa, 0xc1, 0x54, 0x2b, 0x0a, 0x13, 0xee, 0x77, 0xab, - 0xf1, 0x18, 0x85, 0x41, 0xf3, 0x9a, 0x51, 0x3d, 0x83, 0xc7, 0x1d, 0x25, 0xd0, 0x0b, 0x30, 0x2a, - 0xae, 0x1e, 0xd5, 0xc3, 0xd0, 0x17, 0x5e, 0x1a, 0x75, 0xe2, 0xdd, 0x48, 0x51, 0x58, 0xa7, 0xd3, - 0x8a, 0x31, 0x67, 0xde, 0x70, 0x6e, 0x31, 0xee, 0xd0, 0xd3, 0xe8, 0x32, 0x19, 0x29, 0x46, 0xfa, - 0xca, 0x48, 0x91, 0xfa, 0xad, 0x2a, 0x7d, 0x9f, 0x5f, 0x40, 0x4f, 0x4f, 0xcf, 0xb7, 0xca, 0x30, - 0xc4, 0x87, 0xe2, 0x04, 0x54, 0xb1, 0x15, 0xe1, 0xbb, 0xe9, 0x92, 0x07, 0x80, 0xb7, 0x65, 0xae, - 0xe6, 0x24, 0x0e, 0x17, 0x43, 0x6a, 0x35, 0xa4, 0x5e, 0x1e, 0x34, 0x67, 0xac, 0x97, 0x99, 0x8c, - 0x73, 0x02, 0x38, 0x0f, 0x6d, 0xf5, 0xbc, 0x05, 0x10, 0xb3, 0x17, 0x2e, 0x29, 0x0f, 0x91, 0xb7, - 0xf4, 0xc9, 0x2e, 0xb5, 0x37, 0x14, 0x31, 0x6f, 0x43, 0x3a, 0x05, 0x15, 0x02, 0x6b, 0x1c, 0x67, - 0x3e, 0x0e, 0x15, 0x45, 0xdc, 0xcb, 0x92, 0x1b, 0xd3, 0x85, 0xd7, 0xa7, 0x60, 0x32, 0x53, 0xd7, - 0x91, 0x0c, 0xc1, 0xdf, 0xb6, 0x60, 0x32, 0xf3, 0x5c, 0x3e, 0x7a, 0x17, 0x4e, 0xfb, 0x39, 0x8b, - 0x4e, 0x8c, 0x68, 0xff, 0x8b, 0x54, 0x19, 0x7e, 0x79, 0x58, 0x9c, 0x5b, 0x07, 0x35, 0xfe, 0xf9, - 0xdb, 0xbc, 0x8e, 0x2f, 0x22, 0x90, 0xc7, 0x78, 0xce, 0x65, 0x0e, 0xc3, 0x0a, 0x6b, 0x7f, 0xdf, - 0x82, 0xe9, 0x8e, 0x87, 0xdb, 0xdf, 0xd7, 0xb6, 0x8b, 0x94, 0xd2, 0xa5, 0x82, 0x94, 0xd2, 0xfa, - 0xa7, 0x95, 0xbb, 0x7e, 0xda, 0x37, 0x2c, 0x10, 0x33, 0xf0, 0x04, 0xd4, 0xf9, 0x4f, 0x9b, 0xea, - 0xfc, 0x4c, 0xf1, 0xa4, 0x2e, 0xd0, 0xe3, 0xff, 0xd4, 0x82, 0x29, 0x4e, 0x90, 0x1e, 0x5e, 0xbc, - 0xaf, 0xe3, 0xd0, 0xcf, 0xc3, 0x23, 0xea, 0xa5, 0xc7, 0xfc, 0x8f, 0x32, 0x06, 0x6b, 0xa0, 0xeb, - 0x60, 0xfd, 0x67, 0x0b, 0x10, 0xff, 0xfc, 0xec, 0x73, 0xc5, 0x7c, 0x53, 0xd2, 0x4c, 0xed, 0x54, - 0x08, 0x28, 0x0c, 0xd6, 0xa8, 0x8e, 0xa5, 0xe1, 0x99, 0xb3, 0xa1, 0x72, 0xef, 0xb3, 0xa1, 0x23, - 0x7c, 0xeb, 0x5f, 0x19, 0x80, 0x6c, 0x20, 0x22, 0xba, 0x05, 0x63, 0x4d, 0xa7, 0xe5, 0xdc, 0xf6, - 0x7c, 0x2f, 0xf1, 0x48, 0xdc, 0xed, 0x50, 0x79, 0x49, 0xa3, 0x13, 0x07, 0x31, 0x1a, 0x04, 0x1b, - 0x7c, 0xd0, 0x1c, 0x40, 0x2b, 0xf2, 0x76, 0x3d, 0x9f, 0x6c, 0x32, 0x5b, 0x83, 0xdd, 0x46, 0xe0, - 0x27, 0xa5, 0x12, 0x8a, 0x35, 0x8a, 0x9c, 0xe8, 0xf5, 0xf2, 0xfd, 0x8b, 0x5e, 0x1f, 0x38, 0x62, - 0xf4, 0xfa, 0x60, 0x5f, 0xd1, 0xeb, 0x18, 0xce, 0xca, 0x5d, 0x95, 0xfe, 0x5f, 0xf1, 0x7c, 0x22, - 0x54, 0x29, 0x7e, 0x47, 0x61, 0xe6, 0x60, 0x7f, 0xf6, 0x2c, 0xce, 0xa5, 0xc0, 0x05, 0x25, 0xd1, - 0x4f, 0x41, 0xd5, 0xf1, 0xfd, 0xf0, 0x8e, 0xea, 0xb5, 0xe5, 0xb8, 0xe9, 0xf8, 0x69, 0x2a, 0xd0, - 0x91, 0xc5, 0x87, 0x0e, 0xf6, 0x67, 0xab, 0x0b, 0x05, 0x34, 0xb8, 0xb0, 0xb4, 0xbd, 0x0d, 0xa7, - 0x1a, 0x24, 0x92, 0xaf, 0x67, 0xa9, 0xd5, 0xb7, 0x0e, 0x95, 0x28, 0xb3, 0xdc, 0xfb, 0xba, 0x92, - 0xae, 0x25, 0xe0, 0x92, 0xcb, 0x3b, 0x65, 0x64, 0xff, 0x6f, 0x0b, 0x86, 0x45, 0x70, 0xe3, 0x09, - 0x68, 0x19, 0x0b, 0x86, 0xc3, 0x67, 0x36, 0x5f, 0x24, 0xb2, 0xc6, 0x14, 0xba, 0x7a, 0x56, 0x33, - 0xae, 0x9e, 0x47, 0xba, 0x31, 0xe9, 0xee, 0xe4, 0xf9, 0xa5, 0x32, 0x4c, 0x98, 0x81, 0x9d, 0x27, - 0xd0, 0x05, 0xd7, 0x61, 0x38, 0x16, 0x51, 0xc4, 0xa5, 0xe2, 0x68, 0xb4, 0xec, 0x20, 0xa6, 0x67, - 0xd6, 0x22, 0x6e, 0x58, 0x32, 0xc9, 0x0d, 0x4f, 0x2e, 0xdf, 0xc7, 0xf0, 0xe4, 0x5e, 0xb1, 0xb5, - 0x03, 0xc7, 0x11, 0x5b, 0x6b, 0x7f, 0x9b, 0x09, 0x7f, 0x1d, 0x7e, 0x02, 0x3b, 0xf6, 0x65, 0x73, - 0x9b, 0xb0, 0xbb, 0xcc, 0x2c, 0xd1, 0xa8, 0x82, 0x9d, 0xfb, 0x1f, 0x5a, 0x30, 0x2a, 0x08, 0x4f, - 0xa0, 0xd9, 0x9f, 0x31, 0x9b, 0xfd, 0x60, 0x97, 0x66, 0x17, 0xb4, 0xf7, 0x6f, 0x95, 0x54, 0x7b, - 0xeb, 0xe2, 0x61, 0xf9, 0x9e, 0xa9, 0xa1, 0x47, 0xa8, 0x9d, 0x16, 0x36, 0x43, 0x5f, 0xe8, 0x65, - 0x0f, 0xa5, 0xd7, 0xd4, 0x38, 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x35, 0xbb, 0x45, 0x15, 0x46, 0x89, - 0xd8, 0x40, 0xf3, 0x9e, 0xb5, 0x77, 0x01, 0xd2, 0xd7, 0xc1, 0xc5, 0xbd, 0xce, 0xa3, 0x3f, 0x98, - 0x9f, 0xde, 0x3b, 0x53, 0xbc, 0xb0, 0xc6, 0x57, 0x5e, 0x7c, 0x60, 0x75, 0x0c, 0x9a, 0x27, 0x31, - 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0xe3, 0x4c, 0x26, 0xb3, 0x0e, 0x3a, 0xda, 0x95, 0xb0, 0xff, - 0x35, 0xa4, 0xba, 0x96, 0xb9, 0x61, 0x6b, 0xfa, 0xc5, 0xb3, 0xee, 0x22, 0x90, 0x56, 0xac, 0x07, - 0xf9, 0xa6, 0xb7, 0xd3, 0xd0, 0xe7, 0x3a, 0x0e, 0xe8, 0x9e, 0xe9, 0x21, 0x4b, 0x8f, 0x70, 0x24, - 0xc7, 0x32, 0xdd, 0xb1, 0x8c, 0x60, 0xab, 0xf5, 0x6c, 0xf2, 0xee, 0x25, 0x89, 0xc0, 0x29, 0x0d, - 0x9a, 0x17, 0x36, 0x1f, 0x77, 0x80, 0x3c, 0x98, 0xb1, 0xf9, 0xe4, 0xe7, 0x6b, 0x46, 0xdf, 0xb3, - 0x30, 0xaa, 0x1e, 0x2d, 0xa9, 0xf3, 0x77, 0x25, 0x2a, 0x5c, 0x97, 0x5a, 0x4e, 0xc1, 0x58, 0xa7, - 0x41, 0xeb, 0x30, 0x19, 0xf3, 0x17, 0x55, 0xe4, 0x5d, 0x04, 0x61, 0xd1, 0x3f, 0x99, 0x79, 0x87, - 0x5c, 0xa2, 0x0f, 0x19, 0x88, 0x2f, 0x56, 0x79, 0x7b, 0x21, 0xcb, 0x02, 0xbd, 0x02, 0x13, 0xbe, - 0xfe, 0xd4, 0x63, 0x5d, 0x18, 0xfc, 0x2a, 0xc8, 0xca, 0x78, 0x08, 0xb2, 0x8e, 0x33, 0xd4, 0x54, - 0x09, 0xd0, 0x21, 0x22, 0x49, 0x8d, 0x13, 0x6c, 0x92, 0x58, 0x3c, 0xe7, 0xc0, 0x94, 0x80, 0x6b, - 0x05, 0x34, 0xb8, 0xb0, 0x34, 0x7a, 0x11, 0xc6, 0xe4, 0xe7, 0x6b, 0x77, 0x73, 0xd2, 0x50, 0x3e, - 0x0d, 0x87, 0x0d, 0x4a, 0x74, 0x07, 0xce, 0xc8, 0xff, 0xeb, 0x91, 0xb3, 0xb1, 0xe1, 0x35, 0xc5, - 0xd5, 0xa8, 0x51, 0xc6, 0x62, 0x41, 0xc6, 0x35, 0x2f, 0xe7, 0x11, 0x1d, 0xee, 0xcf, 0x5e, 0x10, - 0xbd, 0x96, 0x8b, 0x67, 0x83, 0x98, 0xcf, 0x1f, 0xad, 0xc1, 0xa9, 0x2d, 0xe2, 0xf8, 0xc9, 0xd6, - 0xd2, 0x16, 0x69, 0x6e, 0xcb, 0x45, 0xc4, 0x6e, 0xfc, 0x68, 0x01, 0x70, 0x57, 0x3a, 0x49, 0x70, - 0x5e, 0xb9, 0xf7, 0x76, 0x0e, 0xfb, 0x0e, 0x2d, 0xac, 0xe9, 0x00, 0xe8, 0xf3, 0x30, 0xa6, 0xf7, - 0xb5, 0x10, 0xc3, 0x8f, 0xf5, 0x7a, 0xfc, 0x53, 0x68, 0x10, 0xaa, 0xdf, 0x75, 0x1c, 0x36, 0x38, - 0xda, 0xff, 0xbc, 0x04, 0xb3, 0x3d, 0xb2, 0x3c, 0x65, 0x9c, 0x4b, 0x56, 0x5f, 0xce, 0xa5, 0x05, - 0xf9, 0xb8, 0xc7, 0xf5, 0x4c, 0xea, 0xe8, 0xcc, 0xc3, 0x1d, 0x69, 0x02, 0xe9, 0x2c, 0x7d, 0xdf, - 0x71, 0x55, 0xba, 0x7f, 0x6a, 0xa0, 0x67, 0x78, 0x59, 0x5d, 0x77, 0x34, 0x0e, 0xf6, 0xaf, 0x90, - 0x16, 0xfa, 0x18, 0xed, 0x6f, 0x97, 0xe0, 0x8c, 0xea, 0xc2, 0x9f, 0xdc, 0x8e, 0xbb, 0xd9, 0xd9, - 0x71, 0xc7, 0xe0, 0xa1, 0xb5, 0x6f, 0xc0, 0x50, 0x63, 0x2f, 0x6e, 0x26, 0x7e, 0x1f, 0xfb, 0xf7, - 0xa3, 0xc6, 0xca, 0x49, 0x77, 0x19, 0xf6, 0x86, 0x96, 0x58, 0x48, 0xf6, 0x5f, 0xb4, 0x60, 0x72, - 0x7d, 0xa9, 0xde, 0x08, 0x9b, 0xdb, 0x24, 0x59, 0xe0, 0xfe, 0x07, 0x2c, 0xb6, 0x6f, 0xeb, 0x1e, - 0xb7, 0xe5, 0xbc, 0x0d, 0xff, 0x02, 0x0c, 0x6c, 0x85, 0x71, 0x92, 0xf5, 0xc2, 0x5f, 0x09, 0xe3, - 0x04, 0x33, 0x8c, 0xfd, 0xc7, 0x16, 0x0c, 0xb2, 0x67, 0xa3, 0x7a, 0x3d, 0x2f, 0xd6, 0xcf, 0x77, - 0xa1, 0x17, 0x60, 0x88, 0x6c, 0x6c, 0x90, 0x66, 0x22, 0x46, 0x55, 0x5e, 0xf5, 0x18, 0x5a, 0x66, - 0x50, 0xba, 0x67, 0xb1, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0xe7, 0xa0, 0x92, 0x78, 0x3b, 0x64, - 0xc1, 0x75, 0x85, 0x03, 0xfc, 0x68, 0xb1, 0x4e, 0x6a, 0x0f, 0x5d, 0x97, 0x4c, 0x70, 0xca, 0xcf, - 0xfe, 0x85, 0x12, 0x40, 0x7a, 0x25, 0xac, 0xd7, 0x67, 0x2e, 0x76, 0xbc, 0xa2, 0xf6, 0x58, 0xce, - 0x2b, 0x6a, 0x28, 0x65, 0x98, 0xf3, 0x86, 0x9a, 0xea, 0xaa, 0x72, 0x5f, 0x5d, 0x35, 0x70, 0x94, - 0xae, 0x5a, 0x82, 0xe9, 0xf4, 0x4a, 0x9b, 0x79, 0xbf, 0x97, 0x65, 0x6f, 0x5d, 0xcf, 0x22, 0x71, - 0x27, 0xbd, 0xfd, 0x65, 0x0b, 0x44, 0xfc, 0x6b, 0x1f, 0x13, 0xfa, 0x0d, 0xf9, 0x98, 0x92, 0x91, - 0x7a, 0xee, 0x42, 0x71, 0x40, 0xb0, 0x48, 0x38, 0xa7, 0x24, 0xbb, 0x91, 0x66, 0xce, 0xe0, 0x65, - 0xff, 0xae, 0x05, 0xa3, 0x1c, 0xbd, 0xc6, 0x8c, 0xc4, 0xde, 0xad, 0x39, 0x52, 0xee, 0x5f, 0xf6, - 0xce, 0x10, 0x65, 0xac, 0x52, 0xc4, 0xea, 0xef, 0x0c, 0x49, 0x04, 0x4e, 0x69, 0xd0, 0x13, 0x30, - 0x1c, 0xb7, 0x6f, 0x33, 0xf2, 0x4c, 0x08, 0x6c, 0x83, 0x83, 0xb1, 0xc4, 0xd3, 0x79, 0x35, 0x95, - 0x8d, 0x80, 0x46, 0x57, 0x60, 0x88, 0x8b, 0x0d, 0xb1, 0x8c, 0xbb, 0xb8, 0xfb, 0xb5, 0xb8, 0x69, - 0xe0, 0xaf, 0x49, 0x33, 0x71, 0x23, 0xca, 0xa3, 0x37, 0x61, 0xd4, 0x0d, 0xef, 0x04, 0x77, 0x9c, - 0xc8, 0x5d, 0xa8, 0xaf, 0x8a, 0x5e, 0xcf, 0x8d, 0x63, 0xab, 0xa5, 0x64, 0x7a, 0x2c, 0x36, 0x73, - 0xa0, 0xa5, 0x28, 0xac, 0xb3, 0x43, 0xeb, 0x2c, 0xcb, 0xc6, 0x86, 0xb7, 0xb9, 0xe6, 0xb4, 0xba, - 0x45, 0x76, 0x2c, 0x49, 0x22, 0x8d, 0xf3, 0xb8, 0x48, 0xc5, 0xc1, 0x11, 0x38, 0x65, 0x64, 0x7f, - 0xf1, 0x14, 0x18, 0xa3, 0x6d, 0x64, 0xe8, 0xb5, 0x8e, 0x29, 0x43, 0x2f, 0x86, 0x11, 0xb2, 0xd3, - 0x4a, 0xf6, 0x6a, 0x5e, 0xd4, 0x2d, 0x65, 0xfa, 0xb2, 0xa0, 0xe9, 0xe4, 0x29, 0x31, 0x58, 0xf1, - 0xc9, 0x4f, 0xa3, 0x5c, 0x7e, 0x1f, 0xd3, 0x28, 0x0f, 0x9c, 0x60, 0x1a, 0xe5, 0xeb, 0x30, 0xbc, - 0xe9, 0x25, 0x98, 0xb4, 0x42, 0xb1, 0x65, 0xe6, 0xce, 0x84, 0xcb, 0x9c, 0xa4, 0x33, 0x01, 0xa8, - 0x40, 0x60, 0xc9, 0x04, 0xbd, 0xaa, 0xd6, 0xc0, 0x50, 0xb1, 0x2a, 0xd8, 0xe9, 0x7f, 0xce, 0x5d, - 0x05, 0x22, 0x6d, 0xf2, 0xf0, 0xbd, 0xa6, 0x4d, 0x56, 0x69, 0x8f, 0x47, 0xde, 0x5b, 0xda, 0x63, - 0x23, 0x2d, 0x74, 0xe5, 0xf8, 0xd2, 0x42, 0x7f, 0xd9, 0x82, 0x33, 0xad, 0xbc, 0x0c, 0xe9, 0x22, - 0x95, 0xf1, 0x0b, 0x7d, 0x67, 0x8a, 0x37, 0x2a, 0x64, 0xa9, 0x1e, 0x72, 0xc9, 0x70, 0x7e, 0x75, - 0x32, 0xbf, 0xf4, 0xe8, 0xbd, 0xe6, 0x97, 0xbe, 0x3f, 0x39, 0x8f, 0xd3, 0x6c, 0xd3, 0xe3, 0xc7, - 0x98, 0x6d, 0x7a, 0xe2, 0x3d, 0x67, 0x9b, 0xd6, 0x32, 0x46, 0x4f, 0x1e, 0x47, 0xc6, 0xe8, 0xb7, - 0x4c, 0x61, 0xcf, 0x13, 0x19, 0x3f, 0xd5, 0x43, 0xd8, 0x1b, 0x7c, 0xbb, 0x8b, 0x7b, 0x9e, 0x1d, - 0x7b, 0xfa, 0x9e, 0xb2, 0x63, 0x1b, 0x79, 0xa7, 0xd1, 0xf1, 0xe5, 0x9d, 0xbe, 0xa5, 0x6f, 0x41, - 0xa7, 0x8a, 0xf9, 0xaa, 0x9d, 0xa6, 0x93, 0x6f, 0xde, 0x26, 0xd4, 0x99, 0xcf, 0xfa, 0xf4, 0xc9, - 0xe4, 0xb3, 0x3e, 0x73, 0xec, 0xf9, 0xac, 0xcf, 0x9e, 0x40, 0x3e, 0xeb, 0x07, 0xde, 0xd7, 0x7c, - 0xd6, 0xd5, 0xfb, 0x9b, 0xcf, 0xfa, 0xdc, 0x71, 0xe4, 0xb3, 0xbe, 0x05, 0x95, 0x96, 0xbc, 0x24, - 0x57, 0x9d, 0x29, 0x1e, 0x92, 0xdc, 0x9b, 0x74, 0x7c, 0x48, 0x14, 0x0a, 0xa7, 0xac, 0x28, 0xdf, - 0x34, 0xbf, 0xf5, 0x83, 0xc5, 0x7c, 0x73, 0xcd, 0xf6, 0x2e, 0x59, 0xad, 0xff, 0x52, 0x09, 0xce, - 0x77, 0x9f, 0xd7, 0xa9, 0xcd, 0x5f, 0x4f, 0x5d, 0xac, 0x19, 0x9b, 0x9f, 0x29, 0x5d, 0x1a, 0x55, - 0xdf, 0x37, 0x89, 0x2f, 0xc3, 0xb4, 0x8a, 0x15, 0xf2, 0xbd, 0xe6, 0x9e, 0xf6, 0xfc, 0x8c, 0x0a, - 0x3f, 0x6f, 0x64, 0x09, 0x70, 0x67, 0x19, 0xb4, 0x00, 0x93, 0x06, 0x70, 0xb5, 0x26, 0x54, 0x72, - 0xe5, 0x64, 0x68, 0x98, 0x68, 0x9c, 0xa5, 0xb7, 0xbf, 0x6e, 0xc1, 0x03, 0x05, 0xa9, 0x31, 0xfb, - 0xbe, 0x28, 0xbb, 0x01, 0x93, 0x2d, 0xb3, 0x68, 0x8f, 0xfb, 0xf4, 0x46, 0x02, 0x4e, 0xd5, 0xd6, - 0x0c, 0x02, 0x67, 0x99, 0x2e, 0x5e, 0xfc, 0xce, 0x0f, 0xce, 0x7f, 0xe8, 0x0f, 0x7f, 0x70, 0xfe, - 0x43, 0xdf, 0xff, 0xc1, 0xf9, 0x0f, 0xfd, 0xb9, 0x83, 0xf3, 0xd6, 0x77, 0x0e, 0xce, 0x5b, 0x7f, - 0x78, 0x70, 0xde, 0xfa, 0xfe, 0xc1, 0x79, 0xeb, 0x4f, 0x0e, 0xce, 0x5b, 0xbf, 0xf0, 0xc3, 0xf3, - 0x1f, 0x7a, 0xa3, 0xb4, 0xfb, 0xec, 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xc9, 0x6a, 0xe4, 0x7c, - 0xae, 0xc8, 0x00, 0x00, + // 11487 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x24, 0xd7, + 0x75, 0x18, 0xac, 0x9e, 0xc1, 0x6b, 0x0e, 0xde, 0x77, 0xb1, 0xcb, 0x59, 0x90, 0xdc, 0x59, 0x36, + 0x25, 0x72, 0xf9, 0x02, 0xc4, 0x25, 0x29, 0x51, 0x22, 0x45, 0x09, 0xc0, 0x00, 0xbb, 0xe0, 0x2e, + 0x76, 0x87, 0x77, 0xb0, 0x4b, 0x8b, 0xa2, 0x69, 0xf5, 0xce, 0x5c, 0x00, 0x4d, 0x34, 0xba, 0x87, + 0xdd, 0x3d, 0xd8, 0x05, 0xcb, 0xaa, 0xfa, 0x3e, 0x46, 0x56, 0x1e, 0xf2, 0x0f, 0x57, 0xca, 0x95, + 0x38, 0x96, 0xe2, 0x54, 0xe5, 0x51, 0xb6, 0xa2, 0x4a, 0xca, 0x8e, 0x1c, 0x3f, 0x24, 0xa7, 0x92, + 0x38, 0x8f, 0x92, 0xfe, 0x38, 0xf6, 0x8f, 0x94, 0x54, 0x95, 0x0a, 0x6c, 0x41, 0x55, 0x49, 0xe5, + 0x47, 0x52, 0x79, 0xfd, 0x09, 0xe2, 0x44, 0xa9, 0xfb, 0xec, 0x7b, 0x7b, 0xba, 0x67, 0x06, 0x4b, + 0x00, 0xa4, 0x55, 0xfe, 0x37, 0x73, 0xce, 0xb9, 0xe7, 0xde, 0xbe, 0x8f, 0x73, 0xcf, 0x39, 0xf7, + 0xdc, 0x73, 0xe1, 0xa5, 0xed, 0x17, 0xa3, 0x39, 0x37, 0x98, 0xdf, 0x6e, 0xdf, 0x21, 0xa1, 0x4f, + 0x62, 0x12, 0xcd, 0xef, 0x12, 0xbf, 0x19, 0x84, 0xf3, 0x02, 0xe1, 0xb4, 0xdc, 0xf9, 0x46, 0x10, + 0x92, 0xf9, 0xdd, 0x67, 0xe7, 0x37, 0x89, 0x4f, 0x42, 0x27, 0x26, 0xcd, 0xb9, 0x56, 0x18, 0xc4, + 0x01, 0x42, 0x9c, 0x66, 0xce, 0x69, 0xb9, 0x73, 0x94, 0x66, 0x6e, 0xf7, 0xd9, 0xd9, 0x67, 0x36, + 0xdd, 0x78, 0xab, 0x7d, 0x67, 0xae, 0x11, 0xec, 0xcc, 0x6f, 0x06, 0x9b, 0xc1, 0x3c, 0x23, 0xbd, + 0xd3, 0xde, 0x60, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0xb3, 0x98, 0x7d, 0x3e, 0xa9, 0x66, 0xc7, 0x69, + 0x6c, 0xb9, 0x3e, 0x09, 0xf7, 0xe6, 0x5b, 0xdb, 0x9b, 0xac, 0xde, 0x90, 0x44, 0x41, 0x3b, 0x6c, + 0x90, 0x74, 0xc5, 0x5d, 0x4b, 0x45, 0xf3, 0x3b, 0x24, 0x76, 0x32, 0x9a, 0x3b, 0x3b, 0x9f, 0x57, + 0x2a, 0x6c, 0xfb, 0xb1, 0xbb, 0xd3, 0x59, 0xcd, 0x27, 0x7a, 0x15, 0x88, 0x1a, 0x5b, 0x64, 0xc7, + 0xe9, 0x28, 0xf7, 0x5c, 0x5e, 0xb9, 0x76, 0xec, 0x7a, 0xf3, 0xae, 0x1f, 0x47, 0x71, 0x98, 0x2e, + 0x64, 0x7f, 0xdf, 0x82, 0x8b, 0x0b, 0xaf, 0xd7, 0x97, 0x3d, 0x27, 0x8a, 0xdd, 0xc6, 0xa2, 0x17, + 0x34, 0xb6, 0xeb, 0x71, 0x10, 0x92, 0xdb, 0x81, 0xd7, 0xde, 0x21, 0x75, 0xd6, 0x11, 0xe8, 0x69, + 0x18, 0xd9, 0x65, 0xff, 0x57, 0xab, 0x65, 0xeb, 0xa2, 0x75, 0xa9, 0xb4, 0x38, 0xf5, 0xdd, 0xfd, + 0xca, 0x47, 0x0e, 0xf6, 0x2b, 0x23, 0xb7, 0x05, 0x1c, 0x2b, 0x0a, 0xf4, 0x18, 0x0c, 0x6d, 0x44, + 0xeb, 0x7b, 0x2d, 0x52, 0x2e, 0x30, 0xda, 0x09, 0x41, 0x3b, 0xb4, 0x52, 0xa7, 0x50, 0x2c, 0xb0, + 0x68, 0x1e, 0x4a, 0x2d, 0x27, 0x8c, 0xdd, 0xd8, 0x0d, 0xfc, 0x72, 0xf1, 0xa2, 0x75, 0x69, 0x70, + 0x71, 0x5a, 0x90, 0x96, 0x6a, 0x12, 0x81, 0x13, 0x1a, 0xda, 0x8c, 0x90, 0x38, 0xcd, 0x9b, 0xbe, + 0xb7, 0x57, 0x1e, 0xb8, 0x68, 0x5d, 0x1a, 0x49, 0x9a, 0x81, 0x05, 0x1c, 0x2b, 0x0a, 0xfb, 0x97, + 0x0b, 0x30, 0xb2, 0xb0, 0xb1, 0xe1, 0xfa, 0x6e, 0xbc, 0x87, 0x6e, 0xc3, 0x98, 0x1f, 0x34, 0x89, + 0xfc, 0xcf, 0xbe, 0x62, 0xf4, 0xf2, 0xc5, 0xb9, 0xce, 0xa9, 0x34, 0x77, 0x43, 0xa3, 0x5b, 0x9c, + 0x3a, 0xd8, 0xaf, 0x8c, 0xe9, 0x10, 0x6c, 0xf0, 0x41, 0x18, 0x46, 0x5b, 0x41, 0x53, 0xb1, 0x2d, + 0x30, 0xb6, 0x95, 0x2c, 0xb6, 0xb5, 0x84, 0x6c, 0x71, 0xf2, 0x60, 0xbf, 0x32, 0xaa, 0x01, 0xb0, + 0xce, 0x04, 0xdd, 0x81, 0x49, 0xfa, 0xd7, 0x8f, 0x5d, 0xc5, 0xb7, 0xc8, 0xf8, 0x3e, 0x9a, 0xc7, + 0x57, 0x23, 0x5d, 0x3c, 0x73, 0xb0, 0x5f, 0x99, 0x4c, 0x01, 0x71, 0x9a, 0xa1, 0xfd, 0x2e, 0x4c, + 0x2c, 0xc4, 0xb1, 0xd3, 0xd8, 0x22, 0x4d, 0x3e, 0x82, 0xe8, 0x79, 0x18, 0xf0, 0x9d, 0x1d, 0x22, + 0xc6, 0xf7, 0xa2, 0xe8, 0xd8, 0x81, 0x1b, 0xce, 0x0e, 0x39, 0xdc, 0xaf, 0x4c, 0xdd, 0xf2, 0xdd, + 0x77, 0xda, 0x62, 0x56, 0x50, 0x18, 0x66, 0xd4, 0xe8, 0x32, 0x40, 0x93, 0xec, 0xba, 0x0d, 0x52, + 0x73, 0xe2, 0x2d, 0x31, 0xde, 0x48, 0x94, 0x85, 0xaa, 0xc2, 0x60, 0x8d, 0xca, 0xbe, 0x07, 0xa5, + 0x85, 0xdd, 0xc0, 0x6d, 0xd6, 0x82, 0x66, 0x84, 0xb6, 0x61, 0xb2, 0x15, 0x92, 0x0d, 0x12, 0x2a, + 0x50, 0xd9, 0xba, 0x58, 0xbc, 0x34, 0x7a, 0xf9, 0x52, 0xe6, 0xc7, 0x9a, 0xa4, 0xcb, 0x7e, 0x1c, + 0xee, 0x2d, 0x3e, 0x20, 0xea, 0x9b, 0x4c, 0x61, 0x71, 0x9a, 0xb3, 0xfd, 0x2f, 0x0b, 0x70, 0x76, + 0xe1, 0xdd, 0x76, 0x48, 0xaa, 0x6e, 0xb4, 0x9d, 0x9e, 0xe1, 0x4d, 0x37, 0xda, 0xbe, 0x91, 0xf4, + 0x80, 0x9a, 0x5a, 0x55, 0x01, 0xc7, 0x8a, 0x02, 0x3d, 0x03, 0xc3, 0xf4, 0xf7, 0x2d, 0xbc, 0x2a, + 0x3e, 0xf9, 0x8c, 0x20, 0x1e, 0xad, 0x3a, 0xb1, 0x53, 0xe5, 0x28, 0x2c, 0x69, 0xd0, 0x1a, 0x8c, + 0x36, 0xd8, 0x82, 0xdc, 0x5c, 0x0b, 0x9a, 0x84, 0x0d, 0x66, 0x69, 0xf1, 0x29, 0x4a, 0xbe, 0x94, + 0x80, 0x0f, 0xf7, 0x2b, 0x65, 0xde, 0x36, 0xc1, 0x42, 0xc3, 0x61, 0xbd, 0x3c, 0xb2, 0xd5, 0xfa, + 0x1a, 0x60, 0x9c, 0x20, 0x63, 0x6d, 0x5d, 0xd2, 0x96, 0xca, 0x20, 0x5b, 0x2a, 0x63, 0xd9, 0xcb, + 0x04, 0x3d, 0x0b, 0x03, 0xdb, 0xae, 0xdf, 0x2c, 0x0f, 0x31, 0x5e, 0x0f, 0xd3, 0x31, 0xbf, 0xe6, + 0xfa, 0xcd, 0xc3, 0xfd, 0xca, 0xb4, 0xd1, 0x1c, 0x0a, 0xc4, 0x8c, 0xd4, 0xfe, 0xfb, 0x96, 0xe8, + 0xc6, 0x15, 0xd7, 0x33, 0x05, 0xc5, 0x65, 0x80, 0x88, 0x34, 0x42, 0x12, 0x6b, 0x1d, 0xa9, 0xa6, + 0x43, 0x5d, 0x61, 0xb0, 0x46, 0x45, 0xc5, 0x40, 0xb4, 0xe5, 0x84, 0x6c, 0x56, 0x89, 0xee, 0x54, + 0x62, 0xa0, 0x2e, 0x11, 0x38, 0xa1, 0x31, 0xc4, 0x40, 0xb1, 0xa7, 0x18, 0xf8, 0x1d, 0x0b, 0x86, + 0x17, 0x5d, 0xbf, 0xe9, 0xfa, 0x9b, 0xe8, 0x8b, 0x30, 0x42, 0xa5, 0x74, 0xd3, 0x89, 0x1d, 0x21, + 0x01, 0x3e, 0xae, 0xcd, 0x32, 0x25, 0x34, 0xe7, 0x5a, 0xdb, 0x9b, 0x14, 0x10, 0xcd, 0x51, 0x6a, + 0x3a, 0xef, 0x6e, 0xde, 0x79, 0x9b, 0x34, 0xe2, 0x35, 0x12, 0x3b, 0xc9, 0xe7, 0x24, 0x30, 0xac, + 0xb8, 0xa2, 0x6b, 0x30, 0x14, 0x3b, 0xe1, 0x26, 0x89, 0x85, 0x28, 0xc8, 0x5c, 0xb2, 0xbc, 0x24, + 0xa6, 0x73, 0x93, 0xf8, 0x0d, 0x92, 0x08, 0xc8, 0x75, 0x56, 0x14, 0x0b, 0x16, 0x76, 0x03, 0xc6, + 0x96, 0x9c, 0x96, 0x73, 0xc7, 0xf5, 0xdc, 0xd8, 0x25, 0x11, 0x7a, 0x1c, 0x8a, 0x4e, 0xb3, 0xc9, + 0xd6, 0x47, 0x69, 0xf1, 0xec, 0xc1, 0x7e, 0xa5, 0xb8, 0xd0, 0xa4, 0x03, 0x05, 0x8a, 0x6a, 0x0f, + 0x53, 0x0a, 0xf4, 0x24, 0x0c, 0x34, 0xc3, 0xa0, 0x55, 0x2e, 0x30, 0xca, 0x73, 0x74, 0x4c, 0xab, + 0x61, 0xd0, 0x4a, 0x91, 0x32, 0x1a, 0xfb, 0x3b, 0x05, 0x40, 0x4b, 0xa4, 0xb5, 0xb5, 0x52, 0x37, + 0x46, 0xf2, 0x12, 0x8c, 0xec, 0x04, 0xbe, 0x1b, 0x07, 0x61, 0x24, 0x2a, 0x64, 0x13, 0x68, 0x4d, + 0xc0, 0xb0, 0xc2, 0xa2, 0x8b, 0x30, 0xd0, 0x4a, 0x16, 0xff, 0x98, 0x14, 0x1c, 0x6c, 0xd9, 0x33, + 0x0c, 0xa5, 0x68, 0x47, 0x24, 0x14, 0x13, 0x5f, 0x51, 0xdc, 0x8a, 0x48, 0x88, 0x19, 0x26, 0x99, + 0x37, 0x74, 0x46, 0x89, 0x69, 0x9d, 0x9a, 0x37, 0x14, 0x83, 0x35, 0x2a, 0x74, 0x0b, 0x4a, 0xfc, + 0x1f, 0x26, 0x1b, 0x6c, 0x8e, 0xe7, 0xc8, 0x8c, 0xeb, 0x41, 0xc3, 0xf1, 0xd2, 0x5d, 0x3e, 0xce, + 0x66, 0x97, 0x2c, 0x8e, 0x13, 0x4e, 0xc6, 0xec, 0x1a, 0xea, 0x39, 0xbb, 0x7e, 0xc9, 0x02, 0xb4, + 0xe4, 0xfa, 0x4d, 0x12, 0x9e, 0xc2, 0x86, 0x79, 0xb4, 0x89, 0xff, 0xef, 0x68, 0xd3, 0x82, 0x9d, + 0x56, 0xe0, 0x13, 0x3f, 0x5e, 0x0a, 0xfc, 0x26, 0xdf, 0x44, 0x3f, 0x0d, 0x03, 0x31, 0xad, 0x8a, + 0x37, 0xeb, 0x31, 0x39, 0x18, 0xb4, 0x82, 0xc3, 0xfd, 0xca, 0xb9, 0xce, 0x12, 0xac, 0x09, 0xac, + 0x0c, 0xfa, 0x14, 0x0c, 0x45, 0xb1, 0x13, 0xb7, 0x23, 0xd1, 0xd0, 0x47, 0x64, 0x43, 0xeb, 0x0c, + 0x7a, 0xb8, 0x5f, 0x99, 0x54, 0xc5, 0x38, 0x08, 0x8b, 0x02, 0xe8, 0x09, 0x18, 0xde, 0x21, 0x51, + 0xe4, 0x6c, 0x4a, 0xf9, 0x37, 0x29, 0xca, 0x0e, 0xaf, 0x71, 0x30, 0x96, 0x78, 0xf4, 0x28, 0x0c, + 0x92, 0x30, 0x0c, 0x42, 0x31, 0x0f, 0xc6, 0x05, 0xe1, 0xe0, 0x32, 0x05, 0x62, 0x8e, 0xb3, 0xff, + 0x8d, 0x05, 0x93, 0xaa, 0xad, 0xbc, 0xae, 0x53, 0x58, 0xde, 0x6f, 0x00, 0x34, 0xe4, 0x07, 0x46, + 0x6c, 0x79, 0x8d, 0x5e, 0x7e, 0x2c, 0x6b, 0xd2, 0x75, 0x76, 0x63, 0xc2, 0x59, 0x81, 0x22, 0xac, + 0x71, 0xb3, 0xff, 0x89, 0x05, 0x67, 0x52, 0x5f, 0x74, 0xdd, 0x8d, 0x62, 0xf4, 0x66, 0xc7, 0x57, + 0xcd, 0xf5, 0xf7, 0x55, 0xb4, 0x34, 0xfb, 0x26, 0x35, 0x4b, 0x24, 0x44, 0xfb, 0xa2, 0xab, 0x30, + 0xe8, 0xc6, 0x64, 0x47, 0x7e, 0xcc, 0xa3, 0x5d, 0x3f, 0x86, 0xb7, 0x2a, 0x19, 0x91, 0x55, 0x5a, + 0x12, 0x73, 0x06, 0xf6, 0x7f, 0xb3, 0xa0, 0xb4, 0x14, 0xf8, 0x1b, 0xee, 0xe6, 0x9a, 0xd3, 0x3a, + 0x85, 0xb1, 0x58, 0x85, 0x01, 0xc6, 0x9d, 0x37, 0xfc, 0xf1, 0xec, 0x86, 0x8b, 0xe6, 0xcc, 0xd1, + 0x5d, 0x8c, 0x6b, 0x0b, 0x4a, 0xfc, 0x50, 0x10, 0x66, 0x2c, 0x66, 0x3f, 0x09, 0x25, 0x45, 0x80, + 0xa6, 0xa0, 0xb8, 0x4d, 0xb8, 0x86, 0x58, 0xc2, 0xf4, 0x27, 0x9a, 0x81, 0xc1, 0x5d, 0xc7, 0x6b, + 0x8b, 0xe5, 0x89, 0xf9, 0x9f, 0x4f, 0x17, 0x5e, 0xb4, 0xec, 0x6f, 0xb3, 0x35, 0x26, 0x2a, 0x59, + 0xf6, 0x77, 0xc5, 0xf2, 0x7f, 0x17, 0x66, 0xbc, 0x0c, 0xa9, 0x23, 0x3a, 0xa2, 0x7f, 0x29, 0xf5, + 0x90, 0x68, 0xeb, 0x4c, 0x16, 0x16, 0x67, 0xd6, 0x41, 0x05, 0x77, 0xd0, 0xa2, 0x33, 0xca, 0xf1, + 0x58, 0x7b, 0xc5, 0xce, 0x7f, 0x53, 0xc0, 0xb0, 0xc2, 0x52, 0x01, 0x31, 0xa3, 0x1a, 0x7f, 0x8d, + 0xec, 0xd5, 0x89, 0x47, 0x1a, 0x71, 0x10, 0x7e, 0xa0, 0xcd, 0x7f, 0x98, 0xf7, 0x3e, 0x97, 0x2f, + 0xa3, 0x82, 0x41, 0xf1, 0x1a, 0xd9, 0xe3, 0x43, 0xa1, 0x7f, 0x5d, 0xb1, 0xeb, 0xd7, 0xfd, 0x86, + 0x05, 0xe3, 0xea, 0xeb, 0x4e, 0x61, 0x21, 0x2d, 0x9a, 0x0b, 0xe9, 0xe1, 0xae, 0xf3, 0x31, 0x67, + 0x09, 0xfd, 0x98, 0x89, 0x00, 0x41, 0x53, 0x0b, 0x03, 0xda, 0x35, 0x54, 0x66, 0x7f, 0x90, 0x03, + 0xd2, 0xcf, 0x77, 0x5d, 0x23, 0x7b, 0xeb, 0x01, 0xdd, 0xf0, 0xb3, 0xbf, 0xcb, 0x18, 0xb5, 0x81, + 0xae, 0xa3, 0xf6, 0x9b, 0x05, 0x38, 0xab, 0x7a, 0xc0, 0xd8, 0x52, 0xff, 0xac, 0xf7, 0xc1, 0xb3, + 0x30, 0xda, 0x24, 0x1b, 0x4e, 0xdb, 0x8b, 0x95, 0x11, 0x30, 0xc8, 0x0d, 0xc1, 0x6a, 0x02, 0xc6, + 0x3a, 0xcd, 0x11, 0xba, 0xed, 0x5f, 0x01, 0x93, 0xbd, 0xb1, 0x43, 0x67, 0x30, 0xd5, 0xb7, 0x34, + 0x53, 0x6e, 0x4c, 0x37, 0xe5, 0x84, 0xd9, 0xf6, 0x28, 0x0c, 0xba, 0x3b, 0x74, 0x2f, 0x2e, 0x98, + 0x5b, 0xec, 0x2a, 0x05, 0x62, 0x8e, 0x43, 0x1f, 0x83, 0xe1, 0x46, 0xb0, 0xb3, 0xe3, 0xf8, 0xcd, + 0x72, 0x91, 0x69, 0x80, 0xa3, 0x74, 0xbb, 0x5e, 0xe2, 0x20, 0x2c, 0x71, 0xe8, 0x21, 0x18, 0x70, + 0xc2, 0xcd, 0xa8, 0x3c, 0xc0, 0x68, 0x46, 0x68, 0x4d, 0x0b, 0xe1, 0x66, 0x84, 0x19, 0x94, 0x6a, + 0x76, 0x77, 0x83, 0x70, 0xdb, 0xf5, 0x37, 0xab, 0x6e, 0xc8, 0xd4, 0x34, 0x4d, 0xb3, 0x7b, 0x5d, + 0x61, 0xb0, 0x46, 0x85, 0x56, 0x60, 0xb0, 0x15, 0x84, 0x71, 0x54, 0x1e, 0x62, 0xdd, 0xfd, 0x48, + 0xce, 0x52, 0xe2, 0x5f, 0x5b, 0x0b, 0xc2, 0x38, 0xf9, 0x00, 0xfa, 0x2f, 0xc2, 0xbc, 0x38, 0xfa, + 0x14, 0x14, 0x89, 0xbf, 0x5b, 0x1e, 0x66, 0x5c, 0x66, 0xb3, 0xb8, 0x2c, 0xfb, 0xbb, 0xb7, 0x9d, + 0x30, 0x91, 0x33, 0xcb, 0xfe, 0x2e, 0xa6, 0x65, 0xd0, 0xe7, 0xa1, 0x24, 0xdd, 0x40, 0x51, 0x79, + 0x24, 0x7f, 0x8a, 0x61, 0x41, 0x84, 0xc9, 0x3b, 0x6d, 0x37, 0x24, 0x3b, 0xc4, 0x8f, 0xa3, 0xc4, + 0x7c, 0x91, 0xd8, 0x08, 0x27, 0xdc, 0xd0, 0xe7, 0x61, 0x8c, 0x6b, 0x7e, 0x6b, 0x41, 0xdb, 0x8f, + 0xa3, 0x72, 0x89, 0x35, 0x2f, 0xd3, 0x67, 0x70, 0x3b, 0xa1, 0x5b, 0x9c, 0x11, 0x4c, 0xc7, 0x34, + 0x60, 0x84, 0x0d, 0x56, 0x08, 0xc3, 0xb8, 0xe7, 0xee, 0x12, 0x9f, 0x44, 0x51, 0x2d, 0x0c, 0xee, + 0x90, 0x32, 0xb0, 0x96, 0x9f, 0xcf, 0x36, 0xa5, 0x83, 0x3b, 0x64, 0x71, 0xfa, 0x60, 0xbf, 0x32, + 0x7e, 0x5d, 0x2f, 0x83, 0x4d, 0x16, 0xe8, 0x16, 0x4c, 0x50, 0x95, 0xd2, 0x4d, 0x98, 0x8e, 0xf6, + 0x62, 0x8a, 0x0e, 0xf6, 0x2b, 0x13, 0xd8, 0x28, 0x84, 0x53, 0x4c, 0xd0, 0xab, 0x50, 0xf2, 0xdc, + 0x0d, 0xd2, 0xd8, 0x6b, 0x78, 0xa4, 0x3c, 0xc6, 0x38, 0x66, 0x2e, 0xab, 0xeb, 0x92, 0x88, 0xab, + 0xec, 0xea, 0x2f, 0x4e, 0x8a, 0xa3, 0xdb, 0x70, 0x2e, 0x26, 0xe1, 0x8e, 0xeb, 0x3b, 0x74, 0x39, + 0x08, 0x7d, 0x92, 0x39, 0x24, 0xc6, 0xd9, 0x7c, 0xbb, 0x20, 0xba, 0xee, 0xdc, 0x7a, 0x26, 0x15, + 0xce, 0x29, 0x8d, 0x6e, 0xc2, 0x24, 0x5b, 0x09, 0xb5, 0xb6, 0xe7, 0xd5, 0x02, 0xcf, 0x6d, 0xec, + 0x95, 0x27, 0x18, 0xc3, 0x8f, 0x49, 0x8f, 0xc3, 0xaa, 0x89, 0xa6, 0x06, 0x56, 0xf2, 0x0f, 0xa7, + 0x4b, 0xa3, 0x3b, 0x30, 0x19, 0x91, 0x46, 0x3b, 0x74, 0xe3, 0x3d, 0x3a, 0x7f, 0xc9, 0xbd, 0xb8, + 0x3c, 0x99, 0x6f, 0x26, 0xd6, 0x4d, 0x52, 0xee, 0xd9, 0x49, 0x01, 0x71, 0x9a, 0x21, 0x5d, 0xda, + 0x51, 0xdc, 0x74, 0xfd, 0xf2, 0x14, 0x93, 0x18, 0x6a, 0x65, 0xd4, 0x29, 0x10, 0x73, 0x1c, 0xb3, + 0xb9, 0xe9, 0x8f, 0x9b, 0x54, 0x82, 0x4e, 0x33, 0xc2, 0xc4, 0xe6, 0x96, 0x08, 0x9c, 0xd0, 0xd0, + 0x6d, 0x39, 0x8e, 0xf7, 0xca, 0x88, 0x91, 0xaa, 0xe5, 0xb2, 0xbe, 0xfe, 0x79, 0x4c, 0xe1, 0xe8, + 0x3a, 0x0c, 0x13, 0x7f, 0x77, 0x25, 0x0c, 0x76, 0xca, 0x67, 0xf2, 0xd7, 0xec, 0x32, 0x27, 0xe1, + 0x02, 0x3d, 0x31, 0x00, 0x04, 0x18, 0x4b, 0x16, 0xe8, 0x1e, 0x94, 0x33, 0x46, 0x84, 0x0f, 0xc0, + 0x0c, 0x1b, 0x80, 0x97, 0x45, 0xd9, 0xf2, 0x7a, 0x0e, 0xdd, 0x61, 0x17, 0x1c, 0xce, 0xe5, 0x6e, + 0xdf, 0x81, 0x09, 0x25, 0x58, 0xd8, 0xd8, 0xa2, 0x0a, 0x0c, 0x52, 0x89, 0x29, 0x8d, 0xe0, 0x12, + 0xed, 0x4a, 0x2a, 0x48, 0x23, 0xcc, 0xe1, 0xac, 0x2b, 0xdd, 0x77, 0xc9, 0xe2, 0x5e, 0x4c, 0xb8, + 0x59, 0x54, 0xd4, 0xba, 0x52, 0x22, 0x70, 0x42, 0x63, 0xff, 0x5f, 0xae, 0x98, 0x24, 0xd2, 0xab, + 0x0f, 0x79, 0xfd, 0x34, 0x8c, 0x6c, 0x05, 0x51, 0x4c, 0xa9, 0x59, 0x1d, 0x83, 0x89, 0x2a, 0x72, + 0x55, 0xc0, 0xb1, 0xa2, 0x40, 0x2f, 0xc1, 0x78, 0x43, 0xaf, 0x40, 0x6c, 0x36, 0x67, 0x45, 0x11, + 0xb3, 0x76, 0x6c, 0xd2, 0xa2, 0x17, 0x61, 0x84, 0x79, 0x86, 0x1b, 0x81, 0x27, 0x0c, 0x30, 0xb9, + 0x63, 0x8e, 0xd4, 0x04, 0xfc, 0x50, 0xfb, 0x8d, 0x15, 0x35, 0x35, 0x63, 0x69, 0x13, 0x56, 0x6b, + 0x42, 0xcc, 0x2b, 0x33, 0xf6, 0x2a, 0x83, 0x62, 0x81, 0xb5, 0xff, 0x6a, 0x41, 0xeb, 0x65, 0x6a, + 0x52, 0x10, 0x54, 0x83, 0xe1, 0xbb, 0x8e, 0x1b, 0xbb, 0xfe, 0xa6, 0xd8, 0xcf, 0x9f, 0xe8, 0x2a, + 0xf3, 0x59, 0xa1, 0xd7, 0x79, 0x01, 0xbe, 0x2b, 0x89, 0x3f, 0x58, 0xb2, 0xa1, 0x1c, 0xc3, 0xb6, + 0xef, 0x53, 0x8e, 0x85, 0x7e, 0x39, 0x62, 0x5e, 0x80, 0x73, 0x14, 0x7f, 0xb0, 0x64, 0x83, 0xde, + 0x04, 0x90, 0xf3, 0x86, 0x34, 0x85, 0x47, 0xf6, 0xe9, 0xde, 0x4c, 0xd7, 0x55, 0x99, 0xc5, 0x09, + 0xba, 0xe7, 0x25, 0xff, 0xb1, 0xc6, 0xcf, 0x8e, 0x99, 0xde, 0xd3, 0xd9, 0x18, 0xf4, 0x05, 0xba, + 0x54, 0x9d, 0x30, 0x26, 0xcd, 0x85, 0x58, 0x74, 0xce, 0x93, 0xfd, 0xa9, 0xad, 0xeb, 0xee, 0x0e, + 0xd1, 0x97, 0xb5, 0x60, 0x82, 0x13, 0x7e, 0xf6, 0x6f, 0x17, 0xa1, 0x9c, 0xd7, 0x5c, 0x3a, 0xe9, + 0xc8, 0x3d, 0x37, 0x5e, 0xa2, 0xea, 0x8a, 0x65, 0x4e, 0xba, 0x65, 0x01, 0xc7, 0x8a, 0x82, 0x8e, + 0x7e, 0xe4, 0x6e, 0x4a, 0xab, 0x63, 0x30, 0x19, 0xfd, 0x3a, 0x83, 0x62, 0x81, 0xa5, 0x74, 0x21, + 0x71, 0x22, 0xe1, 0xf2, 0xd7, 0x66, 0x09, 0x66, 0x50, 0x2c, 0xb0, 0xba, 0xc3, 0x60, 0xa0, 0x87, + 0xc3, 0xc0, 0xe8, 0xa2, 0xc1, 0xe3, 0xed, 0x22, 0xf4, 0x16, 0xc0, 0x86, 0xeb, 0xbb, 0xd1, 0x16, + 0xe3, 0x3e, 0x74, 0x64, 0xee, 0x4a, 0xd9, 0x59, 0x51, 0x5c, 0xb0, 0xc6, 0x11, 0xbd, 0x00, 0xa3, + 0x6a, 0x01, 0xae, 0x56, 0xcb, 0xc3, 0xa6, 0x3f, 0x39, 0x91, 0x46, 0x55, 0xac, 0xd3, 0xd9, 0x6f, + 0xa7, 0xe7, 0x8b, 0x58, 0x01, 0x5a, 0xff, 0x5a, 0xfd, 0xf6, 0x6f, 0xa1, 0x7b, 0xff, 0xda, 0xbf, + 0x5f, 0x84, 0x49, 0xa3, 0xb2, 0x76, 0xd4, 0x87, 0xcc, 0xba, 0x42, 0x37, 0x22, 0x27, 0x26, 0x62, + 0xfd, 0xd9, 0xbd, 0x97, 0x8a, 0xbe, 0x59, 0xd1, 0x15, 0xc0, 0xcb, 0xa3, 0xb7, 0xa0, 0xe4, 0x39, + 0x11, 0x73, 0x3e, 0x10, 0xb1, 0xee, 0xfa, 0x61, 0x96, 0x28, 0xfa, 0x4e, 0x14, 0x6b, 0x7b, 0x01, + 0xe7, 0x9d, 0xb0, 0xa4, 0x3b, 0x26, 0x55, 0x4e, 0xe4, 0x99, 0x92, 0x6a, 0x04, 0xd5, 0x60, 0xf6, + 0x30, 0xc7, 0xa1, 0x17, 0x61, 0x2c, 0x24, 0x6c, 0x56, 0x2c, 0x51, 0x5d, 0x8b, 0x4d, 0xb3, 0xc1, + 0x44, 0x29, 0xc3, 0x1a, 0x0e, 0x1b, 0x94, 0x89, 0xae, 0x3d, 0xd4, 0x45, 0xd7, 0x7e, 0x02, 0x86, + 0xd9, 0x0f, 0x35, 0x03, 0xd4, 0x68, 0xac, 0x72, 0x30, 0x96, 0xf8, 0xf4, 0x84, 0x19, 0xe9, 0x73, + 0xc2, 0x3c, 0x09, 0x13, 0x55, 0x87, 0xec, 0x04, 0xfe, 0xb2, 0xdf, 0x6c, 0x05, 0xae, 0x1f, 0xa3, + 0x32, 0x0c, 0xb0, 0xdd, 0x81, 0xaf, 0xed, 0x01, 0xca, 0x01, 0x0f, 0x50, 0xcd, 0xd9, 0xfe, 0xa3, + 0x02, 0x8c, 0x57, 0x89, 0x47, 0x62, 0xc2, 0x6d, 0x8d, 0x08, 0xad, 0x00, 0xda, 0x0c, 0x9d, 0x06, + 0xa9, 0x91, 0xd0, 0x0d, 0x9a, 0x75, 0xd2, 0x08, 0x7c, 0x76, 0x52, 0x43, 0xb7, 0xbb, 0x73, 0x07, + 0xfb, 0x15, 0x74, 0xa5, 0x03, 0x8b, 0x33, 0x4a, 0xa0, 0x37, 0x60, 0xbc, 0x15, 0x12, 0xc3, 0x87, + 0x66, 0xe5, 0xa9, 0x0b, 0x35, 0x9d, 0x90, 0x6b, 0xaa, 0x06, 0x08, 0x9b, 0xac, 0xd0, 0xe7, 0x60, + 0x2a, 0x08, 0x5b, 0x5b, 0x8e, 0x5f, 0x25, 0x2d, 0xe2, 0x37, 0xa9, 0x2a, 0x2e, 0x7c, 0x04, 0x33, + 0x07, 0xfb, 0x95, 0xa9, 0x9b, 0x29, 0x1c, 0xee, 0xa0, 0x46, 0x6f, 0xc0, 0x74, 0x2b, 0x0c, 0x5a, + 0xce, 0x26, 0x9b, 0x28, 0x42, 0xe3, 0xe0, 0xd2, 0xe7, 0xe9, 0x83, 0xfd, 0xca, 0x74, 0x2d, 0x8d, + 0x3c, 0xdc, 0xaf, 0x9c, 0x61, 0x1d, 0x45, 0x21, 0x09, 0x12, 0x77, 0xb2, 0xb1, 0x37, 0xe1, 0x6c, + 0x35, 0xb8, 0xeb, 0xdf, 0x75, 0xc2, 0xe6, 0x42, 0x6d, 0x55, 0x33, 0xee, 0x6f, 0x48, 0xe3, 0x92, + 0x9f, 0x7b, 0x65, 0xee, 0x53, 0x5a, 0x49, 0xae, 0xfe, 0xaf, 0xb8, 0x1e, 0xc9, 0x71, 0x22, 0xfc, + 0xf5, 0x82, 0x51, 0x53, 0x42, 0xaf, 0x3c, 0xf5, 0x56, 0xae, 0xa7, 0xfe, 0x35, 0x18, 0xd9, 0x70, + 0x89, 0xd7, 0xc4, 0x64, 0x43, 0x8c, 0xcc, 0xe3, 0xf9, 0x07, 0x18, 0x2b, 0x94, 0x52, 0x3a, 0x8d, + 0xb8, 0x69, 0xba, 0x22, 0x0a, 0x63, 0xc5, 0x06, 0x6d, 0xc3, 0x94, 0xb4, 0x7d, 0x24, 0x56, 0x2c, + 0xe2, 0x27, 0xba, 0x19, 0x54, 0x26, 0x73, 0x36, 0x80, 0x38, 0xc5, 0x06, 0x77, 0x30, 0xa6, 0xb6, + 0xe8, 0x0e, 0xdd, 0xae, 0x06, 0xd8, 0x94, 0x66, 0xb6, 0x28, 0x33, 0xab, 0x19, 0xd4, 0xfe, 0xba, + 0x05, 0x0f, 0x74, 0xf4, 0x8c, 0x70, 0x2f, 0x1c, 0xf3, 0x28, 0xa4, 0xcd, 0xfd, 0x42, 0x6f, 0x73, + 0xdf, 0xfe, 0x75, 0x0b, 0x66, 0x96, 0x77, 0x5a, 0xf1, 0x5e, 0xd5, 0x35, 0x4f, 0x13, 0x3e, 0x09, + 0x43, 0x3b, 0xa4, 0xe9, 0xb6, 0x77, 0xc4, 0xc8, 0x55, 0xa4, 0x48, 0x5f, 0x63, 0xd0, 0xc3, 0xfd, + 0xca, 0x78, 0x3d, 0x0e, 0x42, 0x67, 0x93, 0x70, 0x00, 0x16, 0xe4, 0xe8, 0x67, 0xb8, 0x6e, 0x7a, + 0xdd, 0xdd, 0x71, 0xe5, 0x81, 0x54, 0x57, 0x97, 0xd7, 0x9c, 0xec, 0xd0, 0xb9, 0xd7, 0xda, 0x8e, + 0x1f, 0xbb, 0xf1, 0x9e, 0xa9, 0xcb, 0x32, 0x46, 0x38, 0xe1, 0x69, 0x7f, 0xdf, 0x82, 0x49, 0x29, + 0x4f, 0x16, 0x9a, 0xcd, 0x90, 0x44, 0x11, 0x9a, 0x85, 0x82, 0xdb, 0x12, 0x2d, 0x05, 0x51, 0xba, + 0xb0, 0x5a, 0xc3, 0x05, 0xb7, 0x85, 0x6a, 0x50, 0xe2, 0x67, 0x5b, 0xc9, 0x04, 0xeb, 0xeb, 0x84, + 0x8c, 0xd9, 0x7e, 0xeb, 0xb2, 0x24, 0x4e, 0x98, 0x48, 0xcd, 0x98, 0xed, 0x45, 0x45, 0xf3, 0xa4, + 0xe5, 0xaa, 0x80, 0x63, 0x45, 0x81, 0x2e, 0xc1, 0x88, 0x1f, 0x34, 0xf9, 0x51, 0x23, 0x5f, 0xd7, + 0x6c, 0xda, 0xde, 0x10, 0x30, 0xac, 0xb0, 0xf6, 0xcf, 0x5b, 0x30, 0x26, 0xbf, 0xac, 0x4f, 0x25, + 0x9d, 0x2e, 0xaf, 0x44, 0x41, 0x4f, 0x96, 0x17, 0x55, 0xb2, 0x19, 0xc6, 0xd0, 0xad, 0x8b, 0x47, + 0xd1, 0xad, 0xed, 0xaf, 0x15, 0x60, 0x42, 0x36, 0xa7, 0xde, 0xbe, 0x13, 0x91, 0x18, 0xad, 0x43, + 0xc9, 0xe1, 0x5d, 0x4e, 0xe4, 0xac, 0x7d, 0x34, 0xdb, 0xea, 0x32, 0xc6, 0x27, 0x19, 0xd1, 0x05, + 0x59, 0x1a, 0x27, 0x8c, 0x90, 0x07, 0xd3, 0x7e, 0x10, 0xb3, 0xad, 0x4f, 0xe1, 0xbb, 0x9d, 0x0d, + 0xa4, 0xb9, 0x9f, 0x17, 0xdc, 0xa7, 0x6f, 0xa4, 0xb9, 0xe0, 0x4e, 0xc6, 0x68, 0x59, 0x7a, 0x7a, + 0x8a, 0xac, 0x86, 0x8b, 0xdd, 0x6a, 0xc8, 0x77, 0xf4, 0xd8, 0xbf, 0x67, 0x41, 0x49, 0x92, 0x9d, + 0xc6, 0x31, 0xd0, 0x1a, 0x0c, 0x47, 0x6c, 0x10, 0x64, 0xd7, 0xd8, 0xdd, 0x1a, 0xce, 0xc7, 0x2b, + 0xd9, 0xd1, 0xf9, 0xff, 0x08, 0x4b, 0x1e, 0xcc, 0x55, 0xad, 0x9a, 0xff, 0x21, 0x71, 0x55, 0xab, + 0xf6, 0xe4, 0xec, 0x32, 0xff, 0x91, 0xb5, 0x59, 0xb3, 0xe7, 0xa9, 0xe2, 0xd9, 0x0a, 0xc9, 0x86, + 0x7b, 0x2f, 0xad, 0x78, 0xd6, 0x18, 0x14, 0x0b, 0x2c, 0x7a, 0x13, 0xc6, 0x1a, 0xd2, 0xc3, 0x9b, + 0x88, 0x81, 0xc7, 0xba, 0xfa, 0xcb, 0xd5, 0xd1, 0x0a, 0x0f, 0xc8, 0x59, 0xd2, 0xca, 0x63, 0x83, + 0x1b, 0x95, 0x30, 0xc9, 0xa9, 0x70, 0xb1, 0xab, 0x73, 0x25, 0x24, 0x71, 0xc2, 0x37, 0xf7, 0x40, + 0xd8, 0xfe, 0x15, 0x0b, 0x86, 0xb8, 0x9f, 0xb0, 0x3f, 0xc7, 0xaa, 0x76, 0x54, 0x94, 0xf4, 0xdd, + 0x6d, 0x0a, 0x14, 0x27, 0x47, 0x68, 0x0d, 0x4a, 0xec, 0x07, 0xf3, 0x97, 0x14, 0xf3, 0x23, 0x91, + 0x78, 0xad, 0x7a, 0x03, 0x6f, 0xcb, 0x62, 0x38, 0xe1, 0x60, 0xff, 0x62, 0x91, 0x8a, 0xaa, 0x84, + 0xd4, 0xd8, 0xc5, 0xad, 0x93, 0xdb, 0xc5, 0x0b, 0x27, 0xb5, 0x8b, 0x6f, 0xc2, 0x64, 0x43, 0x3b, + 0x97, 0x4a, 0x46, 0xf2, 0x52, 0xd7, 0x49, 0xa2, 0x1d, 0x61, 0x71, 0x5f, 0xd9, 0x92, 0xc9, 0x04, + 0xa7, 0xb9, 0xa2, 0x2f, 0xc0, 0x18, 0x1f, 0x67, 0x51, 0xcb, 0x00, 0xab, 0xe5, 0x63, 0xf9, 0xf3, + 0x45, 0xaf, 0x82, 0xcd, 0xc4, 0xba, 0x56, 0x1c, 0x1b, 0xcc, 0xec, 0xaf, 0x0c, 0xc2, 0xe0, 0xf2, + 0x2e, 0xf1, 0xe3, 0x53, 0x10, 0x48, 0x0d, 0x98, 0x70, 0xfd, 0xdd, 0xc0, 0xdb, 0x25, 0x4d, 0x8e, + 0x3f, 0xca, 0xe6, 0x7a, 0x4e, 0xb0, 0x9e, 0x58, 0x35, 0x58, 0xe0, 0x14, 0xcb, 0x93, 0xb0, 0xdc, + 0xaf, 0xc0, 0x10, 0x1f, 0x7b, 0x61, 0xb6, 0x67, 0x7a, 0xc1, 0x59, 0x27, 0x8a, 0x55, 0x90, 0x78, + 0x15, 0xb8, 0xdb, 0x5d, 0x14, 0x47, 0x6f, 0xc3, 0xc4, 0x86, 0x1b, 0x46, 0x31, 0x35, 0xb9, 0xa3, + 0xd8, 0xd9, 0x69, 0xdd, 0x87, 0xa5, 0xae, 0xfa, 0x61, 0xc5, 0xe0, 0x84, 0x53, 0x9c, 0xd1, 0x26, + 0x8c, 0x53, 0xe3, 0x31, 0xa9, 0x6a, 0xf8, 0xc8, 0x55, 0x29, 0x57, 0xdc, 0x75, 0x9d, 0x11, 0x36, + 0xf9, 0x52, 0x61, 0xd2, 0x60, 0xc6, 0xe6, 0x08, 0xd3, 0x28, 0x94, 0x30, 0xe1, 0x56, 0x26, 0xc7, + 0x51, 0x99, 0xc4, 0xe2, 0x39, 0x4a, 0xa6, 0x4c, 0x4a, 0xa2, 0x36, 0xec, 0x6f, 0xd0, 0xdd, 0x91, + 0xf6, 0xe1, 0x29, 0x6c, 0x2d, 0xaf, 0x98, 0x5b, 0xcb, 0xf9, 0xdc, 0xf1, 0xcc, 0xd9, 0x56, 0xbe, + 0x08, 0xa3, 0xda, 0x70, 0xa3, 0x79, 0x28, 0x35, 0x64, 0xf0, 0x81, 0x90, 0xba, 0x4a, 0x7d, 0x51, + 0x51, 0x09, 0x38, 0xa1, 0xa1, 0xbd, 0x41, 0x95, 0xbd, 0x74, 0x30, 0x12, 0x55, 0x05, 0x31, 0xc3, + 0xd8, 0xcf, 0x01, 0x2c, 0xdf, 0x23, 0x8d, 0x05, 0x6e, 0x7c, 0x69, 0x67, 0x5c, 0x56, 0xfe, 0x19, + 0x17, 0xdd, 0xa1, 0x27, 0x56, 0x96, 0x0c, 0xa5, 0x7c, 0x0e, 0x80, 0x6b, 0xa1, 0xaf, 0xbf, 0x7e, + 0x43, 0x7a, 0x87, 0xb9, 0x83, 0x4f, 0x41, 0xb1, 0x46, 0x81, 0xce, 0x43, 0xd1, 0x6b, 0xfb, 0x42, + 0x39, 0x1c, 0x3e, 0xd8, 0xaf, 0x14, 0xaf, 0xb7, 0x7d, 0x4c, 0x61, 0x5a, 0xfc, 0x4f, 0xb1, 0xef, + 0xf8, 0x9f, 0xde, 0xf1, 0xaf, 0xff, 0x7f, 0x11, 0xa6, 0x56, 0x3c, 0x72, 0xcf, 0x68, 0xf5, 0x63, + 0x30, 0xd4, 0x0c, 0xdd, 0x5d, 0x12, 0xa6, 0x37, 0xe9, 0x2a, 0x83, 0x62, 0x81, 0xed, 0x3b, 0x24, + 0xe9, 0x56, 0xe7, 0x76, 0x7b, 0xdc, 0x41, 0x58, 0x3d, 0xbf, 0x14, 0xbd, 0x09, 0xc3, 0xfc, 0x24, + 0x34, 0x2a, 0x0f, 0xb2, 0x69, 0xf7, 0x6c, 0x56, 0x13, 0xd2, 0x7d, 0x31, 0x27, 0x7c, 0x1b, 0x3c, + 0x2c, 0x44, 0xc9, 0x28, 0x01, 0xc5, 0x92, 0xe5, 0xec, 0xa7, 0x61, 0x4c, 0xa7, 0x3c, 0x52, 0x7c, + 0xc8, 0x5f, 0xb0, 0xe0, 0xcc, 0x8a, 0x17, 0x34, 0xb6, 0x53, 0xf1, 0x61, 0x2f, 0xc0, 0x28, 0x5d, + 0x2e, 0x91, 0x11, 0x28, 0x69, 0x04, 0x91, 0x0a, 0x14, 0xd6, 0xe9, 0xb4, 0x62, 0xb7, 0x6e, 0xad, + 0x56, 0xb3, 0x62, 0x4f, 0x05, 0x0a, 0xeb, 0x74, 0xf6, 0x1f, 0x58, 0xf0, 0xf0, 0x95, 0xa5, 0xe5, + 0x1a, 0x09, 0x23, 0x37, 0x8a, 0x89, 0x1f, 0x77, 0x84, 0xbf, 0x52, 0xdd, 0xad, 0xa9, 0x35, 0x25, + 0xd1, 0xdd, 0xaa, 0xac, 0x15, 0x02, 0xfb, 0x61, 0x09, 0xed, 0xfe, 0x35, 0x0b, 0xce, 0x5c, 0x71, + 0x63, 0x4c, 0x5a, 0x41, 0x3a, 0xfc, 0x34, 0x24, 0xad, 0x20, 0x72, 0xe3, 0x20, 0xdc, 0x4b, 0x87, + 0x9f, 0x62, 0x85, 0xc1, 0x1a, 0x15, 0xaf, 0x79, 0xd7, 0x8d, 0x68, 0x4b, 0x0b, 0xa6, 0x01, 0x89, + 0x05, 0x1c, 0x2b, 0x0a, 0xfa, 0x61, 0x4d, 0x37, 0x64, 0x0a, 0xc0, 0x9e, 0x58, 0xad, 0xea, 0xc3, + 0xaa, 0x12, 0x81, 0x13, 0x1a, 0xfb, 0xeb, 0x16, 0x9c, 0xbd, 0xe2, 0xb5, 0xa3, 0x98, 0x84, 0x1b, + 0x91, 0xd1, 0xd8, 0xe7, 0xa0, 0x44, 0xa4, 0x92, 0x2d, 0xda, 0xaa, 0xb6, 0x05, 0xa5, 0x7d, 0xf3, + 0xd8, 0x57, 0x45, 0xd7, 0x47, 0xb0, 0xe5, 0xd1, 0x82, 0x04, 0xbf, 0x55, 0x80, 0xf1, 0xab, 0xeb, + 0xeb, 0xb5, 0x2b, 0x24, 0x16, 0x12, 0xb1, 0xb7, 0x93, 0x08, 0x6b, 0x76, 0x6e, 0x37, 0x55, 0xa6, + 0x1d, 0xbb, 0xde, 0x1c, 0xbf, 0x76, 0x30, 0xb7, 0xea, 0xc7, 0x37, 0xc3, 0x7a, 0x1c, 0xba, 0xfe, + 0x66, 0xa6, 0x65, 0x2c, 0xe5, 0x76, 0x31, 0x4f, 0x6e, 0xa3, 0xe7, 0x60, 0x88, 0xdd, 0x7b, 0x90, + 0x4a, 0xc5, 0x83, 0x4a, 0x13, 0x60, 0xd0, 0xc3, 0xfd, 0x4a, 0xe9, 0x16, 0x5e, 0xe5, 0x7f, 0xb0, + 0x20, 0x45, 0xb7, 0x60, 0x74, 0x2b, 0x8e, 0x5b, 0x57, 0x89, 0xd3, 0x24, 0xa1, 0x94, 0x0e, 0x17, + 0xb2, 0xa4, 0x03, 0xed, 0x04, 0x4e, 0x96, 0x2c, 0xa8, 0x04, 0x16, 0x61, 0x9d, 0x8f, 0x5d, 0x07, + 0x48, 0x70, 0xc7, 0x64, 0x15, 0xd8, 0x3f, 0xb2, 0x60, 0xf8, 0xaa, 0xe3, 0x37, 0x3d, 0x12, 0xa2, + 0x97, 0x61, 0x80, 0xdc, 0x23, 0x0d, 0xb1, 0x41, 0x67, 0x36, 0x38, 0xd9, 0xc4, 0xb8, 0x9f, 0x8b, + 0xfe, 0xc7, 0xac, 0x14, 0xba, 0x0a, 0xc3, 0xb4, 0xb5, 0x57, 0x54, 0x14, 0xf2, 0x23, 0x79, 0x5f, + 0xac, 0x86, 0x9d, 0xef, 0x7b, 0x02, 0x84, 0x65, 0x71, 0xe6, 0xaf, 0x69, 0xb4, 0xea, 0x54, 0x80, + 0xc5, 0xdd, 0xac, 0xa9, 0xf5, 0xa5, 0x1a, 0x27, 0x12, 0xdc, 0xb8, 0xbf, 0x46, 0x02, 0x71, 0xc2, + 0xc4, 0x5e, 0x87, 0x12, 0x1d, 0xd4, 0x05, 0xcf, 0x75, 0xba, 0xbb, 0x8a, 0x9e, 0x82, 0x92, 0x74, + 0xdb, 0x44, 0x22, 0x90, 0x99, 0x71, 0x95, 0x5e, 0x9d, 0x08, 0x27, 0x78, 0xfb, 0x45, 0x98, 0x61, + 0xe7, 0xa0, 0x4e, 0xbc, 0x65, 0xac, 0xb1, 0x9e, 0x93, 0xd9, 0xfe, 0xe6, 0x00, 0x4c, 0xaf, 0xd6, + 0x97, 0xea, 0xa6, 0x37, 0xf0, 0x45, 0x18, 0xe3, 0x5b, 0x37, 0x9d, 0xa2, 0x8e, 0x27, 0xca, 0x2b, + 0x6f, 0xff, 0xba, 0x86, 0xc3, 0x06, 0x25, 0x7a, 0x18, 0x8a, 0xee, 0x3b, 0x7e, 0x3a, 0x7e, 0x6d, + 0xf5, 0xb5, 0x1b, 0x98, 0xc2, 0x29, 0x9a, 0x6a, 0x01, 0x5c, 0x24, 0x2a, 0xb4, 0xd2, 0x04, 0x5e, + 0x81, 0x09, 0x37, 0x6a, 0x44, 0xee, 0xaa, 0x4f, 0xe5, 0x85, 0xd3, 0x90, 0x93, 0x3d, 0x51, 0xd1, + 0x69, 0x53, 0x15, 0x16, 0xa7, 0xa8, 0x35, 0xf9, 0x3c, 0xd8, 0xb7, 0x26, 0xd1, 0x33, 0xc8, 0x99, + 0x2a, 0x49, 0x2d, 0xf6, 0x75, 0x11, 0x8b, 0xa5, 0x11, 0x4a, 0x12, 0xff, 0xe0, 0x08, 0x4b, 0x1c, + 0xba, 0x02, 0xd3, 0x8d, 0x2d, 0xa7, 0xb5, 0xd0, 0x8e, 0xb7, 0xaa, 0x6e, 0xd4, 0x08, 0x76, 0x49, + 0xb8, 0xc7, 0x54, 0xd7, 0x91, 0xc4, 0x2b, 0xa4, 0x10, 0x4b, 0x57, 0x17, 0x6a, 0x94, 0x12, 0x77, + 0x96, 0x31, 0x95, 0x0a, 0x38, 0x36, 0xa5, 0x62, 0x01, 0x26, 0x65, 0x5d, 0x75, 0x12, 0x31, 0x81, + 0x3f, 0xca, 0x5a, 0xa7, 0x2e, 0x90, 0x08, 0xb0, 0x6a, 0x5b, 0x9a, 0xde, 0x7e, 0x1b, 0x4a, 0x2a, + 0xce, 0x4b, 0x86, 0x2a, 0x5a, 0x39, 0xa1, 0x8a, 0xbd, 0x45, 0xb5, 0xf4, 0x56, 0x17, 0x33, 0xbd, + 0xd5, 0x7f, 0xc3, 0x82, 0x24, 0xdc, 0x05, 0x5d, 0x85, 0x52, 0x2b, 0x60, 0x27, 0x56, 0xa1, 0x3c, + 0x06, 0x7e, 0x30, 0x73, 0x55, 0x73, 0x09, 0xc2, 0xbb, 0xa1, 0x26, 0x4b, 0xe0, 0xa4, 0x30, 0x5a, + 0x84, 0xe1, 0x56, 0x48, 0xea, 0x31, 0xbb, 0x1f, 0xd0, 0x93, 0x0f, 0x1f, 0x6a, 0x4e, 0x8f, 0x65, + 0x41, 0xfb, 0x37, 0x2d, 0x00, 0xee, 0x0c, 0x76, 0xfc, 0x4d, 0x72, 0x0a, 0x06, 0x6e, 0x15, 0x06, + 0xa2, 0x16, 0x69, 0x74, 0x3b, 0x4b, 0x4c, 0xda, 0x53, 0x6f, 0x91, 0x46, 0xd2, 0xe1, 0xf4, 0x1f, + 0x66, 0xa5, 0xed, 0x9f, 0x03, 0x98, 0x48, 0xc8, 0xa8, 0xe1, 0x81, 0x9e, 0x31, 0xc2, 0xe1, 0xcf, + 0xa7, 0xc2, 0xe1, 0x4b, 0x8c, 0x5a, 0x8b, 0x80, 0x7f, 0x1b, 0x8a, 0x3b, 0xce, 0x3d, 0x61, 0xdd, + 0x3c, 0xd5, 0xbd, 0x19, 0x94, 0xff, 0xdc, 0x9a, 0x73, 0x8f, 0x2b, 0x98, 0x4f, 0xc9, 0x09, 0xb2, + 0xe6, 0xdc, 0x3b, 0xe4, 0x27, 0x86, 0x4c, 0xd6, 0x50, 0x23, 0xea, 0xbd, 0x3f, 0x4e, 0xfe, 0xb3, + 0x6d, 0x83, 0x56, 0xc2, 0xea, 0x72, 0x7d, 0xe1, 0x1a, 0xed, 0xab, 0x2e, 0xd7, 0x4f, 0xd7, 0xe5, + 0xfa, 0x7d, 0xd4, 0xe5, 0xfa, 0xe8, 0x5d, 0x18, 0x16, 0x47, 0x11, 0x2c, 0x8e, 0x6f, 0xf4, 0xf2, + 0x7c, 0x1f, 0xf5, 0x89, 0x93, 0x0c, 0x5e, 0xe7, 0xbc, 0x54, 0xa0, 0x05, 0xb4, 0x67, 0xbd, 0xb2, + 0x42, 0xf4, 0xd7, 0x2c, 0x98, 0x10, 0xbf, 0x31, 0x79, 0xa7, 0x4d, 0xa2, 0x58, 0x6c, 0xd4, 0x9f, + 0xe8, 0xbf, 0x0d, 0xa2, 0x20, 0x6f, 0xca, 0x27, 0xa4, 0xb4, 0x34, 0x91, 0x3d, 0x5b, 0x94, 0x6a, + 0x05, 0xfa, 0x87, 0x16, 0xcc, 0xec, 0x38, 0xf7, 0x78, 0x8d, 0x1c, 0x86, 0x9d, 0xd8, 0x0d, 0x44, + 0x5c, 0xe2, 0xcb, 0xfd, 0x0d, 0x7f, 0x47, 0x71, 0xde, 0x48, 0x19, 0xc2, 0x34, 0x93, 0x45, 0xd2, + 0xb3, 0xa9, 0x99, 0xed, 0x9a, 0xdd, 0x80, 0x11, 0x39, 0xdf, 0x32, 0xcc, 0x94, 0xaa, 0xae, 0x85, + 0x1c, 0xf9, 0x24, 0x48, 0x33, 0x6b, 0x58, 0x3d, 0x62, 0xae, 0x9d, 0x68, 0x3d, 0x6f, 0xc3, 0x98, + 0x3e, 0xc7, 0x4e, 0xb4, 0xae, 0x77, 0xe0, 0x4c, 0xc6, 0x5c, 0x3a, 0xd1, 0x2a, 0xef, 0xc2, 0xf9, + 0xdc, 0xf9, 0x71, 0x92, 0x15, 0xdb, 0xdf, 0xb2, 0x74, 0x39, 0x78, 0x0a, 0x6e, 0xa1, 0x25, 0xd3, + 0x2d, 0x74, 0xa1, 0xfb, 0xca, 0xc9, 0xf1, 0x0d, 0xbd, 0xa9, 0x37, 0x9a, 0x4a, 0x75, 0xf4, 0x2a, + 0x0c, 0x79, 0x14, 0x22, 0xcf, 0xbf, 0xec, 0xde, 0x2b, 0x32, 0x51, 0x89, 0x18, 0x3c, 0xc2, 0x82, + 0x83, 0xfd, 0x3b, 0x16, 0x0c, 0x9c, 0x42, 0x4f, 0x60, 0xb3, 0x27, 0x9e, 0xc9, 0x65, 0x2d, 0x2e, + 0x7b, 0xcf, 0x61, 0xe7, 0xee, 0xf2, 0xbd, 0x98, 0xf8, 0x11, 0xd3, 0xab, 0x33, 0x3b, 0xe6, 0xff, + 0x14, 0x60, 0x94, 0x56, 0x25, 0x83, 0x35, 0x5e, 0x82, 0x71, 0xcf, 0xb9, 0x43, 0x3c, 0xe9, 0xaa, + 0x4e, 0x5b, 0x97, 0xd7, 0x75, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x0d, 0xdd, 0x6b, 0x2f, 0xf4, 0x17, + 0x55, 0xd8, 0x70, 0xe9, 0x63, 0x93, 0x96, 0x1a, 0x3a, 0x77, 0x9d, 0xb8, 0xb1, 0x25, 0x2c, 0x4f, + 0xd5, 0xdc, 0xd7, 0x29, 0x10, 0x73, 0x1c, 0xd5, 0xc3, 0xe4, 0xec, 0xbc, 0x4d, 0x42, 0xa6, 0x87, + 0x71, 0x2d, 0x57, 0xe9, 0x61, 0xd8, 0x44, 0xe3, 0x34, 0x3d, 0xfa, 0x34, 0x4c, 0xd0, 0xce, 0x09, + 0xda, 0xb1, 0x0c, 0x45, 0x19, 0x64, 0xa1, 0x28, 0x2c, 0xf2, 0x78, 0xdd, 0xc0, 0xe0, 0x14, 0x25, + 0xaa, 0xc1, 0x8c, 0xeb, 0x37, 0xbc, 0x76, 0x93, 0xdc, 0xf2, 0x5d, 0xdf, 0x8d, 0x5d, 0xc7, 0x73, + 0xdf, 0x25, 0x4d, 0xa1, 0x07, 0xab, 0xa8, 0xa1, 0xd5, 0x0c, 0x1a, 0x9c, 0x59, 0xd2, 0xfe, 0x19, + 0x38, 0x73, 0x3d, 0x70, 0x9a, 0x8b, 0x8e, 0xe7, 0xf8, 0x0d, 0x12, 0xae, 0xfa, 0x9b, 0x3d, 0x0f, + 0xc2, 0xf5, 0x63, 0xeb, 0x42, 0xaf, 0x63, 0x6b, 0x7b, 0x0b, 0x90, 0x5e, 0x81, 0x08, 0xc1, 0xc2, + 0x30, 0xec, 0xf2, 0xaa, 0xc4, 0xf4, 0x7f, 0x3c, 0x5b, 0x49, 0xee, 0x68, 0x99, 0x16, 0x5c, 0xc4, + 0x01, 0x58, 0x32, 0xa2, 0x86, 0x54, 0x96, 0x56, 0xdd, 0xdb, 0xc6, 0xb5, 0x5f, 0x80, 0x69, 0x56, + 0xf2, 0x88, 0xf6, 0xd7, 0x5f, 0xb6, 0x60, 0xf2, 0x46, 0xea, 0xee, 0xe9, 0x63, 0x30, 0x14, 0x91, + 0x30, 0xc3, 0x49, 0x59, 0x67, 0x50, 0x2c, 0xb0, 0xc7, 0xee, 0x0c, 0xf9, 0xb1, 0x05, 0x25, 0x16, + 0xdb, 0xdb, 0xa2, 0xb6, 0xd4, 0xc9, 0x2b, 0xb5, 0x4b, 0x86, 0x52, 0x9b, 0x69, 0xa4, 0xab, 0xe6, + 0xe4, 0xe9, 0xb4, 0xe8, 0x9a, 0xba, 0x93, 0xd9, 0xc5, 0x3e, 0x4f, 0xd8, 0xf0, 0x1b, 0x7c, 0x13, + 0xe6, 0xc5, 0x4d, 0x79, 0x4b, 0x93, 0x9d, 0x44, 0x2b, 0xda, 0x0f, 0xc9, 0x49, 0xb4, 0x6a, 0x4f, + 0x8e, 0xf4, 0xab, 0x69, 0x4d, 0x66, 0xbb, 0xc2, 0x67, 0x59, 0xc4, 0x26, 0x5b, 0x9b, 0xea, 0xf2, + 0x72, 0x45, 0x44, 0x60, 0x0a, 0xe8, 0x21, 0x13, 0x64, 0xe2, 0x1f, 0xbf, 0x91, 0x9e, 0x14, 0xb1, + 0xaf, 0xc2, 0x64, 0xaa, 0xc3, 0xd0, 0x0b, 0x30, 0xd8, 0xda, 0x72, 0x22, 0x92, 0x8a, 0xc0, 0x19, + 0xac, 0x51, 0xe0, 0xe1, 0x7e, 0x65, 0x42, 0x15, 0x60, 0x10, 0xcc, 0xa9, 0xed, 0xff, 0x6a, 0xc1, + 0xc0, 0x8d, 0xa0, 0x79, 0x1a, 0x93, 0xe9, 0x15, 0x63, 0x32, 0x3d, 0x94, 0x97, 0xd9, 0x22, 0x77, + 0x1e, 0xad, 0xa4, 0xe6, 0xd1, 0x85, 0x5c, 0x0e, 0xdd, 0xa7, 0xd0, 0x0e, 0x8c, 0xb2, 0x7c, 0x19, + 0x22, 0x1a, 0xe8, 0x39, 0xc3, 0xbe, 0xaa, 0xa4, 0xec, 0xab, 0x49, 0x8d, 0x54, 0xb3, 0xb2, 0x9e, + 0x80, 0x61, 0x11, 0x91, 0x92, 0x8e, 0x4d, 0x15, 0xb4, 0x58, 0xe2, 0xed, 0x5f, 0x29, 0x82, 0x91, + 0x9f, 0x03, 0xfd, 0x9e, 0x05, 0x73, 0x21, 0xbf, 0x8d, 0xd3, 0xac, 0xb6, 0x43, 0xd7, 0xdf, 0xac, + 0x37, 0xb6, 0x48, 0xb3, 0xed, 0xb9, 0xfe, 0xe6, 0xea, 0xa6, 0x1f, 0x28, 0xf0, 0xf2, 0x3d, 0xd2, + 0x68, 0x33, 0x07, 0x75, 0x8f, 0x64, 0x20, 0xea, 0xc4, 0xf7, 0xf2, 0xc1, 0x7e, 0x65, 0x0e, 0x1f, + 0x89, 0x37, 0x3e, 0x62, 0x5b, 0xd0, 0x1f, 0x58, 0x30, 0xcf, 0xd3, 0x56, 0xf4, 0xdf, 0xfe, 0x2e, + 0xd6, 0x68, 0x4d, 0xb2, 0x4a, 0x98, 0xac, 0x93, 0x70, 0x67, 0xf1, 0x93, 0xa2, 0x43, 0xe7, 0x6b, + 0x47, 0xab, 0x0b, 0x1f, 0xb5, 0x71, 0xf6, 0x3f, 0x2f, 0xc2, 0x38, 0xed, 0xc5, 0xe4, 0x06, 0xfa, + 0x0b, 0xc6, 0x94, 0x78, 0x24, 0x35, 0x25, 0xa6, 0x0d, 0xe2, 0xe3, 0xb9, 0x7c, 0x1e, 0xc1, 0xb4, + 0xe7, 0x44, 0xf1, 0x55, 0xe2, 0x84, 0xf1, 0x1d, 0xe2, 0xb0, 0x23, 0x56, 0x31, 0xcd, 0x8f, 0x72, + 0x6a, 0xab, 0xbc, 0x58, 0xd7, 0xd3, 0xcc, 0x70, 0x27, 0x7f, 0xb4, 0x0b, 0x88, 0x1d, 0xe7, 0x86, + 0x8e, 0x1f, 0xf1, 0x6f, 0x71, 0x85, 0xf3, 0xfa, 0x68, 0xb5, 0xce, 0x8a, 0x5a, 0xd1, 0xf5, 0x0e, + 0x6e, 0x38, 0xa3, 0x06, 0xed, 0x98, 0x7e, 0xb0, 0xdf, 0x63, 0xfa, 0xa1, 0x1e, 0x01, 0xe0, 0x3f, + 0x0b, 0x67, 0xe8, 0xa8, 0x98, 0xf1, 0xc3, 0x11, 0x22, 0x30, 0xb9, 0xdd, 0xbe, 0x43, 0x3c, 0x12, + 0x4b, 0x98, 0x58, 0x4a, 0x99, 0x7a, 0xb8, 0x59, 0x3a, 0x51, 0xf6, 0xae, 0x99, 0x2c, 0x70, 0x9a, + 0xa7, 0xfd, 0xab, 0x16, 0xb0, 0x08, 0xbd, 0x53, 0xd8, 0x8f, 0x3e, 0x63, 0xee, 0x47, 0xe5, 0x3c, + 0x91, 0x90, 0xb3, 0x15, 0x3d, 0x0f, 0x53, 0x14, 0x5b, 0x0b, 0x83, 0x7b, 0x7b, 0x52, 0x19, 0xef, + 0xad, 0x02, 0xfd, 0x6f, 0x8b, 0xaf, 0x10, 0x75, 0x5b, 0x10, 0x7d, 0x09, 0x46, 0x1a, 0x4e, 0xcb, + 0x69, 0xf0, 0x4c, 0x45, 0xb9, 0xee, 0x18, 0xa3, 0xd0, 0xdc, 0x92, 0x28, 0xc1, 0xdd, 0x0b, 0x1f, + 0x97, 0x5f, 0x29, 0xc1, 0x3d, 0x5d, 0x0a, 0xaa, 0xca, 0xd9, 0x6d, 0x18, 0x37, 0x98, 0x9d, 0xa8, + 0x2d, 0xfa, 0x25, 0x2e, 0xbf, 0x95, 0x09, 0xb1, 0x03, 0xd3, 0xbe, 0xf6, 0x9f, 0x4a, 0x2b, 0xa9, + 0xdf, 0x7e, 0xb4, 0x97, 0x84, 0x66, 0xa2, 0x4d, 0x8b, 0x40, 0x4c, 0xb1, 0xc1, 0x9d, 0x9c, 0xed, + 0xbf, 0x6d, 0xc1, 0x03, 0x3a, 0xa1, 0x76, 0x91, 0xb3, 0x97, 0x83, 0xb7, 0x0a, 0x23, 0x41, 0x8b, + 0x84, 0x4e, 0x62, 0x24, 0x5d, 0x92, 0x9d, 0x7e, 0x53, 0xc0, 0x0f, 0xf7, 0x2b, 0x33, 0x3a, 0x77, + 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x88, 0x75, 0x46, 0x24, 0x2e, 0xd9, 0xb2, 0x6c, 0x3e, 0xec, + 0x60, 0x28, 0xc2, 0x02, 0x63, 0xff, 0x9c, 0xc5, 0x27, 0x96, 0xde, 0x74, 0xf4, 0x0e, 0x4c, 0xed, + 0x50, 0x7b, 0x6a, 0xf9, 0x5e, 0x2b, 0xe4, 0xee, 0x69, 0xd9, 0x4f, 0x4f, 0xf5, 0xea, 0x27, 0xed, + 0x23, 0x17, 0xcb, 0xa2, 0xcd, 0x53, 0x6b, 0x29, 0x66, 0xb8, 0x83, 0xbd, 0xfd, 0x37, 0x0b, 0x7c, + 0x25, 0x32, 0x35, 0xeb, 0x09, 0x18, 0x6e, 0x05, 0xcd, 0xa5, 0xd5, 0x2a, 0x16, 0x3d, 0xa4, 0xe4, + 0x47, 0x8d, 0x83, 0xb1, 0xc4, 0xa3, 0xcb, 0x00, 0xe4, 0x5e, 0x4c, 0x42, 0xdf, 0xf1, 0xd4, 0xb1, + 0xb5, 0xd2, 0x66, 0x96, 0x15, 0x06, 0x6b, 0x54, 0xb4, 0x4c, 0x2b, 0x0c, 0x76, 0xdd, 0x26, 0xbb, + 0xe5, 0x50, 0x34, 0xcb, 0xd4, 0x14, 0x06, 0x6b, 0x54, 0xd4, 0x76, 0x6d, 0xfb, 0x11, 0xdf, 0x91, + 0x9c, 0x3b, 0x22, 0x93, 0xcc, 0x48, 0x62, 0xbb, 0xde, 0xd2, 0x91, 0xd8, 0xa4, 0x45, 0x0b, 0x30, + 0x14, 0x3b, 0xec, 0x30, 0x76, 0x30, 0x3f, 0x76, 0x65, 0x9d, 0x52, 0xe8, 0x09, 0x7b, 0x68, 0x01, + 0x2c, 0x0a, 0xda, 0x5f, 0x2e, 0x01, 0x24, 0x2a, 0x12, 0x7a, 0xb7, 0x63, 0x19, 0x3f, 0xdd, 0x5d, + 0xa9, 0x3a, 0xbe, 0x35, 0x8c, 0xbe, 0x62, 0xc1, 0xa8, 0xe3, 0x79, 0x41, 0xc3, 0x89, 0x59, 0x4f, + 0x14, 0xba, 0x8b, 0x11, 0x51, 0xff, 0x42, 0x52, 0x82, 0x37, 0xe1, 0x39, 0x79, 0x16, 0xaa, 0x61, + 0x7a, 0xb6, 0x42, 0xaf, 0x18, 0x7d, 0x5c, 0x6a, 0xce, 0x7c, 0x08, 0x67, 0xd3, 0x9a, 0x73, 0x89, + 0x49, 0x4c, 0x4d, 0x69, 0x46, 0xb7, 0x8c, 0x24, 0x2b, 0x03, 0xf9, 0xf7, 0x49, 0x0d, 0x4d, 0xa1, + 0x57, 0x7e, 0x15, 0x54, 0xd3, 0xe3, 0xa5, 0x07, 0xf3, 0x2f, 0x5d, 0x6b, 0x2a, 0x69, 0x8f, 0x58, + 0xe9, 0xb7, 0x61, 0xb2, 0x69, 0x6e, 0x89, 0x22, 0xea, 0xec, 0xf1, 0x3c, 0xbe, 0xa9, 0x1d, 0x34, + 0xd9, 0x04, 0x53, 0x08, 0x9c, 0x66, 0x8c, 0x6a, 0x3c, 0x72, 0x7d, 0xd5, 0xdf, 0x08, 0x44, 0xbc, + 0x99, 0x9d, 0x3b, 0x96, 0x7b, 0x51, 0x4c, 0x76, 0x28, 0x65, 0xb2, 0xd7, 0xdd, 0x10, 0x65, 0xb1, + 0xe2, 0x82, 0x5e, 0x85, 0x21, 0x76, 0xa5, 0x28, 0x2a, 0x8f, 0xe4, 0x3b, 0xcf, 0xcc, 0xdb, 0xb0, + 0xc9, 0xc4, 0x67, 0x7f, 0x23, 0x2c, 0x38, 0xa0, 0xab, 0xf2, 0x4e, 0x7b, 0xb4, 0xea, 0xdf, 0x8a, + 0x08, 0xbb, 0xd3, 0x5e, 0x5a, 0xfc, 0x68, 0x72, 0x5d, 0x9d, 0xc3, 0x33, 0x13, 0xc9, 0x19, 0x25, + 0xa9, 0x4e, 0x21, 0xfe, 0xcb, 0xfc, 0x74, 0x65, 0xc8, 0x6f, 0x9e, 0x99, 0xc3, 0x2e, 0xe9, 0xce, + 0xdb, 0x26, 0x0b, 0x9c, 0xe6, 0x79, 0xaa, 0x5b, 0xdc, 0xac, 0x0f, 0x53, 0xe9, 0x85, 0x75, 0xa2, + 0x5b, 0xea, 0x8f, 0x06, 0x60, 0xc2, 0x9c, 0x08, 0x68, 0x1e, 0x4a, 0x82, 0x89, 0xca, 0x48, 0xa5, + 0xe6, 0xf6, 0x9a, 0x44, 0xe0, 0x84, 0x86, 0x65, 0xe4, 0x62, 0xc5, 0xb5, 0x48, 0xa3, 0x24, 0x23, + 0x97, 0xc2, 0x60, 0x8d, 0x8a, 0x6a, 0x9e, 0x77, 0x82, 0x20, 0x56, 0xe2, 0x5a, 0xcd, 0x96, 0x45, + 0x06, 0xc5, 0x02, 0x4b, 0xc5, 0xf4, 0x36, 0x09, 0x7d, 0xe2, 0x99, 0xee, 0x3f, 0x25, 0xa6, 0xaf, + 0xe9, 0x48, 0x6c, 0xd2, 0xd2, 0x6d, 0x27, 0x88, 0xd8, 0xf4, 0x13, 0xfa, 0x6d, 0x12, 0xb9, 0x55, + 0xe7, 0x57, 0xea, 0x24, 0x1e, 0x7d, 0x1e, 0x1e, 0x50, 0x37, 0xe0, 0x30, 0x77, 0xa7, 0xca, 0x1a, + 0x87, 0x0c, 0x73, 0xf4, 0x81, 0xa5, 0x6c, 0x32, 0x9c, 0x57, 0x1e, 0xbd, 0x02, 0x13, 0x42, 0x4d, + 0x95, 0x1c, 0x87, 0xcd, 0x83, 0xfa, 0x6b, 0x06, 0x16, 0xa7, 0xa8, 0x51, 0x15, 0xa6, 0x28, 0x84, + 0x69, 0x8a, 0x92, 0x03, 0xbf, 0xc9, 0xa7, 0xf6, 0xe3, 0x6b, 0x29, 0x3c, 0xee, 0x28, 0x81, 0x16, + 0x60, 0x92, 0xeb, 0x11, 0xd4, 0x10, 0x63, 0xe3, 0x20, 0xc2, 0x40, 0xd5, 0x42, 0xb8, 0x69, 0xa2, + 0x71, 0x9a, 0x1e, 0xbd, 0x08, 0x63, 0x4e, 0xd8, 0xd8, 0x72, 0x63, 0xd2, 0x88, 0xdb, 0x21, 0xcf, + 0x18, 0xa1, 0x45, 0x3a, 0x2c, 0x68, 0x38, 0x6c, 0x50, 0xda, 0xef, 0xc2, 0x99, 0x8c, 0x08, 0x72, + 0x3a, 0x71, 0x9c, 0x96, 0x2b, 0xbf, 0x29, 0x15, 0x83, 0xb5, 0x50, 0x5b, 0x95, 0x5f, 0xa3, 0x51, + 0xd1, 0xd9, 0xc9, 0xfc, 0xc8, 0x5a, 0x12, 0x49, 0x35, 0x3b, 0x57, 0x24, 0x02, 0x27, 0x34, 0xf6, + 0xf7, 0x00, 0x34, 0x2f, 0x48, 0x1f, 0x11, 0x38, 0x2f, 0xc2, 0x98, 0xcc, 0x7c, 0xaa, 0xe5, 0x19, + 0x54, 0x9f, 0x79, 0x45, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0xcd, 0x97, 0xbe, 0x9d, 0x74, 0xc4, 0x97, + 0x72, 0xfa, 0xe0, 0x84, 0x06, 0x3d, 0x0d, 0x23, 0x11, 0xf1, 0x36, 0xae, 0xbb, 0xfe, 0xb6, 0x98, + 0xd8, 0x4a, 0x0a, 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x08, 0xc5, 0xb6, 0xdb, 0x14, 0x53, 0x59, + 0x6e, 0xf8, 0xc5, 0x5b, 0xab, 0xd5, 0xc3, 0xfd, 0xca, 0x23, 0x79, 0x09, 0x5d, 0xa9, 0x3d, 0x1c, + 0xcd, 0xd1, 0xe5, 0x47, 0x0b, 0x67, 0x39, 0xd4, 0x87, 0x8e, 0xe8, 0x50, 0xbf, 0x0c, 0x20, 0xbe, + 0x5a, 0xce, 0xe5, 0x62, 0x32, 0x6a, 0x57, 0x14, 0x06, 0x6b, 0x54, 0xd4, 0xaa, 0x6e, 0x84, 0xc4, + 0x91, 0x86, 0x27, 0x8f, 0x85, 0x1e, 0xb9, 0x7f, 0xab, 0x7a, 0x29, 0xcd, 0x0c, 0x77, 0xf2, 0x47, + 0x01, 0x4c, 0x37, 0xc5, 0x85, 0xcb, 0xa4, 0xd2, 0xd2, 0xd1, 0x03, 0xb0, 0x59, 0x30, 0x4a, 0x9a, + 0x11, 0xee, 0xe4, 0x8d, 0xde, 0x82, 0x59, 0x09, 0xec, 0xbc, 0xe3, 0xca, 0x96, 0x4b, 0x71, 0xf1, + 0xc2, 0xc1, 0x7e, 0x65, 0xb6, 0x9a, 0x4b, 0x85, 0xbb, 0x70, 0x40, 0x18, 0x86, 0xd8, 0x01, 0x4c, + 0x54, 0x1e, 0x65, 0xfb, 0xdc, 0x93, 0xf9, 0x21, 0xfb, 0x74, 0xae, 0xcf, 0xb1, 0xc3, 0x1b, 0x11, + 0xb4, 0x9a, 0x9c, 0x65, 0x31, 0x20, 0x16, 0x9c, 0xd0, 0x06, 0x8c, 0x3a, 0xbe, 0x1f, 0xc4, 0x0e, + 0x57, 0xa1, 0xc6, 0xf2, 0x75, 0x3f, 0x8d, 0xf1, 0x42, 0x52, 0x82, 0x73, 0x57, 0x71, 0x70, 0x1a, + 0x06, 0xeb, 0x8c, 0xd1, 0x5d, 0x98, 0x0c, 0xee, 0x52, 0xe1, 0x28, 0xcf, 0x09, 0xa2, 0xf2, 0x38, + 0xab, 0xeb, 0xf9, 0x3e, 0x9d, 0x9b, 0x46, 0x61, 0x4d, 0x6a, 0x99, 0x4c, 0x71, 0xba, 0x16, 0x34, + 0x67, 0xb8, 0x78, 0x27, 0x92, 0xe0, 0xeb, 0xc4, 0xc5, 0xab, 0x7b, 0x74, 0xd9, 0x9d, 0x69, 0x1e, + 0x84, 0xc9, 0x56, 0xff, 0x64, 0xea, 0xce, 0x74, 0x82, 0xc2, 0x3a, 0x1d, 0xda, 0x82, 0xb1, 0xe4, + 0x9c, 0x27, 0x8c, 0x58, 0x4a, 0x95, 0xd1, 0xcb, 0x97, 0xfb, 0xfb, 0xb8, 0x55, 0xad, 0x24, 0xbf, + 0x2c, 0xa2, 0x43, 0xb0, 0xc1, 0x79, 0xf6, 0x53, 0x30, 0xaa, 0x0d, 0xec, 0x51, 0x62, 0x8c, 0x67, + 0x5f, 0x81, 0xa9, 0xf4, 0xd0, 0x1d, 0x29, 0x46, 0xf9, 0xbf, 0x17, 0x60, 0x32, 0xe3, 0xb8, 0x87, + 0x25, 0x85, 0x4d, 0x09, 0xd4, 0x24, 0x07, 0xac, 0x29, 0x16, 0x0b, 0x7d, 0x88, 0x45, 0x29, 0xa3, + 0x8b, 0xb9, 0x32, 0x5a, 0x88, 0xc2, 0x81, 0xf7, 0x23, 0x0a, 0xcd, 0xdd, 0x67, 0xb0, 0xaf, 0xdd, + 0xe7, 0x18, 0xc4, 0xa7, 0xb1, 0x81, 0x0d, 0xf7, 0xb1, 0x81, 0xfd, 0x62, 0x01, 0xa6, 0x92, 0x78, + 0x6c, 0x91, 0x82, 0xf9, 0xe4, 0x0f, 0x09, 0x5e, 0x35, 0x0e, 0x09, 0xb2, 0x53, 0x2c, 0xa7, 0x5a, + 0x95, 0x7b, 0x60, 0x80, 0x53, 0x07, 0x06, 0x4f, 0xf6, 0xc5, 0xad, 0xfb, 0xe1, 0xc1, 0xdf, 0x29, + 0xc0, 0xd9, 0x74, 0x91, 0x25, 0xcf, 0x71, 0x77, 0x4e, 0xa1, 0x6f, 0x6e, 0x1a, 0x7d, 0xf3, 0x4c, + 0x3f, 0x5f, 0xc3, 0x9a, 0x96, 0xdb, 0x41, 0xaf, 0xa7, 0x3a, 0x68, 0xbe, 0x7f, 0x96, 0xdd, 0x7b, + 0xe9, 0x7b, 0x16, 0x9c, 0xcf, 0x2c, 0x77, 0x0a, 0x1e, 0xd2, 0x1b, 0xa6, 0x87, 0xf4, 0x89, 0xbe, + 0xbf, 0x29, 0xc7, 0x65, 0xfa, 0xf5, 0x62, 0xce, 0xb7, 0x30, 0x1f, 0xd3, 0x4d, 0x18, 0x75, 0x1a, + 0x0d, 0x12, 0x45, 0x6b, 0x41, 0x53, 0xe5, 0x60, 0x7a, 0x86, 0xed, 0x49, 0x09, 0xf8, 0x70, 0xbf, + 0x32, 0x9b, 0x66, 0x91, 0xa0, 0xb1, 0xce, 0xc1, 0xcc, 0xeb, 0x56, 0x38, 0xd6, 0xbc, 0x6e, 0x97, + 0x01, 0x76, 0x95, 0x55, 0x9b, 0x76, 0x58, 0x69, 0xf6, 0xae, 0x46, 0x85, 0x7e, 0x9a, 0xe9, 0x8a, + 0x3c, 0xce, 0x82, 0x9f, 0x0c, 0x3c, 0xd7, 0xe7, 0x58, 0xe9, 0x31, 0x1b, 0xfc, 0xd6, 0xa6, 0x72, + 0xee, 0x29, 0x96, 0xe8, 0x73, 0x30, 0x15, 0xf1, 0xc4, 0x00, 0x4b, 0x9e, 0x13, 0xb1, 0xcb, 0x04, + 0x42, 0x26, 0xb2, 0xab, 0x98, 0xf5, 0x14, 0x0e, 0x77, 0x50, 0xdb, 0xef, 0x0d, 0xc0, 0x83, 0x5d, + 0xa6, 0x28, 0x5a, 0x30, 0xcf, 0x45, 0x9f, 0x4a, 0x7b, 0x77, 0x66, 0x33, 0x0b, 0x1b, 0xee, 0x9e, + 0xd4, 0x18, 0x17, 0xde, 0xf7, 0x18, 0x7f, 0xd5, 0xd2, 0xfc, 0x6e, 0x3c, 0x7a, 0xf2, 0x33, 0x47, + 0x5c, 0x7a, 0xc7, 0xe8, 0x88, 0x5b, 0xcf, 0xf0, 0x66, 0x65, 0x1e, 0x35, 0xd6, 0x76, 0x1b, 0x7d, + 0x3b, 0xb3, 0x4e, 0xd7, 0x45, 0xff, 0x9e, 0x05, 0x8f, 0x64, 0x76, 0x96, 0x11, 0xb5, 0x31, 0x0f, + 0xa5, 0x06, 0x05, 0x6a, 0xd7, 0x88, 0x92, 0xbb, 0x7a, 0x12, 0x81, 0x13, 0x1a, 0x23, 0x38, 0xa3, + 0xd0, 0x33, 0x38, 0xe3, 0x9f, 0x5a, 0x30, 0x93, 0x6e, 0xc4, 0x29, 0xc8, 0xbb, 0x55, 0x53, 0xde, + 0x7d, 0xb4, 0x9f, 0x89, 0x94, 0x23, 0xea, 0xfe, 0xed, 0x04, 0x9c, 0xeb, 0xd8, 0x0f, 0x79, 0xdf, + 0xed, 0xc2, 0xf4, 0x26, 0x33, 0x0c, 0xb4, 0x0b, 0x5a, 0xe2, 0x63, 0x32, 0xef, 0xb2, 0x75, 0xbd, + 0xcd, 0xc5, 0x8d, 0x9b, 0x0e, 0x12, 0xdc, 0x59, 0x05, 0x7a, 0xcf, 0x82, 0x19, 0xe7, 0x6e, 0xd4, + 0xf1, 0xfa, 0x87, 0x98, 0x33, 0xcf, 0x67, 0xfa, 0xdc, 0x7a, 0xbc, 0x16, 0xb2, 0x58, 0x3e, 0xd8, + 0xaf, 0xcc, 0x64, 0x51, 0xe1, 0xcc, 0xba, 0x10, 0x16, 0xc9, 0xed, 0xa8, 0xee, 0xd4, 0xe5, 0x0a, + 0x61, 0xd6, 0x05, 0x0f, 0x2e, 0xf9, 0x24, 0x06, 0x2b, 0x3e, 0xe8, 0x36, 0x94, 0x36, 0xe5, 0xad, + 0x2b, 0x21, 0x59, 0x33, 0xb7, 0xaa, 0xcc, 0xab, 0x59, 0x3c, 0x78, 0x5e, 0xa1, 0x70, 0xc2, 0x0a, + 0xbd, 0x02, 0x45, 0x7f, 0x23, 0x12, 0xb7, 0x95, 0xb3, 0x43, 0x6d, 0xcc, 0x60, 0x26, 0x7e, 0xd5, + 0xf3, 0xc6, 0x4a, 0x1d, 0xd3, 0x82, 0xb4, 0x7c, 0x78, 0xa7, 0x29, 0xdc, 0xc4, 0x99, 0xe5, 0xf1, + 0x62, 0xb5, 0xb3, 0x3c, 0x5e, 0xac, 0x62, 0x5a, 0x10, 0xad, 0xc0, 0x20, 0xbb, 0xf2, 0x21, 0x7c, + 0xc0, 0x99, 0x57, 0xd5, 0x3b, 0xae, 0xb3, 0xf0, 0xac, 0x85, 0x0c, 0x8c, 0x79, 0x71, 0xf4, 0x2a, + 0x0c, 0x35, 0x58, 0xda, 0x7a, 0x61, 0xb0, 0x67, 0xa7, 0x5f, 0xe8, 0x48, 0x6c, 0xcf, 0x4f, 0xa7, + 0x38, 0x1c, 0x0b, 0x0e, 0x8c, 0x17, 0x69, 0x6d, 0x6d, 0x44, 0xc2, 0x0e, 0xcf, 0xe6, 0xd5, 0xf1, + 0xc4, 0x80, 0xe0, 0xc5, 0xe0, 0x58, 0x70, 0x40, 0x9f, 0x86, 0xc2, 0x46, 0x43, 0xdc, 0xf9, 0xc8, + 0xf4, 0xf8, 0x9a, 0xb7, 0x70, 0x17, 0x87, 0x0e, 0xf6, 0x2b, 0x85, 0x95, 0x25, 0x5c, 0xd8, 0x68, + 0xa0, 0x1b, 0x30, 0xbc, 0xc1, 0xef, 0x5a, 0x8a, 0x14, 0xa5, 0x8f, 0x67, 0x5f, 0x03, 0xed, 0xb8, + 0x8e, 0xc9, 0x2f, 0x39, 0x08, 0x04, 0x96, 0x4c, 0xa8, 0xe4, 0xde, 0x50, 0x77, 0x46, 0x45, 0x8e, + 0xd2, 0x8f, 0xf6, 0x73, 0xb3, 0x54, 0x98, 0xa2, 0x0a, 0x8a, 0x35, 0x3e, 0x74, 0x66, 0x3a, 0xf2, + 0xed, 0x0c, 0x96, 0x9f, 0x34, 0x67, 0x66, 0x66, 0x3e, 0xb0, 0xc1, 0x67, 0xa6, 0x42, 0xe1, 0x84, + 0x15, 0xda, 0x86, 0xf1, 0xdd, 0xa8, 0xb5, 0x45, 0xe4, 0x62, 0x64, 0xa9, 0x4a, 0x4d, 0x63, 0x35, + 0xc9, 0x2b, 0x2b, 0x08, 0xdd, 0x30, 0x6e, 0x3b, 0x5e, 0x87, 0xfc, 0x60, 0xa9, 0xb6, 0x6e, 0xeb, + 0xcc, 0xb0, 0xc9, 0x9b, 0x76, 0xf5, 0x3b, 0xed, 0xe0, 0xce, 0x5e, 0x4c, 0x44, 0x02, 0xd3, 0xcc, + 0xae, 0x7e, 0x8d, 0x93, 0x74, 0x76, 0xb5, 0x40, 0x60, 0xc9, 0x44, 0x75, 0x0a, 0x93, 0x7b, 0x53, + 0x3d, 0x3a, 0xa5, 0xa3, 0xbd, 0x49, 0xa7, 0x30, 0x39, 0x97, 0xb0, 0x62, 0xf2, 0xad, 0xb5, 0x15, + 0xc4, 0x81, 0x9f, 0x92, 0xad, 0xd3, 0xf9, 0xf2, 0xad, 0x96, 0x41, 0xdf, 0x29, 0xdf, 0xb2, 0xa8, + 0x70, 0x66, 0x5d, 0xa8, 0x09, 0x13, 0xad, 0x20, 0x8c, 0xef, 0x06, 0xa1, 0x9c, 0x4b, 0xa8, 0x8b, + 0xf9, 0x65, 0x50, 0x8a, 0x1a, 0x59, 0x58, 0xab, 0x89, 0xc1, 0x29, 0x9e, 0x74, 0x48, 0xa2, 0x86, + 0xe3, 0x91, 0xd5, 0x9b, 0xe5, 0x33, 0xf9, 0x43, 0x52, 0xe7, 0x24, 0x9d, 0x43, 0x22, 0x10, 0x58, + 0x32, 0xa1, 0x92, 0x86, 0xe5, 0xc2, 0x66, 0x19, 0x57, 0x73, 0x24, 0x4d, 0x47, 0xc0, 0x27, 0x97, + 0x34, 0x0c, 0x8c, 0x79, 0x71, 0xf4, 0x45, 0x28, 0x09, 0xad, 0x32, 0x88, 0xca, 0x67, 0x3b, 0x74, + 0xdc, 0xa4, 0x65, 0x9c, 0xe8, 0x66, 0x3d, 0x7b, 0x8b, 0x14, 0xf7, 0xba, 0x24, 0x11, 0x4e, 0x98, + 0xda, 0x5f, 0x1e, 0xea, 0xd4, 0x0c, 0x98, 0xf5, 0xf0, 0x65, 0xab, 0xe3, 0x00, 0xf6, 0x13, 0xfd, + 0x9a, 0xbc, 0xc7, 0xa8, 0x01, 0xbe, 0x67, 0xc1, 0xb9, 0x56, 0xe6, 0x47, 0x89, 0x6d, 0xb6, 0x3f, + 0xcb, 0x99, 0x77, 0x83, 0xca, 0x65, 0x9c, 0x8d, 0xc7, 0x39, 0x35, 0xa5, 0xb5, 0xec, 0xe2, 0xfb, + 0xd6, 0xb2, 0xd7, 0x60, 0x84, 0xa9, 0x72, 0x49, 0xde, 0x94, 0xbe, 0x92, 0x8d, 0xb0, 0x0d, 0x7b, + 0x49, 0x14, 0xc4, 0x8a, 0x05, 0xfa, 0x79, 0x0b, 0x1e, 0x4e, 0x37, 0x1d, 0x13, 0x86, 0x16, 0x79, + 0xf8, 0xb8, 0xe1, 0xb2, 0x22, 0xbe, 0xff, 0xe1, 0x5a, 0x37, 0xe2, 0xc3, 0x5e, 0x04, 0xb8, 0x7b, + 0x65, 0xa8, 0x9a, 0x61, 0x39, 0x0d, 0x99, 0xe7, 0x33, 0xbd, 0xad, 0xa7, 0xd3, 0xd5, 0xd2, 0xbf, + 0x61, 0x65, 0xa8, 0x97, 0xdc, 0x4a, 0x7b, 0xd9, 0xb4, 0xd2, 0x1e, 0x4b, 0x5b, 0x69, 0x1d, 0x3e, + 0x17, 0xc3, 0x40, 0xeb, 0x3f, 0x53, 0x68, 0xbf, 0x29, 0x62, 0x6c, 0x0f, 0x2e, 0xf6, 0x12, 0xb3, + 0x2c, 0x70, 0xaa, 0xa9, 0x4e, 0x2b, 0x93, 0xc0, 0xa9, 0xe6, 0x6a, 0x15, 0x33, 0x4c, 0xbf, 0xd9, + 0x08, 0xec, 0xff, 0x6c, 0x41, 0xb1, 0x16, 0x34, 0x4f, 0xc1, 0x87, 0xf4, 0x19, 0xc3, 0x87, 0xf4, + 0x60, 0xce, 0x7b, 0x6d, 0xb9, 0x1e, 0xa3, 0xe5, 0x94, 0xc7, 0xe8, 0xe1, 0x3c, 0x06, 0xdd, 0xfd, + 0x43, 0x7f, 0xb7, 0x08, 0xfa, 0xeb, 0x72, 0xe8, 0x5f, 0xdc, 0x4f, 0x48, 0x6c, 0xb1, 0xdb, 0x83, + 0x73, 0x82, 0x33, 0x8b, 0xb7, 0x92, 0xb7, 0xed, 0xfe, 0x8c, 0x45, 0xc6, 0xbe, 0x4e, 0xdc, 0xcd, + 0xad, 0x98, 0x34, 0xd3, 0x9f, 0x73, 0x7a, 0x91, 0xb1, 0xff, 0xc1, 0x82, 0xc9, 0x54, 0xed, 0xc8, + 0xcb, 0xba, 0xba, 0x73, 0x9f, 0x5e, 0xa1, 0xe9, 0x9e, 0x77, 0x7d, 0xe6, 0x00, 0x94, 0x83, 0x5e, + 0x7a, 0x5e, 0x98, 0xee, 0xaa, 0x3c, 0xf8, 0x11, 0xd6, 0x28, 0xd0, 0x0b, 0x30, 0x1a, 0x07, 0xad, + 0xc0, 0x0b, 0x36, 0xf7, 0xae, 0x11, 0x99, 0xff, 0x42, 0x1d, 0xa3, 0xac, 0x27, 0x28, 0xac, 0xd3, + 0xd9, 0xbf, 0x56, 0x84, 0xf4, 0x8b, 0x84, 0x7f, 0x3e, 0x27, 0x3f, 0x9c, 0x73, 0xf2, 0xfb, 0x16, + 0x4c, 0xd1, 0xda, 0x59, 0x9c, 0x8c, 0x0c, 0x61, 0x55, 0x4f, 0x0a, 0x58, 0x5d, 0x9e, 0x14, 0x78, + 0x8c, 0xca, 0xae, 0x66, 0xd0, 0x8e, 0x85, 0x2f, 0x47, 0x13, 0x4e, 0x14, 0x8a, 0x05, 0x56, 0xd0, + 0x91, 0x30, 0x14, 0x17, 0x72, 0x74, 0x3a, 0x12, 0x86, 0x58, 0x60, 0xe5, 0x8b, 0x03, 0x03, 0x39, + 0x2f, 0x0e, 0xb0, 0xcc, 0x50, 0x22, 0x36, 0x43, 0xa8, 0x06, 0x5a, 0x66, 0x28, 0x19, 0xb4, 0x91, + 0xd0, 0xd8, 0xdf, 0x2a, 0xc2, 0x58, 0x2d, 0x68, 0x26, 0x61, 0xe8, 0xcf, 0x1b, 0x61, 0xe8, 0x17, + 0x53, 0x61, 0xe8, 0x53, 0x3a, 0xed, 0xf1, 0x44, 0xa1, 0x8b, 0xbc, 0x61, 0xec, 0xfd, 0x8b, 0xfb, + 0x8c, 0x40, 0x37, 0xf2, 0x86, 0x29, 0x46, 0xd8, 0xe4, 0xfb, 0x93, 0x14, 0x79, 0xfe, 0xa7, 0x16, + 0x4c, 0xd4, 0x82, 0x26, 0x9d, 0xa0, 0x3f, 0x49, 0xb3, 0x51, 0xcf, 0x3b, 0x36, 0xd4, 0x25, 0xef, + 0xd8, 0xdf, 0xb3, 0x60, 0xb8, 0x16, 0x34, 0x4f, 0xc1, 0xcf, 0xf9, 0xb2, 0xe9, 0xe7, 0x7c, 0x20, + 0x47, 0xca, 0xe6, 0xb8, 0x36, 0x7f, 0xab, 0x08, 0xe3, 0xb4, 0x9d, 0xc1, 0xa6, 0x1c, 0x25, 0xa3, + 0x47, 0xac, 0x3e, 0x7a, 0x84, 0x2a, 0x73, 0x81, 0xe7, 0x05, 0x77, 0xd3, 0x23, 0xb6, 0xc2, 0xa0, + 0x58, 0x60, 0xd1, 0xd3, 0x30, 0xd2, 0x0a, 0xc9, 0xae, 0x1b, 0xb4, 0xa3, 0xf4, 0x95, 0xbe, 0x9a, + 0x80, 0x63, 0x45, 0x81, 0x9e, 0x87, 0xb1, 0xc8, 0xf5, 0x1b, 0x44, 0xc6, 0x6b, 0x0c, 0xb0, 0x78, + 0x0d, 0x9e, 0xba, 0x51, 0x83, 0x63, 0x83, 0x0a, 0xbd, 0x0e, 0x25, 0xf6, 0x9f, 0xad, 0x9b, 0xa3, + 0x3f, 0x28, 0xc0, 0x4d, 0x55, 0xc9, 0x00, 0x27, 0xbc, 0xd0, 0x65, 0x80, 0x58, 0x46, 0x96, 0x44, + 0xe2, 0xc6, 0xa9, 0xd2, 0x28, 0x55, 0xcc, 0x49, 0x84, 0x35, 0x2a, 0xf4, 0x14, 0x94, 0x62, 0xc7, + 0xf5, 0xae, 0xbb, 0x3e, 0x89, 0x44, 0x64, 0x8e, 0x48, 0x87, 0x2c, 0x80, 0x38, 0xc1, 0xd3, 0x1d, + 0x9d, 0xdd, 0x67, 0xe6, 0xcf, 0x91, 0x8c, 0x30, 0x6a, 0xb6, 0xa3, 0x5f, 0x57, 0x50, 0xac, 0x51, + 0xd8, 0x2f, 0xc2, 0xd9, 0x5a, 0xd0, 0xac, 0x05, 0x61, 0xbc, 0x12, 0x84, 0x77, 0x9d, 0xb0, 0x29, + 0xc7, 0xaf, 0x22, 0x33, 0xf3, 0xd2, 0x5d, 0x77, 0x90, 0xdb, 0xf5, 0x46, 0xce, 0xdd, 0xe7, 0xd8, + 0x9e, 0x7e, 0xc4, 0xab, 0x0e, 0xff, 0xba, 0x00, 0xa8, 0xc6, 0x62, 0x5f, 0x8c, 0x37, 0x6b, 0xde, + 0x82, 0x89, 0x88, 0x5c, 0x77, 0xfd, 0xf6, 0x3d, 0xc1, 0xaa, 0xdb, 0x3d, 0x92, 0xfa, 0xb2, 0x4e, + 0xc9, 0x7d, 0x23, 0x26, 0x0c, 0xa7, 0xb8, 0xd1, 0x2e, 0x0c, 0xdb, 0xfe, 0x42, 0x74, 0x2b, 0x22, + 0xa1, 0x78, 0xa3, 0x85, 0x75, 0x21, 0x96, 0x40, 0x9c, 0xe0, 0xe9, 0x94, 0x61, 0x7f, 0x6e, 0x04, + 0x3e, 0x0e, 0x82, 0x58, 0x4e, 0x32, 0x96, 0xe5, 0x5f, 0x83, 0x63, 0x83, 0x0a, 0xad, 0x00, 0x8a, + 0xda, 0xad, 0x96, 0xc7, 0x8e, 0x0a, 0x1d, 0xef, 0x4a, 0x18, 0xb4, 0x5b, 0xfc, 0xb8, 0x47, 0x24, + 0xc8, 0xaf, 0x77, 0x60, 0x71, 0x46, 0x09, 0x2a, 0x18, 0x36, 0x22, 0xf6, 0x5b, 0x5c, 0x69, 0xe6, + 0xbe, 0xc9, 0x3a, 0x03, 0x61, 0x89, 0xb3, 0xbf, 0xc4, 0x36, 0x33, 0xf6, 0xb4, 0x46, 0xdc, 0x0e, + 0x09, 0xda, 0x81, 0xf1, 0x16, 0xdb, 0xb0, 0xe2, 0x30, 0xf0, 0x3c, 0x22, 0xf5, 0xc6, 0xfb, 0x8b, + 0xc3, 0xe1, 0xa9, 0xf6, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0x7f, 0x79, 0x92, 0xc9, 0xa5, 0x3a, 0x37, + 0x5a, 0x86, 0x45, 0x74, 0xad, 0xd0, 0xd0, 0x66, 0xf3, 0x9f, 0xb2, 0x4a, 0x24, 0xbd, 0x88, 0xd0, + 0xc5, 0xb2, 0x2c, 0x7a, 0x8d, 0x9d, 0x93, 0x71, 0x61, 0xd0, 0xeb, 0x11, 0x3d, 0x4e, 0x65, 0x1c, + 0x92, 0x89, 0x82, 0x58, 0x63, 0x82, 0xae, 0xc3, 0xb8, 0x78, 0x89, 0x41, 0xb8, 0x10, 0x8a, 0x86, + 0xf9, 0x3b, 0x8e, 0x75, 0xe4, 0x61, 0x1a, 0x80, 0xcd, 0xc2, 0x68, 0x13, 0x1e, 0xd6, 0xde, 0x0d, + 0xca, 0x88, 0x05, 0xe3, 0xb2, 0xe5, 0x91, 0x83, 0xfd, 0xca, 0xc3, 0xeb, 0xdd, 0x08, 0x71, 0x77, + 0x3e, 0xe8, 0x26, 0x9c, 0x75, 0x1a, 0xb1, 0xbb, 0x4b, 0xaa, 0xc4, 0x69, 0x7a, 0xae, 0x4f, 0xcc, + 0x3b, 0xee, 0xe7, 0x0f, 0xf6, 0x2b, 0x67, 0x17, 0xb2, 0x08, 0x70, 0x76, 0x39, 0xf4, 0x32, 0x94, + 0x9a, 0x7e, 0x24, 0xfa, 0x60, 0xc8, 0x78, 0x12, 0xab, 0x54, 0xbd, 0x51, 0x57, 0xdf, 0x9f, 0xfc, + 0xc1, 0x49, 0x01, 0xb4, 0xc9, 0x9f, 0x4e, 0x57, 0x16, 0xc9, 0x70, 0x47, 0xe2, 0x82, 0xb4, 0x6d, + 0x6b, 0xdc, 0x35, 0xe1, 0xfe, 0x33, 0x15, 0x69, 0x69, 0x5c, 0x43, 0x31, 0x18, 0xa3, 0x57, 0x01, + 0x45, 0x24, 0xdc, 0x75, 0x1b, 0x64, 0xa1, 0xc1, 0x72, 0x9b, 0x32, 0xaf, 0xcb, 0x88, 0x71, 0x6d, + 0x00, 0xd5, 0x3b, 0x28, 0x70, 0x46, 0x29, 0x74, 0x95, 0x4a, 0x14, 0x1d, 0x2a, 0x02, 0x63, 0xa5, + 0x9a, 0x57, 0xae, 0x92, 0x56, 0x48, 0x1a, 0x4e, 0x4c, 0x9a, 0x26, 0x47, 0x9c, 0x2a, 0x47, 0xf7, + 0x1b, 0x95, 0x32, 0x1e, 0xcc, 0x70, 0xce, 0xce, 0xb4, 0xf1, 0xd4, 0x42, 0xda, 0x0a, 0xa2, 0xf8, + 0x06, 0x89, 0xef, 0x06, 0xe1, 0xb6, 0xc8, 0x2f, 0x95, 0x24, 0x94, 0x4b, 0x50, 0x58, 0xa7, 0xa3, + 0x1a, 0x11, 0x3b, 0xba, 0x5a, 0xad, 0xb2, 0x73, 0x86, 0x91, 0x64, 0x9d, 0x5c, 0xe5, 0x60, 0x2c, + 0xf1, 0x92, 0x74, 0xb5, 0xb6, 0xc4, 0x4e, 0x0f, 0x52, 0xa4, 0xab, 0xb5, 0x25, 0x2c, 0xf1, 0x88, + 0x74, 0x3e, 0x37, 0x36, 0x91, 0x7f, 0x42, 0xd3, 0x29, 0x97, 0xfb, 0x7c, 0x71, 0xcc, 0x87, 0x29, + 0xf5, 0xd0, 0x19, 0x4f, 0xbc, 0x15, 0x95, 0x27, 0xf3, 0xdf, 0x70, 0xcf, 0xcc, 0xda, 0xa5, 0xbc, + 0x6a, 0xab, 0x29, 0x4e, 0xb8, 0x83, 0xb7, 0x91, 0x3b, 0x61, 0xaa, 0x67, 0xca, 0xff, 0x79, 0x28, + 0x45, 0xed, 0x3b, 0xcd, 0x60, 0xc7, 0x71, 0x7d, 0xe6, 0xf6, 0xd7, 0x9f, 0x17, 0x97, 0x08, 0x9c, + 0xd0, 0xa0, 0x15, 0x18, 0x71, 0xe4, 0xbb, 0xfb, 0x28, 0xff, 0x32, 0xb5, 0x7a, 0x70, 0x9f, 0x79, + 0x34, 0xd5, 0x4b, 0xfb, 0xaa, 0x2c, 0x7a, 0x09, 0xc6, 0xc5, 0xf5, 0x22, 0x11, 0x75, 0x78, 0xc6, + 0x8c, 0x72, 0xaf, 0xeb, 0x48, 0x6c, 0xd2, 0xa2, 0x9f, 0x86, 0x09, 0xca, 0x25, 0x11, 0x6c, 0xe5, + 0x99, 0x7e, 0x24, 0xa2, 0x96, 0xca, 0x59, 0x2f, 0x8c, 0x53, 0xcc, 0x50, 0x13, 0x1e, 0x72, 0xda, + 0x71, 0xb0, 0x43, 0x67, 0xb8, 0x39, 0xff, 0xd7, 0x83, 0x6d, 0xe2, 0x33, 0x3f, 0xfd, 0xc8, 0xe2, + 0xc5, 0x83, 0xfd, 0xca, 0x43, 0x0b, 0x5d, 0xe8, 0x70, 0x57, 0x2e, 0xe8, 0x16, 0x8c, 0xc6, 0x81, + 0x27, 0xc2, 0x85, 0xa3, 0xf2, 0xb9, 0xfc, 0xdc, 0x2f, 0xeb, 0x8a, 0x4c, 0x77, 0x27, 0xa8, 0xa2, + 0x58, 0xe7, 0x83, 0xd6, 0xf9, 0x1a, 0x63, 0x29, 0x04, 0x49, 0x54, 0x7e, 0x20, 0xbf, 0x63, 0x54, + 0xa6, 0x41, 0x73, 0x09, 0x8a, 0x92, 0x58, 0x67, 0x83, 0xae, 0xc0, 0x74, 0x2b, 0x74, 0x03, 0x36, + 0xb1, 0x95, 0xcb, 0xb7, 0x6c, 0x64, 0x05, 0x9b, 0xae, 0xa5, 0x09, 0x70, 0x67, 0x19, 0x74, 0x89, + 0x2a, 0xa8, 0x1c, 0x58, 0x3e, 0xcf, 0x9f, 0x82, 0xe0, 0xca, 0x29, 0x87, 0x61, 0x85, 0x9d, 0xfd, + 0x2c, 0x4c, 0x77, 0x48, 0xca, 0x23, 0x85, 0x6e, 0xfe, 0xfa, 0x20, 0x94, 0x94, 0x3b, 0x10, 0xcd, + 0x9b, 0x5e, 0xde, 0xf3, 0x69, 0x2f, 0xef, 0x08, 0xd5, 0xd7, 0x74, 0xc7, 0xee, 0x7a, 0xc6, 0x6b, + 0xd6, 0x17, 0x73, 0x44, 0x43, 0xff, 0xf7, 0xac, 0x8e, 0xf0, 0xd2, 0x77, 0x62, 0x30, 0x0e, 0x74, + 0x35, 0x18, 0xfb, 0x7c, 0x59, 0x8e, 0x9a, 0x86, 0xad, 0xa0, 0xb9, 0x5a, 0x4b, 0x3f, 0xb5, 0x54, + 0xa3, 0x40, 0xcc, 0x71, 0x4c, 0xb9, 0xa7, 0xdb, 0x3a, 0x53, 0xee, 0x87, 0xef, 0x53, 0xb9, 0x97, + 0x0c, 0x70, 0xc2, 0x0b, 0x79, 0x30, 0xdd, 0x30, 0x5f, 0xc9, 0x52, 0x77, 0xab, 0x1e, 0xed, 0xf9, + 0x5e, 0x55, 0x5b, 0x7b, 0x3a, 0x63, 0x29, 0xcd, 0x05, 0x77, 0x32, 0x46, 0x2f, 0xc1, 0xc8, 0x3b, + 0x41, 0xc4, 0xa6, 0x9d, 0xd8, 0xdb, 0xe4, 0x6d, 0x96, 0x91, 0xd7, 0x6e, 0xd6, 0x19, 0xfc, 0x70, + 0xbf, 0x32, 0x5a, 0x0b, 0x9a, 0xf2, 0x2f, 0x56, 0x05, 0xd0, 0x3d, 0x38, 0x6b, 0x48, 0x04, 0xd5, + 0x5c, 0xe8, 0xbf, 0xb9, 0x0f, 0x8b, 0xea, 0xce, 0xae, 0x66, 0x71, 0xc2, 0xd9, 0x15, 0xd8, 0xdf, + 0xe6, 0x4e, 0x4f, 0xe1, 0x1a, 0x21, 0x51, 0xdb, 0x3b, 0x8d, 0xfc, 0xf8, 0xcb, 0x86, 0xd7, 0xe6, + 0xbe, 0x1d, 0xeb, 0xbf, 0x6f, 0x31, 0xc7, 0xfa, 0x3a, 0xd9, 0x69, 0x79, 0x4e, 0x7c, 0x1a, 0x01, + 0xbb, 0xaf, 0xc1, 0x48, 0x2c, 0x6a, 0xeb, 0x96, 0xd2, 0x5f, 0x6b, 0x14, 0x3b, 0x5c, 0x50, 0x1b, + 0xa2, 0x84, 0x62, 0xc5, 0xc6, 0xfe, 0xc7, 0x7c, 0x04, 0x24, 0xe6, 0x14, 0x7c, 0x0b, 0x55, 0xd3, + 0xb7, 0x50, 0xe9, 0xf1, 0x05, 0x39, 0x3e, 0x86, 0x7f, 0x64, 0xb6, 0x9b, 0xd9, 0x1e, 0x1f, 0xf6, + 0x13, 0x1d, 0xfb, 0x97, 0x2d, 0x98, 0xc9, 0x3a, 0xd2, 0xa7, 0x4a, 0x0c, 0xb7, 0x7c, 0xd4, 0x09, + 0x97, 0xea, 0xc1, 0xdb, 0x02, 0x8e, 0x15, 0x45, 0xdf, 0x79, 0xb7, 0x8f, 0x96, 0xef, 0xe8, 0x26, + 0x98, 0x0f, 0xaa, 0xa1, 0x57, 0x78, 0x04, 0xbe, 0xa5, 0x5e, 0x3c, 0x3b, 0x5a, 0xf4, 0xbd, 0xfd, + 0xcd, 0x02, 0xcc, 0x70, 0x17, 0xf5, 0xc2, 0x6e, 0xe0, 0x36, 0x6b, 0x41, 0x53, 0xdc, 0x47, 0x78, + 0x03, 0xc6, 0x5a, 0x9a, 0xb9, 0xda, 0x2d, 0xe3, 0x8a, 0x6e, 0xd6, 0x26, 0x66, 0x83, 0x0e, 0xc5, + 0x06, 0x2f, 0xd4, 0x84, 0x31, 0xb2, 0xeb, 0x36, 0x94, 0x9f, 0xb3, 0x70, 0x64, 0x91, 0xae, 0x6a, + 0x59, 0xd6, 0xf8, 0x60, 0x83, 0xeb, 0x09, 0x3c, 0x7e, 0x61, 0x7f, 0xcd, 0x82, 0x07, 0x72, 0xf2, + 0xb3, 0xd0, 0xea, 0xee, 0xb2, 0xc3, 0x00, 0xf1, 0x3a, 0x9f, 0xaa, 0x8e, 0x1f, 0x11, 0x60, 0x81, + 0x45, 0x3f, 0x05, 0xc0, 0x5d, 0xfc, 0xec, 0x2d, 0xf4, 0x42, 0x7e, 0x8c, 0x52, 0x47, 0x9a, 0x04, + 0xed, 0x2e, 0xbd, 0x7a, 0xfd, 0x5c, 0xe3, 0x65, 0xff, 0x6a, 0x11, 0x06, 0xf9, 0x53, 0xcd, 0x2b, + 0x30, 0xbc, 0xc5, 0xb3, 0xc1, 0xf6, 0x93, 0x78, 0x36, 0x31, 0x47, 0x38, 0x00, 0xcb, 0xc2, 0x68, + 0x0d, 0xce, 0x88, 0x3b, 0x2f, 0x55, 0xe2, 0x39, 0x7b, 0xd2, 0xaa, 0xe5, 0x2f, 0x22, 0xc8, 0x74, + 0xde, 0x67, 0x56, 0x3b, 0x49, 0x70, 0x56, 0x39, 0xf4, 0x4a, 0x47, 0x0e, 0x38, 0x9e, 0x47, 0x57, + 0xe9, 0xc0, 0x3d, 0xf2, 0xc0, 0xbd, 0x04, 0xe3, 0xad, 0x0e, 0xfb, 0x5d, 0x7b, 0x25, 0xd7, 0xb4, + 0xd9, 0x4d, 0x5a, 0x16, 0x1f, 0xd0, 0x66, 0xd1, 0x10, 0xeb, 0x5b, 0x21, 0x89, 0xb6, 0x02, 0xaf, + 0x29, 0x9e, 0x84, 0x4c, 0xe2, 0x03, 0x52, 0x78, 0xdc, 0x51, 0x82, 0x72, 0xd9, 0x70, 0x5c, 0xaf, + 0x1d, 0x92, 0x84, 0xcb, 0x90, 0xc9, 0x65, 0x25, 0x85, 0xc7, 0x1d, 0x25, 0xe8, 0x3c, 0x3a, 0x2b, + 0xde, 0x13, 0x94, 0x37, 0xa1, 0x55, 0xd0, 0xc7, 0xb0, 0x8c, 0x75, 0xef, 0x92, 0x41, 0x43, 0x1c, + 0xf9, 0xab, 0x17, 0x09, 0xb5, 0x97, 0xaa, 0x44, 0x94, 0xbb, 0xe4, 0x72, 0x3f, 0xaf, 0xda, 0xb1, + 0x73, 0x17, 0x2d, 0xb4, 0xb9, 0xe7, 0xb9, 0x8b, 0x46, 0xfb, 0xe7, 0xe7, 0x2e, 0x1f, 0xd4, 0xb9, + 0xcb, 0x9f, 0x58, 0x70, 0x26, 0x23, 0x7c, 0x8f, 0x6f, 0x30, 0x9b, 0x6e, 0x14, 0xab, 0xf7, 0x15, + 0xb4, 0x0d, 0x86, 0xc3, 0xb1, 0xa2, 0xa0, 0x0d, 0xe3, 0x5b, 0x58, 0x7a, 0xdb, 0x12, 0x21, 0x37, + 0x02, 0x7b, 0xb4, 0x6d, 0x0b, 0x5d, 0x84, 0x81, 0x76, 0x44, 0x42, 0xf9, 0x80, 0x9f, 0x9c, 0x40, + 0xcc, 0x8f, 0xcb, 0x30, 0xd4, 0x0e, 0xd8, 0x54, 0x2e, 0x54, 0xcd, 0x0e, 0xe0, 0x4e, 0x54, 0x8e, + 0xb3, 0xbf, 0x5a, 0x84, 0xc9, 0x54, 0xb0, 0x2d, 0x6d, 0xc8, 0x4e, 0xe0, 0xbb, 0x71, 0xa0, 0x12, + 0xc7, 0xf1, 0xf7, 0xc6, 0x48, 0x6b, 0x6b, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0x8f, 0xc9, 0x97, 0x5d, + 0xd3, 0xef, 0x46, 0x2c, 0x56, 0x8d, 0xc7, 0x5d, 0xfb, 0x7d, 0xdf, 0xe5, 0x51, 0x18, 0x68, 0x05, + 0xea, 0xd9, 0x6d, 0x35, 0x38, 0x78, 0xb1, 0x5a, 0x0b, 0x02, 0x0f, 0x33, 0x24, 0xfa, 0x98, 0xf8, + 0xfa, 0xd4, 0x29, 0x13, 0x76, 0x9a, 0x41, 0xa4, 0x75, 0xc1, 0x13, 0x30, 0xbc, 0x4d, 0xf6, 0x42, + 0xd7, 0xdf, 0x4c, 0x8f, 0xf5, 0x35, 0x0e, 0xc6, 0x12, 0x6f, 0xa6, 0x5b, 0x1f, 0x3e, 0x91, 0x37, + 0x5c, 0x46, 0x7a, 0xea, 0x22, 0xbf, 0x65, 0xc1, 0x24, 0x4b, 0xd2, 0x2a, 0x32, 0x25, 0x50, 0x49, + 0x71, 0xf2, 0xda, 0xdd, 0xa3, 0x30, 0x18, 0xd2, 0x4a, 0xd3, 0x0f, 0x33, 0xb0, 0x96, 0x60, 0x8e, + 0x43, 0x0f, 0xc1, 0x00, 0x6b, 0x02, 0x1d, 0xbc, 0x31, 0x9e, 0xa6, 0xbd, 0xea, 0xc4, 0x0e, 0x66, + 0x50, 0x76, 0x65, 0x0d, 0x93, 0x96, 0xe7, 0xf2, 0x46, 0x27, 0x4e, 0xf2, 0x0f, 0xc7, 0x95, 0xb5, + 0xcc, 0xa6, 0xbd, 0xbf, 0x2b, 0x6b, 0xd9, 0x2c, 0xbb, 0x5b, 0x4e, 0xff, 0xa5, 0x00, 0x17, 0x32, + 0xcb, 0x25, 0xfb, 0xc2, 0x8a, 0xb1, 0x2f, 0x5c, 0x4e, 0xed, 0x0b, 0x76, 0xf7, 0xd2, 0xc7, 0xb3, + 0x53, 0x64, 0x0b, 0xf0, 0xe2, 0x29, 0x0a, 0xf0, 0x81, 0x7e, 0x05, 0xf8, 0x60, 0x0f, 0x01, 0xfe, + 0x3d, 0x0b, 0xce, 0x67, 0x76, 0xd9, 0x87, 0xe4, 0x8e, 0x60, 0x66, 0xdb, 0x72, 0x2c, 0xbf, 0x1f, + 0x17, 0x72, 0xbe, 0x85, 0xd9, 0x80, 0x97, 0xa8, 0x9c, 0x61, 0xc8, 0x48, 0x28, 0xcb, 0x63, 0x5c, + 0xc6, 0x70, 0x18, 0x56, 0x58, 0xe4, 0x6a, 0xb7, 0xed, 0x78, 0xd3, 0x5e, 0x3a, 0xd2, 0x92, 0x99, + 0x33, 0xcf, 0x34, 0xf4, 0xb4, 0x0e, 0xe9, 0x9b, 0x77, 0x6b, 0x9a, 0xdd, 0x5e, 0xec, 0xdf, 0x6e, + 0x1f, 0xcb, 0xb6, 0xd9, 0xd1, 0x02, 0x4c, 0xee, 0xb8, 0x3e, 0x7b, 0x3c, 0xd5, 0xd4, 0x56, 0xd5, + 0x15, 0xe5, 0x35, 0x13, 0x8d, 0xd3, 0xf4, 0xb3, 0x2f, 0xc1, 0xf8, 0xfd, 0x3b, 0x1a, 0xbf, 0x5f, + 0x84, 0x07, 0xbb, 0x2c, 0x7b, 0x2e, 0xeb, 0x8d, 0x31, 0xd0, 0x64, 0x7d, 0xc7, 0x38, 0xd4, 0x60, + 0x66, 0xa3, 0xed, 0x79, 0x7b, 0x2c, 0x36, 0x8d, 0x34, 0x25, 0x85, 0x50, 0x27, 0x55, 0x06, 0xe6, + 0x95, 0x0c, 0x1a, 0x9c, 0x59, 0x12, 0xbd, 0x0a, 0x28, 0xb8, 0xc3, 0xb2, 0x02, 0x37, 0x93, 0x64, + 0x15, 0xac, 0xe3, 0x8b, 0xc9, 0x62, 0xbc, 0xd9, 0x41, 0x81, 0x33, 0x4a, 0x51, 0xbb, 0x80, 0x3d, + 0xf9, 0xae, 0x9a, 0x95, 0xb2, 0x0b, 0xb0, 0x8e, 0xc4, 0x26, 0x2d, 0xba, 0x02, 0xd3, 0xce, 0xae, + 0xe3, 0xf2, 0x04, 0x63, 0x92, 0x01, 0x37, 0x0c, 0x94, 0x7b, 0x6f, 0x21, 0x4d, 0x80, 0x3b, 0xcb, + 0xa0, 0x0d, 0xc3, 0x37, 0xcb, 0x1f, 0x1c, 0xb8, 0xdc, 0xf7, 0x6c, 0xed, 0xdb, 0x5b, 0x6b, 0xff, + 0x7b, 0x8b, 0x6e, 0x5f, 0x19, 0xaf, 0x75, 0xd2, 0x7e, 0x50, 0x5e, 0x47, 0xed, 0x4e, 0x9f, 0xea, + 0x87, 0x25, 0x1d, 0x89, 0x4d, 0x5a, 0x3e, 0x21, 0xa2, 0x24, 0xc8, 0xdd, 0xd0, 0x13, 0xc5, 0xd5, + 0x5a, 0x45, 0x81, 0x3e, 0x0f, 0xc3, 0x4d, 0x77, 0xd7, 0x8d, 0x82, 0x50, 0x2c, 0x96, 0xa3, 0xbe, + 0x52, 0xad, 0xe4, 0x60, 0x95, 0xb3, 0xc1, 0x92, 0x9f, 0xfd, 0xd5, 0x02, 0x8c, 0xcb, 0x1a, 0x5f, + 0x6b, 0x07, 0xb1, 0x73, 0x0a, 0xdb, 0xf2, 0x15, 0x63, 0x5b, 0xfe, 0x58, 0xb7, 0xfb, 0xc5, 0xac, + 0x49, 0xb9, 0xdb, 0xf1, 0xcd, 0xd4, 0x76, 0xfc, 0x78, 0x6f, 0x56, 0xdd, 0xb7, 0xe1, 0xdf, 0xb5, + 0x60, 0xda, 0xa0, 0x3f, 0x85, 0xdd, 0x60, 0xc5, 0xdc, 0x0d, 0x1e, 0xe9, 0xf9, 0x0d, 0x39, 0xbb, + 0xc0, 0x37, 0x0a, 0xa9, 0xb6, 0x33, 0xe9, 0xff, 0x0e, 0x0c, 0x6c, 0x39, 0x61, 0xb3, 0x5b, 0x9a, + 0xcc, 0x8e, 0x42, 0x73, 0x57, 0x9d, 0xb0, 0xc9, 0x65, 0xf8, 0xd3, 0xea, 0xa5, 0x31, 0x27, 0x6c, + 0xf6, 0xbc, 0xd3, 0xc1, 0xaa, 0x42, 0x2f, 0xc2, 0x50, 0xd4, 0x08, 0x5a, 0x2a, 0x62, 0xf6, 0x22, + 0x7f, 0x85, 0x8c, 0x42, 0x0e, 0xf7, 0x2b, 0xc8, 0xac, 0x8e, 0x82, 0xb1, 0xa0, 0x9f, 0xdd, 0x84, + 0x92, 0xaa, 0xfa, 0x44, 0xef, 0x02, 0xfc, 0x51, 0x11, 0xce, 0x64, 0xcc, 0x0b, 0x14, 0x19, 0xbd, + 0xf5, 0x6c, 0x9f, 0xd3, 0xe9, 0x7d, 0xf6, 0x57, 0xc4, 0x2c, 0x96, 0xa6, 0x18, 0xff, 0xbe, 0x2b, + 0xbd, 0x15, 0x91, 0x74, 0xa5, 0x14, 0xd4, 0xbb, 0x52, 0x5a, 0xd9, 0xa9, 0x75, 0x35, 0xad, 0x48, + 0xb5, 0xf4, 0x44, 0xc7, 0xf4, 0x7f, 0x14, 0x61, 0x26, 0x2b, 0x2d, 0x01, 0xfa, 0xd9, 0xd4, 0x2b, + 0x18, 0xcf, 0xf7, 0x9b, 0xd0, 0x80, 0x3f, 0x8d, 0x21, 0xb2, 0xfd, 0xcc, 0x99, 0xef, 0x62, 0xf4, + 0xec, 0x66, 0x51, 0x27, 0xbb, 0x64, 0x15, 0xf2, 0xd7, 0x4b, 0xe4, 0x12, 0xff, 0x44, 0xdf, 0x0d, + 0x10, 0xcf, 0x9e, 0x44, 0xa9, 0x4b, 0x56, 0x12, 0xdc, 0xfb, 0x92, 0x95, 0xac, 0x79, 0xd6, 0x85, + 0x51, 0xed, 0x6b, 0x4e, 0x74, 0xc4, 0xb7, 0xe9, 0x8e, 0xa2, 0xb5, 0xfb, 0x44, 0x47, 0xfd, 0x6b, + 0x16, 0xa4, 0xa2, 0xdb, 0x94, 0xff, 0xc3, 0xca, 0xf5, 0x7f, 0x5c, 0x84, 0x81, 0x30, 0xf0, 0x48, + 0xfa, 0x61, 0x04, 0x1c, 0x78, 0x04, 0x33, 0x8c, 0x7a, 0x35, 0xb8, 0x98, 0xf7, 0x6a, 0x30, 0x35, + 0x8d, 0x3d, 0xb2, 0x4b, 0xa4, 0x37, 0x42, 0xc9, 0xe4, 0xeb, 0x14, 0x88, 0x39, 0xce, 0xfe, 0x8d, + 0x01, 0x38, 0x93, 0x71, 0xa5, 0x90, 0x1a, 0x2a, 0x9b, 0x4e, 0x4c, 0xee, 0x3a, 0x7b, 0xe9, 0xdc, + 0xb0, 0x57, 0x38, 0x18, 0x4b, 0x3c, 0x8b, 0xc0, 0xe5, 0xa9, 0xeb, 0x52, 0x3e, 0x22, 0x91, 0xb1, + 0x4e, 0x60, 0x4f, 0xea, 0xa5, 0xd9, 0xcb, 0x00, 0x51, 0xe4, 0x2d, 0xfb, 0x54, 0xf9, 0x6a, 0x8a, + 0xf8, 0xde, 0x24, 0xcf, 0x61, 0xfd, 0xba, 0xc0, 0x60, 0x8d, 0x0a, 0x55, 0x61, 0xaa, 0x15, 0x06, + 0x31, 0xf7, 0x96, 0x56, 0x79, 0x64, 0xc9, 0xa0, 0x79, 0x39, 0xac, 0x96, 0xc2, 0xe3, 0x8e, 0x12, + 0xe8, 0x05, 0x18, 0x15, 0x17, 0xc6, 0x6a, 0x41, 0xe0, 0x09, 0x2f, 0x8d, 0x8a, 0x53, 0xa8, 0x27, + 0x28, 0xac, 0xd3, 0x69, 0xc5, 0x98, 0x0b, 0x76, 0x38, 0xb3, 0x18, 0x77, 0xc3, 0x6a, 0x74, 0xa9, + 0xec, 0x24, 0x23, 0x7d, 0x65, 0x27, 0x49, 0xfc, 0x56, 0xa5, 0xbe, 0x4f, 0x9d, 0xa0, 0xa7, 0xa7, + 0xe7, 0xdb, 0x45, 0x18, 0xe2, 0x43, 0x71, 0x0a, 0xaa, 0xd8, 0x8a, 0xf0, 0xdd, 0x74, 0xc9, 0xde, + 0xc0, 0xdb, 0x32, 0x57, 0x75, 0x62, 0x87, 0x8b, 0x21, 0xb5, 0x1a, 0x12, 0x2f, 0x0f, 0x9a, 0x33, + 0xd6, 0xcb, 0x6c, 0xca, 0x39, 0x01, 0x9c, 0x87, 0xb6, 0x7a, 0xde, 0x02, 0x88, 0xd8, 0x6b, 0xa7, + 0x94, 0x87, 0xc8, 0xfa, 0xf1, 0x64, 0x97, 0xda, 0xeb, 0x8a, 0x98, 0xb7, 0x21, 0x99, 0x82, 0x0a, + 0x81, 0x35, 0x8e, 0xb3, 0x9f, 0x84, 0x92, 0x22, 0xee, 0x65, 0xc9, 0x8d, 0xe9, 0xc2, 0xeb, 0x33, + 0x30, 0x99, 0xaa, 0xeb, 0x48, 0x86, 0xe0, 0x6f, 0x5b, 0x30, 0xc9, 0x9b, 0xbc, 0xec, 0xef, 0x8a, + 0xc5, 0xfe, 0x2e, 0xcc, 0x78, 0x19, 0x8b, 0x4e, 0x8c, 0x68, 0xff, 0x8b, 0x54, 0x19, 0x7e, 0x59, + 0x58, 0x9c, 0x59, 0x07, 0x35, 0xfe, 0xf9, 0x3b, 0xcd, 0x8e, 0x27, 0xe2, 0xc6, 0xc7, 0x78, 0xfe, + 0x6d, 0x0e, 0xc3, 0x0a, 0x6b, 0xff, 0xc0, 0x82, 0xe9, 0x8e, 0x47, 0xfc, 0x3f, 0xd0, 0xb6, 0x8b, + 0xf4, 0xe2, 0x85, 0x9c, 0xf4, 0xe2, 0xfa, 0xa7, 0x15, 0xbb, 0x7e, 0xda, 0x37, 0x2d, 0x10, 0x33, + 0xf0, 0x14, 0xd4, 0xf9, 0xcf, 0x9a, 0xea, 0xfc, 0x6c, 0xfe, 0xa4, 0xce, 0xd1, 0xe3, 0xff, 0xd4, + 0x82, 0x29, 0x4e, 0x90, 0x1c, 0x39, 0x7d, 0xa0, 0xe3, 0xd0, 0xcf, 0x23, 0x34, 0xea, 0xd5, 0xcf, + 0xec, 0x8f, 0x32, 0x06, 0x6b, 0xa0, 0xeb, 0x60, 0xfd, 0x27, 0x0b, 0x10, 0xff, 0xfc, 0xf4, 0xd3, + 0xd5, 0x7c, 0x53, 0xd2, 0x4c, 0xed, 0x44, 0x08, 0x28, 0x0c, 0xd6, 0xa8, 0x8e, 0xa5, 0xe1, 0xa9, + 0x13, 0xbd, 0x62, 0xef, 0x13, 0xbd, 0x23, 0x7c, 0xeb, 0x5f, 0x19, 0x80, 0x74, 0xf8, 0x28, 0xba, + 0x0d, 0x63, 0x0d, 0xa7, 0xe5, 0xdc, 0x71, 0x3d, 0x37, 0x76, 0x49, 0xd4, 0x2d, 0x14, 0x60, 0x49, + 0xa3, 0x13, 0x07, 0x31, 0x1a, 0x04, 0x1b, 0x7c, 0xd0, 0x1c, 0x40, 0x2b, 0x74, 0x77, 0x5d, 0x8f, + 0x6c, 0x32, 0x5b, 0x83, 0xdd, 0x21, 0xe1, 0xe7, 0xdb, 0x12, 0x8a, 0x35, 0x8a, 0x8c, 0x3b, 0x07, + 0xc5, 0x93, 0xbb, 0x73, 0x30, 0x70, 0xc4, 0x3b, 0x07, 0x83, 0x7d, 0xdd, 0x39, 0xc0, 0x70, 0x4e, + 0xee, 0xaa, 0xf4, 0xff, 0x8a, 0xeb, 0x11, 0xa1, 0x4a, 0xf1, 0x9b, 0x25, 0xb3, 0x07, 0xfb, 0x95, + 0x73, 0x38, 0x93, 0x02, 0xe7, 0x94, 0x44, 0x3f, 0x05, 0x65, 0xc7, 0xf3, 0x82, 0xbb, 0xaa, 0xd7, + 0x96, 0xa3, 0x86, 0xe3, 0x25, 0x69, 0x61, 0x47, 0x16, 0x1f, 0x3a, 0xd8, 0xaf, 0x94, 0x17, 0x72, + 0x68, 0x70, 0x6e, 0x69, 0x7b, 0x1b, 0xce, 0xd4, 0x49, 0x28, 0x5f, 0x52, 0x53, 0xab, 0x6f, 0x1d, + 0x4a, 0x61, 0x6a, 0xb9, 0xf7, 0x95, 0x48, 0x40, 0x4b, 0xc6, 0x26, 0x97, 0x77, 0xc2, 0xc8, 0xfe, + 0x5f, 0x16, 0x0c, 0x8b, 0x90, 0xd4, 0x53, 0xd0, 0x32, 0x16, 0x0c, 0x87, 0x4f, 0x25, 0x5b, 0x24, + 0xb2, 0xc6, 0xe4, 0xba, 0x7a, 0x56, 0x53, 0xae, 0x9e, 0x47, 0xba, 0x31, 0xe9, 0xee, 0xe4, 0xf9, + 0xa5, 0x22, 0x4c, 0x98, 0xe1, 0xb8, 0xa7, 0xd0, 0x05, 0x37, 0x60, 0x38, 0x12, 0xb1, 0xdf, 0x85, + 0xfc, 0x18, 0xc2, 0xf4, 0x20, 0x26, 0x91, 0x06, 0x22, 0xda, 0x5b, 0x32, 0xc9, 0x0c, 0x2a, 0x2f, + 0x9e, 0x60, 0x50, 0x79, 0xaf, 0x88, 0xe8, 0x81, 0xe3, 0x88, 0x88, 0xb6, 0xbf, 0xc3, 0x84, 0xbf, + 0x0e, 0x3f, 0x85, 0x1d, 0xfb, 0x8a, 0xb9, 0x4d, 0xd8, 0x5d, 0x66, 0x96, 0x68, 0x54, 0xce, 0xce, + 0xfd, 0x0f, 0x2c, 0x18, 0x15, 0x84, 0xa7, 0xd0, 0xec, 0xcf, 0x99, 0xcd, 0x7e, 0xb0, 0x4b, 0xb3, + 0x73, 0xda, 0xfb, 0xb7, 0x0a, 0xaa, 0xbd, 0xb5, 0x20, 0x8c, 0xfb, 0x4a, 0x13, 0x3e, 0x42, 0xed, + 0xb4, 0xa0, 0x11, 0x78, 0x42, 0x2f, 0x7b, 0x28, 0xb9, 0x5c, 0xc8, 0xe1, 0x87, 0xda, 0x6f, 0xac, + 0xa8, 0xd9, 0xdd, 0xb7, 0x20, 0x8c, 0xc5, 0x06, 0x9a, 0xdc, 0x7d, 0x0b, 0xc2, 0x18, 0x33, 0x0c, + 0x6a, 0x02, 0x24, 0x2f, 0xc5, 0x8b, 0xa8, 0x90, 0xfc, 0x55, 0xd8, 0x8e, 0x5d, 0x6f, 0xce, 0xf5, + 0xe3, 0x28, 0x0e, 0xe7, 0x56, 0xfd, 0xf8, 0x66, 0xc8, 0xb5, 0x76, 0xed, 0xb6, 0xa0, 0xe2, 0x85, + 0x35, 0xbe, 0xf2, 0xba, 0x0a, 0xab, 0x63, 0xd0, 0x3c, 0x89, 0xb9, 0x21, 0xe0, 0x58, 0x51, 0xd8, + 0x9f, 0x64, 0x32, 0x99, 0x75, 0xd0, 0xd1, 0x2e, 0xf2, 0xfd, 0xcf, 0x21, 0xd5, 0xb5, 0xcc, 0x0d, + 0x5b, 0xd5, 0xaf, 0x0b, 0x76, 0x17, 0x81, 0xb4, 0x62, 0x3d, 0x34, 0x3b, 0xb9, 0x53, 0x88, 0xbe, + 0xd0, 0x71, 0x40, 0xf7, 0x4c, 0x0f, 0x59, 0x7a, 0x84, 0x23, 0x39, 0x96, 0x9f, 0x90, 0xe5, 0x71, + 0x5b, 0xad, 0xa5, 0x13, 0xb9, 0x2f, 0x49, 0x04, 0x4e, 0x68, 0xd0, 0xbc, 0xb0, 0xf9, 0xb8, 0x03, + 0xe4, 0xc1, 0x94, 0xcd, 0x27, 0x3f, 0x5f, 0x33, 0xfa, 0x9e, 0x85, 0x51, 0xf5, 0x80, 0x4d, 0x8d, + 0xbf, 0x31, 0x52, 0xe2, 0xba, 0xd4, 0x72, 0x02, 0xc6, 0x3a, 0x0d, 0x5a, 0x87, 0xc9, 0x88, 0xbf, + 0xae, 0x23, 0x6f, 0x90, 0x08, 0x8b, 0xfe, 0xc9, 0xd4, 0x9b, 0xf4, 0x12, 0x7d, 0xc8, 0x40, 0x7c, + 0xb1, 0xca, 0x3b, 0x27, 0x69, 0x16, 0xe8, 0x15, 0x98, 0xf0, 0xf4, 0x67, 0x3f, 0x6b, 0xc2, 0xe0, + 0x57, 0xa1, 0x71, 0xc6, 0xa3, 0xa0, 0x35, 0x9c, 0xa2, 0xa6, 0x4a, 0x80, 0x0e, 0x11, 0xa9, 0x85, + 0x1c, 0x7f, 0x93, 0x44, 0xe2, 0x69, 0x0f, 0xa6, 0x04, 0x5c, 0xcf, 0xa1, 0xc1, 0xb9, 0xa5, 0xd1, + 0x8b, 0x30, 0x26, 0x3f, 0x5f, 0xbb, 0x51, 0x95, 0x04, 0x60, 0x6a, 0x38, 0x6c, 0x50, 0xa2, 0xbb, + 0x70, 0x56, 0xfe, 0x5f, 0x0f, 0x9d, 0x8d, 0x0d, 0xb7, 0x21, 0x2e, 0xb4, 0x8d, 0x32, 0x16, 0x0b, + 0x32, 0x1a, 0x7d, 0x39, 0x8b, 0xe8, 0x70, 0xbf, 0x72, 0x51, 0xf4, 0x5a, 0x26, 0x9e, 0x0d, 0x62, + 0x36, 0x7f, 0xb4, 0x06, 0x67, 0xb6, 0x88, 0xe3, 0xc5, 0x5b, 0x4b, 0x5b, 0xa4, 0xb1, 0x2d, 0x17, + 0x11, 0xbb, 0xa7, 0xa5, 0x85, 0x2d, 0x5e, 0xed, 0x24, 0xc1, 0x59, 0xe5, 0xde, 0xdf, 0x39, 0xec, + 0x3b, 0xb4, 0xb0, 0xa6, 0x03, 0xa0, 0x2f, 0xc2, 0x98, 0xde, 0xd7, 0x42, 0x0c, 0x3f, 0xd6, 0xeb, + 0x21, 0x58, 0xa1, 0x41, 0xa8, 0x7e, 0xd7, 0x71, 0xd8, 0xe0, 0x68, 0xff, 0xb3, 0x02, 0x54, 0x7a, + 0xe4, 0xe6, 0x4a, 0x39, 0x97, 0xac, 0xbe, 0x9c, 0x4b, 0x0b, 0xf2, 0xa1, 0x97, 0x1b, 0xa9, 0x34, + 0xe2, 0xa9, 0x47, 0x5c, 0x92, 0x64, 0xe2, 0x69, 0xfa, 0xbe, 0xe3, 0xaa, 0x74, 0xff, 0xd4, 0x40, + 0xcf, 0xf0, 0xb2, 0x9a, 0xee, 0x68, 0x1c, 0xec, 0x5f, 0x21, 0xcd, 0xf5, 0x31, 0xda, 0xdf, 0x29, + 0xc0, 0x59, 0xd5, 0x85, 0x3f, 0xb9, 0x1d, 0x77, 0xab, 0xb3, 0xe3, 0x8e, 0xc1, 0x43, 0x6b, 0xdf, + 0x84, 0xa1, 0xfa, 0x5e, 0xd4, 0x88, 0xbd, 0x3e, 0xf6, 0xef, 0x47, 0x8d, 0x95, 0x93, 0xec, 0x32, + 0xec, 0x3d, 0x35, 0xb1, 0x90, 0xec, 0xbf, 0x68, 0xc1, 0xe4, 0xfa, 0x52, 0xad, 0x1e, 0x34, 0xb6, + 0x49, 0xbc, 0xc0, 0xfd, 0x0f, 0x58, 0x6c, 0xdf, 0xd6, 0x7d, 0x6e, 0xcb, 0x59, 0x1b, 0xfe, 0x45, + 0x18, 0xd8, 0x0a, 0xa2, 0x38, 0xed, 0x85, 0xbf, 0x1a, 0x44, 0x31, 0x66, 0x18, 0xfb, 0x8f, 0x2d, + 0x18, 0x64, 0x4f, 0x88, 0xf5, 0x7a, 0x6a, 0xae, 0x9f, 0xef, 0x42, 0x2f, 0xc0, 0x10, 0xd9, 0xd8, + 0x20, 0x8d, 0x58, 0x8c, 0xaa, 0xbc, 0xa0, 0x33, 0xb4, 0xcc, 0xa0, 0x74, 0xcf, 0x62, 0x95, 0xf1, + 0xbf, 0x58, 0x10, 0xa3, 0x2f, 0x40, 0x29, 0x76, 0x77, 0xc8, 0x42, 0xb3, 0x29, 0x1c, 0xe0, 0x47, + 0x8b, 0x75, 0x52, 0x7b, 0xe8, 0xba, 0x64, 0x82, 0x13, 0x7e, 0xf6, 0x2f, 0x14, 0x00, 0x92, 0x8b, + 0x7c, 0xbd, 0x3e, 0x73, 0xb1, 0xe3, 0x45, 0xbd, 0xc7, 0x32, 0x5e, 0xd4, 0x43, 0x09, 0xc3, 0x8c, + 0xf7, 0xf4, 0x54, 0x57, 0x15, 0xfb, 0xea, 0xaa, 0x81, 0xa3, 0x74, 0xd5, 0x12, 0x4c, 0x27, 0x17, + 0x11, 0xcd, 0x5b, 0xd9, 0x2c, 0xe7, 0xee, 0x7a, 0x1a, 0x89, 0x3b, 0xe9, 0xed, 0xaf, 0x58, 0x20, + 0xe2, 0x5f, 0xfb, 0x98, 0xd0, 0x6f, 0xc8, 0x87, 0xb5, 0x8c, 0x84, 0x81, 0x17, 0xf3, 0xc3, 0xb8, + 0x45, 0x9a, 0x40, 0x25, 0xd9, 0x8d, 0xe4, 0x80, 0x06, 0x2f, 0xfb, 0x77, 0x2d, 0x18, 0xe5, 0xe8, + 0x35, 0x66, 0x24, 0xf6, 0x6e, 0xcd, 0x91, 0x32, 0x36, 0xb3, 0x37, 0xa7, 0x28, 0x63, 0x95, 0xd8, + 0x57, 0x7f, 0x73, 0x4a, 0x22, 0x70, 0x42, 0x83, 0x9e, 0x80, 0xe1, 0xa8, 0x7d, 0x87, 0x91, 0xa7, + 0x42, 0x60, 0xeb, 0x1c, 0x8c, 0x25, 0x9e, 0xce, 0xab, 0xa9, 0x74, 0xdc, 0x3a, 0xba, 0x0a, 0x43, + 0x5c, 0x6c, 0x88, 0x65, 0xdc, 0xc5, 0xdd, 0xaf, 0x45, 0xbb, 0x03, 0x7f, 0x59, 0x9c, 0x89, 0x1b, + 0x51, 0x1e, 0xbd, 0x09, 0xa3, 0xcd, 0xe0, 0xae, 0x7f, 0xd7, 0x09, 0x9b, 0x0b, 0xb5, 0x55, 0xd1, + 0xeb, 0x99, 0x71, 0x6c, 0xd5, 0x84, 0x4c, 0x8f, 0xa0, 0x67, 0x0e, 0xb4, 0x04, 0x85, 0x75, 0x76, + 0x68, 0x9d, 0xe5, 0x46, 0xd9, 0x70, 0x37, 0xd7, 0x9c, 0x56, 0xb7, 0xc8, 0x8e, 0x25, 0x49, 0xa4, + 0x71, 0x1e, 0x17, 0x09, 0x54, 0x38, 0x02, 0x27, 0x8c, 0xec, 0xf7, 0xce, 0x80, 0x31, 0xda, 0x46, + 0x5e, 0x65, 0xeb, 0x98, 0xf2, 0x2a, 0x63, 0x18, 0x21, 0x3b, 0xad, 0x78, 0xaf, 0xea, 0x86, 0xdd, + 0xd2, 0xe7, 0x2f, 0x0b, 0x9a, 0x4e, 0x9e, 0x12, 0x83, 0x15, 0x9f, 0xec, 0xe4, 0xd7, 0xc5, 0x0f, + 0x30, 0xf9, 0xf5, 0xc0, 0x29, 0x26, 0xbf, 0xbe, 0x01, 0xc3, 0x9b, 0x6e, 0x8c, 0x49, 0x2b, 0x10, + 0x5b, 0x66, 0xe6, 0x4c, 0xb8, 0xc2, 0x49, 0x3a, 0xd3, 0xb6, 0x0a, 0x04, 0x96, 0x4c, 0xd0, 0xab, + 0x6a, 0x0d, 0x0c, 0xe5, 0xab, 0x82, 0x9d, 0xfe, 0xe7, 0xcc, 0x55, 0x20, 0x92, 0x5d, 0x0f, 0xdf, + 0x6f, 0xb2, 0x6b, 0x95, 0xac, 0x7a, 0xe4, 0xfd, 0x25, 0xab, 0x36, 0x92, 0x79, 0x97, 0x8e, 0x2f, + 0x99, 0xf7, 0x57, 0x2c, 0x38, 0xdb, 0xca, 0xca, 0x6b, 0x2f, 0x12, 0x50, 0xbf, 0xd0, 0xf7, 0xab, + 0x01, 0x46, 0x85, 0x2c, 0x41, 0x47, 0x26, 0x19, 0xce, 0xae, 0x4e, 0x66, 0x05, 0x1f, 0xbd, 0xdf, + 0xac, 0xe0, 0x27, 0x93, 0xa9, 0x3a, 0xc9, 0x11, 0x3e, 0x7e, 0x8c, 0x39, 0xc2, 0x27, 0xde, 0x77, + 0x8e, 0x70, 0x2d, 0xcf, 0xf7, 0xe4, 0x71, 0xe4, 0xf9, 0x7e, 0xcb, 0x14, 0xf6, 0x3c, 0xfd, 0xf4, + 0x53, 0x3d, 0x84, 0xbd, 0xc1, 0xb7, 0xbb, 0xb8, 0xe7, 0x39, 0xcd, 0xa7, 0xef, 0x2b, 0xa7, 0xb9, + 0x91, 0x2d, 0x1c, 0x1d, 0x5f, 0xb6, 0xf0, 0xdb, 0xfa, 0x16, 0x74, 0x26, 0x9f, 0xaf, 0xda, 0x69, + 0x3a, 0xf9, 0x66, 0x6d, 0x42, 0x9d, 0x59, 0xc8, 0x67, 0x4e, 0x27, 0x0b, 0xf9, 0xd9, 0x63, 0xcf, + 0x42, 0x7e, 0xee, 0x14, 0xb2, 0x90, 0x3f, 0xf0, 0x81, 0x66, 0x21, 0x2f, 0x9f, 0x6c, 0x16, 0xf2, + 0xf3, 0xc7, 0x91, 0x85, 0xfc, 0x36, 0x94, 0x5a, 0xf2, 0x6a, 0x63, 0x79, 0x36, 0x7f, 0x48, 0x32, + 0xef, 0x3f, 0xf2, 0x21, 0x51, 0x28, 0x9c, 0xb0, 0xa2, 0x7c, 0x93, 0xac, 0xe4, 0x0f, 0xe6, 0xf3, + 0xcd, 0x34, 0xdb, 0xbb, 0xe4, 0x22, 0xff, 0x4b, 0x05, 0xb8, 0xd0, 0x7d, 0x5e, 0x27, 0x36, 0x7f, + 0x2d, 0x71, 0xb1, 0xa6, 0x6c, 0x7e, 0xa6, 0x74, 0x69, 0x54, 0x7d, 0xdf, 0xff, 0xbe, 0x02, 0xd3, + 0x2a, 0x56, 0xc8, 0x73, 0x1b, 0x7b, 0xda, 0x53, 0x44, 0x2a, 0xfc, 0xbc, 0x9e, 0x26, 0xc0, 0x9d, + 0x65, 0xd0, 0x02, 0x4c, 0x1a, 0xc0, 0xd5, 0xaa, 0x50, 0xc9, 0x95, 0x93, 0xa1, 0x6e, 0xa2, 0x71, + 0x9a, 0xde, 0xfe, 0x86, 0x05, 0x0f, 0xe4, 0x24, 0x34, 0xed, 0xfb, 0x7a, 0xf3, 0x06, 0x4c, 0xb6, + 0xcc, 0xa2, 0x3d, 0xb2, 0x20, 0x18, 0x69, 0x53, 0x55, 0x5b, 0x53, 0x08, 0x9c, 0x66, 0xba, 0x78, + 0xe9, 0xbb, 0x3f, 0xbc, 0xf0, 0x91, 0x3f, 0xfc, 0xe1, 0x85, 0x8f, 0xfc, 0xe0, 0x87, 0x17, 0x3e, + 0xf2, 0xff, 0x1d, 0x5c, 0xb0, 0xbe, 0x7b, 0x70, 0xc1, 0xfa, 0xc3, 0x83, 0x0b, 0xd6, 0x0f, 0x0e, + 0x2e, 0x58, 0x7f, 0x72, 0x70, 0xc1, 0xfa, 0x85, 0x1f, 0x5d, 0xf8, 0xc8, 0x1b, 0x85, 0xdd, 0x67, + 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe1, 0xd6, 0x78, 0x17, 0xba, 0xca, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index a073471f8589f..00a3b82368601 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -2096,6 +2096,12 @@ message PersistentVolumeClaimStatus { // Represents the actual resources of the underlying volume. // +optional map capacity = 3; + + // Current service state of PVC + // +optional + // +patchMergeKey=type + // +patchStrategy=merge + repeated PvcCondition conditions = 4; } // PersistentVolumeClaimVolumeSource references the user's PVC in the same namespace. @@ -3019,6 +3025,29 @@ message ProjectedVolumeSource { optional int32 defaultMode = 2; } +// PvcCondition contails details about state of pvc +message PvcCondition { + optional string type = 1; + + optional string status = 2; + + // Last time we probed the condition. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastProbeTime = 3; + + // Last time the condition transitioned from one status to another. + // +optional + optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastTransitionTime = 4; + + // Unique, one-word, CamelCase reason for the condition's last transition. + // +optional + optional string reason = 5; + + // Human-readable message indicating details about last transition. + // +optional + optional string message = 6; +} + // Represents a Quobyte mount that lasts the lifetime of a pod. // Quobyte volumes do not support ownership management or SELinux relabeling. message QuobyteVolumeSource { diff --git a/staging/src/k8s.io/api/core/v1/types.generated.go b/staging/src/k8s.io/api/core/v1/types.generated.go index 3a422a59fc985..81c64eda0f36a 100644 --- a/staging/src/k8s.io/api/core/v1/types.generated.go +++ b/staging/src/k8s.io/api/core/v1/types.generated.go @@ -10941,6 +10941,503 @@ func (x *PersistentVolumeClaimSpec) codecDecodeSelfFromArray(l int, d *codec1978 z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x PvcConditionType) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *PvcConditionType) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} + +func (x *PvcCondition) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + if x == nil { + r.EncodeNil() + } else { + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + yysep2 := !z.EncBinary() + yy2arr2 := z.EncBasicHandle().StructToArray + var yyq2 [6]bool + _, _, _ = yysep2, yyq2, yy2arr2 + const yyr2 bool = false + yyq2[2] = true + yyq2[3] = true + yyq2[4] = x.Reason != "" + yyq2[5] = x.Message != "" + var yynn2 int + if yyr2 || yy2arr2 { + r.EncodeArrayStart(6) + } else { + yynn2 = 2 + for _, b := range yyq2 { + if b { + yynn2++ + } + } + r.EncodeMapStart(yynn2) + yynn2 = 0 + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + x.Type.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("type")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + x.Type.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + x.Status.CodecEncodeSelf(e) + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("status")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + x.Status.CodecEncodeSelf(e) + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[2] { + yy10 := &x.LastProbeTime + yym11 := z.EncBinary() + _ = yym11 + if false { + } else if z.HasExtensions() && z.EncExt(yy10) { + } else if yym11 { + z.EncBinaryMarshal(yy10) + } else if !yym11 && z.IsJSONHandle() { + z.EncJSONMarshal(yy10) + } else { + z.EncFallback(yy10) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[2] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("lastProbeTime")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy12 := &x.LastProbeTime + yym13 := z.EncBinary() + _ = yym13 + if false { + } else if z.HasExtensions() && z.EncExt(yy12) { + } else if yym13 { + z.EncBinaryMarshal(yy12) + } else if !yym13 && z.IsJSONHandle() { + z.EncJSONMarshal(yy12) + } else { + z.EncFallback(yy12) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + yy15 := &x.LastTransitionTime + yym16 := z.EncBinary() + _ = yym16 + if false { + } else if z.HasExtensions() && z.EncExt(yy15) { + } else if yym16 { + z.EncBinaryMarshal(yy15) + } else if !yym16 && z.IsJSONHandle() { + z.EncJSONMarshal(yy15) + } else { + z.EncFallback(yy15) + } + } else { + r.EncodeNil() + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("lastTransitionTime")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yy17 := &x.LastTransitionTime + yym18 := z.EncBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.EncExt(yy17) { + } else if yym18 { + z.EncBinaryMarshal(yy17) + } else if !yym18 && z.IsJSONHandle() { + z.EncJSONMarshal(yy17) + } else { + z.EncFallback(yy17) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[4] { + yym20 := z.EncBinary() + _ = yym20 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Reason)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[4] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("reason")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym21 := z.EncBinary() + _ = yym21 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Reason)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[5] { + yym23 := z.EncBinary() + _ = yym23 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Message)) + } + } else { + r.EncodeString(codecSelferC_UTF81234, "") + } + } else { + if yyq2[5] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("message")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + yym24 := z.EncBinary() + _ = yym24 + if false { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x.Message)) + } + } + } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + z.EncSendContainerState(codecSelfer_containerMapEnd1234) + } + } + } +} + +func (x *PvcCondition) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + yyct2 := r.ContainerType() + if yyct2 == codecSelferValueTypeMap1234 { + yyl2 := r.ReadMapStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerMapEnd1234) + } else { + x.codecDecodeSelfFromMap(yyl2, d) + } + } else if yyct2 == codecSelferValueTypeArray1234 { + yyl2 := r.ReadArrayStart() + if yyl2 == 0 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + } else { + x.codecDecodeSelfFromArray(yyl2, d) + } + } else { + panic(codecSelferOnlyMapOrArrayEncodeToStructErr1234) + } + } +} + +func (x *PvcCondition) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yys3Slc = z.DecScratchBuffer() // default slice to decode into + _ = yys3Slc + var yyhl3 bool = l >= 0 + for yyj3 := 0; ; yyj3++ { + if yyhl3 { + if yyj3 >= l { + break + } + } else { + if r.CheckBreak() { + break + } + } + z.DecSendContainerState(codecSelfer_containerMapKey1234) + yys3Slc = r.DecodeBytes(yys3Slc, true, true) + yys3 := string(yys3Slc) + z.DecSendContainerState(codecSelfer_containerMapValue1234) + switch yys3 { + case "type": + if r.TryDecodeAsNil() { + x.Type = "" + } else { + yyv4 := &x.Type + yyv4.CodecDecodeSelf(d) + } + case "status": + if r.TryDecodeAsNil() { + x.Status = "" + } else { + yyv5 := &x.Status + yyv5.CodecDecodeSelf(d) + } + case "lastProbeTime": + if r.TryDecodeAsNil() { + x.LastProbeTime = pkg2_v1.Time{} + } else { + yyv6 := &x.LastProbeTime + yym7 := z.DecBinary() + _ = yym7 + if false { + } else if z.HasExtensions() && z.DecExt(yyv6) { + } else if yym7 { + z.DecBinaryUnmarshal(yyv6) + } else if !yym7 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv6) + } else { + z.DecFallback(yyv6, false) + } + } + case "lastTransitionTime": + if r.TryDecodeAsNil() { + x.LastTransitionTime = pkg2_v1.Time{} + } else { + yyv8 := &x.LastTransitionTime + yym9 := z.DecBinary() + _ = yym9 + if false { + } else if z.HasExtensions() && z.DecExt(yyv8) { + } else if yym9 { + z.DecBinaryUnmarshal(yyv8) + } else if !yym9 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv8) + } else { + z.DecFallback(yyv8, false) + } + } + case "reason": + if r.TryDecodeAsNil() { + x.Reason = "" + } else { + yyv10 := &x.Reason + yym11 := z.DecBinary() + _ = yym11 + if false { + } else { + *((*string)(yyv10)) = r.DecodeString() + } + } + case "message": + if r.TryDecodeAsNil() { + x.Message = "" + } else { + yyv12 := &x.Message + yym13 := z.DecBinary() + _ = yym13 + if false { + } else { + *((*string)(yyv12)) = r.DecodeString() + } + } + default: + z.DecStructFieldNotFound(-1, yys3) + } // end switch yys3 + } // end for yyj3 + z.DecSendContainerState(codecSelfer_containerMapEnd1234) +} + +func (x *PvcCondition) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + var yyj14 int + var yyb14 bool + var yyhl14 bool = l >= 0 + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Type = "" + } else { + yyv15 := &x.Type + yyv15.CodecDecodeSelf(d) + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Status = "" + } else { + yyv16 := &x.Status + yyv16.CodecDecodeSelf(d) + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.LastProbeTime = pkg2_v1.Time{} + } else { + yyv17 := &x.LastProbeTime + yym18 := z.DecBinary() + _ = yym18 + if false { + } else if z.HasExtensions() && z.DecExt(yyv17) { + } else if yym18 { + z.DecBinaryUnmarshal(yyv17) + } else if !yym18 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv17) + } else { + z.DecFallback(yyv17, false) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.LastTransitionTime = pkg2_v1.Time{} + } else { + yyv19 := &x.LastTransitionTime + yym20 := z.DecBinary() + _ = yym20 + if false { + } else if z.HasExtensions() && z.DecExt(yyv19) { + } else if yym20 { + z.DecBinaryUnmarshal(yyv19) + } else if !yym20 && z.IsJSONHandle() { + z.DecJSONUnmarshal(yyv19) + } else { + z.DecFallback(yyv19, false) + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Reason = "" + } else { + yyv21 := &x.Reason + yym22 := z.DecBinary() + _ = yym22 + if false { + } else { + *((*string)(yyv21)) = r.DecodeString() + } + } + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Message = "" + } else { + yyv23 := &x.Message + yym24 := z.DecBinary() + _ = yym24 + if false { + } else { + *((*string)(yyv23)) = r.DecodeString() + } + } + for { + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + break + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + z.DecStructFieldNotFound(yyj14-1, "") + } + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) +} + func (x *PersistentVolumeClaimStatus) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -10955,15 +11452,16 @@ func (x *PersistentVolumeClaimStatus) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [3]bool + var yyq2 [4]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.Phase != "" yyq2[1] = len(x.AccessModes) != 0 yyq2[2] = len(x.Capacity) != 0 + yyq2[3] = len(x.Conditions) != 0 var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(3) + r.EncodeArrayStart(4) } else { yynn2 = 0 for _, b := range yyq2 { @@ -11045,6 +11543,39 @@ func (x *PersistentVolumeClaimStatus) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if yyq2[3] { + if x.Conditions == nil { + r.EncodeNil() + } else { + yym13 := z.EncBinary() + _ = yym13 + if false { + } else { + h.encSlicePvcCondition(([]PvcCondition)(x.Conditions), e) + } + } + } else { + r.EncodeNil() + } + } else { + if yyq2[3] { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("conditions")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.Conditions == nil { + r.EncodeNil() + } else { + yym14 := z.EncBinary() + _ = yym14 + if false { + } else { + h.encSlicePvcCondition(([]PvcCondition)(x.Conditions), e) + } + } + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -11132,6 +11663,18 @@ func (x *PersistentVolumeClaimStatus) codecDecodeSelfFromMap(l int, d *codec1978 yyv7 := &x.Capacity yyv7.CodecDecodeSelf(d) } + case "conditions": + if r.TryDecodeAsNil() { + x.Conditions = nil + } else { + yyv8 := &x.Conditions + yym9 := z.DecBinary() + _ = yym9 + if false { + } else { + h.decSlicePvcCondition((*[]PvcCondition)(yyv8), d) + } + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -11143,16 +11686,16 @@ func (x *PersistentVolumeClaimStatus) codecDecodeSelfFromArray(l int, d *codec19 var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj8 int - var yyb8 bool - var yyhl8 bool = l >= 0 - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + var yyj10 int + var yyb10 bool + var yyhl10 bool = l >= 0 + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l } else { - yyb8 = r.CheckBreak() + yyb10 = r.CheckBreak() } - if yyb8 { + if yyb10 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -11160,16 +11703,16 @@ func (x *PersistentVolumeClaimStatus) codecDecodeSelfFromArray(l int, d *codec19 if r.TryDecodeAsNil() { x.Phase = "" } else { - yyv9 := &x.Phase - yyv9.CodecDecodeSelf(d) + yyv11 := &x.Phase + yyv11.CodecDecodeSelf(d) } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l } else { - yyb8 = r.CheckBreak() + yyb10 = r.CheckBreak() } - if yyb8 { + if yyb10 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -11177,21 +11720,21 @@ func (x *PersistentVolumeClaimStatus) codecDecodeSelfFromArray(l int, d *codec19 if r.TryDecodeAsNil() { x.AccessModes = nil } else { - yyv10 := &x.AccessModes - yym11 := z.DecBinary() - _ = yym11 + yyv12 := &x.AccessModes + yym13 := z.DecBinary() + _ = yym13 if false { } else { - h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv10), d) + h.decSlicePersistentVolumeAccessMode((*[]PersistentVolumeAccessMode)(yyv12), d) } } - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l } else { - yyb8 = r.CheckBreak() + yyb10 = r.CheckBreak() } - if yyb8 { + if yyb10 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -11199,21 +11742,43 @@ func (x *PersistentVolumeClaimStatus) codecDecodeSelfFromArray(l int, d *codec19 if r.TryDecodeAsNil() { x.Capacity = nil } else { - yyv12 := &x.Capacity - yyv12.CodecDecodeSelf(d) + yyv14 := &x.Capacity + yyv14.CodecDecodeSelf(d) + } + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l + } else { + yyb10 = r.CheckBreak() + } + if yyb10 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + x.Conditions = nil + } else { + yyv15 := &x.Conditions + yym16 := z.DecBinary() + _ = yym16 + if false { + } else { + h.decSlicePvcCondition((*[]PvcCondition)(yyv15), d) + } } for { - yyj8++ - if yyhl8 { - yyb8 = yyj8 > l + yyj10++ + if yyhl10 { + yyb10 = yyj10 > l } else { - yyb8 = r.CheckBreak() + yyb10 = r.CheckBreak() } - if yyb8 { + if yyb10 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj8-1, "") + z.DecStructFieldNotFound(yyj10-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -70180,7 +70745,7 @@ func (x codecSelfer1234) decSlicePersistentVolumeClaim(v *[]PersistentVolumeClai yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 384) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 408) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] @@ -70260,6 +70825,125 @@ func (x codecSelfer1234) decSlicePersistentVolumeClaim(v *[]PersistentVolumeClai } } +func (x codecSelfer1234) encSlicePvcCondition(v []PvcCondition, e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + r.EncodeArrayStart(len(v)) + for _, yyv1 := range v { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + yy2 := &yyv1 + yy2.CodecEncodeSelf(e) + } + z.EncSendContainerState(codecSelfer_containerArrayEnd1234) +} + +func (x codecSelfer1234) decSlicePvcCondition(v *[]PvcCondition, d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + + yyv1 := *v + yyh1, yyl1 := z.DecSliceHelperStart() + var yyc1 bool + _ = yyc1 + if yyl1 == 0 { + if yyv1 == nil { + yyv1 = []PvcCondition{} + yyc1 = true + } else if len(yyv1) != 0 { + yyv1 = yyv1[:0] + yyc1 = true + } + } else if yyl1 > 0 { + var yyrr1, yyrl1 int + var yyrt1 bool + _, _ = yyrl1, yyrt1 + yyrr1 = yyl1 // len(yyv1) + if yyl1 > cap(yyv1) { + + yyrg1 := len(yyv1) > 0 + yyv21 := yyv1 + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 112) + if yyrt1 { + if yyrl1 <= cap(yyv1) { + yyv1 = yyv1[:yyrl1] + } else { + yyv1 = make([]PvcCondition, yyrl1) + } + } else { + yyv1 = make([]PvcCondition, yyrl1) + } + yyc1 = true + yyrr1 = len(yyv1) + if yyrg1 { + copy(yyv1, yyv21) + } + } else if yyl1 != len(yyv1) { + yyv1 = yyv1[:yyl1] + yyc1 = true + } + yyj1 := 0 + for ; yyj1 < yyrr1; yyj1++ { + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = PvcCondition{} + } else { + yyv2 := &yyv1[yyj1] + yyv2.CodecDecodeSelf(d) + } + + } + if yyrt1 { + for ; yyj1 < yyl1; yyj1++ { + yyv1 = append(yyv1, PvcCondition{}) + yyh1.ElemContainerState(yyj1) + if r.TryDecodeAsNil() { + yyv1[yyj1] = PvcCondition{} + } else { + yyv3 := &yyv1[yyj1] + yyv3.CodecDecodeSelf(d) + } + + } + } + + } else { + yyj1 := 0 + for ; !r.CheckBreak(); yyj1++ { + + if yyj1 >= len(yyv1) { + yyv1 = append(yyv1, PvcCondition{}) // var yyz1 PvcCondition + yyc1 = true + } + yyh1.ElemContainerState(yyj1) + if yyj1 < len(yyv1) { + if r.TryDecodeAsNil() { + yyv1[yyj1] = PvcCondition{} + } else { + yyv4 := &yyv1[yyj1] + yyv4.CodecDecodeSelf(d) + } + + } else { + z.DecSwallow() + } + + } + if yyj1 < len(yyv1) { + yyv1 = yyv1[:yyj1] + yyc1 = true + } else if yyj1 == 0 && yyv1 == nil { + yyv1 = []PvcCondition{} + yyc1 = true + } + } + yyh1.End() + if yyc1 { + *v = yyv1 + } +} + func (x codecSelfer1234) encSliceKeyToPath(v []KeyToPath, e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index 365825019ef23..4c420e5b7cfd4 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1113,6 +1113,7 @@ var map_PersistentVolumeClaimStatus = map[string]string{ "phase": "Phase represents the current phase of PersistentVolumeClaim.", "accessModes": "AccessModes contains the actual access modes the volume backing the PVC has. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1", "capacity": "Represents the actual resources of the underlying volume.", + "conditions": "Current service state of PVC", } func (PersistentVolumeClaimStatus) SwaggerDoc() map[string]string { @@ -1507,6 +1508,18 @@ func (ProjectedVolumeSource) SwaggerDoc() map[string]string { return map_ProjectedVolumeSource } +var map_PvcCondition = map[string]string{ + "": "PvcCondition contails details about state of pvc", + "lastProbeTime": "Last time we probed the condition.", + "lastTransitionTime": "Last time the condition transitioned from one status to another.", + "reason": "Unique, one-word, CamelCase reason for the condition's last transition.", + "message": "Human-readable message indicating details about last transition.", +} + +func (PvcCondition) SwaggerDoc() map[string]string { + return map_PvcCondition +} + var map_QuobyteVolumeSource = map[string]string{ "": "Represents a Quobyte mount that lasts the lifetime of a pod. Quobyte volumes do not support ownership management or SELinux relabeling.", "registry": "Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes", diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 8dc98c772e0d9..9e5c6bd1f3c7e 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -545,6 +545,10 @@ func RegisterDeepCopies(scheme *runtime.Scheme) error { in.(*ProjectedVolumeSource).DeepCopyInto(out.(*ProjectedVolumeSource)) return nil }, InType: reflect.TypeOf(&ProjectedVolumeSource{})}, + conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { + in.(*PvcCondition).DeepCopyInto(out.(*PvcCondition)) + return nil + }, InType: reflect.TypeOf(&PvcCondition{})}, conversion.GeneratedDeepCopyFunc{Fn: func(in interface{}, out interface{}, c *conversion.Cloner) error { in.(*QuobyteVolumeSource).DeepCopyInto(out.(*QuobyteVolumeSource)) return nil @@ -3405,6 +3409,13 @@ func (in *PersistentVolumeClaimStatus) DeepCopyInto(out *PersistentVolumeClaimSt (*out)[key] = val.DeepCopy() } } + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]PvcCondition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } return } @@ -4568,6 +4579,24 @@ func (x *ProjectedVolumeSource) DeepCopy() *ProjectedVolumeSource { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *PvcCondition) DeepCopyInto(out *PvcCondition) { + *out = *in + in.LastProbeTime.DeepCopyInto(&out.LastProbeTime) + in.LastTransitionTime.DeepCopyInto(&out.LastTransitionTime) + return +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, creating a new PvcCondition. +func (x *PvcCondition) DeepCopy() *PvcCondition { + if x == nil { + return nil + } + out := new(PvcCondition) + x.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *QuobyteVolumeSource) DeepCopyInto(out *QuobyteVolumeSource) { *out = *in From 639f706fdcae8173bc0fdc814c34fdbdb3c1b23b Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 24 Jul 2017 18:12:30 -0400 Subject: [PATCH 05/14] Add tests for size update via feature gate --- pkg/api/validation/validation_test.go | 66 +++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 6f0940d03e1f5..585b10498e32b 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -789,50 +789,99 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { }, VolumeName: "volume", }) + validSizeUpdate := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("15G"), + }, + }, + }) + invalidSizeUpdate := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("5G"), + }, + }, + }) scenarios := map[string]struct { isExpectedFailure bool oldClaim *api.PersistentVolumeClaim newClaim *api.PersistentVolumeClaim + enableResize bool }{ "valid-update-volumeName-only": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validUpdateClaim, + enableResize: false, }, "valid-no-op-update": { isExpectedFailure: false, oldClaim: validUpdateClaim, newClaim: validUpdateClaim, + enableResize: false, }, "invalid-update-change-resources-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimResources, + enableResize: false, }, "invalid-update-change-access-modes-on-bound-claim": { isExpectedFailure: true, oldClaim: validUpdateClaim, newClaim: invalidUpdateClaimAccessModes, + enableResize: false, }, "invalid-update-change-storage-class-annotation-after-creation": { isExpectedFailure: true, oldClaim: validClaimStorageClass, newClaim: invalidUpdateClaimStorageClass, + enableResize: false, }, "valid-update-mutable-annotation": { isExpectedFailure: false, oldClaim: validClaimAnnotation, newClaim: validUpdateClaimMutableAnnotation, + enableResize: false, }, "valid-update-add-annotation": { isExpectedFailure: false, oldClaim: validClaim, newClaim: validAddClaimAnnotation, + enableResize: false, + }, + "valid-size-update-resize-disabled": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: validSizeUpdate, + enableResize: false, + }, + "valid-size-update-resize-enabled": { + isExpectedFailure: false, + oldClaim: validClaim, + newClaim: validSizeUpdate, + enableResize: true, + }, + "invalid-size-update-resize-enabled": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: invalidSizeUpdate, + enableResize: true, }, } for name, scenario := range scenarios { // ensure we have a resource version specified for updates + togglePVExpandFeature(scenario.enableResize, t) scenario.oldClaim.ResourceVersion = "1" scenario.newClaim.ResourceVersion = "1" errs := ValidatePersistentVolumeClaimUpdate(scenario.newClaim, scenario.oldClaim) @@ -845,6 +894,23 @@ func TestValidatePersistentVolumeClaimUpdate(t *testing.T) { } } +func togglePVExpandFeature(toggleFlag bool, t *testing.T) { + if toggleFlag { + // Enable alpha feature LocalStorageCapacityIsolation + err := utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=true") + if err != nil { + t.Errorf("Failed to enable feature gate for ExpandPersistentVolumes: %v", err) + return + } + } else { + err := utilfeature.DefaultFeatureGate.Set("ExpandPersistentVolumes=false") + if err != nil { + t.Errorf("Failed to disable feature gate for ExpandPersistentVolumes: %v", err) + return + } + } +} + func TestValidateKeyToPath(t *testing.T) { testCases := []struct { kp api.KeyToPath From 679d326ef53753581a18d802df345b1de1d62a66 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Mon, 24 Jul 2017 18:25:11 -0400 Subject: [PATCH 06/14] Start adding code and validation for checking condition update --- pkg/api/validation/validation.go | 4 ++ pkg/api/validation/validation_test.go | 73 +++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 90fe34e51d198..79db73025dce7 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -1517,6 +1517,10 @@ func ValidatePersistentVolumeClaimStatusUpdate(newPvc, oldPvc *api.PersistentVol if len(newPvc.Spec.AccessModes) == 0 { allErrs = append(allErrs, field.Required(field.NewPath("Spec", "accessModes"), "")) } + if !utilfeature.DefaultFeatureGate.Enabled(features.ExpandPersistentVolumes) && len(newPvc.Status.Conditions) > 0 { + conditionPath := field.NewPath("status", "conditions") + allErrs = append(allErrs, field.Forbidden(conditionPath, "invalid field")) + } capPath := field.NewPath("status", "capacity") for r, qty := range newPvc.Status.Capacity { allErrs = append(allErrs, validateBasicResource(qty, capPath.Key(string(r)))...) diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 585b10498e32b..83ed5af0a0fee 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -491,6 +491,17 @@ func testVolumeClaim(name string, namespace string, spec api.PersistentVolumeCla } } +func testVolumeClaimWithStatus( + name, namespace string, + spec api.PersistentVolumeClaimSpec, + status api.PersistentVolumeClaimStatus) *api.PersistentVolumeClaim { + return &api.PersistentVolumeClaim{ + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: namespace}, + Spec: spec, + Status: status, + } +} + func testVolumeClaimStorageClass(name string, namespace string, annval string, spec api.PersistentVolumeClaimSpec) *api.PersistentVolumeClaim { annotations := map[string]string{ v1.BetaStorageClassAnnotation: annval, @@ -8841,6 +8852,68 @@ func TestValidateLimitRange(t *testing.T) { } +func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) { + validClaim := testVolumeClaim("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + }, + }) + validConditionUpdate := testVolumeClaimWithStatus("foo", "ns", api.PersistentVolumeClaimSpec{ + AccessModes: []api.PersistentVolumeAccessMode{ + api.ReadWriteOnce, + api.ReadOnlyMany, + }, + Resources: api.ResourceRequirements{ + Requests: api.ResourceList{ + api.ResourceName(api.ResourceStorage): resource.MustParse("10G"), + }, + }, + }, api.PersistentVolumeClaimStatus{ + Phase: api.ClaimPending, + Conditions: []api.PvcCondition{ + api.PvcCondition{Type: api.PvcResizeStarted, Status: api.ConditionTrue}, + }, + }) + scenarios := map[string]struct { + isExpectedFailure bool + oldClaim *api.PersistentVolumeClaim + newClaim *api.PersistentVolumeClaim + enableResize bool + }{ + "condition-update-with-disabled-feature-gate": { + isExpectedFailure: true, + oldClaim: validClaim, + newClaim: validConditionUpdate, + enableResize: false, + }, + "condition-update-with-enabled-feature-gate": { + isExpectedFailure: false, + oldClaim: validClaim, + newClaim: validConditionUpdate, + enableResize: true, + }, + } + for name, scenario := range scenarios { + // ensure we have a resource version specified for updates + togglePVExpandFeature(scenario.enableResize, t) + scenario.oldClaim.ResourceVersion = "1" + scenario.newClaim.ResourceVersion = "1" + errs := ValidatePersistentVolumeClaimStatusUpdate(scenario.newClaim, scenario.oldClaim) + if len(errs) == 0 && scenario.isExpectedFailure { + t.Errorf("Unexpected success for scenario: %s", name) + } + if len(errs) > 0 && !scenario.isExpectedFailure { + t.Errorf("Unexpected failure for scenario: %s - %+v", name, errs) + } + } +} + func TestValidateResourceQuota(t *testing.T) { spec := api.ResourceQuotaSpec{ Hard: api.ResourceList{ From 13fc68f1e12c42492dc721c40367355c2e5c6f14 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 26 Jul 2017 10:47:19 -0400 Subject: [PATCH 07/14] Implement volume plugin support for expanding volumes --- pkg/volume/glusterfs/expander.go | 17 ++++++++++++++++ pkg/volume/plugins.go | 33 ++++++++++++++++++++++++++++++++ pkg/volume/volume.go | 6 ++++++ 3 files changed, 56 insertions(+) create mode 100644 pkg/volume/glusterfs/expander.go diff --git a/pkg/volume/glusterfs/expander.go b/pkg/volume/glusterfs/expander.go new file mode 100644 index 0000000000000..ba9bd470a8962 --- /dev/null +++ b/pkg/volume/glusterfs/expander.go @@ -0,0 +1,17 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package glusterfs diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index cbc2739109694..4da1f878c8948 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -186,6 +186,13 @@ type AttachableVolumePlugin interface { GetDeviceMountRefs(deviceMountPath string) ([]string, error) } +// ExpandableVolumePlugin is an extended interface of VolumePlugin and is used for volumes that can be +// expanded +type ExpandableVolumePlugin interface { + VolumePlugin + NewExpander() (Expander, error) +} + // VolumeHost is an interface that plugins can use to access the kubelet. type VolumeHost interface { // GetPluginDir returns the absolute path to a directory under which @@ -546,6 +553,32 @@ func (pm *VolumePluginMgr) FindAttachablePluginByName(name string) (AttachableVo return nil, nil } +// FindExpandablePluginBySpec fetches a persistent volume plugin by spec. +func (pm *VolumePluginMgr) FindExpandablePluginBySpec(spec *Spec) (ExpandableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginBySpec(spec) + if err != nil { + return nil, err + } + + if expandableVolumePlugin, ok := volumePlugin.(ExpandableVolumePlugin); ok { + return expandableVolumePlugin, nil + } + return nil, nil +} + +// FindExpandablePluginBySpec fetches a persistent volume plugin by name. +func (pm *VolumePluginMgr) FindExpandablePluginByName(name string) (ExpandableVolumePlugin, error) { + volumePlugin, err := pm.FindPluginByName(name) + if err != nil { + return nil, err + } + + if expandableVolumePlugin, ok := volumePlugin.(ExpandableVolumePlugin); ok { + return expandableVolumePlugin, nil + } + return nil, nil +} + // NewPersistentVolumeRecyclerPodTemplate creates a template for a recycler // pod. By default, a recycler pod simply runs "rm -rf" on a volume and tests // for emptiness. Most attributes of the template will be correct for most diff --git a/pkg/volume/volume.go b/pkg/volume/volume.go index 899cf8aac7fc5..1dfe7ed9dc199 100644 --- a/pkg/volume/volume.go +++ b/pkg/volume/volume.go @@ -193,6 +193,12 @@ type BulkVolumeVerifier interface { BulkVerifyVolumes(volumesByNode map[types.NodeName][]*Spec) (map[types.NodeName]map[*Spec]bool, error) } +type Expander interface { + // ExpandVolume expands the volume + ExpandVolumeDevice(spec *Spec, newSize resource.Quantity, oldSize resource.Quantity) error + RequiresFSResize() bool +} + // Detacher can detach a volume from a node. type Detacher interface { // Detach the given device from the node with the given Name. From 6cdba8ded863aaa4fd22bf0da0aa103a1918c819 Mon Sep 17 00:00:00 2001 From: Hemant Kumar Date: Wed, 26 Jul 2017 15:12:35 -0400 Subject: [PATCH 08/14] Implement controller and volume plugin changes for resizing Fix unit test Fix code to use new import paths --- .../app/controllermanager.go | 1 + cmd/kube-controller-manager/app/core.go | 16 ++ pkg/api/validation/validation_test.go | 2 +- .../volume/expand/cache/volume_resize_map.go | 257 ++++++++++++++++++ .../volume/expand/expand_controller.go | 251 +++++++++++++++++ .../volume/expand/sync_volume_resize.go | 70 +++++ pkg/kubelet/events/event.go | 1 + .../operationexecutor/operation_executor.go | 13 + .../operation_executor_test.go | 9 + .../operationexecutor/operation_generator.go | 55 ++++ pkg/volume/util/types/types.go | 3 + pkg/volume/util/util.go | 3 +- pkg/volume/volume.go | 3 +- 13 files changed, 681 insertions(+), 3 deletions(-) create mode 100644 pkg/controller/volume/expand/cache/volume_resize_map.go create mode 100644 pkg/controller/volume/expand/expand_controller.go create mode 100644 pkg/controller/volume/expand/sync_volume_resize.go diff --git a/cmd/kube-controller-manager/app/controllermanager.go b/cmd/kube-controller-manager/app/controllermanager.go index 56b94aacd4a05..b4b8cef5c58e4 100644 --- a/cmd/kube-controller-manager/app/controllermanager.go +++ b/cmd/kube-controller-manager/app/controllermanager.go @@ -332,6 +332,7 @@ func NewControllerInitializers() map[string]InitFunc { controllers["route"] = startRouteController controllers["persistentvolume-binder"] = startPersistentVolumeBinderController controllers["attachdetach"] = startAttachDetachController + controllers["volume-expand"] = startVolumeExpandController return controllers } diff --git a/cmd/kube-controller-manager/app/core.go b/cmd/kube-controller-manager/app/core.go index 5dd170140af98..b1afde6281332 100644 --- a/cmd/kube-controller-manager/app/core.go +++ b/cmd/kube-controller-manager/app/core.go @@ -50,6 +50,7 @@ import ( serviceaccountcontroller "k8s.io/kubernetes/pkg/controller/serviceaccount" ttlcontroller "k8s.io/kubernetes/pkg/controller/ttl" "k8s.io/kubernetes/pkg/controller/volume/attachdetach" + "k8s.io/kubernetes/pkg/controller/volume/expand" persistentvolumecontroller "k8s.io/kubernetes/pkg/controller/volume/persistentvolume" "k8s.io/kubernetes/pkg/features" quotainstall "k8s.io/kubernetes/pkg/quota/install" @@ -186,6 +187,21 @@ func startAttachDetachController(ctx ControllerContext) (bool, error) { return true, nil } +func startVolumeExpandController(ctx ControllerContext) (bool, error) { + expandController, expandControllerErr := expand.NewExpandController( + ctx.ClientBuilder.ClientOrDie("expand-controller"), + ctx.InformerFactory.Core().V1().PersistentVolumeClaims(), + ctx.InformerFactory.Core().V1().PersistentVolumes(), + ctx.Cloud, + ProbeAttachableVolumePlugins(ctx.Options.VolumeConfiguration)) + + if expandControllerErr != nil { + return true, fmt.Errorf("Failed to start volume expand controller : %v", expandControllerErr) + } + go expandController.Run(ctx.Stop) + return true, nil +} + func startEndpointController(ctx ControllerContext) (bool, error) { go endpointcontroller.NewEndpointController( ctx.InformerFactory.Core().V1().Pods(), diff --git a/pkg/api/validation/validation_test.go b/pkg/api/validation/validation_test.go index 83ed5af0a0fee..43e82b2d527a7 100644 --- a/pkg/api/validation/validation_test.go +++ b/pkg/api/validation/validation_test.go @@ -8877,7 +8877,7 @@ func TestValidatePersistentVolumeClaimStatusUpdate(t *testing.T) { }, api.PersistentVolumeClaimStatus{ Phase: api.ClaimPending, Conditions: []api.PvcCondition{ - api.PvcCondition{Type: api.PvcResizeStarted, Status: api.ConditionTrue}, + {Type: api.PvcResizeStarted, Status: api.ConditionTrue}, }, }) scenarios := map[string]struct { diff --git a/pkg/controller/volume/expand/cache/volume_resize_map.go b/pkg/controller/volume/expand/cache/volume_resize_map.go new file mode 100644 index 0000000000000..c785b874499fe --- /dev/null +++ b/pkg/controller/volume/expand/cache/volume_resize_map.go @@ -0,0 +1,257 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package cache + +import ( + "fmt" + + "github.com/golang/glog" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/kubernetes/pkg/util/strings" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/util/types" +) + +type VolumeResizeMap interface { + AddPvcUpdate(newPvc *v1.PersistentVolumeClaim, oldPvc *v1.PersistentVolumeClaim, spec *volume.Spec) + GetPvcsWithResizeRequest() []*PvcWithResizeRequest + // Mark this volume as resize + MarkAsResized(*PvcWithResizeRequest) error + MarkForFileSystemResize(*PvcWithResizeRequest) error + MarkResizeFailed(*PvcWithResizeRequest, string) +} + +type volumeResizeMap struct { + pvcrs map[types.UniquePvcName]*PvcWithResizeRequest + kubeClient clientset.Interface +} + +type PvcWithResizeRequest struct { + PVC *v1.PersistentVolumeClaim + VolumeSpec *volume.Spec + CurrentSize resource.Quantity + ExpectedSize resource.Quantity + ResizeDone bool +} + +func (pvcr *PvcWithResizeRequest) UniquePvcKey() types.UniquePvcName { + return types.UniquePvcName(pvcr.PVC.UID) +} + +func (pvcr *PvcWithResizeRequest) QualifiedName() string { + return strings.JoinQualifiedName(pvcr.PVC.Namespace, pvcr.PVC.Name) +} + +func NewVolumeResizeMap(kubeClient clientset.Interface) VolumeResizeMap { + resizeMap := &volumeResizeMap{} + resizeMap.pvcrs = make(map[types.UniquePvcName]*PvcWithResizeRequest) + resizeMap.kubeClient = kubeClient + return resizeMap +} + +func (resizeMap *volumeResizeMap) AddPvcUpdate(newPvc *v1.PersistentVolumeClaim, oldPvc *v1.PersistentVolumeClaim, spec *volume.Spec) { + newSize := newPvc.Spec.Resources.Requests[v1.ResourceStorage] + oldSize := oldPvc.Spec.Resources.Requests[v1.ResourceStorage] + glog.Infof(" Checking size of stuff new %v vs old %v", newSize, oldSize) + + if newSize.Cmp(oldSize) > 0 { + pvcRequest := &PvcWithResizeRequest{ + PVC: newPvc, + CurrentSize: newPvc.Status.Capacity[v1.ResourceStorage], + ExpectedSize: newSize, + VolumeSpec: spec, + ResizeDone: false, + } + resizeMap.pvcrs[types.UniquePvcName(newPvc.UID)] = pvcRequest + } +} + +// Return Pvcrs that require resize +func (resizeMap *volumeResizeMap) GetPvcsWithResizeRequest() []*PvcWithResizeRequest { + pvcrs := []*PvcWithResizeRequest{} + for _, pvcr := range resizeMap.pvcrs { + if !pvcr.ResizeDone { + pvcrs = append(pvcrs, pvcr) + } + } + return pvcrs +} + +func (resizeMap *volumeResizeMap) MarkAsResized(pvcr *PvcWithResizeRequest) error { + pvcUniqueName := pvcr.UniquePvcKey() + + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.ResizeDone = true + } + + // This needs to be done atomically somehow so as these operations succeed or fail together. :( + + err := resizeMap.updatePvSize(pvcr, pvcr.ExpectedSize) + + if err != nil { + glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) + return err + } + + readyCondition := v1.PvcCondition{ + Type: v1.PvcReady, + Status: v1.ConditionTrue, + } + + return resizeMap.updatePvcStatusAndSize(pvcr, pvcr.ExpectedSize, readyCondition) +} + +func (resizeMap *volumeResizeMap) MarkResizeFailed(pvcr *PvcWithResizeRequest, reason string) { + pvcUniqueName := pvcr.UniquePvcKey() + + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.ResizeDone = true + } + + // This needs to be done atomically somehow so as these operations succeed or fail together. :( + + failedCondition := v1.PvcCondition{ + Type: v1.PvcResizeFailed, + Status: v1.ConditionTrue, + Reason: reason, + } + + err := resizeMap.updateClaimStatusCondition(pvcr, failedCondition) + + if err != nil { + glog.V(4).Infof("Error updating pvc conditionfor volume %q with : %v", pvcr.QualifiedName(), err) + } +} + +func (resizeMap *volumeResizeMap) MarkForFileSystemResize(pvcr *PvcWithResizeRequest) error { + pvcUniqueName := pvcr.UniquePvcKey() + + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.ResizeDone = true + } + + err := resizeMap.updatePvSize(pvcr, pvcr.ExpectedSize) + + if err != nil { + glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) + return err + } + return nil +} + +func (resizeMap *volumeResizeMap) updateClaimStatusCondition(pvcr *PvcWithResizeRequest, pvcCondition v1.PvcCondition) error { + glog.V(4).Infof("Updating PVC %s with condition % and status %s", pvcr.QualifiedName(), pvcCondition.Type, pvcCondition.Status) + + newConditions := []v1.PvcCondition{pvcCondition} + + claimClone, err := clonePVC(pvcr.PVC) + + if err != nil { + return err + } + + claimClone.Status.Conditions = newConditions + _, updateErr := resizeMap.kubeClient.Core().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) + return updateErr + } + return nil +} + +func (resizeMap *volumeResizeMap) updatePvSize(pvcr *PvcWithResizeRequest, newSize resource.Quantity) error { + oldPv := pvcr.VolumeSpec.PersistentVolume + clone, err := scheme.Scheme.DeepCopy(oldPv) + + if err != nil { + return fmt.Errorf("Error cloning PV %q with error : %v", oldPv.Name, err) + } + pvClone, ok := clone.(*v1.PersistentVolume) + + if !ok { + return fmt.Errorf("Unexpected cast error for PV : %v", pvClone) + } + + pvClone.Spec.Capacity[v1.ResourceStorage] = newSize + _, updateErr := resizeMap.kubeClient.Core().PersistentVolumes().Update(pvClone) + + if updateErr != nil { + glog.V(4).Infof("Erro updating pv %q with error : %v", pvClone.Name, updateErr) + return updateErr + } + return nil +} + +func (resizeMap *volumeResizeMap) updatePvcStatusSize(pvcr *PvcWithResizeRequest, newSize resource.Quantity) error { + + claimClone, err := clonePVC(pvcr.PVC) + + if err != nil { + return err + } + + claimClone.Status.Capacity[v1.ResourceStorage] = newSize + _, updateErr := resizeMap.kubeClient.Core().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) + return updateErr + } + return nil +} + +func (resizeMap *volumeResizeMap) updatePvcStatusAndSize(pvcr *PvcWithResizeRequest, newSize resource.Quantity, pvcCondition v1.PvcCondition) error { + glog.V(4).Infof("Updating PVC %s with condition % and status %s", pvcr.QualifiedName(), pvcCondition.Type, pvcCondition.Status) + + newConditions := []v1.PvcCondition{pvcCondition} + claimClone, err := clonePVC(pvcr.PVC) + + if err != nil { + return err + } + claimClone.Status.Capacity[v1.ResourceStorage] = newSize + claimClone.Status.Conditions = newConditions + _, updateErr := resizeMap.kubeClient.Core().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) + return updateErr + } + return nil + +} + +func clonePVC(oldPvc *v1.PersistentVolumeClaim) (*v1.PersistentVolumeClaim, error) { + clone, err := scheme.Scheme.DeepCopy(oldPvc) + + if err != nil { + return nil, fmt.Errorf("Error cloning claim %s : %v", claimToClaimKey(oldPvc), err) + } + + claimClone, ok := clone.(*v1.PersistentVolumeClaim) + + if !ok { + return nil, fmt.Errorf("Unexpected claim cast error : %v", claimClone) + } + return claimClone, nil + +} + +func claimToClaimKey(claim *v1.PersistentVolumeClaim) string { + return fmt.Sprintf("%s/%s", claim.Namespace, claim.Name) +} diff --git a/pkg/controller/volume/expand/expand_controller.go b/pkg/controller/volume/expand/expand_controller.go new file mode 100644 index 0000000000000..21474b1121902 --- /dev/null +++ b/pkg/controller/volume/expand/expand_controller.go @@ -0,0 +1,251 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package expand + +import ( + "fmt" + "net" + "time" + + "github.com/golang/glog" + + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/runtime" + coreinformers "k8s.io/client-go/informers/core/v1" + clientset "k8s.io/client-go/kubernetes" + "k8s.io/client-go/kubernetes/scheme" + v1core "k8s.io/client-go/kubernetes/typed/core/v1" + corelisters "k8s.io/client-go/listers/core/v1" + kcache "k8s.io/client-go/tools/cache" + "k8s.io/client-go/tools/record" + "k8s.io/kubernetes/pkg/cloudprovider" + "k8s.io/kubernetes/pkg/controller" + "k8s.io/kubernetes/pkg/controller/volume/expand/cache" + "k8s.io/kubernetes/pkg/util/io" + "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/volume" + "k8s.io/kubernetes/pkg/volume/util/operationexecutor" +) + +const ( + syncLoopPeriod time.Duration = 100 * time.Millisecond +) + +// ExpandController expands the pvs +type ExpandController interface { + Run(stopCh <-chan struct{}) +} + +type expandController struct { + // kubeClient is the kube API client used by volumehost to communicate with + // the API server. + kubeClient clientset.Interface + + // pvcLister is the shared PVC lister used to fetch and store PVC + // objects from the API server. It is shared with other controllers and + // therefore the PVC objects in its store should be treated as immutable. + pvcLister corelisters.PersistentVolumeClaimLister + pvcsSynced kcache.InformerSynced + + pvLister corelisters.PersistentVolumeLister + pvSynced kcache.InformerSynced + + // cloud provider used by volume host + cloud cloudprovider.Interface + + // volumePluginMgr used to initialize and fetch volume plugins + volumePluginMgr volume.VolumePluginMgr + + // recorder is used to record events in the API server + recorder record.EventRecorder + + // Volume resize map of volumes that needs resizing + resizeMap cache.VolumeResizeMap + + // Worker goroutine to process resize requests from resizeMap + syncResize SyncVolumeResize + + // Operation executor + opExecutor operationexecutor.OperationExecutor +} + +func NewExpandController( + kubeClient clientset.Interface, + pvcInformer coreinformers.PersistentVolumeClaimInformer, + pvInformer coreinformers.PersistentVolumeInformer, + cloud cloudprovider.Interface, + plugins []volume.VolumePlugin) (ExpandController, error) { + + expc := &expandController{ + kubeClient: kubeClient, + cloud: cloud, + pvcLister: pvcInformer.Lister(), + pvcsSynced: pvcInformer.Informer().HasSynced, + pvLister: pvInformer.Lister(), + pvSynced: pvInformer.Informer().HasSynced, + } + + if err := expc.volumePluginMgr.InitPlugins(plugins, expc); err != nil { + return nil, fmt.Errorf("Could not initialize volume plugins for Expand Controller : %+v", err) + } + + eventBroadcaster := record.NewBroadcaster() + eventBroadcaster.StartLogging(glog.Infof) + eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.Core().RESTClient()).Events("")}) + recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "volume_expand"}) + + expc.opExecutor = operationexecutor.NewOperationExecutor(operationexecutor.NewOperationGenerator( + kubeClient, + &expc.volumePluginMgr, + recorder, + false)) + + expc.resizeMap = cache.NewVolumeResizeMap(expc.kubeClient) + + pvcInformer.Informer().AddEventHandler(kcache.ResourceEventHandlerFuncs{ + UpdateFunc: expc.pvcUpdate, + }) + + expc.syncResize = NewSyncVolumeResize(syncLoopPeriod, expc.opExecutor, expc.resizeMap) + + return expc, nil +} + +func (expc *expandController) Run(stopCh <-chan struct{}) { + defer runtime.HandleCrash() + glog.Infof("Starting expand controller") + defer glog.Infof("Shutting down expand controller") + + if !controller.WaitForCacheSync("expand", stopCh, expc.pvcsSynced, expc.pvSynced) { + return + } + + // Run volume sync work goroutine + expc.syncResize.Run(stopCh) + + <-stopCh +} + +func (expc *expandController) pvcUpdate(oldObj, newObj interface{}) { + oldPvc, ok := oldObj.(*v1.PersistentVolumeClaim) + + if oldPvc == nil || !ok { + return + } + + newPvc, ok := newObj.(*v1.PersistentVolumeClaim) + + if newPvc == nil || !ok { + return + } + volumeSpec, err := CreateVolumeSpec(newPvc, expc.pvcLister, expc.pvLister) + if err != nil { + glog.Errorf("Error creating volume spec during update event : %v", err) + return + } + expc.resizeMap.AddPvcUpdate(newPvc, oldPvc, volumeSpec) +} + +func CreateVolumeSpec( + pvc *v1.PersistentVolumeClaim, + pvcLister corelisters.PersistentVolumeClaimLister, + pvLister corelisters.PersistentVolumeLister) (*volume.Spec, error) { + + volumeName := pvc.Spec.VolumeName + pv, err := pvLister.Get(volumeName) + + if err != nil { + return nil, fmt.Errorf("failed to find PV %q in PV informer cache : %v", volumeName, err) + } + + clonedPvObject, err := scheme.Scheme.DeepCopy(pv) + if err != nil || clonedPvObject == nil { + return nil, fmt.Errorf("failed to deep copy %q PV object. err=%v", volumeName, err) + } + + clonedPV, ok := clonedPvObject.(*v1.PersistentVolume) + if !ok { + return nil, fmt.Errorf("failed to cast %q clonedPV %#v to PersistentVolume", volumeName, pv) + } + return volume.NewSpecFromPersistentVolume(clonedPV, false), nil +} + +// Impelementing VolumeHost interface +func (expc *expandController) GetPluginDir(pluginName string) string { + return "" +} + +func (expc *expandController) GetPodVolumeDir(podUID types.UID, pluginName string, volumeName string) string { + return "" +} + +func (expc *expandController) GetPodPluginDir(podUID types.UID, pluginName string) string { + return "" +} + +func (expc *expandController) GetKubeClient() clientset.Interface { + return expc.kubeClient +} + +func (expc *expandController) NewWrapperMounter(volName string, spec volume.Spec, pod *v1.Pod, opts volume.VolumeOptions) (volume.Mounter, error) { + return nil, fmt.Errorf("NewWrapperMounter not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) NewWrapperUnmounter(volName string, spec volume.Spec, podUID types.UID) (volume.Unmounter, error) { + return nil, fmt.Errorf("NewWrapperUnmounter not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) GetCloudProvider() cloudprovider.Interface { + return expc.cloud +} + +func (expc *expandController) GetMounter() mount.Interface { + return nil +} + +func (expc *expandController) GetWriter() io.Writer { + return nil +} + +func (expc *expandController) GetHostName() string { + return "" +} + +func (expc *expandController) GetHostIP() (net.IP, error) { + return nil, fmt.Errorf("GetHostIP() not supported by expand controller's VolumeHost implementation") +} + +func (expc *expandController) GetNodeAllocatable() (v1.ResourceList, error) { + return v1.ResourceList{}, nil +} + +func (expc *expandController) GetSecretFunc() func(namespace, name string) (*v1.Secret, error) { + return func(_, _ string) (*v1.Secret, error) { + return nil, fmt.Errorf("GetSecret unsupported in expandController") + } +} + +func (expc *expandController) GetConfigMapFunc() func(namespace, name string) (*v1.ConfigMap, error) { + return func(_, _ string) (*v1.ConfigMap, error) { + return nil, fmt.Errorf("GetConfigMap unsupported in expandController") + } +} + +func (expc *expandController) GetNodeLabels() (map[string]string, error) { + return nil, fmt.Errorf("GetNodeLabels() unsupported in expandController") +} diff --git a/pkg/controller/volume/expand/sync_volume_resize.go b/pkg/controller/volume/expand/sync_volume_resize.go new file mode 100644 index 0000000000000..43476ab009d23 --- /dev/null +++ b/pkg/controller/volume/expand/sync_volume_resize.go @@ -0,0 +1,70 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package expand + +import ( + "time" + + "github.com/golang/glog" + "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/kubernetes/pkg/controller/volume/expand/cache" + "k8s.io/kubernetes/pkg/volume/util/operationexecutor" +) + +type SyncVolumeResize interface { + Run(stopCh <-chan struct{}) +} + +type syncResize struct { + loopPeriod time.Duration + resizeMap cache.VolumeResizeMap + opsExecutor operationexecutor.OperationExecutor +} + +// NewSyncVolumeResize returns actual volume resize handler +func NewSyncVolumeResize( + loopPeriod time.Duration, + opsExecutor operationexecutor.OperationExecutor, + resizeMap cache.VolumeResizeMap) SyncVolumeResize { + rc := &syncResize{ + loopPeriod: loopPeriod, + opsExecutor: opsExecutor, + resizeMap: resizeMap, + } + return rc +} + +func (rc *syncResize) Run(stopCh <-chan struct{}) { + wait.Until(rc.Sync, rc.loopPeriod, stopCh) +} + +func (rc *syncResize) Sync() { + // Resize PVCs that require resize + for _, pvcWithResizeRequest := range rc.resizeMap.GetPvcsWithResizeRequest() { + uniqueVolumeKey := v1.UniqueVolumeName(pvcWithResizeRequest.UniquePvcKey()) + if rc.opsExecutor.IsOperationPending(uniqueVolumeKey, "") { + glog.V(10).Infof("Operation for PVC %v is already pending", pvcWithResizeRequest.UniquePvcKey()) + continue + } + growFuncError := rc.opsExecutor.GrowPvc(pvcWithResizeRequest, rc.resizeMap) + if growFuncError != nil { + glog.Errorf("Error growing pvc with %v", growFuncError) + } + glog.Infof("Resizing PVC %s", pvcWithResizeRequest.CurrentSize) + } +} diff --git a/pkg/kubelet/events/event.go b/pkg/kubelet/events/event.go index 28cddf4a901c3..25f6ebd7c85ab 100644 --- a/pkg/kubelet/events/event.go +++ b/pkg/kubelet/events/event.go @@ -45,6 +45,7 @@ const ( FailedAttachVolume = "FailedAttachVolume" FailedDetachVolume = "FailedDetachVolume" FailedMountVolume = "FailedMount" + VolumeResizeFailed = "VolumeResizeFailed" FailedUnMountVolume = "FailedUnMount" SuccessfulDetachVolume = "SuccessfulDetachVolume" SuccessfulMountVolume = "SuccessfulMountVolume" diff --git a/pkg/volume/util/operationexecutor/operation_executor.go b/pkg/volume/util/operationexecutor/operation_executor.go index 02d7ab2c6aebb..560577638649c 100644 --- a/pkg/volume/util/operationexecutor/operation_executor.go +++ b/pkg/volume/util/operationexecutor/operation_executor.go @@ -29,6 +29,7 @@ import ( "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util/nestedpendingoperations" @@ -118,6 +119,8 @@ type OperationExecutor interface { // IsOperationPending returns true if an operation for the given volumeName and podName is pending, // otherwise it returns false IsOperationPending(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) bool + // Grow PVC will grow size available to PVC + GrowPvc(*expandcache.PvcWithResizeRequest, expandcache.VolumeResizeMap) error } // NewOperationExecutor returns a new instance of OperationExecutor. @@ -707,6 +710,16 @@ func (oe *operationExecutor) UnmountDevice( deviceToDetach.VolumeName, "" /* podName */, unmountDeviceFunc) } +func (oe *operationExecutor) GrowPvc(pvcWithResizeRequest *expandcache.PvcWithResizeRequest, resizeMap expandcache.VolumeResizeMap) error { + expandFunc, err := oe.operationGenerator.GenerateExpandVolumeFunc(pvcWithResizeRequest, resizeMap) + + if err != nil { + return err + } + uniqueVolumeKey := v1.UniqueVolumeName(pvcWithResizeRequest.UniquePvcKey()) + return oe.pendingOperations.Run(uniqueVolumeKey, "", expandFunc) +} + func (oe *operationExecutor) VerifyControllerAttachedVolume( volumeToMount VolumeToMount, nodeName types.NodeName, diff --git a/pkg/volume/util/operationexecutor/operation_executor_test.go b/pkg/volume/util/operationexecutor/operation_executor_test.go index 700b82b79db91..2c59a265fad61 100644 --- a/pkg/volume/util/operationexecutor/operation_executor_test.go +++ b/pkg/volume/util/operationexecutor/operation_executor_test.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/util/mount" "k8s.io/kubernetes/pkg/volume" volumetypes "k8s.io/kubernetes/pkg/volume/util/types" @@ -282,6 +283,14 @@ func (fopg *fakeOperationGenerator) GenerateVerifyControllerAttachedVolumeFunc(v }, nil } +func (fopg *fakeOperationGenerator) GenerateExpandVolumeFunc(pvcWithResizeRequest *expandcache.PvcWithResizeRequest, + resizeMap expandcache.VolumeResizeMap) (func() error, error) { + return func() error { + startOperationAndBlock(fopg.ch, fopg.quit) + return nil + }, nil +} + func (fopg *fakeOperationGenerator) GenerateBulkVolumeVerifyFunc( pluginNodeVolumes map[types.NodeName][]*volume.Spec, pluginNane string, diff --git a/pkg/volume/util/operationexecutor/operation_generator.go b/pkg/volume/util/operationexecutor/operation_generator.go index cceabde48cff4..d5a1be795d886 100644 --- a/pkg/volume/util/operationexecutor/operation_generator.go +++ b/pkg/volume/util/operationexecutor/operation_generator.go @@ -28,6 +28,7 @@ import ( utilfeature "k8s.io/apiserver/pkg/util/feature" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" + expandcache "k8s.io/kubernetes/pkg/controller/volume/expand/cache" "k8s.io/kubernetes/pkg/features" kevents "k8s.io/kubernetes/pkg/kubelet/events" "k8s.io/kubernetes/pkg/util/mount" @@ -100,6 +101,8 @@ type OperationGenerator interface { map[types.NodeName][]*volume.Spec, string, map[*volume.Spec]v1.UniqueVolumeName, ActualStateOfWorldAttacherUpdater) (func() error, error) + + GenerateExpandVolumeFunc(*expandcache.PvcWithResizeRequest, expandcache.VolumeResizeMap) (func() error, error) } func (og *operationGenerator) GenerateVolumesAreAttachedFunc( @@ -715,6 +718,58 @@ func (og *operationGenerator) verifyVolumeIsSafeToDetach( return nil } +func (og *operationGenerator) GenerateExpandVolumeFunc( + pvcWithResizeRequest *expandcache.PvcWithResizeRequest, + resizeMap expandcache.VolumeResizeMap) (func() error, error) { + + volumePlugin, err := og.volumePluginMgr.FindExpandablePluginBySpec(pvcWithResizeRequest.VolumeSpec) + + if err != nil { + return nil, fmt.Errorf("Error finding plugin for expanding volume: %q with error %v", pvcWithResizeRequest.QualifiedName(), err) + } + + expanderPlugin, err := volumePlugin.NewExpander() + + if err != nil { + return nil, fmt.Errorf("Error creating expander plugin for volume %q with error %v", pvcWithResizeRequest.QualifiedName(), err) + } + + expandFunc := func() error { + expandErr := expanderPlugin.ExpandVolumeDevice(pvcWithResizeRequest.VolumeSpec, pvcWithResizeRequest.ExpectedSize, pvcWithResizeRequest.CurrentSize) + + if expandErr != nil { + glog.Errorf("Error expanding volume through cloudprovider for volume %q : %v", pvcWithResizeRequest.QualifiedName(), expandErr) + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, expandErr.Error()) + resizeMap.MarkResizeFailed(pvcWithResizeRequest, expandErr.Error()) + return expandErr + } + + // CloudProvider resize succeded - lets mark api objects as resized + if expanderPlugin.RequiresFSResize() { + glog.V(4).Infof("Controller resizing done for PVC %s, requesting file system resize", pvcWithResizeRequest.QualifiedName()) + err := resizeMap.MarkForFileSystemResize(pvcWithResizeRequest) + + if err != nil { + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, err.Error()) + glog.Errorf("Error requesting file system resize for %s with : %v", pvcWithResizeRequest.QualifiedName(), err) + return err + } + } else { + glog.V(4).Infof("Controller resizing done for PVC %s", pvcWithResizeRequest.QualifiedName()) + err := resizeMap.MarkAsResized(pvcWithResizeRequest) + + if err != nil { + glog.Errorf("Error marking pvc %s as resized : %v", pvcWithResizeRequest.QualifiedName(), err) + og.recorder.Eventf(pvcWithResizeRequest.PVC, v1.EventTypeWarning, kevents.VolumeResizeFailed, err.Error()) + return err + } + } + return nil + + } + return expandFunc, nil +} + func checkMountOptionSupport(og *operationGenerator, volumeToMount VolumeToMount, plugin volume.VolumePlugin) error { mountOptions := volume.MountOptionFromSpec(volumeToMount.VolumeSpec) diff --git a/pkg/volume/util/types/types.go b/pkg/volume/util/types/types.go index 90bbdc4e21fec..85dc16735a2df 100644 --- a/pkg/volume/util/types/types.go +++ b/pkg/volume/util/types/types.go @@ -21,3 +21,6 @@ import "k8s.io/apimachinery/pkg/types" // UniquePodName defines the type to key pods off of type UniquePodName types.UID + +// UniquePvcName defines the type to key pvc off +type UniquePvcName types.UID diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 0d402bf194e61..26729ed976c6d 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -22,11 +22,12 @@ import ( "os" "path" - "github.com/golang/glog" "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" + + "github.com/golang/glog" "k8s.io/apimachinery/pkg/runtime" clientset "k8s.io/client-go/kubernetes" "k8s.io/kubernetes/pkg/api" diff --git a/pkg/volume/volume.go b/pkg/volume/volume.go index 1dfe7ed9dc199..b4338c32d4a87 100644 --- a/pkg/volume/volume.go +++ b/pkg/volume/volume.go @@ -194,8 +194,9 @@ type BulkVolumeVerifier interface { } type Expander interface { - // ExpandVolume expands the volume + // ExpandVolume expands the volume device via cloudprovider api call ExpandVolumeDevice(spec *Spec, newSize resource.Quantity, oldSize resource.Quantity) error + // Check if volume type also requires File system resize RequiresFSResize() bool } From b8d0c1567baa642849fa0424229067818b37049c Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Mon, 21 Aug 2017 13:44:18 -0400 Subject: [PATCH 09/14] Add lock to map; deal with API update failures by retrying if 'UpdateNeeded' --- hack/.golint_failures | 1 + .../volume/expand/cache/volume_resize_map.go | 130 +++++++++++++----- .../volume/expand/expand_controller.go | 4 +- .../volume/expand/sync_volume_resize.go | 12 ++ 4 files changed, 112 insertions(+), 35 deletions(-) diff --git a/hack/.golint_failures b/hack/.golint_failures index 6b3980597cbaf..6a7ebdb5286e6 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -199,6 +199,7 @@ pkg/controller/volume/attachdetach pkg/controller/volume/attachdetach/statusupdater pkg/controller/volume/attachdetach/testing pkg/controller/volume/events +pkg/controller/volume/expand pkg/controller/volume/persistentvolume pkg/controller/volume/persistentvolume/options pkg/credentialprovider diff --git a/pkg/controller/volume/expand/cache/volume_resize_map.go b/pkg/controller/volume/expand/cache/volume_resize_map.go index c785b874499fe..fd02ebd2eeb02 100644 --- a/pkg/controller/volume/expand/cache/volume_resize_map.go +++ b/pkg/controller/volume/expand/cache/volume_resize_map.go @@ -18,6 +18,7 @@ package cache import ( "fmt" + "sync" "github.com/golang/glog" "k8s.io/api/core/v1" @@ -32,15 +33,17 @@ import ( type VolumeResizeMap interface { AddPvcUpdate(newPvc *v1.PersistentVolumeClaim, oldPvc *v1.PersistentVolumeClaim, spec *volume.Spec) GetPvcsWithResizeRequest() []*PvcWithResizeRequest + GetPvcsWithUpdateNeeded() []*PvcWithResizeRequest // Mark this volume as resize MarkAsResized(*PvcWithResizeRequest) error MarkForFileSystemResize(*PvcWithResizeRequest) error - MarkResizeFailed(*PvcWithResizeRequest, string) + MarkResizeFailed(*PvcWithResizeRequest, string) error } type volumeResizeMap struct { pvcrs map[types.UniquePvcName]*PvcWithResizeRequest kubeClient clientset.Interface + sync.RWMutex } type PvcWithResizeRequest struct { @@ -49,8 +52,18 @@ type PvcWithResizeRequest struct { CurrentSize resource.Quantity ExpectedSize resource.Quantity ResizeDone bool + UpdateNeeded *updateNeeded + FailedReason *string } +type updateNeeded string + +const ( + Resized updateNeeded = "resized" + ResizeFailed updateNeeded = "resizeFailed" + FsResize updateNeeded = "fsResize" +) + func (pvcr *PvcWithResizeRequest) UniquePvcKey() types.UniquePvcName { return types.UniquePvcName(pvcr.PVC.UID) } @@ -67,6 +80,9 @@ func NewVolumeResizeMap(kubeClient clientset.Interface) VolumeResizeMap { } func (resizeMap *volumeResizeMap) AddPvcUpdate(newPvc *v1.PersistentVolumeClaim, oldPvc *v1.PersistentVolumeClaim, spec *volume.Spec) { + resizeMap.Lock() + defer resizeMap.Unlock() + newSize := newPvc.Spec.Resources.Requests[v1.ResourceStorage] oldSize := oldPvc.Spec.Resources.Requests[v1.ResourceStorage] glog.Infof(" Checking size of stuff new %v vs old %v", newSize, oldSize) @@ -85,6 +101,9 @@ func (resizeMap *volumeResizeMap) AddPvcUpdate(newPvc *v1.PersistentVolumeClaim, // Return Pvcrs that require resize func (resizeMap *volumeResizeMap) GetPvcsWithResizeRequest() []*PvcWithResizeRequest { + resizeMap.Lock() + defer resizeMap.Unlock() + pvcrs := []*PvcWithResizeRequest{} for _, pvcr := range resizeMap.pvcrs { if !pvcr.ResizeDone { @@ -94,17 +113,37 @@ func (resizeMap *volumeResizeMap) GetPvcsWithResizeRequest() []*PvcWithResizeReq return pvcrs } +// Return Pvcrs that require update of their API objects +func (resizeMap *volumeResizeMap) GetPvcsWithUpdateNeeded() []*PvcWithResizeRequest { + resizeMap.Lock() + defer resizeMap.Unlock() + + pvcrs := []*PvcWithResizeRequest{} + for _, pvcr := range resizeMap.pvcrs { + // TODO: when to delete pvcr from resizeMap + if pvcr.ResizeDone && pvcr.UpdateNeeded != nil { + pvcrs = append(pvcrs, pvcr) + } + } + return pvcrs +} + func (resizeMap *volumeResizeMap) MarkAsResized(pvcr *PvcWithResizeRequest) error { + resizeMap.Lock() + defer resizeMap.Unlock() + pvcUniqueName := pvcr.UniquePvcKey() if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { pvcr.ResizeDone = true + update := Resized + pvcr.UpdateNeeded = &update } // This needs to be done atomically somehow so as these operations succeed or fail together. :( + // If any part of this update fails, sync should GetPvcsWithUpdateNeeded and update each err := resizeMap.updatePvSize(pvcr, pvcr.ExpectedSize) - if err != nil { glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) return err @@ -115,17 +154,33 @@ func (resizeMap *volumeResizeMap) MarkAsResized(pvcr *PvcWithResizeRequest) erro Status: v1.ConditionTrue, } - return resizeMap.updatePvcStatusAndSize(pvcr, pvcr.ExpectedSize, readyCondition) + err = resizeMap.updatePvcCapacityAndConditions(pvcr, pvcr.ExpectedSize, readyCondition) + if err != nil { + glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) + return err + } + + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.UpdateNeeded = nil + } + return nil } -func (resizeMap *volumeResizeMap) MarkResizeFailed(pvcr *PvcWithResizeRequest, reason string) { +func (resizeMap *volumeResizeMap) MarkResizeFailed(pvcr *PvcWithResizeRequest, reason string) error { + resizeMap.Lock() + defer resizeMap.Unlock() + pvcUniqueName := pvcr.UniquePvcKey() if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { pvcr.ResizeDone = true + update := ResizeFailed + pvcr.UpdateNeeded = &update + pvcr.FailedReason = &reason } // This needs to be done atomically somehow so as these operations succeed or fail together. :( + // If any part of this update fails, sync should GetPvcsWithUpdateNeeded and update each failedCondition := v1.PvcCondition{ Type: v1.PvcResizeFailed, @@ -133,45 +188,38 @@ func (resizeMap *volumeResizeMap) MarkResizeFailed(pvcr *PvcWithResizeRequest, r Reason: reason, } - err := resizeMap.updateClaimStatusCondition(pvcr, failedCondition) - + err := resizeMap.updatePvcCondition(pvcr, failedCondition) if err != nil { - glog.V(4).Infof("Error updating pvc conditionfor volume %q with : %v", pvcr.QualifiedName(), err) + glog.V(4).Infof("Error updating pvc condition for volume %q with : %v", pvcr.QualifiedName(), err) + return err } + + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.UpdateNeeded = nil + } + return nil } func (resizeMap *volumeResizeMap) MarkForFileSystemResize(pvcr *PvcWithResizeRequest) error { + resizeMap.Lock() + defer resizeMap.Unlock() + pvcUniqueName := pvcr.UniquePvcKey() if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { pvcr.ResizeDone = true + update := FsResize + pvcr.UpdateNeeded = &update } err := resizeMap.updatePvSize(pvcr, pvcr.ExpectedSize) - if err != nil { glog.V(4).Infof("Error updating PV spec capacity for volume %q with : %v", pvcr.QualifiedName(), err) return err } - return nil -} - -func (resizeMap *volumeResizeMap) updateClaimStatusCondition(pvcr *PvcWithResizeRequest, pvcCondition v1.PvcCondition) error { - glog.V(4).Infof("Updating PVC %s with condition % and status %s", pvcr.QualifiedName(), pvcCondition.Type, pvcCondition.Status) - - newConditions := []v1.PvcCondition{pvcCondition} - - claimClone, err := clonePVC(pvcr.PVC) - - if err != nil { - return err - } - claimClone.Status.Conditions = newConditions - _, updateErr := resizeMap.kubeClient.Core().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) - if updateErr != nil { - glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) - return updateErr + if pvcr, ok := resizeMap.pvcrs[pvcUniqueName]; ok { + pvcr.UpdateNeeded = nil } return nil } @@ -190,7 +238,7 @@ func (resizeMap *volumeResizeMap) updatePvSize(pvcr *PvcWithResizeRequest, newSi } pvClone.Spec.Capacity[v1.ResourceStorage] = newSize - _, updateErr := resizeMap.kubeClient.Core().PersistentVolumes().Update(pvClone) + _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumes().Update(pvClone) if updateErr != nil { glog.V(4).Infof("Erro updating pv %q with error : %v", pvClone.Name, updateErr) @@ -199,10 +247,8 @@ func (resizeMap *volumeResizeMap) updatePvSize(pvcr *PvcWithResizeRequest, newSi return nil } -func (resizeMap *volumeResizeMap) updatePvcStatusSize(pvcr *PvcWithResizeRequest, newSize resource.Quantity) error { - +func (resizeMap *volumeResizeMap) updatePvcCapacity(pvcr *PvcWithResizeRequest, newSize resource.Quantity) error { claimClone, err := clonePVC(pvcr.PVC) - if err != nil { return err } @@ -216,24 +262,42 @@ func (resizeMap *volumeResizeMap) updatePvcStatusSize(pvcr *PvcWithResizeRequest return nil } -func (resizeMap *volumeResizeMap) updatePvcStatusAndSize(pvcr *PvcWithResizeRequest, newSize resource.Quantity, pvcCondition v1.PvcCondition) error { +func (resizeMap *volumeResizeMap) updatePvcCondition(pvcr *PvcWithResizeRequest, pvcCondition v1.PvcCondition) error { glog.V(4).Infof("Updating PVC %s with condition % and status %s", pvcr.QualifiedName(), pvcCondition.Type, pvcCondition.Status) newConditions := []v1.PvcCondition{pvcCondition} + claimClone, err := clonePVC(pvcr.PVC) + if err != nil { + return err + } + + claimClone.Status.Conditions = newConditions + _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + if updateErr != nil { + glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) + return updateErr + } + return nil +} +func (resizeMap *volumeResizeMap) updatePvcCapacityAndConditions(pvcr *PvcWithResizeRequest, newSize resource.Quantity, pvcCondition v1.PvcCondition) error { + glog.V(4).Infof("Updating PVC %s with condition % and status %s", pvcr.QualifiedName(), pvcCondition.Type, pvcCondition.Status) + + newConditions := []v1.PvcCondition{pvcCondition} + claimClone, err := clonePVC(pvcr.PVC) if err != nil { return err } + claimClone.Status.Capacity[v1.ResourceStorage] = newSize claimClone.Status.Conditions = newConditions - _, updateErr := resizeMap.kubeClient.Core().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) + _, updateErr := resizeMap.kubeClient.CoreV1().PersistentVolumeClaims(claimClone.Namespace).UpdateStatus(claimClone) if updateErr != nil { glog.V(4).Infof("updating PersistentVolumeClaim[%s] status: failed: %v", pvcr.QualifiedName(), updateErr) return updateErr } return nil - } func clonePVC(oldPvc *v1.PersistentVolumeClaim) (*v1.PersistentVolumeClaim, error) { diff --git a/pkg/controller/volume/expand/expand_controller.go b/pkg/controller/volume/expand/expand_controller.go index 21474b1121902..cd028d9b31d3c 100644 --- a/pkg/controller/volume/expand/expand_controller.go +++ b/pkg/controller/volume/expand/expand_controller.go @@ -106,7 +106,7 @@ func NewExpandController( eventBroadcaster := record.NewBroadcaster() eventBroadcaster.StartLogging(glog.Infof) - eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.Core().RESTClient()).Events("")}) + eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: v1core.New(kubeClient.CoreV1().RESTClient()).Events("")}) recorder := eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "volume_expand"}) expc.opExecutor = operationexecutor.NewOperationExecutor(operationexecutor.NewOperationGenerator( @@ -185,7 +185,7 @@ func CreateVolumeSpec( return volume.NewSpecFromPersistentVolume(clonedPV, false), nil } -// Impelementing VolumeHost interface +// Implementing VolumeHost interface func (expc *expandController) GetPluginDir(pluginName string) string { return "" } diff --git a/pkg/controller/volume/expand/sync_volume_resize.go b/pkg/controller/volume/expand/sync_volume_resize.go index 43476ab009d23..caadd2f487f37 100644 --- a/pkg/controller/volume/expand/sync_volume_resize.go +++ b/pkg/controller/volume/expand/sync_volume_resize.go @@ -67,4 +67,16 @@ func (rc *syncResize) Sync() { } glog.Infof("Resizing PVC %s", pvcWithResizeRequest.CurrentSize) } + + // For PVCs whose API objects updates failed the first time, try again + for _, pvcWithUpdateNeeded := range rc.resizeMap.GetPvcsWithUpdateNeeded() { + switch *pvcWithUpdateNeeded.UpdateNeeded { + case cache.Resized: + rc.resizeMap.MarkAsResized(pvcWithUpdateNeeded) + case cache.ResizeFailed: + rc.resizeMap.MarkResizeFailed(pvcWithUpdateNeeded, *pvcWithUpdateNeeded.FailedReason) + case cache.FsResize: + rc.resizeMap.MarkForFileSystemResize(pvcWithUpdateNeeded) + } + } } From 4ffb496a6dab1d3f4e6723589d0ef1e3b4e45801 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Mon, 21 Aug 2017 15:46:20 -0400 Subject: [PATCH 10/14] Add GCE PD Expander --- pkg/cloudprovider/providers/gce/gce.go | 12 +++++++ pkg/cloudprovider/providers/gce/gce_disks.go | 23 +++++++++++++ pkg/volume/gce_pd/gce_pd.go | 36 ++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/pkg/cloudprovider/providers/gce/gce.go b/pkg/cloudprovider/providers/gce/gce.go index 1252fe72912c7..86d56e360a8ae 100644 --- a/pkg/cloudprovider/providers/gce/gce.go +++ b/pkg/cloudprovider/providers/gce/gce.go @@ -125,6 +125,9 @@ type ServiceManager interface { // Deletes the persistent disk from GCE with the given diskName. DeleteDisk(project string, zone string, disk string) (*compute.Operation, error) + // Resizes the persistent disk on GCE with the given diskName. + ResizeDisk(project string, zone string, disk string, disksResizeRequest *compute.DisksResizeRequest) (*compute.Operation, error) + // Waits until GCE reports the given operation in the given zone as done. WaitForZoneOp(op *compute.Operation, zone string, mc *metricContext) error } @@ -555,6 +558,15 @@ func (manager *GCEServiceManager) DeleteDisk( return manager.gce.service.Disks.Delete(project, zone, diskName).Do() } +func (manager *GCEServiceManager) ResizeDisk( + project string, + zone string, + diskName string, + disksResizeRequest *compute.DisksResizeRequest) (*compute.Operation, error) { + + return manager.gce.service.Disks.Resize(project, zone, diskName, disksResizeRequest).Do() +} + func (manager *GCEServiceManager) WaitForZoneOp(op *compute.Operation, zone string, mc *metricContext) error { return manager.gce.waitForZoneOp(op, zone, mc) } diff --git a/pkg/cloudprovider/providers/gce/gce_disks.go b/pkg/cloudprovider/providers/gce/gce_disks.go index c916989b5ee2e..4233f98f026e4 100644 --- a/pkg/cloudprovider/providers/gce/gce_disks.go +++ b/pkg/cloudprovider/providers/gce/gce_disks.go @@ -67,6 +67,9 @@ type Disks interface { // DeleteDisk deletes PD. DeleteDisk(diskToDelete string) error + // ResizeDisk resizes PD. + ResizeDisk(diskToResize string, sizeGb int64) error + // GetAutoLabelsForPD returns labels to apply to PersistentVolume // representing this PD, namely failure domain and zone. // zone can be provided to specify the zone for the PD, @@ -276,6 +279,26 @@ func (gce *GCECloud) DeleteDisk(diskToDelete string) error { return err } +func (gce *GCECloud) ResizeDisk(diskToResize string, sizeGb int64) error { + disk, err := gce.GetDiskByNameUnknownZone(diskToResize) + if err != nil { + return err + } + + diskResizeRequest := &compute.DisksResizeRequest{ + SizeGb: sizeGb, + } + + mc := newDiskMetricContext("resize", disk.Zone) + + resizeOp, err := gce.manager.ResizeDisk(gce.projectID, disk.Zone, disk.Name, diskResizeRequest) + if err != nil { + return mc.Observe(err) + } + + return gce.manager.WaitForZoneOp(resizeOp, disk.Zone, mc) +} + // Builds the labels that should be automatically added to a PersistentVolume backed by a GCE PD // Specifically, this builds FailureDomain (zone) and Region labels. // The PersistentVolumeLabel admission controller calls this and adds the labels when a PV is created. diff --git a/pkg/volume/gce_pd/gce_pd.go b/pkg/volume/gce_pd/gce_pd.go index b59835b387729..f6243206b9176 100644 --- a/pkg/volume/gce_pd/gce_pd.go +++ b/pkg/volume/gce_pd/gce_pd.go @@ -47,6 +47,7 @@ var _ volume.VolumePlugin = &gcePersistentDiskPlugin{} var _ volume.PersistentVolumePlugin = &gcePersistentDiskPlugin{} var _ volume.DeletableVolumePlugin = &gcePersistentDiskPlugin{} var _ volume.ProvisionableVolumePlugin = &gcePersistentDiskPlugin{} +var _ volume.ExpandableVolumePlugin = &gcePersistentDiskPlugin{} const ( gcePersistentDiskPluginName = "kubernetes.io/gce-pd" @@ -190,6 +191,19 @@ func (plugin *gcePersistentDiskPlugin) newProvisionerInternal(options volume.Vol }, nil } +func (plugin *gcePersistentDiskPlugin) NewExpander() (volume.Expander, error) { + return plugin.newExpanderInternal(&GCEDiskUtil{}) +} + +func (plugin *gcePersistentDiskPlugin) newExpanderInternal(manager pdManager) (volume.Expander, error) { + return &gcePersistentDiskExpander{ + gcePersistentDisk: &gcePersistentDisk{ + manager: manager, + plugin: plugin, + }, + }, nil +} + func (plugin *gcePersistentDiskPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { mounter := plugin.host.GetMounter() pluginDir := plugin.host.GetPluginDir(plugin.GetPluginName()) @@ -427,3 +441,25 @@ func (c *gcePersistentDiskProvisioner) Provision() (*v1.PersistentVolume, error) return pv, nil } + +type gcePersistentDiskExpander struct { + *gcePersistentDisk +} + +var _ volume.Expander = &gcePersistentDiskExpander{} + +func (e *gcePersistentDiskExpander) ExpandVolumeDevice(spec *volume.Spec, newSize resource.Quantity, oldSize resource.Quantity) error { + cloud, err := getCloudProvider(e.gcePersistentDisk.plugin.host.GetCloudProvider()) + if err != nil { + return err + } + requestBytes := newSize.Value() + // GCE works with gigabytes, convert to GiB with rounding up + requestGB := volume.RoundUpSize(requestBytes, 1024*1024*1024) + + return cloud.ResizeDisk(e.pdName, requestGB) +} + +func (e *gcePersistentDiskExpander) RequiresFSResize() bool { + return true +} From f2f8546e08dfe9271b9d002236e4f0f75e182d27 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Mon, 21 Aug 2017 17:05:29 -0400 Subject: [PATCH 11/14] Add PVC field to VolumeToMount for filesystem resize --- .../cache/desired_state_of_world.go | 10 ++++++- .../cache/desired_state_of_world_test.go | 12 ++++---- .../desired_state_of_world_populator.go | 28 +++++++++---------- .../volumemanager/reconciler/reconciler.go | 1 + .../reconciler/reconciler_test.go | 8 +++--- .../operationexecutor/operation_executor.go | 5 ++++ .../operationexecutor/operation_generator.go | 8 ++++++ 7 files changed, 47 insertions(+), 25 deletions(-) diff --git a/pkg/kubelet/volumemanager/cache/desired_state_of_world.go b/pkg/kubelet/volumemanager/cache/desired_state_of_world.go index e26131335c547..06c7fdbe6d7c3 100644 --- a/pkg/kubelet/volumemanager/cache/desired_state_of_world.go +++ b/pkg/kubelet/volumemanager/cache/desired_state_of_world.go @@ -51,7 +51,7 @@ type DesiredStateOfWorld interface { // added. // If a pod with the same unique name already exists under the specified // volume, this is a no-op. - AddPodToVolume(podName types.UniquePodName, pod *v1.Pod, volumeSpec *volume.Spec, outerVolumeSpecName string, volumeGidValue string) (v1.UniqueVolumeName, error) + AddPodToVolume(podName types.UniquePodName, pod *v1.Pod, volumeSpec *volume.Spec, pvc *v1.PersistentVolumeClaim, outerVolumeSpecName string, volumeGidValue string) (v1.UniqueVolumeName, error) // MarkVolumesReportedInUse sets the ReportedInUse value to true for the // reportedVolumes. For volumes not in the reportedVolumes list, the @@ -166,6 +166,11 @@ type podToMount struct { // PVC volumes it is from the dereferenced PV object. spec *volume.Spec + // PVC the pod uses to reference the volume. nil for non-PVC volumes. Used + // as the mechanism for filesystem resize: if pvc.status.capacity is less + // than pv.spec.capacity, mount procedure will entail filesystem resize. + pvc *v1.PersistentVolumeClaim + // outerVolumeSpecName is the volume.Spec.Name() of the volume as referenced // directly in the pod. If the volume was referenced through a persistent // volume claim, this contains the volume.Spec.Name() of the persistent @@ -177,6 +182,7 @@ func (dsw *desiredStateOfWorld) AddPodToVolume( podName types.UniquePodName, pod *v1.Pod, volumeSpec *volume.Spec, + pvc *v1.PersistentVolumeClaim, outerVolumeSpecName string, volumeGidValue string) (v1.UniqueVolumeName, error) { dsw.Lock() @@ -232,6 +238,7 @@ func (dsw *desiredStateOfWorld) AddPodToVolume( podName: podName, pod: pod, spec: volumeSpec, + pvc: pvc, outerVolumeSpecName: outerVolumeSpecName, } @@ -333,6 +340,7 @@ func (dsw *desiredStateOfWorld) GetVolumesToMount() []VolumeToMount { PodName: podName, Pod: podObj.pod, VolumeSpec: podObj.spec, + PVC: podObj.pvc, PluginIsAttachable: volumeObj.pluginIsAttachable, OuterVolumeSpecName: podObj.outerVolumeSpecName, VolumeGidValue: volumeObj.volumeGidValue, diff --git a/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go b/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go index 506f7f9ad313a..5a2a6fd9b4947 100644 --- a/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go +++ b/pkg/kubelet/volumemanager/cache/desired_state_of_world_test.go @@ -58,7 +58,7 @@ func Test_AddPodToVolume_Positive_NewPodNewVolume(t *testing.T) { // Act generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) // Assert if err != nil { @@ -102,7 +102,7 @@ func Test_AddPodToVolume_Positive_ExistingPodExistingVolume(t *testing.T) { // Act generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) // Assert if err != nil { @@ -144,7 +144,7 @@ func Test_DeletePodFromVolume_Positive_PodExistsVolumeExists(t *testing.T) { volumeSpec := &volume.Spec{Volume: &pod.Spec.Volumes[0]} podName := volumehelper.GetUniquePodName(pod) generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) if err != nil { t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) } @@ -241,19 +241,19 @@ func Test_MarkVolumesReportedInUse_Positive_NewPodNewVolume(t *testing.T) { pod3Name := volumehelper.GetUniquePodName(pod3) generatedVolume1Name, err := dsw.AddPodToVolume( - pod1Name, pod1, volume1Spec, volume1Spec.Name(), "" /* volumeGidValue */) + pod1Name, pod1, volume1Spec, nil, volume1Spec.Name(), "" /* volumeGidValue */) if err != nil { t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) } generatedVolume2Name, err := dsw.AddPodToVolume( - pod2Name, pod2, volume2Spec, volume2Spec.Name(), "" /* volumeGidValue */) + pod2Name, pod2, volume2Spec, nil, volume2Spec.Name(), "" /* volumeGidValue */) if err != nil { t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) } generatedVolume3Name, err := dsw.AddPodToVolume( - pod3Name, pod3, volume3Spec, volume3Spec.Name(), "" /* volumeGidValue */) + pod3Name, pod3, volume3Spec, nil, volume3Spec.Name(), "" /* volumeGidValue */) if err != nil { t.Fatalf("AddPodToVolume failed. Expected: Actual: <%v>", err) } diff --git a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go index a584d535328a4..9083d303b54b8 100644 --- a/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go +++ b/pkg/kubelet/volumemanager/populator/desired_state_of_world_populator.go @@ -264,7 +264,7 @@ func (dswp *desiredStateOfWorldPopulator) processPodVolumes(pod *v1.Pod) { // Process volume spec for each volume defined in pod for _, podVolume := range pod.Spec.Volumes { - volumeSpec, volumeGidValue, err := + volumeSpec, volumeGidValue, pvc, err := dswp.createVolumeSpec(podVolume, pod.Namespace) if err != nil { glog.Errorf( @@ -278,7 +278,7 @@ func (dswp *desiredStateOfWorldPopulator) processPodVolumes(pod *v1.Pod) { // Add volume to desired state of world _, err = dswp.desiredStateOfWorld.AddPodToVolume( - uniquePodName, pod, volumeSpec, podVolume.Name, volumeGidValue) + uniquePodName, pod, volumeSpec, pvc, podVolume.Name, volumeGidValue) if err != nil { glog.Errorf( "Failed to add volume %q (specName: %q) for pod %q to desiredStateOfWorld. err=%v", @@ -337,7 +337,7 @@ func (dswp *desiredStateOfWorldPopulator) deleteProcessedPod( // specified volume. It dereference any PVC to get PV objects, if needed. // Returns an error if unable to obtain the volume at this time. func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( - podVolume v1.Volume, podNamespace string) (*volume.Spec, string, error) { + podVolume v1.Volume, podNamespace string) (*volume.Spec, string, *v1.PersistentVolumeClaim, error) { if pvcSource := podVolume.VolumeSource.PersistentVolumeClaim; pvcSource != nil { glog.V(10).Infof( @@ -346,10 +346,10 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( pvcSource.ClaimName) // If podVolume is a PVC, fetch the real PV behind the claim - pvName, pvcUID, err := dswp.getPVCExtractPV( + pvc, pvName, pvcUID, err := dswp.getPVCExtractPV( podNamespace, pvcSource.ClaimName) if err != nil { - return nil, "", fmt.Errorf( + return nil, "", nil, fmt.Errorf( "error processing PVC %q/%q: %v", podNamespace, pvcSource.ClaimName, @@ -367,7 +367,7 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( volumeSpec, volumeGidValue, err := dswp.getPVSpec(pvName, pvcSource.ReadOnly, pvcUID) if err != nil { - return nil, "", fmt.Errorf( + return nil, "", nil, fmt.Errorf( "error processing PVC %q/%q: %v", podNamespace, pvcSource.ClaimName, @@ -382,35 +382,35 @@ func (dswp *desiredStateOfWorldPopulator) createVolumeSpec( pvcSource.ClaimName, pvcUID) - return volumeSpec, volumeGidValue, nil + return volumeSpec, volumeGidValue, pvc, nil } // Do not return the original volume object, since the source could mutate it clonedPodVolumeObj, err := scheme.Scheme.DeepCopy(&podVolume) if err != nil || clonedPodVolumeObj == nil { - return nil, "", fmt.Errorf( + return nil, "", nil, fmt.Errorf( "failed to deep copy %q volume object. err=%v", podVolume.Name, err) } clonedPodVolume, ok := clonedPodVolumeObj.(*v1.Volume) if !ok { - return nil, "", fmt.Errorf( + return nil, "", nil, fmt.Errorf( "failed to cast clonedPodVolume %#v to v1.Volume", clonedPodVolumeObj) } - return volume.NewSpecFromVolume(clonedPodVolume), "", nil + return volume.NewSpecFromVolume(clonedPodVolume), "", nil, nil } // getPVCExtractPV fetches the PVC object with the given namespace and name from // the API server extracts the name of the PV it is pointing to and returns it. // An error is returned if the PVC object's phase is not "Bound". func (dswp *desiredStateOfWorldPopulator) getPVCExtractPV( - namespace string, claimName string) (string, types.UID, error) { + namespace string, claimName string) (*v1.PersistentVolumeClaim, string, types.UID, error) { pvc, err := dswp.kubeClient.Core().PersistentVolumeClaims(namespace).Get(claimName, metav1.GetOptions{}) if err != nil || pvc == nil { - return "", "", fmt.Errorf( + return nil, "", "", fmt.Errorf( "failed to fetch PVC %s/%s from API server. err=%v", namespace, claimName, @@ -419,7 +419,7 @@ func (dswp *desiredStateOfWorldPopulator) getPVCExtractPV( if pvc.Status.Phase != v1.ClaimBound || pvc.Spec.VolumeName == "" { - return "", "", fmt.Errorf( + return nil, "", "", fmt.Errorf( "PVC %s/%s has non-bound phase (%q) or empty pvc.Spec.VolumeName (%q)", namespace, claimName, @@ -427,7 +427,7 @@ func (dswp *desiredStateOfWorldPopulator) getPVCExtractPV( pvc.Spec.VolumeName) } - return pvc.Spec.VolumeName, pvc.UID, nil + return pvc, pvc.Spec.VolumeName, pvc.UID, nil } // getPVSpec fetches the PV object with the given name from the API server diff --git a/pkg/kubelet/volumemanager/reconciler/reconciler.go b/pkg/kubelet/volumemanager/reconciler/reconciler.go index e9b6f3de4d4b9..beb328a22d548 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -535,6 +535,7 @@ func (rc *reconciler) updateStates(volumesNeedUpdate map[v1.UniqueVolumeName]*re _, err = rc.desiredStateOfWorld.AddPodToVolume(volume.podName, volume.pod, volume.volumeSpec, + nil, // pvc volume.outerVolumeSpecName, volume.volumeGidValue) if err != nil { diff --git a/pkg/kubelet/volumemanager/reconciler/reconciler_test.go b/pkg/kubelet/volumemanager/reconciler/reconciler_test.go index ca3b1d000717a..792d3367da524 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconciler_test.go +++ b/pkg/kubelet/volumemanager/reconciler/reconciler_test.go @@ -136,7 +136,7 @@ func Test_Run_Positive_VolumeAttachAndMount(t *testing.T) { volumeSpec := &volume.Spec{Volume: &pod.Spec.Volumes[0]} podName := volumehelper.GetUniquePodName(pod) generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) // Assert if err != nil { @@ -208,7 +208,7 @@ func Test_Run_Positive_VolumeMountControllerAttachEnabled(t *testing.T) { volumeSpec := &volume.Spec{Volume: &pod.Spec.Volumes[0]} podName := volumehelper.GetUniquePodName(pod) generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) dsw.MarkVolumesReportedInUse([]v1.UniqueVolumeName{generatedVolumeName}) // Assert @@ -281,7 +281,7 @@ func Test_Run_Positive_VolumeAttachMountUnmountDetach(t *testing.T) { volumeSpec := &volume.Spec{Volume: &pod.Spec.Volumes[0]} podName := volumehelper.GetUniquePodName(pod) generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) // Assert if err != nil { @@ -365,7 +365,7 @@ func Test_Run_Positive_VolumeUnmountControllerAttachEnabled(t *testing.T) { volumeSpec := &volume.Spec{Volume: &pod.Spec.Volumes[0]} podName := volumehelper.GetUniquePodName(pod) generatedVolumeName, err := dsw.AddPodToVolume( - podName, pod, volumeSpec, volumeSpec.Name(), "" /* volumeGidValue */) + podName, pod, volumeSpec, nil, volumeSpec.Name(), "" /* volumeGidValue */) // Assert if err != nil { diff --git a/pkg/volume/util/operationexecutor/operation_executor.go b/pkg/volume/util/operationexecutor/operation_executor.go index 560577638649c..8227e03403201 100644 --- a/pkg/volume/util/operationexecutor/operation_executor.go +++ b/pkg/volume/util/operationexecutor/operation_executor.go @@ -287,6 +287,11 @@ type VolumeToMount struct { // InnerVolumeSpecName. VolumeSpec *volume.Spec + // PVC the pod uses to reference the volume. nil for non-PVC volumes. Used + // as the mechanism for filesystem resize: if pvc.status.capacity is less + // than pv.spec.capacity, mount procedure will entail filesystem resize. + PVC *v1.PersistentVolumeClaim + // outerVolumeSpecName is the podSpec.Volume[x].Name of the volume. If the // volume was referenced through a persistent volume claim, this contains // the podSpec.Volume[x].Name of the persistent volume claim. diff --git a/pkg/volume/util/operationexecutor/operation_generator.go b/pkg/volume/util/operationexecutor/operation_generator.go index d5a1be795d886..d12b79de0e869 100644 --- a/pkg/volume/util/operationexecutor/operation_generator.go +++ b/pkg/volume/util/operationexecutor/operation_generator.go @@ -406,6 +406,14 @@ func (og *operationGenerator) GenerateMountVolumeFunc( } return func() error { + if volumeToMount.PVC != nil { + pvcStatusCap := volumeToMount.PVC.Status.Capacity[v1.ResourceStorage] + pvSpecCap := volumeToMount.VolumeSpec.PersistentVolume.Spec.Capacity[v1.ResourceStorage] + if pvcStatusCap.Value() < pvSpecCap.Value() { + //TODO resize + } + } + if volumeAttacher != nil { // Wait for attachable volumes to finish attaching glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach entering", fmt.Sprintf("DevicePath %q", volumeToMount.DevicePath))) From 73bf7a999feaacbcef6bee5fcb1117fe53ae9127 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Tue, 22 Aug 2017 17:05:43 -0400 Subject: [PATCH 12/14] Add expand-controller to bootstrappolicy --- .../rbac/bootstrappolicy/controller_policy.go | 8 +++++ .../testdata/controller-role-bindings.yaml | 17 +++++++++++ .../testdata/controller-roles.yaml | 30 +++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go index 955ed2e5562bd..ddef17f904bc1 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/controller_policy.go @@ -123,6 +123,14 @@ func init() { eventsRule(), }, }) + addControllerRole(rbac.ClusterRole{ + ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "expand-controller"}, + Rules: []rbac.PolicyRule{ + rbac.NewRule("update").Groups(legacyGroup).Resources("persistentvolumes").RuleOrDie(), + rbac.NewRule("update").Groups(legacyGroup).Resources("persistentvolumeclaims/status").RuleOrDie(), + eventsRule(), + }, + }) addControllerRole(rbac.ClusterRole{ ObjectMeta: metav1.ObjectMeta{Name: saRolePrefix + "generic-garbage-collector"}, Rules: []rbac.PolicyRule{ diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-role-bindings.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-role-bindings.yaml index eaa946c2cd2b1..7281e244f789d 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-role-bindings.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-role-bindings.yaml @@ -119,6 +119,23 @@ items: - kind: ServiceAccount name: endpoint-controller namespace: kube-system +- apiVersion: rbac.authorization.k8s.io/v1beta1 + kind: ClusterRoleBinding + metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + creationTimestamp: null + labels: + kubernetes.io/bootstrapping: rbac-defaults + name: system:controller:expand-controller + roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:controller:expand-controller + subjects: + - kind: ServiceAccount + name: expand-controller + namespace: kube-system - apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml index b85d951cd6af3..c486fc6940455 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/controller-roles.yaml @@ -371,6 +371,36 @@ items: - create - patch - update +- apiVersion: rbac.authorization.k8s.io/v1beta1 + kind: ClusterRole + metadata: + annotations: + rbac.authorization.kubernetes.io/autoupdate: "true" + creationTimestamp: null + labels: + kubernetes.io/bootstrapping: rbac-defaults + name: system:controller:expand-controller + rules: + - apiGroups: + - "" + resources: + - persistentvolumes + verbs: + - update + - apiGroups: + - "" + resources: + - persistentvolumeclaims/status + verbs: + - update + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - update - apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: From 3317190b338b1f9df656d81c0eb09c7df8787f1d Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Tue, 22 Aug 2017 18:28:05 -0400 Subject: [PATCH 13/14] Fix gce expand: get spec from NewExpander() not Expand() --- pkg/volume/gce_pd/gce_pd.go | 13 +++++++------ pkg/volume/plugins.go | 2 +- pkg/volume/volume.go | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/pkg/volume/gce_pd/gce_pd.go b/pkg/volume/gce_pd/gce_pd.go index f6243206b9176..348e85d5e2ea0 100644 --- a/pkg/volume/gce_pd/gce_pd.go +++ b/pkg/volume/gce_pd/gce_pd.go @@ -191,17 +191,18 @@ func (plugin *gcePersistentDiskPlugin) newProvisionerInternal(options volume.Vol }, nil } -func (plugin *gcePersistentDiskPlugin) NewExpander() (volume.Expander, error) { - return plugin.newExpanderInternal(&GCEDiskUtil{}) +func (plugin *gcePersistentDiskPlugin) NewExpander(spec *volume.Spec) (volume.Expander, error) { + return plugin.newExpanderInternal(spec, &GCEDiskUtil{}) } -func (plugin *gcePersistentDiskPlugin) newExpanderInternal(manager pdManager) (volume.Expander, error) { +func (plugin *gcePersistentDiskPlugin) newExpanderInternal(spec *volume.Spec, manager pdManager) (volume.Expander, error) { return &gcePersistentDiskExpander{ gcePersistentDisk: &gcePersistentDisk{ + volName: spec.Name(), + pdName: spec.PersistentVolume.Spec.GCEPersistentDisk.PDName, manager: manager, plugin: plugin, - }, - }, nil + }}, nil } func (plugin *gcePersistentDiskPlugin) ConstructVolumeSpec(volumeName, mountPath string) (*volume.Spec, error) { @@ -448,7 +449,7 @@ type gcePersistentDiskExpander struct { var _ volume.Expander = &gcePersistentDiskExpander{} -func (e *gcePersistentDiskExpander) ExpandVolumeDevice(spec *volume.Spec, newSize resource.Quantity, oldSize resource.Quantity) error { +func (e *gcePersistentDiskExpander) ExpandVolumeDevice(newSize resource.Quantity, oldSize resource.Quantity) error { cloud, err := getCloudProvider(e.gcePersistentDisk.plugin.host.GetCloudProvider()) if err != nil { return err diff --git a/pkg/volume/plugins.go b/pkg/volume/plugins.go index 4da1f878c8948..b46ee10bfe61b 100644 --- a/pkg/volume/plugins.go +++ b/pkg/volume/plugins.go @@ -190,7 +190,7 @@ type AttachableVolumePlugin interface { // expanded type ExpandableVolumePlugin interface { VolumePlugin - NewExpander() (Expander, error) + NewExpander(spec *Spec) (Expander, error) } // VolumeHost is an interface that plugins can use to access the kubelet. diff --git a/pkg/volume/volume.go b/pkg/volume/volume.go index b4338c32d4a87..22693e12ae38d 100644 --- a/pkg/volume/volume.go +++ b/pkg/volume/volume.go @@ -195,7 +195,7 @@ type BulkVolumeVerifier interface { type Expander interface { // ExpandVolume expands the volume device via cloudprovider api call - ExpandVolumeDevice(spec *Spec, newSize resource.Quantity, oldSize resource.Quantity) error + ExpandVolumeDevice(newSize resource.Quantity, oldSize resource.Quantity) error // Check if volume type also requires File system resize RequiresFSResize() bool } From 745f99af8b26eeb13c9f2a6dc157ed20e63a54d1 Mon Sep 17 00:00:00 2001 From: Matthew Wong Date: Tue, 22 Aug 2017 18:28:26 -0400 Subject: [PATCH 14/14] Initial nonworking fs resize implementation --- .../volume/expand/sync_volume_resize.go | 2 +- .../volumemanager/reconciler/reconciler.go | 3 +- pkg/util/mount/mount_linux.go | 6 +- pkg/util/resizefs/resizefs.go | 39 +++++++++++ pkg/util/resizefs/resizefs_unsupported.go | 25 +++++++ .../operationexecutor/operation_executor.go | 11 ++-- .../operationexecutor/operation_generator.go | 65 +++++++++++++++---- 7 files changed, 129 insertions(+), 22 deletions(-) create mode 100644 pkg/util/resizefs/resizefs.go create mode 100644 pkg/util/resizefs/resizefs_unsupported.go diff --git a/pkg/controller/volume/expand/sync_volume_resize.go b/pkg/controller/volume/expand/sync_volume_resize.go index caadd2f487f37..456fd9ec2d855 100644 --- a/pkg/controller/volume/expand/sync_volume_resize.go +++ b/pkg/controller/volume/expand/sync_volume_resize.go @@ -61,7 +61,7 @@ func (rc *syncResize) Sync() { glog.V(10).Infof("Operation for PVC %v is already pending", pvcWithResizeRequest.UniquePvcKey()) continue } - growFuncError := rc.opsExecutor.GrowPvc(pvcWithResizeRequest, rc.resizeMap) + growFuncError := rc.opsExecutor.ExpandVolume(pvcWithResizeRequest, rc.resizeMap) if growFuncError != nil { glog.Errorf("Error growing pvc with %v", growFuncError) } diff --git a/pkg/kubelet/volumemanager/reconciler/reconciler.go b/pkg/kubelet/volumemanager/reconciler/reconciler.go index beb328a22d548..9559e83692247 100644 --- a/pkg/kubelet/volumemanager/reconciler/reconciler.go +++ b/pkg/kubelet/volumemanager/reconciler/reconciler.go @@ -244,7 +244,8 @@ func (rc *reconciler) reconcile() { rc.waitForAttachTimeout, volumeToMount.VolumeToMount, rc.actualStateOfWorld, - isRemount) + isRemount, + rc.mounter) if err != nil && !nestedpendingoperations.IsAlreadyExists(err) && !exponentialbackoff.IsExponentialBackoff(err) { diff --git a/pkg/util/mount/mount_linux.go b/pkg/util/mount/mount_linux.go index 237348034c752..728bbe6774ebb 100644 --- a/pkg/util/mount/mount_linux.go +++ b/pkg/util/mount/mount_linux.go @@ -359,7 +359,7 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, if mountErr != nil { // Mount failed. This indicates either that the disk is unformatted or // it contains an unexpected filesystem. - existingFormat, err := mounter.getDiskFormat(source) + existingFormat, err := mounter.GetDiskFormat(source) if err != nil { return err } @@ -398,8 +398,8 @@ func (mounter *SafeFormatAndMount) formatAndMount(source string, target string, return mountErr } -// diskLooksUnformatted uses 'lsblk' to see if the given disk is unformated -func (mounter *SafeFormatAndMount) getDiskFormat(disk string) (string, error) { +// GetDiskFormat uses 'lsblk' to see if the given disk is unformated +func (mounter *SafeFormatAndMount) GetDiskFormat(disk string) (string, error) { args := []string{"-n", "-o", "FSTYPE", disk} cmd := mounter.Runner.Command("lsblk", args...) glog.V(4).Infof("Attempting to determine if disk %q is formatted using lsblk with args: (%v)", disk, args) diff --git a/pkg/util/resizefs/resizefs.go b/pkg/util/resizefs/resizefs.go new file mode 100644 index 0000000000000..cb22bf0e9369b --- /dev/null +++ b/pkg/util/resizefs/resizefs.go @@ -0,0 +1,39 @@ +// +build linux + +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resizefs + +import ( + "fmt" + "os/exec" + + "k8s.io/apimachinery/pkg/api/resource" +) + +func ResizeExt(device string, size *resource.Quantity) error { + cmd := exec.Command("resize2fs", device) + if size != nil { + size.Format = resource.DecimalSI + cmd.Args = append(cmd.Args, size.String()) + } + out, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("'resize2fs' on path %s failed: %v\n Output: %s\n", device, err, string(out)) + } + return nil +} diff --git a/pkg/util/resizefs/resizefs_unsupported.go b/pkg/util/resizefs/resizefs_unsupported.go new file mode 100644 index 0000000000000..13492cdd4f377 --- /dev/null +++ b/pkg/util/resizefs/resizefs_unsupported.go @@ -0,0 +1,25 @@ +// +build !linux + +/* +Copyright 2017 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package resizefs + +import "fmt" + +func ResizeExt(device string, size *resource.Quantity) error { + return fmt.Errorf("ResizeExt not supported for this build.") +} diff --git a/pkg/volume/util/operationexecutor/operation_executor.go b/pkg/volume/util/operationexecutor/operation_executor.go index 8227e03403201..2d44f755a8faa 100644 --- a/pkg/volume/util/operationexecutor/operation_executor.go +++ b/pkg/volume/util/operationexecutor/operation_executor.go @@ -93,7 +93,7 @@ type OperationExecutor interface { // The parameter "isRemount" is informational and used to adjust logging // verbosity. An initial mount is more log-worthy than a remount, for // example. - MountVolume(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, isRemount bool) error + MountVolume(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, isRemount bool, mounter mount.Interface) error // UnmountVolume unmounts the volume from the pod specified in // volumeToUnmount and updates the actual state of the world to reflect that. @@ -120,7 +120,7 @@ type OperationExecutor interface { // otherwise it returns false IsOperationPending(volumeName v1.UniqueVolumeName, podName volumetypes.UniquePodName) bool // Grow PVC will grow size available to PVC - GrowPvc(*expandcache.PvcWithResizeRequest, expandcache.VolumeResizeMap) error + ExpandVolume(*expandcache.PvcWithResizeRequest, expandcache.VolumeResizeMap) error } // NewOperationExecutor returns a new instance of OperationExecutor. @@ -664,9 +664,10 @@ func (oe *operationExecutor) MountVolume( waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, - isRemount bool) error { + isRemount bool, + mounter mount.Interface) error { mountFunc, err := oe.operationGenerator.GenerateMountVolumeFunc( - waitForAttachTimeout, volumeToMount, actualStateOfWorld, isRemount) + waitForAttachTimeout, volumeToMount, actualStateOfWorld, isRemount, mounter) if err != nil { return err } @@ -715,7 +716,7 @@ func (oe *operationExecutor) UnmountDevice( deviceToDetach.VolumeName, "" /* podName */, unmountDeviceFunc) } -func (oe *operationExecutor) GrowPvc(pvcWithResizeRequest *expandcache.PvcWithResizeRequest, resizeMap expandcache.VolumeResizeMap) error { +func (oe *operationExecutor) ExpandVolume(pvcWithResizeRequest *expandcache.PvcWithResizeRequest, resizeMap expandcache.VolumeResizeMap) error { expandFunc, err := oe.operationGenerator.GenerateExpandVolumeFunc(pvcWithResizeRequest, resizeMap) if err != nil { diff --git a/pkg/volume/util/operationexecutor/operation_generator.go b/pkg/volume/util/operationexecutor/operation_generator.go index d12b79de0e869..e3a626a53539a 100644 --- a/pkg/volume/util/operationexecutor/operation_generator.go +++ b/pkg/volume/util/operationexecutor/operation_generator.go @@ -32,9 +32,11 @@ import ( "k8s.io/kubernetes/pkg/features" kevents "k8s.io/kubernetes/pkg/kubelet/events" "k8s.io/kubernetes/pkg/util/mount" + "k8s.io/kubernetes/pkg/util/resizefs" "k8s.io/kubernetes/pkg/volume" "k8s.io/kubernetes/pkg/volume/util" "k8s.io/kubernetes/pkg/volume/util/volumehelper" + "k8s.io/utils/exec" ) var _ OperationGenerator = &operationGenerator{} @@ -74,7 +76,7 @@ func NewOperationGenerator(kubeClient clientset.Interface, // OperationGenerator interface that extracts out the functions from operation_executor to make it dependency injectable type OperationGenerator interface { // Generates the MountVolume function needed to perform the mount of a volume plugin - GenerateMountVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater, isRemount bool) (func() error, error) + GenerateMountVolumeFunc(waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorldMounterUpdater ActualStateOfWorldMounterUpdater, isRemount bool, mounter mount.Interface) (func() error, error) // Generates the UnmountVolume function needed to perform the unmount of a volume plugin GenerateUnmountVolumeFunc(volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater) (func() error, error) @@ -362,7 +364,8 @@ func (og *operationGenerator) GenerateMountVolumeFunc( waitForAttachTimeout time.Duration, volumeToMount VolumeToMount, actualStateOfWorld ActualStateOfWorldMounterUpdater, - isRemount bool) (func() error, error) { + isRemount bool, + mounter mount.Interface) (func() error, error) { // Get mounter plugin volumePlugin, err := og.volumePluginMgr.FindPluginBySpec(volumeToMount.VolumeSpec) @@ -399,6 +402,14 @@ func (og *operationGenerator) GenerateMountVolumeFunc( volumeAttacher, _ = attachableVolumePlugin.NewAttacher() } + // Get expander, if possible + expandableVolumePlugin, _ := + og.volumePluginMgr.FindExpandablePluginBySpec(volumeToMount.VolumeSpec) + var volumeExpander volume.Expander + if expandableVolumePlugin != nil { + volumeExpander, _ = expandableVolumePlugin.NewExpander(volumeToMount.VolumeSpec) + } + var fsGroup *int64 if volumeToMount.Pod.Spec.SecurityContext != nil && volumeToMount.Pod.Spec.SecurityContext.FSGroup != nil { @@ -406,14 +417,6 @@ func (og *operationGenerator) GenerateMountVolumeFunc( } return func() error { - if volumeToMount.PVC != nil { - pvcStatusCap := volumeToMount.PVC.Status.Capacity[v1.ResourceStorage] - pvSpecCap := volumeToMount.VolumeSpec.PersistentVolume.Spec.Capacity[v1.ResourceStorage] - if pvcStatusCap.Value() < pvSpecCap.Value() { - //TODO resize - } - } - if volumeAttacher != nil { // Wait for attachable volumes to finish attaching glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach entering", fmt.Sprintf("DevicePath %q", volumeToMount.DevicePath))) @@ -427,6 +430,17 @@ func (og *operationGenerator) GenerateMountVolumeFunc( glog.Infof(volumeToMount.GenerateMsgDetailed("MountVolume.WaitForAttach succeeded", "")) + if volumeExpander != nil && volumeExpander.RequiresFSResize() && volumeToMount.PVC != nil { + pvcStatusCap := volumeToMount.PVC.Status.Capacity[v1.ResourceStorage] + pvSpecCap := volumeToMount.VolumeSpec.PersistentVolume.Spec.Capacity[v1.ResourceStorage] + if pvcStatusCap.Value() < pvSpecCap.Value() { + err := og.resizeFileSystem(volumeToMount, mounter, devicePath) + if err != nil { + return volumeToMount.GenerateErrorDetailed("MountVolume.resizeFileSystem failed", err) + } + } + } + deviceMountPath, err := volumeAttacher.GetDeviceMountPath(volumeToMount.VolumeSpec) if err != nil { @@ -503,6 +517,33 @@ func (og *operationGenerator) GenerateMountVolumeFunc( }, nil } +func (og *operationGenerator) resizeFileSystem( + volumeToMount VolumeToMount, + mounter mount.Interface, + devicePath string) error { + diskMounter := &mount.SafeFormatAndMount{Interface: mounter, Runner: exec.New()} + + deviceOpened, err := diskMounter.DeviceOpened(devicePath) + if err != nil { + return err + } + if deviceOpened { + return fmt.Errorf("the device %s is in use, its file system can't be resized", devicePath) + } + + format, err := diskMounter.GetDiskFormat(devicePath) + if err != nil { + return err + } + switch format { + case "ext3", "ext4": + return resizefs.ResizeExt(devicePath, nil) + case "xfs": + return fmt.Errorf("TODO: xfs") + } + return fmt.Errorf("Resizing of format %s is not supported", format) +} + func (og *operationGenerator) GenerateUnmountVolumeFunc( volumeToUnmount MountedVolume, actualStateOfWorld ActualStateOfWorldMounterUpdater) (func() error, error) { @@ -736,14 +777,14 @@ func (og *operationGenerator) GenerateExpandVolumeFunc( return nil, fmt.Errorf("Error finding plugin for expanding volume: %q with error %v", pvcWithResizeRequest.QualifiedName(), err) } - expanderPlugin, err := volumePlugin.NewExpander() + expanderPlugin, err := volumePlugin.NewExpander(pvcWithResizeRequest.VolumeSpec) if err != nil { return nil, fmt.Errorf("Error creating expander plugin for volume %q with error %v", pvcWithResizeRequest.QualifiedName(), err) } expandFunc := func() error { - expandErr := expanderPlugin.ExpandVolumeDevice(pvcWithResizeRequest.VolumeSpec, pvcWithResizeRequest.ExpectedSize, pvcWithResizeRequest.CurrentSize) + expandErr := expanderPlugin.ExpandVolumeDevice(pvcWithResizeRequest.ExpectedSize, pvcWithResizeRequest.CurrentSize) if expandErr != nil { glog.Errorf("Error expanding volume through cloudprovider for volume %q : %v", pvcWithResizeRequest.QualifiedName(), expandErr)