From 7b3d77a41af88083ba14ffe2cc8ad3a66010c43b Mon Sep 17 00:00:00 2001 From: Peter Schuurman Date: Mon, 26 Sep 2022 18:34:03 -0700 Subject: [PATCH] Adding implementation of KEP-3335, StatefulSetSlice --- api/openapi-spec/swagger.json | 15 + .../v3/apis__apps__v1_openapi.json | 20 + pkg/apis/apps/types.go | 19 + pkg/apis/apps/v1/zz_generated.conversion.go | 2 + .../apps/v1beta1/zz_generated.conversion.go | 2 + .../apps/v1beta2/zz_generated.conversion.go | 2 + pkg/apis/apps/validation/validation.go | 17 +- pkg/apis/apps/validation/validation_test.go | 36 ++ .../statefulset/stateful_set_control.go | 40 +- .../statefulset/stateful_set_control_test.go | 194 ++++--- .../statefulset/stateful_set_utils.go | 37 +- pkg/features/kube_features.go | 8 + pkg/generated/openapi/zz_generated.openapi.go | 90 +++- pkg/registry/apps/statefulset/strategy.go | 4 + .../src/k8s.io/api/apps/v1/generated.pb.go | 481 ++++++++++++----- .../src/k8s.io/api/apps/v1/generated.proto | 19 + staging/src/k8s.io/api/apps/v1/types.go | 19 + .../apps/v1/types_swagger_doc_generated.go | 10 + .../api/apps/v1/zz_generated.deepcopy.go | 21 + .../k8s.io/api/apps/v1beta1/generated.pb.go | 459 +++++++++++----- .../k8s.io/api/apps/v1beta1/generated.proto | 19 + staging/src/k8s.io/api/apps/v1beta1/types.go | 19 + .../v1beta1/types_swagger_doc_generated.go | 10 + .../api/apps/v1beta1/zz_generated.deepcopy.go | 21 + .../k8s.io/api/apps/v1beta2/generated.pb.go | 498 ++++++++++++------ .../k8s.io/api/apps/v1beta2/generated.proto | 19 + staging/src/k8s.io/api/apps/v1beta2/types.go | 19 + .../v1beta2/types_swagger_doc_generated.go | 10 + .../api/apps/v1beta2/zz_generated.deepcopy.go | 21 + .../apps/v1/statefulsetordinals.go | 39 ++ .../apps/v1/statefulsetspec.go | 9 + .../apps/v1beta1/statefulsetordinals.go | 39 ++ .../apps/v1beta1/statefulsetspec.go | 9 + .../apps/v1beta2/statefulsetordinals.go | 39 ++ .../apps/v1beta2/statefulsetspec.go | 9 + .../applyconfigurations/internal/internal.go | 30 ++ .../client-go/applyconfigurations/utils.go | 6 + 37 files changed, 1804 insertions(+), 507 deletions(-) create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go create mode 100644 staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index b9489afac4e..b35c599c115 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -1624,6 +1624,17 @@ } ] }, + "io.k8s.api.apps.v1.StatefulSetOrdinals": { + "description": "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + "properties": { + "start": { + "description": "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "io.k8s.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy": { "description": "StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates.", "properties": { @@ -1646,6 +1657,10 @@ "format": "int32", "type": "integer" }, + "ordinals": { + "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetOrdinals", + "description": "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha." + }, "persistentVolumeClaimRetentionPolicy": { "$ref": "#/definitions/io.k8s.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy", "description": "persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent volume claims created from volumeClaimTemplates. By default, all persistent volume claims are created as needed and retained until manually deleted. This policy allows the lifecycle to be altered, for example by deleting persistent volume claims when their stateful set is deleted, or when their pod is scaled down. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. +optional" diff --git a/api/openapi-spec/v3/apis__apps__v1_openapi.json b/api/openapi-spec/v3/apis__apps__v1_openapi.json index e93f08ba96f..8e0820855ea 100644 --- a/api/openapi-spec/v3/apis__apps__v1_openapi.json +++ b/api/openapi-spec/v3/apis__apps__v1_openapi.json @@ -1044,6 +1044,18 @@ } ] }, + "io.k8s.api.apps.v1.StatefulSetOrdinals": { + "description": "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + "properties": { + "start": { + "default": 0, + "description": "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", + "format": "int32", + "type": "integer" + } + }, + "type": "object" + }, "io.k8s.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy": { "description": "StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates.", "properties": { @@ -1066,6 +1078,14 @@ "format": "int32", "type": "integer" }, + "ordinals": { + "allOf": [ + { + "$ref": "#/components/schemas/io.k8s.api.apps.v1.StatefulSetOrdinals" + } + ], + "description": "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha." + }, "persistentVolumeClaimRetentionPolicy": { "allOf": [ { diff --git a/pkg/apis/apps/types.go b/pkg/apis/apps/types.go index 2a99526c021..353ae5c4b0e 100644 --- a/pkg/apis/apps/types.go +++ b/pkg/apis/apps/types.go @@ -143,6 +143,17 @@ type StatefulSetPersistentVolumeClaimRetentionPolicy struct { WhenScaled PersistentVolumeClaimRetentionPolicyType } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +type StatefulSetOrdinals struct { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + Start int32 +} + // A StatefulSetSpec is the specification of a StatefulSet. type StatefulSetSpec struct { // Replicas is the desired number of replicas of the given Template. @@ -215,6 +226,14 @@ type StatefulSetSpec struct { // StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. // +optional PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicy + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + Ordinals *StatefulSetOrdinals } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/pkg/apis/apps/v1/zz_generated.conversion.go b/pkg/apis/apps/v1/zz_generated.conversion.go index 103eeff6a37..e77da8f6ed3 100644 --- a/pkg/apis/apps/v1/zz_generated.conversion.go +++ b/pkg/apis/apps/v1/zz_generated.conversion.go @@ -1206,6 +1206,7 @@ func autoConvert_v1_StatefulSetSpec_To_apps_StatefulSetSpec(in *v1.StatefulSetSp out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*apps.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.Ordinals requires manual conversion: does not exist in peer-type return nil } @@ -1226,6 +1227,7 @@ func autoConvert_apps_StatefulSetSpec_To_v1_StatefulSetSpec(in *apps.StatefulSet out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*v1.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.ReplicaStartOrdinal requires manual conversion: does not exist in peer-type return nil } diff --git a/pkg/apis/apps/v1beta1/zz_generated.conversion.go b/pkg/apis/apps/v1beta1/zz_generated.conversion.go index ce30467ed1e..ea937f6f96c 100644 --- a/pkg/apis/apps/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta1/zz_generated.conversion.go @@ -870,6 +870,7 @@ func autoConvert_v1beta1_StatefulSetSpec_To_apps_StatefulSetSpec(in *v1beta1.Sta out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*apps.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.Ordinals requires manual conversion: does not exist in peer-type return nil } @@ -890,6 +891,7 @@ func autoConvert_apps_StatefulSetSpec_To_v1beta1_StatefulSetSpec(in *apps.Statef out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.ReplicaStartOrdinal requires manual conversion: does not exist in peer-type return nil } diff --git a/pkg/apis/apps/v1beta2/zz_generated.conversion.go b/pkg/apis/apps/v1beta2/zz_generated.conversion.go index 18e6a0fe6b2..6d1aa2b4ee3 100644 --- a/pkg/apis/apps/v1beta2/zz_generated.conversion.go +++ b/pkg/apis/apps/v1beta2/zz_generated.conversion.go @@ -1302,6 +1302,7 @@ func autoConvert_v1beta2_StatefulSetSpec_To_apps_StatefulSetSpec(in *v1beta2.Sta out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*apps.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.Ordinals requires manual conversion: does not exist in peer-type return nil } @@ -1322,6 +1323,7 @@ func autoConvert_apps_StatefulSetSpec_To_v1beta2_StatefulSetSpec(in *apps.Statef out.RevisionHistoryLimit = (*int32)(unsafe.Pointer(in.RevisionHistoryLimit)) out.MinReadySeconds = in.MinReadySeconds out.PersistentVolumeClaimRetentionPolicy = (*v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy)(unsafe.Pointer(in.PersistentVolumeClaimRetentionPolicy)) + // WARNING: in.ReplicaStartOrdinal requires manual conversion: does not exist in peer-type return nil } diff --git a/pkg/apis/apps/validation/validation.go b/pkg/apis/apps/validation/validation.go index 7dd539b944a..dd9c9ecbdc4 100644 --- a/pkg/apis/apps/validation/validation.go +++ b/pkg/apis/apps/validation/validation.go @@ -28,9 +28,11 @@ import ( "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/kubernetes/pkg/apis/apps" api "k8s.io/kubernetes/pkg/apis/core" apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" + "k8s.io/kubernetes/pkg/features" ) // ValidateStatefulSetName can be used to check whether the given StatefulSet name is valid. @@ -128,6 +130,12 @@ func ValidateStatefulSetSpec(spec *apps.StatefulSetSpec, fldPath *field.Path, op allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.Replicas), fldPath.Child("replicas"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) + if utilfeature.DefaultFeatureGate.Enabled(features.StatefulSetSlice) { + if spec.Ordinals != nil { + replicaStartOrdinal := spec.Ordinals.Start + allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(replicaStartOrdinal), fldPath.Child("ordinals.start"))...) + } + } if spec.Selector == nil { allErrs = append(allErrs, field.Required(fldPath.Child("selector"), "")) @@ -177,10 +185,17 @@ func ValidateStatefulSetUpdate(statefulSet, oldStatefulSet *apps.StatefulSet, op newStatefulSetClone.Spec.Template = oldStatefulSet.Spec.Template // +k8s:verify-mutation:reason=clone newStatefulSetClone.Spec.UpdateStrategy = oldStatefulSet.Spec.UpdateStrategy // +k8s:verify-mutation:reason=clone newStatefulSetClone.Spec.MinReadySeconds = oldStatefulSet.Spec.MinReadySeconds // +k8s:verify-mutation:reason=clone + if utilfeature.DefaultFeatureGate.Enabled(features.StatefulSetSlice) { + newStatefulSetClone.Spec.Ordinals = oldStatefulSet.Spec.Ordinals // +k8s:verify-mutation:reason=clone + } newStatefulSetClone.Spec.PersistentVolumeClaimRetentionPolicy = oldStatefulSet.Spec.PersistentVolumeClaimRetentionPolicy // +k8s:verify-mutation:reason=clone if !apiequality.Semantic.DeepEqual(newStatefulSetClone.Spec, oldStatefulSet.Spec) { - allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to statefulset spec for fields other than 'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden")) + if utilfeature.DefaultFeatureGate.Enabled(features.StatefulSetSlice) { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to statefulset spec for fields other than 'replicas', 'ordinals', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden")) + } else { + allErrs = append(allErrs, field.Forbidden(field.NewPath("spec"), "updates to statefulset spec for fields other than 'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden")) + } } return allErrs diff --git a/pkg/apis/apps/validation/validation_test.go b/pkg/apis/apps/validation/validation_test.go index 99147f00e9f..44a5944c678 100644 --- a/pkg/apis/apps/validation/validation_test.go +++ b/pkg/apis/apps/validation/validation_test.go @@ -86,6 +86,8 @@ func TestValidateStatefulSet(t *testing.T) { const enableStatefulSetAutoDeletePVC = "[enable StatefulSetAutoDeletePVC]" + const enableStatefulSetSlice = "[enable StatefulSetSlice]" + type testCase struct { name string set apps.StatefulSet @@ -193,6 +195,20 @@ func TestValidateStatefulSet(t *testing.T) { }, }, }, + { + name: "ordinals.start positive value " + enableStatefulSetSlice, + set: apps.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, + Spec: apps.StatefulSetSpec{ + PodManagementPolicy: apps.ParallelPodManagement, + UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, + Selector: &metav1.LabelSelector{MatchLabels: validLabels}, + Template: validPodTemplate.Template, + Replicas: 3, + Ordinals: &apps.StatefulSetOrdinals{Start: 2}, + }, + }, + }, } errorCases := []testCase{ @@ -635,6 +651,23 @@ func TestValidateStatefulSet(t *testing.T) { field.Invalid(field.NewPath("spec", "updateStrategy", "rollingUpdate", "maxUnavailable"), nil, ""), }, }, + { + name: "invalid ordinals.start " + enableStatefulSetSlice, + set: apps.StatefulSet{ + ObjectMeta: metav1.ObjectMeta{Name: "abc-123", Namespace: metav1.NamespaceDefault}, + Spec: apps.StatefulSetSpec{ + PodManagementPolicy: apps.ParallelPodManagement, + UpdateStrategy: apps.StatefulSetUpdateStrategy{Type: apps.RollingUpdateStatefulSetStrategyType}, + Selector: &metav1.LabelSelector{MatchLabels: validLabels}, + Template: validPodTemplate.Template, + Replicas: 3, + Ordinals: &apps.StatefulSetOrdinals{Start: -2}, + }, + }, + errs: field.ErrorList{ + field.Invalid(field.NewPath("spec", "ordinals.start"), nil, ""), + }, + }, } cmpOpts := []cmp.Option{cmpopts.IgnoreFields(field.Error{}, "BadValue", "Detail"), cmpopts.SortSlices(func(a, b *field.Error) bool { return a.Error() < b.Error() })} @@ -651,6 +684,9 @@ func TestValidateStatefulSet(t *testing.T) { if strings.Contains(name, enableStatefulSetAutoDeletePVC) { defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetAutoDeletePVC, true)() } + if strings.Contains(name, enableStatefulSetSlice) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetSlice, true)() + } errs := ValidateStatefulSet(&testCase.set, pod.GetValidationOptionsFromPodTemplate(&testCase.set.Spec.Template, nil)) wantErrs := testCase.errs diff --git a/pkg/controller/statefulset/stateful_set_control.go b/pkg/controller/statefulset/stateful_set_control.go index 30d4d626871..5f8f4a0e0c1 100644 --- a/pkg/controller/statefulset/stateful_set_control.go +++ b/pkg/controller/statefulset/stateful_set_control.go @@ -303,52 +303,53 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( *status.CollisionCount = collisionCount replicaCount := int(*set.Spec.Replicas) - // slice that will contain all Pods such that 0 <= getOrdinal(pod) < set.Spec.Replicas + // slice that will contain all Pods such that getStartOrdinal(set) <= getOrdinal(pod) <= getEndOrdinal(set) replicas := make([]*v1.Pod, replicaCount) - // slice that will contain all Pods such that set.Spec.Replicas <= getOrdinal(pod) + // slice that will contain all Pods such that getOrdinal(pod) < getStartOrdinal(set) OR getOrdinal(pod) > getEndOrdinal(set) condemned := make([]*v1.Pod, 0, len(pods)) unhealthy := 0 var firstUnhealthyPod *v1.Pod // First we partition pods into two lists valid replicas and condemned Pods - for i := range pods { + for _, pod := range pods { status.Replicas++ // count the number of running and ready replicas - if isRunningAndReady(pods[i]) { + if isRunningAndReady(pod) { status.ReadyReplicas++ // count the number of running and available replicas - if isRunningAndAvailable(pods[i], set.Spec.MinReadySeconds) { + if isRunningAndAvailable(pod, set.Spec.MinReadySeconds) { status.AvailableReplicas++ } } // count the number of current and update replicas - if isCreated(pods[i]) && !isTerminating(pods[i]) { - if getPodRevision(pods[i]) == currentRevision.Name { + if isCreated(pod) && !isTerminating(pod) { + if getPodRevision(pod) == currentRevision.Name { status.CurrentReplicas++ } - if getPodRevision(pods[i]) == updateRevision.Name { + if getPodRevision(pod) == updateRevision.Name { status.UpdatedReplicas++ } } - if ord := getOrdinal(pods[i]); 0 <= ord && ord < replicaCount { + if podInOrdinalRange(pod, set) { // if the ordinal of the pod is within the range of the current number of replicas, // insert it at the indirection of its ordinal - replicas[ord] = pods[i] - } else if ord >= replicaCount { - // if the ordinal is greater than the number of replicas add it to the condemned list - condemned = append(condemned, pods[i]) + replicas[getOrdinal(pod)-getStartOrdinal(set)] = pod + } else if getOrdinal(pod) >= 0 { + // if the ordinal is valid, but not within the range add it to the condemned list + condemned = append(condemned, pod) } // If the ordinal could not be parsed (ord < 0), ignore the Pod. } // for any empty indices in the sequence [0,set.Spec.Replicas) create a new Pod at the correct revision - for ord := 0; ord < replicaCount; ord++ { - if replicas[ord] == nil { - replicas[ord] = newVersionedStatefulSetPod( + for ord := getStartOrdinal(set); ord <= getEndOrdinal(set); ord++ { + replicaIdx := ord - getStartOrdinal(set) + if replicas[replicaIdx] == nil { + replicas[replicaIdx] = newVersionedStatefulSetPod( currentSet, updateSet, currentRevision.Name, @@ -409,12 +410,13 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( status.UpdatedReplicas-- } status.Replicas-- + replicaOrd := i + getStartOrdinal(set) replicas[i] = newVersionedStatefulSetPod( currentSet, updateSet, currentRevision.Name, updateRevision.Name, - i) + replicaOrd) } // If we find a Pod that has not been created we create the Pod if !isCreated(replicas[i]) { @@ -501,7 +503,7 @@ func (ssc *defaultStatefulSetControl) updateStatefulSet( // At this point, all of the current Replicas are Running, Ready and Available, we can consider termination. // We will wait for all predecessors to be Running and Ready prior to attempting a deletion. - // We will terminate Pods in a monotonically decreasing order over [len(pods),set.Spec.Replicas). + // We will terminate Pods in a monotonically decreasing order. // Note that we do not resurrect Pods in this interval. Also note that scaling will take precedence over // updates. for target := len(condemned) - 1; target >= 0; target-- { @@ -614,7 +616,7 @@ func updateStatefulSetAfterInvariantEstablished( } } - // Collect all targets in the range between the 0 and Spec.Replicas. Count any targets in that range + // Collect all targets in the range between getStartOrdinal(set) and getEndOrdinal(set). Count any targets in that range // that are unhealthy i.e. terminated or not running and ready as unavailable). Select the // (MaxUnavailable - Unavailable) Pods, in order with respect to their ordinal for termination. Delete // those pods and count the successful deletions. Update the status with the correct number of deletions. diff --git a/pkg/controller/statefulset/stateful_set_control_test.go b/pkg/controller/statefulset/stateful_set_control_test.go index 8ad7b586ff6..d571d81d3fb 100644 --- a/pkg/controller/statefulset/stateful_set_control_test.go +++ b/pkg/controller/statefulset/stateful_set_control_test.go @@ -559,6 +559,74 @@ func PodRecreateDeleteFailure(t *testing.T, set *apps.StatefulSet, invariants in } } +func emptyInvaraints(set *apps.StatefulSet, om *fakeObjectManager) error { + return nil +} + +func TestStatefulSetControlWithStartOrdinal(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.StatefulSetSlice, true)() + + simpleSetFn := func() *apps.StatefulSet { + statefulSet := newStatefulSet(3) + statefulSet.Spec.Ordinals = &apps.StatefulSetOrdinals{Start: int32(2)} + return statefulSet + } + + testCases := []struct { + fn func(*testing.T, *apps.StatefulSet, invariantFunc) + obj func() *apps.StatefulSet + }{ + {CreatesPodsWithStartOrdinal, simpleSetFn}, + } + + for _, testCase := range testCases { + testObj := testCase.obj + testFn := testCase.fn + + set := testObj() + testFn(t, set, emptyInvaraints) + } +} + +func CreatesPodsWithStartOrdinal(t *testing.T, set *apps.StatefulSet, invariants invariantFunc) { + client := fake.NewSimpleClientset(set) + om, _, ssc := setupController(client) + + if err := scaleUpStatefulSetControl(set, ssc, om, invariants); err != nil { + t.Errorf("Failed to turn up StatefulSet : %s", err) + } + var err error + set, err = om.setsLister.StatefulSets(set.Namespace).Get(set.Name) + if err != nil { + t.Fatalf("Error getting updated StatefulSet: %v", err) + } + if set.Status.Replicas != 3 { + t.Error("Failed to scale statefulset to 3 replicas") + } + if set.Status.ReadyReplicas != 3 { + t.Error("Failed to set ReadyReplicas correctly") + } + if set.Status.UpdatedReplicas != 3 { + t.Error("Failed to set UpdatedReplicas correctly") + } + selector, err := metav1.LabelSelectorAsSelector(set.Spec.Selector) + if err != nil { + t.Error(err) + } + pods, err := om.podsLister.Pods(set.Namespace).List(selector) + if err != nil { + t.Error(err) + } + sort.Sort(ascendingOrdinal(pods)) + for i, pod := range pods { + expectedOrdinal := 2 + i + actualPodOrdinal := getOrdinal(pod) + if actualPodOrdinal != expectedOrdinal { + t.Errorf("Expected pod ordinal %d. Got %d", expectedOrdinal, actualPodOrdinal) + } + } +} + func TestStatefulSetControlScaleDownDeleteError(t *testing.T) { runTestOverPVCRetentionPolicies( t, "", func(t *testing.T, policy *apps.StatefulSetPersistentVolumeClaimRetentionPolicy) { @@ -2299,6 +2367,16 @@ func (om *fakeObjectManager) SetDeleteStatefulPodError(err error, after int) { om.deletePodTracker.after = after } +func findPodByOrdinal(pods []*v1.Pod, ordinal int) *v1.Pod { + for _, pod := range pods { + if getOrdinal(pod) == ordinal { + return pod.DeepCopy() + } + } + + return nil +} + func (om *fakeObjectManager) setPodPending(set *apps.StatefulSet, ordinal int) ([]*v1.Pod, error) { selector, err := metav1.LabelSelectorAsSelector(set.Spec.Selector) if err != nil { @@ -2308,11 +2386,10 @@ func (om *fakeObjectManager) setPodPending(set *apps.StatefulSet, ordinal int) ( if err != nil { return nil, err } - if 0 > ordinal || ordinal >= len(pods) { - return nil, fmt.Errorf("ordinal %d out of range [0,%d)", ordinal, len(pods)) + pod := findPodByOrdinal(pods, ordinal) + if pod == nil { + return nil, fmt.Errorf("setPodPending: pod ordinal %d not found", ordinal) } - sort.Sort(ascendingOrdinal(pods)) - pod := pods[ordinal].DeepCopy() pod.Status.Phase = v1.PodPending fakeResourceVersion(pod) om.podsIndexer.Update(pod) @@ -2328,11 +2405,10 @@ func (om *fakeObjectManager) setPodRunning(set *apps.StatefulSet, ordinal int) ( if err != nil { return nil, err } - if 0 > ordinal || ordinal >= len(pods) { - return nil, fmt.Errorf("ordinal %d out of range [0,%d)", ordinal, len(pods)) + pod := findPodByOrdinal(pods, ordinal) + if pod == nil { + return nil, fmt.Errorf("setPodRunning: pod ordinal %d not found", ordinal) } - sort.Sort(ascendingOrdinal(pods)) - pod := pods[ordinal].DeepCopy() pod.Status.Phase = v1.PodRunning fakeResourceVersion(pod) om.podsIndexer.Update(pod) @@ -2348,11 +2424,10 @@ func (om *fakeObjectManager) setPodReady(set *apps.StatefulSet, ordinal int) ([] if err != nil { return nil, err } - if 0 > ordinal || ordinal >= len(pods) { - return nil, fmt.Errorf("ordinal %d out of range [0,%d)", ordinal, len(pods)) + pod := findPodByOrdinal(pods, ordinal) + if pod == nil { + return nil, fmt.Errorf("setPodReady: pod ordinal %d not found", ordinal) } - sort.Sort(ascendingOrdinal(pods)) - pod := pods[ordinal].DeepCopy() condition := v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue} podutil.UpdatePodCondition(&pod.Status, &condition) fakeResourceVersion(pod) @@ -2369,11 +2444,10 @@ func (om *fakeObjectManager) setPodAvailable(set *apps.StatefulSet, ordinal int, if err != nil { return nil, err } - if 0 > ordinal || ordinal >= len(pods) { - return nil, fmt.Errorf("ordinal %d out of range [0,%d)", ordinal, len(pods)) + pod := findPodByOrdinal(pods, ordinal) + if pod == nil { + return nil, fmt.Errorf("setPodAvailable: pod ordinal %d not found", ordinal) } - sort.Sort(ascendingOrdinal(pods)) - pod := pods[ordinal].DeepCopy() condition := v1.PodCondition{Type: v1.PodReady, Status: v1.ConditionTrue, LastTransitionTime: metav1.Time{Time: lastTransitionTime}} _, existingCondition := podutil.GetPodCondition(&pod.Status, condition.Type) if existingCondition != nil { @@ -2467,28 +2541,28 @@ func assertMonotonicInvariants(set *apps.StatefulSet, om *fakeObjectManager) err return err } sort.Sort(ascendingOrdinal(pods)) - for ord := 0; ord < len(pods); ord++ { - if ord > 0 && isRunningAndReady(pods[ord]) && !isRunningAndReady(pods[ord-1]) { - return fmt.Errorf("successor %s is Running and Ready while %s is not", pods[ord].Name, pods[ord-1].Name) + for idx := 0; idx < len(pods); idx++ { + if idx > 0 && isRunningAndReady(pods[idx]) && !isRunningAndReady(pods[idx-1]) { + return fmt.Errorf("successor %s is Running and Ready while %s is not", pods[idx].Name, pods[idx-1].Name) } - if getOrdinal(pods[ord]) != ord { - return fmt.Errorf("pods %s deployed in the wrong order %d", pods[ord].Name, ord) + if ord := idx + getStartOrdinal(set); getOrdinal(pods[idx]) != ord { + return fmt.Errorf("pods %s deployed in the wrong order %d", pods[idx].Name, ord) } - if !storageMatches(set, pods[ord]) { - return fmt.Errorf("pods %s does not match the storage specification of StatefulSet %s ", pods[ord].Name, set.Name) + if !storageMatches(set, pods[idx]) { + return fmt.Errorf("pods %s does not match the storage specification of StatefulSet %s ", pods[idx].Name, set.Name) } - for _, claim := range getPersistentVolumeClaims(set, pods[ord]) { + for _, claim := range getPersistentVolumeClaims(set, pods[idx]) { claim, _ := om.claimsLister.PersistentVolumeClaims(set.Namespace).Get(claim.Name) - if err := checkClaimInvarients(set, pods[ord], claim, ord); err != nil { + if err := checkClaimInvarients(set, pods[idx], claim); err != nil { return err } } - if !identityMatches(set, pods[ord]) { - return fmt.Errorf("pods %s does not match the identity specification of StatefulSet %s ", pods[ord].Name, set.Name) + if !identityMatches(set, pods[idx]) { + return fmt.Errorf("pods %s does not match the identity specification of StatefulSet %s ", pods[idx].Name, set.Name) } } return nil @@ -2504,24 +2578,24 @@ func assertBurstInvariants(set *apps.StatefulSet, om *fakeObjectManager) error { return err } sort.Sort(ascendingOrdinal(pods)) - for ord := 0; ord < len(pods); ord++ { - if !storageMatches(set, pods[ord]) { - return fmt.Errorf("pods %s does not match the storage specification of StatefulSet %s ", pods[ord].Name, set.Name) + for _, pod := range pods { + if !storageMatches(set, pod) { + return fmt.Errorf("pods %s does not match the storage specification of StatefulSet %s ", pod.Name, set.Name) } - for _, claim := range getPersistentVolumeClaims(set, pods[ord]) { + for _, claim := range getPersistentVolumeClaims(set, pod) { claim, err := om.claimsLister.PersistentVolumeClaims(set.Namespace).Get(claim.Name) if err != nil { return err } - if err := checkClaimInvarients(set, pods[ord], claim, ord); err != nil { + if err := checkClaimInvarients(set, pod, claim); err != nil { return err } } - if !identityMatches(set, pods[ord]) { + if !identityMatches(set, pod) { return fmt.Errorf("pods %s does not match the identity specification of StatefulSet %s ", - pods[ord].Name, + pod.Name, set.Name) } } @@ -2538,24 +2612,24 @@ func assertUpdateInvariants(set *apps.StatefulSet, om *fakeObjectManager) error return err } sort.Sort(ascendingOrdinal(pods)) - for ord := 0; ord < len(pods); ord++ { + for _, pod := range pods { - if !storageMatches(set, pods[ord]) { - return fmt.Errorf("pod %s does not match the storage specification of StatefulSet %s ", pods[ord].Name, set.Name) + if !storageMatches(set, pod) { + return fmt.Errorf("pod %s does not match the storage specification of StatefulSet %s ", pod.Name, set.Name) } - for _, claim := range getPersistentVolumeClaims(set, pods[ord]) { + for _, claim := range getPersistentVolumeClaims(set, pod) { claim, err := om.claimsLister.PersistentVolumeClaims(set.Namespace).Get(claim.Name) if err != nil { return err } - if err := checkClaimInvarients(set, pods[ord], claim, ord); err != nil { + if err := checkClaimInvarients(set, pod, claim); err != nil { return err } } - if !identityMatches(set, pods[ord]) { - return fmt.Errorf("pod %s does not match the identity specification of StatefulSet %s ", pods[ord].Name, set.Name) + if !identityMatches(set, pod) { + return fmt.Errorf("pod %s does not match the identity specification of StatefulSet %s ", pod.Name, set.Name) } } if set.Spec.UpdateStrategy.Type == apps.OnDeleteStatefulSetStrategyType { @@ -2576,7 +2650,7 @@ func assertUpdateInvariants(set *apps.StatefulSet, om *fakeObjectManager) error return nil } -func checkClaimInvarients(set *apps.StatefulSet, pod *v1.Pod, claim *v1.PersistentVolumeClaim, ordinal int) error { +func checkClaimInvarients(set *apps.StatefulSet, pod *v1.Pod, claim *v1.PersistentVolumeClaim) error { policy := apps.StatefulSetPersistentVolumeClaimRetentionPolicy{ WhenScaled: apps.RetainPersistentVolumeClaimRetentionPolicyType, WhenDeleted: apps.RetainPersistentVolumeClaimRetentionPolicyType, @@ -2618,14 +2692,14 @@ func checkClaimInvarients(set *apps.StatefulSet, pod *v1.Pod, claim *v1.Persiste if hasOwnerRef(claim, set) { return fmt.Errorf("claim %s has unexpected owner ref on %s for scaledown only", claim.Name, set.Name) } - if ordinal >= int(*set.Spec.Replicas) && !hasOwnerRef(claim, pod) { + if !podInOrdinalRange(pod, set) && !hasOwnerRef(claim, pod) { return fmt.Errorf("claim %s does not have owner ref on condemned pod %s for scaledown delete", claim.Name, pod.Name) } - if ordinal < int(*set.Spec.Replicas) && hasOwnerRef(claim, pod) { - return fmt.Errorf("claim %s has unexpected owner ref on condemned pod %s for scaledown delete", claim.Name, pod.Name) + if podInOrdinalRange(pod, set) && hasOwnerRef(claim, pod) { + return fmt.Errorf("claim %s has unexpected owner ref on condemned pod %s for scaledown delete. ordinal: %d, [%d,%d]", claim.Name, pod.Name, getOrdinal(pod), getStartOrdinal(set), getEndOrdinal(set)) } case policy.WhenScaled == delete && policy.WhenDeleted == delete: - if ordinal >= int(*set.Spec.Replicas) { + if !podInOrdinalRange(pod, set) { if !hasOwnerRef(claim, pod) || hasOwnerRef(claim, set) { return fmt.Errorf("condemned claim %s has bad owner refs: %v", claim.Name, claim.GetOwnerReferences()) } @@ -2666,9 +2740,9 @@ func scaleUpStatefulSetControl(set *apps.StatefulSet, sort.Sort(ascendingOrdinal(pods)) // ensure all pods are valid (have a phase) - for ord, pod := range pods { + for _, pod := range pods { if pod.Status.Phase == "" { - if pods, err = om.setPodPending(set, ord); err != nil { + if pods, err = om.setPodPending(set, getOrdinal(pod)); err != nil { return err } break @@ -2677,15 +2751,15 @@ func scaleUpStatefulSetControl(set *apps.StatefulSet, // select one of the pods and move it forward in status if len(pods) > 0 { - ord := int(rand.Int63n(int64(len(pods)))) - pod := pods[ord] + idx := int(rand.Int63n(int64(len(pods)))) + pod := pods[idx] switch pod.Status.Phase { case v1.PodPending: - if pods, err = om.setPodRunning(set, ord); err != nil { + if pods, err = om.setPodRunning(set, getOrdinal(pod)); err != nil { return err } case v1.PodRunning: - if pods, err = om.setPodReady(set, ord); err != nil { + if pods, err = om.setPodReady(set, getOrdinal(pod)); err != nil { return err } default: @@ -2720,7 +2794,7 @@ func scaleDownStatefulSetControl(set *apps.StatefulSet, ssc StatefulSetControlIn return err } sort.Sort(ascendingOrdinal(pods)) - if ordinal := len(pods) - 1; ordinal >= 0 { + if idx := len(pods) - 1; idx >= 0 { if _, err := ssc.UpdateStatefulSet(context.TODO(), set, pods); err != nil { return err } @@ -2728,7 +2802,7 @@ func scaleDownStatefulSetControl(set *apps.StatefulSet, ssc StatefulSetControlIn if err != nil { return err } - if pods, err = om.addTerminatingPod(set, ordinal); err != nil { + if pods, err = om.addTerminatingPod(set, getOrdinal(pods[idx])); err != nil { return err } if _, err = ssc.UpdateStatefulSet(context.TODO(), set, pods); err != nil { @@ -2860,9 +2934,9 @@ func updateStatefulSetControl(set *apps.StatefulSet, } sort.Sort(ascendingOrdinal(pods)) initialized := false - for ord, pod := range pods { + for _, pod := range pods { if pod.Status.Phase == "" { - if pods, err = om.setPodPending(set, ord); err != nil { + if pods, err = om.setPodPending(set, getOrdinal(pod)); err != nil { return err } break @@ -2873,15 +2947,15 @@ func updateStatefulSetControl(set *apps.StatefulSet, } if len(pods) > 0 { - ord := int(rand.Int63n(int64(len(pods)))) - pod := pods[ord] + idx := int(rand.Int63n(int64(len(pods)))) + pod := pods[idx] switch pod.Status.Phase { case v1.PodPending: - if pods, err = om.setPodRunning(set, ord); err != nil { + if pods, err = om.setPodRunning(set, getOrdinal(pod)); err != nil { return err } case v1.PodRunning: - if pods, err = om.setPodReady(set, ord); err != nil { + if pods, err = om.setPodReady(set, getOrdinal(pod)); err != nil { return err } default: diff --git a/pkg/controller/statefulset/stateful_set_utils.go b/pkg/controller/statefulset/stateful_set_utils.go index 42f0e5ff7c6..10ca3aa9ce9 100644 --- a/pkg/controller/statefulset/stateful_set_utils.go +++ b/pkg/controller/statefulset/stateful_set_utils.go @@ -29,11 +29,13 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/intstr" "k8s.io/apimachinery/pkg/util/strategicpatch" + utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/client-go/kubernetes/scheme" "k8s.io/klog/v2" podutil "k8s.io/kubernetes/pkg/api/v1/pod" "k8s.io/kubernetes/pkg/controller" "k8s.io/kubernetes/pkg/controller/history" + "k8s.io/kubernetes/pkg/features" ) var patchCodec = scheme.Codecs.LegacyCodec(apps.SchemeGroupVersion) @@ -85,6 +87,29 @@ func getOrdinal(pod *v1.Pod) int { return ordinal } +// getStartOrdinal gets the first possible ordinal (inclusive). +// Returns spec.ordinals.start if spec.ordinals is set, otherwise returns 0. +func getStartOrdinal(set *apps.StatefulSet) int { + if utilfeature.DefaultFeatureGate.Enabled(features.StatefulSetSlice) { + if set.Spec.Ordinals != nil { + return int(set.Spec.Ordinals.Start) + } + } + return 0 +} + +// getEndOrdinal gets the last possible ordinal (inclusive). +func getEndOrdinal(set *apps.StatefulSet) int { + return getStartOrdinal(set) + int(*set.Spec.Replicas) - 1 +} + +// podInOrdinalRange returns true if the pod ordinal is within the allowed +// range of ordinals that this StatefulSet is set to control. +func podInOrdinalRange(pod *v1.Pod, set *apps.StatefulSet) bool { + ordinal := getOrdinal(pod) + return ordinal >= getStartOrdinal(set) && ordinal <= getEndOrdinal(set) +} + // getPodName gets the name of set's child Pod with an ordinal index of ordinal func getPodName(set *apps.StatefulSet, ordinal int) string { return fmt.Sprintf("%s-%d", set.Name, ordinal) @@ -170,12 +195,12 @@ func claimOwnerMatchesSetAndPod(claim *v1.PersistentVolumeClaim, set *apps.State if hasOwnerRef(claim, set) { return false } - podScaledDown := getOrdinal(pod) >= int(*set.Spec.Replicas) + podScaledDown := !podInOrdinalRange(pod, set) if podScaledDown != hasOwnerRef(claim, pod) { return false } case policy.WhenScaled == delete && policy.WhenDeleted == delete: - podScaledDown := getOrdinal(pod) >= int(*set.Spec.Replicas) + podScaledDown := !podInOrdinalRange(pod, set) // If a pod is scaled down, there should be no set ref and a pod ref; // if the pod is not scaled down it's the other way around. if podScaledDown == hasOwnerRef(claim, set) { @@ -226,7 +251,7 @@ func updateClaimOwnerRefForSetAndPod(claim *v1.PersistentVolumeClaim, set *apps. needsUpdate = removeOwnerRef(claim, pod) || needsUpdate case policy.WhenScaled == delete && policy.WhenDeleted == retain: needsUpdate = removeOwnerRef(claim, set) || needsUpdate - podScaledDown := getOrdinal(pod) >= int(*set.Spec.Replicas) + podScaledDown := !podInOrdinalRange(pod, set) if podScaledDown { needsUpdate = setOwnerRef(claim, pod, &podMeta) || needsUpdate } @@ -234,7 +259,7 @@ func updateClaimOwnerRefForSetAndPod(claim *v1.PersistentVolumeClaim, set *apps. needsUpdate = removeOwnerRef(claim, pod) || needsUpdate } case policy.WhenScaled == delete && policy.WhenDeleted == delete: - podScaledDown := getOrdinal(pod) >= int(*set.Spec.Replicas) + podScaledDown := !podInOrdinalRange(pod, set) if podScaledDown { needsUpdate = removeOwnerRef(claim, set) || needsUpdate needsUpdate = setOwnerRef(claim, pod, &podMeta) || needsUpdate @@ -440,8 +465,8 @@ func newStatefulSetPod(set *apps.StatefulSet, ordinal int) *v1.Pod { // returned error is nil, the returned Pod is valid. func newVersionedStatefulSetPod(currentSet, updateSet *apps.StatefulSet, currentRevision, updateRevision string, ordinal int) *v1.Pod { if currentSet.Spec.UpdateStrategy.Type == apps.RollingUpdateStatefulSetStrategyType && - (currentSet.Spec.UpdateStrategy.RollingUpdate == nil && ordinal < int(currentSet.Status.CurrentReplicas)) || - (currentSet.Spec.UpdateStrategy.RollingUpdate != nil && ordinal < int(*currentSet.Spec.UpdateStrategy.RollingUpdate.Partition)) { + (currentSet.Spec.UpdateStrategy.RollingUpdate == nil && ordinal < (getStartOrdinal(currentSet)+int(currentSet.Status.CurrentReplicas))) || + (currentSet.Spec.UpdateStrategy.RollingUpdate != nil && ordinal < (getStartOrdinal(currentSet)+int(*currentSet.Spec.UpdateStrategy.RollingUpdate.Partition))) { pod := newStatefulSetPod(currentSet, ordinal) setPodRevision(pod, currentRevision) return pod diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index 07a213a1812..c08296e6026 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -766,6 +766,12 @@ const ( // StatefulSetMinReadySeconds allows minReadySeconds to be respected by StatefulSet controller StatefulSetMinReadySeconds featuregate.Feature = "StatefulSetMinReadySeconds" + // owner: @psch + // alpha: v1.26 + // + // Enables a StatefulSet to start from an arbitrary non zero ordinal + StatefulSetSlice featuregate.Feature = "StatefulSetSlice" + // owner: @robscott // kep: https://kep.k8s.io/2433 // alpha: v1.21 @@ -1075,6 +1081,8 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS StatefulSetMinReadySeconds: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.27 + StatefulSetSlice: {Default: false, PreRelease: featuregate.Alpha}, + TopologyAwareHints: {Default: true, PreRelease: featuregate.Beta}, TopologyManager: {Default: true, PreRelease: featuregate.Beta}, diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index de89e58a0b9..4ee81ddc4bd 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -100,6 +100,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/apps/v1.StatefulSet": schema_k8sio_api_apps_v1_StatefulSet(ref), "k8s.io/api/apps/v1.StatefulSetCondition": schema_k8sio_api_apps_v1_StatefulSetCondition(ref), "k8s.io/api/apps/v1.StatefulSetList": schema_k8sio_api_apps_v1_StatefulSetList(ref), + "k8s.io/api/apps/v1.StatefulSetOrdinals": schema_k8sio_api_apps_v1_StatefulSetOrdinals(ref), "k8s.io/api/apps/v1.StatefulSetPersistentVolumeClaimRetentionPolicy": schema_k8sio_api_apps_v1_StatefulSetPersistentVolumeClaimRetentionPolicy(ref), "k8s.io/api/apps/v1.StatefulSetSpec": schema_k8sio_api_apps_v1_StatefulSetSpec(ref), "k8s.io/api/apps/v1.StatefulSetStatus": schema_k8sio_api_apps_v1_StatefulSetStatus(ref), @@ -122,6 +123,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/apps/v1beta1.StatefulSet": schema_k8sio_api_apps_v1beta1_StatefulSet(ref), "k8s.io/api/apps/v1beta1.StatefulSetCondition": schema_k8sio_api_apps_v1beta1_StatefulSetCondition(ref), "k8s.io/api/apps/v1beta1.StatefulSetList": schema_k8sio_api_apps_v1beta1_StatefulSetList(ref), + "k8s.io/api/apps/v1beta1.StatefulSetOrdinals": schema_k8sio_api_apps_v1beta1_StatefulSetOrdinals(ref), "k8s.io/api/apps/v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy": schema_k8sio_api_apps_v1beta1_StatefulSetPersistentVolumeClaimRetentionPolicy(ref), "k8s.io/api/apps/v1beta1.StatefulSetSpec": schema_k8sio_api_apps_v1beta1_StatefulSetSpec(ref), "k8s.io/api/apps/v1beta1.StatefulSetStatus": schema_k8sio_api_apps_v1beta1_StatefulSetStatus(ref), @@ -154,6 +156,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "k8s.io/api/apps/v1beta2.StatefulSet": schema_k8sio_api_apps_v1beta2_StatefulSet(ref), "k8s.io/api/apps/v1beta2.StatefulSetCondition": schema_k8sio_api_apps_v1beta2_StatefulSetCondition(ref), "k8s.io/api/apps/v1beta2.StatefulSetList": schema_k8sio_api_apps_v1beta2_StatefulSetList(ref), + "k8s.io/api/apps/v1beta2.StatefulSetOrdinals": schema_k8sio_api_apps_v1beta2_StatefulSetOrdinals(ref), "k8s.io/api/apps/v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy": schema_k8sio_api_apps_v1beta2_StatefulSetPersistentVolumeClaimRetentionPolicy(ref), "k8s.io/api/apps/v1beta2.StatefulSetSpec": schema_k8sio_api_apps_v1beta2_StatefulSetSpec(ref), "k8s.io/api/apps/v1beta2.StatefulSetStatus": schema_k8sio_api_apps_v1beta2_StatefulSetStatus(ref), @@ -4857,6 +4860,27 @@ func schema_k8sio_api_apps_v1_StatefulSetList(ref common.ReferenceCallback) comm } } +func schema_k8sio_api_apps_v1_StatefulSetOrdinals(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "start": { + SchemaProps: spec.SchemaProps{ + Description: "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_k8sio_api_apps_v1_StatefulSetPersistentVolumeClaimRetentionPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -4967,12 +4991,18 @@ func schema_k8sio_api_apps_v1_StatefulSetSpec(ref common.ReferenceCallback) comm Ref: ref("k8s.io/api/apps/v1.StatefulSetPersistentVolumeClaimRetentionPolicy"), }, }, + "ordinals": { + SchemaProps: spec.SchemaProps{ + Description: "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", + Ref: ref("k8s.io/api/apps/v1.StatefulSetOrdinals"), + }, + }, }, Required: []string{"selector", "template", "serviceName"}, }, }, Dependencies: []string{ - "k8s.io/api/apps/v1.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, + "k8s.io/api/apps/v1.StatefulSetOrdinals", "k8s.io/api/apps/v1.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, } } @@ -5965,6 +5995,27 @@ func schema_k8sio_api_apps_v1beta1_StatefulSetList(ref common.ReferenceCallback) } } +func schema_k8sio_api_apps_v1beta1_StatefulSetOrdinals(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "start": { + SchemaProps: spec.SchemaProps{ + Description: "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_k8sio_api_apps_v1beta1_StatefulSetPersistentVolumeClaimRetentionPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -6075,12 +6126,18 @@ func schema_k8sio_api_apps_v1beta1_StatefulSetSpec(ref common.ReferenceCallback) Ref: ref("k8s.io/api/apps/v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy"), }, }, + "ordinals": { + SchemaProps: spec.SchemaProps{ + Description: "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", + Ref: ref("k8s.io/api/apps/v1beta1.StatefulSetOrdinals"), + }, + }, }, Required: []string{"template", "serviceName"}, }, }, Dependencies: []string{ - "k8s.io/api/apps/v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1beta1.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, + "k8s.io/api/apps/v1beta1.StatefulSetOrdinals", "k8s.io/api/apps/v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1beta1.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, } } @@ -7622,6 +7679,27 @@ func schema_k8sio_api_apps_v1beta2_StatefulSetList(ref common.ReferenceCallback) } } +func schema_k8sio_api_apps_v1beta2_StatefulSetOrdinals(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "start": { + SchemaProps: spec.SchemaProps{ + Description: "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", + Default: 0, + Type: []string{"integer"}, + Format: "int32", + }, + }, + }, + }, + }, + } +} + func schema_k8sio_api_apps_v1beta2_StatefulSetPersistentVolumeClaimRetentionPolicy(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -7732,12 +7810,18 @@ func schema_k8sio_api_apps_v1beta2_StatefulSetSpec(ref common.ReferenceCallback) Ref: ref("k8s.io/api/apps/v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy"), }, }, + "ordinals": { + SchemaProps: spec.SchemaProps{ + Description: "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", + Ref: ref("k8s.io/api/apps/v1beta2.StatefulSetOrdinals"), + }, + }, }, Required: []string{"selector", "template", "serviceName"}, }, }, Dependencies: []string{ - "k8s.io/api/apps/v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1beta2.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, + "k8s.io/api/apps/v1beta2.StatefulSetOrdinals", "k8s.io/api/apps/v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy", "k8s.io/api/apps/v1beta2.StatefulSetUpdateStrategy", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodTemplateSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.LabelSelector"}, } } diff --git a/pkg/registry/apps/statefulset/strategy.go b/pkg/registry/apps/statefulset/strategy.go index 7b63faa7513..1ebcf629e41 100644 --- a/pkg/registry/apps/statefulset/strategy.go +++ b/pkg/registry/apps/statefulset/strategy.go @@ -128,6 +128,10 @@ func dropStatefulSetDisabledFields(newSS *apps.StatefulSet, oldSS *apps.Stateful newSS.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable = nil } } + if !utilfeature.DefaultFeatureGate.Enabled(features.StatefulSetSlice) { + // Reset Spec.Ordinals to the default value (nil). + newSS.Spec.Ordinals = nil + } } // Validate validates a new StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1/generated.pb.go b/staging/src/k8s.io/api/apps/v1/generated.pb.go index ee10998d52c..3da63d229bf 100644 --- a/staging/src/k8s.io/api/apps/v1/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1/generated.pb.go @@ -748,12 +748,40 @@ func (m *StatefulSetList) XXX_DiscardUnknown() { var xxx_messageInfo_StatefulSetList proto.InternalMessageInfo +func (m *StatefulSetOrdinals) Reset() { *m = StatefulSetOrdinals{} } +func (*StatefulSetOrdinals) ProtoMessage() {} +func (*StatefulSetOrdinals) Descriptor() ([]byte, []int) { + return fileDescriptor_e1014cab6f31e43b, []int{25} +} +func (m *StatefulSetOrdinals) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StatefulSetOrdinals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *StatefulSetOrdinals) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatefulSetOrdinals.Merge(m, src) +} +func (m *StatefulSetOrdinals) XXX_Size() int { + return m.Size() +} +func (m *StatefulSetOrdinals) XXX_DiscardUnknown() { + xxx_messageInfo_StatefulSetOrdinals.DiscardUnknown(m) +} + +var xxx_messageInfo_StatefulSetOrdinals proto.InternalMessageInfo + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Reset() { *m = StatefulSetPersistentVolumeClaimRetentionPolicy{} } func (*StatefulSetPersistentVolumeClaimRetentionPolicy) ProtoMessage() {} func (*StatefulSetPersistentVolumeClaimRetentionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_e1014cab6f31e43b, []int{25} + return fileDescriptor_e1014cab6f31e43b, []int{26} } func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -781,7 +809,7 @@ var xxx_messageInfo_StatefulSetPersistentVolumeClaimRetentionPolicy proto.Intern func (m *StatefulSetSpec) Reset() { *m = StatefulSetSpec{} } func (*StatefulSetSpec) ProtoMessage() {} func (*StatefulSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_e1014cab6f31e43b, []int{26} + return fileDescriptor_e1014cab6f31e43b, []int{27} } func (m *StatefulSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -809,7 +837,7 @@ var xxx_messageInfo_StatefulSetSpec proto.InternalMessageInfo func (m *StatefulSetStatus) Reset() { *m = StatefulSetStatus{} } func (*StatefulSetStatus) ProtoMessage() {} func (*StatefulSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_e1014cab6f31e43b, []int{27} + return fileDescriptor_e1014cab6f31e43b, []int{28} } func (m *StatefulSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -837,7 +865,7 @@ var xxx_messageInfo_StatefulSetStatus proto.InternalMessageInfo func (m *StatefulSetUpdateStrategy) Reset() { *m = StatefulSetUpdateStrategy{} } func (*StatefulSetUpdateStrategy) ProtoMessage() {} func (*StatefulSetUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_e1014cab6f31e43b, []int{28} + return fileDescriptor_e1014cab6f31e43b, []int{29} } func (m *StatefulSetUpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -888,6 +916,7 @@ func init() { proto.RegisterType((*StatefulSet)(nil), "k8s.io.api.apps.v1.StatefulSet") proto.RegisterType((*StatefulSetCondition)(nil), "k8s.io.api.apps.v1.StatefulSetCondition") proto.RegisterType((*StatefulSetList)(nil), "k8s.io.api.apps.v1.StatefulSetList") + proto.RegisterType((*StatefulSetOrdinals)(nil), "k8s.io.api.apps.v1.StatefulSetOrdinals") proto.RegisterType((*StatefulSetPersistentVolumeClaimRetentionPolicy)(nil), "k8s.io.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy") proto.RegisterType((*StatefulSetSpec)(nil), "k8s.io.api.apps.v1.StatefulSetSpec") proto.RegisterType((*StatefulSetStatus)(nil), "k8s.io.api.apps.v1.StatefulSetStatus") @@ -899,142 +928,146 @@ func init() { } var fileDescriptor_e1014cab6f31e43b = []byte{ - // 2160 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0x1c, 0xb7, - 0x15, 0xd7, 0xec, 0x87, 0xb4, 0xa2, 0x2c, 0xc9, 0xa6, 0x54, 0x69, 0x63, 0x37, 0xbb, 0xee, 0xd6, - 0x75, 0x94, 0x38, 0xde, 0xad, 0x1d, 0x27, 0x08, 0xe2, 0x22, 0x81, 0x66, 0x95, 0xa6, 0x69, 0x24, - 0x59, 0xa5, 0x2c, 0x07, 0x70, 0xd3, 0xa2, 0xd4, 0x2c, 0xbd, 0x9a, 0x68, 0xbe, 0x30, 0xc3, 0x51, - 0x2c, 0xf4, 0x52, 0x14, 0xe8, 0xad, 0x87, 0xfe, 0x27, 0x45, 0x51, 0x34, 0xb7, 0x20, 0x08, 0x7a, - 0xf1, 0xa5, 0x68, 0xd0, 0x4b, 0x73, 0x5a, 0xd4, 0x9b, 0x53, 0x51, 0xf4, 0xd6, 0x5e, 0x7c, 0x69, - 0x41, 0x0e, 0xe7, 0x9b, 0xa3, 0x5d, 0xc9, 0xb1, 0xf2, 0x01, 0xdf, 0xb4, 0xe4, 0xef, 0xfd, 0xf8, - 0x48, 0xbe, 0xc7, 0xf7, 0x23, 0x47, 0xe0, 0xe6, 0xfe, 0xab, 0x5e, 0x5b, 0xb7, 0x3b, 0xfb, 0xfe, - 0x2e, 0x71, 0x2d, 0x42, 0x89, 0xd7, 0x39, 0x20, 0x56, 0xcf, 0x76, 0x3b, 0xa2, 0x03, 0x3b, 0x7a, - 0x07, 0x3b, 0x8e, 0xd7, 0x39, 0xb8, 0xd6, 0xe9, 0x13, 0x8b, 0xb8, 0x98, 0x92, 0x5e, 0xdb, 0x71, - 0x6d, 0x6a, 0x43, 0x18, 0x60, 0xda, 0xd8, 0xd1, 0xdb, 0x0c, 0xd3, 0x3e, 0xb8, 0x76, 0xfe, 0x6a, - 0x5f, 0xa7, 0x7b, 0xfe, 0x6e, 0x5b, 0xb3, 0xcd, 0x4e, 0xdf, 0xee, 0xdb, 0x1d, 0x0e, 0xdd, 0xf5, - 0xef, 0xf1, 0x5f, 0xfc, 0x07, 0xff, 0x2b, 0xa0, 0x38, 0xdf, 0x4a, 0x0c, 0xa3, 0xd9, 0x2e, 0x91, - 0x0c, 0x73, 0xfe, 0x46, 0x8c, 0x31, 0xb1, 0xb6, 0xa7, 0x5b, 0xc4, 0x3d, 0xec, 0x38, 0xfb, 0x7d, - 0xd6, 0xe0, 0x75, 0x4c, 0x42, 0xb1, 0xcc, 0xaa, 0x53, 0x64, 0xe5, 0xfa, 0x16, 0xd5, 0x4d, 0x92, - 0x33, 0x78, 0x65, 0x94, 0x81, 0xa7, 0xed, 0x11, 0x13, 0xe7, 0xec, 0x5e, 0x2a, 0xb2, 0xf3, 0xa9, - 0x6e, 0x74, 0x74, 0x8b, 0x7a, 0xd4, 0xcd, 0x1a, 0xb5, 0xfe, 0xab, 0x00, 0xd8, 0xb5, 0x2d, 0xea, - 0xda, 0x86, 0x41, 0x5c, 0x44, 0x0e, 0x74, 0x4f, 0xb7, 0x2d, 0xf8, 0x0b, 0x50, 0x63, 0xf3, 0xe9, - 0x61, 0x8a, 0xeb, 0xca, 0x45, 0x65, 0x65, 0xe6, 0xfa, 0xf7, 0xdb, 0xf1, 0x22, 0x47, 0xf4, 0x6d, - 0x67, 0xbf, 0xcf, 0x1a, 0xbc, 0x36, 0x43, 0xb7, 0x0f, 0xae, 0xb5, 0x6f, 0xed, 0xbe, 0x4f, 0x34, - 0xba, 0x41, 0x28, 0x56, 0xe1, 0x83, 0x41, 0x73, 0x62, 0x38, 0x68, 0x82, 0xb8, 0x0d, 0x45, 0xac, - 0xf0, 0x16, 0xa8, 0x70, 0xf6, 0x12, 0x67, 0xbf, 0x5a, 0xc8, 0x2e, 0x26, 0xdd, 0x46, 0xf8, 0x83, - 0x37, 0xef, 0x53, 0x62, 0x31, 0xf7, 0xd4, 0x33, 0x82, 0xba, 0xb2, 0x86, 0x29, 0x46, 0x9c, 0x08, - 0xbe, 0x08, 0x6a, 0xae, 0x70, 0xbf, 0x5e, 0xbe, 0xa8, 0xac, 0x94, 0xd5, 0xb3, 0x02, 0x55, 0x0b, - 0xa7, 0x85, 0x22, 0x44, 0xeb, 0xcf, 0x0a, 0x58, 0xca, 0xcf, 0x7b, 0x5d, 0xf7, 0x28, 0x7c, 0x2f, - 0x37, 0xf7, 0xf6, 0x78, 0x73, 0x67, 0xd6, 0x7c, 0xe6, 0xd1, 0xc0, 0x61, 0x4b, 0x62, 0xde, 0xef, - 0x80, 0xaa, 0x4e, 0x89, 0xe9, 0xd5, 0x4b, 0x17, 0xcb, 0x2b, 0x33, 0xd7, 0x2f, 0xb7, 0xf3, 0xb1, - 0xdb, 0xce, 0x3b, 0xa6, 0xce, 0x0a, 0xca, 0xea, 0xdb, 0xcc, 0x18, 0x05, 0x1c, 0xad, 0xff, 0x29, - 0x60, 0x7a, 0x0d, 0x13, 0xd3, 0xb6, 0xb6, 0x09, 0x3d, 0x85, 0x4d, 0xeb, 0x82, 0x8a, 0xe7, 0x10, - 0x4d, 0x6c, 0xda, 0x77, 0x64, 0xbe, 0x47, 0xee, 0x6c, 0x3b, 0x44, 0x8b, 0x37, 0x8a, 0xfd, 0x42, - 0xdc, 0x18, 0xbe, 0x03, 0x26, 0x3d, 0x8a, 0xa9, 0xef, 0xf1, 0x6d, 0x9a, 0xb9, 0xfe, 0xdd, 0xa3, - 0x69, 0x38, 0x54, 0x9d, 0x13, 0x44, 0x93, 0xc1, 0x6f, 0x24, 0x28, 0x5a, 0xff, 0x2c, 0x01, 0x18, - 0x61, 0xbb, 0xb6, 0xd5, 0xd3, 0x29, 0x8b, 0xdf, 0xd7, 0x40, 0x85, 0x1e, 0x3a, 0x84, 0x2f, 0xc3, - 0xb4, 0x7a, 0x39, 0xf4, 0xe2, 0xf6, 0xa1, 0x43, 0x1e, 0x0d, 0x9a, 0x4b, 0x79, 0x0b, 0xd6, 0x83, - 0xb8, 0x0d, 0x5c, 0x8f, 0xfc, 0x2b, 0x71, 0xeb, 0x1b, 0xe9, 0xa1, 0x1f, 0x0d, 0x9a, 0x92, 0xc3, - 0xa2, 0x1d, 0x31, 0xa5, 0x1d, 0x84, 0x07, 0x00, 0x1a, 0xd8, 0xa3, 0xb7, 0x5d, 0x6c, 0x79, 0xc1, - 0x48, 0xba, 0x49, 0xc4, 0xcc, 0x5f, 0x18, 0x6f, 0x7b, 0x98, 0x85, 0x7a, 0x5e, 0x78, 0x01, 0xd7, - 0x73, 0x6c, 0x48, 0x32, 0x02, 0xbc, 0x0c, 0x26, 0x5d, 0x82, 0x3d, 0xdb, 0xaa, 0x57, 0xf8, 0x2c, - 0xa2, 0x05, 0x44, 0xbc, 0x15, 0x89, 0x5e, 0xf8, 0x3c, 0x98, 0x32, 0x89, 0xe7, 0xe1, 0x3e, 0xa9, - 0x57, 0x39, 0x70, 0x5e, 0x00, 0xa7, 0x36, 0x82, 0x66, 0x14, 0xf6, 0xb7, 0xfe, 0xa0, 0x80, 0xd9, - 0x68, 0xe5, 0x4e, 0x21, 0x55, 0xd4, 0x74, 0xaa, 0x3c, 0x7b, 0x64, 0x9c, 0x14, 0x64, 0xc8, 0xc7, - 0xe5, 0x84, 0xcf, 0x2c, 0x08, 0xe1, 0xcf, 0x40, 0xcd, 0x23, 0x06, 0xd1, 0xa8, 0xed, 0x0a, 0x9f, - 0x5f, 0x1a, 0xd3, 0x67, 0xbc, 0x4b, 0x8c, 0x6d, 0x61, 0xaa, 0x9e, 0x61, 0x4e, 0x87, 0xbf, 0x50, - 0x44, 0x09, 0x7f, 0x02, 0x6a, 0x94, 0x98, 0x8e, 0x81, 0x29, 0x11, 0x69, 0x92, 0x8a, 0x6f, 0x16, - 0x2e, 0x8c, 0x6c, 0xcb, 0xee, 0xdd, 0x16, 0x30, 0x9e, 0x28, 0xd1, 0x3a, 0x84, 0xad, 0x28, 0xa2, - 0x81, 0xfb, 0x60, 0xce, 0x77, 0x7a, 0x0c, 0x49, 0xd9, 0xd1, 0xdd, 0x3f, 0x14, 0xe1, 0x73, 0xe5, - 0xc8, 0x05, 0xd9, 0x49, 0x99, 0xa8, 0x4b, 0x62, 0x80, 0xb9, 0x74, 0x3b, 0xca, 0x50, 0xc3, 0x55, - 0x30, 0x6f, 0xea, 0x16, 0x22, 0xb8, 0x77, 0xb8, 0x4d, 0x34, 0xdb, 0xea, 0x79, 0x3c, 0x80, 0xaa, - 0xea, 0xb2, 0x20, 0x98, 0xdf, 0x48, 0x77, 0xa3, 0x2c, 0x1e, 0xae, 0x83, 0xc5, 0xf0, 0x9c, 0xfd, - 0x91, 0xee, 0x51, 0xdb, 0x3d, 0x5c, 0xd7, 0x4d, 0x9d, 0xd6, 0x27, 0x39, 0x4f, 0x7d, 0x38, 0x68, - 0x2e, 0x22, 0x49, 0x3f, 0x92, 0x5a, 0xb5, 0x7e, 0x3b, 0x09, 0xe6, 0x33, 0xa7, 0x01, 0xbc, 0x03, - 0x96, 0x34, 0xdf, 0x75, 0x89, 0x45, 0x37, 0x7d, 0x73, 0x97, 0xb8, 0xdb, 0xda, 0x1e, 0xe9, 0xf9, - 0x06, 0xe9, 0xf1, 0x1d, 0xad, 0xaa, 0x0d, 0xe1, 0xeb, 0x52, 0x57, 0x8a, 0x42, 0x05, 0xd6, 0xf0, - 0xc7, 0x00, 0x5a, 0xbc, 0x69, 0x43, 0xf7, 0xbc, 0x88, 0xb3, 0xc4, 0x39, 0xa3, 0x04, 0xdc, 0xcc, - 0x21, 0x90, 0xc4, 0x8a, 0xf9, 0xd8, 0x23, 0x9e, 0xee, 0x92, 0x5e, 0xd6, 0xc7, 0x72, 0xda, 0xc7, - 0x35, 0x29, 0x0a, 0x15, 0x58, 0xc3, 0x97, 0xc1, 0x4c, 0x30, 0x1a, 0x5f, 0x73, 0xb1, 0x39, 0x0b, - 0x82, 0x6c, 0x66, 0x33, 0xee, 0x42, 0x49, 0x1c, 0x9b, 0x9a, 0xbd, 0xeb, 0x11, 0xf7, 0x80, 0xf4, - 0xde, 0x0a, 0x34, 0x00, 0x2b, 0x94, 0x55, 0x5e, 0x28, 0xa3, 0xa9, 0xdd, 0xca, 0x21, 0x90, 0xc4, - 0x8a, 0x4d, 0x2d, 0x88, 0x9a, 0xdc, 0xd4, 0x26, 0xd3, 0x53, 0xdb, 0x91, 0xa2, 0x50, 0x81, 0x35, - 0x8b, 0xbd, 0xc0, 0xe5, 0xd5, 0x03, 0xac, 0x1b, 0x78, 0xd7, 0x20, 0xf5, 0xa9, 0x74, 0xec, 0x6d, - 0xa6, 0xbb, 0x51, 0x16, 0x0f, 0xdf, 0x02, 0xe7, 0x82, 0xa6, 0x1d, 0x0b, 0x47, 0x24, 0x35, 0x4e, - 0xf2, 0x8c, 0x20, 0x39, 0xb7, 0x99, 0x05, 0xa0, 0xbc, 0x0d, 0x7c, 0x0d, 0xcc, 0x69, 0xb6, 0x61, - 0xf0, 0x78, 0xec, 0xda, 0xbe, 0x45, 0xeb, 0xd3, 0x9c, 0x05, 0xb2, 0x1c, 0xea, 0xa6, 0x7a, 0x50, - 0x06, 0x09, 0xef, 0x02, 0xa0, 0x85, 0xe5, 0xc0, 0xab, 0x83, 0xe2, 0x42, 0x9f, 0xaf, 0x43, 0x71, - 0x01, 0x8e, 0x9a, 0x3c, 0x94, 0x60, 0x6b, 0x7d, 0xac, 0x80, 0xe5, 0x82, 0x1c, 0x87, 0x6f, 0xa4, - 0xaa, 0xde, 0x95, 0x4c, 0xd5, 0xbb, 0x50, 0x60, 0x96, 0x28, 0x7d, 0x1a, 0x98, 0x65, 0xba, 0x43, - 0xb7, 0xfa, 0x01, 0x44, 0x9c, 0x60, 0x2f, 0xc8, 0x7c, 0x47, 0x49, 0x60, 0x7c, 0x0c, 0x9f, 0x1b, - 0x0e, 0x9a, 0xb3, 0xa9, 0x3e, 0x94, 0xe6, 0x6c, 0xfd, 0xba, 0x04, 0xc0, 0x1a, 0x71, 0x0c, 0xfb, - 0xd0, 0x24, 0xd6, 0x69, 0xa8, 0x96, 0xb5, 0x94, 0x6a, 0x69, 0x49, 0x37, 0x22, 0xf2, 0xa7, 0x50, - 0xb6, 0xac, 0x67, 0x64, 0xcb, 0xa5, 0x11, 0x3c, 0x47, 0xeb, 0x96, 0xbf, 0x97, 0xc1, 0x42, 0x0c, - 0x8e, 0x85, 0xcb, 0xcd, 0xd4, 0x16, 0x3e, 0x97, 0xd9, 0xc2, 0x65, 0x89, 0xc9, 0x13, 0x53, 0x2e, - 0xef, 0x83, 0x39, 0xa6, 0x2b, 0x82, 0x5d, 0xe3, 0xaa, 0x65, 0xf2, 0xd8, 0xaa, 0x25, 0xaa, 0x3a, - 0xeb, 0x29, 0x26, 0x94, 0x61, 0x2e, 0x50, 0x49, 0x53, 0x5f, 0x47, 0x95, 0xf4, 0x47, 0x05, 0xcc, - 0xc5, 0xdb, 0x74, 0x0a, 0x32, 0xa9, 0x9b, 0x96, 0x49, 0x8d, 0xa3, 0xe3, 0xb2, 0x40, 0x27, 0xfd, - 0xad, 0x92, 0xf4, 0x9a, 0x0b, 0xa5, 0x15, 0x76, 0xa1, 0x72, 0x0c, 0x5d, 0xc3, 0x9e, 0x28, 0xab, - 0x67, 0x82, 0xcb, 0x54, 0xd0, 0x86, 0xa2, 0xde, 0x94, 0xa4, 0x2a, 0x3d, 0x59, 0x49, 0x55, 0xfe, - 0x62, 0x24, 0xd5, 0x6d, 0x50, 0xf3, 0x42, 0x31, 0x55, 0xe1, 0x94, 0x97, 0x47, 0xa5, 0xb3, 0xd0, - 0x51, 0x11, 0x6b, 0xa4, 0xa0, 0x22, 0x26, 0x99, 0x76, 0xaa, 0x7e, 0x99, 0xda, 0x89, 0x85, 0xb7, - 0x83, 0x7d, 0x8f, 0xf4, 0x78, 0x2a, 0xd5, 0xe2, 0xf0, 0xde, 0xe2, 0xad, 0x48, 0xf4, 0xc2, 0x1d, - 0xb0, 0xec, 0xb8, 0x76, 0xdf, 0x25, 0x9e, 0xb7, 0x46, 0x70, 0xcf, 0xd0, 0x2d, 0x12, 0x4e, 0x20, - 0xa8, 0x7a, 0x17, 0x86, 0x83, 0xe6, 0xf2, 0x96, 0x1c, 0x82, 0x8a, 0x6c, 0x5b, 0x1f, 0x55, 0xc0, - 0xd9, 0xec, 0x89, 0x58, 0x20, 0x44, 0x94, 0x13, 0x09, 0x91, 0x17, 0x13, 0x21, 0x1a, 0xa8, 0xb4, - 0xc4, 0x9d, 0x3f, 0x17, 0xa6, 0xab, 0x60, 0x5e, 0x08, 0x8f, 0xb0, 0x53, 0x48, 0xb1, 0x68, 0x7b, - 0x76, 0xd2, 0xdd, 0x28, 0x8b, 0x87, 0x37, 0xc1, 0xac, 0xcb, 0xb5, 0x55, 0x48, 0x10, 0xe8, 0x93, - 0x6f, 0x09, 0x82, 0x59, 0x94, 0xec, 0x44, 0x69, 0x2c, 0xd3, 0x26, 0xb1, 0xe4, 0x08, 0x09, 0x2a, - 0x69, 0x6d, 0xb2, 0x9a, 0x05, 0xa0, 0xbc, 0x0d, 0xdc, 0x00, 0x0b, 0xbe, 0x95, 0xa7, 0x0a, 0x62, - 0xed, 0x82, 0xa0, 0x5a, 0xd8, 0xc9, 0x43, 0x90, 0xcc, 0x0e, 0xfe, 0x34, 0x25, 0x57, 0x26, 0xf9, - 0x29, 0xf2, 0xdc, 0xd1, 0xe9, 0x30, 0xb6, 0x5e, 0x91, 0xe8, 0xa8, 0xda, 0xb8, 0x3a, 0xaa, 0xf5, - 0xa1, 0x02, 0x60, 0x3e, 0x05, 0x47, 0x5e, 0xee, 0x73, 0x16, 0x89, 0x12, 0xd9, 0x93, 0x2b, 0x9c, - 0x2b, 0xa3, 0x15, 0x4e, 0x7c, 0x82, 0x8e, 0x27, 0x71, 0xc4, 0xf2, 0x9e, 0xce, 0xc3, 0xcc, 0x18, - 0x12, 0x27, 0xf6, 0xe7, 0xf1, 0x24, 0x4e, 0x82, 0xe7, 0x68, 0x89, 0xf3, 0xaf, 0x12, 0x58, 0x88, - 0xc1, 0x63, 0x4b, 0x1c, 0x89, 0xc9, 0xd3, 0xc7, 0x99, 0xf1, 0x64, 0x47, 0xbc, 0x74, 0x5f, 0x11, - 0xd9, 0x11, 0x3b, 0x54, 0x20, 0x3b, 0x7e, 0x5f, 0x4a, 0x7a, 0x7d, 0x4c, 0xd9, 0xf1, 0x05, 0x3c, - 0x55, 0x7c, 0xed, 0x94, 0x4b, 0xeb, 0x93, 0x32, 0x38, 0x9b, 0x4d, 0xc1, 0x54, 0x1d, 0x54, 0x46, - 0xd6, 0xc1, 0x2d, 0xb0, 0x78, 0xcf, 0x37, 0x8c, 0x43, 0x3e, 0x87, 0x44, 0x31, 0x0c, 0x2a, 0xe8, - 0xb7, 0x85, 0xe5, 0xe2, 0x0f, 0x25, 0x18, 0x24, 0xb5, 0xcc, 0x97, 0xc5, 0xca, 0xe3, 0x96, 0xc5, - 0xea, 0x09, 0xca, 0xa2, 0x5c, 0x59, 0x94, 0x4f, 0xa4, 0x2c, 0xc6, 0xae, 0x89, 0x92, 0xe3, 0x6a, - 0xe4, 0x1d, 0x7e, 0xa8, 0x80, 0x25, 0xf9, 0xf5, 0x19, 0x1a, 0x60, 0xce, 0xc4, 0xf7, 0x93, 0x8f, - 0x17, 0xa3, 0x0a, 0x86, 0x4f, 0x75, 0xa3, 0x1d, 0x7c, 0xdd, 0x69, 0xbf, 0x6d, 0xd1, 0x5b, 0xee, - 0x36, 0x75, 0x75, 0xab, 0x1f, 0x14, 0xd8, 0x8d, 0x14, 0x17, 0xca, 0x70, 0xc3, 0xbb, 0xa0, 0x66, - 0xe2, 0xfb, 0xdb, 0xbe, 0xdb, 0x0f, 0x0b, 0xe1, 0xf1, 0xc7, 0xe1, 0xb1, 0xbf, 0x21, 0x58, 0x50, - 0xc4, 0xd7, 0xfa, 0x5c, 0x01, 0xcb, 0x05, 0x15, 0xf4, 0x1b, 0x34, 0xcb, 0x8f, 0x14, 0x70, 0x31, - 0x35, 0x4b, 0x96, 0x91, 0xe4, 0x9e, 0x6f, 0xf0, 0xe4, 0x14, 0x82, 0xe5, 0x0a, 0x98, 0x76, 0xb0, - 0x4b, 0xf5, 0x48, 0xe9, 0x56, 0xd5, 0xd9, 0xe1, 0xa0, 0x39, 0xbd, 0x15, 0x36, 0xa2, 0xb8, 0x5f, - 0xb2, 0x36, 0xa5, 0x27, 0xb7, 0x36, 0xad, 0xdf, 0x94, 0xc0, 0x4c, 0xc2, 0xe5, 0x53, 0x90, 0x2a, - 0x6f, 0xa6, 0xa4, 0x8a, 0xf4, 0xe3, 0x4f, 0x72, 0x0d, 0x8b, 0xb4, 0xca, 0x46, 0x46, 0xab, 0x7c, - 0x6f, 0x14, 0xd1, 0xd1, 0x62, 0xe5, 0xdf, 0x25, 0xb0, 0x98, 0x40, 0xc7, 0x6a, 0xe5, 0x07, 0x29, - 0xb5, 0xb2, 0x92, 0x51, 0x2b, 0x75, 0x99, 0xcd, 0x53, 0xb9, 0x32, 0x5a, 0xae, 0xfc, 0x49, 0x01, - 0xf3, 0x89, 0xb5, 0x3b, 0x05, 0xbd, 0xb2, 0x96, 0xd6, 0x2b, 0xcd, 0x11, 0xf1, 0x52, 0x20, 0x58, - 0xfe, 0xa3, 0x80, 0x4e, 0x02, 0xb5, 0x45, 0x5c, 0x4f, 0xf7, 0x28, 0xb1, 0xe8, 0x1d, 0xdb, 0xf0, - 0x4d, 0xd2, 0x35, 0xb0, 0x6e, 0x22, 0xc2, 0x1a, 0x74, 0xdb, 0xda, 0xb2, 0x0d, 0x5d, 0x3b, 0x84, - 0x18, 0xcc, 0x7c, 0xb0, 0x47, 0xac, 0x35, 0x62, 0x10, 0x2a, 0x3e, 0x51, 0x4c, 0xab, 0x6f, 0x84, - 0x2f, 0xf6, 0xef, 0xc6, 0x5d, 0x8f, 0x06, 0xcd, 0x95, 0x71, 0x18, 0x79, 0x80, 0x25, 0x39, 0xe1, - 0xcf, 0x01, 0x60, 0x3f, 0xb7, 0x35, 0x1c, 0x7e, 0xb0, 0x98, 0x56, 0x5f, 0x0f, 0xd3, 0xf0, 0xdd, - 0xa8, 0xe7, 0x58, 0x03, 0x24, 0x18, 0x5b, 0x7f, 0x9d, 0x4a, 0x6d, 0xd7, 0x37, 0xfe, 0x7d, 0xe8, - 0x97, 0x60, 0xf1, 0x20, 0x5e, 0x9d, 0x10, 0xc0, 0x74, 0x0d, 0x8b, 0x9d, 0xe7, 0xa5, 0xf4, 0xb2, - 0x75, 0x8d, 0xd5, 0xd4, 0x1d, 0x09, 0x1d, 0x92, 0x0e, 0x02, 0x5f, 0x06, 0x33, 0x4c, 0x8f, 0xe8, - 0x1a, 0xd9, 0xc4, 0x66, 0x98, 0x4a, 0xd1, 0x17, 0x9e, 0xed, 0xb8, 0x0b, 0x25, 0x71, 0x70, 0x0f, - 0x2c, 0x38, 0x76, 0x6f, 0x03, 0x5b, 0xb8, 0x4f, 0x58, 0x95, 0x0d, 0xb6, 0x92, 0xbf, 0x1c, 0x4d, - 0xab, 0xaf, 0x84, 0xaf, 0x02, 0x5b, 0x79, 0x08, 0xbb, 0x75, 0x49, 0x9a, 0x79, 0x10, 0xc8, 0x28, - 0xa1, 0x99, 0xfb, 0x20, 0x39, 0x95, 0xfb, 0x2f, 0x0e, 0x59, 0x4e, 0x9d, 0xf0, 0x93, 0x64, 0xd1, - 0x9b, 0x58, 0xed, 0x44, 0x6f, 0x62, 0x92, 0x5b, 0xc3, 0xf4, 0x31, 0x6f, 0x0d, 0x9f, 0x28, 0xe0, - 0x92, 0x33, 0x46, 0x1a, 0xd5, 0x01, 0x5f, 0x96, 0xee, 0x88, 0x65, 0x19, 0x27, 0x23, 0xd5, 0x95, - 0xe1, 0xa0, 0x79, 0x69, 0x1c, 0x24, 0x1a, 0xcb, 0xb5, 0xd6, 0x87, 0x55, 0x70, 0x2e, 0x57, 0x1e, - 0xbf, 0xc4, 0xc7, 0xb9, 0xdc, 0x15, 0xa2, 0x7c, 0x8c, 0x2b, 0xc4, 0x2a, 0x98, 0x17, 0x5f, 0x74, - 0x33, 0x37, 0x90, 0x68, 0x4f, 0xbb, 0xe9, 0x6e, 0x94, 0xc5, 0xcb, 0x1e, 0x07, 0xab, 0xc7, 0x7c, - 0x1c, 0x4c, 0x7a, 0x21, 0xfe, 0x11, 0x29, 0x48, 0xbe, 0xbc, 0x17, 0xe2, 0xff, 0x91, 0xb2, 0x78, - 0xf8, 0x7a, 0x98, 0x59, 0x11, 0xc3, 0x14, 0x67, 0xc8, 0xa4, 0x4a, 0x44, 0x90, 0x41, 0x3f, 0xd6, - 0x57, 0xcb, 0xf7, 0x24, 0x5f, 0x2d, 0x57, 0x46, 0x84, 0xee, 0xf8, 0xef, 0x80, 0xd2, 0x5b, 0xde, - 0xcc, 0xf1, 0x6f, 0x79, 0xad, 0xbf, 0x28, 0xe0, 0x99, 0xc2, 0x33, 0x05, 0xae, 0xa6, 0xe4, 0xda, - 0xd5, 0x8c, 0x5c, 0x7b, 0xb6, 0xd0, 0x30, 0xa1, 0xd9, 0x4c, 0xf9, 0x13, 0xe1, 0x8d, 0x91, 0x4f, - 0x84, 0x12, 0xe9, 0x3f, 0xfa, 0xad, 0x50, 0x7d, 0xf5, 0xc1, 0xc3, 0xc6, 0xc4, 0xa7, 0x0f, 0x1b, - 0x13, 0x9f, 0x3d, 0x6c, 0x4c, 0xfc, 0x6a, 0xd8, 0x50, 0x1e, 0x0c, 0x1b, 0xca, 0xa7, 0xc3, 0x86, - 0xf2, 0xd9, 0xb0, 0xa1, 0xfc, 0x63, 0xd8, 0x50, 0x7e, 0xf7, 0x79, 0x63, 0xe2, 0x2e, 0xcc, 0xff, - 0x1b, 0xe4, 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0x92, 0xcf, 0x5d, 0xcc, 0x34, 0x29, 0x00, 0x00, + // 2213 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcb, 0x6f, 0x1b, 0xc7, + 0x19, 0xd7, 0xf2, 0x21, 0x51, 0x43, 0x4b, 0xb2, 0x47, 0xaa, 0xc4, 0xd8, 0x0d, 0xe9, 0x6e, 0x5d, + 0x5b, 0x89, 0x63, 0xb2, 0x76, 0x9c, 0x20, 0x88, 0x8b, 0x18, 0x22, 0x95, 0xa6, 0x69, 0xf4, 0xea, + 0xd0, 0x72, 0x00, 0x37, 0x2d, 0x3a, 0x22, 0xc7, 0xd4, 0x46, 0xfb, 0xc2, 0xee, 0x50, 0x31, 0xd1, + 0x4b, 0x51, 0xa0, 0xb7, 0x1e, 0xfa, 0x37, 0xf4, 0x1f, 0x28, 0x8a, 0xa2, 0xb9, 0x05, 0x41, 0xd0, + 0x8b, 0x2f, 0x05, 0x82, 0x5e, 0x9a, 0x13, 0x51, 0x33, 0xa7, 0xa2, 0xe8, 0xad, 0xbd, 0xf8, 0xd2, + 0x62, 0x66, 0x67, 0xdf, 0xb3, 0x22, 0x25, 0xc7, 0xca, 0x03, 0xbe, 0x71, 0x67, 0x7e, 0xdf, 0x6f, + 0xbf, 0x99, 0xf9, 0xbe, 0xf9, 0x7e, 0x33, 0x4b, 0x70, 0xeb, 0xe0, 0x35, 0xb7, 0xae, 0x59, 0x8d, + 0x83, 0xfe, 0x1e, 0x71, 0x4c, 0x42, 0x89, 0xdb, 0x38, 0x24, 0x66, 0xd7, 0x72, 0x1a, 0xa2, 0x03, + 0xdb, 0x5a, 0x03, 0xdb, 0xb6, 0xdb, 0x38, 0xbc, 0xde, 0xe8, 0x11, 0x93, 0x38, 0x98, 0x92, 0x6e, + 0xdd, 0x76, 0x2c, 0x6a, 0x41, 0xe8, 0x61, 0xea, 0xd8, 0xd6, 0xea, 0x0c, 0x53, 0x3f, 0xbc, 0x7e, + 0xfe, 0x5a, 0x4f, 0xa3, 0xfb, 0xfd, 0xbd, 0x7a, 0xc7, 0x32, 0x1a, 0x3d, 0xab, 0x67, 0x35, 0x38, + 0x74, 0xaf, 0x7f, 0x9f, 0x3f, 0xf1, 0x07, 0xfe, 0xcb, 0xa3, 0x38, 0xaf, 0x46, 0x5e, 0xd3, 0xb1, + 0x1c, 0x22, 0x79, 0xcd, 0xf9, 0x9b, 0x21, 0xc6, 0xc0, 0x9d, 0x7d, 0xcd, 0x24, 0xce, 0xa0, 0x61, + 0x1f, 0xf4, 0x58, 0x83, 0xdb, 0x30, 0x08, 0xc5, 0x32, 0xab, 0x46, 0x96, 0x95, 0xd3, 0x37, 0xa9, + 0x66, 0x90, 0x94, 0xc1, 0xab, 0xe3, 0x0c, 0xdc, 0xce, 0x3e, 0x31, 0x70, 0xca, 0xee, 0xe5, 0x2c, + 0xbb, 0x3e, 0xd5, 0xf4, 0x86, 0x66, 0x52, 0x97, 0x3a, 0x49, 0x23, 0xf5, 0xbf, 0x0a, 0x80, 0x2d, + 0xcb, 0xa4, 0x8e, 0xa5, 0xeb, 0xc4, 0x41, 0xe4, 0x50, 0x73, 0x35, 0xcb, 0x84, 0xbf, 0x00, 0x25, + 0x36, 0x9e, 0x2e, 0xa6, 0xb8, 0xa2, 0x5c, 0x54, 0x56, 0xcb, 0x37, 0xbe, 0x5f, 0x0f, 0x27, 0x39, + 0xa0, 0xaf, 0xdb, 0x07, 0x3d, 0xd6, 0xe0, 0xd6, 0x19, 0xba, 0x7e, 0x78, 0xbd, 0xbe, 0xbd, 0xf7, + 0x3e, 0xe9, 0xd0, 0x4d, 0x42, 0x71, 0x13, 0x3e, 0x1c, 0xd6, 0xa6, 0x46, 0xc3, 0x1a, 0x08, 0xdb, + 0x50, 0xc0, 0x0a, 0xb7, 0x41, 0x81, 0xb3, 0xe7, 0x38, 0xfb, 0xb5, 0x4c, 0x76, 0x31, 0xe8, 0x3a, + 0xc2, 0x1f, 0xbc, 0xf9, 0x80, 0x12, 0x93, 0xb9, 0xd7, 0x3c, 0x23, 0xa8, 0x0b, 0xeb, 0x98, 0x62, + 0xc4, 0x89, 0xe0, 0x4b, 0xa0, 0xe4, 0x08, 0xf7, 0x2b, 0xf9, 0x8b, 0xca, 0x6a, 0xbe, 0x79, 0x56, + 0xa0, 0x4a, 0xfe, 0xb0, 0x50, 0x80, 0x50, 0xff, 0xa2, 0x80, 0xe5, 0xf4, 0xb8, 0x37, 0x34, 0x97, + 0xc2, 0xf7, 0x52, 0x63, 0xaf, 0x4f, 0x36, 0x76, 0x66, 0xcd, 0x47, 0x1e, 0xbc, 0xd8, 0x6f, 0x89, + 0x8c, 0xfb, 0x1d, 0x50, 0xd4, 0x28, 0x31, 0xdc, 0x4a, 0xee, 0x62, 0x7e, 0xb5, 0x7c, 0xe3, 0x72, + 0x3d, 0x1d, 0xbb, 0xf5, 0xb4, 0x63, 0xcd, 0x39, 0x41, 0x59, 0x7c, 0x9b, 0x19, 0x23, 0x8f, 0x43, + 0xfd, 0x9f, 0x02, 0x66, 0xd7, 0x31, 0x31, 0x2c, 0xb3, 0x4d, 0xe8, 0x29, 0x2c, 0x5a, 0x0b, 0x14, + 0x5c, 0x9b, 0x74, 0xc4, 0xa2, 0x7d, 0x47, 0xe6, 0x7b, 0xe0, 0x4e, 0xdb, 0x26, 0x9d, 0x70, 0xa1, + 0xd8, 0x13, 0xe2, 0xc6, 0xf0, 0x1d, 0x30, 0xed, 0x52, 0x4c, 0xfb, 0x2e, 0x5f, 0xa6, 0xf2, 0x8d, + 0xef, 0x1e, 0x4d, 0xc3, 0xa1, 0xcd, 0x79, 0x41, 0x34, 0xed, 0x3d, 0x23, 0x41, 0xa1, 0xfe, 0x33, + 0x07, 0x60, 0x80, 0x6d, 0x59, 0x66, 0x57, 0xa3, 0x2c, 0x7e, 0x5f, 0x07, 0x05, 0x3a, 0xb0, 0x09, + 0x9f, 0x86, 0xd9, 0xe6, 0x65, 0xdf, 0x8b, 0x3b, 0x03, 0x9b, 0x3c, 0x1e, 0xd6, 0x96, 0xd3, 0x16, + 0xac, 0x07, 0x71, 0x1b, 0xb8, 0x11, 0xf8, 0x97, 0xe3, 0xd6, 0x37, 0xe3, 0xaf, 0x7e, 0x3c, 0xac, + 0x49, 0x36, 0x8b, 0x7a, 0xc0, 0x14, 0x77, 0x10, 0x1e, 0x02, 0xa8, 0x63, 0x97, 0xde, 0x71, 0xb0, + 0xe9, 0x7a, 0x6f, 0xd2, 0x0c, 0x22, 0x46, 0xfe, 0xe2, 0x64, 0xcb, 0xc3, 0x2c, 0x9a, 0xe7, 0x85, + 0x17, 0x70, 0x23, 0xc5, 0x86, 0x24, 0x6f, 0x80, 0x97, 0xc1, 0xb4, 0x43, 0xb0, 0x6b, 0x99, 0x95, + 0x02, 0x1f, 0x45, 0x30, 0x81, 0x88, 0xb7, 0x22, 0xd1, 0x0b, 0x5f, 0x00, 0x33, 0x06, 0x71, 0x5d, + 0xdc, 0x23, 0x95, 0x22, 0x07, 0x2e, 0x08, 0xe0, 0xcc, 0xa6, 0xd7, 0x8c, 0xfc, 0x7e, 0xf5, 0x8f, + 0x0a, 0x98, 0x0b, 0x66, 0xee, 0x14, 0x52, 0xa5, 0x19, 0x4f, 0x95, 0xe7, 0x8f, 0x8c, 0x93, 0x8c, + 0x0c, 0xf9, 0x38, 0x1f, 0xf1, 0x99, 0x05, 0x21, 0xfc, 0x19, 0x28, 0xb9, 0x44, 0x27, 0x1d, 0x6a, + 0x39, 0xc2, 0xe7, 0x97, 0x27, 0xf4, 0x19, 0xef, 0x11, 0xbd, 0x2d, 0x4c, 0x9b, 0x67, 0x98, 0xd3, + 0xfe, 0x13, 0x0a, 0x28, 0xe1, 0x4f, 0x40, 0x89, 0x12, 0xc3, 0xd6, 0x31, 0x25, 0x22, 0x4d, 0x62, + 0xf1, 0xcd, 0xc2, 0x85, 0x91, 0xed, 0x58, 0xdd, 0x3b, 0x02, 0xc6, 0x13, 0x25, 0x98, 0x07, 0xbf, + 0x15, 0x05, 0x34, 0xf0, 0x00, 0xcc, 0xf7, 0xed, 0x2e, 0x43, 0x52, 0xb6, 0x75, 0xf7, 0x06, 0x22, + 0x7c, 0xae, 0x1e, 0x39, 0x21, 0xbb, 0x31, 0x93, 0xe6, 0xb2, 0x78, 0xc1, 0x7c, 0xbc, 0x1d, 0x25, + 0xa8, 0xe1, 0x1a, 0x58, 0x30, 0x34, 0x13, 0x11, 0xdc, 0x1d, 0xb4, 0x49, 0xc7, 0x32, 0xbb, 0x2e, + 0x0f, 0xa0, 0x62, 0x73, 0x45, 0x10, 0x2c, 0x6c, 0xc6, 0xbb, 0x51, 0x12, 0x0f, 0x37, 0xc0, 0x92, + 0xbf, 0xcf, 0xfe, 0x48, 0x73, 0xa9, 0xe5, 0x0c, 0x36, 0x34, 0x43, 0xa3, 0x95, 0x69, 0xce, 0x53, + 0x19, 0x0d, 0x6b, 0x4b, 0x48, 0xd2, 0x8f, 0xa4, 0x56, 0xea, 0x6f, 0xa7, 0xc1, 0x42, 0x62, 0x37, + 0x80, 0x77, 0xc1, 0x72, 0xa7, 0xef, 0x38, 0xc4, 0xa4, 0x5b, 0x7d, 0x63, 0x8f, 0x38, 0xed, 0xce, + 0x3e, 0xe9, 0xf6, 0x75, 0xd2, 0xe5, 0x2b, 0x5a, 0x6c, 0x56, 0x85, 0xaf, 0xcb, 0x2d, 0x29, 0x0a, + 0x65, 0x58, 0xc3, 0x1f, 0x03, 0x68, 0xf2, 0xa6, 0x4d, 0xcd, 0x75, 0x03, 0xce, 0x1c, 0xe7, 0x0c, + 0x12, 0x70, 0x2b, 0x85, 0x40, 0x12, 0x2b, 0xe6, 0x63, 0x97, 0xb8, 0x9a, 0x43, 0xba, 0x49, 0x1f, + 0xf3, 0x71, 0x1f, 0xd7, 0xa5, 0x28, 0x94, 0x61, 0x0d, 0x5f, 0x01, 0x65, 0xef, 0x6d, 0x7c, 0xce, + 0xc5, 0xe2, 0x2c, 0x0a, 0xb2, 0xf2, 0x56, 0xd8, 0x85, 0xa2, 0x38, 0x36, 0x34, 0x6b, 0xcf, 0x25, + 0xce, 0x21, 0xe9, 0xbe, 0xe5, 0x69, 0x00, 0x56, 0x28, 0x8b, 0xbc, 0x50, 0x06, 0x43, 0xdb, 0x4e, + 0x21, 0x90, 0xc4, 0x8a, 0x0d, 0xcd, 0x8b, 0x9a, 0xd4, 0xd0, 0xa6, 0xe3, 0x43, 0xdb, 0x95, 0xa2, + 0x50, 0x86, 0x35, 0x8b, 0x3d, 0xcf, 0xe5, 0xb5, 0x43, 0xac, 0xe9, 0x78, 0x4f, 0x27, 0x95, 0x99, + 0x78, 0xec, 0x6d, 0xc5, 0xbb, 0x51, 0x12, 0x0f, 0xdf, 0x02, 0xe7, 0xbc, 0xa6, 0x5d, 0x13, 0x07, + 0x24, 0x25, 0x4e, 0xf2, 0x9c, 0x20, 0x39, 0xb7, 0x95, 0x04, 0xa0, 0xb4, 0x0d, 0x7c, 0x1d, 0xcc, + 0x77, 0x2c, 0x5d, 0xe7, 0xf1, 0xd8, 0xb2, 0xfa, 0x26, 0xad, 0xcc, 0x72, 0x16, 0xc8, 0x72, 0xa8, + 0x15, 0xeb, 0x41, 0x09, 0x24, 0xbc, 0x07, 0x40, 0xc7, 0x2f, 0x07, 0x6e, 0x05, 0x64, 0x17, 0xfa, + 0x74, 0x1d, 0x0a, 0x0b, 0x70, 0xd0, 0xe4, 0xa2, 0x08, 0x9b, 0xfa, 0xb1, 0x02, 0x56, 0x32, 0x72, + 0x1c, 0xde, 0x8e, 0x55, 0xbd, 0xab, 0x89, 0xaa, 0x77, 0x21, 0xc3, 0x2c, 0x52, 0xfa, 0x3a, 0x60, + 0x8e, 0xe9, 0x0e, 0xcd, 0xec, 0x79, 0x10, 0xb1, 0x83, 0xbd, 0x28, 0xf3, 0x1d, 0x45, 0x81, 0xe1, + 0x36, 0x7c, 0x6e, 0x34, 0xac, 0xcd, 0xc5, 0xfa, 0x50, 0x9c, 0x53, 0xfd, 0x75, 0x0e, 0x80, 0x75, + 0x62, 0xeb, 0xd6, 0xc0, 0x20, 0xe6, 0x69, 0xa8, 0x96, 0xf5, 0x98, 0x6a, 0x51, 0xa5, 0x0b, 0x11, + 0xf8, 0x93, 0x29, 0x5b, 0x36, 0x12, 0xb2, 0xe5, 0xd2, 0x18, 0x9e, 0xa3, 0x75, 0xcb, 0xdf, 0xf3, + 0x60, 0x31, 0x04, 0x87, 0xc2, 0xe5, 0x56, 0x6c, 0x09, 0xaf, 0x24, 0x96, 0x70, 0x45, 0x62, 0xf2, + 0xd4, 0x94, 0xcb, 0xfb, 0x60, 0x9e, 0xe9, 0x0a, 0x6f, 0xd5, 0xb8, 0x6a, 0x99, 0x3e, 0xb6, 0x6a, + 0x09, 0xaa, 0xce, 0x46, 0x8c, 0x09, 0x25, 0x98, 0x33, 0x54, 0xd2, 0xcc, 0xd7, 0x51, 0x25, 0xfd, + 0x49, 0x01, 0xf3, 0xe1, 0x32, 0x9d, 0x82, 0x4c, 0x6a, 0xc5, 0x65, 0x52, 0xf5, 0xe8, 0xb8, 0xcc, + 0xd0, 0x49, 0x7f, 0x2b, 0x44, 0xbd, 0xe6, 0x42, 0x69, 0x95, 0x1d, 0xa8, 0x6c, 0x5d, 0xeb, 0x60, + 0x57, 0x94, 0xd5, 0x33, 0xde, 0x61, 0xca, 0x6b, 0x43, 0x41, 0x6f, 0x4c, 0x52, 0xe5, 0x9e, 0xae, + 0xa4, 0xca, 0x7f, 0x31, 0x92, 0xea, 0x0e, 0x28, 0xb9, 0xbe, 0x98, 0x2a, 0x70, 0xca, 0xcb, 0xe3, + 0xd2, 0x59, 0xe8, 0xa8, 0x80, 0x35, 0x50, 0x50, 0x01, 0x93, 0x4c, 0x3b, 0x15, 0xbf, 0x4c, 0xed, + 0xc4, 0xc2, 0xdb, 0xc6, 0x7d, 0x97, 0x74, 0x79, 0x2a, 0x95, 0xc2, 0xf0, 0xde, 0xe1, 0xad, 0x48, + 0xf4, 0xc2, 0x5d, 0xb0, 0x62, 0x3b, 0x56, 0xcf, 0x21, 0xae, 0xbb, 0x4e, 0x70, 0x57, 0xd7, 0x4c, + 0xe2, 0x0f, 0xc0, 0xab, 0x7a, 0x17, 0x46, 0xc3, 0xda, 0xca, 0x8e, 0x1c, 0x82, 0xb2, 0x6c, 0xd5, + 0x8f, 0x0a, 0xe0, 0x6c, 0x72, 0x47, 0xcc, 0x10, 0x22, 0xca, 0x89, 0x84, 0xc8, 0x4b, 0x91, 0x10, + 0xf5, 0x54, 0x5a, 0xe4, 0xcc, 0x9f, 0x0a, 0xd3, 0x35, 0xb0, 0x20, 0x84, 0x87, 0xdf, 0x29, 0xa4, + 0x58, 0xb0, 0x3c, 0xbb, 0xf1, 0x6e, 0x94, 0xc4, 0xc3, 0x5b, 0x60, 0xce, 0xe1, 0xda, 0xca, 0x27, + 0xf0, 0xf4, 0xc9, 0xb7, 0x04, 0xc1, 0x1c, 0x8a, 0x76, 0xa2, 0x38, 0x96, 0x69, 0x93, 0x50, 0x72, + 0xf8, 0x04, 0x85, 0xb8, 0x36, 0x59, 0x4b, 0x02, 0x50, 0xda, 0x06, 0x6e, 0x82, 0xc5, 0xbe, 0x99, + 0xa6, 0xf2, 0x62, 0xed, 0x82, 0xa0, 0x5a, 0xdc, 0x4d, 0x43, 0x90, 0xcc, 0x0e, 0xfe, 0x34, 0x26, + 0x57, 0xa6, 0xf9, 0x2e, 0x72, 0xe5, 0xe8, 0x74, 0x98, 0x58, 0xaf, 0x48, 0x74, 0x54, 0x69, 0x52, + 0x1d, 0xa5, 0x7e, 0xa8, 0x00, 0x98, 0x4e, 0xc1, 0xb1, 0x87, 0xfb, 0x94, 0x45, 0xa4, 0x44, 0x76, + 0xe5, 0x0a, 0xe7, 0xea, 0x78, 0x85, 0x13, 0xee, 0xa0, 0x93, 0x49, 0x1c, 0x31, 0xbd, 0xa7, 0x73, + 0x31, 0x33, 0x81, 0xc4, 0x09, 0xfd, 0x79, 0x32, 0x89, 0x13, 0xe1, 0x39, 0x5a, 0xe2, 0xfc, 0x2b, + 0x07, 0x16, 0x43, 0xf0, 0xc4, 0x12, 0x47, 0x62, 0xf2, 0xec, 0x72, 0x66, 0x32, 0xd9, 0x11, 0x4e, + 0xdd, 0x57, 0x44, 0x76, 0x84, 0x0e, 0x65, 0xc8, 0x8e, 0x3f, 0xe4, 0xa2, 0x5e, 0x1f, 0x53, 0x76, + 0x7c, 0x01, 0x57, 0x15, 0x5f, 0x3b, 0xe5, 0xa2, 0x7e, 0x92, 0x07, 0x67, 0x93, 0x29, 0x18, 0xab, + 0x83, 0xca, 0xd8, 0x3a, 0xb8, 0x03, 0x96, 0xee, 0xf7, 0x75, 0x7d, 0xc0, 0xc7, 0x10, 0x29, 0x86, + 0x5e, 0x05, 0xfd, 0xb6, 0xb0, 0x5c, 0xfa, 0xa1, 0x04, 0x83, 0xa4, 0x96, 0xe9, 0xb2, 0x58, 0x78, + 0xd2, 0xb2, 0x58, 0x3c, 0x41, 0x59, 0x94, 0x2b, 0x8b, 0xfc, 0x89, 0x94, 0xc5, 0xc4, 0x35, 0x51, + 0xb2, 0x5d, 0x8d, 0x3d, 0xc3, 0x8f, 0x14, 0xb0, 0x2c, 0x3f, 0x3e, 0x43, 0x1d, 0xcc, 0x1b, 0xf8, + 0x41, 0xf4, 0xf2, 0x62, 0x5c, 0xc1, 0xe8, 0x53, 0x4d, 0xaf, 0x7b, 0x5f, 0x77, 0xea, 0x6f, 0x9b, + 0x74, 0xdb, 0x69, 0x53, 0x47, 0x33, 0x7b, 0x5e, 0x81, 0xdd, 0x8c, 0x71, 0xa1, 0x04, 0x37, 0xbc, + 0x07, 0x4a, 0x06, 0x7e, 0xd0, 0xee, 0x3b, 0x3d, 0xbf, 0x10, 0x1e, 0xff, 0x3d, 0x3c, 0xf6, 0x37, + 0x05, 0x0b, 0x0a, 0xf8, 0xd4, 0xcf, 0x15, 0xb0, 0x92, 0x51, 0x41, 0xbf, 0x41, 0xa3, 0xfc, 0x48, + 0x01, 0x17, 0x63, 0xa3, 0x64, 0x19, 0x49, 0xee, 0xf7, 0x75, 0x9e, 0x9c, 0x42, 0xb0, 0x5c, 0x05, + 0xb3, 0x36, 0x76, 0xa8, 0x16, 0x28, 0xdd, 0x62, 0x73, 0x6e, 0x34, 0xac, 0xcd, 0xee, 0xf8, 0x8d, + 0x28, 0xec, 0x97, 0xcc, 0x4d, 0xee, 0xe9, 0xcd, 0x8d, 0xfa, 0x9b, 0x1c, 0x28, 0x47, 0x5c, 0x3e, + 0x05, 0xa9, 0xf2, 0x66, 0x4c, 0xaa, 0x48, 0x3f, 0xfe, 0x44, 0xe7, 0x30, 0x4b, 0xab, 0x6c, 0x26, + 0xb4, 0xca, 0xf7, 0xc6, 0x11, 0x1d, 0x2d, 0x56, 0xfe, 0x9d, 0x03, 0x4b, 0x11, 0x74, 0xa8, 0x56, + 0x7e, 0x10, 0x53, 0x2b, 0xab, 0x09, 0xb5, 0x52, 0x91, 0xd9, 0x3c, 0x93, 0x2b, 0xe3, 0xe5, 0xca, + 0x9f, 0x15, 0xb0, 0x10, 0x99, 0xbb, 0x53, 0xd0, 0x2b, 0xeb, 0x71, 0xbd, 0x52, 0x1b, 0x13, 0x2f, + 0x19, 0x82, 0xe5, 0x2e, 0x58, 0x8c, 0x80, 0xb6, 0x9d, 0xae, 0x66, 0x62, 0xdd, 0x85, 0xb7, 0xc1, + 0xa2, 0x28, 0xaf, 0x6d, 0x8a, 0x1d, 0xbf, 0xdd, 0xcf, 0x75, 0x9f, 0x89, 0xf7, 0x21, 0x19, 0x52, + 0xfd, 0x8f, 0x02, 0x1a, 0x11, 0xe2, 0x1d, 0xe2, 0xb8, 0x9a, 0x4b, 0x89, 0x49, 0xef, 0x5a, 0x7a, + 0xdf, 0x20, 0x2d, 0x1d, 0x6b, 0x06, 0x22, 0xac, 0x41, 0xb3, 0xcc, 0x1d, 0x4b, 0xd7, 0x3a, 0x03, + 0x88, 0x41, 0xf9, 0x83, 0x7d, 0x62, 0xae, 0x13, 0x9d, 0x50, 0xf1, 0xe9, 0x63, 0xb6, 0x79, 0xdb, + 0xff, 0x12, 0xf0, 0x6e, 0xd8, 0xf5, 0x78, 0x58, 0x5b, 0x9d, 0x84, 0x91, 0x07, 0x6e, 0x94, 0x13, + 0xfe, 0x1c, 0x00, 0xf6, 0xd8, 0xee, 0x60, 0xff, 0x43, 0xc8, 0x6c, 0xf3, 0x0d, 0x3f, 0xbd, 0xdf, + 0x0d, 0x7a, 0x8e, 0xf5, 0x82, 0x08, 0xa3, 0xfa, 0xfb, 0x52, 0x2c, 0x0c, 0xbe, 0xf1, 0xf7, 0x4e, + 0xbf, 0x04, 0x4b, 0x87, 0xe1, 0xec, 0xf8, 0x00, 0xa6, 0x97, 0x58, 0x4c, 0xbe, 0x20, 0xa5, 0x97, + 0xcd, 0x6b, 0xa8, 0xd2, 0xee, 0x4a, 0xe8, 0x90, 0xf4, 0x25, 0xf0, 0x15, 0x50, 0x66, 0x3a, 0x47, + 0xeb, 0x90, 0x2d, 0x6c, 0xf8, 0x29, 0x1a, 0x7c, 0x39, 0x6a, 0x87, 0x5d, 0x28, 0x8a, 0x83, 0xfb, + 0x60, 0xd1, 0xb6, 0xba, 0x9b, 0xd8, 0xc4, 0x3d, 0xc2, 0xaa, 0xb7, 0xb7, 0x94, 0xfc, 0x46, 0x6a, + 0xb6, 0xf9, 0xaa, 0x7f, 0xdb, 0xb0, 0x93, 0x86, 0xb0, 0xd3, 0x9c, 0xa4, 0x99, 0x07, 0x81, 0x8c, + 0x12, 0x1a, 0xa9, 0x0f, 0x9d, 0x33, 0xa9, 0x7f, 0x87, 0xc8, 0x72, 0xf5, 0x84, 0x9f, 0x3a, 0xb3, + 0xee, 0xda, 0x4a, 0x27, 0xba, 0x6b, 0x93, 0x9c, 0x46, 0x66, 0x8f, 0x79, 0x1a, 0xf9, 0x44, 0x01, + 0x97, 0xec, 0x09, 0xd2, 0xa8, 0x02, 0xf8, 0xb4, 0xb4, 0xc6, 0x4c, 0xcb, 0x24, 0x19, 0xd9, 0x5c, + 0x1d, 0x0d, 0x6b, 0x97, 0x26, 0x41, 0xa2, 0x89, 0x5c, 0x63, 0x49, 0x63, 0x89, 0x5d, 0xb1, 0x52, + 0xe6, 0x6e, 0x5e, 0x19, 0xe3, 0xa6, 0xbf, 0x89, 0x7a, 0x79, 0xe8, 0x3f, 0xa1, 0x80, 0x46, 0xfd, + 0xb0, 0x08, 0xce, 0xa5, 0x2a, 0xf9, 0x97, 0x78, 0x8f, 0x98, 0x3a, 0xed, 0xe4, 0x8f, 0x71, 0xda, + 0x59, 0x03, 0x0b, 0xe2, 0xe3, 0x73, 0xe2, 0xb0, 0x14, 0x84, 0x49, 0x2b, 0xde, 0x8d, 0x92, 0x78, + 0xd9, 0x3d, 0x66, 0xf1, 0x98, 0xf7, 0x98, 0x51, 0x2f, 0xc4, 0x7f, 0xa6, 0xbc, 0x7c, 0x4e, 0x7b, + 0x21, 0xfe, 0x3a, 0x95, 0xc4, 0xc3, 0x37, 0xfc, 0x64, 0x0d, 0x18, 0x66, 0x38, 0x43, 0x22, 0xfb, + 0x02, 0x82, 0x04, 0xfa, 0x89, 0x3e, 0xb0, 0xbe, 0x27, 0xf9, 0xc0, 0xba, 0x3a, 0x26, 0xcc, 0x26, + 0xbf, 0xb2, 0x94, 0x1e, 0x48, 0xcb, 0xc7, 0x3f, 0x90, 0xaa, 0x7f, 0x55, 0xc0, 0x73, 0x99, 0xdb, + 0x14, 0x5c, 0x8b, 0x29, 0xcb, 0x6b, 0x09, 0x65, 0xf9, 0x7c, 0xa6, 0x61, 0x44, 0x5e, 0x1a, 0xf2, + 0xdb, 0xcc, 0x9b, 0x63, 0x6f, 0x33, 0x25, 0xa7, 0x94, 0xf1, 0xd7, 0x9a, 0xcd, 0xd7, 0x1e, 0x3e, + 0xaa, 0x4e, 0x7d, 0xfa, 0xa8, 0x3a, 0xf5, 0xd9, 0xa3, 0xea, 0xd4, 0xaf, 0x46, 0x55, 0xe5, 0xe1, + 0xa8, 0xaa, 0x7c, 0x3a, 0xaa, 0x2a, 0x9f, 0x8d, 0xaa, 0xca, 0x3f, 0x46, 0x55, 0xe5, 0x77, 0x9f, + 0x57, 0xa7, 0xee, 0xc1, 0xf4, 0x3f, 0x36, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x67, 0x59, 0x8d, + 0x9b, 0xdf, 0x29, 0x00, 0x00, } func (m *ControllerRevision) Marshal() (dAtA []byte, err error) { @@ -2341,6 +2374,32 @@ func (m *StatefulSetList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *StatefulSetOrdinals) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StatefulSetOrdinals) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatefulSetOrdinals) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.Start)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2394,6 +2453,18 @@ func (m *StatefulSetSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Ordinals != nil { + { + size, err := m.Ordinals.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if m.PersistentVolumeClaimRetentionPolicy != nil { { size, err := m.PersistentVolumeClaimRetentionPolicy.MarshalToSizedBuffer(dAtA[:i]) @@ -3054,6 +3125,16 @@ func (m *StatefulSetList) Size() (n int) { return n } +func (m *StatefulSetOrdinals) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.Start)) + return n +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Size() (n int) { if m == nil { return 0 @@ -3102,6 +3183,10 @@ func (m *StatefulSetSpec) Size() (n int) { l = m.PersistentVolumeClaimRetentionPolicy.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Ordinals != nil { + l = m.Ordinals.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -3516,6 +3601,16 @@ func (this *StatefulSetList) String() string { }, "") return s } +func (this *StatefulSetOrdinals) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&StatefulSetOrdinals{`, + `Start:` + fmt.Sprintf("%v", this.Start) + `,`, + `}`, + }, "") + return s +} func (this *StatefulSetPersistentVolumeClaimRetentionPolicy) String() string { if this == nil { return "nil" @@ -3547,6 +3642,7 @@ func (this *StatefulSetSpec) String() string { `RevisionHistoryLimit:` + valueToStringGenerated(this.RevisionHistoryLimit) + `,`, `MinReadySeconds:` + fmt.Sprintf("%v", this.MinReadySeconds) + `,`, `PersistentVolumeClaimRetentionPolicy:` + strings.Replace(this.PersistentVolumeClaimRetentionPolicy.String(), "StatefulSetPersistentVolumeClaimRetentionPolicy", "StatefulSetPersistentVolumeClaimRetentionPolicy", 1) + `,`, + `Ordinals:` + strings.Replace(this.Ordinals.String(), "StatefulSetOrdinals", "StatefulSetOrdinals", 1) + `,`, `}`, }, "") return s @@ -7626,6 +7722,75 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { } return nil } +func (m *StatefulSetOrdinals) 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: StatefulSetOrdinals: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatefulSetOrdinals: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + m.Start = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Start |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8064,6 +8229,42 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ordinals", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ordinals == nil { + m.Ordinals = &StatefulSetOrdinals{} + } + if err := m.Ordinals.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/apps/v1/generated.proto b/staging/src/k8s.io/api/apps/v1/generated.proto index 1e0356282b3..361d1980412 100644 --- a/staging/src/k8s.io/api/apps/v1/generated.proto +++ b/staging/src/k8s.io/api/apps/v1/generated.proto @@ -622,6 +622,17 @@ message StatefulSetList { repeated StatefulSet items = 2; } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +message StatefulSetOrdinals { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + optional int32 replicaStartOrdinal = 1; +} + // StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs // created from the StatefulSet VolumeClaimTemplates. message StatefulSetPersistentVolumeClaimRetentionPolicy { @@ -713,6 +724,14 @@ message StatefulSetSpec { // down. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, // which is alpha. +optional optional StatefulSetPersistentVolumeClaimRetentionPolicy persistentVolumeClaimRetentionPolicy = 10; + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + optional StatefulSetOrdinals ordinals = 11; } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1/types.go b/staging/src/k8s.io/api/apps/v1/types.go index d94f90b4c79..f1239211ca5 100644 --- a/staging/src/k8s.io/api/apps/v1/types.go +++ b/staging/src/k8s.io/api/apps/v1/types.go @@ -163,6 +163,17 @@ type StatefulSetPersistentVolumeClaimRetentionPolicy struct { WhenScaled PersistentVolumeClaimRetentionPolicyType `json:"whenScaled,omitempty" protobuf:"bytes,2,opt,name=whenScaled,casttype=PersistentVolumeClaimRetentionPolicyType"` } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +type StatefulSetOrdinals struct { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + Start int32 `json:"start" protobuf:"varint,1,opt,name=start"` +} + // A StatefulSetSpec is the specification of a StatefulSet. type StatefulSetSpec struct { // replicas is the desired number of replicas of the given Template. @@ -237,6 +248,14 @@ type StatefulSetSpec struct { // down. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, // which is alpha. +optional PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicy `json:"persistentVolumeClaimRetentionPolicy,omitempty" protobuf:"bytes,10,opt,name=persistentVolumeClaimRetentionPolicy"` + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + Ordinals *StatefulSetOrdinals `json:"ordinals,omitempty" protobuf:"bytes,11,opt,name=ordinals"` } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/apps/v1/types_swagger_doc_generated.go index 2dda5ac8bae..97aca78daa6 100644 --- a/staging/src/k8s.io/api/apps/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/apps/v1/types_swagger_doc_generated.go @@ -324,6 +324,15 @@ func (StatefulSetList) SwaggerDoc() map[string]string { return map_StatefulSetList } +var map_StatefulSetOrdinals = map[string]string{ + "": "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + "start": "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", +} + +func (StatefulSetOrdinals) SwaggerDoc() map[string]string { + return map_StatefulSetOrdinals +} + var map_StatefulSetPersistentVolumeClaimRetentionPolicy = map[string]string{ "": "StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates.", "whenDeleted": "WhenDeleted specifies what happens to PVCs created from StatefulSet VolumeClaimTemplates when the StatefulSet is deleted. The default policy of `Retain` causes PVCs to not be affected by StatefulSet deletion. The `Delete` policy causes those PVCs to be deleted.", @@ -346,6 +355,7 @@ var map_StatefulSetSpec = map[string]string{ "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "persistentVolumeClaimRetentionPolicy describes the lifecycle of persistent volume claims created from volumeClaimTemplates. By default, all persistent volume claims are created as needed and retained until manually deleted. This policy allows the lifecycle to be altered, for example by deleting persistent volume claims when their stateful set is deleted, or when their pod is scaled down. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. +optional", + "ordinals": "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", } func (StatefulSetSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/apps/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1/zz_generated.deepcopy.go index 72d76670e78..6912986ac37 100644 --- a/staging/src/k8s.io/api/apps/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1/zz_generated.deepcopy.go @@ -693,6 +693,22 @@ func (in *StatefulSetList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StatefulSetOrdinals) DeepCopyInto(out *StatefulSetOrdinals) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StatefulSetOrdinals. +func (in *StatefulSetOrdinals) DeepCopy() *StatefulSetOrdinals { + if in == nil { + return nil + } + out := new(StatefulSetOrdinals) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StatefulSetPersistentVolumeClaimRetentionPolicy) DeepCopyInto(out *StatefulSetPersistentVolumeClaimRetentionPolicy) { *out = *in @@ -741,6 +757,11 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { *out = new(StatefulSetPersistentVolumeClaimRetentionPolicy) **out = **in } + if in.Ordinals != nil { + in, out := &in.Ordinals, &out.Ordinals + *out = new(StatefulSetOrdinals) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go index 48ac988f452..26ac84bbdea 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.pb.go @@ -553,12 +553,40 @@ func (m *StatefulSetList) XXX_DiscardUnknown() { var xxx_messageInfo_StatefulSetList proto.InternalMessageInfo +func (m *StatefulSetOrdinals) Reset() { *m = StatefulSetOrdinals{} } +func (*StatefulSetOrdinals) ProtoMessage() {} +func (*StatefulSetOrdinals) Descriptor() ([]byte, []int) { + return fileDescriptor_2a07313e8f66e805, []int{18} +} +func (m *StatefulSetOrdinals) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StatefulSetOrdinals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *StatefulSetOrdinals) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatefulSetOrdinals.Merge(m, src) +} +func (m *StatefulSetOrdinals) XXX_Size() int { + return m.Size() +} +func (m *StatefulSetOrdinals) XXX_DiscardUnknown() { + xxx_messageInfo_StatefulSetOrdinals.DiscardUnknown(m) +} + +var xxx_messageInfo_StatefulSetOrdinals proto.InternalMessageInfo + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Reset() { *m = StatefulSetPersistentVolumeClaimRetentionPolicy{} } func (*StatefulSetPersistentVolumeClaimRetentionPolicy) ProtoMessage() {} func (*StatefulSetPersistentVolumeClaimRetentionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_2a07313e8f66e805, []int{18} + return fileDescriptor_2a07313e8f66e805, []int{19} } func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -586,7 +614,7 @@ var xxx_messageInfo_StatefulSetPersistentVolumeClaimRetentionPolicy proto.Intern func (m *StatefulSetSpec) Reset() { *m = StatefulSetSpec{} } func (*StatefulSetSpec) ProtoMessage() {} func (*StatefulSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_2a07313e8f66e805, []int{19} + return fileDescriptor_2a07313e8f66e805, []int{20} } func (m *StatefulSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -614,7 +642,7 @@ var xxx_messageInfo_StatefulSetSpec proto.InternalMessageInfo func (m *StatefulSetStatus) Reset() { *m = StatefulSetStatus{} } func (*StatefulSetStatus) ProtoMessage() {} func (*StatefulSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_2a07313e8f66e805, []int{20} + return fileDescriptor_2a07313e8f66e805, []int{21} } func (m *StatefulSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -642,7 +670,7 @@ var xxx_messageInfo_StatefulSetStatus proto.InternalMessageInfo func (m *StatefulSetUpdateStrategy) Reset() { *m = StatefulSetUpdateStrategy{} } func (*StatefulSetUpdateStrategy) ProtoMessage() {} func (*StatefulSetUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_2a07313e8f66e805, []int{21} + return fileDescriptor_2a07313e8f66e805, []int{22} } func (m *StatefulSetUpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -688,6 +716,7 @@ func init() { proto.RegisterType((*StatefulSet)(nil), "k8s.io.api.apps.v1beta1.StatefulSet") proto.RegisterType((*StatefulSetCondition)(nil), "k8s.io.api.apps.v1beta1.StatefulSetCondition") proto.RegisterType((*StatefulSetList)(nil), "k8s.io.api.apps.v1beta1.StatefulSetList") + proto.RegisterType((*StatefulSetOrdinals)(nil), "k8s.io.api.apps.v1beta1.StatefulSetOrdinals") proto.RegisterType((*StatefulSetPersistentVolumeClaimRetentionPolicy)(nil), "k8s.io.api.apps.v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy") proto.RegisterType((*StatefulSetSpec)(nil), "k8s.io.api.apps.v1beta1.StatefulSetSpec") proto.RegisterType((*StatefulSetStatus)(nil), "k8s.io.api.apps.v1beta1.StatefulSetStatus") @@ -699,131 +728,135 @@ func init() { } var fileDescriptor_2a07313e8f66e805 = []byte{ - // 1982 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcf, 0x6f, 0x1b, 0xc7, - 0xf5, 0xd7, 0x52, 0xa2, 0x44, 0x3d, 0x45, 0x94, 0x3d, 0xd2, 0xd7, 0x62, 0x94, 0x6f, 0x49, 0x81, - 0x35, 0x12, 0xe5, 0x87, 0x97, 0xb1, 0x92, 0x06, 0x89, 0xdd, 0xba, 0x15, 0x25, 0x37, 0x76, 0x20, - 0xc5, 0xca, 0x48, 0x8a, 0xd1, 0xf4, 0x07, 0x32, 0x24, 0xc7, 0xd4, 0x46, 0xfb, 0x0b, 0xbb, 0x43, - 0xc6, 0x44, 0x2f, 0xfd, 0x03, 0x0a, 0xa4, 0xe7, 0xfe, 0x15, 0xbd, 0xb5, 0x68, 0xd1, 0x4b, 0x0f, - 0x85, 0x8f, 0x41, 0x2f, 0x4d, 0x2f, 0x44, 0xcd, 0x5c, 0xdb, 0x5b, 0x7b, 0x31, 0x50, 0xa0, 0x98, - 0xd9, 0xd9, 0xdf, 0xbb, 0xd2, 0xb2, 0x80, 0x05, 0xb4, 0x37, 0xed, 0xbc, 0xf7, 0x3e, 0x6f, 0xe6, - 0xcd, 0x7b, 0x6f, 0xde, 0x87, 0x82, 0xef, 0x9d, 0xbd, 0xeb, 0xaa, 0x9a, 0xd5, 0x3a, 0x1b, 0x74, - 0xa8, 0x63, 0x52, 0x46, 0xdd, 0xd6, 0x90, 0x9a, 0x3d, 0xcb, 0x69, 0x49, 0x01, 0xb1, 0xb5, 0x16, - 0xb1, 0x6d, 0xb7, 0x35, 0xbc, 0xd9, 0xa1, 0x8c, 0xdc, 0x6c, 0xf5, 0xa9, 0x49, 0x1d, 0xc2, 0x68, - 0x4f, 0xb5, 0x1d, 0x8b, 0x59, 0x68, 0xdd, 0x53, 0x54, 0x89, 0xad, 0xa9, 0x5c, 0x51, 0x95, 0x8a, - 0x1b, 0x37, 0xfa, 0x1a, 0x3b, 0x1d, 0x74, 0xd4, 0xae, 0x65, 0xb4, 0xfa, 0x56, 0xdf, 0x6a, 0x09, - 0xfd, 0xce, 0xe0, 0x91, 0xf8, 0x12, 0x1f, 0xe2, 0x2f, 0x0f, 0x67, 0xa3, 0x19, 0x71, 0xd8, 0xb5, - 0x1c, 0xda, 0x1a, 0xa6, 0x7c, 0x6d, 0xbc, 0x1d, 0xea, 0x18, 0xa4, 0x7b, 0xaa, 0x99, 0xd4, 0x19, - 0xb5, 0xec, 0xb3, 0x3e, 0x5f, 0x70, 0x5b, 0x06, 0x65, 0x24, 0xcb, 0xaa, 0x95, 0x67, 0xe5, 0x0c, - 0x4c, 0xa6, 0x19, 0x34, 0x65, 0xf0, 0xce, 0x45, 0x06, 0x6e, 0xf7, 0x94, 0x1a, 0x24, 0x65, 0xf7, - 0x56, 0x9e, 0xdd, 0x80, 0x69, 0x7a, 0x4b, 0x33, 0x99, 0xcb, 0x9c, 0xa4, 0x51, 0xf3, 0x9f, 0x0a, - 0xa0, 0x5d, 0xcb, 0x64, 0x8e, 0xa5, 0xeb, 0xd4, 0xc1, 0x74, 0xa8, 0xb9, 0x9a, 0x65, 0xa2, 0x4f, - 0xa1, 0xc2, 0xcf, 0xd3, 0x23, 0x8c, 0xd4, 0x94, 0x4d, 0x65, 0x6b, 0x69, 0xfb, 0x4d, 0x35, 0x8c, - 0x74, 0x00, 0xaf, 0xda, 0x67, 0x7d, 0xbe, 0xe0, 0xaa, 0x5c, 0x5b, 0x1d, 0xde, 0x54, 0x1f, 0x74, - 0x3e, 0xa3, 0x5d, 0x76, 0x40, 0x19, 0x69, 0xa3, 0x27, 0xe3, 0xc6, 0xcc, 0x64, 0xdc, 0x80, 0x70, - 0x0d, 0x07, 0xa8, 0xe8, 0x01, 0xcc, 0x09, 0xf4, 0x92, 0x40, 0xbf, 0x91, 0x8b, 0x2e, 0x0f, 0xad, - 0x62, 0xf2, 0xf9, 0xdd, 0xc7, 0x8c, 0x9a, 0x7c, 0x7b, 0xed, 0x17, 0x24, 0xf4, 0xdc, 0x1e, 0x61, - 0x04, 0x0b, 0x20, 0xf4, 0x06, 0x54, 0x1c, 0xb9, 0xfd, 0xda, 0xec, 0xa6, 0xb2, 0x35, 0xdb, 0xbe, - 0x22, 0xb5, 0x2a, 0xfe, 0xb1, 0x70, 0xa0, 0xd1, 0x7c, 0xa2, 0xc0, 0xb5, 0xf4, 0xb9, 0xf7, 0x35, - 0x97, 0xa1, 0x1f, 0xa5, 0xce, 0xae, 0x16, 0x3b, 0x3b, 0xb7, 0x16, 0x27, 0x0f, 0x1c, 0xfb, 0x2b, - 0x91, 0x73, 0x1f, 0x42, 0x59, 0x63, 0xd4, 0x70, 0x6b, 0xa5, 0xcd, 0xd9, 0xad, 0xa5, 0xed, 0xd7, - 0xd5, 0x9c, 0x04, 0x56, 0xd3, 0xbb, 0x6b, 0x2f, 0x4b, 0xdc, 0xf2, 0x7d, 0x8e, 0x80, 0x3d, 0xa0, - 0xe6, 0xcf, 0x4b, 0x00, 0x7b, 0xd4, 0xd6, 0xad, 0x91, 0x41, 0x4d, 0x76, 0x09, 0x57, 0x77, 0x1f, - 0xe6, 0x5c, 0x9b, 0x76, 0xe5, 0xd5, 0xbd, 0x92, 0x7b, 0x82, 0x70, 0x53, 0x47, 0x36, 0xed, 0x86, - 0x97, 0xc6, 0xbf, 0xb0, 0x80, 0x40, 0x1f, 0xc1, 0xbc, 0xcb, 0x08, 0x1b, 0xb8, 0xe2, 0xca, 0x96, - 0xb6, 0x5f, 0x2d, 0x02, 0x26, 0x0c, 0xda, 0x55, 0x09, 0x37, 0xef, 0x7d, 0x63, 0x09, 0xd4, 0xfc, - 0xf3, 0x2c, 0xac, 0x86, 0xca, 0xbb, 0x96, 0xd9, 0xd3, 0x18, 0x4f, 0xe9, 0xdb, 0x30, 0xc7, 0x46, - 0x36, 0x15, 0x31, 0x59, 0x6c, 0xbf, 0xe2, 0x6f, 0xe6, 0x78, 0x64, 0xd3, 0x67, 0xe3, 0xc6, 0x7a, - 0x86, 0x09, 0x17, 0x61, 0x61, 0x84, 0xf6, 0x83, 0x7d, 0x96, 0x84, 0xf9, 0xdb, 0x71, 0xe7, 0xcf, - 0xc6, 0x8d, 0x8c, 0x06, 0xa2, 0x06, 0x48, 0xf1, 0x2d, 0xa2, 0xcf, 0xa0, 0xaa, 0x13, 0x97, 0x9d, - 0xd8, 0x3d, 0xc2, 0xe8, 0xb1, 0x66, 0xd0, 0xda, 0xbc, 0x38, 0xfd, 0x6b, 0xc5, 0x2e, 0x8a, 0x5b, - 0xb4, 0xaf, 0xc9, 0x1d, 0x54, 0xf7, 0x63, 0x48, 0x38, 0x81, 0x8c, 0x86, 0x80, 0xf8, 0xca, 0xb1, - 0x43, 0x4c, 0xd7, 0x3b, 0x15, 0xf7, 0xb7, 0x30, 0xb5, 0xbf, 0x0d, 0xe9, 0x0f, 0xed, 0xa7, 0xd0, - 0x70, 0x86, 0x07, 0xf4, 0x32, 0xcc, 0x3b, 0x94, 0xb8, 0x96, 0x59, 0x9b, 0x13, 0x11, 0x0b, 0xae, - 0x0b, 0x8b, 0x55, 0x2c, 0xa5, 0xe8, 0x55, 0x58, 0x30, 0xa8, 0xeb, 0x92, 0x3e, 0xad, 0x95, 0x85, - 0xe2, 0x8a, 0x54, 0x5c, 0x38, 0xf0, 0x96, 0xb1, 0x2f, 0x6f, 0xfe, 0x46, 0x81, 0x6a, 0x78, 0x4d, - 0x97, 0x50, 0xab, 0xf7, 0xe2, 0xb5, 0xfa, 0xcd, 0x02, 0xc9, 0x99, 0x53, 0xa3, 0x7f, 0x2b, 0x01, - 0x0a, 0x95, 0xb0, 0xa5, 0xeb, 0x1d, 0xd2, 0x3d, 0x43, 0x9b, 0x30, 0x67, 0x12, 0xc3, 0xcf, 0xc9, - 0xa0, 0x40, 0x3e, 0x24, 0x06, 0xc5, 0x42, 0x82, 0xbe, 0x50, 0x00, 0x0d, 0xc4, 0x6d, 0xf6, 0x76, - 0x4c, 0xd3, 0x62, 0x84, 0x07, 0xd8, 0xdf, 0xd0, 0x6e, 0x81, 0x0d, 0xf9, 0xbe, 0xd4, 0x93, 0x14, - 0xca, 0x5d, 0x93, 0x39, 0xa3, 0xf0, 0x62, 0xd3, 0x0a, 0x38, 0xc3, 0x35, 0xfa, 0x21, 0x80, 0x23, - 0x31, 0x8f, 0x2d, 0x59, 0xb6, 0xf9, 0x3d, 0xc0, 0x77, 0xbf, 0x6b, 0x99, 0x8f, 0xb4, 0x7e, 0xd8, - 0x58, 0x70, 0x00, 0x81, 0x23, 0x70, 0x1b, 0x77, 0x61, 0x3d, 0x67, 0x9f, 0xe8, 0x0a, 0xcc, 0x9e, - 0xd1, 0x91, 0x17, 0x2a, 0xcc, 0xff, 0x44, 0x6b, 0x50, 0x1e, 0x12, 0x7d, 0x40, 0xbd, 0x9a, 0xc4, - 0xde, 0xc7, 0xad, 0xd2, 0xbb, 0x4a, 0xf3, 0x57, 0xe5, 0x68, 0xa6, 0xf0, 0x7e, 0x83, 0xb6, 0xf8, - 0xf3, 0x60, 0xeb, 0x5a, 0x97, 0xb8, 0x02, 0xa3, 0xdc, 0x7e, 0xc1, 0x7b, 0x1a, 0xbc, 0x35, 0x1c, - 0x48, 0xd1, 0x8f, 0xa1, 0xe2, 0x52, 0x9d, 0x76, 0x99, 0xe5, 0xc8, 0x16, 0xf7, 0x56, 0xc1, 0x9c, - 0x22, 0x1d, 0xaa, 0x1f, 0x49, 0x53, 0x0f, 0xde, 0xff, 0xc2, 0x01, 0x24, 0xfa, 0x08, 0x2a, 0x8c, - 0x1a, 0xb6, 0x4e, 0x18, 0x95, 0xd1, 0x8b, 0xe5, 0x15, 0xef, 0x1d, 0x1c, 0xec, 0xd0, 0xea, 0x1d, - 0x4b, 0x35, 0xd1, 0x3d, 0x83, 0x3c, 0xf5, 0x57, 0x71, 0x00, 0x83, 0x7e, 0x00, 0x15, 0x97, 0xf1, - 0x57, 0xbd, 0x3f, 0x12, 0xd5, 0x76, 0xde, 0xb3, 0x12, 0xed, 0xa3, 0x9e, 0x49, 0x08, 0xed, 0xaf, - 0xe0, 0x00, 0x0e, 0xed, 0xc0, 0x8a, 0xa1, 0x99, 0x98, 0x92, 0xde, 0xe8, 0x88, 0x76, 0x2d, 0xb3, - 0xe7, 0x8a, 0x32, 0x2d, 0xb7, 0xd7, 0xa5, 0xd1, 0xca, 0x41, 0x5c, 0x8c, 0x93, 0xfa, 0x68, 0x1f, - 0xd6, 0xfc, 0x67, 0xf7, 0x9e, 0xe6, 0x32, 0xcb, 0x19, 0xed, 0x6b, 0x86, 0xc6, 0x44, 0xcf, 0x2b, - 0xb7, 0x6b, 0x93, 0x71, 0x63, 0x0d, 0x67, 0xc8, 0x71, 0xa6, 0x15, 0xef, 0x2b, 0x36, 0x19, 0xb8, - 0xb4, 0x27, 0x7a, 0x58, 0x25, 0xec, 0x2b, 0x87, 0x62, 0x15, 0x4b, 0x29, 0x7a, 0x18, 0x4b, 0xd3, - 0xca, 0x74, 0x69, 0x5a, 0xcd, 0x4f, 0x51, 0x74, 0x02, 0xeb, 0xb6, 0x63, 0xf5, 0x1d, 0xea, 0xba, - 0x7b, 0x94, 0xf4, 0x74, 0xcd, 0xa4, 0x7e, 0x64, 0x16, 0xc5, 0x89, 0x5e, 0x9a, 0x8c, 0x1b, 0xeb, - 0x87, 0xd9, 0x2a, 0x38, 0xcf, 0xb6, 0xf9, 0x87, 0x39, 0xb8, 0x92, 0x7c, 0xe3, 0xd0, 0x07, 0x80, - 0xac, 0x8e, 0x4b, 0x9d, 0x21, 0xed, 0xbd, 0xef, 0x0d, 0x6e, 0x7c, 0xba, 0x51, 0xc4, 0x74, 0x13, - 0xd4, 0xed, 0x83, 0x94, 0x06, 0xce, 0xb0, 0xf2, 0xe6, 0x23, 0x59, 0x00, 0x25, 0xb1, 0xd1, 0xc8, - 0x7c, 0x94, 0x2a, 0x82, 0x1d, 0x58, 0x91, 0xb5, 0xef, 0x0b, 0x45, 0xb2, 0x46, 0xee, 0xfd, 0x24, - 0x2e, 0xc6, 0x49, 0x7d, 0x74, 0x1b, 0x96, 0x1d, 0x9e, 0x07, 0x01, 0xc0, 0x82, 0x00, 0xf8, 0x3f, - 0x09, 0xb0, 0x8c, 0xa3, 0x42, 0x1c, 0xd7, 0x45, 0xef, 0xc3, 0x55, 0x32, 0x24, 0x9a, 0x4e, 0x3a, - 0x3a, 0x0d, 0x00, 0xe6, 0x04, 0xc0, 0x8b, 0x12, 0xe0, 0xea, 0x4e, 0x52, 0x01, 0xa7, 0x6d, 0xd0, - 0x01, 0xac, 0x0e, 0xcc, 0x34, 0x94, 0x97, 0xc4, 0x2f, 0x49, 0xa8, 0xd5, 0x93, 0xb4, 0x0a, 0xce, - 0xb2, 0x43, 0x9f, 0x02, 0x74, 0xfd, 0x57, 0xdd, 0xad, 0xcd, 0x8b, 0x36, 0xfc, 0x46, 0x81, 0x62, - 0x0b, 0x46, 0x81, 0xb0, 0x05, 0x06, 0x4b, 0x2e, 0x8e, 0x60, 0xa2, 0x5b, 0x50, 0xed, 0x5a, 0xba, - 0x2e, 0x32, 0x7f, 0xd7, 0x1a, 0x98, 0x4c, 0x24, 0x6f, 0xb9, 0x8d, 0xf8, 0x63, 0xbf, 0x1b, 0x93, - 0xe0, 0x84, 0x66, 0xf3, 0x77, 0x4a, 0xf4, 0x99, 0xf1, 0xcb, 0x19, 0xdd, 0x8a, 0x8d, 0x3e, 0x2f, - 0x27, 0x46, 0x9f, 0x6b, 0x69, 0x8b, 0xc8, 0xe4, 0xa3, 0xc1, 0x32, 0x4f, 0x7e, 0xcd, 0xec, 0x7b, - 0x17, 0x2e, 0x5b, 0xe2, 0x9b, 0xe7, 0x96, 0x52, 0xa0, 0x1d, 0x79, 0x18, 0xaf, 0x8a, 0x3b, 0x8f, - 0x0a, 0x71, 0x1c, 0xb9, 0x79, 0x07, 0xaa, 0xf1, 0x3a, 0x8c, 0xcd, 0xf4, 0xca, 0x85, 0x33, 0xfd, - 0xd7, 0x0a, 0xac, 0xe7, 0x78, 0x47, 0x3a, 0x54, 0x0d, 0xf2, 0x38, 0x72, 0xcd, 0x17, 0xce, 0xc6, - 0x9c, 0x35, 0xa9, 0x1e, 0x6b, 0x52, 0xef, 0x9b, 0xec, 0x81, 0x73, 0xc4, 0x1c, 0xcd, 0xec, 0x7b, - 0xf7, 0x70, 0x10, 0xc3, 0xc2, 0x09, 0x6c, 0xf4, 0x09, 0x54, 0x0c, 0xf2, 0xf8, 0x68, 0xe0, 0xf4, - 0xb3, 0xe2, 0x55, 0xcc, 0x8f, 0x78, 0x3f, 0x0e, 0x24, 0x0a, 0x0e, 0xf0, 0x9a, 0xbf, 0x57, 0x60, - 0x33, 0x76, 0x4a, 0xde, 0x2b, 0xe8, 0xa3, 0x81, 0x7e, 0x44, 0xc3, 0x1b, 0x7f, 0x1d, 0x16, 0x6d, - 0xe2, 0x30, 0x2d, 0xe8, 0x17, 0xe5, 0xf6, 0xf2, 0x64, 0xdc, 0x58, 0x3c, 0xf4, 0x17, 0x71, 0x28, - 0xcf, 0x88, 0x4d, 0xe9, 0xf9, 0xc5, 0xa6, 0xf9, 0x2f, 0x05, 0xca, 0x47, 0x5d, 0xa2, 0xd3, 0x4b, - 0x60, 0x2a, 0x7b, 0x31, 0xa6, 0xd2, 0xcc, 0xcd, 0x59, 0xb1, 0x9f, 0x5c, 0x92, 0xb2, 0x9f, 0x20, - 0x29, 0xd7, 0x2f, 0xc0, 0x39, 0x9f, 0x9f, 0xbc, 0x07, 0x8b, 0x81, 0xbb, 0x58, 0x53, 0x56, 0x2e, - 0x6a, 0xca, 0xcd, 0x5f, 0x96, 0x60, 0x29, 0xe2, 0x62, 0x3a, 0x6b, 0x1e, 0xee, 0xc8, 0x5c, 0xc3, - 0x1b, 0xd7, 0x76, 0x91, 0x83, 0xa8, 0xfe, 0x0c, 0xe3, 0x8d, 0x8b, 0xe1, 0xb0, 0x90, 0x1e, 0x6d, - 0xee, 0x40, 0x95, 0x11, 0xa7, 0x4f, 0x99, 0x2f, 0x13, 0x01, 0x5b, 0x0c, 0xb9, 0xca, 0x71, 0x4c, - 0x8a, 0x13, 0xda, 0x1b, 0xb7, 0x61, 0x39, 0xe6, 0x6c, 0xaa, 0x99, 0xef, 0x0b, 0x1e, 0x9c, 0xb0, - 0x14, 0x2e, 0x21, 0xbb, 0x3e, 0x88, 0x65, 0xd7, 0x56, 0x7e, 0x30, 0x23, 0x05, 0x9a, 0x97, 0x63, - 0x38, 0x91, 0x63, 0xaf, 0x15, 0x42, 0x3b, 0x3f, 0xd3, 0xfe, 0x5e, 0x82, 0xb5, 0x88, 0x76, 0x48, - 0x85, 0xbf, 0x1d, 0x7b, 0x0f, 0xb6, 0x12, 0xef, 0x41, 0x2d, 0xcb, 0xe6, 0xb9, 0x71, 0xe1, 0x6c, - 0x7e, 0x3a, 0xfb, 0xdf, 0xc8, 0x4f, 0x7f, 0xab, 0xc0, 0x4a, 0x24, 0x76, 0x97, 0x40, 0x50, 0xef, - 0xc7, 0x09, 0xea, 0xf5, 0x22, 0x49, 0x93, 0xc3, 0x50, 0xff, 0xa1, 0x40, 0x2b, 0xa2, 0x75, 0x48, - 0x1d, 0x57, 0x73, 0x19, 0x35, 0xd9, 0xc7, 0x96, 0x3e, 0x30, 0xe8, 0xae, 0x4e, 0x34, 0x03, 0x53, - 0xbe, 0xa0, 0x59, 0xe6, 0xa1, 0xa5, 0x6b, 0xdd, 0x11, 0x22, 0xb0, 0xf4, 0xf9, 0x29, 0x35, 0xf7, - 0xa8, 0x4e, 0x19, 0xed, 0xc9, 0x74, 0xfa, 0xae, 0x84, 0x5f, 0x7a, 0x18, 0x8a, 0x9e, 0x8d, 0x1b, - 0x5b, 0x45, 0x10, 0x45, 0x96, 0x45, 0x31, 0xd1, 0x4f, 0x00, 0xf8, 0xa7, 0xe8, 0x47, 0x3d, 0x99, - 0x70, 0x77, 0xfc, 0xaa, 0x7c, 0x18, 0x48, 0xa6, 0x72, 0x10, 0x41, 0x6c, 0xfe, 0x65, 0x21, 0x76, - 0x67, 0xff, 0xf3, 0x54, 0xf1, 0xa7, 0xb0, 0x36, 0x0c, 0xa3, 0xe3, 0x2b, 0xf0, 0xd1, 0x7a, 0x36, - 0xf9, 0xf3, 0x5b, 0x00, 0x9f, 0x15, 0xd7, 0xf6, 0xff, 0x4b, 0x27, 0x6b, 0x1f, 0x67, 0xc0, 0xe1, - 0x4c, 0x27, 0xe8, 0x5b, 0xb0, 0xc4, 0x69, 0x89, 0xd6, 0xa5, 0x1f, 0x12, 0xc3, 0xaf, 0xa7, 0x55, - 0x3f, 0x5f, 0x8e, 0x42, 0x11, 0x8e, 0xea, 0xa1, 0x53, 0x58, 0xb5, 0xad, 0xde, 0x01, 0x31, 0x49, - 0x9f, 0xf2, 0x61, 0xce, 0xbb, 0x4a, 0xc1, 0x1f, 0x17, 0xdb, 0xef, 0xf8, 0x23, 0xfc, 0x61, 0x5a, - 0xe5, 0x19, 0x27, 0x62, 0xe9, 0x65, 0x91, 0x04, 0x59, 0x90, 0xc8, 0x81, 0xea, 0x40, 0xce, 0x54, - 0x92, 0x4e, 0x7b, 0x3f, 0x94, 0x6d, 0x17, 0x29, 0xac, 0x93, 0x98, 0x65, 0xf8, 0xe8, 0xc5, 0xd7, - 0x71, 0xc2, 0x43, 0x2e, 0x3d, 0xae, 0xfc, 0x47, 0xf4, 0x38, 0x83, 0xaf, 0x2f, 0x4e, 0xc9, 0xd7, - 0xff, 0xa8, 0xc0, 0x75, 0xbb, 0x40, 0x2d, 0xd5, 0x40, 0xc4, 0xe6, 0x5e, 0x91, 0xd8, 0x14, 0xa9, - 0xcd, 0xf6, 0xd6, 0x64, 0xdc, 0xb8, 0x5e, 0x44, 0x13, 0x17, 0xda, 0x5f, 0xf3, 0xd7, 0x65, 0xb8, - 0x9a, 0x7a, 0x2d, 0xd1, 0xf7, 0xcf, 0xe1, 0xd4, 0xd7, 0x9e, 0x1b, 0x9f, 0x4e, 0x91, 0xe1, 0xd9, - 0x29, 0xc8, 0xf0, 0x0e, 0xac, 0x74, 0x07, 0x8e, 0x43, 0x4d, 0x96, 0xa0, 0xc2, 0xc1, 0xa5, 0xee, - 0xc6, 0xc5, 0x38, 0xa9, 0x9f, 0xc5, 0xe7, 0xcb, 0x53, 0xf2, 0xf9, 0xe8, 0x2e, 0x24, 0x27, 0xf3, - 0x4a, 0x30, 0xbd, 0x0b, 0x49, 0xcd, 0x92, 0xfa, 0x7c, 0x40, 0xf4, 0x50, 0x03, 0x84, 0x85, 0xf8, - 0x80, 0x78, 0x12, 0x93, 0xe2, 0x84, 0x76, 0x06, 0x37, 0x5e, 0x2c, 0xca, 0x8d, 0x11, 0x89, 0x31, - 0x77, 0x10, 0xfd, 0xee, 0x46, 0x91, 0xdc, 0x2d, 0x4e, 0xdd, 0x33, 0x7f, 0xb4, 0x58, 0x9a, 0xfe, - 0x47, 0x8b, 0xe6, 0x9f, 0x14, 0x78, 0x31, 0xb7, 0xb3, 0xa0, 0x9d, 0xd8, 0xf8, 0x76, 0x23, 0x31, - 0xbe, 0x7d, 0x23, 0xd7, 0x30, 0x32, 0xc3, 0x39, 0xd9, 0xac, 0xfe, 0xbd, 0x62, 0xac, 0x3e, 0x83, - 0x71, 0x5e, 0x4c, 0xef, 0xdb, 0xdf, 0x79, 0xf2, 0xb4, 0x3e, 0xf3, 0xe5, 0xd3, 0xfa, 0xcc, 0x57, - 0x4f, 0xeb, 0x33, 0x3f, 0x9b, 0xd4, 0x95, 0x27, 0x93, 0xba, 0xf2, 0xe5, 0xa4, 0xae, 0x7c, 0x35, - 0xa9, 0x2b, 0x7f, 0x9d, 0xd4, 0x95, 0x5f, 0x7c, 0x5d, 0x9f, 0xf9, 0x64, 0x3d, 0xe7, 0x3f, 0xbf, - 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xe7, 0x15, 0x68, 0x85, 0x2c, 0x1e, 0x00, 0x00, + // 2038 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x59, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xd7, 0x52, 0xa2, 0x44, 0x3d, 0x45, 0x54, 0x3c, 0x52, 0x2d, 0x46, 0x69, 0x25, 0x61, 0x6b, + 0x24, 0x4a, 0x62, 0x2f, 0x63, 0x25, 0x0d, 0x12, 0xbb, 0x75, 0x2a, 0x4a, 0x6e, 0xec, 0x40, 0x8a, + 0x94, 0x91, 0x64, 0xa3, 0xe9, 0x07, 0x32, 0x22, 0xc7, 0xd4, 0x46, 0xfb, 0x85, 0xdd, 0x21, 0x63, + 0xa2, 0x97, 0xfe, 0x01, 0x05, 0xd2, 0x73, 0xff, 0x8a, 0xf6, 0xd4, 0xa2, 0x45, 0x2f, 0x3d, 0x14, + 0x3e, 0x06, 0xbd, 0x34, 0x27, 0xa2, 0x66, 0xae, 0xed, 0xad, 0xbd, 0x18, 0x28, 0x50, 0xcc, 0xec, + 0xec, 0xf7, 0xae, 0xb4, 0x2c, 0x60, 0x01, 0xed, 0x8d, 0x3b, 0xef, 0xbd, 0xdf, 0x7b, 0xf3, 0xe6, + 0xbd, 0x37, 0xef, 0x0d, 0xe1, 0xfb, 0x67, 0xef, 0x7a, 0x9a, 0x6e, 0x37, 0xcf, 0x7a, 0x27, 0xd4, + 0xb5, 0x28, 0xa3, 0x5e, 0xb3, 0x4f, 0xad, 0x8e, 0xed, 0x36, 0x25, 0x81, 0x38, 0x7a, 0x93, 0x38, + 0x8e, 0xd7, 0xec, 0xdf, 0x3c, 0xa1, 0x8c, 0xdc, 0x6c, 0x76, 0xa9, 0x45, 0x5d, 0xc2, 0x68, 0x47, + 0x73, 0x5c, 0x9b, 0xd9, 0x68, 0xd9, 0x67, 0xd4, 0x88, 0xa3, 0x6b, 0x9c, 0x51, 0x93, 0x8c, 0x2b, + 0x37, 0xba, 0x3a, 0x3b, 0xed, 0x9d, 0x68, 0x6d, 0xdb, 0x6c, 0x76, 0xed, 0xae, 0xdd, 0x14, 0xfc, + 0x27, 0xbd, 0x47, 0xe2, 0x4b, 0x7c, 0x88, 0x5f, 0x3e, 0xce, 0x8a, 0x1a, 0x53, 0xd8, 0xb6, 0x5d, + 0xda, 0xec, 0x67, 0x74, 0xad, 0xbc, 0x1d, 0xf1, 0x98, 0xa4, 0x7d, 0xaa, 0x5b, 0xd4, 0x1d, 0x34, + 0x9d, 0xb3, 0x2e, 0x5f, 0xf0, 0x9a, 0x26, 0x65, 0x24, 0x4f, 0xaa, 0x59, 0x24, 0xe5, 0xf6, 0x2c, + 0xa6, 0x9b, 0x34, 0x23, 0xf0, 0xce, 0x45, 0x02, 0x5e, 0xfb, 0x94, 0x9a, 0x24, 0x23, 0xf7, 0x56, + 0x91, 0x5c, 0x8f, 0xe9, 0x46, 0x53, 0xb7, 0x98, 0xc7, 0xdc, 0xb4, 0x90, 0xfa, 0x2f, 0x05, 0xd0, + 0xb6, 0x6d, 0x31, 0xd7, 0x36, 0x0c, 0xea, 0x62, 0xda, 0xd7, 0x3d, 0xdd, 0xb6, 0xd0, 0xa7, 0x50, + 0xe3, 0xfb, 0xe9, 0x10, 0x46, 0x1a, 0xca, 0xba, 0xb2, 0x31, 0xb7, 0xf9, 0xa6, 0x16, 0x79, 0x3a, + 0x84, 0xd7, 0x9c, 0xb3, 0x2e, 0x5f, 0xf0, 0x34, 0xce, 0xad, 0xf5, 0x6f, 0x6a, 0xfb, 0x27, 0x9f, + 0xd1, 0x36, 0xdb, 0xa3, 0x8c, 0xb4, 0xd0, 0x93, 0xe1, 0xda, 0xc4, 0x68, 0xb8, 0x06, 0xd1, 0x1a, + 0x0e, 0x51, 0xd1, 0x3e, 0x4c, 0x09, 0xf4, 0x8a, 0x40, 0xbf, 0x51, 0x88, 0x2e, 0x37, 0xad, 0x61, + 0xf2, 0xf9, 0xdd, 0xc7, 0x8c, 0x5a, 0xdc, 0xbc, 0xd6, 0x0b, 0x12, 0x7a, 0x6a, 0x87, 0x30, 0x82, + 0x05, 0x10, 0xba, 0x0e, 0x35, 0x57, 0x9a, 0xdf, 0x98, 0x5c, 0x57, 0x36, 0x26, 0x5b, 0x2f, 0x4a, + 0xae, 0x5a, 0xb0, 0x2d, 0x1c, 0x72, 0xa8, 0x4f, 0x14, 0xb8, 0x9a, 0xdd, 0xf7, 0xae, 0xee, 0x31, + 0xf4, 0xe3, 0xcc, 0xde, 0xb5, 0x72, 0x7b, 0xe7, 0xd2, 0x62, 0xe7, 0xa1, 0xe2, 0x60, 0x25, 0xb6, + 0xef, 0x03, 0xa8, 0xea, 0x8c, 0x9a, 0x5e, 0xa3, 0xb2, 0x3e, 0xb9, 0x31, 0xb7, 0xf9, 0x86, 0x56, + 0x10, 0xc0, 0x5a, 0xd6, 0xba, 0xd6, 0xbc, 0xc4, 0xad, 0xde, 0xe7, 0x08, 0xd8, 0x07, 0x52, 0x7f, + 0x51, 0x01, 0xd8, 0xa1, 0x8e, 0x61, 0x0f, 0x4c, 0x6a, 0xb1, 0x4b, 0x38, 0xba, 0xfb, 0x30, 0xe5, + 0x39, 0xb4, 0x2d, 0x8f, 0xee, 0xd5, 0xc2, 0x1d, 0x44, 0x46, 0x1d, 0x3a, 0xb4, 0x1d, 0x1d, 0x1a, + 0xff, 0xc2, 0x02, 0x02, 0x7d, 0x0c, 0xd3, 0x1e, 0x23, 0xac, 0xe7, 0x89, 0x23, 0x9b, 0xdb, 0x7c, + 0xad, 0x0c, 0x98, 0x10, 0x68, 0xd5, 0x25, 0xdc, 0xb4, 0xff, 0x8d, 0x25, 0x90, 0xfa, 0xd7, 0x49, + 0x58, 0x8c, 0x98, 0xb7, 0x6d, 0xab, 0xa3, 0x33, 0x1e, 0xd2, 0xb7, 0x61, 0x8a, 0x0d, 0x1c, 0x2a, + 0x7c, 0x32, 0xdb, 0x7a, 0x35, 0x30, 0xe6, 0x68, 0xe0, 0xd0, 0x67, 0xc3, 0xb5, 0xe5, 0x1c, 0x11, + 0x4e, 0xc2, 0x42, 0x08, 0xed, 0x86, 0x76, 0x56, 0x84, 0xf8, 0xdb, 0x49, 0xe5, 0xcf, 0x86, 0x6b, + 0x39, 0x05, 0x44, 0x0b, 0x91, 0x92, 0x26, 0xa2, 0xcf, 0xa0, 0x6e, 0x10, 0x8f, 0x1d, 0x3b, 0x1d, + 0xc2, 0xe8, 0x91, 0x6e, 0xd2, 0xc6, 0xb4, 0xd8, 0xfd, 0xeb, 0xe5, 0x0e, 0x8a, 0x4b, 0xb4, 0xae, + 0x4a, 0x0b, 0xea, 0xbb, 0x09, 0x24, 0x9c, 0x42, 0x46, 0x7d, 0x40, 0x7c, 0xe5, 0xc8, 0x25, 0x96, + 0xe7, 0xef, 0x8a, 0xeb, 0x9b, 0x19, 0x5b, 0xdf, 0x8a, 0xd4, 0x87, 0x76, 0x33, 0x68, 0x38, 0x47, + 0x03, 0x7a, 0x05, 0xa6, 0x5d, 0x4a, 0x3c, 0xdb, 0x6a, 0x4c, 0x09, 0x8f, 0x85, 0xc7, 0x85, 0xc5, + 0x2a, 0x96, 0x54, 0xf4, 0x1a, 0xcc, 0x98, 0xd4, 0xf3, 0x48, 0x97, 0x36, 0xaa, 0x82, 0x71, 0x41, + 0x32, 0xce, 0xec, 0xf9, 0xcb, 0x38, 0xa0, 0xab, 0xbf, 0x53, 0xa0, 0x1e, 0x1d, 0xd3, 0x25, 0xe4, + 0xea, 0xbd, 0x64, 0xae, 0x7e, 0xbb, 0x44, 0x70, 0x16, 0xe4, 0xe8, 0xdf, 0x2b, 0x80, 0x22, 0x26, + 0x6c, 0x1b, 0xc6, 0x09, 0x69, 0x9f, 0xa1, 0x75, 0x98, 0xb2, 0x88, 0x19, 0xc4, 0x64, 0x98, 0x20, + 0x1f, 0x11, 0x93, 0x62, 0x41, 0x41, 0x5f, 0x28, 0x80, 0x7a, 0xe2, 0x34, 0x3b, 0x5b, 0x96, 0x65, + 0x33, 0xc2, 0x1d, 0x1c, 0x18, 0xb4, 0x5d, 0xc2, 0xa0, 0x40, 0x97, 0x76, 0x9c, 0x41, 0xb9, 0x6b, + 0x31, 0x77, 0x10, 0x1d, 0x6c, 0x96, 0x01, 0xe7, 0xa8, 0x46, 0x3f, 0x02, 0x70, 0x25, 0xe6, 0x91, + 0x2d, 0xd3, 0xb6, 0xb8, 0x06, 0x04, 0xea, 0xb7, 0x6d, 0xeb, 0x91, 0xde, 0x8d, 0x0a, 0x0b, 0x0e, + 0x21, 0x70, 0x0c, 0x6e, 0xe5, 0x2e, 0x2c, 0x17, 0xd8, 0x89, 0x5e, 0x84, 0xc9, 0x33, 0x3a, 0xf0, + 0x5d, 0x85, 0xf9, 0x4f, 0xb4, 0x04, 0xd5, 0x3e, 0x31, 0x7a, 0xd4, 0xcf, 0x49, 0xec, 0x7f, 0xdc, + 0xaa, 0xbc, 0xab, 0xa8, 0xbf, 0xae, 0xc6, 0x23, 0x85, 0xd7, 0x1b, 0xb4, 0xc1, 0xaf, 0x07, 0xc7, + 0xd0, 0xdb, 0xc4, 0x13, 0x18, 0xd5, 0xd6, 0x0b, 0xfe, 0xd5, 0xe0, 0xaf, 0xe1, 0x90, 0x8a, 0x7e, + 0x02, 0x35, 0x8f, 0x1a, 0xb4, 0xcd, 0x6c, 0x57, 0x96, 0xb8, 0xb7, 0x4a, 0xc6, 0x14, 0x39, 0xa1, + 0xc6, 0xa1, 0x14, 0xf5, 0xe1, 0x83, 0x2f, 0x1c, 0x42, 0xa2, 0x8f, 0xa1, 0xc6, 0xa8, 0xe9, 0x18, + 0x84, 0x51, 0xe9, 0xbd, 0x44, 0x5c, 0xf1, 0xda, 0xc1, 0xc1, 0x0e, 0xec, 0xce, 0x91, 0x64, 0x13, + 0xd5, 0x33, 0x8c, 0xd3, 0x60, 0x15, 0x87, 0x30, 0xe8, 0x87, 0x50, 0xf3, 0x18, 0xbf, 0xd5, 0xbb, + 0x03, 0x91, 0x6d, 0xe7, 0x5d, 0x2b, 0xf1, 0x3a, 0xea, 0x8b, 0x44, 0xd0, 0xc1, 0x0a, 0x0e, 0xe1, + 0xd0, 0x16, 0x2c, 0x98, 0xba, 0x85, 0x29, 0xe9, 0x0c, 0x0e, 0x69, 0xdb, 0xb6, 0x3a, 0x9e, 0x48, + 0xd3, 0x6a, 0x6b, 0x59, 0x0a, 0x2d, 0xec, 0x25, 0xc9, 0x38, 0xcd, 0x8f, 0x76, 0x61, 0x29, 0xb8, + 0x76, 0xef, 0xe9, 0x1e, 0xb3, 0xdd, 0xc1, 0xae, 0x6e, 0xea, 0x4c, 0xd4, 0xbc, 0x6a, 0xab, 0x31, + 0x1a, 0xae, 0x2d, 0xe1, 0x1c, 0x3a, 0xce, 0x95, 0xe2, 0x75, 0xc5, 0x21, 0x3d, 0x8f, 0x76, 0x44, + 0x0d, 0xab, 0x45, 0x75, 0xe5, 0x40, 0xac, 0x62, 0x49, 0x45, 0x0f, 0x13, 0x61, 0x5a, 0x1b, 0x2f, + 0x4c, 0xeb, 0xc5, 0x21, 0x8a, 0x8e, 0x61, 0xd9, 0x71, 0xed, 0xae, 0x4b, 0x3d, 0x6f, 0x87, 0x92, + 0x8e, 0xa1, 0x5b, 0x34, 0xf0, 0xcc, 0xac, 0xd8, 0xd1, 0xcb, 0xa3, 0xe1, 0xda, 0xf2, 0x41, 0x3e, + 0x0b, 0x2e, 0x92, 0x55, 0xff, 0x34, 0x05, 0x2f, 0xa6, 0xef, 0x38, 0xf4, 0x21, 0x20, 0xfb, 0xc4, + 0xa3, 0x6e, 0x9f, 0x76, 0x3e, 0xf0, 0x1b, 0x37, 0xde, 0xdd, 0x28, 0xa2, 0xbb, 0x09, 0xf3, 0x76, + 0x3f, 0xc3, 0x81, 0x73, 0xa4, 0xfc, 0xfe, 0x48, 0x26, 0x40, 0x45, 0x18, 0x1a, 0xeb, 0x8f, 0x32, + 0x49, 0xb0, 0x05, 0x0b, 0x32, 0xf7, 0x03, 0xa2, 0x08, 0xd6, 0xd8, 0xb9, 0x1f, 0x27, 0xc9, 0x38, + 0xcd, 0x8f, 0x6e, 0xc3, 0xbc, 0xcb, 0xe3, 0x20, 0x04, 0x98, 0x11, 0x00, 0xdf, 0x90, 0x00, 0xf3, + 0x38, 0x4e, 0xc4, 0x49, 0x5e, 0xf4, 0x01, 0x5c, 0x21, 0x7d, 0xa2, 0x1b, 0xe4, 0xc4, 0xa0, 0x21, + 0xc0, 0x94, 0x00, 0x78, 0x49, 0x02, 0x5c, 0xd9, 0x4a, 0x33, 0xe0, 0xac, 0x0c, 0xda, 0x83, 0xc5, + 0x9e, 0x95, 0x85, 0xf2, 0x83, 0xf8, 0x65, 0x09, 0xb5, 0x78, 0x9c, 0x65, 0xc1, 0x79, 0x72, 0xe8, + 0x53, 0x80, 0x76, 0x70, 0xab, 0x7b, 0x8d, 0x69, 0x51, 0x86, 0xaf, 0x97, 0x48, 0xb6, 0xb0, 0x15, + 0x88, 0x4a, 0x60, 0xb8, 0xe4, 0xe1, 0x18, 0x26, 0xba, 0x05, 0xf5, 0xb6, 0x6d, 0x18, 0x22, 0xf2, + 0xb7, 0xed, 0x9e, 0xc5, 0x44, 0xf0, 0x56, 0x5b, 0x88, 0x5f, 0xf6, 0xdb, 0x09, 0x0a, 0x4e, 0x71, + 0xaa, 0x7f, 0x50, 0xe2, 0xd7, 0x4c, 0x90, 0xce, 0xe8, 0x56, 0xa2, 0xf5, 0x79, 0x25, 0xd5, 0xfa, + 0x5c, 0xcd, 0x4a, 0xc4, 0x3a, 0x1f, 0x1d, 0xe6, 0x79, 0xf0, 0xeb, 0x56, 0xd7, 0x3f, 0x70, 0x59, + 0x12, 0xdf, 0x3c, 0x37, 0x95, 0x42, 0xee, 0xd8, 0xc5, 0x78, 0x45, 0x9c, 0x79, 0x9c, 0x88, 0x93, + 0xc8, 0xea, 0x1d, 0xa8, 0x27, 0xf3, 0x30, 0xd1, 0xd3, 0x2b, 0x17, 0xf6, 0xf4, 0x5f, 0x2b, 0xb0, + 0x5c, 0xa0, 0x1d, 0x19, 0x50, 0x37, 0xc9, 0xe3, 0xd8, 0x31, 0x5f, 0xd8, 0x1b, 0xf3, 0xa9, 0x49, + 0xf3, 0xa7, 0x26, 0xed, 0xbe, 0xc5, 0xf6, 0xdd, 0x43, 0xe6, 0xea, 0x56, 0xd7, 0x3f, 0x87, 0xbd, + 0x04, 0x16, 0x4e, 0x61, 0xa3, 0x4f, 0xa0, 0x66, 0x92, 0xc7, 0x87, 0x3d, 0xb7, 0x9b, 0xe7, 0xaf, + 0x72, 0x7a, 0xc4, 0xfd, 0xb1, 0x27, 0x51, 0x70, 0x88, 0xa7, 0xfe, 0x51, 0x81, 0xf5, 0xc4, 0x2e, + 0x79, 0xad, 0xa0, 0x8f, 0x7a, 0xc6, 0x21, 0x8d, 0x4e, 0xfc, 0x0d, 0x98, 0x75, 0x88, 0xcb, 0xf4, + 0xb0, 0x5e, 0x54, 0x5b, 0xf3, 0xa3, 0xe1, 0xda, 0xec, 0x41, 0xb0, 0x88, 0x23, 0x7a, 0x8e, 0x6f, + 0x2a, 0xcf, 0xcf, 0x37, 0xea, 0xbf, 0x15, 0xa8, 0x1e, 0xb6, 0x89, 0x41, 0x2f, 0x61, 0x52, 0xd9, + 0x49, 0x4c, 0x2a, 0x6a, 0x61, 0xcc, 0x0a, 0x7b, 0x0a, 0x87, 0x94, 0xdd, 0xd4, 0x90, 0x72, 0xed, + 0x02, 0x9c, 0xf3, 0xe7, 0x93, 0xf7, 0x60, 0x36, 0x54, 0x97, 0x28, 0xca, 0xca, 0x45, 0x45, 0x59, + 0xfd, 0x55, 0x05, 0xe6, 0x62, 0x2a, 0xc6, 0x93, 0xe6, 0xee, 0x8e, 0xf5, 0x35, 0xbc, 0x70, 0x6d, + 0x96, 0xd9, 0x88, 0x16, 0xf4, 0x30, 0x7e, 0xbb, 0x18, 0x35, 0x0b, 0xd9, 0xd6, 0xe6, 0x0e, 0xd4, + 0x19, 0x71, 0xbb, 0x94, 0x05, 0x34, 0xe1, 0xb0, 0xd9, 0x68, 0x56, 0x39, 0x4a, 0x50, 0x71, 0x8a, + 0x7b, 0xe5, 0x36, 0xcc, 0x27, 0x94, 0x8d, 0xd5, 0xf3, 0x7d, 0xc1, 0x9d, 0x13, 0xa5, 0xc2, 0x25, + 0x44, 0xd7, 0x87, 0x89, 0xe8, 0xda, 0x28, 0x76, 0x66, 0x2c, 0x41, 0x8b, 0x62, 0x0c, 0xa7, 0x62, + 0xec, 0xf5, 0x52, 0x68, 0xe7, 0x47, 0xda, 0x3f, 0x2a, 0xb0, 0x14, 0xe3, 0x8e, 0x46, 0xe1, 0xef, + 0x26, 0xee, 0x83, 0x8d, 0xd4, 0x7d, 0xd0, 0xc8, 0x93, 0x79, 0x6e, 0xb3, 0x70, 0xfe, 0x7c, 0x3a, + 0xf9, 0xbf, 0x38, 0x9f, 0xfe, 0x5e, 0x81, 0x85, 0x98, 0xef, 0x2e, 0x61, 0x40, 0xbd, 0x9f, 0x1c, + 0x50, 0xaf, 0x95, 0x09, 0x9a, 0x82, 0x09, 0xf5, 0x01, 0x2c, 0xc6, 0x98, 0xf6, 0xdd, 0x8e, 0x6e, + 0x11, 0xc3, 0x43, 0xef, 0xc3, 0xa2, 0x2c, 0x20, 0x87, 0x8c, 0xb8, 0xc1, 0x7a, 0x70, 0xa5, 0x04, + 0x48, 0x82, 0x86, 0xf3, 0x38, 0xd5, 0x7f, 0x2a, 0xd0, 0x8c, 0x01, 0x1f, 0x50, 0xd7, 0xd3, 0x3d, + 0x46, 0x2d, 0xf6, 0xc0, 0x36, 0x7a, 0x26, 0xdd, 0x36, 0x88, 0x6e, 0x62, 0xca, 0x17, 0x74, 0xdb, + 0x3a, 0xb0, 0x0d, 0xbd, 0x3d, 0x40, 0x04, 0xe6, 0x3e, 0x3f, 0xa5, 0xd6, 0x0e, 0x35, 0x28, 0xa3, + 0x1d, 0x19, 0xa6, 0xef, 0x4b, 0x65, 0x73, 0x0f, 0x23, 0xd2, 0xb3, 0xe1, 0xda, 0x46, 0x19, 0x44, + 0x11, 0xbd, 0x71, 0x4c, 0xf4, 0x53, 0x00, 0xfe, 0x29, 0xea, 0x5c, 0x47, 0x06, 0xf2, 0x9d, 0x20, + 0xdb, 0x1f, 0x86, 0x94, 0xb1, 0x14, 0xc4, 0x10, 0xd5, 0xdf, 0xd4, 0x12, 0xb1, 0xf0, 0x7f, 0x3f, + 0x82, 0xfe, 0x0c, 0x96, 0xfa, 0x91, 0x77, 0x02, 0x06, 0xde, 0xb2, 0x4f, 0xa6, 0x9f, 0xf5, 0x42, + 0xf8, 0x3c, 0xbf, 0xb6, 0xbe, 0x29, 0x95, 0x2c, 0x3d, 0xc8, 0x81, 0xc3, 0xb9, 0x4a, 0xd0, 0x77, + 0x60, 0x8e, 0x8f, 0x3b, 0x7a, 0x9b, 0x7e, 0x44, 0xcc, 0x20, 0x4f, 0x17, 0x83, 0x78, 0x39, 0x8c, + 0x48, 0x38, 0xce, 0x87, 0x4e, 0x61, 0xd1, 0xb1, 0x3b, 0x7b, 0xc4, 0x22, 0x5d, 0xca, 0x9b, 0x44, + 0xff, 0x28, 0xc5, 0x5c, 0x3a, 0xdb, 0x7a, 0x27, 0x18, 0x0d, 0x0e, 0xb2, 0x2c, 0xcf, 0xf8, 0x80, + 0x97, 0x5d, 0x16, 0x41, 0x90, 0x07, 0x89, 0x5c, 0xa8, 0xf7, 0x64, 0xaf, 0x26, 0xc7, 0x74, 0xff, + 0x01, 0x6e, 0xb3, 0x4c, 0xc2, 0x1e, 0x27, 0x24, 0xa3, 0xcb, 0x34, 0xb9, 0x8e, 0x53, 0x1a, 0x0a, + 0xc7, 0xee, 0xda, 0x7f, 0x35, 0x76, 0xe7, 0xbc, 0x03, 0xcc, 0x8e, 0xf9, 0x0e, 0xf0, 0x67, 0x05, + 0xae, 0x39, 0x25, 0x72, 0xa9, 0x01, 0xc2, 0x37, 0xf7, 0xca, 0xf8, 0xa6, 0x4c, 0x6e, 0xb6, 0x36, + 0x46, 0xc3, 0xb5, 0x6b, 0x65, 0x38, 0x71, 0x29, 0xfb, 0xd0, 0x03, 0xa8, 0xd9, 0xb2, 0x3e, 0x36, + 0xe6, 0x84, 0xad, 0xd7, 0xcb, 0xd8, 0x1a, 0xd4, 0x54, 0x3f, 0x2d, 0x83, 0x2f, 0x1c, 0x62, 0xa9, + 0xbf, 0xad, 0xc2, 0x95, 0xcc, 0xed, 0x8e, 0x7e, 0x70, 0xce, 0x1b, 0xc0, 0xd5, 0xe7, 0x36, 0xff, + 0x67, 0x86, 0xf7, 0xc9, 0x31, 0x86, 0xf7, 0x2d, 0x58, 0x68, 0xf7, 0x5c, 0x97, 0x5a, 0x2c, 0x35, + 0xba, 0x87, 0xc1, 0xb2, 0x9d, 0x24, 0xe3, 0x34, 0x7f, 0xde, 0xfb, 0x43, 0x75, 0xcc, 0xf7, 0x87, + 0xb8, 0x15, 0x72, 0x86, 0xf4, 0x53, 0x3b, 0x6b, 0x85, 0x1c, 0x25, 0xd3, 0xfc, 0xbc, 0xa1, 0xf5, + 0x51, 0x43, 0x84, 0x99, 0x64, 0x43, 0x7b, 0x9c, 0xa0, 0xe2, 0x14, 0x77, 0xce, 0x2c, 0x3f, 0x5b, + 0x76, 0x96, 0x47, 0x24, 0xf1, 0xd2, 0x00, 0xa2, 0x8e, 0xde, 0x28, 0x13, 0x67, 0xe5, 0x9f, 0x1a, + 0x72, 0x1f, 0x59, 0xe6, 0xc6, 0x7f, 0x64, 0x51, 0xff, 0xa2, 0xc0, 0x4b, 0x85, 0x15, 0x0b, 0x6d, + 0x25, 0xda, 0xcd, 0x1b, 0xa9, 0x76, 0xf3, 0x5b, 0x85, 0x82, 0xb1, 0x9e, 0xd3, 0xcd, 0x7f, 0x85, + 0x78, 0xaf, 0xdc, 0x2b, 0x44, 0xce, 0x84, 0x7c, 0xf1, 0x73, 0x44, 0xeb, 0x7b, 0x4f, 0x9e, 0xae, + 0x4e, 0x7c, 0xf9, 0x74, 0x75, 0xe2, 0xab, 0xa7, 0xab, 0x13, 0x3f, 0x1f, 0xad, 0x2a, 0x4f, 0x46, + 0xab, 0xca, 0x97, 0xa3, 0x55, 0xe5, 0xab, 0xd1, 0xaa, 0xf2, 0xb7, 0xd1, 0xaa, 0xf2, 0xcb, 0xaf, + 0x57, 0x27, 0x3e, 0x59, 0x2e, 0xf8, 0xa7, 0xfa, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xec, 0xbb, + 0x1f, 0x87, 0xdc, 0x1e, 0x00, 0x00, } func (m *ControllerRevision) Marshal() (dAtA []byte, err error) { @@ -1737,6 +1770,32 @@ func (m *StatefulSetList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *StatefulSetOrdinals) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StatefulSetOrdinals) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatefulSetOrdinals) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.Start)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1790,6 +1849,18 @@ func (m *StatefulSetSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Ordinals != nil { + { + size, err := m.Ordinals.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if m.PersistentVolumeClaimRetentionPolicy != nil { { size, err := m.PersistentVolumeClaimRetentionPolicy.MarshalToSizedBuffer(dAtA[:i]) @@ -2312,6 +2383,16 @@ func (m *StatefulSetList) Size() (n int) { return n } +func (m *StatefulSetOrdinals) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.Start)) + return n +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Size() (n int) { if m == nil { return 0 @@ -2360,6 +2441,10 @@ func (m *StatefulSetSpec) Size() (n int) { l = m.PersistentVolumeClaimRetentionPolicy.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Ordinals != nil { + l = m.Ordinals.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -2676,6 +2761,16 @@ func (this *StatefulSetList) String() string { }, "") return s } +func (this *StatefulSetOrdinals) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&StatefulSetOrdinals{`, + `Start:` + fmt.Sprintf("%v", this.Start) + `,`, + `}`, + }, "") + return s +} func (this *StatefulSetPersistentVolumeClaimRetentionPolicy) String() string { if this == nil { return "nil" @@ -2707,6 +2802,7 @@ func (this *StatefulSetSpec) String() string { `RevisionHistoryLimit:` + valueToStringGenerated(this.RevisionHistoryLimit) + `,`, `MinReadySeconds:` + fmt.Sprintf("%v", this.MinReadySeconds) + `,`, `PersistentVolumeClaimRetentionPolicy:` + strings.Replace(this.PersistentVolumeClaimRetentionPolicy.String(), "StatefulSetPersistentVolumeClaimRetentionPolicy", "StatefulSetPersistentVolumeClaimRetentionPolicy", 1) + `,`, + `Ordinals:` + strings.Replace(this.Ordinals.String(), "StatefulSetOrdinals", "StatefulSetOrdinals", 1) + `,`, `}`, }, "") return s @@ -5601,6 +5697,75 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { } return nil } +func (m *StatefulSetOrdinals) 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: StatefulSetOrdinals: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatefulSetOrdinals: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + m.Start = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Start |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -6039,6 +6204,42 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ordinals", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ordinals == nil { + m.Ordinals = &StatefulSetOrdinals{} + } + if err := m.Ordinals.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/apps/v1beta1/generated.proto b/staging/src/k8s.io/api/apps/v1beta1/generated.proto index 5823613ed20..a6d1188b994 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta1/generated.proto @@ -380,6 +380,17 @@ message StatefulSetList { repeated StatefulSet items = 2; } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +message StatefulSetOrdinals { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + optional int32 replicaStartOrdinal = 1; +} + // StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs // created from the StatefulSet VolumeClaimTemplates. message StatefulSetPersistentVolumeClaimRetentionPolicy { @@ -469,6 +480,14 @@ message StatefulSetSpec { // StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. // +optional optional StatefulSetPersistentVolumeClaimRetentionPolicy persistentVolumeClaimRetentionPolicy = 10; + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + optional StatefulSetOrdinals ordinals = 11; } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1beta1/types.go b/staging/src/k8s.io/api/apps/v1beta1/types.go index 4632c63a79e..814296720f1 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types.go @@ -204,6 +204,17 @@ type StatefulSetPersistentVolumeClaimRetentionPolicy struct { WhenScaled PersistentVolumeClaimRetentionPolicyType `json:"whenScaled,omitempty" protobuf:"bytes,2,opt,name=whenScaled,casttype=PersistentVolumeClaimRetentionPolicyType"` } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +type StatefulSetOrdinals struct { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + Start int32 `json:"start" protobuf:"varint,1,opt,name=start"` +} + // A StatefulSetSpec is the specification of a StatefulSet. type StatefulSetSpec struct { // replicas is the desired number of replicas of the given Template. @@ -276,6 +287,14 @@ type StatefulSetSpec struct { // StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. // +optional PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicy `json:"persistentVolumeClaimRetentionPolicy,omitempty" protobuf:"bytes,10,opt,name=persistentVolumeClaimRetentionPolicy"` + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + Ordinals *StatefulSetOrdinals `json:"ordinals,omitempty" protobuf:"bytes,11,opt,name=ordinals"` } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go index 47f3414533d..7c79496c66f 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go @@ -228,6 +228,15 @@ func (StatefulSetList) SwaggerDoc() map[string]string { return map_StatefulSetList } +var map_StatefulSetOrdinals = map[string]string{ + "": "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + "start": "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", +} + +func (StatefulSetOrdinals) SwaggerDoc() map[string]string { + return map_StatefulSetOrdinals +} + var map_StatefulSetPersistentVolumeClaimRetentionPolicy = map[string]string{ "": "StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates.", "whenDeleted": "WhenDeleted specifies what happens to PVCs created from StatefulSet VolumeClaimTemplates when the StatefulSet is deleted. The default policy of `Retain` causes PVCs to not be affected by StatefulSet deletion. The `Delete` policy causes those PVCs to be deleted.", @@ -250,6 +259,7 @@ var map_StatefulSetSpec = map[string]string{ "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "PersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha.", + "ordinals": "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", } func (StatefulSetSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go index 185f868cd68..dd73f1a5a9c 100644 --- a/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go @@ -505,6 +505,22 @@ func (in *StatefulSetList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StatefulSetOrdinals) DeepCopyInto(out *StatefulSetOrdinals) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StatefulSetOrdinals. +func (in *StatefulSetOrdinals) DeepCopy() *StatefulSetOrdinals { + if in == nil { + return nil + } + out := new(StatefulSetOrdinals) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StatefulSetPersistentVolumeClaimRetentionPolicy) DeepCopyInto(out *StatefulSetPersistentVolumeClaimRetentionPolicy) { *out = *in @@ -553,6 +569,11 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { *out = new(StatefulSetPersistentVolumeClaimRetentionPolicy) **out = **in } + if in.Ordinals != nil { + in, out := &in.Ordinals, &out.Ordinals + *out = new(StatefulSetOrdinals) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go index df26908fcfc..7ed6589b29b 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.pb.go @@ -833,12 +833,40 @@ func (m *StatefulSetList) XXX_DiscardUnknown() { var xxx_messageInfo_StatefulSetList proto.InternalMessageInfo +func (m *StatefulSetOrdinals) Reset() { *m = StatefulSetOrdinals{} } +func (*StatefulSetOrdinals) ProtoMessage() {} +func (*StatefulSetOrdinals) Descriptor() ([]byte, []int) { + return fileDescriptor_42fe616264472f7e, []int{28} +} +func (m *StatefulSetOrdinals) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StatefulSetOrdinals) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *StatefulSetOrdinals) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatefulSetOrdinals.Merge(m, src) +} +func (m *StatefulSetOrdinals) XXX_Size() int { + return m.Size() +} +func (m *StatefulSetOrdinals) XXX_DiscardUnknown() { + xxx_messageInfo_StatefulSetOrdinals.DiscardUnknown(m) +} + +var xxx_messageInfo_StatefulSetOrdinals proto.InternalMessageInfo + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Reset() { *m = StatefulSetPersistentVolumeClaimRetentionPolicy{} } func (*StatefulSetPersistentVolumeClaimRetentionPolicy) ProtoMessage() {} func (*StatefulSetPersistentVolumeClaimRetentionPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_42fe616264472f7e, []int{28} + return fileDescriptor_42fe616264472f7e, []int{29} } func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -866,7 +894,7 @@ var xxx_messageInfo_StatefulSetPersistentVolumeClaimRetentionPolicy proto.Intern func (m *StatefulSetSpec) Reset() { *m = StatefulSetSpec{} } func (*StatefulSetSpec) ProtoMessage() {} func (*StatefulSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_42fe616264472f7e, []int{29} + return fileDescriptor_42fe616264472f7e, []int{30} } func (m *StatefulSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -894,7 +922,7 @@ var xxx_messageInfo_StatefulSetSpec proto.InternalMessageInfo func (m *StatefulSetStatus) Reset() { *m = StatefulSetStatus{} } func (*StatefulSetStatus) ProtoMessage() {} func (*StatefulSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_42fe616264472f7e, []int{30} + return fileDescriptor_42fe616264472f7e, []int{31} } func (m *StatefulSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -922,7 +950,7 @@ var xxx_messageInfo_StatefulSetStatus proto.InternalMessageInfo func (m *StatefulSetUpdateStrategy) Reset() { *m = StatefulSetUpdateStrategy{} } func (*StatefulSetUpdateStrategy) ProtoMessage() {} func (*StatefulSetUpdateStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_42fe616264472f7e, []int{31} + return fileDescriptor_42fe616264472f7e, []int{32} } func (m *StatefulSetUpdateStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -977,6 +1005,7 @@ func init() { proto.RegisterType((*StatefulSet)(nil), "k8s.io.api.apps.v1beta2.StatefulSet") proto.RegisterType((*StatefulSetCondition)(nil), "k8s.io.api.apps.v1beta2.StatefulSetCondition") proto.RegisterType((*StatefulSetList)(nil), "k8s.io.api.apps.v1beta2.StatefulSetList") + proto.RegisterType((*StatefulSetOrdinals)(nil), "k8s.io.api.apps.v1beta2.StatefulSetOrdinals") proto.RegisterType((*StatefulSetPersistentVolumeClaimRetentionPolicy)(nil), "k8s.io.api.apps.v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy") proto.RegisterType((*StatefulSetSpec)(nil), "k8s.io.api.apps.v1beta2.StatefulSetSpec") proto.RegisterType((*StatefulSetStatus)(nil), "k8s.io.api.apps.v1beta2.StatefulSetStatus") @@ -988,151 +1017,154 @@ func init() { } var fileDescriptor_42fe616264472f7e = []byte{ - // 2295 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcf, 0x6f, 0x1b, 0xc7, - 0xf5, 0xd7, 0xf2, 0x87, 0x44, 0x8e, 0x2c, 0xc9, 0x1e, 0xe9, 0x2b, 0x31, 0xf2, 0xb7, 0xa4, 0xb1, - 0x31, 0x1c, 0x25, 0xb6, 0x49, 0x5b, 0xf9, 0x81, 0xc4, 0x6e, 0x93, 0x8a, 0x52, 0x6a, 0x3b, 0x90, - 0x64, 0x66, 0x64, 0x39, 0x68, 0xd0, 0x1f, 0x1e, 0x91, 0x63, 0x6a, 0xa3, 0xe5, 0xee, 0x62, 0x77, - 0x96, 0x31, 0xd1, 0x4b, 0xaf, 0x05, 0x0a, 0xb4, 0xbd, 0xf6, 0x9f, 0xe8, 0xad, 0x28, 0x1a, 0xf4, - 0x52, 0x04, 0x81, 0x8f, 0x41, 0x2f, 0x49, 0x2f, 0x44, 0xcd, 0x9c, 0x8a, 0xa2, 0xb7, 0xf6, 0x62, - 0xa0, 0x40, 0x31, 0xb3, 0xb3, 0xbf, 0x77, 0xcd, 0xa5, 0x62, 0x2b, 0x4d, 0x90, 0x1b, 0x77, 0xde, - 0x7b, 0x9f, 0x79, 0x33, 0xf3, 0xde, 0xbc, 0xcf, 0xcc, 0x10, 0x7c, 0xff, 0xe8, 0x75, 0xab, 0xae, - 0xe8, 0x8d, 0x23, 0xfb, 0x80, 0x98, 0x1a, 0xa1, 0xc4, 0x6a, 0xf4, 0x89, 0xd6, 0xd1, 0xcd, 0x86, - 0x10, 0x60, 0x43, 0x69, 0x60, 0xc3, 0xb0, 0x1a, 0xfd, 0xab, 0x07, 0x84, 0xe2, 0xf5, 0x46, 0x97, - 0x68, 0xc4, 0xc4, 0x94, 0x74, 0xea, 0x86, 0xa9, 0x53, 0x1d, 0xae, 0x38, 0x8a, 0x75, 0x6c, 0x28, - 0x75, 0xa6, 0x58, 0x17, 0x8a, 0xab, 0x97, 0xbb, 0x0a, 0x3d, 0xb4, 0x0f, 0xea, 0x6d, 0xbd, 0xd7, - 0xe8, 0xea, 0x5d, 0xbd, 0xc1, 0xf5, 0x0f, 0xec, 0xfb, 0xfc, 0x8b, 0x7f, 0xf0, 0x5f, 0x0e, 0xce, - 0xaa, 0x1c, 0xe8, 0xb0, 0xad, 0x9b, 0xa4, 0xd1, 0xbf, 0x1a, 0xed, 0x6b, 0xf5, 0x15, 0x5f, 0xa7, - 0x87, 0xdb, 0x87, 0x8a, 0x46, 0xcc, 0x41, 0xc3, 0x38, 0xea, 0xb2, 0x06, 0xab, 0xd1, 0x23, 0x14, - 0x27, 0x59, 0x35, 0xd2, 0xac, 0x4c, 0x5b, 0xa3, 0x4a, 0x8f, 0xc4, 0x0c, 0x5e, 0x1b, 0x67, 0x60, - 0xb5, 0x0f, 0x49, 0x0f, 0xc7, 0xec, 0x5e, 0x4e, 0xb3, 0xb3, 0xa9, 0xa2, 0x36, 0x14, 0x8d, 0x5a, - 0xd4, 0x8c, 0x1a, 0xc9, 0xff, 0x96, 0x00, 0xdc, 0xd4, 0x35, 0x6a, 0xea, 0xaa, 0x4a, 0x4c, 0x44, - 0xfa, 0x8a, 0xa5, 0xe8, 0x1a, 0xbc, 0x07, 0x4a, 0x6c, 0x3c, 0x1d, 0x4c, 0x71, 0x45, 0x3a, 0x27, - 0xad, 0xcd, 0xae, 0x5f, 0xa9, 0xfb, 0x33, 0xed, 0xc1, 0xd7, 0x8d, 0xa3, 0x2e, 0x6b, 0xb0, 0xea, - 0x4c, 0xbb, 0xde, 0xbf, 0x5a, 0xbf, 0x7d, 0xf0, 0x01, 0x69, 0xd3, 0x1d, 0x42, 0x71, 0x13, 0x3e, - 0x1c, 0xd6, 0xa6, 0x46, 0xc3, 0x1a, 0xf0, 0xdb, 0x90, 0x87, 0x0a, 0x6f, 0x83, 0x02, 0x47, 0xcf, - 0x71, 0xf4, 0xcb, 0xa9, 0xe8, 0x62, 0xd0, 0x75, 0x84, 0x3f, 0x7c, 0xfb, 0x01, 0x25, 0x1a, 0x73, - 0xaf, 0x79, 0x4a, 0x40, 0x17, 0xb6, 0x30, 0xc5, 0x88, 0x03, 0xc1, 0x4b, 0xa0, 0x64, 0x0a, 0xf7, - 0x2b, 0xf9, 0x73, 0xd2, 0x5a, 0xbe, 0x79, 0x5a, 0x68, 0x95, 0xdc, 0x61, 0x21, 0x4f, 0x43, 0x7e, - 0x28, 0x81, 0xe5, 0xf8, 0xb8, 0xb7, 0x15, 0x8b, 0xc2, 0x1f, 0xc5, 0xc6, 0x5e, 0xcf, 0x36, 0x76, - 0x66, 0xcd, 0x47, 0xee, 0x75, 0xec, 0xb6, 0x04, 0xc6, 0xdd, 0x02, 0x45, 0x85, 0x92, 0x9e, 0x55, - 0xc9, 0x9d, 0xcb, 0xaf, 0xcd, 0xae, 0x5f, 0xac, 0xa7, 0x04, 0x70, 0x3d, 0xee, 0x5d, 0x73, 0x4e, - 0xe0, 0x16, 0x6f, 0x31, 0x04, 0xe4, 0x00, 0xc9, 0xbf, 0xc8, 0x81, 0xf2, 0x16, 0x26, 0x3d, 0x5d, - 0xdb, 0x23, 0xf4, 0x04, 0x56, 0xee, 0x26, 0x28, 0x58, 0x06, 0x69, 0x8b, 0x95, 0xbb, 0x90, 0x3a, - 0x00, 0xcf, 0xa7, 0x3d, 0x83, 0xb4, 0xfd, 0x25, 0x63, 0x5f, 0x88, 0x23, 0xc0, 0x16, 0x98, 0xb6, - 0x28, 0xa6, 0xb6, 0xc5, 0x17, 0x6c, 0x76, 0x7d, 0x2d, 0x03, 0x16, 0xd7, 0x6f, 0xce, 0x0b, 0xb4, - 0x69, 0xe7, 0x1b, 0x09, 0x1c, 0xf9, 0xef, 0x39, 0x00, 0x3d, 0xdd, 0x4d, 0x5d, 0xeb, 0x28, 0x94, - 0x85, 0xf3, 0x35, 0x50, 0xa0, 0x03, 0x83, 0xf0, 0x09, 0x29, 0x37, 0x2f, 0xb8, 0xae, 0xdc, 0x19, - 0x18, 0xe4, 0xf1, 0xb0, 0xb6, 0x1c, 0xb7, 0x60, 0x12, 0xc4, 0x6d, 0xe0, 0xb6, 0xe7, 0x64, 0x8e, - 0x5b, 0xbf, 0x12, 0xee, 0xfa, 0xf1, 0xb0, 0x96, 0xb0, 0x77, 0xd4, 0x3d, 0xa4, 0xb0, 0x83, 0xb0, - 0x0f, 0xa0, 0x8a, 0x2d, 0x7a, 0xc7, 0xc4, 0x9a, 0xe5, 0xf4, 0xa4, 0xf4, 0x88, 0x18, 0xfe, 0x4b, - 0xd9, 0x16, 0x8a, 0x59, 0x34, 0x57, 0x85, 0x17, 0x70, 0x3b, 0x86, 0x86, 0x12, 0x7a, 0x80, 0x17, - 0xc0, 0xb4, 0x49, 0xb0, 0xa5, 0x6b, 0x95, 0x02, 0x1f, 0x85, 0x37, 0x81, 0x88, 0xb7, 0x22, 0x21, - 0x85, 0x2f, 0x82, 0x99, 0x1e, 0xb1, 0x2c, 0xdc, 0x25, 0x95, 0x22, 0x57, 0x5c, 0x10, 0x8a, 0x33, - 0x3b, 0x4e, 0x33, 0x72, 0xe5, 0xf2, 0xef, 0x25, 0x30, 0xe7, 0xcd, 0xdc, 0x09, 0x64, 0xce, 0x8d, - 0x70, 0xe6, 0xc8, 0xe3, 0x83, 0x25, 0x25, 0x61, 0x3e, 0xce, 0x07, 0x1c, 0x67, 0xe1, 0x08, 0x7f, - 0x0c, 0x4a, 0x16, 0x51, 0x49, 0x9b, 0xea, 0xa6, 0x70, 0xfc, 0xe5, 0x8c, 0x8e, 0xe3, 0x03, 0xa2, - 0xee, 0x09, 0xd3, 0xe6, 0x29, 0xe6, 0xb9, 0xfb, 0x85, 0x3c, 0x48, 0xf8, 0x2e, 0x28, 0x51, 0xd2, - 0x33, 0x54, 0x4c, 0x89, 0xc8, 0x9a, 0xe7, 0x83, 0xce, 0xb3, 0x98, 0x61, 0x60, 0x2d, 0xbd, 0x73, - 0x47, 0xa8, 0xf1, 0x94, 0xf1, 0x26, 0xc3, 0x6d, 0x45, 0x1e, 0x0c, 0x34, 0xc0, 0xbc, 0x6d, 0x74, - 0x98, 0x26, 0x65, 0xdb, 0x79, 0x77, 0x20, 0x62, 0xe8, 0xca, 0xf8, 0x59, 0xd9, 0x0f, 0xd9, 0x35, - 0x97, 0x45, 0x2f, 0xf3, 0xe1, 0x76, 0x14, 0xc1, 0x87, 0x1b, 0x60, 0xa1, 0xa7, 0x68, 0x88, 0xe0, - 0xce, 0x60, 0x8f, 0xb4, 0x75, 0xad, 0x63, 0xf1, 0x50, 0x2a, 0x36, 0x57, 0x04, 0xc0, 0xc2, 0x4e, - 0x58, 0x8c, 0xa2, 0xfa, 0x70, 0x1b, 0x2c, 0xb9, 0x1b, 0xf0, 0x4d, 0xc5, 0xa2, 0xba, 0x39, 0xd8, - 0x56, 0x7a, 0x0a, 0xad, 0x4c, 0x73, 0x9c, 0xca, 0x68, 0x58, 0x5b, 0x42, 0x09, 0x72, 0x94, 0x68, - 0x25, 0xff, 0x66, 0x1a, 0x2c, 0x44, 0xf6, 0x05, 0x78, 0x17, 0x2c, 0xb7, 0x6d, 0xd3, 0x24, 0x1a, - 0xdd, 0xb5, 0x7b, 0x07, 0xc4, 0xdc, 0x6b, 0x1f, 0x92, 0x8e, 0xad, 0x92, 0x0e, 0x5f, 0xd6, 0x62, - 0xb3, 0x2a, 0x7c, 0x5d, 0xde, 0x4c, 0xd4, 0x42, 0x29, 0xd6, 0xf0, 0x1d, 0x00, 0x35, 0xde, 0xb4, - 0xa3, 0x58, 0x96, 0x87, 0x99, 0xe3, 0x98, 0x5e, 0x2a, 0xee, 0xc6, 0x34, 0x50, 0x82, 0x15, 0xf3, - 0xb1, 0x43, 0x2c, 0xc5, 0x24, 0x9d, 0xa8, 0x8f, 0xf9, 0xb0, 0x8f, 0x5b, 0x89, 0x5a, 0x28, 0xc5, - 0x1a, 0xbe, 0x0a, 0x66, 0x9d, 0xde, 0xf8, 0x9c, 0x8b, 0xc5, 0x59, 0x14, 0x60, 0xb3, 0xbb, 0xbe, - 0x08, 0x05, 0xf5, 0xd8, 0xd0, 0xf4, 0x03, 0x8b, 0x98, 0x7d, 0xd2, 0xb9, 0xe1, 0x90, 0x03, 0x56, - 0x41, 0x8b, 0xbc, 0x82, 0x7a, 0x43, 0xbb, 0x1d, 0xd3, 0x40, 0x09, 0x56, 0x6c, 0x68, 0x4e, 0xd4, - 0xc4, 0x86, 0x36, 0x1d, 0x1e, 0xda, 0x7e, 0xa2, 0x16, 0x4a, 0xb1, 0x66, 0xb1, 0xe7, 0xb8, 0xbc, - 0xd1, 0xc7, 0x8a, 0x8a, 0x0f, 0x54, 0x52, 0x99, 0x09, 0xc7, 0xde, 0x6e, 0x58, 0x8c, 0xa2, 0xfa, - 0xf0, 0x06, 0x38, 0xe3, 0x34, 0xed, 0x6b, 0xd8, 0x03, 0x29, 0x71, 0x90, 0xe7, 0x04, 0xc8, 0x99, - 0xdd, 0xa8, 0x02, 0x8a, 0xdb, 0xc0, 0x6b, 0x60, 0xbe, 0xad, 0xab, 0x2a, 0x8f, 0xc7, 0x4d, 0xdd, - 0xd6, 0x68, 0xa5, 0xcc, 0x51, 0x20, 0xcb, 0xa1, 0xcd, 0x90, 0x04, 0x45, 0x34, 0xe1, 0x4f, 0x01, - 0x68, 0xbb, 0x85, 0xc1, 0xaa, 0x80, 0x31, 0x0c, 0x20, 0x5e, 0x96, 0xfc, 0xca, 0xec, 0x35, 0x59, - 0x28, 0x00, 0x29, 0x7f, 0x2c, 0x81, 0x95, 0x94, 0x44, 0x87, 0x6f, 0x85, 0x8a, 0xe0, 0xc5, 0x48, - 0x11, 0x3c, 0x9b, 0x62, 0x16, 0xa8, 0x84, 0x87, 0x60, 0x8e, 0x11, 0x12, 0x45, 0xeb, 0x3a, 0x2a, - 0x62, 0x2f, 0x6b, 0xa4, 0x0e, 0x00, 0x05, 0xb5, 0xfd, 0x5d, 0xf9, 0xcc, 0x68, 0x58, 0x9b, 0x0b, - 0xc9, 0x50, 0x18, 0x58, 0xfe, 0x65, 0x0e, 0x80, 0x2d, 0x62, 0xa8, 0xfa, 0xa0, 0x47, 0xb4, 0x93, - 0xe0, 0x34, 0xb7, 0x42, 0x9c, 0xe6, 0x85, 0xf4, 0x25, 0xf1, 0x9c, 0x4a, 0x25, 0x35, 0xef, 0x46, - 0x48, 0xcd, 0x8b, 0x59, 0xc0, 0x9e, 0xcc, 0x6a, 0x3e, 0xcb, 0x83, 0x45, 0x5f, 0xd9, 0xa7, 0x35, - 0xd7, 0x43, 0x2b, 0xfa, 0x42, 0x64, 0x45, 0x57, 0x12, 0x4c, 0x9e, 0x19, 0xaf, 0xf9, 0x00, 0xcc, - 0x33, 0xd6, 0xe1, 0xac, 0x1f, 0xe7, 0x34, 0xd3, 0x13, 0x73, 0x1a, 0xaf, 0x12, 0x6d, 0x87, 0x90, - 0x50, 0x04, 0x39, 0x85, 0x43, 0xcd, 0x7c, 0x1d, 0x39, 0xd4, 0x1f, 0x24, 0x30, 0xef, 0x2f, 0xd3, - 0x09, 0x90, 0xa8, 0x9b, 0x61, 0x12, 0xf5, 0x7c, 0x86, 0xe0, 0x4c, 0x61, 0x51, 0x9f, 0x15, 0x82, - 0xae, 0x73, 0x1a, 0xb5, 0xc6, 0x8e, 0x60, 0x86, 0xaa, 0xb4, 0xb1, 0x25, 0xea, 0xed, 0x29, 0xe7, - 0xf8, 0xe5, 0xb4, 0x21, 0x4f, 0x1a, 0x22, 0x5c, 0xb9, 0x67, 0x4b, 0xb8, 0xf2, 0x4f, 0x87, 0x70, - 0xfd, 0x10, 0x94, 0x2c, 0x97, 0x6a, 0x15, 0x38, 0xe4, 0xc5, 0x4c, 0x89, 0x2d, 0x58, 0x96, 0x07, - 0xed, 0xf1, 0x2b, 0x0f, 0x2e, 0x89, 0x59, 0x15, 0xbf, 0x4a, 0x66, 0xc5, 0x02, 0xdd, 0xc0, 0xb6, - 0x45, 0x3a, 0x3c, 0xa9, 0x4a, 0x7e, 0xa0, 0xb7, 0x78, 0x2b, 0x12, 0x52, 0xb8, 0x0f, 0x56, 0x0c, - 0x53, 0xef, 0x9a, 0xc4, 0xb2, 0xb6, 0x08, 0xee, 0xa8, 0x8a, 0x46, 0xdc, 0x01, 0x38, 0x35, 0xf1, - 0xec, 0x68, 0x58, 0x5b, 0x69, 0x25, 0xab, 0xa0, 0x34, 0x5b, 0xf9, 0xcf, 0x05, 0x70, 0x3a, 0xba, - 0x37, 0xa6, 0xd0, 0x14, 0xe9, 0x58, 0x34, 0xe5, 0x52, 0x20, 0x4e, 0x1d, 0x0e, 0x17, 0xb8, 0x2a, - 0x88, 0xc5, 0xea, 0x06, 0x58, 0x10, 0xb4, 0xc4, 0x15, 0x0a, 0xa2, 0xe6, 0x2d, 0xcf, 0x7e, 0x58, - 0x8c, 0xa2, 0xfa, 0xf0, 0x3a, 0x98, 0x33, 0x39, 0xf3, 0x72, 0x01, 0x1c, 0xf6, 0xf2, 0x7f, 0x02, - 0x60, 0x0e, 0x05, 0x85, 0x28, 0xac, 0xcb, 0x98, 0x8b, 0x4f, 0x48, 0x5c, 0x80, 0x42, 0x98, 0xb9, - 0x6c, 0x44, 0x15, 0x50, 0xdc, 0x06, 0xee, 0x80, 0x45, 0x5b, 0x8b, 0x43, 0x39, 0xb1, 0x76, 0x56, - 0x40, 0x2d, 0xee, 0xc7, 0x55, 0x50, 0x92, 0x1d, 0xbc, 0x17, 0x22, 0x33, 0xd3, 0x7c, 0x3f, 0xb9, - 0x94, 0x21, 0x27, 0x32, 0xb3, 0x99, 0x04, 0xaa, 0x55, 0xca, 0x4a, 0xb5, 0xe4, 0x8f, 0x24, 0x00, - 0xe3, 0x79, 0x38, 0xf6, 0x26, 0x20, 0x66, 0x11, 0xa8, 0x98, 0x4a, 0x32, 0xff, 0xb9, 0x92, 0x91, - 0xff, 0xf8, 0x1b, 0x6a, 0x36, 0x02, 0x24, 0x26, 0xfa, 0x64, 0x2e, 0x75, 0xb2, 0x12, 0x20, 0xdf, - 0xa9, 0xa7, 0x40, 0x80, 0x02, 0x60, 0x4f, 0x26, 0x40, 0xff, 0xc8, 0x81, 0x45, 0x5f, 0x39, 0x33, - 0x01, 0x4a, 0x30, 0xf9, 0xf6, 0x62, 0x27, 0x1b, 0x29, 0xf1, 0xa7, 0xee, 0x7f, 0x89, 0x94, 0xf8, - 0x5e, 0xa5, 0x90, 0x92, 0xdf, 0xe5, 0x82, 0xae, 0x4f, 0x48, 0x4a, 0x9e, 0xc2, 0x0d, 0xc7, 0xd7, - 0x8e, 0xd7, 0xc8, 0x9f, 0xe4, 0xc1, 0xe9, 0x68, 0x1e, 0x86, 0x0a, 0xa4, 0x34, 0xb6, 0x40, 0xb6, - 0xc0, 0xd2, 0x7d, 0x5b, 0x55, 0x07, 0x7c, 0x0c, 0x81, 0x2a, 0xe9, 0x94, 0xd6, 0xff, 0x17, 0x96, - 0x4b, 0x3f, 0x48, 0xd0, 0x41, 0x89, 0x96, 0xf1, 0x7a, 0x59, 0xf8, 0xb2, 0xf5, 0xb2, 0x78, 0x8c, - 0x7a, 0x99, 0x4c, 0x39, 0xf2, 0xc7, 0xa2, 0x1c, 0x93, 0x15, 0xcb, 0x84, 0x8d, 0x6b, 0xec, 0xd1, - 0x7f, 0x24, 0x81, 0xe5, 0xe4, 0x03, 0x37, 0x54, 0xc1, 0x7c, 0x0f, 0x3f, 0x08, 0x5e, 0x7c, 0x8c, - 0x2b, 0x22, 0x36, 0x55, 0xd4, 0xba, 0xf3, 0x64, 0x54, 0xbf, 0xa5, 0xd1, 0xdb, 0xe6, 0x1e, 0x35, - 0x15, 0xad, 0xeb, 0x54, 0xde, 0x9d, 0x10, 0x16, 0x8a, 0x60, 0xc3, 0xf7, 0x41, 0xa9, 0x87, 0x1f, - 0xec, 0xd9, 0x66, 0x37, 0xa9, 0x42, 0x66, 0xeb, 0x87, 0x27, 0xc0, 0x8e, 0x40, 0x41, 0x1e, 0x9e, - 0xfc, 0x85, 0x04, 0x56, 0x52, 0xaa, 0xea, 0x37, 0x68, 0x94, 0x7f, 0x92, 0xc0, 0xb9, 0xd0, 0x28, - 0x59, 0x5a, 0x92, 0xfb, 0xb6, 0xca, 0x33, 0x54, 0x30, 0x99, 0x8b, 0xa0, 0x6c, 0x60, 0x93, 0x2a, - 0x1e, 0x0f, 0x2e, 0x36, 0xe7, 0x46, 0xc3, 0x5a, 0xb9, 0xe5, 0x36, 0x22, 0x5f, 0x9e, 0x30, 0x37, - 0xb9, 0x67, 0x37, 0x37, 0xf2, 0x7f, 0x24, 0x50, 0xdc, 0x6b, 0x63, 0x95, 0x9c, 0x00, 0x71, 0xd9, - 0x0a, 0x11, 0x97, 0xf4, 0x47, 0x01, 0xee, 0x4f, 0x2a, 0x67, 0xd9, 0x8e, 0x70, 0x96, 0xf3, 0x63, - 0x70, 0x9e, 0x4c, 0x57, 0xde, 0x00, 0x65, 0xaf, 0xbb, 0xc9, 0xf6, 0x52, 0xf9, 0xb7, 0x39, 0x30, - 0x1b, 0xe8, 0x62, 0xc2, 0x9d, 0xf8, 0x5e, 0xa8, 0xfc, 0xb0, 0x3d, 0x66, 0x3d, 0xcb, 0x40, 0xea, - 0x6e, 0xa9, 0x79, 0x5b, 0xa3, 0x66, 0xf0, 0xac, 0x1a, 0xaf, 0x40, 0x6f, 0x82, 0x79, 0x8a, 0xcd, - 0x2e, 0xa1, 0xae, 0x8c, 0x4f, 0x58, 0xd9, 0xbf, 0xbb, 0xb9, 0x13, 0x92, 0xa2, 0x88, 0xf6, 0xea, - 0x75, 0x30, 0x17, 0xea, 0x0c, 0x9e, 0x06, 0xf9, 0x23, 0x32, 0x70, 0x18, 0x1c, 0x62, 0x3f, 0xe1, - 0x12, 0x28, 0xf6, 0xb1, 0x6a, 0x3b, 0x21, 0x5a, 0x46, 0xce, 0xc7, 0xb5, 0xdc, 0xeb, 0x92, 0xfc, - 0x2b, 0x36, 0x39, 0x7e, 0x2a, 0x9c, 0x40, 0x74, 0xbd, 0x13, 0x8a, 0xae, 0xf4, 0xf7, 0xc9, 0x60, - 0x82, 0xa6, 0xc5, 0x18, 0x8a, 0xc4, 0xd8, 0x4b, 0x99, 0xd0, 0x9e, 0x1c, 0x69, 0xff, 0xcc, 0x81, - 0xa5, 0x80, 0xb6, 0xcf, 0x8c, 0xbf, 0x1b, 0x62, 0xc6, 0x6b, 0x11, 0x66, 0x5c, 0x49, 0xb2, 0xf9, - 0x96, 0x1a, 0x8f, 0xa7, 0xc6, 0x7f, 0x94, 0xc0, 0x42, 0x60, 0xee, 0x4e, 0x80, 0x1b, 0xdf, 0x0a, - 0x73, 0xe3, 0xf3, 0x59, 0x82, 0x26, 0x85, 0x1c, 0xff, 0x4b, 0x02, 0x8d, 0x80, 0x56, 0x8b, 0x98, - 0x96, 0x62, 0x51, 0xa2, 0xd1, 0xbb, 0xba, 0x6a, 0xf7, 0xc8, 0xa6, 0x8a, 0x95, 0x1e, 0x22, 0xac, - 0x41, 0xd1, 0xb5, 0x96, 0xae, 0x2a, 0xed, 0x01, 0xc4, 0x60, 0xf6, 0xc3, 0x43, 0xa2, 0x6d, 0x11, - 0x95, 0x50, 0xf1, 0x8a, 0x56, 0x6e, 0xbe, 0xe5, 0x3e, 0x2a, 0xbd, 0xe7, 0x8b, 0x1e, 0x0f, 0x6b, - 0x6b, 0x59, 0x10, 0x79, 0x94, 0x05, 0x31, 0xe1, 0x4f, 0x00, 0x60, 0x9f, 0x7c, 0x3f, 0xea, 0x88, - 0x80, 0x7b, 0xd3, 0xcd, 0xca, 0xf7, 0x3c, 0xc9, 0x44, 0x1d, 0x04, 0x10, 0xe5, 0xbf, 0xce, 0x84, - 0xd6, 0xec, 0x1b, 0x7f, 0x53, 0xf9, 0x33, 0xb0, 0xd4, 0xf7, 0x67, 0xc7, 0x55, 0x60, 0x1c, 0x3a, - 0x1f, 0x3d, 0x8d, 0x7b, 0xf0, 0x49, 0xf3, 0xea, 0x33, 0xf7, 0xbb, 0x09, 0x70, 0x28, 0xb1, 0x13, - 0xf8, 0x2a, 0x98, 0x65, 0xdc, 0x57, 0x69, 0x93, 0x5d, 0xdc, 0x73, 0xf3, 0xc9, 0x7b, 0x84, 0xdc, - 0xf3, 0x45, 0x28, 0xa8, 0x07, 0x0f, 0xc1, 0xa2, 0xa1, 0x77, 0x76, 0xb0, 0x86, 0xbb, 0x84, 0x91, - 0x39, 0x67, 0x29, 0xf9, 0xf5, 0x65, 0xb9, 0xf9, 0x9a, 0x7b, 0x35, 0xd5, 0x8a, 0xab, 0xb0, 0x63, - 0x7e, 0x42, 0x33, 0x0f, 0x82, 0x24, 0x48, 0x68, 0xc6, 0x1e, 0xce, 0x9d, 0x87, 0x83, 0xf5, 0x2c, - 0x89, 0x75, 0xcc, 0xa7, 0xf3, 0xb4, 0xdb, 0xd9, 0xd2, 0xb1, 0x6e, 0x67, 0x13, 0x8e, 0xa9, 0xe5, - 0x09, 0x8f, 0xa9, 0x9f, 0x48, 0xe0, 0xbc, 0x91, 0x21, 0x97, 0x2a, 0x80, 0xcf, 0xcd, 0xcd, 0x2c, - 0x73, 0x93, 0x25, 0x37, 0x9b, 0x6b, 0xa3, 0x61, 0xed, 0x7c, 0x16, 0x4d, 0x94, 0xc9, 0x3f, 0xf9, - 0xa3, 0x22, 0x38, 0x13, 0xab, 0x96, 0x5f, 0xe1, 0x5d, 0x71, 0xec, 0xe0, 0x9a, 0x9f, 0xe0, 0xe0, - 0xba, 0x01, 0x16, 0xc4, 0xdf, 0x0f, 0x22, 0xe7, 0x5e, 0x6f, 0x61, 0x37, 0xc3, 0x62, 0x14, 0xd5, - 0x4f, 0xba, 0xab, 0x2e, 0x4e, 0x78, 0x57, 0x1d, 0xf4, 0x42, 0xfc, 0x9d, 0xce, 0x49, 0xc3, 0xb8, - 0x17, 0xe2, 0x5f, 0x75, 0x51, 0x7d, 0x46, 0x12, 0x1d, 0x54, 0x0f, 0x61, 0x26, 0x4c, 0x12, 0xf7, - 0x43, 0x52, 0x14, 0xd1, 0xfe, 0x52, 0x4f, 0xec, 0x38, 0xe1, 0x89, 0xfd, 0x72, 0x96, 0xf8, 0xcd, - 0x7e, 0x2d, 0x9d, 0x78, 0xc1, 0x30, 0x3b, 0xf9, 0x05, 0x83, 0xfc, 0x17, 0x09, 0x3c, 0x97, 0xba, - 0xbb, 0xc0, 0x8d, 0x10, 0x85, 0xbb, 0x1c, 0xa1, 0x70, 0xdf, 0x49, 0x35, 0x0c, 0xf0, 0x38, 0x33, - 0xf9, 0xc6, 0xfa, 0x8d, 0x6c, 0x37, 0xd6, 0x09, 0xa7, 0xce, 0xf1, 0x57, 0xd7, 0xcd, 0xef, 0x3d, - 0x7c, 0x54, 0x9d, 0xfa, 0xf4, 0x51, 0x75, 0xea, 0xf3, 0x47, 0xd5, 0xa9, 0x9f, 0x8f, 0xaa, 0xd2, - 0xc3, 0x51, 0x55, 0xfa, 0x74, 0x54, 0x95, 0x3e, 0x1f, 0x55, 0xa5, 0xbf, 0x8d, 0xaa, 0xd2, 0xaf, - 0xbf, 0xa8, 0x4e, 0xbd, 0xbf, 0x92, 0xf2, 0x07, 0xdf, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x5c, - 0xbc, 0x64, 0x9c, 0x13, 0x2c, 0x00, 0x00, + // 2349 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5a, 0xcd, 0x6f, 0x1b, 0xc7, + 0x15, 0xf7, 0xf2, 0x43, 0x26, 0x87, 0x96, 0x64, 0x8f, 0x54, 0x89, 0xb1, 0x5b, 0xd2, 0xd8, 0x18, + 0x8e, 0x12, 0xdb, 0xa4, 0xad, 0x7c, 0x20, 0xb1, 0xdb, 0xb8, 0xa2, 0x94, 0xda, 0x0e, 0xf4, 0xc1, + 0x0c, 0x2d, 0x05, 0x0d, 0xfa, 0xe1, 0x11, 0x39, 0xa6, 0x36, 0x5a, 0xee, 0x2e, 0x76, 0x87, 0x8c, + 0x89, 0x5e, 0x7a, 0x2d, 0x50, 0xa0, 0xed, 0xb5, 0xff, 0x44, 0xd1, 0x4b, 0x51, 0x34, 0xe8, 0xa5, + 0x08, 0x02, 0x1f, 0x83, 0x5e, 0x92, 0x13, 0x51, 0x33, 0xa7, 0xa2, 0xe8, 0xad, 0xbd, 0x18, 0x28, + 0x50, 0xcc, 0xec, 0xec, 0xf7, 0xae, 0xb9, 0x54, 0x6c, 0xe5, 0x03, 0xb9, 0x71, 0xe7, 0xbd, 0xf7, + 0x9b, 0xf7, 0x66, 0xde, 0x9b, 0xf7, 0xdb, 0x59, 0x82, 0x1f, 0x1e, 0xbe, 0x6e, 0xd5, 0x14, 0xbd, + 0x7e, 0xd8, 0xdf, 0x27, 0xa6, 0x46, 0x28, 0xb1, 0xea, 0x03, 0xa2, 0x75, 0x74, 0xb3, 0x2e, 0x04, + 0xd8, 0x50, 0xea, 0xd8, 0x30, 0xac, 0xfa, 0xe0, 0xda, 0x3e, 0xa1, 0x78, 0xb5, 0xde, 0x25, 0x1a, + 0x31, 0x31, 0x25, 0x9d, 0x9a, 0x61, 0xea, 0x54, 0x87, 0xcb, 0xb6, 0x62, 0x0d, 0x1b, 0x4a, 0x8d, + 0x29, 0xd6, 0x84, 0xe2, 0xd9, 0x2b, 0x5d, 0x85, 0x1e, 0xf4, 0xf7, 0x6b, 0x6d, 0xbd, 0x57, 0xef, + 0xea, 0x5d, 0xbd, 0xce, 0xf5, 0xf7, 0xfb, 0xf7, 0xf9, 0x13, 0x7f, 0xe0, 0xbf, 0x6c, 0x9c, 0xb3, + 0xb2, 0x6f, 0xc2, 0xb6, 0x6e, 0x92, 0xfa, 0xe0, 0x5a, 0x78, 0xae, 0xb3, 0xaf, 0x78, 0x3a, 0x3d, + 0xdc, 0x3e, 0x50, 0x34, 0x62, 0x0e, 0xeb, 0xc6, 0x61, 0x97, 0x0d, 0x58, 0xf5, 0x1e, 0xa1, 0x38, + 0xce, 0xaa, 0x9e, 0x64, 0x65, 0xf6, 0x35, 0xaa, 0xf4, 0x48, 0xc4, 0xe0, 0xb5, 0x49, 0x06, 0x56, + 0xfb, 0x80, 0xf4, 0x70, 0xc4, 0xee, 0xe5, 0x24, 0xbb, 0x3e, 0x55, 0xd4, 0xba, 0xa2, 0x51, 0x8b, + 0x9a, 0x61, 0x23, 0xf9, 0xbf, 0x12, 0x80, 0xeb, 0xba, 0x46, 0x4d, 0x5d, 0x55, 0x89, 0x89, 0xc8, + 0x40, 0xb1, 0x14, 0x5d, 0x83, 0xf7, 0x40, 0x81, 0xc5, 0xd3, 0xc1, 0x14, 0x97, 0xa5, 0xf3, 0xd2, + 0x4a, 0x69, 0xf5, 0x6a, 0xcd, 0x5b, 0x69, 0x17, 0xbe, 0x66, 0x1c, 0x76, 0xd9, 0x80, 0x55, 0x63, + 0xda, 0xb5, 0xc1, 0xb5, 0xda, 0xce, 0xfe, 0xfb, 0xa4, 0x4d, 0xb7, 0x08, 0xc5, 0x0d, 0xf8, 0x70, + 0x54, 0x3d, 0x31, 0x1e, 0x55, 0x81, 0x37, 0x86, 0x5c, 0x54, 0xb8, 0x03, 0x72, 0x1c, 0x3d, 0xc3, + 0xd1, 0xaf, 0x24, 0xa2, 0x8b, 0xa0, 0x6b, 0x08, 0x7f, 0xf0, 0xd6, 0x03, 0x4a, 0x34, 0xe6, 0x5e, + 0xe3, 0x94, 0x80, 0xce, 0x6d, 0x60, 0x8a, 0x11, 0x07, 0x82, 0x97, 0x41, 0xc1, 0x14, 0xee, 0x97, + 0xb3, 0xe7, 0xa5, 0x95, 0x6c, 0xe3, 0xb4, 0xd0, 0x2a, 0x38, 0x61, 0x21, 0x57, 0x43, 0x7e, 0x28, + 0x81, 0xa5, 0x68, 0xdc, 0x9b, 0x8a, 0x45, 0xe1, 0x4f, 0x22, 0xb1, 0xd7, 0xd2, 0xc5, 0xce, 0xac, + 0x79, 0xe4, 0xee, 0xc4, 0xce, 0x88, 0x2f, 0xee, 0x26, 0xc8, 0x2b, 0x94, 0xf4, 0xac, 0x72, 0xe6, + 0x7c, 0x76, 0xa5, 0xb4, 0x7a, 0xa9, 0x96, 0x90, 0xc0, 0xb5, 0xa8, 0x77, 0x8d, 0x59, 0x81, 0x9b, + 0xbf, 0xc3, 0x10, 0x90, 0x0d, 0x24, 0xff, 0x2a, 0x03, 0x8a, 0x1b, 0x98, 0xf4, 0x74, 0xad, 0x45, + 0xe8, 0x31, 0xec, 0xdc, 0x6d, 0x90, 0xb3, 0x0c, 0xd2, 0x16, 0x3b, 0x77, 0x31, 0x31, 0x00, 0xd7, + 0xa7, 0x96, 0x41, 0xda, 0xde, 0x96, 0xb1, 0x27, 0xc4, 0x11, 0x60, 0x13, 0xcc, 0x58, 0x14, 0xd3, + 0xbe, 0xc5, 0x37, 0xac, 0xb4, 0xba, 0x92, 0x02, 0x8b, 0xeb, 0x37, 0xe6, 0x04, 0xda, 0x8c, 0xfd, + 0x8c, 0x04, 0x8e, 0xfc, 0xcf, 0x0c, 0x80, 0xae, 0xee, 0xba, 0xae, 0x75, 0x14, 0xca, 0xd2, 0xf9, + 0x3a, 0xc8, 0xd1, 0xa1, 0x41, 0xf8, 0x82, 0x14, 0x1b, 0x17, 0x1d, 0x57, 0xee, 0x0e, 0x0d, 0xf2, + 0x78, 0x54, 0x5d, 0x8a, 0x5a, 0x30, 0x09, 0xe2, 0x36, 0x70, 0xd3, 0x75, 0x32, 0xc3, 0xad, 0x5f, + 0x09, 0x4e, 0xfd, 0x78, 0x54, 0x8d, 0x39, 0x3b, 0x6a, 0x2e, 0x52, 0xd0, 0x41, 0x38, 0x00, 0x50, + 0xc5, 0x16, 0xbd, 0x6b, 0x62, 0xcd, 0xb2, 0x67, 0x52, 0x7a, 0x44, 0x84, 0xff, 0x52, 0xba, 0x8d, + 0x62, 0x16, 0x8d, 0xb3, 0xc2, 0x0b, 0xb8, 0x19, 0x41, 0x43, 0x31, 0x33, 0xc0, 0x8b, 0x60, 0xc6, + 0x24, 0xd8, 0xd2, 0xb5, 0x72, 0x8e, 0x47, 0xe1, 0x2e, 0x20, 0xe2, 0xa3, 0x48, 0x48, 0xe1, 0x8b, + 0xe0, 0x64, 0x8f, 0x58, 0x16, 0xee, 0x92, 0x72, 0x9e, 0x2b, 0xce, 0x0b, 0xc5, 0x93, 0x5b, 0xf6, + 0x30, 0x72, 0xe4, 0xf2, 0x9f, 0x24, 0x30, 0xeb, 0xae, 0xdc, 0x31, 0x54, 0xce, 0xad, 0x60, 0xe5, + 0xc8, 0x93, 0x93, 0x25, 0xa1, 0x60, 0x3e, 0xca, 0xfa, 0x1c, 0x67, 0xe9, 0x08, 0x7f, 0x0a, 0x0a, + 0x16, 0x51, 0x49, 0x9b, 0xea, 0xa6, 0x70, 0xfc, 0xe5, 0x94, 0x8e, 0xe3, 0x7d, 0xa2, 0xb6, 0x84, + 0x69, 0xe3, 0x14, 0xf3, 0xdc, 0x79, 0x42, 0x2e, 0x24, 0x7c, 0x07, 0x14, 0x28, 0xe9, 0x19, 0x2a, + 0xa6, 0x44, 0x54, 0xcd, 0xf3, 0x7e, 0xe7, 0x59, 0xce, 0x30, 0xb0, 0xa6, 0xde, 0xb9, 0x2b, 0xd4, + 0x78, 0xc9, 0xb8, 0x8b, 0xe1, 0x8c, 0x22, 0x17, 0x06, 0x1a, 0x60, 0xae, 0x6f, 0x74, 0x98, 0x26, + 0x65, 0xc7, 0x79, 0x77, 0x28, 0x72, 0xe8, 0xea, 0xe4, 0x55, 0xd9, 0x0d, 0xd8, 0x35, 0x96, 0xc4, + 0x2c, 0x73, 0xc1, 0x71, 0x14, 0xc2, 0x87, 0x6b, 0x60, 0xbe, 0xa7, 0x68, 0x88, 0xe0, 0xce, 0xb0, + 0x45, 0xda, 0xba, 0xd6, 0xb1, 0x78, 0x2a, 0xe5, 0x1b, 0xcb, 0x02, 0x60, 0x7e, 0x2b, 0x28, 0x46, + 0x61, 0x7d, 0xb8, 0x09, 0x16, 0x9d, 0x03, 0xf8, 0xb6, 0x62, 0x51, 0xdd, 0x1c, 0x6e, 0x2a, 0x3d, + 0x85, 0x96, 0x67, 0x38, 0x4e, 0x79, 0x3c, 0xaa, 0x2e, 0xa2, 0x18, 0x39, 0x8a, 0xb5, 0x92, 0x7f, + 0x37, 0x03, 0xe6, 0x43, 0xe7, 0x02, 0xdc, 0x03, 0x4b, 0xed, 0xbe, 0x69, 0x12, 0x8d, 0x6e, 0xf7, + 0x7b, 0xfb, 0xc4, 0x6c, 0xb5, 0x0f, 0x48, 0xa7, 0xaf, 0x92, 0x0e, 0xdf, 0xd6, 0x7c, 0xa3, 0x22, + 0x7c, 0x5d, 0x5a, 0x8f, 0xd5, 0x42, 0x09, 0xd6, 0xf0, 0x6d, 0x00, 0x35, 0x3e, 0xb4, 0xa5, 0x58, + 0x96, 0x8b, 0x99, 0xe1, 0x98, 0x6e, 0x29, 0x6e, 0x47, 0x34, 0x50, 0x8c, 0x15, 0xf3, 0xb1, 0x43, + 0x2c, 0xc5, 0x24, 0x9d, 0xb0, 0x8f, 0xd9, 0xa0, 0x8f, 0x1b, 0xb1, 0x5a, 0x28, 0xc1, 0x1a, 0xbe, + 0x0a, 0x4a, 0xf6, 0x6c, 0x7c, 0xcd, 0xc5, 0xe6, 0x2c, 0x08, 0xb0, 0xd2, 0xb6, 0x27, 0x42, 0x7e, + 0x3d, 0x16, 0x9a, 0xbe, 0x6f, 0x11, 0x73, 0x40, 0x3a, 0xb7, 0x6c, 0x72, 0xc0, 0x3a, 0x68, 0x9e, + 0x77, 0x50, 0x37, 0xb4, 0x9d, 0x88, 0x06, 0x8a, 0xb1, 0x62, 0xa1, 0xd9, 0x59, 0x13, 0x09, 0x6d, + 0x26, 0x18, 0xda, 0x6e, 0xac, 0x16, 0x4a, 0xb0, 0x66, 0xb9, 0x67, 0xbb, 0xbc, 0x36, 0xc0, 0x8a, + 0x8a, 0xf7, 0x55, 0x52, 0x3e, 0x19, 0xcc, 0xbd, 0xed, 0xa0, 0x18, 0x85, 0xf5, 0xe1, 0x2d, 0x70, + 0xc6, 0x1e, 0xda, 0xd5, 0xb0, 0x0b, 0x52, 0xe0, 0x20, 0xcf, 0x09, 0x90, 0x33, 0xdb, 0x61, 0x05, + 0x14, 0xb5, 0x81, 0xd7, 0xc1, 0x5c, 0x5b, 0x57, 0x55, 0x9e, 0x8f, 0xeb, 0x7a, 0x5f, 0xa3, 0xe5, + 0x22, 0x47, 0x81, 0xac, 0x86, 0xd6, 0x03, 0x12, 0x14, 0xd2, 0x84, 0x3f, 0x07, 0xa0, 0xed, 0x34, + 0x06, 0xab, 0x0c, 0x26, 0x30, 0x80, 0x68, 0x5b, 0xf2, 0x3a, 0xb3, 0x3b, 0x64, 0x21, 0x1f, 0xa4, + 0xfc, 0x91, 0x04, 0x96, 0x13, 0x0a, 0x1d, 0xde, 0x0c, 0x34, 0xc1, 0x4b, 0xa1, 0x26, 0x78, 0x2e, + 0xc1, 0xcc, 0xd7, 0x09, 0x0f, 0xc0, 0x2c, 0x23, 0x24, 0x8a, 0xd6, 0xb5, 0x55, 0xc4, 0x59, 0x56, + 0x4f, 0x0c, 0x00, 0xf9, 0xb5, 0xbd, 0x53, 0xf9, 0xcc, 0x78, 0x54, 0x9d, 0x0d, 0xc8, 0x50, 0x10, + 0x58, 0xfe, 0x75, 0x06, 0x80, 0x0d, 0x62, 0xa8, 0xfa, 0xb0, 0x47, 0xb4, 0xe3, 0xe0, 0x34, 0x77, + 0x02, 0x9c, 0xe6, 0x85, 0xe4, 0x2d, 0x71, 0x9d, 0x4a, 0x24, 0x35, 0xef, 0x84, 0x48, 0xcd, 0x8b, + 0x69, 0xc0, 0x9e, 0xcc, 0x6a, 0x3e, 0xcd, 0x82, 0x05, 0x4f, 0xd9, 0xa3, 0x35, 0x37, 0x02, 0x3b, + 0xfa, 0x42, 0x68, 0x47, 0x97, 0x63, 0x4c, 0x9e, 0x19, 0xaf, 0x79, 0x1f, 0xcc, 0x31, 0xd6, 0x61, + 0xef, 0x1f, 0xe7, 0x34, 0x33, 0x53, 0x73, 0x1a, 0xb7, 0x13, 0x6d, 0x06, 0x90, 0x50, 0x08, 0x39, + 0x81, 0x43, 0x9d, 0xfc, 0x3a, 0x72, 0xa8, 0x3f, 0x4b, 0x60, 0xce, 0xdb, 0xa6, 0x63, 0x20, 0x51, + 0xb7, 0x83, 0x24, 0xea, 0xf9, 0x14, 0xc9, 0x99, 0xc0, 0xa2, 0x3e, 0xcd, 0xf9, 0x5d, 0xe7, 0x34, + 0x6a, 0x85, 0xbd, 0x82, 0x19, 0xaa, 0xd2, 0xc6, 0x96, 0xe8, 0xb7, 0xa7, 0xec, 0xd7, 0x2f, 0x7b, + 0x0c, 0xb9, 0xd2, 0x00, 0xe1, 0xca, 0x3c, 0x5b, 0xc2, 0x95, 0x7d, 0x3a, 0x84, 0xeb, 0xc7, 0xa0, + 0x60, 0x39, 0x54, 0x2b, 0xc7, 0x21, 0x2f, 0xa5, 0x2a, 0x6c, 0xc1, 0xb2, 0x5c, 0x68, 0x97, 0x5f, + 0xb9, 0x70, 0x71, 0xcc, 0x2a, 0xff, 0x65, 0x32, 0x2b, 0x96, 0xe8, 0x06, 0xee, 0x5b, 0xa4, 0xc3, + 0x8b, 0xaa, 0xe0, 0x25, 0x7a, 0x93, 0x8f, 0x22, 0x21, 0x85, 0xbb, 0x60, 0xd9, 0x30, 0xf5, 0xae, + 0x49, 0x2c, 0x6b, 0x83, 0xe0, 0x8e, 0xaa, 0x68, 0xc4, 0x09, 0xc0, 0xee, 0x89, 0xe7, 0xc6, 0xa3, + 0xea, 0x72, 0x33, 0x5e, 0x05, 0x25, 0xd9, 0xca, 0x7f, 0xcb, 0x81, 0xd3, 0xe1, 0xb3, 0x31, 0x81, + 0xa6, 0x48, 0x47, 0xa2, 0x29, 0x97, 0x7d, 0x79, 0x6a, 0x73, 0x38, 0xdf, 0x55, 0x41, 0x24, 0x57, + 0xd7, 0xc0, 0xbc, 0xa0, 0x25, 0x8e, 0x50, 0x10, 0x35, 0x77, 0x7b, 0x76, 0x83, 0x62, 0x14, 0xd6, + 0x87, 0x37, 0xc0, 0xac, 0xc9, 0x99, 0x97, 0x03, 0x60, 0xb3, 0x97, 0xef, 0x08, 0x80, 0x59, 0xe4, + 0x17, 0xa2, 0xa0, 0x2e, 0x63, 0x2e, 0x1e, 0x21, 0x71, 0x00, 0x72, 0x41, 0xe6, 0xb2, 0x16, 0x56, + 0x40, 0x51, 0x1b, 0xb8, 0x05, 0x16, 0xfa, 0x5a, 0x14, 0xca, 0xce, 0xb5, 0x73, 0x02, 0x6a, 0x61, + 0x37, 0xaa, 0x82, 0xe2, 0xec, 0xe0, 0xbd, 0x00, 0x99, 0x99, 0xe1, 0xe7, 0xc9, 0xe5, 0x14, 0x35, + 0x91, 0x9a, 0xcd, 0xc4, 0x50, 0xad, 0x42, 0x5a, 0xaa, 0x25, 0x7f, 0x28, 0x01, 0x18, 0xad, 0xc3, + 0x89, 0x37, 0x01, 0x11, 0x0b, 0x5f, 0xc7, 0x54, 0xe2, 0xf9, 0xcf, 0xd5, 0x94, 0xfc, 0xc7, 0x3b, + 0x50, 0xd3, 0x11, 0x20, 0xb1, 0xd0, 0xc7, 0x73, 0xa9, 0x93, 0x96, 0x00, 0x79, 0x4e, 0x3d, 0x05, + 0x02, 0xe4, 0x03, 0x7b, 0x32, 0x01, 0xfa, 0x57, 0x06, 0x2c, 0x78, 0xca, 0xa9, 0x09, 0x50, 0x8c, + 0xc9, 0xb7, 0x17, 0x3b, 0xe9, 0x48, 0x89, 0xb7, 0x74, 0x5f, 0x25, 0x52, 0xe2, 0x79, 0x95, 0x40, + 0x4a, 0xfe, 0x90, 0xf1, 0xbb, 0x3e, 0x25, 0x29, 0x79, 0x0a, 0x37, 0x1c, 0x5f, 0x3b, 0x5e, 0x23, + 0x7f, 0x9c, 0x05, 0xa7, 0xc3, 0x75, 0x18, 0x68, 0x90, 0xd2, 0xc4, 0x06, 0xd9, 0x04, 0x8b, 0xf7, + 0xfb, 0xaa, 0x3a, 0xe4, 0x31, 0xf8, 0xba, 0xa4, 0xdd, 0x5a, 0xbf, 0x2b, 0x2c, 0x17, 0x7f, 0x14, + 0xa3, 0x83, 0x62, 0x2d, 0xa3, 0xfd, 0x32, 0xf7, 0x45, 0xfb, 0x65, 0xfe, 0x08, 0xfd, 0x32, 0x9e, + 0x72, 0x64, 0x8f, 0x44, 0x39, 0xa6, 0x6b, 0x96, 0x31, 0x07, 0xd7, 0xc4, 0x57, 0xff, 0xb1, 0x04, + 0x96, 0xe2, 0x5f, 0xb8, 0xa1, 0x0a, 0xe6, 0x7a, 0xf8, 0x81, 0xff, 0xe2, 0x63, 0x52, 0x13, 0xe9, + 0x53, 0x45, 0xad, 0xd9, 0x9f, 0x8c, 0x6a, 0x77, 0x34, 0xba, 0x63, 0xb6, 0xa8, 0xa9, 0x68, 0x5d, + 0xbb, 0xf3, 0x6e, 0x05, 0xb0, 0x50, 0x08, 0x1b, 0xbe, 0x07, 0x0a, 0x3d, 0xfc, 0xa0, 0xd5, 0x37, + 0xbb, 0x71, 0x1d, 0x32, 0xdd, 0x3c, 0xbc, 0x00, 0xb6, 0x04, 0x0a, 0x72, 0xf1, 0xe4, 0xcf, 0x25, + 0xb0, 0x9c, 0xd0, 0x55, 0xbf, 0x41, 0x51, 0xfe, 0x55, 0x02, 0xe7, 0x03, 0x51, 0xb2, 0xb2, 0x24, + 0xf7, 0xfb, 0x2a, 0xaf, 0x50, 0xc1, 0x64, 0x2e, 0x81, 0xa2, 0x81, 0x4d, 0xaa, 0xb8, 0x3c, 0x38, + 0xdf, 0x98, 0x1d, 0x8f, 0xaa, 0xc5, 0xa6, 0x33, 0x88, 0x3c, 0x79, 0xcc, 0xda, 0x64, 0x9e, 0xdd, + 0xda, 0xc8, 0xff, 0x93, 0x40, 0xbe, 0xd5, 0xc6, 0x2a, 0x39, 0x06, 0xe2, 0xb2, 0x11, 0x20, 0x2e, + 0xc9, 0x1f, 0x05, 0xb8, 0x3f, 0x89, 0x9c, 0x65, 0x33, 0xc4, 0x59, 0x2e, 0x4c, 0xc0, 0x79, 0x32, + 0x5d, 0x79, 0x03, 0x14, 0xdd, 0xe9, 0xa6, 0x3b, 0x4b, 0xe5, 0xdf, 0x67, 0x40, 0xc9, 0x37, 0xc5, + 0x94, 0x27, 0xf1, 0xbd, 0x40, 0xfb, 0x61, 0x67, 0xcc, 0x6a, 0x9a, 0x40, 0x6a, 0x4e, 0xab, 0x79, + 0x4b, 0xa3, 0xa6, 0xff, 0x5d, 0x35, 0xda, 0x81, 0xde, 0x04, 0x73, 0x14, 0x9b, 0x5d, 0x42, 0x1d, + 0x19, 0x5f, 0xb0, 0xa2, 0x77, 0x77, 0x73, 0x37, 0x20, 0x45, 0x21, 0xed, 0xb3, 0x37, 0xc0, 0x6c, + 0x60, 0x32, 0x78, 0x1a, 0x64, 0x0f, 0xc9, 0xd0, 0x66, 0x70, 0x88, 0xfd, 0x84, 0x8b, 0x20, 0x3f, + 0xc0, 0x6a, 0xdf, 0x4e, 0xd1, 0x22, 0xb2, 0x1f, 0xae, 0x67, 0x5e, 0x97, 0xe4, 0xdf, 0xb0, 0xc5, + 0xf1, 0x4a, 0xe1, 0x18, 0xb2, 0xeb, 0xed, 0x40, 0x76, 0x25, 0x7f, 0x9f, 0xf4, 0x17, 0x68, 0x52, + 0x8e, 0xa1, 0x50, 0x8e, 0xbd, 0x94, 0x0a, 0xed, 0xc9, 0x99, 0xf6, 0xef, 0x0c, 0x58, 0xf4, 0x69, + 0x7b, 0xcc, 0xf8, 0xfb, 0x01, 0x66, 0xbc, 0x12, 0x62, 0xc6, 0xe5, 0x38, 0x9b, 0x6f, 0xa9, 0xf1, + 0x64, 0x6a, 0xfc, 0x17, 0x09, 0xcc, 0xfb, 0xd6, 0xee, 0x18, 0xb8, 0xf1, 0x9d, 0x20, 0x37, 0xbe, + 0x90, 0x26, 0x69, 0x12, 0xc8, 0xf1, 0x1e, 0x58, 0xf0, 0x29, 0xed, 0x98, 0x1d, 0x45, 0xc3, 0xaa, + 0x05, 0x6f, 0x82, 0x05, 0x71, 0x80, 0xb4, 0x28, 0x36, 0x9d, 0x71, 0xa7, 0xa5, 0x38, 0x48, 0x5c, + 0x86, 0xe2, 0x34, 0xe5, 0xff, 0x48, 0xa0, 0xee, 0x03, 0x6e, 0x12, 0xd3, 0x52, 0x2c, 0x4a, 0x34, + 0xba, 0xa7, 0xab, 0xfd, 0x1e, 0x59, 0x57, 0xb1, 0xd2, 0x43, 0x84, 0x0d, 0x28, 0xba, 0xd6, 0xd4, + 0x55, 0xa5, 0x3d, 0x84, 0x18, 0x94, 0x3e, 0x38, 0x20, 0xda, 0x06, 0x51, 0x09, 0x15, 0x5f, 0xe7, + 0x8a, 0x8d, 0x9b, 0xce, 0xc7, 0xaa, 0x77, 0x3d, 0xd1, 0xe3, 0x51, 0x75, 0x25, 0x0d, 0x22, 0xcf, + 0x5e, 0x3f, 0x26, 0xfc, 0x19, 0x00, 0xec, 0x91, 0x9f, 0x73, 0x1d, 0x91, 0xc8, 0x6f, 0x3a, 0xd5, + 0xfe, 0xae, 0x2b, 0x99, 0x6a, 0x02, 0x1f, 0xa2, 0xfc, 0xc7, 0x42, 0x20, 0x17, 0xbe, 0xf1, 0x37, + 0xa0, 0xbf, 0x00, 0x8b, 0x03, 0x6f, 0x75, 0x1c, 0x05, 0xc6, 0xcd, 0xb3, 0xe1, 0xb7, 0x7c, 0x17, + 0x3e, 0x6e, 0x5d, 0xbd, 0x37, 0x82, 0xbd, 0x18, 0x38, 0x14, 0x3b, 0x09, 0x7c, 0x15, 0x94, 0x18, + 0xa7, 0x56, 0xda, 0x64, 0x1b, 0xf7, 0x9c, 0x3a, 0x75, 0x3f, 0x6e, 0xb6, 0x3c, 0x11, 0xf2, 0xeb, + 0xc1, 0x03, 0xb0, 0x60, 0xe8, 0x9d, 0x2d, 0xac, 0xe1, 0x2e, 0x61, 0x24, 0xd1, 0xde, 0x4a, 0x7e, + 0x2d, 0x5a, 0x6c, 0xbc, 0xe6, 0x5c, 0x79, 0x35, 0xa3, 0x2a, 0x8f, 0x47, 0xd5, 0xe5, 0x98, 0x61, + 0x9e, 0x04, 0x71, 0x90, 0xd0, 0x8c, 0x7c, 0x90, 0xb7, 0x3f, 0x48, 0xac, 0xa6, 0x29, 0xd8, 0x23, + 0x7e, 0x92, 0x4f, 0xba, 0xf5, 0x2d, 0x1c, 0xe9, 0xd6, 0x37, 0xe6, 0xf5, 0xb7, 0x38, 0xe5, 0xeb, + 0xef, 0xc7, 0x12, 0xb8, 0x60, 0xa4, 0xa8, 0xa5, 0x32, 0xe0, 0x6b, 0x73, 0x3b, 0xcd, 0xda, 0xa4, + 0xa9, 0xcd, 0xc6, 0xca, 0x78, 0x54, 0xbd, 0x90, 0x46, 0x13, 0xa5, 0xf2, 0x0f, 0xee, 0x81, 0x82, + 0x2e, 0xce, 0xc7, 0x72, 0x89, 0xfb, 0x7a, 0x39, 0x8d, 0xaf, 0xce, 0x99, 0x6a, 0x97, 0xa5, 0xf3, + 0x84, 0x5c, 0x2c, 0xf9, 0xc3, 0x3c, 0x38, 0x13, 0xe9, 0xee, 0x5f, 0xe2, 0xdd, 0x76, 0xe4, 0x45, + 0x3b, 0x3b, 0xc5, 0x8b, 0xf6, 0x1a, 0x98, 0x17, 0x7f, 0x97, 0x08, 0xbd, 0xa7, 0xbb, 0x09, 0xb3, + 0x1e, 0x14, 0xa3, 0xb0, 0x7e, 0xdc, 0xdd, 0x7a, 0x7e, 0xca, 0xbb, 0x75, 0xbf, 0x17, 0xe2, 0xef, + 0x7f, 0x76, 0x79, 0x47, 0xbd, 0x10, 0xff, 0x02, 0x0c, 0xeb, 0x33, 0x52, 0x6b, 0xa3, 0xba, 0x08, + 0x27, 0x83, 0xa4, 0x76, 0x37, 0x20, 0x45, 0x21, 0xed, 0x2f, 0xf4, 0x97, 0x00, 0x1c, 0xf3, 0x97, + 0x80, 0x2b, 0x69, 0x72, 0x2d, 0xfd, 0x35, 0x7a, 0xec, 0x85, 0x48, 0x69, 0xfa, 0x0b, 0x11, 0xf9, + 0xef, 0x12, 0x78, 0x2e, 0xf1, 0xd4, 0x82, 0x6b, 0x01, 0xca, 0x79, 0x25, 0x44, 0x39, 0xbf, 0x97, + 0x68, 0xe8, 0xe3, 0x9d, 0x66, 0xfc, 0x0d, 0xfb, 0x1b, 0xe9, 0x6e, 0xd8, 0x63, 0xde, 0x92, 0x27, + 0x5f, 0xb5, 0x37, 0x7e, 0xf0, 0xf0, 0x51, 0xe5, 0xc4, 0x27, 0x8f, 0x2a, 0x27, 0x3e, 0x7b, 0x54, + 0x39, 0xf1, 0xcb, 0x71, 0x45, 0x7a, 0x38, 0xae, 0x48, 0x9f, 0x8c, 0x2b, 0xd2, 0x67, 0xe3, 0x8a, + 0xf4, 0x8f, 0x71, 0x45, 0xfa, 0xed, 0xe7, 0x95, 0x13, 0xef, 0x2d, 0x27, 0xfc, 0x21, 0xf9, 0xff, + 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x93, 0x41, 0x4c, 0xc3, 0x2c, 0x00, 0x00, } func (m *ControllerRevision) Marshal() (dAtA []byte, err error) { @@ -2573,6 +2605,32 @@ func (m *StatefulSetList) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *StatefulSetOrdinals) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StatefulSetOrdinals) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatefulSetOrdinals) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i = encodeVarintGenerated(dAtA, i, uint64(m.Start)) + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2626,6 +2684,18 @@ func (m *StatefulSetSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.Ordinals != nil { + { + size, err := m.Ordinals.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x5a + } if m.PersistentVolumeClaimRetentionPolicy != nil { { size, err := m.PersistentVolumeClaimRetentionPolicy.MarshalToSizedBuffer(dAtA[:i]) @@ -3331,6 +3401,16 @@ func (m *StatefulSetList) Size() (n int) { return n } +func (m *StatefulSetOrdinals) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovGenerated(uint64(m.Start)) + return n +} + func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Size() (n int) { if m == nil { return 0 @@ -3379,6 +3459,10 @@ func (m *StatefulSetSpec) Size() (n int) { l = m.PersistentVolumeClaimRetentionPolicy.Size() n += 1 + l + sovGenerated(uint64(l)) } + if m.Ordinals != nil { + l = m.Ordinals.Size() + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -3837,6 +3921,16 @@ func (this *StatefulSetList) String() string { }, "") return s } +func (this *StatefulSetOrdinals) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&StatefulSetOrdinals{`, + `Start:` + fmt.Sprintf("%v", this.Start) + `,`, + `}`, + }, "") + return s +} func (this *StatefulSetPersistentVolumeClaimRetentionPolicy) String() string { if this == nil { return "nil" @@ -3868,6 +3962,7 @@ func (this *StatefulSetSpec) String() string { `RevisionHistoryLimit:` + valueToStringGenerated(this.RevisionHistoryLimit) + `,`, `MinReadySeconds:` + fmt.Sprintf("%v", this.MinReadySeconds) + `,`, `PersistentVolumeClaimRetentionPolicy:` + strings.Replace(this.PersistentVolumeClaimRetentionPolicy.String(), "StatefulSetPersistentVolumeClaimRetentionPolicy", "StatefulSetPersistentVolumeClaimRetentionPolicy", 1) + `,`, + `Ordinals:` + strings.Replace(this.Ordinals.String(), "StatefulSetOrdinals", "StatefulSetOrdinals", 1) + `,`, `}`, }, "") return s @@ -8393,6 +8488,75 @@ func (m *StatefulSetList) Unmarshal(dAtA []byte) error { } return nil } +func (m *StatefulSetOrdinals) 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: StatefulSetOrdinals: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatefulSetOrdinals: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Start", wireType) + } + m.Start = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Start |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *StatefulSetPersistentVolumeClaimRetentionPolicy) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -8831,6 +8995,42 @@ func (m *StatefulSetSpec) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Ordinals", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Ordinals == nil { + m.Ordinals = &StatefulSetOrdinals{} + } + if err := m.Ordinals.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/staging/src/k8s.io/api/apps/v1beta2/generated.proto b/staging/src/k8s.io/api/apps/v1beta2/generated.proto index 2851ee7a367..eaf66989145 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/generated.proto +++ b/staging/src/k8s.io/api/apps/v1beta2/generated.proto @@ -667,6 +667,17 @@ message StatefulSetList { repeated StatefulSet items = 2; } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +message StatefulSetOrdinals { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + optional int32 replicaStartOrdinal = 1; +} + // StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs // created from the StatefulSet VolumeClaimTemplates. message StatefulSetPersistentVolumeClaimRetentionPolicy { @@ -755,6 +766,14 @@ message StatefulSetSpec { // StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. // +optional optional StatefulSetPersistentVolumeClaimRetentionPolicy persistentVolumeClaimRetentionPolicy = 10; + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + optional StatefulSetOrdinals ordinals = 11; } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1beta2/types.go b/staging/src/k8s.io/api/apps/v1beta2/types.go index 31a2966fd97..fc84f7c9b4c 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/types.go +++ b/staging/src/k8s.io/api/apps/v1beta2/types.go @@ -214,6 +214,17 @@ type StatefulSetPersistentVolumeClaimRetentionPolicy struct { WhenScaled PersistentVolumeClaimRetentionPolicyType `json:"whenScaled,omitempty" protobuf:"bytes,2,opt,name=whenScaled,casttype=PersistentVolumeClaimRetentionPolicyType"` } +// StatefulSetOrdinals describes the policy used for replica ordinal assignment +// in this StatefulSet. +type StatefulSetOrdinals struct { + // Start is the number representing the first index that is used to represent + // replica ordinals. Defaults to 0. + // If set, replica ordinals will be numbered + // [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas). + // +optional + Start int32 `json:"start" protobuf:"varint,1,opt,name=start"` +} + // A StatefulSetSpec is the specification of a StatefulSet. type StatefulSetSpec struct { // replicas is the desired number of replicas of the given Template. @@ -285,6 +296,14 @@ type StatefulSetSpec struct { // StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha. // +optional PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicy `json:"persistentVolumeClaimRetentionPolicy,omitempty" protobuf:"bytes,10,opt,name=persistentVolumeClaimRetentionPolicy"` + + // Ordinals controls how the stateful set creates pod and persistent volume + // claim names. + // The default behavior assigns a number starting with zero and incremented by + // one for each additional replica requested. This requires the + // StatefulSetSlice feature gate to be enabled, which is alpha. + // +optional + Ordinals *StatefulSetOrdinals `json:"ordinals,omitempty" protobuf:"bytes,11,opt,name=ordinals"` } // StatefulSetStatus represents the current state of a StatefulSet. diff --git a/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go b/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go index a91409e3cf7..3019357e111 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go @@ -352,6 +352,15 @@ func (StatefulSetList) SwaggerDoc() map[string]string { return map_StatefulSetList } +var map_StatefulSetOrdinals = map[string]string{ + "": "StatefulSetOrdinals describes the policy used for replica ordinal assignment in this StatefulSet.", + "start": "Start is the number representing the first index that is used to represent replica ordinals. Defaults to 0. If set, replica ordinals will be numbered [.spec.ordinals.start, .spec.ordinals.start - .spec.replicas).", +} + +func (StatefulSetOrdinals) SwaggerDoc() map[string]string { + return map_StatefulSetOrdinals +} + var map_StatefulSetPersistentVolumeClaimRetentionPolicy = map[string]string{ "": "StatefulSetPersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates.", "whenDeleted": "WhenDeleted specifies what happens to PVCs created from StatefulSet VolumeClaimTemplates when the StatefulSet is deleted. The default policy of `Retain` causes PVCs to not be affected by StatefulSet deletion. The `Delete` policy causes those PVCs to be deleted.", @@ -374,6 +383,7 @@ var map_StatefulSetSpec = map[string]string{ "revisionHistoryLimit": "revisionHistoryLimit is the maximum number of revisions that will be maintained in the StatefulSet's revision history. The revision history consists of all revisions not represented by a currently applied StatefulSetSpec version. The default value is 10.", "minReadySeconds": "Minimum number of seconds for which a newly created pod should be ready without any of its container crashing for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready)", "persistentVolumeClaimRetentionPolicy": "PersistentVolumeClaimRetentionPolicy describes the policy used for PVCs created from the StatefulSet VolumeClaimTemplates. This requires the StatefulSetAutoDeletePVC feature gate to be enabled, which is alpha.", + "ordinals": "Ordinals controls how the stateful set creates pod and persistent volume claim names. The default behavior assigns a number starting with zero and incremented by one for each additional replica requested. This requires the StatefulSetSlice feature gate to be enabled, which is alpha.", } func (StatefulSetSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go index 118fd38093d..cd92792db56 100644 --- a/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go @@ -760,6 +760,22 @@ func (in *StatefulSetList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *StatefulSetOrdinals) DeepCopyInto(out *StatefulSetOrdinals) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new StatefulSetOrdinals. +func (in *StatefulSetOrdinals) DeepCopy() *StatefulSetOrdinals { + if in == nil { + return nil + } + out := new(StatefulSetOrdinals) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *StatefulSetPersistentVolumeClaimRetentionPolicy) DeepCopyInto(out *StatefulSetPersistentVolumeClaimRetentionPolicy) { *out = *in @@ -808,6 +824,11 @@ func (in *StatefulSetSpec) DeepCopyInto(out *StatefulSetSpec) { *out = new(StatefulSetPersistentVolumeClaimRetentionPolicy) **out = **in } + if in.Ordinals != nil { + in, out := &in.Ordinals, &out.Ordinals + *out = new(StatefulSetOrdinals) + **out = **in + } return } diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go new file mode 100644 index 00000000000..9778f1c4a04 --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetordinals.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1 + +// StatefulSetOrdinalsApplyConfiguration represents an declarative configuration of the StatefulSetOrdinals type for use +// with apply. +type StatefulSetOrdinalsApplyConfiguration struct { + Start *int32 `json:"start,omitempty"` +} + +// StatefulSetOrdinalsApplyConfiguration constructs an declarative configuration of the StatefulSetOrdinals type for use with +// apply. +func StatefulSetOrdinals() *StatefulSetOrdinalsApplyConfiguration { + return &StatefulSetOrdinalsApplyConfiguration{} +} + +// WithStart sets the Start field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Start field is set to the value of the last call. +func (b *StatefulSetOrdinalsApplyConfiguration) WithStart(value int32) *StatefulSetOrdinalsApplyConfiguration { + b.Start = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go index ee0ed40a569..81afdca5960 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1/statefulsetspec.go @@ -37,6 +37,7 @@ type StatefulSetSpecApplyConfiguration struct { RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration `json:"persistentVolumeClaimRetentionPolicy,omitempty"` + Ordinals *StatefulSetOrdinalsApplyConfiguration `json:"ordinals,omitempty"` } // StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with @@ -129,3 +130,11 @@ func (b *StatefulSetSpecApplyConfiguration) WithPersistentVolumeClaimRetentionPo b.PersistentVolumeClaimRetentionPolicy = value return b } + +// WithOrdinals sets the Ordinals field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ordinals field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithOrdinals(value *StatefulSetOrdinalsApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Ordinals = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go new file mode 100644 index 00000000000..8f349a2d27c --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetordinals.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta1 + +// StatefulSetOrdinalsApplyConfiguration represents an declarative configuration of the StatefulSetOrdinals type for use +// with apply. +type StatefulSetOrdinalsApplyConfiguration struct { + Start *int32 `json:"start,omitempty"` +} + +// StatefulSetOrdinalsApplyConfiguration constructs an declarative configuration of the StatefulSetOrdinals type for use with +// apply. +func StatefulSetOrdinals() *StatefulSetOrdinalsApplyConfiguration { + return &StatefulSetOrdinalsApplyConfiguration{} +} + +// WithStart sets the Start field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Start field is set to the value of the last call. +func (b *StatefulSetOrdinalsApplyConfiguration) WithStart(value int32) *StatefulSetOrdinalsApplyConfiguration { + b.Start = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go index 886433d9ea3..1eb1ba7b039 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta1/statefulsetspec.go @@ -37,6 +37,7 @@ type StatefulSetSpecApplyConfiguration struct { RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration `json:"persistentVolumeClaimRetentionPolicy,omitempty"` + Ordinals *StatefulSetOrdinalsApplyConfiguration `json:"ordinals,omitempty"` } // StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with @@ -129,3 +130,11 @@ func (b *StatefulSetSpecApplyConfiguration) WithPersistentVolumeClaimRetentionPo b.PersistentVolumeClaimRetentionPolicy = value return b } + +// WithOrdinals sets the Ordinals field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ordinals field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithOrdinals(value *StatefulSetOrdinalsApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Ordinals = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go new file mode 100644 index 00000000000..c586da775ce --- /dev/null +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetordinals.go @@ -0,0 +1,39 @@ +/* +Copyright The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +// Code generated by applyconfiguration-gen. DO NOT EDIT. + +package v1beta2 + +// StatefulSetOrdinalsApplyConfiguration represents an declarative configuration of the StatefulSetOrdinals type for use +// with apply. +type StatefulSetOrdinalsApplyConfiguration struct { + Start *int32 `json:"start,omitempty"` +} + +// StatefulSetOrdinalsApplyConfiguration constructs an declarative configuration of the StatefulSetOrdinals type for use with +// apply. +func StatefulSetOrdinals() *StatefulSetOrdinalsApplyConfiguration { + return &StatefulSetOrdinalsApplyConfiguration{} +} + +// WithStart sets the Start field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Start field is set to the value of the last call. +func (b *StatefulSetOrdinalsApplyConfiguration) WithStart(value int32) *StatefulSetOrdinalsApplyConfiguration { + b.Start = &value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go index 08922cea576..b6165fbd9a2 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/apps/v1beta2/statefulsetspec.go @@ -37,6 +37,7 @@ type StatefulSetSpecApplyConfiguration struct { RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"` MinReadySeconds *int32 `json:"minReadySeconds,omitempty"` PersistentVolumeClaimRetentionPolicy *StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration `json:"persistentVolumeClaimRetentionPolicy,omitempty"` + Ordinals *StatefulSetOrdinalsApplyConfiguration `json:"ordinals,omitempty"` } // StatefulSetSpecApplyConfiguration constructs an declarative configuration of the StatefulSetSpec type for use with @@ -129,3 +130,11 @@ func (b *StatefulSetSpecApplyConfiguration) WithPersistentVolumeClaimRetentionPo b.PersistentVolumeClaimRetentionPolicy = value return b } + +// WithOrdinals sets the Ordinals field in the declarative configuration to the given value +// and returns the receiver, so that objects can be built by chaining "With" function invocations. +// If called multiple times, the Ordinals field is set to the value of the last call. +func (b *StatefulSetSpecApplyConfiguration) WithOrdinals(value *StatefulSetOrdinalsApplyConfiguration) *StatefulSetSpecApplyConfiguration { + b.Ordinals = value + return b +} diff --git a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go index 575e49ddbe7..2d9567051ec 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/internal/internal.go @@ -1039,6 +1039,13 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.apps.v1.StatefulSetOrdinals + map: + fields: + - name: start + type: + scalar: numeric + default: 0 - name: io.k8s.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy map: fields: @@ -1054,6 +1061,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: minReadySeconds type: scalar: numeric + - name: ordinals + type: + namedType: io.k8s.api.apps.v1.StatefulSetOrdinals - name: persistentVolumeClaimRetentionPolicy type: namedType: io.k8s.api.apps.v1.StatefulSetPersistentVolumeClaimRetentionPolicy @@ -1342,6 +1352,13 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.apps.v1beta1.StatefulSetOrdinals + map: + fields: + - name: start + type: + scalar: numeric + default: 0 - name: io.k8s.api.apps.v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy map: fields: @@ -1357,6 +1374,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: minReadySeconds type: scalar: numeric + - name: ordinals + type: + namedType: io.k8s.api.apps.v1beta1.StatefulSetOrdinals - name: persistentVolumeClaimRetentionPolicy type: namedType: io.k8s.api.apps.v1beta1.StatefulSetPersistentVolumeClaimRetentionPolicy @@ -1843,6 +1863,13 @@ var schemaYAML = typed.YAMLObject(`types: type: scalar: string default: "" +- name: io.k8s.api.apps.v1beta2.StatefulSetOrdinals + map: + fields: + - name: start + type: + scalar: numeric + default: 0 - name: io.k8s.api.apps.v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy map: fields: @@ -1858,6 +1885,9 @@ var schemaYAML = typed.YAMLObject(`types: - name: minReadySeconds type: scalar: numeric + - name: ordinals + type: + namedType: io.k8s.api.apps.v1beta2.StatefulSetOrdinals - name: persistentVolumeClaimRetentionPolicy type: namedType: io.k8s.api.apps.v1beta2.StatefulSetPersistentVolumeClaimRetentionPolicy diff --git a/staging/src/k8s.io/client-go/applyconfigurations/utils.go b/staging/src/k8s.io/client-go/applyconfigurations/utils.go index 88250757d0d..1acc51af314 100644 --- a/staging/src/k8s.io/client-go/applyconfigurations/utils.go +++ b/staging/src/k8s.io/client-go/applyconfigurations/utils.go @@ -211,6 +211,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &applyconfigurationsappsv1.StatefulSetApplyConfiguration{} case appsv1.SchemeGroupVersion.WithKind("StatefulSetCondition"): return &applyconfigurationsappsv1.StatefulSetConditionApplyConfiguration{} + case appsv1.SchemeGroupVersion.WithKind("StatefulSetOrdinals"): + return &applyconfigurationsappsv1.StatefulSetOrdinalsApplyConfiguration{} case appsv1.SchemeGroupVersion.WithKind("StatefulSetPersistentVolumeClaimRetentionPolicy"): return &applyconfigurationsappsv1.StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration{} case appsv1.SchemeGroupVersion.WithKind("StatefulSetSpec"): @@ -243,6 +245,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &applyconfigurationsappsv1beta1.StatefulSetApplyConfiguration{} case appsv1beta1.SchemeGroupVersion.WithKind("StatefulSetCondition"): return &applyconfigurationsappsv1beta1.StatefulSetConditionApplyConfiguration{} + case appsv1beta1.SchemeGroupVersion.WithKind("StatefulSetOrdinals"): + return &applyconfigurationsappsv1beta1.StatefulSetOrdinalsApplyConfiguration{} case appsv1beta1.SchemeGroupVersion.WithKind("StatefulSetPersistentVolumeClaimRetentionPolicy"): return &applyconfigurationsappsv1beta1.StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration{} case appsv1beta1.SchemeGroupVersion.WithKind("StatefulSetSpec"): @@ -295,6 +299,8 @@ func ForKind(kind schema.GroupVersionKind) interface{} { return &appsv1beta2.StatefulSetApplyConfiguration{} case v1beta2.SchemeGroupVersion.WithKind("StatefulSetCondition"): return &appsv1beta2.StatefulSetConditionApplyConfiguration{} + case v1beta2.SchemeGroupVersion.WithKind("StatefulSetOrdinals"): + return &appsv1beta2.StatefulSetOrdinalsApplyConfiguration{} case v1beta2.SchemeGroupVersion.WithKind("StatefulSetPersistentVolumeClaimRetentionPolicy"): return &appsv1beta2.StatefulSetPersistentVolumeClaimRetentionPolicyApplyConfiguration{} case v1beta2.SchemeGroupVersion.WithKind("StatefulSetSpec"):