diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 5999f3e48c..5e07baad3e 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -9328,9 +9328,9 @@ "description": "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/", "type": "object" }, - "preempting": { - "description": "Preempting specifies whether a pod with this PriorityClass could start a preemption process. If this field is missing, the PriorityClass is considered a Preempting class by default.", - "type": "boolean" + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", + "type": "string" }, "priority": { "description": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", @@ -15163,9 +15163,9 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata" }, - "preempting": { - "description": "Preempting specifies whether a pod with this PriorityClass could trigger a preemption process. If this field is unset, the PriorityClass is considered a Preempting class by default.", - "type": "boolean" + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", + "type": "string" }, "value": { "description": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", @@ -15243,6 +15243,10 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata" }, + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", + "type": "string" + }, "value": { "description": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", "format": "int32", @@ -15319,6 +15323,10 @@ "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.ObjectMeta", "description": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata" }, + "preemptionPolicy": { + "description": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", + "type": "string" + }, "value": { "description": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", "format": "int32", diff --git a/cmd/kube-scheduler/app/server.go b/cmd/kube-scheduler/app/server.go index b1c30f1e42..58745fa9fd 100644 --- a/cmd/kube-scheduler/app/server.go +++ b/cmd/kube-scheduler/app/server.go @@ -172,7 +172,6 @@ func Run(cc schedulerserverconfig.CompletedConfig, stopCh <-chan struct{}) error cc.InformerFactory.Core().V1().Services(), cc.InformerFactory.Policy().V1beta1().PodDisruptionBudgets(), cc.InformerFactory.Storage().V1().StorageClasses(), - cc.InformerFactory.Scheduling().V1().PriorityClasses(), cc.Recorder, cc.ComponentConfig.AlgorithmSource, stopCh, diff --git a/hack/.golint_failures b/hack/.golint_failures index 9e24b1e815..ba70b1647e 100644 --- a/hack/.golint_failures +++ b/hack/.golint_failures @@ -45,11 +45,9 @@ pkg/apis/rbac/v1 pkg/apis/rbac/v1alpha1 pkg/apis/rbac/v1beta1 pkg/apis/rbac/validation -pkg/apis/scheduling pkg/apis/scheduling/v1 pkg/apis/scheduling/v1alpha1 pkg/apis/scheduling/v1beta1 -pkg/apis/settings pkg/apis/storage pkg/apis/storage/v1 pkg/apis/storage/v1beta1 @@ -530,7 +528,6 @@ staging/src/k8s.io/client-go/scale/scheme/extensionsv1beta1 staging/src/k8s.io/client-go/testing staging/src/k8s.io/client-go/tools/cache staging/src/k8s.io/client-go/tools/cache/testing -staging/src/k8s.io/client-go/tools/cacheck/.golint_failures staging/src/k8s.io/client-go/tools/clientcmd staging/src/k8s.io/client-go/tools/clientcmd/api staging/src/k8s.io/client-go/tools/clientcmd/api/latest diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index e2a7cb566e..d6f4fdbcf8 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -379,6 +379,12 @@ func dropDisabledFields( dropDisabledCSIVolumeSourceAlphaFields(podSpec, oldPodSpec) + if !utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && + !podPriorityInUse(oldPodSpec) { + // Set to nil pod's PreemptionPolicy fields if the feature is disabled and the old pod + // does not specify any values for these fields. + podSpec.PreemptionPolicy = nil + } } // dropDisabledRunAsGroupField removes disabled fields from PodSpec related diff --git a/pkg/api/testing/defaulting_test.go b/pkg/api/testing/defaulting_test.go index 45a30413bc..b745b9f000 100644 --- a/pkg/api/testing/defaulting_test.go +++ b/pkg/api/testing/defaulting_test.go @@ -22,11 +22,11 @@ import ( "sort" "testing" - fuzz "github.com/google/gofuzz" + "github.com/google/gofuzz" apiv1 "k8s.io/api/core/v1" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" - roundtrip "k8s.io/apimachinery/pkg/api/apitesting/roundtrip" + "k8s.io/apimachinery/pkg/api/apitesting/roundtrip" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" @@ -147,8 +147,6 @@ func TestDefaulting(t *testing.T) { {Group: "storage.k8s.io", Version: "v1", Kind: "StorageClass"}: {}, {Group: "storage.k8s.io", Version: "v1", Kind: "StorageClassList"}: {}, {Group: "authentication.k8s.io", Version: "v1", Kind: "TokenRequest"}: {}, - {Group: "scheduling.k8s.io", Version: "v1", Kind: "PriorityClass"}: {}, - {Group: "scheduling.k8s.io", Version: "v1", Kind: "PriorityClassList"}: {}, } f := fuzz.New().NilChance(.5).NumElements(1, 1).RandSource(rand.NewSource(1)) diff --git a/pkg/api/testing/serialization_test.go b/pkg/api/testing/serialization_test.go index aef0c69cfc..6d7bfc8999 100644 --- a/pkg/api/testing/serialization_test.go +++ b/pkg/api/testing/serialization_test.go @@ -217,7 +217,7 @@ func TestRoundTripTypes(t *testing.T) { func TestEncodePtr(t *testing.T) { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting + preemptNever := api.PreemptNever pod := &api.Pod{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{"name": "foo"}, @@ -231,7 +231,7 @@ func TestEncodePtr(t *testing.T) { SecurityContext: &api.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, + PreemptionPolicy: &preemptNever, }, } obj := runtime.Object(pod) diff --git a/pkg/apis/core/fuzzer/fuzzer.go b/pkg/apis/core/fuzzer/fuzzer.go index 028bf2cbbf..2a6b66e456 100644 --- a/pkg/apis/core/fuzzer/fuzzer.go +++ b/pkg/apis/core/fuzzer/fuzzer.go @@ -89,10 +89,6 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { enableServiceLinks := corev1.DefaultEnableServiceLinks s.EnableServiceLinks = &enableServiceLinks } - if s.Preempting == nil { - preempting := corev1.DefaultPreempting - s.Preempting = &preempting - } }, func(j *core.PodPhase, c fuzz.Continue) { statuses := []core.PodPhase{core.PodPending, core.PodRunning, core.PodFailed, core.PodUnknown} diff --git a/pkg/apis/core/types.go b/pkg/apis/core/types.go index 4673e2df77..1f0ab9dea2 100644 --- a/pkg/apis/core/types.go +++ b/pkg/apis/core/types.go @@ -1941,6 +1941,16 @@ const ( PullIfNotPresent PullPolicy = "IfNotPresent" ) +// PreemptionPolicy describes a policy for if/when to preempt a pod. +type PreemptionPolicy string + +const ( + // PreemptLowerPriority means that pod can preempt other pods with lower priority. + PreemptLowerPriority PreemptionPolicy = "PreemptLowerPriority" + // PreemptNever means that pod never preempts other pods with lower priority. + PreemptNever PreemptionPolicy = "Never" +) + // TerminationMessagePolicy describes how termination messages are retrieved from a container. type TerminationMessagePolicy string @@ -2662,10 +2672,12 @@ type PodSpec struct { // The higher the value, the higher the priority. // +optional Priority *int32 - // Preempting specifies whether a pod with this PriorityClass could start a preemption process. - // If not specified, the default is true. + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. // +optional - Preempting *bool + PreemptionPolicy *PreemptionPolicy // Specifies the DNS parameters of a pod. // Parameters specified here will be merged to the generated DNS // configuration based on DNSPolicy. diff --git a/pkg/apis/core/v1/defaults.go b/pkg/apis/core/v1/defaults.go index 096f75646a..d06356a89d 100644 --- a/pkg/apis/core/v1/defaults.go +++ b/pkg/apis/core/v1/defaults.go @@ -162,11 +162,6 @@ func SetDefaults_Pod(obj *v1.Pod) { enableServiceLinks := v1.DefaultEnableServiceLinks obj.Spec.EnableServiceLinks = &enableServiceLinks } - if obj.Spec.Preempting == nil { - // Set Preempting as true by default. - Preempting := v1.DefaultPreempting - obj.Spec.Preempting = &Preempting - } } func SetDefaults_PodSpec(obj *v1.PodSpec) { // New fields added here will break upgrade tests: diff --git a/pkg/apis/core/v1/defaults_test.go b/pkg/apis/core/v1/defaults_test.go index d3c1a62373..b3d9ad4316 100644 --- a/pkg/apis/core/v1/defaults_test.go +++ b/pkg/apis/core/v1/defaults_test.go @@ -1390,11 +1390,3 @@ func TestSetDefaultEnableServiceLinks(t *testing.T) { t.Errorf("Expected enableServiceLinks value: %+v\ngot: %+v\n", v1.DefaultEnableServiceLinks, *output.Spec.EnableServiceLinks) } } - -func TestSetDefaultPreempting(t *testing.T) { - pod := &v1.Pod{} - output := roundTrip(t, runtime.Object(pod)).(*v1.Pod) - if output.Spec.Preempting == nil || *output.Spec.Preempting != v1.DefaultPreempting { - t.Errorf("Expected enableServiceLinks value: %+v\ngot: %+v\n", v1.DefaultPreempting, *output.Spec.Preempting) - } -} diff --git a/pkg/apis/core/v1/zz_generated.conversion.go b/pkg/apis/core/v1/zz_generated.conversion.go index 3249481743..883066ec3a 100644 --- a/pkg/apis/core/v1/zz_generated.conversion.go +++ b/pkg/apis/core/v1/zz_generated.conversion.go @@ -5594,11 +5594,11 @@ func autoConvert_v1_PodSpec_To_core_PodSpec(in *v1.PodSpec, out *core.PodSpec, s out.HostAliases = *(*[]core.HostAlias)(unsafe.Pointer(&in.HostAliases)) out.PriorityClassName = in.PriorityClassName out.Priority = (*int32)(unsafe.Pointer(in.Priority)) - out.Preempting = (*bool)(unsafe.Pointer(in.Preempting)) out.DNSConfig = (*core.PodDNSConfig)(unsafe.Pointer(in.DNSConfig)) out.ReadinessGates = *(*[]core.PodReadinessGate)(unsafe.Pointer(&in.ReadinessGates)) out.RuntimeClassName = (*string)(unsafe.Pointer(in.RuntimeClassName)) out.EnableServiceLinks = (*bool)(unsafe.Pointer(in.EnableServiceLinks)) + out.PreemptionPolicy = (*core.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } @@ -5642,7 +5642,7 @@ func autoConvert_core_PodSpec_To_v1_PodSpec(in *core.PodSpec, out *v1.PodSpec, s out.HostAliases = *(*[]v1.HostAlias)(unsafe.Pointer(&in.HostAliases)) out.PriorityClassName = in.PriorityClassName out.Priority = (*int32)(unsafe.Pointer(in.Priority)) - out.Preempting = (*bool)(unsafe.Pointer(in.Preempting)) + out.PreemptionPolicy = (*v1.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) out.DNSConfig = (*v1.PodDNSConfig)(unsafe.Pointer(in.DNSConfig)) out.ReadinessGates = *(*[]v1.PodReadinessGate)(unsafe.Pointer(&in.ReadinessGates)) out.RuntimeClassName = (*string)(unsafe.Pointer(in.RuntimeClassName)) diff --git a/pkg/apis/core/validation/validation.go b/pkg/apis/core/validation/validation.go index 7eca587e12..ead5c29c9c 100644 --- a/pkg/apis/core/validation/validation.go +++ b/pkg/apis/core/validation/validation.go @@ -2653,6 +2653,19 @@ func validateRestartPolicy(restartPolicy *core.RestartPolicy, fldPath *field.Pat return allErrors } +func ValidatePreemptionPolicy(preemptionPolicy *core.PreemptionPolicy, fldPath *field.Path) field.ErrorList { + allErrors := field.ErrorList{} + switch *preemptionPolicy { + case core.PreemptLowerPriority, core.PreemptNever: + case "": + allErrors = append(allErrors, field.Required(fldPath, "")) + default: + validValues := []string{string(core.PreemptLowerPriority), string(core.PreemptNever)} + allErrors = append(allErrors, field.NotSupported(fldPath, preemptionPolicy, validValues)) + } + return allErrors +} + func validateDNSPolicy(dnsPolicy *core.DNSPolicy, fldPath *field.Path) field.ErrorList { allErrors := field.ErrorList{} switch *dnsPolicy { @@ -3033,6 +3046,10 @@ func ValidatePodSpec(spec *core.PodSpec, fldPath *field.Path) field.ErrorList { allErrs = append(allErrs, ValidateRuntimeClassName(*spec.RuntimeClassName, fldPath.Child("runtimeClassName"))...) } + if spec.PreemptionPolicy != nil { + allErrs = append(allErrs, ValidatePreemptionPolicy(spec.PreemptionPolicy, fldPath.Child("preemptionPolicy"))...) + } + return allErrs } diff --git a/pkg/apis/core/zz_generated.deepcopy.go b/pkg/apis/core/zz_generated.deepcopy.go index 9b245507d2..ae3343d0ab 100644 --- a/pkg/apis/core/zz_generated.deepcopy.go +++ b/pkg/apis/core/zz_generated.deepcopy.go @@ -3610,9 +3610,9 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(int32) **out = **in } - if in.Preempting != nil { - in, out := &in.Preempting, &out.Preempting - *out = new(bool) + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(PreemptionPolicy) **out = **in } if in.DNSConfig != nil { diff --git a/pkg/apis/scheduling/BUILD b/pkg/apis/scheduling/BUILD index b211c88142..f32c1c166e 100644 --- a/pkg/apis/scheduling/BUILD +++ b/pkg/apis/scheduling/BUILD @@ -9,7 +9,6 @@ load( go_library( name = "go_default_library", srcs = [ - "annotations.go", "doc.go", "helpers.go", "register.go", @@ -18,6 +17,7 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/apis/scheduling", deps = [ + "//pkg/apis/core:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", @@ -37,6 +37,7 @@ filegroup( ":package-srcs", "//pkg/apis/scheduling/fuzzer:all-srcs", "//pkg/apis/scheduling/install:all-srcs", + "//pkg/apis/scheduling/util:all-srcs", "//pkg/apis/scheduling/v1:all-srcs", "//pkg/apis/scheduling/v1alpha1:all-srcs", "//pkg/apis/scheduling/v1beta1:all-srcs", diff --git a/pkg/apis/scheduling/annotations.go b/pkg/apis/scheduling/annotations.go deleted file mode 100644 index 2f2aca8d50..0000000000 --- a/pkg/apis/scheduling/annotations.go +++ /dev/null @@ -1,21 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package scheduling - -// PreemptingAnnotation is the annotation which holds preempting -// when converting the `Preempting` field from scheduling/v1 -const PreemptingAnnotation = "scheduling.k8s.io/preempting" diff --git a/pkg/apis/scheduling/fuzzer/BUILD b/pkg/apis/scheduling/fuzzer/BUILD index bc81ceb74d..fb91296150 100644 --- a/pkg/apis/scheduling/fuzzer/BUILD +++ b/pkg/apis/scheduling/fuzzer/BUILD @@ -10,8 +10,11 @@ go_library( srcs = ["fuzzer.go"], importpath = "k8s.io/kubernetes/pkg/apis/scheduling/fuzzer", deps = [ + "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/serializer:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", ], ) diff --git a/pkg/apis/scheduling/fuzzer/fuzzer.go b/pkg/apis/scheduling/fuzzer/fuzzer.go index eb4332e8ac..5e5d146e44 100644 --- a/pkg/apis/scheduling/fuzzer/fuzzer.go +++ b/pkg/apis/scheduling/fuzzer/fuzzer.go @@ -19,7 +19,10 @@ package fuzzer import ( "github.com/google/gofuzz" runtimeserializer "k8s.io/apimachinery/pkg/runtime/serializer" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/features" ) // Funcs returns the fuzzer functions for the scheduling api group. @@ -27,9 +30,9 @@ var Funcs = func(codecs runtimeserializer.CodecFactory) []interface{} { return []interface{}{ func(s *scheduling.PriorityClass, c fuzz.Continue) { c.FuzzNoCustom(s) - if s.Preempting == nil { - preempting := scheduling.DefaultPreempting - s.Preempting = &preempting + if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && s.PreemptionPolicy == nil { + preemptLowerPriority := core.PreemptLowerPriority + s.PreemptionPolicy = &preemptLowerPriority } }, } diff --git a/pkg/apis/scheduling/types.go b/pkg/apis/scheduling/types.go index 8751ec04f6..627e6a5191 100644 --- a/pkg/apis/scheduling/types.go +++ b/pkg/apis/scheduling/types.go @@ -16,7 +16,10 @@ limitations under the License. package scheduling -import metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/kubernetes/pkg/apis/core" +) const ( // DefaultPriorityWhenNoDefaultClassExists is used to set priority of pods @@ -36,8 +39,6 @@ const ( SystemClusterCritical = SystemPriorityClassPrefix + "cluster-critical" // SystemNodeCritical is the system priority class name that represents node-critical. SystemNodeCritical = SystemPriorityClassPrefix + "node-critical" - // The default value for preempting attribute. - DefaultPreempting = true ) // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object @@ -67,10 +68,10 @@ type PriorityClass struct { // +optional Description string - // Preempting specifies whether a pod with this PriorityClass could start a preemption process. - // If this field is missing, the PriorityClass is considered a preempting class by default. + // PreemptionPolicy it the Policy for preempting pods with lower priority. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. // +optional - Preempting *bool + PreemptionPolicy *core.PreemptionPolicy } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/scheduling/util/BUILD b/pkg/apis/scheduling/util/BUILD new file mode 100644 index 0000000000..646da39158 --- /dev/null +++ b/pkg/apis/scheduling/util/BUILD @@ -0,0 +1,45 @@ +package(default_visibility = ["//visibility:public"]) + +load( + "@io_bazel_rules_go//go:def.bzl", + "go_library", + "go_test", +) + +go_library( + name = "go_default_library", + srcs = ["util.go"], + importpath = "k8s.io/kubernetes/pkg/apis/scheduling/util", + deps = [ + "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + ], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], +) + +go_test( + name = "go_default_test", + srcs = ["util_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/apis/core:go_default_library", + "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/util/diff:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + ], +) diff --git a/pkg/apis/scheduling/util/util.go b/pkg/apis/scheduling/util/util.go new file mode 100644 index 0000000000..82fd50b03d --- /dev/null +++ b/pkg/apis/scheduling/util/util.go @@ -0,0 +1,40 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/features" +) + +// DropDisabledFields removes disabled fields from the PriorityClass object. +func DropDisabledFields(class, oldClass *scheduling.PriorityClass) { + if !utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && !preemptingPriorityInUse(oldClass) { + class.PreemptionPolicy = nil + } +} + +func preemptingPriorityInUse(oldClass *scheduling.PriorityClass) bool { + if oldClass == nil { + return false + } + if oldClass.PreemptionPolicy != nil { + return true + } + return false +} diff --git a/pkg/apis/scheduling/util/util_test.go b/pkg/apis/scheduling/util/util_test.go new file mode 100644 index 0000000000..6c6bbabdbd --- /dev/null +++ b/pkg/apis/scheduling/util/util_test.go @@ -0,0 +1,109 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package util + +import ( + "fmt" + "reflect" + "testing" + + "k8s.io/apimachinery/pkg/util/diff" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" + "k8s.io/kubernetes/pkg/apis/core" + "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/features" +) + +func TestDropNonPreemptingPriority(t *testing.T) { + pcWithoutNonPreemptingPriority := func() *scheduling.PriorityClass { + return &scheduling.PriorityClass{} + } + pcWithNonPreemptingPriority := func() *scheduling.PriorityClass { + preemptionPolicy := core.PreemptNever + return &scheduling.PriorityClass{ + PreemptionPolicy: &preemptionPolicy, + } + } + + pcInfo := []struct { + description string + hasNonPreemptingPriority bool + pc func() *scheduling.PriorityClass + }{ + { + description: "PriorityClass Without NonPreemptingPriority", + hasNonPreemptingPriority: false, + pc: pcWithoutNonPreemptingPriority, + }, + { + description: "PriorityClass With NonPreemptingPriority", + hasNonPreemptingPriority: true, + pc: pcWithNonPreemptingPriority, + }, + { + description: "is nil", + hasNonPreemptingPriority: false, + pc: func() *scheduling.PriorityClass { return nil }, + }, + } + + for _, enabled := range []bool{true, false} { + for _, oldPriorityClassInfo := range pcInfo { + for _, newPriorityClassInfo := range pcInfo { + oldPriorityClassHasNonPreemptingPriority, oldPriorityClass := oldPriorityClassInfo.hasNonPreemptingPriority, oldPriorityClassInfo.pc() + newPriorityClassHasNonPreemptingPriority, newPriorityClass := newPriorityClassInfo.hasNonPreemptingPriority, newPriorityClassInfo.pc() + if newPriorityClass == nil { + continue + } + + t.Run(fmt.Sprintf("feature enabled=%v, old PriorityClass %v, new PriorityClass %v", enabled, oldPriorityClassInfo.description, newPriorityClassInfo.description), func(t *testing.T) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NonPreemptingPriority, enabled)() + + DropDisabledFields(newPriorityClass, oldPriorityClass) + + // old PriorityClass should never be changed + if !reflect.DeepEqual(oldPriorityClass, oldPriorityClassInfo.pc()) { + t.Errorf("old PriorityClass changed: %v", diff.ObjectReflectDiff(oldPriorityClass, oldPriorityClassInfo.pc())) + } + + switch { + case enabled || oldPriorityClassHasNonPreemptingPriority: + // new PriorityClass should not be changed if the feature is enabled, or if the old PriorityClass had NonPreemptingPriority + if !reflect.DeepEqual(newPriorityClass, newPriorityClassInfo.pc()) { + t.Errorf("new PriorityClass changed: %v", diff.ObjectReflectDiff(newPriorityClass, newPriorityClassInfo.pc())) + } + case newPriorityClassHasNonPreemptingPriority: + // new PriorityClass should be changed + if reflect.DeepEqual(newPriorityClass, newPriorityClassInfo.pc()) { + t.Errorf("new PriorityClass was not changed") + } + // new PriorityClass should not have NonPreemptingPriority + if !reflect.DeepEqual(newPriorityClass, pcWithoutNonPreemptingPriority()) { + t.Errorf("new PriorityClass had PriorityClassNonPreemptingPriority: %v", diff.ObjectReflectDiff(newPriorityClass, pcWithoutNonPreemptingPriority())) + } + default: + // new PriorityClass should not need to be changed + if !reflect.DeepEqual(newPriorityClass, newPriorityClassInfo.pc()) { + t.Errorf("new PriorityClass changed: %v", diff.ObjectReflectDiff(newPriorityClass, newPriorityClassInfo.pc())) + } + } + }) + } + } + } +} diff --git a/pkg/apis/scheduling/v1/BUILD b/pkg/apis/scheduling/v1/BUILD index 414caf3a3b..9a88744d07 100644 --- a/pkg/apis/scheduling/v1/BUILD +++ b/pkg/apis/scheduling/v1/BUILD @@ -12,11 +12,15 @@ go_library( importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1", visibility = ["//visibility:public"], deps = [ + "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -41,8 +45,11 @@ go_test( deps = [ "//pkg/api/legacyscheme:go_default_library", "//pkg/api/testapi:go_default_library", - "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", ], ) diff --git a/pkg/apis/scheduling/v1/defaults.go b/pkg/apis/scheduling/v1/defaults.go index 25e9ab6321..5da20cd3cd 100644 --- a/pkg/apis/scheduling/v1/defaults.go +++ b/pkg/apis/scheduling/v1/defaults.go @@ -17,9 +17,11 @@ limitations under the License. package v1 import ( + apiv1 "k8s.io/api/core/v1" "k8s.io/api/scheduling/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/kubernetes/pkg/apis/scheduling" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" ) func addDefaultingFuncs(scheme *runtime.Scheme) error { @@ -29,9 +31,8 @@ func addDefaultingFuncs(scheme *runtime.Scheme) error { // SetDefaults_PriorityClass sets additional defaults compared to its counterpart // in extensions. func SetDefaults_PriorityClass(obj *v1.PriorityClass) { - if obj.Preempting == nil { - // Set Preempting as true by default. - Preempting := scheduling.DefaultPreempting - obj.Preempting = &Preempting + if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && obj.PreemptionPolicy == nil { + preemptLowerPriority := apiv1.PreemptLowerPriority + obj.PreemptionPolicy = &preemptLowerPriority } } diff --git a/pkg/apis/scheduling/v1/defaults_test.go b/pkg/apis/scheduling/v1/defaults_test.go index 9e741fa979..129d069be5 100644 --- a/pkg/apis/scheduling/v1/defaults_test.go +++ b/pkg/apis/scheduling/v1/defaults_test.go @@ -1,5 +1,5 @@ /* -Copyright 2015 The Kubernetes Authors. +Copyright 2019 The Kubernetes Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -24,9 +24,12 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/kubernetes/pkg/api/legacyscheme" + apiv1 "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" // enforce that all types are installed _ "k8s.io/kubernetes/pkg/api/testapi" - "k8s.io/kubernetes/pkg/apis/scheduling" + "k8s.io/kubernetes/pkg/features" ) func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { @@ -50,10 +53,14 @@ func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { return obj3 } -func TestSetDefaultPreempting(t *testing.T) { +func TestSetDefaultPreemptionPolicy(t *testing.T) { priorityClass := &v1.PriorityClass{} + + // set NonPreemptingPriority true + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NonPreemptingPriority, true)() + output := roundTrip(t, runtime.Object(priorityClass)).(*v1.PriorityClass) - if output.Preempting == nil || *output.Preempting != scheduling.DefaultPreempting { - t.Errorf("Expected enableServiceLinks value: %+v\ngot: %+v\n", scheduling.DefaultPreempting, *output.Preempting) + if output.PreemptionPolicy == nil || *output.PreemptionPolicy != apiv1.PreemptLowerPriority { + t.Errorf("Expected PriorityClass.PreemptionPolicy value: %+v\ngot: %+v\n", apiv1.PreemptLowerPriority, output.PreemptionPolicy) } } diff --git a/pkg/apis/scheduling/v1/zz_generated.conversion.go b/pkg/apis/scheduling/v1/zz_generated.conversion.go index a5309492d0..495c3a3458 100644 --- a/pkg/apis/scheduling/v1/zz_generated.conversion.go +++ b/pkg/apis/scheduling/v1/zz_generated.conversion.go @@ -23,9 +23,11 @@ package v1 import ( unsafe "unsafe" + corev1 "k8s.io/api/core/v1" v1 "k8s.io/api/scheduling/v1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" scheduling "k8s.io/kubernetes/pkg/apis/scheduling" ) @@ -64,7 +66,7 @@ func autoConvert_v1_PriorityClass_To_scheduling_PriorityClass(in *v1.PriorityCla out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description - out.Preempting = (*bool)(unsafe.Pointer(in.Preempting)) + out.PreemptionPolicy = (*core.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } @@ -78,7 +80,7 @@ func autoConvert_scheduling_PriorityClass_To_v1_PriorityClass(in *scheduling.Pri out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description - out.Preempting = (*bool)(unsafe.Pointer(in.Preempting)) + out.PreemptionPolicy = (*corev1.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } diff --git a/pkg/apis/scheduling/v1alpha1/BUILD b/pkg/apis/scheduling/v1alpha1/BUILD index a649eb7d48..fb59ce663d 100644 --- a/pkg/apis/scheduling/v1alpha1/BUILD +++ b/pkg/apis/scheduling/v1alpha1/BUILD @@ -1,14 +1,11 @@ package(default_visibility = ["//visibility:public"]) -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ - "conversion.go", + "defaults.go", "doc.go", "register.go", "zz_generated.conversion.go", @@ -16,11 +13,15 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1alpha1", deps = [ + "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -36,3 +37,19 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["defaults_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/api/legacyscheme:go_default_library", + "//pkg/api/testapi:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1alpha1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + ], +) diff --git a/pkg/apis/scheduling/v1alpha1/conversion.go b/pkg/apis/scheduling/v1alpha1/conversion.go deleted file mode 100644 index e04ca60985..0000000000 --- a/pkg/apis/scheduling/v1alpha1/conversion.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1alpha1 - -import ( - "k8s.io/api/scheduling/v1alpha1" - "k8s.io/apimachinery/pkg/conversion" - "k8s.io/kubernetes/pkg/apis/scheduling" - "strconv" -) - -func Convert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(in *scheduling.PriorityClass, out *v1alpha1.PriorityClass, s conversion.Scope) error { - if err := autoConvert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(in, out, s); err != nil { - return err - } - out.ObjectMeta.Annotations = deepCopyStringMap(out.Annotations) - - if in.Preempting != nil { - if out.ObjectMeta.Annotations == nil { - out.ObjectMeta.Annotations = make(map[string]string) - } - out.ObjectMeta.Annotations[scheduling.PreemptingAnnotation] = strconv.FormatBool(*(in.Preempting)) - } - return nil -} - -func Convert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(in *v1alpha1.PriorityClass, out *scheduling.PriorityClass, s conversion.Scope) error { - if err := autoConvert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(in, out, s); err != nil { - return err - } - out.ObjectMeta.Annotations = deepCopyStringMap(out.Annotations) - - if in.ObjectMeta.Annotations != nil { - if _, ok := in.ObjectMeta.Annotations[scheduling.PreemptingAnnotation]; ok { - preempting, err := strconv.ParseBool(in.ObjectMeta.Annotations[scheduling.PreemptingAnnotation]) - if err != nil { - return err - } - out.Preempting = &preempting - delete(out.ObjectMeta.Annotations, scheduling.PreemptingAnnotation) - } - } else { - preempting := scheduling.DefaultPreempting - out.Preempting = &preempting - } - - return nil -} - -func deepCopyStringMap(m map[string]string) map[string]string { - ret := make(map[string]string, len(m)) - for k, v := range m { - ret[k] = v - } - return ret -} diff --git a/pkg/apis/scheduling/v1alpha1/defaults.go b/pkg/apis/scheduling/v1alpha1/defaults.go new file mode 100644 index 0000000000..41327f5fdc --- /dev/null +++ b/pkg/apis/scheduling/v1alpha1/defaults.go @@ -0,0 +1,38 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1 + +import ( + apiv1 "k8s.io/api/core/v1" + "k8s.io/api/scheduling/v1alpha1" + "k8s.io/apimachinery/pkg/runtime" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + return RegisterDefaults(scheme) +} + +// SetDefaults_PriorityClass sets additional defaults compared to its counterpart +// in extensions. +func SetDefaults_PriorityClass(obj *v1alpha1.PriorityClass) { + if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && obj.PreemptionPolicy == nil { + preemptLowerPriority := apiv1.PreemptLowerPriority + obj.PreemptionPolicy = &preemptLowerPriority + } +} diff --git a/pkg/apis/scheduling/v1alpha1/defaults_test.go b/pkg/apis/scheduling/v1alpha1/defaults_test.go new file mode 100644 index 0000000000..574b464542 --- /dev/null +++ b/pkg/apis/scheduling/v1alpha1/defaults_test.go @@ -0,0 +1,66 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1alpha1_test + +import ( + "reflect" + "testing" + + "k8s.io/api/scheduling/v1alpha1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api/legacyscheme" + + apiv1 "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" + // enforce that all types are installed + _ "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/kubernetes/pkg/features" +) + +func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { + codec := legacyscheme.Codecs.LegacyCodec(v1alpha1.SchemeGroupVersion) + data, err := runtime.Encode(codec, obj) + if err != nil { + t.Errorf("%v\n %#v", err, obj) + return nil + } + obj2, err := runtime.Decode(codec, data) + if err != nil { + t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) + return nil + } + obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) + err = legacyscheme.Scheme.Convert(obj2, obj3, nil) + if err != nil { + t.Errorf("%v\nSource: %#v", err, obj2) + return nil + } + return obj3 +} + +func TestSetDefaultPreempting(t *testing.T) { + priorityClass := &v1alpha1.PriorityClass{} + + // set NonPreemptingPriority true + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NonPreemptingPriority, true)() + + output := roundTrip(t, runtime.Object(priorityClass)).(*v1alpha1.PriorityClass) + if output.PreemptionPolicy == nil || *output.PreemptionPolicy != apiv1.PreemptLowerPriority { + t.Errorf("Expected PriorityClass.Preempting value: %+v\ngot: %+v\n", apiv1.PreemptLowerPriority, output.PreemptionPolicy) + } +} diff --git a/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go b/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go index 27800b10df..dfcb61abcb 100644 --- a/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go +++ b/pkg/apis/scheduling/v1alpha1/zz_generated.conversion.go @@ -21,9 +21,13 @@ limitations under the License. package v1alpha1 import ( + unsafe "unsafe" + + v1 "k8s.io/api/core/v1" v1alpha1 "k8s.io/api/scheduling/v1alpha1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" scheduling "k8s.io/kubernetes/pkg/apis/scheduling" ) @@ -54,16 +58,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*scheduling.PriorityClass)(nil), (*v1alpha1.PriorityClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(a.(*scheduling.PriorityClass), b.(*v1alpha1.PriorityClass), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1alpha1.PriorityClass)(nil), (*scheduling.PriorityClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(a.(*v1alpha1.PriorityClass), b.(*scheduling.PriorityClass), scope) - }); err != nil { - return err - } return nil } @@ -72,31 +66,32 @@ func autoConvert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(in *v1alpha1 out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description + out.PreemptionPolicy = (*core.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } +// Convert_v1alpha1_PriorityClass_To_scheduling_PriorityClass is an autogenerated conversion function. +func Convert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(in *v1alpha1.PriorityClass, out *scheduling.PriorityClass, s conversion.Scope) error { + return autoConvert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(in, out, s) +} + func autoConvert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(in *scheduling.PriorityClass, out *v1alpha1.PriorityClass, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description - // WARNING: in.Preempting requires manual conversion: does not exist in peer-type + out.PreemptionPolicy = (*v1.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } +// Convert_scheduling_PriorityClass_To_v1alpha1_PriorityClass is an autogenerated conversion function. +func Convert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(in *scheduling.PriorityClass, out *v1alpha1.PriorityClass, s conversion.Scope) error { + return autoConvert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(in, out, s) +} + func autoConvert_v1alpha1_PriorityClassList_To_scheduling_PriorityClassList(in *v1alpha1.PriorityClassList, out *scheduling.PriorityClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]scheduling.PriorityClass, len(*in)) - for i := range *in { - if err := Convert_v1alpha1_PriorityClass_To_scheduling_PriorityClass(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]scheduling.PriorityClass)(unsafe.Pointer(&in.Items)) return nil } @@ -107,17 +102,7 @@ func Convert_v1alpha1_PriorityClassList_To_scheduling_PriorityClassList(in *v1al func autoConvert_scheduling_PriorityClassList_To_v1alpha1_PriorityClassList(in *scheduling.PriorityClassList, out *v1alpha1.PriorityClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1alpha1.PriorityClass, len(*in)) - for i := range *in { - if err := Convert_scheduling_PriorityClass_To_v1alpha1_PriorityClass(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]v1alpha1.PriorityClass)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/scheduling/v1alpha1/zz_generated.defaults.go b/pkg/apis/scheduling/v1alpha1/zz_generated.defaults.go index dd621a3acd..84c4876661 100644 --- a/pkg/apis/scheduling/v1alpha1/zz_generated.defaults.go +++ b/pkg/apis/scheduling/v1alpha1/zz_generated.defaults.go @@ -21,6 +21,7 @@ limitations under the License. package v1alpha1 import ( + v1alpha1 "k8s.io/api/scheduling/v1alpha1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -28,5 +29,18 @@ import ( // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1alpha1.PriorityClass{}, func(obj interface{}) { SetObjectDefaults_PriorityClass(obj.(*v1alpha1.PriorityClass)) }) + scheme.AddTypeDefaultingFunc(&v1alpha1.PriorityClassList{}, func(obj interface{}) { SetObjectDefaults_PriorityClassList(obj.(*v1alpha1.PriorityClassList)) }) return nil } + +func SetObjectDefaults_PriorityClass(in *v1alpha1.PriorityClass) { + SetDefaults_PriorityClass(in) +} + +func SetObjectDefaults_PriorityClassList(in *v1alpha1.PriorityClassList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_PriorityClass(a) + } +} diff --git a/pkg/apis/scheduling/v1beta1/BUILD b/pkg/apis/scheduling/v1beta1/BUILD index 3842442de9..ac56ec19ad 100644 --- a/pkg/apis/scheduling/v1beta1/BUILD +++ b/pkg/apis/scheduling/v1beta1/BUILD @@ -1,14 +1,11 @@ package(default_visibility = ["//visibility:public"]) -load( - "@io_bazel_rules_go//go:def.bzl", - "go_library", -) +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ - "conversion.go", + "defaults.go", "doc.go", "register.go", "zz_generated.conversion.go", @@ -16,11 +13,15 @@ go_library( ], importpath = "k8s.io/kubernetes/pkg/apis/scheduling/v1beta1", deps = [ + "//pkg/apis/core:go_default_library", "//pkg/apis/scheduling:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/conversion:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", ], ) @@ -36,3 +37,19 @@ filegroup( srcs = [":package-srcs"], tags = ["automanaged"], ) + +go_test( + name = "go_default_test", + srcs = ["defaults_test.go"], + embed = [":go_default_library"], + deps = [ + "//pkg/api/legacyscheme:go_default_library", + "//pkg/api/testapi:go_default_library", + "//pkg/features:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", + "//staging/src/k8s.io/api/scheduling/v1beta1:go_default_library", + "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", + "//staging/src/k8s.io/component-base/featuregate/testing:go_default_library", + ], +) diff --git a/pkg/apis/scheduling/v1beta1/conversion.go b/pkg/apis/scheduling/v1beta1/conversion.go deleted file mode 100644 index fc82b66072..0000000000 --- a/pkg/apis/scheduling/v1beta1/conversion.go +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2019 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package v1beta1 - -import ( - "k8s.io/api/scheduling/v1beta1" - "k8s.io/apimachinery/pkg/conversion" - "k8s.io/kubernetes/pkg/apis/scheduling" - "strconv" -) - -func Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass(in *scheduling.PriorityClass, out *v1beta1.PriorityClass, s conversion.Scope) error { - if err := autoConvert_scheduling_PriorityClass_To_v1beta1_PriorityClass(in, out, s); err != nil { - return err - } - out.ObjectMeta.Annotations = deepCopyStringMap(out.Annotations) - if in.Preempting != nil { - if out.ObjectMeta.Annotations == nil { - out.ObjectMeta.Annotations = make(map[string]string) - } - out.ObjectMeta.Annotations[scheduling.PreemptingAnnotation] = strconv.FormatBool(*(in.Preempting)) - } - return nil -} - -func Convert_v1beta1_PriorityClass_To_scheduling_PriorityClass(in *v1beta1.PriorityClass, out *scheduling.PriorityClass, s conversion.Scope) error { - if err := autoConvert_v1beta1_PriorityClass_To_scheduling_PriorityClass(in, out, s); err != nil { - return err - } - out.ObjectMeta.Annotations = deepCopyStringMap(out.Annotations) - if out.ObjectMeta.Annotations != nil { - if _, ok := out.ObjectMeta.Annotations[scheduling.PreemptingAnnotation]; ok { - preempting, err := strconv.ParseBool(out.ObjectMeta.Annotations[scheduling.PreemptingAnnotation]) - if err != nil { - return err - } - out.Preempting = &preempting - delete(out.ObjectMeta.Annotations, scheduling.PreemptingAnnotation) - } - } else { - preempting := scheduling.DefaultPreempting - out.Preempting = &preempting - } - return nil -} - -func deepCopyStringMap(m map[string]string) map[string]string { - ret := make(map[string]string, len(m)) - for k, v := range m { - ret[k] = v - } - return ret -} diff --git a/pkg/apis/scheduling/v1beta1/defaults.go b/pkg/apis/scheduling/v1beta1/defaults.go new file mode 100644 index 0000000000..c35594e4c1 --- /dev/null +++ b/pkg/apis/scheduling/v1beta1/defaults.go @@ -0,0 +1,38 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1 + +import ( + apiv1 "k8s.io/api/core/v1" + "k8s.io/api/scheduling/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + utilfeature "k8s.io/apiserver/pkg/util/feature" + "k8s.io/kubernetes/pkg/features" +) + +func addDefaultingFuncs(scheme *runtime.Scheme) error { + return RegisterDefaults(scheme) +} + +// SetDefaults_PriorityClass sets additional defaults compared to its counterpart +// in extensions. +func SetDefaults_PriorityClass(obj *v1beta1.PriorityClass) { + if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) && obj.PreemptionPolicy == nil { + preemptLowerPriority := apiv1.PreemptLowerPriority + obj.PreemptionPolicy = &preemptLowerPriority + } +} diff --git a/pkg/apis/scheduling/v1beta1/defaults_test.go b/pkg/apis/scheduling/v1beta1/defaults_test.go new file mode 100644 index 0000000000..f758a717eb --- /dev/null +++ b/pkg/apis/scheduling/v1beta1/defaults_test.go @@ -0,0 +1,66 @@ +/* +Copyright 2019 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package v1beta1_test + +import ( + "reflect" + "testing" + + "k8s.io/api/scheduling/v1beta1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api/legacyscheme" + + apiv1 "k8s.io/api/core/v1" + utilfeature "k8s.io/apiserver/pkg/util/feature" + featuregatetesting "k8s.io/component-base/featuregate/testing" + // enforce that all types are installed + _ "k8s.io/kubernetes/pkg/api/testapi" + "k8s.io/kubernetes/pkg/features" +) + +func roundTrip(t *testing.T, obj runtime.Object) runtime.Object { + codec := legacyscheme.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion) + data, err := runtime.Encode(codec, obj) + if err != nil { + t.Errorf("%v\n %#v", err, obj) + return nil + } + obj2, err := runtime.Decode(codec, data) + if err != nil { + t.Errorf("%v\nData: %s\nSource: %#v", err, string(data), obj) + return nil + } + obj3 := reflect.New(reflect.TypeOf(obj).Elem()).Interface().(runtime.Object) + err = legacyscheme.Scheme.Convert(obj2, obj3, nil) + if err != nil { + t.Errorf("%v\nSource: %#v", err, obj2) + return nil + } + return obj3 +} + +func TestSetDefaultPreempting(t *testing.T) { + priorityClass := &v1beta1.PriorityClass{} + + // set NonPreemptingPriority true + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NonPreemptingPriority, true)() + + output := roundTrip(t, runtime.Object(priorityClass)).(*v1beta1.PriorityClass) + if output.PreemptionPolicy == nil || *output.PreemptionPolicy != apiv1.PreemptLowerPriority { + t.Errorf("Expected PriorityClass.Preempting value: %+v\ngot: %+v\n", apiv1.PreemptLowerPriority, output.PreemptionPolicy) + } +} diff --git a/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go b/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go index f199fbad4e..d06661e826 100644 --- a/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go +++ b/pkg/apis/scheduling/v1beta1/zz_generated.conversion.go @@ -21,9 +21,13 @@ limitations under the License. package v1beta1 import ( + unsafe "unsafe" + + v1 "k8s.io/api/core/v1" v1beta1 "k8s.io/api/scheduling/v1beta1" conversion "k8s.io/apimachinery/pkg/conversion" runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" scheduling "k8s.io/kubernetes/pkg/apis/scheduling" ) @@ -54,16 +58,6 @@ func RegisterConversions(s *runtime.Scheme) error { }); err != nil { return err } - if err := s.AddConversionFunc((*scheduling.PriorityClass)(nil), (*v1beta1.PriorityClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass(a.(*scheduling.PriorityClass), b.(*v1beta1.PriorityClass), scope) - }); err != nil { - return err - } - if err := s.AddConversionFunc((*v1beta1.PriorityClass)(nil), (*scheduling.PriorityClass)(nil), func(a, b interface{}, scope conversion.Scope) error { - return Convert_v1beta1_PriorityClass_To_scheduling_PriorityClass(a.(*v1beta1.PriorityClass), b.(*scheduling.PriorityClass), scope) - }); err != nil { - return err - } return nil } @@ -72,31 +66,32 @@ func autoConvert_v1beta1_PriorityClass_To_scheduling_PriorityClass(in *v1beta1.P out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description + out.PreemptionPolicy = (*core.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } +// Convert_v1beta1_PriorityClass_To_scheduling_PriorityClass is an autogenerated conversion function. +func Convert_v1beta1_PriorityClass_To_scheduling_PriorityClass(in *v1beta1.PriorityClass, out *scheduling.PriorityClass, s conversion.Scope) error { + return autoConvert_v1beta1_PriorityClass_To_scheduling_PriorityClass(in, out, s) +} + func autoConvert_scheduling_PriorityClass_To_v1beta1_PriorityClass(in *scheduling.PriorityClass, out *v1beta1.PriorityClass, s conversion.Scope) error { out.ObjectMeta = in.ObjectMeta out.Value = in.Value out.GlobalDefault = in.GlobalDefault out.Description = in.Description - // WARNING: in.Preempting requires manual conversion: does not exist in peer-type + out.PreemptionPolicy = (*v1.PreemptionPolicy)(unsafe.Pointer(in.PreemptionPolicy)) return nil } +// Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass is an autogenerated conversion function. +func Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass(in *scheduling.PriorityClass, out *v1beta1.PriorityClass, s conversion.Scope) error { + return autoConvert_scheduling_PriorityClass_To_v1beta1_PriorityClass(in, out, s) +} + func autoConvert_v1beta1_PriorityClassList_To_scheduling_PriorityClassList(in *v1beta1.PriorityClassList, out *scheduling.PriorityClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]scheduling.PriorityClass, len(*in)) - for i := range *in { - if err := Convert_v1beta1_PriorityClass_To_scheduling_PriorityClass(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]scheduling.PriorityClass)(unsafe.Pointer(&in.Items)) return nil } @@ -107,17 +102,7 @@ func Convert_v1beta1_PriorityClassList_To_scheduling_PriorityClassList(in *v1bet func autoConvert_scheduling_PriorityClassList_To_v1beta1_PriorityClassList(in *scheduling.PriorityClassList, out *v1beta1.PriorityClassList, s conversion.Scope) error { out.ListMeta = in.ListMeta - if in.Items != nil { - in, out := &in.Items, &out.Items - *out = make([]v1beta1.PriorityClass, len(*in)) - for i := range *in { - if err := Convert_scheduling_PriorityClass_To_v1beta1_PriorityClass(&(*in)[i], &(*out)[i], s); err != nil { - return err - } - } - } else { - out.Items = nil - } + out.Items = *(*[]v1beta1.PriorityClass)(unsafe.Pointer(&in.Items)) return nil } diff --git a/pkg/apis/scheduling/v1beta1/zz_generated.defaults.go b/pkg/apis/scheduling/v1beta1/zz_generated.defaults.go index 73e63fc114..a134b3b598 100644 --- a/pkg/apis/scheduling/v1beta1/zz_generated.defaults.go +++ b/pkg/apis/scheduling/v1beta1/zz_generated.defaults.go @@ -21,6 +21,7 @@ limitations under the License. package v1beta1 import ( + v1beta1 "k8s.io/api/scheduling/v1beta1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -28,5 +29,18 @@ import ( // Public to allow building arbitrary schemes. // All generated defaulters are covering - they call all nested defaulters. func RegisterDefaults(scheme *runtime.Scheme) error { + scheme.AddTypeDefaultingFunc(&v1beta1.PriorityClass{}, func(obj interface{}) { SetObjectDefaults_PriorityClass(obj.(*v1beta1.PriorityClass)) }) + scheme.AddTypeDefaultingFunc(&v1beta1.PriorityClassList{}, func(obj interface{}) { SetObjectDefaults_PriorityClassList(obj.(*v1beta1.PriorityClassList)) }) return nil } + +func SetObjectDefaults_PriorityClass(in *v1beta1.PriorityClass) { + SetDefaults_PriorityClass(in) +} + +func SetObjectDefaults_PriorityClassList(in *v1beta1.PriorityClassList) { + for i := range in.Items { + a := &in.Items[i] + SetObjectDefaults_PriorityClass(a) + } +} diff --git a/pkg/apis/scheduling/validation/validation.go b/pkg/apis/scheduling/validation/validation.go index 5b2fcaeb99..80aee8233b 100644 --- a/pkg/apis/scheduling/validation/validation.go +++ b/pkg/apis/scheduling/validation/validation.go @@ -41,6 +41,9 @@ func ValidatePriorityClass(pc *scheduling.PriorityClass) field.ErrorList { // Non-system critical priority classes are not allowed to have a value larger than HighestUserDefinablePriority. allErrs = append(allErrs, field.Forbidden(field.NewPath("value"), fmt.Sprintf("maximum allowed value of a user defined priority is %v", scheduling.HighestUserDefinablePriority))) } + if pc.PreemptionPolicy != nil { + allErrs = append(allErrs, apivalidation.ValidatePreemptionPolicy(pc.PreemptionPolicy, field.NewPath("preemptionPolicy"))...) + } return allErrs } @@ -52,5 +55,7 @@ func ValidatePriorityClassUpdate(pc, oldPc *scheduling.PriorityClass) field.Erro if pc.Value != oldPc.Value { allErrs = append(allErrs, field.Forbidden(field.NewPath("Value"), "may not be changed in an update.")) } + // PreemptionPolicy is immutable and is checked by the ObjectMeta validator. + allErrs = append(allErrs, apivalidation.ValidateImmutableField(pc.PreemptionPolicy, oldPc.PreemptionPolicy, field.NewPath("preemptionPolicy"))...) return allErrs } diff --git a/pkg/apis/scheduling/zz_generated.deepcopy.go b/pkg/apis/scheduling/zz_generated.deepcopy.go index f547d034d5..43ff21471c 100644 --- a/pkg/apis/scheduling/zz_generated.deepcopy.go +++ b/pkg/apis/scheduling/zz_generated.deepcopy.go @@ -22,6 +22,7 @@ package scheduling import ( runtime "k8s.io/apimachinery/pkg/runtime" + core "k8s.io/kubernetes/pkg/apis/core" ) // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. @@ -29,9 +30,9 @@ func (in *PriorityClass) DeepCopyInto(out *PriorityClass) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.Preempting != nil { - in, out := &in.Preempting, &out.Preempting - *out = new(bool) + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(core.PreemptionPolicy) **out = **in } return diff --git a/pkg/controller/.import-restrictions b/pkg/controller/.import-restrictions index 2d225e4409..a47e51a2b1 100644 --- a/pkg/controller/.import-restrictions +++ b/pkg/controller/.import-restrictions @@ -84,7 +84,7 @@ "k8s.io/api/networking/v1", "k8s.io/component-base/config", "k8s.io/component-base/config/v1alpha1", - "k8s.io/api/scheduling/v1beta1" + "k8s.io/api/scheduling/v1" ] }, { diff --git a/pkg/controller/deployment/util/deployment_util_test.go b/pkg/controller/deployment/util/deployment_util_test.go index 1e75de9348..38fed0e4fb 100644 --- a/pkg/controller/deployment/util/deployment_util_test.go +++ b/pkg/controller/deployment/util/deployment_util_test.go @@ -152,7 +152,6 @@ func generateDeployment(image string) apps.Deployment { podLabels := map[string]string{"name": image} terminationSec := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting return apps.Deployment{ ObjectMeta: metav1.ObjectMeta{ Name: image, @@ -179,7 +178,6 @@ func generateDeployment(image string) apps.Deployment { RestartPolicy: v1.RestartPolicyAlways, SecurityContext: &v1.PodSecurityContext{}, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, }, }, diff --git a/pkg/features/kube_features.go b/pkg/features/kube_features.go index c70e965c15..20fc26e2cb 100644 --- a/pkg/features/kube_features.go +++ b/pkg/features/kube_features.go @@ -459,6 +459,12 @@ const ( // Allow use of filesystems for ephemeral storage monitoring. // Only applies if LocalStorageCapacityIsolation is set. LocalStorageCapacityIsolationFSQuotaMonitoring featuregate.Feature = "LocalStorageCapacityIsolationFSQuotaMonitoring" + + // owner: @denkensk + // alpha: v1.15 + // + // Enables NonPreempting option for priorityClass and pod. + NonPreemptingPriority featuregate.Feature = "NonPreemptingPriority" ) func init() { @@ -536,6 +542,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS KubeletPodResources: {Default: false, PreRelease: featuregate.Alpha}, WindowsGMSA: {Default: false, PreRelease: featuregate.Alpha}, LocalStorageCapacityIsolationFSQuotaMonitoring: {Default: false, PreRelease: featuregate.Alpha}, + NonPreemptingPriority: {Default: false, PreRelease: featuregate.Alpha}, // inherited features from generic apiserver, relisted here to get a conflict if it is changed // unintentionally on either side: diff --git a/pkg/kubectl/cmd/create/create_priorityclass.go b/pkg/kubectl/cmd/create/create_priorityclass.go index 7bc25777f6..7ea86b3352 100644 --- a/pkg/kubectl/cmd/create/create_priorityclass.go +++ b/pkg/kubectl/cmd/create/create_priorityclass.go @@ -19,6 +19,7 @@ package create import ( "github.com/spf13/cobra" + apiv1 "k8s.io/api/core/v1" "k8s.io/cli-runtime/pkg/genericclioptions" cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util" "k8s.io/kubernetes/pkg/kubectl/generate" @@ -29,14 +30,17 @@ import ( var ( pcLong = templates.LongDesc(i18n.T(` - Create a priorityclass with the specified name, value, globalDefault,preempting and description`)) + Create a priorityclass with the specified name, value, globalDefault and description`)) pcExample = templates.Examples(i18n.T(` # Create a priorityclass named high-priority kubectl create priorityclass high-priority --value=1000 --description="high priority" # Create a priorityclass named default-priority that considered as the global default priority - kubectl create priorityclass default-priority --value=1000 --global-default=true --description="default priority"`)) + kubectl create priorityclass default-priority --value=1000 --global-default=true --description="default priority" + + # Create a priorityclass named high-priority that can not preempt pods with lower priority + kubectl create priorityclass high-priority --value=1000 --description="high priority" --preemption-policy="Never"`)) ) // PriorityClassOpts holds the options for 'create priorityclass' sub command @@ -72,8 +76,7 @@ func NewCmdCreatePriorityClass(f cmdutil.Factory, ioStreams genericclioptions.IO cmd.Flags().Int32("value", 0, i18n.T("the value of this priority class.")) cmd.Flags().Bool("global-default", false, i18n.T("global-default specifies whether this PriorityClass should be considered as the default priority.")) cmd.Flags().String("description", "", i18n.T("description is an arbitrary string that usually provides guidelines on when this priority class should be used.")) - cmd.Flags().Bool("preempting", false, i18n.T("preempting specifies whether a pod with this PriorityClass could trigger a preemption process.")) - + cmd.Flags().String("preemption-policy", "", i18n.T("preemption-policy is the policy for preempting pods with lower priority.")) return cmd } @@ -88,11 +91,11 @@ func (o *PriorityClassOpts) Complete(f cmdutil.Factory, cmd *cobra.Command, args switch generatorName := cmdutil.GetFlagString(cmd, "generator"); generatorName { case generateversioned.PriorityClassV1GeneratorName: generator = &generateversioned.PriorityClassV1Generator{ - Name: name, - Value: cmdutil.GetFlagInt32(cmd, "value"), - GlobalDefault: cmdutil.GetFlagBool(cmd, "global-default"), - Description: cmdutil.GetFlagString(cmd, "description"), - Preempting: cmdutil.GetFlagBool(cmd, "preempting"), + Name: name, + Value: cmdutil.GetFlagInt32(cmd, "value"), + GlobalDefault: cmdutil.GetFlagBool(cmd, "global-default"), + Description: cmdutil.GetFlagString(cmd, "description"), + PreemptionPolicy: apiv1.PreemptionPolicy(cmdutil.GetFlagString(cmd, "preemption-policy")), } default: return errUnsupportedGenerator(cmd, generatorName) diff --git a/pkg/kubectl/cmd/create/create_priorityclass_test.go b/pkg/kubectl/cmd/create/create_priorityclass_test.go index ea0474f031..3fdf719756 100644 --- a/pkg/kubectl/cmd/create/create_priorityclass_test.go +++ b/pkg/kubectl/cmd/create/create_priorityclass_test.go @@ -56,9 +56,9 @@ func TestCreatePriorityClass(t *testing.T) { cmd.Flags().Set("value", "1000") cmd.Flags().Set("global-default", "true") cmd.Flags().Set("description", "my priority") - cmd.Flags().Set("preempting", "true") cmd.Flags().Set("dry-run", "true") cmd.Flags().Set("output", outputFormat) + cmd.Flags().Set("preemption-policy", "Never") printFlags := genericclioptions.NewPrintFlags("created").WithTypeSetter(scheme.Scheme) printFlags.OutputFormat = &outputFormat diff --git a/pkg/kubectl/generate/versioned/priorityclass.go b/pkg/kubectl/generate/versioned/priorityclass.go index 353269ab68..a141d21966 100644 --- a/pkg/kubectl/generate/versioned/priorityclass.go +++ b/pkg/kubectl/generate/versioned/priorityclass.go @@ -19,6 +19,7 @@ package versioned import ( "fmt" + apiv1 "k8s.io/api/core/v1" scheduling "k8s.io/api/scheduling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -27,11 +28,11 @@ import ( // PriorityClassV1Generator supports stable generation of a priorityClass. type PriorityClassV1Generator struct { - Name string - Value int32 - GlobalDefault bool - Description string - Preempting bool + Name string + Value int32 + GlobalDefault bool + Description string + PreemptionPolicy apiv1.PreemptionPolicy } // Ensure it supports the generator pattern that uses parameters specified during construction. @@ -43,9 +44,10 @@ func (PriorityClassV1Generator) ParamNames() []generate.GeneratorParam { {Name: "value", Required: true}, {Name: "global-default", Required: false}, {Name: "description", Required: false}, - {Name: "preempting", Required: false}, + {Name: "preemption-policy", Required: false}, } } + func (s PriorityClassV1Generator) Generate(params map[string]interface{}) (runtime.Object, error) { if err := generate.ValidateParams(s.ParamNames(), params); err != nil { return nil, err @@ -71,12 +73,9 @@ func (s PriorityClassV1Generator) Generate(params map[string]interface{}) (runti return nil, fmt.Errorf("expected string, found %v", description) } - Preempting, found := params["preempting"].(bool) - if !found { - return nil, fmt.Errorf("expected bool, found %v", Preempting) - } + preemptionPolicy := apiv1.PreemptionPolicy(params["preemption-policy"].(string)) - delegate := &PriorityClassV1Generator{Name: name, Value: value, GlobalDefault: globalDefault, Description: description, Preempting: Preempting} + delegate := &PriorityClassV1Generator{Name: name, Value: value, GlobalDefault: globalDefault, Description: description, PreemptionPolicy: preemptionPolicy} return delegate.StructuredGenerate() } @@ -86,9 +85,9 @@ func (s *PriorityClassV1Generator) StructuredGenerate() (runtime.Object, error) ObjectMeta: metav1.ObjectMeta{ Name: s.Name, }, - Value: s.Value, - GlobalDefault: s.GlobalDefault, - Description: s.Description, - Preempting: &s.Preempting, + Value: s.Value, + GlobalDefault: s.GlobalDefault, + Description: s.Description, + PreemptionPolicy: &s.PreemptionPolicy, }, nil } diff --git a/pkg/kubectl/generate/versioned/priorityclass_test.go b/pkg/kubectl/generate/versioned/priorityclass_test.go index 49610caed1..968a53ad9a 100644 --- a/pkg/kubectl/generate/versioned/priorityclass_test.go +++ b/pkg/kubectl/generate/versioned/priorityclass_test.go @@ -17,6 +17,7 @@ limitations under the License. package versioned import ( + apiv1 "k8s.io/api/core/v1" scheduling "k8s.io/api/scheduling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -25,8 +26,10 @@ import ( ) func TestPriorityClassV1Generator(t *testing.T) { - true := true - false := false + var ( + preemptLowerPriority = apiv1.PreemptLowerPriority + preemptNever = apiv1.PreemptNever + ) tests := []struct { name string params map[string]interface{} @@ -36,70 +39,70 @@ func TestPriorityClassV1Generator(t *testing.T) { { name: "test valid case", params: map[string]interface{}{ - "name": "foo", - "value": int32(1000), - "global-default": false, - "description": "high priority class", - "preempting": false, + "name": "foo", + "value": int32(1000), + "global-default": false, + "description": "high priority class", + "preemption-policy": "PreemptLowerPriority", }, expected: &scheduling.PriorityClass{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Value: int32(1000), - GlobalDefault: false, - Description: "high priority class", - Preempting: &false, + Value: int32(1000), + GlobalDefault: false, + Description: "high priority class", + PreemptionPolicy: &preemptLowerPriority, }, expectErr: false, }, { name: "test valid case that field non-preempting is set", params: map[string]interface{}{ - "name": "foo", - "value": int32(1000), - "global-default": false, - "description": "high priority class", - "preempting": true, + "name": "foo", + "value": int32(1000), + "global-default": false, + "description": "high priority class", + "preemption-policy": "Never", }, expected: &scheduling.PriorityClass{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Value: int32(1000), - GlobalDefault: false, - Description: "high priority class", - Preempting: &true, + Value: int32(1000), + GlobalDefault: false, + Description: "high priority class", + PreemptionPolicy: &preemptNever, }, expectErr: false, }, { name: "test valid case that as default priority", params: map[string]interface{}{ - "name": "foo", - "value": int32(1000), - "global-default": true, - "description": "high priority class", - "preempting": false, + "name": "foo", + "value": int32(1000), + "global-default": true, + "description": "high priority class", + "preemption-policy": "PreemptLowerPriority", }, expected: &scheduling.PriorityClass{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", }, - Value: int32(1000), - GlobalDefault: true, - Description: "high priority class", - Preempting: &false, + Value: int32(1000), + GlobalDefault: true, + Description: "high priority class", + PreemptionPolicy: &preemptLowerPriority, }, expectErr: false, }, { name: "test missing required param", params: map[string]interface{}{ - "name": "foo", - "global-default": true, - "description": "high priority class", - "preempting": false, + "name": "foo", + "global-default": true, + "description": "high priority class", + "preemption-policy": "PreemptLowerPriority", }, expectErr: true, }, diff --git a/pkg/kubectl/rolling_updater_test.go b/pkg/kubectl/rolling_updater_test.go index 4ce2c70876..ac37bef85c 100644 --- a/pkg/kubectl/rolling_updater_test.go +++ b/pkg/kubectl/rolling_updater_test.go @@ -1444,7 +1444,6 @@ func TestUpdateRcWithRetries(t *testing.T) { one := int32(1) grace := int64(30) enableServiceLinks := corev1.DefaultEnableServiceLinks - preempting := corev1.DefaultPreempting rc := &corev1.ReplicationController{ TypeMeta: metav1.TypeMeta{ APIVersion: "v1", @@ -1472,7 +1471,6 @@ func TestUpdateRcWithRetries(t *testing.T) { TerminationGracePeriodSeconds: &grace, SecurityContext: &corev1.PodSecurityContext{}, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, }, }, diff --git a/pkg/kubelet/config/common_test.go b/pkg/kubelet/config/common_test.go index 46a2e5b522..709fdcf331 100644 --- a/pkg/kubelet/config/common_test.go +++ b/pkg/kubelet/config/common_test.go @@ -38,7 +38,6 @@ func noDefault(*core.Pod) error { return nil } func TestDecodeSinglePod(t *testing.T) { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting pod := &v1.Pod{ TypeMeta: metav1.TypeMeta{ APIVersion: "", @@ -63,7 +62,6 @@ func TestDecodeSinglePod(t *testing.T) { SecurityContext: &v1.PodSecurityContext{}, SchedulerName: core.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, } json, err := runtime.Encode(testapi.Default.Codec(), pod) @@ -104,7 +102,6 @@ func TestDecodeSinglePod(t *testing.T) { func TestDecodePodList(t *testing.T) { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting pod := &v1.Pod{ TypeMeta: metav1.TypeMeta{ APIVersion: "", @@ -130,7 +127,6 @@ func TestDecodePodList(t *testing.T) { SecurityContext: &v1.PodSecurityContext{}, SchedulerName: core.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, } podList := &v1.PodList{ diff --git a/pkg/kubelet/config/file_linux_test.go b/pkg/kubelet/config/file_linux_test.go index f023af59c6..d19452321d 100644 --- a/pkg/kubelet/config/file_linux_test.go +++ b/pkg/kubelet/config/file_linux_test.go @@ -140,7 +140,6 @@ type testCase struct { func getTestCases(hostname types.NodeName) []*testCase { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting return []*testCase{ { lock: &sync.Mutex{}, @@ -192,7 +191,6 @@ func getTestCases(hostname types.NodeName) []*testCase { SecurityContext: &v1.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, Status: v1.PodStatus{ Phase: v1.PodPending, diff --git a/pkg/kubelet/config/http_test.go b/pkg/kubelet/config/http_test.go index 460b96c43e..4cef337f7f 100644 --- a/pkg/kubelet/config/http_test.go +++ b/pkg/kubelet/config/http_test.go @@ -130,7 +130,6 @@ func TestExtractPodsFromHTTP(t *testing.T) { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting var testCases = []struct { desc string pods runtime.Object @@ -176,7 +175,6 @@ func TestExtractPodsFromHTTP(t *testing.T) { TerminationGracePeriodSeconds: &grace, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, Containers: []v1.Container{{ Name: "1", @@ -249,7 +247,6 @@ func TestExtractPodsFromHTTP(t *testing.T) { SecurityContext: &v1.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, Containers: []v1.Container{{ Name: "1", @@ -279,7 +276,6 @@ func TestExtractPodsFromHTTP(t *testing.T) { SecurityContext: &v1.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, Containers: []v1.Container{{ Name: "2", diff --git a/pkg/registry/core/pod/storage/storage_test.go b/pkg/registry/core/pod/storage/storage_test.go index 3f5349d3dc..f0f03aa33a 100644 --- a/pkg/registry/core/pod/storage/storage_test.go +++ b/pkg/registry/core/pod/storage/storage_test.go @@ -59,7 +59,6 @@ func newStorage(t *testing.T) (*REST, *BindingREST, *StatusREST, *etcdtesting.Et func validNewPod() *api.Pod { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting return &api.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", @@ -84,7 +83,6 @@ func validNewPod() *api.Pod { SecurityContext: &api.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, } } @@ -785,7 +783,6 @@ func TestEtcdUpdateScheduled(t *testing.T) { grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting podIn := api.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", @@ -810,7 +807,6 @@ func TestEtcdUpdateScheduled(t *testing.T) { SecurityContext: &api.PodSecurityContext{}, SchedulerName: api.DefaultSchedulerName, EnableServiceLinks: &enableServiceLinks, - Preempting: &preempting, }, } _, _, err = storage.Update(ctx, podIn.Name, rest.DefaultUpdatedObjectInfo(&podIn), rest.ValidateAllObjectFunc, rest.ValidateAllObjectUpdateFunc, false, &metav1.UpdateOptions{}) @@ -889,12 +885,10 @@ func TestEtcdUpdateStatus(t *testing.T) { expected.ResourceVersion = "2" grace := int64(30) enableServiceLinks := v1.DefaultEnableServiceLinks - preempting := v1.DefaultPreempting expected.Spec.TerminationGracePeriodSeconds = &grace expected.Spec.RestartPolicy = api.RestartPolicyAlways expected.Spec.DNSPolicy = api.DNSClusterFirst expected.Spec.EnableServiceLinks = &enableServiceLinks - expected.Spec.Preempting = &preempting expected.Spec.Containers[0].ImagePullPolicy = api.PullIfNotPresent expected.Spec.Containers[0].TerminationMessagePath = api.TerminationMessagePathDefault expected.Spec.Containers[0].TerminationMessagePolicy = api.TerminationMessageReadFile diff --git a/pkg/registry/scheduling/priorityclass/BUILD b/pkg/registry/scheduling/priorityclass/BUILD index 1140ceeab6..0616258142 100644 --- a/pkg/registry/scheduling/priorityclass/BUILD +++ b/pkg/registry/scheduling/priorityclass/BUILD @@ -27,6 +27,7 @@ go_library( deps = [ "//pkg/api/legacyscheme:go_default_library", "//pkg/apis/scheduling:go_default_library", + "//pkg/apis/scheduling/util:go_default_library", "//pkg/apis/scheduling/validation:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", diff --git a/pkg/registry/scheduling/priorityclass/strategy.go b/pkg/registry/scheduling/priorityclass/strategy.go index 3a763d6bf2..0a3a9cf67d 100644 --- a/pkg/registry/scheduling/priorityclass/strategy.go +++ b/pkg/registry/scheduling/priorityclass/strategy.go @@ -24,6 +24,7 @@ import ( "k8s.io/apiserver/pkg/storage/names" "k8s.io/kubernetes/pkg/api/legacyscheme" "k8s.io/kubernetes/pkg/apis/scheduling" + schedulingutil "k8s.io/kubernetes/pkg/apis/scheduling/util" "k8s.io/kubernetes/pkg/apis/scheduling/validation" ) @@ -45,12 +46,15 @@ func (priorityClassStrategy) NamespaceScoped() bool { func (priorityClassStrategy) PrepareForCreate(ctx context.Context, obj runtime.Object) { pc := obj.(*scheduling.PriorityClass) pc.Generation = 1 + schedulingutil.DropDisabledFields(pc, nil) } // PrepareForUpdate clears fields that are not allowed to be set by end users on update. func (priorityClassStrategy) PrepareForUpdate(ctx context.Context, obj, old runtime.Object) { - _ = obj.(*scheduling.PriorityClass) - _ = old.(*scheduling.PriorityClass) + newClass := obj.(*scheduling.PriorityClass) + oldClass := old.(*scheduling.PriorityClass) + + schedulingutil.DropDisabledFields(newClass, oldClass) } // Validate validates a new PriorityClass. diff --git a/pkg/scheduler/BUILD b/pkg/scheduler/BUILD index 2c278bd79d..efc2308e92 100644 --- a/pkg/scheduler/BUILD +++ b/pkg/scheduler/BUILD @@ -32,7 +32,6 @@ go_library( "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", diff --git a/pkg/scheduler/algorithm/BUILD b/pkg/scheduler/algorithm/BUILD index aaa7891791..415aa85302 100644 --- a/pkg/scheduler/algorithm/BUILD +++ b/pkg/scheduler/algorithm/BUILD @@ -16,7 +16,6 @@ go_library( "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", ], ) diff --git a/pkg/scheduler/algorithm/types.go b/pkg/scheduler/algorithm/types.go index b15930461d..f7a818a2b9 100644 --- a/pkg/scheduler/algorithm/types.go +++ b/pkg/scheduler/algorithm/types.go @@ -20,17 +20,10 @@ import ( apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" policyv1beta1 "k8s.io/api/policy/v1beta1" - scheduling "k8s.io/api/scheduling/v1" "k8s.io/apimachinery/pkg/labels" schedulerapi "k8s.io/kubernetes/pkg/scheduler/api" ) -// PriorityClassLister represents anything that can get PriorityClass object -type PriorityClassLister interface { - // Get retrieves the PriorityClass from the index for a given name. - Get(name string) (*scheduling.PriorityClass, error) -} - // NodeFieldSelectorKeys is a map that: the key are node field selector keys; the values are // the functions to get the value of the node field. var NodeFieldSelectorKeys = map[string]func(*v1.Node) string{ diff --git a/pkg/scheduler/api/compatibility/compatibility_test.go b/pkg/scheduler/api/compatibility/compatibility_test.go index 49eaddef17..7f29c93ed3 100644 --- a/pkg/scheduler/api/compatibility/compatibility_test.go +++ b/pkg/scheduler/api/compatibility/compatibility_test.go @@ -1109,7 +1109,6 @@ func TestCompatibility_v1_Scheduler(t *testing.T) { ServiceInformer: informerFactory.Core().V1().Services(), PdbInformer: informerFactory.Policy().V1beta1().PodDisruptionBudgets(), StorageClassInformer: informerFactory.Storage().V1().StorageClasses(), - PriorityClassInformer: informerFactory.Scheduling().V1().PriorityClasses(), HardPodAffinitySymmetricWeight: v1.DefaultHardPodAffinitySymmetricWeight, DisablePreemption: false, PercentageOfNodesToScore: schedulerapi.DefaultPercentageOfNodesToScore, diff --git a/pkg/scheduler/core/extender_test.go b/pkg/scheduler/core/extender_test.go index bca0a1f868..205e5b8ef3 100644 --- a/pkg/scheduler/core/extender_test.go +++ b/pkg/scheduler/core/extender_test.go @@ -547,10 +547,10 @@ func TestGenericSchedulerWithExtenders(t *testing.T) { nil, schedulertesting.FakePersistentVolumeClaimLister{}, schedulertesting.FakePDBLister{}, - schedulertesting.FakePriorityClassLister{}, false, false, - schedulerapi.DefaultPercentageOfNodesToScore) + schedulerapi.DefaultPercentageOfNodesToScore, + false) podIgnored := &v1.Pod{} result, err := scheduler.Schedule(podIgnored, schedulertesting.FakeNodeLister(makeNodeList(test.nodes))) if test.expectsErr { diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index d70a69f8b8..ad7b779bf7 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -166,10 +166,10 @@ type genericScheduler struct { volumeBinder *volumebinder.VolumeBinder pvcLister corelisters.PersistentVolumeClaimLister pdbLister algorithm.PDBLister - priorityClassLister algorithm.PriorityClassLister disablePreemption bool lastIndex int percentageOfNodesToScore int32 + enableNonPreempting bool } // snapshot snapshots scheduler cache and node infos for all fit and priority @@ -315,7 +315,7 @@ func (g *genericScheduler) Preempt(pod *v1.Pod, nodeLister algorithm.NodeLister, if !ok || fitError == nil { return nil, nil, nil, nil } - if !podEligibleToPreemptOthers(pod, g.nodeInfoSnapshot.NodeInfoMap) { + if !podEligibleToPreemptOthers(pod, g.nodeInfoSnapshot.NodeInfoMap, g.enableNonPreempting) { klog.V(5).Infof("Pod %v/%v is not eligible for more preemption.", pod.Namespace, pod.Name) return nil, nil, nil, nil } @@ -1163,9 +1163,9 @@ func nodesWherePreemptionMightHelp(nodes []*v1.Node, failedPredicatesMap FailedP // considered for preemption. // We look at the node that is nominated for this pod and as long as there are // terminating pods on the node, we don't consider this for preempting more pods. -func podEligibleToPreemptOthers(pod *v1.Pod, nodeNameToInfo map[string]*schedulernodeinfo.NodeInfo) bool { - if pod.Spec.Preempting != nil && !*(pod.Spec.Preempting) { - klog.V(5).Infof("Pod %v/%v with this Preempting could not start a preemption process.", pod.Namespace, pod.Name) +func podEligibleToPreemptOthers(pod *v1.Pod, nodeNameToInfo map[string]*schedulernodeinfo.NodeInfo, enableNonPreempting bool) bool { + if enableNonPreempting && pod.Spec.PreemptionPolicy != nil && *pod.Spec.PreemptionPolicy == v1.PreemptNever { + klog.V(5).Infof("Pod %v/%v is not eligible for preemption because it has a preemptionPolicy of %v", pod.Namespace, pod.Name, v1.PreemptNever) return false } nomNodeName := pod.Status.NominatedNodeName @@ -1222,10 +1222,10 @@ func NewGenericScheduler( volumeBinder *volumebinder.VolumeBinder, pvcLister corelisters.PersistentVolumeClaimLister, pdbLister algorithm.PDBLister, - priorityClassLister algorithm.PriorityClassLister, alwaysCheckAllPredicates bool, disablePreemption bool, percentageOfNodesToScore int32, + enableNonPreempting bool, ) ScheduleAlgorithm { return &genericScheduler{ cache: cache, @@ -1240,9 +1240,9 @@ func NewGenericScheduler( volumeBinder: volumeBinder, pvcLister: pvcLister, pdbLister: pdbLister, - priorityClassLister: priorityClassLister, alwaysCheckAllPredicates: alwaysCheckAllPredicates, disablePreemption: disablePreemption, percentageOfNodesToScore: percentageOfNodesToScore, + enableNonPreempting: enableNonPreempting, } } diff --git a/pkg/scheduler/core/generic_scheduler_test.go b/pkg/scheduler/core/generic_scheduler_test.go index b976f1568f..fd9bc27446 100644 --- a/pkg/scheduler/core/generic_scheduler_test.go +++ b/pkg/scheduler/core/generic_scheduler_test.go @@ -416,9 +416,9 @@ func TestGenericScheduler(t *testing.T) { predicates: map[string]algorithmpredicates.FitPredicate{"true": truePredicate, "matches": matchesPredicate, "false": falsePredicate}, prioritizers: []priorities.PriorityConfig{{Map: EqualPriorityMap, Weight: 1}}, alwaysCheckAllPredicates: true, - nodes: []string{"1"}, - pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}}, - name: "test alwaysCheckAllPredicates is true", + nodes: []string{"1"}, + pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}}, + name: "test alwaysCheckAllPredicates is true", wErr: &FitError{ Pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "2", UID: types.UID("2")}}, NumAllNodes: 1, @@ -462,10 +462,10 @@ func TestGenericScheduler(t *testing.T) { nil, pvcLister, schedulertesting.FakePDBLister{}, - schedulertesting.FakePriorityClassLister{}, test.alwaysCheckAllPredicates, false, - schedulerapi.DefaultPercentageOfNodesToScore) + schedulerapi.DefaultPercentageOfNodesToScore, + false) result, err := scheduler.Schedule(test.pod, schedulertesting.FakeNodeLister(makeNodeList(test.nodes))) if !reflect.DeepEqual(err, test.wErr) { @@ -494,8 +494,8 @@ func makeScheduler(predicates map[string]algorithmpredicates.FitPredicate, nodes prioritizers, priorities.EmptyPriorityMetadataProducer, emptyFramework, - nil, nil, nil, nil, nil, false, false, - schedulerapi.DefaultPercentageOfNodesToScore) + nil, nil, nil, nil, false, false, + schedulerapi.DefaultPercentageOfNodesToScore, false) cache.UpdateNodeInfoSnapshot(s.(*genericScheduler).nodeInfoSnapshot) return s.(*genericScheduler) @@ -1333,6 +1333,10 @@ func TestPreempt(t *testing.T) { for i := 1; i < 4; i++ { nodeNames = append(nodeNames, fmt.Sprintf("machine%d", i)) } + var ( + preemptLowerPriority = v1.PreemptLowerPriority + preemptNever = v1.PreemptNever + ) tests := []struct { name string pod *v1.Pod @@ -1344,8 +1348,9 @@ func TestPreempt(t *testing.T) { { name: "basic preemption logic", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1359,8 +1364,9 @@ func TestPreempt(t *testing.T) { { name: "One node doesn't need any preemption", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1374,8 +1380,9 @@ func TestPreempt(t *testing.T) { { name: "Scheduler extenders allow only machine1, otherwise machine3 would have been chosen", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &midPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1397,8 +1404,9 @@ func TestPreempt(t *testing.T) { { name: "Scheduler extenders do not allow any preemption", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &midPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1417,8 +1425,9 @@ func TestPreempt(t *testing.T) { { name: "One scheduler extender allows only machine1, the other returns error but ignorable. Only machine1 would be chosen", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &midPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1441,8 +1450,9 @@ func TestPreempt(t *testing.T) { { name: "One scheduler extender allows only machine1, but it is not interested in given pod, otherwise machine1 would have been chosen", pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ - Containers: veryLargeContainers, - Priority: &highPriority}, + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptLowerPriority}, }, pods: []*v1.Pod{ {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &midPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, @@ -1462,6 +1472,38 @@ func TestPreempt(t *testing.T) { expectedNode: "machine3", expectedPods: []string{}, }, + { + name: "no preempting in pod", + pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: &preemptNever}, + }, + pods: []*v1.Pod{ + {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m1.2", UID: types.UID("m1.2")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m2.1", UID: types.UID("m2.1")}, Spec: v1.PodSpec{Containers: largeContainers, Priority: &highPriority, NodeName: "machine2"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m3.1", UID: types.UID("m3.1")}, Spec: v1.PodSpec{Containers: mediumContainers, Priority: &midPriority, NodeName: "machine3"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + }, + expectedNode: "", + expectedPods: nil, + }, + { + name: "PreemptionPolicy is nil", + pod: &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: "pod1", UID: types.UID("pod1")}, Spec: v1.PodSpec{ + Containers: veryLargeContainers, + Priority: &highPriority, + PreemptionPolicy: nil}, + }, + pods: []*v1.Pod{ + {ObjectMeta: metav1.ObjectMeta{Name: "m1.1", UID: types.UID("m1.1")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m1.2", UID: types.UID("m1.2")}, Spec: v1.PodSpec{Containers: smallContainers, Priority: &lowPriority, NodeName: "machine1"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m2.1", UID: types.UID("m2.1")}, Spec: v1.PodSpec{Containers: largeContainers, Priority: &highPriority, NodeName: "machine2"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + {ObjectMeta: metav1.ObjectMeta{Name: "m3.1", UID: types.UID("m3.1")}, Spec: v1.PodSpec{Containers: mediumContainers, Priority: &midPriority, NodeName: "machine3"}, Status: v1.PodStatus{Phase: v1.PodRunning}}, + }, + expectedNode: "machine1", + expectedPods: []string{"m1.1", "m1.2"}, + }, } for _, test := range tests { @@ -1500,10 +1542,10 @@ func TestPreempt(t *testing.T) { nil, schedulertesting.FakePersistentVolumeClaimLister{}, schedulertesting.FakePDBLister{}, - schedulertesting.FakePriorityClassLister{}, false, false, - schedulerapi.DefaultPercentageOfNodesToScore) + schedulerapi.DefaultPercentageOfNodesToScore, + true) scheduler.(*genericScheduler).snapshot() // Call Preempt and check the expected results. node, victims, _, err := scheduler.Preempt(test.pod, schedulertesting.FakeNodeLister(makeNodeList(nodeNames)), error(&FitError{Pod: test.pod, FailedPredicates: failedPredMap})) @@ -1561,7 +1603,7 @@ func TestNumFeasibleNodesToFind(t *testing.T) { wantNumNodes: 10, }, { - name: "set percentageOfNodesToScore and nodes number not more than 50", + name: "set percentageOfNodesToScore and nodes number not more than 50", percentageOfNodesToScore: 40, numAllNodes: 10, wantNumNodes: 10, @@ -1572,7 +1614,7 @@ func TestNumFeasibleNodesToFind(t *testing.T) { wantNumNodes: 420, }, { - name: "set percentageOfNodesToScore and nodes number more than 50", + name: "set percentageOfNodesToScore and nodes number more than 50", percentageOfNodesToScore: 40, numAllNodes: 1000, wantNumNodes: 400, @@ -1583,13 +1625,12 @@ func TestNumFeasibleNodesToFind(t *testing.T) { wantNumNodes: 300, }, { - name: "set percentageOfNodesToScore and nodes number more than 50*125", + name: "set percentageOfNodesToScore and nodes number more than 50*125", percentageOfNodesToScore: 40, numAllNodes: 6000, wantNumNodes: 2400, }, } - for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { g := &genericScheduler{ diff --git a/pkg/scheduler/factory/BUILD b/pkg/scheduler/factory/BUILD index 59d8017e17..924d8c0e18 100644 --- a/pkg/scheduler/factory/BUILD +++ b/pkg/scheduler/factory/BUILD @@ -10,6 +10,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//pkg/api/v1/pod:go_default_library", + "//pkg/features:go_default_library", "//pkg/scheduler/algorithm:go_default_library", "//pkg/scheduler/algorithm/predicates:go_default_library", "//pkg/scheduler/algorithm/priorities:go_default_library", @@ -32,16 +33,15 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/informers/apps/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/informers/scheduling/v1:go_default_library", "//staging/src/k8s.io/client-go/informers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/kubernetes:go_default_library", "//staging/src/k8s.io/client-go/listers/apps/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/client-go/listers/scheduling/v1:go_default_library", "//staging/src/k8s.io/client-go/listers/storage/v1:go_default_library", "//staging/src/k8s.io/client-go/tools/cache:go_default_library", "//staging/src/k8s.io/client-go/tools/record:go_default_library", diff --git a/pkg/scheduler/factory/factory.go b/pkg/scheduler/factory/factory.go index b2a22541b2..579c4dccb4 100644 --- a/pkg/scheduler/factory/factory.go +++ b/pkg/scheduler/factory/factory.go @@ -32,21 +32,21 @@ import ( "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" + utilfeature "k8s.io/apiserver/pkg/util/feature" appsinformers "k8s.io/client-go/informers/apps/v1" coreinformers "k8s.io/client-go/informers/core/v1" policyinformers "k8s.io/client-go/informers/policy/v1beta1" - schedulinginformers "k8s.io/client-go/informers/scheduling/v1" storageinformers "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" appslisters "k8s.io/client-go/listers/apps/v1" corelisters "k8s.io/client-go/listers/core/v1" policylisters "k8s.io/client-go/listers/policy/v1beta1" - schedulinglister "k8s.io/client-go/listers/scheduling/v1" storagelisters "k8s.io/client-go/listers/storage/v1" "k8s.io/client-go/tools/cache" "k8s.io/client-go/tools/record" "k8s.io/klog" podutil "k8s.io/kubernetes/pkg/api/v1/pod" + "k8s.io/kubernetes/pkg/features" "k8s.io/kubernetes/pkg/scheduler/algorithm" "k8s.io/kubernetes/pkg/scheduler/algorithm/predicates" "k8s.io/kubernetes/pkg/scheduler/algorithm/priorities" @@ -187,8 +187,6 @@ type configFactory struct { storageClassLister storagelisters.StorageClassLister // framework has a set of plugins and the context used for running them. framework framework.Framework - // a means to list all PriorityClass - priorityClassLister schedulinglister.PriorityClassLister // Close this to stop all reflectors StopEverything <-chan struct{} @@ -221,6 +219,8 @@ type configFactory struct { bindTimeoutSeconds int64 // queue for pods that need scheduling podQueue internalqueue.SchedulingQueue + + enableNonPreempting bool } // ConfigFactoryArgs is a set arguments passed to NewConfigFactory. @@ -237,7 +237,6 @@ type ConfigFactoryArgs struct { ServiceInformer coreinformers.ServiceInformer PdbInformer policyinformers.PodDisruptionBudgetInformer StorageClassInformer storageinformers.StorageClassInformer - PriorityClassInformer schedulinginformers.PriorityClassInformer HardPodAffinitySymmetricWeight int32 DisablePreemption bool PercentageOfNodesToScore int32 @@ -281,7 +280,6 @@ func NewConfigFactory(args *ConfigFactoryArgs) Configurator { pdbLister: args.PdbInformer.Lister(), storageClassLister: storageClassLister, framework: framework, - priorityClassLister: args.PriorityClassInformer.Lister(), schedulerCache: schedulerCache, StopEverything: stopEverything, schedulerName: args.SchedulerName, @@ -289,6 +287,7 @@ func NewConfigFactory(args *ConfigFactoryArgs) Configurator { disablePreemption: args.DisablePreemption, percentageOfNodesToScore: args.PercentageOfNodesToScore, bindTimeoutSeconds: args.BindTimeoutSeconds, + enableNonPreempting: utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority), } // Setup volume binder c.volumeBinder = volumebinder.NewVolumeBinder(args.Client, args.NodeInformer, args.PvcInformer, args.PvInformer, args.StorageClassInformer, time.Duration(args.BindTimeoutSeconds)*time.Second) @@ -469,10 +468,10 @@ func (c *configFactory) CreateFromKeys(predicateKeys, priorityKeys sets.String, c.volumeBinder, c.pVCLister, c.pdbLister, - c.priorityClassLister, c.alwaysCheckAllPredicates, c.disablePreemption, c.percentageOfNodesToScore, + c.enableNonPreempting, ) return &Config{ @@ -571,7 +570,6 @@ func (c *configFactory) getPluginArgs() (*PluginFactoryArgs, error) { StorageClassInfo: &predicates.CachedStorageClassInfo{StorageClassLister: c.storageClassLister}, VolumeBinder: c.volumeBinder, HardPodAffinitySymmetricWeight: c.hardPodAffinitySymmetricWeight, - PriorityLister: c.priorityClassLister, }, nil } diff --git a/pkg/scheduler/factory/factory_test.go b/pkg/scheduler/factory/factory_test.go index dae41b5151..efe82c8805 100644 --- a/pkg/scheduler/factory/factory_test.go +++ b/pkg/scheduler/factory/factory_test.go @@ -491,7 +491,6 @@ func newConfigFactory(client clientset.Interface, hardPodAffinitySymmetricWeight informerFactory.Core().V1().Services(), informerFactory.Policy().V1beta1().PodDisruptionBudgets(), informerFactory.Storage().V1().StorageClasses(), - informerFactory.Scheduling().V1().PriorityClasses(), hardPodAffinitySymmetricWeight, disablePodPreemption, schedulerapi.DefaultPercentageOfNodesToScore, diff --git a/pkg/scheduler/factory/plugins.go b/pkg/scheduler/factory/plugins.go index 8cb3c2a2c8..2fc64df6cf 100644 --- a/pkg/scheduler/factory/plugins.go +++ b/pkg/scheduler/factory/plugins.go @@ -40,7 +40,6 @@ type PluginFactoryArgs struct { ControllerLister algorithm.ControllerLister ReplicaSetLister algorithm.ReplicaSetLister StatefulSetLister algorithm.StatefulSetLister - PriorityLister algorithm.PriorityClassLister NodeLister algorithm.NodeLister PDBLister algorithm.PDBLister NodeInfo predicates.NodeInfo diff --git a/pkg/scheduler/scheduler.go b/pkg/scheduler/scheduler.go index 0e97b2d99a..9c30fe1530 100644 --- a/pkg/scheduler/scheduler.go +++ b/pkg/scheduler/scheduler.go @@ -31,7 +31,6 @@ import ( appsinformers "k8s.io/client-go/informers/apps/v1" coreinformers "k8s.io/client-go/informers/core/v1" policyinformers "k8s.io/client-go/informers/policy/v1beta1" - schedulinginformers "k8s.io/client-go/informers/scheduling/v1" storageinformers "k8s.io/client-go/informers/storage/v1" clientset "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/record" @@ -130,7 +129,6 @@ func New(client clientset.Interface, serviceInformer coreinformers.ServiceInformer, pdbInformer policyinformers.PodDisruptionBudgetInformer, storageClassInformer storageinformers.StorageClassInformer, - priorityClassInformer schedulinginformers.PriorityClassInformer, recorder record.EventRecorder, schedulerAlgorithmSource kubeschedulerconfig.SchedulerAlgorithmSource, stopCh <-chan struct{}, @@ -157,7 +155,6 @@ func New(client clientset.Interface, ServiceInformer: serviceInformer, PdbInformer: pdbInformer, StorageClassInformer: storageClassInformer, - PriorityClassInformer: priorityClassInformer, HardPodAffinitySymmetricWeight: options.hardPodAffinitySymmetricWeight, DisablePreemption: options.disablePreemption, PercentageOfNodesToScore: options.percentageOfNodesToScore, diff --git a/pkg/scheduler/scheduler_test.go b/pkg/scheduler/scheduler_test.go index 3fb2f4f022..d96f8740d8 100644 --- a/pkg/scheduler/scheduler_test.go +++ b/pkg/scheduler/scheduler_test.go @@ -103,7 +103,6 @@ func (n *nodeLister) List() ([]*v1.Node, error) { } func podWithID(id, desiredHost string) *v1.Pod { - Preempting := true return &v1.Pod{ ObjectMeta: metav1.ObjectMeta{ Name: id, @@ -111,8 +110,7 @@ func podWithID(id, desiredHost string) *v1.Pod { SelfLink: fmt.Sprintf("/api/v1/%s/%s", string(v1.ResourcePods), id), }, Spec: v1.PodSpec{ - NodeName: desiredHost, - Preempting: &Preempting, + NodeName: desiredHost, }, } } @@ -202,7 +200,6 @@ func TestSchedulerCreation(t *testing.T) { informerFactory.Core().V1().Services(), informerFactory.Policy().V1beta1().PodDisruptionBudgets(), informerFactory.Storage().V1().StorageClasses(), - informerFactory.Scheduling().V1().PriorityClasses(), eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "scheduler"}), kubeschedulerconfig.SchedulerAlgorithmSource{Provider: &testSource}, stopCh, @@ -661,10 +658,10 @@ func setupTestScheduler(queuedPodStore *clientcache.FIFO, scache internalcache.C nil, informerFactory.Core().V1().PersistentVolumeClaims().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), - informerFactory.Scheduling().V1().PriorityClasses().Lister(), false, false, schedulerapi.DefaultPercentageOfNodesToScore, + false, ) bindingChan := make(chan *v1.Binding, 1) errChan := make(chan error, 1) @@ -715,10 +712,10 @@ func setupTestSchedulerLongBindingWithRetry(queuedPodStore *clientcache.FIFO, sc nil, informerFactory.Core().V1().PersistentVolumeClaims().Lister(), informerFactory.Policy().V1beta1().PodDisruptionBudgets().Lister(), - informerFactory.Scheduling().V1().PriorityClasses().Lister(), false, false, schedulerapi.DefaultPercentageOfNodesToScore, + false, ) bindingChan := make(chan *v1.Binding, 2) diff --git a/pkg/scheduler/testing/BUILD b/pkg/scheduler/testing/BUILD index 225100d9bd..8b9a1e8e88 100644 --- a/pkg/scheduler/testing/BUILD +++ b/pkg/scheduler/testing/BUILD @@ -11,7 +11,6 @@ go_library( "//staging/src/k8s.io/api/apps/v1:go_default_library", "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/policy/v1beta1:go_default_library", - "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", diff --git a/pkg/scheduler/testing/fake_lister.go b/pkg/scheduler/testing/fake_lister.go index c23b5d65ef..343800a388 100644 --- a/pkg/scheduler/testing/fake_lister.go +++ b/pkg/scheduler/testing/fake_lister.go @@ -22,7 +22,6 @@ import ( apps "k8s.io/api/apps/v1" "k8s.io/api/core/v1" policy "k8s.io/api/policy/v1beta1" - schedulingv1 "k8s.io/api/scheduling/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" corelisters "k8s.io/client-go/listers/core/v1" @@ -223,12 +222,3 @@ type FakePDBLister []*policy.PodDisruptionBudget func (f FakePDBLister) List(labels.Selector) ([]*policy.PodDisruptionBudget, error) { return f, nil } - -// FakePriorityClassLister implements PriorityClassLister on a slice of Priority for test purposes. -type FakePriorityClassLister schedulingv1.PriorityClass - -// Get returns a PriorityClass by name. -func (f FakePriorityClassLister) Get(name string) (*schedulingv1.PriorityClass, error) { - pc := schedulingv1.PriorityClass(f) - return &pc, nil -} diff --git a/plugin/pkg/admission/priority/BUILD b/plugin/pkg/admission/priority/BUILD index d799b30629..2b34a81b71 100644 --- a/plugin/pkg/admission/priority/BUILD +++ b/plugin/pkg/admission/priority/BUILD @@ -37,6 +37,7 @@ go_library( "//pkg/apis/scheduling:go_default_library", "//pkg/features:go_default_library", "//pkg/kubelet/types:go_default_library", + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/api/scheduling/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/plugin/pkg/admission/priority/admission.go b/plugin/pkg/admission/priority/admission.go index a6c8fb97b1..4c82d65acf 100644 --- a/plugin/pkg/admission/priority/admission.go +++ b/plugin/pkg/admission/priority/admission.go @@ -20,6 +20,7 @@ import ( "fmt" "io" + apiv1 "k8s.io/api/core/v1" schedulingv1 "k8s.io/api/scheduling/v1" "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -30,6 +31,7 @@ import ( "k8s.io/client-go/informers" "k8s.io/client-go/kubernetes" schedulingv1listers "k8s.io/client-go/listers/scheduling/v1" + "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/scheduling" "k8s.io/kubernetes/pkg/features" @@ -179,7 +181,7 @@ func (p *priorityPlugin) admitPod(a admission.Attributes) error { if operation == admission.Create { var priority int32 - var preempting *bool + var preemptionPolicy *apiv1.PreemptionPolicy // TODO: @ravig - This is for backwards compatibility to ensure that critical pods with annotations just work fine. // Remove when no longer needed. if len(pod.Spec.PriorityClassName) == 0 && @@ -190,7 +192,7 @@ func (p *priorityPlugin) admitPod(a admission.Attributes) error { if len(pod.Spec.PriorityClassName) == 0 { var err error var pcName string - pcName, priority, preempting, err = p.getDefaultPriority() + pcName, priority, preemptionPolicy, err = p.getDefaultPriority() if err != nil { return fmt.Errorf("failed to get default priority class: %v", err) } @@ -212,14 +214,24 @@ func (p *priorityPlugin) admitPod(a admission.Attributes) error { } priority = pc.Value - preempting = pc.Preempting + preemptionPolicy = pc.PreemptionPolicy } // if the pod contained a priority that differs from the one computed from the priority class, error if pod.Spec.Priority != nil && *pod.Spec.Priority != priority { return admission.NewForbidden(a, fmt.Errorf("the integer value of priority (%d) must not be provided in pod spec; priority admission controller computed %d from the given PriorityClass name", *pod.Spec.Priority, priority)) } pod.Spec.Priority = &priority - pod.Spec.Preempting = preempting + + if utilfeature.DefaultFeatureGate.Enabled(features.NonPreemptingPriority) { + var corePolicy core.PreemptionPolicy + if preemptionPolicy != nil { + corePolicy = core.PreemptionPolicy(*preemptionPolicy) + if pod.Spec.PreemptionPolicy != nil && *pod.Spec.PreemptionPolicy != corePolicy { + return admission.NewForbidden(a, fmt.Errorf("the string value of PreemptionPolicy (%s) must not be provided in pod spec; priority admission controller computed %s from the given PriorityClass name", *pod.Spec.PreemptionPolicy, corePolicy)) + } + pod.Spec.PreemptionPolicy = &corePolicy + } + } } return nil } @@ -265,15 +277,14 @@ func (p *priorityPlugin) getDefaultPriorityClass() (*schedulingv1.PriorityClass, return defaultPC, nil } -func (p *priorityPlugin) getDefaultPriority() (string, int32, *bool, error) { +func (p *priorityPlugin) getDefaultPriority() (string, int32, *apiv1.PreemptionPolicy, error) { dpc, err := p.getDefaultPriorityClass() if err != nil { return "", 0, nil, err } if dpc != nil { - return dpc.Name, dpc.Value, dpc.Preempting, nil + return dpc.Name, dpc.Value, dpc.PreemptionPolicy, nil } - preempting := true - - return "", int32(scheduling.DefaultPriorityWhenNoDefaultClassExists), &preempting, nil + preemptLowerPriority := apiv1.PreemptLowerPriority + return "", int32(scheduling.DefaultPriorityWhenNoDefaultClassExists), &preemptLowerPriority, nil } diff --git a/plugin/pkg/admission/priority/admission_test.go b/plugin/pkg/admission/priority/admission_test.go index 8910451666..1181956ef0 100644 --- a/plugin/pkg/admission/priority/admission_test.go +++ b/plugin/pkg/admission/priority/admission_test.go @@ -50,6 +50,11 @@ func addPriorityClasses(ctrl *priorityPlugin, priorityClasses []*scheduling.Prio return nil } +var ( + preemptNever = api.PreemptNever + preemptLowerPriority = api.PreemptLowerPriority +) + var defaultClass1 = &scheduling.PriorityClass{ TypeMeta: metav1.TypeMeta{ Kind: "PriorityClass", @@ -94,6 +99,32 @@ var systemClusterCritical = &scheduling.PriorityClass{ GlobalDefault: true, } +var neverPreemptionPolicyClass = &scheduling.PriorityClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "PriorityClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "nopreemptionpolicy", + }, + Value: 2000, + Description: "Just a test priority class", + GlobalDefault: true, + PreemptionPolicy: &preemptNever, +} + +var preemptionPolicyClass = &scheduling.PriorityClass{ + TypeMeta: metav1.TypeMeta{ + Kind: "PriorityClass", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "nopreemptionpolicy", + }, + Value: 2000, + Description: "Just a test priority class", + GlobalDefault: true, + PreemptionPolicy: &preemptLowerPriority, +} + func TestPriorityClassAdmission(t *testing.T) { var systemClass = &scheduling.PriorityClass{ TypeMeta: metav1.TypeMeta{ @@ -468,19 +499,73 @@ func TestPodAdmission(t *testing.T) { Priority: &systemClusterCritical.Value, }, }, + // pod[12]: Pod without a preemption policy that matches the resolved preemption policy + { + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-never-preemption-policy-matching-resolved-preemption-policy", + Namespace: metav1.NamespaceSystem, + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: containerName, + }, + }, + PriorityClassName: neverPreemptionPolicyClass.Name, + Priority: &neverPreemptionPolicyClass.Value, + PreemptionPolicy: nil, + }, + }, + // pod[13]: Pod with a preemption policy that matches the resolved preemption policy + { + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-preemption-policy-matching-resolved-preemption-policy", + Namespace: metav1.NamespaceSystem, + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: containerName, + }, + }, + PriorityClassName: preemptionPolicyClass.Name, + Priority: &preemptionPolicyClass.Value, + PreemptionPolicy: &preemptLowerPriority, + }, + }, + // pod[14]: Pod with a preemption policy that does't match the resolved preemption policy + { + ObjectMeta: metav1.ObjectMeta{ + Name: "pod-preemption-policy-not-matching-resolved-preemption-policy", + Namespace: metav1.NamespaceSystem, + }, + Spec: api.PodSpec{ + Containers: []api.Container{ + { + Name: containerName, + }, + }, + PriorityClassName: preemptionPolicyClass.Name, + Priority: &preemptionPolicyClass.Value, + PreemptionPolicy: &preemptNever, + }, + }, } // Enable PodPriority feature gate. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.PodPriority, true)() // Enable ExperimentalCriticalPodAnnotation feature gate. defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ExperimentalCriticalPodAnnotation, true)() + // Enable NonPreemptingPriority feature gate. + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.NonPreemptingPriority, true)() tests := []struct { name string existingClasses []*scheduling.PriorityClass // Admission controller changes pod spec. So, we take an api.Pod instead of // *api.Pod to avoid interfering with other tests. - pod api.Pod - expectedPriority int32 - expectError bool + pod api.Pod + expectedPriority int32 + expectError bool + expectPreemptionPolicy *api.PreemptionPolicy }{ { "Pod with priority class", @@ -488,6 +573,7 @@ func TestPodAdmission(t *testing.T) { *pods[0], 1000, false, + nil, }, { @@ -496,6 +582,7 @@ func TestPodAdmission(t *testing.T) { *pods[1], 1000, false, + nil, }, { "pod without priority class and no existing priority class", @@ -503,6 +590,7 @@ func TestPodAdmission(t *testing.T) { *pods[1], scheduling.DefaultPriorityWhenNoDefaultClassExists, false, + nil, }, { "pod without priority class and no default class", @@ -510,6 +598,7 @@ func TestPodAdmission(t *testing.T) { *pods[1], scheduling.DefaultPriorityWhenNoDefaultClassExists, false, + nil, }, { "pod with a system priority class", @@ -517,6 +606,7 @@ func TestPodAdmission(t *testing.T) { *pods[4], scheduling.SystemCriticalPriority, false, + nil, }, { "Pod with non-existing priority class", @@ -524,6 +614,7 @@ func TestPodAdmission(t *testing.T) { *pods[2], 0, true, + nil, }, { "pod with integer priority", @@ -531,6 +622,7 @@ func TestPodAdmission(t *testing.T) { *pods[3], 0, true, + nil, }, { "mirror pod with system priority class", @@ -538,6 +630,7 @@ func TestPodAdmission(t *testing.T) { *pods[5], scheduling.SystemCriticalPriority, false, + nil, }, { "mirror pod with integer priority", @@ -545,6 +638,7 @@ func TestPodAdmission(t *testing.T) { *pods[6], 0, true, + nil, }, { "pod with critical pod annotation", @@ -552,6 +646,7 @@ func TestPodAdmission(t *testing.T) { *pods[7], scheduling.SystemCriticalPriority, false, + nil, }, { "pod with system critical priority in non-system namespace", @@ -559,6 +654,7 @@ func TestPodAdmission(t *testing.T) { *pods[8], scheduling.SystemCriticalPriority, true, + nil, }, { "pod with priority that matches computed priority", @@ -566,6 +662,7 @@ func TestPodAdmission(t *testing.T) { *pods[9], 0, false, + nil, }, { "pod with priority that matches default priority", @@ -573,6 +670,7 @@ func TestPodAdmission(t *testing.T) { *pods[10], defaultClass2.Value, false, + nil, }, { "pod with priority that matches resolved priority", @@ -580,6 +678,31 @@ func TestPodAdmission(t *testing.T) { *pods[11], systemClusterCritical.Value, false, + nil, + }, + { + "pod with nil preemtpion policy", + []*scheduling.PriorityClass{preemptionPolicyClass}, + *pods[12], + preemptionPolicyClass.Value, + false, + nil, + }, + { + "pod with preemtpion policy that matches resolved preemtpion policy", + []*scheduling.PriorityClass{preemptionPolicyClass}, + *pods[13], + preemptionPolicyClass.Value, + false, + &preemptLowerPriority, + }, + { + "pod with preemtpion policy that does't matches resolved preemtpion policy", + []*scheduling.PriorityClass{preemptionPolicyClass}, + *pods[14], + preemptionPolicyClass.Value, + true, + &preemptLowerPriority, }, } @@ -613,6 +736,8 @@ func TestPodAdmission(t *testing.T) { t.Errorf("Test %q: unexpected error received: %v", test.name, err) } else if *test.pod.Spec.Priority != test.expectedPriority { t.Errorf("Test %q: expected priority is %d, but got %d.", test.name, test.expectedPriority, *test.pod.Spec.Priority) + } else if test.pod.Spec.PreemptionPolicy != nil && test.expectPreemptionPolicy != nil && *test.pod.Spec.PreemptionPolicy != *test.expectPreemptionPolicy { + t.Errorf("Test %q: expected preemption policy is %s, but got %s.", test.name, *test.expectPreemptionPolicy, *test.pod.Spec.PreemptionPolicy) } } if err == nil && test.expectError { diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go index e9e7d368d2..53e7298e5c 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/policy.go @@ -48,7 +48,6 @@ const ( extensionsGroup = "extensions" policyGroup = "policy" rbacGroup = "rbac.authorization.k8s.io" - schedulingGroup = "scheduling.k8s.io" storageGroup = "storage.k8s.io" resMetricsGroup = "metrics.k8s.io" customMetricsGroup = "custom.metrics.k8s.io" @@ -443,7 +442,6 @@ func ClusterRoles() []rbacv1.ClusterRole { // Needed to check API access. These creates are non-mutating rbacv1helpers.NewRule("create").Groups(authenticationGroup).Resources("tokenreviews").RuleOrDie(), rbacv1helpers.NewRule("create").Groups(authorizationGroup).Resources("subjectaccessreviews").RuleOrDie(), - rbacv1helpers.NewRule(Read...).Groups(schedulingGroup).Resources("priorityclasses").RuleOrDie(), }, }, { diff --git a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml index cebe630141..bfadaea207 100644 --- a/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml +++ b/plugin/pkg/auth/authorizer/rbac/bootstrappolicy/testdata/cluster-roles.yaml @@ -801,14 +801,6 @@ items: - subjectaccessreviews verbs: - create - - apiGroups: - - scheduling.k8s.io - resources: - - priorityclasses - verbs: - - get - - list - - watch - apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: diff --git a/staging/src/k8s.io/api/core/v1/generated.pb.go b/staging/src/k8s.io/api/core/v1/generated.pb.go index c7bda1b835..79ecb2610c 100644 --- a/staging/src/k8s.io/api/core/v1/generated.pb.go +++ b/staging/src/k8s.io/api/core/v1/generated.pb.go @@ -7847,17 +7847,13 @@ func (m *PodSpec) MarshalTo(dAtA []byte) (int, error) { } i++ } - if m.Preempting != nil { - dAtA[i] = 0xf8 + if m.PreemptionPolicy != nil { + dAtA[i] = 0xfa i++ dAtA[i] = 0x1 i++ - if *m.Preempting { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PreemptionPolicy))) + i += copy(dAtA[i:], *m.PreemptionPolicy) } return i, nil } @@ -13585,8 +13581,9 @@ func (m *PodSpec) Size() (n int) { if m.EnableServiceLinks != nil { n += 3 } - if m.Preempting != nil { - n += 3 + if m.PreemptionPolicy != nil { + l = len(*m.PreemptionPolicy) + n += 2 + l + sovGenerated(uint64(l)) } return n } @@ -16664,7 +16661,7 @@ func (this *PodSpec) String() string { `ReadinessGates:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ReadinessGates), "PodReadinessGate", "PodReadinessGate", 1), `&`, ``, 1) + `,`, `RuntimeClassName:` + valueToStringGenerated(this.RuntimeClassName) + `,`, `EnableServiceLinks:` + valueToStringGenerated(this.EnableServiceLinks) + `,`, - `Preempting:` + valueToStringGenerated(this.Preempting) + `,`, + `PreemptionPolicy:` + valueToStringGenerated(this.PreemptionPolicy) + `,`, `}`, }, "") return s @@ -40423,10 +40420,10 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { b := bool(v != 0) m.EnableServiceLinks = &b case 31: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Preempting", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreemptionPolicy", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -40436,13 +40433,22 @@ func (m *PodSpec) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - b := bool(v != 0) - m.Preempting = &b + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := PreemptionPolicy(dAtA[iNdEx:postIndex]) + m.PreemptionPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -52532,822 +52538,823 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 13071 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x90, 0x24, 0x57, - 0x56, 0x18, 0xbc, 0x59, 0xd5, 0xaf, 0x3a, 0xfd, 0xbe, 0xf3, 0x50, 0x4f, 0x6b, 0x66, 0x6a, 0x94, - 0xda, 0x1d, 0x8d, 0x56, 0x52, 0xcf, 0x6a, 0x24, 0xad, 0xc4, 0x4a, 0x2b, 0xe8, 0xee, 0xea, 0x9e, - 0x29, 0xcd, 0x74, 0x4f, 0xe9, 0x56, 0xcf, 0xcc, 0xae, 0xd0, 0x2e, 0xca, 0xae, 0xbc, 0xdd, 0x9d, - 0xea, 0xea, 0xcc, 0x52, 0x66, 0x56, 0xcf, 0xb4, 0x3e, 0x88, 0x0f, 0x2f, 0x06, 0xb3, 0x01, 0x76, - 0x6c, 0xd8, 0x84, 0x1f, 0x40, 0xe0, 0x08, 0x8c, 0x03, 0x30, 0xd8, 0x61, 0x0c, 0x06, 0xcc, 0x62, - 0x1b, 0x03, 0x8e, 0xc0, 0xfe, 0xb1, 0xc6, 0x8e, 0x70, 0x2c, 0x11, 0x84, 0xdb, 0xd0, 0x38, 0x4c, - 0xf0, 0xc3, 0xe0, 0x30, 0xfe, 0x43, 0x9b, 0x30, 0x8e, 0xfb, 0xcc, 0x7b, 0xb3, 0x32, 0xab, 0xaa, - 0x47, 0x3d, 0x2d, 0xb1, 0xb1, 0xff, 0xaa, 0xee, 0x39, 0xf7, 0xdc, 0x9b, 0xf7, 0x79, 0xce, 0xb9, - 0xe7, 0x01, 0xaf, 0x6e, 0xbf, 0x12, 0xcd, 0x79, 0xc1, 0xd5, 0xed, 0xf6, 0x3a, 0x09, 0x7d, 0x12, - 0x93, 0xe8, 0xea, 0x2e, 0xf1, 0xdd, 0x20, 0xbc, 0x2a, 0x00, 0x4e, 0xcb, 0xbb, 0xda, 0x08, 0x42, - 0x72, 0x75, 0xf7, 0xf9, 0xab, 0x9b, 0xc4, 0x27, 0xa1, 0x13, 0x13, 0x77, 0xae, 0x15, 0x06, 0x71, - 0x80, 0x10, 0xc7, 0x99, 0x73, 0x5a, 0xde, 0x1c, 0xc5, 0x99, 0xdb, 0x7d, 0x7e, 0xf6, 0xb9, 0x4d, - 0x2f, 0xde, 0x6a, 0xaf, 0xcf, 0x35, 0x82, 0x9d, 0xab, 0x9b, 0xc1, 0x66, 0x70, 0x95, 0xa1, 0xae, - 0xb7, 0x37, 0xd8, 0x3f, 0xf6, 0x87, 0xfd, 0xe2, 0x24, 0x66, 0x5f, 0x4c, 0x9a, 0xd9, 0x71, 0x1a, - 0x5b, 0x9e, 0x4f, 0xc2, 0xbd, 0xab, 0xad, 0xed, 0x4d, 0xd6, 0x6e, 0x48, 0xa2, 0xa0, 0x1d, 0x36, - 0x48, 0xba, 0xe1, 0xae, 0xb5, 0xa2, 0xab, 0x3b, 0x24, 0x76, 0x32, 0xba, 0x3b, 0x7b, 0x35, 0xaf, - 0x56, 0xd8, 0xf6, 0x63, 0x6f, 0xa7, 0xb3, 0x99, 0x4f, 0xf7, 0xaa, 0x10, 0x35, 0xb6, 0xc8, 0x8e, - 0xd3, 0x51, 0xef, 0x85, 0xbc, 0x7a, 0xed, 0xd8, 0x6b, 0x5e, 0xf5, 0xfc, 0x38, 0x8a, 0xc3, 0x74, - 0x25, 0xfb, 0xeb, 0x16, 0x5c, 0x9a, 0xbf, 0x57, 0x5f, 0x6a, 0x3a, 0x51, 0xec, 0x35, 0x16, 0x9a, - 0x41, 0x63, 0xbb, 0x1e, 0x07, 0x21, 0xb9, 0x1b, 0x34, 0xdb, 0x3b, 0xa4, 0xce, 0x06, 0x02, 0x3d, - 0x0b, 0x23, 0xbb, 0xec, 0x7f, 0xb5, 0x32, 0x63, 0x5d, 0xb2, 0xae, 0x94, 0x16, 0xa6, 0x7e, 0x6b, - 0xbf, 0xfc, 0xb1, 0x83, 0xfd, 0xf2, 0xc8, 0x5d, 0x51, 0x8e, 0x15, 0x06, 0xba, 0x0c, 0x43, 0x1b, - 0xd1, 0xda, 0x5e, 0x8b, 0xcc, 0x14, 0x18, 0xee, 0x84, 0xc0, 0x1d, 0x5a, 0xae, 0xd3, 0x52, 0x2c, - 0xa0, 0xe8, 0x2a, 0x94, 0x5a, 0x4e, 0x18, 0x7b, 0xb1, 0x17, 0xf8, 0x33, 0xc5, 0x4b, 0xd6, 0x95, - 0xc1, 0x85, 0x69, 0x81, 0x5a, 0xaa, 0x49, 0x00, 0x4e, 0x70, 0x68, 0x37, 0x42, 0xe2, 0xb8, 0xb7, - 0xfd, 0xe6, 0xde, 0xcc, 0xc0, 0x25, 0xeb, 0xca, 0x48, 0xd2, 0x0d, 0x2c, 0xca, 0xb1, 0xc2, 0xb0, - 0x7f, 0xb8, 0x00, 0x23, 0xf3, 0x1b, 0x1b, 0x9e, 0xef, 0xc5, 0x7b, 0xe8, 0x2e, 0x8c, 0xf9, 0x81, - 0x4b, 0xe4, 0x7f, 0xf6, 0x15, 0xa3, 0xd7, 0x2e, 0xcd, 0x75, 0x2e, 0xa5, 0xb9, 0x55, 0x0d, 0x6f, - 0x61, 0xea, 0x60, 0xbf, 0x3c, 0xa6, 0x97, 0x60, 0x83, 0x0e, 0xc2, 0x30, 0xda, 0x0a, 0x5c, 0x45, - 0xb6, 0xc0, 0xc8, 0x96, 0xb3, 0xc8, 0xd6, 0x12, 0xb4, 0x85, 0xc9, 0x83, 0xfd, 0xf2, 0xa8, 0x56, - 0x80, 0x75, 0x22, 0x68, 0x1d, 0x26, 0xe9, 0x5f, 0x3f, 0xf6, 0x14, 0xdd, 0x22, 0xa3, 0xfb, 0x64, - 0x1e, 0x5d, 0x0d, 0x75, 0xe1, 0xd4, 0xc1, 0x7e, 0x79, 0x32, 0x55, 0x88, 0xd3, 0x04, 0xed, 0xf7, - 0x61, 0x62, 0x3e, 0x8e, 0x9d, 0xc6, 0x16, 0x71, 0xf9, 0x0c, 0xa2, 0x17, 0x61, 0xc0, 0x77, 0x76, - 0x88, 0x98, 0xdf, 0x4b, 0x62, 0x60, 0x07, 0x56, 0x9d, 0x1d, 0x72, 0xb8, 0x5f, 0x9e, 0xba, 0xe3, - 0x7b, 0xef, 0xb5, 0xc5, 0xaa, 0xa0, 0x65, 0x98, 0x61, 0xa3, 0x6b, 0x00, 0x2e, 0xd9, 0xf5, 0x1a, - 0xa4, 0xe6, 0xc4, 0x5b, 0x62, 0xbe, 0x91, 0xa8, 0x0b, 0x15, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0x00, - 0x4a, 0xf3, 0xbb, 0x81, 0xe7, 0xd6, 0x02, 0x37, 0x42, 0xdb, 0x30, 0xd9, 0x0a, 0xc9, 0x06, 0x09, - 0x55, 0xd1, 0x8c, 0x75, 0xa9, 0x78, 0x65, 0xf4, 0xda, 0x95, 0xcc, 0x8f, 0x35, 0x51, 0x97, 0xfc, - 0x38, 0xdc, 0x5b, 0x78, 0x4c, 0xb4, 0x37, 0x99, 0x82, 0xe2, 0x34, 0x65, 0xfb, 0x37, 0x0b, 0x70, - 0x66, 0xfe, 0xfd, 0x76, 0x48, 0x2a, 0x5e, 0xb4, 0x9d, 0x5e, 0xe1, 0xae, 0x17, 0x6d, 0xaf, 0x26, - 0x23, 0xa0, 0x96, 0x56, 0x45, 0x94, 0x63, 0x85, 0x81, 0x9e, 0x83, 0x61, 0xfa, 0xfb, 0x0e, 0xae, - 0x8a, 0x4f, 0x3e, 0x25, 0x90, 0x47, 0x2b, 0x4e, 0xec, 0x54, 0x38, 0x08, 0x4b, 0x1c, 0xb4, 0x02, - 0xa3, 0x0d, 0xb6, 0x21, 0x37, 0x57, 0x02, 0x97, 0xb0, 0xc9, 0x2c, 0x2d, 0x3c, 0x43, 0xd1, 0x17, - 0x93, 0xe2, 0xc3, 0xfd, 0xf2, 0x0c, 0xef, 0x9b, 0x20, 0xa1, 0xc1, 0xb0, 0x5e, 0x1f, 0xd9, 0x6a, - 0x7f, 0x0d, 0x30, 0x4a, 0x90, 0xb1, 0xb7, 0xae, 0x68, 0x5b, 0x65, 0x90, 0x6d, 0x95, 0xb1, 0xec, - 0x6d, 0x82, 0x9e, 0x87, 0x81, 0x6d, 0xcf, 0x77, 0x67, 0x86, 0x18, 0xad, 0x0b, 0x74, 0xce, 0x6f, - 0x7a, 0xbe, 0x7b, 0xb8, 0x5f, 0x9e, 0x36, 0xba, 0x43, 0x0b, 0x31, 0x43, 0xb5, 0xff, 0xd4, 0x82, - 0x32, 0x83, 0x2d, 0x7b, 0x4d, 0x52, 0x23, 0x61, 0xe4, 0x45, 0x31, 0xf1, 0x63, 0x63, 0x40, 0xaf, - 0x01, 0x44, 0xa4, 0x11, 0x92, 0x58, 0x1b, 0x52, 0xb5, 0x30, 0xea, 0x0a, 0x82, 0x35, 0x2c, 0x7a, - 0x20, 0x44, 0x5b, 0x4e, 0xc8, 0xd6, 0x97, 0x18, 0x58, 0x75, 0x20, 0xd4, 0x25, 0x00, 0x27, 0x38, - 0xc6, 0x81, 0x50, 0xec, 0x75, 0x20, 0xa0, 0xcf, 0xc2, 0x64, 0xd2, 0x58, 0xd4, 0x72, 0x1a, 0x72, - 0x00, 0xd9, 0x96, 0xa9, 0x9b, 0x20, 0x9c, 0xc6, 0xb5, 0xff, 0x91, 0x25, 0x16, 0x0f, 0xfd, 0xea, - 0x8f, 0xf8, 0xb7, 0xda, 0xbf, 0x6c, 0xc1, 0xf0, 0x82, 0xe7, 0xbb, 0x9e, 0xbf, 0x89, 0xde, 0x81, - 0x11, 0x7a, 0x37, 0xb9, 0x4e, 0xec, 0x88, 0x73, 0xef, 0x53, 0xda, 0xde, 0x52, 0x57, 0xc5, 0x5c, - 0x6b, 0x7b, 0x93, 0x16, 0x44, 0x73, 0x14, 0x9b, 0xee, 0xb6, 0xdb, 0xeb, 0xef, 0x92, 0x46, 0xbc, - 0x42, 0x62, 0x27, 0xf9, 0x9c, 0xa4, 0x0c, 0x2b, 0xaa, 0xe8, 0x26, 0x0c, 0xc5, 0x4e, 0xb8, 0x49, - 0x62, 0x71, 0x00, 0x66, 0x1e, 0x54, 0xbc, 0x26, 0xa6, 0x3b, 0x92, 0xf8, 0x0d, 0x92, 0x5c, 0x0b, - 0x6b, 0xac, 0x2a, 0x16, 0x24, 0xec, 0xbf, 0x3e, 0x0c, 0xe7, 0x16, 0xeb, 0xd5, 0x9c, 0x75, 0x75, - 0x19, 0x86, 0xdc, 0xd0, 0xdb, 0x25, 0xa1, 0x18, 0x67, 0x45, 0xa5, 0xc2, 0x4a, 0xb1, 0x80, 0xa2, - 0x57, 0x60, 0x8c, 0x5f, 0x48, 0x37, 0x1c, 0xdf, 0x6d, 0xca, 0x21, 0x3e, 0x2d, 0xb0, 0xc7, 0xee, - 0x6a, 0x30, 0x6c, 0x60, 0x1e, 0x71, 0x51, 0x5d, 0x4e, 0x6d, 0xc6, 0xbc, 0xcb, 0xee, 0xcb, 0x16, - 0x4c, 0xf1, 0x66, 0xe6, 0xe3, 0x38, 0xf4, 0xd6, 0xdb, 0x31, 0x89, 0x66, 0x06, 0xd9, 0x49, 0xb7, - 0x98, 0x35, 0x5a, 0xb9, 0x23, 0x30, 0x77, 0x37, 0x45, 0x85, 0x1f, 0x82, 0x33, 0xa2, 0xdd, 0xa9, - 0x34, 0x18, 0x77, 0x34, 0x8b, 0xbe, 0xc7, 0x82, 0xd9, 0x46, 0xe0, 0xc7, 0x61, 0xd0, 0x6c, 0x92, - 0xb0, 0xd6, 0x5e, 0x6f, 0x7a, 0xd1, 0x16, 0x5f, 0xa7, 0x98, 0x6c, 0xb0, 0x93, 0x20, 0x67, 0x0e, - 0x15, 0x92, 0x98, 0xc3, 0x8b, 0x07, 0xfb, 0xe5, 0xd9, 0xc5, 0x5c, 0x52, 0xb8, 0x4b, 0x33, 0x68, - 0x1b, 0x10, 0xbd, 0x4a, 0xeb, 0xb1, 0xb3, 0x49, 0x92, 0xc6, 0x87, 0xfb, 0x6f, 0xfc, 0xec, 0xc1, - 0x7e, 0x19, 0xad, 0x76, 0x90, 0xc0, 0x19, 0x64, 0xd1, 0x7b, 0x70, 0x9a, 0x96, 0x76, 0x7c, 0xeb, - 0x48, 0xff, 0xcd, 0xcd, 0x1c, 0xec, 0x97, 0x4f, 0xaf, 0x66, 0x10, 0xc1, 0x99, 0xa4, 0xd1, 0x77, - 0x5b, 0x70, 0x2e, 0xf9, 0xfc, 0xa5, 0x07, 0x2d, 0xc7, 0x77, 0x93, 0x86, 0x4b, 0xfd, 0x37, 0x4c, - 0xcf, 0xe4, 0x73, 0x8b, 0x79, 0x94, 0x70, 0x7e, 0x23, 0xb3, 0x8b, 0x70, 0x26, 0x73, 0xb5, 0xa0, - 0x29, 0x28, 0x6e, 0x13, 0xce, 0x05, 0x95, 0x30, 0xfd, 0x89, 0x4e, 0xc3, 0xe0, 0xae, 0xd3, 0x6c, - 0x8b, 0x8d, 0x82, 0xf9, 0x9f, 0xcf, 0x14, 0x5e, 0xb1, 0xec, 0x7f, 0x5b, 0x84, 0xc9, 0xc5, 0x7a, - 0xf5, 0xa1, 0x76, 0xa1, 0x7e, 0x0d, 0x15, 0xba, 0x5e, 0x43, 0xc9, 0xa5, 0x56, 0xcc, 0xbd, 0xd4, - 0xfe, 0xff, 0x8c, 0x2d, 0x34, 0xc0, 0xb6, 0xd0, 0xb7, 0xe4, 0x6c, 0xa1, 0x63, 0xde, 0x38, 0xbb, - 0x39, 0xab, 0x68, 0x90, 0x4d, 0x66, 0x26, 0xc7, 0x72, 0x2b, 0x68, 0x38, 0xcd, 0xf4, 0xd1, 0x77, - 0xc4, 0xa5, 0x74, 0x3c, 0xf3, 0xd8, 0x80, 0xb1, 0x45, 0xa7, 0xe5, 0xac, 0x7b, 0x4d, 0x2f, 0xf6, - 0x48, 0x84, 0x9e, 0x82, 0xa2, 0xe3, 0xba, 0x8c, 0xdb, 0x2a, 0x2d, 0x9c, 0x39, 0xd8, 0x2f, 0x17, - 0xe7, 0x5d, 0x7a, 0xed, 0x83, 0xc2, 0xda, 0xc3, 0x14, 0x03, 0x7d, 0x12, 0x06, 0xdc, 0x30, 0x68, - 0xcd, 0x14, 0x18, 0x26, 0xdd, 0x75, 0x03, 0x95, 0x30, 0x68, 0xa5, 0x50, 0x19, 0x8e, 0xfd, 0x6b, - 0x05, 0x38, 0xbf, 0x48, 0x5a, 0x5b, 0xcb, 0xf5, 0x9c, 0xf3, 0xfb, 0x0a, 0x8c, 0xec, 0x04, 0xbe, - 0x17, 0x07, 0x61, 0x24, 0x9a, 0x66, 0x2b, 0x62, 0x45, 0x94, 0x61, 0x05, 0x45, 0x97, 0x60, 0xa0, - 0x95, 0x30, 0x95, 0x63, 0x92, 0x21, 0x65, 0xec, 0x24, 0x83, 0x50, 0x8c, 0x76, 0x44, 0x42, 0xb1, - 0x62, 0x14, 0xc6, 0x9d, 0x88, 0x84, 0x98, 0x41, 0x92, 0x9b, 0x99, 0xde, 0xd9, 0xe2, 0x84, 0x4e, - 0xdd, 0xcc, 0x14, 0x82, 0x35, 0x2c, 0x54, 0x83, 0x52, 0x94, 0x9a, 0xd9, 0xbe, 0xb6, 0xe9, 0x38, - 0xbb, 0xba, 0xd5, 0x4c, 0x26, 0x44, 0x8c, 0x1b, 0x65, 0xa8, 0xe7, 0xd5, 0xfd, 0xd5, 0x02, 0x20, - 0x3e, 0x84, 0x7f, 0xc9, 0x06, 0xee, 0x4e, 0xe7, 0xc0, 0xf5, 0xbf, 0x25, 0x8e, 0x6b, 0xf4, 0xfe, - 0xb7, 0x05, 0xe7, 0x17, 0x3d, 0xdf, 0x25, 0x61, 0xce, 0x02, 0x7c, 0x34, 0xb2, 0xec, 0xd1, 0x98, - 0x06, 0x63, 0x89, 0x0d, 0x1c, 0xc3, 0x12, 0xb3, 0xff, 0xc4, 0x02, 0xc4, 0x3f, 0xfb, 0x23, 0xf7, - 0xb1, 0x77, 0x3a, 0x3f, 0xf6, 0x18, 0x96, 0x85, 0x7d, 0x0b, 0x26, 0x16, 0x9b, 0x1e, 0xf1, 0xe3, - 0x6a, 0x6d, 0x31, 0xf0, 0x37, 0xbc, 0x4d, 0xf4, 0x19, 0x98, 0x88, 0xbd, 0x1d, 0x12, 0xb4, 0xe3, - 0x3a, 0x69, 0x04, 0x3e, 0x93, 0x24, 0xad, 0x2b, 0x83, 0x0b, 0xe8, 0x60, 0xbf, 0x3c, 0xb1, 0x66, - 0x40, 0x70, 0x0a, 0xd3, 0xfe, 0x5d, 0x3a, 0x7e, 0xc1, 0x4e, 0x2b, 0xf0, 0x89, 0x1f, 0x2f, 0x06, - 0xbe, 0xcb, 0x35, 0x0e, 0x9f, 0x81, 0x81, 0x98, 0x8e, 0x07, 0x1f, 0xbb, 0xcb, 0x72, 0xa3, 0xd0, - 0x51, 0x38, 0xdc, 0x2f, 0x9f, 0xed, 0xac, 0xc1, 0xc6, 0x89, 0xd5, 0x41, 0xdf, 0x02, 0x43, 0x51, - 0xec, 0xc4, 0xed, 0x48, 0x8c, 0xe6, 0x13, 0x72, 0x34, 0xeb, 0xac, 0xf4, 0x70, 0xbf, 0x3c, 0xa9, - 0xaa, 0xf1, 0x22, 0x2c, 0x2a, 0xa0, 0xa7, 0x61, 0x78, 0x87, 0x44, 0x91, 0xb3, 0x29, 0x6f, 0xc3, - 0x49, 0x51, 0x77, 0x78, 0x85, 0x17, 0x63, 0x09, 0x47, 0x4f, 0xc2, 0x20, 0x09, 0xc3, 0x20, 0x14, - 0x7b, 0x74, 0x5c, 0x20, 0x0e, 0x2e, 0xd1, 0x42, 0xcc, 0x61, 0xf6, 0x7f, 0xb0, 0x60, 0x52, 0xf5, - 0x95, 0xb7, 0x75, 0x02, 0x52, 0xc1, 0x5b, 0x00, 0x0d, 0xf9, 0x81, 0x11, 0xbb, 0x3d, 0x46, 0xaf, - 0x5d, 0xce, 0xbc, 0xa8, 0x3b, 0x86, 0x31, 0xa1, 0xac, 0x8a, 0x22, 0xac, 0x51, 0xb3, 0xff, 0xa5, - 0x05, 0xa7, 0x52, 0x5f, 0x74, 0xcb, 0x8b, 0x62, 0xf4, 0x76, 0xc7, 0x57, 0xcd, 0xf5, 0xf7, 0x55, - 0xb4, 0x36, 0xfb, 0x26, 0xb5, 0x94, 0x65, 0x89, 0xf6, 0x45, 0x37, 0x60, 0xd0, 0x8b, 0xc9, 0x8e, - 0xfc, 0x98, 0x27, 0xbb, 0x7e, 0x0c, 0xef, 0x55, 0x32, 0x23, 0x55, 0x5a, 0x13, 0x73, 0x02, 0xf6, - 0xdf, 0x2a, 0x42, 0x89, 0x2f, 0xdb, 0x15, 0xa7, 0x75, 0x02, 0x73, 0x51, 0x85, 0x01, 0x46, 0x9d, - 0x77, 0xfc, 0xa9, 0xec, 0x8e, 0x8b, 0xee, 0xcc, 0x51, 0x91, 0x9f, 0x33, 0x47, 0xea, 0x6a, 0xa0, - 0x45, 0x98, 0x91, 0x40, 0x0e, 0xc0, 0xba, 0xe7, 0x3b, 0xe1, 0x1e, 0x2d, 0x9b, 0x29, 0x32, 0x82, - 0xcf, 0x75, 0x27, 0xb8, 0xa0, 0xf0, 0x39, 0x59, 0xd5, 0xd7, 0x04, 0x80, 0x35, 0xa2, 0xb3, 0x2f, - 0x43, 0x49, 0x21, 0x1f, 0x85, 0xc7, 0x99, 0xfd, 0x2c, 0x4c, 0xa6, 0xda, 0xea, 0x55, 0x7d, 0x4c, - 0x67, 0x91, 0x7e, 0x85, 0x9d, 0x02, 0xa2, 0xd7, 0x4b, 0xfe, 0xae, 0x38, 0x45, 0xdf, 0x87, 0xd3, - 0xcd, 0x8c, 0xc3, 0x49, 0x4c, 0x55, 0xff, 0x87, 0xd9, 0x79, 0xf1, 0xd9, 0xa7, 0xb3, 0xa0, 0x38, - 0xb3, 0x0d, 0x7a, 0xed, 0x07, 0x2d, 0xba, 0xe6, 0x9d, 0xa6, 0xce, 0x41, 0xdf, 0x16, 0x65, 0x58, - 0x41, 0xe9, 0x11, 0x76, 0x5a, 0x75, 0xfe, 0x26, 0xd9, 0xab, 0x93, 0x26, 0x69, 0xc4, 0x41, 0xf8, - 0xa1, 0x76, 0xff, 0x02, 0x1f, 0x7d, 0x7e, 0x02, 0x8e, 0x0a, 0x02, 0xc5, 0x9b, 0x64, 0x8f, 0x4f, - 0x85, 0xfe, 0x75, 0xc5, 0xae, 0x5f, 0xf7, 0x73, 0x16, 0x8c, 0xab, 0xaf, 0x3b, 0x81, 0xad, 0xbe, - 0x60, 0x6e, 0xf5, 0x0b, 0x5d, 0x17, 0x78, 0xce, 0x26, 0xff, 0x6a, 0x01, 0xce, 0x29, 0x1c, 0xca, - 0xee, 0xf3, 0x3f, 0x62, 0x55, 0x5d, 0x85, 0x92, 0xaf, 0x14, 0x51, 0x96, 0xa9, 0x01, 0x4a, 0xd4, - 0x50, 0x09, 0x0e, 0xe5, 0xda, 0xfc, 0x44, 0x5b, 0x34, 0xa6, 0x6b, 0x68, 0x85, 0x36, 0x76, 0x01, - 0x8a, 0x6d, 0xcf, 0x15, 0x77, 0xc6, 0xa7, 0xe4, 0x68, 0xdf, 0xa9, 0x56, 0x0e, 0xf7, 0xcb, 0x4f, - 0xe4, 0xbd, 0x0e, 0xd0, 0xcb, 0x2a, 0x9a, 0xbb, 0x53, 0xad, 0x60, 0x5a, 0x19, 0xcd, 0xc3, 0xa4, - 0x7c, 0x00, 0xb9, 0x4b, 0x39, 0xa8, 0xc0, 0x17, 0x57, 0x8b, 0x52, 0xb3, 0x62, 0x13, 0x8c, 0xd3, - 0xf8, 0xa8, 0x02, 0x53, 0xdb, 0xed, 0x75, 0xd2, 0x24, 0x31, 0xff, 0xe0, 0x9b, 0x84, 0x2b, 0x21, - 0x4b, 0x89, 0xb0, 0x75, 0x33, 0x05, 0xc7, 0x1d, 0x35, 0xec, 0xbf, 0x60, 0x47, 0xbc, 0x18, 0xbd, - 0x5a, 0x18, 0xd0, 0x85, 0x45, 0xa9, 0x7f, 0x98, 0xcb, 0xb9, 0x9f, 0x55, 0x71, 0x93, 0xec, 0xad, - 0x05, 0x94, 0xd9, 0xce, 0x5e, 0x15, 0xc6, 0x9a, 0x1f, 0xe8, 0xba, 0xe6, 0x7f, 0xa1, 0x00, 0x67, - 0xd4, 0x08, 0x18, 0x7c, 0xdd, 0x5f, 0xf6, 0x31, 0x78, 0x1e, 0x46, 0x5d, 0xb2, 0xe1, 0xb4, 0x9b, - 0xb1, 0xd2, 0x88, 0x0f, 0xf2, 0x57, 0x91, 0x4a, 0x52, 0x8c, 0x75, 0x9c, 0x23, 0x0c, 0xdb, 0x4f, - 0x8c, 0xb2, 0xbb, 0x35, 0x76, 0xe8, 0x1a, 0x57, 0xbb, 0xc6, 0xca, 0xdd, 0x35, 0x4f, 0xc2, 0xa0, - 0xb7, 0x43, 0x79, 0xad, 0x82, 0xc9, 0x42, 0x55, 0x69, 0x21, 0xe6, 0x30, 0xf4, 0x09, 0x18, 0x6e, - 0x04, 0x3b, 0x3b, 0x8e, 0xef, 0xb2, 0x2b, 0xaf, 0xb4, 0x30, 0x4a, 0xd9, 0xb1, 0x45, 0x5e, 0x84, - 0x25, 0x0c, 0x9d, 0x87, 0x01, 0x27, 0xdc, 0xe4, 0x6a, 0x89, 0xd2, 0xc2, 0x08, 0x6d, 0x69, 0x3e, - 0xdc, 0x8c, 0x30, 0x2b, 0xa5, 0x52, 0xd5, 0xfd, 0x20, 0xdc, 0xf6, 0xfc, 0xcd, 0x8a, 0x17, 0x8a, - 0x2d, 0xa1, 0xee, 0xc2, 0x7b, 0x0a, 0x82, 0x35, 0x2c, 0xb4, 0x0c, 0x83, 0xad, 0x20, 0x8c, 0xa3, - 0x99, 0x21, 0x36, 0xdc, 0x4f, 0xe4, 0x1c, 0x44, 0xfc, 0x6b, 0x6b, 0x41, 0x18, 0x27, 0x1f, 0x40, - 0xff, 0x45, 0x98, 0x57, 0x47, 0xdf, 0x02, 0x45, 0xe2, 0xef, 0xce, 0x0c, 0x33, 0x2a, 0xb3, 0x59, - 0x54, 0x96, 0xfc, 0xdd, 0xbb, 0x4e, 0x98, 0x9c, 0xd2, 0x4b, 0xfe, 0x2e, 0xa6, 0x75, 0xd0, 0xe7, - 0xa1, 0x24, 0xb7, 0x78, 0x24, 0x34, 0x66, 0x99, 0x4b, 0x4c, 0x1e, 0x0c, 0x98, 0xbc, 0xd7, 0xf6, - 0x42, 0xb2, 0x43, 0xfc, 0x38, 0x4a, 0xce, 0x34, 0x09, 0x8d, 0x70, 0x42, 0x0d, 0x7d, 0x5e, 0xaa, - 0x69, 0x57, 0x82, 0xb6, 0x1f, 0x47, 0x33, 0x25, 0xd6, 0xbd, 0xcc, 0x07, 0xb4, 0xbb, 0x09, 0x5e, - 0x5a, 0x8f, 0xcb, 0x2b, 0x63, 0x83, 0x14, 0xc2, 0x30, 0xde, 0xf4, 0x76, 0x89, 0x4f, 0xa2, 0xa8, - 0x16, 0x06, 0xeb, 0x64, 0x06, 0x58, 0xcf, 0xcf, 0x65, 0xbf, 0x2b, 0x05, 0xeb, 0x64, 0x61, 0xfa, - 0x60, 0xbf, 0x3c, 0x7e, 0x4b, 0xaf, 0x83, 0x4d, 0x12, 0xe8, 0x0e, 0x4c, 0x50, 0xb9, 0xc6, 0x4b, - 0x88, 0x8e, 0xf6, 0x22, 0xca, 0xa4, 0x0f, 0x6c, 0x54, 0xc2, 0x29, 0x22, 0xe8, 0x0d, 0x28, 0x35, - 0xbd, 0x0d, 0xd2, 0xd8, 0x6b, 0x34, 0xc9, 0xcc, 0x18, 0xa3, 0x98, 0xb9, 0xad, 0x6e, 0x49, 0x24, - 0x2e, 0x17, 0xa9, 0xbf, 0x38, 0xa9, 0x8e, 0xee, 0xc2, 0xd9, 0x98, 0x84, 0x3b, 0x9e, 0xef, 0xd0, - 0xed, 0x20, 0xe4, 0x05, 0xf6, 0x3a, 0x37, 0xce, 0xd6, 0xdb, 0x45, 0x31, 0x74, 0x67, 0xd7, 0x32, - 0xb1, 0x70, 0x4e, 0x6d, 0x74, 0x1b, 0x26, 0xd9, 0x4e, 0xa8, 0xb5, 0x9b, 0xcd, 0x5a, 0xd0, 0xf4, - 0x1a, 0x7b, 0x33, 0x13, 0x8c, 0xe0, 0x27, 0xe4, 0xbd, 0x50, 0x35, 0xc1, 0x87, 0xfb, 0x65, 0x48, - 0xfe, 0xe1, 0x74, 0x6d, 0xb4, 0xce, 0x9e, 0x63, 0xda, 0xa1, 0x17, 0xef, 0xd1, 0xf5, 0x4b, 0x1e, - 0xc4, 0x33, 0x93, 0x5d, 0x45, 0x61, 0x1d, 0x55, 0xbd, 0xd9, 0xe8, 0x85, 0x38, 0x4d, 0x90, 0x6e, - 0xed, 0x28, 0x76, 0x3d, 0x7f, 0x66, 0x8a, 0x9d, 0x18, 0x6a, 0x67, 0xd4, 0x69, 0x21, 0xe6, 0x30, - 0xf6, 0x14, 0x43, 0x7f, 0xdc, 0xa6, 0x27, 0xe8, 0x34, 0x43, 0x4c, 0x9e, 0x62, 0x24, 0x00, 0x27, - 0x38, 0x94, 0xa9, 0x89, 0xe3, 0xbd, 0x19, 0xc4, 0x50, 0xd5, 0x76, 0x59, 0x5b, 0xfb, 0x3c, 0xa6, - 0xe5, 0xe8, 0x16, 0x0c, 0x13, 0x7f, 0x77, 0x39, 0x0c, 0x76, 0x66, 0x4e, 0xe5, 0xef, 0xd9, 0x25, - 0x8e, 0xc2, 0x0f, 0xf4, 0x44, 0xc0, 0x13, 0xc5, 0x58, 0x92, 0x40, 0x0f, 0x60, 0x26, 0x63, 0x46, - 0xf8, 0x04, 0x9c, 0x66, 0x13, 0xf0, 0x9a, 0xa8, 0x3b, 0xb3, 0x96, 0x83, 0x77, 0xd8, 0x05, 0x86, - 0x73, 0xa9, 0xa3, 0x2f, 0xc0, 0x38, 0xdf, 0x50, 0xfc, 0x1d, 0x37, 0x9a, 0x39, 0xc3, 0xbe, 0xe6, - 0x52, 0xfe, 0xe6, 0xe4, 0x88, 0x0b, 0x67, 0x44, 0x87, 0xc6, 0xf5, 0xd2, 0x08, 0x9b, 0xd4, 0xec, - 0x75, 0x98, 0x50, 0xe7, 0x16, 0x5b, 0x3a, 0xa8, 0x0c, 0x83, 0x8c, 0xdb, 0x11, 0xfa, 0xad, 0x12, - 0x9d, 0x29, 0xc6, 0x09, 0x61, 0x5e, 0xce, 0x66, 0xca, 0x7b, 0x9f, 0x2c, 0xec, 0xc5, 0x84, 0x4b, - 0xd5, 0x45, 0x6d, 0xa6, 0x24, 0x00, 0x27, 0x38, 0xf6, 0xff, 0xe5, 0x5c, 0x63, 0x72, 0x38, 0xf6, - 0x71, 0x1d, 0x3c, 0x0b, 0x23, 0x5b, 0x41, 0x14, 0x53, 0x6c, 0xd6, 0xc6, 0x60, 0xc2, 0x27, 0xde, - 0x10, 0xe5, 0x58, 0x61, 0xa0, 0x57, 0x61, 0xbc, 0xa1, 0x37, 0x20, 0xee, 0x32, 0x35, 0x04, 0x46, - 0xeb, 0xd8, 0xc4, 0x45, 0xaf, 0xc0, 0x08, 0xb3, 0xc2, 0x68, 0x04, 0x4d, 0xc1, 0x64, 0xc9, 0x0b, - 0x79, 0xa4, 0x26, 0xca, 0x0f, 0xb5, 0xdf, 0x58, 0x61, 0xa3, 0xcb, 0x30, 0x44, 0xbb, 0x50, 0xad, - 0x89, 0x5b, 0x44, 0xa9, 0x6a, 0x6e, 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0xdf, 0x2c, 0x68, 0xa3, 0x4c, - 0x25, 0x52, 0x82, 0x6a, 0x30, 0x7c, 0xdf, 0xf1, 0x62, 0xcf, 0xdf, 0x14, 0xec, 0xc2, 0xd3, 0x5d, - 0xaf, 0x14, 0x56, 0xe9, 0x1e, 0xaf, 0xc0, 0x2f, 0x3d, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, 0xd8, - 0xf6, 0x7d, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, 0xd0, - 0xdb, 0x00, 0x72, 0x59, 0x12, 0x57, 0x58, 0x3f, 0x3c, 0xdb, 0x9b, 0xe8, 0x9a, 0xaa, 0xb3, 0x30, - 0x41, 0xaf, 0xd4, 0xe4, 0x3f, 0xd6, 0xe8, 0xd9, 0x31, 0x63, 0xab, 0x3a, 0x3b, 0x83, 0xbe, 0x9d, - 0x9e, 0x04, 0x4e, 0x18, 0x13, 0x77, 0x3e, 0x16, 0x83, 0xf3, 0xc9, 0xfe, 0x64, 0x8a, 0x35, 0x6f, - 0x87, 0xe8, 0xa7, 0x86, 0x20, 0x82, 0x13, 0x7a, 0xf6, 0x2f, 0x15, 0x61, 0x26, 0xaf, 0xbb, 0x74, - 0xd1, 0x91, 0x07, 0x5e, 0xbc, 0x48, 0xb9, 0x21, 0xcb, 0x5c, 0x74, 0x4b, 0xa2, 0x1c, 0x2b, 0x0c, - 0x3a, 0xfb, 0x91, 0xb7, 0x29, 0x45, 0xc2, 0xc1, 0x64, 0xf6, 0xeb, 0xac, 0x14, 0x0b, 0x28, 0xc5, - 0x0b, 0x89, 0x13, 0x09, 0xf3, 0x1a, 0x6d, 0x95, 0x60, 0x56, 0x8a, 0x05, 0x54, 0xd7, 0x37, 0x0d, - 0xf4, 0xd0, 0x37, 0x19, 0x43, 0x34, 0x78, 0xbc, 0x43, 0x84, 0xbe, 0x08, 0xb0, 0xe1, 0xf9, 0x5e, - 0xb4, 0xc5, 0xa8, 0x0f, 0x1d, 0x99, 0xba, 0xe2, 0xa5, 0x96, 0x15, 0x15, 0xac, 0x51, 0x44, 0x2f, - 0xc1, 0xa8, 0xda, 0x80, 0xd5, 0x0a, 0x7b, 0x6b, 0xd4, 0x6c, 0x37, 0x92, 0xd3, 0xa8, 0x82, 0x75, - 0x3c, 0xfb, 0xdd, 0xf4, 0x7a, 0x11, 0x3b, 0x40, 0x1b, 0x5f, 0xab, 0xdf, 0xf1, 0x2d, 0x74, 0x1f, - 0x5f, 0xfb, 0xd7, 0x8b, 0x30, 0x69, 0x34, 0xd6, 0x8e, 0xfa, 0x38, 0xb3, 0xae, 0xd3, 0x7b, 0xce, - 0x89, 0x89, 0xd8, 0x7f, 0x76, 0xef, 0xad, 0xa2, 0xdf, 0x85, 0x74, 0x07, 0xf0, 0xfa, 0xe8, 0x8b, - 0x50, 0x6a, 0x3a, 0x11, 0xd3, 0x5d, 0x11, 0xb1, 0xef, 0xfa, 0x21, 0x96, 0xc8, 0x11, 0x4e, 0x14, - 0x6b, 0x57, 0x0d, 0xa7, 0x9d, 0x90, 0xa4, 0x17, 0x32, 0xe5, 0x7d, 0xa4, 0xfd, 0x96, 0xea, 0x04, - 0x65, 0x90, 0xf6, 0x30, 0x87, 0xa1, 0x57, 0x60, 0x2c, 0x24, 0x6c, 0x55, 0x2c, 0x52, 0x56, 0x8e, - 0x2d, 0xb3, 0xc1, 0x84, 0xe7, 0xc3, 0x1a, 0x0c, 0x1b, 0x98, 0x09, 0x2b, 0x3f, 0xd4, 0x85, 0x95, - 0x7f, 0x1a, 0x86, 0xd9, 0x0f, 0xb5, 0x02, 0xd4, 0x6c, 0x54, 0x79, 0x31, 0x96, 0xf0, 0xf4, 0x82, - 0x19, 0xe9, 0x73, 0xc1, 0x7c, 0x12, 0x26, 0x2a, 0x0e, 0xd9, 0x09, 0xfc, 0x25, 0xdf, 0x6d, 0x05, - 0x9e, 0x1f, 0xa3, 0x19, 0x18, 0x60, 0xb7, 0x03, 0xdf, 0xdb, 0x03, 0x94, 0x02, 0x1e, 0xa0, 0x8c, - 0xb9, 0xbd, 0x09, 0x67, 0x2a, 0xc1, 0x7d, 0xff, 0xbe, 0x13, 0xba, 0xf3, 0xb5, 0xaa, 0x26, 0xe7, - 0xae, 0x4a, 0x39, 0x8b, 0xdb, 0x43, 0x65, 0x9e, 0xa9, 0x5a, 0x4d, 0x7e, 0xd7, 0x2e, 0x7b, 0x4d, - 0x92, 0xa3, 0x8d, 0xf8, 0x3b, 0x05, 0xa3, 0xa5, 0x04, 0x5f, 0x3d, 0x18, 0x59, 0xb9, 0x0f, 0x46, - 0x6f, 0xc2, 0xc8, 0x86, 0x47, 0x9a, 0x2e, 0x26, 0x1b, 0x62, 0x89, 0x3d, 0x95, 0x6f, 0xe2, 0xb1, - 0x4c, 0x31, 0xa5, 0xf6, 0x89, 0x4b, 0x69, 0xcb, 0xa2, 0x32, 0x56, 0x64, 0xd0, 0x36, 0x4c, 0x49, - 0x31, 0x40, 0x42, 0xc5, 0x82, 0x7b, 0xba, 0x9b, 0x6c, 0x61, 0x12, 0x3f, 0x7d, 0xb0, 0x5f, 0x9e, - 0xc2, 0x29, 0x32, 0xb8, 0x83, 0x30, 0x15, 0xcb, 0x76, 0xe8, 0xd1, 0x3a, 0xc0, 0x86, 0x9f, 0x89, - 0x65, 0x4c, 0xc2, 0x64, 0xa5, 0xf6, 0x8f, 0x5a, 0xf0, 0x58, 0xc7, 0xc8, 0x08, 0x49, 0xfb, 0x98, - 0x67, 0x21, 0x2d, 0xf9, 0x16, 0x7a, 0x4b, 0xbe, 0xf6, 0xcf, 0x5a, 0x70, 0x7a, 0x69, 0xa7, 0x15, - 0xef, 0x55, 0x3c, 0xf3, 0x75, 0xe7, 0x65, 0x18, 0xda, 0x21, 0xae, 0xd7, 0xde, 0x11, 0x33, 0x57, - 0x96, 0xc7, 0xcf, 0x0a, 0x2b, 0x3d, 0xdc, 0x2f, 0x8f, 0xd7, 0xe3, 0x20, 0x74, 0x36, 0x09, 0x2f, - 0xc0, 0x02, 0x9d, 0x1d, 0xe2, 0xde, 0xfb, 0xe4, 0x96, 0xb7, 0xe3, 0x49, 0x93, 0x9d, 0xae, 0xba, - 0xb3, 0x39, 0x39, 0xa0, 0x73, 0x6f, 0xb6, 0x1d, 0x3f, 0xf6, 0xe2, 0x3d, 0xf1, 0x30, 0x23, 0x89, - 0xe0, 0x84, 0x9e, 0xfd, 0x75, 0x0b, 0x26, 0xe5, 0xba, 0x9f, 0x77, 0xdd, 0x90, 0x44, 0x11, 0x9a, - 0x85, 0x82, 0xd7, 0x12, 0xbd, 0x04, 0xd1, 0xcb, 0x42, 0xb5, 0x86, 0x0b, 0x5e, 0x0b, 0xd5, 0xa0, - 0xc4, 0x2d, 0x7f, 0x92, 0xc5, 0xd5, 0x97, 0xfd, 0x10, 0xeb, 0xc1, 0x9a, 0xac, 0x89, 0x13, 0x22, - 0x92, 0x83, 0x63, 0x67, 0x66, 0xd1, 0x7c, 0xf5, 0xba, 0x21, 0xca, 0xb1, 0xc2, 0x40, 0x57, 0x60, - 0xc4, 0x0f, 0x5c, 0x6e, 0x88, 0xc5, 0x6f, 0x3f, 0xb6, 0x64, 0x57, 0x45, 0x19, 0x56, 0x50, 0xfb, - 0x07, 0x2d, 0x18, 0x93, 0x5f, 0xd6, 0x27, 0x33, 0x49, 0xb7, 0x56, 0xc2, 0x48, 0x26, 0x5b, 0x8b, - 0x32, 0x83, 0x0c, 0x62, 0xf0, 0x80, 0xc5, 0xa3, 0xf0, 0x80, 0xf6, 0x8f, 0x14, 0x60, 0x42, 0x76, - 0xa7, 0xde, 0x5e, 0x8f, 0x48, 0x8c, 0xd6, 0xa0, 0xe4, 0xf0, 0x21, 0x27, 0x72, 0xc5, 0x3e, 0x99, - 0x2d, 0x7c, 0x18, 0xf3, 0x93, 0x5c, 0xcb, 0xf3, 0xb2, 0x36, 0x4e, 0x08, 0xa1, 0x26, 0x4c, 0xfb, - 0x41, 0xcc, 0x8e, 0x68, 0x05, 0xef, 0xf6, 0x04, 0x92, 0xa6, 0x7e, 0x4e, 0x50, 0x9f, 0x5e, 0x4d, - 0x53, 0xc1, 0x9d, 0x84, 0xd1, 0x92, 0x54, 0x78, 0x14, 0xf3, 0xc5, 0x0d, 0x7d, 0x16, 0xb2, 0xf5, - 0x1d, 0xf6, 0xaf, 0x5a, 0x50, 0x92, 0x68, 0x27, 0xf1, 0xda, 0xb5, 0x02, 0xc3, 0x11, 0x9b, 0x04, - 0x39, 0x34, 0x76, 0xb7, 0x8e, 0xf3, 0xf9, 0x4a, 0x6e, 0x1e, 0xfe, 0x3f, 0xc2, 0x92, 0x06, 0xd3, - 0x77, 0xab, 0xee, 0x7f, 0x44, 0xf4, 0xdd, 0xaa, 0x3f, 0x39, 0x37, 0xcc, 0x1f, 0xb2, 0x3e, 0x6b, - 0x62, 0x2d, 0x65, 0x90, 0x5a, 0x21, 0xd9, 0xf0, 0x1e, 0xa4, 0x19, 0xa4, 0x1a, 0x2b, 0xc5, 0x02, - 0x8a, 0xde, 0x86, 0xb1, 0x86, 0x54, 0x74, 0x26, 0xc7, 0xc0, 0xe5, 0xae, 0x4a, 0x77, 0xf5, 0x3e, - 0xc3, 0x8d, 0xb4, 0x17, 0xb5, 0xfa, 0xd8, 0xa0, 0x66, 0x3e, 0xb7, 0x17, 0x7b, 0x3d, 0xb7, 0x27, - 0x74, 0xf3, 0x1f, 0x9f, 0x7f, 0xcc, 0x82, 0x21, 0xae, 0x2e, 0xeb, 0x4f, 0xbf, 0xa8, 0x3d, 0x57, - 0x25, 0x63, 0x77, 0x97, 0x16, 0x8a, 0xe7, 0x27, 0xb4, 0x02, 0x25, 0xf6, 0x83, 0xa9, 0x0d, 0x8a, - 0xf9, 0xd6, 0xe9, 0xbc, 0x55, 0xbd, 0x83, 0x77, 0x65, 0x35, 0x9c, 0x50, 0xb0, 0x7f, 0xa8, 0x48, - 0x8f, 0xaa, 0x04, 0xd5, 0xb8, 0xc1, 0xad, 0x47, 0x77, 0x83, 0x17, 0x1e, 0xd5, 0x0d, 0xbe, 0x09, - 0x93, 0x0d, 0xed, 0x71, 0x2b, 0x99, 0xc9, 0x2b, 0x5d, 0x17, 0x89, 0xf6, 0x0e, 0xc6, 0x55, 0x46, - 0x8b, 0x26, 0x11, 0x9c, 0xa6, 0x8a, 0xbe, 0x1d, 0xc6, 0xf8, 0x3c, 0x8b, 0x56, 0xb8, 0xc5, 0xc2, - 0x27, 0xf2, 0xd7, 0x8b, 0xde, 0x04, 0x5b, 0x89, 0x75, 0xad, 0x3a, 0x36, 0x88, 0xd9, 0xbf, 0x34, - 0x02, 0x83, 0x4b, 0xbb, 0xc4, 0x8f, 0x4f, 0xe0, 0x40, 0x6a, 0xc0, 0x84, 0xe7, 0xef, 0x06, 0xcd, - 0x5d, 0xe2, 0x72, 0xf8, 0x51, 0x2e, 0xd7, 0xb3, 0x82, 0xf4, 0x44, 0xd5, 0x20, 0x81, 0x53, 0x24, - 0x1f, 0x85, 0x84, 0x79, 0x1d, 0x86, 0xf8, 0xdc, 0x0b, 0xf1, 0x32, 0x53, 0x19, 0xcc, 0x06, 0x51, - 0xec, 0x82, 0x44, 0xfa, 0xe5, 0xda, 0x67, 0x51, 0x1d, 0xbd, 0x0b, 0x13, 0x1b, 0x5e, 0x18, 0xc5, - 0x54, 0x34, 0x8c, 0x62, 0x67, 0xa7, 0xf5, 0x10, 0x12, 0xa5, 0x1a, 0x87, 0x65, 0x83, 0x12, 0x4e, - 0x51, 0x46, 0x9b, 0x30, 0x4e, 0x85, 0x9c, 0xa4, 0xa9, 0xe1, 0x23, 0x37, 0xa5, 0x54, 0x46, 0xb7, - 0x74, 0x42, 0xd8, 0xa4, 0x4b, 0x0f, 0x93, 0x06, 0x13, 0x8a, 0x46, 0x18, 0x47, 0xa1, 0x0e, 0x13, - 0x2e, 0x0d, 0x71, 0x18, 0x3d, 0x93, 0x98, 0xd9, 0x4a, 0xc9, 0x3c, 0x93, 0x34, 0xe3, 0x94, 0x77, - 0xa0, 0x44, 0xe8, 0x10, 0x52, 0xc2, 0x42, 0x31, 0x7e, 0xb5, 0xbf, 0xbe, 0xae, 0x78, 0x8d, 0x30, - 0x30, 0x65, 0xf9, 0x25, 0x49, 0x09, 0x27, 0x44, 0xd1, 0x22, 0x0c, 0x45, 0x24, 0xf4, 0x48, 0x24, - 0x54, 0xe4, 0x5d, 0xa6, 0x91, 0xa1, 0x71, 0x8b, 0x4f, 0xfe, 0x1b, 0x8b, 0xaa, 0x74, 0x79, 0x39, - 0x4c, 0x1a, 0x62, 0x5a, 0x71, 0x6d, 0x79, 0xcd, 0xb3, 0x52, 0x2c, 0xa0, 0xe8, 0x0d, 0x18, 0x0e, - 0x49, 0x93, 0x29, 0x8b, 0xc6, 0xfb, 0x5f, 0xe4, 0x5c, 0xf7, 0xc4, 0xeb, 0x61, 0x49, 0x00, 0xdd, - 0x04, 0x14, 0x12, 0xca, 0x43, 0x78, 0xfe, 0xa6, 0x32, 0xe6, 0x10, 0xba, 0xee, 0xc7, 0x45, 0xfb, - 0xa7, 0x70, 0x82, 0x21, 0x8d, 0x6f, 0x71, 0x46, 0x35, 0x74, 0x1d, 0xa6, 0x55, 0x69, 0xd5, 0x8f, - 0x62, 0xc7, 0x6f, 0x10, 0xa6, 0xe6, 0x2e, 0x25, 0x5c, 0x11, 0x4e, 0x23, 0xe0, 0xce, 0x3a, 0xf6, - 0x4f, 0x53, 0x76, 0x86, 0x8e, 0xd6, 0x09, 0xf0, 0x02, 0xaf, 0x9b, 0xbc, 0xc0, 0xb9, 0xdc, 0x99, - 0xcb, 0xe1, 0x03, 0x0e, 0x2c, 0x18, 0xd5, 0x66, 0x36, 0x59, 0xb3, 0x56, 0x97, 0x35, 0xdb, 0x86, - 0x29, 0xba, 0xd2, 0x6f, 0xaf, 0x47, 0x24, 0xdc, 0x25, 0x2e, 0x5b, 0x98, 0x85, 0x87, 0x5b, 0x98, - 0xea, 0x95, 0xf9, 0x56, 0x8a, 0x20, 0xee, 0x68, 0x02, 0xbd, 0x2c, 0x35, 0x27, 0x45, 0xc3, 0x48, - 0x8b, 0x6b, 0x45, 0x0e, 0xf7, 0xcb, 0x53, 0xda, 0x87, 0xe8, 0x9a, 0x12, 0xfb, 0x1d, 0xf9, 0x8d, - 0xea, 0x35, 0xbf, 0xa1, 0x16, 0x4b, 0xea, 0x35, 0x5f, 0x2d, 0x07, 0x9c, 0xe0, 0xd0, 0x3d, 0x4a, - 0x45, 0x90, 0xf4, 0x6b, 0x3e, 0x15, 0x50, 0x30, 0x83, 0xd8, 0x2f, 0x00, 0x2c, 0x3d, 0x20, 0x0d, - 0xbe, 0xd4, 0xf5, 0x07, 0x48, 0x2b, 0xff, 0x01, 0xd2, 0xfe, 0x4f, 0x16, 0x4c, 0x2c, 0x2f, 0x1a, - 0x62, 0xe2, 0x1c, 0x00, 0x97, 0x8d, 0xee, 0xdd, 0x5b, 0x95, 0xba, 0x75, 0xae, 0x1e, 0x55, 0xa5, - 0x58, 0xc3, 0x40, 0xe7, 0xa0, 0xd8, 0x6c, 0xfb, 0x42, 0x64, 0x19, 0x3e, 0xd8, 0x2f, 0x17, 0x6f, - 0xb5, 0x7d, 0x4c, 0xcb, 0x34, 0x0b, 0xc1, 0x62, 0xdf, 0x16, 0x82, 0x3d, 0x3d, 0xf5, 0x50, 0x19, - 0x06, 0xef, 0xdf, 0xf7, 0x5c, 0xee, 0x0f, 0x21, 0xf4, 0xfe, 0xf7, 0xee, 0x55, 0x2b, 0x11, 0xe6, - 0xe5, 0xf6, 0x57, 0x8a, 0x30, 0xbb, 0xdc, 0x24, 0x0f, 0x3e, 0xa0, 0x4f, 0x48, 0xbf, 0xf6, 0x8d, - 0x47, 0xe3, 0x17, 0x8f, 0x6a, 0xc3, 0xda, 0x7b, 0x3c, 0x36, 0x60, 0x98, 0x3f, 0x66, 0x4b, 0x0f, - 0x91, 0x57, 0xb3, 0x5a, 0xcf, 0x1f, 0x90, 0x39, 0xfe, 0x28, 0x2e, 0x0c, 0xdc, 0xd5, 0x4d, 0x2b, - 0x4a, 0xb1, 0x24, 0x3e, 0xfb, 0x19, 0x18, 0xd3, 0x31, 0x8f, 0x64, 0x4d, 0xfe, 0x57, 0x8a, 0x30, - 0x45, 0x7b, 0xf0, 0x48, 0x27, 0xe2, 0x4e, 0xe7, 0x44, 0x1c, 0xb7, 0x45, 0x71, 0xef, 0xd9, 0x78, - 0x3b, 0x3d, 0x1b, 0xcf, 0xe7, 0xcd, 0xc6, 0x49, 0xcf, 0xc1, 0xf7, 0x58, 0x70, 0x6a, 0xb9, 0x19, - 0x34, 0xb6, 0x53, 0x56, 0xbf, 0x2f, 0xc1, 0x28, 0x3d, 0xc7, 0x23, 0xc3, 0x21, 0xcd, 0x70, 0x51, - 0x14, 0x20, 0xac, 0xe3, 0x69, 0xd5, 0xee, 0xdc, 0xa9, 0x56, 0xb2, 0x3c, 0x1b, 0x05, 0x08, 0xeb, - 0x78, 0xf6, 0xd7, 0x2c, 0xb8, 0x70, 0x7d, 0x71, 0x29, 0x59, 0x8a, 0x1d, 0xce, 0x95, 0x54, 0x0a, - 0x74, 0xb5, 0xae, 0x24, 0x52, 0x60, 0x85, 0xf5, 0x42, 0x40, 0x3f, 0x2a, 0x8e, 0xc3, 0x3f, 0x65, - 0xc1, 0xa9, 0xeb, 0x5e, 0x4c, 0xaf, 0xe5, 0xb4, 0x9b, 0x1f, 0xbd, 0x97, 0x23, 0x2f, 0x0e, 0xc2, - 0xbd, 0xb4, 0x9b, 0x1f, 0x56, 0x10, 0xac, 0x61, 0xf1, 0x96, 0x77, 0x3d, 0x66, 0x46, 0x55, 0x30, - 0x55, 0x51, 0x58, 0x94, 0x63, 0x85, 0x41, 0x3f, 0xcc, 0xf5, 0x42, 0x26, 0x4a, 0xec, 0x89, 0x13, - 0x56, 0x7d, 0x58, 0x45, 0x02, 0x70, 0x82, 0x63, 0xff, 0xb1, 0x05, 0xe5, 0xeb, 0xcd, 0x76, 0x14, - 0x93, 0x70, 0x23, 0xca, 0x39, 0x1d, 0x5f, 0x80, 0x12, 0x91, 0x82, 0xbb, 0xe8, 0xb5, 0x62, 0x35, - 0x95, 0x44, 0xcf, 0xbd, 0x0d, 0x15, 0x5e, 0x1f, 0x3e, 0x04, 0x47, 0x33, 0x02, 0x5f, 0x06, 0x44, - 0xf4, 0xb6, 0x74, 0xf7, 0x4b, 0xe6, 0xc7, 0xb5, 0xd4, 0x01, 0xc5, 0x19, 0x35, 0xec, 0x1f, 0xb5, - 0xe0, 0x8c, 0xfa, 0xe0, 0x8f, 0xdc, 0x67, 0xda, 0x3f, 0x5f, 0x80, 0xf1, 0x1b, 0x6b, 0x6b, 0xb5, - 0xeb, 0x24, 0x16, 0xd7, 0x76, 0x6f, 0xdd, 0x3a, 0xd6, 0x54, 0x84, 0xdd, 0xa4, 0xc0, 0x76, 0xec, - 0x35, 0xe7, 0xb8, 0x17, 0xff, 0x5c, 0xd5, 0x8f, 0x6f, 0x87, 0xf5, 0x38, 0xf4, 0xfc, 0xcd, 0x4c, - 0xa5, 0xa2, 0x64, 0x2e, 0x8a, 0x79, 0xcc, 0x05, 0x7a, 0x01, 0x86, 0x58, 0x18, 0x01, 0x39, 0x09, - 0x8f, 0x2b, 0x21, 0x8a, 0x95, 0x1e, 0xee, 0x97, 0x4b, 0x77, 0x70, 0x95, 0xff, 0xc1, 0x02, 0x15, - 0xdd, 0x81, 0xd1, 0xad, 0x38, 0x6e, 0xdd, 0x20, 0x8e, 0x4b, 0x42, 0x79, 0x1c, 0x5e, 0xcc, 0x3a, - 0x0e, 0xe9, 0x20, 0x70, 0xb4, 0xe4, 0x04, 0x49, 0xca, 0x22, 0xac, 0xd3, 0xb1, 0xeb, 0x00, 0x09, - 0xec, 0x98, 0x14, 0x2a, 0xf6, 0x1f, 0x58, 0x30, 0xcc, 0x3d, 0x3a, 0x43, 0xf4, 0x1a, 0x0c, 0x90, - 0x07, 0xa4, 0x21, 0x58, 0xe5, 0xcc, 0x0e, 0x27, 0x9c, 0x16, 0x7f, 0x1e, 0xa0, 0xff, 0x31, 0xab, - 0x85, 0x6e, 0xc0, 0x30, 0xed, 0xed, 0x75, 0xe5, 0xde, 0xfa, 0x44, 0xde, 0x17, 0xab, 0x69, 0xe7, - 0xcc, 0x99, 0x28, 0xc2, 0xb2, 0x3a, 0x53, 0x75, 0x37, 0x5a, 0x75, 0x7a, 0x62, 0xc7, 0xdd, 0x18, - 0x8b, 0xb5, 0xc5, 0x1a, 0x47, 0x12, 0xd4, 0xb8, 0xaa, 0x5b, 0x16, 0xe2, 0x84, 0x88, 0xbd, 0x06, - 0x25, 0x3a, 0xa9, 0xf3, 0x4d, 0xcf, 0xe9, 0xae, 0x65, 0x7f, 0x06, 0x4a, 0x52, 0xe3, 0x1d, 0x09, - 0x4f, 0x2e, 0x46, 0x55, 0x2a, 0xc4, 0x23, 0x9c, 0xc0, 0xed, 0x0d, 0x38, 0xcd, 0x4c, 0x1d, 0x9c, - 0x78, 0xcb, 0xd8, 0x63, 0xbd, 0x17, 0xf3, 0xb3, 0x42, 0xf2, 0xe4, 0x33, 0x33, 0xa3, 0x39, 0x4b, - 0x8c, 0x49, 0x8a, 0x89, 0x14, 0x6a, 0xff, 0xd1, 0x00, 0x3c, 0x5e, 0xad, 0xe7, 0x3b, 0xfb, 0xbe, - 0x02, 0x63, 0x9c, 0x2f, 0xa5, 0x4b, 0xdb, 0x69, 0x8a, 0x76, 0xd5, 0x43, 0xe0, 0x9a, 0x06, 0xc3, - 0x06, 0x26, 0xba, 0x00, 0x45, 0xef, 0x3d, 0x3f, 0x6d, 0x77, 0x5c, 0x7d, 0x73, 0x15, 0xd3, 0x72, - 0x0a, 0xa6, 0x2c, 0x2e, 0xbf, 0x3b, 0x14, 0x58, 0xb1, 0xb9, 0xaf, 0xc3, 0x84, 0x17, 0x35, 0x22, - 0xaf, 0xea, 0xd3, 0x73, 0x46, 0x3b, 0xa9, 0x94, 0x56, 0x84, 0x76, 0x5a, 0x41, 0x71, 0x0a, 0x5b, - 0xbb, 0xc8, 0x06, 0xfb, 0x66, 0x93, 0x7b, 0xba, 0x36, 0x51, 0x09, 0xa0, 0xc5, 0xbe, 0x2e, 0x62, - 0x56, 0x7c, 0x42, 0x02, 0xe0, 0x1f, 0x1c, 0x61, 0x09, 0xa3, 0x22, 0x67, 0x63, 0xcb, 0x69, 0xcd, - 0xb7, 0xe3, 0xad, 0x8a, 0x17, 0x35, 0x82, 0x5d, 0x12, 0xee, 0x31, 0x6d, 0xc1, 0x48, 0x22, 0x72, - 0x2a, 0xc0, 0xe2, 0x8d, 0xf9, 0x1a, 0xc5, 0xc4, 0x9d, 0x75, 0x4c, 0x36, 0x18, 0x8e, 0x83, 0x0d, - 0x9e, 0x87, 0x49, 0xd9, 0x4c, 0x9d, 0x44, 0xec, 0x52, 0x1c, 0x65, 0x1d, 0x53, 0xb6, 0xc5, 0xa2, - 0x58, 0x75, 0x2b, 0x8d, 0x8f, 0x5e, 0x86, 0x71, 0xcf, 0xf7, 0x62, 0xcf, 0x89, 0x83, 0x90, 0xb1, - 0x14, 0x5c, 0x31, 0xc0, 0x4c, 0xf7, 0xaa, 0x3a, 0x00, 0x9b, 0x78, 0xf6, 0x7f, 0x1b, 0x80, 0x69, - 0x36, 0x6d, 0xdf, 0x5c, 0x61, 0x1f, 0x99, 0x15, 0x76, 0xa7, 0x73, 0x85, 0x1d, 0x07, 0x7f, 0xff, - 0x61, 0x2e, 0xb3, 0x77, 0xa1, 0xa4, 0x8c, 0x9f, 0xa5, 0xf7, 0x83, 0x95, 0xe3, 0xfd, 0xd0, 0x9b, - 0xfb, 0x90, 0xef, 0xd6, 0xc5, 0xcc, 0x77, 0xeb, 0xbf, 0x67, 0x41, 0x62, 0x03, 0x8a, 0x6e, 0x40, - 0xa9, 0x15, 0x30, 0x3b, 0x8b, 0x50, 0x1a, 0x2f, 0x3d, 0x9e, 0x79, 0x51, 0xf1, 0x4b, 0x91, 0x8f, - 0x5f, 0x4d, 0xd6, 0xc0, 0x49, 0x65, 0xb4, 0x00, 0xc3, 0xad, 0x90, 0xd4, 0x63, 0xe6, 0xf3, 0xdb, - 0x93, 0x0e, 0x5f, 0x23, 0x1c, 0x1f, 0xcb, 0x8a, 0xf6, 0x2f, 0x58, 0x00, 0xfc, 0x69, 0xd8, 0xf1, - 0x37, 0xc9, 0x09, 0xa8, 0xbb, 0x2b, 0x30, 0x10, 0xb5, 0x48, 0xa3, 0x9b, 0x05, 0x4c, 0xd2, 0x9f, - 0x7a, 0x8b, 0x34, 0x92, 0x01, 0xa7, 0xff, 0x30, 0xab, 0x6d, 0x7f, 0x2f, 0xc0, 0x44, 0x82, 0x56, - 0x8d, 0xc9, 0x0e, 0x7a, 0xce, 0xf0, 0x01, 0x3c, 0x97, 0xf2, 0x01, 0x2c, 0x31, 0x6c, 0x4d, 0xb3, - 0xfa, 0x2e, 0x14, 0x77, 0x9c, 0x07, 0x42, 0x75, 0xf6, 0x4c, 0xf7, 0x6e, 0x50, 0xfa, 0x73, 0x2b, - 0xce, 0x03, 0x2e, 0x24, 0x3e, 0x23, 0x17, 0xc8, 0x8a, 0xf3, 0xe0, 0x90, 0xdb, 0xb9, 0xb0, 0x43, - 0xea, 0x96, 0x17, 0xc5, 0x5f, 0xfa, 0xaf, 0xc9, 0x7f, 0xb6, 0xec, 0x68, 0x23, 0xac, 0x2d, 0xcf, - 0x17, 0x0f, 0xa5, 0x7d, 0xb5, 0xe5, 0xf9, 0xe9, 0xb6, 0x3c, 0xbf, 0x8f, 0xb6, 0x3c, 0x1f, 0xbd, - 0x0f, 0xc3, 0xc2, 0x28, 0x41, 0xf8, 0xdc, 0x5f, 0xed, 0xa3, 0x3d, 0x61, 0xd3, 0xc0, 0xdb, 0xbc, - 0x2a, 0x85, 0x60, 0x51, 0xda, 0xb3, 0x5d, 0xd9, 0x20, 0xfa, 0xdb, 0x16, 0x4c, 0x88, 0xdf, 0x98, - 0xbc, 0xd7, 0x26, 0x51, 0x2c, 0x78, 0xcf, 0x4f, 0xf7, 0xdf, 0x07, 0x51, 0x91, 0x77, 0xe5, 0xd3, - 0xf2, 0x98, 0x35, 0x81, 0x3d, 0x7b, 0x94, 0xea, 0x05, 0xfa, 0x27, 0x16, 0x9c, 0xde, 0x71, 0x1e, - 0xf0, 0x16, 0x79, 0x19, 0x76, 0x62, 0x2f, 0x10, 0xc6, 0xfa, 0xaf, 0xf5, 0x37, 0xfd, 0x1d, 0xd5, - 0x79, 0x27, 0xa5, 0x5d, 0xef, 0xe9, 0x2c, 0x94, 0x9e, 0x5d, 0xcd, 0xec, 0xd7, 0xec, 0x06, 0x8c, - 0xc8, 0xf5, 0x96, 0xa1, 0x6a, 0xa8, 0xe8, 0x8c, 0xf5, 0x91, 0x6d, 0x42, 0x74, 0x47, 0x3c, 0xda, - 0x8e, 0x58, 0x6b, 0x8f, 0xb4, 0x9d, 0x77, 0x61, 0x4c, 0x5f, 0x63, 0x8f, 0xb4, 0xad, 0xf7, 0xe0, - 0x54, 0xc6, 0x5a, 0x7a, 0xa4, 0x4d, 0xde, 0x87, 0x73, 0xb9, 0xeb, 0xe3, 0x51, 0x36, 0x6c, 0xff, - 0xbc, 0xa5, 0x9f, 0x83, 0x27, 0xf0, 0xe6, 0xb0, 0x68, 0xbe, 0x39, 0x5c, 0xec, 0xbe, 0x73, 0x72, - 0x1e, 0x1e, 0xde, 0xd6, 0x3b, 0x4d, 0x4f, 0x75, 0xf4, 0x06, 0x0c, 0x35, 0x69, 0x89, 0xb4, 0x86, - 0xb1, 0x7b, 0xef, 0xc8, 0x84, 0x97, 0x62, 0xe5, 0x11, 0x16, 0x14, 0xec, 0x5f, 0xb6, 0x60, 0xe0, - 0x04, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x5c, 0x2e, 0x69, 0x11, 0x0e, 0x70, 0x0e, 0x3b, 0xf7, 0x97, - 0x1e, 0xc4, 0xc4, 0x8f, 0x98, 0xa8, 0x98, 0x39, 0x30, 0xdf, 0x01, 0xa7, 0x6e, 0x05, 0x8e, 0xbb, - 0xe0, 0x34, 0x1d, 0xbf, 0x41, 0xc2, 0xaa, 0xbf, 0xd9, 0xd3, 0x2c, 0x4b, 0x37, 0xa2, 0x2a, 0xf4, - 0x32, 0xa2, 0xb2, 0xb7, 0x00, 0xe9, 0x0d, 0x08, 0xc3, 0x55, 0x0c, 0xc3, 0x1e, 0x6f, 0x4a, 0x0c, - 0xff, 0x53, 0xd9, 0xdc, 0x5d, 0x47, 0xcf, 0x34, 0x93, 0x4c, 0x5e, 0x80, 0x25, 0x21, 0xfb, 0x15, - 0xc8, 0x74, 0x56, 0xeb, 0xad, 0x36, 0xb0, 0x3f, 0x0f, 0xd3, 0xac, 0xe6, 0x11, 0x45, 0x5a, 0x3b, - 0xa5, 0x95, 0xcc, 0x88, 0x4c, 0x63, 0x7f, 0xd9, 0x82, 0xc9, 0xd5, 0x54, 0xc0, 0x8e, 0xcb, 0xec, - 0x01, 0x34, 0x43, 0x19, 0x5e, 0x67, 0xa5, 0x58, 0x40, 0x8f, 0x5d, 0x07, 0xf5, 0x17, 0x16, 0x24, - 0xfe, 0xa3, 0x27, 0xc0, 0x78, 0x2d, 0x1a, 0x8c, 0x57, 0xa6, 0x6e, 0x44, 0x75, 0x27, 0x8f, 0xef, - 0x42, 0x37, 0x55, 0xb0, 0x84, 0x2e, 0x6a, 0x91, 0x84, 0x0c, 0x77, 0xad, 0x9f, 0x30, 0x23, 0x2a, - 0xc8, 0xf0, 0x09, 0xcc, 0x76, 0x4a, 0xe1, 0x7e, 0x44, 0x6c, 0xa7, 0x54, 0x7f, 0x72, 0x76, 0x68, - 0x4d, 0xeb, 0x32, 0x3b, 0xb9, 0xbe, 0x95, 0xd9, 0xc2, 0x3b, 0x4d, 0xef, 0x7d, 0xa2, 0x22, 0xbe, - 0x94, 0x85, 0x6d, 0xbb, 0x28, 0x3d, 0xdc, 0x2f, 0x8f, 0xab, 0x7f, 0x3c, 0xc2, 0x5c, 0x52, 0xc5, - 0xbe, 0x01, 0x93, 0xa9, 0x01, 0x43, 0x2f, 0xc1, 0x60, 0x6b, 0xcb, 0x89, 0x48, 0xca, 0x5e, 0x74, - 0xb0, 0x46, 0x0b, 0x0f, 0xf7, 0xcb, 0x13, 0xaa, 0x02, 0x2b, 0xc1, 0x1c, 0xdb, 0xfe, 0x9f, 0x16, - 0x0c, 0xac, 0x06, 0xee, 0x49, 0x2c, 0xa6, 0xd7, 0x8d, 0xc5, 0x74, 0x3e, 0x2f, 0x3e, 0x67, 0xee, - 0x3a, 0x5a, 0x4e, 0xad, 0xa3, 0x8b, 0xb9, 0x14, 0xba, 0x2f, 0xa1, 0x1d, 0x18, 0x65, 0x51, 0x3f, - 0x85, 0xfd, 0xea, 0x0b, 0x86, 0x0c, 0x50, 0x4e, 0xc9, 0x00, 0x93, 0x1a, 0xaa, 0x26, 0x09, 0x3c, - 0x0d, 0xc3, 0xc2, 0x86, 0x32, 0x6d, 0xf5, 0x2f, 0x70, 0xb1, 0x84, 0xdb, 0x3f, 0x56, 0x04, 0x23, - 0xca, 0x28, 0xfa, 0x55, 0x0b, 0xe6, 0x42, 0xee, 0x46, 0xe9, 0x56, 0xda, 0xa1, 0xe7, 0x6f, 0xd6, - 0x1b, 0x5b, 0xc4, 0x6d, 0x37, 0x3d, 0x7f, 0xb3, 0xba, 0xe9, 0x07, 0xaa, 0x78, 0xe9, 0x01, 0x69, - 0xb4, 0xd9, 0x43, 0x48, 0x8f, 0x90, 0xa6, 0xca, 0x46, 0xe9, 0xda, 0xc1, 0x7e, 0x79, 0x0e, 0x1f, - 0x89, 0x36, 0x3e, 0x62, 0x5f, 0xd0, 0xd7, 0x2c, 0xb8, 0xca, 0x83, 0x6f, 0xf6, 0xdf, 0xff, 0x2e, - 0x12, 0x53, 0x4d, 0x92, 0x4a, 0x88, 0xac, 0x91, 0x70, 0x67, 0xe1, 0x65, 0x31, 0xa0, 0x57, 0x6b, - 0x47, 0x6b, 0x0b, 0x1f, 0xb5, 0x73, 0xf6, 0xbf, 0x29, 0xc2, 0xb8, 0xf0, 0xe0, 0x17, 0xa1, 0x61, - 0x5e, 0x32, 0x96, 0xc4, 0x13, 0xa9, 0x25, 0x31, 0x6d, 0x20, 0x1f, 0x4f, 0x54, 0x98, 0x08, 0xa6, - 0x9b, 0x4e, 0x14, 0xdf, 0x20, 0x4e, 0x18, 0xaf, 0x13, 0x87, 0xdb, 0xee, 0x14, 0x8f, 0x6c, 0x67, - 0xa4, 0x54, 0x34, 0xb7, 0xd2, 0xc4, 0x70, 0x27, 0x7d, 0xb4, 0x0b, 0x88, 0x19, 0x20, 0x85, 0x8e, - 0x1f, 0xf1, 0x6f, 0xf1, 0xc4, 0x9b, 0xc1, 0xd1, 0x5a, 0x9d, 0x15, 0xad, 0xa2, 0x5b, 0x1d, 0xd4, - 0x70, 0x46, 0x0b, 0x9a, 0x61, 0xd9, 0x60, 0xbf, 0x86, 0x65, 0x43, 0x3d, 0x5c, 0x6b, 0x7c, 0x98, - 0xea, 0x08, 0xc2, 0xf0, 0x16, 0x94, 0x94, 0x01, 0xa0, 0x38, 0x74, 0xba, 0xc7, 0x32, 0x49, 0x53, - 0xe0, 0x6a, 0x94, 0xc4, 0xf8, 0x34, 0x21, 0x67, 0xff, 0xd3, 0x82, 0xd1, 0x20, 0x9f, 0xc4, 0x55, - 0x18, 0x71, 0xa2, 0xc8, 0xdb, 0xf4, 0x89, 0x2b, 0x76, 0xec, 0xc7, 0xf3, 0x76, 0xac, 0xd1, 0x0c, - 0x33, 0xc2, 0x9c, 0x17, 0x35, 0xb1, 0xa2, 0x81, 0x6e, 0x70, 0x0b, 0xa9, 0x5d, 0xc9, 0xf3, 0xf7, - 0x47, 0x0d, 0xa4, 0x0d, 0xd5, 0x2e, 0xc1, 0xa2, 0x3e, 0xfa, 0x02, 0x37, 0x61, 0xbb, 0xe9, 0x07, - 0xf7, 0xfd, 0xeb, 0x41, 0x20, 0xdd, 0xee, 0xfa, 0x23, 0x38, 0x2d, 0x0d, 0xd7, 0x54, 0x75, 0x6c, - 0x52, 0xeb, 0x2f, 0x50, 0xd1, 0x77, 0xc2, 0x29, 0x4a, 0xda, 0x74, 0x9e, 0x89, 0x10, 0x81, 0x49, - 0x11, 0x1e, 0x42, 0x96, 0x89, 0xb1, 0xcb, 0x64, 0xe7, 0xcd, 0xda, 0x89, 0xd2, 0xef, 0xa6, 0x49, - 0x02, 0xa7, 0x69, 0xda, 0x3f, 0x69, 0x01, 0x33, 0xfb, 0x3f, 0x01, 0x96, 0xe1, 0xb3, 0x26, 0xcb, - 0x30, 0x93, 0x37, 0xc8, 0x39, 0xdc, 0xc2, 0x8b, 0x7c, 0x65, 0xd5, 0xc2, 0xe0, 0xc1, 0x9e, 0x30, - 0x1f, 0xe8, 0xcd, 0xc9, 0xda, 0xff, 0xc7, 0xe2, 0x87, 0x98, 0xf2, 0xc4, 0x47, 0xdf, 0x05, 0x23, - 0x0d, 0xa7, 0xe5, 0x34, 0x78, 0x48, 0xec, 0x5c, 0xad, 0x8e, 0x51, 0x69, 0x6e, 0x51, 0xd4, 0xe0, - 0x5a, 0x0a, 0x19, 0x66, 0x64, 0x44, 0x16, 0xf7, 0xd4, 0x4c, 0xa8, 0x26, 0x67, 0xb7, 0x61, 0xdc, - 0x20, 0xf6, 0x48, 0x45, 0xda, 0xef, 0xe2, 0x57, 0xac, 0x0a, 0x8b, 0xb3, 0x03, 0xd3, 0xbe, 0xf6, - 0x9f, 0x5e, 0x28, 0x52, 0x4c, 0xf9, 0x78, 0xaf, 0x4b, 0x94, 0xdd, 0x3e, 0x9a, 0x5b, 0x43, 0x8a, - 0x0c, 0xee, 0xa4, 0x6c, 0xff, 0xb8, 0x05, 0x8f, 0xe9, 0x88, 0x5a, 0x90, 0x84, 0x5e, 0x7a, 0xe2, - 0x0a, 0x8c, 0x04, 0x2d, 0x12, 0x3a, 0x71, 0x10, 0x8a, 0x5b, 0xe3, 0x8a, 0x1c, 0xf4, 0xdb, 0xa2, - 0xfc, 0x50, 0x04, 0x94, 0x94, 0xd4, 0x65, 0x39, 0x56, 0x35, 0xa9, 0x1c, 0xc3, 0x06, 0x23, 0x12, - 0x01, 0x2c, 0xd8, 0x19, 0xc0, 0x9e, 0x4c, 0x23, 0x2c, 0x20, 0xf6, 0x1f, 0x59, 0x7c, 0x61, 0xe9, - 0x5d, 0x47, 0xef, 0xc1, 0xd4, 0x8e, 0x13, 0x37, 0xb6, 0x96, 0x1e, 0xb4, 0x42, 0xae, 0x1e, 0x97, - 0xe3, 0xf4, 0x4c, 0xaf, 0x71, 0xd2, 0x3e, 0x32, 0xb1, 0xca, 0x5b, 0x49, 0x11, 0xc3, 0x1d, 0xe4, - 0xd1, 0x3a, 0x8c, 0xb2, 0x32, 0x66, 0xfe, 0x1d, 0x75, 0x63, 0x0d, 0xf2, 0x5a, 0x53, 0xaf, 0xce, - 0x2b, 0x09, 0x1d, 0xac, 0x13, 0xb5, 0xbf, 0x54, 0xe4, 0xbb, 0x9d, 0x71, 0xdb, 0x4f, 0xc3, 0x70, - 0x2b, 0x70, 0x17, 0xab, 0x15, 0x2c, 0x66, 0x41, 0x5d, 0x23, 0x35, 0x5e, 0x8c, 0x25, 0x1c, 0xbd, - 0x0a, 0x40, 0x1e, 0xc4, 0x24, 0xf4, 0x9d, 0xa6, 0xb2, 0x92, 0x51, 0x76, 0xa1, 0x95, 0x60, 0x35, - 0x88, 0xef, 0x44, 0xe4, 0x3b, 0x96, 0x14, 0x0a, 0xd6, 0xd0, 0xd1, 0x35, 0x80, 0x56, 0x18, 0xec, - 0x7a, 0x2e, 0xf3, 0x27, 0x2c, 0x9a, 0x36, 0x24, 0x35, 0x05, 0xc1, 0x1a, 0x16, 0x7a, 0x15, 0xc6, - 0xdb, 0x7e, 0xc4, 0x39, 0x14, 0x67, 0x5d, 0x84, 0x63, 0x1c, 0x49, 0xac, 0x1b, 0xee, 0xe8, 0x40, - 0x6c, 0xe2, 0xa2, 0x79, 0x18, 0x8a, 0x1d, 0x66, 0x13, 0x31, 0x98, 0x6f, 0xcc, 0xb9, 0x46, 0x31, - 0xf4, 0x80, 0xcc, 0xb4, 0x02, 0x16, 0x15, 0xd1, 0x5b, 0xd2, 0x39, 0x83, 0x9f, 0xf5, 0xc2, 0x8a, - 0xba, 0xbf, 0x7b, 0x41, 0x73, 0xcd, 0x10, 0xd6, 0xd9, 0x06, 0x2d, 0xfb, 0x6b, 0x25, 0x80, 0x84, - 0x1d, 0x47, 0xef, 0x77, 0x9c, 0x47, 0xcf, 0x76, 0x67, 0xe0, 0x8f, 0xef, 0x30, 0x42, 0xdf, 0x67, - 0xc1, 0xa8, 0xd3, 0x6c, 0x06, 0x0d, 0x27, 0x66, 0xa3, 0x5c, 0xe8, 0x7e, 0x1e, 0x8a, 0xf6, 0xe7, - 0x93, 0x1a, 0xbc, 0x0b, 0x2f, 0xc8, 0x85, 0xa7, 0x41, 0x7a, 0xf6, 0x42, 0x6f, 0x18, 0x7d, 0x4a, - 0x4a, 0x69, 0x7c, 0x79, 0xcc, 0xa6, 0xa5, 0xb4, 0x12, 0x3b, 0xfa, 0x35, 0x01, 0x0d, 0xdd, 0x31, - 0x22, 0xed, 0x0d, 0xe4, 0x07, 0x9d, 0x30, 0xb8, 0xd2, 0x5e, 0x41, 0xf6, 0x50, 0x4d, 0xf7, 0x26, - 0x1b, 0xcc, 0x8f, 0xcc, 0xa2, 0x89, 0x3f, 0x3d, 0x3c, 0xc9, 0xde, 0x85, 0x49, 0xd7, 0xbc, 0xdb, - 0xc5, 0x6a, 0x7a, 0x2a, 0x8f, 0x6e, 0x8a, 0x15, 0x48, 0x6e, 0xf3, 0x14, 0x00, 0xa7, 0x09, 0xa3, - 0x1a, 0xf7, 0xeb, 0xab, 0xfa, 0x1b, 0x81, 0xb0, 0xc6, 0xb7, 0x73, 0xe7, 0x72, 0x2f, 0x8a, 0xc9, - 0x0e, 0xc5, 0x4c, 0x2e, 0xed, 0x55, 0x51, 0x17, 0x2b, 0x2a, 0xe8, 0x0d, 0x18, 0x62, 0x8e, 0xc1, - 0xd1, 0xcc, 0x48, 0xbe, 0x32, 0xd1, 0x8c, 0x69, 0x91, 0x6c, 0x2a, 0xf6, 0x37, 0xc2, 0x82, 0x02, - 0xba, 0x21, 0x03, 0xdf, 0x44, 0x55, 0xff, 0x4e, 0x44, 0x58, 0xe0, 0x9b, 0xd2, 0xc2, 0xc7, 0x93, - 0x98, 0x36, 0xbc, 0x3c, 0x33, 0xf5, 0x82, 0x51, 0x93, 0x32, 0x47, 0xe2, 0xbf, 0xcc, 0xe8, 0x30, - 0x03, 0xf9, 0xdd, 0x33, 0xb3, 0x3e, 0x24, 0xc3, 0x79, 0xd7, 0x24, 0x81, 0xd3, 0x34, 0x29, 0xa3, - 0xc9, 0x77, 0xae, 0xb0, 0xe7, 0xef, 0xb5, 0xff, 0xb9, 0x7c, 0xcd, 0x2e, 0x19, 0x5e, 0x82, 0x45, - 0xfd, 0x13, 0xbd, 0xf5, 0x67, 0x7d, 0x98, 0x4a, 0x6f, 0xd1, 0x47, 0xca, 0x65, 0xfc, 0xc1, 0x00, - 0x4c, 0x98, 0x4b, 0x0a, 0x5d, 0x85, 0x92, 0x20, 0xa2, 0xa2, 0xb0, 0xaa, 0x5d, 0xb2, 0x22, 0x01, - 0x38, 0xc1, 0x61, 0xc1, 0x77, 0x59, 0x75, 0xcd, 0x0e, 0x33, 0x09, 0xbe, 0xab, 0x20, 0x58, 0xc3, - 0xa2, 0xf2, 0xd2, 0x7a, 0x10, 0xc4, 0xea, 0x52, 0x51, 0xeb, 0x6e, 0x81, 0x95, 0x62, 0x01, 0xa5, - 0x97, 0xc9, 0x36, 0x09, 0x7d, 0xd2, 0x34, 0x83, 0xbb, 0xa9, 0xcb, 0xe4, 0xa6, 0x0e, 0xc4, 0x26, - 0x2e, 0xbd, 0x25, 0x83, 0x88, 0x2d, 0x64, 0x21, 0x95, 0x25, 0x76, 0xad, 0x75, 0xee, 0x62, 0x2f, - 0xe1, 0xe8, 0xf3, 0xf0, 0x98, 0xf2, 0x88, 0xc7, 0x5c, 0x51, 0x2d, 0x5b, 0x1c, 0x32, 0x94, 0x28, - 0x8f, 0x2d, 0x66, 0xa3, 0xe1, 0xbc, 0xfa, 0xe8, 0x75, 0x98, 0x10, 0x9c, 0xbb, 0xa4, 0x38, 0x6c, - 0xda, 0x4e, 0xdc, 0x34, 0xa0, 0x38, 0x85, 0x2d, 0xc3, 0xd3, 0x31, 0xe6, 0x59, 0x52, 0x18, 0xe9, - 0x0c, 0x4f, 0xa7, 0xc3, 0x71, 0x47, 0x0d, 0x34, 0x0f, 0x93, 0x9c, 0xb5, 0xf2, 0xfc, 0x4d, 0x3e, - 0x27, 0xc2, 0xdd, 0x46, 0x6d, 0xa9, 0xdb, 0x26, 0x18, 0xa7, 0xf1, 0xd1, 0x2b, 0x30, 0xe6, 0x84, - 0x8d, 0x2d, 0x2f, 0x26, 0x8d, 0xb8, 0x1d, 0x72, 0x3f, 0x1c, 0xcd, 0xf8, 0x64, 0x5e, 0x83, 0x61, - 0x03, 0xd3, 0x7e, 0x1f, 0x4e, 0x65, 0x78, 0xea, 0xd1, 0x85, 0xe3, 0xb4, 0x3c, 0xf9, 0x4d, 0x29, - 0x0b, 0xd5, 0xf9, 0x5a, 0x55, 0x7e, 0x8d, 0x86, 0x45, 0x57, 0x27, 0xf3, 0xe8, 0xd3, 0x12, 0xb8, - 0xa8, 0xd5, 0xb9, 0x2c, 0x01, 0x38, 0xc1, 0xb1, 0xff, 0x57, 0x01, 0x26, 0x33, 0x94, 0xef, 0x2c, - 0x89, 0x48, 0x4a, 0xf6, 0x48, 0x72, 0x86, 0x98, 0xd1, 0x0e, 0x0b, 0x47, 0x88, 0x76, 0x58, 0xec, - 0x15, 0xed, 0x70, 0xe0, 0x83, 0x44, 0x3b, 0x34, 0x47, 0x6c, 0xb0, 0xaf, 0x11, 0xcb, 0x88, 0x90, - 0x38, 0x74, 0xc4, 0x08, 0x89, 0xc6, 0xa0, 0x0f, 0xf7, 0x31, 0xe8, 0x3f, 0x54, 0x80, 0xa9, 0xb4, - 0x91, 0xdc, 0x09, 0xa8, 0x63, 0xdf, 0x30, 0xd4, 0xb1, 0xd9, 0x29, 0x79, 0xd2, 0xa6, 0x7b, 0x79, - 0xaa, 0x59, 0x9c, 0x52, 0xcd, 0x7e, 0xb2, 0x2f, 0x6a, 0xdd, 0xd5, 0xb4, 0xff, 0xa0, 0x00, 0x67, - 0xd2, 0x55, 0x16, 0x9b, 0x8e, 0xb7, 0x73, 0x02, 0x63, 0x73, 0xdb, 0x18, 0x9b, 0xe7, 0xfa, 0xf9, - 0x1a, 0xd6, 0xb5, 0xdc, 0x01, 0xba, 0x97, 0x1a, 0xa0, 0xab, 0xfd, 0x93, 0xec, 0x3e, 0x4a, 0x5f, - 0x2f, 0xc2, 0xc5, 0xcc, 0x7a, 0x89, 0x36, 0x73, 0xd9, 0xd0, 0x66, 0x5e, 0x4b, 0x69, 0x33, 0xed, - 0xee, 0xb5, 0x8f, 0x47, 0xbd, 0x29, 0x5c, 0x28, 0x59, 0x44, 0xbc, 0x87, 0x54, 0x6d, 0x1a, 0x2e, - 0x94, 0x8a, 0x10, 0x36, 0xe9, 0x7e, 0x23, 0xa9, 0x34, 0xff, 0x9d, 0x05, 0xe7, 0x32, 0xe7, 0xe6, - 0x04, 0x54, 0x58, 0xab, 0xa6, 0x0a, 0xeb, 0xe9, 0xbe, 0x57, 0x6b, 0x8e, 0x4e, 0xeb, 0x37, 0x06, - 0x72, 0xbe, 0x85, 0x09, 0xe8, 0xb7, 0x61, 0xd4, 0x69, 0x34, 0x48, 0x14, 0xad, 0x04, 0xae, 0x8a, - 0x10, 0xf7, 0x1c, 0x93, 0xb3, 0x92, 0xe2, 0xc3, 0xfd, 0xf2, 0x6c, 0x9a, 0x44, 0x02, 0xc6, 0x3a, - 0x05, 0x33, 0xa8, 0x65, 0xe1, 0x58, 0x83, 0x5a, 0x5e, 0x03, 0xd8, 0x55, 0xdc, 0x7a, 0x5a, 0xc8, - 0xd7, 0xf8, 0x78, 0x0d, 0x0b, 0x7d, 0x01, 0x46, 0x22, 0x71, 0x8d, 0x8b, 0xa5, 0xf8, 0x42, 0x9f, - 0x73, 0xe5, 0xac, 0x93, 0xa6, 0xe9, 0xab, 0xaf, 0xf4, 0x21, 0x8a, 0x24, 0xfa, 0x36, 0x98, 0x8a, - 0x78, 0x28, 0x98, 0xc5, 0xa6, 0x13, 0x31, 0x3f, 0x08, 0xb1, 0x0a, 0x99, 0x03, 0x7e, 0x3d, 0x05, - 0xc3, 0x1d, 0xd8, 0x68, 0x59, 0x7e, 0x14, 0x8b, 0x5b, 0xc3, 0x17, 0xe6, 0xe5, 0xe4, 0x83, 0x44, - 0x0a, 0xb3, 0xd3, 0xe9, 0xe1, 0x67, 0x03, 0xaf, 0xd5, 0x44, 0x5f, 0x00, 0xa0, 0xcb, 0x47, 0xe8, - 0x12, 0x86, 0xf3, 0x0f, 0x4f, 0x7a, 0xaa, 0xb8, 0x99, 0x96, 0x9f, 0xcc, 0x79, 0xb1, 0xa2, 0x88, - 0x60, 0x8d, 0xa0, 0xfd, 0x43, 0x03, 0xf0, 0x78, 0x97, 0x33, 0x12, 0xcd, 0x9b, 0x4f, 0xa0, 0xcf, - 0xa4, 0x85, 0xeb, 0xd9, 0xcc, 0xca, 0x86, 0xb4, 0x9d, 0x5a, 0x8a, 0x85, 0x0f, 0xbc, 0x14, 0x7f, - 0xc0, 0xd2, 0xd4, 0x1e, 0xdc, 0x98, 0xef, 0xb3, 0x47, 0x3c, 0xfb, 0x8f, 0x51, 0x0f, 0xb2, 0x91, - 0xa1, 0x4c, 0xb8, 0xd6, 0x77, 0x77, 0xfa, 0xd6, 0x2e, 0x9c, 0xac, 0xf2, 0xf7, 0x4b, 0x16, 0x3c, - 0x91, 0xd9, 0x5f, 0xc3, 0x64, 0xe3, 0x2a, 0x94, 0x1a, 0xb4, 0x50, 0xf3, 0x55, 0x4b, 0x9c, 0x78, - 0x25, 0x00, 0x27, 0x38, 0x86, 0x65, 0x46, 0xa1, 0xa7, 0x65, 0xc6, 0xbf, 0xb6, 0xa0, 0x63, 0x7f, - 0x9c, 0xc0, 0x41, 0x5d, 0x35, 0x0f, 0xea, 0x8f, 0xf7, 0x33, 0x97, 0x39, 0x67, 0xf4, 0x9f, 0x4c, - 0xc2, 0xd9, 0x1c, 0x5f, 0x8d, 0x5d, 0x98, 0xde, 0x6c, 0x10, 0xd3, 0x0b, 0x50, 0x7c, 0x4c, 0xa6, - 0xc3, 0x64, 0x57, 0x97, 0x41, 0x96, 0x8f, 0x68, 0xba, 0x03, 0x05, 0x77, 0x36, 0x81, 0xbe, 0x64, - 0xc1, 0x69, 0xe7, 0x7e, 0xd4, 0x91, 0xc0, 0x54, 0xac, 0x99, 0x17, 0x33, 0x95, 0x20, 0x3d, 0x12, - 0x9e, 0xf2, 0x04, 0x4d, 0x59, 0x58, 0x38, 0xb3, 0x2d, 0x84, 0x45, 0xcc, 0x50, 0xca, 0xce, 0x77, - 0xf1, 0x53, 0xcd, 0x72, 0xaa, 0xe1, 0x47, 0xb6, 0x84, 0x60, 0x45, 0x07, 0xbd, 0x03, 0xa5, 0x4d, - 0xe9, 0xe9, 0x96, 0x71, 0x25, 0x24, 0x03, 0xd9, 0xdd, 0xff, 0x8f, 0x3f, 0x50, 0x2a, 0x24, 0x9c, - 0x10, 0x45, 0xaf, 0x43, 0xd1, 0xdf, 0x88, 0xba, 0xe5, 0x38, 0x4a, 0xd9, 0x34, 0x71, 0x6f, 0xf0, - 0xd5, 0xe5, 0x3a, 0xa6, 0x15, 0xd1, 0x0d, 0x28, 0x86, 0xeb, 0xae, 0xd0, 0xe0, 0x65, 0x9e, 0xe1, - 0x78, 0xa1, 0x92, 0xd3, 0x2b, 0x46, 0x09, 0x2f, 0x54, 0x30, 0x25, 0x81, 0x6a, 0x30, 0xc8, 0x1c, - 0x1c, 0xc4, 0x7d, 0x90, 0xc9, 0xf9, 0x76, 0x71, 0x14, 0xe2, 0x2e, 0xe3, 0x0c, 0x01, 0x73, 0x42, - 0x68, 0x0d, 0x86, 0x1a, 0x2c, 0x1f, 0x8e, 0x08, 0x58, 0xfd, 0xa9, 0x4c, 0x5d, 0x5d, 0x97, 0x44, - 0x41, 0x42, 0x75, 0xc5, 0x30, 0xb0, 0xa0, 0xc5, 0xa8, 0x92, 0xd6, 0xd6, 0x46, 0x24, 0xf2, 0xb7, - 0x65, 0x53, 0xed, 0x92, 0xff, 0x4a, 0x50, 0x65, 0x18, 0x58, 0xd0, 0x42, 0x9f, 0x81, 0xc2, 0x46, - 0x43, 0xf8, 0x3f, 0x64, 0x2a, 0xed, 0x4c, 0x87, 0xfe, 0x85, 0xa1, 0x83, 0xfd, 0x72, 0x61, 0x79, - 0x11, 0x17, 0x36, 0x1a, 0x68, 0x15, 0x86, 0x37, 0xb8, 0x0b, 0xb0, 0xd0, 0xcb, 0x3d, 0x95, 0xed, - 0x9d, 0xdc, 0xe1, 0x25, 0xcc, 0xed, 0xf6, 0x05, 0x00, 0x4b, 0x22, 0x2c, 0x04, 0xa7, 0x72, 0x65, - 0x16, 0xb1, 0xa8, 0xe7, 0x8e, 0xe6, 0x7e, 0xce, 0xef, 0xe7, 0xc4, 0x21, 0x1a, 0x6b, 0x14, 0xe9, - 0xaa, 0x76, 0x64, 0x12, 0x4d, 0x11, 0xab, 0x23, 0x73, 0x55, 0xf7, 0xc8, 0x2f, 0xca, 0x57, 0xb5, - 0x42, 0xc2, 0x09, 0x51, 0xb4, 0x0d, 0xe3, 0xbb, 0x51, 0x6b, 0x8b, 0xc8, 0x2d, 0xcd, 0x42, 0x77, - 0xe4, 0x5c, 0x61, 0x77, 0x05, 0xa2, 0x17, 0xc6, 0x6d, 0xa7, 0xd9, 0x71, 0x0a, 0xb1, 0x57, 0xed, - 0xbb, 0x3a, 0x31, 0x6c, 0xd2, 0xa6, 0xc3, 0xff, 0x5e, 0x3b, 0x58, 0xdf, 0x8b, 0x89, 0x08, 0x5e, - 0x9d, 0x39, 0xfc, 0x6f, 0x72, 0x94, 0xce, 0xe1, 0x17, 0x00, 0x2c, 0x89, 0xa0, 0xbb, 0x62, 0x78, - 0xd8, 0xe9, 0x39, 0x95, 0x1f, 0x4c, 0x29, 0x33, 0x8b, 0xad, 0x36, 0x28, 0xec, 0xb4, 0x4c, 0x48, - 0xb1, 0x53, 0xb2, 0xb5, 0x15, 0xc4, 0x81, 0x9f, 0x3a, 0xa1, 0xa7, 0xf3, 0x4f, 0xc9, 0x5a, 0x06, - 0x7e, 0xe7, 0x29, 0x99, 0x85, 0x85, 0x33, 0xdb, 0x42, 0x2e, 0x4c, 0xb4, 0x82, 0x30, 0xbe, 0x1f, - 0x84, 0x72, 0x7d, 0xa1, 0x2e, 0x7a, 0x05, 0x03, 0x53, 0xb4, 0xc8, 0x82, 0xa9, 0x9b, 0x10, 0x9c, - 0xa2, 0x89, 0x3e, 0x07, 0xc3, 0x51, 0xc3, 0x69, 0x92, 0xea, 0xed, 0x99, 0x53, 0xf9, 0xd7, 0x4f, - 0x9d, 0xa3, 0xe4, 0xac, 0x2e, 0x36, 0x39, 0x02, 0x05, 0x4b, 0x72, 0x68, 0x19, 0x06, 0x59, 0x46, - 0x04, 0x16, 0x77, 0x3b, 0x27, 0x26, 0x54, 0x87, 0x85, 0x29, 0x3f, 0x9b, 0x58, 0x31, 0xe6, 0xd5, - 0xe9, 0x1e, 0x10, 0xec, 0x75, 0x10, 0xcd, 0x9c, 0xc9, 0xdf, 0x03, 0x82, 0x2b, 0xbf, 0x5d, 0xef, - 0xb6, 0x07, 0x14, 0x12, 0x4e, 0x88, 0xd2, 0x93, 0x99, 0x9e, 0xa6, 0x67, 0xbb, 0x18, 0xb4, 0xe4, - 0x9e, 0xa5, 0xec, 0x64, 0xa6, 0x27, 0x29, 0x25, 0x61, 0xff, 0xde, 0x70, 0x27, 0xcf, 0xc2, 0x04, - 0xb2, 0xbf, 0x6a, 0x75, 0xbc, 0xd5, 0x7d, 0xba, 0x5f, 0xfd, 0xd0, 0x31, 0x72, 0xab, 0x5f, 0xb2, - 0xe0, 0x6c, 0x2b, 0xf3, 0x43, 0x04, 0x03, 0xd0, 0x9f, 0x9a, 0x89, 0x7f, 0xba, 0x8a, 0x8d, 0x9f, - 0x0d, 0xc7, 0x39, 0x2d, 0xa5, 0x25, 0x82, 0xe2, 0x07, 0x96, 0x08, 0x56, 0x60, 0x84, 0x31, 0x99, - 0x3d, 0xf2, 0xc3, 0xa5, 0x05, 0x23, 0xc6, 0x4a, 0x2c, 0x8a, 0x8a, 0x58, 0x91, 0x40, 0x3f, 0x68, - 0xc1, 0x85, 0x74, 0xd7, 0x31, 0x61, 0x60, 0x11, 0x49, 0x9e, 0xcb, 0x82, 0xcb, 0xe2, 0xfb, 0x2f, - 0xd4, 0xba, 0x21, 0x1f, 0xf6, 0x42, 0xc0, 0xdd, 0x1b, 0x43, 0x95, 0x0c, 0x61, 0x74, 0xc8, 0x54, - 0xc0, 0xf7, 0x21, 0x90, 0xbe, 0x08, 0x63, 0x3b, 0x41, 0xdb, 0x8f, 0x85, 0xfd, 0x8b, 0xf0, 0x58, - 0x64, 0x0f, 0xce, 0x2b, 0x5a, 0x39, 0x36, 0xb0, 0x52, 0x62, 0xec, 0xc8, 0x43, 0x8b, 0xb1, 0x6f, - 0xa7, 0x12, 0xca, 0x97, 0xf2, 0x23, 0x16, 0x0a, 0x89, 0xff, 0x08, 0x69, 0xe5, 0x4f, 0x56, 0x36, - 0xfa, 0x69, 0x2b, 0x83, 0xa9, 0xe7, 0xd2, 0xf2, 0x6b, 0xa6, 0xb4, 0x7c, 0x39, 0x2d, 0x2d, 0x77, - 0x28, 0x5f, 0x0d, 0x41, 0xb9, 0xff, 0xb0, 0xd7, 0xfd, 0xc6, 0x91, 0xb3, 0x9b, 0x70, 0xa9, 0xd7, - 0xb5, 0xc4, 0x0c, 0xa1, 0x5c, 0xf5, 0xd4, 0x96, 0x18, 0x42, 0xb9, 0xd5, 0x0a, 0x66, 0x90, 0x7e, - 0x03, 0x8d, 0xd8, 0xff, 0xc3, 0x82, 0x62, 0x2d, 0x70, 0x4f, 0x40, 0x99, 0xfc, 0x59, 0x43, 0x99, - 0xfc, 0x78, 0x4e, 0xa2, 0xff, 0x5c, 0xd5, 0xf1, 0x52, 0x4a, 0x75, 0x7c, 0x21, 0x8f, 0x40, 0x77, - 0x45, 0xf1, 0x4f, 0x14, 0x61, 0xb4, 0x16, 0xb8, 0xca, 0x0a, 0xf9, 0x37, 0x1e, 0xc6, 0x0a, 0x39, - 0x37, 0x2c, 0xac, 0x46, 0x99, 0xd9, 0x4f, 0x49, 0x27, 0xbc, 0xbf, 0x64, 0xc6, 0xc8, 0xf7, 0x88, - 0xb7, 0xb9, 0x15, 0x13, 0x37, 0xfd, 0x39, 0x27, 0x67, 0x8c, 0xfc, 0xdf, 0x2d, 0x98, 0x4c, 0xb5, - 0x8e, 0x9a, 0x30, 0xde, 0xd4, 0x35, 0x81, 0x62, 0x9d, 0x3e, 0x94, 0x12, 0x51, 0x18, 0x73, 0x6a, - 0x45, 0xd8, 0x24, 0x8e, 0xe6, 0x00, 0xd4, 0x4b, 0x9d, 0xd4, 0x80, 0x31, 0xae, 0x5f, 0x3d, 0xe5, - 0x45, 0x58, 0xc3, 0x40, 0x2f, 0xc1, 0x68, 0x1c, 0xb4, 0x82, 0x66, 0xb0, 0xb9, 0x77, 0x93, 0xc8, - 0xd0, 0x36, 0xca, 0x44, 0x6b, 0x2d, 0x01, 0x61, 0x1d, 0xcf, 0xfe, 0xa9, 0x22, 0xff, 0x50, 0x3f, - 0xf6, 0xbe, 0xb9, 0x26, 0x3f, 0xda, 0x6b, 0xf2, 0xeb, 0x16, 0x4c, 0xd1, 0xd6, 0x99, 0xb9, 0x88, - 0xbc, 0x6c, 0x55, 0xfa, 0x1d, 0xab, 0x4b, 0xfa, 0x9d, 0xcb, 0xf4, 0xec, 0x72, 0x83, 0x76, 0x2c, - 0x34, 0x68, 0xda, 0xe1, 0x44, 0x4b, 0xb1, 0x80, 0x0a, 0x3c, 0x12, 0x86, 0xc2, 0x07, 0x4a, 0xc7, - 0x23, 0x61, 0x88, 0x05, 0x54, 0x66, 0xe7, 0x19, 0xc8, 0xc9, 0xce, 0xc3, 0x02, 0xf5, 0x09, 0xc3, - 0x02, 0xc1, 0xf6, 0x68, 0x81, 0xfa, 0xa4, 0xc5, 0x41, 0x82, 0x63, 0xff, 0x7c, 0x11, 0xc6, 0x6a, - 0x81, 0x9b, 0xbc, 0x95, 0xbd, 0x68, 0xbc, 0x95, 0x5d, 0x4a, 0xbd, 0x95, 0x4d, 0xe9, 0xb8, 0xdf, - 0x7c, 0x19, 0xfb, 0xb0, 0x5e, 0xc6, 0xfe, 0x95, 0xc5, 0x66, 0xad, 0xb2, 0x5a, 0x17, 0xd9, 0x81, - 0x9f, 0x87, 0x51, 0x76, 0x20, 0x31, 0xa7, 0x3b, 0xf9, 0x80, 0xc4, 0x02, 0xef, 0xaf, 0x26, 0xc5, - 0x58, 0xc7, 0x41, 0x57, 0x60, 0x24, 0x22, 0x4e, 0xd8, 0xd8, 0x52, 0x67, 0x9c, 0x78, 0x5e, 0xe1, - 0x65, 0x58, 0x41, 0xd1, 0x9b, 0x49, 0x8c, 0xb8, 0x62, 0x7e, 0x9e, 0x5b, 0xbd, 0x3f, 0x7c, 0x8b, - 0xe4, 0x07, 0x86, 0xb3, 0xef, 0x01, 0xea, 0xc4, 0xef, 0x23, 0x38, 0x52, 0xd9, 0x0c, 0x8e, 0x54, - 0xea, 0x08, 0x8c, 0xf4, 0xe7, 0x16, 0x4c, 0xd4, 0x02, 0x97, 0x6e, 0xdd, 0x6f, 0xa4, 0x7d, 0xaa, - 0x07, 0xc8, 0x1c, 0xea, 0x12, 0x20, 0xf3, 0x1f, 0x5a, 0x30, 0x5c, 0x0b, 0xdc, 0x13, 0xd0, 0xbb, - 0xbf, 0x66, 0xea, 0xdd, 0x1f, 0xcb, 0x59, 0x12, 0x39, 0xaa, 0xf6, 0x5f, 0x2c, 0xc2, 0x38, 0xed, - 0x67, 0xb0, 0x29, 0x67, 0xc9, 0x18, 0x11, 0xab, 0x8f, 0x11, 0xa1, 0x6c, 0x6e, 0xd0, 0x6c, 0x06, - 0xf7, 0xd3, 0x33, 0xb6, 0xcc, 0x4a, 0xb1, 0x80, 0xa2, 0x67, 0x61, 0xa4, 0x15, 0x92, 0x5d, 0x2f, - 0x10, 0xfc, 0xa3, 0xf6, 0x8a, 0x51, 0x13, 0xe5, 0x58, 0x61, 0x50, 0xb9, 0x2b, 0xf2, 0xfc, 0x06, - 0x91, 0x49, 0xb6, 0x07, 0x58, 0x1e, 0x2e, 0x1e, 0xf9, 0x5a, 0x2b, 0xc7, 0x06, 0x16, 0xba, 0x07, - 0x25, 0xf6, 0x9f, 0x9d, 0x28, 0x47, 0xcf, 0x1b, 0x24, 0xd2, 0x4d, 0x08, 0x02, 0x38, 0xa1, 0x85, - 0xae, 0x01, 0xc4, 0x32, 0x3a, 0x72, 0x24, 0x62, 0xdc, 0x28, 0x5e, 0x5b, 0xc5, 0x4d, 0x8e, 0xb0, - 0x86, 0x85, 0x9e, 0x81, 0x52, 0xec, 0x78, 0xcd, 0x5b, 0x9e, 0x4f, 0x22, 0xa6, 0x72, 0x2e, 0xca, - 0x6c, 0x12, 0xa2, 0x10, 0x27, 0x70, 0xca, 0xeb, 0x30, 0x07, 0x70, 0x9e, 0x75, 0x6c, 0x84, 0x61, - 0x33, 0x5e, 0xe7, 0x96, 0x2a, 0xc5, 0x1a, 0x86, 0xfd, 0x0a, 0x9c, 0xa9, 0x05, 0x6e, 0x2d, 0x08, - 0xe3, 0xe5, 0x20, 0xbc, 0xef, 0x84, 0xae, 0x9c, 0xbf, 0xb2, 0x4c, 0x6c, 0x40, 0xcf, 0x9e, 0x41, - 0xbe, 0x33, 0x8d, 0x94, 0x05, 0x2f, 0x30, 0x6e, 0xe7, 0x88, 0x4e, 0x1d, 0x0d, 0x76, 0xef, 0xaa, - 0x04, 0x83, 0xd7, 0x9d, 0x98, 0xa0, 0xdb, 0x2c, 0x29, 0x59, 0x72, 0x05, 0x89, 0xea, 0x4f, 0x6b, - 0x49, 0xc9, 0x12, 0x60, 0xe6, 0x9d, 0x65, 0xd6, 0xb7, 0x7f, 0x76, 0x80, 0x9d, 0x46, 0xa9, 0x7c, - 0x7b, 0xe8, 0x8b, 0x30, 0x11, 0x91, 0x5b, 0x9e, 0xdf, 0x7e, 0x20, 0x85, 0xf0, 0x2e, 0x6e, 0x39, - 0xf5, 0x25, 0x1d, 0x93, 0xab, 0xf2, 0xcc, 0x32, 0x9c, 0xa2, 0x46, 0xe7, 0x29, 0x6c, 0xfb, 0xf3, - 0xd1, 0x9d, 0x88, 0x84, 0x22, 0xdf, 0x1b, 0x9b, 0x27, 0x2c, 0x0b, 0x71, 0x02, 0xa7, 0xeb, 0x92, - 0xfd, 0x59, 0x0d, 0x7c, 0x1c, 0x04, 0xb1, 0x5c, 0xc9, 0x2c, 0x63, 0x90, 0x56, 0x8e, 0x0d, 0x2c, - 0xb4, 0x0c, 0x28, 0x6a, 0xb7, 0x5a, 0x4d, 0xf6, 0xb0, 0xef, 0x34, 0xaf, 0x87, 0x41, 0xbb, 0xc5, - 0x5f, 0x3d, 0x8b, 0x3c, 0x30, 0x61, 0xbd, 0x03, 0x8a, 0x33, 0x6a, 0xd0, 0xd3, 0x67, 0x23, 0x62, - 0xbf, 0xd9, 0xea, 0x2e, 0x0a, 0xf5, 0x7a, 0x9d, 0x15, 0x61, 0x09, 0xa3, 0x8b, 0x89, 0x35, 0xcf, - 0x31, 0x87, 0x92, 0xc5, 0x84, 0x55, 0x29, 0xd6, 0x30, 0xd0, 0x12, 0x0c, 0x47, 0x7b, 0x51, 0x23, - 0x16, 0x11, 0x99, 0x72, 0x32, 0x77, 0xd6, 0x19, 0x8a, 0x96, 0x4d, 0x82, 0x57, 0xc1, 0xb2, 0x2e, - 0xda, 0x81, 0x89, 0xfb, 0x9e, 0xef, 0x06, 0xf7, 0x23, 0x39, 0x51, 0x23, 0xf9, 0xaa, 0xd1, 0x7b, - 0x1c, 0x33, 0x35, 0xd9, 0xc6, 0xbc, 0xdd, 0x33, 0x88, 0xe1, 0x14, 0x71, 0xfb, 0xbb, 0xd8, 0xdd, - 0xcb, 0x92, 0x91, 0xc5, 0xed, 0x90, 0xa0, 0x1d, 0x18, 0x6f, 0xb1, 0x15, 0x26, 0x42, 0x65, 0x8b, - 0x65, 0xf2, 0x62, 0x9f, 0x42, 0xf4, 0x7d, 0x7a, 0xae, 0x29, 0x25, 0x17, 0x93, 0x4e, 0x6a, 0x3a, - 0x39, 0x6c, 0x52, 0xb7, 0x7f, 0x13, 0xb1, 0x23, 0xbe, 0xce, 0x25, 0xe3, 0x61, 0x61, 0xc9, 0x2c, - 0xc4, 0x80, 0xd9, 0x7c, 0x15, 0x4d, 0x32, 0x80, 0xc2, 0x1a, 0x1a, 0xcb, 0xba, 0xe8, 0x4d, 0xf6, - 0x28, 0xce, 0xcf, 0xd5, 0x5e, 0x39, 0xa1, 0x39, 0x96, 0xf1, 0xfe, 0x2d, 0x2a, 0x62, 0x8d, 0x08, - 0xba, 0x05, 0xe3, 0x22, 0x77, 0x95, 0xd0, 0xc1, 0x15, 0x0d, 0x1d, 0xcb, 0x38, 0xd6, 0x81, 0x87, - 0xe9, 0x02, 0x6c, 0x56, 0x46, 0x9b, 0x70, 0x41, 0x4b, 0xe4, 0x78, 0x3d, 0x74, 0xd8, 0x43, 0xa9, - 0xc7, 0xf6, 0xac, 0x76, 0x4c, 0x3f, 0x71, 0xb0, 0x5f, 0xbe, 0xb0, 0xd6, 0x0d, 0x11, 0x77, 0xa7, - 0x83, 0x6e, 0xc3, 0x19, 0xee, 0x30, 0x58, 0x21, 0x8e, 0xdb, 0xf4, 0x7c, 0x75, 0x0f, 0xf0, 0x65, - 0x7f, 0xee, 0x60, 0xbf, 0x7c, 0x66, 0x3e, 0x0b, 0x01, 0x67, 0xd7, 0x43, 0xaf, 0x41, 0xc9, 0xf5, - 0x23, 0x31, 0x06, 0x43, 0x46, 0x8e, 0xd2, 0x52, 0x65, 0xb5, 0xae, 0xbe, 0x3f, 0xf9, 0x83, 0x93, - 0x0a, 0x68, 0x93, 0xeb, 0xe1, 0x94, 0xd8, 0x3b, 0x9c, 0x9f, 0x8f, 0x5e, 0x2c, 0x09, 0xc3, 0x65, - 0x88, 0x2b, 0xa0, 0x95, 0xc9, 0xad, 0xe1, 0x4d, 0x64, 0x10, 0x46, 0x6f, 0x00, 0xa2, 0x7c, 0xa1, - 0xd7, 0x20, 0xf3, 0x0d, 0x16, 0xb1, 0x9c, 0xa9, 0x2d, 0x47, 0x0c, 0x17, 0x0d, 0x54, 0xef, 0xc0, - 0xc0, 0x19, 0xb5, 0xd0, 0x0d, 0x7a, 0x6e, 0xea, 0xa5, 0xc2, 0x74, 0x58, 0xca, 0x12, 0x33, 0x15, - 0xd2, 0x0a, 0x49, 0xc3, 0x89, 0x89, 0x6b, 0x52, 0xc4, 0xa9, 0x7a, 0xf4, 0xea, 0x56, 0xc9, 0x8b, - 0xc0, 0x8c, 0xd2, 0xd1, 0x99, 0xc0, 0x88, 0x8a, 0xe1, 0x5b, 0x41, 0x14, 0xaf, 0x92, 0xf8, 0x7e, - 0x10, 0x6e, 0x8b, 0xa0, 0x68, 0x49, 0x7c, 0xce, 0x04, 0x84, 0x75, 0x3c, 0xca, 0x76, 0xb3, 0x57, - 0xe9, 0x6a, 0x85, 0x3d, 0x08, 0x8e, 0x24, 0xfb, 0xe4, 0x06, 0x2f, 0xc6, 0x12, 0x2e, 0x51, 0xab, - 0xb5, 0x45, 0xf6, 0xb8, 0x97, 0x42, 0xad, 0xd6, 0x16, 0xb1, 0x84, 0x23, 0xd2, 0x99, 0xff, 0x75, - 0x22, 0x5f, 0x89, 0xda, 0x79, 0xfb, 0xf4, 0x99, 0x02, 0xd6, 0x87, 0x29, 0x95, 0x79, 0x96, 0x47, - 0x8b, 0x8b, 0x66, 0x26, 0xd9, 0x22, 0xe9, 0x3f, 0xd4, 0x9c, 0x52, 0x4b, 0x57, 0x53, 0x94, 0x70, - 0x07, 0x6d, 0x23, 0x6e, 0xca, 0x54, 0xcf, 0xe4, 0x53, 0x57, 0xa1, 0x14, 0xb5, 0xd7, 0xdd, 0x60, - 0xc7, 0xf1, 0x7c, 0xf6, 0x16, 0xa7, 0xf1, 0x74, 0x75, 0x09, 0xc0, 0x09, 0x0e, 0x5a, 0x86, 0x11, - 0x47, 0xea, 0x9c, 0x51, 0x7e, 0x90, 0x04, 0xa5, 0x69, 0xe6, 0x7e, 0xc3, 0x52, 0xcb, 0xac, 0xea, - 0xa2, 0x57, 0x61, 0x5c, 0xb8, 0x89, 0xf1, 0xd0, 0x11, 0xec, 0xad, 0x4c, 0xf3, 0x03, 0xa8, 0xeb, - 0x40, 0x6c, 0xe2, 0xa2, 0x2f, 0xc0, 0x04, 0xa5, 0x92, 0x1c, 0x6c, 0x33, 0xa7, 0xfb, 0x39, 0x11, - 0xb5, 0xa4, 0x22, 0x7a, 0x65, 0x9c, 0x22, 0x86, 0x5c, 0x38, 0xef, 0xb4, 0xe3, 0x80, 0xe9, 0xed, - 0xcd, 0xf5, 0xbf, 0x16, 0x6c, 0x13, 0x9f, 0x3d, 0x99, 0x8d, 0x2c, 0x5c, 0x3a, 0xd8, 0x2f, 0x9f, - 0x9f, 0xef, 0x82, 0x87, 0xbb, 0x52, 0x41, 0x77, 0x60, 0x34, 0x0e, 0x9a, 0xcc, 0x22, 0x9f, 0x5e, - 0x88, 0x67, 0xf3, 0xe3, 0x0e, 0xad, 0x29, 0x34, 0x5d, 0x67, 0xa5, 0xaa, 0x62, 0x9d, 0x0e, 0x5a, - 0xe3, 0x7b, 0x8c, 0x45, 0x64, 0x25, 0xd1, 0xcc, 0x63, 0xf9, 0x03, 0xa3, 0x02, 0xb7, 0x9a, 0x5b, - 0x50, 0xd4, 0xc4, 0x3a, 0x19, 0x74, 0x1d, 0xa6, 0x5b, 0xa1, 0x17, 0xb0, 0x85, 0xad, 0xde, 0x4c, - 0x66, 0xcc, 0x3c, 0x12, 0xb5, 0x34, 0x02, 0xee, 0xac, 0x43, 0x65, 0x5a, 0x59, 0x38, 0x73, 0x8e, - 0x27, 0x25, 0xe3, 0x7c, 0x3e, 0x2f, 0xc3, 0x0a, 0x8a, 0x56, 0xd8, 0xb9, 0xcc, 0xa5, 0xcf, 0x99, - 0xd9, 0xfc, 0xe0, 0x12, 0xba, 0x94, 0xca, 0xd9, 0x33, 0xf5, 0x17, 0x27, 0x14, 0xe8, 0xbd, 0x11, - 0x6d, 0x39, 0x21, 0xa9, 0x85, 0x41, 0x83, 0x44, 0x5a, 0x10, 0xe8, 0xc7, 0x79, 0xe0, 0x48, 0x7a, - 0x6f, 0xd4, 0xb3, 0x10, 0x70, 0x76, 0x3d, 0xe4, 0x6a, 0xb9, 0xb8, 0x29, 0xd7, 0x1b, 0xcd, 0x9c, - 0xef, 0x62, 0xdf, 0x94, 0x62, 0x91, 0x93, 0xb5, 0x68, 0x14, 0x47, 0x38, 0x45, 0x13, 0x7d, 0x1b, - 0x4c, 0x89, 0x38, 0x4b, 0xc9, 0xb8, 0x5f, 0x48, 0x0c, 0x27, 0x71, 0x0a, 0x86, 0x3b, 0xb0, 0x79, - 0xe8, 0x6b, 0x67, 0xbd, 0x49, 0xc4, 0x22, 0xbc, 0xe5, 0xf9, 0xdb, 0xd1, 0xcc, 0x45, 0xf6, 0xd5, - 0x22, 0xf4, 0x75, 0x1a, 0x8a, 0x33, 0x6a, 0x50, 0xd6, 0xb1, 0x15, 0x12, 0xb2, 0xd3, 0x62, 0xa9, - 0x7b, 0xcb, 0x5c, 0xa2, 0xe3, 0x6e, 0xa3, 0xb2, 0x14, 0x6b, 0x18, 0xb3, 0xdf, 0x0a, 0xd3, 0x1d, - 0x37, 0xdd, 0x91, 0xc2, 0xcb, 0xff, 0xd9, 0x20, 0x94, 0xd4, 0x9b, 0x01, 0xba, 0x6a, 0x3e, 0x05, - 0x9d, 0x4b, 0x3f, 0x05, 0x8d, 0x50, 0xd1, 0x45, 0x7f, 0xfd, 0x59, 0x33, 0xec, 0x08, 0x0b, 0xf9, - 0xc9, 0xdc, 0x74, 0xe1, 0xa3, 0xa7, 0x4f, 0xa2, 0xa6, 0x02, 0x2a, 0xf6, 0xfd, 0xa6, 0x34, 0xd0, - 0x55, 0xab, 0xd4, 0x67, 0x2e, 0x65, 0xf4, 0x24, 0x95, 0xdf, 0xdc, 0x6a, 0x2d, 0x9d, 0x5c, 0xb4, - 0x46, 0x0b, 0x31, 0x87, 0x31, 0x39, 0x97, 0xb2, 0x65, 0x4c, 0xce, 0x1d, 0x7e, 0x48, 0x39, 0x57, - 0x12, 0xc0, 0x09, 0x2d, 0xd4, 0x84, 0xe9, 0x86, 0x99, 0x17, 0x56, 0xf9, 0x21, 0x3e, 0xd9, 0x33, - 0x43, 0x6b, 0x5b, 0x4b, 0xc2, 0xb7, 0x98, 0xa6, 0x82, 0x3b, 0x09, 0xa3, 0x57, 0x61, 0xe4, 0xbd, - 0x20, 0x62, 0x8b, 0x58, 0xf0, 0x26, 0xd2, 0x5f, 0x6b, 0xe4, 0xcd, 0xdb, 0x75, 0x56, 0x7e, 0xb8, - 0x5f, 0x1e, 0xad, 0x05, 0xae, 0xfc, 0x8b, 0x55, 0x05, 0xf4, 0x00, 0xce, 0x18, 0x27, 0xba, 0xea, - 0x2e, 0xf4, 0xdf, 0xdd, 0x0b, 0xa2, 0xb9, 0x33, 0xd5, 0x2c, 0x4a, 0x38, 0xbb, 0x01, 0x7a, 0x4c, - 0xfa, 0x81, 0xc8, 0xa9, 0x2c, 0xf9, 0x1f, 0xc6, 0xe6, 0x94, 0x74, 0x6f, 0xfd, 0x14, 0x02, 0xee, - 0xac, 0x63, 0xff, 0x0a, 0x7f, 0x62, 0x11, 0x8a, 0x58, 0x12, 0xb5, 0x9b, 0x27, 0x91, 0xb2, 0x6b, - 0xc9, 0xd0, 0x11, 0x3f, 0xf4, 0x33, 0xde, 0xaf, 0x5b, 0xec, 0x19, 0x6f, 0x8d, 0xec, 0xb4, 0x9a, - 0x4e, 0x7c, 0x12, 0x7e, 0x42, 0x6f, 0xc2, 0x48, 0x2c, 0x5a, 0xeb, 0x96, 0x65, 0x4c, 0xeb, 0x14, - 0x7b, 0xca, 0x54, 0x9c, 0x91, 0x2c, 0xc5, 0x8a, 0x8c, 0xfd, 0xcf, 0xf9, 0x0c, 0x48, 0xc8, 0x09, - 0xe8, 0xeb, 0x2a, 0xa6, 0xbe, 0xae, 0xdc, 0xe3, 0x0b, 0x72, 0xf4, 0x76, 0xff, 0xcc, 0xec, 0x37, - 0x13, 0x42, 0x3f, 0xea, 0xef, 0xc7, 0xf6, 0x0f, 0x5b, 0x70, 0x3a, 0xcb, 0xe0, 0x8a, 0x72, 0xb3, - 0x5c, 0x04, 0x56, 0xef, 0xe9, 0x6a, 0x04, 0xef, 0x8a, 0x72, 0xac, 0x30, 0xfa, 0x4e, 0xe0, 0x71, - 0xb4, 0x80, 0x76, 0xb7, 0x61, 0xbc, 0x16, 0x12, 0xed, 0x0e, 0x78, 0x9d, 0x3b, 0xfe, 0xf1, 0xfe, - 0x3c, 0x7b, 0x64, 0xa7, 0x3f, 0xfb, 0x67, 0x0a, 0x70, 0x9a, 0x3f, 0x88, 0xcd, 0xef, 0x06, 0x9e, - 0x5b, 0x0b, 0x5c, 0x91, 0x7c, 0xe5, 0x2d, 0x18, 0x6b, 0x69, 0x7a, 0x8b, 0x6e, 0x21, 0xb5, 0x74, - 0xfd, 0x46, 0x22, 0x3f, 0xea, 0xa5, 0xd8, 0xa0, 0x85, 0x5c, 0x18, 0x23, 0xbb, 0x5e, 0x43, 0xbd, - 0xaa, 0x14, 0x8e, 0x7c, 0x37, 0xa8, 0x56, 0x96, 0x34, 0x3a, 0xd8, 0xa0, 0xfa, 0x08, 0xf2, 0xf1, - 0xd9, 0x3f, 0x62, 0xc1, 0x63, 0x39, 0x01, 0xb8, 0x68, 0x73, 0xf7, 0xd9, 0xd3, 0xa3, 0x48, 0xed, - 0xa5, 0x9a, 0xe3, 0x0f, 0x92, 0x58, 0x40, 0xd1, 0xe7, 0x18, 0xef, 0x22, 0xc4, 0xa9, 0x5e, 0x91, - 0x8a, 0x8c, 0x20, 0x2b, 0x5a, 0x70, 0x0c, 0x59, 0x1f, 0x6b, 0xb4, 0xec, 0x9f, 0x2c, 0xc2, 0x20, - 0x7b, 0xc0, 0x42, 0xcb, 0x30, 0xbc, 0xc5, 0x43, 0x52, 0xf7, 0x13, 0xfd, 0x3a, 0x91, 0x4b, 0x79, - 0x01, 0x96, 0x95, 0xd1, 0x0a, 0x9c, 0xe2, 0x21, 0xbd, 0x9b, 0x15, 0xd2, 0x74, 0xf6, 0xa4, 0x7a, - 0x83, 0xa7, 0xc3, 0x52, 0x81, 0x3e, 0xaa, 0x9d, 0x28, 0x38, 0xab, 0x1e, 0x7a, 0x1d, 0x26, 0x28, - 0x3f, 0x18, 0xb4, 0x63, 0x49, 0x89, 0x07, 0xf3, 0x56, 0x0c, 0xe8, 0x9a, 0x01, 0xc5, 0x29, 0x6c, - 0x2a, 0xa8, 0xb5, 0x3a, 0x14, 0x39, 0x83, 0x89, 0xa0, 0x66, 0x2a, 0x6f, 0x4c, 0x5c, 0x66, 0x69, - 0xd5, 0x66, 0x76, 0x65, 0x6b, 0x5b, 0x21, 0x89, 0xb6, 0x82, 0xa6, 0x2b, 0xb2, 0xa9, 0x27, 0x96, - 0x56, 0x29, 0x38, 0xee, 0xa8, 0x41, 0xa9, 0x6c, 0x38, 0x5e, 0xb3, 0x1d, 0x92, 0x84, 0xca, 0x90, - 0x49, 0x65, 0x39, 0x05, 0xc7, 0x1d, 0x35, 0xe8, 0x3a, 0x3a, 0x23, 0xd2, 0x9b, 0xcb, 0xf0, 0x03, - 0xca, 0x7c, 0x6e, 0x58, 0x3a, 0x62, 0x75, 0x89, 0xbf, 0x23, 0x0c, 0x8c, 0x54, 0x82, 0x74, 0x4d, - 0xdd, 0x29, 0x5c, 0xb0, 0x24, 0x95, 0x87, 0x49, 0xb2, 0xfd, 0xfd, 0x05, 0x38, 0x95, 0x61, 0xa6, - 0xcb, 0x8f, 0xaa, 0x4d, 0x2f, 0x8a, 0x55, 0xca, 0x1f, 0xed, 0xa8, 0xe2, 0xe5, 0x58, 0x61, 0xd0, - 0xfd, 0xc0, 0x0f, 0xc3, 0xf4, 0x01, 0x28, 0xcc, 0xe0, 0x04, 0xf4, 0x88, 0xc9, 0x73, 0x2e, 0xc1, - 0x40, 0x3b, 0x22, 0x32, 0x72, 0x96, 0x3a, 0xbf, 0x99, 0x02, 0x9c, 0x41, 0x28, 0x6b, 0xba, 0xa9, - 0x74, 0xcf, 0x1a, 0x6b, 0xca, 0x15, 0xca, 0x1c, 0x46, 0x3b, 0x17, 0x13, 0xdf, 0xf1, 0x63, 0xc1, - 0xc0, 0x26, 0xf1, 0x5e, 0x58, 0x29, 0x16, 0x50, 0xfb, 0x2b, 0x45, 0x38, 0x97, 0x6b, 0xb8, 0x4f, - 0xbb, 0xbe, 0x13, 0xf8, 0x5e, 0x1c, 0xa8, 0x47, 0x54, 0x1e, 0xe3, 0x85, 0xb4, 0xb6, 0x56, 0x44, - 0x39, 0x56, 0x18, 0xe8, 0xb2, 0x4c, 0xc8, 0x9f, 0x4e, 0x7e, 0xb4, 0x50, 0x31, 0x72, 0xf2, 0xf7, - 0x9b, 0x58, 0xee, 0x49, 0x18, 0x68, 0x05, 0x41, 0x33, 0x7d, 0x68, 0xd1, 0xee, 0x06, 0x41, 0x13, - 0x33, 0x20, 0xfa, 0x84, 0x18, 0xaf, 0xd4, 0xab, 0x21, 0x76, 0xdc, 0x20, 0xd2, 0x06, 0xed, 0x69, - 0x18, 0xde, 0x26, 0x7b, 0x21, 0x95, 0xa6, 0x52, 0xaf, 0xc9, 0x37, 0x79, 0x31, 0x96, 0x70, 0x33, - 0x15, 0xc6, 0xf0, 0x71, 0x67, 0x84, 0x1b, 0xe9, 0x79, 0x05, 0xfe, 0x40, 0x11, 0x26, 0xf1, 0x42, - 0xe5, 0x9b, 0x13, 0x71, 0xa7, 0x73, 0x22, 0x8e, 0x3b, 0x23, 0x5c, 0xef, 0xd9, 0xf8, 0x45, 0x0b, - 0x26, 0x59, 0xb8, 0x68, 0x11, 0x59, 0xc4, 0x0b, 0xfc, 0x13, 0x60, 0xf1, 0x9e, 0x84, 0xc1, 0x90, - 0x36, 0x9a, 0xce, 0x7a, 0xc4, 0x7a, 0x82, 0x39, 0x0c, 0x9d, 0x87, 0x01, 0xd6, 0x05, 0x3a, 0x79, - 0x63, 0x3c, 0x61, 0x44, 0xc5, 0x89, 0x1d, 0xcc, 0x4a, 0x99, 0xbb, 0x3c, 0x26, 0xad, 0xa6, 0xc7, - 0x3b, 0x9d, 0x3c, 0x99, 0x7c, 0x34, 0xdc, 0xe5, 0x33, 0xbb, 0xf6, 0xc1, 0xdc, 0xe5, 0xb3, 0x49, - 0x76, 0x17, 0x9f, 0xfe, 0xb8, 0x00, 0x17, 0x33, 0xeb, 0xf5, 0xed, 0x2e, 0xdf, 0xbd, 0xf6, 0xf1, - 0x18, 0x05, 0x65, 0xdb, 0xea, 0x14, 0x4f, 0xd0, 0x56, 0x67, 0xa0, 0x5f, 0x0e, 0x73, 0xb0, 0x0f, - 0x2f, 0xf6, 0xcc, 0x21, 0xfb, 0x88, 0x78, 0xb1, 0x67, 0xf6, 0x2d, 0x47, 0xfc, 0xfb, 0x8b, 0x42, - 0xce, 0xb7, 0x30, 0x41, 0xf0, 0x0a, 0x3d, 0x67, 0x18, 0x30, 0x12, 0x1c, 0xf3, 0x18, 0x3f, 0x63, - 0x78, 0x19, 0x56, 0x50, 0xe4, 0x69, 0xfe, 0xe0, 0x85, 0xfc, 0x24, 0xa0, 0xb9, 0x4d, 0xcd, 0x99, - 0x2f, 0x5c, 0x6a, 0x08, 0x32, 0x7c, 0xc3, 0x57, 0x34, 0xe1, 0xbd, 0xd8, 0xbf, 0xf0, 0x3e, 0x96, - 0x2d, 0xb8, 0xa3, 0x79, 0x98, 0xdc, 0xf1, 0x7c, 0x7a, 0x6c, 0xee, 0x99, 0x2c, 0xab, 0x0a, 0x8f, - 0xb2, 0x62, 0x82, 0x71, 0x1a, 0x7f, 0xf6, 0x55, 0x18, 0x7f, 0x78, 0xb5, 0xe5, 0xd7, 0x8b, 0xf0, - 0x78, 0x97, 0x6d, 0xcf, 0xcf, 0x7a, 0x63, 0x0e, 0xb4, 0xb3, 0xbe, 0x63, 0x1e, 0x6a, 0x70, 0x7a, - 0xa3, 0xdd, 0x6c, 0xee, 0x31, 0x73, 0x58, 0xe2, 0x4a, 0x0c, 0xc1, 0x53, 0x9e, 0x97, 0x29, 0x3a, - 0x96, 0x33, 0x70, 0x70, 0x66, 0x4d, 0xf4, 0x06, 0xa0, 0x40, 0x64, 0x20, 0xbe, 0x4e, 0x7c, 0xf1, - 0x6e, 0xc0, 0x06, 0xbe, 0x98, 0x6c, 0xc6, 0xdb, 0x1d, 0x18, 0x38, 0xa3, 0x16, 0x15, 0x0e, 0xe8, - 0xad, 0xb4, 0xa7, 0xba, 0x95, 0x12, 0x0e, 0xb0, 0x0e, 0xc4, 0x26, 0x2e, 0xba, 0x0e, 0xd3, 0xce, - 0xae, 0xe3, 0xf1, 0xb0, 0x81, 0x92, 0x00, 0x97, 0x0e, 0x94, 0xb2, 0x6c, 0x3e, 0x8d, 0x80, 0x3b, - 0xeb, 0xa4, 0x3c, 0xc6, 0x87, 0xf2, 0x3d, 0xc6, 0xbb, 0x9f, 0x8b, 0xbd, 0x74, 0xbf, 0xf6, 0x7f, - 0xb1, 0xe8, 0xf5, 0xc5, 0x99, 0x7c, 0x33, 0xf0, 0xd1, 0xab, 0xcc, 0xe0, 0x85, 0x2b, 0x03, 0x35, - 0xe7, 0xed, 0x33, 0x9a, 0xc1, 0x4b, 0x02, 0xc4, 0x26, 0x2e, 0x5f, 0x10, 0x51, 0xe2, 0x33, 0x64, - 0xb0, 0xf8, 0x22, 0xf8, 0x83, 0xc2, 0x40, 0x9f, 0x87, 0x61, 0xd7, 0xdb, 0xf5, 0xa2, 0x20, 0x14, - 0x9b, 0xe5, 0x88, 0x9e, 0x17, 0xc9, 0x39, 0x58, 0xe1, 0x64, 0xb0, 0xa4, 0x67, 0xff, 0x40, 0x01, - 0xc6, 0x65, 0x8b, 0x6f, 0xb6, 0x83, 0xd8, 0x39, 0x81, 0x6b, 0xf9, 0xba, 0x71, 0x2d, 0x7f, 0xa2, - 0x5b, 0x04, 0x0c, 0xd6, 0xa5, 0xdc, 0xeb, 0xf8, 0x76, 0xea, 0x3a, 0x7e, 0xaa, 0x37, 0xa9, 0xee, - 0xd7, 0xf0, 0xbf, 0xb0, 0x60, 0xda, 0xc0, 0x3f, 0x81, 0xdb, 0x60, 0xd9, 0xbc, 0x0d, 0x9e, 0xe8, - 0xf9, 0x0d, 0x39, 0xb7, 0xc0, 0xf7, 0x16, 0x53, 0x7d, 0x67, 0xa7, 0xff, 0x7b, 0x30, 0xb0, 0xe5, - 0x84, 0x6e, 0xb7, 0x48, 0xbb, 0x1d, 0x95, 0xe6, 0x6e, 0x38, 0xa1, 0xcb, 0xcf, 0xf0, 0x67, 0x55, - 0x1a, 0x4f, 0x27, 0x74, 0x7b, 0xba, 0xc8, 0xb1, 0xa6, 0xd0, 0x2b, 0x30, 0x14, 0x35, 0x82, 0x96, - 0x32, 0x60, 0xbd, 0xc4, 0x53, 0x7c, 0xd2, 0x92, 0xc3, 0xfd, 0x32, 0x32, 0x9b, 0xa3, 0xc5, 0x58, - 0xe0, 0xa3, 0xb7, 0x60, 0x9c, 0xfd, 0x52, 0x96, 0x15, 0xc5, 0xfc, 0xfc, 0x0e, 0x75, 0x1d, 0x91, - 0x1b, 0xe8, 0x18, 0x45, 0xd8, 0x24, 0x35, 0xbb, 0x09, 0x25, 0xf5, 0x59, 0x8f, 0xd4, 0xb5, 0xe9, - 0x3f, 0x16, 0xe1, 0x54, 0xc6, 0x9a, 0x43, 0x91, 0x31, 0x13, 0xcf, 0xf7, 0xb9, 0x54, 0x3f, 0xe0, - 0x5c, 0x44, 0x4c, 0x1a, 0x72, 0xc5, 0xda, 0xea, 0xbb, 0xd1, 0x3b, 0x11, 0x49, 0x37, 0x4a, 0x8b, - 0x7a, 0x37, 0x4a, 0x1b, 0x3b, 0xb1, 0xa1, 0xa6, 0x0d, 0xa9, 0x9e, 0x3e, 0xd2, 0x39, 0xfd, 0xd3, - 0x22, 0x9c, 0xce, 0x0a, 0xca, 0x83, 0xbe, 0x33, 0x95, 0xeb, 0xe7, 0xc5, 0x7e, 0xc3, 0xf9, 0xf0, - 0x04, 0x40, 0x22, 0x55, 0xf7, 0x9c, 0x99, 0xfd, 0xa7, 0xe7, 0x30, 0x8b, 0x36, 0x99, 0x3f, 0x6c, - 0xc8, 0x73, 0x34, 0xc9, 0xe3, 0xe3, 0xd3, 0x7d, 0x77, 0x40, 0x24, 0x77, 0x8a, 0x52, 0xfe, 0xb0, - 0xb2, 0xb8, 0xb7, 0x3f, 0xac, 0x6c, 0x79, 0xd6, 0x83, 0x51, 0xed, 0x6b, 0x1e, 0xe9, 0x8c, 0x6f, - 0xd3, 0xdb, 0x4a, 0xeb, 0xf7, 0x23, 0x9d, 0xf5, 0x1f, 0xb1, 0x20, 0x65, 0x2d, 0xaa, 0xd4, 0x62, - 0x56, 0xae, 0x5a, 0xec, 0x12, 0x0c, 0x84, 0x41, 0x93, 0xa4, 0x53, 0xeb, 0xe0, 0xa0, 0x49, 0x30, - 0x83, 0x50, 0x8c, 0x38, 0x51, 0x76, 0x8c, 0xe9, 0x82, 0x9c, 0x10, 0xd1, 0x9e, 0x84, 0xc1, 0x26, - 0xd9, 0x25, 0xcd, 0x74, 0xdc, 0xfa, 0x5b, 0xb4, 0x10, 0x73, 0x98, 0xfd, 0x8b, 0x03, 0x70, 0xa1, - 0xab, 0x47, 0x39, 0x15, 0x87, 0x36, 0x9d, 0x98, 0xdc, 0x77, 0xf6, 0xd2, 0x01, 0xa6, 0xaf, 0xf3, - 0x62, 0x2c, 0xe1, 0xcc, 0x80, 0x9e, 0x07, 0x94, 0x4c, 0x29, 0x11, 0x45, 0x1c, 0x49, 0x01, 0x35, - 0x95, 0x52, 0xc5, 0xe3, 0x50, 0x4a, 0x5d, 0x03, 0x88, 0xa2, 0x26, 0xb7, 0x47, 0x70, 0x85, 0x65, - 0x7e, 0x12, 0x78, 0xb4, 0x7e, 0x4b, 0x40, 0xb0, 0x86, 0x85, 0x2a, 0x30, 0xd5, 0x0a, 0x83, 0x98, - 0xeb, 0x64, 0x2b, 0xdc, 0x90, 0x69, 0xd0, 0x74, 0xe6, 0xad, 0xa5, 0xe0, 0xb8, 0xa3, 0x06, 0x7a, - 0x09, 0x46, 0x85, 0x83, 0x6f, 0x2d, 0x08, 0x9a, 0x42, 0x0d, 0xa4, 0xcc, 0x62, 0xea, 0x09, 0x08, - 0xeb, 0x78, 0x5a, 0x35, 0xa6, 0xe8, 0x1d, 0xce, 0xac, 0xc6, 0x95, 0xbd, 0x1a, 0x5e, 0x2a, 0x40, - 0xd7, 0x48, 0x5f, 0x01, 0xba, 0x12, 0xc5, 0x58, 0xa9, 0xef, 0xb7, 0x2d, 0xe8, 0xa9, 0x4a, 0xfa, - 0xb9, 0x01, 0x38, 0x25, 0x16, 0xce, 0xa3, 0x5e, 0x2e, 0x77, 0x3a, 0x97, 0xcb, 0x71, 0xa8, 0xce, - 0xbe, 0xb9, 0x66, 0x4e, 0x7a, 0xcd, 0xfc, 0xa0, 0x05, 0x26, 0x7b, 0x85, 0xfe, 0xbf, 0xdc, 0x08, - 0xfd, 0x2f, 0xe5, 0xb2, 0x6b, 0xae, 0xbc, 0x40, 0x3e, 0x60, 0xac, 0x7e, 0xfb, 0x3f, 0x5b, 0xf0, - 0x44, 0x4f, 0x8a, 0x68, 0x09, 0x4a, 0x8c, 0x07, 0xd4, 0xa4, 0xb3, 0xa7, 0x94, 0xa1, 0xa3, 0x04, - 0xe4, 0xb0, 0xa4, 0x49, 0x4d, 0xb4, 0xd4, 0x91, 0x0a, 0xe1, 0xe9, 0x8c, 0x54, 0x08, 0x67, 0x8c, - 0xe1, 0x79, 0xc8, 0x5c, 0x08, 0xbf, 0x52, 0x84, 0x21, 0xbe, 0xe2, 0x4f, 0x40, 0x0c, 0x5b, 0x16, - 0x7a, 0xdb, 0x2e, 0x21, 0xba, 0x78, 0x5f, 0xe6, 0x2a, 0x4e, 0xec, 0x70, 0x36, 0x41, 0xdd, 0x56, - 0x89, 0x86, 0x17, 0xcd, 0x19, 0xf7, 0xd9, 0x6c, 0x4a, 0x31, 0x09, 0x9c, 0x86, 0x76, 0xbb, 0x7d, - 0x11, 0x20, 0x8a, 0x43, 0xcf, 0xdf, 0xa4, 0x34, 0x44, 0xb0, 0xb7, 0x4f, 0x76, 0x69, 0xbd, 0xae, - 0x90, 0x79, 0x1f, 0x92, 0x9d, 0xae, 0x00, 0x58, 0xa3, 0x38, 0xfb, 0x32, 0x94, 0x14, 0x72, 0x2f, - 0x2d, 0xce, 0x98, 0xce, 0x5c, 0x7c, 0x16, 0x26, 0x53, 0x6d, 0x1d, 0x49, 0x09, 0xf4, 0x4b, 0x16, - 0x4c, 0xf2, 0x2e, 0x2f, 0xf9, 0xbb, 0xe2, 0x4c, 0x7d, 0x1f, 0x4e, 0x37, 0x33, 0xce, 0x36, 0x31, - 0xa3, 0xfd, 0x9f, 0x85, 0x4a, 0xe9, 0x93, 0x05, 0xc5, 0x99, 0x6d, 0xa0, 0x2b, 0x74, 0xdd, 0xd2, - 0xb3, 0xcb, 0x69, 0x0a, 0x67, 0xac, 0x31, 0xbe, 0x66, 0x79, 0x19, 0x56, 0x50, 0xfb, 0x77, 0x2c, - 0x98, 0xe6, 0x3d, 0xbf, 0x49, 0xf6, 0xd4, 0x0e, 0xff, 0x30, 0xfb, 0x2e, 0xb2, 0x93, 0x14, 0x72, - 0xb2, 0x93, 0xe8, 0x9f, 0x56, 0xec, 0xfa, 0x69, 0x3f, 0x63, 0x81, 0x58, 0x81, 0x27, 0x20, 0xca, - 0x7f, 0xab, 0x29, 0xca, 0xcf, 0xe6, 0x2f, 0xea, 0x1c, 0x19, 0xfe, 0xcf, 0x2d, 0x98, 0xe2, 0x08, - 0xc9, 0x9b, 0xf3, 0x87, 0x3a, 0x0f, 0xfd, 0xa4, 0x19, 0x54, 0xb9, 0xc7, 0xb3, 0x3f, 0xca, 0x98, - 0xac, 0x81, 0xae, 0x93, 0xe5, 0xca, 0x0d, 0x74, 0x84, 0x14, 0x9b, 0x47, 0x8e, 0xf2, 0x6d, 0xff, - 0x91, 0x05, 0x88, 0x37, 0x63, 0xb0, 0x3f, 0x94, 0xa9, 0x60, 0xa5, 0xda, 0x75, 0x91, 0x1c, 0x35, - 0x0a, 0x82, 0x35, 0xac, 0x63, 0x19, 0x9e, 0x94, 0xe1, 0x40, 0xb1, 0xb7, 0xe1, 0xc0, 0x11, 0x46, - 0xf4, 0x0f, 0x07, 0x21, 0xed, 0xae, 0x80, 0xee, 0xc2, 0x58, 0xc3, 0x69, 0x39, 0xeb, 0x5e, 0xd3, - 0x8b, 0x3d, 0x12, 0x75, 0xb3, 0x38, 0x5a, 0xd4, 0xf0, 0xc4, 0x53, 0xaf, 0x56, 0x82, 0x0d, 0x3a, - 0xdc, 0x58, 0xd8, 0xdb, 0xf5, 0x9a, 0x64, 0x93, 0x69, 0x1c, 0x34, 0x63, 0x61, 0x59, 0x8a, 0x35, - 0x8c, 0x0c, 0x4f, 0xbe, 0xe2, 0xa3, 0xf3, 0xe4, 0x1b, 0x38, 0xa2, 0x27, 0xdf, 0x60, 0x5f, 0x9e, - 0x7c, 0x18, 0xce, 0x4a, 0x16, 0x89, 0xfe, 0x5f, 0xf6, 0x9a, 0x44, 0xf0, 0xc5, 0xdc, 0x29, 0x74, - 0xf6, 0x60, 0xbf, 0x7c, 0x16, 0x67, 0x62, 0xe0, 0x9c, 0x9a, 0xe8, 0x73, 0x30, 0xe3, 0x34, 0x9b, - 0xc1, 0x7d, 0x35, 0x6a, 0x4b, 0x51, 0xc3, 0x69, 0x72, 0x8d, 0xfd, 0x30, 0xa3, 0x7a, 0xfe, 0x60, - 0xbf, 0x3c, 0x33, 0x9f, 0x83, 0x83, 0x73, 0x6b, 0xa7, 0x1c, 0x01, 0x47, 0x7a, 0x3a, 0x02, 0xbe, - 0x06, 0xa5, 0x56, 0x18, 0x34, 0x56, 0x34, 0x6f, 0xa1, 0x8b, 0x2c, 0x81, 0xbf, 0x2c, 0x3c, 0xdc, - 0x2f, 0x8f, 0xab, 0x3f, 0xec, 0x86, 0x4f, 0x2a, 0x64, 0xf8, 0xff, 0xc1, 0xa3, 0xf4, 0xff, 0xdb, - 0x86, 0x53, 0x75, 0x12, 0x7a, 0x2c, 0x13, 0xa9, 0x9b, 0x9c, 0x1f, 0x6b, 0x50, 0x0a, 0x53, 0x27, - 0x66, 0x5f, 0x61, 0xad, 0xb4, 0x68, 0xcb, 0xf2, 0x84, 0x4c, 0x08, 0xd9, 0x7f, 0x66, 0xc1, 0xb0, - 0x30, 0x94, 0x3f, 0x01, 0x46, 0x6d, 0xde, 0xd0, 0x97, 0x97, 0xb3, 0x6f, 0x15, 0xd6, 0x99, 0x5c, - 0x4d, 0x79, 0x35, 0xa5, 0x29, 0x7f, 0xa2, 0x1b, 0x91, 0xee, 0x3a, 0xf2, 0xbf, 0x5b, 0x84, 0x09, - 0xd3, 0xb7, 0xe5, 0x04, 0x86, 0x60, 0x15, 0x86, 0x23, 0xe1, 0x48, 0x55, 0xc8, 0x37, 0xe8, 0x4e, - 0x4f, 0x62, 0x62, 0xad, 0x25, 0x5c, 0xa7, 0x24, 0x91, 0x4c, 0x0f, 0xad, 0xe2, 0x23, 0xf4, 0xd0, - 0xea, 0xe5, 0x5e, 0x34, 0x70, 0x1c, 0xee, 0x45, 0xf6, 0x57, 0xd9, 0xcd, 0xa6, 0x97, 0x9f, 0x00, - 0xd3, 0x73, 0xdd, 0xbc, 0x03, 0xed, 0x2e, 0x2b, 0x4b, 0x74, 0x2a, 0x87, 0xf9, 0xf9, 0x05, 0x0b, - 0x2e, 0x64, 0x7c, 0x95, 0xc6, 0x09, 0x3d, 0x0b, 0x23, 0x4e, 0xdb, 0xf5, 0xd4, 0x5e, 0xd6, 0x5e, - 0xcd, 0xe6, 0x45, 0x39, 0x56, 0x18, 0x68, 0x11, 0xa6, 0xc9, 0x83, 0x96, 0xc7, 0x9f, 0x2d, 0x75, - 0x93, 0xca, 0x22, 0x0f, 0xf5, 0xbb, 0x94, 0x06, 0xe2, 0x4e, 0x7c, 0xe5, 0x0c, 0x5f, 0xcc, 0x75, - 0x86, 0xff, 0xc7, 0x16, 0x8c, 0x2a, 0xa7, 0x99, 0x47, 0x3e, 0xda, 0xdf, 0x66, 0x8e, 0xf6, 0xe3, - 0x5d, 0x46, 0x3b, 0x67, 0x98, 0xff, 0x7e, 0x41, 0xf5, 0xb7, 0x16, 0x84, 0x71, 0x1f, 0x1c, 0xd6, - 0x2b, 0x30, 0xd2, 0x0a, 0x83, 0x38, 0x68, 0x04, 0x4d, 0xc1, 0x60, 0x9d, 0x4f, 0x62, 0x35, 0xf0, - 0xf2, 0x43, 0xed, 0x37, 0x56, 0xd8, 0x6c, 0xf4, 0x82, 0x30, 0x16, 0x4c, 0x4d, 0x32, 0x7a, 0x41, - 0x18, 0x63, 0x06, 0x41, 0x2e, 0x40, 0xec, 0x84, 0x9b, 0x24, 0xa6, 0x65, 0x22, 0xec, 0x4b, 0xfe, - 0xe1, 0xd1, 0x8e, 0xbd, 0xe6, 0x9c, 0xe7, 0xc7, 0x51, 0x1c, 0xce, 0x55, 0xfd, 0xf8, 0x76, 0xc8, - 0xe5, 0x35, 0x2d, 0xf8, 0x82, 0xa2, 0x85, 0x35, 0xba, 0xd2, 0x65, 0x95, 0xb5, 0x31, 0x68, 0xbe, - 0xbf, 0xaf, 0x8a, 0x72, 0xac, 0x30, 0xec, 0x97, 0xd9, 0x55, 0xc2, 0x06, 0xe8, 0x68, 0x71, 0x11, - 0xbe, 0x36, 0xa2, 0x86, 0x96, 0x3d, 0xbe, 0x55, 0xf4, 0xe8, 0x0b, 0xdd, 0x4f, 0x6e, 0xda, 0xb0, - 0xee, 0xde, 0x93, 0x84, 0x68, 0x40, 0xdf, 0xde, 0x61, 0x96, 0xf1, 0x5c, 0x8f, 0x2b, 0xe0, 0x08, - 0x86, 0x18, 0x2c, 0xfc, 0x38, 0x0b, 0xce, 0x5c, 0xad, 0x89, 0x45, 0xae, 0x85, 0x1f, 0x17, 0x00, - 0x9c, 0xe0, 0xa0, 0xab, 0x42, 0xda, 0x1f, 0x30, 0x92, 0x10, 0x4a, 0x69, 0x5f, 0x7e, 0xbe, 0x26, - 0xee, 0x3f, 0x0f, 0xa3, 0x2a, 0x19, 0x61, 0x8d, 0xe7, 0x74, 0x13, 0x41, 0x70, 0x96, 0x92, 0x62, - 0xac, 0xe3, 0xa0, 0x35, 0x98, 0x8c, 0xb8, 0xaa, 0x47, 0xc5, 0x3a, 0xe4, 0x2a, 0xb3, 0x4f, 0x4a, - 0x73, 0x8e, 0xba, 0x09, 0x3e, 0x64, 0x45, 0xfc, 0xe8, 0x90, 0x7e, 0xa7, 0x69, 0x12, 0xe8, 0x75, - 0x98, 0x68, 0xea, 0x69, 0xff, 0x6b, 0x42, 0xa3, 0xa6, 0xac, 0xa2, 0x6f, 0x19, 0x50, 0x9c, 0xc2, - 0xa6, 0x8c, 0x99, 0x5e, 0x22, 0xe2, 0x73, 0x3a, 0xfe, 0x26, 0x89, 0x44, 0x2a, 0x35, 0xc6, 0x98, - 0xdd, 0xca, 0xc1, 0xc1, 0xb9, 0xb5, 0xd1, 0x2b, 0x30, 0x26, 0x3f, 0x5f, 0xf3, 0xaa, 0x4e, 0x6c, - 0xef, 0x35, 0x18, 0x36, 0x30, 0xd1, 0x7d, 0x38, 0x23, 0xff, 0xaf, 0x85, 0xce, 0xc6, 0x86, 0xd7, - 0x10, 0x4e, 0xed, 0xdc, 0x01, 0x69, 0x5e, 0x7a, 0x34, 0x2d, 0x65, 0x21, 0x1d, 0xee, 0x97, 0x2f, - 0x89, 0x51, 0xcb, 0x84, 0xb3, 0x49, 0xcc, 0xa6, 0x8f, 0x56, 0xe0, 0xd4, 0x16, 0x71, 0x9a, 0xf1, - 0xd6, 0xe2, 0x16, 0x69, 0x6c, 0xcb, 0x4d, 0xc4, 0x7c, 0xb5, 0x35, 0x8b, 0xf5, 0x1b, 0x9d, 0x28, - 0x38, 0xab, 0x1e, 0x7a, 0x1b, 0x66, 0x5a, 0xed, 0xf5, 0xa6, 0x17, 0x6d, 0xad, 0x06, 0x31, 0xb3, - 0x20, 0x51, 0xb9, 0xfc, 0x84, 0x53, 0xb7, 0xf2, 0x53, 0xaf, 0xe5, 0xe0, 0xe1, 0x5c, 0x0a, 0xe8, - 0x7d, 0x38, 0x93, 0x5a, 0x0c, 0xc2, 0xc5, 0x74, 0x22, 0x3f, 0xda, 0x71, 0x3d, 0xab, 0x82, 0x70, - 0x19, 0xcd, 0x02, 0xe1, 0xec, 0x26, 0x3e, 0x98, 0x5d, 0xd1, 0x7b, 0xb4, 0xb2, 0xc6, 0x94, 0xa1, - 0x77, 0x60, 0x4c, 0x5f, 0x45, 0xe2, 0x82, 0xb9, 0x9c, 0xcd, 0xb3, 0x68, 0xab, 0x8d, 0xb3, 0x74, - 0x6a, 0x45, 0xe9, 0x30, 0x6c, 0x50, 0xb4, 0x09, 0x64, 0x7f, 0x1f, 0xba, 0x05, 0x23, 0x8d, 0xa6, - 0x47, 0xfc, 0xb8, 0x5a, 0xeb, 0x16, 0x72, 0x65, 0x51, 0xe0, 0x88, 0x01, 0x13, 0xe1, 0x61, 0x79, - 0x19, 0x56, 0x14, 0xec, 0x5f, 0x2b, 0x40, 0xb9, 0x47, 0xac, 0xe1, 0x94, 0xfa, 0xdb, 0xea, 0x4b, - 0xfd, 0x3d, 0x2f, 0x33, 0x13, 0xae, 0xa6, 0x74, 0x02, 0xa9, 0xac, 0x83, 0x89, 0x66, 0x20, 0x8d, - 0xdf, 0xb7, 0x39, 0xb2, 0xae, 0x41, 0x1f, 0xe8, 0x69, 0x50, 0x6f, 0xbc, 0x9c, 0x0d, 0xf6, 0x2f, - 0x88, 0xe4, 0xbe, 0x82, 0xd8, 0x5f, 0x2d, 0xc0, 0x19, 0x35, 0x84, 0xdf, 0xb8, 0x03, 0x77, 0xa7, - 0x73, 0xe0, 0x8e, 0xe1, 0x0d, 0xc9, 0xbe, 0x0d, 0x43, 0x3c, 0x64, 0x4d, 0x1f, 0x0c, 0xd0, 0x93, - 0x66, 0x7c, 0x33, 0x75, 0x4d, 0x1b, 0x31, 0xce, 0xfe, 0x9a, 0x05, 0x93, 0x6b, 0x8b, 0xb5, 0x7a, - 0xd0, 0xd8, 0x26, 0xf1, 0x3c, 0x67, 0x58, 0xb1, 0xe0, 0x7f, 0xac, 0x87, 0xe4, 0x6b, 0xb2, 0x38, - 0xa6, 0x4b, 0x30, 0xb0, 0x15, 0x44, 0x71, 0xfa, 0x81, 0xf9, 0x46, 0x10, 0xc5, 0x98, 0x41, 0xec, - 0xdf, 0xb5, 0x60, 0x90, 0xe5, 0xd3, 0xed, 0x95, 0xe4, 0xb9, 0x9f, 0xef, 0x42, 0x2f, 0xc1, 0x10, - 0xd9, 0xd8, 0x20, 0x8d, 0x58, 0xcc, 0xaa, 0xf4, 0x92, 0x1d, 0x5a, 0x62, 0xa5, 0xf4, 0xd2, 0x67, - 0x8d, 0xf1, 0xbf, 0x58, 0x20, 0xa3, 0x7b, 0x50, 0x8a, 0xbd, 0x1d, 0x32, 0xef, 0xba, 0xe2, 0x89, - 0xee, 0x21, 0x9c, 0x92, 0xd7, 0x24, 0x01, 0x9c, 0xd0, 0xb2, 0xbf, 0x52, 0x00, 0x48, 0x22, 0x21, - 0xf4, 0xfa, 0xc4, 0x85, 0x8e, 0xc7, 0x9b, 0xcb, 0x19, 0x8f, 0x37, 0x28, 0x21, 0x98, 0xf1, 0x72, - 0xa3, 0x86, 0xa9, 0xd8, 0xd7, 0x30, 0x0d, 0x1c, 0x65, 0x98, 0x16, 0x61, 0x3a, 0x89, 0xe4, 0x60, - 0x86, 0xb5, 0x61, 0x42, 0xca, 0x5a, 0x1a, 0x88, 0x3b, 0xf1, 0x6d, 0x02, 0x97, 0x64, 0x3c, 0x53, - 0x79, 0xd7, 0x30, 0x0b, 0xd0, 0x23, 0xe4, 0xfb, 0x4e, 0x5e, 0xa7, 0x0a, 0xb9, 0xaf, 0x53, 0x3f, - 0x6e, 0xc1, 0xe9, 0x74, 0x3b, 0xcc, 0x25, 0xef, 0xcb, 0x16, 0x9c, 0x61, 0x6f, 0x74, 0xac, 0xd5, - 0xce, 0x17, 0xc1, 0x17, 0xb3, 0x23, 0x5c, 0x74, 0xef, 0x71, 0xe2, 0x8e, 0xbd, 0x92, 0x45, 0x1a, - 0x67, 0xb7, 0x68, 0x7f, 0xd9, 0x82, 0x73, 0xb9, 0x69, 0x9c, 0xd0, 0x15, 0x18, 0x71, 0x5a, 0x1e, - 0x57, 0x80, 0x89, 0xfd, 0xce, 0xa4, 0xc7, 0x5a, 0x95, 0xab, 0xbf, 0x14, 0x54, 0xa5, 0x97, 0x2c, - 0xe4, 0xa6, 0x97, 0xec, 0x99, 0x2d, 0xd2, 0xfe, 0x3e, 0x0b, 0x84, 0x17, 0x56, 0x1f, 0x87, 0xcc, - 0x5b, 0x32, 0x3b, 0xaf, 0x11, 0x4a, 0xfe, 0x52, 0xbe, 0x5b, 0x9a, 0x08, 0x20, 0xaf, 0x2e, 0x75, - 0x23, 0x6c, 0xbc, 0x41, 0xcb, 0x76, 0x41, 0x40, 0x2b, 0x84, 0xe9, 0xac, 0x7a, 0xf7, 0xe6, 0x1a, - 0x80, 0xcb, 0x70, 0xb5, 0x1c, 0x9d, 0xea, 0x0a, 0xa9, 0x28, 0x08, 0xd6, 0xb0, 0xec, 0x7f, 0x5f, - 0x80, 0x51, 0x19, 0xba, 0xbc, 0xed, 0xf7, 0x23, 0x59, 0x1e, 0x29, 0x97, 0x11, 0x4b, 0x6a, 0x4b, - 0x09, 0xd7, 0x12, 0x81, 0x3c, 0x49, 0x6a, 0x2b, 0x01, 0x38, 0xc1, 0x41, 0x4f, 0xc3, 0x70, 0xd4, - 0x5e, 0x67, 0xe8, 0x29, 0x9f, 0xa1, 0x3a, 0x2f, 0xc6, 0x12, 0x8e, 0x3e, 0x07, 0x53, 0xbc, 0x5e, - 0x18, 0xb4, 0x9c, 0x4d, 0xae, 0x6d, 0x1d, 0x54, 0xce, 0xbe, 0x53, 0x2b, 0x29, 0xd8, 0xe1, 0x7e, - 0xf9, 0x74, 0xba, 0x8c, 0xe9, 0xe9, 0x3b, 0xa8, 0xb0, 0xb7, 0x7f, 0xde, 0x08, 0x5d, 0xa6, 0x1d, - 0x26, 0x03, 0x09, 0x08, 0xeb, 0x78, 0xf6, 0x3b, 0x80, 0x3a, 0x83, 0xb8, 0xa3, 0x37, 0xb8, 0xc1, - 0x97, 0x17, 0x12, 0xb7, 0x9b, 0xde, 0x5e, 0x77, 0x69, 0x95, 0xe6, 0xfe, 0xbc, 0x16, 0x56, 0xf5, - 0xed, 0xbf, 0x51, 0x84, 0xa9, 0xb4, 0x83, 0x23, 0xba, 0x01, 0x43, 0xfc, 0x8e, 0x14, 0xe4, 0xbb, - 0x3c, 0x0b, 0x6b, 0x6e, 0x91, 0xec, 0xb4, 0x10, 0xd7, 0xac, 0xa8, 0x8f, 0xde, 0x86, 0x51, 0x37, - 0xb8, 0xef, 0xdf, 0x77, 0x42, 0x77, 0xbe, 0x56, 0x15, 0xcb, 0x39, 0x93, 0xd5, 0xae, 0x24, 0x68, - 0xba, 0xab, 0x25, 0x7b, 0x02, 0x49, 0x40, 0x58, 0x27, 0x87, 0xd6, 0x58, 0x60, 0xca, 0x0d, 0x6f, - 0x73, 0xc5, 0x69, 0x75, 0xb3, 0xfe, 0x5d, 0x94, 0x48, 0x1a, 0xe5, 0x71, 0x11, 0xbd, 0x92, 0x03, - 0x70, 0x42, 0x08, 0x7d, 0x27, 0x9c, 0x8a, 0x72, 0xb4, 0x73, 0x79, 0x39, 0x3d, 0xba, 0x29, 0xac, - 0x16, 0x1e, 0xa3, 0x42, 0x50, 0x96, 0x1e, 0x2f, 0xab, 0x19, 0xfb, 0xd7, 0x4f, 0x81, 0xb1, 0x89, - 0x8d, 0x14, 0x4f, 0xd6, 0x31, 0xa5, 0x78, 0xc2, 0x30, 0x42, 0x76, 0x5a, 0xf1, 0x5e, 0xc5, 0x0b, - 0xbb, 0xa5, 0x20, 0x5c, 0x12, 0x38, 0x9d, 0x34, 0x25, 0x04, 0x2b, 0x3a, 0xd9, 0x79, 0xb8, 0x8a, - 0x1f, 0x62, 0x1e, 0xae, 0x81, 0x13, 0xcc, 0xc3, 0xb5, 0x0a, 0xc3, 0x9b, 0x5e, 0x8c, 0x49, 0x2b, - 0x10, 0xdc, 0x69, 0xe6, 0x3a, 0xbc, 0xce, 0x51, 0x3a, 0x33, 0xbe, 0x08, 0x00, 0x96, 0x44, 0xd0, - 0x1b, 0x6a, 0x07, 0x0e, 0xe5, 0x0b, 0x77, 0x9d, 0xef, 0x97, 0x99, 0x7b, 0x50, 0x64, 0xdb, 0x1a, - 0x7e, 0xd8, 0x6c, 0x5b, 0xcb, 0x32, 0x47, 0xd6, 0x48, 0xbe, 0xa9, 0x3e, 0x4b, 0x81, 0xd5, 0x23, - 0x33, 0xd6, 0x5d, 0x3d, 0xaf, 0x58, 0x29, 0xff, 0x24, 0x50, 0x29, 0xc3, 0xfa, 0xcc, 0x26, 0xf6, - 0x7d, 0x16, 0x9c, 0x69, 0x65, 0xa5, 0xd8, 0x13, 0x6f, 0x4d, 0x2f, 0xf5, 0x9d, 0x43, 0xd0, 0x68, - 0x90, 0x49, 0xf9, 0x99, 0x68, 0x38, 0xbb, 0x39, 0x3a, 0xd0, 0xe1, 0xba, 0x2b, 0xd2, 0x61, 0x3d, - 0x99, 0x93, 0x96, 0xac, 0x4b, 0x32, 0xb2, 0xb5, 0x8c, 0x14, 0x58, 0x1f, 0xcf, 0x4b, 0x81, 0xd5, - 0x77, 0xe2, 0xab, 0x37, 0x54, 0x42, 0xb2, 0xf1, 0xfc, 0xa5, 0xc4, 0xd3, 0x8d, 0xf5, 0x4c, 0x43, - 0xf6, 0x86, 0x4a, 0x43, 0xd6, 0x25, 0x62, 0x1e, 0x4f, 0x32, 0xd6, 0x33, 0xf9, 0x98, 0x96, 0x40, - 0x6c, 0xf2, 0x78, 0x12, 0x88, 0x19, 0x57, 0x0d, 0xcf, 0x61, 0xf5, 0x4c, 0x8f, 0xab, 0xc6, 0xa0, - 0xdb, 0xfd, 0xb2, 0xe1, 0xc9, 0xd2, 0xa6, 0x1f, 0x2a, 0x59, 0xda, 0x5d, 0x3d, 0xf9, 0x18, 0xea, - 0x91, 0x5d, 0x8b, 0x22, 0xf5, 0x99, 0x72, 0xec, 0xae, 0x7e, 0x01, 0x9e, 0xca, 0xa7, 0xab, 0xee, - 0xb9, 0x4e, 0xba, 0x99, 0x57, 0x60, 0x47, 0x2a, 0xb3, 0xd3, 0x27, 0x93, 0xca, 0xec, 0xcc, 0xb1, - 0xa7, 0x32, 0x3b, 0x7b, 0x02, 0xa9, 0xcc, 0x1e, 0xfb, 0x50, 0x53, 0x99, 0xcd, 0x3c, 0x82, 0x54, - 0x66, 0xab, 0x49, 0x2a, 0xb3, 0x73, 0xf9, 0x53, 0x92, 0x61, 0x3f, 0x9c, 0x93, 0xc0, 0xec, 0x2e, - 0x33, 0x22, 0xe0, 0x11, 0x38, 0x44, 0x48, 0xbf, 0xec, 0xb4, 0xcd, 0x59, 0x61, 0x3a, 0xf8, 0x94, - 0x28, 0x10, 0x4e, 0x48, 0x51, 0xba, 0x49, 0x42, 0xb3, 0xc7, 0xbb, 0xe8, 0x71, 0xb3, 0x34, 0x64, - 0x5d, 0xd2, 0x98, 0xbd, 0xce, 0xd3, 0x98, 0x9d, 0xcf, 0x3f, 0xc9, 0xd3, 0xd7, 0x9d, 0x99, 0xbc, - 0xec, 0xfb, 0x0b, 0x70, 0xb1, 0xfb, 0xbe, 0x48, 0xd4, 0x73, 0xb5, 0xe4, 0x39, 0x29, 0xa5, 0x9e, - 0xe3, 0xb2, 0x55, 0x82, 0xd5, 0x77, 0x98, 0xa3, 0xeb, 0x30, 0xad, 0x0c, 0x8f, 0x9b, 0x5e, 0x63, - 0x4f, 0x4b, 0x07, 0xad, 0x1c, 0x2c, 0xeb, 0x69, 0x04, 0xdc, 0x59, 0x07, 0xcd, 0xc3, 0xa4, 0x51, - 0x58, 0xad, 0x08, 0x19, 0x4a, 0xe9, 0x03, 0xeb, 0x26, 0x18, 0xa7, 0xf1, 0xed, 0x9f, 0xb6, 0xe0, - 0xb1, 0x9c, 0x2c, 0x21, 0x7d, 0x47, 0xf1, 0xd9, 0x80, 0xc9, 0x96, 0x59, 0xb5, 0x47, 0xb0, 0x2f, - 0x23, 0x17, 0x89, 0xea, 0x6b, 0x0a, 0x80, 0xd3, 0x44, 0xed, 0xaf, 0x5a, 0x70, 0xa1, 0xab, 0x11, - 0x0a, 0xc2, 0x70, 0x76, 0x73, 0x27, 0x72, 0x16, 0x43, 0xe2, 0x12, 0x3f, 0xf6, 0x9c, 0x66, 0xbd, - 0x45, 0x1a, 0x9a, 0x82, 0x95, 0xd9, 0xfa, 0x5c, 0x5f, 0xa9, 0xcf, 0x77, 0x62, 0xe0, 0x9c, 0x9a, - 0x68, 0x19, 0x50, 0x27, 0x44, 0xcc, 0x30, 0x8b, 0xd3, 0xd8, 0x49, 0x0f, 0x67, 0xd4, 0x58, 0xb8, - 0xf2, 0x5b, 0xbf, 0x7f, 0xf1, 0x63, 0xbf, 0xfd, 0xfb, 0x17, 0x3f, 0xf6, 0x3b, 0xbf, 0x7f, 0xf1, - 0x63, 0xdf, 0x7d, 0x70, 0xd1, 0xfa, 0xad, 0x83, 0x8b, 0xd6, 0x6f, 0x1f, 0x5c, 0xb4, 0x7e, 0xe7, - 0xe0, 0xa2, 0xf5, 0x7b, 0x07, 0x17, 0xad, 0xaf, 0xfc, 0xc1, 0xc5, 0x8f, 0xbd, 0x55, 0xd8, 0x7d, - 0xfe, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xfc, 0xdd, 0xb1, 0x06, 0xed, 0x00, 0x00, + // 13088 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x7d, 0x70, 0x64, 0x57, + 0x56, 0x18, 0xbe, 0xaf, 0x5b, 0x1f, 0xdd, 0x47, 0xdf, 0x77, 0x3e, 0xac, 0x91, 0x67, 0xa6, 0xc7, + 0xcf, 0xbb, 0xe3, 0xf1, 0xda, 0xd6, 0xac, 0xc7, 0xf6, 0xda, 0xac, 0xbd, 0x06, 0x49, 0x2d, 0xcd, + 0xc8, 0x33, 0xd2, 0xb4, 0x6f, 0x6b, 0x66, 0x76, 0x8d, 0x77, 0xf1, 0x53, 0xbf, 0x2b, 0xe9, 0x59, + 0xad, 0xf7, 0xda, 0xef, 0xbd, 0xd6, 0x8c, 0xfc, 0x83, 0xfa, 0x91, 0x25, 0x10, 0xb6, 0x20, 0xa9, + 0xad, 0x84, 0xca, 0x07, 0x50, 0xa4, 0x8a, 0x90, 0x02, 0x02, 0x49, 0x85, 0x40, 0x80, 0xb0, 0x24, + 0x21, 0x90, 0x54, 0x91, 0xfc, 0xb1, 0x21, 0xa9, 0x4a, 0x2d, 0x55, 0x54, 0x14, 0x10, 0xa9, 0x50, + 0xa4, 0x2a, 0x90, 0x0a, 0xf9, 0x07, 0x85, 0x0a, 0xa9, 0xfb, 0xf9, 0xee, 0x7d, 0xfd, 0x5e, 0x77, + 0x6b, 0xac, 0x91, 0xcd, 0xd6, 0xfe, 0xd7, 0x7d, 0xcf, 0xb9, 0xe7, 0xde, 0x77, 0x3f, 0xcf, 0x39, + 0xf7, 0x7c, 0xc0, 0xab, 0xdb, 0xaf, 0x44, 0xb3, 0x5e, 0x70, 0x75, 0xbb, 0xbd, 0x4e, 0x42, 0x9f, + 0xc4, 0x24, 0xba, 0xba, 0x4b, 0x7c, 0x37, 0x08, 0xaf, 0x0a, 0x80, 0xd3, 0xf2, 0xae, 0x36, 0x82, + 0x90, 0x5c, 0xdd, 0x7d, 0xfe, 0xea, 0x26, 0xf1, 0x49, 0xe8, 0xc4, 0xc4, 0x9d, 0x6d, 0x85, 0x41, + 0x1c, 0x20, 0xc4, 0x71, 0x66, 0x9d, 0x96, 0x37, 0x4b, 0x71, 0x66, 0x77, 0x9f, 0x9f, 0x79, 0x6e, + 0xd3, 0x8b, 0xb7, 0xda, 0xeb, 0xb3, 0x8d, 0x60, 0xe7, 0xea, 0x66, 0xb0, 0x19, 0x5c, 0x65, 0xa8, + 0xeb, 0xed, 0x0d, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0x38, 0x89, 0x99, 0x17, 0x93, 0x66, 0x76, 0x9c, + 0xc6, 0x96, 0xe7, 0x93, 0x70, 0xef, 0x6a, 0x6b, 0x7b, 0x93, 0xb5, 0x1b, 0x92, 0x28, 0x68, 0x87, + 0x0d, 0x92, 0x6e, 0xb8, 0x6b, 0xad, 0xe8, 0xea, 0x0e, 0x89, 0x9d, 0x8c, 0xee, 0xce, 0x5c, 0xcd, + 0xab, 0x15, 0xb6, 0xfd, 0xd8, 0xdb, 0xe9, 0x6c, 0xe6, 0xd3, 0xbd, 0x2a, 0x44, 0x8d, 0x2d, 0xb2, + 0xe3, 0x74, 0xd4, 0x7b, 0x21, 0xaf, 0x5e, 0x3b, 0xf6, 0x9a, 0x57, 0x3d, 0x3f, 0x8e, 0xe2, 0x30, + 0x5d, 0xc9, 0xfe, 0xba, 0x05, 0x97, 0xe6, 0xee, 0xd5, 0x17, 0x9b, 0x4e, 0x14, 0x7b, 0x8d, 0xf9, + 0x66, 0xd0, 0xd8, 0xae, 0xc7, 0x41, 0x48, 0xee, 0x06, 0xcd, 0xf6, 0x0e, 0xa9, 0xb3, 0x81, 0x40, + 0xcf, 0x42, 0x69, 0x97, 0xfd, 0x5f, 0xae, 0x4e, 0x5b, 0x97, 0xac, 0x2b, 0xe5, 0xf9, 0xc9, 0xdf, + 0xdc, 0xaf, 0x7c, 0xec, 0x60, 0xbf, 0x52, 0xba, 0x2b, 0xca, 0xb1, 0xc2, 0x40, 0x97, 0x61, 0x68, + 0x23, 0x5a, 0xdb, 0x6b, 0x91, 0xe9, 0x02, 0xc3, 0x1d, 0x17, 0xb8, 0x43, 0x4b, 0x75, 0x5a, 0x8a, + 0x05, 0x14, 0x5d, 0x85, 0x72, 0xcb, 0x09, 0x63, 0x2f, 0xf6, 0x02, 0x7f, 0xba, 0x78, 0xc9, 0xba, + 0x32, 0x38, 0x3f, 0x25, 0x50, 0xcb, 0x35, 0x09, 0xc0, 0x09, 0x0e, 0xed, 0x46, 0x48, 0x1c, 0xf7, + 0xb6, 0xdf, 0xdc, 0x9b, 0x1e, 0xb8, 0x64, 0x5d, 0x29, 0x25, 0xdd, 0xc0, 0xa2, 0x1c, 0x2b, 0x0c, + 0xfb, 0x87, 0x0b, 0x50, 0x9a, 0xdb, 0xd8, 0xf0, 0x7c, 0x2f, 0xde, 0x43, 0x77, 0x61, 0xd4, 0x0f, + 0x5c, 0x22, 0xff, 0xb3, 0xaf, 0x18, 0xb9, 0x76, 0x69, 0xb6, 0x73, 0x29, 0xcd, 0xae, 0x6a, 0x78, + 0xf3, 0x93, 0x07, 0xfb, 0x95, 0x51, 0xbd, 0x04, 0x1b, 0x74, 0x10, 0x86, 0x91, 0x56, 0xe0, 0x2a, + 0xb2, 0x05, 0x46, 0xb6, 0x92, 0x45, 0xb6, 0x96, 0xa0, 0xcd, 0x4f, 0x1c, 0xec, 0x57, 0x46, 0xb4, + 0x02, 0xac, 0x13, 0x41, 0xeb, 0x30, 0x41, 0xff, 0xfa, 0xb1, 0xa7, 0xe8, 0x16, 0x19, 0xdd, 0x27, + 0xf3, 0xe8, 0x6a, 0xa8, 0xf3, 0xa7, 0x0e, 0xf6, 0x2b, 0x13, 0xa9, 0x42, 0x9c, 0x26, 0x68, 0xbf, + 0x0f, 0xe3, 0x73, 0x71, 0xec, 0x34, 0xb6, 0x88, 0xcb, 0x67, 0x10, 0xbd, 0x08, 0x03, 0xbe, 0xb3, + 0x43, 0xc4, 0xfc, 0x5e, 0x12, 0x03, 0x3b, 0xb0, 0xea, 0xec, 0x90, 0xc3, 0xfd, 0xca, 0xe4, 0x1d, + 0xdf, 0x7b, 0xaf, 0x2d, 0x56, 0x05, 0x2d, 0xc3, 0x0c, 0x1b, 0x5d, 0x03, 0x70, 0xc9, 0xae, 0xd7, + 0x20, 0x35, 0x27, 0xde, 0x12, 0xf3, 0x8d, 0x44, 0x5d, 0xa8, 0x2a, 0x08, 0xd6, 0xb0, 0xec, 0x07, + 0x50, 0x9e, 0xdb, 0x0d, 0x3c, 0xb7, 0x16, 0xb8, 0x11, 0xda, 0x86, 0x89, 0x56, 0x48, 0x36, 0x48, + 0xa8, 0x8a, 0xa6, 0xad, 0x4b, 0xc5, 0x2b, 0x23, 0xd7, 0xae, 0x64, 0x7e, 0xac, 0x89, 0xba, 0xe8, + 0xc7, 0xe1, 0xde, 0xfc, 0x63, 0xa2, 0xbd, 0x89, 0x14, 0x14, 0xa7, 0x29, 0xdb, 0xff, 0xba, 0x00, + 0x67, 0xe6, 0xde, 0x6f, 0x87, 0xa4, 0xea, 0x45, 0xdb, 0xe9, 0x15, 0xee, 0x7a, 0xd1, 0xf6, 0x6a, + 0x32, 0x02, 0x6a, 0x69, 0x55, 0x45, 0x39, 0x56, 0x18, 0xe8, 0x39, 0x18, 0xa6, 0xbf, 0xef, 0xe0, + 0x65, 0xf1, 0xc9, 0xa7, 0x04, 0xf2, 0x48, 0xd5, 0x89, 0x9d, 0x2a, 0x07, 0x61, 0x89, 0x83, 0x56, + 0x60, 0xa4, 0xc1, 0x36, 0xe4, 0xe6, 0x4a, 0xe0, 0x12, 0x36, 0x99, 0xe5, 0xf9, 0x67, 0x28, 0xfa, + 0x42, 0x52, 0x7c, 0xb8, 0x5f, 0x99, 0xe6, 0x7d, 0x13, 0x24, 0x34, 0x18, 0xd6, 0xeb, 0x23, 0x5b, + 0xed, 0xaf, 0x01, 0x46, 0x09, 0x32, 0xf6, 0xd6, 0x15, 0x6d, 0xab, 0x0c, 0xb2, 0xad, 0x32, 0x9a, + 0xbd, 0x4d, 0xd0, 0xf3, 0x30, 0xb0, 0xed, 0xf9, 0xee, 0xf4, 0x10, 0xa3, 0x75, 0x81, 0xce, 0xf9, + 0x4d, 0xcf, 0x77, 0x0f, 0xf7, 0x2b, 0x53, 0x46, 0x77, 0x68, 0x21, 0x66, 0xa8, 0xf6, 0x9f, 0x58, + 0x50, 0x61, 0xb0, 0x25, 0xaf, 0x49, 0x6a, 0x24, 0x8c, 0xbc, 0x28, 0x26, 0x7e, 0x6c, 0x0c, 0xe8, + 0x35, 0x80, 0x88, 0x34, 0x42, 0x12, 0x6b, 0x43, 0xaa, 0x16, 0x46, 0x5d, 0x41, 0xb0, 0x86, 0x45, + 0x0f, 0x84, 0x68, 0xcb, 0x09, 0xd9, 0xfa, 0x12, 0x03, 0xab, 0x0e, 0x84, 0xba, 0x04, 0xe0, 0x04, + 0xc7, 0x38, 0x10, 0x8a, 0xbd, 0x0e, 0x04, 0xf4, 0x59, 0x98, 0x48, 0x1a, 0x8b, 0x5a, 0x4e, 0x43, + 0x0e, 0x20, 0xdb, 0x32, 0x75, 0x13, 0x84, 0xd3, 0xb8, 0xf6, 0x3f, 0xb0, 0xc4, 0xe2, 0xa1, 0x5f, + 0xfd, 0x11, 0xff, 0x56, 0xfb, 0x97, 0x2d, 0x18, 0x9e, 0xf7, 0x7c, 0xd7, 0xf3, 0x37, 0xd1, 0x3b, + 0x50, 0xa2, 0x77, 0x93, 0xeb, 0xc4, 0x8e, 0x38, 0xf7, 0x3e, 0xa5, 0xed, 0x2d, 0x75, 0x55, 0xcc, + 0xb6, 0xb6, 0x37, 0x69, 0x41, 0x34, 0x4b, 0xb1, 0xe9, 0x6e, 0xbb, 0xbd, 0xfe, 0x2e, 0x69, 0xc4, + 0x2b, 0x24, 0x76, 0x92, 0xcf, 0x49, 0xca, 0xb0, 0xa2, 0x8a, 0x6e, 0xc2, 0x50, 0xec, 0x84, 0x9b, + 0x24, 0x16, 0x07, 0x60, 0xe6, 0x41, 0xc5, 0x6b, 0x62, 0xba, 0x23, 0x89, 0xdf, 0x20, 0xc9, 0xb5, + 0xb0, 0xc6, 0xaa, 0x62, 0x41, 0xc2, 0xfe, 0xab, 0xc3, 0x70, 0x6e, 0xa1, 0xbe, 0x9c, 0xb3, 0xae, + 0x2e, 0xc3, 0x90, 0x1b, 0x7a, 0xbb, 0x24, 0x14, 0xe3, 0xac, 0xa8, 0x54, 0x59, 0x29, 0x16, 0x50, + 0xf4, 0x0a, 0x8c, 0xf2, 0x0b, 0xe9, 0x86, 0xe3, 0xbb, 0x4d, 0x39, 0xc4, 0xa7, 0x05, 0xf6, 0xe8, + 0x5d, 0x0d, 0x86, 0x0d, 0xcc, 0x23, 0x2e, 0xaa, 0xcb, 0xa9, 0xcd, 0x98, 0x77, 0xd9, 0x7d, 0xd9, + 0x82, 0x49, 0xde, 0xcc, 0x5c, 0x1c, 0x87, 0xde, 0x7a, 0x3b, 0x26, 0xd1, 0xf4, 0x20, 0x3b, 0xe9, + 0x16, 0xb2, 0x46, 0x2b, 0x77, 0x04, 0x66, 0xef, 0xa6, 0xa8, 0xf0, 0x43, 0x70, 0x5a, 0xb4, 0x3b, + 0x99, 0x06, 0xe3, 0x8e, 0x66, 0xd1, 0xf7, 0x58, 0x30, 0xd3, 0x08, 0xfc, 0x38, 0x0c, 0x9a, 0x4d, + 0x12, 0xd6, 0xda, 0xeb, 0x4d, 0x2f, 0xda, 0xe2, 0xeb, 0x14, 0x93, 0x0d, 0x76, 0x12, 0xe4, 0xcc, + 0xa1, 0x42, 0x12, 0x73, 0x78, 0xf1, 0x60, 0xbf, 0x32, 0xb3, 0x90, 0x4b, 0x0a, 0x77, 0x69, 0x06, + 0x6d, 0x03, 0xa2, 0x57, 0x69, 0x3d, 0x76, 0x36, 0x49, 0xd2, 0xf8, 0x70, 0xff, 0x8d, 0x9f, 0x3d, + 0xd8, 0xaf, 0xa0, 0xd5, 0x0e, 0x12, 0x38, 0x83, 0x2c, 0x7a, 0x0f, 0x4e, 0xd3, 0xd2, 0x8e, 0x6f, + 0x2d, 0xf5, 0xdf, 0xdc, 0xf4, 0xc1, 0x7e, 0xe5, 0xf4, 0x6a, 0x06, 0x11, 0x9c, 0x49, 0x1a, 0x7d, + 0xb7, 0x05, 0xe7, 0x92, 0xcf, 0x5f, 0x7c, 0xd0, 0x72, 0x7c, 0x37, 0x69, 0xb8, 0xdc, 0x7f, 0xc3, + 0xf4, 0x4c, 0x3e, 0xb7, 0x90, 0x47, 0x09, 0xe7, 0x37, 0x32, 0xb3, 0x00, 0x67, 0x32, 0x57, 0x0b, + 0x9a, 0x84, 0xe2, 0x36, 0xe1, 0x5c, 0x50, 0x19, 0xd3, 0x9f, 0xe8, 0x34, 0x0c, 0xee, 0x3a, 0xcd, + 0xb6, 0xd8, 0x28, 0x98, 0xff, 0xf9, 0x4c, 0xe1, 0x15, 0xcb, 0xfe, 0x37, 0x45, 0x98, 0x58, 0xa8, + 0x2f, 0x3f, 0xd4, 0x2e, 0xd4, 0xaf, 0xa1, 0x42, 0xd7, 0x6b, 0x28, 0xb9, 0xd4, 0x8a, 0xb9, 0x97, + 0xda, 0xff, 0x9f, 0xb1, 0x85, 0x06, 0xd8, 0x16, 0xfa, 0x96, 0x9c, 0x2d, 0x74, 0xcc, 0x1b, 0x67, + 0x37, 0x67, 0x15, 0x0d, 0xb2, 0xc9, 0xcc, 0xe4, 0x58, 0x6e, 0x05, 0x0d, 0xa7, 0x99, 0x3e, 0xfa, + 0x8e, 0xb8, 0x94, 0x8e, 0x67, 0x1e, 0x1b, 0x30, 0xba, 0xe0, 0xb4, 0x9c, 0x75, 0xaf, 0xe9, 0xc5, + 0x1e, 0x89, 0xd0, 0x53, 0x50, 0x74, 0x5c, 0x97, 0x71, 0x5b, 0xe5, 0xf9, 0x33, 0x07, 0xfb, 0x95, + 0xe2, 0x9c, 0x4b, 0xaf, 0x7d, 0x50, 0x58, 0x7b, 0x98, 0x62, 0xa0, 0x4f, 0xc2, 0x80, 0x1b, 0x06, + 0xad, 0xe9, 0x02, 0xc3, 0xa4, 0xbb, 0x6e, 0xa0, 0x1a, 0x06, 0xad, 0x14, 0x2a, 0xc3, 0xb1, 0x7f, + 0xad, 0x00, 0xe7, 0x17, 0x48, 0x6b, 0x6b, 0xa9, 0x9e, 0x73, 0x7e, 0x5f, 0x81, 0xd2, 0x4e, 0xe0, + 0x7b, 0x71, 0x10, 0x46, 0xa2, 0x69, 0xb6, 0x22, 0x56, 0x44, 0x19, 0x56, 0x50, 0x74, 0x09, 0x06, + 0x5a, 0x09, 0x53, 0x39, 0x2a, 0x19, 0x52, 0xc6, 0x4e, 0x32, 0x08, 0xc5, 0x68, 0x47, 0x24, 0x14, + 0x2b, 0x46, 0x61, 0xdc, 0x89, 0x48, 0x88, 0x19, 0x24, 0xb9, 0x99, 0xe9, 0x9d, 0x2d, 0x4e, 0xe8, + 0xd4, 0xcd, 0x4c, 0x21, 0x58, 0xc3, 0x42, 0x35, 0x28, 0x47, 0xa9, 0x99, 0xed, 0x6b, 0x9b, 0x8e, + 0xb1, 0xab, 0x5b, 0xcd, 0x64, 0x42, 0xc4, 0xb8, 0x51, 0x86, 0x7a, 0x5e, 0xdd, 0x5f, 0x2d, 0x00, + 0xe2, 0x43, 0xf8, 0x17, 0x6c, 0xe0, 0xee, 0x74, 0x0e, 0x5c, 0xff, 0x5b, 0xe2, 0xb8, 0x46, 0xef, + 0x7f, 0x5b, 0x70, 0x7e, 0xc1, 0xf3, 0x5d, 0x12, 0xe6, 0x2c, 0xc0, 0x47, 0x23, 0xcb, 0x1e, 0x8d, + 0x69, 0x30, 0x96, 0xd8, 0xc0, 0x31, 0x2c, 0x31, 0xfb, 0x8f, 0x2d, 0x40, 0xfc, 0xb3, 0x3f, 0x72, + 0x1f, 0x7b, 0xa7, 0xf3, 0x63, 0x8f, 0x61, 0x59, 0xd8, 0xb7, 0x60, 0x7c, 0xa1, 0xe9, 0x11, 0x3f, + 0x5e, 0xae, 0x2d, 0x04, 0xfe, 0x86, 0xb7, 0x89, 0x3e, 0x03, 0xe3, 0xb1, 0xb7, 0x43, 0x82, 0x76, + 0x5c, 0x27, 0x8d, 0xc0, 0x67, 0x92, 0xa4, 0x75, 0x65, 0x70, 0x1e, 0x1d, 0xec, 0x57, 0xc6, 0xd7, + 0x0c, 0x08, 0x4e, 0x61, 0xda, 0xbf, 0x43, 0xc7, 0x2f, 0xd8, 0x69, 0x05, 0x3e, 0xf1, 0xe3, 0x85, + 0xc0, 0x77, 0xb9, 0xc6, 0xe1, 0x33, 0x30, 0x10, 0xd3, 0xf1, 0xe0, 0x63, 0x77, 0x59, 0x6e, 0x14, + 0x3a, 0x0a, 0x87, 0xfb, 0x95, 0xb3, 0x9d, 0x35, 0xd8, 0x38, 0xb1, 0x3a, 0xe8, 0x5b, 0x60, 0x28, + 0x8a, 0x9d, 0xb8, 0x1d, 0x89, 0xd1, 0x7c, 0x42, 0x8e, 0x66, 0x9d, 0x95, 0x1e, 0xee, 0x57, 0x26, + 0x54, 0x35, 0x5e, 0x84, 0x45, 0x05, 0xf4, 0x34, 0x0c, 0xef, 0x90, 0x28, 0x72, 0x36, 0xe5, 0x6d, + 0x38, 0x21, 0xea, 0x0e, 0xaf, 0xf0, 0x62, 0x2c, 0xe1, 0xe8, 0x49, 0x18, 0x24, 0x61, 0x18, 0x84, + 0x62, 0x8f, 0x8e, 0x09, 0xc4, 0xc1, 0x45, 0x5a, 0x88, 0x39, 0xcc, 0xfe, 0xf7, 0x16, 0x4c, 0xa8, + 0xbe, 0xf2, 0xb6, 0x4e, 0x40, 0x2a, 0x78, 0x0b, 0xa0, 0x21, 0x3f, 0x30, 0x62, 0xb7, 0xc7, 0xc8, + 0xb5, 0xcb, 0x99, 0x17, 0x75, 0xc7, 0x30, 0x26, 0x94, 0x55, 0x51, 0x84, 0x35, 0x6a, 0xf6, 0x3f, + 0xb7, 0xe0, 0x54, 0xea, 0x8b, 0x6e, 0x79, 0x51, 0x8c, 0xde, 0xee, 0xf8, 0xaa, 0xd9, 0xfe, 0xbe, + 0x8a, 0xd6, 0x66, 0xdf, 0xa4, 0x96, 0xb2, 0x2c, 0xd1, 0xbe, 0xe8, 0x06, 0x0c, 0x7a, 0x31, 0xd9, + 0x91, 0x1f, 0xf3, 0x64, 0xd7, 0x8f, 0xe1, 0xbd, 0x4a, 0x66, 0x64, 0x99, 0xd6, 0xc4, 0x9c, 0x80, + 0xfd, 0x37, 0x8a, 0x50, 0xe6, 0xcb, 0x76, 0xc5, 0x69, 0x9d, 0xc0, 0x5c, 0x2c, 0xc3, 0x00, 0xa3, + 0xce, 0x3b, 0xfe, 0x54, 0x76, 0xc7, 0x45, 0x77, 0x66, 0xa9, 0xc8, 0xcf, 0x99, 0x23, 0x75, 0x35, + 0xd0, 0x22, 0xcc, 0x48, 0x20, 0x07, 0x60, 0xdd, 0xf3, 0x9d, 0x70, 0x8f, 0x96, 0x4d, 0x17, 0x19, + 0xc1, 0xe7, 0xba, 0x13, 0x9c, 0x57, 0xf8, 0x9c, 0xac, 0xea, 0x6b, 0x02, 0xc0, 0x1a, 0xd1, 0x99, + 0x97, 0xa1, 0xac, 0x90, 0x8f, 0xc2, 0xe3, 0xcc, 0x7c, 0x16, 0x26, 0x52, 0x6d, 0xf5, 0xaa, 0x3e, + 0xaa, 0xb3, 0x48, 0xbf, 0xc2, 0x4e, 0x01, 0xd1, 0xeb, 0x45, 0x7f, 0x57, 0x9c, 0xa2, 0xef, 0xc3, + 0xe9, 0x66, 0xc6, 0xe1, 0x24, 0xa6, 0xaa, 0xff, 0xc3, 0xec, 0xbc, 0xf8, 0xec, 0xd3, 0x59, 0x50, + 0x9c, 0xd9, 0x06, 0xbd, 0xf6, 0x83, 0x16, 0x5d, 0xf3, 0x4e, 0x53, 0xe7, 0xa0, 0x6f, 0x8b, 0x32, + 0xac, 0xa0, 0xf4, 0x08, 0x3b, 0xad, 0x3a, 0x7f, 0x93, 0xec, 0xd5, 0x49, 0x93, 0x34, 0xe2, 0x20, + 0xfc, 0x50, 0xbb, 0x7f, 0x81, 0x8f, 0x3e, 0x3f, 0x01, 0x47, 0x04, 0x81, 0xe2, 0x4d, 0xb2, 0xc7, + 0xa7, 0x42, 0xff, 0xba, 0x62, 0xd7, 0xaf, 0xfb, 0x39, 0x0b, 0xc6, 0xd4, 0xd7, 0x9d, 0xc0, 0x56, + 0x9f, 0x37, 0xb7, 0xfa, 0x85, 0xae, 0x0b, 0x3c, 0x67, 0x93, 0x7f, 0xb5, 0x00, 0xe7, 0x14, 0x0e, + 0x65, 0xf7, 0xf9, 0x1f, 0xb1, 0xaa, 0xae, 0x42, 0xd9, 0x57, 0x8a, 0x28, 0xcb, 0xd4, 0x00, 0x25, + 0x6a, 0xa8, 0x04, 0x87, 0x72, 0x6d, 0x7e, 0xa2, 0x2d, 0x1a, 0xd5, 0x35, 0xb4, 0x42, 0x1b, 0x3b, + 0x0f, 0xc5, 0xb6, 0xe7, 0x8a, 0x3b, 0xe3, 0x53, 0x72, 0xb4, 0xef, 0x2c, 0x57, 0x0f, 0xf7, 0x2b, + 0x4f, 0xe4, 0xbd, 0x0e, 0xd0, 0xcb, 0x2a, 0x9a, 0xbd, 0xb3, 0x5c, 0xc5, 0xb4, 0x32, 0x9a, 0x83, + 0x09, 0xf9, 0x00, 0x72, 0x97, 0x72, 0x50, 0x81, 0x2f, 0xae, 0x16, 0xa5, 0x66, 0xc5, 0x26, 0x18, + 0xa7, 0xf1, 0x51, 0x15, 0x26, 0xb7, 0xdb, 0xeb, 0xa4, 0x49, 0x62, 0xfe, 0xc1, 0x37, 0x09, 0x57, + 0x42, 0x96, 0x13, 0x61, 0xeb, 0x66, 0x0a, 0x8e, 0x3b, 0x6a, 0xd8, 0x7f, 0xce, 0x8e, 0x78, 0x31, + 0x7a, 0xb5, 0x30, 0xa0, 0x0b, 0x8b, 0x52, 0xff, 0x30, 0x97, 0x73, 0x3f, 0xab, 0xe2, 0x26, 0xd9, + 0x5b, 0x0b, 0x28, 0xb3, 0x9d, 0xbd, 0x2a, 0x8c, 0x35, 0x3f, 0xd0, 0x75, 0xcd, 0xff, 0x42, 0x01, + 0xce, 0xa8, 0x11, 0x30, 0xf8, 0xba, 0xbf, 0xe8, 0x63, 0xf0, 0x3c, 0x8c, 0xb8, 0x64, 0xc3, 0x69, + 0x37, 0x63, 0xa5, 0x11, 0x1f, 0xe4, 0xaf, 0x22, 0xd5, 0xa4, 0x18, 0xeb, 0x38, 0x47, 0x18, 0xb6, + 0x9f, 0x18, 0x61, 0x77, 0x6b, 0xec, 0xd0, 0x35, 0xae, 0x76, 0x8d, 0x95, 0xbb, 0x6b, 0x9e, 0x84, + 0x41, 0x6f, 0x87, 0xf2, 0x5a, 0x05, 0x93, 0x85, 0x5a, 0xa6, 0x85, 0x98, 0xc3, 0xd0, 0x27, 0x60, + 0xb8, 0x11, 0xec, 0xec, 0x38, 0xbe, 0xcb, 0xae, 0xbc, 0xf2, 0xfc, 0x08, 0x65, 0xc7, 0x16, 0x78, + 0x11, 0x96, 0x30, 0x74, 0x1e, 0x06, 0x9c, 0x70, 0x93, 0xab, 0x25, 0xca, 0xf3, 0x25, 0xda, 0xd2, + 0x5c, 0xb8, 0x19, 0x61, 0x56, 0x4a, 0xa5, 0xaa, 0xfb, 0x41, 0xb8, 0xed, 0xf9, 0x9b, 0x55, 0x2f, + 0x14, 0x5b, 0x42, 0xdd, 0x85, 0xf7, 0x14, 0x04, 0x6b, 0x58, 0x68, 0x09, 0x06, 0x5b, 0x41, 0x18, + 0x47, 0xd3, 0x43, 0x6c, 0xb8, 0x9f, 0xc8, 0x39, 0x88, 0xf8, 0xd7, 0xd6, 0x82, 0x30, 0x4e, 0x3e, + 0x80, 0xfe, 0x8b, 0x30, 0xaf, 0x8e, 0xbe, 0x05, 0x8a, 0xc4, 0xdf, 0x9d, 0x1e, 0x66, 0x54, 0x66, + 0xb2, 0xa8, 0x2c, 0xfa, 0xbb, 0x77, 0x9d, 0x30, 0x39, 0xa5, 0x17, 0xfd, 0x5d, 0x4c, 0xeb, 0xa0, + 0xcf, 0x43, 0x59, 0x6e, 0xf1, 0x48, 0x68, 0xcc, 0x32, 0x97, 0x98, 0x3c, 0x18, 0x30, 0x79, 0xaf, + 0xed, 0x85, 0x64, 0x87, 0xf8, 0x71, 0x94, 0x9c, 0x69, 0x12, 0x1a, 0xe1, 0x84, 0x1a, 0xfa, 0xbc, + 0x54, 0xd3, 0xae, 0x04, 0x6d, 0x3f, 0x8e, 0xa6, 0xcb, 0xac, 0x7b, 0x99, 0x0f, 0x68, 0x77, 0x13, + 0xbc, 0xb4, 0x1e, 0x97, 0x57, 0xc6, 0x06, 0x29, 0x84, 0x61, 0xac, 0xe9, 0xed, 0x12, 0x9f, 0x44, + 0x51, 0x2d, 0x0c, 0xd6, 0xc9, 0x34, 0xb0, 0x9e, 0x9f, 0xcb, 0x7e, 0x57, 0x0a, 0xd6, 0xc9, 0xfc, + 0xd4, 0xc1, 0x7e, 0x65, 0xec, 0x96, 0x5e, 0x07, 0x9b, 0x24, 0xd0, 0x1d, 0x18, 0xa7, 0x72, 0x8d, + 0x97, 0x10, 0x1d, 0xe9, 0x45, 0x94, 0x49, 0x1f, 0xd8, 0xa8, 0x84, 0x53, 0x44, 0xd0, 0x1b, 0x50, + 0x6e, 0x7a, 0x1b, 0xa4, 0xb1, 0xd7, 0x68, 0x92, 0xe9, 0x51, 0x46, 0x31, 0x73, 0x5b, 0xdd, 0x92, + 0x48, 0x5c, 0x2e, 0x52, 0x7f, 0x71, 0x52, 0x1d, 0xdd, 0x85, 0xb3, 0x31, 0x09, 0x77, 0x3c, 0xdf, + 0xa1, 0xdb, 0x41, 0xc8, 0x0b, 0xec, 0x75, 0x6e, 0x8c, 0xad, 0xb7, 0x8b, 0x62, 0xe8, 0xce, 0xae, + 0x65, 0x62, 0xe1, 0x9c, 0xda, 0xe8, 0x36, 0x4c, 0xb0, 0x9d, 0x50, 0x6b, 0x37, 0x9b, 0xb5, 0xa0, + 0xe9, 0x35, 0xf6, 0xa6, 0xc7, 0x19, 0xc1, 0x4f, 0xc8, 0x7b, 0x61, 0xd9, 0x04, 0x1f, 0xee, 0x57, + 0x20, 0xf9, 0x87, 0xd3, 0xb5, 0xd1, 0x3a, 0x7b, 0x8e, 0x69, 0x87, 0x5e, 0xbc, 0x47, 0xd7, 0x2f, + 0x79, 0x10, 0x4f, 0x4f, 0x74, 0x15, 0x85, 0x75, 0x54, 0xf5, 0x66, 0xa3, 0x17, 0xe2, 0x34, 0x41, + 0xba, 0xb5, 0xa3, 0xd8, 0xf5, 0xfc, 0xe9, 0x49, 0x76, 0x62, 0xa8, 0x9d, 0x51, 0xa7, 0x85, 0x98, + 0xc3, 0xd8, 0x53, 0x0c, 0xfd, 0x71, 0x9b, 0x9e, 0xa0, 0x53, 0x0c, 0x31, 0x79, 0x8a, 0x91, 0x00, + 0x9c, 0xe0, 0x50, 0xa6, 0x26, 0x8e, 0xf7, 0xa6, 0x11, 0x43, 0x55, 0xdb, 0x65, 0x6d, 0xed, 0xf3, + 0x98, 0x96, 0xa3, 0x5b, 0x30, 0x4c, 0xfc, 0xdd, 0xa5, 0x30, 0xd8, 0x99, 0x3e, 0x95, 0xbf, 0x67, + 0x17, 0x39, 0x0a, 0x3f, 0xd0, 0x13, 0x01, 0x4f, 0x14, 0x63, 0x49, 0x02, 0x3d, 0x80, 0xe9, 0x8c, + 0x19, 0xe1, 0x13, 0x70, 0x9a, 0x4d, 0xc0, 0x6b, 0xa2, 0xee, 0xf4, 0x5a, 0x0e, 0xde, 0x61, 0x17, + 0x18, 0xce, 0xa5, 0x8e, 0xbe, 0x00, 0x63, 0x7c, 0x43, 0xf1, 0x77, 0xdc, 0x68, 0xfa, 0x0c, 0xfb, + 0x9a, 0x4b, 0xf9, 0x9b, 0x93, 0x23, 0xce, 0x9f, 0x11, 0x1d, 0x1a, 0xd3, 0x4b, 0x23, 0x6c, 0x52, + 0xb3, 0xd7, 0x61, 0x5c, 0x9d, 0x5b, 0x6c, 0xe9, 0xa0, 0x0a, 0x0c, 0x32, 0x6e, 0x47, 0xe8, 0xb7, + 0xca, 0x74, 0xa6, 0x18, 0x27, 0x84, 0x79, 0x39, 0x9b, 0x29, 0xef, 0x7d, 0x32, 0xbf, 0x17, 0x13, + 0x2e, 0x55, 0x17, 0xb5, 0x99, 0x92, 0x00, 0x9c, 0xe0, 0xd8, 0xff, 0x97, 0x73, 0x8d, 0xc9, 0xe1, + 0xd8, 0xc7, 0x75, 0xf0, 0x2c, 0x94, 0xb6, 0x82, 0x28, 0xa6, 0xd8, 0xac, 0x8d, 0xc1, 0x84, 0x4f, + 0xbc, 0x21, 0xca, 0xb1, 0xc2, 0x40, 0xaf, 0xc2, 0x58, 0x43, 0x6f, 0x40, 0xdc, 0x65, 0x6a, 0x08, + 0x8c, 0xd6, 0xb1, 0x89, 0x8b, 0x5e, 0x81, 0x12, 0xb3, 0xc2, 0x68, 0x04, 0x4d, 0xc1, 0x64, 0xc9, + 0x0b, 0xb9, 0x54, 0x13, 0xe5, 0x87, 0xda, 0x6f, 0xac, 0xb0, 0xd1, 0x65, 0x18, 0xa2, 0x5d, 0x58, + 0xae, 0x89, 0x5b, 0x44, 0xa9, 0x6a, 0x6e, 0xb0, 0x52, 0x2c, 0xa0, 0xf6, 0x5f, 0x2f, 0x68, 0xa3, + 0x4c, 0x25, 0x52, 0x82, 0x6a, 0x30, 0x7c, 0xdf, 0xf1, 0x62, 0xcf, 0xdf, 0x14, 0xec, 0xc2, 0xd3, + 0x5d, 0xaf, 0x14, 0x56, 0xe9, 0x1e, 0xaf, 0xc0, 0x2f, 0x3d, 0xf1, 0x07, 0x4b, 0x32, 0x94, 0x62, + 0xd8, 0xf6, 0x7d, 0x4a, 0xb1, 0xd0, 0x2f, 0x45, 0xcc, 0x2b, 0x70, 0x8a, 0xe2, 0x0f, 0x96, 0x64, + 0xd0, 0xdb, 0x00, 0x72, 0x59, 0x12, 0x57, 0x58, 0x3f, 0x3c, 0xdb, 0x9b, 0xe8, 0x9a, 0xaa, 0x33, + 0x3f, 0x4e, 0xaf, 0xd4, 0xe4, 0x3f, 0xd6, 0xe8, 0xd9, 0x31, 0x63, 0xab, 0x3a, 0x3b, 0x83, 0xbe, + 0x9d, 0x9e, 0x04, 0x4e, 0x18, 0x13, 0x77, 0x2e, 0x16, 0x83, 0xf3, 0xc9, 0xfe, 0x64, 0x8a, 0x35, + 0x6f, 0x87, 0xe8, 0xa7, 0x86, 0x20, 0x82, 0x13, 0x7a, 0xf6, 0x2f, 0x15, 0x61, 0x3a, 0xaf, 0xbb, + 0x74, 0xd1, 0x91, 0x07, 0x5e, 0xbc, 0x40, 0xb9, 0x21, 0xcb, 0x5c, 0x74, 0x8b, 0xa2, 0x1c, 0x2b, + 0x0c, 0x3a, 0xfb, 0x91, 0xb7, 0x29, 0x45, 0xc2, 0xc1, 0x64, 0xf6, 0xeb, 0xac, 0x14, 0x0b, 0x28, + 0xc5, 0x0b, 0x89, 0x13, 0x09, 0xf3, 0x1a, 0x6d, 0x95, 0x60, 0x56, 0x8a, 0x05, 0x54, 0xd7, 0x37, + 0x0d, 0xf4, 0xd0, 0x37, 0x19, 0x43, 0x34, 0x78, 0xbc, 0x43, 0x84, 0xbe, 0x08, 0xb0, 0xe1, 0xf9, + 0x5e, 0xb4, 0xc5, 0xa8, 0x0f, 0x1d, 0x99, 0xba, 0xe2, 0xa5, 0x96, 0x14, 0x15, 0xac, 0x51, 0x44, + 0x2f, 0xc1, 0x88, 0xda, 0x80, 0xcb, 0x55, 0xf6, 0xd6, 0xa8, 0xd9, 0x6e, 0x24, 0xa7, 0x51, 0x15, + 0xeb, 0x78, 0xf6, 0xbb, 0xe9, 0xf5, 0x22, 0x76, 0x80, 0x36, 0xbe, 0x56, 0xbf, 0xe3, 0x5b, 0xe8, + 0x3e, 0xbe, 0xf6, 0xaf, 0x17, 0x61, 0xc2, 0x68, 0xac, 0x1d, 0xf5, 0x71, 0x66, 0x5d, 0xa7, 0xf7, + 0x9c, 0x13, 0x13, 0xb1, 0xff, 0xec, 0xde, 0x5b, 0x45, 0xbf, 0x0b, 0xe9, 0x0e, 0xe0, 0xf5, 0xd1, + 0x17, 0xa1, 0xdc, 0x74, 0x22, 0xa6, 0xbb, 0x22, 0x62, 0xdf, 0xf5, 0x43, 0x2c, 0x91, 0x23, 0x9c, + 0x28, 0xd6, 0xae, 0x1a, 0x4e, 0x3b, 0x21, 0x49, 0x2f, 0x64, 0xca, 0xfb, 0x48, 0xfb, 0x2d, 0xd5, + 0x09, 0xca, 0x20, 0xed, 0x61, 0x0e, 0x43, 0xaf, 0xc0, 0x68, 0x48, 0xd8, 0xaa, 0x58, 0xa0, 0xac, + 0x1c, 0x5b, 0x66, 0x83, 0x09, 0xcf, 0x87, 0x35, 0x18, 0x36, 0x30, 0x13, 0x56, 0x7e, 0xa8, 0x0b, + 0x2b, 0xff, 0x34, 0x0c, 0xb3, 0x1f, 0x6a, 0x05, 0xa8, 0xd9, 0x58, 0xe6, 0xc5, 0x58, 0xc2, 0xd3, + 0x0b, 0xa6, 0xd4, 0xe7, 0x82, 0xf9, 0x24, 0x8c, 0x57, 0x1d, 0xb2, 0x13, 0xf8, 0x8b, 0xbe, 0xdb, + 0x0a, 0x3c, 0x3f, 0x46, 0xd3, 0x30, 0xc0, 0x6e, 0x07, 0xbe, 0xb7, 0x07, 0x28, 0x05, 0x3c, 0x40, + 0x19, 0x73, 0x7b, 0x13, 0xce, 0x54, 0x83, 0xfb, 0xfe, 0x7d, 0x27, 0x74, 0xe7, 0x6a, 0xcb, 0x9a, + 0x9c, 0xbb, 0x2a, 0xe5, 0x2c, 0x6e, 0x0f, 0x95, 0x79, 0xa6, 0x6a, 0x35, 0xf9, 0x5d, 0xbb, 0xe4, + 0x35, 0x49, 0x8e, 0x36, 0xe2, 0x6f, 0x15, 0x8c, 0x96, 0x12, 0x7c, 0xf5, 0x60, 0x64, 0xe5, 0x3e, + 0x18, 0xbd, 0x09, 0xa5, 0x0d, 0x8f, 0x34, 0x5d, 0x4c, 0x36, 0xc4, 0x12, 0x7b, 0x2a, 0xdf, 0xc4, + 0x63, 0x89, 0x62, 0x4a, 0xed, 0x13, 0x97, 0xd2, 0x96, 0x44, 0x65, 0xac, 0xc8, 0xa0, 0x6d, 0x98, + 0x94, 0x62, 0x80, 0x84, 0x8a, 0x05, 0xf7, 0x74, 0x37, 0xd9, 0xc2, 0x24, 0x7e, 0xfa, 0x60, 0xbf, + 0x32, 0x89, 0x53, 0x64, 0x70, 0x07, 0x61, 0x2a, 0x96, 0xed, 0xd0, 0xa3, 0x75, 0x80, 0x0d, 0x3f, + 0x13, 0xcb, 0x98, 0x84, 0xc9, 0x4a, 0xed, 0x1f, 0xb5, 0xe0, 0xb1, 0x8e, 0x91, 0x11, 0x92, 0xf6, + 0x31, 0xcf, 0x42, 0x5a, 0xf2, 0x2d, 0xf4, 0x96, 0x7c, 0xed, 0x9f, 0xb5, 0xe0, 0xf4, 0xe2, 0x4e, + 0x2b, 0xde, 0xab, 0x7a, 0xe6, 0xeb, 0xce, 0xcb, 0x30, 0xb4, 0x43, 0x5c, 0xaf, 0xbd, 0x23, 0x66, + 0xae, 0x22, 0x8f, 0x9f, 0x15, 0x56, 0x7a, 0xb8, 0x5f, 0x19, 0xab, 0xc7, 0x41, 0xe8, 0x6c, 0x12, + 0x5e, 0x80, 0x05, 0x3a, 0x3b, 0xc4, 0xbd, 0xf7, 0xc9, 0x2d, 0x6f, 0xc7, 0x93, 0x26, 0x3b, 0x5d, + 0x75, 0x67, 0xb3, 0x72, 0x40, 0x67, 0xdf, 0x6c, 0x3b, 0x7e, 0xec, 0xc5, 0x7b, 0xe2, 0x61, 0x46, + 0x12, 0xc1, 0x09, 0x3d, 0xfb, 0xeb, 0x16, 0x4c, 0xc8, 0x75, 0x3f, 0xe7, 0xba, 0x21, 0x89, 0x22, + 0x34, 0x03, 0x05, 0xaf, 0x25, 0x7a, 0x09, 0xa2, 0x97, 0x85, 0xe5, 0x1a, 0x2e, 0x78, 0x2d, 0x54, + 0x83, 0x32, 0xb7, 0xfc, 0x49, 0x16, 0x57, 0x5f, 0xf6, 0x43, 0xac, 0x07, 0x6b, 0xb2, 0x26, 0x4e, + 0x88, 0x48, 0x0e, 0x8e, 0x9d, 0x99, 0x45, 0xf3, 0xd5, 0xeb, 0x86, 0x28, 0xc7, 0x0a, 0x03, 0x5d, + 0x81, 0x92, 0x1f, 0xb8, 0xdc, 0x10, 0x8b, 0xdf, 0x7e, 0x6c, 0xc9, 0xae, 0x8a, 0x32, 0xac, 0xa0, + 0xf6, 0x0f, 0x5a, 0x30, 0x2a, 0xbf, 0xac, 0x4f, 0x66, 0x92, 0x6e, 0xad, 0x84, 0x91, 0x4c, 0xb6, + 0x16, 0x65, 0x06, 0x19, 0xc4, 0xe0, 0x01, 0x8b, 0x47, 0xe1, 0x01, 0xed, 0x1f, 0x29, 0xc0, 0xb8, + 0xec, 0x4e, 0xbd, 0xbd, 0x1e, 0x91, 0x18, 0xad, 0x41, 0xd9, 0xe1, 0x43, 0x4e, 0xe4, 0x8a, 0x7d, + 0x32, 0x5b, 0xf8, 0x30, 0xe6, 0x27, 0xb9, 0x96, 0xe7, 0x64, 0x6d, 0x9c, 0x10, 0x42, 0x4d, 0x98, + 0xf2, 0x83, 0x98, 0x1d, 0xd1, 0x0a, 0xde, 0xed, 0x09, 0x24, 0x4d, 0xfd, 0x9c, 0xa0, 0x3e, 0xb5, + 0x9a, 0xa6, 0x82, 0x3b, 0x09, 0xa3, 0x45, 0xa9, 0xf0, 0x28, 0xe6, 0x8b, 0x1b, 0xfa, 0x2c, 0x64, + 0xeb, 0x3b, 0xec, 0x5f, 0xb5, 0xa0, 0x2c, 0xd1, 0x4e, 0xe2, 0xb5, 0x6b, 0x05, 0x86, 0x23, 0x36, + 0x09, 0x72, 0x68, 0xec, 0x6e, 0x1d, 0xe7, 0xf3, 0x95, 0xdc, 0x3c, 0xfc, 0x7f, 0x84, 0x25, 0x0d, + 0xa6, 0xef, 0x56, 0xdd, 0xff, 0x88, 0xe8, 0xbb, 0x55, 0x7f, 0x72, 0x6e, 0x98, 0x3f, 0x60, 0x7d, + 0xd6, 0xc4, 0x5a, 0xca, 0x20, 0xb5, 0x42, 0xb2, 0xe1, 0x3d, 0x48, 0x33, 0x48, 0x35, 0x56, 0x8a, + 0x05, 0x14, 0xbd, 0x0d, 0xa3, 0x0d, 0xa9, 0xe8, 0x4c, 0x8e, 0x81, 0xcb, 0x5d, 0x95, 0xee, 0xea, + 0x7d, 0x86, 0x1b, 0x69, 0x2f, 0x68, 0xf5, 0xb1, 0x41, 0xcd, 0x7c, 0x6e, 0x2f, 0xf6, 0x7a, 0x6e, + 0x4f, 0xe8, 0xe6, 0x3f, 0x3e, 0xff, 0x98, 0x05, 0x43, 0x5c, 0x5d, 0xd6, 0x9f, 0x7e, 0x51, 0x7b, + 0xae, 0x4a, 0xc6, 0xee, 0x2e, 0x2d, 0x14, 0xcf, 0x4f, 0x68, 0x05, 0xca, 0xec, 0x07, 0x53, 0x1b, + 0x14, 0xf3, 0xad, 0xd3, 0x79, 0xab, 0x7a, 0x07, 0xef, 0xca, 0x6a, 0x38, 0xa1, 0x60, 0xff, 0x50, + 0x91, 0x1e, 0x55, 0x09, 0xaa, 0x71, 0x83, 0x5b, 0x8f, 0xee, 0x06, 0x2f, 0x3c, 0xaa, 0x1b, 0x7c, + 0x13, 0x26, 0x1a, 0xda, 0xe3, 0x56, 0x32, 0x93, 0x57, 0xba, 0x2e, 0x12, 0xed, 0x1d, 0x8c, 0xab, + 0x8c, 0x16, 0x4c, 0x22, 0x38, 0x4d, 0x15, 0x7d, 0x3b, 0x8c, 0xf2, 0x79, 0x16, 0xad, 0x70, 0x8b, + 0x85, 0x4f, 0xe4, 0xaf, 0x17, 0xbd, 0x09, 0xb6, 0x12, 0xeb, 0x5a, 0x75, 0x6c, 0x10, 0xb3, 0x7f, + 0xa9, 0x04, 0x83, 0x8b, 0xbb, 0xc4, 0x8f, 0x4f, 0xe0, 0x40, 0x6a, 0xc0, 0xb8, 0xe7, 0xef, 0x06, + 0xcd, 0x5d, 0xe2, 0x72, 0xf8, 0x51, 0x2e, 0xd7, 0xb3, 0x82, 0xf4, 0xf8, 0xb2, 0x41, 0x02, 0xa7, + 0x48, 0x3e, 0x0a, 0x09, 0xf3, 0x3a, 0x0c, 0xf1, 0xb9, 0x17, 0xe2, 0x65, 0xa6, 0x32, 0x98, 0x0d, + 0xa2, 0xd8, 0x05, 0x89, 0xf4, 0xcb, 0xb5, 0xcf, 0xa2, 0x3a, 0x7a, 0x17, 0xc6, 0x37, 0xbc, 0x30, + 0x8a, 0xa9, 0x68, 0x18, 0xc5, 0xce, 0x4e, 0xeb, 0x21, 0x24, 0x4a, 0x35, 0x0e, 0x4b, 0x06, 0x25, + 0x9c, 0xa2, 0x8c, 0x36, 0x61, 0x8c, 0x0a, 0x39, 0x49, 0x53, 0xc3, 0x47, 0x6e, 0x4a, 0xa9, 0x8c, + 0x6e, 0xe9, 0x84, 0xb0, 0x49, 0x97, 0x1e, 0x26, 0x0d, 0x26, 0x14, 0x95, 0x18, 0x47, 0xa1, 0x0e, + 0x13, 0x2e, 0x0d, 0x71, 0x18, 0x3d, 0x93, 0x98, 0xd9, 0x4a, 0xd9, 0x3c, 0x93, 0x34, 0xe3, 0x94, + 0x77, 0xa0, 0x4c, 0xe8, 0x10, 0x52, 0xc2, 0x42, 0x31, 0x7e, 0xb5, 0xbf, 0xbe, 0xae, 0x78, 0x8d, + 0x30, 0x30, 0x65, 0xf9, 0x45, 0x49, 0x09, 0x27, 0x44, 0xd1, 0x02, 0x0c, 0x45, 0x24, 0xf4, 0x48, + 0x24, 0x54, 0xe4, 0x5d, 0xa6, 0x91, 0xa1, 0x71, 0x8b, 0x4f, 0xfe, 0x1b, 0x8b, 0xaa, 0x74, 0x79, + 0x39, 0x4c, 0x1a, 0x62, 0x5a, 0x71, 0x6d, 0x79, 0xcd, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, 0x0d, 0x18, + 0x0e, 0x49, 0x93, 0x29, 0x8b, 0xc6, 0xfa, 0x5f, 0xe4, 0x5c, 0xf7, 0xc4, 0xeb, 0x61, 0x49, 0x00, + 0xdd, 0x04, 0x14, 0x12, 0xca, 0x43, 0x78, 0xfe, 0xa6, 0x32, 0xe6, 0x10, 0xba, 0xee, 0xc7, 0x45, + 0xfb, 0xa7, 0x70, 0x82, 0x21, 0x8d, 0x6f, 0x71, 0x46, 0x35, 0x74, 0x1d, 0xa6, 0x54, 0xe9, 0xb2, + 0x1f, 0xc5, 0x8e, 0xdf, 0x20, 0x4c, 0xcd, 0x5d, 0x4e, 0xb8, 0x22, 0x9c, 0x46, 0xc0, 0x9d, 0x75, + 0xec, 0x9f, 0xa6, 0xec, 0x0c, 0x1d, 0xad, 0x13, 0xe0, 0x05, 0x5e, 0x37, 0x79, 0x81, 0x73, 0xb9, + 0x33, 0x97, 0xc3, 0x07, 0x1c, 0x58, 0x30, 0xa2, 0xcd, 0x6c, 0xb2, 0x66, 0xad, 0x2e, 0x6b, 0xb6, + 0x0d, 0x93, 0x74, 0xa5, 0xdf, 0x5e, 0x8f, 0x48, 0xb8, 0x4b, 0x5c, 0xb6, 0x30, 0x0b, 0x0f, 0xb7, + 0x30, 0xd5, 0x2b, 0xf3, 0xad, 0x14, 0x41, 0xdc, 0xd1, 0x04, 0x7a, 0x59, 0x6a, 0x4e, 0x8a, 0x86, + 0x91, 0x16, 0xd7, 0x8a, 0x1c, 0xee, 0x57, 0x26, 0xb5, 0x0f, 0xd1, 0x35, 0x25, 0xf6, 0x3b, 0xf2, + 0x1b, 0xd5, 0x6b, 0x7e, 0x43, 0x2d, 0x96, 0xd4, 0x6b, 0xbe, 0x5a, 0x0e, 0x38, 0xc1, 0xa1, 0x7b, + 0x94, 0x8a, 0x20, 0xe9, 0xd7, 0x7c, 0x2a, 0xa0, 0x60, 0x06, 0xb1, 0x5f, 0x00, 0x58, 0x7c, 0x40, + 0x1a, 0x7c, 0xa9, 0xeb, 0x0f, 0x90, 0x56, 0xfe, 0x03, 0xa4, 0xfd, 0x1f, 0x2d, 0x18, 0x5f, 0x5a, + 0x30, 0xc4, 0xc4, 0x59, 0x00, 0x2e, 0x1b, 0xdd, 0xbb, 0xb7, 0x2a, 0x75, 0xeb, 0x5c, 0x3d, 0xaa, + 0x4a, 0xb1, 0x86, 0x81, 0xce, 0x41, 0xb1, 0xd9, 0xf6, 0x85, 0xc8, 0x32, 0x7c, 0xb0, 0x5f, 0x29, + 0xde, 0x6a, 0xfb, 0x98, 0x96, 0x69, 0x16, 0x82, 0xc5, 0xbe, 0x2d, 0x04, 0x7b, 0x7a, 0xea, 0xa1, + 0x0a, 0x0c, 0xde, 0xbf, 0xef, 0xb9, 0xdc, 0x1f, 0x42, 0xe8, 0xfd, 0xef, 0xdd, 0x5b, 0xae, 0x46, + 0x98, 0x97, 0xdb, 0x5f, 0x29, 0xc2, 0xcc, 0x52, 0x93, 0x3c, 0xf8, 0x80, 0x3e, 0x21, 0xfd, 0xda, + 0x37, 0x1e, 0x8d, 0x5f, 0x3c, 0xaa, 0x0d, 0x6b, 0xef, 0xf1, 0xd8, 0x80, 0x61, 0xfe, 0x98, 0x2d, + 0x3d, 0x44, 0x5e, 0xcd, 0x6a, 0x3d, 0x7f, 0x40, 0x66, 0xf9, 0xa3, 0xb8, 0x30, 0x70, 0x57, 0x37, + 0xad, 0x28, 0xc5, 0x92, 0xf8, 0xcc, 0x67, 0x60, 0x54, 0xc7, 0x3c, 0x92, 0x35, 0xf9, 0x5f, 0x2a, + 0xc2, 0x24, 0xed, 0xc1, 0x23, 0x9d, 0x88, 0x3b, 0x9d, 0x13, 0x71, 0xdc, 0x16, 0xc5, 0xbd, 0x67, + 0xe3, 0xed, 0xf4, 0x6c, 0x3c, 0x9f, 0x37, 0x1b, 0x27, 0x3d, 0x07, 0xdf, 0x63, 0xc1, 0xa9, 0xa5, + 0x66, 0xd0, 0xd8, 0x4e, 0x59, 0xfd, 0xbe, 0x04, 0x23, 0xf4, 0x1c, 0x8f, 0x0c, 0x87, 0x34, 0xc3, + 0x45, 0x51, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0xbb, 0x73, 0x67, 0xb9, 0x9a, 0xe5, 0xd9, 0x28, 0x40, + 0x58, 0xc7, 0xb3, 0xbf, 0x66, 0xc1, 0x85, 0xeb, 0x0b, 0x8b, 0xc9, 0x52, 0xec, 0x70, 0xae, 0xa4, + 0x52, 0xa0, 0xab, 0x75, 0x25, 0x91, 0x02, 0xab, 0xac, 0x17, 0x02, 0xfa, 0x51, 0x71, 0x1c, 0xfe, + 0x29, 0x0b, 0x4e, 0x5d, 0xf7, 0x62, 0x7a, 0x2d, 0xa7, 0xdd, 0xfc, 0xe8, 0xbd, 0x1c, 0x79, 0x71, + 0x10, 0xee, 0xa5, 0xdd, 0xfc, 0xb0, 0x82, 0x60, 0x0d, 0x8b, 0xb7, 0xbc, 0xeb, 0x31, 0x33, 0xaa, + 0x82, 0xa9, 0x8a, 0xc2, 0xa2, 0x1c, 0x2b, 0x0c, 0xfa, 0x61, 0xae, 0x17, 0x32, 0x51, 0x62, 0x4f, + 0x9c, 0xb0, 0xea, 0xc3, 0xaa, 0x12, 0x80, 0x13, 0x1c, 0xfb, 0x8f, 0x2c, 0xa8, 0x5c, 0x6f, 0xb6, + 0xa3, 0x98, 0x84, 0x1b, 0x51, 0xce, 0xe9, 0xf8, 0x02, 0x94, 0x89, 0x14, 0xdc, 0x45, 0xaf, 0x15, + 0xab, 0xa9, 0x24, 0x7a, 0xee, 0x6d, 0xa8, 0xf0, 0xfa, 0xf0, 0x21, 0x38, 0x9a, 0x11, 0xf8, 0x12, + 0x20, 0xa2, 0xb7, 0xa5, 0xbb, 0x5f, 0x32, 0x3f, 0xae, 0xc5, 0x0e, 0x28, 0xce, 0xa8, 0x61, 0xff, + 0xa8, 0x05, 0x67, 0xd4, 0x07, 0x7f, 0xe4, 0x3e, 0xd3, 0xfe, 0xf9, 0x02, 0x8c, 0xdd, 0x58, 0x5b, + 0xab, 0x5d, 0x27, 0xb1, 0xb8, 0xb6, 0x7b, 0xeb, 0xd6, 0xb1, 0xa6, 0x22, 0xec, 0x26, 0x05, 0xb6, + 0x63, 0xaf, 0x39, 0xcb, 0xbd, 0xf8, 0x67, 0x97, 0xfd, 0xf8, 0x76, 0x58, 0x8f, 0x43, 0xcf, 0xdf, + 0xcc, 0x54, 0x2a, 0x4a, 0xe6, 0xa2, 0x98, 0xc7, 0x5c, 0xa0, 0x17, 0x60, 0x88, 0x85, 0x11, 0x90, + 0x93, 0xf0, 0xb8, 0x12, 0xa2, 0x58, 0xe9, 0xe1, 0x7e, 0xa5, 0x7c, 0x07, 0x2f, 0xf3, 0x3f, 0x58, + 0xa0, 0xa2, 0x3b, 0x30, 0xb2, 0x15, 0xc7, 0xad, 0x1b, 0xc4, 0x71, 0x49, 0x28, 0x8f, 0xc3, 0x8b, + 0x59, 0xc7, 0x21, 0x1d, 0x04, 0x8e, 0x96, 0x9c, 0x20, 0x49, 0x59, 0x84, 0x75, 0x3a, 0x76, 0x1d, + 0x20, 0x81, 0x1d, 0x93, 0x42, 0xc5, 0xfe, 0x7d, 0x0b, 0x86, 0xb9, 0x47, 0x67, 0x88, 0x5e, 0x83, + 0x01, 0xf2, 0x80, 0x34, 0x04, 0xab, 0x9c, 0xd9, 0xe1, 0x84, 0xd3, 0xe2, 0xcf, 0x03, 0xf4, 0x3f, + 0x66, 0xb5, 0xd0, 0x0d, 0x18, 0xa6, 0xbd, 0xbd, 0xae, 0xdc, 0x5b, 0x9f, 0xc8, 0xfb, 0x62, 0x35, + 0xed, 0x9c, 0x39, 0x13, 0x45, 0x58, 0x56, 0x67, 0xaa, 0xee, 0x46, 0xab, 0x4e, 0x4f, 0xec, 0xb8, + 0x1b, 0x63, 0xb1, 0xb6, 0x50, 0xe3, 0x48, 0x82, 0x1a, 0x57, 0x75, 0xcb, 0x42, 0x9c, 0x10, 0xb1, + 0xd7, 0xa0, 0x4c, 0x27, 0x75, 0xae, 0xe9, 0x39, 0xdd, 0xb5, 0xec, 0xcf, 0x40, 0x59, 0x6a, 0xbc, + 0x23, 0xe1, 0xc9, 0xc5, 0xa8, 0x4a, 0x85, 0x78, 0x84, 0x13, 0xb8, 0xbd, 0x01, 0xa7, 0x99, 0xa9, + 0x83, 0x13, 0x6f, 0x19, 0x7b, 0xac, 0xf7, 0x62, 0x7e, 0x56, 0x48, 0x9e, 0x7c, 0x66, 0xa6, 0x35, + 0x67, 0x89, 0x51, 0x49, 0x31, 0x91, 0x42, 0xed, 0x3f, 0x1c, 0x80, 0xc7, 0x97, 0xeb, 0xf9, 0xce, + 0xbe, 0xaf, 0xc0, 0x28, 0xe7, 0x4b, 0xe9, 0xd2, 0x76, 0x9a, 0xa2, 0x5d, 0xf5, 0x10, 0xb8, 0xa6, + 0xc1, 0xb0, 0x81, 0x89, 0x2e, 0x40, 0xd1, 0x7b, 0xcf, 0x4f, 0xdb, 0x1d, 0x2f, 0xbf, 0xb9, 0x8a, + 0x69, 0x39, 0x05, 0x53, 0x16, 0x97, 0xdf, 0x1d, 0x0a, 0xac, 0xd8, 0xdc, 0xd7, 0x61, 0xdc, 0x8b, + 0x1a, 0x91, 0xb7, 0xec, 0xd3, 0x73, 0x46, 0x3b, 0xa9, 0x94, 0x56, 0x84, 0x76, 0x5a, 0x41, 0x71, + 0x0a, 0x5b, 0xbb, 0xc8, 0x06, 0xfb, 0x66, 0x93, 0x7b, 0xba, 0x36, 0x51, 0x09, 0xa0, 0xc5, 0xbe, + 0x2e, 0x62, 0x56, 0x7c, 0x42, 0x02, 0xe0, 0x1f, 0x1c, 0x61, 0x09, 0xa3, 0x22, 0x67, 0x63, 0xcb, + 0x69, 0xcd, 0xb5, 0xe3, 0xad, 0xaa, 0x17, 0x35, 0x82, 0x5d, 0x12, 0xee, 0x31, 0x6d, 0x41, 0x29, + 0x11, 0x39, 0x15, 0x60, 0xe1, 0xc6, 0x5c, 0x8d, 0x62, 0xe2, 0xce, 0x3a, 0x26, 0x1b, 0x0c, 0xc7, + 0xc1, 0x06, 0xcf, 0xc1, 0x84, 0x6c, 0xa6, 0x4e, 0x22, 0x76, 0x29, 0x8e, 0xb0, 0x8e, 0x29, 0xdb, + 0x62, 0x51, 0xac, 0xba, 0x95, 0xc6, 0x47, 0x2f, 0xc3, 0x98, 0xe7, 0x7b, 0xb1, 0xe7, 0xc4, 0x41, + 0xc8, 0x58, 0x0a, 0xae, 0x18, 0x60, 0xa6, 0x7b, 0xcb, 0x3a, 0x00, 0x9b, 0x78, 0xf6, 0x7f, 0x1d, + 0x80, 0x29, 0x36, 0x6d, 0xdf, 0x5c, 0x61, 0x1f, 0x99, 0x15, 0x76, 0xa7, 0x73, 0x85, 0x1d, 0x07, + 0x7f, 0xff, 0x61, 0x2e, 0xb3, 0x77, 0xa1, 0xac, 0x8c, 0x9f, 0xa5, 0xf7, 0x83, 0x95, 0xe3, 0xfd, + 0xd0, 0x9b, 0xfb, 0x90, 0xef, 0xd6, 0xc5, 0xcc, 0x77, 0xeb, 0xbf, 0x63, 0x41, 0x62, 0x03, 0x8a, + 0x6e, 0x40, 0xb9, 0x15, 0x30, 0x3b, 0x8b, 0x50, 0x1a, 0x2f, 0x3d, 0x9e, 0x79, 0x51, 0xf1, 0x4b, + 0x91, 0x8f, 0x5f, 0x4d, 0xd6, 0xc0, 0x49, 0x65, 0x34, 0x0f, 0xc3, 0xad, 0x90, 0xd4, 0x63, 0xe6, + 0xf3, 0xdb, 0x93, 0x0e, 0x5f, 0x23, 0x1c, 0x1f, 0xcb, 0x8a, 0xf6, 0x2f, 0x58, 0x00, 0xfc, 0x69, + 0xd8, 0xf1, 0x37, 0xc9, 0x09, 0xa8, 0xbb, 0xab, 0x30, 0x10, 0xb5, 0x48, 0xa3, 0x9b, 0x05, 0x4c, + 0xd2, 0x9f, 0x7a, 0x8b, 0x34, 0x92, 0x01, 0xa7, 0xff, 0x30, 0xab, 0x6d, 0x7f, 0x2f, 0xc0, 0x78, + 0x82, 0xb6, 0x1c, 0x93, 0x1d, 0xf4, 0x9c, 0xe1, 0x03, 0x78, 0x2e, 0xe5, 0x03, 0x58, 0x66, 0xd8, + 0x9a, 0x66, 0xf5, 0x5d, 0x28, 0xee, 0x38, 0x0f, 0x84, 0xea, 0xec, 0x99, 0xee, 0xdd, 0xa0, 0xf4, + 0x67, 0x57, 0x9c, 0x07, 0x5c, 0x48, 0x7c, 0x46, 0x2e, 0x90, 0x15, 0xe7, 0xc1, 0x21, 0xb7, 0x73, + 0x61, 0x87, 0xd4, 0x2d, 0x2f, 0x8a, 0xbf, 0xf4, 0x5f, 0x92, 0xff, 0x6c, 0xd9, 0xd1, 0x46, 0x58, + 0x5b, 0x9e, 0x2f, 0x1e, 0x4a, 0xfb, 0x6a, 0xcb, 0xf3, 0xd3, 0x6d, 0x79, 0x7e, 0x1f, 0x6d, 0x79, + 0x3e, 0x7a, 0x1f, 0x86, 0x85, 0x51, 0x82, 0xf0, 0xb9, 0xbf, 0xda, 0x47, 0x7b, 0xc2, 0xa6, 0x81, + 0xb7, 0x79, 0x55, 0x0a, 0xc1, 0xa2, 0xb4, 0x67, 0xbb, 0xb2, 0x41, 0xf4, 0x37, 0x2d, 0x18, 0x17, + 0xbf, 0x31, 0x79, 0xaf, 0x4d, 0xa2, 0x58, 0xf0, 0x9e, 0x9f, 0xee, 0xbf, 0x0f, 0xa2, 0x22, 0xef, + 0xca, 0xa7, 0xe5, 0x31, 0x6b, 0x02, 0x7b, 0xf6, 0x28, 0xd5, 0x0b, 0xf4, 0x8f, 0x2c, 0x38, 0xbd, + 0xe3, 0x3c, 0xe0, 0x2d, 0xf2, 0x32, 0xec, 0xc4, 0x5e, 0x20, 0x8c, 0xf5, 0x5f, 0xeb, 0x6f, 0xfa, + 0x3b, 0xaa, 0xf3, 0x4e, 0x4a, 0xbb, 0xde, 0xd3, 0x59, 0x28, 0x3d, 0xbb, 0x9a, 0xd9, 0xaf, 0x99, + 0x0d, 0x28, 0xc9, 0xf5, 0x96, 0xa1, 0x6a, 0xa8, 0xea, 0x8c, 0xf5, 0x91, 0x6d, 0x42, 0x74, 0x47, + 0x3c, 0xda, 0x8e, 0x58, 0x6b, 0x8f, 0xb4, 0x9d, 0x77, 0x61, 0x54, 0x5f, 0x63, 0x8f, 0xb4, 0xad, + 0xf7, 0xe0, 0x54, 0xc6, 0x5a, 0x7a, 0xa4, 0x4d, 0xde, 0x87, 0x73, 0xb9, 0xeb, 0xe3, 0x51, 0x36, + 0x6c, 0xff, 0xbc, 0xa5, 0x9f, 0x83, 0x27, 0xf0, 0xe6, 0xb0, 0x60, 0xbe, 0x39, 0x5c, 0xec, 0xbe, + 0x73, 0x72, 0x1e, 0x1e, 0xde, 0xd6, 0x3b, 0x4d, 0x4f, 0x75, 0xf4, 0x06, 0x0c, 0x35, 0x69, 0x89, + 0xb4, 0x86, 0xb1, 0x7b, 0xef, 0xc8, 0x84, 0x97, 0x62, 0xe5, 0x11, 0x16, 0x14, 0xec, 0x5f, 0xb6, + 0x60, 0xe0, 0x04, 0x46, 0x02, 0x9b, 0x23, 0xf1, 0x5c, 0x2e, 0x69, 0x11, 0x0e, 0x70, 0x16, 0x3b, + 0xf7, 0x17, 0x1f, 0xc4, 0xc4, 0x8f, 0x98, 0xa8, 0x98, 0x39, 0x30, 0xdf, 0x01, 0xa7, 0x6e, 0x05, + 0x8e, 0x3b, 0xef, 0x34, 0x1d, 0xbf, 0x41, 0xc2, 0x65, 0x7f, 0xb3, 0xa7, 0x59, 0x96, 0x6e, 0x44, + 0x55, 0xe8, 0x65, 0x44, 0x65, 0x6f, 0x01, 0xd2, 0x1b, 0x10, 0x86, 0xab, 0x18, 0x86, 0x3d, 0xde, + 0x94, 0x18, 0xfe, 0xa7, 0xb2, 0xb9, 0xbb, 0x8e, 0x9e, 0x69, 0x26, 0x99, 0xbc, 0x00, 0x4b, 0x42, + 0xf6, 0x2b, 0x90, 0xe9, 0xac, 0xd6, 0x5b, 0x6d, 0x60, 0x7f, 0x1e, 0xa6, 0x58, 0xcd, 0x23, 0x8a, + 0xb4, 0x76, 0x4a, 0x2b, 0x99, 0x11, 0x99, 0xc6, 0xfe, 0xb2, 0x05, 0x13, 0xab, 0xa9, 0x80, 0x1d, + 0x97, 0xd9, 0x03, 0x68, 0x86, 0x32, 0xbc, 0xce, 0x4a, 0xb1, 0x80, 0x1e, 0xbb, 0x0e, 0xea, 0xcf, + 0x2d, 0x48, 0xfc, 0x47, 0x4f, 0x80, 0xf1, 0x5a, 0x30, 0x18, 0xaf, 0x4c, 0xdd, 0x88, 0xea, 0x4e, + 0x1e, 0xdf, 0x85, 0x6e, 0xaa, 0x60, 0x09, 0x5d, 0xd4, 0x22, 0x09, 0x19, 0xee, 0x5a, 0x3f, 0x6e, + 0x46, 0x54, 0x90, 0xe1, 0x13, 0x98, 0xed, 0x94, 0xc2, 0xfd, 0x88, 0xd8, 0x4e, 0xa9, 0xfe, 0xe4, + 0xec, 0xd0, 0x9a, 0xd6, 0x65, 0x76, 0x72, 0x7d, 0x2b, 0xb3, 0x85, 0x77, 0x9a, 0xde, 0xfb, 0x44, + 0x45, 0x7c, 0xa9, 0x08, 0xdb, 0x76, 0x51, 0x7a, 0xb8, 0x5f, 0x19, 0x53, 0xff, 0x78, 0x84, 0xb9, + 0xa4, 0x8a, 0x7d, 0x03, 0x26, 0x52, 0x03, 0x86, 0x5e, 0x82, 0xc1, 0xd6, 0x96, 0x13, 0x91, 0x94, + 0xbd, 0xe8, 0x60, 0x8d, 0x16, 0x1e, 0xee, 0x57, 0xc6, 0x55, 0x05, 0x56, 0x82, 0x39, 0xb6, 0xfd, + 0x3f, 0x2d, 0x18, 0x58, 0x0d, 0xdc, 0x93, 0x58, 0x4c, 0xaf, 0x1b, 0x8b, 0xe9, 0x7c, 0x5e, 0x7c, + 0xce, 0xdc, 0x75, 0xb4, 0x94, 0x5a, 0x47, 0x17, 0x73, 0x29, 0x74, 0x5f, 0x42, 0x3b, 0x30, 0xc2, + 0xa2, 0x7e, 0x0a, 0xfb, 0xd5, 0x17, 0x0c, 0x19, 0xa0, 0x92, 0x92, 0x01, 0x26, 0x34, 0x54, 0x4d, + 0x12, 0x78, 0x1a, 0x86, 0x85, 0x0d, 0x65, 0xda, 0xea, 0x5f, 0xe0, 0x62, 0x09, 0xb7, 0x7f, 0xac, + 0x08, 0x46, 0x94, 0x51, 0xf4, 0xab, 0x16, 0xcc, 0x86, 0xdc, 0x8d, 0xd2, 0xad, 0xb6, 0x43, 0xcf, + 0xdf, 0xac, 0x37, 0xb6, 0x88, 0xdb, 0x6e, 0x7a, 0xfe, 0xe6, 0xf2, 0xa6, 0x1f, 0xa8, 0xe2, 0xc5, + 0x07, 0xa4, 0xd1, 0x66, 0x0f, 0x21, 0x3d, 0x42, 0x9a, 0x2a, 0x1b, 0xa5, 0x6b, 0x07, 0xfb, 0x95, + 0x59, 0x7c, 0x24, 0xda, 0xf8, 0x88, 0x7d, 0x41, 0x5f, 0xb3, 0xe0, 0x2a, 0x0f, 0xbe, 0xd9, 0x7f, + 0xff, 0xbb, 0x48, 0x4c, 0x35, 0x49, 0x2a, 0x21, 0xb2, 0x46, 0xc2, 0x9d, 0xf9, 0x97, 0xc5, 0x80, + 0x5e, 0xad, 0x1d, 0xad, 0x2d, 0x7c, 0xd4, 0xce, 0xd9, 0xff, 0xaa, 0x08, 0x63, 0xc2, 0x83, 0x5f, + 0x84, 0x86, 0x79, 0xc9, 0x58, 0x12, 0x4f, 0xa4, 0x96, 0xc4, 0x94, 0x81, 0x7c, 0x3c, 0x51, 0x61, + 0x22, 0x98, 0x6a, 0x3a, 0x51, 0x7c, 0x83, 0x38, 0x61, 0xbc, 0x4e, 0x1c, 0x6e, 0xbb, 0x53, 0x3c, + 0xb2, 0x9d, 0x91, 0x52, 0xd1, 0xdc, 0x4a, 0x13, 0xc3, 0x9d, 0xf4, 0xd1, 0x2e, 0x20, 0x66, 0x80, + 0x14, 0x3a, 0x7e, 0xc4, 0xbf, 0xc5, 0x13, 0x6f, 0x06, 0x47, 0x6b, 0x75, 0x46, 0xb4, 0x8a, 0x6e, + 0x75, 0x50, 0xc3, 0x19, 0x2d, 0x68, 0x86, 0x65, 0x83, 0xfd, 0x1a, 0x96, 0x0d, 0xf5, 0x70, 0xad, + 0xf1, 0x61, 0xb2, 0x23, 0x08, 0xc3, 0x5b, 0x50, 0x56, 0x06, 0x80, 0xe2, 0xd0, 0xe9, 0x1e, 0xcb, + 0x24, 0x4d, 0x81, 0xab, 0x51, 0x12, 0xe3, 0xd3, 0x84, 0x9c, 0xfd, 0x8f, 0x0b, 0x46, 0x83, 0x7c, + 0x12, 0x57, 0xa1, 0xe4, 0x44, 0x91, 0xb7, 0xe9, 0x13, 0x57, 0xec, 0xd8, 0x8f, 0xe7, 0xed, 0x58, + 0xa3, 0x19, 0x66, 0x84, 0x39, 0x27, 0x6a, 0x62, 0x45, 0x03, 0xdd, 0xe0, 0x16, 0x52, 0xbb, 0x92, + 0xe7, 0xef, 0x8f, 0x1a, 0x48, 0x1b, 0xaa, 0x5d, 0x82, 0x45, 0x7d, 0xf4, 0x05, 0x6e, 0xc2, 0x76, + 0xd3, 0x0f, 0xee, 0xfb, 0xd7, 0x83, 0x40, 0xba, 0xdd, 0xf5, 0x47, 0x70, 0x4a, 0x1a, 0xae, 0xa9, + 0xea, 0xd8, 0xa4, 0xd6, 0x5f, 0xa0, 0xa2, 0xef, 0x84, 0x53, 0x94, 0xb4, 0xe9, 0x3c, 0x13, 0x21, + 0x02, 0x13, 0x22, 0x3c, 0x84, 0x2c, 0x13, 0x63, 0x97, 0xc9, 0xce, 0x9b, 0xb5, 0x13, 0xa5, 0xdf, + 0x4d, 0x93, 0x04, 0x4e, 0xd3, 0xb4, 0x7f, 0xd2, 0x02, 0x66, 0xf6, 0x7f, 0x02, 0x2c, 0xc3, 0x67, + 0x4d, 0x96, 0x61, 0x3a, 0x6f, 0x90, 0x73, 0xb8, 0x85, 0x17, 0xf9, 0xca, 0xaa, 0x85, 0xc1, 0x83, + 0x3d, 0x61, 0x3e, 0xd0, 0x9b, 0x93, 0xb5, 0xff, 0x8f, 0xc5, 0x0f, 0x31, 0xe5, 0x89, 0x8f, 0xbe, + 0x0b, 0x4a, 0x0d, 0xa7, 0xe5, 0x34, 0x78, 0x48, 0xec, 0x5c, 0xad, 0x8e, 0x51, 0x69, 0x76, 0x41, + 0xd4, 0xe0, 0x5a, 0x0a, 0x19, 0x66, 0xa4, 0x24, 0x8b, 0x7b, 0x6a, 0x26, 0x54, 0x93, 0x33, 0xdb, + 0x30, 0x66, 0x10, 0x7b, 0xa4, 0x22, 0xed, 0x77, 0xf1, 0x2b, 0x56, 0x85, 0xc5, 0xd9, 0x81, 0x29, + 0x5f, 0xfb, 0x4f, 0x2f, 0x14, 0x29, 0xa6, 0x7c, 0xbc, 0xd7, 0x25, 0xca, 0x6e, 0x1f, 0xcd, 0xad, + 0x21, 0x45, 0x06, 0x77, 0x52, 0xb6, 0x7f, 0xdc, 0x82, 0xc7, 0x74, 0x44, 0x2d, 0x48, 0x42, 0x2f, + 0x3d, 0x71, 0x15, 0x4a, 0x41, 0x8b, 0x84, 0x4e, 0x1c, 0x84, 0xe2, 0xd6, 0xb8, 0x22, 0x07, 0xfd, + 0xb6, 0x28, 0x3f, 0x14, 0x01, 0x25, 0x25, 0x75, 0x59, 0x8e, 0x55, 0x4d, 0x2a, 0xc7, 0xb0, 0xc1, + 0x88, 0x44, 0x00, 0x0b, 0x76, 0x06, 0xb0, 0x27, 0xd3, 0x08, 0x0b, 0x88, 0xfd, 0x87, 0x16, 0x5f, + 0x58, 0x7a, 0xd7, 0xd1, 0x7b, 0x30, 0xb9, 0xe3, 0xc4, 0x8d, 0xad, 0xc5, 0x07, 0xad, 0x90, 0xab, + 0xc7, 0xe5, 0x38, 0x3d, 0xd3, 0x6b, 0x9c, 0xb4, 0x8f, 0x4c, 0xac, 0xf2, 0x56, 0x52, 0xc4, 0x70, + 0x07, 0x79, 0xb4, 0x0e, 0x23, 0xac, 0x8c, 0x99, 0x7f, 0x47, 0xdd, 0x58, 0x83, 0xbc, 0xd6, 0xd4, + 0xab, 0xf3, 0x4a, 0x42, 0x07, 0xeb, 0x44, 0xed, 0x2f, 0x15, 0xf9, 0x6e, 0x67, 0xdc, 0xf6, 0xd3, + 0x30, 0xdc, 0x0a, 0xdc, 0x85, 0xe5, 0x2a, 0x16, 0xb3, 0xa0, 0xae, 0x91, 0x1a, 0x2f, 0xc6, 0x12, + 0x8e, 0x5e, 0x05, 0x20, 0x0f, 0x62, 0x12, 0xfa, 0x4e, 0x53, 0x59, 0xc9, 0x28, 0xbb, 0xd0, 0x6a, + 0xb0, 0x1a, 0xc4, 0x77, 0x22, 0xf2, 0x1d, 0x8b, 0x0a, 0x05, 0x6b, 0xe8, 0xe8, 0x1a, 0x40, 0x2b, + 0x0c, 0x76, 0x3d, 0x97, 0xf9, 0x13, 0x16, 0x4d, 0x1b, 0x92, 0x9a, 0x82, 0x60, 0x0d, 0x0b, 0xbd, + 0x0a, 0x63, 0x6d, 0x3f, 0xe2, 0x1c, 0x8a, 0xb3, 0x2e, 0xc2, 0x31, 0x96, 0x12, 0xeb, 0x86, 0x3b, + 0x3a, 0x10, 0x9b, 0xb8, 0x68, 0x0e, 0x86, 0x62, 0x87, 0xd9, 0x44, 0x0c, 0xe6, 0x1b, 0x73, 0xae, + 0x51, 0x0c, 0x3d, 0x20, 0x33, 0xad, 0x80, 0x45, 0x45, 0xf4, 0x96, 0x74, 0xce, 0xe0, 0x67, 0xbd, + 0xb0, 0xa2, 0xee, 0xef, 0x5e, 0xd0, 0x5c, 0x33, 0x84, 0x75, 0xb6, 0x41, 0xcb, 0xfe, 0x5a, 0x19, + 0x20, 0x61, 0xc7, 0xd1, 0xfb, 0x1d, 0xe7, 0xd1, 0xb3, 0xdd, 0x19, 0xf8, 0xe3, 0x3b, 0x8c, 0xd0, + 0xf7, 0x59, 0x30, 0xe2, 0x34, 0x9b, 0x41, 0xc3, 0x89, 0xd9, 0x28, 0x17, 0xba, 0x9f, 0x87, 0xa2, + 0xfd, 0xb9, 0xa4, 0x06, 0xef, 0xc2, 0x0b, 0x72, 0xe1, 0x69, 0x90, 0x9e, 0xbd, 0xd0, 0x1b, 0x46, + 0x9f, 0x92, 0x52, 0x1a, 0x5f, 0x1e, 0x33, 0x69, 0x29, 0xad, 0xcc, 0x8e, 0x7e, 0x4d, 0x40, 0x43, + 0x77, 0x8c, 0x48, 0x7b, 0x03, 0xf9, 0x41, 0x27, 0x0c, 0xae, 0xb4, 0x57, 0x90, 0x3d, 0x54, 0xd3, + 0xbd, 0xc9, 0x06, 0xf3, 0x23, 0xb3, 0x68, 0xe2, 0x4f, 0x0f, 0x4f, 0xb2, 0x77, 0x61, 0xc2, 0x35, + 0xef, 0x76, 0xb1, 0x9a, 0x9e, 0xca, 0xa3, 0x9b, 0x62, 0x05, 0x92, 0xdb, 0x3c, 0x05, 0xc0, 0x69, + 0xc2, 0xa8, 0xc6, 0xfd, 0xfa, 0x96, 0xfd, 0x8d, 0x40, 0x58, 0xe3, 0xdb, 0xb9, 0x73, 0xb9, 0x17, + 0xc5, 0x64, 0x87, 0x62, 0x26, 0x97, 0xf6, 0xaa, 0xa8, 0x8b, 0x15, 0x15, 0xf4, 0x06, 0x0c, 0x31, + 0xc7, 0xe0, 0x68, 0xba, 0x94, 0xaf, 0x4c, 0x34, 0x63, 0x5a, 0x24, 0x9b, 0x8a, 0xfd, 0x8d, 0xb0, + 0xa0, 0x80, 0x6e, 0xc8, 0xc0, 0x37, 0xd1, 0xb2, 0x7f, 0x27, 0x22, 0x2c, 0xf0, 0x4d, 0x79, 0xfe, + 0xe3, 0x49, 0x4c, 0x1b, 0x5e, 0x9e, 0x99, 0x7a, 0xc1, 0xa8, 0x49, 0x99, 0x23, 0xf1, 0x5f, 0x66, + 0x74, 0x98, 0x86, 0xfc, 0xee, 0x99, 0x59, 0x1f, 0x92, 0xe1, 0xbc, 0x6b, 0x92, 0xc0, 0x69, 0x9a, + 0x94, 0xd1, 0xe4, 0x3b, 0x57, 0xd8, 0xf3, 0xf7, 0xda, 0xff, 0x5c, 0xbe, 0x66, 0x97, 0x0c, 0x2f, + 0xc1, 0xa2, 0xfe, 0x89, 0xde, 0xfa, 0x33, 0x3e, 0x4c, 0xa6, 0xb7, 0xe8, 0x23, 0xe5, 0x32, 0x7e, + 0x7f, 0x00, 0xc6, 0xcd, 0x25, 0x85, 0xae, 0x42, 0x59, 0x10, 0x51, 0x51, 0x58, 0xd5, 0x2e, 0x59, + 0x91, 0x00, 0x9c, 0xe0, 0xb0, 0xe0, 0xbb, 0xac, 0xba, 0x66, 0x87, 0x99, 0x04, 0xdf, 0x55, 0x10, + 0xac, 0x61, 0x51, 0x79, 0x69, 0x3d, 0x08, 0x62, 0x75, 0xa9, 0xa8, 0x75, 0x37, 0xcf, 0x4a, 0xb1, + 0x80, 0xd2, 0xcb, 0x64, 0x9b, 0x84, 0x3e, 0x69, 0x9a, 0xc1, 0xdd, 0xd4, 0x65, 0x72, 0x53, 0x07, + 0x62, 0x13, 0x97, 0xde, 0x92, 0x41, 0xc4, 0x16, 0xb2, 0x90, 0xca, 0x12, 0xbb, 0xd6, 0x3a, 0x77, + 0xb1, 0x97, 0x70, 0xf4, 0x79, 0x78, 0x4c, 0x79, 0xc4, 0x63, 0xae, 0xa8, 0x96, 0x2d, 0x0e, 0x19, + 0x4a, 0x94, 0xc7, 0x16, 0xb2, 0xd1, 0x70, 0x5e, 0x7d, 0xf4, 0x3a, 0x8c, 0x0b, 0xce, 0x5d, 0x52, + 0x1c, 0x36, 0x6d, 0x27, 0x6e, 0x1a, 0x50, 0x9c, 0xc2, 0x96, 0xe1, 0xe9, 0x18, 0xf3, 0x2c, 0x29, + 0x94, 0x3a, 0xc3, 0xd3, 0xe9, 0x70, 0xdc, 0x51, 0x03, 0xcd, 0xc1, 0x04, 0x67, 0xad, 0x3c, 0x7f, + 0x93, 0xcf, 0x89, 0x70, 0xb7, 0x51, 0x5b, 0xea, 0xb6, 0x09, 0xc6, 0x69, 0x7c, 0xf4, 0x0a, 0x8c, + 0x3a, 0x61, 0x63, 0xcb, 0x8b, 0x49, 0x23, 0x6e, 0x87, 0xdc, 0x0f, 0x47, 0x33, 0x3e, 0x99, 0xd3, + 0x60, 0xd8, 0xc0, 0xb4, 0xdf, 0x87, 0x53, 0x19, 0x9e, 0x7a, 0x74, 0xe1, 0x38, 0x2d, 0x4f, 0x7e, + 0x53, 0xca, 0x42, 0x75, 0xae, 0xb6, 0x2c, 0xbf, 0x46, 0xc3, 0xa2, 0xab, 0x93, 0x79, 0xf4, 0x69, + 0x09, 0x5c, 0xd4, 0xea, 0x5c, 0x92, 0x00, 0x9c, 0xe0, 0xd8, 0xff, 0xab, 0x00, 0x13, 0x19, 0xca, + 0x77, 0x96, 0x44, 0x24, 0x25, 0x7b, 0x24, 0x39, 0x43, 0xcc, 0x68, 0x87, 0x85, 0x23, 0x44, 0x3b, + 0x2c, 0xf6, 0x8a, 0x76, 0x38, 0xf0, 0x41, 0xa2, 0x1d, 0x9a, 0x23, 0x36, 0xd8, 0xd7, 0x88, 0x65, + 0x44, 0x48, 0x1c, 0x3a, 0x62, 0x84, 0x44, 0x63, 0xd0, 0x87, 0xfb, 0x18, 0xf4, 0x1f, 0x2a, 0xc0, + 0x64, 0xda, 0x48, 0xee, 0x04, 0xd4, 0xb1, 0x6f, 0x18, 0xea, 0xd8, 0xec, 0x94, 0x3c, 0x69, 0xd3, + 0xbd, 0x3c, 0xd5, 0x2c, 0x4e, 0xa9, 0x66, 0x3f, 0xd9, 0x17, 0xb5, 0xee, 0x6a, 0xda, 0xbf, 0x57, + 0x80, 0x33, 0xe9, 0x2a, 0x0b, 0x4d, 0xc7, 0xdb, 0x39, 0x81, 0xb1, 0xb9, 0x6d, 0x8c, 0xcd, 0x73, + 0xfd, 0x7c, 0x0d, 0xeb, 0x5a, 0xee, 0x00, 0xdd, 0x4b, 0x0d, 0xd0, 0xd5, 0xfe, 0x49, 0x76, 0x1f, + 0xa5, 0xaf, 0x17, 0xe1, 0x62, 0x66, 0xbd, 0x44, 0x9b, 0xb9, 0x64, 0x68, 0x33, 0xaf, 0xa5, 0xb4, + 0x99, 0x76, 0xf7, 0xda, 0xc7, 0xa3, 0xde, 0x14, 0x2e, 0x94, 0x2c, 0x22, 0xde, 0x43, 0xaa, 0x36, + 0x0d, 0x17, 0x4a, 0x45, 0x08, 0x9b, 0x74, 0xbf, 0x91, 0x54, 0x9a, 0xff, 0xd6, 0x82, 0x73, 0x99, + 0x73, 0x73, 0x02, 0x2a, 0xac, 0x55, 0x53, 0x85, 0xf5, 0x74, 0xdf, 0xab, 0x35, 0x47, 0xa7, 0xf5, + 0x1b, 0x03, 0x39, 0xdf, 0xc2, 0x04, 0xf4, 0xdb, 0x30, 0xe2, 0x34, 0x1a, 0x24, 0x8a, 0x56, 0x02, + 0x57, 0x45, 0x88, 0x7b, 0x8e, 0xc9, 0x59, 0x49, 0xf1, 0xe1, 0x7e, 0x65, 0x26, 0x4d, 0x22, 0x01, + 0x63, 0x9d, 0x82, 0x19, 0xd4, 0xb2, 0x70, 0xac, 0x41, 0x2d, 0xaf, 0x01, 0xec, 0x2a, 0x6e, 0x3d, + 0x2d, 0xe4, 0x6b, 0x7c, 0xbc, 0x86, 0x85, 0xbe, 0x00, 0xa5, 0x48, 0x5c, 0xe3, 0x62, 0x29, 0xbe, + 0xd0, 0xe7, 0x5c, 0x39, 0xeb, 0xa4, 0x69, 0xfa, 0xea, 0x2b, 0x7d, 0x88, 0x22, 0x89, 0xbe, 0x0d, + 0x26, 0x23, 0x1e, 0x0a, 0x66, 0xa1, 0xe9, 0x44, 0xcc, 0x0f, 0x42, 0xac, 0x42, 0xe6, 0x80, 0x5f, + 0x4f, 0xc1, 0x70, 0x07, 0x36, 0x5a, 0x92, 0x1f, 0xc5, 0xe2, 0xd6, 0xf0, 0x85, 0x79, 0x39, 0xf9, + 0x20, 0x91, 0xc2, 0xec, 0x74, 0x7a, 0xf8, 0xd9, 0xc0, 0x6b, 0x35, 0xd1, 0x17, 0x00, 0xe8, 0xf2, + 0x11, 0xba, 0x84, 0xe1, 0xfc, 0xc3, 0x93, 0x9e, 0x2a, 0x6e, 0xa6, 0xe5, 0x27, 0x73, 0x5e, 0xac, + 0x2a, 0x22, 0x58, 0x23, 0x68, 0xff, 0xd0, 0x00, 0x3c, 0xde, 0xe5, 0x8c, 0x44, 0x73, 0xe6, 0x13, + 0xe8, 0x33, 0x69, 0xe1, 0x7a, 0x26, 0xb3, 0xb2, 0x21, 0x6d, 0xa7, 0x96, 0x62, 0xe1, 0x03, 0x2f, + 0xc5, 0x1f, 0xb0, 0x34, 0xb5, 0x07, 0x37, 0xe6, 0xfb, 0xec, 0x11, 0xcf, 0xfe, 0x63, 0xd4, 0x83, + 0x6c, 0x64, 0x28, 0x13, 0xae, 0xf5, 0xdd, 0x9d, 0xbe, 0xb5, 0x0b, 0x27, 0xab, 0xfc, 0xfd, 0x92, + 0x05, 0x4f, 0x64, 0xf6, 0xd7, 0x30, 0xd9, 0xb8, 0x0a, 0xe5, 0x06, 0x2d, 0xd4, 0x7c, 0xd5, 0x12, + 0x27, 0x5e, 0x09, 0xc0, 0x09, 0x8e, 0x61, 0x99, 0x51, 0xe8, 0x69, 0x99, 0xf1, 0x2f, 0x2d, 0xe8, + 0xd8, 0x1f, 0x27, 0x70, 0x50, 0x2f, 0x9b, 0x07, 0xf5, 0xc7, 0xfb, 0x99, 0xcb, 0x9c, 0x33, 0xfa, + 0x8f, 0x27, 0xe0, 0x6c, 0x8e, 0xaf, 0xc6, 0x2e, 0x4c, 0x6d, 0x36, 0x88, 0xe9, 0x05, 0x28, 0x3e, + 0x26, 0xd3, 0x61, 0xb2, 0xab, 0xcb, 0x20, 0xcb, 0x47, 0x34, 0xd5, 0x81, 0x82, 0x3b, 0x9b, 0x40, + 0x5f, 0xb2, 0xe0, 0xb4, 0x73, 0x3f, 0xea, 0x48, 0x60, 0x2a, 0xd6, 0xcc, 0x8b, 0x99, 0x4a, 0x90, + 0x1e, 0x09, 0x4f, 0x79, 0x82, 0xa6, 0x2c, 0x2c, 0x9c, 0xd9, 0x16, 0xc2, 0x22, 0x66, 0x28, 0x65, + 0xe7, 0xbb, 0xf8, 0xa9, 0x66, 0x39, 0xd5, 0xf0, 0x23, 0x5b, 0x42, 0xb0, 0xa2, 0x83, 0xde, 0x81, + 0xf2, 0xa6, 0xf4, 0x74, 0xcb, 0xb8, 0x12, 0x92, 0x81, 0xec, 0xee, 0xff, 0xc7, 0x1f, 0x28, 0x15, + 0x12, 0x4e, 0x88, 0xa2, 0xd7, 0xa1, 0xe8, 0x6f, 0x44, 0xdd, 0x72, 0x1c, 0xa5, 0x6c, 0x9a, 0xb8, + 0x37, 0xf8, 0xea, 0x52, 0x1d, 0xd3, 0x8a, 0xe8, 0x06, 0x14, 0xc3, 0x75, 0x57, 0x68, 0xf0, 0x32, + 0xcf, 0x70, 0x3c, 0x5f, 0xcd, 0xe9, 0x15, 0xa3, 0x84, 0xe7, 0xab, 0x98, 0x92, 0x40, 0x35, 0x18, + 0x64, 0x0e, 0x0e, 0xe2, 0x3e, 0xc8, 0xe4, 0x7c, 0xbb, 0x38, 0x0a, 0x71, 0x97, 0x71, 0x86, 0x80, + 0x39, 0x21, 0xb4, 0x06, 0x43, 0x0d, 0x96, 0x0f, 0x47, 0x04, 0xac, 0xfe, 0x54, 0xa6, 0xae, 0xae, + 0x4b, 0xa2, 0x20, 0xa1, 0xba, 0x62, 0x18, 0x58, 0xd0, 0x62, 0x54, 0x49, 0x6b, 0x6b, 0x23, 0x12, + 0xf9, 0xdb, 0xb2, 0xa9, 0x76, 0xc9, 0x7f, 0x25, 0xa8, 0x32, 0x0c, 0x2c, 0x68, 0xa1, 0xcf, 0x40, + 0x61, 0xa3, 0x21, 0xfc, 0x1f, 0x32, 0x95, 0x76, 0xa6, 0x43, 0xff, 0xfc, 0xd0, 0xc1, 0x7e, 0xa5, + 0xb0, 0xb4, 0x80, 0x0b, 0x1b, 0x0d, 0xb4, 0x0a, 0xc3, 0x1b, 0xdc, 0x05, 0x58, 0xe8, 0xe5, 0x9e, + 0xca, 0xf6, 0x4e, 0xee, 0xf0, 0x12, 0xe6, 0x76, 0xfb, 0x02, 0x80, 0x25, 0x11, 0x16, 0x82, 0x53, + 0xb9, 0x32, 0x8b, 0x58, 0xd4, 0xb3, 0x47, 0x73, 0x3f, 0xe7, 0xf7, 0x73, 0xe2, 0x10, 0x8d, 0x35, + 0x8a, 0x74, 0x55, 0x3b, 0x32, 0x89, 0xa6, 0x88, 0xd5, 0x91, 0xb9, 0xaa, 0x7b, 0xe4, 0x17, 0xe5, + 0xab, 0x5a, 0x21, 0xe1, 0x84, 0x28, 0xda, 0x86, 0xb1, 0xdd, 0xa8, 0xb5, 0x45, 0xe4, 0x96, 0x66, + 0xa1, 0x3b, 0x72, 0xae, 0xb0, 0xbb, 0x02, 0xd1, 0x0b, 0xe3, 0xb6, 0xd3, 0xec, 0x38, 0x85, 0xd8, + 0xab, 0xf6, 0x5d, 0x9d, 0x18, 0x36, 0x69, 0xd3, 0xe1, 0x7f, 0xaf, 0x1d, 0xac, 0xef, 0xc5, 0x44, + 0x04, 0xaf, 0xce, 0x1c, 0xfe, 0x37, 0x39, 0x4a, 0xe7, 0xf0, 0x0b, 0x00, 0x96, 0x44, 0xd0, 0x5d, + 0x31, 0x3c, 0xec, 0xf4, 0x9c, 0xcc, 0x0f, 0xa6, 0x94, 0x99, 0xc5, 0x56, 0x1b, 0x14, 0x76, 0x5a, + 0x26, 0xa4, 0xd8, 0x29, 0xd9, 0xda, 0x0a, 0xe2, 0xc0, 0x4f, 0x9d, 0xd0, 0x53, 0xf9, 0xa7, 0x64, + 0x2d, 0x03, 0xbf, 0xf3, 0x94, 0xcc, 0xc2, 0xc2, 0x99, 0x6d, 0x21, 0x17, 0xc6, 0x5b, 0x41, 0x18, + 0xdf, 0x0f, 0x42, 0xb9, 0xbe, 0x50, 0x17, 0xbd, 0x82, 0x81, 0x29, 0x5a, 0x64, 0xc1, 0xd4, 0x4d, + 0x08, 0x4e, 0xd1, 0x44, 0x9f, 0x83, 0xe1, 0xa8, 0xe1, 0x34, 0xc9, 0xf2, 0xed, 0xe9, 0x53, 0xf9, + 0xd7, 0x4f, 0x9d, 0xa3, 0xe4, 0xac, 0x2e, 0x36, 0x39, 0x02, 0x05, 0x4b, 0x72, 0x68, 0x09, 0x06, + 0x59, 0x46, 0x04, 0x16, 0x77, 0x3b, 0x27, 0x26, 0x54, 0x87, 0x85, 0x29, 0x3f, 0x9b, 0x58, 0x31, + 0xe6, 0xd5, 0xe9, 0x1e, 0x10, 0xec, 0x75, 0x10, 0x4d, 0x9f, 0xc9, 0xdf, 0x03, 0x82, 0x2b, 0xbf, + 0x5d, 0xef, 0xb6, 0x07, 0x14, 0x12, 0x4e, 0x88, 0xd2, 0x93, 0x99, 0x9e, 0xa6, 0x67, 0xbb, 0x18, + 0xb4, 0xe4, 0x9e, 0xa5, 0xec, 0x64, 0xa6, 0x27, 0x29, 0x25, 0x61, 0xff, 0xee, 0x70, 0x27, 0xcf, + 0xc2, 0x04, 0xb2, 0xbf, 0x6c, 0x75, 0xbc, 0xd5, 0x7d, 0xba, 0x5f, 0xfd, 0xd0, 0x31, 0x72, 0xab, + 0x5f, 0xb2, 0xe0, 0x6c, 0x2b, 0xf3, 0x43, 0x04, 0x03, 0xd0, 0x9f, 0x9a, 0x89, 0x7f, 0xba, 0x8a, + 0x8d, 0x9f, 0x0d, 0xc7, 0x39, 0x2d, 0xa5, 0x25, 0x82, 0xe2, 0x07, 0x96, 0x08, 0x56, 0xa0, 0xc4, + 0x98, 0xcc, 0x1e, 0xf9, 0xe1, 0xd2, 0x82, 0x11, 0x63, 0x25, 0x16, 0x44, 0x45, 0xac, 0x48, 0xa0, + 0x1f, 0xb4, 0xe0, 0x42, 0xba, 0xeb, 0x98, 0x30, 0xb0, 0x88, 0x24, 0xcf, 0x65, 0xc1, 0x25, 0xf1, + 0xfd, 0x17, 0x6a, 0xdd, 0x90, 0x0f, 0x7b, 0x21, 0xe0, 0xee, 0x8d, 0xa1, 0x6a, 0x86, 0x30, 0x3a, + 0x64, 0x2a, 0xe0, 0xfb, 0x10, 0x48, 0x5f, 0x84, 0xd1, 0x9d, 0xa0, 0xed, 0xc7, 0xc2, 0xfe, 0x45, + 0x78, 0x2c, 0xb2, 0x07, 0xe7, 0x15, 0xad, 0x1c, 0x1b, 0x58, 0x29, 0x31, 0xb6, 0xf4, 0xd0, 0x62, + 0xec, 0xdb, 0xa9, 0x84, 0xf2, 0xe5, 0xfc, 0x88, 0x85, 0x42, 0xe2, 0x3f, 0x42, 0x5a, 0xf9, 0x93, + 0x95, 0x8d, 0x7e, 0xda, 0xca, 0x60, 0xea, 0xb9, 0xb4, 0xfc, 0x9a, 0x29, 0x2d, 0x5f, 0x4e, 0x4b, + 0xcb, 0x1d, 0xca, 0x57, 0x43, 0x50, 0xee, 0x3f, 0xec, 0x75, 0xbf, 0x71, 0xe4, 0xec, 0x26, 0x5c, + 0xea, 0x75, 0x2d, 0x31, 0x43, 0x28, 0x57, 0x3d, 0xb5, 0x25, 0x86, 0x50, 0xee, 0x72, 0x15, 0x33, + 0x48, 0xbf, 0x81, 0x46, 0xec, 0xff, 0x61, 0x41, 0xb1, 0x16, 0xb8, 0x27, 0xa0, 0x4c, 0xfe, 0xac, + 0xa1, 0x4c, 0x7e, 0x3c, 0x27, 0xd1, 0x7f, 0xae, 0xea, 0x78, 0x31, 0xa5, 0x3a, 0xbe, 0x90, 0x47, + 0xa0, 0xbb, 0xa2, 0xf8, 0x27, 0x8a, 0x30, 0x52, 0x0b, 0x5c, 0x65, 0x85, 0xfc, 0x1b, 0x0f, 0x63, + 0x85, 0x9c, 0x1b, 0x16, 0x56, 0xa3, 0xcc, 0xec, 0xa7, 0xa4, 0x13, 0xde, 0x5f, 0x30, 0x63, 0xe4, + 0x7b, 0xc4, 0xdb, 0xdc, 0x8a, 0x89, 0x9b, 0xfe, 0x9c, 0x93, 0x33, 0x46, 0xfe, 0x6f, 0x16, 0x4c, + 0xa4, 0x5a, 0x47, 0x4d, 0x18, 0x6b, 0xea, 0x9a, 0x40, 0xb1, 0x4e, 0x1f, 0x4a, 0x89, 0x28, 0x8c, + 0x39, 0xb5, 0x22, 0x6c, 0x12, 0x47, 0xb3, 0x00, 0xea, 0xa5, 0x4e, 0x6a, 0xc0, 0x18, 0xd7, 0xaf, + 0x9e, 0xf2, 0x22, 0xac, 0x61, 0xa0, 0x97, 0x60, 0x24, 0x0e, 0x5a, 0x41, 0x33, 0xd8, 0xdc, 0xbb, + 0x49, 0x64, 0x68, 0x1b, 0x65, 0xa2, 0xb5, 0x96, 0x80, 0xb0, 0x8e, 0x67, 0xff, 0x54, 0x91, 0x7f, + 0xa8, 0x1f, 0x7b, 0xdf, 0x5c, 0x93, 0x1f, 0xed, 0x35, 0xf9, 0x75, 0x0b, 0x26, 0x69, 0xeb, 0xcc, + 0x5c, 0x44, 0x5e, 0xb6, 0x2a, 0xfd, 0x8e, 0xd5, 0x25, 0xfd, 0xce, 0x65, 0x7a, 0x76, 0xb9, 0x41, + 0x3b, 0x16, 0x1a, 0x34, 0xed, 0x70, 0xa2, 0xa5, 0x58, 0x40, 0x05, 0x1e, 0x09, 0x43, 0xe1, 0x03, + 0xa5, 0xe3, 0x91, 0x30, 0xc4, 0x02, 0x2a, 0xb3, 0xf3, 0x0c, 0xe4, 0x64, 0xe7, 0x61, 0x81, 0xfa, + 0x84, 0x61, 0x81, 0x60, 0x7b, 0xb4, 0x40, 0x7d, 0xd2, 0xe2, 0x20, 0xc1, 0xb1, 0x7f, 0xbe, 0x08, + 0xa3, 0xb5, 0xc0, 0x4d, 0xde, 0xca, 0x5e, 0x34, 0xde, 0xca, 0x2e, 0xa5, 0xde, 0xca, 0x26, 0x75, + 0xdc, 0x6f, 0xbe, 0x8c, 0x7d, 0x58, 0x2f, 0x63, 0xff, 0xc2, 0x62, 0xb3, 0x56, 0x5d, 0xad, 0x8b, + 0xec, 0xc0, 0xcf, 0xc3, 0x08, 0x3b, 0x90, 0x98, 0xd3, 0x9d, 0x7c, 0x40, 0x62, 0x81, 0xf7, 0x57, + 0x93, 0x62, 0xac, 0xe3, 0xa0, 0x2b, 0x50, 0x8a, 0x88, 0x13, 0x36, 0xb6, 0xd4, 0x19, 0x27, 0x9e, + 0x57, 0x78, 0x19, 0x56, 0x50, 0xf4, 0x66, 0x12, 0x23, 0xae, 0x98, 0x9f, 0xe7, 0x56, 0xef, 0x0f, + 0xdf, 0x22, 0xf9, 0x81, 0xe1, 0xec, 0x7b, 0x80, 0x3a, 0xf1, 0xfb, 0x08, 0x8e, 0x54, 0x31, 0x83, + 0x23, 0x95, 0x3b, 0x02, 0x23, 0xfd, 0x99, 0x05, 0xe3, 0xb5, 0xc0, 0xa5, 0x5b, 0xf7, 0x1b, 0x69, + 0x9f, 0xea, 0x01, 0x32, 0x87, 0xba, 0x04, 0xc8, 0xfc, 0xfb, 0x16, 0x0c, 0xd7, 0x02, 0xf7, 0x04, + 0xf4, 0xee, 0xaf, 0x99, 0x7a, 0xf7, 0xc7, 0x72, 0x96, 0x44, 0x8e, 0xaa, 0xfd, 0x17, 0x8b, 0x30, + 0x46, 0xfb, 0x19, 0x6c, 0xca, 0x59, 0x32, 0x46, 0xc4, 0xea, 0x63, 0x44, 0x28, 0x9b, 0x1b, 0x34, + 0x9b, 0xc1, 0xfd, 0xf4, 0x8c, 0x2d, 0xb1, 0x52, 0x2c, 0xa0, 0xe8, 0x59, 0x28, 0xb5, 0x42, 0xb2, + 0xeb, 0x05, 0x82, 0x7f, 0xd4, 0x5e, 0x31, 0x6a, 0xa2, 0x1c, 0x2b, 0x0c, 0x2a, 0x77, 0x45, 0x9e, + 0xdf, 0x20, 0x32, 0xc9, 0xf6, 0x00, 0xcb, 0xc3, 0xc5, 0x23, 0x5f, 0x6b, 0xe5, 0xd8, 0xc0, 0x42, + 0xf7, 0xa0, 0xcc, 0xfe, 0xb3, 0x13, 0xe5, 0xe8, 0x79, 0x83, 0x44, 0xba, 0x09, 0x41, 0x00, 0x27, + 0xb4, 0xd0, 0x35, 0x80, 0x58, 0x46, 0x47, 0x8e, 0x44, 0x8c, 0x1b, 0xc5, 0x6b, 0xab, 0xb8, 0xc9, + 0x11, 0xd6, 0xb0, 0xd0, 0x33, 0x50, 0x8e, 0x1d, 0xaf, 0x79, 0xcb, 0xf3, 0x49, 0xc4, 0x54, 0xce, + 0x45, 0x99, 0x4d, 0x42, 0x14, 0xe2, 0x04, 0x4e, 0x79, 0x1d, 0xe6, 0x00, 0xce, 0xb3, 0x8e, 0x95, + 0x18, 0x36, 0xe3, 0x75, 0x6e, 0xa9, 0x52, 0xac, 0x61, 0xd8, 0xaf, 0xc0, 0x99, 0x5a, 0xe0, 0xd6, + 0x82, 0x30, 0x5e, 0x0a, 0xc2, 0xfb, 0x4e, 0xe8, 0xca, 0xf9, 0xab, 0xc8, 0xc4, 0x06, 0xf4, 0xec, + 0x19, 0xe4, 0x3b, 0xd3, 0x48, 0x59, 0xf0, 0x02, 0xe3, 0x76, 0x8e, 0xe8, 0xd4, 0xd1, 0x60, 0xf7, + 0xae, 0x4a, 0x30, 0x78, 0xdd, 0x89, 0x09, 0xba, 0xcd, 0x92, 0x92, 0x25, 0x57, 0x90, 0xa8, 0xfe, + 0xb4, 0x96, 0x94, 0x2c, 0x01, 0x66, 0xde, 0x59, 0x66, 0x7d, 0xfb, 0x67, 0x07, 0xd8, 0x69, 0x94, + 0xca, 0xb7, 0x87, 0xbe, 0x08, 0xe3, 0x11, 0xb9, 0xe5, 0xf9, 0xed, 0x07, 0x52, 0x08, 0xef, 0xe2, + 0x96, 0x53, 0x5f, 0xd4, 0x31, 0xb9, 0x2a, 0xcf, 0x2c, 0xc3, 0x29, 0x6a, 0x74, 0x9e, 0xc2, 0xb6, + 0x3f, 0x17, 0xdd, 0x89, 0x48, 0x28, 0xf2, 0xbd, 0xb1, 0x79, 0xc2, 0xb2, 0x10, 0x27, 0x70, 0xba, + 0x2e, 0xd9, 0x9f, 0xd5, 0xc0, 0xc7, 0x41, 0x10, 0xcb, 0x95, 0xcc, 0x32, 0x06, 0x69, 0xe5, 0xd8, + 0xc0, 0x42, 0x4b, 0x80, 0xa2, 0x76, 0xab, 0xd5, 0x64, 0x0f, 0xfb, 0x4e, 0xf3, 0x7a, 0x18, 0xb4, + 0x5b, 0xfc, 0xd5, 0xb3, 0xc8, 0x03, 0x13, 0xd6, 0x3b, 0xa0, 0x38, 0xa3, 0x06, 0x3d, 0x7d, 0x36, + 0x22, 0xf6, 0x9b, 0xad, 0xee, 0xa2, 0x50, 0xaf, 0xd7, 0x59, 0x11, 0x96, 0x30, 0xba, 0x98, 0x58, + 0xf3, 0x1c, 0x73, 0x28, 0x59, 0x4c, 0x58, 0x95, 0x62, 0x0d, 0x03, 0x2d, 0xc2, 0x70, 0xb4, 0x17, + 0x35, 0x62, 0x11, 0x91, 0x29, 0x27, 0x73, 0x67, 0x9d, 0xa1, 0x68, 0xd9, 0x24, 0x78, 0x15, 0x2c, + 0xeb, 0xa2, 0x1d, 0x18, 0xbf, 0xef, 0xf9, 0x6e, 0x70, 0x3f, 0x92, 0x13, 0x55, 0xca, 0x57, 0x8d, + 0xde, 0xe3, 0x98, 0xa9, 0xc9, 0x36, 0xe6, 0xed, 0x9e, 0x41, 0x0c, 0xa7, 0x88, 0xdb, 0xdf, 0xc5, + 0xee, 0x5e, 0x96, 0x8c, 0x2c, 0x6e, 0x87, 0x04, 0xed, 0xc0, 0x58, 0x8b, 0xad, 0x30, 0x11, 0x2a, + 0x5b, 0x2c, 0x93, 0x17, 0xfb, 0x14, 0xa2, 0xef, 0xd3, 0x73, 0x4d, 0x29, 0xb9, 0x98, 0x74, 0x52, + 0xd3, 0xc9, 0x61, 0x93, 0xba, 0xfd, 0xdf, 0x11, 0x3b, 0xe2, 0xeb, 0x5c, 0x32, 0x1e, 0x16, 0x96, + 0xcc, 0x42, 0x0c, 0x98, 0xc9, 0x57, 0xd1, 0x24, 0x03, 0x28, 0xac, 0xa1, 0xb1, 0xac, 0x8b, 0xde, + 0x64, 0x8f, 0xe2, 0xfc, 0x5c, 0xed, 0x95, 0x13, 0x9a, 0x63, 0x19, 0xef, 0xdf, 0xa2, 0x22, 0xd6, + 0x88, 0xa0, 0x5b, 0x30, 0x26, 0x72, 0x57, 0x09, 0x1d, 0x5c, 0xd1, 0xd0, 0xb1, 0x8c, 0x61, 0x1d, + 0x78, 0x98, 0x2e, 0xc0, 0x66, 0x65, 0xb4, 0x09, 0x17, 0xb4, 0x44, 0x8e, 0xd7, 0x43, 0x87, 0x3d, + 0x94, 0x7a, 0x6c, 0xcf, 0x6a, 0xc7, 0xf4, 0x13, 0x07, 0xfb, 0x95, 0x0b, 0x6b, 0xdd, 0x10, 0x71, + 0x77, 0x3a, 0xe8, 0x36, 0x9c, 0xe1, 0x0e, 0x83, 0x55, 0xe2, 0xb8, 0x4d, 0xcf, 0x57, 0xf7, 0x00, + 0x5f, 0xf6, 0xe7, 0x0e, 0xf6, 0x2b, 0x67, 0xe6, 0xb2, 0x10, 0x70, 0x76, 0x3d, 0xf4, 0x1a, 0x94, + 0x5d, 0x3f, 0x12, 0x63, 0x30, 0x64, 0xe4, 0x28, 0x2d, 0x57, 0x57, 0xeb, 0xea, 0xfb, 0x93, 0x3f, + 0x38, 0xa9, 0x80, 0x36, 0xb9, 0x1e, 0x4e, 0x89, 0xbd, 0xc3, 0xf9, 0xf9, 0xe8, 0xc5, 0x92, 0x30, + 0x5c, 0x86, 0xb8, 0x02, 0x5a, 0x99, 0xdc, 0x1a, 0xde, 0x44, 0x06, 0x61, 0xf4, 0x06, 0x20, 0xca, + 0x17, 0x7a, 0x0d, 0x32, 0xd7, 0x60, 0x11, 0xcb, 0x99, 0xda, 0xb2, 0x64, 0xb8, 0x68, 0xa0, 0x7a, + 0x07, 0x06, 0xce, 0xa8, 0x85, 0x6e, 0xd0, 0x73, 0x53, 0x2f, 0x15, 0xa6, 0xc3, 0x52, 0x96, 0x98, + 0xae, 0x92, 0x56, 0x48, 0x1a, 0x4e, 0x4c, 0x5c, 0x93, 0x22, 0x4e, 0xd5, 0xa3, 0x57, 0xb7, 0x4a, + 0x5e, 0x04, 0x66, 0x94, 0x8e, 0xce, 0x04, 0x46, 0x54, 0x0c, 0xdf, 0x0a, 0xa2, 0x78, 0x95, 0xc4, + 0xf7, 0x83, 0x70, 0x5b, 0x04, 0x45, 0x4b, 0xe2, 0x73, 0x26, 0x20, 0xac, 0xe3, 0x51, 0xb6, 0x9b, + 0xbd, 0x4a, 0x2f, 0x57, 0xd9, 0x83, 0x60, 0x29, 0xd9, 0x27, 0x37, 0x78, 0x31, 0x96, 0x70, 0x89, + 0xba, 0x5c, 0x5b, 0x60, 0x8f, 0x7b, 0x29, 0xd4, 0xe5, 0xda, 0x02, 0x96, 0x70, 0x44, 0x3a, 0xf3, + 0xbf, 0x8e, 0xe7, 0x2b, 0x51, 0x3b, 0x6f, 0x9f, 0x3e, 0x53, 0xc0, 0xfa, 0x30, 0xa9, 0x32, 0xcf, + 0xf2, 0x68, 0x71, 0xd1, 0xf4, 0x04, 0x5b, 0x24, 0xfd, 0x87, 0x9a, 0x53, 0x6a, 0xe9, 0xe5, 0x14, + 0x25, 0xdc, 0x41, 0xdb, 0x88, 0x9b, 0x32, 0xd9, 0x33, 0xf9, 0xd4, 0x55, 0x28, 0x47, 0xed, 0x75, + 0x37, 0xd8, 0x71, 0x3c, 0x9f, 0xbd, 0xc5, 0x69, 0x3c, 0x5d, 0x5d, 0x02, 0x70, 0x82, 0x83, 0x96, + 0xa0, 0xe4, 0x48, 0x9d, 0x33, 0xca, 0x0f, 0x92, 0xa0, 0x34, 0xcd, 0xdc, 0x6f, 0x58, 0x6a, 0x99, + 0x55, 0x5d, 0xf4, 0x2a, 0x8c, 0x09, 0x37, 0x31, 0x1e, 0x3a, 0x82, 0xbd, 0x95, 0x69, 0x7e, 0x00, + 0x75, 0x1d, 0x88, 0x4d, 0x5c, 0xf4, 0x05, 0x18, 0xa7, 0x54, 0x92, 0x83, 0x6d, 0xfa, 0x74, 0x3f, + 0x27, 0xa2, 0x96, 0x54, 0x44, 0xaf, 0x8c, 0x53, 0xc4, 0x90, 0x0b, 0xe7, 0x9d, 0x76, 0x1c, 0x30, + 0xbd, 0xbd, 0xb9, 0xfe, 0xd7, 0x82, 0x6d, 0xe2, 0xb3, 0x27, 0xb3, 0xd2, 0xfc, 0xa5, 0x83, 0xfd, + 0xca, 0xf9, 0xb9, 0x2e, 0x78, 0xb8, 0x2b, 0x15, 0x74, 0x07, 0x46, 0xe2, 0xa0, 0xc9, 0x2c, 0xf2, + 0xe9, 0x85, 0x78, 0x36, 0x3f, 0xee, 0xd0, 0x9a, 0x42, 0xd3, 0x75, 0x56, 0xaa, 0x2a, 0xd6, 0xe9, + 0xa0, 0x35, 0xbe, 0xc7, 0x58, 0x44, 0x56, 0x12, 0x4d, 0x3f, 0x96, 0x3f, 0x30, 0x2a, 0x70, 0xab, + 0xb9, 0x05, 0x45, 0x4d, 0xac, 0x93, 0x41, 0xd7, 0x61, 0xaa, 0x15, 0x7a, 0x01, 0x5b, 0xd8, 0xea, + 0xcd, 0x64, 0xda, 0xcc, 0x23, 0x51, 0x4b, 0x23, 0xe0, 0xce, 0x3a, 0x54, 0xa6, 0x95, 0x85, 0xd3, + 0xe7, 0x78, 0x52, 0x32, 0xce, 0xe7, 0xf3, 0x32, 0xac, 0xa0, 0x68, 0x85, 0x9d, 0xcb, 0x5c, 0xfa, + 0x9c, 0x9e, 0xc9, 0x0f, 0x2e, 0xa1, 0x4b, 0xa9, 0x9c, 0x3d, 0x53, 0x7f, 0x71, 0x42, 0x81, 0xde, + 0x1b, 0xd1, 0x96, 0x13, 0x92, 0x5a, 0x18, 0x34, 0x48, 0xa4, 0x05, 0x81, 0x7e, 0x9c, 0x07, 0x8e, + 0xa4, 0xf7, 0x46, 0x3d, 0x0b, 0x01, 0x67, 0xd7, 0x43, 0xae, 0x96, 0x8b, 0x9b, 0x72, 0xbd, 0xd1, + 0xf4, 0xf9, 0x2e, 0xf6, 0x4d, 0x29, 0x16, 0x39, 0x59, 0x8b, 0x46, 0x71, 0x84, 0x53, 0x34, 0xd1, + 0xb7, 0xc1, 0xa4, 0x88, 0xb3, 0x94, 0x8c, 0xfb, 0x85, 0xc4, 0x70, 0x12, 0xa7, 0x60, 0xb8, 0x03, + 0x9b, 0x87, 0xbe, 0x76, 0xd6, 0x9b, 0x44, 0x2c, 0xc2, 0x5b, 0x9e, 0xbf, 0x1d, 0x4d, 0x5f, 0x64, + 0x5f, 0x2d, 0x42, 0x5f, 0xa7, 0xa1, 0x38, 0xa3, 0x06, 0x5a, 0x83, 0xc9, 0x56, 0x48, 0xc8, 0x0e, + 0xe3, 0xb1, 0xc4, 0x75, 0x59, 0xe1, 0xde, 0xc0, 0xb4, 0x27, 0xb5, 0x14, 0xec, 0x30, 0xa3, 0x0c, + 0x77, 0x50, 0x98, 0xf9, 0x56, 0x98, 0xea, 0xb8, 0x0f, 0x8f, 0x14, 0x84, 0xfe, 0x4f, 0x07, 0xa1, + 0xac, 0x5e, 0x16, 0xd0, 0x55, 0xf3, 0xc1, 0xe8, 0x5c, 0xfa, 0xc1, 0xa8, 0x44, 0x05, 0x1c, 0xfd, + 0x8d, 0x68, 0xcd, 0xb0, 0x36, 0x2c, 0xe4, 0xa7, 0x7c, 0xd3, 0x45, 0x94, 0x9e, 0x9e, 0x8b, 0x9a, + 0xa2, 0xa8, 0xd8, 0xf7, 0xcb, 0xd3, 0x40, 0x57, 0xdd, 0x53, 0x9f, 0x19, 0x97, 0xd1, 0x93, 0x54, + 0xca, 0x73, 0x97, 0x6b, 0xe9, 0x14, 0xa4, 0x35, 0x5a, 0x88, 0x39, 0x8c, 0x49, 0xc3, 0x94, 0x79, + 0x63, 0xd2, 0xf0, 0xf0, 0x43, 0x4a, 0xc3, 0x92, 0x00, 0x4e, 0x68, 0xa1, 0x26, 0x4c, 0x35, 0xcc, + 0xec, 0xb1, 0xca, 0x5b, 0xf1, 0xc9, 0x9e, 0x79, 0x5c, 0xdb, 0x5a, 0xaa, 0xbe, 0x85, 0x34, 0x15, + 0xdc, 0x49, 0x18, 0xbd, 0x0a, 0xa5, 0xf7, 0x82, 0x88, 0x2d, 0x75, 0xc1, 0xc1, 0x48, 0xaf, 0xae, + 0xd2, 0x9b, 0xb7, 0xeb, 0xac, 0xfc, 0x70, 0xbf, 0x32, 0x52, 0x0b, 0x5c, 0xf9, 0x17, 0xab, 0x0a, + 0xe8, 0x01, 0x9c, 0x31, 0xce, 0x7d, 0xd5, 0x5d, 0xe8, 0xbf, 0xbb, 0x17, 0x44, 0x73, 0x67, 0x96, + 0xb3, 0x28, 0xe1, 0xec, 0x06, 0xe8, 0x61, 0xea, 0x07, 0x22, 0xf3, 0xb2, 0xe4, 0x92, 0x18, 0x33, + 0x54, 0xd6, 0x7d, 0xfa, 0x53, 0x08, 0xb8, 0xb3, 0x8e, 0xfd, 0x2b, 0xfc, 0x21, 0x46, 0xa8, 0x6b, + 0x49, 0xd4, 0x6e, 0x9e, 0x44, 0x62, 0xaf, 0x45, 0x43, 0x93, 0xfc, 0xd0, 0x8f, 0x7d, 0xbf, 0x6e, + 0xb1, 0xc7, 0xbe, 0x35, 0xb2, 0xd3, 0x6a, 0x3a, 0xf1, 0x49, 0x78, 0x13, 0xbd, 0x09, 0xa5, 0x58, + 0xb4, 0xd6, 0x2d, 0x17, 0x99, 0xd6, 0x29, 0xf6, 0xe0, 0xa9, 0xf8, 0x27, 0x59, 0x8a, 0x15, 0x19, + 0xfb, 0x9f, 0xf2, 0x19, 0x90, 0x90, 0x13, 0xd0, 0xea, 0x55, 0x4d, 0xad, 0x5e, 0xa5, 0xc7, 0x17, + 0xe4, 0x68, 0xf7, 0xfe, 0x89, 0xd9, 0x6f, 0x26, 0xaa, 0x7e, 0xd4, 0x5f, 0x99, 0xed, 0x1f, 0xb6, + 0xe0, 0x74, 0x96, 0x59, 0x16, 0xe5, 0x79, 0xb9, 0xa0, 0xac, 0x5e, 0xdd, 0xd5, 0x08, 0xde, 0x15, + 0xe5, 0x58, 0x61, 0xf4, 0x9d, 0xe6, 0xe3, 0x68, 0x61, 0xef, 0x6e, 0xc3, 0x58, 0x2d, 0x24, 0xda, + 0x1d, 0xf0, 0x3a, 0x77, 0x0f, 0xe4, 0xfd, 0x79, 0xf6, 0xc8, 0xae, 0x81, 0xf6, 0xcf, 0x14, 0xe0, + 0x34, 0x7f, 0x36, 0x9b, 0xdb, 0x0d, 0x3c, 0xb7, 0x16, 0xb8, 0x22, 0x45, 0xcb, 0x5b, 0x30, 0xda, + 0xd2, 0xb4, 0x1b, 0xdd, 0x02, 0x6f, 0xe9, 0x5a, 0x90, 0x44, 0xca, 0xd4, 0x4b, 0xb1, 0x41, 0x0b, + 0xb9, 0x30, 0x4a, 0x76, 0xbd, 0x86, 0x7a, 0x7b, 0x29, 0x1c, 0xf9, 0x6e, 0x50, 0xad, 0x2c, 0x6a, + 0x74, 0xb0, 0x41, 0xf5, 0x11, 0x64, 0xed, 0xb3, 0x7f, 0xc4, 0x82, 0xc7, 0x72, 0xc2, 0x74, 0xd1, + 0xe6, 0xee, 0xb3, 0x07, 0x4a, 0x91, 0x00, 0x4c, 0x35, 0xc7, 0x9f, 0x2d, 0xb1, 0x80, 0xa2, 0xcf, + 0x01, 0xf0, 0x67, 0x47, 0x2a, 0x74, 0xf5, 0x8a, 0x67, 0x64, 0x84, 0x62, 0xd1, 0x42, 0x68, 0xc8, + 0xfa, 0x58, 0xa3, 0x65, 0xff, 0x64, 0x11, 0x06, 0xd9, 0x33, 0x17, 0x5a, 0x82, 0xe1, 0x2d, 0x1e, + 0xb8, 0xba, 0x9f, 0x18, 0xd9, 0x89, 0xf4, 0xca, 0x0b, 0xb0, 0xac, 0x8c, 0x56, 0xe0, 0x14, 0x0f, + 0xfc, 0xdd, 0xac, 0x92, 0xa6, 0xb3, 0x27, 0x95, 0x20, 0x3c, 0x69, 0x96, 0x0a, 0x07, 0xb2, 0xdc, + 0x89, 0x82, 0xb3, 0xea, 0xa1, 0xd7, 0x61, 0x9c, 0x72, 0x8d, 0x41, 0x3b, 0x96, 0x94, 0x78, 0xc8, + 0x6f, 0xc5, 0xa6, 0xae, 0x19, 0x50, 0x9c, 0xc2, 0xa6, 0xe2, 0x5c, 0xab, 0x43, 0xdd, 0x33, 0x98, + 0x88, 0x73, 0xa6, 0x8a, 0xc7, 0xc4, 0x65, 0xf6, 0x58, 0x6d, 0x66, 0x7d, 0xb6, 0xb6, 0x15, 0x92, + 0x68, 0x2b, 0x68, 0xba, 0x22, 0xe7, 0x7a, 0x62, 0x8f, 0x95, 0x82, 0xe3, 0x8e, 0x1a, 0x94, 0xca, + 0x86, 0xe3, 0x35, 0xdb, 0x21, 0x49, 0xa8, 0x0c, 0x99, 0x54, 0x96, 0x52, 0x70, 0xdc, 0x51, 0x83, + 0xae, 0xa3, 0x33, 0x22, 0x09, 0xba, 0x0c, 0x52, 0xa0, 0x8c, 0xec, 0x86, 0xa5, 0xbb, 0x56, 0x97, + 0x28, 0x3d, 0xc2, 0x0c, 0x49, 0xa5, 0x51, 0xd7, 0x94, 0xa2, 0xc2, 0x51, 0x4b, 0x52, 0x79, 0x98, + 0x54, 0xdc, 0xdf, 0x5f, 0x80, 0x53, 0x19, 0xc6, 0xbc, 0xfc, 0xa8, 0xda, 0xf4, 0xa2, 0x58, 0x25, + 0x06, 0xd2, 0x8e, 0x2a, 0x5e, 0x8e, 0x15, 0x06, 0xdd, 0x0f, 0xfc, 0x30, 0x4c, 0x1f, 0x80, 0xc2, + 0x58, 0x4e, 0x40, 0x8f, 0x98, 0x62, 0xe7, 0x12, 0x0c, 0xb4, 0x23, 0x22, 0xe3, 0x6b, 0xa9, 0xf3, + 0x9b, 0xa9, 0xc9, 0x19, 0x84, 0xb2, 0xa6, 0x9b, 0x4a, 0x43, 0xad, 0xb1, 0xa6, 0x5c, 0xed, 0xcc, + 0x61, 0xb4, 0x73, 0x31, 0xf1, 0x1d, 0x3f, 0x16, 0x0c, 0x6c, 0x12, 0x15, 0x86, 0x95, 0x62, 0x01, + 0xb5, 0xbf, 0x52, 0x84, 0x73, 0xb9, 0xe6, 0xfd, 0xb4, 0xeb, 0x3b, 0x81, 0xef, 0xc5, 0x81, 0x7a, + 0x6a, 0xe5, 0x91, 0x60, 0x48, 0x6b, 0x6b, 0x45, 0x94, 0x63, 0x85, 0x81, 0x2e, 0xcb, 0xb4, 0xfd, + 0xe9, 0x14, 0x49, 0xf3, 0x55, 0x23, 0x73, 0x7f, 0xbf, 0xe9, 0xe7, 0x9e, 0x84, 0x81, 0x56, 0x10, + 0x34, 0xd3, 0x87, 0x16, 0xed, 0x6e, 0x10, 0x34, 0x31, 0x03, 0xa2, 0x4f, 0x88, 0xf1, 0x4a, 0xbd, + 0x2d, 0x62, 0xc7, 0x0d, 0x22, 0x6d, 0xd0, 0x9e, 0x86, 0xe1, 0x6d, 0xb2, 0x17, 0x7a, 0xfe, 0x66, + 0xfa, 0xcd, 0xf9, 0x26, 0x2f, 0xc6, 0x12, 0x6e, 0x26, 0xcc, 0x18, 0x3e, 0xee, 0xbc, 0x71, 0xa5, + 0x9e, 0x57, 0xe0, 0x0f, 0x14, 0x61, 0x02, 0xcf, 0x57, 0xbf, 0x39, 0x11, 0x77, 0x3a, 0x27, 0xe2, + 0xb8, 0xf3, 0xc6, 0xf5, 0x9e, 0x8d, 0x5f, 0xb4, 0x60, 0x82, 0x05, 0x95, 0x16, 0xf1, 0x47, 0xbc, + 0xc0, 0x3f, 0x01, 0x16, 0xef, 0x49, 0x18, 0x0c, 0x69, 0xa3, 0xe9, 0xdc, 0x48, 0xac, 0x27, 0x98, + 0xc3, 0xd0, 0x79, 0x18, 0x60, 0x5d, 0xa0, 0x93, 0x37, 0xca, 0xd3, 0x4a, 0x54, 0x9d, 0xd8, 0xc1, + 0xac, 0x94, 0x39, 0xd5, 0x63, 0xd2, 0x6a, 0x7a, 0xbc, 0xd3, 0xc9, 0xc3, 0xca, 0x47, 0xc3, 0xa9, + 0x3e, 0xb3, 0x6b, 0x1f, 0xcc, 0xa9, 0x3e, 0x9b, 0x64, 0x77, 0xf1, 0xe9, 0x8f, 0x0a, 0x70, 0x31, + 0xb3, 0x5e, 0xdf, 0x4e, 0xf5, 0xdd, 0x6b, 0x1f, 0x8f, 0xe9, 0x50, 0xb6, 0x45, 0x4f, 0xf1, 0x04, + 0x2d, 0x7a, 0x06, 0xfa, 0xe5, 0x30, 0x07, 0xfb, 0xf0, 0x75, 0xcf, 0x1c, 0xb2, 0x8f, 0x88, 0xaf, + 0x7b, 0x66, 0xdf, 0x72, 0xc4, 0xbf, 0x3f, 0x2f, 0xe4, 0x7c, 0x0b, 0x13, 0x04, 0xaf, 0xd0, 0x73, + 0x86, 0x01, 0x23, 0xc1, 0x31, 0x8f, 0xf2, 0x33, 0x86, 0x97, 0x61, 0x05, 0x45, 0x9e, 0xe6, 0x35, + 0x5e, 0xc8, 0x4f, 0x15, 0x9a, 0xdb, 0xd4, 0xac, 0xf9, 0x0e, 0xa6, 0x86, 0x20, 0xc3, 0x83, 0x7c, + 0x45, 0x13, 0xde, 0x8b, 0xfd, 0x0b, 0xef, 0xa3, 0xd9, 0x82, 0x3b, 0x9a, 0x83, 0x89, 0x1d, 0xcf, + 0xa7, 0xc7, 0xe6, 0x9e, 0xc9, 0xb2, 0xaa, 0x20, 0x2a, 0x2b, 0x26, 0x18, 0xa7, 0xf1, 0x67, 0x5e, + 0x85, 0xb1, 0x87, 0x57, 0x5b, 0x7e, 0xbd, 0x08, 0x8f, 0x77, 0xd9, 0xf6, 0xfc, 0xac, 0x37, 0xe6, + 0x40, 0x3b, 0xeb, 0x3b, 0xe6, 0xa1, 0x06, 0xa7, 0x37, 0xda, 0xcd, 0xe6, 0x1e, 0x33, 0x9a, 0x25, + 0xae, 0xc4, 0x10, 0x3c, 0xe5, 0x79, 0x99, 0xc8, 0x63, 0x29, 0x03, 0x07, 0x67, 0xd6, 0x44, 0x6f, + 0x00, 0x0a, 0x44, 0x9e, 0xe2, 0xeb, 0xc4, 0x17, 0xaf, 0x0b, 0x6c, 0xe0, 0x8b, 0xc9, 0x66, 0xbc, + 0xdd, 0x81, 0x81, 0x33, 0x6a, 0x51, 0xe1, 0x80, 0xde, 0x4a, 0x7b, 0xaa, 0x5b, 0x29, 0xe1, 0x00, + 0xeb, 0x40, 0x6c, 0xe2, 0xa2, 0xeb, 0x30, 0xe5, 0xec, 0x3a, 0x1e, 0x0f, 0x2e, 0x28, 0x09, 0x70, + 0xe9, 0x40, 0x29, 0xcb, 0xe6, 0xd2, 0x08, 0xb8, 0xb3, 0x4e, 0xca, 0xaf, 0x7c, 0x28, 0xdf, 0xaf, + 0xbc, 0xfb, 0xb9, 0xd8, 0x4b, 0xf7, 0x6b, 0xff, 0x67, 0x8b, 0x5e, 0x5f, 0x9c, 0xc9, 0x37, 0xc3, + 0x23, 0xbd, 0xca, 0xcc, 0x62, 0xb8, 0x32, 0x50, 0x73, 0xf1, 0x3e, 0xa3, 0x99, 0xc5, 0x24, 0x40, + 0x6c, 0xe2, 0xf2, 0x05, 0x11, 0x25, 0x9e, 0x45, 0x06, 0x8b, 0x2f, 0x42, 0x44, 0x28, 0x0c, 0xf4, + 0x79, 0x18, 0x76, 0xbd, 0x5d, 0x2f, 0x0a, 0x42, 0xb1, 0x59, 0x8e, 0xe8, 0x9f, 0x91, 0x9c, 0x83, + 0x55, 0x4e, 0x06, 0x4b, 0x7a, 0xf6, 0x0f, 0x14, 0x60, 0x4c, 0xb6, 0xf8, 0x66, 0x3b, 0x88, 0x9d, + 0x13, 0xb8, 0x96, 0xaf, 0x1b, 0xd7, 0xf2, 0x27, 0xba, 0xc5, 0xc9, 0x60, 0x5d, 0xca, 0xbd, 0x8e, + 0x6f, 0xa7, 0xae, 0xe3, 0xa7, 0x7a, 0x93, 0xea, 0x7e, 0x0d, 0xff, 0x33, 0x0b, 0xa6, 0x0c, 0xfc, + 0x13, 0xb8, 0x0d, 0x96, 0xcc, 0xdb, 0xe0, 0x89, 0x9e, 0xdf, 0x90, 0x73, 0x0b, 0x7c, 0x6f, 0x31, + 0xd5, 0x77, 0x76, 0xfa, 0xbf, 0x07, 0x03, 0x5b, 0x4e, 0xe8, 0x76, 0x8b, 0xc7, 0xdb, 0x51, 0x69, + 0xf6, 0x86, 0x13, 0xba, 0xfc, 0x0c, 0x7f, 0x56, 0x25, 0xfb, 0x74, 0x42, 0xb7, 0xa7, 0x23, 0x1d, + 0x6b, 0x0a, 0xbd, 0x02, 0x43, 0x51, 0x23, 0x68, 0x29, 0x33, 0xd7, 0x4b, 0x3c, 0x11, 0x28, 0x2d, + 0x39, 0xdc, 0xaf, 0x20, 0xb3, 0x39, 0x5a, 0x8c, 0x05, 0x3e, 0x7a, 0x0b, 0xc6, 0xd8, 0x2f, 0x65, + 0x7f, 0x51, 0xcc, 0xcf, 0x02, 0x51, 0xd7, 0x11, 0xb9, 0x19, 0x8f, 0x51, 0x84, 0x4d, 0x52, 0x33, + 0x9b, 0x50, 0x56, 0x9f, 0xf5, 0x48, 0x1d, 0xa0, 0xfe, 0x43, 0x11, 0x4e, 0x65, 0xac, 0x39, 0x14, + 0x19, 0x33, 0xf1, 0x7c, 0x9f, 0x4b, 0xf5, 0x03, 0xce, 0x45, 0xc4, 0xa4, 0x21, 0x57, 0xac, 0xad, + 0xbe, 0x1b, 0xbd, 0x13, 0x91, 0x74, 0xa3, 0xb4, 0xa8, 0x77, 0xa3, 0xb4, 0xb1, 0x13, 0x1b, 0x6a, + 0xda, 0x90, 0xea, 0xe9, 0x23, 0x9d, 0xd3, 0x3f, 0x29, 0xc2, 0xe9, 0xac, 0xd0, 0x3d, 0xe8, 0x3b, + 0x53, 0x19, 0x81, 0x5e, 0xec, 0x37, 0xe8, 0x0f, 0x4f, 0x13, 0x24, 0x12, 0x7a, 0xcf, 0x9a, 0x39, + 0x82, 0x7a, 0x0e, 0xb3, 0x68, 0x93, 0x79, 0xcd, 0x86, 0x3c, 0x93, 0x93, 0x3c, 0x3e, 0x3e, 0xdd, + 0x77, 0x07, 0x44, 0x0a, 0xa8, 0x28, 0xe5, 0x35, 0x2b, 0x8b, 0x7b, 0x7b, 0xcd, 0xca, 0x96, 0x67, + 0x3c, 0x18, 0xd1, 0xbe, 0xe6, 0x91, 0xce, 0xf8, 0x36, 0xbd, 0xad, 0xb4, 0x7e, 0x3f, 0xd2, 0x59, + 0xff, 0x11, 0x0b, 0x52, 0x36, 0xa5, 0x4a, 0x2d, 0x66, 0xe5, 0xaa, 0xc5, 0x2e, 0xc1, 0x40, 0x18, + 0x34, 0x49, 0x3a, 0x01, 0x0f, 0x0e, 0x9a, 0x04, 0x33, 0x08, 0xc5, 0x88, 0x13, 0x65, 0xc7, 0xa8, + 0x2e, 0xc8, 0x09, 0x11, 0xed, 0x49, 0x18, 0x6c, 0x92, 0x5d, 0xd2, 0x4c, 0x47, 0xb7, 0xbf, 0x45, + 0x0b, 0x31, 0x87, 0xd9, 0xbf, 0x38, 0x00, 0x17, 0xba, 0xfa, 0x9d, 0x53, 0x71, 0x68, 0xd3, 0x89, + 0xc9, 0x7d, 0x67, 0x2f, 0x1d, 0x86, 0xfa, 0x3a, 0x2f, 0xc6, 0x12, 0xce, 0xcc, 0xec, 0x79, 0xd8, + 0xc9, 0x94, 0x12, 0x51, 0x44, 0x9b, 0x14, 0x50, 0x53, 0x29, 0x55, 0x3c, 0x0e, 0xa5, 0xd4, 0x35, + 0x80, 0x28, 0x6a, 0x72, 0xab, 0x05, 0x57, 0xd8, 0xef, 0x27, 0xe1, 0x49, 0xeb, 0xb7, 0x04, 0x04, + 0x6b, 0x58, 0xa8, 0x0a, 0x93, 0xad, 0x30, 0x88, 0xb9, 0x4e, 0xb6, 0xca, 0xcd, 0x9d, 0x06, 0x4d, + 0x97, 0xdf, 0x5a, 0x0a, 0x8e, 0x3b, 0x6a, 0xa0, 0x97, 0x60, 0x44, 0xb8, 0x01, 0xd7, 0x82, 0xa0, + 0x29, 0xd4, 0x40, 0xca, 0x78, 0xa6, 0x9e, 0x80, 0xb0, 0x8e, 0xa7, 0x55, 0x63, 0x8a, 0xde, 0xe1, + 0xcc, 0x6a, 0x5c, 0xd9, 0xab, 0xe1, 0xa5, 0xc2, 0x78, 0x95, 0xfa, 0x0a, 0xe3, 0x95, 0x28, 0xc6, + 0xca, 0x7d, 0xbf, 0x6d, 0x41, 0x4f, 0x55, 0xd2, 0xcf, 0x0d, 0xc0, 0x29, 0xb1, 0x70, 0x1e, 0xf5, + 0x72, 0xb9, 0xd3, 0xb9, 0x5c, 0x8e, 0x43, 0x75, 0xf6, 0xcd, 0x35, 0x73, 0xd2, 0x6b, 0xe6, 0x07, + 0x2d, 0x30, 0xd9, 0x2b, 0xf4, 0xff, 0xe5, 0xc6, 0xf1, 0x7f, 0x29, 0x97, 0x5d, 0x73, 0xe5, 0x05, + 0xf2, 0x01, 0x23, 0xfa, 0xdb, 0xff, 0xc9, 0x82, 0x27, 0x7a, 0x52, 0x44, 0x8b, 0x50, 0x66, 0x3c, + 0xa0, 0x26, 0x9d, 0x3d, 0xa5, 0xcc, 0x21, 0x25, 0x20, 0x87, 0x25, 0x4d, 0x6a, 0xa2, 0xc5, 0x8e, + 0x84, 0x09, 0x4f, 0x67, 0x24, 0x4c, 0x38, 0x63, 0x0c, 0xcf, 0x43, 0x66, 0x4c, 0xf8, 0x95, 0x22, + 0x0c, 0xf1, 0x15, 0x7f, 0x02, 0x62, 0xd8, 0x92, 0xd0, 0xdb, 0x76, 0x09, 0xe4, 0xc5, 0xfb, 0x32, + 0x5b, 0x75, 0x62, 0x87, 0xb3, 0x09, 0xea, 0xb6, 0x4a, 0x34, 0xbc, 0x68, 0xd6, 0xb8, 0xcf, 0x66, + 0x52, 0x8a, 0x49, 0xe0, 0x34, 0xb4, 0xdb, 0xed, 0x8b, 0x00, 0x51, 0x1c, 0x7a, 0xfe, 0x26, 0xa5, + 0x21, 0x42, 0xc2, 0x7d, 0xb2, 0x4b, 0xeb, 0x75, 0x85, 0xcc, 0xfb, 0x90, 0xec, 0x74, 0x05, 0xc0, + 0x1a, 0xc5, 0x99, 0x97, 0xa1, 0xac, 0x90, 0x7b, 0x69, 0x71, 0x46, 0x75, 0xe6, 0xe2, 0xb3, 0x30, + 0x91, 0x6a, 0xeb, 0x48, 0x4a, 0xa0, 0x5f, 0xb2, 0x60, 0x82, 0x77, 0x79, 0xd1, 0xdf, 0x15, 0x67, + 0xea, 0xfb, 0x70, 0xba, 0x99, 0x71, 0xb6, 0x89, 0x19, 0xed, 0xff, 0x2c, 0x54, 0x4a, 0x9f, 0x2c, + 0x28, 0xce, 0x6c, 0x03, 0x5d, 0xa1, 0xeb, 0x96, 0x9e, 0x5d, 0x4e, 0x53, 0xb8, 0x6c, 0x8d, 0xf2, + 0x35, 0xcb, 0xcb, 0xb0, 0x82, 0xda, 0xbf, 0x6d, 0xc1, 0x14, 0xef, 0xf9, 0x4d, 0xb2, 0xa7, 0x76, + 0xf8, 0x87, 0xd9, 0x77, 0x91, 0xc3, 0xa4, 0x90, 0x93, 0xc3, 0x44, 0xff, 0xb4, 0x62, 0xd7, 0x4f, + 0xfb, 0x19, 0x0b, 0xc4, 0x0a, 0x3c, 0x01, 0x51, 0xfe, 0x5b, 0x4d, 0x51, 0x7e, 0x26, 0x7f, 0x51, + 0xe7, 0xc8, 0xf0, 0x7f, 0x66, 0xc1, 0x24, 0x47, 0x48, 0xde, 0x9c, 0x3f, 0xd4, 0x79, 0xe8, 0x27, + 0x19, 0xa1, 0xca, 0x50, 0x9e, 0xfd, 0x51, 0xc6, 0x64, 0x0d, 0x74, 0x9d, 0x2c, 0x57, 0x6e, 0xa0, + 0x23, 0x24, 0xe2, 0x3c, 0x72, 0x2c, 0x70, 0xfb, 0x0f, 0x2d, 0x40, 0xbc, 0x19, 0x83, 0xfd, 0xa1, + 0x4c, 0x05, 0x2b, 0xd5, 0xae, 0x8b, 0xe4, 0xa8, 0x51, 0x10, 0xac, 0x61, 0x1d, 0xcb, 0xf0, 0xa4, + 0x0c, 0x07, 0x8a, 0xbd, 0x0d, 0x07, 0x8e, 0x30, 0xa2, 0x7f, 0x30, 0x08, 0x69, 0xa7, 0x06, 0x74, + 0x17, 0x46, 0x1b, 0x4e, 0xcb, 0x59, 0xf7, 0x9a, 0x5e, 0xec, 0x91, 0xa8, 0x9b, 0xc5, 0xd1, 0x82, + 0x86, 0x27, 0x9e, 0x7a, 0xb5, 0x12, 0x6c, 0xd0, 0x41, 0xb3, 0x00, 0xad, 0xd0, 0xdb, 0xf5, 0x9a, + 0x64, 0x93, 0x69, 0x1c, 0x98, 0x93, 0x28, 0x37, 0xa3, 0x91, 0xa5, 0x58, 0xc3, 0xc8, 0xf0, 0xf7, + 0x2b, 0x3e, 0x3a, 0x7f, 0xbf, 0x81, 0x23, 0xfa, 0xfb, 0x0d, 0xf6, 0xe5, 0xef, 0x87, 0xe1, 0xac, + 0x64, 0x91, 0xe8, 0xff, 0x25, 0xaf, 0x49, 0x04, 0x5f, 0xcc, 0x5d, 0x47, 0x67, 0x0e, 0xf6, 0x2b, + 0x67, 0x71, 0x26, 0x06, 0xce, 0xa9, 0x89, 0x3e, 0x07, 0xd3, 0x4e, 0xb3, 0x19, 0xdc, 0x57, 0xa3, + 0xb6, 0x18, 0x35, 0x9c, 0x26, 0xd7, 0xd8, 0x0f, 0x33, 0xaa, 0xe7, 0x0f, 0xf6, 0x2b, 0xd3, 0x73, + 0x39, 0x38, 0x38, 0xb7, 0x76, 0xca, 0x5d, 0xb0, 0xd4, 0xd3, 0x5d, 0xf0, 0x35, 0x28, 0xb7, 0xc2, + 0xa0, 0xb1, 0xa2, 0xf9, 0x14, 0x5d, 0x64, 0x69, 0xfe, 0x65, 0xe1, 0xe1, 0x7e, 0x65, 0x4c, 0xfd, + 0x61, 0x37, 0x7c, 0x52, 0x21, 0xc3, 0x4b, 0x10, 0x1e, 0xa5, 0x97, 0xe0, 0x36, 0x9c, 0xaa, 0x93, + 0xd0, 0x63, 0xf9, 0x4a, 0xdd, 0xe4, 0xfc, 0x58, 0x83, 0x72, 0x98, 0x3a, 0x31, 0xfb, 0x0a, 0x7e, + 0xa5, 0xc5, 0x64, 0x96, 0x27, 0x64, 0x42, 0xc8, 0xfe, 0x53, 0x0b, 0x86, 0x85, 0x39, 0xfd, 0x09, + 0x30, 0x6a, 0x73, 0x86, 0xbe, 0xbc, 0x92, 0x7d, 0xab, 0xb0, 0xce, 0xe4, 0x6a, 0xca, 0x97, 0x53, + 0x9a, 0xf2, 0x27, 0xba, 0x11, 0xe9, 0xae, 0x23, 0xff, 0xdb, 0x45, 0x18, 0x37, 0x3d, 0x60, 0x4e, + 0x60, 0x08, 0x56, 0x61, 0x38, 0x12, 0xee, 0x56, 0x85, 0x7c, 0x83, 0xee, 0xf4, 0x24, 0x26, 0xd6, + 0x5a, 0xc2, 0xc1, 0x4a, 0x12, 0xc9, 0xf4, 0xe3, 0x2a, 0x3e, 0x42, 0x3f, 0xae, 0x5e, 0x4e, 0x48, + 0x03, 0xc7, 0xe1, 0x84, 0x64, 0x7f, 0x95, 0xdd, 0x6c, 0x7a, 0xf9, 0x09, 0x30, 0x3d, 0xd7, 0xcd, + 0x3b, 0xd0, 0xee, 0xb2, 0xb2, 0x44, 0xa7, 0x72, 0x98, 0x9f, 0x5f, 0xb0, 0xe0, 0x42, 0xc6, 0x57, + 0x69, 0x9c, 0xd0, 0xb3, 0x50, 0x72, 0xda, 0xae, 0xa7, 0xf6, 0xb2, 0xf6, 0x6a, 0x36, 0x27, 0xca, + 0xb1, 0xc2, 0x40, 0x0b, 0x30, 0x45, 0x1e, 0xb4, 0x3c, 0xfe, 0x6c, 0xa9, 0x9b, 0x54, 0x16, 0x79, + 0x40, 0xe0, 0xc5, 0x34, 0x10, 0x77, 0xe2, 0x2b, 0x97, 0xf9, 0x62, 0xae, 0xcb, 0xfc, 0x3f, 0xb4, + 0x60, 0x44, 0xb9, 0xd6, 0x3c, 0xf2, 0xd1, 0xfe, 0x36, 0x73, 0xb4, 0x1f, 0xef, 0x32, 0xda, 0x39, + 0xc3, 0xfc, 0x77, 0x0b, 0xaa, 0xbf, 0xb5, 0x20, 0x8c, 0xfb, 0xe0, 0xb0, 0x5e, 0x81, 0x52, 0x2b, + 0x0c, 0xe2, 0xa0, 0x11, 0x34, 0x05, 0x83, 0x75, 0x3e, 0x89, 0xe8, 0xc0, 0xcb, 0x0f, 0xb5, 0xdf, + 0x58, 0x61, 0xb3, 0xd1, 0x0b, 0xc2, 0x58, 0x30, 0x35, 0xc9, 0xe8, 0x05, 0x61, 0x8c, 0x19, 0x04, + 0xb9, 0x00, 0xb1, 0x13, 0x6e, 0x92, 0x98, 0x96, 0x89, 0xe0, 0x30, 0xf9, 0x87, 0x47, 0x3b, 0xf6, + 0x9a, 0xb3, 0x9e, 0x1f, 0x47, 0x71, 0x38, 0xbb, 0xec, 0xc7, 0xb7, 0x43, 0x2e, 0xaf, 0x69, 0x21, + 0x1a, 0x14, 0x2d, 0xac, 0xd1, 0x95, 0x8e, 0xad, 0xac, 0x8d, 0x41, 0xf3, 0xfd, 0x7d, 0x55, 0x94, + 0x63, 0x85, 0x61, 0xbf, 0xcc, 0xae, 0x12, 0x36, 0x40, 0x47, 0x8b, 0x9e, 0xf0, 0xb5, 0x92, 0x1a, + 0x5a, 0xf6, 0xf8, 0x56, 0xd5, 0x63, 0x34, 0x74, 0x3f, 0xb9, 0x69, 0xc3, 0xba, 0x7b, 0x4f, 0x12, + 0xc8, 0x01, 0x7d, 0x7b, 0x87, 0x59, 0xc6, 0x73, 0x3d, 0xae, 0x80, 0x23, 0x18, 0x62, 0xb0, 0x20, + 0xe5, 0x2c, 0x84, 0xf3, 0x72, 0x4d, 0x2c, 0x72, 0x2d, 0x48, 0xb9, 0x00, 0xe0, 0x04, 0x07, 0x5d, + 0x15, 0xd2, 0xfe, 0x80, 0x91, 0xaa, 0x50, 0x4a, 0xfb, 0xf2, 0xf3, 0x35, 0x71, 0xff, 0x79, 0x18, + 0x51, 0x29, 0x0b, 0x6b, 0x3c, 0xf3, 0x9b, 0x08, 0x95, 0xb3, 0x98, 0x14, 0x63, 0x1d, 0x07, 0xad, + 0xc1, 0x44, 0xc4, 0x55, 0x3d, 0x2a, 0x22, 0x22, 0x57, 0x99, 0x7d, 0x52, 0x9a, 0x73, 0xd4, 0x4d, + 0xf0, 0x21, 0x2b, 0xe2, 0x47, 0x87, 0xf4, 0x4e, 0x4d, 0x93, 0x40, 0xaf, 0xc3, 0x78, 0x33, 0x70, + 0xdc, 0x79, 0xa7, 0xe9, 0xf8, 0x0d, 0xf6, 0xbd, 0x25, 0x33, 0xd3, 0xd3, 0x2d, 0x03, 0x8a, 0x53, + 0xd8, 0x94, 0x31, 0xd3, 0x4b, 0x44, 0x14, 0x4f, 0xc7, 0xdf, 0x24, 0x91, 0x48, 0xb8, 0xc6, 0x18, + 0xb3, 0x5b, 0x39, 0x38, 0x38, 0xb7, 0x36, 0x7a, 0x05, 0x46, 0xe5, 0xe7, 0x6b, 0xbe, 0xd7, 0x89, + 0xed, 0xbd, 0x06, 0xc3, 0x06, 0x26, 0xba, 0x0f, 0x67, 0xe4, 0xff, 0xb5, 0xd0, 0xd9, 0xd8, 0xf0, + 0x1a, 0xc2, 0x97, 0x8f, 0x3b, 0x20, 0xcd, 0x49, 0x8f, 0xa6, 0xc5, 0x2c, 0xa4, 0xc3, 0xfd, 0xca, + 0x25, 0x31, 0x6a, 0x99, 0x70, 0x36, 0x89, 0xd9, 0xf4, 0xd1, 0x0a, 0x9c, 0xda, 0x22, 0x4e, 0x33, + 0xde, 0x5a, 0xd8, 0x22, 0x8d, 0x6d, 0xb9, 0x89, 0x98, 0x47, 0xb7, 0x66, 0xb1, 0x7e, 0xa3, 0x13, + 0x05, 0x67, 0xd5, 0x43, 0x6f, 0xc3, 0x74, 0xab, 0xbd, 0xde, 0xf4, 0xa2, 0xad, 0xd5, 0x20, 0x66, + 0x16, 0x24, 0x2a, 0xe3, 0x9f, 0x70, 0xfd, 0x56, 0xde, 0xec, 0xb5, 0x1c, 0x3c, 0x9c, 0x4b, 0x01, + 0xbd, 0x0f, 0x67, 0x52, 0x8b, 0x41, 0x38, 0xa2, 0x8e, 0xe7, 0xc7, 0x44, 0xae, 0x67, 0x55, 0x10, + 0x8e, 0xa5, 0x59, 0x20, 0x9c, 0xdd, 0xc4, 0x07, 0xb3, 0x2b, 0x7a, 0x8f, 0x56, 0xd6, 0x98, 0x32, + 0xf4, 0x0e, 0x8c, 0xea, 0xab, 0x48, 0x5c, 0x30, 0x97, 0xb3, 0x79, 0x16, 0x6d, 0xb5, 0x71, 0x96, + 0x4e, 0xad, 0x28, 0x1d, 0x86, 0x0d, 0x8a, 0x36, 0x81, 0xec, 0xef, 0x43, 0xb7, 0xa0, 0xd4, 0x68, + 0x7a, 0xc4, 0x8f, 0x97, 0x6b, 0xdd, 0x02, 0xb3, 0x2c, 0x08, 0x1c, 0x31, 0x60, 0x22, 0x88, 0x2c, + 0x2f, 0xc3, 0x8a, 0x82, 0xfd, 0x6b, 0x05, 0xa8, 0xf4, 0x88, 0x48, 0x9c, 0x52, 0x7f, 0x5b, 0x7d, + 0xa9, 0xbf, 0xe7, 0x64, 0xfe, 0xc2, 0xd5, 0x94, 0x4e, 0x20, 0x95, 0x9b, 0x30, 0xd1, 0x0c, 0xa4, + 0xf1, 0xfb, 0x36, 0x47, 0xd6, 0x35, 0xe8, 0x03, 0x3d, 0x0d, 0xea, 0x8d, 0x97, 0xb3, 0xc1, 0xfe, + 0x05, 0x91, 0xdc, 0x57, 0x10, 0xfb, 0xab, 0x05, 0x38, 0xa3, 0x86, 0xf0, 0x1b, 0x77, 0xe0, 0xee, + 0x74, 0x0e, 0xdc, 0x31, 0xbc, 0x21, 0xd9, 0xb7, 0x61, 0x88, 0x07, 0xb6, 0xe9, 0x83, 0x01, 0x7a, + 0xd2, 0x8c, 0x82, 0xa6, 0xae, 0x69, 0x23, 0x12, 0xda, 0x5f, 0xb1, 0x60, 0x62, 0x6d, 0xa1, 0x56, + 0x0f, 0x1a, 0xdb, 0x24, 0x9e, 0xe3, 0x0c, 0x2b, 0x16, 0xfc, 0x8f, 0xf5, 0x90, 0x7c, 0x4d, 0x16, + 0xc7, 0x74, 0x09, 0x06, 0xb6, 0x82, 0x28, 0x4e, 0x3f, 0x30, 0xdf, 0x08, 0xa2, 0x18, 0x33, 0x88, + 0xfd, 0x3b, 0x16, 0x0c, 0xb2, 0xac, 0xbb, 0xbd, 0x52, 0x41, 0xf7, 0xf3, 0x5d, 0xe8, 0x25, 0x18, + 0x22, 0x1b, 0x1b, 0xa4, 0x11, 0x8b, 0x59, 0x95, 0x5e, 0xb2, 0x43, 0x8b, 0xac, 0x94, 0x5e, 0xfa, + 0xac, 0x31, 0xfe, 0x17, 0x0b, 0x64, 0x74, 0x0f, 0xca, 0xb1, 0xb7, 0x43, 0xe6, 0x5c, 0x57, 0x3c, + 0xd1, 0x3d, 0x84, 0x53, 0xf2, 0x9a, 0x24, 0x80, 0x13, 0x5a, 0xf6, 0x57, 0x0a, 0x00, 0x49, 0xbc, + 0x84, 0x5e, 0x9f, 0x38, 0xdf, 0xf1, 0x78, 0x73, 0x39, 0xe3, 0xf1, 0x06, 0x25, 0x04, 0x33, 0x5e, + 0x6e, 0xd4, 0x30, 0x15, 0xfb, 0x1a, 0xa6, 0x81, 0xa3, 0x0c, 0xd3, 0x02, 0x4c, 0x25, 0xf1, 0x1e, + 0xcc, 0xe0, 0x37, 0x4c, 0x48, 0x59, 0x4b, 0x03, 0x71, 0x27, 0xbe, 0x4d, 0xe0, 0x92, 0x8c, 0x7a, + 0x2a, 0xef, 0x1a, 0x66, 0x01, 0x7a, 0x84, 0xac, 0xe0, 0xc9, 0xeb, 0x54, 0x21, 0xf7, 0x75, 0xea, + 0xc7, 0x2d, 0x38, 0x9d, 0x6e, 0x87, 0xb9, 0xe4, 0x7d, 0xd9, 0x82, 0x33, 0xec, 0x8d, 0x8e, 0xb5, + 0xda, 0xf9, 0x22, 0xf8, 0x62, 0x76, 0x1c, 0x8c, 0xee, 0x3d, 0x4e, 0xdc, 0xb1, 0x57, 0xb2, 0x48, + 0xe3, 0xec, 0x16, 0xed, 0x2f, 0x5b, 0x70, 0x2e, 0x37, 0xd9, 0x13, 0xba, 0x02, 0x25, 0xa7, 0xe5, + 0x71, 0x05, 0x98, 0xd8, 0xef, 0x4c, 0x7a, 0xac, 0x2d, 0x73, 0xf5, 0x97, 0x82, 0xaa, 0x24, 0x94, + 0x85, 0xdc, 0x24, 0x94, 0x3d, 0x73, 0x4a, 0xda, 0xdf, 0x67, 0x81, 0xf0, 0xc2, 0xea, 0xe3, 0x90, + 0x79, 0x4b, 0xe6, 0xf0, 0x35, 0x02, 0xce, 0x5f, 0xca, 0x77, 0x4b, 0x13, 0x61, 0xe6, 0xd5, 0xa5, + 0x6e, 0x04, 0x97, 0x37, 0x68, 0xd9, 0x2e, 0x08, 0x68, 0x95, 0x30, 0x9d, 0x55, 0xef, 0xde, 0x5c, + 0x03, 0x70, 0x19, 0xae, 0x96, 0xc9, 0x53, 0x5d, 0x21, 0x55, 0x05, 0xc1, 0x1a, 0x96, 0xfd, 0xef, + 0x0a, 0x30, 0x22, 0x03, 0x9c, 0xb7, 0xfd, 0x7e, 0x24, 0xcb, 0x23, 0x65, 0x3c, 0x62, 0xa9, 0x6f, + 0x29, 0xe1, 0x5a, 0x22, 0x90, 0x27, 0xa9, 0x6f, 0x25, 0x00, 0x27, 0x38, 0xe8, 0x69, 0x18, 0x8e, + 0xda, 0xeb, 0x0c, 0x3d, 0xe5, 0x33, 0x54, 0xe7, 0xc5, 0x58, 0xc2, 0xd1, 0xe7, 0x60, 0x92, 0xd7, + 0x0b, 0x83, 0x96, 0xb3, 0xc9, 0xb5, 0xad, 0x83, 0xca, 0xd9, 0x77, 0x72, 0x25, 0x05, 0x3b, 0xdc, + 0xaf, 0x9c, 0x4e, 0x97, 0x31, 0x3d, 0x7d, 0x07, 0x15, 0xf6, 0xf6, 0xcf, 0x1b, 0xa1, 0xcb, 0xb4, + 0xc3, 0x64, 0x20, 0x01, 0x61, 0x1d, 0xcf, 0x7e, 0x07, 0x50, 0x67, 0xa8, 0x77, 0xf4, 0x06, 0x37, + 0xf8, 0xf2, 0x42, 0xe2, 0x76, 0xd3, 0xdb, 0xeb, 0x2e, 0xad, 0xd2, 0xdc, 0x9f, 0xd7, 0xc2, 0xaa, + 0xbe, 0xfd, 0xd7, 0x8a, 0x30, 0x99, 0x76, 0x70, 0x44, 0x37, 0x60, 0x88, 0xdf, 0x91, 0x82, 0x7c, + 0x97, 0x67, 0x61, 0xcd, 0x2d, 0x92, 0x9d, 0x16, 0xe2, 0x9a, 0x15, 0xf5, 0xd1, 0xdb, 0x30, 0xe2, + 0x06, 0xf7, 0xfd, 0xfb, 0x4e, 0xe8, 0xce, 0xd5, 0x96, 0xc5, 0x72, 0xce, 0x64, 0xb5, 0xab, 0x09, + 0x9a, 0xee, 0x6a, 0xc9, 0x9e, 0x40, 0x12, 0x10, 0xd6, 0xc9, 0xa1, 0x35, 0x16, 0xbe, 0x72, 0xc3, + 0xdb, 0x5c, 0x71, 0x5a, 0xdd, 0xac, 0x7f, 0x17, 0x24, 0x92, 0x46, 0x79, 0x4c, 0xc4, 0xb8, 0xe4, + 0x00, 0x9c, 0x10, 0x42, 0xdf, 0x09, 0xa7, 0xa2, 0x1c, 0xed, 0x5c, 0x5e, 0xe6, 0x8f, 0x6e, 0x0a, + 0xab, 0xf9, 0xc7, 0xa8, 0x10, 0x94, 0xa5, 0xc7, 0xcb, 0x6a, 0xc6, 0xfe, 0xf5, 0x53, 0x60, 0x6c, + 0x62, 0x23, 0x11, 0x94, 0x75, 0x4c, 0x89, 0xa0, 0x30, 0x94, 0xc8, 0x4e, 0x2b, 0xde, 0xab, 0x7a, + 0x61, 0xb7, 0x44, 0x85, 0x8b, 0x02, 0xa7, 0x93, 0xa6, 0x84, 0x60, 0x45, 0x27, 0x3b, 0x5b, 0x57, + 0xf1, 0x43, 0xcc, 0xd6, 0x35, 0x70, 0x82, 0xd9, 0xba, 0x56, 0x61, 0x78, 0xd3, 0x8b, 0x31, 0x69, + 0x05, 0x82, 0x3b, 0xcd, 0x5c, 0x87, 0xd7, 0x39, 0x4a, 0x67, 0x5e, 0x18, 0x01, 0xc0, 0x92, 0x08, + 0x7a, 0x43, 0xed, 0xc0, 0xa1, 0x7c, 0xe1, 0xae, 0xf3, 0xfd, 0x32, 0x73, 0x0f, 0x8a, 0x9c, 0x5c, + 0xc3, 0x0f, 0x9b, 0x93, 0x6b, 0x49, 0x66, 0xd2, 0x2a, 0xe5, 0x9b, 0xea, 0xb3, 0x44, 0x59, 0x3d, + 0xf2, 0x67, 0xdd, 0xd5, 0xb3, 0x8f, 0x95, 0xf3, 0x4f, 0x02, 0x95, 0x58, 0xac, 0xcf, 0x9c, 0x63, + 0xdf, 0x67, 0xc1, 0x99, 0x56, 0x56, 0x22, 0x3e, 0xf1, 0xd6, 0xf4, 0x52, 0xdf, 0x99, 0x06, 0x8d, + 0x06, 0x99, 0x94, 0x9f, 0x89, 0x86, 0xb3, 0x9b, 0xa3, 0x03, 0x1d, 0xae, 0xbb, 0x22, 0x69, 0xd6, + 0x93, 0x39, 0xc9, 0xcb, 0xba, 0xa4, 0x2c, 0x5b, 0xcb, 0x48, 0x94, 0xf5, 0xf1, 0xbc, 0x44, 0x59, + 0x7d, 0xa7, 0xc7, 0x7a, 0x43, 0xa5, 0x2d, 0x1b, 0xcb, 0x5f, 0x4a, 0x3c, 0x29, 0x59, 0xcf, 0x64, + 0x65, 0x6f, 0xa8, 0x64, 0x65, 0x5d, 0xe2, 0xea, 0xf1, 0x54, 0x64, 0x3d, 0x53, 0x94, 0x69, 0x69, + 0xc6, 0x26, 0x8e, 0x27, 0xcd, 0x98, 0x71, 0xd5, 0xf0, 0x4c, 0x57, 0xcf, 0xf4, 0xb8, 0x6a, 0x0c, + 0xba, 0xdd, 0x2f, 0x1b, 0x9e, 0x52, 0x6d, 0xea, 0xa1, 0x52, 0xaa, 0xdd, 0xd5, 0x53, 0x94, 0xa1, + 0x1e, 0x39, 0xb8, 0x28, 0x52, 0x9f, 0x89, 0xc9, 0xee, 0xea, 0x17, 0xe0, 0xa9, 0x7c, 0xba, 0xea, + 0x9e, 0xeb, 0xa4, 0x9b, 0x79, 0x05, 0x76, 0x24, 0x3c, 0x3b, 0x7d, 0x32, 0x09, 0xcf, 0xce, 0x1c, + 0x7b, 0xc2, 0xb3, 0xb3, 0x27, 0x90, 0xf0, 0xec, 0xb1, 0x0f, 0x35, 0xe1, 0xd9, 0xf4, 0x23, 0x48, + 0x78, 0xb6, 0x9a, 0x24, 0x3c, 0x3b, 0x97, 0x3f, 0x25, 0x19, 0xf6, 0xc3, 0x39, 0x69, 0xce, 0xee, + 0x32, 0x23, 0x02, 0x1e, 0x81, 0x43, 0x04, 0xfe, 0xcb, 0x4e, 0xee, 0x9c, 0x15, 0xa6, 0x83, 0x4f, + 0x89, 0x02, 0xe1, 0x84, 0x14, 0xa5, 0x9b, 0xa4, 0x3d, 0x7b, 0xbc, 0x8b, 0x1e, 0x37, 0x4b, 0x43, + 0xd6, 0x25, 0xd9, 0xd9, 0xeb, 0x3c, 0xd9, 0xd9, 0xf9, 0xfc, 0x93, 0x3c, 0x7d, 0xdd, 0x99, 0x29, + 0xce, 0xbe, 0xbf, 0x00, 0x17, 0xbb, 0xef, 0x8b, 0x44, 0x3d, 0x57, 0x4b, 0x9e, 0x93, 0x52, 0xea, + 0x39, 0x2e, 0x5b, 0x25, 0x58, 0x7d, 0x87, 0x39, 0xba, 0x0e, 0x53, 0xca, 0xf0, 0xb8, 0xe9, 0x35, + 0xf6, 0xb4, 0xa4, 0xd1, 0xca, 0xc1, 0xb2, 0x9e, 0x46, 0xc0, 0x9d, 0x75, 0xd0, 0x1c, 0x4c, 0x18, + 0x85, 0xcb, 0x55, 0x21, 0x43, 0x29, 0x7d, 0x60, 0xdd, 0x04, 0xe3, 0x34, 0xbe, 0xfd, 0xd3, 0x16, + 0x3c, 0x96, 0x93, 0x4b, 0xa4, 0xef, 0x28, 0x3e, 0x1b, 0x30, 0xd1, 0x32, 0xab, 0xf6, 0x08, 0xf6, + 0x65, 0x64, 0x2c, 0x51, 0x7d, 0x4d, 0x01, 0x70, 0x9a, 0xa8, 0xfd, 0x55, 0x0b, 0x2e, 0x74, 0x35, + 0x42, 0x41, 0x18, 0xce, 0x6e, 0xee, 0x44, 0xce, 0x42, 0x48, 0x5c, 0xe2, 0xc7, 0x9e, 0xd3, 0xac, + 0xb7, 0x48, 0x43, 0x53, 0xb0, 0x32, 0x5b, 0x9f, 0xeb, 0x2b, 0xf5, 0xb9, 0x4e, 0x0c, 0x9c, 0x53, + 0x13, 0x2d, 0x01, 0xea, 0x84, 0x88, 0x19, 0x66, 0xd1, 0x1c, 0x3b, 0xe9, 0xe1, 0x8c, 0x1a, 0xf3, + 0x57, 0x7e, 0xf3, 0xf7, 0x2e, 0x7e, 0xec, 0xb7, 0x7e, 0xef, 0xe2, 0xc7, 0x7e, 0xfb, 0xf7, 0x2e, + 0x7e, 0xec, 0xbb, 0x0f, 0x2e, 0x5a, 0xbf, 0x79, 0x70, 0xd1, 0xfa, 0xad, 0x83, 0x8b, 0xd6, 0x6f, + 0x1f, 0x5c, 0xb4, 0x7e, 0xf7, 0xe0, 0xa2, 0xf5, 0x95, 0xdf, 0xbf, 0xf8, 0xb1, 0xb7, 0x0a, 0xbb, + 0xcf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe3, 0xc5, 0xa7, 0xa5, 0x2c, 0xed, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/core/v1/generated.proto b/staging/src/k8s.io/api/core/v1/generated.proto index 09f4127935..bb88fb27cf 100644 --- a/staging/src/k8s.io/api/core/v1/generated.proto +++ b/staging/src/k8s.io/api/core/v1/generated.proto @@ -3181,11 +3181,6 @@ message PodSpec { // +optional optional int32 priority = 25; - // Preempting specifies whether a pod with this PriorityClass could start a preemption process. - // If this field is missing, the PriorityClass is considered a Preempting class by default. - // +optional - optional bool preempting = 31; - // Specifies the DNS parameters of a pod. // Parameters specified here will be merged to the generated DNS // configuration based on DNSPolicy. @@ -3213,6 +3208,13 @@ message PodSpec { // Optional: Defaults to true. // +optional optional bool enableServiceLinks = 30; + + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + optional string preemptionPolicy = 31; } // PodStatus represents information about the status of a pod. Status may trail the actual diff --git a/staging/src/k8s.io/api/core/v1/types.go b/staging/src/k8s.io/api/core/v1/types.go index 9ae6c4acce..d014d0baf3 100644 --- a/staging/src/k8s.io/api/core/v1/types.go +++ b/staging/src/k8s.io/api/core/v1/types.go @@ -2046,6 +2046,16 @@ const ( PullIfNotPresent PullPolicy = "IfNotPresent" ) +// PreemptionPolicy describes a policy for if/when to preempt a pod. +type PreemptionPolicy string + +const ( + // PreemptLowerPriority means that pod can preempt other pods with lower priority. + PreemptLowerPriority PreemptionPolicy = "PreemptLowerPriority" + // PreemptNever means that pod never preempts other pods with lower priority. + PreemptNever PreemptionPolicy = "Never" +) + // TerminationMessagePolicy describes how termination messages are retrieved from a container. type TerminationMessagePolicy string @@ -2961,16 +2971,11 @@ type PodSpec struct { // The higher the value, the higher the priority. // +optional Priority *int32 `json:"priority,omitempty" protobuf:"bytes,25,opt,name=priority"` - // Preempting specifies whether a pod with this PriorityClass could start a preemption process. - // If this field is missing, the PriorityClass is considered a Preempting class by default. - // +optional - Preempting *bool `json:"preempting,omitempty" protobuf:"bytes,31,opt,name=preempting"` // Specifies the DNS parameters of a pod. // Parameters specified here will be merged to the generated DNS // configuration based on DNSPolicy. // +optional DNSConfig *PodDNSConfig `json:"dnsConfig,omitempty" protobuf:"bytes,26,opt,name=dnsConfig"` - // If specified, all readiness gates will be evaluated for pod readiness. // A pod is ready when all its containers are ready AND // all conditions specified in the readiness gates have status equal to "True" @@ -2990,14 +2995,17 @@ type PodSpec struct { // Optional: Defaults to true. // +optional EnableServiceLinks *bool `json:"enableServiceLinks,omitempty" protobuf:"varint,30,opt,name=enableServiceLinks"` + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + PreemptionPolicy *PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,31,opt,name=preemptionPolicy"` } const ( // The default value for enableServiceLinks attribute. DefaultEnableServiceLinks = true - - // The default value for preempting attribute. - DefaultPreempting = true ) // HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the diff --git a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go index df1afeff60..c0489ca170 100644 --- a/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/core/v1/types_swagger_doc_generated.go @@ -1552,11 +1552,11 @@ var map_PodSpec = map[string]string{ "hostAliases": "HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods.", "priorityClassName": "If specified, indicates the pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default.", "priority": "The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority.", - "preempting": "Preempting specifies whether a pod with this PriorityClass could start a preemption process. If this field is missing, the PriorityClass is considered a Preempting class by default.", "dnsConfig": "Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy.", "readinessGates": "If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to \"True\" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md", "runtimeClassName": "RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the \"legacy\" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/runtime-class.md This is a beta feature as of Kubernetes v1.14.", "enableServiceLinks": "EnableServiceLinks indicates whether information about services should be injected into pod's environment variables, matching the syntax of Docker links. Optional: Defaults to true.", + "preemptionPolicy": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", } func (PodSpec) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go index 57fb4d5d07..114e1974cd 100644 --- a/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/core/v1/zz_generated.deepcopy.go @@ -3608,11 +3608,6 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(int32) **out = **in } - if in.Preempting != nil { - in, out := &in.Preempting, &out.Preempting - *out = new(bool) - **out = **in - } if in.DNSConfig != nil { in, out := &in.DNSConfig, &out.DNSConfig *out = new(PodDNSConfig) @@ -3633,6 +3628,11 @@ func (in *PodSpec) DeepCopyInto(out *PodSpec) { *out = new(bool) **out = **in } + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(PreemptionPolicy) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/scheduling/v1/BUILD b/staging/src/k8s.io/api/scheduling/v1/BUILD index b29e257133..9343d81e6e 100644 --- a/staging/src/k8s.io/api/scheduling/v1/BUILD +++ b/staging/src/k8s.io/api/scheduling/v1/BUILD @@ -14,6 +14,7 @@ go_library( importpath = "k8s.io/api/scheduling/v1", visibility = ["//visibility:public"], deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/api/scheduling/v1/generated.pb.go b/staging/src/k8s.io/api/scheduling/v1/generated.pb.go index 0cb5760b44..bed5f2f393 100644 --- a/staging/src/k8s.io/api/scheduling/v1/generated.pb.go +++ b/staging/src/k8s.io/api/scheduling/v1/generated.pb.go @@ -33,6 +33,8 @@ import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import k8s_io_api_core_v1 "k8s.io/api/core/v1" + import strings "strings" import reflect "reflect" @@ -99,15 +101,11 @@ func (m *PriorityClass) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) i += copy(dAtA[i:], m.Description) - if m.Preempting != nil { - dAtA[i] = 0x28 - i++ - if *m.Preempting { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if m.PreemptionPolicy != nil { + dAtA[i] = 0x2a i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PreemptionPolicy))) + i += copy(dAtA[i:], *m.PreemptionPolicy) } return i, nil } @@ -168,8 +166,9 @@ func (m *PriorityClass) Size() (n int) { n += 2 l = len(m.Description) n += 1 + l + sovGenerated(uint64(l)) - if m.Preempting != nil { - n += 2 + if m.PreemptionPolicy != nil { + l = len(*m.PreemptionPolicy) + n += 1 + l + sovGenerated(uint64(l)) } return n } @@ -210,7 +209,7 @@ func (this *PriorityClass) String() string { `Value:` + fmt.Sprintf("%v", this.Value) + `,`, `GlobalDefault:` + fmt.Sprintf("%v", this.GlobalDefault) + `,`, `Description:` + fmt.Sprintf("%v", this.Description) + `,`, - `Preempting:` + valueToStringGenerated(this.Preempting) + `,`, + `PreemptionPolicy:` + valueToStringGenerated(this.PreemptionPolicy) + `,`, `}`, }, "") return s @@ -362,10 +361,10 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { m.Description = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Preempting", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreemptionPolicy", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowGenerated @@ -375,13 +374,22 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= (int(b) & 0x7F) << shift + stringLen |= (uint64(b) & 0x7F) << shift if b < 0x80 { break } } - b := bool(v != 0) - m.Preempting = &b + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_api_core_v1.PreemptionPolicy(dAtA[iNdEx:postIndex]) + m.PreemptionPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -624,34 +632,36 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 464 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x3f, 0x6f, 0xd3, 0x40, - 0x18, 0xc6, 0x73, 0x29, 0x96, 0xc2, 0x45, 0x41, 0x60, 0x84, 0x64, 0x65, 0x70, 0xad, 0x32, 0xe0, - 0x85, 0x3b, 0x52, 0x01, 0x42, 0x62, 0xc2, 0x54, 0x42, 0x48, 0x45, 0x54, 0x1e, 0x18, 0x10, 0x03, - 0x67, 0xfb, 0xad, 0x73, 0xc4, 0xf6, 0x59, 0x77, 0x67, 0x4b, 0xdd, 0xf8, 0x08, 0x7c, 0x1e, 0x16, - 0xd6, 0x8c, 0x1d, 0x3b, 0x55, 0xc4, 0x7c, 0x11, 0x74, 0x8e, 0x89, 0x13, 0x4a, 0x45, 0x37, 0xdf, - 0xf3, 0x3e, 0xbf, 0xf7, 0xcf, 0x23, 0xe3, 0x57, 0x8b, 0x17, 0x8a, 0x70, 0x41, 0x17, 0x55, 0x04, - 0xb2, 0x00, 0x0d, 0x8a, 0xd6, 0x50, 0x24, 0x42, 0xd2, 0xae, 0xc0, 0x4a, 0x4e, 0x55, 0x3c, 0x87, - 0xa4, 0xca, 0x78, 0x91, 0xd2, 0x7a, 0x46, 0x53, 0x28, 0x40, 0x32, 0x0d, 0x09, 0x29, 0xa5, 0xd0, - 0xc2, 0x76, 0xd6, 0x4e, 0xc2, 0x4a, 0x4e, 0x7a, 0x27, 0xa9, 0x67, 0xd3, 0xc7, 0x29, 0xd7, 0xf3, - 0x2a, 0x22, 0xb1, 0xc8, 0x69, 0x2a, 0x52, 0x41, 0x5b, 0x20, 0xaa, 0x4e, 0xdb, 0x57, 0xfb, 0x68, - 0xbf, 0xd6, 0x8d, 0xa6, 0x4f, 0xfb, 0x91, 0x39, 0x8b, 0xe7, 0xbc, 0x00, 0x79, 0x46, 0xcb, 0x45, - 0x6a, 0x04, 0x45, 0x73, 0xd0, 0xec, 0x1f, 0xe3, 0xa7, 0xf4, 0x3a, 0x4a, 0x56, 0x85, 0xe6, 0x39, - 0x5c, 0x01, 0x9e, 0xff, 0x0f, 0x30, 0x47, 0xe4, 0xec, 0x6f, 0xee, 0xe0, 0xfb, 0x10, 0x4f, 0x4e, - 0x24, 0x17, 0x92, 0xeb, 0xb3, 0xd7, 0x19, 0x53, 0xca, 0xfe, 0x8c, 0x47, 0x66, 0xab, 0x84, 0x69, - 0xe6, 0x20, 0x0f, 0xf9, 0xe3, 0xc3, 0x27, 0xa4, 0x0f, 0x63, 0xd3, 0x9c, 0x94, 0x8b, 0xd4, 0x08, - 0x8a, 0x18, 0x37, 0xa9, 0x67, 0xe4, 0x7d, 0xf4, 0x05, 0x62, 0xfd, 0x0e, 0x34, 0x0b, 0xec, 0xe5, - 0xe5, 0xfe, 0xa0, 0xb9, 0xdc, 0xc7, 0xbd, 0x16, 0x6e, 0xba, 0xda, 0x0f, 0xb1, 0x55, 0xb3, 0xac, - 0x02, 0x67, 0xe8, 0x21, 0xdf, 0x0a, 0x26, 0x9d, 0xd9, 0xfa, 0x60, 0xc4, 0x70, 0x5d, 0xb3, 0x5f, - 0xe2, 0x49, 0x9a, 0x89, 0x88, 0x65, 0x47, 0x70, 0xca, 0xaa, 0x4c, 0x3b, 0x7b, 0x1e, 0xf2, 0x47, - 0xc1, 0x83, 0xce, 0x3c, 0x79, 0xb3, 0x5d, 0x0c, 0x77, 0xbd, 0xf6, 0x33, 0x3c, 0x4e, 0x40, 0xc5, - 0x92, 0x97, 0x9a, 0x8b, 0xc2, 0xb9, 0xe5, 0x21, 0xff, 0x76, 0x70, 0xbf, 0x43, 0xc7, 0x47, 0x7d, - 0x29, 0xdc, 0xf6, 0xd9, 0x04, 0xe3, 0x52, 0x02, 0xe4, 0xa5, 0xe6, 0x45, 0xea, 0x58, 0xed, 0xc0, - 0x3b, 0xe6, 0x8c, 0x93, 0x8d, 0x1a, 0x6e, 0x39, 0x0e, 0x7e, 0x20, 0x7c, 0x6f, 0x27, 0xbc, 0x63, - 0xae, 0xb4, 0xfd, 0xe9, 0x4a, 0x80, 0xe4, 0x66, 0x01, 0x1a, 0xba, 0x8d, 0xef, 0x6e, 0xb7, 0xe9, - 0xe8, 0x8f, 0xb2, 0x15, 0xde, 0x31, 0xb6, 0xb8, 0x86, 0x5c, 0x39, 0x43, 0x6f, 0xcf, 0x1f, 0x1f, - 0x3e, 0x22, 0xd7, 0xfd, 0xa8, 0x64, 0x67, 0xb3, 0x3e, 0xe5, 0xb7, 0x86, 0x0e, 0xd7, 0x4d, 0x02, - 0x7f, 0xb9, 0x72, 0x07, 0xe7, 0x2b, 0x77, 0x70, 0xb1, 0x72, 0x07, 0x5f, 0x1b, 0x17, 0x2d, 0x1b, - 0x17, 0x9d, 0x37, 0x2e, 0xba, 0x68, 0x5c, 0xf4, 0xb3, 0x71, 0xd1, 0xb7, 0x5f, 0xee, 0xe0, 0xe3, - 0xb0, 0x9e, 0xfd, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xd0, 0xe3, 0x15, 0x16, 0x54, 0x03, 0x00, 0x00, + // 488 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x3f, 0x8f, 0xd3, 0x30, + 0x18, 0xc6, 0xeb, 0x1e, 0x95, 0x0e, 0x57, 0x95, 0x4a, 0x10, 0x52, 0xd4, 0x21, 0xad, 0x7a, 0x03, + 0x59, 0xb0, 0xe9, 0x09, 0x10, 0xd2, 0x4d, 0x84, 0x93, 0x10, 0xd2, 0x21, 0xaa, 0x0c, 0x0c, 0x88, + 0x01, 0x27, 0x79, 0x2f, 0x35, 0x4d, 0xe2, 0xc8, 0x76, 0x22, 0x75, 0xe3, 0x23, 0xf0, 0x8d, 0x58, + 0x3b, 0xde, 0x78, 0x53, 0x45, 0xc3, 0x47, 0x60, 0x63, 0x42, 0x49, 0xc3, 0xa5, 0x7f, 0xee, 0x04, + 0x5b, 0xfc, 0x3e, 0xcf, 0xef, 0xb1, 0xfd, 0x24, 0xc1, 0xaf, 0xe6, 0x2f, 0x15, 0xe1, 0x82, 0xce, + 0x33, 0x0f, 0x64, 0x02, 0x1a, 0x14, 0xcd, 0x21, 0x09, 0x84, 0xa4, 0xb5, 0xc0, 0x52, 0x4e, 0x95, + 0x3f, 0x83, 0x20, 0x8b, 0x78, 0x12, 0xd2, 0x7c, 0x42, 0x43, 0x48, 0x40, 0x32, 0x0d, 0x01, 0x49, + 0xa5, 0xd0, 0xc2, 0x30, 0x37, 0x4e, 0xc2, 0x52, 0x4e, 0x1a, 0x27, 0xc9, 0x27, 0x83, 0x27, 0x21, + 0xd7, 0xb3, 0xcc, 0x23, 0xbe, 0x88, 0x69, 0x28, 0x42, 0x41, 0x2b, 0xc0, 0xcb, 0x2e, 0xab, 0x55, + 0xb5, 0xa8, 0x9e, 0x36, 0x41, 0x83, 0xf1, 0xd6, 0x96, 0xbe, 0x90, 0x70, 0xcb, 0x66, 0x83, 0x67, + 0x8d, 0x27, 0x66, 0xfe, 0x8c, 0x27, 0x20, 0x17, 0x34, 0x9d, 0x87, 0xe5, 0x40, 0xd1, 0x18, 0x34, + 0xbb, 0x8d, 0xa2, 0x77, 0x51, 0x32, 0x4b, 0x34, 0x8f, 0xe1, 0x00, 0x78, 0xf1, 0x2f, 0xa0, 0xbc, + 0x68, 0xcc, 0xf6, 0xb9, 0xf1, 0xaf, 0x36, 0xee, 0x4d, 0x25, 0x17, 0x92, 0xeb, 0xc5, 0xeb, 0x88, + 0x29, 0x65, 0x7c, 0xc6, 0xc7, 0xe5, 0xa9, 0x02, 0xa6, 0x99, 0x89, 0x46, 0xc8, 0xee, 0x9e, 0x3e, + 0x25, 0x4d, 0x61, 0x37, 0xe1, 0x24, 0x9d, 0x87, 0xe5, 0x40, 0x91, 0xd2, 0x4d, 0xf2, 0x09, 0x79, + 0xef, 0x7d, 0x01, 0x5f, 0xbf, 0x03, 0xcd, 0x1c, 0x63, 0xb9, 0x1a, 0xb6, 0x8a, 0xd5, 0x10, 0x37, + 0x33, 0xf7, 0x26, 0xd5, 0x38, 0xc1, 0x9d, 0x9c, 0x45, 0x19, 0x98, 0xed, 0x11, 0xb2, 0x3b, 0x4e, + 0xaf, 0x36, 0x77, 0x3e, 0x94, 0x43, 0x77, 0xa3, 0x19, 0x67, 0xb8, 0x17, 0x46, 0xc2, 0x63, 0xd1, + 0x39, 0x5c, 0xb2, 0x2c, 0xd2, 0xe6, 0xd1, 0x08, 0xd9, 0xc7, 0xce, 0xa3, 0xda, 0xdc, 0x7b, 0xb3, + 0x2d, 0xba, 0xbb, 0x5e, 0xe3, 0x39, 0xee, 0x06, 0xa0, 0x7c, 0xc9, 0x53, 0xcd, 0x45, 0x62, 0xde, + 0x1b, 0x21, 0xfb, 0xbe, 0xf3, 0xb0, 0x46, 0xbb, 0xe7, 0x8d, 0xe4, 0x6e, 0xfb, 0x8c, 0x10, 0xf7, + 0x53, 0x09, 0x10, 0x57, 0xab, 0xa9, 0x88, 0xb8, 0xbf, 0x30, 0x3b, 0x15, 0x7b, 0x56, 0xac, 0x86, + 0xfd, 0xe9, 0x9e, 0xf6, 0x7b, 0x35, 0x3c, 0x39, 0xfc, 0x02, 0xc8, 0xbe, 0xcd, 0x3d, 0x08, 0x1d, + 0x7f, 0x47, 0xf8, 0xc1, 0x4e, 0xeb, 0x17, 0x5c, 0x69, 0xe3, 0xd3, 0x41, 0xf3, 0xe4, 0xff, 0x9a, + 0x2f, 0xe9, 0xaa, 0xf7, 0x7e, 0x7d, 0xc5, 0xe3, 0xbf, 0x93, 0xad, 0xd6, 0x2f, 0x70, 0x87, 0x6b, + 0x88, 0x95, 0xd9, 0x1e, 0x1d, 0xd9, 0xdd, 0xd3, 0xc7, 0xe4, 0xae, 0xbf, 0x80, 0xec, 0x9c, 0xac, + 0x79, 0x3d, 0x6f, 0x4b, 0xda, 0xdd, 0x84, 0x38, 0xf6, 0x72, 0x6d, 0xb5, 0xae, 0xd6, 0x56, 0xeb, + 0x7a, 0x6d, 0xb5, 0xbe, 0x16, 0x16, 0x5a, 0x16, 0x16, 0xba, 0x2a, 0x2c, 0x74, 0x5d, 0x58, 0xe8, + 0x47, 0x61, 0xa1, 0x6f, 0x3f, 0xad, 0xd6, 0xc7, 0x76, 0x3e, 0xf9, 0x13, 0x00, 0x00, 0xff, 0xff, + 0x53, 0xd9, 0x28, 0x30, 0xb1, 0x03, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/scheduling/v1/generated.proto b/staging/src/k8s.io/api/scheduling/v1/generated.proto index 251574ebe3..ada9eaf85b 100644 --- a/staging/src/k8s.io/api/scheduling/v1/generated.proto +++ b/staging/src/k8s.io/api/scheduling/v1/generated.proto @@ -21,6 +21,7 @@ syntax = 'proto2'; package k8s.io.api.scheduling.v1; +import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; @@ -53,10 +54,12 @@ message PriorityClass { // +optional optional string description = 4; - // Preempting specifies whether a pod with this PriorityClass could trigger a preemption process. - // If this field is unset, the PriorityClass is considered a Preempting class by default. + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. // +optional - optional bool preempting = 5; + optional string preemptionPolicy = 5; } // PriorityClassList is a collection of priority classes. diff --git a/staging/src/k8s.io/api/scheduling/v1/types.go b/staging/src/k8s.io/api/scheduling/v1/types.go index 09923d9733..e91842ec4d 100644 --- a/staging/src/k8s.io/api/scheduling/v1/types.go +++ b/staging/src/k8s.io/api/scheduling/v1/types.go @@ -17,6 +17,7 @@ limitations under the License. package v1 import ( + apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -50,10 +51,12 @@ type PriorityClass struct { // +optional Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"` - // Preempting specifies whether a pod with this PriorityClass could trigger a preemption process. - // If this field is unset, the PriorityClass is considered a Preempting class by default. + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. // +optional - Preempting *bool `json:"preempting,omitempty" protobuf:"bytes,5,opt,name=preempting"` + PreemptionPolicy *apiv1.PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,5,opt,name=preemptionPolicy"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/scheduling/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/scheduling/v1/types_swagger_doc_generated.go index 432f28dccf..853f255d52 100644 --- a/staging/src/k8s.io/api/scheduling/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/scheduling/v1/types_swagger_doc_generated.go @@ -28,12 +28,12 @@ package v1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PriorityClass = map[string]string{ - "": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", - "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", - "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", - "preempting": "Preempting specifies whether a pod with this PriorityClass could trigger a preemption process. If this field is unset, the PriorityClass is considered a Preempting class by default.", + "": "PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "preemptionPolicy": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", } func (PriorityClass) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/scheduling/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/scheduling/v1/zz_generated.deepcopy.go index 691f1583d9..63bfe64042 100644 --- a/staging/src/k8s.io/api/scheduling/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/scheduling/v1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1 import ( + corev1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,9 +30,9 @@ func (in *PriorityClass) DeepCopyInto(out *PriorityClass) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) - if in.Preempting != nil { - in, out := &in.Preempting, &out.Preempting - *out = new(bool) + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(corev1.PreemptionPolicy) **out = **in } return diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD b/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD index bcea964b4c..4a7c618f52 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/BUILD @@ -18,6 +18,7 @@ go_library( importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1alpha1", importpath = "k8s.io/api/scheduling/v1alpha1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.pb.go b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.pb.go index 0a0d481a28..3fedb7d602 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.pb.go +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.pb.go @@ -33,6 +33,8 @@ import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import k8s_io_api_core_v1 "k8s.io/api/core/v1" + import strings "strings" import reflect "reflect" @@ -99,6 +101,12 @@ func (m *PriorityClass) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) i += copy(dAtA[i:], m.Description) + if m.PreemptionPolicy != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PreemptionPolicy))) + i += copy(dAtA[i:], *m.PreemptionPolicy) + } return i, nil } @@ -158,6 +166,10 @@ func (m *PriorityClass) Size() (n int) { n += 2 l = len(m.Description) n += 1 + l + sovGenerated(uint64(l)) + if m.PreemptionPolicy != nil { + l = len(*m.PreemptionPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -197,6 +209,7 @@ func (this *PriorityClass) String() string { `Value:` + fmt.Sprintf("%v", this.Value) + `,`, `GlobalDefault:` + fmt.Sprintf("%v", this.GlobalDefault) + `,`, `Description:` + fmt.Sprintf("%v", this.Description) + `,`, + `PreemptionPolicy:` + valueToStringGenerated(this.PreemptionPolicy) + `,`, `}`, }, "") return s @@ -347,6 +360,36 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { } m.Description = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreemptionPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_api_core_v1.PreemptionPolicy(dAtA[iNdEx:postIndex]) + m.PreemptionPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -589,33 +632,36 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 447 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x4f, 0x8b, 0xd3, 0x40, - 0x18, 0xc6, 0x33, 0x5d, 0x0b, 0x75, 0x4a, 0x41, 0x23, 0x42, 0xe8, 0x61, 0x36, 0xac, 0x97, 0x5c, - 0x76, 0xc6, 0x2e, 0x2a, 0x82, 0xb7, 0xb8, 0xb0, 0x08, 0x8a, 0x92, 0x83, 0x07, 0xf1, 0xe0, 0x24, - 0x79, 0x37, 0x1d, 0x9b, 0x64, 0xc2, 0xcc, 0x24, 0xb0, 0x37, 0xcf, 0x9e, 0xfc, 0x52, 0x42, 0x8f, - 0x7b, 0xdc, 0xd3, 0x62, 0xe3, 0x17, 0x91, 0xa4, 0x69, 0xd3, 0x5a, 0xfc, 0x73, 0xcb, 0x3c, 0xef, - 0xef, 0x79, 0xe6, 0xcd, 0xc3, 0xe0, 0x8b, 0xc5, 0x73, 0x4d, 0x85, 0x64, 0x8b, 0x32, 0x04, 0x95, - 0x83, 0x01, 0xcd, 0x2a, 0xc8, 0x63, 0xa9, 0x58, 0x37, 0xe0, 0x85, 0x60, 0x3a, 0x9a, 0x43, 0x5c, - 0xa6, 0x22, 0x4f, 0x58, 0x35, 0xe3, 0x69, 0x31, 0xe7, 0x33, 0x96, 0x40, 0x0e, 0x8a, 0x1b, 0x88, - 0x69, 0xa1, 0xa4, 0x91, 0x36, 0x59, 0xf3, 0x94, 0x17, 0x82, 0xf6, 0x3c, 0xdd, 0xf0, 0xd3, 0xd3, - 0x44, 0x98, 0x79, 0x19, 0xd2, 0x48, 0x66, 0x2c, 0x91, 0x89, 0x64, 0xad, 0x2d, 0x2c, 0x2f, 0xdb, - 0x53, 0x7b, 0x68, 0xbf, 0xd6, 0x71, 0xd3, 0x27, 0xfd, 0xf5, 0x19, 0x8f, 0xe6, 0x22, 0x07, 0x75, - 0xc5, 0x8a, 0x45, 0xd2, 0x08, 0x9a, 0x65, 0x60, 0x38, 0xab, 0x0e, 0x96, 0x98, 0xb2, 0x3f, 0xb9, - 0x54, 0x99, 0x1b, 0x91, 0xc1, 0x81, 0xe1, 0xd9, 0xbf, 0x0c, 0xcd, 0xaf, 0x64, 0xfc, 0x77, 0xdf, - 0xc9, 0xd7, 0x01, 0x9e, 0xbc, 0x53, 0x42, 0x2a, 0x61, 0xae, 0x5e, 0xa6, 0x5c, 0x6b, 0xfb, 0x13, - 0x1e, 0x35, 0x5b, 0xc5, 0xdc, 0x70, 0x07, 0xb9, 0xc8, 0x1b, 0x9f, 0x3d, 0xa6, 0x7d, 0x25, 0xdb, - 0x70, 0x5a, 0x2c, 0x92, 0x46, 0xd0, 0xb4, 0xa1, 0x69, 0x35, 0xa3, 0x6f, 0xc3, 0xcf, 0x10, 0x99, - 0x37, 0x60, 0xb8, 0x6f, 0x2f, 0x6f, 0x8f, 0xad, 0xfa, 0xf6, 0x18, 0xf7, 0x5a, 0xb0, 0x4d, 0xb5, - 0x1f, 0xe1, 0x61, 0xc5, 0xd3, 0x12, 0x9c, 0x81, 0x8b, 0xbc, 0xa1, 0x3f, 0xe9, 0xe0, 0xe1, 0xfb, - 0x46, 0x0c, 0xd6, 0x33, 0xfb, 0x05, 0x9e, 0x24, 0xa9, 0x0c, 0x79, 0x7a, 0x0e, 0x97, 0xbc, 0x4c, - 0x8d, 0x73, 0xe4, 0x22, 0x6f, 0xe4, 0x3f, 0xec, 0xe0, 0xc9, 0xc5, 0xee, 0x30, 0xd8, 0x67, 0xed, - 0xa7, 0x78, 0x1c, 0x83, 0x8e, 0x94, 0x28, 0x8c, 0x90, 0xb9, 0x73, 0xc7, 0x45, 0xde, 0x5d, 0xff, - 0x41, 0x67, 0x1d, 0x9f, 0xf7, 0xa3, 0x60, 0x97, 0x3b, 0xf9, 0x8e, 0xf0, 0xfd, 0xbd, 0x32, 0x5e, - 0x0b, 0x6d, 0xec, 0x8f, 0x07, 0x85, 0xd0, 0xff, 0x2b, 0xa4, 0x71, 0xb7, 0x75, 0xdc, 0xeb, 0x6e, - 0x1e, 0x6d, 0x94, 0x9d, 0x32, 0x02, 0x3c, 0x14, 0x06, 0x32, 0xed, 0x0c, 0xdc, 0x23, 0x6f, 0x7c, - 0x76, 0x4a, 0xff, 0xfe, 0xfc, 0xe8, 0xde, 0x7e, 0x7d, 0x77, 0xaf, 0x9a, 0x8c, 0x60, 0x1d, 0xe5, - 0xd3, 0xe5, 0x8a, 0x58, 0xd7, 0x2b, 0x62, 0xdd, 0xac, 0x88, 0xf5, 0xa5, 0x26, 0x68, 0x59, 0x13, - 0x74, 0x5d, 0x13, 0x74, 0x53, 0x13, 0xf4, 0xa3, 0x26, 0xe8, 0xdb, 0x4f, 0x62, 0x7d, 0x18, 0x6d, - 0x32, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xab, 0x20, 0x12, 0x63, 0x3c, 0x03, 0x00, 0x00, + // 494 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x4f, 0x8b, 0xd3, 0x40, + 0x18, 0xc6, 0x3b, 0x5d, 0x0b, 0x75, 0x4a, 0xa1, 0x46, 0x84, 0xd0, 0xc3, 0xb4, 0x74, 0x2f, 0xbd, + 0xec, 0x8c, 0x5d, 0x54, 0x84, 0xbd, 0xd5, 0x85, 0x45, 0x50, 0x2c, 0x39, 0x78, 0x10, 0x0f, 0x4e, + 0xd3, 0x77, 0xd3, 0xb1, 0x49, 0x26, 0xcc, 0x4c, 0x02, 0xbd, 0xf9, 0x11, 0xfc, 0x52, 0x42, 0x8f, + 0x7b, 0xdc, 0x53, 0xb1, 0xf1, 0x23, 0x78, 0xf3, 0x24, 0x49, 0xd3, 0x4d, 0xdb, 0xf8, 0x67, 0x6f, + 0x99, 0xf7, 0xf9, 0x3d, 0xcf, 0xcc, 0x3c, 0x49, 0xf0, 0xd5, 0xe2, 0xa5, 0xa6, 0x42, 0xb2, 0x45, + 0x3c, 0x05, 0x15, 0x82, 0x01, 0xcd, 0x12, 0x08, 0x67, 0x52, 0xb1, 0x42, 0xe0, 0x91, 0x60, 0xda, + 0x9d, 0xc3, 0x2c, 0xf6, 0x45, 0xe8, 0xb1, 0x64, 0xc4, 0xfd, 0x68, 0xce, 0x47, 0xcc, 0x83, 0x10, + 0x14, 0x37, 0x30, 0xa3, 0x91, 0x92, 0x46, 0x5a, 0x64, 0xcb, 0x53, 0x1e, 0x09, 0x5a, 0xf2, 0x74, + 0xc7, 0x77, 0xcf, 0x3c, 0x61, 0xe6, 0xf1, 0x94, 0xba, 0x32, 0x60, 0x9e, 0xf4, 0x24, 0xcb, 0x6d, + 0xd3, 0xf8, 0x3a, 0x5f, 0xe5, 0x8b, 0xfc, 0x69, 0x1b, 0xd7, 0x1d, 0xec, 0x6d, 0xef, 0x4a, 0x05, + 0x2c, 0xa9, 0x6c, 0xd9, 0x7d, 0x56, 0x32, 0x01, 0x77, 0xe7, 0x22, 0x04, 0xb5, 0x64, 0xd1, 0xc2, + 0xcb, 0x06, 0x9a, 0x05, 0x60, 0xf8, 0x9f, 0x5c, 0xec, 0x6f, 0x2e, 0x15, 0x87, 0x46, 0x04, 0x50, + 0x31, 0xbc, 0xf8, 0x9f, 0x21, 0xbb, 0x6e, 0xc0, 0x8f, 0x7d, 0x83, 0x9f, 0x75, 0xdc, 0x9e, 0x28, + 0x21, 0x95, 0x30, 0xcb, 0x57, 0x3e, 0xd7, 0xda, 0xfa, 0x84, 0x9b, 0xd9, 0xa9, 0x66, 0xdc, 0x70, + 0x1b, 0xf5, 0xd1, 0xb0, 0x75, 0xfe, 0x94, 0x96, 0xb5, 0xdd, 0x85, 0xd3, 0x68, 0xe1, 0x65, 0x03, + 0x4d, 0x33, 0x9a, 0x26, 0x23, 0xfa, 0x6e, 0xfa, 0x19, 0x5c, 0xf3, 0x16, 0x0c, 0x1f, 0x5b, 0xab, + 0x75, 0xaf, 0x96, 0xae, 0x7b, 0xb8, 0x9c, 0x39, 0x77, 0xa9, 0xd6, 0x29, 0x6e, 0x24, 0xdc, 0x8f, + 0xc1, 0xae, 0xf7, 0xd1, 0xb0, 0x31, 0x6e, 0x17, 0x70, 0xe3, 0x7d, 0x36, 0x74, 0xb6, 0x9a, 0x75, + 0x81, 0xdb, 0x9e, 0x2f, 0xa7, 0xdc, 0xbf, 0x84, 0x6b, 0x1e, 0xfb, 0xc6, 0x3e, 0xe9, 0xa3, 0x61, + 0x73, 0xfc, 0xa4, 0x80, 0xdb, 0x57, 0xfb, 0xa2, 0x73, 0xc8, 0x5a, 0xcf, 0x71, 0x6b, 0x06, 0xda, + 0x55, 0x22, 0x32, 0x42, 0x86, 0xf6, 0x83, 0x3e, 0x1a, 0x3e, 0x1c, 0x3f, 0x2e, 0xac, 0xad, 0xcb, + 0x52, 0x72, 0xf6, 0x39, 0xcb, 0xc3, 0x9d, 0x48, 0x01, 0x04, 0xf9, 0x6a, 0x22, 0x7d, 0xe1, 0x2e, + 0xed, 0x46, 0xee, 0xbd, 0x48, 0xd7, 0xbd, 0xce, 0xe4, 0x48, 0xfb, 0xb5, 0xee, 0x9d, 0x56, 0xbf, + 0x00, 0x7a, 0x8c, 0x39, 0x95, 0xd0, 0xc1, 0x37, 0x84, 0x1f, 0x1d, 0xb4, 0xfe, 0x46, 0x68, 0x63, + 0x7d, 0xac, 0x34, 0x4f, 0xef, 0xd7, 0x7c, 0xe6, 0xce, 0x7b, 0xef, 0x14, 0x57, 0x6c, 0xee, 0x26, + 0x7b, 0xad, 0x3b, 0xb8, 0x21, 0x0c, 0x04, 0xda, 0xae, 0xf7, 0x4f, 0x86, 0xad, 0xf3, 0x33, 0xfa, + 0xef, 0x7f, 0x81, 0x1e, 0x9c, 0xaf, 0x7c, 0x49, 0xaf, 0xb3, 0x0c, 0x67, 0x1b, 0x35, 0xa6, 0xab, + 0x0d, 0xa9, 0xdd, 0x6c, 0x48, 0xed, 0x76, 0x43, 0x6a, 0x5f, 0x52, 0x82, 0x56, 0x29, 0x41, 0x37, + 0x29, 0x41, 0xb7, 0x29, 0x41, 0xdf, 0x53, 0x82, 0xbe, 0xfe, 0x20, 0xb5, 0x0f, 0xcd, 0x5d, 0xe6, + 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0x55, 0x5c, 0x1a, 0x39, 0xc9, 0x03, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto index bfd85f5598..584a2918a2 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/generated.proto @@ -21,6 +21,7 @@ syntax = 'proto2'; package k8s.io.api.scheduling.v1alpha1; +import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; @@ -53,6 +54,13 @@ message PriorityClass { // when this priority class should be used. // +optional optional string description = 4; + + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + optional string preemptionPolicy = 5; } // PriorityClassList is a collection of priority classes. diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/types.go b/staging/src/k8s.io/api/scheduling/v1alpha1/types.go index 6103ea4e7e..c1a09bce8e 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/types.go +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/types.go @@ -17,6 +17,7 @@ limitations under the License. package v1alpha1 import ( + apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -50,6 +51,13 @@ type PriorityClass struct { // when this priority class should be used. // +optional Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"` + + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + PreemptionPolicy *apiv1.PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,5,opt,name=preemptionPolicy"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go index 89565012f9..f9880922a1 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go @@ -28,11 +28,12 @@ package v1alpha1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PriorityClass = map[string]string{ - "": "DEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", - "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", - "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", - "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "": "DEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata", + "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "preemptionPolicy": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", } func (PriorityClass) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go index 1d4e664c78..0392823975 100644 --- a/staging/src/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1alpha1 import ( + v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,6 +30,11 @@ func (in *PriorityClass) DeepCopyInto(out *PriorityClass) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(v1.PreemptionPolicy) + **out = **in + } return } diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/BUILD b/staging/src/k8s.io/api/scheduling/v1beta1/BUILD index 148494529e..d1bb4e8aef 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/BUILD +++ b/staging/src/k8s.io/api/scheduling/v1beta1/BUILD @@ -18,6 +18,7 @@ go_library( importmap = "k8s.io/kubernetes/vendor/k8s.io/api/scheduling/v1beta1", importpath = "k8s.io/api/scheduling/v1beta1", deps = [ + "//staging/src/k8s.io/api/core/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/generated.pb.go b/staging/src/k8s.io/api/scheduling/v1beta1/generated.pb.go index ddb285446b..58bbf835d7 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/generated.pb.go +++ b/staging/src/k8s.io/api/scheduling/v1beta1/generated.pb.go @@ -33,6 +33,8 @@ import proto "github.com/gogo/protobuf/proto" import fmt "fmt" import math "math" +import k8s_io_api_core_v1 "k8s.io/api/core/v1" + import strings "strings" import reflect "reflect" @@ -99,6 +101,12 @@ func (m *PriorityClass) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Description))) i += copy(dAtA[i:], m.Description) + if m.PreemptionPolicy != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintGenerated(dAtA, i, uint64(len(*m.PreemptionPolicy))) + i += copy(dAtA[i:], *m.PreemptionPolicy) + } return i, nil } @@ -158,6 +166,10 @@ func (m *PriorityClass) Size() (n int) { n += 2 l = len(m.Description) n += 1 + l + sovGenerated(uint64(l)) + if m.PreemptionPolicy != nil { + l = len(*m.PreemptionPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -197,6 +209,7 @@ func (this *PriorityClass) String() string { `Value:` + fmt.Sprintf("%v", this.Value) + `,`, `GlobalDefault:` + fmt.Sprintf("%v", this.GlobalDefault) + `,`, `Description:` + fmt.Sprintf("%v", this.Description) + `,`, + `PreemptionPolicy:` + valueToStringGenerated(this.PreemptionPolicy) + `,`, `}`, }, "") return s @@ -347,6 +360,36 @@ func (m *PriorityClass) Unmarshal(dAtA []byte) error { } m.Description = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PreemptionPolicy", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex > l { + return io.ErrUnexpectedEOF + } + s := k8s_io_api_core_v1.PreemptionPolicy(dAtA[iNdEx:postIndex]) + m.PreemptionPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -589,33 +632,36 @@ func init() { } var fileDescriptorGenerated = []byte{ - // 448 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0xc1, 0x8b, 0xd3, 0x40, - 0x18, 0xc5, 0x33, 0x5d, 0x8b, 0x75, 0x4a, 0x41, 0x23, 0x42, 0x28, 0x38, 0x1b, 0xd6, 0x4b, 0x0e, - 0xee, 0x8c, 0x5d, 0x54, 0x04, 0x6f, 0x71, 0x51, 0x04, 0x45, 0xcd, 0xc1, 0x83, 0x78, 0x70, 0x92, - 0x7c, 0x9b, 0x8e, 0x4d, 0x32, 0x61, 0x66, 0x12, 0xd8, 0x9b, 0x67, 0x4f, 0xfe, 0x51, 0x1e, 0x7a, - 0xdc, 0xe3, 0x9e, 0x16, 0x1b, 0xff, 0x11, 0x49, 0x1a, 0x37, 0xad, 0x45, 0xdd, 0x5b, 0xe6, 0x7d, - 0xbf, 0xf7, 0xe6, 0xcb, 0x63, 0xf0, 0xf3, 0xc5, 0x13, 0x4d, 0x85, 0x64, 0x8b, 0x32, 0x04, 0x95, - 0x83, 0x01, 0xcd, 0x2a, 0xc8, 0x63, 0xa9, 0x58, 0x37, 0xe0, 0x85, 0x60, 0x3a, 0x9a, 0x43, 0x5c, - 0xa6, 0x22, 0x4f, 0x58, 0x35, 0x0b, 0xc1, 0xf0, 0x19, 0x4b, 0x20, 0x07, 0xc5, 0x0d, 0xc4, 0xb4, - 0x50, 0xd2, 0x48, 0xfb, 0xee, 0x1a, 0xa7, 0xbc, 0x10, 0xb4, 0xc7, 0x69, 0x87, 0x4f, 0x0f, 0x13, - 0x61, 0xe6, 0x65, 0x48, 0x23, 0x99, 0xb1, 0x44, 0x26, 0x92, 0xb5, 0xae, 0xb0, 0x3c, 0x69, 0x4f, - 0xed, 0xa1, 0xfd, 0x5a, 0xa7, 0x4d, 0x1f, 0xf6, 0x97, 0x67, 0x3c, 0x9a, 0x8b, 0x1c, 0xd4, 0x29, - 0x2b, 0x16, 0x49, 0x23, 0x68, 0x96, 0x81, 0xe1, 0xac, 0xda, 0xd9, 0x61, 0xca, 0xfe, 0xe6, 0x52, - 0x65, 0x6e, 0x44, 0x06, 0x3b, 0x86, 0xc7, 0xff, 0x33, 0x34, 0x7f, 0x92, 0xf1, 0x3f, 0x7d, 0x07, - 0x5f, 0x07, 0x78, 0xf2, 0x56, 0x09, 0xa9, 0x84, 0x39, 0x7d, 0x96, 0x72, 0xad, 0xed, 0x4f, 0x78, - 0xd4, 0x6c, 0x15, 0x73, 0xc3, 0x1d, 0xe4, 0x22, 0x6f, 0x7c, 0xf4, 0x80, 0xf6, 0x8d, 0x5c, 0x86, - 0xd3, 0x62, 0x91, 0x34, 0x82, 0xa6, 0x0d, 0x4d, 0xab, 0x19, 0x7d, 0x13, 0x7e, 0x86, 0xc8, 0xbc, - 0x06, 0xc3, 0x7d, 0x7b, 0x79, 0xb1, 0x6f, 0xd5, 0x17, 0xfb, 0xb8, 0xd7, 0x82, 0xcb, 0x54, 0xfb, - 0x1e, 0x1e, 0x56, 0x3c, 0x2d, 0xc1, 0x19, 0xb8, 0xc8, 0x1b, 0xfa, 0x93, 0x0e, 0x1e, 0xbe, 0x6f, - 0xc4, 0x60, 0x3d, 0xb3, 0x9f, 0xe2, 0x49, 0x92, 0xca, 0x90, 0xa7, 0xc7, 0x70, 0xc2, 0xcb, 0xd4, - 0x38, 0x7b, 0x2e, 0xf2, 0x46, 0xfe, 0x9d, 0x0e, 0x9e, 0xbc, 0xd8, 0x1c, 0x06, 0xdb, 0xac, 0xfd, - 0x08, 0x8f, 0x63, 0xd0, 0x91, 0x12, 0x85, 0x11, 0x32, 0x77, 0xae, 0xb9, 0xc8, 0xbb, 0xe1, 0xdf, - 0xee, 0xac, 0xe3, 0xe3, 0x7e, 0x14, 0x6c, 0x72, 0x07, 0xdf, 0x11, 0xbe, 0xb5, 0x55, 0xc6, 0x2b, - 0xa1, 0x8d, 0xfd, 0x71, 0xa7, 0x10, 0x7a, 0xb5, 0x42, 0x1a, 0x77, 0x5b, 0xc7, 0xcd, 0xee, 0xe6, - 0xd1, 0x6f, 0x65, 0xa3, 0x8c, 0x77, 0x78, 0x28, 0x0c, 0x64, 0xda, 0x19, 0xb8, 0x7b, 0xde, 0xf8, - 0xe8, 0x3e, 0xfd, 0xe7, 0xeb, 0xa3, 0x5b, 0xeb, 0xf5, 0xd5, 0xbd, 0x6c, 0x22, 0x82, 0x75, 0x92, - 0x7f, 0xb8, 0x5c, 0x11, 0xeb, 0x6c, 0x45, 0xac, 0xf3, 0x15, 0xb1, 0xbe, 0xd4, 0x04, 0x2d, 0x6b, - 0x82, 0xce, 0x6a, 0x82, 0xce, 0x6b, 0x82, 0x7e, 0xd4, 0x04, 0x7d, 0xfb, 0x49, 0xac, 0x0f, 0xd7, - 0xbb, 0xc8, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x41, 0x74, 0x8a, 0x60, 0x38, 0x03, 0x00, 0x00, + // 494 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x3f, 0x8f, 0xd3, 0x30, + 0x18, 0xc6, 0xeb, 0x1e, 0x15, 0xc5, 0x55, 0xa5, 0x12, 0x84, 0x14, 0x55, 0x22, 0xad, 0x7a, 0x4b, + 0x07, 0xce, 0xa6, 0x27, 0x40, 0x48, 0xb7, 0x95, 0x13, 0x08, 0x09, 0x44, 0xc9, 0xc0, 0x80, 0x18, + 0x70, 0x92, 0xf7, 0x52, 0xd3, 0x24, 0x8e, 0x6c, 0x27, 0x52, 0x37, 0x3e, 0x02, 0x1f, 0x8a, 0xa1, + 0xe3, 0x8d, 0x37, 0x55, 0x34, 0x7c, 0x04, 0x36, 0x26, 0x94, 0x34, 0x5c, 0xda, 0x86, 0x7f, 0x5b, + 0xfc, 0x3e, 0xbf, 0xe7, 0xb1, 0xfd, 0x24, 0xc1, 0xcf, 0x16, 0x4f, 0x14, 0xe1, 0x82, 0x2e, 0x12, + 0x07, 0x64, 0x04, 0x1a, 0x14, 0x4d, 0x21, 0xf2, 0x84, 0xa4, 0xa5, 0xc0, 0x62, 0x4e, 0x95, 0x3b, + 0x07, 0x2f, 0x09, 0x78, 0xe4, 0xd3, 0x74, 0xe2, 0x80, 0x66, 0x13, 0xea, 0x43, 0x04, 0x92, 0x69, + 0xf0, 0x48, 0x2c, 0x85, 0x16, 0xc6, 0xbd, 0x2d, 0x4e, 0x58, 0xcc, 0x49, 0x85, 0x93, 0x12, 0xef, + 0x9f, 0xf8, 0x5c, 0xcf, 0x13, 0x87, 0xb8, 0x22, 0xa4, 0xbe, 0xf0, 0x05, 0x2d, 0x5c, 0x4e, 0x72, + 0x51, 0xac, 0x8a, 0x45, 0xf1, 0xb4, 0x4d, 0xeb, 0x8f, 0x76, 0x36, 0x77, 0x85, 0x04, 0x9a, 0xd6, + 0x76, 0xec, 0x3f, 0xac, 0x98, 0x90, 0xb9, 0x73, 0x1e, 0x81, 0x5c, 0xd2, 0x78, 0xe1, 0xe7, 0x03, + 0x45, 0x43, 0xd0, 0xec, 0x77, 0x2e, 0xfa, 0x27, 0x97, 0x4c, 0x22, 0xcd, 0x43, 0xa8, 0x19, 0x1e, + 0xff, 0xcb, 0x90, 0xdf, 0x36, 0x64, 0x87, 0xbe, 0xd1, 0xf7, 0x26, 0xee, 0xce, 0x24, 0x17, 0x92, + 0xeb, 0xe5, 0xd3, 0x80, 0x29, 0x65, 0x7c, 0xc0, 0xed, 0xfc, 0x54, 0x1e, 0xd3, 0xcc, 0x44, 0x43, + 0x34, 0xee, 0x9c, 0x3e, 0x20, 0x55, 0x6b, 0xd7, 0xe1, 0x24, 0x5e, 0xf8, 0xf9, 0x40, 0x91, 0x9c, + 0x26, 0xe9, 0x84, 0xbc, 0x76, 0x3e, 0x82, 0xab, 0x5f, 0x81, 0x66, 0x53, 0x63, 0xb5, 0x1e, 0x34, + 0xb2, 0xf5, 0x00, 0x57, 0x33, 0xfb, 0x3a, 0xd5, 0x38, 0xc6, 0xad, 0x94, 0x05, 0x09, 0x98, 0xcd, + 0x21, 0x1a, 0xb7, 0xa6, 0xdd, 0x12, 0x6e, 0xbd, 0xcd, 0x87, 0xf6, 0x56, 0x33, 0xce, 0x70, 0xd7, + 0x0f, 0x84, 0xc3, 0x82, 0x73, 0xb8, 0x60, 0x49, 0xa0, 0xcd, 0xa3, 0x21, 0x1a, 0xb7, 0xa7, 0x77, + 0x4b, 0xb8, 0xfb, 0x7c, 0x57, 0xb4, 0xf7, 0x59, 0xe3, 0x11, 0xee, 0x78, 0xa0, 0x5c, 0xc9, 0x63, + 0xcd, 0x45, 0x64, 0xde, 0x18, 0xa2, 0xf1, 0xad, 0xe9, 0x9d, 0xd2, 0xda, 0x39, 0xaf, 0x24, 0x7b, + 0x97, 0x33, 0x7c, 0xdc, 0x8b, 0x25, 0x40, 0x58, 0xac, 0x66, 0x22, 0xe0, 0xee, 0xd2, 0x6c, 0x15, + 0xde, 0xb3, 0x6c, 0x3d, 0xe8, 0xcd, 0x0e, 0xb4, 0x1f, 0xeb, 0xc1, 0x71, 0xfd, 0x0b, 0x20, 0x87, + 0x98, 0x5d, 0x0b, 0x1d, 0x7d, 0x41, 0xf8, 0xf6, 0x5e, 0xeb, 0x2f, 0xb9, 0xd2, 0xc6, 0xfb, 0x5a, + 0xf3, 0xe4, 0xff, 0x9a, 0xcf, 0xdd, 0x45, 0xef, 0xbd, 0xf2, 0x8a, 0xed, 0x5f, 0x93, 0x9d, 0xd6, + 0xdf, 0xe0, 0x16, 0xd7, 0x10, 0x2a, 0xb3, 0x39, 0x3c, 0x1a, 0x77, 0x4e, 0xef, 0x93, 0xbf, 0xfe, + 0x0a, 0x64, 0xef, 0x78, 0xd5, 0x3b, 0x7a, 0x91, 0x47, 0xd8, 0xdb, 0xa4, 0xe9, 0xc9, 0x6a, 0x63, + 0x35, 0x2e, 0x37, 0x56, 0xe3, 0x6a, 0x63, 0x35, 0x3e, 0x65, 0x16, 0x5a, 0x65, 0x16, 0xba, 0xcc, + 0x2c, 0x74, 0x95, 0x59, 0xe8, 0x6b, 0x66, 0xa1, 0xcf, 0xdf, 0xac, 0xc6, 0xbb, 0x9b, 0x65, 0xe4, + 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1a, 0xc2, 0xc0, 0x1f, 0xc5, 0x03, 0x00, 0x00, } diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/generated.proto b/staging/src/k8s.io/api/scheduling/v1beta1/generated.proto index 3f15dc1d5c..2582891bb3 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/generated.proto +++ b/staging/src/k8s.io/api/scheduling/v1beta1/generated.proto @@ -21,6 +21,7 @@ syntax = 'proto2'; package k8s.io.api.scheduling.v1beta1; +import "k8s.io/api/core/v1/generated.proto"; import "k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/generated.proto"; import "k8s.io/apimachinery/pkg/runtime/schema/generated.proto"; @@ -53,6 +54,13 @@ message PriorityClass { // when this priority class should be used. // +optional optional string description = 4; + + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + optional string preemptionPolicy = 5; } // PriorityClassList is a collection of priority classes. diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/types.go b/staging/src/k8s.io/api/scheduling/v1beta1/types.go index 2f6b3c9683..f806ecd4c2 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/types.go +++ b/staging/src/k8s.io/api/scheduling/v1beta1/types.go @@ -17,6 +17,7 @@ limitations under the License. package v1beta1 import ( + apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -50,6 +51,13 @@ type PriorityClass struct { // when this priority class should be used. // +optional Description string `json:"description,omitempty" protobuf:"bytes,4,opt,name=description"` + + // PreemptionPolicy is the Policy for preempting pods with lower priority. + // One of Never, PreemptLowerPriority. + // Defaults to PreemptLowerPriority if unset. + // This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature. + // +optional + PreemptionPolicy *apiv1.PreemptionPolicy `json:"preemptionPolicy,omitempty" protobuf:"bytes,5,opt,name=preemptionPolicy"` } // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go b/staging/src/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go index e99ed8fc48..ffded9df0f 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go @@ -28,11 +28,12 @@ package v1beta1 // AUTO-GENERATED FUNCTIONS START HERE. DO NOT EDIT. var map_PriorityClass = map[string]string{ - "": "DEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", - "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", - "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", - "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", - "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "": "DEPRECATED - This group version of PriorityClass is deprecated by scheduling.k8s.io/v1/PriorityClass. PriorityClass defines mapping from a priority class name to the priority integer value. The value can be any valid integer.", + "metadata": "Standard object's metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata", + "value": "The value of this priority class. This is the actual priority that pods receive when they have the name of this class in their pod spec.", + "globalDefault": "globalDefault specifies whether this PriorityClass should be considered as the default priority for pods that do not have any priority class. Only one PriorityClass can be marked as `globalDefault`. However, if more than one PriorityClasses exists with their `globalDefault` field set to true, the smallest value of such global default PriorityClasses will be used as the default priority.", + "description": "description is an arbitrary string that usually provides guidelines on when this priority class should be used.", + "preemptionPolicy": "PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is alpha-level and is only honored by servers that enable the NonPreemptingPriority feature.", } func (PriorityClass) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go b/staging/src/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go index 7c049b1e58..6e2008578e 100644 --- a/staging/src/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go @@ -21,6 +21,7 @@ limitations under the License. package v1beta1 import ( + v1 "k8s.io/api/core/v1" runtime "k8s.io/apimachinery/pkg/runtime" ) @@ -29,6 +30,11 @@ func (in *PriorityClass) DeepCopyInto(out *PriorityClass) { *out = *in out.TypeMeta = in.TypeMeta in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + if in.PreemptionPolicy != nil { + in, out := &in.PreemptionPolicy, &out.PreemptionPolicy + *out = new(v1.PreemptionPolicy) + **out = **in + } return } diff --git a/staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go b/staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go index e512bbe5be..c3d6c7cb9e 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/apitesting/roundtrip/roundtrip.go @@ -120,9 +120,6 @@ func roundTripTypes(t *testing.T, scheme *runtime.Scheme, codecFactory runtimese internalKindToGoType := scheme.KnownTypes(internalVersion) for kind := range internalKindToGoType { - if kind != "PriorityClassList" { - continue - } if globalNonRoundTrippableTypes.Has(kind) { continue } diff --git a/test/integration/daemonset/daemonset_test.go b/test/integration/daemonset/daemonset_test.go index 811693515c..b90c7ddb17 100644 --- a/test/integration/daemonset/daemonset_test.go +++ b/test/integration/daemonset/daemonset_test.go @@ -110,7 +110,6 @@ func setupScheduler( ServiceInformer: informerFactory.Core().V1().Services(), PdbInformer: informerFactory.Policy().V1beta1().PodDisruptionBudgets(), StorageClassInformer: informerFactory.Storage().V1().StorageClasses(), - PriorityClassInformer: informerFactory.Scheduling().V1().PriorityClasses(), HardPodAffinitySymmetricWeight: v1.DefaultHardPodAffinitySymmetricWeight, DisablePreemption: false, PercentageOfNodesToScore: 100, diff --git a/test/integration/scheduler/scheduler_test.go b/test/integration/scheduler/scheduler_test.go index c294fd82fb..6f82103a23 100644 --- a/test/integration/scheduler/scheduler_test.go +++ b/test/integration/scheduler/scheduler_test.go @@ -254,7 +254,6 @@ priorities: [] informerFactory.Core().V1().Services(), informerFactory.Policy().V1beta1().PodDisruptionBudgets(), informerFactory.Storage().V1().StorageClasses(), - informerFactory.Scheduling().V1().PriorityClasses(), eventBroadcaster.NewRecorder(legacyscheme.Scheme, v1.EventSource{Component: v1.DefaultSchedulerName}), kubeschedulerconfig.SchedulerAlgorithmSource{ Policy: &kubeschedulerconfig.SchedulerPolicySource{ @@ -326,7 +325,6 @@ func TestSchedulerCreationFromNonExistentConfigMap(t *testing.T) { informerFactory.Core().V1().Services(), informerFactory.Policy().V1beta1().PodDisruptionBudgets(), informerFactory.Storage().V1().StorageClasses(), - informerFactory.Scheduling().V1().PriorityClasses(), eventBroadcaster.NewRecorder(legacyscheme.Scheme, v1.EventSource{Component: v1.DefaultSchedulerName}), kubeschedulerconfig.SchedulerAlgorithmSource{ Policy: &kubeschedulerconfig.SchedulerPolicySource{ diff --git a/test/integration/scheduler/util.go b/test/integration/scheduler/util.go index 0b0f809699..478757509f 100644 --- a/test/integration/scheduler/util.go +++ b/test/integration/scheduler/util.go @@ -97,7 +97,6 @@ func createConfiguratorWithPodInformer( ServiceInformer: informerFactory.Core().V1().Services(), PdbInformer: informerFactory.Policy().V1beta1().PodDisruptionBudgets(), StorageClassInformer: informerFactory.Storage().V1().StorageClasses(), - PriorityClassInformer: informerFactory.Scheduling().V1().PriorityClasses(), Registry: pluginRegistry, Plugins: plugins, PluginConfig: pluginConfig, diff --git a/test/integration/util/util.go b/test/integration/util/util.go index 609c1ffbff..bfbe415a67 100644 --- a/test/integration/util/util.go +++ b/test/integration/util/util.go @@ -118,7 +118,6 @@ func createSchedulerConfigurator( ServiceInformer: informerFactory.Core().V1().Services(), PdbInformer: informerFactory.Policy().V1beta1().PodDisruptionBudgets(), StorageClassInformer: informerFactory.Storage().V1().StorageClasses(), - PriorityClassInformer: informerFactory.Scheduling().V1().PriorityClasses(), HardPodAffinitySymmetricWeight: v1.DefaultHardPodAffinitySymmetricWeight, DisablePreemption: false, PercentageOfNodesToScore: schedulerapi.DefaultPercentageOfNodesToScore,