From e4aa9db258073f2ca3d42a0a552cc0a2c4896de0 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 23 Feb 2017 11:13:10 -0800 Subject: [PATCH 1/5] generated --- api/openapi-spec/swagger.json | 361 ++++- api/swagger-spec/apps_v1beta1.json | 24 +- .../authentication.k8s.io_v1.json | 4 + .../authentication.k8s.io_v1beta1.json | 4 + api/swagger-spec/authorization.k8s.io_v1.json | 4 + .../authorization.k8s.io_v1beta1.json | 4 + api/swagger-spec/autoscaling_v1.json | 24 +- api/swagger-spec/batch_v1.json | 24 +- .../certificates.k8s.io_v1beta1.json | 24 +- api/swagger-spec/extensions_v1beta1.json | 84 +- api/swagger-spec/policy_v1beta1.json | 24 +- .../rbac.authorization.k8s.io_v1alpha1.json | 54 +- .../rbac.authorization.k8s.io_v1beta1.json | 54 +- api/swagger-spec/storage.k8s.io_v1beta1.json | 24 +- api/swagger-spec/v1.json | 154 +- .../apps/v1beta1/definitions.html | 22 +- .../apps/v1beta1/operations.html | 12 +- .../authentication.k8s.io/v1/definitions.html | 9 +- .../v1beta1/definitions.html | 9 +- .../authorization.k8s.io/v1/definitions.html | 9 +- .../v1beta1/definitions.html | 9 +- .../autoscaling/v1/definitions.html | 22 +- .../autoscaling/v1/operations.html | 12 +- docs/api-reference/batch/v1/definitions.html | 22 +- docs/api-reference/batch/v1/operations.html | 12 +- .../v1beta1/definitions.html | 22 +- .../v1beta1/operations.html | 12 +- .../extensions/v1beta1/definitions.html | 22 +- .../extensions/v1beta1/operations.html | 72 +- .../policy/v1beta1/definitions.html | 22 +- .../policy/v1beta1/operations.html | 12 +- .../v1alpha1/definitions.html | 938 +++++------ .../v1alpha1/operations.html | 42 +- .../v1beta1/definitions.html | 22 +- .../v1beta1/operations.html | 42 +- .../storage.k8s.io/v1beta1/definitions.html | 22 +- .../storage.k8s.io/v1beta1/operations.html | 12 +- docs/api-reference/v1/definitions.html | 22 +- docs/api-reference/v1/operations.html | 142 +- federation/apis/openapi-spec/swagger.json | 118 +- pkg/api/v1/generated.pb.go | 1392 +++++++++-------- pkg/api/v1/generated.proto | 8 + pkg/api/v1/types.generated.go | 181 ++- pkg/api/v1/types_swagger_doc_generated.go | 3 +- pkg/api/v1/zz_generated.conversion.go | 2 + pkg/api/v1/zz_generated.deepcopy.go | 5 + pkg/api/zz_generated.deepcopy.go | 5 + pkg/controller/garbagecollector/BUILD | 9 +- pkg/generated/openapi/zz_generated.openapi.go | 16 +- .../pkg/apis/meta/v1/generated.pb.go | 345 ++-- .../pkg/apis/meta/v1/generated.proto | 17 + .../meta/v1/types_swagger_doc_generated.go | 16 +- .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 10 + .../src/k8s.io/client-go/Godeps/Godeps.json | 8 +- staging/src/k8s.io/client-go/pkg/api/types.go | 22 + .../client-go/pkg/api/v1/generated.pb.go | 1392 +++++++++-------- .../client-go/pkg/api/v1/generated.proto | 8 + .../src/k8s.io/client-go/pkg/api/v1/meta.go | 8 + .../client-go/pkg/api/v1/types.generated.go | 181 ++- .../src/k8s.io/client-go/pkg/api/v1/types.go | 22 + .../pkg/api/v1/types_swagger_doc_generated.go | 3 +- .../pkg/api/v1/zz_generated.conversion.go | 2 + .../pkg/api/v1/zz_generated.deepcopy.go | 5 + .../pkg/api/zz_generated.deepcopy.go | 5 + vendor/BUILD | 1 + 65 files changed, 3968 insertions(+), 2225 deletions(-) diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 6fda5934c8b..d354857223b 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -1059,9 +1059,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -1456,9 +1463,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -1853,9 +1867,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -2250,9 +2271,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -2647,9 +2675,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -3180,9 +3215,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -4643,9 +4685,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -5040,9 +5089,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -5709,9 +5765,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -6242,9 +6305,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -6639,9 +6709,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -7673,9 +7750,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -8240,9 +8324,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -9196,9 +9287,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -15159,9 +15257,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -16781,9 +16886,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -17679,9 +17791,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -18610,9 +18729,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -19585,9 +19711,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -20118,9 +20251,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -20651,9 +20791,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -22084,9 +22231,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -23048,9 +23202,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -23581,9 +23742,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -24316,9 +24484,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -24849,9 +25024,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -25246,9 +25428,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -26120,9 +26309,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -26578,9 +26774,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -28632,9 +28835,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -29539,9 +29749,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -29904,9 +30121,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -30277,9 +30501,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -30658,9 +30889,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -32052,9 +32290,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -32417,9 +32662,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -32790,9 +33042,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -33171,9 +33430,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -34614,9 +34880,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -35104,12 +35377,16 @@ "type": "string" }, "orphanDependents": { - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "type": "boolean" }, "preconditions": { "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions" + }, + "propagationPolicy": { + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "type": "string" } } }, @@ -35278,6 +35555,10 @@ "description": "API version of the referent.", "type": "string" }, + "blockOwnerDeletion": { + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", + "type": "boolean" + }, "controller": { "description": "If true, this reference points to the managing controller.", "type": "boolean" diff --git a/api/swagger-spec/apps_v1beta1.json b/api/swagger-spec/apps_v1beta1.json index 79cb1889331..8696c4e43fd 100644 --- a/api/swagger-spec/apps_v1beta1.json +++ b/api/swagger-spec/apps_v1beta1.json @@ -521,7 +521,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1171,6 +1179,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -3286,7 +3298,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -3304,6 +3320,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/authentication.k8s.io_v1.json b/api/swagger-spec/authentication.k8s.io_v1.json index 7845b4b5edb..fda24581602 100644 --- a/api/swagger-spec/authentication.k8s.io_v1.json +++ b/api/swagger-spec/authentication.k8s.io_v1.json @@ -209,6 +209,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, diff --git a/api/swagger-spec/authentication.k8s.io_v1beta1.json b/api/swagger-spec/authentication.k8s.io_v1beta1.json index aad35084913..064b5ea4460 100644 --- a/api/swagger-spec/authentication.k8s.io_v1beta1.json +++ b/api/swagger-spec/authentication.k8s.io_v1beta1.json @@ -209,6 +209,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, diff --git a/api/swagger-spec/authorization.k8s.io_v1.json b/api/swagger-spec/authorization.k8s.io_v1.json index 8bcf664b26b..02745de2e5d 100644 --- a/api/swagger-spec/authorization.k8s.io_v1.json +++ b/api/swagger-spec/authorization.k8s.io_v1.json @@ -307,6 +307,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, diff --git a/api/swagger-spec/authorization.k8s.io_v1beta1.json b/api/swagger-spec/authorization.k8s.io_v1beta1.json index 4c6855836e7..b94a5b07f84 100644 --- a/api/swagger-spec/authorization.k8s.io_v1beta1.json +++ b/api/swagger-spec/authorization.k8s.io_v1beta1.json @@ -307,6 +307,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, diff --git a/api/swagger-spec/autoscaling_v1.json b/api/swagger-spec/autoscaling_v1.json index 0241a399c18..76df340074a 100644 --- a/api/swagger-spec/autoscaling_v1.json +++ b/api/swagger-spec/autoscaling_v1.json @@ -521,7 +521,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1174,6 +1182,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -1392,7 +1404,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -1410,6 +1426,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/batch_v1.json b/api/swagger-spec/batch_v1.json index 2c1eb8a7622..7bdfb672c61 100644 --- a/api/swagger-spec/batch_v1.json +++ b/api/swagger-spec/batch_v1.json @@ -521,7 +521,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1174,6 +1182,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -3262,7 +3274,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -3280,6 +3296,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/certificates.k8s.io_v1beta1.json b/api/swagger-spec/certificates.k8s.io_v1beta1.json index 40868970268..e832616c7c4 100644 --- a/api/swagger-spec/certificates.k8s.io_v1beta1.json +++ b/api/swagger-spec/certificates.k8s.io_v1beta1.json @@ -465,7 +465,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -881,6 +889,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -1097,7 +1109,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -1115,6 +1131,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/extensions_v1beta1.json b/api/swagger-spec/extensions_v1beta1.json index 9fc2016550d..c1f2ca60773 100644 --- a/api/swagger-spec/extensions_v1beta1.json +++ b/api/swagger-spec/extensions_v1beta1.json @@ -521,7 +521,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1491,7 +1499,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2687,7 +2703,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -3657,7 +3681,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -4406,7 +4438,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -5037,7 +5077,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -6281,7 +6329,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -6595,6 +6651,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -8683,7 +8743,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -8701,6 +8765,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1beta1.DeploymentList": { "id": "v1beta1.DeploymentList", "description": "DeploymentList is a list of Deployments.", diff --git a/api/swagger-spec/policy_v1beta1.json b/api/swagger-spec/policy_v1beta1.json index 317d42fb1dc..6e0253175b7 100644 --- a/api/swagger-spec/policy_v1beta1.json +++ b/api/swagger-spec/policy_v1beta1.json @@ -521,7 +521,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1171,6 +1179,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -1402,7 +1414,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -1420,6 +1436,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/rbac.authorization.k8s.io_v1alpha1.json b/api/swagger-spec/rbac.authorization.k8s.io_v1alpha1.json index c4957034479..fd4a3425c4b 100644 --- a/api/swagger-spec/rbac.authorization.k8s.io_v1alpha1.json +++ b/api/swagger-spec/rbac.authorization.k8s.io_v1alpha1.json @@ -449,7 +449,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1008,7 +1016,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1623,7 +1639,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2412,7 +2436,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2907,6 +2939,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -3089,7 +3125,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -3107,6 +3147,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1alpha1.ClusterRoleList": { "id": "v1alpha1.ClusterRoleList", "description": "ClusterRoleList is a collection of ClusterRoles", diff --git a/api/swagger-spec/rbac.authorization.k8s.io_v1beta1.json b/api/swagger-spec/rbac.authorization.k8s.io_v1beta1.json index 6546002cfc6..86df51784dd 100644 --- a/api/swagger-spec/rbac.authorization.k8s.io_v1beta1.json +++ b/api/swagger-spec/rbac.authorization.k8s.io_v1beta1.json @@ -449,7 +449,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1008,7 +1016,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1623,7 +1639,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2412,7 +2436,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2907,6 +2939,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -3089,7 +3125,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -3107,6 +3147,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1beta1.ClusterRoleList": { "id": "v1beta1.ClusterRoleList", "description": "ClusterRoleList is a collection of ClusterRoles", diff --git a/api/swagger-spec/storage.k8s.io_v1beta1.json b/api/swagger-spec/storage.k8s.io_v1beta1.json index 2186bca5b36..c4ee8fe2d20 100644 --- a/api/swagger-spec/storage.k8s.io_v1beta1.json +++ b/api/swagger-spec/storage.k8s.io_v1beta1.json @@ -465,7 +465,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -782,6 +790,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -915,7 +927,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -933,6 +949,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.APIResourceList": { "id": "v1.APIResourceList", "description": "APIResourceList is a list of APIResource, it is used to expose the name of the resources supported in a specific group and version, and if the resource is namespaced.", diff --git a/api/swagger-spec/v1.json b/api/swagger-spec/v1.json index a241011c4f6..d3eedb0da34 100644 --- a/api/swagger-spec/v1.json +++ b/api/swagger-spec/v1.json @@ -698,7 +698,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -1503,7 +1511,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -2308,7 +2324,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -3113,7 +3137,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -3862,7 +3894,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -4631,7 +4671,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -6199,7 +6247,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -7113,7 +7169,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -7885,7 +7949,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -10481,7 +10553,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -11286,7 +11366,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -12421,7 +12509,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -13391,7 +13487,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -14196,7 +14300,15 @@ "type": "boolean", "paramType": "query", "name": "orphanDependents", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "required": false, + "allowMultiple": false + }, + { + "type": "string", + "paramType": "query", + "name": "propagationPolicy", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", "required": false, "allowMultiple": false }, @@ -16512,6 +16624,10 @@ "controller": { "type": "boolean", "description": "If true, this reference points to the managing controller." + }, + "blockOwnerDeletion": { + "type": "boolean", + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned." } } }, @@ -16822,7 +16938,11 @@ }, "orphanDependents": { "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list." + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both." + }, + "propagationPolicy": { + "$ref": "v1.DeletionPropagation", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both." } } }, @@ -16840,6 +16960,10 @@ "id": "types.UID", "properties": {} }, + "v1.DeletionPropagation": { + "id": "v1.DeletionPropagation", + "properties": {} + }, "v1.EndpointsList": { "id": "v1.EndpointsList", "description": "EndpointsList is a list of endpoints.", diff --git a/docs/api-reference/apps/v1beta1/definitions.html b/docs/api-reference/apps/v1beta1/definitions.html index 112956a8b7c..43dc900c08f 100755 --- a/docs/api-reference/apps/v1beta1/definitions.html +++ b/docs/api-reference/apps/v1beta1/definitions.html @@ -1351,6 +1351,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.DeletionPropagation

+

v1.GCEPersistentDiskVolumeSource

@@ -2413,6 +2417,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -4020,11 +4031,18 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -5451,7 +5469,7 @@ Examples:
diff --git a/docs/api-reference/apps/v1beta1/operations.html b/docs/api-reference/apps/v1beta1/operations.html index 387ce0de487..2cf15eaba92 100755 --- a/docs/api-reference/apps/v1beta1/operations.html +++ b/docs/api-reference/apps/v1beta1/operations.html @@ -1187,12 +1187,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -2411,7 +2419,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/authentication.k8s.io/v1/definitions.html b/docs/api-reference/authentication.k8s.io/v1/definitions.html index 39231463ff3..7f4a331555f 100755 --- a/docs/api-reference/authentication.k8s.io/v1/definitions.html +++ b/docs/api-reference/authentication.k8s.io/v1/definitions.html @@ -437,6 +437,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -914,7 +921,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i diff --git a/docs/api-reference/authentication.k8s.io/v1beta1/definitions.html b/docs/api-reference/authentication.k8s.io/v1beta1/definitions.html index cdbf6339514..568767b7c09 100755 --- a/docs/api-reference/authentication.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/authentication.k8s.io/v1beta1/definitions.html @@ -492,6 +492,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -914,7 +921,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i diff --git a/docs/api-reference/authorization.k8s.io/v1/definitions.html b/docs/api-reference/authorization.k8s.io/v1/definitions.html index 60dd5615cd0..b8590e94ec3 100755 --- a/docs/api-reference/authorization.k8s.io/v1/definitions.html +++ b/docs/api-reference/authorization.k8s.io/v1/definitions.html @@ -519,6 +519,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1175,7 +1182,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i diff --git a/docs/api-reference/authorization.k8s.io/v1beta1/definitions.html b/docs/api-reference/authorization.k8s.io/v1beta1/definitions.html index f371f2a3167..9354876513a 100755 --- a/docs/api-reference/authorization.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/authorization.k8s.io/v1beta1/definitions.html @@ -443,6 +443,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1175,7 +1182,7 @@ Populated by the system when a graceful deletion is requested. Read-only. More i diff --git a/docs/api-reference/autoscaling/v1/definitions.html b/docs/api-reference/autoscaling/v1/definitions.html index f9520a82001..9c542893eea 100755 --- a/docs/api-reference/autoscaling/v1/definitions.html +++ b/docs/api-reference/autoscaling/v1/definitions.html @@ -496,11 +496,18 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -1249,6 +1256,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1370,6 +1384,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

any

@@ -1382,7 +1400,7 @@ Examples:
diff --git a/docs/api-reference/autoscaling/v1/operations.html b/docs/api-reference/autoscaling/v1/operations.html index a272cf72cbe..81f031baff4 100755 --- a/docs/api-reference/autoscaling/v1/operations.html +++ b/docs/api-reference/autoscaling/v1/operations.html @@ -1336,12 +1336,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -2411,7 +2419,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/batch/v1/definitions.html b/docs/api-reference/batch/v1/definitions.html index 657d5091275..4b28cf2fdc1 100755 --- a/docs/api-reference/batch/v1/definitions.html +++ b/docs/api-reference/batch/v1/definitions.html @@ -1248,6 +1248,10 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.DeletionPropagation

+

v1.GCEPersistentDiskVolumeSource

@@ -2317,6 +2321,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -4065,11 +4076,18 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -5376,7 +5394,7 @@ Examples:
diff --git a/docs/api-reference/batch/v1/operations.html b/docs/api-reference/batch/v1/operations.html index c432dab748a..a2d20df169d 100755 --- a/docs/api-reference/batch/v1/operations.html +++ b/docs/api-reference/batch/v1/operations.html @@ -1336,12 +1336,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -2411,7 +2419,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/certificates.k8s.io/v1beta1/definitions.html b/docs/api-reference/certificates.k8s.io/v1beta1/definitions.html index 8d2b8ebbaaf..c4a583febca 100755 --- a/docs/api-reference/certificates.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/certificates.k8s.io/v1beta1/definitions.html @@ -496,11 +496,18 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -1151,6 +1158,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1328,6 +1342,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

v1beta1.CertificateSigningRequestStatus

@@ -1378,7 +1396,7 @@ Examples:
diff --git a/docs/api-reference/certificates.k8s.io/v1beta1/operations.html b/docs/api-reference/certificates.k8s.io/v1beta1/operations.html index 4c9382583dc..601505eba86 100755 --- a/docs/api-reference/certificates.k8s.io/v1beta1/operations.html +++ b/docs/api-reference/certificates.k8s.io/v1beta1/operations.html @@ -1147,12 +1147,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the CertificateSigningRequest

@@ -1900,7 +1908,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/extensions/v1beta1/definitions.html b/docs/api-reference/extensions/v1beta1/definitions.html index b316e3b39b8..aa2547016b4 100755 --- a/docs/api-reference/extensions/v1beta1/definitions.html +++ b/docs/api-reference/extensions/v1beta1/definitions.html @@ -3478,11 +3478,18 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -5583,6 +5590,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

v1.TCPSocketAction

@@ -6231,6 +6242,13 @@ Both these may change in the future. Incoming requests are matched against the h

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -7781,7 +7799,7 @@ Both these may change in the future. Incoming requests are matched against the h
diff --git a/docs/api-reference/extensions/v1beta1/operations.html b/docs/api-reference/extensions/v1beta1/operations.html index d938b4e09e0..b8aa70717cb 100755 --- a/docs/api-reference/extensions/v1beta1/operations.html +++ b/docs/api-reference/extensions/v1beta1/operations.html @@ -1634,12 +1634,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -2978,12 +2986,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -4828,12 +4844,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -6172,12 +6196,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -7137,12 +7169,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -9348,12 +9388,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the PodSecurityPolicy

@@ -10406,12 +10454,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the ThirdPartyResource

@@ -13582,7 +13638,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/policy/v1beta1/definitions.html b/docs/api-reference/policy/v1beta1/definitions.html index 50909d9671a..c3e5b92b002 100755 --- a/docs/api-reference/policy/v1beta1/definitions.html +++ b/docs/api-reference/policy/v1beta1/definitions.html @@ -558,11 +558,18 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -1194,6 +1201,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1363,6 +1377,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

v1beta1.PodDisruptionBudgetSpec

@@ -1416,7 +1434,7 @@ Examples:
diff --git a/docs/api-reference/policy/v1beta1/operations.html b/docs/api-reference/policy/v1beta1/operations.html index 199b4f4c623..a1936114a5d 100755 --- a/docs/api-reference/policy/v1beta1/operations.html +++ b/docs/api-reference/policy/v1beta1/operations.html @@ -1187,12 +1187,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -2411,7 +2419,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/definitions.html b/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/definitions.html index 6782c166016..929d80853f8 100755 --- a/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/definitions.html +++ b/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/definitions.html @@ -454,6 +454,440 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } + +
+

v1.ListMeta

+
+

ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.

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

selfLink

SelfLink is a URL representing this object. Populated by the system. Read-only.

false

string

resourceVersion

String that identifies the server’s internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency

false

string

+ +
+
+

v1.Preconditions

+
+

Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.

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

uid

Specifies the target UID.

false

types.UID

+ +
+
+

v1.Status

+
+

Status is a return value for calls that don’t return other objects.

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard list metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

v1.ListMeta

status

Status of the operation. One of: "Success" or "Failure". More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status

false

string

message

A human-readable description of the status of this operation.

false

string

reason

A machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.

false

string

details

Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type.

false

v1.StatusDetails

code

Suggested HTTP return code for this status, 0 if not set.

false

integer (int32)

+ +
+
+

v1.WatchEvent

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

type

true

string

object

true

string

+ +
+
+

v1alpha1.ClusterRoleList

+
+

ClusterRoleList is a collection of ClusterRoles

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ListMeta

items

Items is a list of ClusterRoles

true

v1alpha1.ClusterRole array

+ +
+
+

v1alpha1.RoleBinding

+
+

RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ObjectMeta

subjects

Subjects holds references to the objects the role applies to.

true

v1alpha1.Subject array

roleRef

RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.

true

v1alpha1.RoleRef

+ +
+
+

v1alpha1.PolicyRule

+
+

PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.

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

verbs

Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.

true

string array

apiGroups

APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.

false

string array

resources

Resources is a list of resources this rule applies to. ResourceAll represents all resources.

false

string array

resourceNames

ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.

false

string array

nonResourceURLs

NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path This name is intentionally different than the internal type so that the DefaultConvert works nicely and because the ordering may be different. Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.

false

string array

+ +
+
+

v1alpha1.Role

+
+

Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ObjectMeta

rules

Rules holds all the PolicyRules for this Role

true

v1alpha1.PolicyRule array

+ +
+
+

v1.DeletionPropagation

+

v1.Patch

@@ -514,50 +948,16 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

- - - -
-
-

v1.ListMeta

-
-

ListMeta describes metadata that synthetic resources must have, including lists and various status objects. A resource may have only one of {ObjectMeta, ListMeta}.

-
- ------- - - - - - - - - - - - - + + - - - - - - - - + @@ -680,95 +1080,6 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
NameDescriptionRequiredSchemaDefault

selfLink

SelfLink is a URL representing this object. Populated by the system. Read-only.

propagationPolicy

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

false

string

resourceVersion

String that identifies the server’s internal version of this object that can be used by clients to determine when objects have changed. Value must be treated as opaque by clients and passed unmodified back to the server. Populated by the system. Read-only. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#concurrency-control-and-consistency

false

string

v1.DeletionPropagation

-
-
-

v1.Preconditions

-
-

Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out.

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

uid

Specifies the target UID.

false

types.UID

- -
-
-

v1alpha1.ClusterRoleBindingList

-
-

ClusterRoleBindingList is a collection of ClusterRoleBindings

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ListMeta

items

Items is a list of ClusterRoleBindings

true

v1alpha1.ClusterRoleBinding array

-

v1alpha1.Subject

@@ -826,9 +1137,9 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

v1.Status

+

v1alpha1.ClusterRoleBindingList

-

Status is a return value for calls that don’t return other objects.

+

ClusterRoleBindingList is a collection of ClusterRoleBindings

@@ -864,44 +1175,16 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -1019,47 +1302,9 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
-

v1.WatchEvent

-

metadata

Standard list metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

Standard object’s metadata.

false

v1.ListMeta

status

Status of the operation. One of: "Success" or "Failure". More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status

false

string

message

A human-readable description of the status of this operation.

false

string

reason

A machine-readable description of why this operation is in the "Failure" status. If this value is empty there is no information available. A Reason clarifies an HTTP status code but does not override it.

false

string

details

Extended data associated with the reason. Each reason may define its own extended details. This field is optional and the data returned is not guaranteed to conform to any schema except that defined by the reason type.

false

v1.StatusDetails

code

Suggested HTTP return code for this status, 0 if not set.

false

integer (int32)

items

Items is a list of ClusterRoleBindings

true

v1alpha1.ClusterRoleBinding array

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

type

true

string

object

true

string

- -
-
-

v1alpha1.ClusterRoleList

+

v1.OwnerReference

-

ClusterRoleList is a collection of ClusterRoles

+

OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.

@@ -1080,33 +1325,47 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } - - - - - - - - - + + - - - - + + + + - - + + - + + + + + + + + + + + + + + + + + + + + + +

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

API version of the referent.

true

string

metadata

Standard object’s metadata.

false

v1.ListMeta

kind

Kind of the referent. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

true

string

items

Items is a list of ClusterRoles

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

true

v1alpha1.ClusterRole array

string

uid

UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids

true

string

controller

If true, this reference points to the managing controller.

false

boolean

false

blockOwnerDeletion

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

false

boolean

false

@@ -1256,68 +1515,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1.OwnerReference

-
-

OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.

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

apiVersion

API version of the referent.

true

string

kind

Kind of the referent. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

true

string

name

Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names

true

string

uid

UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids

true

string

controller

If true, this reference points to the managing controller.

false

boolean

false

-

v1alpha1.ClusterRoleBinding

@@ -1380,68 +1577,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1alpha1.RoleBinding

-
-

RoleBinding references a role, but does not contain it. It can reference a Role in the same namespace or a ClusterRole in the global namespace. It adds who information via Subjects and namespace information by which namespace it exists in. RoleBindings in a given namespace only have effect in that namespace.

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ObjectMeta

subjects

Subjects holds references to the objects the role applies to.

true

v1alpha1.Subject array

roleRef

RoleRef can reference a Role in the current namespace or a ClusterRole in the global namespace. If the RoleRef cannot be resolved, the Authorizer must return an error.

true

v1alpha1.RoleRef

-

v1.APIResource

@@ -1504,68 +1639,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i -
-
-

v1alpha1.PolicyRule

-
-

PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to.

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

verbs

Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds.

true

string array

apiGroups

APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed.

false

string array

resources

Resources is a list of resources this rule applies to. ResourceAll represents all resources.

false

string array

resourceNames

ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed.

false

string array

nonResourceURLs

NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path This name is intentionally different than the internal type so that the DefaultConvert works nicely and because the ordering may be different. Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both.

false

string array

-

v1alpha1.RoleRef

@@ -1618,61 +1691,6 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

types.UID

-
-
-

v1alpha1.Role

-
-

Role is a namespaced, logical grouping of PolicyRules that can be referenced as a unit by a RoleBinding.

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

kind

Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds

false

string

apiVersion

APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#resources

false

string

metadata

Standard object’s metadata.

false

v1.ObjectMeta

rules

Rules holds all the PolicyRules for this Role

true

v1alpha1.PolicyRule array

-

v1.StatusCause

@@ -1737,7 +1755,7 @@ Examples:
diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/operations.html b/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/operations.html index 52527093653..20f2f6bcb80 100755 --- a/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/operations.html +++ b/docs/api-reference/rbac.authorization.k8s.io/v1alpha1/operations.html @@ -1131,12 +1131,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the ClusterRoleBinding

@@ -2024,12 +2032,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the ClusterRole

@@ -2957,12 +2973,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3906,12 +3930,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -5983,7 +6015,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1beta1/definitions.html b/docs/api-reference/rbac.authorization.k8s.io/v1beta1/definitions.html index 9997add46b9..063649a5c45 100755 --- a/docs/api-reference/rbac.authorization.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/rbac.authorization.k8s.io/v1beta1/definitions.html @@ -569,11 +569,18 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -1267,6 +1274,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1498,6 +1512,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

v1beta1.PolicyRule

@@ -1737,7 +1755,7 @@ Examples:
diff --git a/docs/api-reference/rbac.authorization.k8s.io/v1beta1/operations.html b/docs/api-reference/rbac.authorization.k8s.io/v1beta1/operations.html index 6dcdcb09abd..d91898f328f 100755 --- a/docs/api-reference/rbac.authorization.k8s.io/v1beta1/operations.html +++ b/docs/api-reference/rbac.authorization.k8s.io/v1beta1/operations.html @@ -1131,12 +1131,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the ClusterRoleBinding

@@ -2024,12 +2032,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the ClusterRole

@@ -2957,12 +2973,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3906,12 +3930,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -5983,7 +6015,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/storage.k8s.io/v1beta1/definitions.html b/docs/api-reference/storage.k8s.io/v1beta1/definitions.html index 65dabce8fb6..aae846a134d 100755 --- a/docs/api-reference/storage.k8s.io/v1beta1/definitions.html +++ b/docs/api-reference/storage.k8s.io/v1beta1/definitions.html @@ -551,11 +551,18 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -1087,6 +1094,13 @@ Populated by the system when a graceful deletion is requested. Read-only. More i

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -1208,6 +1222,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

any

@@ -1220,7 +1238,7 @@ Examples:
diff --git a/docs/api-reference/storage.k8s.io/v1beta1/operations.html b/docs/api-reference/storage.k8s.io/v1beta1/operations.html index 7af84349092..cc99241faea 100755 --- a/docs/api-reference/storage.k8s.io/v1beta1/operations.html +++ b/docs/api-reference/storage.k8s.io/v1beta1/operations.html @@ -1147,12 +1147,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the StorageClass

@@ -1662,7 +1670,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/docs/api-reference/v1/definitions.html b/docs/api-reference/v1/definitions.html index 8efa64b4274..f2665aaf119 100755 --- a/docs/api-reference/v1/definitions.html +++ b/docs/api-reference/v1/definitions.html @@ -4191,11 +4191,18 @@ The resulting set of endpoints can be viewed as:

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

false

+ +

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

v1.DeletionPropagation

+ + @@ -6443,6 +6450,10 @@ Examples:
+ +
+

v1.DeletionPropagation

+

v1.TCPSocketAction

@@ -7358,6 +7369,13 @@ Examples:

boolean

false

+ +

blockOwnerDeletion

+

If true, AND if the owner has the "foregroundDeletion" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs "delete" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.

+

false

+

boolean

+

false

+ @@ -9714,7 +9732,7 @@ Examples:
diff --git a/docs/api-reference/v1/operations.html b/docs/api-reference/v1/operations.html index bc6095e4efa..e00c32fabe8 100755 --- a/docs/api-reference/v1/operations.html +++ b/docs/api-reference/v1/operations.html @@ -2565,12 +2565,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -3530,12 +3538,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -4495,12 +4511,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -5460,12 +5484,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -6425,12 +6457,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -7769,12 +7809,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -11303,12 +11351,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -12268,12 +12324,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -13991,12 +14055,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -15335,12 +15407,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -16300,12 +16380,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

namespace

object name and auth scope, such as for teams and projects

@@ -18927,12 +19015,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the Namespace

@@ -20310,12 +20406,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the Node

@@ -22595,12 +22699,20 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }

QueryParameter

orphanDependents

-

Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list.

+

Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the "orphan" finalizer will be added to/removed from the object’s finalizers list. Either this field or PropagationPolicy may be set, but not both.

false

boolean

+

QueryParameter

+

propagationPolicy

+

Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.

+

false

+

string

+ + +

PathParameter

name

name of the PersistentVolume

@@ -33962,7 +34074,7 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } diff --git a/federation/apis/openapi-spec/swagger.json b/federation/apis/openapi-spec/swagger.json index e8b4d36d0f3..b09de36c899 100644 --- a/federation/apis/openapi-spec/swagger.json +++ b/federation/apis/openapi-spec/swagger.json @@ -722,9 +722,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -1119,9 +1126,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -1516,9 +1530,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -1913,9 +1934,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -2254,9 +2282,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -4341,9 +4376,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -5305,9 +5347,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -6423,9 +6472,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -6956,9 +7012,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -7691,9 +7754,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -8224,9 +8294,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -10048,9 +10125,16 @@ { "uniqueItems": true, "type": "boolean", - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "name": "orphanDependents", "in": "query" + }, + { + "uniqueItems": true, + "type": "string", + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "name": "propagationPolicy", + "in": "query" } ], "responses": { @@ -10600,12 +10684,16 @@ "type": "string" }, "orphanDependents": { - "description": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "description": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", "type": "boolean" }, "preconditions": { "description": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", "$ref": "#/definitions/io.k8s.apimachinery.pkg.apis.meta.v1.Preconditions" + }, + "propagationPolicy": { + "description": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + "type": "string" } } }, @@ -10774,6 +10862,10 @@ "description": "API version of the referent.", "type": "string" }, + "blockOwnerDeletion": { + "description": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", + "type": "boolean" + }, "controller": { "description": "If true, this reference points to the managing controller.", "type": "boolean" diff --git a/pkg/api/v1/generated.pb.go b/pkg/api/v1/generated.pb.go index 18297c016b5..a593c72286d 100644 --- a/pkg/api/v1/generated.pb.go +++ b/pkg/api/v1/generated.pb.go @@ -2403,6 +2403,12 @@ func (m *DeleteOptions) MarshalTo(data []byte) (int, error) { } i++ } + if m.PropagationPolicy != nil { + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(len(*m.PropagationPolicy))) + i += copy(data[i:], *m.PropagationPolicy) + } return i, nil } @@ -9377,6 +9383,10 @@ func (m *DeleteOptions) Size() (n int) { if m.OrphanDependents != nil { n += 2 } + if m.PropagationPolicy != nil { + l = len(*m.PropagationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12173,6 +12183,7 @@ func (this *DeleteOptions) String() string { `GracePeriodSeconds:` + valueToStringGenerated(this.GracePeriodSeconds) + `,`, `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, + `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, `}`, }, "") return s @@ -18633,6 +18644,36 @@ func (m *DeleteOptions) Unmarshal(data []byte) error { } b := bool(v != 0) m.OrphanDependents = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", 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 := DeletionPropagation(data[iNdEx:postIndex]) + m.PropagationPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -41956,679 +41997,682 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10780 bytes of a gzipped FileDescriptorProto + // 10818 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0x79, 0x7d, 0xb8, 0x23, 0x08, 0x91, 0x87, 0xe3, 0x50, - 0xa4, 0x8e, 0xe4, 0x11, 0x10, 0x8f, 0xa4, 0x78, 0x12, 0x15, 0x4a, 0x00, 0x16, 0xb8, 0x83, 0xee, - 0x6b, 0xd9, 0x8b, 0xbb, 0xa3, 0x24, 0x46, 0xe4, 0xdc, 0x4e, 0x03, 0x18, 0xde, 0xec, 0xcc, 0x72, - 0x66, 0x16, 0x77, 0x90, 0xa2, 0x2a, 0x5b, 0x51, 0xc9, 0x49, 0x59, 0x49, 0xe8, 0x72, 0x54, 0x95, - 0x72, 0x52, 0xa5, 0x94, 0xab, 0xe2, 0x28, 0xdf, 0x51, 0x54, 0x96, 0xe4, 0x8a, 0x9c, 0x54, 0x1c, - 0xcb, 0x91, 0xab, 0x12, 0x47, 0x55, 0x2e, 0xc7, 0x4e, 0xa5, 0x02, 0x5b, 0x50, 0xc5, 0x3f, 0xf3, - 0x23, 0xfe, 0x87, 0xa4, 0x92, 0x54, 0x7f, 0x4e, 0xf7, 0xec, 0x2e, 0x66, 0x16, 0x3c, 0xc0, 0x27, - 0x95, 0xff, 0xed, 0xbe, 0xf7, 0xfa, 0xf5, 0xc7, 0x74, 0xbf, 0x7e, 0xef, 0xf5, 0xeb, 0xd7, 0x70, - 0xfe, 0xee, 0xc5, 0x78, 0xde, 0x0b, 0x17, 0xee, 0xb6, 0xef, 0x90, 0x28, 0x20, 0x09, 0x89, 0x17, - 0x5a, 0x77, 0x37, 0x17, 0x9c, 0x96, 0xb7, 0xb0, 0xfd, 0xc2, 0xc2, 0x26, 0x09, 0x48, 0xe4, 0x24, - 0xc4, 0x9d, 0x6f, 0x45, 0x61, 0x12, 0xa2, 0xc7, 0x38, 0xf5, 0x7c, 0x4a, 0x3d, 0xdf, 0xba, 0xbb, - 0x39, 0xef, 0xb4, 0xbc, 0xf9, 0xed, 0x17, 0x66, 0x9f, 0xdf, 0xf4, 0x92, 0xad, 0xf6, 0x9d, 0xf9, - 0x46, 0xd8, 0x5c, 0xd8, 0x0c, 0x37, 0xc3, 0x05, 0x56, 0xe8, 0x4e, 0x7b, 0x83, 0xfd, 0x63, 0x7f, - 0xd8, 0x2f, 0xce, 0x6c, 0xf6, 0x25, 0x51, 0xb5, 0xd3, 0xf2, 0x9a, 0x4e, 0x63, 0xcb, 0x0b, 0x48, - 0xb4, 0xa3, 0x2a, 0x8f, 0x48, 0x1c, 0xb6, 0xa3, 0x06, 0xc9, 0x36, 0xe1, 0xc0, 0x52, 0xf1, 0x42, - 0x93, 0x24, 0x4e, 0x97, 0x86, 0xcf, 0x2e, 0xf4, 0x2a, 0x15, 0xb5, 0x83, 0xc4, 0x6b, 0x76, 0x56, - 0xf3, 0xd1, 0xbc, 0x02, 0x71, 0x63, 0x8b, 0x34, 0x9d, 0x8e, 0x72, 0x2f, 0xf6, 0x2a, 0xd7, 0x4e, - 0x3c, 0x7f, 0xc1, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, - 0x22, 0xf7, 0x9d, 0x66, 0xcb, 0x27, 0x5d, 0xfa, 0x64, 0xff, 0xa1, 0x05, 0x67, 0x17, 0x6f, 0xd7, - 0x57, 0x7c, 0x27, 0x4e, 0xbc, 0xc6, 0x92, 0x1f, 0x36, 0xee, 0xd6, 0x93, 0x30, 0x22, 0xb7, 0x42, - 0xbf, 0xdd, 0x24, 0x75, 0x36, 0x7c, 0xe8, 0x3c, 0x8c, 0x6c, 0xb3, 0xff, 0x6b, 0xd5, 0x19, 0xeb, - 0xac, 0x75, 0xae, 0xb2, 0x34, 0xf5, 0xc3, 0xdd, 0xb9, 0x0f, 0xec, 0xed, 0xce, 0x8d, 0xdc, 0x12, - 0x70, 0xac, 0x28, 0xd0, 0xd3, 0x30, 0xb4, 0x11, 0xaf, 0xef, 0xb4, 0xc8, 0x4c, 0x89, 0xd1, 0x4e, - 0x08, 0xda, 0xa1, 0xd5, 0x3a, 0x85, 0x62, 0x81, 0x45, 0x0b, 0x50, 0x69, 0x39, 0x51, 0xe2, 0x25, - 0x5e, 0x18, 0xcc, 0x94, 0xcf, 0x5a, 0xe7, 0x06, 0x97, 0x4e, 0x08, 0xd2, 0x4a, 0x4d, 0x22, 0x70, - 0x4a, 0x43, 0x9b, 0x11, 0x11, 0xc7, 0xbd, 0x11, 0xf8, 0x3b, 0x33, 0x03, 0x67, 0xad, 0x73, 0x23, - 0x69, 0x33, 0xb0, 0x80, 0x63, 0x45, 0x61, 0x7f, 0xaf, 0x04, 0x23, 0x8b, 0x1b, 0x1b, 0x5e, 0xe0, - 0x25, 0x3b, 0xe8, 0x6d, 0x18, 0x0b, 0x42, 0x97, 0xc8, 0xff, 0xac, 0x17, 0xa3, 0x17, 0x9e, 0x9d, - 0x3f, 0x68, 0x2a, 0xce, 0x5f, 0xd7, 0x4a, 0x2c, 0x4d, 0xed, 0xed, 0xce, 0x8d, 0xe9, 0x10, 0x6c, - 0x70, 0x44, 0x6f, 0xc2, 0x68, 0x2b, 0x74, 0x55, 0x05, 0x25, 0x56, 0xc1, 0x33, 0x07, 0x57, 0x50, - 0x4b, 0x0b, 0x2c, 0x4d, 0xee, 0xed, 0xce, 0x8d, 0x6a, 0x00, 0xac, 0xb3, 0x43, 0x3e, 0x4c, 0xd2, - 0xbf, 0x41, 0xe2, 0xa9, 0x1a, 0xca, 0xac, 0x86, 0xe7, 0xf3, 0x6b, 0xd0, 0x0a, 0x2d, 0x9d, 0xdc, - 0xdb, 0x9d, 0x9b, 0xcc, 0x00, 0x71, 0x96, 0xb5, 0xfd, 0x05, 0x98, 0x58, 0x4c, 0x12, 0xa7, 0xb1, - 0x45, 0x5c, 0xfe, 0x7d, 0xd1, 0x4b, 0x30, 0x10, 0x38, 0x4d, 0x22, 0xbe, 0xfe, 0x59, 0x31, 0xec, - 0x03, 0xd7, 0x9d, 0x26, 0xd9, 0xdf, 0x9d, 0x9b, 0xba, 0x19, 0x78, 0xef, 0xb6, 0xc5, 0x9c, 0xa1, - 0x30, 0xcc, 0xa8, 0xd1, 0x05, 0x00, 0x97, 0x6c, 0x7b, 0x0d, 0x52, 0x73, 0x92, 0x2d, 0x31, 0x1b, - 0x90, 0x28, 0x0b, 0x55, 0x85, 0xc1, 0x1a, 0x95, 0xfd, 0x65, 0x0b, 0x2a, 0x8b, 0xdb, 0xa1, 0xe7, - 0xd6, 0x42, 0x37, 0x46, 0x6d, 0x98, 0x6c, 0x45, 0x64, 0x83, 0x44, 0x0a, 0x34, 0x63, 0x9d, 0x2d, - 0x9f, 0x1b, 0xbd, 0x70, 0x21, 0xa7, 0xdf, 0x66, 0xa1, 0x95, 0x20, 0x89, 0x76, 0x96, 0x1e, 0x11, - 0x55, 0x4f, 0x66, 0xb0, 0x38, 0x5b, 0x87, 0xfd, 0x4b, 0x25, 0x38, 0xb5, 0xf8, 0x85, 0x76, 0x44, - 0xaa, 0x5e, 0x7c, 0x37, 0xbb, 0x14, 0x5c, 0x2f, 0xbe, 0x7b, 0x3d, 0x1d, 0x0c, 0x35, 0x07, 0xab, - 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x1e, 0x86, 0xe9, 0xef, 0x9b, 0x78, 0x4d, 0xf4, 0xfe, 0xa4, 0x20, - 0x1e, 0xad, 0x3a, 0x89, 0x53, 0xe5, 0x28, 0x2c, 0x69, 0xd0, 0x35, 0x18, 0x6d, 0xb0, 0xf5, 0xbe, - 0x79, 0x2d, 0x74, 0x09, 0xfb, 0xc2, 0x95, 0xa5, 0xe7, 0x28, 0xf9, 0x72, 0x0a, 0xde, 0xdf, 0x9d, - 0x9b, 0xe1, 0x6d, 0x13, 0x2c, 0x34, 0x1c, 0xd6, 0xcb, 0x23, 0x5b, 0x2d, 0xc4, 0x01, 0xc6, 0x09, - 0xba, 0x2c, 0xc2, 0x73, 0xda, 0x9a, 0x1a, 0x64, 0x6b, 0x6a, 0xac, 0xc7, 0x7a, 0xfa, 0xc7, 0x96, - 0x18, 0x93, 0x55, 0xcf, 0x37, 0xc5, 0xc3, 0x05, 0x80, 0x98, 0x34, 0x22, 0x92, 0x68, 0xa3, 0xa2, - 0x3e, 0x73, 0x5d, 0x61, 0xb0, 0x46, 0x45, 0x17, 0x7f, 0xbc, 0xe5, 0x44, 0x6c, 0xb6, 0x88, 0xb1, - 0x51, 0x8b, 0xbf, 0x2e, 0x11, 0x38, 0xa5, 0x31, 0x16, 0x7f, 0x39, 0x77, 0xf1, 0xff, 0x96, 0x05, - 0xc3, 0x4b, 0x5e, 0xe0, 0x7a, 0xc1, 0x26, 0x7a, 0x1b, 0x46, 0xa8, 0x44, 0x77, 0x9d, 0xc4, 0x11, - 0xeb, 0xfe, 0x23, 0x72, 0xf2, 0xe8, 0x02, 0x56, 0x4e, 0x9f, 0x78, 0x9e, 0x52, 0xd3, 0x49, 0x74, - 0xe3, 0xce, 0x3b, 0xa4, 0x91, 0x5c, 0x23, 0x89, 0x93, 0x76, 0x27, 0x85, 0x61, 0xc5, 0x15, 0xdd, - 0x84, 0xa1, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x96, 0x7d, 0xce, 0xa2, 0xe4, 0x3c, 0x30, 0x9d, 0x72, - 0x24, 0x68, 0x90, 0x54, 0x40, 0xae, 0x33, 0x26, 0x58, 0x30, 0xb3, 0x1b, 0x30, 0xb6, 0xec, 0xb4, - 0x9c, 0x3b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0x87, 0xa1, 0xec, 0xb8, 0x2e, 0x5b, 0x00, 0x95, - 0xa5, 0x53, 0x7b, 0xbb, 0x73, 0xe5, 0x45, 0xd7, 0xdd, 0xdf, 0x9d, 0x03, 0x45, 0xb5, 0x83, 0x29, - 0x05, 0x7a, 0x16, 0x06, 0xdc, 0x28, 0x6c, 0xcd, 0x94, 0x18, 0xe5, 0x69, 0xba, 0x52, 0xab, 0x51, - 0xd8, 0xca, 0x90, 0x32, 0x1a, 0xfb, 0x07, 0x25, 0x40, 0xcb, 0xa4, 0xb5, 0xb5, 0x5a, 0x37, 0xbe, - 0xe9, 0x39, 0x18, 0x69, 0x86, 0x81, 0x97, 0x84, 0x51, 0x2c, 0x2a, 0x64, 0xf3, 0xe2, 0x9a, 0x80, - 0x61, 0x85, 0x45, 0x67, 0x61, 0xa0, 0x95, 0x2e, 0xef, 0x31, 0x29, 0x1a, 0xd8, 0xc2, 0x66, 0x18, - 0x4a, 0xd1, 0x8e, 0x49, 0x24, 0xe6, 0xb3, 0xa2, 0xb8, 0x19, 0x93, 0x08, 0x33, 0x4c, 0x3a, 0x83, - 0xe8, 0xdc, 0x12, 0xb3, 0x35, 0x33, 0x83, 0x28, 0x06, 0x6b, 0x54, 0xe8, 0x2d, 0xa8, 0xf0, 0x7f, - 0x98, 0x6c, 0xb0, 0xa9, 0x9b, 0x2b, 0x14, 0xae, 0x86, 0x0d, 0xc7, 0xcf, 0x0e, 0xfe, 0x38, 0x9b, - 0x71, 0x92, 0x11, 0x4e, 0x79, 0x1a, 0x33, 0x6e, 0x28, 0x77, 0xc6, 0xfd, 0x1d, 0x0b, 0xd0, 0xb2, - 0x17, 0xb8, 0x24, 0x3a, 0x86, 0xad, 0xb3, 0xbf, 0xc5, 0xf0, 0xdf, 0x68, 0xd3, 0xc2, 0x66, 0x2b, - 0x0c, 0x48, 0x90, 0x2c, 0x87, 0x81, 0xcb, 0xb7, 0xd3, 0x8f, 0xc3, 0x40, 0x42, 0xab, 0xe2, 0xcd, - 0x7a, 0x5a, 0x7e, 0x16, 0x5a, 0xc1, 0xfe, 0xee, 0xdc, 0xe9, 0xce, 0x12, 0xac, 0x09, 0xac, 0x0c, - 0xfa, 0x18, 0x0c, 0xc5, 0x89, 0x93, 0xb4, 0x63, 0xd1, 0xd0, 0x27, 0x64, 0x43, 0xeb, 0x0c, 0xba, - 0xbf, 0x3b, 0x37, 0xa9, 0x8a, 0x71, 0x10, 0x16, 0x05, 0xd0, 0x33, 0x30, 0xdc, 0x24, 0x71, 0xec, - 0x6c, 0x4a, 0x01, 0x37, 0x29, 0xca, 0x0e, 0x5f, 0xe3, 0x60, 0x2c, 0xf1, 0xe8, 0x49, 0x18, 0x24, - 0x51, 0x14, 0x46, 0x62, 0x46, 0x8c, 0x0b, 0xc2, 0xc1, 0x15, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x57, - 0x0b, 0x26, 0x55, 0x5b, 0x79, 0x5d, 0xc7, 0xb0, 0xe4, 0x5d, 0x80, 0x86, 0xec, 0x60, 0xcc, 0x16, - 0x9a, 0x56, 0x47, 0xf7, 0xe9, 0xd7, 0x39, 0xa0, 0x69, 0x1d, 0x0a, 0x14, 0x63, 0x8d, 0xaf, 0xfd, - 0x1f, 0x2c, 0x38, 0x99, 0xe9, 0xdb, 0x55, 0x2f, 0x4e, 0xd0, 0x9b, 0x1d, 0xfd, 0x9b, 0x2f, 0xd6, - 0x3f, 0x5a, 0x9a, 0xf5, 0x4e, 0xcd, 0x17, 0x09, 0xd1, 0xfa, 0x86, 0x61, 0xd0, 0x4b, 0x48, 0x53, - 0x76, 0xeb, 0xf9, 0x82, 0xdd, 0xe2, 0xed, 0x4b, 0xbf, 0xd2, 0x1a, 0xe5, 0x81, 0x39, 0x2b, 0xfb, - 0x7f, 0x5b, 0x50, 0x59, 0x0e, 0x83, 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x3a, 0x86, 0xef, 0x53, 0x87, - 0x01, 0xc6, 0x9d, 0x77, 0xe1, 0x85, 0xbc, 0x2e, 0x88, 0x86, 0xcd, 0xd3, 0x3d, 0x95, 0x2b, 0x0b, - 0x4a, 0x4c, 0x51, 0x10, 0x66, 0xcc, 0x66, 0x5f, 0x81, 0x8a, 0x22, 0x40, 0x53, 0x50, 0xbe, 0x4b, - 0xb8, 0x26, 0x59, 0xc1, 0xf4, 0x27, 0x9a, 0x86, 0xc1, 0x6d, 0xc7, 0x6f, 0x8b, 0xc5, 0x8b, 0xf9, - 0x9f, 0x8f, 0x97, 0x2e, 0x5a, 0xf6, 0x0f, 0xd8, 0x0a, 0x14, 0x95, 0xac, 0x04, 0xdb, 0x42, 0x38, - 0x7c, 0xc5, 0x82, 0x69, 0xbf, 0x8b, 0x50, 0x12, 0x63, 0x72, 0x18, 0x71, 0xf6, 0x98, 0x68, 0xf6, - 0x74, 0x37, 0x2c, 0xee, 0x5a, 0x1b, 0x95, 0xf5, 0x61, 0x8b, 0x4e, 0x38, 0xc7, 0x67, 0x4d, 0x17, - 0x3a, 0xc0, 0x0d, 0x01, 0xc3, 0x0a, 0x6b, 0xff, 0xa9, 0x05, 0xd3, 0xaa, 0x1f, 0x57, 0xc8, 0x4e, - 0x9d, 0xf8, 0xa4, 0x91, 0x84, 0xd1, 0xc3, 0xd2, 0x93, 0xc7, 0xf9, 0x37, 0xe1, 0x32, 0x69, 0x54, - 0x30, 0x28, 0x5f, 0x21, 0x3b, 0xfc, 0x03, 0xe9, 0x1d, 0x2d, 0x1f, 0xd8, 0xd1, 0x7f, 0x6d, 0xc1, - 0xb8, 0xea, 0xe8, 0x31, 0x2c, 0xb9, 0xab, 0xe6, 0x92, 0xfb, 0x70, 0xc1, 0xf9, 0xda, 0x63, 0xb1, - 0xfd, 0xed, 0x12, 0x15, 0x1b, 0x82, 0xa6, 0x16, 0x85, 0x74, 0x90, 0xa8, 0xc4, 0x7f, 0x48, 0xbe, - 0x52, 0x7f, 0x9d, 0xbd, 0x42, 0x76, 0xd6, 0x43, 0xaa, 0x4d, 0x74, 0xef, 0xac, 0xf1, 0x51, 0x07, - 0x0e, 0xfc, 0xa8, 0xbf, 0x5b, 0x82, 0x53, 0x6a, 0x58, 0x8c, 0x5d, 0xfa, 0x67, 0x72, 0x60, 0x5e, - 0x80, 0x51, 0x97, 0x6c, 0x38, 0x6d, 0x3f, 0x51, 0xd6, 0xc4, 0x20, 0x37, 0x33, 0xab, 0x29, 0x18, - 0xeb, 0x34, 0x7d, 0x8c, 0xe5, 0x37, 0x46, 0x99, 0x3c, 0x4f, 0x1c, 0x3a, 0xeb, 0xa9, 0x86, 0xa7, - 0x99, 0x87, 0x63, 0xba, 0x79, 0x28, 0x4c, 0xc1, 0x27, 0x61, 0xd0, 0x6b, 0xd2, 0x3d, 0xbf, 0x64, - 0x6e, 0xe5, 0x6b, 0x14, 0x88, 0x39, 0x0e, 0x3d, 0x05, 0xc3, 0x8d, 0xb0, 0xd9, 0x74, 0x02, 0x77, - 0xa6, 0xcc, 0x74, 0xce, 0x51, 0xaa, 0x16, 0x2c, 0x73, 0x10, 0x96, 0x38, 0xf4, 0x18, 0x0c, 0x38, - 0xd1, 0x66, 0x3c, 0x33, 0xc0, 0x68, 0x46, 0x68, 0x4d, 0x8b, 0xd1, 0x66, 0x8c, 0x19, 0x94, 0xea, - 0x92, 0xf7, 0xc2, 0xe8, 0xae, 0x17, 0x6c, 0x56, 0xbd, 0x88, 0x29, 0x86, 0x9a, 0x2e, 0x79, 0x5b, - 0x61, 0xb0, 0x46, 0x85, 0x6a, 0x30, 0xd8, 0x0a, 0xa3, 0x24, 0x9e, 0x19, 0x62, 0x03, 0xff, 0x5c, - 0xee, 0xf2, 0xe3, 0xfd, 0xae, 0x85, 0x51, 0x92, 0x76, 0x85, 0xfe, 0x8b, 0x31, 0x67, 0x84, 0x96, - 0xa1, 0x4c, 0x82, 0xed, 0x99, 0x61, 0xc6, 0xef, 0x43, 0x07, 0xf3, 0x5b, 0x09, 0xb6, 0x6f, 0x39, - 0x51, 0x2a, 0xaf, 0x56, 0x82, 0x6d, 0x4c, 0x4b, 0xa3, 0x06, 0x54, 0xa4, 0x0b, 0x2b, 0x9e, 0x19, - 0x29, 0x32, 0x15, 0xb1, 0x20, 0xc7, 0xe4, 0xdd, 0xb6, 0x17, 0x91, 0x26, 0x09, 0x92, 0x38, 0x35, - 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x31, 0xae, 0x7f, 0x5e, 0x0b, 0xdb, 0x41, 0x12, - 0xcf, 0x54, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x4b, 0xd3, 0x82, 0xfd, 0x98, 0x06, - 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xe3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, 0xbc, - 0x43, 0x66, 0x80, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x96, 0x4e, 0xec, 0xed, 0xce, - 0x8d, 0x5f, 0xd5, 0x4b, 0x63, 0x93, 0x19, 0x7a, 0x0b, 0x26, 0xa8, 0xb2, 0xeb, 0xa5, 0xec, 0x47, - 0x8b, 0xb3, 0x47, 0x7b, 0xbb, 0x73, 0x13, 0xd8, 0x28, 0x8e, 0x33, 0xec, 0xd0, 0x3a, 0x54, 0x7c, - 0x6f, 0x83, 0x34, 0x76, 0x1a, 0x3e, 0x99, 0x19, 0x63, 0xbc, 0x73, 0x16, 0xe7, 0x55, 0x49, 0xce, - 0x0d, 0x0c, 0xf5, 0x17, 0xa7, 0x8c, 0xd0, 0x2d, 0x38, 0x9d, 0x90, 0xa8, 0xe9, 0x05, 0x0e, 0x5d, - 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x71, 0x36, 0x6b, 0xcf, 0x88, 0x81, 0x3d, 0xbd, 0xde, 0x95, - 0x0a, 0xf7, 0x28, 0x8d, 0x6e, 0xc0, 0x24, 0x5b, 0x4f, 0xb5, 0xb6, 0xef, 0xd7, 0x42, 0xdf, 0x6b, - 0xec, 0xcc, 0x4c, 0x30, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0x9a, 0x89, 0xa6, 0x86, 0x61, 0xfa, 0x0f, - 0x67, 0x4b, 0x23, 0x1f, 0x26, 0x63, 0xd2, 0x68, 0x47, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, 0x9f, - 0xcc, 0x4c, 0x16, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, 0x15, - 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xcc, 0x14, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, 0x1c, - 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x3e, 0xc1, 0x08, 0x53, 0xff, 0x81, 0x44, 0xe0, 0x94, - 0x86, 0xaa, 0x06, 0x49, 0xb2, 0x33, 0x83, 0x18, 0xa9, 0x5a, 0x6a, 0xeb, 0xeb, 0x9f, 0xc1, 0x14, - 0x8e, 0x6e, 0xc1, 0x30, 0x09, 0xb6, 0x57, 0xa3, 0xb0, 0x39, 0x73, 0xb2, 0x88, 0x0c, 0x58, 0xe1, - 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0x33, 0x5d, 0xbe, 0x12, - 0xff, 0x28, 0xd3, 0xec, 0xa3, 0x7c, 0x42, 0x94, 0x9d, 0x59, 0xef, 0x41, 0xb7, 0x7f, 0x00, 0x0e, - 0xf7, 0xe4, 0x6e, 0xdf, 0x81, 0x09, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0x73, 0x30, 0x48, 0x65, 0xb1, - 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x40, 0x96, - 0x76, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x72, 0x35, - 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0xf3, 0x30, 0xb2, 0x15, 0xc6, 0x09, 0xa5, 0x66, 0x75, 0x0c, - 0xa6, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x0a, 0xe3, 0x0d, 0xbd, 0x02, 0xb1, 0x8d, - 0x9d, 0x12, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x08, 0xf3, 0x72, 0x37, 0x42, 0x5f, - 0x98, 0x90, 0x72, 0x57, 0x1e, 0xa9, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, 0xd3, - 0x26, 0xac, 0xd5, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0x97, 0x25, - 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x67, 0x61, 0xf8, 0x9e, 0xe3, 0x25, 0x5e, 0xb0, 0x29, 0xb4, - 0x87, 0x17, 0x0b, 0xee, 0x26, 0xac, 0xf8, 0x6d, 0x5e, 0x94, 0xef, 0x7c, 0xe2, 0x0f, 0x96, 0x0c, - 0x29, 0xef, 0xa8, 0x1d, 0x04, 0x94, 0x77, 0xa9, 0x7f, 0xde, 0x98, 0x17, 0xe5, 0xbc, 0xc5, 0x1f, - 0x2c, 0x19, 0xa2, 0x0d, 0x00, 0x39, 0x97, 0x88, 0x2b, 0xbc, 0xcb, 0x1f, 0xed, 0x87, 0xfd, 0xba, - 0x2a, 0xbd, 0x34, 0x41, 0xf7, 0xda, 0xf4, 0x3f, 0xd6, 0x38, 0xdb, 0x09, 0x53, 0xc2, 0x3a, 0x9b, - 0x85, 0x3e, 0x47, 0x97, 0xb4, 0x13, 0x25, 0xc4, 0x5d, 0x4c, 0xb2, 0x0e, 0xfa, 0x83, 0x55, 0xec, - 0x75, 0xaf, 0x49, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xdd, 0x32, 0xcc, 0xf4, 0x6a, - 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x53, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0x8a, 0x80, 0x63, - 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x4a, 0x63, 0x69, 0x30, 0x9d, 0x1b, 0x75, 0x06, 0xc5, 0x02, - 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, 0x0e, - 0x91, 0x81, 0x1c, 0x87, 0x88, 0x31, 0x44, 0x83, 0x0f, 0x76, 0x88, 0xd0, 0xe7, 0x01, 0x36, 0xbc, - 0xc0, 0x8b, 0xb7, 0x18, 0xf7, 0xa1, 0xbe, 0xb9, 0x2b, 0x25, 0x6b, 0x55, 0x71, 0xc1, 0x1a, 0x47, - 0xf4, 0x32, 0x8c, 0xaa, 0xe5, 0xb9, 0x56, 0x9d, 0x19, 0x36, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, 0x62, - 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, 0x83, - 0xc7, 0xd7, 0xfe, 0x2f, 0x65, 0x98, 0x34, 0x2a, 0x6b, 0xc7, 0x05, 0x24, 0xda, 0xeb, 0x74, 0xc3, - 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xf9, 0x7e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, 0xa1, - 0x2d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xfe, 0xd8, 0xa6, 0xe6, 0x87, 0x13, - 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, 0x35, - 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x8b, 0x08, 0x9b, 0x29, 0xcb, 0x54, 0x9f, - 0x63, 0x53, 0x6f, 0x30, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1d, 0xa0, - 0xf7, 0x3f, 0x03, 0xc3, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x71, 0x30, 0x96, 0xf8, 0xec, - 0x24, 0x1a, 0x29, 0x38, 0x89, 0x9e, 0x85, 0x89, 0xaa, 0x43, 0x9a, 0x61, 0xb0, 0x12, 0xb8, 0xad, - 0xd0, 0x0b, 0x12, 0x34, 0x03, 0x03, 0x6c, 0x3f, 0xe1, 0xeb, 0x7d, 0x80, 0x72, 0xc0, 0x03, 0x54, - 0x77, 0xb7, 0xff, 0x9f, 0x05, 0xe3, 0x55, 0xe2, 0x93, 0x84, 0x70, 0xbb, 0x27, 0x46, 0xab, 0x80, - 0x36, 0x23, 0xa7, 0x41, 0x6a, 0x24, 0xf2, 0x42, 0xb7, 0x4e, 0x1a, 0x61, 0xc0, 0x0e, 0xa2, 0xe8, - 0x06, 0x79, 0x7a, 0x6f, 0x77, 0x0e, 0x5d, 0xea, 0xc0, 0xe2, 0x2e, 0x25, 0x90, 0x0b, 0xe3, 0xad, - 0x88, 0x18, 0x7e, 0x43, 0x2b, 0x5f, 0xd5, 0xa8, 0xe9, 0x45, 0xb8, 0x36, 0x6c, 0x80, 0xb0, 0xc9, - 0x14, 0x7d, 0x0a, 0xa6, 0xc2, 0xa8, 0xb5, 0xe5, 0x04, 0x55, 0xd2, 0x22, 0x81, 0x4b, 0x4d, 0x00, - 0xe1, 0xed, 0x98, 0xde, 0xdb, 0x9d, 0x9b, 0xba, 0x91, 0xc1, 0xe1, 0x0e, 0x6a, 0xfb, 0x5d, 0x38, - 0x55, 0x0d, 0xef, 0x05, 0xf7, 0x9c, 0xc8, 0x5d, 0xac, 0xad, 0x69, 0x0e, 0x84, 0x37, 0xa4, 0x81, - 0xca, 0x0f, 0xe1, 0x72, 0x76, 0x1f, 0x8d, 0x07, 0x37, 0x0d, 0x56, 0x3d, 0x9f, 0xf4, 0x70, 0x59, - 0xfc, 0x93, 0x92, 0x51, 0x67, 0x4a, 0xaf, 0xce, 0x17, 0xac, 0x9e, 0xe7, 0x0b, 0x9f, 0x83, 0x91, - 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, 0x62, 0x44, 0x5f, 0x28, 0x72, 0x00, 0xb3, 0x4a, 0xcb, 0x48, - 0x0f, 0x16, 0x37, 0x74, 0x57, 0x05, 0x1b, 0xac, 0x18, 0xa2, 0x36, 0x4c, 0x49, 0x5b, 0x49, 0x62, - 0xc5, 0x82, 0x7c, 0xb1, 0x98, 0x29, 0x66, 0x56, 0xc3, 0x3e, 0x01, 0xce, 0x30, 0xc4, 0x1d, 0x55, - 0x50, 0x1b, 0xb7, 0x49, 0xb7, 0xa3, 0x01, 0x36, 0x3d, 0x99, 0x8d, 0xcb, 0xcc, 0x75, 0x06, 0xb5, - 0x7f, 0xcd, 0x82, 0x47, 0x3a, 0x46, 0x4b, 0xf8, 0x32, 0x8e, 0xec, 0x1b, 0x65, 0x1d, 0x0a, 0xa5, - 0x7c, 0x87, 0x82, 0x7d, 0x03, 0xa6, 0x57, 0x9a, 0xad, 0x64, 0xa7, 0xea, 0x99, 0xc7, 0x22, 0xaf, - 0xc0, 0x50, 0x93, 0xb8, 0x5e, 0xbb, 0x29, 0x3e, 0xeb, 0x9c, 0x94, 0xdd, 0xd7, 0x18, 0x74, 0x7f, - 0x77, 0x6e, 0xbc, 0x9e, 0x84, 0x91, 0xb3, 0x49, 0x38, 0x00, 0x0b, 0x72, 0xfb, 0xc7, 0x16, 0x4c, - 0xca, 0x35, 0xbc, 0xe8, 0xba, 0x11, 0x89, 0x63, 0x34, 0x0b, 0x25, 0xaf, 0x25, 0x18, 0x81, 0x60, - 0x54, 0x5a, 0xab, 0xe1, 0x92, 0xd7, 0x42, 0x9f, 0x85, 0x0a, 0x3f, 0x4d, 0x4b, 0x27, 0x47, 0x9f, - 0xa7, 0x73, 0xcc, 0x7e, 0x5b, 0x97, 0x3c, 0x70, 0xca, 0x4e, 0x6a, 0xb2, 0x6c, 0x77, 0x28, 0x9b, - 0x67, 0x3b, 0x97, 0x05, 0x1c, 0x2b, 0x0a, 0x74, 0x0e, 0x46, 0x82, 0xd0, 0xe5, 0x07, 0x9e, 0x7c, - 0x9f, 0x67, 0x53, 0xee, 0xba, 0x80, 0x61, 0x85, 0xb5, 0xbf, 0x66, 0xc1, 0x98, 0xec, 0x63, 0x41, - 0xa5, 0x9a, 0x2e, 0x92, 0x54, 0xa1, 0x4e, 0x17, 0x09, 0x55, 0x8a, 0x19, 0xc6, 0xd0, 0x85, 0xcb, - 0xfd, 0xe8, 0xc2, 0xf6, 0x6f, 0x94, 0x60, 0x42, 0x36, 0xa7, 0xde, 0xbe, 0x13, 0x13, 0xaa, 0x2a, - 0x54, 0x1c, 0x3e, 0xf8, 0x44, 0xce, 0xb3, 0xe7, 0xf3, 0xec, 0x25, 0xe3, 0x9b, 0xa5, 0xaa, 0xc8, - 0xa2, 0xe4, 0x83, 0x53, 0x96, 0x68, 0x1b, 0x4e, 0x04, 0x61, 0xc2, 0xb6, 0x20, 0x85, 0x2f, 0x76, - 0x1a, 0x91, 0xad, 0xe7, 0x51, 0x51, 0xcf, 0x89, 0xeb, 0x59, 0x7e, 0xb8, 0xb3, 0x0a, 0x74, 0x43, - 0xfa, 0x81, 0xca, 0xac, 0xae, 0x67, 0x8b, 0xd5, 0xd5, 0xdb, 0x0d, 0x64, 0xff, 0x8e, 0x05, 0x15, - 0x49, 0x76, 0x1c, 0xc7, 0x52, 0xb7, 0x61, 0x38, 0x66, 0x9f, 0x48, 0x0e, 0xd7, 0xf9, 0x62, 0x5d, - 0xe0, 0xdf, 0x35, 0xdd, 0x77, 0xf9, 0xff, 0x18, 0x4b, 0x6e, 0xcc, 0x21, 0xae, 0x3a, 0xf2, 0xd0, - 0x39, 0xc4, 0x55, 0xcb, 0x7a, 0x9f, 0x3e, 0x8d, 0x1b, 0x16, 0x3b, 0x55, 0x1e, 0x5b, 0x11, 0xd9, - 0xf0, 0xee, 0x67, 0x95, 0xc7, 0x1a, 0x83, 0x62, 0x81, 0x45, 0x1b, 0x30, 0xd6, 0x90, 0x2e, 0xe3, - 0x54, 0x84, 0x7c, 0xa4, 0xa0, 0x7f, 0x5e, 0x1d, 0xf5, 0xf0, 0xf0, 0xa1, 0x65, 0x8d, 0x13, 0x36, - 0xf8, 0x52, 0x39, 0x95, 0x9e, 0x66, 0x97, 0x0b, 0x3a, 0x57, 0x22, 0x92, 0xa4, 0x35, 0xf4, 0x3c, - 0xc8, 0xb6, 0xbf, 0x69, 0xc1, 0x10, 0xf7, 0x31, 0x16, 0x73, 0xd4, 0x6a, 0x87, 0x58, 0xe9, 0x78, - 0xde, 0xa2, 0x40, 0x71, 0xa6, 0x85, 0x6e, 0x43, 0x85, 0xfd, 0x60, 0xfe, 0x92, 0x72, 0x91, 0x58, - 0x2a, 0x5e, 0xbf, 0xde, 0xd4, 0x5b, 0x92, 0x01, 0x4e, 0x79, 0xd9, 0xdf, 0x2f, 0x53, 0xd1, 0x97, - 0x92, 0x1a, 0x7b, 0xbb, 0x75, 0x1c, 0x7b, 0x7b, 0xe9, 0xe8, 0xf7, 0xf6, 0x77, 0x61, 0xb2, 0xa1, - 0x1d, 0xa2, 0xa5, 0x5f, 0xfc, 0x42, 0xc1, 0x69, 0xa5, 0x9d, 0xbc, 0x71, 0x9f, 0xda, 0xb2, 0xc9, - 0x0e, 0x67, 0xf9, 0x23, 0x02, 0x63, 0x7c, 0x3e, 0x88, 0xfa, 0x06, 0x58, 0x7d, 0x0b, 0x45, 0x66, - 0x98, 0x5e, 0x19, 0x9b, 0xc5, 0x75, 0x8d, 0x11, 0x36, 0xd8, 0xda, 0xbf, 0x32, 0x08, 0x83, 0x2b, - 0xdb, 0x24, 0x48, 0x8e, 0x41, 0xd4, 0x35, 0x61, 0xc2, 0x0b, 0xb6, 0x43, 0x7f, 0x9b, 0xb8, 0x1c, - 0x7f, 0xb8, 0xed, 0xfd, 0xb4, 0xa8, 0x64, 0x62, 0xcd, 0x60, 0x86, 0x33, 0xcc, 0x8f, 0xc2, 0x9a, - 0x7f, 0x1d, 0x86, 0xf8, 0xcc, 0x10, 0xa6, 0x7c, 0x8e, 0xcf, 0x9d, 0x0d, 0xac, 0x58, 0x41, 0xa9, - 0xcf, 0x81, 0xbb, 0xfb, 0x05, 0x23, 0xf4, 0x0e, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x83, 0x3c, - 0x4e, 0x9c, 0x66, 0xeb, 0x10, 0x76, 0xbc, 0x1a, 0x91, 0x55, 0x83, 0x13, 0xce, 0x70, 0x46, 0x9b, - 0x30, 0x4e, 0xcd, 0xc8, 0xb4, 0xaa, 0xe1, 0xbe, 0xab, 0x52, 0x6e, 0xbc, 0xab, 0x3a, 0x23, 0x6c, - 0xf2, 0xa5, 0x22, 0xa9, 0xc1, 0xcc, 0xce, 0x11, 0xa6, 0xdd, 0x28, 0x91, 0xc4, 0xed, 0x4d, 0x8e, - 0xa3, 0x92, 0x8d, 0x45, 0xb3, 0x54, 0x4c, 0xc9, 0x96, 0xc6, 0xac, 0xd8, 0xdf, 0xa6, 0x7b, 0x31, - 0x1d, 0xc3, 0x63, 0xd8, 0xbe, 0x2e, 0x9b, 0xdb, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x8f, 0xad, 0xeb, - 0x6d, 0x18, 0xd5, 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x06, 0x5c, 0x08, 0x29, 0xae, 0x54, 0x29, - 0x15, 0x89, 0x81, 0x53, 0x1a, 0x3a, 0x2e, 0x54, 0x05, 0xcd, 0x86, 0x67, 0x51, 0x05, 0x15, 0x33, - 0x8c, 0xfd, 0x22, 0xc0, 0xca, 0x7d, 0xd2, 0x58, 0xe4, 0x26, 0x9e, 0x76, 0x06, 0x67, 0xf5, 0x3e, - 0x83, 0xb3, 0xbf, 0x65, 0xc1, 0xc4, 0xea, 0xb2, 0xa1, 0xd3, 0xcf, 0x03, 0x70, 0xdd, 0xf8, 0xf6, - 0xed, 0xeb, 0xd2, 0xc7, 0xcc, 0x1d, 0x81, 0x0a, 0x8a, 0x35, 0x0a, 0xf4, 0x28, 0x94, 0xfd, 0x76, - 0x20, 0x54, 0xd6, 0xe1, 0xbd, 0xdd, 0xb9, 0xf2, 0xd5, 0x76, 0x80, 0x29, 0x4c, 0x8b, 0x83, 0x2a, - 0x17, 0x8e, 0x83, 0xca, 0x8f, 0x08, 0xfe, 0x7a, 0x19, 0xa6, 0x56, 0x7d, 0x72, 0xdf, 0x68, 0xf5, - 0xd3, 0x30, 0xe4, 0x46, 0xde, 0x36, 0x89, 0xb2, 0x8a, 0x40, 0x95, 0x41, 0xb1, 0xc0, 0x16, 0x0e, - 0xcd, 0x7a, 0xab, 0x73, 0x23, 0x3f, 0xba, 0xb0, 0xb4, 0xdc, 0x3e, 0xa3, 0x0d, 0x18, 0xe6, 0x67, - 0xb6, 0xf1, 0xcc, 0x20, 0x9b, 0x8a, 0xaf, 0x1e, 0xdc, 0x98, 0xec, 0xf8, 0xcc, 0x0b, 0x1f, 0x08, - 0x0f, 0x8a, 0x51, 0xb2, 0x4c, 0x40, 0xb1, 0x64, 0x3e, 0xfb, 0x71, 0x18, 0xd3, 0x29, 0xfb, 0x8a, - 0x8e, 0xf9, 0xab, 0x16, 0x9c, 0x5c, 0xf5, 0xc3, 0xc6, 0xdd, 0x4c, 0xec, 0xdc, 0xcb, 0x30, 0x4a, - 0x17, 0x53, 0x6c, 0x04, 0x96, 0x1a, 0x11, 0xb4, 0x02, 0x85, 0x75, 0x3a, 0xad, 0xd8, 0xcd, 0x9b, - 0x6b, 0xd5, 0x6e, 0x81, 0xb7, 0x02, 0x85, 0x75, 0x3a, 0xfb, 0xf7, 0x2c, 0x78, 0xfc, 0xd2, 0xf2, - 0x4a, 0x8d, 0x44, 0xb1, 0x17, 0x27, 0x24, 0x48, 0x3a, 0x62, 0x7f, 0xa9, 0xce, 0xe8, 0x6a, 0x4d, - 0x49, 0x75, 0xc6, 0x2a, 0x6b, 0x85, 0xc0, 0x3e, 0x2c, 0x01, 0xf0, 0xdf, 0xb4, 0xe0, 0xe4, 0x25, - 0x2f, 0xc1, 0xa4, 0x15, 0x66, 0xc3, 0x75, 0x23, 0xd2, 0x0a, 0x63, 0x2f, 0x09, 0xa3, 0x9d, 0x6c, - 0xb8, 0x2e, 0x56, 0x18, 0xac, 0x51, 0xf1, 0x9a, 0xb7, 0xbd, 0x98, 0xb6, 0xb4, 0x64, 0x9a, 0xba, - 0x58, 0xc0, 0xb1, 0xa2, 0xa0, 0x1d, 0x73, 0xbd, 0x88, 0xa9, 0x0c, 0x3b, 0x62, 0x05, 0xab, 0x8e, - 0x55, 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xdf, 0xb3, 0xe0, 0xd4, 0x25, 0xbf, 0x1d, 0x27, 0x24, 0xda, - 0x88, 0x8d, 0xc6, 0xbe, 0x08, 0x15, 0x22, 0x95, 0x7b, 0xd1, 0x56, 0xb5, 0x69, 0x28, 0xad, 0x9f, - 0xc7, 0x0a, 0x2b, 0xba, 0x02, 0x21, 0xa9, 0xfd, 0x05, 0x50, 0xfe, 0x66, 0x09, 0xc6, 0x2f, 0xaf, - 0xaf, 0xd7, 0x2e, 0x91, 0x44, 0x48, 0xc9, 0x7c, 0xa7, 0x14, 0xd6, 0x2c, 0xf2, 0x83, 0x94, 0x9f, - 0x76, 0xe2, 0xf9, 0xf3, 0xfc, 0x4a, 0xc7, 0xfc, 0x5a, 0x90, 0xdc, 0x88, 0xea, 0x49, 0xe4, 0x05, - 0x9b, 0x5d, 0x6d, 0x78, 0x29, 0xcb, 0xcb, 0xbd, 0x64, 0x39, 0x7a, 0x11, 0x86, 0xd8, 0x9d, 0x12, - 0xa9, 0x7c, 0x7c, 0x50, 0xe9, 0x09, 0x0c, 0xba, 0xbf, 0x3b, 0x57, 0xb9, 0x89, 0xd7, 0xf8, 0x1f, - 0x2c, 0x48, 0xd1, 0x5b, 0x30, 0xba, 0x95, 0x24, 0xad, 0xcb, 0xc4, 0x71, 0x49, 0x24, 0xe5, 0xc4, - 0xb9, 0x83, 0xe5, 0x04, 0x1d, 0x0e, 0x5e, 0x20, 0x5d, 0x5a, 0x29, 0x2c, 0xc6, 0x3a, 0x47, 0xbb, - 0x0e, 0x90, 0xe2, 0x1e, 0x90, 0x0d, 0x62, 0xff, 0x7c, 0x09, 0x86, 0x2f, 0x3b, 0x81, 0xeb, 0x93, - 0x08, 0xad, 0xc2, 0x00, 0xb9, 0x4f, 0x1a, 0x62, 0x23, 0xcf, 0x69, 0x7a, 0xba, 0xd9, 0x71, 0xbf, - 0x1a, 0xfd, 0x8f, 0x59, 0x79, 0x84, 0x61, 0x98, 0xb6, 0xfb, 0x92, 0x8a, 0xe4, 0x7e, 0x2e, 0x7f, - 0x14, 0xd4, 0xa4, 0xe0, 0x3b, 0xa5, 0x00, 0x61, 0xc9, 0x88, 0x79, 0xa0, 0x1a, 0xad, 0x3a, 0x15, - 0x6f, 0x49, 0x31, 0xcb, 0x6e, 0x7d, 0xb9, 0xc6, 0xc9, 0x05, 0x5f, 0xee, 0x81, 0x92, 0x40, 0x9c, - 0xb2, 0xb3, 0x2f, 0xc2, 0x34, 0x3b, 0x33, 0x75, 0x92, 0x2d, 0x63, 0xd5, 0xe4, 0x4e, 0x4f, 0xfb, - 0x87, 0x25, 0x38, 0xb1, 0x56, 0x5f, 0xae, 0x9b, 0xbe, 0xc3, 0x8b, 0x30, 0xc6, 0x37, 0x68, 0x3a, - 0xe9, 0x1c, 0x5f, 0x94, 0x57, 0x7e, 0xfe, 0x75, 0x0d, 0x87, 0x0d, 0x4a, 0xf4, 0x38, 0x94, 0xbd, - 0x77, 0x83, 0x6c, 0xe4, 0xdd, 0xda, 0xeb, 0xd7, 0x31, 0x85, 0x53, 0x34, 0xdd, 0xeb, 0xb9, 0x90, - 0x53, 0x68, 0xb5, 0xdf, 0xbf, 0x06, 0x13, 0x5e, 0xdc, 0x88, 0xbd, 0xb5, 0x80, 0x4a, 0x00, 0xa7, - 0x21, 0xa7, 0x6f, 0xaa, 0x9c, 0xd3, 0xa6, 0x2a, 0x2c, 0xce, 0x50, 0x6b, 0x12, 0x77, 0xb0, 0xb0, - 0xbe, 0x90, 0x1b, 0xd2, 0x4d, 0x55, 0xa1, 0x16, 0xeb, 0x5d, 0xcc, 0xe2, 0x78, 0x84, 0x2a, 0xc4, - 0x3b, 0x1c, 0x63, 0x89, 0xb3, 0xdf, 0x81, 0x8a, 0x0a, 0xc5, 0x92, 0x11, 0x88, 0x56, 0x8f, 0x08, - 0xc4, 0x7c, 0xc9, 0x24, 0x1d, 0xbf, 0xe5, 0xae, 0x8e, 0xdf, 0x7f, 0x66, 0x41, 0x1a, 0x4b, 0x82, - 0x30, 0x54, 0x5a, 0x21, 0x3b, 0xc8, 0x89, 0xe4, 0x89, 0xe9, 0x53, 0x39, 0x13, 0x96, 0x2f, 0x18, - 0x3e, 0xa5, 0x6a, 0xb2, 0x2c, 0x4e, 0xd9, 0xa0, 0xab, 0x30, 0xdc, 0x8a, 0x48, 0x3d, 0x61, 0xd7, - 0x07, 0xfa, 0xe0, 0xc8, 0xc7, 0x86, 0x97, 0xc4, 0x92, 0x85, 0xfd, 0x6f, 0x2c, 0x80, 0xab, 0x5e, - 0xd3, 0x4b, 0xb0, 0x13, 0x6c, 0x92, 0x63, 0xb0, 0x0a, 0xaf, 0xc3, 0x40, 0xdc, 0x22, 0x8d, 0x62, - 0x47, 0x71, 0x69, 0xcb, 0xea, 0x2d, 0xd2, 0x48, 0x3f, 0x07, 0xfd, 0x87, 0x19, 0x1f, 0xfb, 0x7b, - 0x00, 0x13, 0x29, 0x19, 0xd5, 0xcc, 0xd1, 0xf3, 0x46, 0xdc, 0xfc, 0xa3, 0x99, 0xb8, 0xf9, 0x0a, - 0xa3, 0xd6, 0x42, 0xe5, 0x13, 0x28, 0x37, 0x9d, 0xfb, 0xc2, 0x10, 0x78, 0xb9, 0x68, 0x83, 0x68, - 0x4d, 0xf3, 0xd7, 0x9c, 0xfb, 0x5c, 0xef, 0x7a, 0x4e, 0x4e, 0xa4, 0x6b, 0xce, 0xfd, 0x7d, 0x7e, - 0xe0, 0xc6, 0x16, 0x2c, 0xb5, 0x3c, 0xbe, 0xfc, 0xc7, 0xe9, 0x7f, 0x26, 0x43, 0x69, 0x75, 0xac, - 0x56, 0x2f, 0x10, 0x7e, 0xcc, 0x3e, 0x6b, 0xf5, 0x82, 0x6c, 0xad, 0x5e, 0x50, 0xa0, 0x56, 0x8f, - 0x05, 0x98, 0x0e, 0x0b, 0xf7, 0x3f, 0x8b, 0xce, 0x1b, 0xbd, 0xf0, 0xb1, 0xbe, 0xaa, 0x16, 0xe7, - 0x08, 0xbc, 0xfa, 0x05, 0xa9, 0x6c, 0x0a, 0x68, 0x6e, 0x13, 0x64, 0xd5, 0xe8, 0xef, 0x5b, 0x30, - 0x21, 0x7e, 0x63, 0xf2, 0x6e, 0x9b, 0xc4, 0x89, 0xd8, 0xd4, 0x3e, 0x75, 0x98, 0xd6, 0x08, 0x16, - 0xbc, 0x51, 0x1f, 0x95, 0x12, 0xc9, 0x44, 0xe6, 0xb6, 0x2d, 0xd3, 0x1e, 0xf4, 0x3d, 0x0b, 0xa6, - 0x9b, 0xce, 0x7d, 0x5e, 0x23, 0x87, 0x61, 0x27, 0xf1, 0x42, 0x11, 0x81, 0xb8, 0xda, 0xef, 0x3c, - 0xe9, 0x60, 0xc4, 0x9b, 0x2b, 0x83, 0x8b, 0xa6, 0xbb, 0x91, 0xe4, 0x36, 0xba, 0x6b, 0x0b, 0x67, - 0x37, 0x60, 0x44, 0x4e, 0xcc, 0x2e, 0x6a, 0x7e, 0x55, 0xdf, 0xbb, 0x73, 0x8c, 0xea, 0x79, 0xe9, - 0x1a, 0x9b, 0x7f, 0xbd, 0xed, 0x04, 0x89, 0x97, 0xec, 0x68, 0x66, 0x01, 0xab, 0x47, 0x4c, 0xc5, - 0x23, 0xad, 0xe7, 0x1d, 0x18, 0xd3, 0xe7, 0xdd, 0x91, 0xd6, 0xf5, 0x2e, 0x9c, 0xec, 0x32, 0xab, - 0x8e, 0xb4, 0xca, 0x7b, 0xf0, 0x68, 0xcf, 0xf9, 0x71, 0x94, 0x15, 0xdb, 0xbf, 0x69, 0xe9, 0xa2, - 0xf3, 0x18, 0x9c, 0x2e, 0xd7, 0x4c, 0xa7, 0xcb, 0xb9, 0xa2, 0x6b, 0xa8, 0x87, 0xe7, 0x65, 0x43, - 0x6f, 0x3e, 0xdd, 0x12, 0xd0, 0x3a, 0x0c, 0xf9, 0x14, 0x22, 0xcf, 0xbc, 0xce, 0xf7, 0xb3, 0x4a, - 0x53, 0xa5, 0x84, 0xc1, 0x63, 0x2c, 0x78, 0xd9, 0xdf, 0xb3, 0x60, 0xe0, 0xcf, 0xf1, 0x56, 0x4f, - 0x07, 0x6b, 0x71, 0x39, 0x7d, 0x1e, 0x3b, 0xf7, 0x56, 0xee, 0x27, 0x24, 0x88, 0x99, 0x0e, 0xda, - 0xeb, 0xd4, 0x7e, 0x94, 0x56, 0x25, 0x03, 0x25, 0x5e, 0x85, 0x71, 0xdf, 0xb9, 0x43, 0x7c, 0xe9, - 0x30, 0xce, 0x5a, 0x6c, 0x57, 0x75, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x0d, 0xdd, 0x9f, 0x2e, 0x94, - 0x24, 0x55, 0xd8, 0x70, 0xb6, 0x63, 0x93, 0x96, 0x9a, 0x0c, 0xf7, 0x9c, 0xa4, 0xb1, 0x25, 0xac, - 0x39, 0xd5, 0xdc, 0xdb, 0x14, 0x88, 0x39, 0x0e, 0x2d, 0xc2, 0xa4, 0x9c, 0xb1, 0xb7, 0xa8, 0x99, - 0x1f, 0x06, 0x42, 0xcf, 0x54, 0x37, 0x83, 0xb1, 0x89, 0xc6, 0x59, 0x7a, 0xf4, 0x71, 0x98, 0xa0, - 0x83, 0x13, 0xb6, 0x13, 0x19, 0x06, 0x32, 0xc8, 0xc2, 0x40, 0x58, 0x14, 0xf1, 0xba, 0x81, 0xc1, - 0x19, 0x4a, 0xfb, 0x2d, 0x38, 0x79, 0x35, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, - 0x82, 0xcd, 0xdc, 0xe3, 0x6b, 0xfd, 0x88, 0xb9, 0x94, 0x77, 0xc4, 0x6c, 0x47, 0x80, 0xf4, 0x0a, - 0x44, 0x00, 0xd3, 0x9b, 0x30, 0xec, 0xf1, 0xaa, 0xc4, 0xb4, 0x7d, 0x21, 0xcf, 0x1f, 0xd5, 0xd1, - 0x46, 0x2d, 0x20, 0x87, 0x03, 0xb0, 0x64, 0x49, 0x4d, 0x90, 0x6e, 0x0e, 0xac, 0x7c, 0x2b, 0xcf, - 0xfe, 0xeb, 0x16, 0x4c, 0x5e, 0xcf, 0x5c, 0x3b, 0x7d, 0x1a, 0x86, 0x78, 0xf2, 0x82, 0xac, 0x8b, - 0xa5, 0xce, 0xa0, 0x58, 0x60, 0x1f, 0xb8, 0x85, 0xff, 0xcb, 0x25, 0xa8, 0xb0, 0x50, 0xd8, 0x16, - 0x35, 0x27, 0x8e, 0x5e, 0x4d, 0xbd, 0x66, 0xa8, 0xa9, 0x39, 0x56, 0xa6, 0x6a, 0x58, 0x2f, 0x2d, - 0x15, 0xdd, 0x54, 0xd7, 0x31, 0x0b, 0x19, 0x98, 0x29, 0x43, 0x7e, 0x65, 0x6f, 0xc2, 0xbc, 0xbd, - 0x29, 0xaf, 0x6a, 0xb2, 0x43, 0x5f, 0x45, 0xfb, 0xd0, 0x1d, 0xfa, 0xaa, 0x96, 0xf5, 0x10, 0x4e, - 0x35, 0xad, 0xf1, 0x4c, 0x7c, 0x7f, 0x92, 0x05, 0x38, 0x3a, 0xbe, 0xf7, 0x05, 0xa2, 0x6e, 0x35, - 0xcf, 0x89, 0x80, 0x45, 0x01, 0xdd, 0x67, 0x72, 0x46, 0xfc, 0xe3, 0x97, 0xd6, 0xd3, 0x22, 0xf6, - 0x65, 0x98, 0xcc, 0x0c, 0x1d, 0x7a, 0x19, 0x06, 0x5b, 0x5b, 0x4e, 0x4c, 0x32, 0x71, 0x2c, 0x83, - 0x35, 0x0a, 0xdc, 0xdf, 0x9d, 0x9b, 0x50, 0x05, 0x18, 0x04, 0x73, 0x6a, 0xfb, 0x2b, 0x25, 0x18, - 0xb8, 0x1e, 0xba, 0xc7, 0x31, 0xd5, 0x2e, 0x1b, 0x53, 0xed, 0xe9, 0xfc, 0x94, 0x17, 0x3d, 0x67, - 0x59, 0x2d, 0x33, 0xcb, 0xce, 0x15, 0xe0, 0x75, 0xf0, 0x04, 0x6b, 0xc2, 0x28, 0x4b, 0xa9, 0x21, - 0x02, 0x79, 0x5e, 0x34, 0x2c, 0xab, 0xb9, 0x8c, 0x65, 0x35, 0xa9, 0x91, 0x6a, 0xf6, 0xd5, 0x33, - 0x30, 0x2c, 0x02, 0x47, 0xb2, 0xe1, 0x9d, 0x82, 0x16, 0x4b, 0xbc, 0xfd, 0xaf, 0xca, 0x60, 0xa4, - 0xf0, 0x40, 0xbf, 0x63, 0xc1, 0x7c, 0xc4, 0xaf, 0xca, 0xb8, 0xd5, 0x76, 0xe4, 0x05, 0x9b, 0xf5, - 0xc6, 0x16, 0x71, 0xdb, 0xbe, 0x17, 0x6c, 0xae, 0x6d, 0x06, 0xa1, 0x02, 0xaf, 0xdc, 0x27, 0x8d, - 0x36, 0xf3, 0xd3, 0x16, 0xce, 0x1c, 0xa2, 0x0e, 0x4d, 0x2f, 0xec, 0xed, 0xce, 0xcd, 0xe3, 0xbe, - 0x6a, 0xc1, 0x7d, 0xb6, 0x0a, 0xfd, 0x91, 0x05, 0x0b, 0x3c, 0x89, 0x45, 0xf1, 0x9e, 0x14, 0xb2, - 0x48, 0x6b, 0x92, 0x69, 0xca, 0x6e, 0x9d, 0x44, 0xcd, 0xa5, 0x57, 0xc4, 0x20, 0x2f, 0xd4, 0xfa, - 0xab, 0x15, 0xf7, 0xdb, 0x4c, 0xfb, 0xdf, 0x95, 0x61, 0x9c, 0x8e, 0x67, 0x7a, 0x71, 0xfd, 0x65, - 0x63, 0x9a, 0x3c, 0x91, 0x99, 0x26, 0x27, 0x0c, 0xe2, 0x07, 0x73, 0x67, 0x3d, 0x86, 0x13, 0xbe, - 0x13, 0x27, 0x97, 0x89, 0x13, 0x25, 0x77, 0x88, 0xc3, 0xce, 0x26, 0xb3, 0x71, 0x0f, 0x05, 0x8e, - 0x3b, 0x55, 0x30, 0xd2, 0xd5, 0x2c, 0x33, 0xdc, 0xc9, 0x1f, 0x6d, 0x03, 0x62, 0xe7, 0xa0, 0x91, - 0x13, 0xc4, 0xbc, 0x2f, 0x9e, 0xf0, 0xeb, 0xf6, 0x57, 0xeb, 0xac, 0xa8, 0x15, 0x5d, 0xed, 0xe0, - 0x86, 0xbb, 0xd4, 0xa0, 0x9d, 0x74, 0x0f, 0x16, 0x3d, 0xe9, 0x1e, 0xca, 0x89, 0xab, 0xfe, 0xaa, - 0x05, 0x27, 0xe9, 0x67, 0x31, 0x63, 0x70, 0x63, 0x14, 0xc2, 0x24, 0x9d, 0x76, 0x3e, 0x49, 0x24, - 0x4c, 0xac, 0xaf, 0x1c, 0xcd, 0xda, 0xe4, 0x93, 0xaa, 0x6f, 0x57, 0x4c, 0x66, 0x38, 0xcb, 0xdd, - 0xfe, 0x96, 0x05, 0x2c, 0xe2, 0xee, 0x18, 0x36, 0xb3, 0x4b, 0xe6, 0x66, 0x66, 0xe7, 0x4b, 0x8c, - 0x1e, 0xfb, 0xd8, 0x4b, 0x30, 0x45, 0xb1, 0xb5, 0x28, 0xbc, 0xbf, 0x23, 0x15, 0xed, 0x7c, 0x07, - 0xef, 0x57, 0x4b, 0x7c, 0xd9, 0xa8, 0x3b, 0x7f, 0xe8, 0x17, 0x2c, 0x18, 0x69, 0x38, 0x2d, 0xa7, - 0xc1, 0x13, 0x20, 0x15, 0xf0, 0xce, 0x18, 0xe5, 0xe7, 0x97, 0x45, 0x59, 0xee, 0x59, 0xf8, 0x88, - 0xec, 0xba, 0x04, 0xe7, 0x7a, 0x13, 0x54, 0xe5, 0xb3, 0x77, 0x61, 0xdc, 0x60, 0x76, 0xa4, 0x66, - 0xe8, 0x2f, 0x58, 0x5c, 0xe8, 0x2b, 0x53, 0xe1, 0x1e, 0x9c, 0x08, 0xb4, 0xff, 0x54, 0x9c, 0x49, - 0xcd, 0x78, 0xbe, 0xb8, 0x58, 0x67, 0x52, 0x50, 0x8b, 0x2e, 0xcc, 0x30, 0xc4, 0x9d, 0x75, 0xd8, - 0xbf, 0x6a, 0xc1, 0x23, 0x3a, 0xa1, 0x76, 0x49, 0x33, 0xcf, 0x6f, 0x5c, 0x85, 0x91, 0xb0, 0x45, - 0x22, 0x27, 0x35, 0x8b, 0xce, 0xc9, 0xf1, 0xbf, 0x21, 0xe0, 0xfb, 0xbb, 0x73, 0xd3, 0x3a, 0x77, - 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x88, 0x8d, 0x4b, 0x2c, 0xae, 0xd7, 0xb2, 0x84, 0x40, 0xec, - 0x50, 0x25, 0xc6, 0x02, 0x63, 0xff, 0x2d, 0x8b, 0x4f, 0x37, 0xbd, 0xe9, 0xe8, 0x8b, 0x30, 0xd5, - 0xa4, 0x16, 0xd4, 0xca, 0xfd, 0x16, 0xdd, 0x48, 0xd9, 0x71, 0xb2, 0x55, 0x64, 0xfb, 0xe8, 0xd1, - 0xdd, 0xa5, 0x19, 0xd1, 0xfa, 0xa9, 0x6b, 0x19, 0xb6, 0xb8, 0xa3, 0x22, 0xfb, 0x1f, 0x96, 0xf8, - 0x9a, 0x65, 0x3a, 0xdc, 0x33, 0x30, 0xdc, 0x0a, 0xdd, 0xe5, 0xb5, 0x2a, 0x16, 0x63, 0xa5, 0x84, - 0x4e, 0x8d, 0x83, 0xb1, 0xc4, 0xa3, 0x0b, 0x00, 0xe4, 0x7e, 0x42, 0xa2, 0xc0, 0xf1, 0xd5, 0x31, - 0xb0, 0x52, 0x95, 0x56, 0x14, 0x06, 0x6b, 0x54, 0xb4, 0x4c, 0x2b, 0x0a, 0xb7, 0x3d, 0x97, 0xdd, - 0x2e, 0x28, 0x9b, 0x65, 0x6a, 0x0a, 0x83, 0x35, 0x2a, 0x6a, 0xb7, 0xb6, 0x83, 0x98, 0x6f, 0x63, - 0xce, 0x1d, 0x91, 0xbf, 0x66, 0x24, 0xb5, 0x5b, 0x6f, 0xea, 0x48, 0x6c, 0xd2, 0xa2, 0x2b, 0x30, - 0x94, 0x38, 0xec, 0x70, 0x73, 0xb0, 0x48, 0xa4, 0xc8, 0x3a, 0xa5, 0xd5, 0x13, 0x06, 0xd1, 0xa2, - 0x58, 0xb0, 0xb0, 0xff, 0xa0, 0x02, 0x90, 0x6a, 0x5d, 0xe8, 0x2b, 0x9d, 0x0b, 0xfe, 0xa3, 0x45, - 0x55, 0xb6, 0x07, 0xb7, 0xda, 0xd1, 0x7b, 0x16, 0x8c, 0x3a, 0xbe, 0x1f, 0x36, 0x9c, 0x84, 0x0d, - 0x4f, 0xa9, 0xa8, 0xe8, 0x11, 0x2d, 0x59, 0x4c, 0xcb, 0xf2, 0xc6, 0xbc, 0x28, 0x0f, 0x1c, 0x35, - 0x4c, 0x6e, 0x7b, 0xf4, 0x26, 0xa0, 0x8f, 0x48, 0xad, 0x9d, 0x7f, 0xe1, 0xd9, 0xac, 0xd6, 0x5e, - 0x61, 0x02, 0x57, 0x53, 0xd8, 0xd1, 0x5b, 0x46, 0xbe, 0x97, 0x81, 0x22, 0x57, 0x44, 0x0d, 0x3d, - 0x24, 0x2f, 0xd5, 0x0b, 0xfa, 0xac, 0x1e, 0x52, 0x3d, 0x58, 0xe4, 0x0e, 0xb6, 0xa6, 0x0e, 0xe7, - 0x84, 0x53, 0x27, 0x30, 0xe9, 0x9a, 0x3b, 0xaf, 0x08, 0x0b, 0x7b, 0x21, 0xbf, 0x86, 0xcc, 0x96, - 0x9d, 0xee, 0xb5, 0x19, 0x04, 0xce, 0x56, 0x81, 0x3e, 0xcb, 0x03, 0xde, 0xd7, 0x82, 0x8d, 0x50, - 0x84, 0x86, 0x9d, 0x2f, 0xf0, 0xcd, 0x77, 0xe2, 0x84, 0x34, 0x69, 0x99, 0x74, 0x73, 0xbd, 0x2e, - 0xb8, 0x60, 0xc5, 0x0f, 0xad, 0xc3, 0x10, 0xbb, 0x11, 0x14, 0xcf, 0x8c, 0x14, 0xf1, 0xc4, 0x99, - 0x17, 0x61, 0xd3, 0xf5, 0xc3, 0xfe, 0xc6, 0x58, 0xf0, 0x42, 0x97, 0xe5, 0x55, 0xf8, 0x78, 0x2d, - 0xb8, 0x19, 0x13, 0x76, 0x15, 0xbe, 0xb2, 0xf4, 0xa1, 0xf4, 0x6e, 0x3b, 0x87, 0x77, 0xcd, 0x78, - 0x67, 0x94, 0xa4, 0x8a, 0x8d, 0xf8, 0x2f, 0x13, 0xe9, 0xcd, 0x40, 0x91, 0x86, 0x9a, 0x69, 0xf7, - 0xd2, 0xc1, 0xbe, 0x65, 0x32, 0xc3, 0x59, 0xee, 0xc7, 0xba, 0xa5, 0xce, 0x06, 0x30, 0x95, 0x5d, - 0x94, 0x47, 0xba, 0x85, 0xff, 0x64, 0x00, 0x26, 0xcc, 0xc9, 0x81, 0x16, 0xa0, 0x22, 0x98, 0xa8, - 0xc4, 0x5a, 0x6a, 0x0d, 0x5c, 0x93, 0x08, 0x9c, 0xd2, 0xb0, 0x14, 0x63, 0xac, 0xb8, 0x16, 0x14, - 0x94, 0xa6, 0x18, 0x53, 0x18, 0xac, 0x51, 0x51, 0x4d, 0xf8, 0x4e, 0x18, 0x26, 0x6a, 0x27, 0x50, - 0xf3, 0x66, 0x89, 0x41, 0xb1, 0xc0, 0xd2, 0x1d, 0xe0, 0x2e, 0xfd, 0x98, 0xbe, 0xe9, 0x55, 0x54, - 0x3b, 0xc0, 0x15, 0x1d, 0x89, 0x4d, 0x5a, 0xba, 0xa3, 0x85, 0x31, 0x9b, 0x88, 0x42, 0xdf, 0x4e, - 0x83, 0xac, 0xea, 0xfc, 0x96, 0x9c, 0xc4, 0xa3, 0xcf, 0xc0, 0x23, 0xea, 0x52, 0x1b, 0xe6, 0x5e, - 0x5a, 0x59, 0xe3, 0x90, 0x61, 0x32, 0x3f, 0xb2, 0xdc, 0x9d, 0x0c, 0xf7, 0x2a, 0x8f, 0x5e, 0x83, - 0x09, 0xa1, 0x2b, 0x4b, 0x8e, 0xc3, 0xe6, 0x09, 0xfc, 0x15, 0x03, 0x8b, 0x33, 0xd4, 0xa8, 0x0a, - 0x53, 0x14, 0xc2, 0x94, 0x54, 0xc9, 0x81, 0x5f, 0xce, 0x53, 0x5b, 0xfd, 0x95, 0x0c, 0x1e, 0x77, - 0x94, 0x40, 0x8b, 0x30, 0xc9, 0x95, 0x15, 0x6a, 0x18, 0xb2, 0xef, 0x20, 0xe2, 0x39, 0xd5, 0x42, - 0xb8, 0x61, 0xa2, 0x71, 0x96, 0x1e, 0x5d, 0x84, 0x31, 0x27, 0x6a, 0x6c, 0x79, 0x09, 0x69, 0x24, - 0xed, 0x88, 0x27, 0x9a, 0xd0, 0x42, 0x18, 0x16, 0x35, 0x1c, 0x36, 0x28, 0xed, 0x2f, 0xc0, 0xc9, - 0x2e, 0xc1, 0xe3, 0x74, 0xe2, 0x38, 0x2d, 0x4f, 0xf6, 0x29, 0x13, 0x2e, 0xb5, 0x58, 0x5b, 0x93, - 0xbd, 0xd1, 0xa8, 0xe8, 0xec, 0x64, 0xee, 0x69, 0x2d, 0xef, 0xa5, 0x9a, 0x9d, 0xab, 0x12, 0x81, - 0x53, 0x1a, 0xfb, 0xcf, 0x2a, 0xa0, 0x79, 0x6f, 0x0a, 0x84, 0xc8, 0x5c, 0x84, 0x31, 0x99, 0xca, - 0x55, 0x4b, 0xa1, 0xa8, 0xba, 0x79, 0x49, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, 0x90, 0x3e, 0xa9, - 0x6c, 0x70, 0x96, 0x72, 0x56, 0xe1, 0x94, 0x06, 0x9d, 0x87, 0x91, 0x98, 0xf8, 0x1b, 0x57, 0xbd, - 0xe0, 0xae, 0x98, 0xd8, 0x4a, 0x32, 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x04, 0xe5, 0xb6, 0xe7, - 0x8a, 0xa9, 0x2c, 0xd5, 0x86, 0xf2, 0xcd, 0xb5, 0xea, 0xfe, 0xee, 0xdc, 0x13, 0xbd, 0xf2, 0xda, - 0x52, 0xfb, 0x3c, 0x9e, 0xa7, 0xcb, 0x8f, 0x16, 0xee, 0xe6, 0xa7, 0x1f, 0xea, 0xd3, 0x4f, 0x7f, - 0x01, 0x40, 0xf4, 0x5a, 0xce, 0xe5, 0x72, 0xfa, 0xd5, 0x2e, 0x29, 0x0c, 0xd6, 0xa8, 0xa8, 0x95, - 0xdf, 0x88, 0x88, 0x23, 0x0d, 0x61, 0x1e, 0xd4, 0x3c, 0x72, 0x78, 0x2b, 0x7f, 0x39, 0xcb, 0x0c, - 0x77, 0xf2, 0x47, 0x21, 0x9c, 0x70, 0xe9, 0x42, 0x32, 0x2a, 0xad, 0xf4, 0x1f, 0x49, 0x4d, 0x2b, - 0xac, 0x66, 0x19, 0xe1, 0x4e, 0xde, 0xe8, 0xf3, 0x30, 0x2b, 0x81, 0x9d, 0xd7, 0x56, 0xd9, 0x72, - 0x29, 0x2f, 0x9d, 0xd9, 0xdb, 0x9d, 0x9b, 0xad, 0xf6, 0xa4, 0xc2, 0x07, 0x70, 0x40, 0x6f, 0xc2, - 0x10, 0x3b, 0xd7, 0x89, 0x67, 0x46, 0xd9, 0x8e, 0xf7, 0x52, 0x91, 0x78, 0x7c, 0x3a, 0xeb, 0xe7, - 0xd9, 0xe9, 0x90, 0x88, 0x34, 0x4d, 0x0f, 0xcb, 0x18, 0x10, 0x0b, 0x9e, 0xa8, 0x05, 0xa3, 0x4e, - 0x10, 0x84, 0x89, 0xc3, 0x15, 0xb1, 0xb1, 0x22, 0xba, 0xa4, 0x56, 0xc5, 0x62, 0x5a, 0x96, 0xd7, - 0xa3, 0x82, 0xd7, 0x34, 0x0c, 0xd6, 0xab, 0x40, 0xf7, 0x60, 0x32, 0xbc, 0x47, 0x05, 0xa6, 0x3c, - 0xda, 0x88, 0x67, 0xc6, 0xcd, 0x8e, 0xe5, 0x38, 0x6a, 0x8d, 0xc2, 0x9a, 0x24, 0x33, 0x99, 0xe2, - 0x6c, 0x2d, 0x68, 0xde, 0x70, 0x57, 0x4f, 0xa4, 0xf1, 0xd4, 0xa9, 0xbb, 0x5a, 0xf7, 0x4e, 0xb3, - 0xab, 0xd1, 0x3c, 0x86, 0x92, 0x49, 0x84, 0xc9, 0xcc, 0xd5, 0xe8, 0x14, 0x85, 0x75, 0xba, 0xd9, - 0x8f, 0xc1, 0xa8, 0x36, 0xf0, 0xfd, 0x04, 0xee, 0xce, 0xbe, 0x06, 0x53, 0xd9, 0x01, 0xed, 0x2b, - 0xf0, 0xf7, 0x7f, 0x95, 0x60, 0xb2, 0xcb, 0xb9, 0xd1, 0x5d, 0x8f, 0x05, 0x9f, 0x1b, 0xa2, 0xef, - 0x8a, 0x17, 0xb8, 0x98, 0x61, 0x4c, 0x01, 0x56, 0x2a, 0x20, 0xc0, 0xa4, 0x34, 0x2d, 0xf7, 0x94, - 0xa6, 0x42, 0x68, 0x0d, 0xbc, 0x1f, 0xa1, 0x65, 0xee, 0x13, 0x83, 0x85, 0xf6, 0x89, 0x07, 0x20, - 0xe8, 0x8c, 0xad, 0x66, 0xb8, 0xc0, 0x56, 0xf3, 0xcd, 0x12, 0x4c, 0xa5, 0x41, 0xce, 0x22, 0xbf, - 0xf3, 0xd1, 0x1f, 0x43, 0xac, 0x1b, 0xc7, 0x10, 0x79, 0xe9, 0x9b, 0x33, 0xed, 0xeb, 0x79, 0x24, - 0xf1, 0x66, 0xe6, 0x48, 0xe2, 0xa5, 0x3e, 0xf9, 0x1e, 0x7c, 0x3c, 0xf1, 0xdd, 0x12, 0x9c, 0xca, - 0x16, 0x59, 0xf6, 0x1d, 0xaf, 0x79, 0x0c, 0xe3, 0xf5, 0x19, 0x63, 0xbc, 0x5e, 0xe9, 0xaf, 0x5f, - 0xac, 0x91, 0x3d, 0x07, 0xcd, 0xc9, 0x0c, 0xda, 0xc7, 0x0e, 0xc3, 0xfc, 0xe0, 0x91, 0xfb, 0x7d, - 0x0b, 0x1e, 0xed, 0x5a, 0xee, 0x18, 0x1c, 0xaf, 0x6f, 0x98, 0x8e, 0xd7, 0x17, 0x0f, 0xd1, 0xbb, - 0x1e, 0x9e, 0xd8, 0x5f, 0x2b, 0xf7, 0xe8, 0x15, 0x73, 0x4d, 0xdd, 0x80, 0x51, 0xa7, 0xd1, 0x20, - 0x71, 0x7c, 0x2d, 0x74, 0x55, 0x92, 0xa5, 0xe7, 0xd9, 0xde, 0x92, 0x82, 0xf7, 0x77, 0xe7, 0x66, - 0xb3, 0x2c, 0x52, 0x34, 0xd6, 0x39, 0x98, 0xe9, 0xdf, 0x4a, 0x47, 0x94, 0xfe, 0xed, 0x02, 0xc0, - 0xb6, 0xb2, 0x62, 0xb3, 0x1e, 0x2f, 0xcd, 0xbe, 0xd5, 0xa8, 0xd0, 0x5f, 0x66, 0x1a, 0x21, 0x0f, - 0xd2, 0x18, 0x30, 0xef, 0x4b, 0xe6, 0x7c, 0x3f, 0x3d, 0xe0, 0x83, 0x5f, 0xcb, 0x54, 0xde, 0x41, - 0xc5, 0x12, 0x7d, 0x0a, 0xa6, 0x62, 0x7e, 0xf9, 0x7f, 0xd9, 0x77, 0x62, 0x16, 0xdd, 0x2f, 0xe4, - 0x29, 0xbb, 0x61, 0x59, 0xcf, 0xe0, 0x70, 0x07, 0xb5, 0xfd, 0x9d, 0x32, 0x7c, 0xf0, 0x80, 0x69, - 0x8b, 0x16, 0xcd, 0x53, 0xdb, 0xe7, 0xb2, 0xfe, 0x9f, 0xd9, 0xae, 0x85, 0x0d, 0x87, 0x50, 0xe6, - 0x6b, 0x97, 0xde, 0xf7, 0xd7, 0xfe, 0xba, 0xee, 0xad, 0xe3, 0x71, 0x9b, 0x97, 0x0e, 0xbd, 0x30, - 0x7f, 0x5a, 0x9d, 0xf5, 0x5f, 0xb6, 0xe0, 0x89, 0xae, 0xdd, 0x32, 0xa2, 0x44, 0x16, 0xa0, 0xd2, - 0xa0, 0x40, 0xed, 0x2e, 0x4e, 0x7a, 0x09, 0x4e, 0x22, 0x70, 0x4a, 0x63, 0x04, 0x83, 0x94, 0x72, - 0x83, 0x41, 0x7e, 0xd7, 0x82, 0xe9, 0x6c, 0x23, 0x8e, 0x41, 0x6e, 0xd5, 0x4d, 0xb9, 0x35, 0xdf, - 0xdf, 0xc7, 0xef, 0x21, 0xb2, 0xde, 0x9b, 0x80, 0xd3, 0x1d, 0xbb, 0x1e, 0x1f, 0xc5, 0x9f, 0xb3, - 0xe0, 0xc4, 0x26, 0xd3, 0xde, 0xb5, 0x0b, 0x4f, 0xa2, 0x5f, 0x39, 0xb7, 0xc4, 0x0e, 0xbc, 0x27, - 0xc5, 0x6d, 0x91, 0x0e, 0x12, 0xdc, 0x59, 0x19, 0xfa, 0x9a, 0x05, 0xd3, 0xce, 0xbd, 0xb8, 0xe3, - 0xf5, 0x11, 0x31, 0x91, 0x5e, 0xcb, 0x71, 0x96, 0xe5, 0xbc, 0x5b, 0xb2, 0x34, 0xb3, 0xb7, 0x3b, - 0x37, 0xdd, 0x8d, 0x0a, 0x77, 0xad, 0x95, 0x7e, 0xdf, 0x2d, 0x71, 0x9d, 0xa2, 0xd8, 0xd5, 0xbd, - 0x6e, 0x97, 0x2f, 0xb8, 0x58, 0x93, 0x18, 0xac, 0x38, 0xa2, 0xb7, 0xa1, 0xb2, 0x29, 0xef, 0x38, - 0x65, 0xc5, 0x66, 0x8f, 0x61, 0xee, 0x76, 0x25, 0x8a, 0xc7, 0xee, 0x2b, 0x14, 0x4e, 0x99, 0xa2, - 0xcb, 0x50, 0x0e, 0x36, 0x62, 0x71, 0x9b, 0x38, 0x2f, 0x06, 0xc8, 0x8c, 0xbc, 0xe2, 0x17, 0x30, - 0xaf, 0xaf, 0xd6, 0x31, 0x65, 0x41, 0x39, 0x45, 0x77, 0x5c, 0xe1, 0x25, 0xce, 0xe1, 0x84, 0x97, - 0xaa, 0x9d, 0x9c, 0xf0, 0x52, 0x15, 0x53, 0x16, 0xa8, 0x06, 0x83, 0xec, 0xb2, 0x86, 0x70, 0x01, - 0xe7, 0x5c, 0x39, 0xef, 0xb8, 0x92, 0xc2, 0xb3, 0x14, 0x32, 0x30, 0xe6, 0x8c, 0xd0, 0x3a, 0x0c, - 0x35, 0x58, 0xa2, 0x7d, 0x61, 0x9b, 0xe7, 0x25, 0x63, 0xe8, 0x48, 0xca, 0xcf, 0xcf, 0xbd, 0x38, - 0x1c, 0x0b, 0x5e, 0x8c, 0x2b, 0x69, 0x6d, 0x6d, 0xc4, 0xc2, 0xf8, 0xce, 0xe3, 0xda, 0xf1, 0x64, - 0x82, 0xe0, 0xca, 0xe0, 0x58, 0xf0, 0x42, 0x55, 0x28, 0x6d, 0x34, 0x44, 0xb2, 0xd3, 0x1c, 0xd7, - 0xaf, 0x79, 0x9b, 0x76, 0x69, 0x68, 0x6f, 0x77, 0xae, 0xb4, 0xba, 0x8c, 0x4b, 0x1b, 0x0d, 0xf4, - 0x06, 0x0c, 0x6f, 0xf0, 0xfb, 0x91, 0x22, 0xb1, 0xe9, 0x0b, 0x79, 0x97, 0x38, 0x3b, 0x2e, 0x53, - 0xf2, 0xfb, 0x19, 0x02, 0x81, 0x25, 0x3b, 0x96, 0xf3, 0x4d, 0xdd, 0xf8, 0x14, 0x99, 0x4d, 0xe7, - 0xfb, 0xbb, 0x21, 0x2a, 0x6c, 0x52, 0x05, 0xc5, 0x1a, 0x47, 0x3a, 0xe7, 0x1d, 0xf9, 0x66, 0x08, - 0xcb, 0x6a, 0x9a, 0x3b, 0xe7, 0xbb, 0x3e, 0x31, 0xc2, 0xe7, 0xbc, 0x42, 0xe1, 0x94, 0x29, 0x6a, - 0xc3, 0xf8, 0x76, 0xdc, 0xda, 0x22, 0x72, 0xe9, 0xb3, 0x54, 0xa7, 0xa3, 0x17, 0x3e, 0x91, 0x93, - 0xbf, 0x56, 0x14, 0xf1, 0xa2, 0xa4, 0xed, 0xf8, 0x1d, 0x12, 0x8c, 0x25, 0xd9, 0xba, 0xa5, 0xb3, - 0xc5, 0x66, 0x2d, 0xf4, 0x93, 0xbc, 0xdb, 0x0e, 0xef, 0xec, 0x24, 0x44, 0xa4, 0x42, 0xcd, 0xf9, - 0x24, 0xaf, 0x73, 0xe2, 0xce, 0x4f, 0x22, 0x10, 0x58, 0xb2, 0x53, 0x43, 0xc6, 0xa4, 0xf1, 0x54, - 0xe1, 0x21, 0xeb, 0xe8, 0x43, 0x3a, 0x64, 0x4c, 0xfa, 0xa6, 0x4c, 0x99, 0xd4, 0x6d, 0x6d, 0x85, - 0x49, 0x18, 0x64, 0x64, 0xff, 0x89, 0x22, 0x52, 0xb7, 0xd6, 0xa5, 0x64, 0xa7, 0xd4, 0xed, 0x46, - 0x85, 0xbb, 0xd6, 0x8a, 0x02, 0x98, 0x68, 0x85, 0x51, 0x72, 0x2f, 0x8c, 0xe4, 0x3c, 0x44, 0x85, - 0x6c, 0x44, 0xa3, 0x8c, 0xa8, 0x9b, 0x85, 0xe1, 0x9a, 0x18, 0x9c, 0xe1, 0x6e, 0xff, 0xea, 0x50, - 0xe7, 0xf6, 0xce, 0x14, 0xf8, 0xbf, 0xd9, 0x79, 0x5e, 0xfa, 0xa9, 0xfe, 0xed, 0xd4, 0x07, 0x78, - 0x72, 0xfa, 0x35, 0x0b, 0x4e, 0xb7, 0xba, 0x6e, 0xde, 0x62, 0x83, 0xec, 0xd7, 0xdc, 0xe5, 0x83, - 0xa4, 0xf2, 0x0a, 0x77, 0xc7, 0xe3, 0x1e, 0x75, 0x66, 0x55, 0xde, 0xf2, 0xfb, 0x56, 0x79, 0x6f, - 0xc3, 0x08, 0xd3, 0xd1, 0xd2, 0x8c, 0x24, 0x7d, 0x26, 0xef, 0x60, 0x5b, 0xed, 0xb2, 0x60, 0x81, - 0x15, 0x33, 0x3a, 0x70, 0x8f, 0x67, 0x3b, 0x81, 0x09, 0x43, 0x8b, 0xdc, 0xbb, 0xdc, 0x9e, 0x58, - 0x15, 0x23, 0xf1, 0x78, 0xed, 0x20, 0xe2, 0xfd, 0x3c, 0x02, 0x7c, 0x70, 0x65, 0xa8, 0xda, 0xc5, - 0xa0, 0x19, 0x32, 0x0f, 0x47, 0xf2, 0x8d, 0x9a, 0xe3, 0x55, 0xc4, 0xff, 0x91, 0xd5, 0x45, 0x6f, - 0xe4, 0xc6, 0xd3, 0x27, 0x4c, 0xe3, 0xe9, 0xe9, 0xac, 0xf1, 0xd4, 0xe1, 0x32, 0x31, 0xec, 0xa6, - 0xe2, 0xd9, 0x38, 0x8b, 0xa6, 0x5c, 0xb1, 0x7d, 0x38, 0x9b, 0x27, 0x94, 0x58, 0xc0, 0x94, 0xab, - 0x8e, 0x0a, 0xd3, 0x80, 0x29, 0x77, 0xad, 0x8a, 0x19, 0xa6, 0xe8, 0xad, 0x7d, 0xfb, 0xe7, 0x4b, - 0x50, 0xae, 0x85, 0xee, 0x31, 0xb8, 0x80, 0x2e, 0x19, 0x2e, 0xa0, 0xa7, 0x72, 0x5f, 0x7a, 0xeb, - 0xe9, 0xf0, 0xb9, 0x91, 0x71, 0xf8, 0x7c, 0x38, 0x9f, 0xd5, 0xc1, 0xee, 0x9d, 0xef, 0x95, 0x41, - 0x7f, 0xab, 0x0e, 0xfd, 0xa7, 0xc3, 0xc4, 0xd1, 0x96, 0x8b, 0x3d, 0x5f, 0x27, 0xea, 0x60, 0xf1, - 0x56, 0xf2, 0xf6, 0xdd, 0x4f, 0x6d, 0x38, 0xed, 0x6d, 0xe2, 0x6d, 0x6e, 0x25, 0xc4, 0xcd, 0x76, - 0xec, 0xf8, 0xc2, 0x69, 0xff, 0xd4, 0x82, 0xc9, 0x4c, 0xed, 0xc8, 0xef, 0x76, 0x6d, 0xe7, 0x90, - 0x4e, 0x9d, 0x13, 0xb9, 0xf7, 0x7c, 0xe6, 0x01, 0x94, 0x6f, 0x5e, 0x3a, 0x4e, 0x98, 0x0e, 0xa9, - 0x9c, 0xf7, 0x31, 0xd6, 0x28, 0xd0, 0xcb, 0x30, 0x9a, 0x84, 0xad, 0xd0, 0x0f, 0x37, 0x77, 0xae, - 0x10, 0x99, 0x4f, 0x42, 0x9d, 0x6b, 0xac, 0xa7, 0x28, 0xac, 0xd3, 0xd9, 0xdf, 0x2f, 0x43, 0xf6, - 0xa5, 0xc3, 0xbf, 0x98, 0xa7, 0x3f, 0x3d, 0xf3, 0xf4, 0x0f, 0x2d, 0x98, 0xa2, 0xb5, 0xb3, 0x00, - 0x17, 0x19, 0xf6, 0xaa, 0x9e, 0x06, 0xb0, 0x0e, 0x78, 0x1a, 0xe0, 0x69, 0x2a, 0xed, 0xdc, 0xb0, - 0x9d, 0x08, 0x57, 0x8f, 0x26, 0xc4, 0x28, 0x14, 0x0b, 0xac, 0xa0, 0x23, 0x51, 0x24, 0xee, 0x07, - 0xe9, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0x97, 0x03, 0x06, 0x7a, 0xbc, 0x1c, 0xc0, 0x32, 0x32, - 0x89, 0xa0, 0x0a, 0xa1, 0x56, 0x68, 0x19, 0x99, 0x64, 0xb4, 0x45, 0x4a, 0x63, 0x7f, 0xbb, 0x0c, - 0x63, 0xb5, 0xd0, 0x4d, 0xe3, 0xd9, 0x5f, 0x32, 0xe2, 0xd9, 0xcf, 0x66, 0xe2, 0xd9, 0xa7, 0x74, - 0xda, 0x07, 0x13, 0xce, 0x2e, 0x32, 0x77, 0xb1, 0xb7, 0x2d, 0x0e, 0x19, 0xca, 0x6e, 0x64, 0xee, - 0x52, 0x8c, 0xb0, 0xc9, 0xf7, 0x67, 0x29, 0x84, 0xfd, 0xff, 0x58, 0x30, 0x51, 0x0b, 0x5d, 0x3a, - 0x41, 0x7f, 0x96, 0x66, 0xa3, 0x9e, 0xef, 0x6b, 0xe8, 0x80, 0x7c, 0x5f, 0xff, 0xc2, 0x82, 0xe1, - 0x5a, 0xe8, 0x1e, 0x83, 0x1b, 0x74, 0xd5, 0x74, 0x83, 0x3e, 0x91, 0x2b, 0x79, 0x7b, 0x78, 0x3e, - 0xbf, 0x53, 0x86, 0x71, 0xda, 0xe2, 0x70, 0x53, 0x7e, 0x2f, 0x63, 0x6c, 0xac, 0x02, 0x63, 0x43, - 0x55, 0xc2, 0xd0, 0xf7, 0xc3, 0x7b, 0xd9, 0x6f, 0xb7, 0xca, 0xa0, 0x58, 0x60, 0xd1, 0x79, 0x18, - 0x69, 0x45, 0x64, 0xdb, 0x0b, 0xdb, 0x71, 0xf6, 0xae, 0x61, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0x2f, - 0xc1, 0x58, 0xec, 0x05, 0x0d, 0x22, 0x43, 0x2e, 0x06, 0x58, 0xc8, 0x05, 0x4f, 0xad, 0xa8, 0xc1, - 0xb1, 0x41, 0x85, 0x6e, 0x43, 0x85, 0xfd, 0x67, 0x2b, 0xa8, 0xff, 0xd4, 0xff, 0x3c, 0x9f, 0x98, - 0x64, 0x80, 0x53, 0x5e, 0xe8, 0x02, 0x40, 0x22, 0x83, 0x43, 0x62, 0x91, 0x15, 0x45, 0xe9, 0xa5, - 0x2a, 0x6c, 0x24, 0xc6, 0x1a, 0x15, 0x7a, 0x0e, 0x2a, 0x89, 0xe3, 0xf9, 0x57, 0xbd, 0x80, 0xc4, - 0x22, 0xb8, 0x46, 0xa4, 0x49, 0x16, 0x40, 0x9c, 0xe2, 0xe9, 0x7e, 0xcf, 0x6e, 0x3a, 0xf3, 0x67, - 0x45, 0x46, 0x18, 0x35, 0xdb, 0xef, 0xaf, 0x2a, 0x28, 0xd6, 0x28, 0xec, 0x8b, 0x70, 0xaa, 0x16, - 0xba, 0xd4, 0x88, 0x5f, 0x0d, 0xa3, 0x7b, 0x4e, 0xe4, 0xca, 0xef, 0x37, 0x27, 0xb3, 0xf3, 0xd2, - 0x3d, 0x79, 0x90, 0x7b, 0x06, 0x8d, 0x6c, 0xbb, 0x2f, 0xb2, 0x1d, 0xbf, 0xcf, 0x8b, 0x12, 0x3f, - 0x2a, 0x01, 0xaa, 0xb1, 0xf0, 0x15, 0xe3, 0x15, 0x9a, 0x2d, 0x98, 0x88, 0xc9, 0x55, 0x2f, 0x68, - 0xdf, 0x17, 0xac, 0x8a, 0xdd, 0x4c, 0xa9, 0xaf, 0xe8, 0x65, 0xb8, 0x3f, 0xc2, 0x84, 0xe1, 0x0c, - 0x5f, 0x3a, 0x98, 0x51, 0x3b, 0x58, 0x8c, 0x6f, 0xc6, 0x24, 0x12, 0xaf, 0xae, 0xb0, 0xc1, 0xc4, - 0x12, 0x88, 0x53, 0x3c, 0x9d, 0x3c, 0xec, 0xcf, 0xf5, 0x30, 0xc0, 0x61, 0x98, 0xc8, 0xe9, 0xc6, - 0xb2, 0xf0, 0x6b, 0x70, 0x6c, 0x50, 0xa1, 0x55, 0x40, 0x71, 0xbb, 0xd5, 0xf2, 0xd9, 0x89, 0xa0, - 0xe3, 0x5f, 0x8a, 0xc2, 0x76, 0x8b, 0x47, 0x31, 0x8b, 0x04, 0xf6, 0xf5, 0x0e, 0x2c, 0xee, 0x52, - 0x82, 0x0a, 0x8b, 0x8d, 0x98, 0xfd, 0x16, 0xd7, 0x9e, 0xb9, 0x57, 0xb1, 0xce, 0x40, 0x58, 0xe2, - 0xec, 0x2f, 0xb1, 0x0d, 0x8e, 0x3d, 0x87, 0x91, 0xb4, 0x23, 0x82, 0x9a, 0x30, 0xde, 0x62, 0x9b, - 0x58, 0x12, 0x85, 0xbe, 0x4f, 0xa4, 0x7e, 0x79, 0xb8, 0x00, 0x1a, 0x9e, 0x00, 0x5f, 0x67, 0x87, - 0x4d, 0xee, 0xf6, 0x2f, 0x4e, 0x30, 0x59, 0x25, 0x0e, 0x65, 0x87, 0x45, 0xa8, 0xac, 0xd0, 0xe4, - 0x3e, 0x54, 0xe4, 0x61, 0xab, 0x74, 0x1f, 0x10, 0x81, 0xb7, 0x58, 0x72, 0x41, 0x9f, 0x63, 0x81, - 0xe0, 0x5c, 0x40, 0x14, 0x7f, 0xae, 0x8f, 0xd3, 0x1b, 0x41, 0xe0, 0x82, 0x05, 0xd6, 0xd8, 0xa1, - 0xab, 0x30, 0x2e, 0x5e, 0x4f, 0x10, 0x6e, 0x8a, 0xb2, 0x61, 0x62, 0x8f, 0x63, 0x1d, 0xb9, 0x9f, - 0x05, 0x60, 0xb3, 0x30, 0xda, 0x84, 0xc7, 0xb5, 0xd7, 0x81, 0xba, 0x04, 0x7b, 0x71, 0xc9, 0xf3, - 0xc4, 0xde, 0xee, 0xdc, 0xe3, 0xeb, 0x07, 0x11, 0xe2, 0x83, 0xf9, 0xa0, 0x1b, 0x70, 0xca, 0x69, - 0x24, 0xde, 0x36, 0xa9, 0x12, 0xc7, 0xf5, 0xbd, 0x80, 0x98, 0x77, 0xe3, 0x1f, 0xdd, 0xdb, 0x9d, - 0x3b, 0xb5, 0xd8, 0x8d, 0x00, 0x77, 0x2f, 0x87, 0x3e, 0x01, 0x15, 0x37, 0x88, 0xc5, 0x18, 0x0c, - 0x19, 0x8f, 0x61, 0x55, 0xaa, 0xd7, 0xeb, 0xaa, 0xff, 0xe9, 0x1f, 0x9c, 0x16, 0x40, 0xef, 0xf2, - 0xc7, 0xde, 0x95, 0x35, 0xc3, 0x1f, 0x61, 0x7b, 0xa5, 0x90, 0xfd, 0x6c, 0xdc, 0x58, 0xe1, 0x1e, - 0x3c, 0x15, 0x54, 0x69, 0x5c, 0x66, 0x31, 0xaa, 0x40, 0x9f, 0x06, 0x14, 0x93, 0x68, 0xdb, 0x6b, - 0x90, 0xc5, 0x06, 0xcb, 0x47, 0xca, 0x7c, 0x3c, 0x23, 0xc6, 0xed, 0x02, 0x54, 0xef, 0xa0, 0xc0, - 0x5d, 0x4a, 0xa1, 0xcb, 0x54, 0xf2, 0xe8, 0x50, 0x11, 0x03, 0x2b, 0x15, 0xc3, 0x99, 0x2a, 0x69, - 0x45, 0xa4, 0xe1, 0x24, 0xc4, 0x35, 0x39, 0xe2, 0x4c, 0x39, 0xba, 0x2f, 0xa9, 0x94, 0xf3, 0x60, - 0x46, 0x6e, 0x76, 0xa6, 0x9d, 0xa7, 0x76, 0xd6, 0x56, 0x18, 0x27, 0xd7, 0x49, 0x72, 0x2f, 0x8c, - 0xee, 0xb2, 0x93, 0x86, 0x11, 0x2d, 0xb9, 0x5b, 0x8a, 0xc2, 0x3a, 0x1d, 0xd5, 0xa1, 0xd8, 0x11, - 0xd7, 0x5a, 0x95, 0x9d, 0x1f, 0x8c, 0xa4, 0x6b, 0xe7, 0x32, 0x07, 0x63, 0x89, 0x97, 0xa4, 0x6b, - 0xb5, 0x65, 0x76, 0x16, 0x90, 0x21, 0x5d, 0xab, 0x2d, 0x63, 0x89, 0x47, 0x61, 0xe7, 0x93, 0x63, - 0x13, 0x45, 0xce, 0x65, 0x3a, 0x25, 0x79, 0xc1, 0x57, 0xc7, 0xee, 0xc3, 0x94, 0x7a, 0xf6, 0x8c, - 0xe7, 0xdd, 0x8c, 0x67, 0x26, 0x8b, 0x3c, 0x35, 0xdf, 0x35, 0x7d, 0xa7, 0xf2, 0xeb, 0xad, 0x65, - 0x78, 0xe2, 0x8e, 0x5a, 0x8c, 0x1c, 0x0f, 0x53, 0xb9, 0xcf, 0x08, 0x2c, 0x40, 0x25, 0x6e, 0xdf, - 0x71, 0xc3, 0xa6, 0xe3, 0x05, 0xcc, 0x61, 0xaf, 0x3f, 0x9c, 0x2e, 0x11, 0x38, 0xa5, 0x41, 0x35, - 0x18, 0x71, 0x84, 0x09, 0x27, 0x1c, 0xeb, 0x39, 0x77, 0xc0, 0xa5, 0xc1, 0xc7, 0xbd, 0xab, 0xf2, - 0x1f, 0x56, 0x5c, 0xd0, 0xab, 0x30, 0x2e, 0xae, 0x30, 0x91, 0x88, 0xb5, 0xfa, 0xa4, 0x19, 0xee, - 0x5e, 0x97, 0x48, 0x36, 0xc1, 0x4c, 0x5a, 0xb4, 0x09, 0x13, 0x94, 0x4b, 0x2a, 0x00, 0x67, 0xa6, - 0xfb, 0x93, 0xa1, 0x5a, 0xc2, 0x66, 0x9d, 0x0d, 0xce, 0xb0, 0x45, 0x2e, 0x3c, 0xe6, 0xb4, 0x93, - 0xb0, 0x49, 0x57, 0x82, 0xb9, 0x4e, 0xd6, 0xc3, 0xbb, 0x24, 0x98, 0x39, 0xc5, 0x66, 0xe0, 0xd9, - 0xbd, 0xdd, 0xb9, 0xc7, 0x16, 0x0f, 0xa0, 0xc3, 0x07, 0x72, 0x41, 0x6f, 0xc1, 0x68, 0x12, 0xfa, - 0x22, 0x82, 0x38, 0x9e, 0x39, 0x5d, 0x24, 0xf3, 0xcc, 0xba, 0x2a, 0xa0, 0xbb, 0x31, 0x14, 0x13, - 0xac, 0x73, 0x9c, 0xfd, 0x24, 0x9c, 0xe8, 0x10, 0x49, 0x7d, 0x05, 0x59, 0xfe, 0xe7, 0x41, 0xa8, - 0x28, 0x8f, 0x1e, 0x5a, 0x30, 0x9d, 0xb7, 0x8f, 0x66, 0x9d, 0xb7, 0x23, 0x54, 0x81, 0xd2, 0xfd, - 0xb5, 0x9f, 0xef, 0xf2, 0xd0, 0xf5, 0xb3, 0xb9, 0x6b, 0xb0, 0xf8, 0xbd, 0xa7, 0x3e, 0x9e, 0x03, - 0x4f, 0xad, 0xba, 0x81, 0x03, 0xad, 0xba, 0x82, 0x8f, 0xb7, 0x51, 0xfb, 0xad, 0x15, 0xba, 0x6b, - 0xb5, 0xec, 0xdb, 0x44, 0x35, 0x0a, 0xc4, 0x1c, 0xc7, 0xf4, 0x6e, 0xba, 0xa7, 0x32, 0xbd, 0x7b, - 0xf8, 0x90, 0x7a, 0xb7, 0x64, 0x80, 0x53, 0x5e, 0x68, 0x1b, 0x4e, 0x34, 0xcc, 0xa7, 0xa6, 0xd4, - 0x6d, 0xa6, 0xe7, 0xfb, 0x78, 0xea, 0xa9, 0xad, 0xbd, 0x71, 0xb1, 0x9c, 0xe5, 0x87, 0x3b, 0xab, - 0x40, 0xaf, 0xc2, 0xc8, 0xbb, 0x61, 0xcc, 0x8e, 0x15, 0xc4, 0xc6, 0x22, 0x6f, 0x8d, 0x8c, 0xbc, - 0x7e, 0xa3, 0xce, 0xe0, 0xfb, 0xbb, 0x73, 0xa3, 0xb5, 0xd0, 0x95, 0x7f, 0xb1, 0x2a, 0x80, 0xbe, - 0x6c, 0xc1, 0x29, 0x63, 0x9d, 0xa9, 0x96, 0xc3, 0x61, 0x5a, 0xfe, 0xb8, 0xa8, 0xf9, 0xd4, 0x5a, - 0x37, 0x9e, 0xb8, 0x7b, 0x55, 0xf6, 0x6f, 0x73, 0x17, 0xa6, 0x70, 0x6a, 0x90, 0xb8, 0xed, 0x1f, - 0x47, 0xbe, 0xf9, 0x1b, 0x86, 0xbf, 0xe5, 0x01, 0x38, 0xd1, 0xff, 0xa3, 0xc5, 0x9c, 0xe8, 0xeb, - 0xa4, 0xd9, 0xf2, 0x9d, 0xe4, 0x38, 0x62, 0x70, 0x3f, 0x07, 0x23, 0x89, 0xa8, 0xad, 0x58, 0xb2, - 0x7c, 0xad, 0x79, 0xec, 0x70, 0x41, 0x6d, 0x4c, 0x12, 0x8a, 0x15, 0x43, 0xfb, 0xdf, 0xf2, 0xaf, - 0x22, 0x31, 0xc7, 0xe0, 0x29, 0xb8, 0x6e, 0x7a, 0x0a, 0x9e, 0x29, 0xdc, 0x97, 0x1e, 0x1e, 0x83, - 0xef, 0x9b, 0x3d, 0x60, 0xf6, 0xc3, 0x4f, 0xcf, 0x29, 0x8f, 0xfd, 0x2b, 0x16, 0x4c, 0x77, 0x3b, - 0x14, 0xa7, 0x0a, 0x06, 0xb7, 0x5e, 0xd4, 0xf9, 0x97, 0x1a, 0xd5, 0x5b, 0x02, 0x8e, 0x15, 0x45, - 0xe1, 0xec, 0xd5, 0xfd, 0x25, 0x58, 0xba, 0x01, 0xe6, 0xa3, 0x65, 0xe8, 0x35, 0x1e, 0x72, 0xcf, - 0xdb, 0x73, 0xbe, 0xef, 0x70, 0x7b, 0xfb, 0xd7, 0x4b, 0x30, 0xcd, 0x9d, 0xd0, 0x8b, 0xdb, 0xa1, - 0xe7, 0xd6, 0x42, 0x57, 0x5c, 0x40, 0x70, 0x61, 0xac, 0xa5, 0x19, 0x9f, 0xc5, 0x12, 0xb6, 0xe8, - 0xe6, 0x6a, 0xaa, 0xf0, 0xeb, 0x50, 0x6c, 0x70, 0xa5, 0xb5, 0x90, 0x6d, 0xaf, 0xa1, 0x7c, 0x9a, - 0xa5, 0xbe, 0x77, 0x06, 0x55, 0xcb, 0x8a, 0xc6, 0x07, 0x1b, 0x5c, 0x8f, 0xe0, 0xd1, 0x09, 0xfb, - 0x1f, 0x58, 0xf0, 0x48, 0x8f, 0xa4, 0x2e, 0xb4, 0xba, 0x7b, 0xcc, 0xf1, 0x2f, 0x5e, 0xc5, 0x53, - 0xd5, 0xf1, 0xe3, 0x00, 0x2c, 0xb0, 0xe8, 0x0e, 0x00, 0x77, 0xe7, 0xb3, 0x37, 0xd2, 0x4b, 0x45, - 0xa2, 0x86, 0x3a, 0x52, 0x27, 0x68, 0xb7, 0xea, 0xd5, 0xab, 0xe8, 0x1a, 0x57, 0xfb, 0x5b, 0x65, - 0x18, 0xe4, 0x8f, 0x2f, 0xd7, 0x60, 0x78, 0x8b, 0x27, 0x99, 0xed, 0x2f, 0xc7, 0x6d, 0x6a, 0x5c, - 0x70, 0x00, 0x96, 0x6c, 0xd0, 0x35, 0x38, 0x49, 0x77, 0x16, 0xcf, 0xf1, 0xab, 0xc4, 0x77, 0x76, - 0xa4, 0xb5, 0xca, 0x5f, 0x22, 0x90, 0x29, 0xb3, 0x4f, 0xae, 0x75, 0x92, 0xe0, 0x6e, 0xe5, 0xd0, - 0x6b, 0x1d, 0x39, 0xe1, 0x78, 0xf2, 0x5e, 0xa5, 0xa9, 0x1e, 0x9c, 0x17, 0x8e, 0xea, 0xd3, 0xad, - 0x0e, 0xbb, 0x5c, 0x7b, 0xe3, 0xd6, 0xb4, 0xc5, 0x4d, 0x5a, 0x16, 0x5b, 0xd0, 0x66, 0x31, 0x15, - 0xeb, 0x5b, 0x11, 0x89, 0xb7, 0x42, 0xdf, 0x15, 0xcf, 0x33, 0xa6, 0xb1, 0x05, 0x19, 0x3c, 0xee, - 0x28, 0x41, 0xb9, 0x6c, 0x38, 0x9e, 0xdf, 0x8e, 0x48, 0xca, 0x65, 0xc8, 0xe4, 0xb2, 0x9a, 0xc1, - 0xe3, 0x8e, 0x12, 0x74, 0x6e, 0x9d, 0x12, 0xaf, 0x05, 0xca, 0x2b, 0xcc, 0x42, 0x04, 0x7d, 0x06, - 0x86, 0x65, 0x20, 0x7b, 0xa1, 0x4c, 0x1b, 0x22, 0x70, 0x40, 0xbd, 0x3c, 0xa8, 0xbd, 0x4c, 0x25, - 0x42, 0xd8, 0x25, 0xbf, 0xc3, 0xbc, 0x4a, 0xf7, 0x27, 0x16, 0x9c, 0xec, 0x12, 0x90, 0xc5, 0x45, - 0xda, 0xa6, 0x17, 0x27, 0x2a, 0x2f, 0xbe, 0x26, 0xd2, 0x38, 0x1c, 0x2b, 0x0a, 0xba, 0x5a, 0xb8, - 0xd0, 0xcc, 0x0a, 0x4a, 0x11, 0x02, 0x22, 0xb0, 0xfd, 0x09, 0x4a, 0x74, 0x16, 0x06, 0xda, 0x31, - 0x89, 0xe4, 0x13, 0x71, 0x52, 0xce, 0x33, 0x3f, 0x20, 0xc3, 0x50, 0xb5, 0x75, 0x53, 0xb9, 0xe0, - 0x34, 0xb5, 0x95, 0x3b, 0xe1, 0x38, 0xce, 0xfe, 0x7a, 0x19, 0x26, 0x33, 0x81, 0x99, 0xb4, 0x21, - 0xcd, 0x30, 0xf0, 0x92, 0x50, 0x65, 0x3f, 0xe3, 0xaf, 0x52, 0x91, 0xd6, 0xd6, 0x35, 0x01, 0xc7, - 0x8a, 0x02, 0x3d, 0x6d, 0xbe, 0xd8, 0x9f, 0xb6, 0x79, 0xa9, 0x6a, 0x3c, 0xde, 0x59, 0xf4, 0xad, - 0x8e, 0x27, 0x61, 0xa0, 0x15, 0xaa, 0x87, 0x98, 0xd5, 0xf7, 0xc4, 0x4b, 0xd5, 0x5a, 0x18, 0xfa, - 0x98, 0x21, 0xd1, 0x53, 0xa2, 0xf7, 0x99, 0x93, 0x0b, 0xec, 0xb8, 0x61, 0xac, 0x0d, 0xc1, 0x33, - 0x30, 0x7c, 0x97, 0xec, 0x44, 0x5e, 0xb0, 0x99, 0x3d, 0xb7, 0xb9, 0xc2, 0xc1, 0x58, 0xe2, 0xcd, - 0xf7, 0x38, 0x86, 0x8f, 0xf8, 0x3d, 0x8e, 0x91, 0xdc, 0x7d, 0xf0, 0x3b, 0x16, 0x4c, 0xb2, 0x94, - 0xa0, 0xe2, 0x02, 0xbd, 0x17, 0x06, 0xc7, 0xa0, 0x63, 0x3c, 0x09, 0x83, 0x11, 0xad, 0x34, 0x9b, - 0x50, 0x9f, 0xb5, 0x04, 0x73, 0x1c, 0x7a, 0x0c, 0x06, 0x58, 0x13, 0xe8, 0x67, 0x1c, 0xe3, 0x99, - 0xc7, 0xab, 0x4e, 0xe2, 0x60, 0x06, 0x65, 0x77, 0xa1, 0x30, 0x69, 0xf9, 0x1e, 0x6f, 0x74, 0xea, - 0x6e, 0x7d, 0xd8, 0xee, 0x42, 0x75, 0x6d, 0xe4, 0x83, 0xba, 0x0b, 0xd5, 0x9d, 0xf9, 0xc1, 0x7a, - 0xfe, 0xff, 0x2c, 0xc1, 0x99, 0xae, 0xe5, 0xd2, 0x13, 0xe0, 0x55, 0xe3, 0x04, 0xf8, 0x42, 0xe6, - 0x04, 0xd8, 0x3e, 0xb8, 0xf4, 0x83, 0x39, 0x13, 0xee, 0x7e, 0x54, 0x5b, 0x3e, 0xc6, 0xa3, 0xda, - 0x81, 0xa2, 0x2a, 0xce, 0x60, 0x8e, 0x8a, 0xf3, 0xfb, 0x16, 0x3c, 0xda, 0x75, 0xc8, 0x1e, 0xba, - 0xcb, 0x67, 0x5d, 0x5b, 0xd9, 0xc3, 0x3a, 0xf9, 0xe5, 0x72, 0x8f, 0x5e, 0x31, 0x3b, 0xe5, 0x1c, - 0x95, 0x42, 0x0c, 0x19, 0x0b, 0xe5, 0x6d, 0x8c, 0x4b, 0x20, 0x0e, 0xc3, 0x0a, 0x8b, 0x62, 0xed, - 0xf2, 0x16, 0x6f, 0xe4, 0xca, 0x21, 0x17, 0xd4, 0xbc, 0xe9, 0x27, 0xd7, 0xb3, 0x02, 0x64, 0xaf, - 0x74, 0xdd, 0xd6, 0x2c, 0xcf, 0xf2, 0x61, 0x2c, 0xcf, 0xb1, 0xee, 0x56, 0x27, 0x5a, 0x84, 0xc9, - 0xa6, 0x17, 0xb0, 0x67, 0x3c, 0x4d, 0xed, 0x49, 0xdd, 0xa0, 0xbd, 0x66, 0xa2, 0x71, 0x96, 0x7e, - 0xf6, 0x55, 0x18, 0x3f, 0xbc, 0x77, 0xed, 0xc7, 0x65, 0xf8, 0xe0, 0x01, 0x42, 0x81, 0xef, 0x0e, - 0xc6, 0x77, 0xd1, 0x76, 0x87, 0x8e, 0x6f, 0x53, 0x83, 0xe9, 0x8d, 0xb6, 0xef, 0xef, 0xb0, 0xf8, - 0x29, 0xe2, 0x4a, 0x0a, 0xa1, 0xd4, 0xa8, 0x37, 0xbd, 0x57, 0xbb, 0xd0, 0xe0, 0xae, 0x25, 0xd1, - 0xa7, 0x01, 0x85, 0x77, 0x58, 0xd2, 0x5c, 0x37, 0xcd, 0x7a, 0xc0, 0x3e, 0x41, 0x39, 0x5d, 0xaa, - 0x37, 0x3a, 0x28, 0x70, 0x97, 0x52, 0x54, 0x4f, 0x65, 0xcf, 0x81, 0xab, 0x66, 0x65, 0xf4, 0x54, - 0xac, 0x23, 0xb1, 0x49, 0x8b, 0x2e, 0xc1, 0x09, 0x67, 0xdb, 0xf1, 0x78, 0x12, 0x2c, 0xc9, 0x80, - 0x2b, 0xaa, 0xca, 0x7f, 0xb5, 0x98, 0x25, 0xc0, 0x9d, 0x65, 0x50, 0xcb, 0x70, 0x48, 0xf2, 0x74, - 0xf9, 0x9f, 0x38, 0xc4, 0x0c, 0x2e, 0xec, 0xa2, 0xb4, 0xff, 0xbb, 0x45, 0xb7, 0xbe, 0x2e, 0x2f, - 0x3e, 0xd2, 0x11, 0x51, 0x0e, 0x36, 0xed, 0x32, 0x9a, 0x1a, 0x91, 0x65, 0x1d, 0x89, 0x4d, 0x5a, - 0x3e, 0x35, 0xe2, 0x34, 0x9c, 0xdb, 0xd0, 0x36, 0xc5, 0x3d, 0x4e, 0x45, 0x41, 0x35, 0x68, 0xd7, - 0xdb, 0xf6, 0xe2, 0x30, 0x12, 0x0b, 0xa8, 0xcf, 0xe0, 0xde, 0x54, 0x5e, 0x56, 0x39, 0x1b, 0x2c, - 0xf9, 0xd9, 0xdf, 0x28, 0xc1, 0xb8, 0xac, 0xf1, 0xf5, 0x76, 0x98, 0x38, 0xc7, 0xb0, 0xa5, 0xbf, - 0x6e, 0x6c, 0xe9, 0x0b, 0xc5, 0xae, 0xb5, 0xb2, 0xc6, 0xf5, 0xdc, 0xca, 0x3f, 0x93, 0xd9, 0xca, - 0x5f, 0xe8, 0x87, 0xe9, 0xc1, 0x5b, 0xf8, 0xbf, 0xb7, 0xe0, 0x84, 0x41, 0x7f, 0x0c, 0x3b, 0x49, - 0xcd, 0xdc, 0x49, 0x9e, 0xeb, 0xa3, 0x37, 0x3d, 0x76, 0x90, 0x6f, 0x97, 0x32, 0xbd, 0x60, 0x3b, - 0xc7, 0x17, 0x61, 0x60, 0xcb, 0x89, 0xdc, 0x62, 0x19, 0x21, 0x3b, 0x8a, 0xcf, 0x5f, 0x76, 0x22, - 0x97, 0xcb, 0xff, 0xf3, 0xea, 0x3d, 0x2a, 0x27, 0x72, 0x73, 0x6f, 0x39, 0xb0, 0x4a, 0xd1, 0x45, - 0x18, 0x8a, 0x1b, 0x61, 0x4b, 0xc5, 0x81, 0x9e, 0xe5, 0x6f, 0x55, 0x51, 0xc8, 0xfe, 0xee, 0x1c, - 0x32, 0xab, 0xa3, 0x60, 0x2c, 0xe8, 0x67, 0x37, 0xa1, 0xa2, 0xaa, 0x3e, 0xd2, 0x48, 0xf8, 0xff, - 0x51, 0x86, 0x93, 0x5d, 0xe6, 0x0a, 0xfa, 0x92, 0x31, 0x6e, 0xaf, 0xf6, 0x3d, 0xd9, 0xde, 0xe7, - 0xc8, 0x7d, 0x89, 0x59, 0x4a, 0xae, 0x98, 0x1d, 0x87, 0xa8, 0xfe, 0x66, 0x4c, 0xb2, 0xd5, 0x53, - 0x50, 0x7e, 0xf5, 0xb4, 0xda, 0x63, 0x1b, 0x7e, 0x5a, 0x91, 0x6a, 0xe9, 0x91, 0x7e, 0xe7, 0xbf, - 0x36, 0x00, 0xd3, 0xdd, 0xee, 0xcf, 0xa3, 0xaf, 0x5a, 0x99, 0x67, 0x1f, 0x5e, 0xeb, 0xff, 0x12, - 0x3e, 0x7f, 0x0b, 0x42, 0xe4, 0x9c, 0x99, 0x37, 0x1f, 0x82, 0xc8, 0x1d, 0x71, 0x51, 0x3b, 0xbb, - 0x9f, 0x14, 0xf1, 0x27, 0x3c, 0xa4, 0x54, 0xf8, 0xd4, 0x21, 0x9a, 0x22, 0x5e, 0x01, 0x89, 0x33, - 0xf7, 0x93, 0x24, 0x38, 0xff, 0x7e, 0x92, 0x6c, 0xc3, 0xac, 0x07, 0xa3, 0x5a, 0xbf, 0x8e, 0x74, - 0x1a, 0xdc, 0xa5, 0x5b, 0x94, 0xd6, 0xee, 0x23, 0x9d, 0x0a, 0x7f, 0xd7, 0x82, 0x4c, 0xd0, 0x96, - 0x72, 0xcb, 0x58, 0x3d, 0xdd, 0x32, 0x67, 0x61, 0x20, 0x0a, 0x7d, 0x92, 0x7d, 0x92, 0x00, 0x87, - 0x3e, 0xc1, 0x0c, 0xa3, 0x9e, 0xa8, 0x2d, 0xf7, 0x7a, 0xa2, 0x96, 0xda, 0xe9, 0x3e, 0xd9, 0x26, - 0xd2, 0x49, 0xa2, 0xc4, 0xf8, 0x55, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x5e, 0x19, 0x86, 0xb8, 0x27, - 0xe2, 0x18, 0xf6, 0xe9, 0x9a, 0x70, 0x0a, 0x14, 0xba, 0x93, 0xce, 0x5b, 0x35, 0x5f, 0x75, 0x12, - 0x87, 0x4f, 0x2e, 0xd5, 0xc7, 0xd4, 0x91, 0x80, 0xe6, 0x8d, 0x51, 0x98, 0xcd, 0xd8, 0xba, 0xc0, - 0x79, 0x68, 0x63, 0xb2, 0x05, 0x10, 0xb3, 0x27, 0x11, 0x29, 0x0f, 0x91, 0x79, 0xf3, 0xa5, 0x42, - 0xed, 0xa8, 0xab, 0x62, 0xbc, 0x35, 0x69, 0xba, 0x3f, 0x85, 0xc0, 0x1a, 0xef, 0xd9, 0x57, 0xa0, - 0xa2, 0x88, 0xf3, 0x8c, 0x80, 0x31, 0x7d, 0x72, 0xfe, 0x25, 0x98, 0xcc, 0xd4, 0xd5, 0x97, 0x0d, - 0xf1, 0x5b, 0x16, 0x4c, 0x66, 0x5e, 0x73, 0x47, 0x5f, 0xb1, 0x60, 0xda, 0xef, 0xe2, 0x88, 0x12, - 0x9f, 0xf9, 0x30, 0x2e, 0x2c, 0x65, 0x3e, 0x74, 0xc3, 0xe2, 0xae, 0xb5, 0x51, 0xb3, 0x92, 0xbf, - 0xf0, 0xea, 0xf8, 0x22, 0x06, 0x76, 0x8c, 0xe7, 0x1c, 0xe6, 0x30, 0xac, 0xb0, 0xf6, 0x4f, 0x2c, - 0x38, 0xd1, 0xf1, 0x60, 0xf8, 0xc3, 0xd2, 0x0d, 0x91, 0x5d, 0xb9, 0xd4, 0x23, 0xbb, 0xb2, 0xde, - 0xcb, 0xf2, 0x81, 0xbd, 0xfc, 0x75, 0x0b, 0xc4, 0x0c, 0x3d, 0x06, 0x0d, 0x70, 0xcd, 0xd4, 0x00, - 0x3f, 0x54, 0x64, 0xd2, 0xf7, 0x50, 0xfd, 0x7e, 0xa9, 0x04, 0x53, 0x9c, 0x20, 0xf5, 0xa9, 0x3f, - 0x2c, 0x1f, 0xa7, 0xbf, 0x57, 0x3f, 0xd4, 0x53, 0x8b, 0xdd, 0x7b, 0x6a, 0x7c, 0xcb, 0x81, 0x03, - 0xbf, 0xe5, 0x9f, 0x59, 0x80, 0xf8, 0x98, 0x64, 0x9f, 0xc7, 0xe5, 0xce, 0x5d, 0xcd, 0xa0, 0x4b, - 0x25, 0x87, 0xc2, 0x60, 0x8d, 0xea, 0x01, 0x77, 0x21, 0x73, 0xa2, 0x51, 0xce, 0x3f, 0xd1, 0xe8, - 0xa3, 0xd7, 0xbf, 0x5d, 0x86, 0x6c, 0x30, 0x1c, 0x7a, 0x1b, 0xc6, 0x1a, 0x4e, 0xcb, 0xb9, 0xe3, - 0xf9, 0x5e, 0xe2, 0x91, 0xb8, 0xd8, 0x91, 0xe9, 0xb2, 0x56, 0x42, 0x1c, 0x24, 0x68, 0x10, 0x6c, - 0x70, 0x44, 0xf3, 0x00, 0xad, 0xc8, 0xdb, 0xf6, 0x7c, 0xb2, 0xc9, 0x74, 0x56, 0x16, 0x4d, 0xcf, - 0x4f, 0xff, 0x24, 0x14, 0x6b, 0x14, 0x5d, 0xa2, 0xaf, 0xcb, 0xc7, 0x11, 0x7d, 0x3d, 0xd0, 0x67, - 0xf4, 0xf5, 0x60, 0xa1, 0xe8, 0x6b, 0x0c, 0xa7, 0xa5, 0xff, 0x9f, 0xfe, 0x5f, 0xf5, 0x7c, 0xc2, - 0x93, 0xcc, 0x8a, 0x68, 0xfb, 0xd9, 0xbd, 0xdd, 0xb9, 0xd3, 0xb8, 0x2b, 0x05, 0xee, 0x51, 0xd2, - 0x6e, 0xc3, 0xc9, 0x3a, 0x89, 0x3c, 0x96, 0xfb, 0xcf, 0x4d, 0xd7, 0xd2, 0xe7, 0xa1, 0x12, 0x65, - 0x96, 0x71, 0x9f, 0x57, 0xaa, 0xb5, 0x6c, 0x51, 0x72, 0xd9, 0xa6, 0x2c, 0xed, 0xbf, 0x51, 0x82, - 0x61, 0x11, 0x06, 0x77, 0x0c, 0xca, 0xc7, 0x15, 0xc3, 0x49, 0xf0, 0x4c, 0x9e, 0xfc, 0x63, 0xcd, - 0xea, 0xe9, 0x1e, 0xa8, 0x67, 0xdc, 0x03, 0xcf, 0x15, 0x63, 0x77, 0xb0, 0x63, 0xe0, 0x9f, 0x96, - 0x61, 0xc2, 0x0c, 0x0b, 0x3c, 0x86, 0x61, 0x79, 0x03, 0x86, 0x63, 0x11, 0xa1, 0x5a, 0x2a, 0x12, - 0x75, 0x95, 0xfd, 0xc4, 0xe9, 0x59, 0xaa, 0x88, 0x49, 0x95, 0xec, 0xba, 0x06, 0xc1, 0x96, 0x8f, - 0x25, 0x08, 0x36, 0x2f, 0x5a, 0x73, 0xe0, 0x41, 0x44, 0x6b, 0xda, 0x3f, 0x60, 0x22, 0x5f, 0x87, - 0x1f, 0xc3, 0x36, 0xfe, 0xba, 0xb9, 0x39, 0x9c, 0x2f, 0x34, 0xef, 0x44, 0xf3, 0x7a, 0x6c, 0xe7, - 0xdf, 0xb5, 0x60, 0x54, 0x10, 0x1e, 0x43, 0x07, 0x3e, 0x6d, 0x76, 0xe0, 0xa9, 0x42, 0x1d, 0xe8, - 0xd1, 0xf2, 0x6f, 0x94, 0x54, 0xcb, 0x6b, 0xe2, 0x49, 0xf3, 0xdc, 0x4c, 0xc7, 0x23, 0xad, 0x28, - 0x4c, 0xc2, 0x46, 0xe8, 0x0b, 0x05, 0xee, 0xb1, 0xf4, 0x72, 0x15, 0x87, 0xef, 0x6b, 0xbf, 0xb1, - 0xa2, 0x66, 0x77, 0x7f, 0xc2, 0x28, 0x11, 0x1b, 0x68, 0xb7, 0x07, 0xd5, 0x5d, 0x80, 0xf4, 0x15, - 0x6b, 0x71, 0x2f, 0xb1, 0xff, 0xa7, 0xda, 0xd3, 0xdb, 0x52, 0x8a, 0x17, 0xd6, 0xf8, 0xca, 0x30, - 0x7c, 0x56, 0xc7, 0xa0, 0x79, 0x06, 0x70, 0x5d, 0xc0, 0xb1, 0xa2, 0xb0, 0x5f, 0x61, 0x92, 0x9d, - 0x0d, 0x50, 0x7f, 0x17, 0x99, 0x7e, 0x71, 0x48, 0x0d, 0x2d, 0x73, 0xec, 0x5d, 0xd7, 0xaf, 0x4b, - 0x15, 0x15, 0x9f, 0xb4, 0x09, 0x7a, 0x24, 0x6c, 0x7a, 0xbb, 0x0a, 0x91, 0x8e, 0x83, 0xa3, 0x57, - 0x0a, 0x4b, 0xe4, 0x3e, 0x8e, 0x8a, 0x58, 0x72, 0x37, 0x96, 0xd1, 0x6a, 0xad, 0x96, 0xcd, 0x4f, - 0xbd, 0x2c, 0x11, 0x38, 0xa5, 0x41, 0x0b, 0xc2, 0xa0, 0x34, 0x5f, 0xbc, 0x97, 0x06, 0xa5, 0x1c, - 0x12, 0xcd, 0xa2, 0x7c, 0x01, 0x46, 0xd5, 0x93, 0x1f, 0x35, 0xfe, 0xd8, 0x42, 0x85, 0xeb, 0x57, - 0x2b, 0x29, 0x18, 0xeb, 0x34, 0x68, 0x0d, 0x4e, 0xba, 0xea, 0xd6, 0x45, 0xad, 0x7d, 0xc7, 0xf7, - 0x1a, 0xb4, 0x28, 0xbf, 0x31, 0xf9, 0xc8, 0xde, 0xee, 0xdc, 0xc9, 0x6a, 0x27, 0x1a, 0x77, 0x2b, - 0x83, 0xd6, 0x61, 0x32, 0xe6, 0x4f, 0x9b, 0xc8, 0xd0, 0x7a, 0x91, 0xb6, 0xf5, 0x59, 0x79, 0x62, - 0x55, 0x37, 0xd1, 0xfb, 0x0c, 0xc4, 0xa5, 0x82, 0x0c, 0xc6, 0xcf, 0xb2, 0x40, 0xaf, 0xc1, 0x84, - 0xaf, 0xbf, 0xdb, 0x58, 0x13, 0x97, 0x4f, 0x54, 0x0c, 0x92, 0xf1, 0xaa, 0x63, 0x0d, 0x67, 0xa8, - 0xd1, 0x1b, 0x30, 0xa3, 0x43, 0x44, 0x26, 0x18, 0x27, 0xd8, 0x24, 0xb1, 0x78, 0x06, 0xe1, 0xb1, - 0xbd, 0xdd, 0xb9, 0x99, 0xab, 0x3d, 0x68, 0x70, 0xcf, 0xd2, 0xe8, 0x22, 0x8c, 0xc9, 0x91, 0xd4, - 0x2e, 0xa2, 0xa4, 0xd1, 0x6f, 0x1a, 0x0e, 0x1b, 0x94, 0xef, 0xef, 0x60, 0xee, 0x8b, 0xb4, 0xb0, - 0xb6, 0x85, 0xa3, 0x77, 0x60, 0x4c, 0x6f, 0x63, 0x76, 0x6f, 0xce, 0x7f, 0x0b, 0x53, 0xa8, 0x02, - 0xaa, 0xe5, 0x3a, 0x0e, 0x1b, 0xbc, 0xed, 0x1b, 0x30, 0x54, 0xdf, 0x89, 0x1b, 0x89, 0x5f, 0x40, - 0xbe, 0x3d, 0x69, 0x74, 0x21, 0x5d, 0x7b, 0xec, 0x5d, 0x1e, 0xd1, 0x23, 0x9b, 0xc0, 0xe4, 0xfa, - 0x72, 0x8d, 0xbf, 0xfa, 0xbf, 0xc8, 0xad, 0x37, 0x2c, 0xa4, 0x9b, 0x75, 0x48, 0xa9, 0xd5, 0x45, - 0x1e, 0xda, 0x7f, 0x6c, 0xc1, 0x20, 0x7b, 0x53, 0x26, 0xef, 0x3d, 0xa2, 0x22, 0x8d, 0x46, 0x2f, - 0xc3, 0x10, 0xd9, 0xd8, 0x20, 0x8d, 0x44, 0x2c, 0x63, 0x19, 0xed, 0x3d, 0xb4, 0xc2, 0xa0, 0x74, - 0x71, 0xb2, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0xe7, 0xa0, 0x92, 0x78, 0x4d, 0xb2, 0xe8, 0xba, - 0xc4, 0x3d, 0xc4, 0x5d, 0x71, 0x25, 0x2c, 0xd6, 0x25, 0x13, 0x9c, 0xf2, 0xb3, 0xdf, 0x2b, 0x01, - 0xa4, 0x77, 0x2d, 0xf2, 0xba, 0xb9, 0xd4, 0xf1, 0xec, 0xd2, 0xd3, 0x5d, 0x9e, 0x5d, 0x42, 0x29, - 0xc3, 0x2e, 0x8f, 0x2e, 0xa9, 0xa1, 0x2a, 0x17, 0x1a, 0xaa, 0x81, 0x7e, 0x86, 0x6a, 0x19, 0x4e, - 0xa4, 0x77, 0x45, 0xcc, 0x4b, 0x77, 0x2c, 0x09, 0xe3, 0x7a, 0x16, 0x89, 0x3b, 0xe9, 0xed, 0xf7, - 0x2c, 0x10, 0x21, 0x6b, 0x05, 0x66, 0xab, 0x2b, 0x9f, 0x48, 0x31, 0xf2, 0x50, 0x3d, 0x5b, 0x24, - 0x9a, 0x4f, 0x64, 0x9f, 0x52, 0xeb, 0xc7, 0xc8, 0x39, 0x65, 0x70, 0xb5, 0x7f, 0xc3, 0x82, 0x51, - 0x8e, 0xbe, 0xc6, 0x74, 0xea, 0xfc, 0x76, 0xf5, 0x95, 0xe1, 0x93, 0xbd, 0x1e, 0x42, 0x19, 0xab, - 0x4c, 0x8f, 0xfa, 0xeb, 0x21, 0x12, 0x81, 0x53, 0x1a, 0xf4, 0x0c, 0x0c, 0xc7, 0xed, 0x3b, 0x8c, - 0x3c, 0x13, 0xbf, 0x56, 0xe7, 0x60, 0x2c, 0xf1, 0xf6, 0x3f, 0x2f, 0xc1, 0x54, 0x36, 0x7c, 0x11, - 0x61, 0x18, 0xe2, 0x3a, 0x76, 0x56, 0x3d, 0x3b, 0xc8, 0x97, 0xa3, 0x85, 0x3f, 0x02, 0x7f, 0x03, - 0x97, 0xc5, 0x9c, 0x09, 0x4e, 0x68, 0x03, 0x46, 0xdd, 0xf0, 0x5e, 0x70, 0xcf, 0x89, 0xdc, 0xc5, - 0xda, 0x9a, 0xf8, 0x12, 0x39, 0x01, 0x27, 0xd5, 0xb4, 0x80, 0x1e, 0x5c, 0xc9, 0x7c, 0x0b, 0x29, - 0x0a, 0xeb, 0x8c, 0xa9, 0x4d, 0xd9, 0x08, 0x83, 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x2a, 0x76, 0xb4, - 0xba, 0x2c, 0xc9, 0xb5, 0x3a, 0xc6, 0xc5, 0x2d, 0x7b, 0x8e, 0xc0, 0x29, 0x4b, 0xfb, 0x0f, 0x4e, - 0x82, 0x31, 0x17, 0x8c, 0x34, 0x9c, 0xd6, 0x03, 0x4f, 0xc3, 0xf9, 0x26, 0x8c, 0x90, 0x66, 0x2b, - 0xd9, 0xa9, 0x7a, 0x51, 0xb1, 0xa4, 0xca, 0x2b, 0x82, 0xba, 0x93, 0xbb, 0xc4, 0x60, 0xc5, 0xb1, - 0x47, 0x52, 0xd5, 0xf2, 0x43, 0x91, 0x54, 0x75, 0xe0, 0xcf, 0x25, 0xa9, 0xea, 0x1b, 0x30, 0xbc, - 0xe9, 0x25, 0x98, 0xb4, 0x42, 0x91, 0xb6, 0x20, 0x67, 0xf2, 0x5c, 0xe2, 0xc4, 0x9d, 0x99, 0x12, - 0x05, 0x02, 0x4b, 0x76, 0x68, 0x5d, 0x2d, 0xaa, 0xa1, 0x22, 0x7b, 0x79, 0xa7, 0xaf, 0xaf, 0xeb, - 0xb2, 0x12, 0x49, 0x54, 0x87, 0xdf, 0x7f, 0x12, 0x55, 0x95, 0xfa, 0x74, 0xe4, 0x41, 0xa5, 0x3e, - 0x35, 0x52, 0xc8, 0x56, 0x8e, 0x22, 0x85, 0xec, 0x7b, 0x16, 0x9c, 0x6a, 0x75, 0x4b, 0xc0, 0x2c, - 0x92, 0x98, 0x7e, 0xf2, 0x10, 0x29, 0xa9, 0x8d, 0xaa, 0xd9, 0x65, 0xf0, 0xae, 0x64, 0xb8, 0x7b, - 0xc5, 0x32, 0x17, 0xed, 0xe8, 0xfb, 0xcf, 0x45, 0x7b, 0xd4, 0xd9, 0x4e, 0xd3, 0xcc, 0xb4, 0xe3, - 0x47, 0x92, 0x99, 0x76, 0xe2, 0x01, 0x66, 0xa6, 0xd5, 0x72, 0xca, 0x4e, 0x3e, 0xd8, 0x9c, 0xb2, - 0x5b, 0xe6, 0xbe, 0xc4, 0x53, 0x98, 0xbe, 0x5c, 0x78, 0x5f, 0x32, 0x6a, 0x38, 0x78, 0x67, 0xe2, - 0xd9, 0x75, 0x4f, 0xbc, 0xcf, 0xec, 0xba, 0x46, 0x8e, 0x5a, 0x74, 0x14, 0x39, 0x6a, 0xdf, 0xd6, - 0x77, 0xd0, 0x93, 0x45, 0x6a, 0x50, 0x1b, 0x65, 0x67, 0x0d, 0xdd, 0xf6, 0xd0, 0xce, 0x2c, 0xb8, - 0xd3, 0xc7, 0x9d, 0x05, 0xf7, 0xd4, 0x11, 0x66, 0xc1, 0x3d, 0x7d, 0xac, 0x59, 0x70, 0x1f, 0x79, - 0x48, 0xb2, 0xe0, 0xce, 0x1c, 0x65, 0x16, 0x5c, 0x3a, 0xc0, 0x2d, 0x79, 0x55, 0x67, 0xe6, 0xd1, - 0x22, 0x03, 0xdc, 0xf5, 0x66, 0x0f, 0x1f, 0x60, 0x85, 0xc2, 0x29, 0x53, 0xfb, 0xaf, 0xc0, 0x99, - 0x83, 0x27, 0x58, 0xfa, 0xf6, 0x44, 0x2d, 0xf5, 0x6c, 0x65, 0xde, 0x9e, 0x60, 0xca, 0x9b, 0x46, - 0x55, 0x38, 0x4d, 0xe7, 0xb7, 0x2d, 0x78, 0xa4, 0x47, 0x16, 0xbb, 0xc2, 0xf7, 0xdc, 0x5a, 0x30, - 0xd9, 0x32, 0x8b, 0x16, 0xbe, 0x36, 0x6b, 0x64, 0xcd, 0x53, 0xb1, 0xc8, 0x19, 0x04, 0xce, 0xb2, - 0x5f, 0xfa, 0xd0, 0x0f, 0x7f, 0x7c, 0xe6, 0x03, 0x3f, 0xfa, 0xf1, 0x99, 0x0f, 0xfc, 0xd1, 0x8f, - 0xcf, 0x7c, 0xe0, 0xe7, 0xf6, 0xce, 0x58, 0x3f, 0xdc, 0x3b, 0x63, 0xfd, 0x68, 0xef, 0x8c, 0xf5, - 0x27, 0x7b, 0x67, 0xac, 0xf7, 0x7e, 0x72, 0xe6, 0x03, 0x9f, 0x2d, 0x6d, 0xbf, 0xf0, 0xff, 0x03, - 0x00, 0x00, 0xff, 0xff, 0x4c, 0xce, 0x2d, 0xad, 0x70, 0xc5, 0x00, 0x00, + 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0xdd, 0x87, 0x3b, 0x82, 0x10, 0x79, 0x38, 0x0e, 0x45, + 0xea, 0x48, 0x1e, 0x01, 0xdd, 0x91, 0x14, 0x4f, 0xa2, 0x42, 0x09, 0xc0, 0x02, 0x77, 0xd0, 0x7d, + 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x88, 0x9c, 0xdb, 0x69, 0x00, 0xc3, 0x1b, 0xcc, 0x2c, 0x67, + 0x66, 0x71, 0x07, 0x29, 0xaa, 0xb2, 0x15, 0x95, 0x9c, 0x94, 0x95, 0x84, 0x2e, 0x47, 0x55, 0x29, + 0x27, 0x55, 0x4a, 0xb9, 0x2a, 0x8e, 0xf2, 0x1d, 0x45, 0x65, 0x49, 0xae, 0xc8, 0x49, 0xc5, 0xb1, + 0x1c, 0xb9, 0x2a, 0x71, 0x54, 0xe5, 0x72, 0xec, 0x94, 0x2b, 0xb0, 0x09, 0x55, 0xfc, 0x33, 0x3f, + 0xe2, 0x7f, 0x48, 0x2a, 0x95, 0xea, 0xcf, 0xe9, 0x9e, 0xdd, 0xc5, 0xcc, 0x82, 0x07, 0xf8, 0xa4, + 0xf2, 0xbf, 0xdd, 0xf7, 0x5e, 0xbf, 0xfe, 0x98, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xfd, 0x1a, 0xce, + 0xdd, 0xbd, 0x18, 0xcf, 0x79, 0xe1, 0xfc, 0xdd, 0xd6, 0x1d, 0x12, 0x05, 0x24, 0x21, 0xf1, 0x7c, + 0xf3, 0xee, 0xc6, 0xbc, 0xd3, 0xf4, 0xe6, 0xb7, 0xcf, 0xcf, 0x6f, 0x90, 0x80, 0x44, 0x4e, 0x42, + 0xdc, 0xb9, 0x66, 0x14, 0x26, 0x21, 0x7a, 0x8c, 0x53, 0xcf, 0xa5, 0xd4, 0x73, 0xcd, 0xbb, 0x1b, + 0x73, 0x4e, 0xd3, 0x9b, 0xdb, 0x3e, 0x3f, 0xf3, 0xfc, 0x86, 0x97, 0x6c, 0xb6, 0xee, 0xcc, 0x35, + 0xc2, 0xad, 0xf9, 0x8d, 0x70, 0x23, 0x9c, 0x67, 0x85, 0xee, 0xb4, 0xd6, 0xd9, 0x3f, 0xf6, 0x87, + 0xfd, 0xe2, 0xcc, 0x66, 0x5e, 0x14, 0x55, 0x3b, 0x4d, 0x6f, 0xcb, 0x69, 0x6c, 0x7a, 0x01, 0x89, + 0x76, 0x54, 0xe5, 0x11, 0x89, 0xc3, 0x56, 0xd4, 0x20, 0xd9, 0x26, 0x1c, 0x58, 0x2a, 0x9e, 0xdf, + 0x22, 0x89, 0xd3, 0xa1, 0xe1, 0x33, 0xf3, 0xdd, 0x4a, 0x45, 0xad, 0x20, 0xf1, 0xb6, 0xda, 0xab, + 0xf9, 0x78, 0x5e, 0x81, 0xb8, 0xb1, 0x49, 0xb6, 0x9c, 0xb6, 0x72, 0x2f, 0x74, 0x2b, 0xd7, 0x4a, + 0x3c, 0x7f, 0xde, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, + 0x22, 0xf7, 0x9d, 0xad, 0xa6, 0x4f, 0x3a, 0xf4, 0xc9, 0xfe, 0x43, 0x0b, 0xce, 0x2c, 0xdc, 0xae, + 0x2f, 0xfb, 0x4e, 0x9c, 0x78, 0x8d, 0x45, 0x3f, 0x6c, 0xdc, 0xad, 0x27, 0x61, 0x44, 0x6e, 0x85, + 0x7e, 0x6b, 0x8b, 0xd4, 0xd9, 0xf0, 0xa1, 0x73, 0x30, 0xb4, 0xcd, 0xfe, 0xaf, 0x56, 0xa7, 0xad, + 0x33, 0xd6, 0xd9, 0xca, 0xe2, 0xc4, 0x8f, 0x76, 0x67, 0x3f, 0xb4, 0xb7, 0x3b, 0x3b, 0x74, 0x4b, + 0xc0, 0xb1, 0xa2, 0x40, 0x4f, 0xc3, 0xc0, 0x7a, 0xbc, 0xb6, 0xd3, 0x24, 0xd3, 0x25, 0x46, 0x3b, + 0x26, 0x68, 0x07, 0x56, 0xea, 0x14, 0x8a, 0x05, 0x16, 0xcd, 0x43, 0xa5, 0xe9, 0x44, 0x89, 0x97, + 0x78, 0x61, 0x30, 0x5d, 0x3e, 0x63, 0x9d, 0xed, 0x5f, 0x9c, 0x14, 0xa4, 0x95, 0x9a, 0x44, 0xe0, + 0x94, 0x86, 0x36, 0x23, 0x22, 0x8e, 0x7b, 0x23, 0xf0, 0x77, 0xa6, 0xfb, 0xce, 0x58, 0x67, 0x87, + 0xd2, 0x66, 0x60, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0x7e, 0x09, 0x86, 0x16, 0xd6, 0xd7, 0xbd, 0xc0, + 0x4b, 0x76, 0xd0, 0xdb, 0x30, 0x12, 0x84, 0x2e, 0x91, 0xff, 0x59, 0x2f, 0x86, 0x2f, 0x3c, 0x3b, + 0x77, 0xd0, 0x54, 0x9c, 0xbb, 0xae, 0x95, 0x58, 0x9c, 0xd8, 0xdb, 0x9d, 0x1d, 0xd1, 0x21, 0xd8, + 0xe0, 0x88, 0xde, 0x84, 0xe1, 0x66, 0xe8, 0xaa, 0x0a, 0x4a, 0xac, 0x82, 0x67, 0x0e, 0xae, 0xa0, + 0x96, 0x16, 0x58, 0x1c, 0xdf, 0xdb, 0x9d, 0x1d, 0xd6, 0x00, 0x58, 0x67, 0x87, 0x7c, 0x18, 0xa7, + 0x7f, 0x83, 0xc4, 0x53, 0x35, 0x94, 0x59, 0x0d, 0xcf, 0xe7, 0xd7, 0xa0, 0x15, 0x5a, 0x3c, 0xb1, + 0xb7, 0x3b, 0x3b, 0x9e, 0x01, 0xe2, 0x2c, 0x6b, 0xfb, 0x8b, 0x30, 0xb6, 0x90, 0x24, 0x4e, 0x63, + 0x93, 0xb8, 0xfc, 0xfb, 0xa2, 0x17, 0xa1, 0x2f, 0x70, 0xb6, 0x88, 0xf8, 0xfa, 0x67, 0xc4, 0xb0, + 0xf7, 0x5d, 0x77, 0xb6, 0xc8, 0xfe, 0xee, 0xec, 0xc4, 0xcd, 0xc0, 0x7b, 0xb7, 0x25, 0xe6, 0x0c, + 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xdb, 0x6b, 0x90, 0x9a, 0x93, 0x6c, 0x8a, 0xd9, + 0x80, 0x44, 0x59, 0xa8, 0x2a, 0x0c, 0xd6, 0xa8, 0xec, 0xaf, 0x58, 0x50, 0x59, 0xd8, 0x0e, 0x3d, + 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0xeb, 0x24, 0x52, 0xa0, 0x69, 0xeb, 0x4c, + 0xf9, 0xec, 0xf0, 0x85, 0x0b, 0x39, 0xfd, 0x36, 0x0b, 0x2d, 0x07, 0x49, 0xb4, 0xb3, 0xf8, 0x88, + 0xa8, 0x7a, 0x3c, 0x83, 0xc5, 0xd9, 0x3a, 0xec, 0x5f, 0x2a, 0xc1, 0xc9, 0x85, 0x2f, 0xb6, 0x22, + 0x52, 0xf5, 0xe2, 0xbb, 0xd9, 0xa5, 0xe0, 0x7a, 0xf1, 0xdd, 0xeb, 0xe9, 0x60, 0xa8, 0x39, 0x58, + 0x15, 0x70, 0xac, 0x28, 0xd0, 0xf3, 0x30, 0x48, 0x7f, 0xdf, 0xc4, 0xab, 0xa2, 0xf7, 0x27, 0x04, + 0xf1, 0x70, 0xd5, 0x49, 0x9c, 0x2a, 0x47, 0x61, 0x49, 0x83, 0xae, 0xc1, 0x70, 0x83, 0xad, 0xf7, + 0x8d, 0x6b, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3e, 0x47, 0xc9, 0x97, 0x52, 0xf0, 0xfe, 0xee, + 0xec, 0x34, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x21, 0xf6, 0x31, 0x4e, + 0xd0, 0x61, 0x11, 0x9e, 0xd5, 0xd6, 0x54, 0x3f, 0x5b, 0x53, 0x23, 0x5d, 0xd6, 0xd3, 0x3f, 0xb5, + 0xc4, 0x98, 0xac, 0x78, 0xbe, 0x29, 0x1e, 0x2e, 0x00, 0xc4, 0xa4, 0x11, 0x91, 0x44, 0x1b, 0x15, + 0xf5, 0x99, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xba, 0xf8, 0xe3, 0x4d, 0x27, 0x62, 0xb3, 0x45, 0x8c, + 0x8d, 0x5a, 0xfc, 0x75, 0x89, 0xc0, 0x29, 0x8d, 0xb1, 0xf8, 0xcb, 0xb9, 0x8b, 0xff, 0xb7, 0x2c, + 0x18, 0x5c, 0xf4, 0x02, 0xd7, 0x0b, 0x36, 0xd0, 0xdb, 0x30, 0x44, 0x25, 0xba, 0xeb, 0x24, 0x8e, + 0x58, 0xf7, 0x1f, 0x93, 0x93, 0x47, 0x17, 0xb0, 0x72, 0xfa, 0xc4, 0x73, 0x94, 0x9a, 0x4e, 0xa2, + 0x1b, 0x77, 0xde, 0x21, 0x8d, 0xe4, 0x1a, 0x49, 0x9c, 0xb4, 0x3b, 0x29, 0x0c, 0x2b, 0xae, 0xe8, + 0x26, 0x0c, 0x24, 0x4e, 0xb4, 0x41, 0x12, 0xb1, 0xec, 0x73, 0x16, 0x25, 0xe7, 0x81, 0xe9, 0x94, + 0x23, 0x41, 0x83, 0xa4, 0x02, 0x72, 0x8d, 0x31, 0xc1, 0x82, 0x99, 0xdd, 0x80, 0x91, 0x25, 0xa7, + 0xe9, 0xdc, 0xf1, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x3e, 0x0a, 0x65, 0xc7, 0x75, 0xd9, 0x02, 0xa8, + 0x2c, 0x9e, 0xdc, 0xdb, 0x9d, 0x2d, 0x2f, 0xb8, 0xee, 0xfe, 0xee, 0x2c, 0x28, 0xaa, 0x1d, 0x4c, + 0x29, 0xd0, 0xb3, 0xd0, 0xe7, 0x46, 0x61, 0x73, 0xba, 0xc4, 0x28, 0x4f, 0xd1, 0x95, 0x5a, 0x8d, + 0xc2, 0x66, 0x86, 0x94, 0xd1, 0xd8, 0x3f, 0x2c, 0x01, 0x5a, 0x22, 0xcd, 0xcd, 0x95, 0xba, 0xf1, + 0x4d, 0xcf, 0xc2, 0xd0, 0x56, 0x18, 0x78, 0x49, 0x18, 0xc5, 0xa2, 0x42, 0x36, 0x2f, 0xae, 0x09, + 0x18, 0x56, 0x58, 0x74, 0x06, 0xfa, 0x9a, 0xe9, 0xf2, 0x1e, 0x91, 0xa2, 0x81, 0x2d, 0x6c, 0x86, + 0xa1, 0x14, 0xad, 0x98, 0x44, 0x62, 0x3e, 0x2b, 0x8a, 0x9b, 0x31, 0x89, 0x30, 0xc3, 0xa4, 0x33, + 0x88, 0xce, 0x2d, 0x31, 0x5b, 0x33, 0x33, 0x88, 0x62, 0xb0, 0x46, 0x85, 0xde, 0x82, 0x0a, 0xff, + 0x87, 0xc9, 0x3a, 0x9b, 0xba, 0xb9, 0x42, 0xe1, 0x6a, 0xd8, 0x70, 0xfc, 0xec, 0xe0, 0x8f, 0xb2, + 0x19, 0x27, 0x19, 0xe1, 0x94, 0xa7, 0x31, 0xe3, 0x06, 0x72, 0x67, 0xdc, 0xdf, 0xb3, 0x00, 0x2d, + 0x79, 0x81, 0x4b, 0xa2, 0x63, 0xd8, 0x3a, 0x7b, 0x5b, 0x0c, 0x7f, 0x4c, 0x9b, 0x16, 0x6e, 0x35, + 0xc3, 0x80, 0x04, 0xc9, 0x52, 0x18, 0xb8, 0x7c, 0x3b, 0xfd, 0x24, 0xf4, 0x25, 0xb4, 0x2a, 0xde, + 0xac, 0xa7, 0xe5, 0x67, 0xa1, 0x15, 0xec, 0xef, 0xce, 0x9e, 0x6a, 0x2f, 0xc1, 0x9a, 0xc0, 0xca, + 0xa0, 0x4f, 0xc0, 0x40, 0x9c, 0x38, 0x49, 0x2b, 0x16, 0x0d, 0x7d, 0x42, 0x36, 0xb4, 0xce, 0xa0, + 0xfb, 0xbb, 0xb3, 0xe3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x03, 0x83, 0x5b, 0x24, 0x8e, + 0x9d, 0x0d, 0x29, 0xe0, 0xc6, 0x45, 0xd9, 0xc1, 0x6b, 0x1c, 0x8c, 0x25, 0x1e, 0x3d, 0x09, 0xfd, + 0x24, 0x8a, 0xc2, 0x48, 0xcc, 0x88, 0x51, 0x41, 0xd8, 0xbf, 0x4c, 0x81, 0x98, 0xe3, 0xec, 0xff, + 0x6e, 0xc1, 0xb8, 0x6a, 0x2b, 0xaf, 0xeb, 0x18, 0x96, 0xbc, 0x0b, 0xd0, 0x90, 0x1d, 0x8c, 0xd9, + 0x42, 0xd3, 0xea, 0xe8, 0x3c, 0xfd, 0xda, 0x07, 0x34, 0xad, 0x43, 0x81, 0x62, 0xac, 0xf1, 0xb5, + 0xff, 0x93, 0x05, 0x27, 0x32, 0x7d, 0xbb, 0xea, 0xc5, 0x09, 0x7a, 0xb3, 0xad, 0x7f, 0x73, 0xc5, + 0xfa, 0x47, 0x4b, 0xb3, 0xde, 0xa9, 0xf9, 0x22, 0x21, 0x5a, 0xdf, 0x30, 0xf4, 0x7b, 0x09, 0xd9, + 0x92, 0xdd, 0x7a, 0xbe, 0x60, 0xb7, 0x78, 0xfb, 0xd2, 0xaf, 0xb4, 0x4a, 0x79, 0x60, 0xce, 0xca, + 0xfe, 0x3f, 0x16, 0x54, 0x96, 0xc2, 0x60, 0xdd, 0xdb, 0xb8, 0xe6, 0x34, 0x8f, 0xe1, 0xfb, 0xd4, + 0xa1, 0x8f, 0x71, 0xe7, 0x5d, 0x38, 0x9f, 0xd7, 0x05, 0xd1, 0xb0, 0x39, 0xba, 0xa7, 0x72, 0x65, + 0x41, 0x89, 0x29, 0x0a, 0xc2, 0x8c, 0xd9, 0xcc, 0xcb, 0x50, 0x51, 0x04, 0x68, 0x02, 0xca, 0x77, + 0x09, 0xd7, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0x53, 0xd0, 0xbf, 0xed, 0xf8, 0x2d, 0xb1, 0x78, 0x31, + 0xff, 0xf3, 0xc9, 0xd2, 0x45, 0xcb, 0xfe, 0x21, 0x5b, 0x81, 0xa2, 0x92, 0xe5, 0x60, 0x5b, 0x08, + 0x87, 0xaf, 0x5a, 0x30, 0xe5, 0x77, 0x10, 0x4a, 0x62, 0x4c, 0x0e, 0x23, 0xce, 0x1e, 0x13, 0xcd, + 0x9e, 0xea, 0x84, 0xc5, 0x1d, 0x6b, 0xa3, 0xb2, 0x3e, 0x6c, 0xd2, 0x09, 0xe7, 0xf8, 0xac, 0xe9, + 0x42, 0x07, 0xb8, 0x21, 0x60, 0x58, 0x61, 0xed, 0x3f, 0xb3, 0x60, 0x4a, 0xf5, 0xe3, 0x0a, 0xd9, + 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0x58, 0x7a, 0xf2, 0x38, 0xff, 0x26, 0x5c, 0x26, 0x0d, + 0x0b, 0x06, 0xe5, 0x2b, 0x64, 0x87, 0x7f, 0x20, 0xbd, 0xa3, 0xe5, 0x03, 0x3b, 0xfa, 0x6f, 0x2d, + 0x18, 0x55, 0x1d, 0x3d, 0x86, 0x25, 0x77, 0xd5, 0x5c, 0x72, 0x1f, 0x2d, 0x38, 0x5f, 0xbb, 0x2c, + 0xb6, 0xbf, 0x5b, 0xa2, 0x62, 0x43, 0xd0, 0xd4, 0xa2, 0x90, 0x0e, 0x12, 0x95, 0xf8, 0x0f, 0xc9, + 0x57, 0xea, 0xad, 0xb3, 0x57, 0xc8, 0xce, 0x5a, 0x48, 0xb5, 0x89, 0xce, 0x9d, 0x35, 0x3e, 0x6a, + 0xdf, 0x81, 0x1f, 0xf5, 0x77, 0x4b, 0x70, 0x52, 0x0d, 0x8b, 0xb1, 0x4b, 0xff, 0x4c, 0x0e, 0xcc, + 0x79, 0x18, 0x76, 0xc9, 0xba, 0xd3, 0xf2, 0x13, 0x65, 0x4d, 0xf4, 0x73, 0x33, 0xb3, 0x9a, 0x82, + 0xb1, 0x4e, 0xd3, 0xc3, 0x58, 0x7e, 0x73, 0x98, 0xc9, 0xf3, 0xc4, 0xa1, 0xb3, 0x9e, 0x6a, 0x78, + 0x9a, 0x79, 0x38, 0xa2, 0x9b, 0x87, 0xc2, 0x14, 0x7c, 0x12, 0xfa, 0xbd, 0x2d, 0xba, 0xe7, 0x97, + 0xcc, 0xad, 0x7c, 0x95, 0x02, 0x31, 0xc7, 0xa1, 0xa7, 0x60, 0xb0, 0x11, 0x6e, 0x6d, 0x39, 0x81, + 0x3b, 0x5d, 0x66, 0x3a, 0xe7, 0x30, 0x55, 0x0b, 0x96, 0x38, 0x08, 0x4b, 0x1c, 0x7a, 0x0c, 0xfa, + 0x9c, 0x68, 0x23, 0x9e, 0xee, 0x63, 0x34, 0x43, 0xb4, 0xa6, 0x85, 0x68, 0x23, 0xc6, 0x0c, 0x4a, + 0x75, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xaa, 0x5e, 0xc4, 0x14, 0x43, 0x4d, 0x97, 0xbc, + 0xad, 0x30, 0x58, 0xa3, 0x42, 0x35, 0xe8, 0x6f, 0x86, 0x51, 0x12, 0x4f, 0x0f, 0xb0, 0x81, 0x7f, + 0x2e, 0x77, 0xf9, 0xf1, 0x7e, 0xd7, 0xc2, 0x28, 0x49, 0xbb, 0x42, 0xff, 0xc5, 0x98, 0x33, 0x42, + 0x4b, 0x50, 0x26, 0xc1, 0xf6, 0xf4, 0x20, 0xe3, 0xf7, 0x91, 0x83, 0xf9, 0x2d, 0x07, 0xdb, 0xb7, + 0x9c, 0x28, 0x95, 0x57, 0xcb, 0xc1, 0x36, 0xa6, 0xa5, 0x51, 0x03, 0x2a, 0xd2, 0x85, 0x15, 0x4f, + 0x0f, 0x15, 0x99, 0x8a, 0x58, 0x90, 0x63, 0xf2, 0x6e, 0xcb, 0x8b, 0xc8, 0x16, 0x09, 0x92, 0x38, + 0x35, 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x11, 0xae, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, + 0x12, 0x4f, 0x57, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x8b, 0x53, 0x82, 0xfd, 0x88, + 0x06, 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xa3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, + 0xbc, 0x43, 0xa6, 0x81, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x16, 0x27, 0xf7, 0x76, + 0x67, 0x47, 0xaf, 0xea, 0xa5, 0xb1, 0xc9, 0x0c, 0xbd, 0x05, 0x63, 0x54, 0xd9, 0xf5, 0x52, 0xf6, + 0xc3, 0xc5, 0xd9, 0xa3, 0xbd, 0xdd, 0xd9, 0x31, 0x6c, 0x14, 0xc7, 0x19, 0x76, 0x68, 0x0d, 0x2a, + 0xbe, 0xb7, 0x4e, 0x1a, 0x3b, 0x0d, 0x9f, 0x4c, 0x8f, 0x30, 0xde, 0x39, 0x8b, 0xf3, 0xaa, 0x24, + 0xe7, 0x06, 0x86, 0xfa, 0x8b, 0x53, 0x46, 0xe8, 0x16, 0x9c, 0x4a, 0x48, 0xb4, 0xe5, 0x05, 0x0e, + 0x5d, 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x51, 0x36, 0x6b, 0x4f, 0x8b, 0x81, 0x3d, 0xb5, 0xd6, + 0x91, 0x0a, 0x77, 0x29, 0x8d, 0x6e, 0xc0, 0x38, 0x5b, 0x4f, 0xb5, 0x96, 0xef, 0xd7, 0x42, 0xdf, + 0x6b, 0xec, 0x4c, 0x8f, 0x31, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0xaa, 0x89, 0xa6, 0x86, 0x61, 0xfa, + 0x0f, 0x67, 0x4b, 0x23, 0x1f, 0xc6, 0x63, 0xd2, 0x68, 0x45, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, + 0x9f, 0x4c, 0x8f, 0x17, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, + 0x15, 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x04, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, + 0x1c, 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x9e, 0x64, 0x84, 0xa9, 0xff, 0x40, 0x22, 0x70, + 0x4a, 0x43, 0x55, 0x83, 0x24, 0xd9, 0x99, 0x46, 0x8c, 0x54, 0x2d, 0xb5, 0xb5, 0xb5, 0xcf, 0x61, + 0x0a, 0x47, 0xb7, 0x60, 0x90, 0x04, 0xdb, 0x2b, 0x51, 0xb8, 0x35, 0x7d, 0xa2, 0x88, 0x0c, 0x58, + 0xe6, 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0xd3, 0x1d, 0xbe, + 0x12, 0xff, 0x28, 0x53, 0xec, 0xa3, 0x7c, 0x4a, 0x94, 0x9d, 0x5e, 0xeb, 0x42, 0xb7, 0x7f, 0x00, + 0x0e, 0x77, 0xe5, 0x6e, 0xdf, 0x81, 0x31, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0xb3, 0xd0, 0x4f, 0x65, + 0xb1, 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x48, + 0x16, 0x77, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x71, + 0x35, 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0x73, 0x30, 0xb4, 0x19, 0xc6, 0x09, 0xa5, 0x66, 0x75, + 0xf4, 0xa7, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x02, 0xa3, 0x0d, 0xbd, 0x02, 0xb1, + 0x8d, 0x9d, 0x14, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x10, 0xf3, 0x72, 0x37, 0x42, + 0x5f, 0x98, 0x90, 0x72, 0x57, 0x1e, 0xaa, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, + 0xd3, 0x26, 0xac, 0xd6, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0xd7, + 0x25, 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x1b, 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x10, + 0xda, 0xc3, 0x0b, 0x05, 0x77, 0x13, 0x56, 0xfc, 0x36, 0x2f, 0xca, 0x77, 0x3e, 0xf1, 0x07, 0x4b, + 0x86, 0x94, 0x77, 0xd4, 0x0a, 0x02, 0xca, 0xbb, 0xd4, 0x3b, 0x6f, 0xcc, 0x8b, 0x72, 0xde, 0xe2, + 0x0f, 0x96, 0x0c, 0xd1, 0x3a, 0x80, 0x9c, 0x4b, 0xc4, 0x15, 0xde, 0xe5, 0x8f, 0xf7, 0xc2, 0x7e, + 0x4d, 0x95, 0x5e, 0x1c, 0xa3, 0x7b, 0x6d, 0xfa, 0x1f, 0x6b, 0x9c, 0xed, 0x84, 0x29, 0x61, 0xed, + 0xcd, 0x42, 0x9f, 0xa7, 0x4b, 0xda, 0x89, 0x12, 0xe2, 0x2e, 0x24, 0x59, 0x07, 0xfd, 0xc1, 0x2a, + 0xf6, 0x9a, 0xb7, 0x45, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xbd, 0x32, 0x4c, 0x77, + 0x6b, 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x51, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0xb2, 0x80, + 0x63, 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x48, 0x63, 0xa9, 0x3f, 0x9d, 0x1b, 0x75, 0x06, 0xc5, + 0x02, 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, + 0x0e, 0x91, 0xbe, 0x1c, 0x87, 0x88, 0x31, 0x44, 0xfd, 0x0f, 0x76, 0x88, 0xd0, 0x17, 0x00, 0xd6, + 0xbd, 0xc0, 0x8b, 0x37, 0x19, 0xf7, 0x81, 0x9e, 0xb9, 0x2b, 0x25, 0x6b, 0x45, 0x71, 0xc1, 0x1a, + 0x47, 0xf4, 0x12, 0x0c, 0xab, 0xe5, 0xb9, 0x5a, 0x9d, 0x1e, 0x34, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, + 0x62, 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, + 0x83, 0xc7, 0xd7, 0xfe, 0x6f, 0x65, 0x18, 0x37, 0x2a, 0x6b, 0xc5, 0x05, 0x24, 0xda, 0x6b, 0x74, + 0xc3, 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xb9, 0x5e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, + 0xa1, 0x4d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xde, 0xd8, 0xa6, 0xe6, 0x87, + 0x13, 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, + 0x35, 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x89, 0x08, 0x9b, 0x29, 0x4b, 0x54, + 0x9f, 0x63, 0x53, 0xaf, 0x3f, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1c, + 0xa0, 0xf7, 0x3f, 0x03, 0x83, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x72, 0x30, 0x96, 0xf8, + 0xec, 0x24, 0x1a, 0x2a, 0x38, 0x89, 0x9e, 0x85, 0xb1, 0xaa, 0x43, 0xb6, 0xc2, 0x60, 0x39, 0x70, + 0x9b, 0xa1, 0x17, 0x24, 0x68, 0x1a, 0xfa, 0xd8, 0x7e, 0xc2, 0xd7, 0x7b, 0x1f, 0xe5, 0x80, 0xfb, + 0xa8, 0xee, 0x6e, 0xff, 0x71, 0x09, 0x46, 0xab, 0xc4, 0x27, 0x09, 0xe1, 0x76, 0x4f, 0x8c, 0x56, + 0x00, 0x6d, 0x44, 0x4e, 0x83, 0xd4, 0x48, 0xe4, 0x85, 0x6e, 0x9d, 0x34, 0xc2, 0x80, 0x1d, 0x44, + 0xd1, 0x0d, 0xf2, 0xd4, 0xde, 0xee, 0x2c, 0xba, 0xd4, 0x86, 0xc5, 0x1d, 0x4a, 0x20, 0x17, 0x46, + 0x9b, 0x11, 0x31, 0xfc, 0x86, 0x56, 0xbe, 0xaa, 0x51, 0xd3, 0x8b, 0x70, 0x6d, 0xd8, 0x00, 0x61, + 0x93, 0x29, 0xfa, 0x0c, 0x4c, 0x84, 0x51, 0x73, 0xd3, 0x09, 0xaa, 0xa4, 0x49, 0x02, 0x97, 0x9a, + 0x00, 0xc2, 0xdb, 0x31, 0xb5, 0xb7, 0x3b, 0x3b, 0x71, 0x23, 0x83, 0xc3, 0x6d, 0xd4, 0xe8, 0x0d, + 0x98, 0x6c, 0x46, 0x61, 0xd3, 0xd9, 0x60, 0x53, 0x46, 0x68, 0x2b, 0x5c, 0x36, 0x9d, 0xdb, 0xdb, + 0x9d, 0x9d, 0xac, 0x65, 0x91, 0xfb, 0xbb, 0xb3, 0x27, 0xd8, 0x90, 0x51, 0x48, 0x8a, 0xc4, 0xed, + 0x6c, 0xec, 0x77, 0xe1, 0x64, 0x35, 0xbc, 0x17, 0xdc, 0x73, 0x22, 0x77, 0xa1, 0xb6, 0xaa, 0x39, + 0x27, 0x5e, 0x97, 0xc6, 0x2f, 0x3f, 0xe0, 0xcb, 0xd9, 0xd9, 0x34, 0x1e, 0xdc, 0xec, 0x58, 0xf1, + 0x7c, 0xd2, 0xc5, 0x1d, 0xf2, 0xcf, 0x4a, 0x46, 0x9d, 0x29, 0xbd, 0x3a, 0xbb, 0xb0, 0xba, 0x9e, + 0x5d, 0x7c, 0x1e, 0x86, 0xd6, 0x3d, 0xe2, 0xbb, 0x98, 0xac, 0x8b, 0xaf, 0x75, 0xbe, 0xc8, 0xe1, + 0xce, 0x0a, 0x2d, 0x23, 0xbd, 0x63, 0xdc, 0x88, 0x5e, 0x11, 0x6c, 0xb0, 0x62, 0x88, 0x5a, 0x30, + 0x21, 0xed, 0x30, 0x89, 0x15, 0x8b, 0xfd, 0x85, 0x62, 0x66, 0x9e, 0x59, 0x0d, 0xfb, 0xbc, 0x38, + 0xc3, 0x10, 0xb7, 0x55, 0x41, 0xed, 0xe7, 0x2d, 0xba, 0xd5, 0xf5, 0xb1, 0xa9, 0xcf, 0xec, 0x67, + 0xe6, 0x0a, 0x60, 0x50, 0xfb, 0xd7, 0x2c, 0x78, 0xa4, 0x6d, 0xb4, 0x84, 0x9f, 0xe4, 0xc8, 0xbe, + 0x51, 0xd6, 0x59, 0x51, 0xca, 0x77, 0x56, 0xd8, 0x37, 0x60, 0x6a, 0x79, 0xab, 0x99, 0xec, 0x54, + 0x3d, 0xf3, 0xc8, 0xe5, 0x65, 0x18, 0xd8, 0x22, 0xae, 0xd7, 0xda, 0x12, 0x9f, 0x75, 0x56, 0xee, + 0x0b, 0xd7, 0x18, 0x74, 0x7f, 0x77, 0x76, 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x41, 0x38, 0x00, 0x0b, + 0x72, 0xfb, 0x7d, 0x0b, 0xc6, 0xa5, 0x7c, 0x58, 0x70, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x81, 0x92, + 0xd7, 0x14, 0x8c, 0x40, 0x30, 0x2a, 0xad, 0xd6, 0x70, 0xc9, 0x6b, 0xa2, 0x37, 0xa0, 0xc2, 0x4f, + 0xea, 0xd2, 0xc9, 0xd1, 0xe3, 0xc9, 0x1f, 0xb3, 0x0d, 0xd7, 0x24, 0x0f, 0x9c, 0xb2, 0x93, 0x5a, + 0x32, 0xdb, 0x79, 0xca, 0xe6, 0xb9, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0x9d, 0x85, 0xa1, 0x20, + 0x74, 0xf9, 0x61, 0x2a, 0x5f, 0xa7, 0x6c, 0xca, 0x5d, 0x17, 0x30, 0xac, 0xb0, 0xf6, 0xd7, 0x2d, + 0x18, 0x91, 0x7d, 0x2c, 0xa8, 0xb0, 0xd3, 0x45, 0x92, 0x2a, 0xeb, 0xe9, 0x22, 0xa1, 0x0a, 0x37, + 0xc3, 0x18, 0x7a, 0x76, 0xb9, 0x17, 0x3d, 0xdb, 0xfe, 0x8d, 0x12, 0x8c, 0xc9, 0xe6, 0xd4, 0x5b, + 0x77, 0x62, 0x42, 0xd5, 0x90, 0x8a, 0xc3, 0x07, 0x9f, 0xc8, 0x79, 0xf6, 0x7c, 0x9e, 0x2d, 0x66, + 0x7c, 0xb3, 0x54, 0xcd, 0x59, 0x90, 0x7c, 0x70, 0xca, 0x12, 0x6d, 0xc3, 0x64, 0x10, 0x26, 0x6c, + 0x7b, 0x53, 0xf8, 0x62, 0x27, 0x1d, 0xd9, 0x7a, 0x1e, 0x15, 0xf5, 0x4c, 0x5e, 0xcf, 0xf2, 0xc3, + 0xed, 0x55, 0xa0, 0x1b, 0xd2, 0xc7, 0x54, 0x66, 0x75, 0x3d, 0x5b, 0xac, 0xae, 0xee, 0x2e, 0x26, + 0xfb, 0x77, 0x2c, 0xa8, 0x48, 0xb2, 0xe3, 0x38, 0xf2, 0xba, 0x0d, 0x83, 0x31, 0xfb, 0x44, 0x72, + 0xb8, 0xce, 0x15, 0xeb, 0x02, 0xff, 0xae, 0xe9, 0x9e, 0xce, 0xff, 0xc7, 0x58, 0x72, 0x63, 0xce, + 0x76, 0xd5, 0x91, 0x87, 0xce, 0xd9, 0xae, 0x5a, 0xd6, 0xfd, 0x64, 0x6b, 0xd4, 0xf0, 0x06, 0x50, + 0xc5, 0xb4, 0x19, 0x91, 0x75, 0xef, 0x7e, 0x56, 0x31, 0xad, 0x31, 0x28, 0x16, 0x58, 0xb4, 0x0e, + 0x23, 0x0d, 0xe9, 0x8e, 0x4e, 0x45, 0xc8, 0xc7, 0x0a, 0xfa, 0xfe, 0xd5, 0x31, 0x12, 0x0f, 0x4d, + 0x5a, 0xd2, 0x38, 0x61, 0x83, 0x2f, 0x95, 0x53, 0xe9, 0x49, 0x79, 0xb9, 0xa0, 0xe3, 0x26, 0x22, + 0x49, 0x5a, 0x43, 0xd7, 0x43, 0x72, 0xfb, 0x5b, 0x16, 0x0c, 0x70, 0xff, 0x65, 0x31, 0x27, 0xb0, + 0x76, 0x40, 0x96, 0x8e, 0xe7, 0x2d, 0x0a, 0x14, 0xe7, 0x65, 0xe8, 0x36, 0x54, 0xd8, 0x0f, 0xe6, + 0x8b, 0x29, 0x17, 0x89, 0xd3, 0xe2, 0xf5, 0xeb, 0x4d, 0xbd, 0x25, 0x19, 0xe0, 0x94, 0x97, 0xfd, + 0x83, 0x32, 0x15, 0x7d, 0x29, 0xa9, 0xb1, 0xb7, 0x5b, 0xc7, 0xb1, 0xb7, 0x97, 0x8e, 0x7e, 0x6f, + 0x7f, 0x17, 0xc6, 0x1b, 0xda, 0x01, 0x5d, 0xfa, 0xc5, 0x2f, 0x14, 0x9c, 0x56, 0xda, 0xa9, 0x1e, + 0xf7, 0xd7, 0x2d, 0x99, 0xec, 0x70, 0x96, 0x3f, 0x22, 0x30, 0xc2, 0xe7, 0x83, 0xa8, 0xaf, 0x8f, + 0xd5, 0x37, 0x5f, 0x64, 0x86, 0xe9, 0x95, 0xb1, 0x59, 0x5c, 0xd7, 0x18, 0x61, 0x83, 0xad, 0xfd, + 0x2b, 0xfd, 0xd0, 0xbf, 0xbc, 0x4d, 0x82, 0xe4, 0x18, 0x44, 0xdd, 0x16, 0x8c, 0x79, 0xc1, 0x76, + 0xe8, 0x6f, 0x13, 0x97, 0xe3, 0x0f, 0xb7, 0xbd, 0x9f, 0x12, 0x95, 0x8c, 0xad, 0x1a, 0xcc, 0x70, + 0x86, 0xf9, 0x51, 0x78, 0x0a, 0x5e, 0x83, 0x01, 0x3e, 0x33, 0x84, 0x9b, 0x20, 0xc7, 0x9f, 0xcf, + 0x06, 0x56, 0xac, 0xa0, 0xd4, 0x9f, 0xc1, 0x8f, 0x12, 0x04, 0x23, 0xf4, 0x0e, 0x8c, 0xad, 0x7b, + 0x51, 0x9c, 0x50, 0x63, 0x3f, 0x4e, 0x9c, 0xad, 0xe6, 0x21, 0x7c, 0x04, 0x6a, 0x44, 0x56, 0x0c, + 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc0, 0x28, 0x35, 0x51, 0xd3, 0xaa, 0x06, 0x7b, 0xae, 0x4a, 0xb9, + 0x08, 0xaf, 0xea, 0x8c, 0xb0, 0xc9, 0x97, 0x8a, 0xa4, 0x06, 0x33, 0x69, 0x87, 0x98, 0x76, 0xa3, + 0x44, 0x12, 0xb7, 0x65, 0x39, 0x8e, 0x4a, 0x36, 0x16, 0x29, 0x53, 0x31, 0x25, 0x5b, 0x1a, 0x0f, + 0x63, 0x7f, 0x87, 0xee, 0xc5, 0x74, 0x0c, 0x8f, 0x61, 0xfb, 0xba, 0x6c, 0x6e, 0x5f, 0x4f, 0x16, + 0xf8, 0xb2, 0x5d, 0xb6, 0xae, 0xb7, 0x61, 0x58, 0xfb, 0xf0, 0x68, 0x1e, 0x2a, 0x0d, 0x19, 0xcc, + 0x21, 0xa4, 0xb8, 0x52, 0xa5, 0x54, 0x94, 0x07, 0x4e, 0x69, 0xe8, 0xb8, 0x50, 0x15, 0x34, 0x1b, + 0xfa, 0x45, 0x15, 0x54, 0xcc, 0x30, 0xf6, 0x0b, 0x00, 0xcb, 0xf7, 0x49, 0x63, 0x81, 0x9b, 0x78, + 0xda, 0xf9, 0x9e, 0xd5, 0xfd, 0x7c, 0xcf, 0xfe, 0xb6, 0x05, 0x63, 0x2b, 0x4b, 0x86, 0x4e, 0x3f, + 0x07, 0xc0, 0x75, 0xe3, 0xdb, 0xb7, 0xaf, 0x4b, 0xff, 0x35, 0x77, 0x32, 0x2a, 0x28, 0xd6, 0x28, + 0xd0, 0xa3, 0x50, 0xf6, 0x5b, 0x81, 0x50, 0x59, 0x07, 0xf7, 0x76, 0x67, 0xcb, 0x57, 0x5b, 0x01, + 0xa6, 0x30, 0x2d, 0xc6, 0xaa, 0x5c, 0x38, 0xc6, 0x2a, 0x3f, 0xda, 0xf8, 0x1b, 0x65, 0x98, 0x58, + 0xf1, 0xc9, 0x7d, 0xa3, 0xd5, 0x4f, 0xc3, 0x80, 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x2a, 0x02, 0x55, + 0x06, 0xc5, 0x02, 0x5b, 0x38, 0xec, 0xeb, 0xad, 0xf6, 0x8d, 0xfc, 0xe8, 0x42, 0xde, 0x72, 0xfb, + 0x8c, 0xd6, 0x61, 0x90, 0x9f, 0x07, 0xc7, 0xd3, 0xfd, 0x6c, 0x2a, 0xbe, 0x72, 0x70, 0x63, 0xb2, + 0xe3, 0x33, 0x27, 0xfc, 0x2b, 0x3c, 0xe0, 0x46, 0xc9, 0x32, 0x01, 0xc5, 0x92, 0xf9, 0xcc, 0x27, + 0x61, 0x44, 0xa7, 0xec, 0x29, 0xf2, 0xe6, 0xaf, 0x5b, 0x70, 0x62, 0xc5, 0x0f, 0x1b, 0x77, 0x33, + 0x71, 0x79, 0x2f, 0xc1, 0x30, 0x5d, 0x4c, 0xb1, 0x11, 0xb4, 0x6a, 0x44, 0xe7, 0x0a, 0x14, 0xd6, + 0xe9, 0xb4, 0x62, 0x37, 0x6f, 0xae, 0x56, 0x3b, 0x05, 0xf5, 0x0a, 0x14, 0xd6, 0xe9, 0xec, 0xdf, + 0xb3, 0xe0, 0xf1, 0x4b, 0x4b, 0xcb, 0x35, 0x12, 0xc5, 0x5e, 0x9c, 0x90, 0x20, 0x69, 0x8b, 0x2b, + 0xa6, 0x3a, 0xa3, 0xab, 0x35, 0x25, 0xd5, 0x19, 0xab, 0xac, 0x15, 0x02, 0xfb, 0xb0, 0x04, 0xd7, + 0x7f, 0xcb, 0x82, 0x13, 0x97, 0xbc, 0x04, 0x93, 0x66, 0x98, 0x0d, 0x05, 0x8e, 0x48, 0x33, 0x8c, + 0xbd, 0x24, 0x8c, 0x76, 0xb2, 0xa1, 0xc0, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf6, 0x62, + 0xda, 0xd2, 0x92, 0x69, 0xea, 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, + 0xec, 0x88, 0x15, 0xac, 0x3a, 0x56, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0xff, 0xc0, 0x82, 0x93, 0x97, + 0xfc, 0x56, 0x9c, 0x90, 0x68, 0x3d, 0x36, 0x1a, 0xfb, 0x02, 0x54, 0x88, 0x54, 0xee, 0x45, 0x5b, + 0xd5, 0xa6, 0xa1, 0xb4, 0x7e, 0x1e, 0x87, 0xac, 0xe8, 0x0a, 0x84, 0xbb, 0xf6, 0x16, 0x9c, 0xf9, + 0x9b, 0x25, 0x18, 0xbd, 0xbc, 0xb6, 0x56, 0xbb, 0x44, 0x12, 0x21, 0x25, 0xf3, 0x9d, 0x52, 0x58, + 0xb3, 0xc8, 0x0f, 0x52, 0x7e, 0x5a, 0x89, 0xe7, 0xcf, 0xf1, 0xeb, 0x22, 0x73, 0xab, 0x41, 0x72, + 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, 0x74, 0xb4, 0xe1, 0xa5, 0x2c, 0x2f, 0x77, 0x93, 0xe5, 0xe8, + 0x05, 0x18, 0x60, 0xf7, 0x55, 0xa4, 0xf2, 0xf1, 0x61, 0xa5, 0x27, 0x30, 0xe8, 0xfe, 0xee, 0x6c, + 0xe5, 0x26, 0x5e, 0xe5, 0x7f, 0xb0, 0x20, 0x45, 0x6f, 0xc1, 0xf0, 0x66, 0x92, 0x34, 0x2f, 0x13, + 0xc7, 0x25, 0x91, 0x94, 0x13, 0x67, 0x0f, 0x96, 0x13, 0x74, 0x38, 0x78, 0x81, 0x74, 0x69, 0xa5, + 0xb0, 0x18, 0xeb, 0x1c, 0xed, 0x3a, 0x40, 0x8a, 0x7b, 0x40, 0x36, 0x88, 0xfd, 0xf3, 0x25, 0x18, + 0xbc, 0xec, 0x04, 0xae, 0x4f, 0x22, 0xb4, 0x02, 0x7d, 0xe4, 0x3e, 0x69, 0x88, 0x8d, 0x3c, 0xa7, + 0xe9, 0xe9, 0x66, 0xc7, 0xfd, 0x6a, 0xf4, 0x3f, 0x66, 0xe5, 0x11, 0x86, 0x41, 0xda, 0xee, 0x4b, + 0x2a, 0x4a, 0xfc, 0xb9, 0xfc, 0x51, 0x50, 0x93, 0x82, 0xef, 0x94, 0x02, 0x84, 0x25, 0x23, 0xe6, + 0x81, 0x6a, 0x34, 0xeb, 0x54, 0xbc, 0x25, 0xc5, 0x2c, 0xbb, 0xb5, 0xa5, 0x1a, 0x27, 0x17, 0x7c, + 0xb9, 0x07, 0x4a, 0x02, 0x71, 0xca, 0xce, 0xbe, 0x08, 0x53, 0xec, 0x3c, 0xd6, 0x49, 0x36, 0x8d, + 0x55, 0x93, 0x3b, 0x3d, 0xed, 0x1f, 0x95, 0x60, 0x72, 0xb5, 0xbe, 0x54, 0x37, 0x7d, 0x87, 0x17, + 0x61, 0x84, 0x6f, 0xd0, 0x74, 0xd2, 0x39, 0xbe, 0x28, 0xaf, 0xce, 0x10, 0xd6, 0x34, 0x1c, 0x36, + 0x28, 0xd1, 0xe3, 0x50, 0xf6, 0xde, 0x0d, 0xb2, 0x51, 0x7d, 0xab, 0xaf, 0x5d, 0xc7, 0x14, 0x4e, + 0xd1, 0x74, 0xaf, 0xe7, 0x42, 0x4e, 0xa1, 0xd5, 0x7e, 0xff, 0x2a, 0x8c, 0x79, 0x71, 0x23, 0xf6, + 0x56, 0x03, 0x2a, 0x01, 0x9c, 0x86, 0x9c, 0xbe, 0xa9, 0x72, 0x4e, 0x9b, 0xaa, 0xb0, 0x38, 0x43, + 0xad, 0x49, 0xdc, 0xfe, 0xc2, 0xfa, 0x42, 0x6e, 0xb8, 0x38, 0x55, 0x85, 0x9a, 0xac, 0x77, 0x31, + 0x8b, 0x11, 0x12, 0xaa, 0x10, 0xef, 0x70, 0x8c, 0x25, 0xce, 0x7e, 0x07, 0x2a, 0x2a, 0xcc, 0x4b, + 0x46, 0x37, 0x5a, 0x5d, 0xa2, 0x1b, 0xf3, 0x25, 0x93, 0x74, 0xfc, 0x96, 0x3b, 0x3a, 0x7e, 0xff, + 0x85, 0x05, 0x69, 0x9c, 0x0a, 0xc2, 0x50, 0x69, 0x86, 0xec, 0x90, 0x28, 0x92, 0xa7, 0xb1, 0x4f, + 0xe5, 0x4c, 0x58, 0xbe, 0x60, 0xf8, 0x94, 0xaa, 0xc9, 0xb2, 0x38, 0x65, 0x83, 0xae, 0xc2, 0x60, + 0x33, 0x22, 0xf5, 0x84, 0x5d, 0x4d, 0xe8, 0x81, 0x23, 0x1f, 0x1b, 0x5e, 0x12, 0x4b, 0x16, 0xf6, + 0xbf, 0xb3, 0x00, 0xae, 0x7a, 0x5b, 0x5e, 0x82, 0x9d, 0x60, 0x83, 0x1c, 0x83, 0x55, 0x78, 0x1d, + 0xfa, 0xe2, 0x26, 0x69, 0x14, 0x3b, 0xe6, 0x4b, 0x5b, 0x56, 0x6f, 0x92, 0x46, 0xfa, 0x39, 0xe8, + 0x3f, 0xcc, 0xf8, 0xd8, 0xdf, 0x07, 0x18, 0x4b, 0xc9, 0xa8, 0x66, 0x8e, 0x9e, 0x37, 0x62, 0xf2, + 0x1f, 0xcd, 0xc4, 0xe4, 0x57, 0x18, 0xb5, 0x16, 0x86, 0x9f, 0x40, 0x79, 0xcb, 0xb9, 0x2f, 0x0c, + 0x81, 0x97, 0x8a, 0x36, 0x88, 0xd6, 0x34, 0x77, 0xcd, 0xb9, 0xcf, 0xf5, 0xae, 0xe7, 0xe4, 0x44, + 0xba, 0xe6, 0xdc, 0xdf, 0xe7, 0x87, 0x79, 0x6c, 0xc1, 0x52, 0xcb, 0xe3, 0x2b, 0x7f, 0x92, 0xfe, + 0x67, 0x32, 0x94, 0x56, 0xc7, 0x6a, 0xf5, 0x02, 0xe1, 0xc7, 0xec, 0xb1, 0x56, 0x2f, 0xc8, 0xd6, + 0xea, 0x05, 0x05, 0x6a, 0xf5, 0x58, 0xf0, 0xea, 0xa0, 0x70, 0xff, 0xb3, 0xc8, 0xbf, 0xe1, 0x0b, + 0x9f, 0xe8, 0xa9, 0x6a, 0x71, 0x8e, 0xc0, 0xab, 0x9f, 0x97, 0xca, 0xa6, 0x80, 0xe6, 0x36, 0x41, + 0x56, 0x8d, 0xfe, 0xa1, 0x05, 0x63, 0xe2, 0x37, 0x26, 0xef, 0xb6, 0x48, 0x9c, 0x88, 0x4d, 0xed, + 0x33, 0x87, 0x69, 0x8d, 0x60, 0xc1, 0x1b, 0xf5, 0x71, 0x29, 0x91, 0x4c, 0x64, 0x6e, 0xdb, 0x32, + 0xed, 0x41, 0xdf, 0xb7, 0x60, 0x6a, 0xcb, 0xb9, 0xcf, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, + 0xa2, 0x1b, 0x57, 0x7a, 0x9d, 0x27, 0x6d, 0x8c, 0x78, 0x73, 0x65, 0xe0, 0xd2, 0x54, 0x27, 0x92, + 0xdc, 0x46, 0x77, 0x6c, 0xe1, 0xcc, 0x3a, 0x0c, 0xc9, 0x89, 0xd9, 0x41, 0xcd, 0xaf, 0xea, 0x7b, + 0x77, 0x8e, 0x51, 0x3d, 0x27, 0x5d, 0x63, 0x73, 0xaf, 0xb5, 0x9c, 0x20, 0xf1, 0x92, 0x1d, 0xcd, + 0x2c, 0x60, 0xf5, 0x88, 0xa9, 0x78, 0xa4, 0xf5, 0xbc, 0x03, 0x23, 0xfa, 0xbc, 0x3b, 0xd2, 0xba, + 0xde, 0x85, 0x13, 0x1d, 0x66, 0xd5, 0x91, 0x56, 0x79, 0x0f, 0x1e, 0xed, 0x3a, 0x3f, 0x8e, 0xb2, + 0x62, 0xfb, 0x37, 0x2d, 0x5d, 0x74, 0x1e, 0x83, 0xd3, 0xe5, 0x9a, 0xe9, 0x74, 0x39, 0x5b, 0x74, + 0x0d, 0x75, 0xf1, 0xbc, 0xac, 0xeb, 0xcd, 0xa7, 0x5b, 0x02, 0x5a, 0x83, 0x01, 0x9f, 0x42, 0xe4, + 0x99, 0xd7, 0xb9, 0x5e, 0x56, 0x69, 0xaa, 0x94, 0x30, 0x78, 0x8c, 0x05, 0x2f, 0xfb, 0xfb, 0x16, + 0xf4, 0xfd, 0x05, 0xde, 0x18, 0x6a, 0x63, 0x2d, 0x2e, 0xbe, 0xcf, 0x61, 0xe7, 0xde, 0xf2, 0xfd, + 0x84, 0x04, 0x31, 0xd3, 0x41, 0xbb, 0x9d, 0xda, 0x0f, 0xd3, 0xaa, 0x64, 0x10, 0xc6, 0x2b, 0x30, + 0xea, 0x3b, 0x77, 0x88, 0x2f, 0x1d, 0xc6, 0x59, 0x8b, 0xed, 0xaa, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, + 0xbc, 0xae, 0xfb, 0xd3, 0x85, 0x92, 0xa4, 0x0a, 0x1b, 0xce, 0x76, 0x6c, 0xd2, 0x52, 0x93, 0xe1, + 0x9e, 0x93, 0x34, 0x36, 0x85, 0x35, 0xa7, 0x9a, 0x7b, 0x9b, 0x02, 0x31, 0xc7, 0xa1, 0x05, 0x18, + 0x97, 0x33, 0xf6, 0x16, 0x35, 0xf3, 0xc3, 0x40, 0xe8, 0x99, 0xea, 0xd6, 0x31, 0x36, 0xd1, 0x38, + 0x4b, 0x8f, 0x3e, 0x09, 0x63, 0x74, 0x70, 0xc2, 0x56, 0x22, 0x43, 0x4c, 0xfa, 0x59, 0x88, 0x09, + 0x8b, 0x50, 0x5e, 0x33, 0x30, 0x38, 0x43, 0x69, 0xbf, 0x05, 0x27, 0xae, 0x86, 0x8e, 0xbb, 0xe8, + 0xf8, 0x4e, 0xd0, 0x20, 0xd1, 0x6a, 0xb0, 0x91, 0x7b, 0x7c, 0xad, 0x1f, 0x31, 0x97, 0xf2, 0x8e, + 0x98, 0xed, 0x08, 0x90, 0x5e, 0x81, 0x08, 0x8e, 0x7a, 0x13, 0x06, 0x3d, 0x5e, 0x95, 0x98, 0xb6, + 0xe7, 0xf3, 0xfc, 0x51, 0x6d, 0x6d, 0xd4, 0x82, 0x7d, 0x38, 0x00, 0x4b, 0x96, 0xd4, 0x04, 0xe9, + 0xe4, 0xc0, 0xca, 0xb7, 0xf2, 0xec, 0xbf, 0x69, 0xc1, 0xf8, 0xf5, 0xcc, 0x95, 0xd6, 0xa7, 0x61, + 0x80, 0x27, 0x46, 0xc8, 0xba, 0x58, 0xea, 0x0c, 0x8a, 0x05, 0xf6, 0x81, 0x5b, 0xf8, 0xbf, 0x5c, + 0x82, 0x0a, 0x0b, 0xb3, 0x6d, 0x52, 0x73, 0xe2, 0xe8, 0xd5, 0xd4, 0x6b, 0x86, 0x9a, 0x9a, 0x63, + 0x65, 0xaa, 0x86, 0x75, 0xd3, 0x52, 0xd1, 0x4d, 0x75, 0xd5, 0xb3, 0x90, 0x81, 0x99, 0x32, 0xe4, + 0xd7, 0x01, 0xc7, 0xcc, 0x9b, 0xa1, 0xf2, 0x1a, 0x28, 0x3b, 0xf4, 0x55, 0xb4, 0x0f, 0xdd, 0xa1, + 0xaf, 0x6a, 0x59, 0x17, 0xe1, 0x54, 0xd3, 0x1a, 0xcf, 0xc4, 0xf7, 0xa7, 0x59, 0xf0, 0xa4, 0xe3, + 0x7b, 0x5f, 0x24, 0xea, 0xc6, 0xf4, 0xac, 0x08, 0x86, 0x14, 0xd0, 0x7d, 0x26, 0x67, 0xc4, 0x3f, + 0x7e, 0x21, 0x3e, 0x2d, 0x62, 0x5f, 0x86, 0xf1, 0xcc, 0xd0, 0xa1, 0x97, 0xa0, 0xbf, 0xb9, 0xe9, + 0xc4, 0x24, 0x13, 0xc7, 0xd2, 0x5f, 0xa3, 0xc0, 0xfd, 0xdd, 0xd9, 0x31, 0x55, 0x80, 0x41, 0x30, + 0xa7, 0xb6, 0xbf, 0x5a, 0x82, 0xbe, 0xeb, 0xa1, 0x7b, 0x1c, 0x53, 0xed, 0xb2, 0x31, 0xd5, 0x9e, + 0xce, 0x4f, 0xa7, 0xd1, 0x75, 0x96, 0xd5, 0x32, 0xb3, 0xec, 0x6c, 0x01, 0x5e, 0x07, 0x4f, 0xb0, + 0x2d, 0x18, 0x66, 0xe9, 0x3a, 0x44, 0x20, 0xcf, 0x0b, 0x86, 0x65, 0x35, 0x9b, 0xb1, 0xac, 0xc6, + 0x35, 0x52, 0xcd, 0xbe, 0x7a, 0x06, 0x06, 0x45, 0xe0, 0x48, 0x36, 0x74, 0x54, 0xd0, 0x62, 0x89, + 0xb7, 0xff, 0x4d, 0x19, 0x8c, 0xf4, 0x20, 0xe8, 0x77, 0x2c, 0x98, 0x8b, 0xf8, 0x35, 0x1c, 0xb7, + 0xda, 0x8a, 0xbc, 0x60, 0xa3, 0xde, 0xd8, 0x24, 0x6e, 0xcb, 0xf7, 0x82, 0x8d, 0xd5, 0x8d, 0x20, + 0x54, 0xe0, 0xe5, 0xfb, 0xa4, 0xd1, 0x62, 0x7e, 0xda, 0xc2, 0x59, 0x49, 0xd4, 0xa1, 0xe9, 0x85, + 0xbd, 0xdd, 0xd9, 0x39, 0xdc, 0x53, 0x2d, 0xb8, 0xc7, 0x56, 0xa1, 0x3f, 0xb2, 0x60, 0x9e, 0x27, + 0xc8, 0x28, 0xde, 0x93, 0x42, 0x16, 0x69, 0x4d, 0x32, 0x4d, 0xd9, 0xad, 0x91, 0x68, 0x6b, 0xf1, + 0x65, 0x31, 0xc8, 0xf3, 0xb5, 0xde, 0x6a, 0xc5, 0xbd, 0x36, 0xd3, 0xfe, 0x0f, 0x65, 0x18, 0xa5, + 0xe3, 0x99, 0x5e, 0x8a, 0x7f, 0xc9, 0x98, 0x26, 0x4f, 0x64, 0xa6, 0xc9, 0xa4, 0x41, 0xfc, 0x60, + 0xee, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6c, + 0x32, 0x1b, 0xf7, 0x50, 0xe0, 0xb8, 0x53, 0x05, 0x23, 0x5d, 0xcd, 0x32, 0xc3, 0xed, 0xfc, 0xd1, + 0x36, 0x20, 0x76, 0x0e, 0x1a, 0x39, 0x41, 0xcc, 0xfb, 0xe2, 0x09, 0xbf, 0x6e, 0x6f, 0xb5, 0xce, + 0x88, 0x5a, 0xd1, 0xd5, 0x36, 0x6e, 0xb8, 0x43, 0x0d, 0xda, 0x49, 0x77, 0x7f, 0xd1, 0x93, 0xee, + 0x81, 0x9c, 0x98, 0xed, 0xaf, 0x59, 0x70, 0x82, 0x7e, 0x16, 0x33, 0xbe, 0x37, 0x46, 0x21, 0x8c, + 0xd3, 0x69, 0xe7, 0x93, 0x44, 0xc2, 0xc4, 0xfa, 0xca, 0xd1, 0xac, 0x4d, 0x3e, 0xa9, 0xfa, 0x76, + 0xc5, 0x64, 0x86, 0xb3, 0xdc, 0xed, 0x6f, 0x5b, 0xc0, 0x22, 0xee, 0x8e, 0x61, 0x33, 0xbb, 0x64, + 0x6e, 0x66, 0x76, 0xbe, 0xc4, 0xe8, 0xb2, 0x8f, 0xbd, 0x08, 0x13, 0x14, 0x5b, 0x8b, 0xc2, 0xfb, + 0x3b, 0x52, 0xd1, 0xce, 0x77, 0xf0, 0x7e, 0xad, 0xc4, 0x97, 0x8d, 0xba, 0x4f, 0x88, 0x7e, 0xc1, + 0x82, 0xa1, 0x86, 0xd3, 0x74, 0x1a, 0x3c, 0xb9, 0x52, 0x01, 0xef, 0x8c, 0x51, 0x7e, 0x6e, 0x49, + 0x94, 0xe5, 0x9e, 0x85, 0x8f, 0xc9, 0xae, 0x4b, 0x70, 0xae, 0x37, 0x41, 0x55, 0x3e, 0x73, 0x17, + 0x46, 0x0d, 0x66, 0x47, 0x6a, 0x86, 0xfe, 0x82, 0xc5, 0x85, 0xbe, 0x32, 0x15, 0xee, 0xc1, 0x64, + 0xa0, 0xfd, 0xa7, 0xe2, 0x4c, 0x6a, 0xc6, 0x73, 0xc5, 0xc5, 0x3a, 0x93, 0x82, 0x5a, 0x74, 0x61, + 0x86, 0x21, 0x6e, 0xaf, 0xc3, 0xfe, 0x55, 0x0b, 0x1e, 0xd1, 0x09, 0xb5, 0x0b, 0xa0, 0x79, 0x7e, + 0xe3, 0x2a, 0x0c, 0x85, 0x4d, 0x12, 0x39, 0xa9, 0x59, 0x74, 0x56, 0x8e, 0xff, 0x0d, 0x01, 0xdf, + 0xdf, 0x9d, 0x9d, 0xd2, 0xb9, 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x03, 0x6c, 0x5c, 0x62, 0x71, + 0x75, 0x97, 0x25, 0x1b, 0x62, 0x87, 0x2a, 0x31, 0x16, 0x18, 0xfb, 0xef, 0x58, 0x7c, 0xba, 0xe9, + 0x4d, 0x47, 0x5f, 0x82, 0x89, 0x2d, 0x6a, 0x41, 0x2d, 0xdf, 0x6f, 0xd2, 0x8d, 0x94, 0x1d, 0x27, + 0x5b, 0x45, 0xb6, 0x8f, 0x2e, 0xdd, 0x5d, 0x9c, 0x16, 0xad, 0x9f, 0xb8, 0x96, 0x61, 0x8b, 0xdb, + 0x2a, 0xb2, 0xff, 0x71, 0x89, 0xaf, 0x59, 0xa6, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5a, + 0xad, 0x62, 0x31, 0x56, 0x4a, 0xe8, 0xd4, 0x38, 0x18, 0x4b, 0x3c, 0xba, 0x00, 0x40, 0xee, 0x27, + 0x24, 0x0a, 0x1c, 0x5f, 0x1d, 0x03, 0x2b, 0x55, 0x69, 0x59, 0x61, 0xb0, 0x46, 0x45, 0xcb, 0x34, + 0xa3, 0x70, 0xdb, 0x73, 0xd9, 0xcd, 0x85, 0xb2, 0x59, 0xa6, 0xa6, 0x30, 0x58, 0xa3, 0xa2, 0x76, + 0x6b, 0x2b, 0x88, 0xf9, 0x36, 0xe6, 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbb, 0xf5, 0xa6, 0x8e, + 0xc4, 0x26, 0x2d, 0xba, 0x02, 0x03, 0x89, 0xc3, 0x0e, 0x37, 0xfb, 0x8b, 0x44, 0x8a, 0xac, 0x51, + 0x5a, 0x3d, 0x19, 0x11, 0x2d, 0x8a, 0x05, 0x0b, 0xfb, 0x0f, 0x2a, 0x00, 0xa9, 0xd6, 0x85, 0xbe, + 0xda, 0xbe, 0xe0, 0x3f, 0x5e, 0x54, 0x65, 0x7b, 0x70, 0xab, 0x1d, 0xbd, 0x67, 0xc1, 0xb0, 0xe3, + 0xfb, 0x61, 0xc3, 0x49, 0xd8, 0xf0, 0x94, 0x8a, 0x8a, 0x1e, 0xd1, 0x92, 0x85, 0xb4, 0x2c, 0x6f, + 0xcc, 0x0b, 0xf2, 0xc0, 0x51, 0xc3, 0xe4, 0xb6, 0x47, 0x6f, 0x02, 0xfa, 0x98, 0xd4, 0xda, 0xf9, + 0x17, 0x9e, 0xc9, 0x6a, 0xed, 0x15, 0x26, 0x70, 0x35, 0x85, 0x1d, 0xbd, 0x65, 0xe4, 0x92, 0xe9, + 0x2b, 0x72, 0xfd, 0xd4, 0xd0, 0x43, 0xf2, 0xd2, 0xc8, 0xa0, 0x37, 0xf4, 0x90, 0xea, 0xfe, 0x22, + 0xf7, 0xbb, 0x35, 0x75, 0x38, 0x27, 0x9c, 0x3a, 0x81, 0x71, 0xd7, 0xdc, 0x79, 0x45, 0x58, 0xd8, + 0xf9, 0xfc, 0x1a, 0x32, 0x5b, 0x76, 0xba, 0xd7, 0x66, 0x10, 0x38, 0x5b, 0x05, 0x7a, 0x83, 0x07, + 0xbc, 0xaf, 0x06, 0xeb, 0xa1, 0x08, 0x0d, 0x3b, 0x57, 0xe0, 0x9b, 0xef, 0xc4, 0x09, 0xd9, 0xa2, + 0x65, 0xd2, 0xcd, 0xf5, 0xba, 0xe0, 0x82, 0x15, 0x3f, 0xb4, 0x06, 0x03, 0xec, 0xb6, 0x51, 0x3c, + 0x3d, 0x54, 0xc4, 0x13, 0x67, 0x5e, 0xb2, 0x4d, 0xd7, 0x0f, 0xfb, 0x1b, 0x63, 0xc1, 0x0b, 0x5d, + 0x96, 0xd7, 0xec, 0xe3, 0xd5, 0xe0, 0x66, 0x4c, 0xd8, 0x35, 0xfb, 0xca, 0xe2, 0x47, 0xd2, 0x7b, + 0xf3, 0x1c, 0xde, 0x31, 0x9b, 0x9e, 0x51, 0x92, 0x2a, 0x36, 0xe2, 0xbf, 0x4c, 0xd2, 0x37, 0x0d, + 0x45, 0x1a, 0x6a, 0xa6, 0xf4, 0x4b, 0x07, 0xfb, 0x96, 0xc9, 0x0c, 0x67, 0xb9, 0x1f, 0xeb, 0x96, + 0x3a, 0x13, 0xc0, 0x44, 0x76, 0x51, 0x1e, 0xe9, 0x16, 0xfe, 0x93, 0x3e, 0x18, 0x33, 0x27, 0x07, + 0x9a, 0x87, 0x8a, 0x60, 0xa2, 0x92, 0x76, 0xa9, 0x35, 0x70, 0x4d, 0x22, 0x70, 0x4a, 0xc3, 0xd2, + 0x97, 0xb1, 0xe2, 0x5a, 0x50, 0x50, 0x9a, 0xbe, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x35, 0xe1, 0x3b, + 0x61, 0x98, 0xa8, 0x9d, 0x40, 0xcd, 0x9b, 0x45, 0x06, 0xc5, 0x02, 0x4b, 0x77, 0x80, 0xbb, 0xf4, + 0x63, 0xfa, 0xa6, 0x57, 0x51, 0xed, 0x00, 0x57, 0x74, 0x24, 0x36, 0x69, 0xe9, 0x8e, 0x16, 0xc6, + 0x6c, 0x22, 0x0a, 0x7d, 0x3b, 0x0d, 0xb2, 0xaa, 0xf3, 0x1b, 0x78, 0x12, 0x8f, 0x3e, 0x07, 0x8f, + 0xa8, 0x0b, 0x73, 0x98, 0x7b, 0x69, 0x65, 0x8d, 0x03, 0x86, 0xc9, 0xfc, 0xc8, 0x52, 0x67, 0x32, + 0xdc, 0xad, 0x3c, 0x7a, 0x15, 0xc6, 0x84, 0xae, 0x2c, 0x39, 0x0e, 0x9a, 0x27, 0xf0, 0x57, 0x0c, + 0x2c, 0xce, 0x50, 0xa3, 0x2a, 0x4c, 0x50, 0x08, 0x53, 0x52, 0x25, 0x07, 0x7e, 0xf1, 0x4f, 0x6d, + 0xf5, 0x57, 0x32, 0x78, 0xdc, 0x56, 0x02, 0x2d, 0xc0, 0x38, 0x57, 0x56, 0xa8, 0x61, 0xc8, 0xbe, + 0x83, 0x88, 0xe7, 0x54, 0x0b, 0xe1, 0x86, 0x89, 0xc6, 0x59, 0x7a, 0x74, 0x11, 0x46, 0x9c, 0xa8, + 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x22, 0x9e, 0xc4, 0x42, 0x0b, 0x61, 0x58, 0xd0, 0x70, 0xd8, + 0xa0, 0xb4, 0xbf, 0x08, 0x27, 0x3a, 0x04, 0x8f, 0xd3, 0x89, 0xe3, 0x34, 0x3d, 0xd9, 0xa7, 0x4c, + 0xb8, 0xd4, 0x42, 0x6d, 0x55, 0xf6, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, 0xa7, 0xb5, 0x9c, 0x9a, + 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0x3f, 0xaf, 0x80, 0xe6, 0xbd, 0x29, 0x10, 0x22, + 0x73, 0x11, 0x46, 0x64, 0x9a, 0x58, 0x2d, 0x3d, 0xa3, 0xea, 0xe6, 0x25, 0x0d, 0x87, 0x0d, 0x4a, + 0xda, 0xb6, 0x40, 0xfa, 0xa4, 0xb2, 0xc1, 0x59, 0xca, 0x59, 0x85, 0x53, 0x1a, 0x74, 0x0e, 0x86, + 0x62, 0xe2, 0xaf, 0x5f, 0xf5, 0x82, 0xbb, 0x62, 0x62, 0x2b, 0xc9, 0x5c, 0x17, 0x70, 0xac, 0x28, + 0xd0, 0x22, 0x94, 0x5b, 0x9e, 0x2b, 0xa6, 0xb2, 0x54, 0x1b, 0xca, 0x37, 0x57, 0xab, 0xfb, 0xbb, + 0xb3, 0x4f, 0x74, 0xcb, 0x99, 0x4b, 0xed, 0xf3, 0x78, 0x8e, 0x2e, 0x3f, 0x5a, 0xb8, 0x93, 0x9f, + 0x7e, 0xa0, 0x47, 0x3f, 0xfd, 0x05, 0x00, 0xd1, 0x6b, 0x39, 0x97, 0xcb, 0xe9, 0x57, 0xbb, 0xa4, + 0x30, 0x58, 0xa3, 0xa2, 0x56, 0x7e, 0x23, 0x22, 0x8e, 0x34, 0x84, 0x79, 0x50, 0xf3, 0xd0, 0xe1, + 0xad, 0xfc, 0xa5, 0x2c, 0x33, 0xdc, 0xce, 0x1f, 0x85, 0x30, 0xe9, 0x8a, 0x5b, 0x99, 0x69, 0xa5, + 0x95, 0xde, 0x23, 0xa9, 0x69, 0x85, 0xd5, 0x2c, 0x23, 0xdc, 0xce, 0x1b, 0x7d, 0x01, 0x66, 0x24, + 0xb0, 0xfd, 0x4a, 0x2c, 0x5b, 0x2e, 0xe5, 0xc5, 0xd3, 0x7b, 0xbb, 0xb3, 0x33, 0xd5, 0xae, 0x54, + 0xf8, 0x00, 0x0e, 0xe8, 0x4d, 0x18, 0x60, 0xe7, 0x3a, 0xf1, 0xf4, 0x30, 0xdb, 0xf1, 0x5e, 0x2c, + 0x12, 0x8f, 0x4f, 0x67, 0xfd, 0x1c, 0x3b, 0x1d, 0x12, 0x91, 0xa6, 0xe9, 0x61, 0x19, 0x03, 0x62, + 0xc1, 0x13, 0x35, 0x61, 0xd8, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x22, 0x36, 0x52, 0x44, 0x97, 0xd4, + 0xaa, 0x58, 0x48, 0xcb, 0xf2, 0x7a, 0x54, 0xf0, 0x9a, 0x86, 0xc1, 0x7a, 0x15, 0xe8, 0x1e, 0x8c, + 0x87, 0xf7, 0xa8, 0xc0, 0x94, 0x47, 0x1b, 0xf1, 0xf4, 0xa8, 0xd9, 0xb1, 0x1c, 0x47, 0xad, 0x51, + 0x58, 0x93, 0x64, 0x26, 0x53, 0x9c, 0xad, 0x05, 0xcd, 0x19, 0xee, 0xea, 0xb1, 0x34, 0x9e, 0x3a, + 0x75, 0x57, 0xeb, 0xde, 0x69, 0x76, 0xed, 0x9a, 0xc7, 0x50, 0x32, 0x89, 0x30, 0x9e, 0xb9, 0x76, + 0x9d, 0xa2, 0xb0, 0x4e, 0x37, 0xf3, 0x09, 0x18, 0xd6, 0x06, 0xbe, 0x97, 0xc0, 0xdd, 0x99, 0x57, + 0x61, 0x22, 0x3b, 0xa0, 0x3d, 0x05, 0xfe, 0xfe, 0xef, 0x12, 0x8c, 0x77, 0x38, 0x37, 0xba, 0xeb, + 0xb1, 0xe0, 0x73, 0x43, 0xf4, 0x5d, 0xf1, 0x02, 0x17, 0x33, 0x8c, 0x29, 0xc0, 0x4a, 0x05, 0x04, + 0x98, 0x94, 0xa6, 0xe5, 0xae, 0xd2, 0x54, 0x08, 0xad, 0xbe, 0x0f, 0x22, 0xb4, 0xcc, 0x7d, 0xa2, + 0xbf, 0xd0, 0x3e, 0xf1, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0x0c, 0x16, 0xd8, 0x6a, 0xbe, 0x55, 0x82, + 0x89, 0x34, 0xc8, 0x59, 0xe4, 0x8e, 0x3e, 0xfa, 0x63, 0x88, 0x35, 0xe3, 0x18, 0x22, 0x2f, 0x35, + 0x74, 0xa6, 0x7d, 0x5d, 0x8f, 0x24, 0xde, 0xcc, 0x1c, 0x49, 0xbc, 0xd8, 0x23, 0xdf, 0x83, 0x8f, + 0x27, 0xbe, 0x57, 0x82, 0x93, 0xd9, 0x22, 0x4b, 0xbe, 0xe3, 0x6d, 0x1d, 0xc3, 0x78, 0x7d, 0xce, + 0x18, 0xaf, 0x97, 0x7b, 0xeb, 0x17, 0x6b, 0x64, 0xd7, 0x41, 0x73, 0x32, 0x83, 0xf6, 0x89, 0xc3, + 0x30, 0x3f, 0x78, 0xe4, 0x7e, 0xdf, 0x82, 0x47, 0x3b, 0x96, 0x3b, 0x06, 0xc7, 0xeb, 0xeb, 0xa6, + 0xe3, 0xf5, 0x85, 0x43, 0xf4, 0xae, 0x8b, 0x27, 0xf6, 0xd7, 0xca, 0x5d, 0x7a, 0xc5, 0x5c, 0x53, + 0x37, 0x60, 0xd8, 0x69, 0x34, 0x48, 0x1c, 0x5f, 0x0b, 0x5d, 0x95, 0xc0, 0xe9, 0x79, 0xb6, 0xb7, + 0xa4, 0xe0, 0xfd, 0xdd, 0xd9, 0x99, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0x6a, 0xb9, 0xd2, + 0x11, 0xa5, 0x96, 0xbb, 0x00, 0xb0, 0xad, 0xac, 0xd8, 0xac, 0xc7, 0x4b, 0xb3, 0x6f, 0x35, 0x2a, + 0xf4, 0x57, 0x99, 0x46, 0xc8, 0x83, 0x34, 0xfa, 0xcc, 0xfb, 0x92, 0x39, 0xdf, 0x4f, 0x0f, 0xf8, + 0xe0, 0xd7, 0x32, 0x95, 0x77, 0x50, 0xb1, 0x44, 0x9f, 0x81, 0x89, 0x98, 0x5f, 0xfe, 0x5f, 0xf2, + 0x9d, 0x98, 0x45, 0xf7, 0x0b, 0x79, 0xca, 0x6e, 0x58, 0xd6, 0x33, 0x38, 0xdc, 0x46, 0x6d, 0x7f, + 0xb7, 0x0c, 0x1f, 0x3e, 0x60, 0xda, 0xa2, 0x05, 0xf3, 0xd4, 0xf6, 0xb9, 0xac, 0xff, 0x67, 0xa6, + 0x63, 0x61, 0xc3, 0x21, 0x94, 0xf9, 0xda, 0xa5, 0x0f, 0xfc, 0xb5, 0xbf, 0xa1, 0x7b, 0xeb, 0x78, + 0xdc, 0xe6, 0xa5, 0x43, 0x2f, 0xcc, 0x9f, 0x56, 0x67, 0xfd, 0x57, 0x2c, 0x78, 0xa2, 0x63, 0xb7, + 0x8c, 0x28, 0x91, 0x79, 0xa8, 0x34, 0x28, 0x50, 0xbb, 0x8b, 0x93, 0x5e, 0x82, 0x93, 0x08, 0x9c, + 0xd2, 0x18, 0xc1, 0x20, 0xa5, 0xdc, 0x60, 0x90, 0xdf, 0xb5, 0x60, 0x2a, 0xdb, 0x88, 0x63, 0x90, + 0x5b, 0x75, 0x53, 0x6e, 0xcd, 0xf5, 0xf6, 0xf1, 0xbb, 0x88, 0xac, 0xf7, 0xc6, 0xe0, 0x54, 0xdb, + 0xae, 0xc7, 0x47, 0xf1, 0xe7, 0x2c, 0x98, 0xdc, 0x60, 0xda, 0xbb, 0x76, 0xe1, 0x49, 0xf4, 0x2b, + 0xe7, 0x96, 0xd8, 0x81, 0xf7, 0xa4, 0xb8, 0x2d, 0xd2, 0x46, 0x82, 0xdb, 0x2b, 0x43, 0x5f, 0xb7, + 0x60, 0xca, 0xb9, 0x17, 0xb7, 0xbd, 0x6c, 0x22, 0x26, 0xd2, 0xab, 0x39, 0xce, 0xb2, 0x9c, 0x37, + 0x51, 0x16, 0xa7, 0xf7, 0x76, 0x67, 0xa7, 0x3a, 0x51, 0xe1, 0x8e, 0xb5, 0xd2, 0xef, 0xbb, 0x29, + 0xae, 0x53, 0x14, 0xbb, 0xba, 0xd7, 0xe9, 0xf2, 0x05, 0x17, 0x6b, 0x12, 0x83, 0x15, 0x47, 0xf4, + 0x36, 0x54, 0x36, 0xe4, 0x1d, 0xa7, 0xac, 0xd8, 0xec, 0x32, 0xcc, 0x9d, 0xae, 0x44, 0xf1, 0xd8, + 0x7d, 0x85, 0xc2, 0x29, 0x53, 0x74, 0x19, 0xca, 0xc1, 0x7a, 0x2c, 0x6e, 0x13, 0xe7, 0xc5, 0x00, + 0x99, 0x91, 0x57, 0xfc, 0x02, 0xe6, 0xf5, 0x95, 0x3a, 0xa6, 0x2c, 0x28, 0xa7, 0xe8, 0x8e, 0x2b, + 0xbc, 0xc4, 0x39, 0x9c, 0xf0, 0x62, 0xb5, 0x9d, 0x13, 0x5e, 0xac, 0x62, 0xca, 0x02, 0xd5, 0xa0, + 0x9f, 0x5d, 0xd6, 0x10, 0x2e, 0xe0, 0x9c, 0x2b, 0xe7, 0x6d, 0x57, 0x52, 0x78, 0x06, 0x44, 0x06, + 0xc6, 0x9c, 0x11, 0x5a, 0x83, 0x81, 0x06, 0x4b, 0xe2, 0x2f, 0x6c, 0xf3, 0xbc, 0x64, 0x0c, 0x6d, + 0x09, 0xff, 0xf9, 0xb9, 0x17, 0x87, 0x63, 0xc1, 0x8b, 0x71, 0x25, 0xcd, 0xcd, 0xf5, 0x58, 0x18, + 0xdf, 0x79, 0x5c, 0xdb, 0x9e, 0x63, 0x10, 0x5c, 0x19, 0x1c, 0x0b, 0x5e, 0xa8, 0x0a, 0xa5, 0xf5, + 0x86, 0x48, 0xa4, 0x9a, 0xe3, 0xfa, 0x35, 0x6f, 0xd3, 0x2e, 0x0e, 0xec, 0xed, 0xce, 0x96, 0x56, + 0x96, 0x70, 0x69, 0xbd, 0x81, 0x5e, 0x87, 0xc1, 0x75, 0x7e, 0x3f, 0x52, 0x24, 0x4d, 0x3d, 0x9f, + 0x77, 0x89, 0xb3, 0xed, 0x32, 0x25, 0xbf, 0x9f, 0x21, 0x10, 0x58, 0xb2, 0x63, 0xf9, 0xe4, 0xd4, + 0x8d, 0x4f, 0x91, 0x35, 0x75, 0xae, 0xb7, 0x1b, 0xa2, 0xc2, 0x26, 0x55, 0x50, 0xac, 0x71, 0xa4, + 0x73, 0xde, 0x91, 0xef, 0x91, 0xb0, 0x8c, 0xa9, 0xb9, 0x73, 0xbe, 0xe3, 0xf3, 0x25, 0x7c, 0xce, + 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0x16, 0x8c, 0x6e, 0xc7, 0xcd, 0x4d, 0x22, 0x97, 0x3e, 0x4b, 0xa3, + 0x3a, 0x7c, 0xe1, 0x53, 0x39, 0xb9, 0x71, 0x45, 0x11, 0x2f, 0x4a, 0x5a, 0x8e, 0xdf, 0x26, 0xc1, + 0x58, 0x02, 0xaf, 0x5b, 0x3a, 0x5b, 0x6c, 0xd6, 0x42, 0x3f, 0xc9, 0xbb, 0xad, 0xf0, 0xce, 0x4e, + 0x42, 0x44, 0x9a, 0xd5, 0x9c, 0x4f, 0xf2, 0x1a, 0x27, 0x6e, 0xff, 0x24, 0x02, 0x81, 0x25, 0x3b, + 0x35, 0x64, 0x4c, 0x1a, 0x4f, 0x14, 0x1e, 0xb2, 0xb6, 0x3e, 0xa4, 0x43, 0xc6, 0xa4, 0x6f, 0xca, + 0x94, 0x49, 0xdd, 0xe6, 0x66, 0x98, 0x84, 0x41, 0x46, 0xf6, 0x4f, 0x16, 0x91, 0xba, 0xb5, 0x0e, + 0x25, 0xdb, 0xa5, 0x6e, 0x27, 0x2a, 0xdc, 0xb1, 0x56, 0x14, 0xc0, 0x58, 0x33, 0x8c, 0x92, 0x7b, + 0x61, 0x24, 0xe7, 0x21, 0x2a, 0x64, 0x23, 0x1a, 0x65, 0x44, 0xdd, 0x2c, 0x0c, 0xd7, 0xc4, 0xe0, + 0x0c, 0x77, 0xfb, 0x57, 0x07, 0xda, 0xb7, 0x77, 0xa6, 0xc0, 0xff, 0xed, 0xf6, 0xf3, 0xd2, 0xcf, + 0xf4, 0x6e, 0xa7, 0x3e, 0xc0, 0x93, 0xd3, 0xaf, 0x5b, 0x70, 0xaa, 0xd9, 0x71, 0xf3, 0x16, 0x1b, + 0x64, 0xaf, 0xe6, 0x2e, 0x1f, 0x24, 0x95, 0xb3, 0xb8, 0x33, 0x1e, 0x77, 0xa9, 0x33, 0xab, 0xf2, + 0x96, 0x3f, 0xb0, 0xca, 0x7b, 0x1b, 0x86, 0x98, 0x8e, 0x96, 0x66, 0x24, 0xe9, 0x31, 0x79, 0x07, + 0xdb, 0x6a, 0x97, 0x04, 0x0b, 0xac, 0x98, 0xd1, 0x81, 0x7b, 0x3c, 0xdb, 0x09, 0x4c, 0x18, 0x5a, + 0x64, 0xca, 0xe3, 0xf6, 0xc4, 0x8a, 0x18, 0x89, 0xc7, 0x6b, 0x07, 0x11, 0xef, 0xe7, 0x11, 0xe0, + 0x83, 0x2b, 0x43, 0xd5, 0x0e, 0x06, 0xcd, 0x80, 0x79, 0x38, 0x92, 0x6f, 0xd4, 0x1c, 0xaf, 0x22, + 0xfe, 0x4f, 0xac, 0x0e, 0x7a, 0x23, 0x37, 0x9e, 0x3e, 0x65, 0x1a, 0x4f, 0x4f, 0x67, 0x8d, 0xa7, + 0x36, 0x97, 0x89, 0x61, 0x37, 0x15, 0xcf, 0xf4, 0x59, 0x34, 0xe5, 0x8a, 0xed, 0xc3, 0x99, 0x3c, + 0xa1, 0xc4, 0x02, 0xa6, 0x5c, 0x75, 0x54, 0x98, 0x06, 0x4c, 0xb9, 0xab, 0x55, 0xcc, 0x30, 0x45, + 0x6f, 0xed, 0xdb, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0x05, 0x74, 0xc9, 0x70, 0x01, + 0x3d, 0x95, 0xfb, 0x8a, 0x5c, 0x57, 0x87, 0xcf, 0x8d, 0x8c, 0xc3, 0xe7, 0xa3, 0xf9, 0xac, 0x0e, + 0x76, 0xef, 0x7c, 0xbf, 0x0c, 0xfa, 0x3b, 0x78, 0xe8, 0xbf, 0x1c, 0x26, 0x8e, 0xb6, 0x5c, 0xec, + 0x69, 0x3c, 0x51, 0x07, 0x8b, 0xb7, 0x92, 0xb7, 0xef, 0x7e, 0x6a, 0xc3, 0x69, 0x6f, 0x13, 0x6f, + 0x63, 0x33, 0x21, 0x6e, 0xb6, 0x63, 0xc7, 0x17, 0x4e, 0xfb, 0x67, 0x16, 0x8c, 0x67, 0x6a, 0x47, + 0x7e, 0xa7, 0x6b, 0x3b, 0x87, 0x74, 0xea, 0x4c, 0xe6, 0xde, 0xf3, 0x99, 0x03, 0x50, 0xbe, 0x79, + 0xe9, 0x38, 0x61, 0x3a, 0xa4, 0x72, 0xde, 0xc7, 0x58, 0xa3, 0x40, 0x2f, 0xc1, 0x70, 0x12, 0x36, + 0x43, 0x3f, 0xdc, 0xd8, 0xb9, 0x42, 0x64, 0x3e, 0x09, 0x75, 0xae, 0xb1, 0x96, 0xa2, 0xb0, 0x4e, + 0x67, 0xff, 0xa0, 0x0c, 0xd9, 0x57, 0x14, 0xff, 0x72, 0x9e, 0xfe, 0xf4, 0xcc, 0xd3, 0x3f, 0xb4, + 0x60, 0x82, 0xd6, 0xce, 0x02, 0x5c, 0x64, 0xd8, 0xab, 0x7a, 0x76, 0xc0, 0x3a, 0xe0, 0xd9, 0x81, + 0xa7, 0xa9, 0xb4, 0x73, 0xc3, 0x56, 0x22, 0x5c, 0x3d, 0x9a, 0x10, 0xa3, 0x50, 0x2c, 0xb0, 0x82, + 0x8e, 0x44, 0x91, 0xb8, 0x1f, 0xa4, 0xd3, 0x91, 0x28, 0xc2, 0x02, 0x2b, 0x5f, 0x25, 0xe8, 0xeb, + 0xf2, 0x2a, 0x01, 0xcb, 0xc8, 0x24, 0x82, 0x2a, 0x84, 0x5a, 0xa1, 0x65, 0x64, 0x92, 0xd1, 0x16, + 0x29, 0x8d, 0xfd, 0x9d, 0x32, 0x8c, 0xd4, 0x42, 0x37, 0x8d, 0x67, 0x7f, 0xd1, 0x88, 0x67, 0x3f, + 0x93, 0x89, 0x67, 0x9f, 0xd0, 0x69, 0x1f, 0x4c, 0x38, 0xbb, 0xc8, 0xdc, 0xc5, 0xde, 0xcd, 0x38, + 0x64, 0x28, 0xbb, 0x91, 0xb9, 0x4b, 0x31, 0xc2, 0x26, 0xdf, 0x9f, 0xa5, 0x10, 0xf6, 0xff, 0x6b, + 0xc1, 0x58, 0x2d, 0x74, 0xe9, 0x04, 0xfd, 0x59, 0x9a, 0x8d, 0x7a, 0xbe, 0xaf, 0x81, 0x03, 0xf2, + 0x7d, 0xfd, 0x2b, 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x0c, 0x6e, 0xd0, 0x15, 0xd3, 0x0d, 0xfa, 0x44, + 0xae, 0xe4, 0xed, 0xe2, 0xf9, 0xfc, 0x6e, 0x19, 0x46, 0x69, 0x8b, 0xc3, 0x0d, 0xf9, 0xbd, 0x8c, + 0xb1, 0xb1, 0x0a, 0x8c, 0x0d, 0x55, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x0a, 0x83, + 0x62, 0x81, 0x45, 0xe7, 0x60, 0xa8, 0x19, 0x91, 0x6d, 0x2f, 0x6c, 0xc5, 0xd9, 0xbb, 0x86, 0x35, + 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x08, 0x23, 0xb1, 0x17, 0x34, 0x88, 0x0c, 0xb9, 0xe8, 0x63, 0x21, + 0x17, 0x3c, 0xb5, 0xa2, 0x06, 0xc7, 0x06, 0x15, 0xba, 0x0d, 0x15, 0xf6, 0x9f, 0xad, 0xa0, 0xde, + 0x9f, 0x15, 0xe0, 0xf9, 0xc4, 0x24, 0x03, 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x1c, 0x12, + 0x8b, 0xac, 0x28, 0x4a, 0x2f, 0x55, 0x61, 0x23, 0x31, 0xd6, 0xa8, 0xd0, 0x73, 0x50, 0x49, 0x1c, + 0xcf, 0xbf, 0xea, 0x05, 0x24, 0x16, 0xc1, 0x35, 0x22, 0x4d, 0xb2, 0x00, 0xe2, 0x14, 0x4f, 0xf7, + 0x7b, 0x76, 0xd3, 0x99, 0x3f, 0x59, 0x32, 0xc4, 0xa8, 0xd9, 0x7e, 0x7f, 0x55, 0x41, 0xb1, 0x46, + 0x61, 0x5f, 0x84, 0x93, 0xb5, 0xd0, 0xa5, 0x46, 0xfc, 0x4a, 0x18, 0xdd, 0x73, 0x22, 0x57, 0x7e, + 0xbf, 0x59, 0x99, 0x9d, 0x97, 0xee, 0xc9, 0xfd, 0xdc, 0x33, 0x68, 0x64, 0xdb, 0x7d, 0x81, 0xed, + 0xf8, 0x3d, 0x5e, 0x94, 0xf8, 0x71, 0x09, 0x50, 0x8d, 0x85, 0xaf, 0x18, 0x2f, 0xdc, 0x6c, 0xc2, + 0x58, 0x4c, 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x60, 0x55, 0xec, 0x66, 0x4a, 0x7d, 0x59, 0x2f, 0xc3, + 0xfd, 0x11, 0x26, 0x0c, 0x67, 0xf8, 0xd2, 0xc1, 0x8c, 0x5a, 0xc1, 0x42, 0x7c, 0x33, 0x26, 0x91, + 0x78, 0xd1, 0x85, 0x0d, 0x26, 0x96, 0x40, 0x9c, 0xe2, 0xe9, 0xe4, 0x61, 0x7f, 0xae, 0x87, 0x01, + 0x0e, 0xc3, 0x44, 0x4e, 0x37, 0x96, 0xe1, 0x5f, 0x83, 0x63, 0x83, 0x0a, 0xad, 0x00, 0x8a, 0x5b, + 0xcd, 0xa6, 0xcf, 0x4e, 0x04, 0x1d, 0xff, 0x52, 0x14, 0xb6, 0x9a, 0x3c, 0x8a, 0x59, 0x24, 0xc7, + 0xaf, 0xb7, 0x61, 0x71, 0x87, 0x12, 0x54, 0x58, 0xac, 0xc7, 0xec, 0xb7, 0xb8, 0xf6, 0xcc, 0xbd, + 0x8a, 0x75, 0x06, 0xc2, 0x12, 0x67, 0x7f, 0x99, 0x6d, 0x70, 0xec, 0xa9, 0x8d, 0xa4, 0x15, 0x11, + 0xb4, 0x05, 0xa3, 0x4d, 0xb6, 0x89, 0x25, 0x51, 0xe8, 0xfb, 0x44, 0xea, 0x97, 0x87, 0x0b, 0xa0, + 0xe1, 0xc9, 0xf5, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0xff, 0xe2, 0x18, 0x93, 0x55, 0xe2, 0x50, 0x76, + 0x50, 0x84, 0xca, 0x0a, 0x4d, 0xee, 0x23, 0x45, 0x1e, 0xcd, 0x4a, 0xf7, 0x01, 0x11, 0x78, 0x8b, + 0x25, 0x17, 0xf4, 0x79, 0x16, 0x08, 0xce, 0x05, 0x44, 0xf1, 0xa7, 0x00, 0x39, 0xbd, 0x11, 0x04, + 0x2e, 0x58, 0x60, 0x8d, 0x1d, 0xba, 0x0a, 0xa3, 0xe2, 0x65, 0x06, 0xe1, 0xa6, 0x28, 0x1b, 0x26, + 0xf6, 0x28, 0xd6, 0x91, 0xfb, 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x0d, 0x78, 0x5c, 0x7b, 0x79, 0xa8, + 0x43, 0xb0, 0x17, 0x97, 0x3c, 0x4f, 0xec, 0xed, 0xce, 0x3e, 0xbe, 0x76, 0x10, 0x21, 0x3e, 0x98, + 0x0f, 0xba, 0x01, 0x27, 0x9d, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, + 0x37, 0xfe, 0xd1, 0xbd, 0xdd, 0xd9, 0x93, 0x0b, 0x9d, 0x08, 0x70, 0xe7, 0x72, 0xe8, 0x53, 0x50, + 0x71, 0x83, 0x58, 0x8c, 0xc1, 0x80, 0xf1, 0xd0, 0x56, 0xa5, 0x7a, 0xbd, 0xae, 0xfa, 0x9f, 0xfe, + 0xc1, 0x69, 0x01, 0xf4, 0x2e, 0x7f, 0x48, 0x5e, 0x59, 0x33, 0xfc, 0x81, 0xb7, 0x97, 0x0b, 0xd9, + 0xcf, 0xc6, 0x8d, 0x15, 0xee, 0xc1, 0x53, 0x41, 0x95, 0xc6, 0x65, 0x16, 0xa3, 0x0a, 0xf4, 0x59, + 0x40, 0x31, 0x89, 0xb6, 0xbd, 0x06, 0x59, 0x68, 0xb0, 0x7c, 0xa4, 0xcc, 0xc7, 0x33, 0x64, 0xdc, + 0x2e, 0x40, 0xf5, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xba, 0x4c, 0x25, 0x8f, 0x0e, 0x15, 0x31, 0xb0, + 0x52, 0x31, 0x9c, 0xae, 0x92, 0x66, 0x44, 0x1a, 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, + 0xfb, 0x92, 0x4a, 0x39, 0x0f, 0x66, 0xe4, 0x66, 0x7b, 0xda, 0x79, 0x6a, 0x67, 0x6d, 0x86, 0x71, + 0x72, 0x9d, 0x24, 0xf7, 0xc2, 0xe8, 0x2e, 0x3b, 0x69, 0x18, 0xd2, 0x92, 0xbb, 0xa5, 0x28, 0xac, + 0xd3, 0x51, 0x1d, 0x8a, 0x1d, 0x71, 0xad, 0x56, 0xd9, 0xf9, 0xc1, 0x50, 0xba, 0x76, 0x2e, 0x73, + 0x30, 0x96, 0x78, 0x49, 0xba, 0x5a, 0x5b, 0x62, 0x67, 0x01, 0x19, 0xd2, 0xd5, 0xda, 0x12, 0x96, + 0x78, 0x14, 0xb6, 0x3f, 0x67, 0x36, 0x56, 0xe4, 0x5c, 0xa6, 0x5d, 0x92, 0x17, 0x7c, 0xd1, 0xec, + 0x3e, 0x4c, 0xa8, 0x27, 0xd5, 0x78, 0xde, 0xcd, 0x78, 0x7a, 0xbc, 0xc8, 0x33, 0xf6, 0x1d, 0xd3, + 0x77, 0x2a, 0xbf, 0xde, 0x6a, 0x86, 0x27, 0x6e, 0xab, 0xc5, 0xc8, 0xf1, 0x30, 0x91, 0xfb, 0x8c, + 0xc0, 0x3c, 0x54, 0xe2, 0xd6, 0x1d, 0x37, 0xdc, 0x72, 0xbc, 0x80, 0x39, 0xec, 0xf5, 0x47, 0xd9, + 0x25, 0x02, 0xa7, 0x34, 0xa8, 0x06, 0x43, 0x8e, 0x30, 0xe1, 0x84, 0x63, 0x3d, 0xe7, 0x0e, 0xb8, + 0x34, 0xf8, 0xb8, 0x77, 0x55, 0xfe, 0xc3, 0x8a, 0x0b, 0x7a, 0x05, 0x46, 0xc5, 0x15, 0x26, 0x12, + 0xb1, 0x56, 0x9f, 0x30, 0xc3, 0xdd, 0xeb, 0x12, 0xc9, 0x26, 0x98, 0x49, 0x8b, 0x36, 0x60, 0x8c, + 0x72, 0x49, 0x05, 0xe0, 0xf4, 0x54, 0x6f, 0x32, 0x54, 0x4b, 0xd8, 0xac, 0xb3, 0xc1, 0x19, 0xb6, + 0xc8, 0x85, 0xc7, 0x9c, 0x56, 0x12, 0x6e, 0xd1, 0x95, 0x60, 0xae, 0x93, 0xb5, 0xf0, 0x2e, 0x09, + 0xa6, 0x4f, 0xb2, 0x19, 0x78, 0x66, 0x6f, 0x77, 0xf6, 0xb1, 0x85, 0x03, 0xe8, 0xf0, 0x81, 0x5c, + 0xd0, 0x5b, 0x30, 0x9c, 0x84, 0xbe, 0x88, 0x20, 0x8e, 0xa7, 0x4f, 0x15, 0xc9, 0x3c, 0xb3, 0xa6, + 0x0a, 0xe8, 0x6e, 0x0c, 0xc5, 0x04, 0xeb, 0x1c, 0x67, 0x3e, 0x0d, 0x93, 0x6d, 0x22, 0xa9, 0xa7, + 0x20, 0xcb, 0xff, 0xda, 0x0f, 0x15, 0xe5, 0xd1, 0x43, 0xf3, 0xa6, 0xf3, 0xf6, 0xd1, 0xac, 0xf3, + 0x76, 0x88, 0x2a, 0x50, 0xba, 0xbf, 0xf6, 0x0b, 0x1d, 0x1e, 0xd1, 0x7e, 0x36, 0x77, 0x0d, 0x16, + 0xbf, 0xf7, 0xd4, 0xc3, 0x53, 0xe3, 0xa9, 0x55, 0xd7, 0x77, 0xa0, 0x55, 0x57, 0xf0, 0x61, 0x38, + 0x6a, 0xbf, 0x35, 0x43, 0x77, 0xb5, 0x96, 0x7d, 0xf7, 0xa8, 0x46, 0x81, 0x98, 0xe3, 0x98, 0xde, + 0x4d, 0xf7, 0x54, 0xa6, 0x77, 0x0f, 0x1e, 0x52, 0xef, 0x96, 0x0c, 0x70, 0xca, 0x0b, 0x6d, 0xc3, + 0x64, 0xc3, 0x7c, 0xc6, 0x4a, 0xdd, 0x66, 0x7a, 0xbe, 0x87, 0x67, 0xa4, 0x5a, 0xda, 0x1b, 0x17, + 0x4b, 0x59, 0x7e, 0xb8, 0xbd, 0x0a, 0xf4, 0x0a, 0x0c, 0xbd, 0x1b, 0xc6, 0xec, 0x58, 0x41, 0x6c, + 0x2c, 0xf2, 0xd6, 0xc8, 0xd0, 0x6b, 0x37, 0xea, 0x0c, 0xbe, 0xbf, 0x3b, 0x3b, 0x5c, 0x0b, 0x5d, + 0xf9, 0x17, 0xab, 0x02, 0xe8, 0x2b, 0x16, 0x9c, 0x34, 0xd6, 0x99, 0x6a, 0x39, 0x1c, 0xa6, 0xe5, + 0x8f, 0x8b, 0x9a, 0x4f, 0xae, 0x76, 0xe2, 0x89, 0x3b, 0x57, 0x65, 0xff, 0x36, 0x77, 0x61, 0x0a, + 0xa7, 0x06, 0x89, 0x5b, 0xfe, 0x71, 0xe4, 0x9b, 0xbf, 0x61, 0xf8, 0x5b, 0x1e, 0x80, 0x13, 0xfd, + 0x3f, 0x5b, 0xcc, 0x89, 0xbe, 0x46, 0xb6, 0x9a, 0xbe, 0x93, 0x1c, 0x47, 0x0c, 0xee, 0xe7, 0x61, + 0x28, 0x11, 0xb5, 0x15, 0x4b, 0x96, 0xaf, 0x35, 0x8f, 0x1d, 0x2e, 0xa8, 0x8d, 0x49, 0x42, 0xb1, + 0x62, 0x68, 0xff, 0x7b, 0xfe, 0x55, 0x24, 0xe6, 0x18, 0x3c, 0x05, 0xd7, 0x4d, 0x4f, 0xc1, 0x33, + 0x85, 0xfb, 0xd2, 0xc5, 0x63, 0xf0, 0x03, 0xb3, 0x07, 0xcc, 0x7e, 0xf8, 0xe9, 0x39, 0xe5, 0xb1, + 0x7f, 0xc5, 0x82, 0xa9, 0x4e, 0x87, 0xe2, 0x54, 0xc1, 0xe0, 0xd6, 0x8b, 0x3a, 0xff, 0x52, 0xa3, + 0x7a, 0x4b, 0xc0, 0xb1, 0xa2, 0x28, 0x9c, 0xbd, 0xba, 0xb7, 0x04, 0x4b, 0x37, 0xc0, 0x7c, 0x10, + 0x0d, 0xbd, 0xca, 0x43, 0xee, 0x2d, 0xf5, 0x62, 0x59, 0x6f, 0xe1, 0xf6, 0xf6, 0xaf, 0x97, 0x60, + 0x8a, 0x3b, 0xa1, 0x17, 0xb6, 0x43, 0xcf, 0xad, 0x85, 0xae, 0xb8, 0x80, 0xe0, 0xc2, 0x48, 0x53, + 0x33, 0x3e, 0x8b, 0x25, 0x6c, 0xd1, 0xcd, 0xd5, 0x54, 0xe1, 0xd7, 0xa1, 0xd8, 0xe0, 0x4a, 0x6b, + 0x21, 0xdb, 0x5e, 0x43, 0xf9, 0x34, 0x4b, 0x3d, 0xef, 0x0c, 0xaa, 0x96, 0x65, 0x8d, 0x0f, 0x36, + 0xb8, 0x1e, 0xc1, 0xa3, 0x13, 0xf6, 0x3f, 0xb2, 0xe0, 0x91, 0x2e, 0x49, 0x5d, 0x68, 0x75, 0xf7, + 0x98, 0xe3, 0x5f, 0xbc, 0xb8, 0xa7, 0xaa, 0xe3, 0xc7, 0x01, 0x58, 0x60, 0xd1, 0x1d, 0x00, 0xee, + 0xce, 0x67, 0xef, 0xaf, 0x97, 0x8a, 0x44, 0x0d, 0xb5, 0xa5, 0x4e, 0xd0, 0x6e, 0xd5, 0xab, 0x17, + 0xd7, 0x35, 0xae, 0xf6, 0xb7, 0xcb, 0xd0, 0xcf, 0x1f, 0x76, 0xae, 0xc1, 0xe0, 0x26, 0x4f, 0x32, + 0xdb, 0x5b, 0x8e, 0xdb, 0xd4, 0xb8, 0xe0, 0x00, 0x2c, 0xd9, 0xa0, 0x6b, 0x70, 0x82, 0xee, 0x2c, + 0x9e, 0xe3, 0x57, 0x89, 0xef, 0xec, 0x48, 0x6b, 0x95, 0xbf, 0x44, 0x20, 0x53, 0x66, 0x9f, 0x58, + 0x6d, 0x27, 0xc1, 0x9d, 0xca, 0xa1, 0x57, 0xdb, 0x72, 0xc2, 0xf1, 0xe4, 0xbd, 0x4a, 0x53, 0x3d, + 0x38, 0x2f, 0x1c, 0xd5, 0xa7, 0x9b, 0x6d, 0x76, 0xb9, 0xf6, 0x7e, 0xae, 0x69, 0x8b, 0x9b, 0xb4, + 0x2c, 0xb6, 0xa0, 0xc5, 0x62, 0x2a, 0xd6, 0x36, 0x23, 0x12, 0x6f, 0x86, 0xbe, 0x2b, 0x9e, 0x7e, + 0x4c, 0x63, 0x0b, 0x32, 0x78, 0xdc, 0x56, 0x82, 0x72, 0x59, 0x77, 0x3c, 0xbf, 0x15, 0x91, 0x94, + 0xcb, 0x80, 0xc9, 0x65, 0x25, 0x83, 0xc7, 0x6d, 0x25, 0xe8, 0xdc, 0x3a, 0x29, 0x5e, 0x0b, 0x94, + 0x57, 0x98, 0x85, 0x08, 0xfa, 0x1c, 0x0c, 0xca, 0x40, 0xf6, 0x42, 0x99, 0x36, 0x44, 0xe0, 0x80, + 0x7a, 0x79, 0x50, 0x7b, 0x99, 0x4a, 0x84, 0xb0, 0x4b, 0x7e, 0x87, 0x79, 0x95, 0xee, 0x4f, 0x2d, + 0x38, 0xd1, 0x21, 0x20, 0x8b, 0x8b, 0xb4, 0x0d, 0x2f, 0x4e, 0x54, 0x5e, 0x7c, 0x4d, 0xa4, 0x71, + 0x38, 0x56, 0x14, 0x74, 0xb5, 0x70, 0xa1, 0x99, 0x15, 0x94, 0x22, 0x04, 0x44, 0x60, 0x7b, 0x13, + 0x94, 0xe8, 0x0c, 0xf4, 0xb5, 0x62, 0x12, 0xc9, 0x27, 0xe2, 0xa4, 0x9c, 0x67, 0x7e, 0x40, 0x86, + 0xa1, 0x6a, 0xeb, 0x86, 0x72, 0xc1, 0x69, 0x6a, 0x2b, 0x77, 0xc2, 0x71, 0x9c, 0xfd, 0x8d, 0x32, + 0x8c, 0x67, 0x02, 0x33, 0x69, 0x43, 0xb6, 0xc2, 0xc0, 0x4b, 0x42, 0x95, 0xfd, 0x8c, 0xbf, 0x4a, + 0x45, 0x9a, 0x9b, 0xd7, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0xb4, 0x7c, 0x15, 0x34, 0x9b, 0xef, 0x7f, + 0xb1, 0x6a, 0x3c, 0x0c, 0x5a, 0xf4, 0xad, 0x8e, 0x27, 0xa1, 0xaf, 0x19, 0xaa, 0x47, 0x9e, 0xd5, + 0xf7, 0xc4, 0x8b, 0xd5, 0x5a, 0x18, 0xfa, 0x98, 0x21, 0xd1, 0x53, 0xa2, 0xf7, 0x99, 0x93, 0x0b, + 0xec, 0xb8, 0x61, 0xac, 0x0d, 0xc1, 0x33, 0x30, 0x78, 0x97, 0xec, 0x44, 0x5e, 0xb0, 0x91, 0x3d, + 0xb7, 0xb9, 0xc2, 0xc1, 0x58, 0xe2, 0xcd, 0xf7, 0x38, 0x06, 0x8f, 0xf8, 0x3d, 0x8e, 0xa1, 0xdc, + 0x7d, 0xf0, 0xbb, 0x16, 0x8c, 0xb3, 0x94, 0xa0, 0xe2, 0x02, 0xbd, 0x17, 0x06, 0xc7, 0xa0, 0x63, + 0x3c, 0x09, 0xfd, 0x11, 0xad, 0x34, 0x9b, 0x50, 0x9f, 0xb5, 0x04, 0x73, 0x1c, 0x7a, 0x0c, 0xfa, + 0x58, 0x13, 0xe8, 0x67, 0x1c, 0xe1, 0x99, 0xc7, 0xab, 0x4e, 0xe2, 0x60, 0x06, 0x65, 0x77, 0xa1, + 0x30, 0x69, 0xfa, 0x1e, 0x6f, 0x74, 0xea, 0x6e, 0x7d, 0xd8, 0xee, 0x42, 0x75, 0x6c, 0xe4, 0x83, + 0xba, 0x0b, 0xd5, 0x99, 0xf9, 0xc1, 0x7a, 0xfe, 0xff, 0x2a, 0xc1, 0xe9, 0x8e, 0xe5, 0xd2, 0x13, + 0xe0, 0x15, 0xe3, 0x04, 0xf8, 0x42, 0xe6, 0x04, 0xd8, 0x3e, 0xb8, 0xf4, 0x83, 0x39, 0x13, 0xee, + 0x7c, 0x54, 0x5b, 0x3e, 0xc6, 0xa3, 0xda, 0xbe, 0xa2, 0x2a, 0x4e, 0x7f, 0x8e, 0x8a, 0xf3, 0xfb, + 0x16, 0x3c, 0xda, 0x71, 0xc8, 0x1e, 0xba, 0xcb, 0x67, 0x1d, 0x5b, 0xd9, 0xc5, 0x3a, 0xf9, 0xe5, + 0x72, 0x97, 0x5e, 0x31, 0x3b, 0xe5, 0x2c, 0x95, 0x42, 0x0c, 0x19, 0x0b, 0xe5, 0x6d, 0x84, 0x4b, + 0x20, 0x0e, 0xc3, 0x0a, 0x8b, 0x62, 0xed, 0xf2, 0x16, 0x6f, 0xe4, 0xf2, 0x21, 0x17, 0xd4, 0x9c, + 0xe9, 0x27, 0xd7, 0xb3, 0x02, 0x64, 0xaf, 0x74, 0xdd, 0xd6, 0x2c, 0xcf, 0xf2, 0x61, 0x2c, 0xcf, + 0x91, 0xce, 0x56, 0x27, 0x5a, 0x80, 0xf1, 0x2d, 0x2f, 0x60, 0xcf, 0x78, 0x9a, 0xda, 0x93, 0xba, + 0x41, 0x7b, 0xcd, 0x44, 0xe3, 0x2c, 0xfd, 0xcc, 0x2b, 0x30, 0x7a, 0x78, 0xef, 0xda, 0xfb, 0x65, + 0xf8, 0xf0, 0x01, 0x42, 0x81, 0xef, 0x0e, 0xc6, 0x77, 0xd1, 0x76, 0x87, 0xb6, 0x6f, 0x53, 0x83, + 0xa9, 0xf5, 0x96, 0xef, 0xef, 0xb0, 0xf8, 0x29, 0xe2, 0x4a, 0x0a, 0xa1, 0xd4, 0xa8, 0xf7, 0xc2, + 0x57, 0x3a, 0xd0, 0xe0, 0x8e, 0x25, 0xd1, 0x67, 0x01, 0x85, 0x77, 0x58, 0xd2, 0x5c, 0x37, 0xcd, + 0x7a, 0xc0, 0x3e, 0x41, 0x39, 0x5d, 0xaa, 0x37, 0xda, 0x28, 0x70, 0x87, 0x52, 0x54, 0x4f, 0x65, + 0x4f, 0x8d, 0xab, 0x66, 0x65, 0xf4, 0x54, 0xac, 0x23, 0xb1, 0x49, 0x8b, 0x2e, 0xc1, 0xa4, 0xb3, + 0xed, 0x78, 0x3c, 0x09, 0x96, 0x64, 0xc0, 0x15, 0x55, 0xe5, 0xbf, 0x5a, 0xc8, 0x12, 0xe0, 0xf6, + 0x32, 0xa8, 0x69, 0x38, 0x24, 0x79, 0xba, 0xfc, 0x4f, 0x1d, 0x62, 0x06, 0x17, 0x76, 0x51, 0xda, + 0xff, 0xc3, 0xa2, 0x5b, 0x5f, 0x87, 0x17, 0x1f, 0xe9, 0x88, 0x28, 0x07, 0x9b, 0x76, 0x19, 0x4d, + 0x8d, 0xc8, 0x92, 0x8e, 0xc4, 0x26, 0x2d, 0x9f, 0x1a, 0x71, 0x1a, 0xce, 0x6d, 0x68, 0x9b, 0xe2, + 0x1e, 0xa7, 0xa2, 0xa0, 0x1a, 0xb4, 0xeb, 0x6d, 0x7b, 0x71, 0x18, 0x89, 0x05, 0xd4, 0x63, 0x70, + 0x6f, 0x2a, 0x2f, 0xab, 0x9c, 0x0d, 0x96, 0xfc, 0xec, 0x6f, 0x96, 0x60, 0x54, 0xd6, 0xf8, 0x5a, + 0x2b, 0x4c, 0x9c, 0x63, 0xd8, 0xd2, 0x5f, 0x33, 0xb6, 0xf4, 0xf9, 0x62, 0xd7, 0x5a, 0x59, 0xe3, + 0xba, 0x6e, 0xe5, 0x9f, 0xcb, 0x6c, 0xe5, 0xe7, 0x7b, 0x61, 0x7a, 0xf0, 0x16, 0xfe, 0x1f, 0x2d, + 0x98, 0x34, 0xe8, 0x8f, 0x61, 0x27, 0xa9, 0x99, 0x3b, 0xc9, 0x73, 0x3d, 0xf4, 0xa6, 0xcb, 0x0e, + 0xf2, 0x9d, 0x52, 0xa6, 0x17, 0x6c, 0xe7, 0xf8, 0x12, 0xf4, 0x6d, 0x3a, 0x91, 0x5b, 0x2c, 0x23, + 0x64, 0x5b, 0xf1, 0xb9, 0xcb, 0x4e, 0xe4, 0x72, 0xf9, 0x7f, 0x4e, 0xbd, 0x47, 0xe5, 0x44, 0x6e, + 0xee, 0x2d, 0x07, 0x56, 0x29, 0xba, 0x08, 0x03, 0x71, 0x23, 0x6c, 0xaa, 0x38, 0xd0, 0x33, 0xfc, + 0xad, 0x2a, 0x0a, 0xd9, 0xdf, 0x9d, 0x45, 0x66, 0x75, 0x14, 0x8c, 0x05, 0xfd, 0xcc, 0x06, 0x54, + 0x54, 0xd5, 0x47, 0x1a, 0x09, 0xff, 0x3f, 0xcb, 0x70, 0xa2, 0xc3, 0x5c, 0x41, 0x5f, 0x36, 0xc6, + 0xed, 0x95, 0x9e, 0x27, 0xdb, 0x07, 0x1c, 0xb9, 0x2f, 0x33, 0x4b, 0xc9, 0x15, 0xb3, 0xe3, 0x10, + 0xd5, 0xdf, 0x8c, 0x49, 0xb6, 0x7a, 0x0a, 0xca, 0xaf, 0x9e, 0x56, 0x7b, 0x6c, 0xc3, 0x4f, 0x2b, + 0x52, 0x2d, 0x3d, 0xd2, 0xef, 0xfc, 0x37, 0xfa, 0x60, 0xaa, 0xd3, 0xfd, 0x79, 0xf4, 0x35, 0x2b, + 0xf3, 0xec, 0xc3, 0xab, 0xbd, 0x5f, 0xc2, 0xe7, 0x6f, 0x41, 0x88, 0x9c, 0x33, 0x73, 0xe6, 0x43, + 0x10, 0xb9, 0x23, 0x2e, 0x6a, 0x67, 0xf7, 0x93, 0x22, 0xfe, 0x84, 0x87, 0x94, 0x0a, 0x9f, 0x39, + 0x44, 0x53, 0xc4, 0x2b, 0x20, 0x71, 0xe6, 0x7e, 0x92, 0x04, 0xe7, 0xdf, 0x4f, 0x92, 0x6d, 0x98, + 0xf1, 0x60, 0x58, 0xeb, 0xd7, 0x91, 0x4e, 0x83, 0xbb, 0x74, 0x8b, 0xd2, 0xda, 0x7d, 0xa4, 0x53, + 0xe1, 0xef, 0x5b, 0x90, 0x09, 0xda, 0x52, 0x6e, 0x19, 0xab, 0xab, 0x5b, 0xe6, 0x0c, 0xf4, 0x45, + 0xa1, 0x4f, 0xb2, 0x4f, 0x12, 0xe0, 0xd0, 0x27, 0x98, 0x61, 0xd4, 0x13, 0xb5, 0xe5, 0x6e, 0x4f, + 0xd4, 0x52, 0x3b, 0xdd, 0x27, 0xdb, 0x44, 0x3a, 0x49, 0x94, 0x18, 0xbf, 0x4a, 0x81, 0x98, 0xe3, + 0xec, 0xdf, 0x2b, 0xc3, 0x00, 0xf7, 0x44, 0x1c, 0xc3, 0x3e, 0x5d, 0x13, 0x4e, 0x81, 0x42, 0x77, + 0xd2, 0x79, 0xab, 0xe6, 0xaa, 0x4e, 0xe2, 0xf0, 0xc9, 0xa5, 0xfa, 0x98, 0x3a, 0x12, 0xd0, 0x9c, + 0x31, 0x0a, 0x33, 0x19, 0x5b, 0x17, 0x38, 0x0f, 0x6d, 0x4c, 0x36, 0x01, 0x62, 0xf6, 0x24, 0x22, + 0xe5, 0x21, 0x32, 0x6f, 0xbe, 0x58, 0xa8, 0x1d, 0x75, 0x55, 0x8c, 0xb7, 0x26, 0x4d, 0xf7, 0xa7, + 0x10, 0x58, 0xe3, 0x3d, 0xf3, 0x32, 0x54, 0x14, 0x71, 0x9e, 0x11, 0x30, 0xa2, 0x4f, 0xce, 0xbf, + 0x02, 0xe3, 0x99, 0xba, 0x7a, 0xb2, 0x21, 0x7e, 0xcb, 0x82, 0xf1, 0xcc, 0x6b, 0xee, 0xe8, 0xab, + 0x16, 0x4c, 0xf9, 0x1d, 0x1c, 0x51, 0xe2, 0x33, 0x1f, 0xc6, 0x85, 0xa5, 0xcc, 0x87, 0x4e, 0x58, + 0xdc, 0xb1, 0x36, 0x6a, 0x56, 0xf2, 0x17, 0x5e, 0x1d, 0x5f, 0xc4, 0xc0, 0x8e, 0xf0, 0x9c, 0xc3, + 0x1c, 0x86, 0x15, 0xd6, 0xfe, 0x89, 0x05, 0x93, 0x6d, 0x0f, 0x86, 0x3f, 0x2c, 0xdd, 0x10, 0xd9, + 0x95, 0x4b, 0x5d, 0xb2, 0x2b, 0xeb, 0xbd, 0x2c, 0x1f, 0xd8, 0xcb, 0x5f, 0xb7, 0x40, 0xcc, 0xd0, + 0x63, 0xd0, 0x00, 0x57, 0x4d, 0x0d, 0xf0, 0x23, 0x45, 0x26, 0x7d, 0x17, 0xd5, 0xef, 0x97, 0x4a, + 0x30, 0xc1, 0x09, 0x52, 0x9f, 0xfa, 0xc3, 0xf2, 0x71, 0x7a, 0x7b, 0xf5, 0x43, 0x3d, 0xb5, 0xd8, + 0xb9, 0xa7, 0xc6, 0xb7, 0xec, 0x3b, 0xf0, 0x5b, 0xfe, 0xb9, 0x05, 0x88, 0x8f, 0x49, 0xf6, 0x79, + 0x5c, 0xee, 0xdc, 0xd5, 0x0c, 0xba, 0x54, 0x72, 0x28, 0x0c, 0xd6, 0xa8, 0x1e, 0x70, 0x17, 0x32, + 0x27, 0x1a, 0xe5, 0xfc, 0x13, 0x8d, 0x1e, 0x7a, 0xfd, 0xdb, 0x65, 0xc8, 0x06, 0xc3, 0xa1, 0xb7, + 0x61, 0xa4, 0xe1, 0x34, 0x9d, 0x3b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0x8b, 0x1d, 0x99, 0x2e, 0x69, + 0x25, 0xc4, 0x41, 0x82, 0x06, 0xc1, 0x06, 0x47, 0x34, 0x07, 0xd0, 0x8c, 0xbc, 0x6d, 0xcf, 0x27, + 0x1b, 0x4c, 0x67, 0x65, 0xd1, 0xf4, 0xfc, 0xf4, 0x4f, 0x42, 0xb1, 0x46, 0xd1, 0x21, 0xfa, 0xba, + 0x7c, 0x1c, 0xd1, 0xd7, 0x7d, 0x3d, 0x46, 0x5f, 0xf7, 0x17, 0x8a, 0xbe, 0xc6, 0x70, 0x4a, 0xfa, + 0xff, 0xe9, 0xff, 0x15, 0xcf, 0x27, 0x3c, 0xc9, 0xac, 0x88, 0xb6, 0x9f, 0xd9, 0xdb, 0x9d, 0x3d, + 0x85, 0x3b, 0x52, 0xe0, 0x2e, 0x25, 0xed, 0x16, 0x9c, 0xa8, 0x93, 0xc8, 0x63, 0xb9, 0xff, 0xdc, + 0x74, 0x2d, 0x7d, 0x01, 0x2a, 0x51, 0x66, 0x19, 0xf7, 0x78, 0xa5, 0x5a, 0xcb, 0x16, 0x25, 0x97, + 0x6d, 0xca, 0xd2, 0xfe, 0x5b, 0x25, 0x18, 0x14, 0x61, 0x70, 0xc7, 0xa0, 0x7c, 0x5c, 0x31, 0x9c, + 0x04, 0xcf, 0xe4, 0xc9, 0x3f, 0xd6, 0xac, 0xae, 0xee, 0x81, 0x7a, 0xc6, 0x3d, 0xf0, 0x5c, 0x31, + 0x76, 0x07, 0x3b, 0x06, 0xfe, 0x79, 0x19, 0xc6, 0xcc, 0xb0, 0xc0, 0x63, 0x18, 0x96, 0xd7, 0x61, + 0x30, 0x16, 0x11, 0xaa, 0xa5, 0x22, 0x51, 0x57, 0xd9, 0x4f, 0x9c, 0x9e, 0xa5, 0x8a, 0x98, 0x54, + 0xc9, 0xae, 0x63, 0x10, 0x6c, 0xf9, 0x58, 0x82, 0x60, 0xf3, 0xa2, 0x35, 0xfb, 0x1e, 0x44, 0xb4, + 0xa6, 0xfd, 0x43, 0x26, 0xf2, 0x75, 0xf8, 0x31, 0x6c, 0xe3, 0xaf, 0x99, 0x9b, 0xc3, 0xb9, 0x42, + 0xf3, 0x4e, 0x34, 0xaf, 0xcb, 0x76, 0xfe, 0x3d, 0x0b, 0x86, 0x05, 0xe1, 0x31, 0x74, 0xe0, 0xb3, + 0x66, 0x07, 0x9e, 0x2a, 0xd4, 0x81, 0x2e, 0x2d, 0xff, 0x66, 0x49, 0xb5, 0xbc, 0x26, 0x9e, 0x34, + 0xcf, 0xcd, 0x74, 0x3c, 0xd4, 0x8c, 0xc2, 0x24, 0x6c, 0x84, 0xbe, 0x50, 0xe0, 0x1e, 0x4b, 0x2f, + 0x57, 0x71, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x76, 0xf7, 0x27, 0x8c, 0x12, 0xb1, 0x81, 0x76, + 0x7a, 0x50, 0xdd, 0x05, 0x48, 0x5f, 0xb1, 0x16, 0xf7, 0x12, 0x7b, 0x7f, 0xaa, 0x3d, 0xbd, 0x2d, + 0xa5, 0x78, 0x61, 0x8d, 0xaf, 0x0c, 0xc3, 0x67, 0x75, 0xf4, 0x9b, 0x67, 0x00, 0xd7, 0x05, 0x1c, + 0x2b, 0x0a, 0xfb, 0x65, 0x26, 0xd9, 0xd9, 0x00, 0xf5, 0x76, 0x91, 0xe9, 0x17, 0x07, 0xd4, 0xd0, + 0x32, 0xc7, 0xde, 0x75, 0xfd, 0xba, 0x54, 0x51, 0xf1, 0x49, 0x9b, 0xa0, 0x47, 0xc2, 0xa6, 0xb7, + 0xab, 0x10, 0x69, 0x3b, 0x38, 0x7a, 0xb9, 0xb0, 0x44, 0xee, 0xe1, 0xa8, 0x88, 0x25, 0x77, 0x63, + 0x19, 0xad, 0x56, 0x6b, 0xd9, 0xfc, 0xd4, 0x4b, 0x12, 0x81, 0x53, 0x1a, 0x34, 0x2f, 0x0c, 0x4a, + 0xf3, 0xc5, 0x7b, 0x69, 0x50, 0xca, 0x21, 0xd1, 0x2c, 0xca, 0xf3, 0x30, 0xac, 0x9e, 0xfc, 0xa8, + 0xf1, 0xc7, 0x16, 0x2a, 0x5c, 0xbf, 0x5a, 0x4e, 0xc1, 0x58, 0xa7, 0x41, 0xab, 0x70, 0xc2, 0x55, + 0xb7, 0x2e, 0x6a, 0xad, 0x3b, 0xbe, 0xd7, 0xa0, 0x45, 0xf9, 0x8d, 0xc9, 0x47, 0xf6, 0x76, 0x67, + 0x4f, 0x54, 0xdb, 0xd1, 0xb8, 0x53, 0x19, 0xb4, 0x06, 0xe3, 0x31, 0x7f, 0xda, 0x44, 0x86, 0xd6, + 0x8b, 0xb4, 0xad, 0xcf, 0xca, 0x13, 0xab, 0xba, 0x89, 0xde, 0x67, 0x20, 0x2e, 0x15, 0x64, 0x30, + 0x7e, 0x96, 0x05, 0x7a, 0x15, 0xc6, 0x7c, 0xfd, 0xdd, 0xc6, 0x9a, 0xb8, 0x7c, 0xa2, 0x62, 0x90, + 0x8c, 0x57, 0x1d, 0x6b, 0x38, 0x43, 0x8d, 0x5e, 0x87, 0x69, 0x1d, 0x22, 0x32, 0xc1, 0x38, 0xc1, + 0x06, 0x89, 0xc5, 0x33, 0x08, 0x8f, 0xed, 0xed, 0xce, 0x4e, 0x5f, 0xed, 0x42, 0x83, 0xbb, 0x96, + 0x46, 0x17, 0x61, 0x44, 0x8e, 0xa4, 0x76, 0x11, 0x25, 0x8d, 0x7e, 0xd3, 0x70, 0xd8, 0xa0, 0xfc, + 0x60, 0x07, 0x73, 0x5f, 0xa2, 0x85, 0xb5, 0x2d, 0x1c, 0xbd, 0x03, 0x23, 0x7a, 0x1b, 0xb3, 0x7b, + 0x73, 0xfe, 0x5b, 0x98, 0x42, 0x15, 0x50, 0x2d, 0xd7, 0x71, 0xd8, 0xe0, 0x6d, 0xdf, 0x80, 0x81, + 0xfa, 0x4e, 0xdc, 0x48, 0xfc, 0x02, 0xf2, 0xed, 0x49, 0xa3, 0x0b, 0xe9, 0xda, 0x63, 0xef, 0xf2, + 0x88, 0x1e, 0xd9, 0x04, 0xc6, 0xd7, 0x96, 0x6a, 0xfc, 0xd5, 0xff, 0x05, 0x6e, 0xbd, 0x61, 0x21, + 0xdd, 0xac, 0x43, 0x4a, 0xad, 0x0e, 0xf2, 0xd0, 0xfe, 0x13, 0x0b, 0xfa, 0xd9, 0x9b, 0x32, 0x79, + 0xef, 0x11, 0x15, 0x69, 0x34, 0x7a, 0x09, 0x06, 0xc8, 0xfa, 0x3a, 0x69, 0x24, 0x62, 0x19, 0xcb, + 0x68, 0xef, 0x81, 0x65, 0x06, 0xa5, 0x8b, 0x93, 0x55, 0xc6, 0xff, 0x62, 0x41, 0x8c, 0x3e, 0x0f, + 0x95, 0xc4, 0xdb, 0x22, 0x0b, 0xae, 0x4b, 0xdc, 0x43, 0xdc, 0x15, 0x57, 0xc2, 0x62, 0x4d, 0x32, + 0xc1, 0x29, 0x3f, 0xfb, 0xbd, 0x12, 0x40, 0x7a, 0xd7, 0x22, 0xaf, 0x9b, 0x8b, 0x6d, 0xcf, 0x2e, + 0x3d, 0xdd, 0xe1, 0xd9, 0x25, 0x94, 0x32, 0xec, 0xf0, 0xe8, 0x92, 0x1a, 0xaa, 0x72, 0xa1, 0xa1, + 0xea, 0xeb, 0x65, 0xa8, 0x96, 0x60, 0x32, 0xbd, 0x2b, 0x62, 0x5e, 0xba, 0x63, 0x49, 0x18, 0xd7, + 0xb2, 0x48, 0xdc, 0x4e, 0x6f, 0xbf, 0x67, 0x81, 0x08, 0x59, 0x2b, 0x30, 0x5b, 0x5d, 0xf9, 0x44, + 0x8a, 0x91, 0x87, 0xea, 0xd9, 0x22, 0xd1, 0x7c, 0x22, 0xfb, 0x94, 0x5a, 0x3f, 0x46, 0xce, 0x29, + 0x83, 0xab, 0xfd, 0x1b, 0x16, 0x0c, 0x73, 0xf4, 0x35, 0xa6, 0x53, 0xe7, 0xb7, 0xab, 0xa7, 0x0c, + 0x9f, 0xec, 0xf5, 0x10, 0xca, 0x58, 0x65, 0x7a, 0xd4, 0x5f, 0x0f, 0x91, 0x08, 0x9c, 0xd2, 0xa0, + 0x67, 0x60, 0x30, 0x6e, 0xdd, 0x61, 0xe4, 0x99, 0xf8, 0xb5, 0x3a, 0x07, 0x63, 0x89, 0xb7, 0xff, + 0x65, 0x09, 0x26, 0xb2, 0xe1, 0x8b, 0x08, 0xc3, 0x00, 0xd7, 0xb1, 0xb3, 0xea, 0xd9, 0x41, 0xbe, + 0x1c, 0x2d, 0xfc, 0x11, 0xf8, 0x1b, 0xb8, 0x2c, 0xe6, 0x4c, 0x70, 0x42, 0xeb, 0x30, 0xec, 0x86, + 0xf7, 0x82, 0x7b, 0x4e, 0xe4, 0x2e, 0xd4, 0x56, 0xc5, 0x97, 0xc8, 0x09, 0x38, 0xa9, 0xa6, 0x05, + 0xf4, 0xe0, 0x4a, 0xe6, 0x5b, 0x48, 0x51, 0x58, 0x67, 0x4c, 0x6d, 0xca, 0x46, 0x18, 0xac, 0x7b, + 0x1b, 0xd7, 0x9c, 0x66, 0xb1, 0xa3, 0xd5, 0x25, 0x49, 0xae, 0xd5, 0x31, 0x2a, 0x6e, 0xd9, 0x73, + 0x04, 0x4e, 0x59, 0xda, 0x7f, 0x70, 0x02, 0x8c, 0xb9, 0x60, 0xa4, 0xe1, 0xb4, 0x1e, 0x78, 0x1a, + 0xce, 0x37, 0x61, 0x88, 0x6c, 0x35, 0x93, 0x9d, 0xaa, 0x17, 0x15, 0x4b, 0xaa, 0xbc, 0x2c, 0xa8, + 0xdb, 0xb9, 0x4b, 0x0c, 0x56, 0x1c, 0xbb, 0x24, 0x55, 0x2d, 0x3f, 0x14, 0x49, 0x55, 0xfb, 0xfe, + 0x42, 0x92, 0xaa, 0xbe, 0x0e, 0x83, 0x1b, 0x5e, 0x82, 0x49, 0x33, 0x14, 0x69, 0x0b, 0x72, 0x26, + 0xcf, 0x25, 0x4e, 0xdc, 0x9e, 0x29, 0x51, 0x20, 0xb0, 0x64, 0x87, 0xd6, 0xd4, 0xa2, 0x1a, 0x28, + 0xb2, 0x97, 0xb7, 0xfb, 0xfa, 0x3a, 0x2e, 0x2b, 0x91, 0x44, 0x75, 0xf0, 0x83, 0x27, 0x51, 0x55, + 0xa9, 0x4f, 0x87, 0x1e, 0x54, 0xea, 0x53, 0x23, 0x85, 0x6c, 0xe5, 0x28, 0x52, 0xc8, 0xbe, 0x67, + 0xc1, 0xc9, 0x66, 0xa7, 0x04, 0xcc, 0x22, 0x89, 0xe9, 0xa7, 0x0f, 0x91, 0x92, 0xda, 0xa8, 0x9a, + 0x5d, 0x06, 0xef, 0x48, 0x86, 0x3b, 0x57, 0x2c, 0x73, 0xd1, 0x0e, 0x7f, 0xf0, 0x5c, 0xb4, 0x47, + 0x9d, 0xed, 0x34, 0xcd, 0x4c, 0x3b, 0x7a, 0x24, 0x99, 0x69, 0xc7, 0x1e, 0x60, 0x66, 0x5a, 0x2d, + 0xa7, 0xec, 0xf8, 0x83, 0xcd, 0x29, 0xbb, 0x69, 0xee, 0x4b, 0x3c, 0x85, 0xe9, 0x4b, 0x85, 0xf7, + 0x25, 0xa3, 0x86, 0x83, 0x77, 0x26, 0x9e, 0x5d, 0x77, 0xf2, 0x03, 0x66, 0xd7, 0x35, 0x72, 0xd4, + 0xa2, 0xa3, 0xc8, 0x51, 0xfb, 0xb6, 0xbe, 0x83, 0x9e, 0x28, 0x52, 0x83, 0xda, 0x28, 0xdb, 0x6b, + 0xe8, 0xb4, 0x87, 0xb6, 0x67, 0xc1, 0x9d, 0x3a, 0xee, 0x2c, 0xb8, 0x27, 0x8f, 0x30, 0x0b, 0xee, + 0xa9, 0x63, 0xcd, 0x82, 0xfb, 0xc8, 0x43, 0x92, 0x05, 0x77, 0xfa, 0x28, 0xb3, 0xe0, 0xd2, 0x01, + 0x6e, 0xca, 0xab, 0x3a, 0xd3, 0x8f, 0x16, 0x19, 0xe0, 0x8e, 0x37, 0x7b, 0xf8, 0x00, 0x2b, 0x14, + 0x4e, 0x99, 0xda, 0x7f, 0x0d, 0x4e, 0x1f, 0x3c, 0xc1, 0xd2, 0xb7, 0x27, 0x6a, 0xa9, 0x67, 0x2b, + 0xf3, 0xf6, 0x04, 0x53, 0xde, 0x34, 0xaa, 0xc2, 0x69, 0x3a, 0xbf, 0x63, 0xc1, 0x23, 0x5d, 0xb2, + 0xd8, 0x15, 0xbe, 0xe7, 0xd6, 0x84, 0xf1, 0xa6, 0x59, 0xb4, 0xf0, 0xb5, 0x59, 0x23, 0x6b, 0x9e, + 0x8a, 0x45, 0xce, 0x20, 0x70, 0x96, 0xfd, 0xe2, 0x47, 0x7e, 0xf4, 0xfe, 0xe9, 0x0f, 0xfd, 0xf8, + 0xfd, 0xd3, 0x1f, 0xfa, 0xa3, 0xf7, 0x4f, 0x7f, 0xe8, 0xe7, 0xf6, 0x4e, 0x5b, 0x3f, 0xda, 0x3b, + 0x6d, 0xfd, 0x78, 0xef, 0xb4, 0xf5, 0xa7, 0x7b, 0xa7, 0xad, 0xf7, 0x7e, 0x72, 0xfa, 0x43, 0x6f, + 0x94, 0xb6, 0xcf, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xb1, 0xc5, 0x2d, 0xcc, 0xc5, + 0x00, 0x00, } diff --git a/pkg/api/v1/generated.proto b/pkg/api/v1/generated.proto index 7425337af73..73eab9a5c3a 100644 --- a/pkg/api/v1/generated.proto +++ b/pkg/api/v1/generated.proto @@ -680,10 +680,18 @@ message DeleteOptions { // +optional optional Preconditions preconditions = 2; + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional optional bool orphanDependents = 3; + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + optional string propagationPolicy = 4; } // Represents downward API info for projecting into a projected volume. diff --git a/pkg/api/v1/types.generated.go b/pkg/api/v1/types.generated.go index 8b203c54b48..3ff5805149c 100644 --- a/pkg/api/v1/types.generated.go +++ b/pkg/api/v1/types.generated.go @@ -51338,6 +51338,32 @@ func (x *Preconditions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x DeletionPropagation) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *DeletionPropagation) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} + func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -51352,7 +51378,7 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [5]bool + var yyq2 [6]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.Kind != "" @@ -51362,9 +51388,9 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.OrphanDependents != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(5) + r.EncodeArrayStart(6) } else { - yynn2 = 0 + yynn2 = 1 for _, b := range yyq2 { if b { yynn2++ @@ -51516,6 +51542,25 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.PropagationPolicy == nil { + r.EncodeNil() + } else { + yy23 := *x.PropagationPolicy + yy23.CodecEncodeSelf(e) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("PropagationPolicy")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.PropagationPolicy == nil { + r.EncodeNil() + } else { + yy25 := *x.PropagationPolicy + yy25.CodecEncodeSelf(e) + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -51644,6 +51689,17 @@ func (x *DeleteOptions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*bool)(x.OrphanDependents)) = r.DecodeBool() } } + case "PropagationPolicy": + if r.TryDecodeAsNil() { + if x.PropagationPolicy != nil { + x.PropagationPolicy = nil + } + } else { + if x.PropagationPolicy == nil { + x.PropagationPolicy = new(DeletionPropagation) + } + x.PropagationPolicy.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -51655,16 +51711,16 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj13 int - var yyb13 bool - var yyhl13 bool = l >= 0 - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + var yyj14 int + var yyb14 bool + var yyhl14 bool = l >= 0 + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51672,21 +51728,21 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Kind = "" } else { - yyv14 := &x.Kind - yym15 := z.DecBinary() - _ = yym15 + yyv15 := &x.Kind + yym16 := z.DecBinary() + _ = yym16 if false { } else { - *((*string)(yyv14)) = r.DecodeString() + *((*string)(yyv15)) = r.DecodeString() } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51694,21 +51750,21 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.APIVersion = "" } else { - yyv16 := &x.APIVersion - yym17 := z.DecBinary() - _ = yym17 + yyv17 := &x.APIVersion + yym18 := z.DecBinary() + _ = yym18 if false { } else { - *((*string)(yyv16)) = r.DecodeString() + *((*string)(yyv17)) = r.DecodeString() } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51721,20 +51777,20 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.GracePeriodSeconds == nil { x.GracePeriodSeconds = new(int64) } - yym19 := z.DecBinary() - _ = yym19 + yym20 := z.DecBinary() + _ = yym20 if false { } else { *((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64)) } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51749,13 +51805,13 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Preconditions.CodecDecodeSelf(d) } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51768,25 +51824,46 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.OrphanDependents == nil { x.OrphanDependents = new(bool) } - yym22 := z.DecBinary() - _ = yym22 + yym23 := z.DecBinary() + _ = yym23 if false { } else { *((*bool)(x.OrphanDependents)) = r.DecodeBool() } } - for { - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l - } else { - yyb13 = r.CheckBreak() + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.PropagationPolicy != nil { + x.PropagationPolicy = nil } - if yyb13 { + } else { + if x.PropagationPolicy == nil { + x.PropagationPolicy = new(DeletionPropagation) + } + x.PropagationPolicy.CodecDecodeSelf(d) + } + for { + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj13-1, "") + z.DecStructFieldNotFound(yyj14-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -65736,7 +65813,7 @@ func (x codecSelfer1234) decSlicev1_OwnerReference(v *[]pkg2_v1.OwnerReference, yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 72) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 80) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/pkg/api/v1/types_swagger_doc_generated.go b/pkg/api/v1/types_swagger_doc_generated.go index f0516f89fb1..bc7d261501c 100644 --- a/pkg/api/v1/types_swagger_doc_generated.go +++ b/pkg/api/v1/types_swagger_doc_generated.go @@ -355,7 +355,8 @@ var map_DeleteOptions = map[string]string{ "": "DeleteOptions may be provided when deleting an API object DEPRECATED: This type has been moved to meta/v1 and will be removed soon.", "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", - "orphanDependents": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "PropagationPolicy": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", } func (DeleteOptions) SwaggerDoc() map[string]string { diff --git a/pkg/api/v1/zz_generated.conversion.go b/pkg/api/v1/zz_generated.conversion.go index 26ec86e1611..47305c9e9f9 100644 --- a/pkg/api/v1/zz_generated.conversion.go +++ b/pkg/api/v1/zz_generated.conversion.go @@ -1064,6 +1064,7 @@ func autoConvert_v1_DeleteOptions_To_api_DeleteOptions(in *DeleteOptions, out *a out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds)) out.Preconditions = (*api.Preconditions)(unsafe.Pointer(in.Preconditions)) out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents)) + out.PropagationPolicy = (*api.DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy)) return nil } @@ -1075,6 +1076,7 @@ func autoConvert_api_DeleteOptions_To_v1_DeleteOptions(in *api.DeleteOptions, ou out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds)) out.Preconditions = (*Preconditions)(unsafe.Pointer(in.Preconditions)) out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents)) + out.PropagationPolicy = (*DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy)) return nil } diff --git a/pkg/api/v1/zz_generated.deepcopy.go b/pkg/api/v1/zz_generated.deepcopy.go index a1c916a6604..76fa388827c 100644 --- a/pkg/api/v1/zz_generated.deepcopy.go +++ b/pkg/api/v1/zz_generated.deepcopy.go @@ -734,6 +734,11 @@ func DeepCopy_v1_DeleteOptions(in interface{}, out interface{}, c *conversion.Cl *out = new(bool) **out = **in } + if in.PropagationPolicy != nil { + in, out := &in.PropagationPolicy, &out.PropagationPolicy + *out = new(DeletionPropagation) + **out = **in + } return nil } } diff --git a/pkg/api/zz_generated.deepcopy.go b/pkg/api/zz_generated.deepcopy.go index 47fc350748b..2d56e395184 100644 --- a/pkg/api/zz_generated.deepcopy.go +++ b/pkg/api/zz_generated.deepcopy.go @@ -762,6 +762,11 @@ func DeepCopy_api_DeleteOptions(in interface{}, out interface{}, c *conversion.C *out = new(bool) **out = **in } + if in.PropagationPolicy != nil { + in, out := &in.PropagationPolicy, &out.PropagationPolicy + *out = new(DeletionPropagation) + **out = **in + } return nil } } diff --git a/pkg/controller/garbagecollector/BUILD b/pkg/controller/garbagecollector/BUILD index 6805707ba86..20d2cc51e1e 100644 --- a/pkg/controller/garbagecollector/BUILD +++ b/pkg/controller/garbagecollector/BUILD @@ -12,14 +12,20 @@ go_library( name = "go_default_library", srcs = [ "garbagecollector.go", + "graph.go", + "graph_builder.go", "metrics.go", + "operations.go", + "patch.go", "rate_limiter_helper.go", "uid_cache.go", ], tags = ["automanaged"], deps = [ + "//pkg/client/retry:go_default_library", "//pkg/controller/garbagecollector/metaonly:go_default_library", "//pkg/util/metrics:go_default_library", + "//pkg/util/workqueue/prometheus:go_default_library", "//vendor:github.com/golang/glog", "//vendor:github.com/golang/groupcache/lru", "//vendor:github.com/prometheus/client_golang/prometheus", @@ -54,15 +60,16 @@ go_test( "//pkg/api/v1:go_default_library", "//pkg/controller/garbagecollector/metaonly:go_default_library", "//vendor:github.com/stretchr/testify/assert", + "//vendor:k8s.io/apimachinery/pkg/api/meta", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", "//vendor:k8s.io/apimachinery/pkg/runtime/serializer", "//vendor:k8s.io/apimachinery/pkg/types", "//vendor:k8s.io/apimachinery/pkg/util/json", "//vendor:k8s.io/apimachinery/pkg/util/sets", + "//vendor:k8s.io/apimachinery/pkg/util/strategicpatch", "//vendor:k8s.io/client-go/dynamic", "//vendor:k8s.io/client-go/rest", - "//vendor:k8s.io/client-go/util/clock", "//vendor:k8s.io/client-go/util/workqueue", ], ) diff --git a/pkg/generated/openapi/zz_generated.openapi.go b/pkg/generated/openapi/zz_generated.openapi.go index 58a072d7b22..655e159249f 100644 --- a/pkg/generated/openapi/zz_generated.openapi.go +++ b/pkg/generated/openapi/zz_generated.openapi.go @@ -351,11 +351,18 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope }, "orphanDependents": { SchemaProps: spec.SchemaProps{ - Description: "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + Description: "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", Type: []string{"boolean"}, Format: "", }, }, + "propagationPolicy": { + SchemaProps: spec.SchemaProps{ + Description: "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -966,6 +973,13 @@ func GetOpenAPIDefinitions(ref openapi.ReferenceCallback) map[string]openapi.Ope Format: "", }, }, + "blockOwnerDeletion": { + SchemaProps: spec.SchemaProps{ + Description: "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", + Type: []string{"boolean"}, + Format: "", + }, + }, }, Required: []string{"apiVersion", "kind", "name", "uid"}, }, diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go index 2167cbf3968..72282474d4c 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go @@ -512,6 +512,12 @@ func (m *DeleteOptions) MarshalTo(data []byte) (int, error) { } i++ } + if m.PropagationPolicy != nil { + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(len(*m.PropagationPolicy))) + i += copy(data[i:], *m.PropagationPolicy) + } return i, nil } @@ -1087,6 +1093,16 @@ func (m *OwnerReference) MarshalTo(data []byte) (int, error) { } i++ } + if m.BlockOwnerDeletion != nil { + data[i] = 0x38 + i++ + if *m.BlockOwnerDeletion { + data[i] = 1 + } else { + data[i] = 0 + } + i++ + } return i, nil } @@ -1539,6 +1555,10 @@ func (m *DeleteOptions) Size() (n int) { if m.OrphanDependents != nil { n += 2 } + if m.PropagationPolicy != nil { + l = len(*m.PropagationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -1763,6 +1783,9 @@ func (m *OwnerReference) Size() (n int) { if m.Controller != nil { n += 2 } + if m.BlockOwnerDeletion != nil { + n += 2 + } return n } @@ -1957,6 +1980,7 @@ func (this *DeleteOptions) String() string { `GracePeriodSeconds:` + valueToStringGenerated(this.GracePeriodSeconds) + `,`, `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, + `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, `}`, }, "") return s @@ -2115,6 +2139,7 @@ func (this *OwnerReference) String() string { `UID:` + fmt.Sprintf("%v", this.UID) + `,`, `APIVersion:` + fmt.Sprintf("%v", this.APIVersion) + `,`, `Controller:` + valueToStringGenerated(this.Controller) + `,`, + `BlockOwnerDeletion:` + valueToStringGenerated(this.BlockOwnerDeletion) + `,`, `}`, }, "") return s @@ -2997,6 +3022,36 @@ func (m *DeleteOptions) Unmarshal(data []byte) error { } b := bool(v != 0) m.OrphanDependents = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", 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 := DeletionPropagation(data[iNdEx:postIndex]) + m.PropagationPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -5379,6 +5434,27 @@ func (m *OwnerReference) Unmarshal(data []byte) error { } b := bool(v != 0) m.Controller = &b + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field BlockOwnerDeletion", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := data[iNdEx] + iNdEx++ + v |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + b := bool(v != 0) + m.BlockOwnerDeletion = &b default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -6700,137 +6776,140 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 2098 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x19, 0x4b, 0x6f, 0x23, 0x49, - 0x39, 0x6d, 0xc7, 0x1e, 0xfb, 0x73, 0x9c, 0x47, 0x91, 0x01, 0x6f, 0x24, 0xec, 0x6c, 0xef, 0x0a, - 0x65, 0x61, 0xd6, 0x26, 0x59, 0x58, 0x0d, 0x03, 0x0c, 0xc4, 0x71, 0x26, 0x8a, 0x76, 0x32, 0x89, - 0x2a, 0x3b, 0x83, 0x58, 0x46, 0x88, 0x8e, 0xbb, 0xe2, 0x34, 0x69, 0x77, 0x37, 0x55, 0x65, 0x4f, - 0xc2, 0x1e, 0x58, 0x69, 0x41, 0x70, 0x40, 0x68, 0x8e, 0x1c, 0x10, 0xda, 0x11, 0xdc, 0xb8, 0xf1, - 0x27, 0x98, 0xe3, 0x4a, 0x5c, 0x38, 0x20, 0x8b, 0x09, 0x07, 0x8e, 0xdc, 0x23, 0x0e, 0xa8, 0xaa, - 0xab, 0xfa, 0xe1, 0x8c, 0x37, 0x6d, 0x76, 0x0f, 0x9c, 0xe2, 0xfa, 0xde, 0xf5, 0xd5, 0xf7, 0xec, - 0xc0, 0xde, 0xe9, 0x6d, 0xd6, 0x74, 0xfc, 0xd6, 0xe9, 0xe0, 0x88, 0x50, 0x8f, 0x70, 0xc2, 0x5a, - 0x43, 0xe2, 0xd9, 0x3e, 0x6d, 0x29, 0x84, 0x15, 0x38, 0x7d, 0xab, 0x7b, 0xe2, 0x78, 0x84, 0x9e, - 0xb7, 0x82, 0xd3, 0x9e, 0x00, 0xb0, 0x56, 0x9f, 0x70, 0xab, 0x35, 0x5c, 0x6f, 0xf5, 0x88, 0x47, - 0xa8, 0xc5, 0x89, 0xdd, 0x0c, 0xa8, 0xcf, 0x7d, 0xf4, 0x7a, 0xc8, 0xd5, 0x4c, 0x72, 0x35, 0x83, - 0xd3, 0x9e, 0x00, 0xb0, 0xa6, 0xe0, 0x6a, 0x0e, 0xd7, 0x57, 0xde, 0xec, 0x39, 0xfc, 0x64, 0x70, - 0xd4, 0xec, 0xfa, 0xfd, 0x56, 0xcf, 0xef, 0xf9, 0x2d, 0xc9, 0x7c, 0x34, 0x38, 0x96, 0x27, 0x79, - 0x90, 0xbf, 0x42, 0xa1, 0x2b, 0x13, 0x4d, 0xa1, 0x03, 0x8f, 0x3b, 0x7d, 0x32, 0x6e, 0xc5, 0xca, - 0xdb, 0xd7, 0x31, 0xb0, 0xee, 0x09, 0xe9, 0x5b, 0x57, 0xf8, 0xde, 0x9a, 0xc4, 0x37, 0xe0, 0x8e, - 0xdb, 0x72, 0x3c, 0xce, 0x38, 0x1d, 0x67, 0x32, 0xff, 0x92, 0x87, 0xd2, 0xe6, 0xc1, 0xee, 0x0e, - 0xf5, 0x07, 0x01, 0x5a, 0x85, 0x59, 0xcf, 0xea, 0x93, 0x9a, 0xb1, 0x6a, 0xac, 0x95, 0xdb, 0x73, - 0xcf, 0x47, 0x8d, 0x99, 0x8b, 0x51, 0x63, 0xf6, 0x81, 0xd5, 0x27, 0x58, 0x62, 0x90, 0x0b, 0xa5, - 0x21, 0xa1, 0xcc, 0xf1, 0x3d, 0x56, 0xcb, 0xad, 0xe6, 0xd7, 0x2a, 0x1b, 0x77, 0x9b, 0x59, 0x9c, - 0xd6, 0x94, 0x0a, 0x1e, 0x85, 0xac, 0xf7, 0x7c, 0xda, 0x71, 0x58, 0xd7, 0x1f, 0x12, 0x7a, 0xde, - 0x5e, 0x54, 0x5a, 0x4a, 0x0a, 0xc9, 0x70, 0xa4, 0x01, 0xfd, 0xdc, 0x80, 0xc5, 0x80, 0x92, 0x63, - 0x42, 0x29, 0xb1, 0x15, 0xbe, 0x96, 0x5f, 0x35, 0x3e, 0x03, 0xb5, 0x35, 0xa5, 0x76, 0xf1, 0x60, - 0x4c, 0x3e, 0xbe, 0xa2, 0x11, 0xfd, 0xc1, 0x80, 0x15, 0x46, 0xe8, 0x90, 0xd0, 0x4d, 0xdb, 0xa6, - 0x84, 0xb1, 0xf6, 0xf9, 0x96, 0xeb, 0x10, 0x8f, 0x6f, 0xed, 0x76, 0x30, 0xab, 0xcd, 0x4a, 0x3f, - 0x7c, 0x27, 0x9b, 0x41, 0x87, 0x93, 0xe4, 0xb4, 0x4d, 0x65, 0xd1, 0xca, 0x44, 0x12, 0x86, 0x3f, - 0xc1, 0x0c, 0xf3, 0x18, 0xe6, 0xf4, 0x43, 0xde, 0x77, 0x18, 0x47, 0x8f, 0xa0, 0xd8, 0x13, 0x07, - 0x56, 0x33, 0xa4, 0x81, 0xcd, 0x6c, 0x06, 0x6a, 0x19, 0xed, 0x79, 0x65, 0x4f, 0x51, 0x1e, 0x19, - 0x56, 0xd2, 0xcc, 0x0f, 0x73, 0x50, 0xd9, 0x3c, 0xd8, 0xc5, 0x84, 0xf9, 0x03, 0xda, 0x25, 0x19, - 0x82, 0x66, 0x03, 0x40, 0xfc, 0x65, 0x81, 0xd5, 0x25, 0x76, 0x2d, 0xb7, 0x6a, 0xac, 0x95, 0xda, - 0x48, 0xd1, 0xc1, 0x83, 0x08, 0x83, 0x13, 0x54, 0x42, 0xea, 0xa9, 0xe3, 0xd9, 0xf2, 0xb5, 0x13, - 0x52, 0xdf, 0x71, 0x3c, 0x1b, 0x4b, 0x0c, 0xba, 0x0f, 0x85, 0x21, 0xa1, 0x47, 0xc2, 0xff, 0x22, - 0x20, 0xbe, 0x92, 0xed, 0x7a, 0x8f, 0x04, 0x4b, 0xbb, 0x7c, 0x31, 0x6a, 0x14, 0xe4, 0x4f, 0x1c, - 0x0a, 0x41, 0x4d, 0x00, 0x76, 0xe2, 0x53, 0x2e, 0xcd, 0xa9, 0x15, 0x56, 0xf3, 0x6b, 0xe5, 0xf6, - 0xbc, 0xb0, 0xef, 0x30, 0x82, 0xe2, 0x04, 0x85, 0xf9, 0x67, 0x03, 0x16, 0x12, 0x5e, 0x90, 0x1e, - 0xbf, 0x0d, 0x73, 0xbd, 0x44, 0xbc, 0x29, 0x8f, 0x2c, 0x2b, 0xdb, 0xe7, 0x92, 0xb1, 0x88, 0x53, - 0x94, 0x88, 0x40, 0x99, 0x2a, 0x49, 0x3a, 0xaf, 0xd6, 0x33, 0x3f, 0x97, 0xb6, 0x21, 0xd6, 0x94, - 0x00, 0x32, 0x1c, 0x4b, 0x36, 0xff, 0x65, 0xc8, 0xa7, 0xd3, 0x99, 0x86, 0xd6, 0x12, 0xd9, 0x6c, - 0xc8, 0x2b, 0xcf, 0x4d, 0xc8, 0xc4, 0x6b, 0x52, 0x20, 0xf7, 0x7f, 0x91, 0x02, 0x77, 0x4a, 0xbf, - 0xfd, 0xa8, 0x31, 0xf3, 0xc1, 0xdf, 0x57, 0x67, 0xcc, 0x5f, 0xe6, 0xa0, 0xda, 0x21, 0x2e, 0xe1, - 0x64, 0x3f, 0xe0, 0xf2, 0x06, 0xf7, 0x00, 0xf5, 0xa8, 0xd5, 0x25, 0x07, 0x84, 0x3a, 0xbe, 0x7d, - 0x48, 0xba, 0xbe, 0x67, 0x33, 0xf9, 0x44, 0xf9, 0xf6, 0xe7, 0x2f, 0x46, 0x0d, 0xb4, 0x73, 0x05, - 0x8b, 0x5f, 0xc2, 0x81, 0x5c, 0xa8, 0x06, 0x54, 0xfe, 0x76, 0xb8, 0x2a, 0x83, 0x22, 0xfc, 0xde, - 0xca, 0x76, 0xf7, 0x83, 0x24, 0x6b, 0x7b, 0xe9, 0x62, 0xd4, 0xa8, 0xa6, 0x40, 0x38, 0x2d, 0x1c, - 0x7d, 0x17, 0x16, 0x7d, 0x1a, 0x9c, 0x58, 0x5e, 0x87, 0x04, 0xc4, 0xb3, 0x89, 0xc7, 0x99, 0x4c, - 0x89, 0x52, 0x7b, 0x59, 0x14, 0xaf, 0xfd, 0x31, 0x1c, 0xbe, 0x42, 0x6d, 0xee, 0x42, 0xa9, 0x33, - 0xa0, 0x96, 0x10, 0x87, 0xbe, 0x0d, 0x25, 0x5b, 0xfd, 0x56, 0x37, 0x7f, 0x55, 0x57, 0x5f, 0x4d, - 0x73, 0x39, 0x6a, 0x54, 0x45, 0x93, 0x69, 0x6a, 0x00, 0x8e, 0x58, 0xcc, 0xc7, 0x50, 0xdd, 0x3e, - 0x0b, 0x7c, 0xca, 0xb5, 0x4f, 0xbf, 0x04, 0x45, 0x22, 0x01, 0x52, 0x5a, 0x29, 0x2e, 0x19, 0x21, - 0x19, 0x56, 0x58, 0xf4, 0x1a, 0x14, 0xc8, 0x99, 0xd5, 0xe5, 0x2a, 0xf7, 0xab, 0x8a, 0xac, 0xb0, - 0x2d, 0x80, 0x38, 0xc4, 0x99, 0xfb, 0x00, 0x3b, 0x24, 0x12, 0xbd, 0x09, 0x0b, 0x3a, 0x6e, 0xd3, - 0xe9, 0xf4, 0x05, 0xc5, 0xbc, 0x80, 0xd3, 0x68, 0x3c, 0x4e, 0x6f, 0x3e, 0x86, 0xb2, 0x4c, 0x39, - 0x51, 0x33, 0x84, 0x09, 0x32, 0xe3, 0x94, 0x94, 0xc8, 0x04, 0x49, 0x81, 0x43, 0x5c, 0x54, 0x74, - 0x72, 0x93, 0x8a, 0x4e, 0x22, 0xc2, 0x5c, 0xa8, 0x86, 0xbc, 0xba, 0x0e, 0x66, 0xd2, 0x70, 0x0b, - 0x4a, 0xda, 0x4c, 0xa5, 0x25, 0xea, 0x7f, 0x5a, 0x10, 0x8e, 0x28, 0x12, 0xda, 0x4e, 0x20, 0x55, - 0x3e, 0xb2, 0x29, 0x7b, 0x03, 0x6e, 0xa8, 0x04, 0x56, 0xba, 0x16, 0x14, 0xd9, 0x0d, 0xed, 0x33, - 0x8d, 0x4f, 0x68, 0xfa, 0x19, 0xd4, 0x26, 0x35, 0xcd, 0x4f, 0x51, 0xe0, 0xb2, 0x9b, 0x62, 0xfe, - 0xc6, 0x80, 0xc5, 0xa4, 0xa4, 0xec, 0xcf, 0x97, 0x5d, 0xc9, 0xf5, 0xed, 0x25, 0xe1, 0x91, 0xdf, - 0x1b, 0xb0, 0x9c, 0xba, 0xda, 0x54, 0x2f, 0x3e, 0x85, 0x51, 0xc9, 0xe0, 0xc8, 0x4f, 0x11, 0x1c, - 0x7f, 0xcd, 0x41, 0xf5, 0xbe, 0x75, 0x44, 0xdc, 0x43, 0xe2, 0x92, 0x2e, 0xf7, 0x29, 0x7a, 0x1f, - 0x2a, 0x7d, 0x8b, 0x77, 0x4f, 0x24, 0x54, 0x0f, 0x00, 0x9d, 0x6c, 0x25, 0x2a, 0x25, 0xa9, 0xb9, - 0x17, 0x8b, 0xd9, 0xf6, 0x38, 0x3d, 0x6f, 0x7f, 0x4e, 0x99, 0x54, 0x49, 0x60, 0x70, 0x52, 0x9b, - 0x9c, 0xda, 0xe4, 0x79, 0xfb, 0x2c, 0x10, 0x35, 0x7a, 0xfa, 0x61, 0x31, 0x65, 0x02, 0x26, 0x3f, - 0x19, 0x38, 0x94, 0xf4, 0x89, 0xc7, 0xe3, 0xa9, 0x6d, 0x6f, 0x4c, 0x3e, 0xbe, 0xa2, 0x71, 0xe5, - 0x2e, 0x2c, 0x8e, 0x1b, 0x8f, 0x16, 0x21, 0x7f, 0x4a, 0xce, 0xc3, 0xf7, 0xc2, 0xe2, 0x27, 0x5a, - 0x86, 0xc2, 0xd0, 0x72, 0x07, 0x2a, 0x1b, 0x71, 0x78, 0xb8, 0x93, 0xbb, 0x6d, 0x98, 0x7f, 0x34, - 0xa0, 0x36, 0xc9, 0x10, 0xf4, 0xc5, 0x84, 0xa0, 0x76, 0x45, 0x59, 0x95, 0x7f, 0x87, 0x9c, 0x87, - 0x52, 0xb7, 0xa1, 0xe4, 0x07, 0x62, 0xce, 0xf6, 0xa9, 0x7a, 0xf5, 0x37, 0xf4, 0x4b, 0xee, 0x2b, - 0xf8, 0xe5, 0xa8, 0x71, 0x33, 0x25, 0x5e, 0x23, 0x70, 0xc4, 0x8a, 0x4c, 0x28, 0x4a, 0x7b, 0x44, - 0xcd, 0x17, 0xdd, 0x19, 0x44, 0x6d, 0x7d, 0x24, 0x21, 0x58, 0x61, 0xcc, 0xf7, 0xa1, 0x24, 0x86, - 0x8f, 0x3d, 0xc2, 0x2d, 0x11, 0x40, 0x8c, 0xb8, 0xc7, 0xf7, 0x1d, 0xef, 0x54, 0x99, 0x16, 0x05, - 0xd0, 0xa1, 0x82, 0xe3, 0x88, 0xe2, 0x65, 0x25, 0x36, 0x37, 0x65, 0x89, 0xfd, 0x53, 0x0e, 0x2a, - 0x42, 0xbb, 0xae, 0xda, 0xdf, 0x84, 0xaa, 0x9b, 0xbc, 0x93, 0xb2, 0xe2, 0xa6, 0x12, 0x98, 0x8e, - 0x52, 0x9c, 0xa6, 0x15, 0xcc, 0xc7, 0x0e, 0x71, 0xed, 0x88, 0x39, 0x97, 0x66, 0xbe, 0x97, 0x44, - 0xe2, 0x34, 0xad, 0xc8, 0xc5, 0x27, 0xe2, 0xb5, 0x55, 0x77, 0x8c, 0x72, 0xf1, 0x7b, 0x02, 0x88, - 0x43, 0xdc, 0xcb, 0x6e, 0x3c, 0x3b, 0xdd, 0x8d, 0xd1, 0x1d, 0x98, 0x17, 0xed, 0xd1, 0x1f, 0x70, - 0x3d, 0x42, 0x14, 0x64, 0x23, 0x45, 0x17, 0xa3, 0xc6, 0xfc, 0xbb, 0x29, 0x0c, 0x1e, 0xa3, 0x34, - 0x3f, 0x04, 0x80, 0xfd, 0xa3, 0x1f, 0x93, 0x6e, 0xf8, 0x5a, 0xd7, 0x0f, 0xce, 0xa2, 0xde, 0xaa, - 0x7d, 0x4d, 0x40, 0x95, 0x43, 0xe2, 0x7a, 0x9b, 0xc0, 0xe1, 0x14, 0x25, 0x6a, 0x41, 0x39, 0x1a, - 0xa6, 0x55, 0x2d, 0x59, 0x52, 0x6c, 0xe5, 0x68, 0xe2, 0xc6, 0x31, 0x4d, 0x2a, 0x74, 0x66, 0xaf, - 0x0d, 0x9d, 0x36, 0xe4, 0x07, 0x8e, 0x2d, 0xaf, 0x5e, 0x6e, 0x7f, 0x55, 0x87, 0xff, 0xc3, 0xdd, - 0xce, 0xe5, 0xa8, 0xf1, 0xea, 0xa4, 0x35, 0x94, 0x9f, 0x07, 0x84, 0x35, 0x1f, 0xee, 0x76, 0xb0, - 0x60, 0x7e, 0xd9, 0x63, 0x14, 0xa7, 0x7c, 0x8c, 0x0d, 0x00, 0x75, 0x6b, 0xc1, 0x7d, 0x23, 0x7c, - 0x08, 0xbd, 0x58, 0xec, 0x44, 0x18, 0x9c, 0xa0, 0x42, 0x0c, 0x96, 0xba, 0x94, 0xc8, 0xdf, 0xe2, - 0xb9, 0x18, 0xb7, 0xfa, 0x41, 0xad, 0x24, 0x67, 0xb8, 0x2f, 0x67, 0xab, 0x4e, 0x82, 0xad, 0xfd, - 0x8a, 0x52, 0xb3, 0xb4, 0x35, 0x2e, 0x0c, 0x5f, 0x95, 0x8f, 0x7c, 0x58, 0xb2, 0xc5, 0x34, 0x9a, - 0x52, 0x5a, 0x9e, 0x5a, 0xe9, 0x4d, 0xa1, 0xb0, 0x33, 0x2e, 0x08, 0x5f, 0x95, 0x8d, 0x7e, 0x08, - 0x2b, 0x1a, 0x78, 0x75, 0xae, 0xad, 0x81, 0xf4, 0x54, 0x5d, 0x4c, 0xda, 0x9d, 0x89, 0x54, 0xf8, - 0x13, 0x24, 0x20, 0x1b, 0x8a, 0x6e, 0xd8, 0x5b, 0x2a, 0xb2, 0xb0, 0x7f, 0x2b, 0xdb, 0x2d, 0xe2, - 0xe8, 0x6f, 0x26, 0x7b, 0x4a, 0x34, 0x37, 0xaa, 0x76, 0xa2, 0x64, 0xa3, 0x33, 0xa8, 0x58, 0x9e, - 0xe7, 0x73, 0x2b, 0x9c, 0xb4, 0xe7, 0xa4, 0xaa, 0xcd, 0xa9, 0x55, 0x6d, 0xc6, 0x32, 0xc6, 0x7a, - 0x58, 0x02, 0x83, 0x93, 0xaa, 0xd0, 0x13, 0x58, 0xf0, 0x9f, 0x78, 0x84, 0x62, 0x72, 0x4c, 0x28, - 0xf1, 0xc4, 0x5a, 0x56, 0x95, 0xda, 0xbf, 0x96, 0x51, 0x7b, 0x8a, 0x39, 0x0e, 0xe9, 0x34, 0x9c, - 0xe1, 0x71, 0x2d, 0x62, 0x0f, 0x3d, 0x76, 0x3c, 0xcb, 0x75, 0x7e, 0x4a, 0x28, 0xab, 0xcd, 0xc7, - 0x7b, 0xe8, 0xbd, 0x08, 0x8a, 0x13, 0x14, 0xe8, 0xeb, 0x50, 0xe9, 0xba, 0x03, 0xc6, 0x09, 0x95, - 0x15, 0x62, 0x41, 0x66, 0x50, 0x74, 0xbf, 0xad, 0x18, 0x85, 0x93, 0x74, 0x2b, 0xdf, 0x80, 0xca, - 0xff, 0xd8, 0x17, 0x45, 0x5f, 0x1d, 0x77, 0xe8, 0x54, 0x7d, 0xf5, 0x3f, 0x06, 0xcc, 0xa7, 0xdd, - 0x10, 0x4d, 0x63, 0xc6, 0xc4, 0x65, 0x5f, 0xd7, 0xca, 0xfc, 0xc4, 0x5a, 0xa9, 0x4a, 0xd2, 0xec, - 0xa7, 0x29, 0x49, 0x1b, 0x00, 0x56, 0xe0, 0xe8, 0x6a, 0x14, 0x56, 0xb7, 0xa8, 0x9e, 0xc4, 0x8b, - 0x33, 0x4e, 0x50, 0x89, 0x07, 0xeb, 0xfa, 0x1e, 0xa7, 0xbe, 0xeb, 0x12, 0x2a, 0x2b, 0x58, 0x29, - 0x7c, 0xb0, 0xad, 0x08, 0x8a, 0x13, 0x14, 0xe6, 0x3e, 0xa4, 0x37, 0x3e, 0x74, 0x37, 0x34, 0x3c, - 0xbc, 0xfb, 0xad, 0xa9, 0x8d, 0x36, 0x6f, 0x41, 0x19, 0xfb, 0x3e, 0x3f, 0xb0, 0xf8, 0x09, 0x43, - 0x0d, 0x28, 0x04, 0xe2, 0x87, 0x5a, 0xe7, 0xe5, 0x77, 0x0e, 0x89, 0xc1, 0x21, 0xdc, 0xfc, 0xb5, - 0x01, 0xaf, 0x4c, 0xdc, 0xae, 0x85, 0x03, 0xba, 0xd1, 0x49, 0x99, 0x14, 0x39, 0x20, 0xa6, 0xc3, - 0x09, 0x2a, 0xd1, 0xb6, 0x53, 0x2b, 0xf9, 0x78, 0xdb, 0x4e, 0x69, 0xc3, 0x69, 0x5a, 0xf3, 0xdf, - 0x39, 0x28, 0x1e, 0x72, 0x8b, 0x0f, 0x18, 0x7a, 0x0c, 0x25, 0x91, 0x3d, 0xb6, 0xc5, 0x2d, 0xa9, - 0x39, 0xf3, 0x17, 0x2b, 0x3d, 0xfe, 0xc4, 0x1d, 0x4b, 0x43, 0x70, 0x24, 0x51, 0xac, 0xaa, 0x4c, - 0xea, 0x51, 0xe6, 0x45, 0x25, 0x27, 0xd4, 0x8e, 0x15, 0x56, 0x8c, 0xeb, 0x7d, 0xc2, 0x98, 0xd5, - 0xd3, 0xb1, 0x16, 0x8d, 0xeb, 0x7b, 0x21, 0x18, 0x6b, 0x3c, 0x7a, 0x1b, 0x8a, 0x94, 0x58, 0x2c, - 0x1a, 0x22, 0xea, 0x5a, 0x24, 0x96, 0xd0, 0xcb, 0x51, 0x63, 0x4e, 0x09, 0x97, 0x67, 0xac, 0xa8, - 0xd1, 0x7b, 0x70, 0xc3, 0x26, 0xdc, 0x72, 0xdc, 0x70, 0x76, 0xc8, 0xfc, 0xed, 0x20, 0x14, 0xd6, - 0x09, 0x59, 0xdb, 0x15, 0x61, 0x93, 0x3a, 0x60, 0x2d, 0x50, 0xe4, 0x49, 0xd7, 0xb7, 0x89, 0x8c, - 0xc3, 0x42, 0x9c, 0x27, 0x5b, 0xbe, 0x4d, 0xb0, 0xc4, 0x98, 0x4f, 0x0d, 0xa8, 0x84, 0x92, 0xb6, - 0xac, 0x01, 0x23, 0x68, 0x3d, 0xba, 0x45, 0xf8, 0xdc, 0xba, 0xb1, 0xcd, 0xbe, 0x7b, 0x1e, 0x90, - 0xcb, 0x51, 0xa3, 0x2c, 0xc9, 0xc4, 0x21, 0xba, 0x40, 0xc2, 0x47, 0xb9, 0x6b, 0x7c, 0xf4, 0x1a, - 0x14, 0xe4, 0x9c, 0xa6, 0x9c, 0x19, 0x8d, 0x65, 0x72, 0x96, 0xc3, 0x21, 0xce, 0xfc, 0x5d, 0x0e, - 0xaa, 0xa9, 0xcb, 0x65, 0x18, 0x8d, 0xa2, 0xdd, 0x2b, 0x97, 0x61, 0x9f, 0x9f, 0xfc, 0x11, 0xf1, - 0xfb, 0x50, 0xec, 0x8a, 0xfb, 0xe9, 0xaf, 0xb8, 0xeb, 0xd3, 0x3c, 0x85, 0xf4, 0x4c, 0x1c, 0x49, - 0xf2, 0xc8, 0xb0, 0x12, 0x88, 0x76, 0x60, 0x89, 0x12, 0x4e, 0xcf, 0x37, 0x8f, 0x39, 0xa1, 0xc9, - 0x61, 0xb1, 0x10, 0x0f, 0x0f, 0x78, 0x9c, 0x00, 0x5f, 0xe5, 0x31, 0x5d, 0x98, 0x15, 0x8d, 0x5d, - 0xb8, 0x9d, 0xa5, 0x3e, 0x5b, 0x45, 0x6e, 0xd7, 0xcc, 0x1a, 0x2f, 0xbc, 0xe3, 0x59, 0x9e, 0x1f, - 0x06, 0x7b, 0x21, 0xf6, 0xce, 0x03, 0x01, 0xc4, 0x21, 0xee, 0xce, 0xb2, 0x58, 0x20, 0x7f, 0xf5, - 0xac, 0x31, 0xf3, 0xf4, 0x59, 0x63, 0xe6, 0xa3, 0x67, 0x6a, 0x99, 0xfc, 0x01, 0x94, 0xe3, 0x31, - 0xe2, 0x33, 0x56, 0x69, 0xfe, 0x08, 0x4a, 0x22, 0x92, 0xf4, 0xf8, 0x7b, 0x4d, 0xd1, 0x4f, 0x97, - 0xe3, 0x5c, 0x96, 0x72, 0x6c, 0x6e, 0x40, 0xf8, 0x5d, 0x57, 0x54, 0x42, 0x87, 0x93, 0x7e, 0xaa, - 0x12, 0xee, 0x0a, 0x00, 0x0e, 0xe1, 0x89, 0xfd, 0xf9, 0x17, 0x06, 0x80, 0xdc, 0x13, 0xb6, 0x87, - 0x62, 0xb7, 0x5b, 0x85, 0x59, 0x51, 0x62, 0xc7, 0x0d, 0x93, 0x29, 0x20, 0x31, 0xe8, 0x21, 0x14, - 0x7d, 0x39, 0x5e, 0xa8, 0x8f, 0x7f, 0x6f, 0x4e, 0x8c, 0x1a, 0xf5, 0x2f, 0x9b, 0x26, 0xb6, 0x9e, - 0x6c, 0x9f, 0x71, 0xe2, 0x09, 0x1b, 0xe3, 0x88, 0x09, 0x67, 0x14, 0xac, 0x84, 0xb5, 0x5f, 0x7f, - 0xfe, 0xa2, 0x3e, 0xf3, 0xf1, 0x8b, 0xfa, 0xcc, 0xdf, 0x5e, 0xd4, 0x67, 0x3e, 0xb8, 0xa8, 0x1b, - 0xcf, 0x2f, 0xea, 0xc6, 0xc7, 0x17, 0x75, 0xe3, 0x1f, 0x17, 0x75, 0xe3, 0xe9, 0x3f, 0xeb, 0x33, - 0xef, 0xe5, 0x86, 0xeb, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x99, 0xeb, 0x4a, 0xdd, 0xf4, 0x1a, - 0x00, 0x00, + // 2160 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xcc, 0x19, 0xcd, 0x6f, 0x23, 0x57, + 0x3d, 0x63, 0xc7, 0x5e, 0xfb, 0xe7, 0x38, 0x1f, 0xaf, 0x59, 0x70, 0x23, 0x61, 0xa7, 0xd3, 0x0a, + 0xa5, 0xb0, 0xb5, 0x49, 0x0a, 0xd5, 0xb2, 0xc0, 0x42, 0x26, 0xce, 0x46, 0x51, 0x37, 0x9b, 0xe8, + 0xa5, 0xbb, 0x88, 0x65, 0x85, 0x98, 0xcc, 0xbc, 0x38, 0x43, 0xc6, 0x33, 0xc3, 0x7b, 0x63, 0x6f, + 0x4c, 0x0f, 0x54, 0x2a, 0x48, 0x1c, 0x10, 0xda, 0x23, 0x07, 0x84, 0xba, 0x82, 0x1b, 0x37, 0xfe, + 0x06, 0x24, 0xf6, 0x58, 0x89, 0x0b, 0x07, 0x64, 0xb1, 0xee, 0x81, 0x23, 0xf7, 0x9c, 0xd0, 0x7b, + 0xf3, 0xe6, 0xcb, 0x8e, 0x9b, 0x31, 0xed, 0xa1, 0xa7, 0x78, 0x7e, 0xdf, 0xef, 0xf7, 0xfd, 0x5e, + 0xe0, 0xe0, 0xfc, 0x36, 0x6b, 0x5a, 0x6e, 0xeb, 0xbc, 0x77, 0x42, 0xa8, 0x43, 0x7c, 0xc2, 0x5a, + 0x7d, 0xe2, 0x98, 0x2e, 0x6d, 0x49, 0x84, 0xee, 0x59, 0x5d, 0xdd, 0x38, 0xb3, 0x1c, 0x42, 0x07, + 0x2d, 0xef, 0xbc, 0xc3, 0x01, 0xac, 0xd5, 0x25, 0xbe, 0xde, 0xea, 0x6f, 0xb6, 0x3a, 0xc4, 0x21, + 0x54, 0xf7, 0x89, 0xd9, 0xf4, 0xa8, 0xeb, 0xbb, 0xe8, 0x8d, 0x80, 0xab, 0x99, 0xe4, 0x6a, 0x7a, + 0xe7, 0x1d, 0x0e, 0x60, 0x4d, 0xce, 0xd5, 0xec, 0x6f, 0xae, 0xbd, 0xd5, 0xb1, 0xfc, 0xb3, 0xde, + 0x49, 0xd3, 0x70, 0xbb, 0xad, 0x8e, 0xdb, 0x71, 0x5b, 0x82, 0xf9, 0xa4, 0x77, 0x2a, 0xbe, 0xc4, + 0x87, 0xf8, 0x15, 0x08, 0x5d, 0x9b, 0x6a, 0x0a, 0xed, 0x39, 0xbe, 0xd5, 0x25, 0xe3, 0x56, 0xac, + 0xbd, 0x73, 0x1d, 0x03, 0x33, 0xce, 0x48, 0x57, 0x9f, 0xe0, 0x7b, 0x7b, 0x1a, 0x5f, 0xcf, 0xb7, + 0xec, 0x96, 0xe5, 0xf8, 0xcc, 0xa7, 0xe3, 0x4c, 0xea, 0xdf, 0xf3, 0x50, 0xda, 0x3e, 0xda, 0xdf, + 0xa3, 0x6e, 0xcf, 0x43, 0xeb, 0x30, 0xef, 0xe8, 0x5d, 0x52, 0x53, 0xd6, 0x95, 0x8d, 0xb2, 0xb6, + 0xf0, 0x62, 0xd8, 0x98, 0x1b, 0x0d, 0x1b, 0xf3, 0x0f, 0xf4, 0x2e, 0xc1, 0x02, 0x83, 0x6c, 0x28, + 0xf5, 0x09, 0x65, 0x96, 0xeb, 0xb0, 0x5a, 0x6e, 0x3d, 0xbf, 0x51, 0xd9, 0xba, 0xdb, 0xcc, 0xe2, + 0xb4, 0xa6, 0x50, 0xf0, 0x28, 0x60, 0xbd, 0xe7, 0xd2, 0xb6, 0xc5, 0x0c, 0xb7, 0x4f, 0xe8, 0x40, + 0x5b, 0x96, 0x5a, 0x4a, 0x12, 0xc9, 0x70, 0xa4, 0x01, 0xfd, 0x4a, 0x81, 0x65, 0x8f, 0x92, 0x53, + 0x42, 0x29, 0x31, 0x25, 0xbe, 0x96, 0x5f, 0x57, 0x3e, 0x07, 0xb5, 0x35, 0xa9, 0x76, 0xf9, 0x68, + 0x4c, 0x3e, 0x9e, 0xd0, 0x88, 0xfe, 0xa4, 0xc0, 0x1a, 0x23, 0xb4, 0x4f, 0xe8, 0xb6, 0x69, 0x52, + 0xc2, 0x98, 0x36, 0xd8, 0xb1, 0x2d, 0xe2, 0xf8, 0x3b, 0xfb, 0x6d, 0xcc, 0x6a, 0xf3, 0xc2, 0x0f, + 0xdf, 0xcf, 0x66, 0xd0, 0xf1, 0x34, 0x39, 0x9a, 0x2a, 0x2d, 0x5a, 0x9b, 0x4a, 0xc2, 0xf0, 0xa7, + 0x98, 0xa1, 0x9e, 0xc2, 0x42, 0x18, 0xc8, 0xfb, 0x16, 0xf3, 0xd1, 0x23, 0x28, 0x76, 0xf8, 0x07, + 0xab, 0x29, 0xc2, 0xc0, 0x66, 0x36, 0x03, 0x43, 0x19, 0xda, 0xa2, 0xb4, 0xa7, 0x28, 0x3e, 0x19, + 0x96, 0xd2, 0xd4, 0x0f, 0x73, 0x50, 0xd9, 0x3e, 0xda, 0xc7, 0x84, 0xb9, 0x3d, 0x6a, 0x90, 0x0c, + 0x49, 0xb3, 0x05, 0xc0, 0xff, 0x32, 0x4f, 0x37, 0x88, 0x59, 0xcb, 0xad, 0x2b, 0x1b, 0x25, 0x0d, + 0x49, 0x3a, 0x78, 0x10, 0x61, 0x70, 0x82, 0x8a, 0x4b, 0x3d, 0xb7, 0x1c, 0x53, 0x44, 0x3b, 0x21, + 0xf5, 0x5d, 0xcb, 0x31, 0xb1, 0xc0, 0xa0, 0xfb, 0x50, 0xe8, 0x13, 0x7a, 0xc2, 0xfd, 0xcf, 0x13, + 0xe2, 0xeb, 0xd9, 0x8e, 0xf7, 0x88, 0xb3, 0x68, 0xe5, 0xd1, 0xb0, 0x51, 0x10, 0x3f, 0x71, 0x20, + 0x04, 0x35, 0x01, 0xd8, 0x99, 0x4b, 0x7d, 0x61, 0x4e, 0xad, 0xb0, 0x9e, 0xdf, 0x28, 0x6b, 0x8b, + 0xdc, 0xbe, 0xe3, 0x08, 0x8a, 0x13, 0x14, 0xea, 0x5f, 0x15, 0x58, 0x4a, 0x78, 0x41, 0x78, 0xfc, + 0x36, 0x2c, 0x74, 0x12, 0xf9, 0x26, 0x3d, 0xb2, 0x2a, 0x6d, 0x5f, 0x48, 0xe6, 0x22, 0x4e, 0x51, + 0x22, 0x02, 0x65, 0x2a, 0x25, 0x85, 0x75, 0xb5, 0x99, 0x39, 0x5c, 0xa1, 0x0d, 0xb1, 0xa6, 0x04, + 0x90, 0xe1, 0x58, 0xb2, 0xfa, 0x1f, 0x45, 0x84, 0x2e, 0xac, 0x34, 0xb4, 0x91, 0xa8, 0x66, 0x45, + 0x1c, 0x79, 0x61, 0x4a, 0x25, 0x5e, 0x53, 0x02, 0xb9, 0x2f, 0x44, 0x09, 0xdc, 0x29, 0xfd, 0xfe, + 0xa3, 0xc6, 0xdc, 0x07, 0xff, 0x5a, 0x9f, 0x53, 0x3f, 0xc9, 0x41, 0xb5, 0x4d, 0x6c, 0xe2, 0x93, + 0x43, 0xcf, 0x17, 0x27, 0xb8, 0x07, 0xa8, 0x43, 0x75, 0x83, 0x1c, 0x11, 0x6a, 0xb9, 0xe6, 0x31, + 0x31, 0x5c, 0xc7, 0x64, 0x22, 0x44, 0x79, 0xed, 0x4b, 0xa3, 0x61, 0x03, 0xed, 0x4d, 0x60, 0xf1, + 0x15, 0x1c, 0xc8, 0x86, 0xaa, 0x47, 0xc5, 0x6f, 0xcb, 0x97, 0x6d, 0x90, 0xa7, 0xdf, 0xdb, 0xd9, + 0xce, 0x7e, 0x94, 0x64, 0xd5, 0x56, 0x46, 0xc3, 0x46, 0x35, 0x05, 0xc2, 0x69, 0xe1, 0xe8, 0x07, + 0xb0, 0xec, 0x52, 0xef, 0x4c, 0x77, 0xda, 0xc4, 0x23, 0x8e, 0x49, 0x1c, 0x9f, 0x89, 0x92, 0x28, + 0x69, 0xab, 0xbc, 0x79, 0x1d, 0x8e, 0xe1, 0xf0, 0x04, 0x35, 0x7a, 0x0c, 0x2b, 0x1e, 0x75, 0x3d, + 0xbd, 0xa3, 0x73, 0x89, 0x47, 0xae, 0x6d, 0x19, 0x03, 0x51, 0x32, 0x65, 0xed, 0xd6, 0x68, 0xd8, + 0x58, 0x39, 0x1a, 0x47, 0x5e, 0x0e, 0x1b, 0xaf, 0x08, 0xd7, 0x71, 0x48, 0x8c, 0xc4, 0x93, 0x62, + 0xd4, 0x7d, 0x28, 0xb5, 0x7b, 0x54, 0x40, 0xd0, 0xf7, 0xa0, 0x64, 0xca, 0xdf, 0xd2, 0xab, 0xaf, + 0x85, 0x9d, 0x3d, 0xa4, 0xb9, 0x1c, 0x36, 0xaa, 0x7c, 0x80, 0x35, 0x43, 0x00, 0x8e, 0x58, 0xd4, + 0x27, 0x50, 0xdd, 0xbd, 0xf0, 0x5c, 0xea, 0x87, 0xf1, 0xfa, 0x2a, 0x14, 0x89, 0x00, 0x08, 0x69, + 0xa5, 0xb8, 0x1d, 0x05, 0x64, 0x58, 0x62, 0xd1, 0xeb, 0x50, 0x20, 0x17, 0xba, 0xe1, 0xcb, 0xbe, + 0x52, 0x95, 0x64, 0x85, 0x5d, 0x0e, 0xc4, 0x01, 0x4e, 0x3d, 0x04, 0xd8, 0x23, 0x91, 0xe8, 0x6d, + 0x58, 0x0a, 0x6b, 0x22, 0x5d, 0xaa, 0x5f, 0x96, 0xcc, 0x4b, 0x38, 0x8d, 0xc6, 0xe3, 0xf4, 0xea, + 0x13, 0x28, 0x8b, 0x72, 0xe6, 0xfd, 0x88, 0x9b, 0x20, 0xaa, 0x59, 0x4a, 0x89, 0x4c, 0x10, 0x14, + 0x38, 0xc0, 0x45, 0x0d, 0x2d, 0x37, 0xad, 0xa1, 0x25, 0xb2, 0xd7, 0x86, 0x6a, 0xc0, 0x1b, 0xf6, + 0xd8, 0x4c, 0x1a, 0x6e, 0x41, 0x29, 0x34, 0x53, 0x6a, 0x89, 0x66, 0x6b, 0x28, 0x08, 0x47, 0x14, + 0x09, 0x6d, 0x67, 0x90, 0x6a, 0x4d, 0xd9, 0x94, 0xbd, 0x09, 0x37, 0x64, 0x73, 0x90, 0xba, 0x96, + 0x24, 0xd9, 0x8d, 0xd0, 0x67, 0x21, 0x3e, 0xa1, 0xe9, 0x97, 0x50, 0x9b, 0x36, 0x90, 0x3f, 0x43, + 0xf3, 0xcc, 0x6e, 0x8a, 0xfa, 0x3b, 0x05, 0x96, 0x93, 0x92, 0xb2, 0x87, 0x2f, 0xbb, 0x92, 0xeb, + 0x47, 0x57, 0xc2, 0x23, 0x7f, 0x54, 0x60, 0x35, 0x75, 0xb4, 0x99, 0x22, 0x3e, 0x83, 0x51, 0xc9, + 0xe4, 0xc8, 0xcf, 0x90, 0x1c, 0xff, 0xc8, 0x41, 0xf5, 0xbe, 0x7e, 0x42, 0xec, 0x63, 0x62, 0x13, + 0xc3, 0x77, 0x29, 0x7a, 0x1f, 0x2a, 0x5d, 0xdd, 0x37, 0xce, 0x04, 0x34, 0x5c, 0x2e, 0xda, 0xd9, + 0xda, 0x5f, 0x4a, 0x52, 0xf3, 0x20, 0x16, 0xb3, 0xeb, 0xf8, 0x74, 0xa0, 0xbd, 0x22, 0x4d, 0xaa, + 0x24, 0x30, 0x38, 0xa9, 0x4d, 0x6c, 0x84, 0xe2, 0x7b, 0xf7, 0xc2, 0xe3, 0xfd, 0x7f, 0xf6, 0x45, + 0x34, 0x65, 0x02, 0x26, 0x3f, 0xef, 0x59, 0x94, 0x74, 0x89, 0xe3, 0xc7, 0x1b, 0xe1, 0xc1, 0x98, + 0x7c, 0x3c, 0xa1, 0x71, 0xed, 0x2e, 0x2c, 0x8f, 0x1b, 0x8f, 0x96, 0x21, 0x7f, 0x4e, 0x06, 0x41, + 0xbc, 0x30, 0xff, 0x89, 0x56, 0xa1, 0xd0, 0xd7, 0xed, 0x9e, 0xac, 0x46, 0x1c, 0x7c, 0xdc, 0xc9, + 0xdd, 0x56, 0xd4, 0x3f, 0x2b, 0x50, 0x9b, 0x66, 0x08, 0xfa, 0x4a, 0x42, 0x90, 0x56, 0x91, 0x56, + 0xe5, 0xdf, 0x25, 0x83, 0x40, 0xea, 0x2e, 0x94, 0x5c, 0x8f, 0xef, 0xf0, 0x2e, 0x95, 0x51, 0x7f, + 0x33, 0x8c, 0xe4, 0xa1, 0x84, 0x5f, 0x0e, 0x1b, 0x37, 0x53, 0xe2, 0x43, 0x04, 0x8e, 0x58, 0x91, + 0x0a, 0x45, 0x61, 0x0f, 0x9f, 0x27, 0x7c, 0xf2, 0x03, 0xef, 0xad, 0x8f, 0x04, 0x04, 0x4b, 0x8c, + 0xfa, 0x3e, 0x94, 0xf8, 0x62, 0x73, 0x40, 0x7c, 0x9d, 0x27, 0x10, 0x23, 0xf6, 0xe9, 0x7d, 0xcb, + 0x39, 0x97, 0xa6, 0x45, 0x09, 0x74, 0x2c, 0xe1, 0x38, 0xa2, 0xb8, 0xaa, 0xc5, 0xe6, 0x66, 0x6c, + 0xb1, 0x7f, 0xc9, 0x41, 0x85, 0x6b, 0x0f, 0xbb, 0xf6, 0x77, 0xa0, 0x6a, 0x27, 0xcf, 0x24, 0xad, + 0xb8, 0x29, 0x05, 0xa6, 0xb3, 0x14, 0xa7, 0x69, 0x39, 0xf3, 0xa9, 0x45, 0x6c, 0x33, 0x62, 0xce, + 0xa5, 0x99, 0xef, 0x25, 0x91, 0x38, 0x4d, 0xcb, 0x6b, 0xf1, 0x29, 0x8f, 0xb6, 0x9c, 0xbc, 0x51, + 0x2d, 0xfe, 0x90, 0x03, 0x71, 0x80, 0xbb, 0xea, 0xc4, 0xf3, 0xb3, 0x9d, 0x18, 0xdd, 0x81, 0x45, + 0x3e, 0x1e, 0xdd, 0x9e, 0x1f, 0xae, 0x27, 0x05, 0x31, 0x48, 0xd1, 0x68, 0xd8, 0x58, 0x7c, 0x2f, + 0x85, 0xc1, 0x63, 0x94, 0xea, 0x87, 0x00, 0x70, 0x78, 0xf2, 0x33, 0x62, 0x04, 0xd1, 0xba, 0x7e, + 0x29, 0xe7, 0xfd, 0x56, 0xde, 0x05, 0x39, 0x54, 0x3a, 0x24, 0xee, 0xb7, 0x09, 0x1c, 0x4e, 0x51, + 0xa2, 0x16, 0x94, 0xa3, 0x45, 0x5d, 0xf6, 0x92, 0x15, 0xc9, 0x56, 0x8e, 0xb6, 0x79, 0x1c, 0xd3, + 0xa4, 0x52, 0x67, 0xfe, 0xda, 0xd4, 0xd1, 0x20, 0xdf, 0xb3, 0x4c, 0x71, 0xf4, 0xb2, 0xf6, 0x8d, + 0x30, 0xfd, 0x1f, 0xee, 0xb7, 0x2f, 0x87, 0x8d, 0xd7, 0xa6, 0x5d, 0x71, 0xfd, 0x81, 0x47, 0x58, + 0xf3, 0xe1, 0x7e, 0x1b, 0x73, 0xe6, 0xab, 0x82, 0x51, 0x9c, 0x31, 0x18, 0x5b, 0x00, 0xf2, 0xd4, + 0x9c, 0xfb, 0x46, 0x10, 0x88, 0xf0, 0xd2, 0xb2, 0x17, 0x61, 0x70, 0x82, 0x0a, 0x31, 0x58, 0x31, + 0x28, 0x11, 0xbf, 0x79, 0xb8, 0x98, 0xaf, 0x77, 0xbd, 0x5a, 0x49, 0xec, 0x87, 0x5f, 0xcb, 0xd6, + 0x9d, 0x38, 0x9b, 0xf6, 0xaa, 0x54, 0xb3, 0xb2, 0x33, 0x2e, 0x0c, 0x4f, 0xca, 0x47, 0x2e, 0xac, + 0x98, 0x72, 0x5d, 0x8b, 0x95, 0x96, 0x67, 0x56, 0x7a, 0x93, 0x2b, 0x6c, 0x8f, 0x0b, 0xc2, 0x93, + 0xb2, 0xd1, 0x4f, 0x60, 0x2d, 0x04, 0x4e, 0xee, 0xcc, 0x35, 0x10, 0x9e, 0xaa, 0xf3, 0x2d, 0xbe, + 0x3d, 0x95, 0x0a, 0x7f, 0x8a, 0x04, 0x64, 0x42, 0xd1, 0x0e, 0x66, 0x4b, 0x45, 0x34, 0xf6, 0xef, + 0x66, 0x3b, 0x45, 0x9c, 0xfd, 0xcd, 0xe4, 0x4c, 0x89, 0xf6, 0x46, 0x39, 0x4e, 0xa4, 0x6c, 0x74, + 0x01, 0x15, 0xdd, 0x71, 0x5c, 0x5f, 0x0f, 0xb6, 0xf8, 0x05, 0xa1, 0x6a, 0x7b, 0x66, 0x55, 0xdb, + 0xb1, 0x8c, 0xb1, 0x19, 0x96, 0xc0, 0xe0, 0xa4, 0x2a, 0xf4, 0x14, 0x96, 0xdc, 0xa7, 0x0e, 0xa1, + 0x98, 0x9c, 0x12, 0x4a, 0x1c, 0x7e, 0xe5, 0xab, 0x0a, 0xed, 0xdf, 0xcc, 0xa8, 0x3d, 0xc5, 0x1c, + 0xa7, 0x74, 0x1a, 0xce, 0xf0, 0xb8, 0x16, 0x7e, 0xc7, 0x3d, 0xb5, 0x1c, 0xdd, 0xb6, 0x7e, 0x41, + 0x28, 0xab, 0x2d, 0xc6, 0x77, 0xdc, 0x7b, 0x11, 0x14, 0x27, 0x28, 0xd0, 0xb7, 0xa0, 0x62, 0xd8, + 0x3d, 0xe6, 0x13, 0x2a, 0x3a, 0xc4, 0x92, 0xa8, 0xa0, 0xe8, 0x7c, 0x3b, 0x31, 0x0a, 0x27, 0xe9, + 0xd6, 0xbe, 0x0d, 0x95, 0xff, 0x73, 0x2e, 0xf2, 0xb9, 0x3a, 0xee, 0xd0, 0x99, 0xe6, 0xea, 0xdf, + 0x72, 0xb0, 0x98, 0x76, 0x43, 0xb4, 0x8d, 0x29, 0x53, 0x1f, 0x12, 0xc2, 0x5e, 0x99, 0x9f, 0xda, + 0x2b, 0x65, 0x4b, 0x9a, 0xff, 0x2c, 0x2d, 0x69, 0x0b, 0x40, 0xf7, 0xac, 0xb0, 0x1b, 0x05, 0xdd, + 0x2d, 0xea, 0x27, 0xf1, 0xa5, 0x1c, 0x27, 0xa8, 0x78, 0xc0, 0x0c, 0xd7, 0xf1, 0xa9, 0x6b, 0xdb, + 0x84, 0x8a, 0x0e, 0x56, 0x0a, 0x02, 0xb6, 0x13, 0x41, 0x71, 0x82, 0x82, 0xdf, 0x71, 0x4f, 0x6c, + 0xd7, 0x38, 0x17, 0x2e, 0x08, 0xab, 0x4f, 0xf4, 0xae, 0x52, 0x70, 0xc7, 0xd5, 0x26, 0xb0, 0xf8, + 0x0a, 0x0e, 0xf5, 0x10, 0xd2, 0xb7, 0x52, 0x74, 0x37, 0x70, 0x80, 0x12, 0x5d, 0x1b, 0x67, 0x3b, + 0xbc, 0x7a, 0x0b, 0xca, 0xd8, 0x75, 0xfd, 0x23, 0xdd, 0x3f, 0x63, 0xa8, 0x01, 0x05, 0x8f, 0xff, + 0x90, 0x4f, 0x0e, 0xe2, 0x2d, 0x46, 0x60, 0x70, 0x00, 0x57, 0x7f, 0xab, 0xc0, 0xab, 0x53, 0x5f, + 0x00, 0xb8, 0x23, 0x8d, 0xe8, 0x4b, 0x9a, 0x14, 0x39, 0x32, 0xa6, 0xc3, 0x09, 0x2a, 0x3e, 0xfe, + 0x53, 0xcf, 0x06, 0xe3, 0xe3, 0x3f, 0xa5, 0x0d, 0xa7, 0x69, 0xd5, 0xff, 0xe6, 0xa0, 0x78, 0xec, + 0xeb, 0x7e, 0x8f, 0xa1, 0x27, 0x50, 0xe2, 0x55, 0x68, 0xea, 0xbe, 0x2e, 0x34, 0x67, 0x7e, 0x55, + 0x0b, 0xd7, 0xa8, 0x78, 0xf2, 0x85, 0x10, 0x1c, 0x49, 0xe4, 0x57, 0x5e, 0x26, 0xf4, 0x48, 0xf3, + 0xa2, 0xd6, 0x15, 0x68, 0xc7, 0x12, 0xcb, 0xd7, 0xfe, 0x2e, 0x61, 0x4c, 0xef, 0x84, 0x39, 0x1b, + 0xad, 0xfd, 0x07, 0x01, 0x18, 0x87, 0x78, 0xf4, 0x0e, 0x14, 0x29, 0xd1, 0x59, 0xb4, 0x8c, 0xd4, + 0x43, 0x91, 0x58, 0x40, 0x2f, 0x87, 0x8d, 0x05, 0x29, 0x5c, 0x7c, 0x63, 0x49, 0x8d, 0x1e, 0xc3, + 0x0d, 0x93, 0xf8, 0xba, 0x65, 0x07, 0x3b, 0x48, 0xe6, 0xf7, 0x8d, 0x40, 0x58, 0x3b, 0x60, 0xd5, + 0x2a, 0xdc, 0x26, 0xf9, 0x81, 0x43, 0x81, 0xbc, 0xde, 0x0c, 0xd7, 0x24, 0x22, 0x9f, 0x0b, 0x71, + 0xbd, 0xed, 0xb8, 0x26, 0xc1, 0x02, 0xa3, 0x3e, 0x53, 0xa0, 0x12, 0x48, 0xda, 0xd1, 0x7b, 0x8c, + 0xa0, 0xcd, 0xe8, 0x14, 0x41, 0xb8, 0xc3, 0x01, 0x39, 0xff, 0xde, 0xc0, 0x23, 0x97, 0xc3, 0x46, + 0x59, 0x90, 0xf1, 0x8f, 0xe8, 0x00, 0x09, 0x1f, 0xe5, 0xae, 0xf1, 0xd1, 0xeb, 0x50, 0x10, 0xfb, + 0x9e, 0x74, 0x66, 0xb4, 0xde, 0x89, 0x9d, 0x10, 0x07, 0x38, 0xf5, 0x0f, 0x39, 0xa8, 0xa6, 0x0e, + 0x97, 0x61, 0xc5, 0x8a, 0xee, 0x70, 0xb9, 0x0c, 0xef, 0x02, 0xd3, 0x1f, 0x3a, 0x7f, 0x04, 0x45, + 0x83, 0x9f, 0x2f, 0x7c, 0x69, 0xde, 0x9c, 0x25, 0x14, 0xc2, 0x33, 0x71, 0x26, 0x89, 0x4f, 0x86, + 0xa5, 0x40, 0xb4, 0x07, 0x2b, 0x94, 0xf8, 0x74, 0xb0, 0x7d, 0xea, 0x13, 0x9a, 0x5c, 0x3a, 0x0b, + 0xf1, 0x12, 0x82, 0xc7, 0x09, 0xf0, 0x24, 0x8f, 0x6a, 0xc3, 0x3c, 0x5f, 0x10, 0xb8, 0xdb, 0x59, + 0xea, 0x69, 0x2d, 0x72, 0x7b, 0xc8, 0x1c, 0xe2, 0xb9, 0x77, 0x1c, 0xdd, 0x71, 0x83, 0x64, 0x2f, + 0xc4, 0xde, 0x79, 0xc0, 0x81, 0x38, 0xc0, 0xdd, 0x59, 0xe5, 0x17, 0xd1, 0xdf, 0x3c, 0x6f, 0xcc, + 0x3d, 0x7b, 0xde, 0x98, 0xfb, 0xe8, 0xb9, 0xbc, 0x94, 0xfe, 0x18, 0xca, 0xf1, 0x3a, 0xf2, 0x39, + 0xab, 0x54, 0x7f, 0x0a, 0x25, 0x9e, 0x49, 0xe1, 0x1a, 0x7d, 0xcd, 0xf0, 0x48, 0xb7, 0xf5, 0x5c, + 0x96, 0xb6, 0xae, 0x6e, 0x41, 0xf0, 0xf6, 0xcc, 0x3b, 0xa1, 0xe5, 0x93, 0x6e, 0xaa, 0x13, 0xee, + 0x73, 0x00, 0x0e, 0xe0, 0x89, 0x7b, 0xf8, 0xaf, 0x15, 0x00, 0x71, 0xdf, 0xd8, 0xed, 0xf3, 0x3b, + 0xe2, 0x3a, 0xcc, 0xf3, 0x16, 0x3b, 0x6e, 0x98, 0x28, 0x01, 0x81, 0x41, 0x0f, 0xa1, 0xe8, 0x8a, + 0x35, 0x45, 0x3e, 0x50, 0xbe, 0x35, 0x35, 0x6b, 0xe4, 0xbf, 0x95, 0x9a, 0x58, 0x7f, 0xba, 0x7b, + 0xe1, 0x13, 0x87, 0xdb, 0x18, 0x67, 0x4c, 0xb0, 0xeb, 0x60, 0x29, 0x4c, 0x7b, 0xe3, 0xc5, 0xcb, + 0xfa, 0xdc, 0xc7, 0x2f, 0xeb, 0x73, 0xff, 0x7c, 0x59, 0x9f, 0xfb, 0x60, 0x54, 0x57, 0x5e, 0x8c, + 0xea, 0xca, 0xc7, 0xa3, 0xba, 0xf2, 0xef, 0x51, 0x5d, 0x79, 0xf6, 0x49, 0x7d, 0xee, 0x71, 0xae, + 0xbf, 0xf9, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb1, 0xe8, 0xc1, 0x2f, 0x98, 0x1b, 0x00, 0x00, } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto index 60049067bda..610297314e7 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto @@ -121,10 +121,18 @@ message DeleteOptions { // +optional optional Preconditions preconditions = 2; + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional optional bool orphanDependents = 3; + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + optional string propagationPolicy = 4; } // Duration is a wrapper around time.Duration which supports correct @@ -469,6 +477,15 @@ message OwnerReference { // If true, this reference points to the managing controller. // +optional optional bool controller = 6; + + // If true, AND if the owner has the "foregroundDeletion" finalizer, then + // the owner cannot be deleted from the key-value store until this + // reference is removed. + // Defaults to false. + // To set this field, a user needs "delete" permission of the owner, + // otherwise 422 (Unprocessable Entity) will be returned. + // +optional + optional bool blockOwnerDeletion = 7; } // Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out. diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go index 361038bd296..b31cd4f46be 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go @@ -85,7 +85,8 @@ var map_DeleteOptions = map[string]string{ "": "DeleteOptions may be provided when deleting an API object.", "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", - "orphanDependents": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "propagationPolicy": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", } func (DeleteOptions) SwaggerDoc() map[string]string { @@ -189,12 +190,13 @@ func (ObjectMeta) SwaggerDoc() map[string]string { } var map_OwnerReference = map[string]string{ - "": "OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.", - "apiVersion": "API version of the referent.", - "kind": "Kind of the referent. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", - "name": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", - "uid": "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", - "controller": "If true, this reference points to the managing controller.", + "": "OwnerReference contains enough information to let you identify an owning object. Currently, an owning object must be in the same namespace, so there is no namespace field.", + "apiVersion": "API version of the referent.", + "kind": "Kind of the referent. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#types-kinds", + "name": "Name of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#names", + "uid": "UID of the referent. More info: http://kubernetes.io/docs/user-guide/identifiers#uids", + "controller": "If true, this reference points to the managing controller.", + "blockOwnerDeletion": "If true, AND if the owner has the \"foregroundDeletion\" finalizer, then the owner cannot be deleted from the key-value store until this reference is removed. Defaults to false. To set this field, a user needs \"delete\" permission of the owner, otherwise 422 (Unprocessable Entity) will be returned.", } func (OwnerReference) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go index 91ba7126142..b5f7360e261 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go @@ -186,6 +186,11 @@ func DeepCopy_v1_DeleteOptions(in interface{}, out interface{}, c *conversion.Cl *out = new(bool) **out = **in } + if in.PropagationPolicy != nil { + in, out := &in.PropagationPolicy, &out.PropagationPolicy + *out = new(DeletionPropagation) + **out = **in + } return nil } } @@ -412,6 +417,11 @@ func DeepCopy_v1_OwnerReference(in interface{}, out interface{}, c *conversion.C *out = new(bool) **out = **in } + if in.BlockOwnerDeletion != nil { + in, out := &in.BlockOwnerDeletion, &out.BlockOwnerDeletion + *out = new(bool) + **out = **in + } return nil } } diff --git a/staging/src/k8s.io/client-go/Godeps/Godeps.json b/staging/src/k8s.io/client-go/Godeps/Godeps.json index 667e2f77760..bbc0b4b43ba 100644 --- a/staging/src/k8s.io/client-go/Godeps/Godeps.json +++ b/staging/src/k8s.io/client-go/Godeps/Godeps.json @@ -66,12 +66,12 @@ }, { "ImportPath": "github.com/docker/distribution/digest", - "Comment": "v2.4.0-rc.1-38-gcd27f179", + "Comment": "v2.4.0-rc.1-38-gcd27f17", "Rev": "cd27f179f2c10c5d300e6d09025b538c475b0d51" }, { "ImportPath": "github.com/docker/distribution/reference", - "Comment": "v2.4.0-rc.1-38-gcd27f179", + "Comment": "v2.4.0-rc.1-38-gcd27f17", "Rev": "cd27f179f2c10c5d300e6d09025b538c475b0d51" }, { @@ -111,12 +111,12 @@ }, { "ImportPath": "github.com/gogo/protobuf/proto", - "Comment": "v0.2-33-ge18d7aa8", + "Comment": "v0.2-33-ge18d7aa", "Rev": "e18d7aa8f8c624c915db340349aad4c49b10d173" }, { "ImportPath": "github.com/gogo/protobuf/sortkeys", - "Comment": "v0.2-33-ge18d7aa8", + "Comment": "v0.2-33-ge18d7aa", "Rev": "e18d7aa8f8c624c915db340349aad4c49b10d173" }, { diff --git a/staging/src/k8s.io/client-go/pkg/api/types.go b/staging/src/k8s.io/client-go/pkg/api/types.go index 427cc2e4019..70172c06cb3 100644 --- a/staging/src/k8s.io/client-go/pkg/api/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/types.go @@ -3000,6 +3000,20 @@ type Preconditions struct { UID *types.UID } +// DeletionPropagation decides whether and how garbage collection will be performed. +type DeletionPropagation string + +const ( + // Orphans the dependents. + DeletePropagationOrphan DeletionPropagation = "Orphan" + // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background. + DeletePropagationBackground DeletionPropagation = "Background" + // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. + // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp. + // This policy is cascading, i.e., the dependents will be deleted with Foreground. + DeletePropagationForeground DeletionPropagation = "Foreground" +) + // DeleteOptions may be provided when deleting an API object // DEPRECATED: This type has been moved to meta/v1 and will be removed soon. type DeleteOptions struct { @@ -3016,10 +3030,18 @@ type DeleteOptions struct { // +optional Preconditions *Preconditions + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional OrphanDependents *bool + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + PropagationPolicy *DeletionPropagation } // ListOptions is the query options to a standard REST list call, and has future support for diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go index 7ce412e1588..8ec88a37b80 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.pb.go @@ -2403,6 +2403,12 @@ func (m *DeleteOptions) MarshalTo(data []byte) (int, error) { } i++ } + if m.PropagationPolicy != nil { + data[i] = 0x22 + i++ + i = encodeVarintGenerated(data, i, uint64(len(*m.PropagationPolicy))) + i += copy(data[i:], *m.PropagationPolicy) + } return i, nil } @@ -9377,6 +9383,10 @@ func (m *DeleteOptions) Size() (n int) { if m.OrphanDependents != nil { n += 2 } + if m.PropagationPolicy != nil { + l = len(*m.PropagationPolicy) + n += 1 + l + sovGenerated(uint64(l)) + } return n } @@ -12173,6 +12183,7 @@ func (this *DeleteOptions) String() string { `GracePeriodSeconds:` + valueToStringGenerated(this.GracePeriodSeconds) + `,`, `Preconditions:` + strings.Replace(fmt.Sprintf("%v", this.Preconditions), "Preconditions", "Preconditions", 1) + `,`, `OrphanDependents:` + valueToStringGenerated(this.OrphanDependents) + `,`, + `PropagationPolicy:` + valueToStringGenerated(this.PropagationPolicy) + `,`, `}`, }, "") return s @@ -18633,6 +18644,36 @@ func (m *DeleteOptions) Unmarshal(data []byte) error { } b := bool(v != 0) m.OrphanDependents = &b + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PropagationPolicy", 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 := DeletionPropagation(data[iNdEx:postIndex]) + m.PropagationPolicy = &s + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(data[iNdEx:]) @@ -41956,679 +41997,682 @@ var ( ) var fileDescriptorGenerated = []byte{ - // 10780 bytes of a gzipped FileDescriptorProto + // 10818 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x70, 0x24, 0xc7, - 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0x79, 0x7d, 0xb8, 0x23, 0x08, 0x91, 0x87, 0xe3, 0x50, - 0xa4, 0x8e, 0xe4, 0x11, 0x10, 0x8f, 0xa4, 0x78, 0x12, 0x15, 0x4a, 0x00, 0x16, 0xb8, 0x83, 0xee, - 0x6b, 0xd9, 0x8b, 0xbb, 0xa3, 0x24, 0x46, 0xe4, 0xdc, 0x4e, 0x03, 0x18, 0xde, 0xec, 0xcc, 0x72, - 0x66, 0x16, 0x77, 0x90, 0xa2, 0x2a, 0x5b, 0x51, 0xc9, 0x49, 0x59, 0x49, 0xe8, 0x72, 0x54, 0x95, - 0x72, 0x52, 0xa5, 0x94, 0xab, 0xe2, 0x28, 0xdf, 0x51, 0x54, 0x96, 0xe4, 0x8a, 0x9c, 0x54, 0x1c, - 0xcb, 0x91, 0xab, 0x12, 0x47, 0x55, 0x2e, 0xc7, 0x4e, 0xa5, 0x02, 0x5b, 0x50, 0xc5, 0x3f, 0xf3, - 0x23, 0xfe, 0x87, 0xa4, 0x92, 0x54, 0x7f, 0x4e, 0xf7, 0xec, 0x2e, 0x66, 0x16, 0x3c, 0xc0, 0x27, - 0x95, 0xff, 0xed, 0xbe, 0xf7, 0xfa, 0xf5, 0xc7, 0x74, 0xbf, 0x7e, 0xef, 0xf5, 0xeb, 0xd7, 0x70, - 0xfe, 0xee, 0xc5, 0x78, 0xde, 0x0b, 0x17, 0xee, 0xb6, 0xef, 0x90, 0x28, 0x20, 0x09, 0x89, 0x17, - 0x5a, 0x77, 0x37, 0x17, 0x9c, 0x96, 0xb7, 0xb0, 0xfd, 0xc2, 0xc2, 0x26, 0x09, 0x48, 0xe4, 0x24, - 0xc4, 0x9d, 0x6f, 0x45, 0x61, 0x12, 0xa2, 0xc7, 0x38, 0xf5, 0x7c, 0x4a, 0x3d, 0xdf, 0xba, 0xbb, - 0x39, 0xef, 0xb4, 0xbc, 0xf9, 0xed, 0x17, 0x66, 0x9f, 0xdf, 0xf4, 0x92, 0xad, 0xf6, 0x9d, 0xf9, - 0x46, 0xd8, 0x5c, 0xd8, 0x0c, 0x37, 0xc3, 0x05, 0x56, 0xe8, 0x4e, 0x7b, 0x83, 0xfd, 0x63, 0x7f, - 0xd8, 0x2f, 0xce, 0x6c, 0xf6, 0x25, 0x51, 0xb5, 0xd3, 0xf2, 0x9a, 0x4e, 0x63, 0xcb, 0x0b, 0x48, - 0xb4, 0xa3, 0x2a, 0x8f, 0x48, 0x1c, 0xb6, 0xa3, 0x06, 0xc9, 0x36, 0xe1, 0xc0, 0x52, 0xf1, 0x42, - 0x93, 0x24, 0x4e, 0x97, 0x86, 0xcf, 0x2e, 0xf4, 0x2a, 0x15, 0xb5, 0x83, 0xc4, 0x6b, 0x76, 0x56, - 0xf3, 0xd1, 0xbc, 0x02, 0x71, 0x63, 0x8b, 0x34, 0x9d, 0x8e, 0x72, 0x2f, 0xf6, 0x2a, 0xd7, 0x4e, - 0x3c, 0x7f, 0xc1, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, - 0x22, 0xf7, 0x9d, 0x66, 0xcb, 0x27, 0x5d, 0xfa, 0x64, 0xff, 0xa1, 0x05, 0x67, 0x17, 0x6f, 0xd7, - 0x57, 0x7c, 0x27, 0x4e, 0xbc, 0xc6, 0x92, 0x1f, 0x36, 0xee, 0xd6, 0x93, 0x30, 0x22, 0xb7, 0x42, - 0xbf, 0xdd, 0x24, 0x75, 0x36, 0x7c, 0xe8, 0x3c, 0x8c, 0x6c, 0xb3, 0xff, 0x6b, 0xd5, 0x19, 0xeb, - 0xac, 0x75, 0xae, 0xb2, 0x34, 0xf5, 0xc3, 0xdd, 0xb9, 0x0f, 0xec, 0xed, 0xce, 0x8d, 0xdc, 0x12, - 0x70, 0xac, 0x28, 0xd0, 0xd3, 0x30, 0xb4, 0x11, 0xaf, 0xef, 0xb4, 0xc8, 0x4c, 0x89, 0xd1, 0x4e, - 0x08, 0xda, 0xa1, 0xd5, 0x3a, 0x85, 0x62, 0x81, 0x45, 0x0b, 0x50, 0x69, 0x39, 0x51, 0xe2, 0x25, - 0x5e, 0x18, 0xcc, 0x94, 0xcf, 0x5a, 0xe7, 0x06, 0x97, 0x4e, 0x08, 0xd2, 0x4a, 0x4d, 0x22, 0x70, - 0x4a, 0x43, 0x9b, 0x11, 0x11, 0xc7, 0xbd, 0x11, 0xf8, 0x3b, 0x33, 0x03, 0x67, 0xad, 0x73, 0x23, - 0x69, 0x33, 0xb0, 0x80, 0x63, 0x45, 0x61, 0x7f, 0xaf, 0x04, 0x23, 0x8b, 0x1b, 0x1b, 0x5e, 0xe0, - 0x25, 0x3b, 0xe8, 0x6d, 0x18, 0x0b, 0x42, 0x97, 0xc8, 0xff, 0xac, 0x17, 0xa3, 0x17, 0x9e, 0x9d, - 0x3f, 0x68, 0x2a, 0xce, 0x5f, 0xd7, 0x4a, 0x2c, 0x4d, 0xed, 0xed, 0xce, 0x8d, 0xe9, 0x10, 0x6c, - 0x70, 0x44, 0x6f, 0xc2, 0x68, 0x2b, 0x74, 0x55, 0x05, 0x25, 0x56, 0xc1, 0x33, 0x07, 0x57, 0x50, - 0x4b, 0x0b, 0x2c, 0x4d, 0xee, 0xed, 0xce, 0x8d, 0x6a, 0x00, 0xac, 0xb3, 0x43, 0x3e, 0x4c, 0xd2, - 0xbf, 0x41, 0xe2, 0xa9, 0x1a, 0xca, 0xac, 0x86, 0xe7, 0xf3, 0x6b, 0xd0, 0x0a, 0x2d, 0x9d, 0xdc, - 0xdb, 0x9d, 0x9b, 0xcc, 0x00, 0x71, 0x96, 0xb5, 0xfd, 0x05, 0x98, 0x58, 0x4c, 0x12, 0xa7, 0xb1, - 0x45, 0x5c, 0xfe, 0x7d, 0xd1, 0x4b, 0x30, 0x10, 0x38, 0x4d, 0x22, 0xbe, 0xfe, 0x59, 0x31, 0xec, - 0x03, 0xd7, 0x9d, 0x26, 0xd9, 0xdf, 0x9d, 0x9b, 0xba, 0x19, 0x78, 0xef, 0xb6, 0xc5, 0x9c, 0xa1, - 0x30, 0xcc, 0xa8, 0xd1, 0x05, 0x00, 0x97, 0x6c, 0x7b, 0x0d, 0x52, 0x73, 0x92, 0x2d, 0x31, 0x1b, - 0x90, 0x28, 0x0b, 0x55, 0x85, 0xc1, 0x1a, 0x95, 0xfd, 0x65, 0x0b, 0x2a, 0x8b, 0xdb, 0xa1, 0xe7, - 0xd6, 0x42, 0x37, 0x46, 0x6d, 0x98, 0x6c, 0x45, 0x64, 0x83, 0x44, 0x0a, 0x34, 0x63, 0x9d, 0x2d, - 0x9f, 0x1b, 0xbd, 0x70, 0x21, 0xa7, 0xdf, 0x66, 0xa1, 0x95, 0x20, 0x89, 0x76, 0x96, 0x1e, 0x11, - 0x55, 0x4f, 0x66, 0xb0, 0x38, 0x5b, 0x87, 0xfd, 0x4b, 0x25, 0x38, 0xb5, 0xf8, 0x85, 0x76, 0x44, - 0xaa, 0x5e, 0x7c, 0x37, 0xbb, 0x14, 0x5c, 0x2f, 0xbe, 0x7b, 0x3d, 0x1d, 0x0c, 0x35, 0x07, 0xab, - 0x02, 0x8e, 0x15, 0x05, 0x7a, 0x1e, 0x86, 0xe9, 0xef, 0x9b, 0x78, 0x4d, 0xf4, 0xfe, 0xa4, 0x20, - 0x1e, 0xad, 0x3a, 0x89, 0x53, 0xe5, 0x28, 0x2c, 0x69, 0xd0, 0x35, 0x18, 0x6d, 0xb0, 0xf5, 0xbe, - 0x79, 0x2d, 0x74, 0x09, 0xfb, 0xc2, 0x95, 0xa5, 0xe7, 0x28, 0xf9, 0x72, 0x0a, 0xde, 0xdf, 0x9d, - 0x9b, 0xe1, 0x6d, 0x13, 0x2c, 0x34, 0x1c, 0xd6, 0xcb, 0x23, 0x5b, 0x2d, 0xc4, 0x01, 0xc6, 0x09, - 0xba, 0x2c, 0xc2, 0x73, 0xda, 0x9a, 0x1a, 0x64, 0x6b, 0x6a, 0xac, 0xc7, 0x7a, 0xfa, 0xc7, 0x96, - 0x18, 0x93, 0x55, 0xcf, 0x37, 0xc5, 0xc3, 0x05, 0x80, 0x98, 0x34, 0x22, 0x92, 0x68, 0xa3, 0xa2, - 0x3e, 0x73, 0x5d, 0x61, 0xb0, 0x46, 0x45, 0x17, 0x7f, 0xbc, 0xe5, 0x44, 0x6c, 0xb6, 0x88, 0xb1, - 0x51, 0x8b, 0xbf, 0x2e, 0x11, 0x38, 0xa5, 0x31, 0x16, 0x7f, 0x39, 0x77, 0xf1, 0xff, 0x96, 0x05, - 0xc3, 0x4b, 0x5e, 0xe0, 0x7a, 0xc1, 0x26, 0x7a, 0x1b, 0x46, 0xa8, 0x44, 0x77, 0x9d, 0xc4, 0x11, - 0xeb, 0xfe, 0x23, 0x72, 0xf2, 0xe8, 0x02, 0x56, 0x4e, 0x9f, 0x78, 0x9e, 0x52, 0xd3, 0x49, 0x74, - 0xe3, 0xce, 0x3b, 0xa4, 0x91, 0x5c, 0x23, 0x89, 0x93, 0x76, 0x27, 0x85, 0x61, 0xc5, 0x15, 0xdd, - 0x84, 0xa1, 0xc4, 0x89, 0x36, 0x49, 0x22, 0x96, 0x7d, 0xce, 0xa2, 0xe4, 0x3c, 0x30, 0x9d, 0x72, - 0x24, 0x68, 0x90, 0x54, 0x40, 0xae, 0x33, 0x26, 0x58, 0x30, 0xb3, 0x1b, 0x30, 0xb6, 0xec, 0xb4, - 0x9c, 0x3b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0xd1, 0x87, 0xa1, 0xec, 0xb8, 0x2e, 0x5b, 0x00, 0x95, - 0xa5, 0x53, 0x7b, 0xbb, 0x73, 0xe5, 0x45, 0xd7, 0xdd, 0xdf, 0x9d, 0x03, 0x45, 0xb5, 0x83, 0x29, - 0x05, 0x7a, 0x16, 0x06, 0xdc, 0x28, 0x6c, 0xcd, 0x94, 0x18, 0xe5, 0x69, 0xba, 0x52, 0xab, 0x51, - 0xd8, 0xca, 0x90, 0x32, 0x1a, 0xfb, 0x07, 0x25, 0x40, 0xcb, 0xa4, 0xb5, 0xb5, 0x5a, 0x37, 0xbe, - 0xe9, 0x39, 0x18, 0x69, 0x86, 0x81, 0x97, 0x84, 0x51, 0x2c, 0x2a, 0x64, 0xf3, 0xe2, 0x9a, 0x80, - 0x61, 0x85, 0x45, 0x67, 0x61, 0xa0, 0x95, 0x2e, 0xef, 0x31, 0x29, 0x1a, 0xd8, 0xc2, 0x66, 0x18, - 0x4a, 0xd1, 0x8e, 0x49, 0x24, 0xe6, 0xb3, 0xa2, 0xb8, 0x19, 0x93, 0x08, 0x33, 0x4c, 0x3a, 0x83, - 0xe8, 0xdc, 0x12, 0xb3, 0x35, 0x33, 0x83, 0x28, 0x06, 0x6b, 0x54, 0xe8, 0x2d, 0xa8, 0xf0, 0x7f, - 0x98, 0x6c, 0xb0, 0xa9, 0x9b, 0x2b, 0x14, 0xae, 0x86, 0x0d, 0xc7, 0xcf, 0x0e, 0xfe, 0x38, 0x9b, - 0x71, 0x92, 0x11, 0x4e, 0x79, 0x1a, 0x33, 0x6e, 0x28, 0x77, 0xc6, 0xfd, 0x1d, 0x0b, 0xd0, 0xb2, - 0x17, 0xb8, 0x24, 0x3a, 0x86, 0xad, 0xb3, 0xbf, 0xc5, 0xf0, 0xdf, 0x68, 0xd3, 0xc2, 0x66, 0x2b, - 0x0c, 0x48, 0x90, 0x2c, 0x87, 0x81, 0xcb, 0xb7, 0xd3, 0x8f, 0xc3, 0x40, 0x42, 0xab, 0xe2, 0xcd, - 0x7a, 0x5a, 0x7e, 0x16, 0x5a, 0xc1, 0xfe, 0xee, 0xdc, 0xe9, 0xce, 0x12, 0xac, 0x09, 0xac, 0x0c, - 0xfa, 0x18, 0x0c, 0xc5, 0x89, 0x93, 0xb4, 0x63, 0xd1, 0xd0, 0x27, 0x64, 0x43, 0xeb, 0x0c, 0xba, - 0xbf, 0x3b, 0x37, 0xa9, 0x8a, 0x71, 0x10, 0x16, 0x05, 0xd0, 0x33, 0x30, 0xdc, 0x24, 0x71, 0xec, - 0x6c, 0x4a, 0x01, 0x37, 0x29, 0xca, 0x0e, 0x5f, 0xe3, 0x60, 0x2c, 0xf1, 0xe8, 0x49, 0x18, 0x24, - 0x51, 0x14, 0x46, 0x62, 0x46, 0x8c, 0x0b, 0xc2, 0xc1, 0x15, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x57, - 0x0b, 0x26, 0x55, 0x5b, 0x79, 0x5d, 0xc7, 0xb0, 0xe4, 0x5d, 0x80, 0x86, 0xec, 0x60, 0xcc, 0x16, - 0x9a, 0x56, 0x47, 0xf7, 0xe9, 0xd7, 0x39, 0xa0, 0x69, 0x1d, 0x0a, 0x14, 0x63, 0x8d, 0xaf, 0xfd, - 0x1f, 0x2c, 0x38, 0x99, 0xe9, 0xdb, 0x55, 0x2f, 0x4e, 0xd0, 0x9b, 0x1d, 0xfd, 0x9b, 0x2f, 0xd6, - 0x3f, 0x5a, 0x9a, 0xf5, 0x4e, 0xcd, 0x17, 0x09, 0xd1, 0xfa, 0x86, 0x61, 0xd0, 0x4b, 0x48, 0x53, - 0x76, 0xeb, 0xf9, 0x82, 0xdd, 0xe2, 0xed, 0x4b, 0xbf, 0xd2, 0x1a, 0xe5, 0x81, 0x39, 0x2b, 0xfb, - 0x7f, 0x5b, 0x50, 0x59, 0x0e, 0x83, 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x3a, 0x86, 0xef, 0x53, 0x87, - 0x01, 0xc6, 0x9d, 0x77, 0xe1, 0x85, 0xbc, 0x2e, 0x88, 0x86, 0xcd, 0xd3, 0x3d, 0x95, 0x2b, 0x0b, - 0x4a, 0x4c, 0x51, 0x10, 0x66, 0xcc, 0x66, 0x5f, 0x81, 0x8a, 0x22, 0x40, 0x53, 0x50, 0xbe, 0x4b, - 0xb8, 0x26, 0x59, 0xc1, 0xf4, 0x27, 0x9a, 0x86, 0xc1, 0x6d, 0xc7, 0x6f, 0x8b, 0xc5, 0x8b, 0xf9, - 0x9f, 0x8f, 0x97, 0x2e, 0x5a, 0xf6, 0x0f, 0xd8, 0x0a, 0x14, 0x95, 0xac, 0x04, 0xdb, 0x42, 0x38, - 0x7c, 0xc5, 0x82, 0x69, 0xbf, 0x8b, 0x50, 0x12, 0x63, 0x72, 0x18, 0x71, 0xf6, 0x98, 0x68, 0xf6, - 0x74, 0x37, 0x2c, 0xee, 0x5a, 0x1b, 0x95, 0xf5, 0x61, 0x8b, 0x4e, 0x38, 0xc7, 0x67, 0x4d, 0x17, - 0x3a, 0xc0, 0x0d, 0x01, 0xc3, 0x0a, 0x6b, 0xff, 0xa9, 0x05, 0xd3, 0xaa, 0x1f, 0x57, 0xc8, 0x4e, - 0x9d, 0xf8, 0xa4, 0x91, 0x84, 0xd1, 0xc3, 0xd2, 0x93, 0xc7, 0xf9, 0x37, 0xe1, 0x32, 0x69, 0x54, - 0x30, 0x28, 0x5f, 0x21, 0x3b, 0xfc, 0x03, 0xe9, 0x1d, 0x2d, 0x1f, 0xd8, 0xd1, 0x7f, 0x6d, 0xc1, - 0xb8, 0xea, 0xe8, 0x31, 0x2c, 0xb9, 0xab, 0xe6, 0x92, 0xfb, 0x70, 0xc1, 0xf9, 0xda, 0x63, 0xb1, - 0xfd, 0xed, 0x12, 0x15, 0x1b, 0x82, 0xa6, 0x16, 0x85, 0x74, 0x90, 0xa8, 0xc4, 0x7f, 0x48, 0xbe, - 0x52, 0x7f, 0x9d, 0xbd, 0x42, 0x76, 0xd6, 0x43, 0xaa, 0x4d, 0x74, 0xef, 0xac, 0xf1, 0x51, 0x07, - 0x0e, 0xfc, 0xa8, 0xbf, 0x5b, 0x82, 0x53, 0x6a, 0x58, 0x8c, 0x5d, 0xfa, 0x67, 0x72, 0x60, 0x5e, - 0x80, 0x51, 0x97, 0x6c, 0x38, 0x6d, 0x3f, 0x51, 0xd6, 0xc4, 0x20, 0x37, 0x33, 0xab, 0x29, 0x18, - 0xeb, 0x34, 0x7d, 0x8c, 0xe5, 0x37, 0x46, 0x99, 0x3c, 0x4f, 0x1c, 0x3a, 0xeb, 0xa9, 0x86, 0xa7, - 0x99, 0x87, 0x63, 0xba, 0x79, 0x28, 0x4c, 0xc1, 0x27, 0x61, 0xd0, 0x6b, 0xd2, 0x3d, 0xbf, 0x64, - 0x6e, 0xe5, 0x6b, 0x14, 0x88, 0x39, 0x0e, 0x3d, 0x05, 0xc3, 0x8d, 0xb0, 0xd9, 0x74, 0x02, 0x77, - 0xa6, 0xcc, 0x74, 0xce, 0x51, 0xaa, 0x16, 0x2c, 0x73, 0x10, 0x96, 0x38, 0xf4, 0x18, 0x0c, 0x38, - 0xd1, 0x66, 0x3c, 0x33, 0xc0, 0x68, 0x46, 0x68, 0x4d, 0x8b, 0xd1, 0x66, 0x8c, 0x19, 0x94, 0xea, - 0x92, 0xf7, 0xc2, 0xe8, 0xae, 0x17, 0x6c, 0x56, 0xbd, 0x88, 0x29, 0x86, 0x9a, 0x2e, 0x79, 0x5b, - 0x61, 0xb0, 0x46, 0x85, 0x6a, 0x30, 0xd8, 0x0a, 0xa3, 0x24, 0x9e, 0x19, 0x62, 0x03, 0xff, 0x5c, - 0xee, 0xf2, 0xe3, 0xfd, 0xae, 0x85, 0x51, 0x92, 0x76, 0x85, 0xfe, 0x8b, 0x31, 0x67, 0x84, 0x96, - 0xa1, 0x4c, 0x82, 0xed, 0x99, 0x61, 0xc6, 0xef, 0x43, 0x07, 0xf3, 0x5b, 0x09, 0xb6, 0x6f, 0x39, - 0x51, 0x2a, 0xaf, 0x56, 0x82, 0x6d, 0x4c, 0x4b, 0xa3, 0x06, 0x54, 0xa4, 0x0b, 0x2b, 0x9e, 0x19, - 0x29, 0x32, 0x15, 0xb1, 0x20, 0xc7, 0xe4, 0xdd, 0xb6, 0x17, 0x91, 0x26, 0x09, 0x92, 0x38, 0x35, - 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x31, 0xae, 0x7f, 0x5e, 0x0b, 0xdb, 0x41, 0x12, - 0xcf, 0x54, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x4b, 0xd3, 0x82, 0xfd, 0x98, 0x06, - 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xe3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, 0xbc, - 0x43, 0x66, 0x80, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x96, 0x4e, 0xec, 0xed, 0xce, - 0x8d, 0x5f, 0xd5, 0x4b, 0x63, 0x93, 0x19, 0x7a, 0x0b, 0x26, 0xa8, 0xb2, 0xeb, 0xa5, 0xec, 0x47, - 0x8b, 0xb3, 0x47, 0x7b, 0xbb, 0x73, 0x13, 0xd8, 0x28, 0x8e, 0x33, 0xec, 0xd0, 0x3a, 0x54, 0x7c, - 0x6f, 0x83, 0x34, 0x76, 0x1a, 0x3e, 0x99, 0x19, 0x63, 0xbc, 0x73, 0x16, 0xe7, 0x55, 0x49, 0xce, - 0x0d, 0x0c, 0xf5, 0x17, 0xa7, 0x8c, 0xd0, 0x2d, 0x38, 0x9d, 0x90, 0xa8, 0xe9, 0x05, 0x0e, 0x5d, - 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x71, 0x36, 0x6b, 0xcf, 0x88, 0x81, 0x3d, 0xbd, 0xde, 0x95, - 0x0a, 0xf7, 0x28, 0x8d, 0x6e, 0xc0, 0x24, 0x5b, 0x4f, 0xb5, 0xb6, 0xef, 0xd7, 0x42, 0xdf, 0x6b, - 0xec, 0xcc, 0x4c, 0x30, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0x9a, 0x89, 0xa6, 0x86, 0x61, 0xfa, 0x0f, - 0x67, 0x4b, 0x23, 0x1f, 0x26, 0x63, 0xd2, 0x68, 0x47, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, 0x9f, - 0xcc, 0x4c, 0x16, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, 0x15, - 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xcc, 0x14, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, 0x1c, - 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x3e, 0xc1, 0x08, 0x53, 0xff, 0x81, 0x44, 0xe0, 0x94, - 0x86, 0xaa, 0x06, 0x49, 0xb2, 0x33, 0x83, 0x18, 0xa9, 0x5a, 0x6a, 0xeb, 0xeb, 0x9f, 0xc1, 0x14, - 0x8e, 0x6e, 0xc1, 0x30, 0x09, 0xb6, 0x57, 0xa3, 0xb0, 0x39, 0x73, 0xb2, 0x88, 0x0c, 0x58, 0xe1, - 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0x33, 0x5d, 0xbe, 0x12, - 0xff, 0x28, 0xd3, 0xec, 0xa3, 0x7c, 0x42, 0x94, 0x9d, 0x59, 0xef, 0x41, 0xb7, 0x7f, 0x00, 0x0e, - 0xf7, 0xe4, 0x6e, 0xdf, 0x81, 0x09, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0x73, 0x30, 0x48, 0x65, 0xb1, - 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x40, 0x96, - 0x76, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x72, 0x35, - 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0xf3, 0x30, 0xb2, 0x15, 0xc6, 0x09, 0xa5, 0x66, 0x75, 0x0c, - 0xa6, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x0a, 0xe3, 0x0d, 0xbd, 0x02, 0xb1, 0x8d, - 0x9d, 0x12, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x08, 0xf3, 0x72, 0x37, 0x42, 0x5f, - 0x98, 0x90, 0x72, 0x57, 0x1e, 0xa9, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, 0xd3, - 0x26, 0xac, 0xd5, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0x97, 0x25, - 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x67, 0x61, 0xf8, 0x9e, 0xe3, 0x25, 0x5e, 0xb0, 0x29, 0xb4, - 0x87, 0x17, 0x0b, 0xee, 0x26, 0xac, 0xf8, 0x6d, 0x5e, 0x94, 0xef, 0x7c, 0xe2, 0x0f, 0x96, 0x0c, - 0x29, 0xef, 0xa8, 0x1d, 0x04, 0x94, 0x77, 0xa9, 0x7f, 0xde, 0x98, 0x17, 0xe5, 0xbc, 0xc5, 0x1f, - 0x2c, 0x19, 0xa2, 0x0d, 0x00, 0x39, 0x97, 0x88, 0x2b, 0xbc, 0xcb, 0x1f, 0xed, 0x87, 0xfd, 0xba, - 0x2a, 0xbd, 0x34, 0x41, 0xf7, 0xda, 0xf4, 0x3f, 0xd6, 0x38, 0xdb, 0x09, 0x53, 0xc2, 0x3a, 0x9b, - 0x85, 0x3e, 0x47, 0x97, 0xb4, 0x13, 0x25, 0xc4, 0x5d, 0x4c, 0xb2, 0x0e, 0xfa, 0x83, 0x55, 0xec, - 0x75, 0xaf, 0x49, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xdd, 0x32, 0xcc, 0xf4, 0x6a, - 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x53, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0x8a, 0x80, 0x63, - 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x4a, 0x63, 0x69, 0x30, 0x9d, 0x1b, 0x75, 0x06, 0xc5, 0x02, - 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, 0x0e, - 0x91, 0x81, 0x1c, 0x87, 0x88, 0x31, 0x44, 0x83, 0x0f, 0x76, 0x88, 0xd0, 0xe7, 0x01, 0x36, 0xbc, - 0xc0, 0x8b, 0xb7, 0x18, 0xf7, 0xa1, 0xbe, 0xb9, 0x2b, 0x25, 0x6b, 0x55, 0x71, 0xc1, 0x1a, 0x47, - 0xf4, 0x32, 0x8c, 0xaa, 0xe5, 0xb9, 0x56, 0x9d, 0x19, 0x36, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, 0x62, - 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, 0x83, - 0xc7, 0xd7, 0xfe, 0x2f, 0x65, 0x98, 0x34, 0x2a, 0x6b, 0xc7, 0x05, 0x24, 0xda, 0xeb, 0x74, 0xc3, - 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xf9, 0x7e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, 0xa1, - 0x2d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xfe, 0xd8, 0xa6, 0xe6, 0x87, 0x13, - 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, 0x35, - 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x8b, 0x08, 0x9b, 0x29, 0xcb, 0x54, 0x9f, - 0x63, 0x53, 0x6f, 0x30, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1d, 0xa0, - 0xf7, 0x3f, 0x03, 0xc3, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x71, 0x30, 0x96, 0xf8, 0xec, - 0x24, 0x1a, 0x29, 0x38, 0x89, 0x9e, 0x85, 0x89, 0xaa, 0x43, 0x9a, 0x61, 0xb0, 0x12, 0xb8, 0xad, - 0xd0, 0x0b, 0x12, 0x34, 0x03, 0x03, 0x6c, 0x3f, 0xe1, 0xeb, 0x7d, 0x80, 0x72, 0xc0, 0x03, 0x54, - 0x77, 0xb7, 0xff, 0x9f, 0x05, 0xe3, 0x55, 0xe2, 0x93, 0x84, 0x70, 0xbb, 0x27, 0x46, 0xab, 0x80, - 0x36, 0x23, 0xa7, 0x41, 0x6a, 0x24, 0xf2, 0x42, 0xb7, 0x4e, 0x1a, 0x61, 0xc0, 0x0e, 0xa2, 0xe8, - 0x06, 0x79, 0x7a, 0x6f, 0x77, 0x0e, 0x5d, 0xea, 0xc0, 0xe2, 0x2e, 0x25, 0x90, 0x0b, 0xe3, 0xad, - 0x88, 0x18, 0x7e, 0x43, 0x2b, 0x5f, 0xd5, 0xa8, 0xe9, 0x45, 0xb8, 0x36, 0x6c, 0x80, 0xb0, 0xc9, - 0x14, 0x7d, 0x0a, 0xa6, 0xc2, 0xa8, 0xb5, 0xe5, 0x04, 0x55, 0xd2, 0x22, 0x81, 0x4b, 0x4d, 0x00, - 0xe1, 0xed, 0x98, 0xde, 0xdb, 0x9d, 0x9b, 0xba, 0x91, 0xc1, 0xe1, 0x0e, 0x6a, 0xfb, 0x5d, 0x38, - 0x55, 0x0d, 0xef, 0x05, 0xf7, 0x9c, 0xc8, 0x5d, 0xac, 0xad, 0x69, 0x0e, 0x84, 0x37, 0xa4, 0x81, - 0xca, 0x0f, 0xe1, 0x72, 0x76, 0x1f, 0x8d, 0x07, 0x37, 0x0d, 0x56, 0x3d, 0x9f, 0xf4, 0x70, 0x59, - 0xfc, 0x93, 0x92, 0x51, 0x67, 0x4a, 0xaf, 0xce, 0x17, 0xac, 0x9e, 0xe7, 0x0b, 0x9f, 0x83, 0x91, - 0x0d, 0x8f, 0xf8, 0x2e, 0x26, 0x1b, 0x62, 0x44, 0x5f, 0x28, 0x72, 0x00, 0xb3, 0x4a, 0xcb, 0x48, - 0x0f, 0x16, 0x37, 0x74, 0x57, 0x05, 0x1b, 0xac, 0x18, 0xa2, 0x36, 0x4c, 0x49, 0x5b, 0x49, 0x62, - 0xc5, 0x82, 0x7c, 0xb1, 0x98, 0x29, 0x66, 0x56, 0xc3, 0x3e, 0x01, 0xce, 0x30, 0xc4, 0x1d, 0x55, - 0x50, 0x1b, 0xb7, 0x49, 0xb7, 0xa3, 0x01, 0x36, 0x3d, 0x99, 0x8d, 0xcb, 0xcc, 0x75, 0x06, 0xb5, - 0x7f, 0xcd, 0x82, 0x47, 0x3a, 0x46, 0x4b, 0xf8, 0x32, 0x8e, 0xec, 0x1b, 0x65, 0x1d, 0x0a, 0xa5, - 0x7c, 0x87, 0x82, 0x7d, 0x03, 0xa6, 0x57, 0x9a, 0xad, 0x64, 0xa7, 0xea, 0x99, 0xc7, 0x22, 0xaf, - 0xc0, 0x50, 0x93, 0xb8, 0x5e, 0xbb, 0x29, 0x3e, 0xeb, 0x9c, 0x94, 0xdd, 0xd7, 0x18, 0x74, 0x7f, - 0x77, 0x6e, 0xbc, 0x9e, 0x84, 0x91, 0xb3, 0x49, 0x38, 0x00, 0x0b, 0x72, 0xfb, 0xc7, 0x16, 0x4c, - 0xca, 0x35, 0xbc, 0xe8, 0xba, 0x11, 0x89, 0x63, 0x34, 0x0b, 0x25, 0xaf, 0x25, 0x18, 0x81, 0x60, - 0x54, 0x5a, 0xab, 0xe1, 0x92, 0xd7, 0x42, 0x9f, 0x85, 0x0a, 0x3f, 0x4d, 0x4b, 0x27, 0x47, 0x9f, - 0xa7, 0x73, 0xcc, 0x7e, 0x5b, 0x97, 0x3c, 0x70, 0xca, 0x4e, 0x6a, 0xb2, 0x6c, 0x77, 0x28, 0x9b, - 0x67, 0x3b, 0x97, 0x05, 0x1c, 0x2b, 0x0a, 0x74, 0x0e, 0x46, 0x82, 0xd0, 0xe5, 0x07, 0x9e, 0x7c, - 0x9f, 0x67, 0x53, 0xee, 0xba, 0x80, 0x61, 0x85, 0xb5, 0xbf, 0x66, 0xc1, 0x98, 0xec, 0x63, 0x41, - 0xa5, 0x9a, 0x2e, 0x92, 0x54, 0xa1, 0x4e, 0x17, 0x09, 0x55, 0x8a, 0x19, 0xc6, 0xd0, 0x85, 0xcb, - 0xfd, 0xe8, 0xc2, 0xf6, 0x6f, 0x94, 0x60, 0x42, 0x36, 0xa7, 0xde, 0xbe, 0x13, 0x13, 0xaa, 0x2a, - 0x54, 0x1c, 0x3e, 0xf8, 0x44, 0xce, 0xb3, 0xe7, 0xf3, 0xec, 0x25, 0xe3, 0x9b, 0xa5, 0xaa, 0xc8, - 0xa2, 0xe4, 0x83, 0x53, 0x96, 0x68, 0x1b, 0x4e, 0x04, 0x61, 0xc2, 0xb6, 0x20, 0x85, 0x2f, 0x76, - 0x1a, 0x91, 0xad, 0xe7, 0x51, 0x51, 0xcf, 0x89, 0xeb, 0x59, 0x7e, 0xb8, 0xb3, 0x0a, 0x74, 0x43, - 0xfa, 0x81, 0xca, 0xac, 0xae, 0x67, 0x8b, 0xd5, 0xd5, 0xdb, 0x0d, 0x64, 0xff, 0x8e, 0x05, 0x15, - 0x49, 0x76, 0x1c, 0xc7, 0x52, 0xb7, 0x61, 0x38, 0x66, 0x9f, 0x48, 0x0e, 0xd7, 0xf9, 0x62, 0x5d, - 0xe0, 0xdf, 0x35, 0xdd, 0x77, 0xf9, 0xff, 0x18, 0x4b, 0x6e, 0xcc, 0x21, 0xae, 0x3a, 0xf2, 0xd0, - 0x39, 0xc4, 0x55, 0xcb, 0x7a, 0x9f, 0x3e, 0x8d, 0x1b, 0x16, 0x3b, 0x55, 0x1e, 0x5b, 0x11, 0xd9, - 0xf0, 0xee, 0x67, 0x95, 0xc7, 0x1a, 0x83, 0x62, 0x81, 0x45, 0x1b, 0x30, 0xd6, 0x90, 0x2e, 0xe3, - 0x54, 0x84, 0x7c, 0xa4, 0xa0, 0x7f, 0x5e, 0x1d, 0xf5, 0xf0, 0xf0, 0xa1, 0x65, 0x8d, 0x13, 0x36, - 0xf8, 0x52, 0x39, 0x95, 0x9e, 0x66, 0x97, 0x0b, 0x3a, 0x57, 0x22, 0x92, 0xa4, 0x35, 0xf4, 0x3c, - 0xc8, 0xb6, 0xbf, 0x69, 0xc1, 0x10, 0xf7, 0x31, 0x16, 0x73, 0xd4, 0x6a, 0x87, 0x58, 0xe9, 0x78, - 0xde, 0xa2, 0x40, 0x71, 0xa6, 0x85, 0x6e, 0x43, 0x85, 0xfd, 0x60, 0xfe, 0x92, 0x72, 0x91, 0x58, - 0x2a, 0x5e, 0xbf, 0xde, 0xd4, 0x5b, 0x92, 0x01, 0x4e, 0x79, 0xd9, 0xdf, 0x2f, 0x53, 0xd1, 0x97, - 0x92, 0x1a, 0x7b, 0xbb, 0x75, 0x1c, 0x7b, 0x7b, 0xe9, 0xe8, 0xf7, 0xf6, 0x77, 0x61, 0xb2, 0xa1, - 0x1d, 0xa2, 0xa5, 0x5f, 0xfc, 0x42, 0xc1, 0x69, 0xa5, 0x9d, 0xbc, 0x71, 0x9f, 0xda, 0xb2, 0xc9, - 0x0e, 0x67, 0xf9, 0x23, 0x02, 0x63, 0x7c, 0x3e, 0x88, 0xfa, 0x06, 0x58, 0x7d, 0x0b, 0x45, 0x66, - 0x98, 0x5e, 0x19, 0x9b, 0xc5, 0x75, 0x8d, 0x11, 0x36, 0xd8, 0xda, 0xbf, 0x32, 0x08, 0x83, 0x2b, - 0xdb, 0x24, 0x48, 0x8e, 0x41, 0xd4, 0x35, 0x61, 0xc2, 0x0b, 0xb6, 0x43, 0x7f, 0x9b, 0xb8, 0x1c, - 0x7f, 0xb8, 0xed, 0xfd, 0xb4, 0xa8, 0x64, 0x62, 0xcd, 0x60, 0x86, 0x33, 0xcc, 0x8f, 0xc2, 0x9a, - 0x7f, 0x1d, 0x86, 0xf8, 0xcc, 0x10, 0xa6, 0x7c, 0x8e, 0xcf, 0x9d, 0x0d, 0xac, 0x58, 0x41, 0xa9, - 0xcf, 0x81, 0xbb, 0xfb, 0x05, 0x23, 0xf4, 0x0e, 0x4c, 0x6c, 0x78, 0x51, 0x9c, 0x50, 0x83, 0x3c, - 0x4e, 0x9c, 0x66, 0xeb, 0x10, 0x76, 0xbc, 0x1a, 0x91, 0x55, 0x83, 0x13, 0xce, 0x70, 0x46, 0x9b, - 0x30, 0x4e, 0xcd, 0xc8, 0xb4, 0xaa, 0xe1, 0xbe, 0xab, 0x52, 0x6e, 0xbc, 0xab, 0x3a, 0x23, 0x6c, - 0xf2, 0xa5, 0x22, 0xa9, 0xc1, 0xcc, 0xce, 0x11, 0xa6, 0xdd, 0x28, 0x91, 0xc4, 0xed, 0x4d, 0x8e, - 0xa3, 0x92, 0x8d, 0x45, 0xb3, 0x54, 0x4c, 0xc9, 0x96, 0xc6, 0xac, 0xd8, 0xdf, 0xa6, 0x7b, 0x31, - 0x1d, 0xc3, 0x63, 0xd8, 0xbe, 0x2e, 0x9b, 0xdb, 0xd7, 0x93, 0x05, 0xbe, 0x6c, 0x8f, 0xad, 0xeb, - 0x6d, 0x18, 0xd5, 0x3e, 0x3c, 0x5a, 0x80, 0x4a, 0x43, 0x06, 0x5c, 0x08, 0x29, 0xae, 0x54, 0x29, - 0x15, 0x89, 0x81, 0x53, 0x1a, 0x3a, 0x2e, 0x54, 0x05, 0xcd, 0x86, 0x67, 0x51, 0x05, 0x15, 0x33, - 0x8c, 0xfd, 0x22, 0xc0, 0xca, 0x7d, 0xd2, 0x58, 0xe4, 0x26, 0x9e, 0x76, 0x06, 0x67, 0xf5, 0x3e, - 0x83, 0xb3, 0xbf, 0x65, 0xc1, 0xc4, 0xea, 0xb2, 0xa1, 0xd3, 0xcf, 0x03, 0x70, 0xdd, 0xf8, 0xf6, - 0xed, 0xeb, 0xd2, 0xc7, 0xcc, 0x1d, 0x81, 0x0a, 0x8a, 0x35, 0x0a, 0xf4, 0x28, 0x94, 0xfd, 0x76, - 0x20, 0x54, 0xd6, 0xe1, 0xbd, 0xdd, 0xb9, 0xf2, 0xd5, 0x76, 0x80, 0x29, 0x4c, 0x8b, 0x83, 0x2a, - 0x17, 0x8e, 0x83, 0xca, 0x8f, 0x08, 0xfe, 0x7a, 0x19, 0xa6, 0x56, 0x7d, 0x72, 0xdf, 0x68, 0xf5, - 0xd3, 0x30, 0xe4, 0x46, 0xde, 0x36, 0x89, 0xb2, 0x8a, 0x40, 0x95, 0x41, 0xb1, 0xc0, 0x16, 0x0e, - 0xcd, 0x7a, 0xab, 0x73, 0x23, 0x3f, 0xba, 0xb0, 0xb4, 0xdc, 0x3e, 0xa3, 0x0d, 0x18, 0xe6, 0x67, - 0xb6, 0xf1, 0xcc, 0x20, 0x9b, 0x8a, 0xaf, 0x1e, 0xdc, 0x98, 0xec, 0xf8, 0xcc, 0x0b, 0x1f, 0x08, - 0x0f, 0x8a, 0x51, 0xb2, 0x4c, 0x40, 0xb1, 0x64, 0x3e, 0xfb, 0x71, 0x18, 0xd3, 0x29, 0xfb, 0x8a, - 0x8e, 0xf9, 0xab, 0x16, 0x9c, 0x5c, 0xf5, 0xc3, 0xc6, 0xdd, 0x4c, 0xec, 0xdc, 0xcb, 0x30, 0x4a, - 0x17, 0x53, 0x6c, 0x04, 0x96, 0x1a, 0x11, 0xb4, 0x02, 0x85, 0x75, 0x3a, 0xad, 0xd8, 0xcd, 0x9b, - 0x6b, 0xd5, 0x6e, 0x81, 0xb7, 0x02, 0x85, 0x75, 0x3a, 0xfb, 0xf7, 0x2c, 0x78, 0xfc, 0xd2, 0xf2, - 0x4a, 0x8d, 0x44, 0xb1, 0x17, 0x27, 0x24, 0x48, 0x3a, 0x62, 0x7f, 0xa9, 0xce, 0xe8, 0x6a, 0x4d, - 0x49, 0x75, 0xc6, 0x2a, 0x6b, 0x85, 0xc0, 0x3e, 0x2c, 0x01, 0xf0, 0xdf, 0xb4, 0xe0, 0xe4, 0x25, - 0x2f, 0xc1, 0xa4, 0x15, 0x66, 0xc3, 0x75, 0x23, 0xd2, 0x0a, 0x63, 0x2f, 0x09, 0xa3, 0x9d, 0x6c, - 0xb8, 0x2e, 0x56, 0x18, 0xac, 0x51, 0xf1, 0x9a, 0xb7, 0xbd, 0x98, 0xb6, 0xb4, 0x64, 0x9a, 0xba, - 0x58, 0xc0, 0xb1, 0xa2, 0xa0, 0x1d, 0x73, 0xbd, 0x88, 0xa9, 0x0c, 0x3b, 0x62, 0x05, 0xab, 0x8e, - 0x55, 0x25, 0x02, 0xa7, 0x34, 0xf6, 0xdf, 0xb3, 0xe0, 0xd4, 0x25, 0xbf, 0x1d, 0x27, 0x24, 0xda, - 0x88, 0x8d, 0xc6, 0xbe, 0x08, 0x15, 0x22, 0x95, 0x7b, 0xd1, 0x56, 0xb5, 0x69, 0x28, 0xad, 0x9f, - 0xc7, 0x0a, 0x2b, 0xba, 0x02, 0x21, 0xa9, 0xfd, 0x05, 0x50, 0xfe, 0x66, 0x09, 0xc6, 0x2f, 0xaf, - 0xaf, 0xd7, 0x2e, 0x91, 0x44, 0x48, 0xc9, 0x7c, 0xa7, 0x14, 0xd6, 0x2c, 0xf2, 0x83, 0x94, 0x9f, - 0x76, 0xe2, 0xf9, 0xf3, 0xfc, 0x4a, 0xc7, 0xfc, 0x5a, 0x90, 0xdc, 0x88, 0xea, 0x49, 0xe4, 0x05, - 0x9b, 0x5d, 0x6d, 0x78, 0x29, 0xcb, 0xcb, 0xbd, 0x64, 0x39, 0x7a, 0x11, 0x86, 0xd8, 0x9d, 0x12, - 0xa9, 0x7c, 0x7c, 0x50, 0xe9, 0x09, 0x0c, 0xba, 0xbf, 0x3b, 0x57, 0xb9, 0x89, 0xd7, 0xf8, 0x1f, - 0x2c, 0x48, 0xd1, 0x5b, 0x30, 0xba, 0x95, 0x24, 0xad, 0xcb, 0xc4, 0x71, 0x49, 0x24, 0xe5, 0xc4, - 0xb9, 0x83, 0xe5, 0x04, 0x1d, 0x0e, 0x5e, 0x20, 0x5d, 0x5a, 0x29, 0x2c, 0xc6, 0x3a, 0x47, 0xbb, - 0x0e, 0x90, 0xe2, 0x1e, 0x90, 0x0d, 0x62, 0xff, 0x7c, 0x09, 0x86, 0x2f, 0x3b, 0x81, 0xeb, 0x93, - 0x08, 0xad, 0xc2, 0x00, 0xb9, 0x4f, 0x1a, 0x62, 0x23, 0xcf, 0x69, 0x7a, 0xba, 0xd9, 0x71, 0xbf, - 0x1a, 0xfd, 0x8f, 0x59, 0x79, 0x84, 0x61, 0x98, 0xb6, 0xfb, 0x92, 0x8a, 0xe4, 0x7e, 0x2e, 0x7f, - 0x14, 0xd4, 0xa4, 0xe0, 0x3b, 0xa5, 0x00, 0x61, 0xc9, 0x88, 0x79, 0xa0, 0x1a, 0xad, 0x3a, 0x15, - 0x6f, 0x49, 0x31, 0xcb, 0x6e, 0x7d, 0xb9, 0xc6, 0xc9, 0x05, 0x5f, 0xee, 0x81, 0x92, 0x40, 0x9c, - 0xb2, 0xb3, 0x2f, 0xc2, 0x34, 0x3b, 0x33, 0x75, 0x92, 0x2d, 0x63, 0xd5, 0xe4, 0x4e, 0x4f, 0xfb, - 0x87, 0x25, 0x38, 0xb1, 0x56, 0x5f, 0xae, 0x9b, 0xbe, 0xc3, 0x8b, 0x30, 0xc6, 0x37, 0x68, 0x3a, - 0xe9, 0x1c, 0x5f, 0x94, 0x57, 0x7e, 0xfe, 0x75, 0x0d, 0x87, 0x0d, 0x4a, 0xf4, 0x38, 0x94, 0xbd, - 0x77, 0x83, 0x6c, 0xe4, 0xdd, 0xda, 0xeb, 0xd7, 0x31, 0x85, 0x53, 0x34, 0xdd, 0xeb, 0xb9, 0x90, - 0x53, 0x68, 0xb5, 0xdf, 0xbf, 0x06, 0x13, 0x5e, 0xdc, 0x88, 0xbd, 0xb5, 0x80, 0x4a, 0x00, 0xa7, - 0x21, 0xa7, 0x6f, 0xaa, 0x9c, 0xd3, 0xa6, 0x2a, 0x2c, 0xce, 0x50, 0x6b, 0x12, 0x77, 0xb0, 0xb0, - 0xbe, 0x90, 0x1b, 0xd2, 0x4d, 0x55, 0xa1, 0x16, 0xeb, 0x5d, 0xcc, 0xe2, 0x78, 0x84, 0x2a, 0xc4, - 0x3b, 0x1c, 0x63, 0x89, 0xb3, 0xdf, 0x81, 0x8a, 0x0a, 0xc5, 0x92, 0x11, 0x88, 0x56, 0x8f, 0x08, - 0xc4, 0x7c, 0xc9, 0x24, 0x1d, 0xbf, 0xe5, 0xae, 0x8e, 0xdf, 0x7f, 0x66, 0x41, 0x1a, 0x4b, 0x82, - 0x30, 0x54, 0x5a, 0x21, 0x3b, 0xc8, 0x89, 0xe4, 0x89, 0xe9, 0x53, 0x39, 0x13, 0x96, 0x2f, 0x18, - 0x3e, 0xa5, 0x6a, 0xb2, 0x2c, 0x4e, 0xd9, 0xa0, 0xab, 0x30, 0xdc, 0x8a, 0x48, 0x3d, 0x61, 0xd7, - 0x07, 0xfa, 0xe0, 0xc8, 0xc7, 0x86, 0x97, 0xc4, 0x92, 0x85, 0xfd, 0x6f, 0x2c, 0x80, 0xab, 0x5e, - 0xd3, 0x4b, 0xb0, 0x13, 0x6c, 0x92, 0x63, 0xb0, 0x0a, 0xaf, 0xc3, 0x40, 0xdc, 0x22, 0x8d, 0x62, - 0x47, 0x71, 0x69, 0xcb, 0xea, 0x2d, 0xd2, 0x48, 0x3f, 0x07, 0xfd, 0x87, 0x19, 0x1f, 0xfb, 0x7b, - 0x00, 0x13, 0x29, 0x19, 0xd5, 0xcc, 0xd1, 0xf3, 0x46, 0xdc, 0xfc, 0xa3, 0x99, 0xb8, 0xf9, 0x0a, - 0xa3, 0xd6, 0x42, 0xe5, 0x13, 0x28, 0x37, 0x9d, 0xfb, 0xc2, 0x10, 0x78, 0xb9, 0x68, 0x83, 0x68, - 0x4d, 0xf3, 0xd7, 0x9c, 0xfb, 0x5c, 0xef, 0x7a, 0x4e, 0x4e, 0xa4, 0x6b, 0xce, 0xfd, 0x7d, 0x7e, - 0xe0, 0xc6, 0x16, 0x2c, 0xb5, 0x3c, 0xbe, 0xfc, 0xc7, 0xe9, 0x7f, 0x26, 0x43, 0x69, 0x75, 0xac, - 0x56, 0x2f, 0x10, 0x7e, 0xcc, 0x3e, 0x6b, 0xf5, 0x82, 0x6c, 0xad, 0x5e, 0x50, 0xa0, 0x56, 0x8f, - 0x05, 0x98, 0x0e, 0x0b, 0xf7, 0x3f, 0x8b, 0xce, 0x1b, 0xbd, 0xf0, 0xb1, 0xbe, 0xaa, 0x16, 0xe7, - 0x08, 0xbc, 0xfa, 0x05, 0xa9, 0x6c, 0x0a, 0x68, 0x6e, 0x13, 0x64, 0xd5, 0xe8, 0xef, 0x5b, 0x30, - 0x21, 0x7e, 0x63, 0xf2, 0x6e, 0x9b, 0xc4, 0x89, 0xd8, 0xd4, 0x3e, 0x75, 0x98, 0xd6, 0x08, 0x16, - 0xbc, 0x51, 0x1f, 0x95, 0x12, 0xc9, 0x44, 0xe6, 0xb6, 0x2d, 0xd3, 0x1e, 0xf4, 0x3d, 0x0b, 0xa6, - 0x9b, 0xce, 0x7d, 0x5e, 0x23, 0x87, 0x61, 0x27, 0xf1, 0x42, 0x11, 0x81, 0xb8, 0xda, 0xef, 0x3c, - 0xe9, 0x60, 0xc4, 0x9b, 0x2b, 0x83, 0x8b, 0xa6, 0xbb, 0x91, 0xe4, 0x36, 0xba, 0x6b, 0x0b, 0x67, - 0x37, 0x60, 0x44, 0x4e, 0xcc, 0x2e, 0x6a, 0x7e, 0x55, 0xdf, 0xbb, 0x73, 0x8c, 0xea, 0x79, 0xe9, - 0x1a, 0x9b, 0x7f, 0xbd, 0xed, 0x04, 0x89, 0x97, 0xec, 0x68, 0x66, 0x01, 0xab, 0x47, 0x4c, 0xc5, - 0x23, 0xad, 0xe7, 0x1d, 0x18, 0xd3, 0xe7, 0xdd, 0x91, 0xd6, 0xf5, 0x2e, 0x9c, 0xec, 0x32, 0xab, - 0x8e, 0xb4, 0xca, 0x7b, 0xf0, 0x68, 0xcf, 0xf9, 0x71, 0x94, 0x15, 0xdb, 0xbf, 0x69, 0xe9, 0xa2, - 0xf3, 0x18, 0x9c, 0x2e, 0xd7, 0x4c, 0xa7, 0xcb, 0xb9, 0xa2, 0x6b, 0xa8, 0x87, 0xe7, 0x65, 0x43, - 0x6f, 0x3e, 0xdd, 0x12, 0xd0, 0x3a, 0x0c, 0xf9, 0x14, 0x22, 0xcf, 0xbc, 0xce, 0xf7, 0xb3, 0x4a, - 0x53, 0xa5, 0x84, 0xc1, 0x63, 0x2c, 0x78, 0xd9, 0xdf, 0xb3, 0x60, 0xe0, 0xcf, 0xf1, 0x56, 0x4f, - 0x07, 0x6b, 0x71, 0x39, 0x7d, 0x1e, 0x3b, 0xf7, 0x56, 0xee, 0x27, 0x24, 0x88, 0x99, 0x0e, 0xda, - 0xeb, 0xd4, 0x7e, 0x94, 0x56, 0x25, 0x03, 0x25, 0x5e, 0x85, 0x71, 0xdf, 0xb9, 0x43, 0x7c, 0xe9, - 0x30, 0xce, 0x5a, 0x6c, 0x57, 0x75, 0x24, 0x36, 0x69, 0x69, 0xe1, 0x0d, 0xdd, 0x9f, 0x2e, 0x94, - 0x24, 0x55, 0xd8, 0x70, 0xb6, 0x63, 0x93, 0x96, 0x9a, 0x0c, 0xf7, 0x9c, 0xa4, 0xb1, 0x25, 0xac, - 0x39, 0xd5, 0xdc, 0xdb, 0x14, 0x88, 0x39, 0x0e, 0x2d, 0xc2, 0xa4, 0x9c, 0xb1, 0xb7, 0xa8, 0x99, - 0x1f, 0x06, 0x42, 0xcf, 0x54, 0x37, 0x83, 0xb1, 0x89, 0xc6, 0x59, 0x7a, 0xf4, 0x71, 0x98, 0xa0, - 0x83, 0x13, 0xb6, 0x13, 0x19, 0x06, 0x32, 0xc8, 0xc2, 0x40, 0x58, 0x14, 0xf1, 0xba, 0x81, 0xc1, - 0x19, 0x4a, 0xfb, 0x2d, 0x38, 0x79, 0x35, 0x74, 0xdc, 0x25, 0xc7, 0x77, 0x82, 0x06, 0x89, 0xd6, - 0x82, 0xcd, 0xdc, 0xe3, 0x6b, 0xfd, 0x88, 0xb9, 0x94, 0x77, 0xc4, 0x6c, 0x47, 0x80, 0xf4, 0x0a, - 0x44, 0x00, 0xd3, 0x9b, 0x30, 0xec, 0xf1, 0xaa, 0xc4, 0xb4, 0x7d, 0x21, 0xcf, 0x1f, 0xd5, 0xd1, - 0x46, 0x2d, 0x20, 0x87, 0x03, 0xb0, 0x64, 0x49, 0x4d, 0x90, 0x6e, 0x0e, 0xac, 0x7c, 0x2b, 0xcf, - 0xfe, 0xeb, 0x16, 0x4c, 0x5e, 0xcf, 0x5c, 0x3b, 0x7d, 0x1a, 0x86, 0x78, 0xf2, 0x82, 0xac, 0x8b, - 0xa5, 0xce, 0xa0, 0x58, 0x60, 0x1f, 0xb8, 0x85, 0xff, 0xcb, 0x25, 0xa8, 0xb0, 0x50, 0xd8, 0x16, - 0x35, 0x27, 0x8e, 0x5e, 0x4d, 0xbd, 0x66, 0xa8, 0xa9, 0x39, 0x56, 0xa6, 0x6a, 0x58, 0x2f, 0x2d, - 0x15, 0xdd, 0x54, 0xd7, 0x31, 0x0b, 0x19, 0x98, 0x29, 0x43, 0x7e, 0x65, 0x6f, 0xc2, 0xbc, 0xbd, - 0x29, 0xaf, 0x6a, 0xb2, 0x43, 0x5f, 0x45, 0xfb, 0xd0, 0x1d, 0xfa, 0xaa, 0x96, 0xf5, 0x10, 0x4e, - 0x35, 0xad, 0xf1, 0x4c, 0x7c, 0x7f, 0x92, 0x05, 0x38, 0x3a, 0xbe, 0xf7, 0x05, 0xa2, 0x6e, 0x35, - 0xcf, 0x89, 0x80, 0x45, 0x01, 0xdd, 0x67, 0x72, 0x46, 0xfc, 0xe3, 0x97, 0xd6, 0xd3, 0x22, 0xf6, - 0x65, 0x98, 0xcc, 0x0c, 0x1d, 0x7a, 0x19, 0x06, 0x5b, 0x5b, 0x4e, 0x4c, 0x32, 0x71, 0x2c, 0x83, - 0x35, 0x0a, 0xdc, 0xdf, 0x9d, 0x9b, 0x50, 0x05, 0x18, 0x04, 0x73, 0x6a, 0xfb, 0x2b, 0x25, 0x18, - 0xb8, 0x1e, 0xba, 0xc7, 0x31, 0xd5, 0x2e, 0x1b, 0x53, 0xed, 0xe9, 0xfc, 0x94, 0x17, 0x3d, 0x67, - 0x59, 0x2d, 0x33, 0xcb, 0xce, 0x15, 0xe0, 0x75, 0xf0, 0x04, 0x6b, 0xc2, 0x28, 0x4b, 0xa9, 0x21, - 0x02, 0x79, 0x5e, 0x34, 0x2c, 0xab, 0xb9, 0x8c, 0x65, 0x35, 0xa9, 0x91, 0x6a, 0xf6, 0xd5, 0x33, - 0x30, 0x2c, 0x02, 0x47, 0xb2, 0xe1, 0x9d, 0x82, 0x16, 0x4b, 0xbc, 0xfd, 0xaf, 0xca, 0x60, 0xa4, - 0xf0, 0x40, 0xbf, 0x63, 0xc1, 0x7c, 0xc4, 0xaf, 0xca, 0xb8, 0xd5, 0x76, 0xe4, 0x05, 0x9b, 0xf5, - 0xc6, 0x16, 0x71, 0xdb, 0xbe, 0x17, 0x6c, 0xae, 0x6d, 0x06, 0xa1, 0x02, 0xaf, 0xdc, 0x27, 0x8d, - 0x36, 0xf3, 0xd3, 0x16, 0xce, 0x1c, 0xa2, 0x0e, 0x4d, 0x2f, 0xec, 0xed, 0xce, 0xcd, 0xe3, 0xbe, - 0x6a, 0xc1, 0x7d, 0xb6, 0x0a, 0xfd, 0x91, 0x05, 0x0b, 0x3c, 0x89, 0x45, 0xf1, 0x9e, 0x14, 0xb2, - 0x48, 0x6b, 0x92, 0x69, 0xca, 0x6e, 0x9d, 0x44, 0xcd, 0xa5, 0x57, 0xc4, 0x20, 0x2f, 0xd4, 0xfa, - 0xab, 0x15, 0xf7, 0xdb, 0x4c, 0xfb, 0xdf, 0x95, 0x61, 0x9c, 0x8e, 0x67, 0x7a, 0x71, 0xfd, 0x65, - 0x63, 0x9a, 0x3c, 0x91, 0x99, 0x26, 0x27, 0x0c, 0xe2, 0x07, 0x73, 0x67, 0x3d, 0x86, 0x13, 0xbe, - 0x13, 0x27, 0x97, 0x89, 0x13, 0x25, 0x77, 0x88, 0xc3, 0xce, 0x26, 0xb3, 0x71, 0x0f, 0x05, 0x8e, - 0x3b, 0x55, 0x30, 0xd2, 0xd5, 0x2c, 0x33, 0xdc, 0xc9, 0x1f, 0x6d, 0x03, 0x62, 0xe7, 0xa0, 0x91, - 0x13, 0xc4, 0xbc, 0x2f, 0x9e, 0xf0, 0xeb, 0xf6, 0x57, 0xeb, 0xac, 0xa8, 0x15, 0x5d, 0xed, 0xe0, - 0x86, 0xbb, 0xd4, 0xa0, 0x9d, 0x74, 0x0f, 0x16, 0x3d, 0xe9, 0x1e, 0xca, 0x89, 0xab, 0xfe, 0xaa, - 0x05, 0x27, 0xe9, 0x67, 0x31, 0x63, 0x70, 0x63, 0x14, 0xc2, 0x24, 0x9d, 0x76, 0x3e, 0x49, 0x24, - 0x4c, 0xac, 0xaf, 0x1c, 0xcd, 0xda, 0xe4, 0x93, 0xaa, 0x6f, 0x57, 0x4c, 0x66, 0x38, 0xcb, 0xdd, - 0xfe, 0x96, 0x05, 0x2c, 0xe2, 0xee, 0x18, 0x36, 0xb3, 0x4b, 0xe6, 0x66, 0x66, 0xe7, 0x4b, 0x8c, - 0x1e, 0xfb, 0xd8, 0x4b, 0x30, 0x45, 0xb1, 0xb5, 0x28, 0xbc, 0xbf, 0x23, 0x15, 0xed, 0x7c, 0x07, - 0xef, 0x57, 0x4b, 0x7c, 0xd9, 0xa8, 0x3b, 0x7f, 0xe8, 0x17, 0x2c, 0x18, 0x69, 0x38, 0x2d, 0xa7, - 0xc1, 0x13, 0x20, 0x15, 0xf0, 0xce, 0x18, 0xe5, 0xe7, 0x97, 0x45, 0x59, 0xee, 0x59, 0xf8, 0x88, - 0xec, 0xba, 0x04, 0xe7, 0x7a, 0x13, 0x54, 0xe5, 0xb3, 0x77, 0x61, 0xdc, 0x60, 0x76, 0xa4, 0x66, - 0xe8, 0x2f, 0x58, 0x5c, 0xe8, 0x2b, 0x53, 0xe1, 0x1e, 0x9c, 0x08, 0xb4, 0xff, 0x54, 0x9c, 0x49, - 0xcd, 0x78, 0xbe, 0xb8, 0x58, 0x67, 0x52, 0x50, 0x8b, 0x2e, 0xcc, 0x30, 0xc4, 0x9d, 0x75, 0xd8, - 0xbf, 0x6a, 0xc1, 0x23, 0x3a, 0xa1, 0x76, 0x49, 0x33, 0xcf, 0x6f, 0x5c, 0x85, 0x91, 0xb0, 0x45, - 0x22, 0x27, 0x35, 0x8b, 0xce, 0xc9, 0xf1, 0xbf, 0x21, 0xe0, 0xfb, 0xbb, 0x73, 0xd3, 0x3a, 0x77, - 0x09, 0xc7, 0xaa, 0x24, 0xb2, 0x61, 0x88, 0x8d, 0x4b, 0x2c, 0xae, 0xd7, 0xb2, 0x84, 0x40, 0xec, - 0x50, 0x25, 0xc6, 0x02, 0x63, 0xff, 0x2d, 0x8b, 0x4f, 0x37, 0xbd, 0xe9, 0xe8, 0x8b, 0x30, 0xd5, - 0xa4, 0x16, 0xd4, 0xca, 0xfd, 0x16, 0xdd, 0x48, 0xd9, 0x71, 0xb2, 0x55, 0x64, 0xfb, 0xe8, 0xd1, - 0xdd, 0xa5, 0x19, 0xd1, 0xfa, 0xa9, 0x6b, 0x19, 0xb6, 0xb8, 0xa3, 0x22, 0xfb, 0x1f, 0x96, 0xf8, - 0x9a, 0x65, 0x3a, 0xdc, 0x33, 0x30, 0xdc, 0x0a, 0xdd, 0xe5, 0xb5, 0x2a, 0x16, 0x63, 0xa5, 0x84, - 0x4e, 0x8d, 0x83, 0xb1, 0xc4, 0xa3, 0x0b, 0x00, 0xe4, 0x7e, 0x42, 0xa2, 0xc0, 0xf1, 0xd5, 0x31, - 0xb0, 0x52, 0x95, 0x56, 0x14, 0x06, 0x6b, 0x54, 0xb4, 0x4c, 0x2b, 0x0a, 0xb7, 0x3d, 0x97, 0xdd, - 0x2e, 0x28, 0x9b, 0x65, 0x6a, 0x0a, 0x83, 0x35, 0x2a, 0x6a, 0xb7, 0xb6, 0x83, 0x98, 0x6f, 0x63, - 0xce, 0x1d, 0x91, 0xbf, 0x66, 0x24, 0xb5, 0x5b, 0x6f, 0xea, 0x48, 0x6c, 0xd2, 0xa2, 0x2b, 0x30, - 0x94, 0x38, 0xec, 0x70, 0x73, 0xb0, 0x48, 0xa4, 0xc8, 0x3a, 0xa5, 0xd5, 0x13, 0x06, 0xd1, 0xa2, - 0x58, 0xb0, 0xb0, 0xff, 0xa0, 0x02, 0x90, 0x6a, 0x5d, 0xe8, 0x2b, 0x9d, 0x0b, 0xfe, 0xa3, 0x45, - 0x55, 0xb6, 0x07, 0xb7, 0xda, 0xd1, 0x7b, 0x16, 0x8c, 0x3a, 0xbe, 0x1f, 0x36, 0x9c, 0x84, 0x0d, - 0x4f, 0xa9, 0xa8, 0xe8, 0x11, 0x2d, 0x59, 0x4c, 0xcb, 0xf2, 0xc6, 0xbc, 0x28, 0x0f, 0x1c, 0x35, - 0x4c, 0x6e, 0x7b, 0xf4, 0x26, 0xa0, 0x8f, 0x48, 0xad, 0x9d, 0x7f, 0xe1, 0xd9, 0xac, 0xd6, 0x5e, - 0x61, 0x02, 0x57, 0x53, 0xd8, 0xd1, 0x5b, 0x46, 0xbe, 0x97, 0x81, 0x22, 0x57, 0x44, 0x0d, 0x3d, - 0x24, 0x2f, 0xd5, 0x0b, 0xfa, 0xac, 0x1e, 0x52, 0x3d, 0x58, 0xe4, 0x0e, 0xb6, 0xa6, 0x0e, 0xe7, - 0x84, 0x53, 0x27, 0x30, 0xe9, 0x9a, 0x3b, 0xaf, 0x08, 0x0b, 0x7b, 0x21, 0xbf, 0x86, 0xcc, 0x96, - 0x9d, 0xee, 0xb5, 0x19, 0x04, 0xce, 0x56, 0x81, 0x3e, 0xcb, 0x03, 0xde, 0xd7, 0x82, 0x8d, 0x50, - 0x84, 0x86, 0x9d, 0x2f, 0xf0, 0xcd, 0x77, 0xe2, 0x84, 0x34, 0x69, 0x99, 0x74, 0x73, 0xbd, 0x2e, - 0xb8, 0x60, 0xc5, 0x0f, 0xad, 0xc3, 0x10, 0xbb, 0x11, 0x14, 0xcf, 0x8c, 0x14, 0xf1, 0xc4, 0x99, - 0x17, 0x61, 0xd3, 0xf5, 0xc3, 0xfe, 0xc6, 0x58, 0xf0, 0x42, 0x97, 0xe5, 0x55, 0xf8, 0x78, 0x2d, - 0xb8, 0x19, 0x13, 0x76, 0x15, 0xbe, 0xb2, 0xf4, 0xa1, 0xf4, 0x6e, 0x3b, 0x87, 0x77, 0xcd, 0x78, - 0x67, 0x94, 0xa4, 0x8a, 0x8d, 0xf8, 0x2f, 0x13, 0xe9, 0xcd, 0x40, 0x91, 0x86, 0x9a, 0x69, 0xf7, - 0xd2, 0xc1, 0xbe, 0x65, 0x32, 0xc3, 0x59, 0xee, 0xc7, 0xba, 0xa5, 0xce, 0x06, 0x30, 0x95, 0x5d, - 0x94, 0x47, 0xba, 0x85, 0xff, 0x64, 0x00, 0x26, 0xcc, 0xc9, 0x81, 0x16, 0xa0, 0x22, 0x98, 0xa8, - 0xc4, 0x5a, 0x6a, 0x0d, 0x5c, 0x93, 0x08, 0x9c, 0xd2, 0xb0, 0x14, 0x63, 0xac, 0xb8, 0x16, 0x14, - 0x94, 0xa6, 0x18, 0x53, 0x18, 0xac, 0x51, 0x51, 0x4d, 0xf8, 0x4e, 0x18, 0x26, 0x6a, 0x27, 0x50, - 0xf3, 0x66, 0x89, 0x41, 0xb1, 0xc0, 0xd2, 0x1d, 0xe0, 0x2e, 0xfd, 0x98, 0xbe, 0xe9, 0x55, 0x54, - 0x3b, 0xc0, 0x15, 0x1d, 0x89, 0x4d, 0x5a, 0xba, 0xa3, 0x85, 0x31, 0x9b, 0x88, 0x42, 0xdf, 0x4e, - 0x83, 0xac, 0xea, 0xfc, 0x96, 0x9c, 0xc4, 0xa3, 0xcf, 0xc0, 0x23, 0xea, 0x52, 0x1b, 0xe6, 0x5e, - 0x5a, 0x59, 0xe3, 0x90, 0x61, 0x32, 0x3f, 0xb2, 0xdc, 0x9d, 0x0c, 0xf7, 0x2a, 0x8f, 0x5e, 0x83, - 0x09, 0xa1, 0x2b, 0x4b, 0x8e, 0xc3, 0xe6, 0x09, 0xfc, 0x15, 0x03, 0x8b, 0x33, 0xd4, 0xa8, 0x0a, - 0x53, 0x14, 0xc2, 0x94, 0x54, 0xc9, 0x81, 0x5f, 0xce, 0x53, 0x5b, 0xfd, 0x95, 0x0c, 0x1e, 0x77, - 0x94, 0x40, 0x8b, 0x30, 0xc9, 0x95, 0x15, 0x6a, 0x18, 0xb2, 0xef, 0x20, 0xe2, 0x39, 0xd5, 0x42, - 0xb8, 0x61, 0xa2, 0x71, 0x96, 0x1e, 0x5d, 0x84, 0x31, 0x27, 0x6a, 0x6c, 0x79, 0x09, 0x69, 0x24, - 0xed, 0x88, 0x27, 0x9a, 0xd0, 0x42, 0x18, 0x16, 0x35, 0x1c, 0x36, 0x28, 0xed, 0x2f, 0xc0, 0xc9, - 0x2e, 0xc1, 0xe3, 0x74, 0xe2, 0x38, 0x2d, 0x4f, 0xf6, 0x29, 0x13, 0x2e, 0xb5, 0x58, 0x5b, 0x93, - 0xbd, 0xd1, 0xa8, 0xe8, 0xec, 0x64, 0xee, 0x69, 0x2d, 0xef, 0xa5, 0x9a, 0x9d, 0xab, 0x12, 0x81, - 0x53, 0x1a, 0xfb, 0xcf, 0x2a, 0xa0, 0x79, 0x6f, 0x0a, 0x84, 0xc8, 0x5c, 0x84, 0x31, 0x99, 0xca, - 0x55, 0x4b, 0xa1, 0xa8, 0xba, 0x79, 0x49, 0xc3, 0x61, 0x83, 0x92, 0xb6, 0x2d, 0x90, 0x3e, 0xa9, - 0x6c, 0x70, 0x96, 0x72, 0x56, 0xe1, 0x94, 0x06, 0x9d, 0x87, 0x91, 0x98, 0xf8, 0x1b, 0x57, 0xbd, - 0xe0, 0xae, 0x98, 0xd8, 0x4a, 0x32, 0xd7, 0x05, 0x1c, 0x2b, 0x0a, 0xb4, 0x04, 0xe5, 0xb6, 0xe7, - 0x8a, 0xa9, 0x2c, 0xd5, 0x86, 0xf2, 0xcd, 0xb5, 0xea, 0xfe, 0xee, 0xdc, 0x13, 0xbd, 0xf2, 0xda, - 0x52, 0xfb, 0x3c, 0x9e, 0xa7, 0xcb, 0x8f, 0x16, 0xee, 0xe6, 0xa7, 0x1f, 0xea, 0xd3, 0x4f, 0x7f, - 0x01, 0x40, 0xf4, 0x5a, 0xce, 0xe5, 0x72, 0xfa, 0xd5, 0x2e, 0x29, 0x0c, 0xd6, 0xa8, 0xa8, 0x95, - 0xdf, 0x88, 0x88, 0x23, 0x0d, 0x61, 0x1e, 0xd4, 0x3c, 0x72, 0x78, 0x2b, 0x7f, 0x39, 0xcb, 0x0c, - 0x77, 0xf2, 0x47, 0x21, 0x9c, 0x70, 0xe9, 0x42, 0x32, 0x2a, 0xad, 0xf4, 0x1f, 0x49, 0x4d, 0x2b, - 0xac, 0x66, 0x19, 0xe1, 0x4e, 0xde, 0xe8, 0xf3, 0x30, 0x2b, 0x81, 0x9d, 0xd7, 0x56, 0xd9, 0x72, - 0x29, 0x2f, 0x9d, 0xd9, 0xdb, 0x9d, 0x9b, 0xad, 0xf6, 0xa4, 0xc2, 0x07, 0x70, 0x40, 0x6f, 0xc2, - 0x10, 0x3b, 0xd7, 0x89, 0x67, 0x46, 0xd9, 0x8e, 0xf7, 0x52, 0x91, 0x78, 0x7c, 0x3a, 0xeb, 0xe7, - 0xd9, 0xe9, 0x90, 0x88, 0x34, 0x4d, 0x0f, 0xcb, 0x18, 0x10, 0x0b, 0x9e, 0xa8, 0x05, 0xa3, 0x4e, - 0x10, 0x84, 0x89, 0xc3, 0x15, 0xb1, 0xb1, 0x22, 0xba, 0xa4, 0x56, 0xc5, 0x62, 0x5a, 0x96, 0xd7, - 0xa3, 0x82, 0xd7, 0x34, 0x0c, 0xd6, 0xab, 0x40, 0xf7, 0x60, 0x32, 0xbc, 0x47, 0x05, 0xa6, 0x3c, - 0xda, 0x88, 0x67, 0xc6, 0xcd, 0x8e, 0xe5, 0x38, 0x6a, 0x8d, 0xc2, 0x9a, 0x24, 0x33, 0x99, 0xe2, - 0x6c, 0x2d, 0x68, 0xde, 0x70, 0x57, 0x4f, 0xa4, 0xf1, 0xd4, 0xa9, 0xbb, 0x5a, 0xf7, 0x4e, 0xb3, - 0xab, 0xd1, 0x3c, 0x86, 0x92, 0x49, 0x84, 0xc9, 0xcc, 0xd5, 0xe8, 0x14, 0x85, 0x75, 0xba, 0xd9, - 0x8f, 0xc1, 0xa8, 0x36, 0xf0, 0xfd, 0x04, 0xee, 0xce, 0xbe, 0x06, 0x53, 0xd9, 0x01, 0xed, 0x2b, - 0xf0, 0xf7, 0x7f, 0x95, 0x60, 0xb2, 0xcb, 0xb9, 0xd1, 0x5d, 0x8f, 0x05, 0x9f, 0x1b, 0xa2, 0xef, - 0x8a, 0x17, 0xb8, 0x98, 0x61, 0x4c, 0x01, 0x56, 0x2a, 0x20, 0xc0, 0xa4, 0x34, 0x2d, 0xf7, 0x94, - 0xa6, 0x42, 0x68, 0x0d, 0xbc, 0x1f, 0xa1, 0x65, 0xee, 0x13, 0x83, 0x85, 0xf6, 0x89, 0x07, 0x20, - 0xe8, 0x8c, 0xad, 0x66, 0xb8, 0xc0, 0x56, 0xf3, 0xcd, 0x12, 0x4c, 0xa5, 0x41, 0xce, 0x22, 0xbf, - 0xf3, 0xd1, 0x1f, 0x43, 0xac, 0x1b, 0xc7, 0x10, 0x79, 0xe9, 0x9b, 0x33, 0xed, 0xeb, 0x79, 0x24, - 0xf1, 0x66, 0xe6, 0x48, 0xe2, 0xa5, 0x3e, 0xf9, 0x1e, 0x7c, 0x3c, 0xf1, 0xdd, 0x12, 0x9c, 0xca, - 0x16, 0x59, 0xf6, 0x1d, 0xaf, 0x79, 0x0c, 0xe3, 0xf5, 0x19, 0x63, 0xbc, 0x5e, 0xe9, 0xaf, 0x5f, - 0xac, 0x91, 0x3d, 0x07, 0xcd, 0xc9, 0x0c, 0xda, 0xc7, 0x0e, 0xc3, 0xfc, 0xe0, 0x91, 0xfb, 0x7d, - 0x0b, 0x1e, 0xed, 0x5a, 0xee, 0x18, 0x1c, 0xaf, 0x6f, 0x98, 0x8e, 0xd7, 0x17, 0x0f, 0xd1, 0xbb, - 0x1e, 0x9e, 0xd8, 0x5f, 0x2b, 0xf7, 0xe8, 0x15, 0x73, 0x4d, 0xdd, 0x80, 0x51, 0xa7, 0xd1, 0x20, - 0x71, 0x7c, 0x2d, 0x74, 0x55, 0x92, 0xa5, 0xe7, 0xd9, 0xde, 0x92, 0x82, 0xf7, 0x77, 0xe7, 0x66, - 0xb3, 0x2c, 0x52, 0x34, 0xd6, 0x39, 0x98, 0xe9, 0xdf, 0x4a, 0x47, 0x94, 0xfe, 0xed, 0x02, 0xc0, - 0xb6, 0xb2, 0x62, 0xb3, 0x1e, 0x2f, 0xcd, 0xbe, 0xd5, 0xa8, 0xd0, 0x5f, 0x66, 0x1a, 0x21, 0x0f, - 0xd2, 0x18, 0x30, 0xef, 0x4b, 0xe6, 0x7c, 0x3f, 0x3d, 0xe0, 0x83, 0x5f, 0xcb, 0x54, 0xde, 0x41, - 0xc5, 0x12, 0x7d, 0x0a, 0xa6, 0x62, 0x7e, 0xf9, 0x7f, 0xd9, 0x77, 0x62, 0x16, 0xdd, 0x2f, 0xe4, - 0x29, 0xbb, 0x61, 0x59, 0xcf, 0xe0, 0x70, 0x07, 0xb5, 0xfd, 0x9d, 0x32, 0x7c, 0xf0, 0x80, 0x69, - 0x8b, 0x16, 0xcd, 0x53, 0xdb, 0xe7, 0xb2, 0xfe, 0x9f, 0xd9, 0xae, 0x85, 0x0d, 0x87, 0x50, 0xe6, - 0x6b, 0x97, 0xde, 0xf7, 0xd7, 0xfe, 0xba, 0xee, 0xad, 0xe3, 0x71, 0x9b, 0x97, 0x0e, 0xbd, 0x30, - 0x7f, 0x5a, 0x9d, 0xf5, 0x5f, 0xb6, 0xe0, 0x89, 0xae, 0xdd, 0x32, 0xa2, 0x44, 0x16, 0xa0, 0xd2, - 0xa0, 0x40, 0xed, 0x2e, 0x4e, 0x7a, 0x09, 0x4e, 0x22, 0x70, 0x4a, 0x63, 0x04, 0x83, 0x94, 0x72, - 0x83, 0x41, 0x7e, 0xd7, 0x82, 0xe9, 0x6c, 0x23, 0x8e, 0x41, 0x6e, 0xd5, 0x4d, 0xb9, 0x35, 0xdf, - 0xdf, 0xc7, 0xef, 0x21, 0xb2, 0xde, 0x9b, 0x80, 0xd3, 0x1d, 0xbb, 0x1e, 0x1f, 0xc5, 0x9f, 0xb3, - 0xe0, 0xc4, 0x26, 0xd3, 0xde, 0xb5, 0x0b, 0x4f, 0xa2, 0x5f, 0x39, 0xb7, 0xc4, 0x0e, 0xbc, 0x27, - 0xc5, 0x6d, 0x91, 0x0e, 0x12, 0xdc, 0x59, 0x19, 0xfa, 0x9a, 0x05, 0xd3, 0xce, 0xbd, 0xb8, 0xe3, - 0xf5, 0x11, 0x31, 0x91, 0x5e, 0xcb, 0x71, 0x96, 0xe5, 0xbc, 0x5b, 0xb2, 0x34, 0xb3, 0xb7, 0x3b, - 0x37, 0xdd, 0x8d, 0x0a, 0x77, 0xad, 0x95, 0x7e, 0xdf, 0x2d, 0x71, 0x9d, 0xa2, 0xd8, 0xd5, 0xbd, - 0x6e, 0x97, 0x2f, 0xb8, 0x58, 0x93, 0x18, 0xac, 0x38, 0xa2, 0xb7, 0xa1, 0xb2, 0x29, 0xef, 0x38, - 0x65, 0xc5, 0x66, 0x8f, 0x61, 0xee, 0x76, 0x25, 0x8a, 0xc7, 0xee, 0x2b, 0x14, 0x4e, 0x99, 0xa2, - 0xcb, 0x50, 0x0e, 0x36, 0x62, 0x71, 0x9b, 0x38, 0x2f, 0x06, 0xc8, 0x8c, 0xbc, 0xe2, 0x17, 0x30, - 0xaf, 0xaf, 0xd6, 0x31, 0x65, 0x41, 0x39, 0x45, 0x77, 0x5c, 0xe1, 0x25, 0xce, 0xe1, 0x84, 0x97, - 0xaa, 0x9d, 0x9c, 0xf0, 0x52, 0x15, 0x53, 0x16, 0xa8, 0x06, 0x83, 0xec, 0xb2, 0x86, 0x70, 0x01, - 0xe7, 0x5c, 0x39, 0xef, 0xb8, 0x92, 0xc2, 0xb3, 0x14, 0x32, 0x30, 0xe6, 0x8c, 0xd0, 0x3a, 0x0c, - 0x35, 0x58, 0xa2, 0x7d, 0x61, 0x9b, 0xe7, 0x25, 0x63, 0xe8, 0x48, 0xca, 0xcf, 0xcf, 0xbd, 0x38, - 0x1c, 0x0b, 0x5e, 0x8c, 0x2b, 0x69, 0x6d, 0x6d, 0xc4, 0xc2, 0xf8, 0xce, 0xe3, 0xda, 0xf1, 0x64, - 0x82, 0xe0, 0xca, 0xe0, 0x58, 0xf0, 0x42, 0x55, 0x28, 0x6d, 0x34, 0x44, 0xb2, 0xd3, 0x1c, 0xd7, - 0xaf, 0x79, 0x9b, 0x76, 0x69, 0x68, 0x6f, 0x77, 0xae, 0xb4, 0xba, 0x8c, 0x4b, 0x1b, 0x0d, 0xf4, - 0x06, 0x0c, 0x6f, 0xf0, 0xfb, 0x91, 0x22, 0xb1, 0xe9, 0x0b, 0x79, 0x97, 0x38, 0x3b, 0x2e, 0x53, - 0xf2, 0xfb, 0x19, 0x02, 0x81, 0x25, 0x3b, 0x96, 0xf3, 0x4d, 0xdd, 0xf8, 0x14, 0x99, 0x4d, 0xe7, - 0xfb, 0xbb, 0x21, 0x2a, 0x6c, 0x52, 0x05, 0xc5, 0x1a, 0x47, 0x3a, 0xe7, 0x1d, 0xf9, 0x66, 0x08, - 0xcb, 0x6a, 0x9a, 0x3b, 0xe7, 0xbb, 0x3e, 0x31, 0xc2, 0xe7, 0xbc, 0x42, 0xe1, 0x94, 0x29, 0x6a, - 0xc3, 0xf8, 0x76, 0xdc, 0xda, 0x22, 0x72, 0xe9, 0xb3, 0x54, 0xa7, 0xa3, 0x17, 0x3e, 0x91, 0x93, - 0xbf, 0x56, 0x14, 0xf1, 0xa2, 0xa4, 0xed, 0xf8, 0x1d, 0x12, 0x8c, 0x25, 0xd9, 0xba, 0xa5, 0xb3, - 0xc5, 0x66, 0x2d, 0xf4, 0x93, 0xbc, 0xdb, 0x0e, 0xef, 0xec, 0x24, 0x44, 0xa4, 0x42, 0xcd, 0xf9, - 0x24, 0xaf, 0x73, 0xe2, 0xce, 0x4f, 0x22, 0x10, 0x58, 0xb2, 0x53, 0x43, 0xc6, 0xa4, 0xf1, 0x54, - 0xe1, 0x21, 0xeb, 0xe8, 0x43, 0x3a, 0x64, 0x4c, 0xfa, 0xa6, 0x4c, 0x99, 0xd4, 0x6d, 0x6d, 0x85, - 0x49, 0x18, 0x64, 0x64, 0xff, 0x89, 0x22, 0x52, 0xb7, 0xd6, 0xa5, 0x64, 0xa7, 0xd4, 0xed, 0x46, - 0x85, 0xbb, 0xd6, 0x8a, 0x02, 0x98, 0x68, 0x85, 0x51, 0x72, 0x2f, 0x8c, 0xe4, 0x3c, 0x44, 0x85, - 0x6c, 0x44, 0xa3, 0x8c, 0xa8, 0x9b, 0x85, 0xe1, 0x9a, 0x18, 0x9c, 0xe1, 0x6e, 0xff, 0xea, 0x50, - 0xe7, 0xf6, 0xce, 0x14, 0xf8, 0xbf, 0xd9, 0x79, 0x5e, 0xfa, 0xa9, 0xfe, 0xed, 0xd4, 0x07, 0x78, - 0x72, 0xfa, 0x35, 0x0b, 0x4e, 0xb7, 0xba, 0x6e, 0xde, 0x62, 0x83, 0xec, 0xd7, 0xdc, 0xe5, 0x83, - 0xa4, 0xf2, 0x0a, 0x77, 0xc7, 0xe3, 0x1e, 0x75, 0x66, 0x55, 0xde, 0xf2, 0xfb, 0x56, 0x79, 0x6f, - 0xc3, 0x08, 0xd3, 0xd1, 0xd2, 0x8c, 0x24, 0x7d, 0x26, 0xef, 0x60, 0x5b, 0xed, 0xb2, 0x60, 0x81, - 0x15, 0x33, 0x3a, 0x70, 0x8f, 0x67, 0x3b, 0x81, 0x09, 0x43, 0x8b, 0xdc, 0xbb, 0xdc, 0x9e, 0x58, - 0x15, 0x23, 0xf1, 0x78, 0xed, 0x20, 0xe2, 0xfd, 0x3c, 0x02, 0x7c, 0x70, 0x65, 0xa8, 0xda, 0xc5, - 0xa0, 0x19, 0x32, 0x0f, 0x47, 0xf2, 0x8d, 0x9a, 0xe3, 0x55, 0xc4, 0xff, 0x91, 0xd5, 0x45, 0x6f, - 0xe4, 0xc6, 0xd3, 0x27, 0x4c, 0xe3, 0xe9, 0xe9, 0xac, 0xf1, 0xd4, 0xe1, 0x32, 0x31, 0xec, 0xa6, - 0xe2, 0xd9, 0x38, 0x8b, 0xa6, 0x5c, 0xb1, 0x7d, 0x38, 0x9b, 0x27, 0x94, 0x58, 0xc0, 0x94, 0xab, - 0x8e, 0x0a, 0xd3, 0x80, 0x29, 0x77, 0xad, 0x8a, 0x19, 0xa6, 0xe8, 0xad, 0x7d, 0xfb, 0xe7, 0x4b, - 0x50, 0xae, 0x85, 0xee, 0x31, 0xb8, 0x80, 0x2e, 0x19, 0x2e, 0xa0, 0xa7, 0x72, 0x5f, 0x7a, 0xeb, - 0xe9, 0xf0, 0xb9, 0x91, 0x71, 0xf8, 0x7c, 0x38, 0x9f, 0xd5, 0xc1, 0xee, 0x9d, 0xef, 0x95, 0x41, - 0x7f, 0xab, 0x0e, 0xfd, 0xa7, 0xc3, 0xc4, 0xd1, 0x96, 0x8b, 0x3d, 0x5f, 0x27, 0xea, 0x60, 0xf1, - 0x56, 0xf2, 0xf6, 0xdd, 0x4f, 0x6d, 0x38, 0xed, 0x6d, 0xe2, 0x6d, 0x6e, 0x25, 0xc4, 0xcd, 0x76, - 0xec, 0xf8, 0xc2, 0x69, 0xff, 0xd4, 0x82, 0xc9, 0x4c, 0xed, 0xc8, 0xef, 0x76, 0x6d, 0xe7, 0x90, - 0x4e, 0x9d, 0x13, 0xb9, 0xf7, 0x7c, 0xe6, 0x01, 0x94, 0x6f, 0x5e, 0x3a, 0x4e, 0x98, 0x0e, 0xa9, - 0x9c, 0xf7, 0x31, 0xd6, 0x28, 0xd0, 0xcb, 0x30, 0x9a, 0x84, 0xad, 0xd0, 0x0f, 0x37, 0x77, 0xae, - 0x10, 0x99, 0x4f, 0x42, 0x9d, 0x6b, 0xac, 0xa7, 0x28, 0xac, 0xd3, 0xd9, 0xdf, 0x2f, 0x43, 0xf6, - 0xa5, 0xc3, 0xbf, 0x98, 0xa7, 0x3f, 0x3d, 0xf3, 0xf4, 0x0f, 0x2d, 0x98, 0xa2, 0xb5, 0xb3, 0x00, - 0x17, 0x19, 0xf6, 0xaa, 0x9e, 0x06, 0xb0, 0x0e, 0x78, 0x1a, 0xe0, 0x69, 0x2a, 0xed, 0xdc, 0xb0, - 0x9d, 0x08, 0x57, 0x8f, 0x26, 0xc4, 0x28, 0x14, 0x0b, 0xac, 0xa0, 0x23, 0x51, 0x24, 0xee, 0x07, - 0xe9, 0x74, 0x24, 0x8a, 0xb0, 0xc0, 0xca, 0x97, 0x03, 0x06, 0x7a, 0xbc, 0x1c, 0xc0, 0x32, 0x32, - 0x89, 0xa0, 0x0a, 0xa1, 0x56, 0x68, 0x19, 0x99, 0x64, 0xb4, 0x45, 0x4a, 0x63, 0x7f, 0xbb, 0x0c, - 0x63, 0xb5, 0xd0, 0x4d, 0xe3, 0xd9, 0x5f, 0x32, 0xe2, 0xd9, 0xcf, 0x66, 0xe2, 0xd9, 0xa7, 0x74, - 0xda, 0x07, 0x13, 0xce, 0x2e, 0x32, 0x77, 0xb1, 0xb7, 0x2d, 0x0e, 0x19, 0xca, 0x6e, 0x64, 0xee, - 0x52, 0x8c, 0xb0, 0xc9, 0xf7, 0x67, 0x29, 0x84, 0xfd, 0xff, 0x58, 0x30, 0x51, 0x0b, 0x5d, 0x3a, - 0x41, 0x7f, 0x96, 0x66, 0xa3, 0x9e, 0xef, 0x6b, 0xe8, 0x80, 0x7c, 0x5f, 0xff, 0xc2, 0x82, 0xe1, - 0x5a, 0xe8, 0x1e, 0x83, 0x1b, 0x74, 0xd5, 0x74, 0x83, 0x3e, 0x91, 0x2b, 0x79, 0x7b, 0x78, 0x3e, - 0xbf, 0x53, 0x86, 0x71, 0xda, 0xe2, 0x70, 0x53, 0x7e, 0x2f, 0x63, 0x6c, 0xac, 0x02, 0x63, 0x43, - 0x55, 0xc2, 0xd0, 0xf7, 0xc3, 0x7b, 0xd9, 0x6f, 0xb7, 0xca, 0xa0, 0x58, 0x60, 0xd1, 0x79, 0x18, - 0x69, 0x45, 0x64, 0xdb, 0x0b, 0xdb, 0x71, 0xf6, 0xae, 0x61, 0x4d, 0xc0, 0xb1, 0xa2, 0x40, 0x2f, - 0xc1, 0x58, 0xec, 0x05, 0x0d, 0x22, 0x43, 0x2e, 0x06, 0x58, 0xc8, 0x05, 0x4f, 0xad, 0xa8, 0xc1, - 0xb1, 0x41, 0x85, 0x6e, 0x43, 0x85, 0xfd, 0x67, 0x2b, 0xa8, 0xff, 0xd4, 0xff, 0x3c, 0x9f, 0x98, - 0x64, 0x80, 0x53, 0x5e, 0xe8, 0x02, 0x40, 0x22, 0x83, 0x43, 0x62, 0x91, 0x15, 0x45, 0xe9, 0xa5, - 0x2a, 0x6c, 0x24, 0xc6, 0x1a, 0x15, 0x7a, 0x0e, 0x2a, 0x89, 0xe3, 0xf9, 0x57, 0xbd, 0x80, 0xc4, - 0x22, 0xb8, 0x46, 0xa4, 0x49, 0x16, 0x40, 0x9c, 0xe2, 0xe9, 0x7e, 0xcf, 0x6e, 0x3a, 0xf3, 0x67, - 0x45, 0x46, 0x18, 0x35, 0xdb, 0xef, 0xaf, 0x2a, 0x28, 0xd6, 0x28, 0xec, 0x8b, 0x70, 0xaa, 0x16, - 0xba, 0xd4, 0x88, 0x5f, 0x0d, 0xa3, 0x7b, 0x4e, 0xe4, 0xca, 0xef, 0x37, 0x27, 0xb3, 0xf3, 0xd2, - 0x3d, 0x79, 0x90, 0x7b, 0x06, 0x8d, 0x6c, 0xbb, 0x2f, 0xb2, 0x1d, 0xbf, 0xcf, 0x8b, 0x12, 0x3f, - 0x2a, 0x01, 0xaa, 0xb1, 0xf0, 0x15, 0xe3, 0x15, 0x9a, 0x2d, 0x98, 0x88, 0xc9, 0x55, 0x2f, 0x68, - 0xdf, 0x17, 0xac, 0x8a, 0xdd, 0x4c, 0xa9, 0xaf, 0xe8, 0x65, 0xb8, 0x3f, 0xc2, 0x84, 0xe1, 0x0c, - 0x5f, 0x3a, 0x98, 0x51, 0x3b, 0x58, 0x8c, 0x6f, 0xc6, 0x24, 0x12, 0xaf, 0xae, 0xb0, 0xc1, 0xc4, - 0x12, 0x88, 0x53, 0x3c, 0x9d, 0x3c, 0xec, 0xcf, 0xf5, 0x30, 0xc0, 0x61, 0x98, 0xc8, 0xe9, 0xc6, - 0xb2, 0xf0, 0x6b, 0x70, 0x6c, 0x50, 0xa1, 0x55, 0x40, 0x71, 0xbb, 0xd5, 0xf2, 0xd9, 0x89, 0xa0, - 0xe3, 0x5f, 0x8a, 0xc2, 0x76, 0x8b, 0x47, 0x31, 0x8b, 0x04, 0xf6, 0xf5, 0x0e, 0x2c, 0xee, 0x52, - 0x82, 0x0a, 0x8b, 0x8d, 0x98, 0xfd, 0x16, 0xd7, 0x9e, 0xb9, 0x57, 0xb1, 0xce, 0x40, 0x58, 0xe2, - 0xec, 0x2f, 0xb1, 0x0d, 0x8e, 0x3d, 0x87, 0x91, 0xb4, 0x23, 0x82, 0x9a, 0x30, 0xde, 0x62, 0x9b, - 0x58, 0x12, 0x85, 0xbe, 0x4f, 0xa4, 0x7e, 0x79, 0xb8, 0x00, 0x1a, 0x9e, 0x00, 0x5f, 0x67, 0x87, - 0x4d, 0xee, 0xf6, 0x2f, 0x4e, 0x30, 0x59, 0x25, 0x0e, 0x65, 0x87, 0x45, 0xa8, 0xac, 0xd0, 0xe4, - 0x3e, 0x54, 0xe4, 0x61, 0xab, 0x74, 0x1f, 0x10, 0x81, 0xb7, 0x58, 0x72, 0x41, 0x9f, 0x63, 0x81, - 0xe0, 0x5c, 0x40, 0x14, 0x7f, 0xae, 0x8f, 0xd3, 0x1b, 0x41, 0xe0, 0x82, 0x05, 0xd6, 0xd8, 0xa1, - 0xab, 0x30, 0x2e, 0x5e, 0x4f, 0x10, 0x6e, 0x8a, 0xb2, 0x61, 0x62, 0x8f, 0x63, 0x1d, 0xb9, 0x9f, - 0x05, 0x60, 0xb3, 0x30, 0xda, 0x84, 0xc7, 0xb5, 0xd7, 0x81, 0xba, 0x04, 0x7b, 0x71, 0xc9, 0xf3, - 0xc4, 0xde, 0xee, 0xdc, 0xe3, 0xeb, 0x07, 0x11, 0xe2, 0x83, 0xf9, 0xa0, 0x1b, 0x70, 0xca, 0x69, - 0x24, 0xde, 0x36, 0xa9, 0x12, 0xc7, 0xf5, 0xbd, 0x80, 0x98, 0x77, 0xe3, 0x1f, 0xdd, 0xdb, 0x9d, - 0x3b, 0xb5, 0xd8, 0x8d, 0x00, 0x77, 0x2f, 0x87, 0x3e, 0x01, 0x15, 0x37, 0x88, 0xc5, 0x18, 0x0c, - 0x19, 0x8f, 0x61, 0x55, 0xaa, 0xd7, 0xeb, 0xaa, 0xff, 0xe9, 0x1f, 0x9c, 0x16, 0x40, 0xef, 0xf2, - 0xc7, 0xde, 0x95, 0x35, 0xc3, 0x1f, 0x61, 0x7b, 0xa5, 0x90, 0xfd, 0x6c, 0xdc, 0x58, 0xe1, 0x1e, - 0x3c, 0x15, 0x54, 0x69, 0x5c, 0x66, 0x31, 0xaa, 0x40, 0x9f, 0x06, 0x14, 0x93, 0x68, 0xdb, 0x6b, - 0x90, 0xc5, 0x06, 0xcb, 0x47, 0xca, 0x7c, 0x3c, 0x23, 0xc6, 0xed, 0x02, 0x54, 0xef, 0xa0, 0xc0, - 0x5d, 0x4a, 0xa1, 0xcb, 0x54, 0xf2, 0xe8, 0x50, 0x11, 0x03, 0x2b, 0x15, 0xc3, 0x99, 0x2a, 0x69, - 0x45, 0xa4, 0xe1, 0x24, 0xc4, 0x35, 0x39, 0xe2, 0x4c, 0x39, 0xba, 0x2f, 0xa9, 0x94, 0xf3, 0x60, - 0x46, 0x6e, 0x76, 0xa6, 0x9d, 0xa7, 0x76, 0xd6, 0x56, 0x18, 0x27, 0xd7, 0x49, 0x72, 0x2f, 0x8c, - 0xee, 0xb2, 0x93, 0x86, 0x11, 0x2d, 0xb9, 0x5b, 0x8a, 0xc2, 0x3a, 0x1d, 0xd5, 0xa1, 0xd8, 0x11, - 0xd7, 0x5a, 0x95, 0x9d, 0x1f, 0x8c, 0xa4, 0x6b, 0xe7, 0x32, 0x07, 0x63, 0x89, 0x97, 0xa4, 0x6b, - 0xb5, 0x65, 0x76, 0x16, 0x90, 0x21, 0x5d, 0xab, 0x2d, 0x63, 0x89, 0x47, 0x61, 0xe7, 0x93, 0x63, - 0x13, 0x45, 0xce, 0x65, 0x3a, 0x25, 0x79, 0xc1, 0x57, 0xc7, 0xee, 0xc3, 0x94, 0x7a, 0xf6, 0x8c, - 0xe7, 0xdd, 0x8c, 0x67, 0x26, 0x8b, 0x3c, 0x35, 0xdf, 0x35, 0x7d, 0xa7, 0xf2, 0xeb, 0xad, 0x65, - 0x78, 0xe2, 0x8e, 0x5a, 0x8c, 0x1c, 0x0f, 0x53, 0xb9, 0xcf, 0x08, 0x2c, 0x40, 0x25, 0x6e, 0xdf, - 0x71, 0xc3, 0xa6, 0xe3, 0x05, 0xcc, 0x61, 0xaf, 0x3f, 0x9c, 0x2e, 0x11, 0x38, 0xa5, 0x41, 0x35, - 0x18, 0x71, 0x84, 0x09, 0x27, 0x1c, 0xeb, 0x39, 0x77, 0xc0, 0xa5, 0xc1, 0xc7, 0xbd, 0xab, 0xf2, - 0x1f, 0x56, 0x5c, 0xd0, 0xab, 0x30, 0x2e, 0xae, 0x30, 0x91, 0x88, 0xb5, 0xfa, 0xa4, 0x19, 0xee, - 0x5e, 0x97, 0x48, 0x36, 0xc1, 0x4c, 0x5a, 0xb4, 0x09, 0x13, 0x94, 0x4b, 0x2a, 0x00, 0x67, 0xa6, - 0xfb, 0x93, 0xa1, 0x5a, 0xc2, 0x66, 0x9d, 0x0d, 0xce, 0xb0, 0x45, 0x2e, 0x3c, 0xe6, 0xb4, 0x93, - 0xb0, 0x49, 0x57, 0x82, 0xb9, 0x4e, 0xd6, 0xc3, 0xbb, 0x24, 0x98, 0x39, 0xc5, 0x66, 0xe0, 0xd9, - 0xbd, 0xdd, 0xb9, 0xc7, 0x16, 0x0f, 0xa0, 0xc3, 0x07, 0x72, 0x41, 0x6f, 0xc1, 0x68, 0x12, 0xfa, - 0x22, 0x82, 0x38, 0x9e, 0x39, 0x5d, 0x24, 0xf3, 0xcc, 0xba, 0x2a, 0xa0, 0xbb, 0x31, 0x14, 0x13, - 0xac, 0x73, 0x9c, 0xfd, 0x24, 0x9c, 0xe8, 0x10, 0x49, 0x7d, 0x05, 0x59, 0xfe, 0xe7, 0x41, 0xa8, - 0x28, 0x8f, 0x1e, 0x5a, 0x30, 0x9d, 0xb7, 0x8f, 0x66, 0x9d, 0xb7, 0x23, 0x54, 0x81, 0xd2, 0xfd, - 0xb5, 0x9f, 0xef, 0xf2, 0xd0, 0xf5, 0xb3, 0xb9, 0x6b, 0xb0, 0xf8, 0xbd, 0xa7, 0x3e, 0x9e, 0x03, - 0x4f, 0xad, 0xba, 0x81, 0x03, 0xad, 0xba, 0x82, 0x8f, 0xb7, 0x51, 0xfb, 0xad, 0x15, 0xba, 0x6b, - 0xb5, 0xec, 0xdb, 0x44, 0x35, 0x0a, 0xc4, 0x1c, 0xc7, 0xf4, 0x6e, 0xba, 0xa7, 0x32, 0xbd, 0x7b, - 0xf8, 0x90, 0x7a, 0xb7, 0x64, 0x80, 0x53, 0x5e, 0x68, 0x1b, 0x4e, 0x34, 0xcc, 0xa7, 0xa6, 0xd4, - 0x6d, 0xa6, 0xe7, 0xfb, 0x78, 0xea, 0xa9, 0xad, 0xbd, 0x71, 0xb1, 0x9c, 0xe5, 0x87, 0x3b, 0xab, - 0x40, 0xaf, 0xc2, 0xc8, 0xbb, 0x61, 0xcc, 0x8e, 0x15, 0xc4, 0xc6, 0x22, 0x6f, 0x8d, 0x8c, 0xbc, - 0x7e, 0xa3, 0xce, 0xe0, 0xfb, 0xbb, 0x73, 0xa3, 0xb5, 0xd0, 0x95, 0x7f, 0xb1, 0x2a, 0x80, 0xbe, - 0x6c, 0xc1, 0x29, 0x63, 0x9d, 0xa9, 0x96, 0xc3, 0x61, 0x5a, 0xfe, 0xb8, 0xa8, 0xf9, 0xd4, 0x5a, - 0x37, 0x9e, 0xb8, 0x7b, 0x55, 0xf6, 0x6f, 0x73, 0x17, 0xa6, 0x70, 0x6a, 0x90, 0xb8, 0xed, 0x1f, - 0x47, 0xbe, 0xf9, 0x1b, 0x86, 0xbf, 0xe5, 0x01, 0x38, 0xd1, 0xff, 0xa3, 0xc5, 0x9c, 0xe8, 0xeb, - 0xa4, 0xd9, 0xf2, 0x9d, 0xe4, 0x38, 0x62, 0x70, 0x3f, 0x07, 0x23, 0x89, 0xa8, 0xad, 0x58, 0xb2, - 0x7c, 0xad, 0x79, 0xec, 0x70, 0x41, 0x6d, 0x4c, 0x12, 0x8a, 0x15, 0x43, 0xfb, 0xdf, 0xf2, 0xaf, - 0x22, 0x31, 0xc7, 0xe0, 0x29, 0xb8, 0x6e, 0x7a, 0x0a, 0x9e, 0x29, 0xdc, 0x97, 0x1e, 0x1e, 0x83, - 0xef, 0x9b, 0x3d, 0x60, 0xf6, 0xc3, 0x4f, 0xcf, 0x29, 0x8f, 0xfd, 0x2b, 0x16, 0x4c, 0x77, 0x3b, - 0x14, 0xa7, 0x0a, 0x06, 0xb7, 0x5e, 0xd4, 0xf9, 0x97, 0x1a, 0xd5, 0x5b, 0x02, 0x8e, 0x15, 0x45, - 0xe1, 0xec, 0xd5, 0xfd, 0x25, 0x58, 0xba, 0x01, 0xe6, 0xa3, 0x65, 0xe8, 0x35, 0x1e, 0x72, 0xcf, - 0xdb, 0x73, 0xbe, 0xef, 0x70, 0x7b, 0xfb, 0xd7, 0x4b, 0x30, 0xcd, 0x9d, 0xd0, 0x8b, 0xdb, 0xa1, - 0xe7, 0xd6, 0x42, 0x57, 0x5c, 0x40, 0x70, 0x61, 0xac, 0xa5, 0x19, 0x9f, 0xc5, 0x12, 0xb6, 0xe8, - 0xe6, 0x6a, 0xaa, 0xf0, 0xeb, 0x50, 0x6c, 0x70, 0xa5, 0xb5, 0x90, 0x6d, 0xaf, 0xa1, 0x7c, 0x9a, - 0xa5, 0xbe, 0x77, 0x06, 0x55, 0xcb, 0x8a, 0xc6, 0x07, 0x1b, 0x5c, 0x8f, 0xe0, 0xd1, 0x09, 0xfb, - 0x1f, 0x58, 0xf0, 0x48, 0x8f, 0xa4, 0x2e, 0xb4, 0xba, 0x7b, 0xcc, 0xf1, 0x2f, 0x5e, 0xc5, 0x53, - 0xd5, 0xf1, 0xe3, 0x00, 0x2c, 0xb0, 0xe8, 0x0e, 0x00, 0x77, 0xe7, 0xb3, 0x37, 0xd2, 0x4b, 0x45, - 0xa2, 0x86, 0x3a, 0x52, 0x27, 0x68, 0xb7, 0xea, 0xd5, 0xab, 0xe8, 0x1a, 0x57, 0xfb, 0x5b, 0x65, - 0x18, 0xe4, 0x8f, 0x2f, 0xd7, 0x60, 0x78, 0x8b, 0x27, 0x99, 0xed, 0x2f, 0xc7, 0x6d, 0x6a, 0x5c, - 0x70, 0x00, 0x96, 0x6c, 0xd0, 0x35, 0x38, 0x49, 0x77, 0x16, 0xcf, 0xf1, 0xab, 0xc4, 0x77, 0x76, - 0xa4, 0xb5, 0xca, 0x5f, 0x22, 0x90, 0x29, 0xb3, 0x4f, 0xae, 0x75, 0x92, 0xe0, 0x6e, 0xe5, 0xd0, - 0x6b, 0x1d, 0x39, 0xe1, 0x78, 0xf2, 0x5e, 0xa5, 0xa9, 0x1e, 0x9c, 0x17, 0x8e, 0xea, 0xd3, 0xad, - 0x0e, 0xbb, 0x5c, 0x7b, 0xe3, 0xd6, 0xb4, 0xc5, 0x4d, 0x5a, 0x16, 0x5b, 0xd0, 0x66, 0x31, 0x15, - 0xeb, 0x5b, 0x11, 0x89, 0xb7, 0x42, 0xdf, 0x15, 0xcf, 0x33, 0xa6, 0xb1, 0x05, 0x19, 0x3c, 0xee, - 0x28, 0x41, 0xb9, 0x6c, 0x38, 0x9e, 0xdf, 0x8e, 0x48, 0xca, 0x65, 0xc8, 0xe4, 0xb2, 0x9a, 0xc1, - 0xe3, 0x8e, 0x12, 0x74, 0x6e, 0x9d, 0x12, 0xaf, 0x05, 0xca, 0x2b, 0xcc, 0x42, 0x04, 0x7d, 0x06, - 0x86, 0x65, 0x20, 0x7b, 0xa1, 0x4c, 0x1b, 0x22, 0x70, 0x40, 0xbd, 0x3c, 0xa8, 0xbd, 0x4c, 0x25, - 0x42, 0xd8, 0x25, 0xbf, 0xc3, 0xbc, 0x4a, 0xf7, 0x27, 0x16, 0x9c, 0xec, 0x12, 0x90, 0xc5, 0x45, - 0xda, 0xa6, 0x17, 0x27, 0x2a, 0x2f, 0xbe, 0x26, 0xd2, 0x38, 0x1c, 0x2b, 0x0a, 0xba, 0x5a, 0xb8, - 0xd0, 0xcc, 0x0a, 0x4a, 0x11, 0x02, 0x22, 0xb0, 0xfd, 0x09, 0x4a, 0x74, 0x16, 0x06, 0xda, 0x31, - 0x89, 0xe4, 0x13, 0x71, 0x52, 0xce, 0x33, 0x3f, 0x20, 0xc3, 0x50, 0xb5, 0x75, 0x53, 0xb9, 0xe0, - 0x34, 0xb5, 0x95, 0x3b, 0xe1, 0x38, 0xce, 0xfe, 0x7a, 0x19, 0x26, 0x33, 0x81, 0x99, 0xb4, 0x21, - 0xcd, 0x30, 0xf0, 0x92, 0x50, 0x65, 0x3f, 0xe3, 0xaf, 0x52, 0x91, 0xd6, 0xd6, 0x35, 0x01, 0xc7, - 0x8a, 0x02, 0x3d, 0x6d, 0xbe, 0xd8, 0x9f, 0xb6, 0x79, 0xa9, 0x6a, 0x3c, 0xde, 0x59, 0xf4, 0xad, - 0x8e, 0x27, 0x61, 0xa0, 0x15, 0xaa, 0x87, 0x98, 0xd5, 0xf7, 0xc4, 0x4b, 0xd5, 0x5a, 0x18, 0xfa, - 0x98, 0x21, 0xd1, 0x53, 0xa2, 0xf7, 0x99, 0x93, 0x0b, 0xec, 0xb8, 0x61, 0xac, 0x0d, 0xc1, 0x33, - 0x30, 0x7c, 0x97, 0xec, 0x44, 0x5e, 0xb0, 0x99, 0x3d, 0xb7, 0xb9, 0xc2, 0xc1, 0x58, 0xe2, 0xcd, - 0xf7, 0x38, 0x86, 0x8f, 0xf8, 0x3d, 0x8e, 0x91, 0xdc, 0x7d, 0xf0, 0x3b, 0x16, 0x4c, 0xb2, 0x94, - 0xa0, 0xe2, 0x02, 0xbd, 0x17, 0x06, 0xc7, 0xa0, 0x63, 0x3c, 0x09, 0x83, 0x11, 0xad, 0x34, 0x9b, - 0x50, 0x9f, 0xb5, 0x04, 0x73, 0x1c, 0x7a, 0x0c, 0x06, 0x58, 0x13, 0xe8, 0x67, 0x1c, 0xe3, 0x99, - 0xc7, 0xab, 0x4e, 0xe2, 0x60, 0x06, 0x65, 0x77, 0xa1, 0x30, 0x69, 0xf9, 0x1e, 0x6f, 0x74, 0xea, - 0x6e, 0x7d, 0xd8, 0xee, 0x42, 0x75, 0x6d, 0xe4, 0x83, 0xba, 0x0b, 0xd5, 0x9d, 0xf9, 0xc1, 0x7a, - 0xfe, 0xff, 0x2c, 0xc1, 0x99, 0xae, 0xe5, 0xd2, 0x13, 0xe0, 0x55, 0xe3, 0x04, 0xf8, 0x42, 0xe6, - 0x04, 0xd8, 0x3e, 0xb8, 0xf4, 0x83, 0x39, 0x13, 0xee, 0x7e, 0x54, 0x5b, 0x3e, 0xc6, 0xa3, 0xda, - 0x81, 0xa2, 0x2a, 0xce, 0x60, 0x8e, 0x8a, 0xf3, 0xfb, 0x16, 0x3c, 0xda, 0x75, 0xc8, 0x1e, 0xba, - 0xcb, 0x67, 0x5d, 0x5b, 0xd9, 0xc3, 0x3a, 0xf9, 0xe5, 0x72, 0x8f, 0x5e, 0x31, 0x3b, 0xe5, 0x1c, - 0x95, 0x42, 0x0c, 0x19, 0x0b, 0xe5, 0x6d, 0x8c, 0x4b, 0x20, 0x0e, 0xc3, 0x0a, 0x8b, 0x62, 0xed, - 0xf2, 0x16, 0x6f, 0xe4, 0xca, 0x21, 0x17, 0xd4, 0xbc, 0xe9, 0x27, 0xd7, 0xb3, 0x02, 0x64, 0xaf, - 0x74, 0xdd, 0xd6, 0x2c, 0xcf, 0xf2, 0x61, 0x2c, 0xcf, 0xb1, 0xee, 0x56, 0x27, 0x5a, 0x84, 0xc9, - 0xa6, 0x17, 0xb0, 0x67, 0x3c, 0x4d, 0xed, 0x49, 0xdd, 0xa0, 0xbd, 0x66, 0xa2, 0x71, 0x96, 0x7e, - 0xf6, 0x55, 0x18, 0x3f, 0xbc, 0x77, 0xed, 0xc7, 0x65, 0xf8, 0xe0, 0x01, 0x42, 0x81, 0xef, 0x0e, - 0xc6, 0x77, 0xd1, 0x76, 0x87, 0x8e, 0x6f, 0x53, 0x83, 0xe9, 0x8d, 0xb6, 0xef, 0xef, 0xb0, 0xf8, - 0x29, 0xe2, 0x4a, 0x0a, 0xa1, 0xd4, 0xa8, 0x37, 0xbd, 0x57, 0xbb, 0xd0, 0xe0, 0xae, 0x25, 0xd1, - 0xa7, 0x01, 0x85, 0x77, 0x58, 0xd2, 0x5c, 0x37, 0xcd, 0x7a, 0xc0, 0x3e, 0x41, 0x39, 0x5d, 0xaa, - 0x37, 0x3a, 0x28, 0x70, 0x97, 0x52, 0x54, 0x4f, 0x65, 0xcf, 0x81, 0xab, 0x66, 0x65, 0xf4, 0x54, - 0xac, 0x23, 0xb1, 0x49, 0x8b, 0x2e, 0xc1, 0x09, 0x67, 0xdb, 0xf1, 0x78, 0x12, 0x2c, 0xc9, 0x80, - 0x2b, 0xaa, 0xca, 0x7f, 0xb5, 0x98, 0x25, 0xc0, 0x9d, 0x65, 0x50, 0xcb, 0x70, 0x48, 0xf2, 0x74, - 0xf9, 0x9f, 0x38, 0xc4, 0x0c, 0x2e, 0xec, 0xa2, 0xb4, 0xff, 0xbb, 0x45, 0xb7, 0xbe, 0x2e, 0x2f, - 0x3e, 0xd2, 0x11, 0x51, 0x0e, 0x36, 0xed, 0x32, 0x9a, 0x1a, 0x91, 0x65, 0x1d, 0x89, 0x4d, 0x5a, - 0x3e, 0x35, 0xe2, 0x34, 0x9c, 0xdb, 0xd0, 0x36, 0xc5, 0x3d, 0x4e, 0x45, 0x41, 0x35, 0x68, 0xd7, - 0xdb, 0xf6, 0xe2, 0x30, 0x12, 0x0b, 0xa8, 0xcf, 0xe0, 0xde, 0x54, 0x5e, 0x56, 0x39, 0x1b, 0x2c, - 0xf9, 0xd9, 0xdf, 0x28, 0xc1, 0xb8, 0xac, 0xf1, 0xf5, 0x76, 0x98, 0x38, 0xc7, 0xb0, 0xa5, 0xbf, - 0x6e, 0x6c, 0xe9, 0x0b, 0xc5, 0xae, 0xb5, 0xb2, 0xc6, 0xf5, 0xdc, 0xca, 0x3f, 0x93, 0xd9, 0xca, - 0x5f, 0xe8, 0x87, 0xe9, 0xc1, 0x5b, 0xf8, 0xbf, 0xb7, 0xe0, 0x84, 0x41, 0x7f, 0x0c, 0x3b, 0x49, - 0xcd, 0xdc, 0x49, 0x9e, 0xeb, 0xa3, 0x37, 0x3d, 0x76, 0x90, 0x6f, 0x97, 0x32, 0xbd, 0x60, 0x3b, - 0xc7, 0x17, 0x61, 0x60, 0xcb, 0x89, 0xdc, 0x62, 0x19, 0x21, 0x3b, 0x8a, 0xcf, 0x5f, 0x76, 0x22, - 0x97, 0xcb, 0xff, 0xf3, 0xea, 0x3d, 0x2a, 0x27, 0x72, 0x73, 0x6f, 0x39, 0xb0, 0x4a, 0xd1, 0x45, - 0x18, 0x8a, 0x1b, 0x61, 0x4b, 0xc5, 0x81, 0x9e, 0xe5, 0x6f, 0x55, 0x51, 0xc8, 0xfe, 0xee, 0x1c, - 0x32, 0xab, 0xa3, 0x60, 0x2c, 0xe8, 0x67, 0x37, 0xa1, 0xa2, 0xaa, 0x3e, 0xd2, 0x48, 0xf8, 0xff, - 0x51, 0x86, 0x93, 0x5d, 0xe6, 0x0a, 0xfa, 0x92, 0x31, 0x6e, 0xaf, 0xf6, 0x3d, 0xd9, 0xde, 0xe7, - 0xc8, 0x7d, 0x89, 0x59, 0x4a, 0xae, 0x98, 0x1d, 0x87, 0xa8, 0xfe, 0x66, 0x4c, 0xb2, 0xd5, 0x53, - 0x50, 0x7e, 0xf5, 0xb4, 0xda, 0x63, 0x1b, 0x7e, 0x5a, 0x91, 0x6a, 0xe9, 0x91, 0x7e, 0xe7, 0xbf, - 0x36, 0x00, 0xd3, 0xdd, 0xee, 0xcf, 0xa3, 0xaf, 0x5a, 0x99, 0x67, 0x1f, 0x5e, 0xeb, 0xff, 0x12, - 0x3e, 0x7f, 0x0b, 0x42, 0xe4, 0x9c, 0x99, 0x37, 0x1f, 0x82, 0xc8, 0x1d, 0x71, 0x51, 0x3b, 0xbb, - 0x9f, 0x14, 0xf1, 0x27, 0x3c, 0xa4, 0x54, 0xf8, 0xd4, 0x21, 0x9a, 0x22, 0x5e, 0x01, 0x89, 0x33, - 0xf7, 0x93, 0x24, 0x38, 0xff, 0x7e, 0x92, 0x6c, 0xc3, 0xac, 0x07, 0xa3, 0x5a, 0xbf, 0x8e, 0x74, - 0x1a, 0xdc, 0xa5, 0x5b, 0x94, 0xd6, 0xee, 0x23, 0x9d, 0x0a, 0x7f, 0xd7, 0x82, 0x4c, 0xd0, 0x96, - 0x72, 0xcb, 0x58, 0x3d, 0xdd, 0x32, 0x67, 0x61, 0x20, 0x0a, 0x7d, 0x92, 0x7d, 0x92, 0x00, 0x87, - 0x3e, 0xc1, 0x0c, 0xa3, 0x9e, 0xa8, 0x2d, 0xf7, 0x7a, 0xa2, 0x96, 0xda, 0xe9, 0x3e, 0xd9, 0x26, - 0xd2, 0x49, 0xa2, 0xc4, 0xf8, 0x55, 0x0a, 0xc4, 0x1c, 0x67, 0xff, 0x5e, 0x19, 0x86, 0xb8, 0x27, - 0xe2, 0x18, 0xf6, 0xe9, 0x9a, 0x70, 0x0a, 0x14, 0xba, 0x93, 0xce, 0x5b, 0x35, 0x5f, 0x75, 0x12, - 0x87, 0x4f, 0x2e, 0xd5, 0xc7, 0xd4, 0x91, 0x80, 0xe6, 0x8d, 0x51, 0x98, 0xcd, 0xd8, 0xba, 0xc0, - 0x79, 0x68, 0x63, 0xb2, 0x05, 0x10, 0xb3, 0x27, 0x11, 0x29, 0x0f, 0x91, 0x79, 0xf3, 0xa5, 0x42, - 0xed, 0xa8, 0xab, 0x62, 0xbc, 0x35, 0x69, 0xba, 0x3f, 0x85, 0xc0, 0x1a, 0xef, 0xd9, 0x57, 0xa0, - 0xa2, 0x88, 0xf3, 0x8c, 0x80, 0x31, 0x7d, 0x72, 0xfe, 0x25, 0x98, 0xcc, 0xd4, 0xd5, 0x97, 0x0d, - 0xf1, 0x5b, 0x16, 0x4c, 0x66, 0x5e, 0x73, 0x47, 0x5f, 0xb1, 0x60, 0xda, 0xef, 0xe2, 0x88, 0x12, - 0x9f, 0xf9, 0x30, 0x2e, 0x2c, 0x65, 0x3e, 0x74, 0xc3, 0xe2, 0xae, 0xb5, 0x51, 0xb3, 0x92, 0xbf, - 0xf0, 0xea, 0xf8, 0x22, 0x06, 0x76, 0x8c, 0xe7, 0x1c, 0xe6, 0x30, 0xac, 0xb0, 0xf6, 0x4f, 0x2c, - 0x38, 0xd1, 0xf1, 0x60, 0xf8, 0xc3, 0xd2, 0x0d, 0x91, 0x5d, 0xb9, 0xd4, 0x23, 0xbb, 0xb2, 0xde, - 0xcb, 0xf2, 0x81, 0xbd, 0xfc, 0x75, 0x0b, 0xc4, 0x0c, 0x3d, 0x06, 0x0d, 0x70, 0xcd, 0xd4, 0x00, - 0x3f, 0x54, 0x64, 0xd2, 0xf7, 0x50, 0xfd, 0x7e, 0xa9, 0x04, 0x53, 0x9c, 0x20, 0xf5, 0xa9, 0x3f, - 0x2c, 0x1f, 0xa7, 0xbf, 0x57, 0x3f, 0xd4, 0x53, 0x8b, 0xdd, 0x7b, 0x6a, 0x7c, 0xcb, 0x81, 0x03, - 0xbf, 0xe5, 0x9f, 0x59, 0x80, 0xf8, 0x98, 0x64, 0x9f, 0xc7, 0xe5, 0xce, 0x5d, 0xcd, 0xa0, 0x4b, - 0x25, 0x87, 0xc2, 0x60, 0x8d, 0xea, 0x01, 0x77, 0x21, 0x73, 0xa2, 0x51, 0xce, 0x3f, 0xd1, 0xe8, - 0xa3, 0xd7, 0xbf, 0x5d, 0x86, 0x6c, 0x30, 0x1c, 0x7a, 0x1b, 0xc6, 0x1a, 0x4e, 0xcb, 0xb9, 0xe3, - 0xf9, 0x5e, 0xe2, 0x91, 0xb8, 0xd8, 0x91, 0xe9, 0xb2, 0x56, 0x42, 0x1c, 0x24, 0x68, 0x10, 0x6c, - 0x70, 0x44, 0xf3, 0x00, 0xad, 0xc8, 0xdb, 0xf6, 0x7c, 0xb2, 0xc9, 0x74, 0x56, 0x16, 0x4d, 0xcf, - 0x4f, 0xff, 0x24, 0x14, 0x6b, 0x14, 0x5d, 0xa2, 0xaf, 0xcb, 0xc7, 0x11, 0x7d, 0x3d, 0xd0, 0x67, - 0xf4, 0xf5, 0x60, 0xa1, 0xe8, 0x6b, 0x0c, 0xa7, 0xa5, 0xff, 0x9f, 0xfe, 0x5f, 0xf5, 0x7c, 0xc2, - 0x93, 0xcc, 0x8a, 0x68, 0xfb, 0xd9, 0xbd, 0xdd, 0xb9, 0xd3, 0xb8, 0x2b, 0x05, 0xee, 0x51, 0xd2, - 0x6e, 0xc3, 0xc9, 0x3a, 0x89, 0x3c, 0x96, 0xfb, 0xcf, 0x4d, 0xd7, 0xd2, 0xe7, 0xa1, 0x12, 0x65, - 0x96, 0x71, 0x9f, 0x57, 0xaa, 0xb5, 0x6c, 0x51, 0x72, 0xd9, 0xa6, 0x2c, 0xed, 0xbf, 0x51, 0x82, - 0x61, 0x11, 0x06, 0x77, 0x0c, 0xca, 0xc7, 0x15, 0xc3, 0x49, 0xf0, 0x4c, 0x9e, 0xfc, 0x63, 0xcd, - 0xea, 0xe9, 0x1e, 0xa8, 0x67, 0xdc, 0x03, 0xcf, 0x15, 0x63, 0x77, 0xb0, 0x63, 0xe0, 0x9f, 0x96, - 0x61, 0xc2, 0x0c, 0x0b, 0x3c, 0x86, 0x61, 0x79, 0x03, 0x86, 0x63, 0x11, 0xa1, 0x5a, 0x2a, 0x12, - 0x75, 0x95, 0xfd, 0xc4, 0xe9, 0x59, 0xaa, 0x88, 0x49, 0x95, 0xec, 0xba, 0x06, 0xc1, 0x96, 0x8f, - 0x25, 0x08, 0x36, 0x2f, 0x5a, 0x73, 0xe0, 0x41, 0x44, 0x6b, 0xda, 0x3f, 0x60, 0x22, 0x5f, 0x87, - 0x1f, 0xc3, 0x36, 0xfe, 0xba, 0xb9, 0x39, 0x9c, 0x2f, 0x34, 0xef, 0x44, 0xf3, 0x7a, 0x6c, 0xe7, - 0xdf, 0xb5, 0x60, 0x54, 0x10, 0x1e, 0x43, 0x07, 0x3e, 0x6d, 0x76, 0xe0, 0xa9, 0x42, 0x1d, 0xe8, - 0xd1, 0xf2, 0x6f, 0x94, 0x54, 0xcb, 0x6b, 0xe2, 0x49, 0xf3, 0xdc, 0x4c, 0xc7, 0x23, 0xad, 0x28, - 0x4c, 0xc2, 0x46, 0xe8, 0x0b, 0x05, 0xee, 0xb1, 0xf4, 0x72, 0x15, 0x87, 0xef, 0x6b, 0xbf, 0xb1, - 0xa2, 0x66, 0x77, 0x7f, 0xc2, 0x28, 0x11, 0x1b, 0x68, 0xb7, 0x07, 0xd5, 0x5d, 0x80, 0xf4, 0x15, - 0x6b, 0x71, 0x2f, 0xb1, 0xff, 0xa7, 0xda, 0xd3, 0xdb, 0x52, 0x8a, 0x17, 0xd6, 0xf8, 0xca, 0x30, - 0x7c, 0x56, 0xc7, 0xa0, 0x79, 0x06, 0x70, 0x5d, 0xc0, 0xb1, 0xa2, 0xb0, 0x5f, 0x61, 0x92, 0x9d, - 0x0d, 0x50, 0x7f, 0x17, 0x99, 0x7e, 0x71, 0x48, 0x0d, 0x2d, 0x73, 0xec, 0x5d, 0xd7, 0xaf, 0x4b, - 0x15, 0x15, 0x9f, 0xb4, 0x09, 0x7a, 0x24, 0x6c, 0x7a, 0xbb, 0x0a, 0x91, 0x8e, 0x83, 0xa3, 0x57, - 0x0a, 0x4b, 0xe4, 0x3e, 0x8e, 0x8a, 0x58, 0x72, 0x37, 0x96, 0xd1, 0x6a, 0xad, 0x96, 0xcd, 0x4f, - 0xbd, 0x2c, 0x11, 0x38, 0xa5, 0x41, 0x0b, 0xc2, 0xa0, 0x34, 0x5f, 0xbc, 0x97, 0x06, 0xa5, 0x1c, - 0x12, 0xcd, 0xa2, 0x7c, 0x01, 0x46, 0xd5, 0x93, 0x1f, 0x35, 0xfe, 0xd8, 0x42, 0x85, 0xeb, 0x57, - 0x2b, 0x29, 0x18, 0xeb, 0x34, 0x68, 0x0d, 0x4e, 0xba, 0xea, 0xd6, 0x45, 0xad, 0x7d, 0xc7, 0xf7, - 0x1a, 0xb4, 0x28, 0xbf, 0x31, 0xf9, 0xc8, 0xde, 0xee, 0xdc, 0xc9, 0x6a, 0x27, 0x1a, 0x77, 0x2b, - 0x83, 0xd6, 0x61, 0x32, 0xe6, 0x4f, 0x9b, 0xc8, 0xd0, 0x7a, 0x91, 0xb6, 0xf5, 0x59, 0x79, 0x62, - 0x55, 0x37, 0xd1, 0xfb, 0x0c, 0xc4, 0xa5, 0x82, 0x0c, 0xc6, 0xcf, 0xb2, 0x40, 0xaf, 0xc1, 0x84, - 0xaf, 0xbf, 0xdb, 0x58, 0x13, 0x97, 0x4f, 0x54, 0x0c, 0x92, 0xf1, 0xaa, 0x63, 0x0d, 0x67, 0xa8, - 0xd1, 0x1b, 0x30, 0xa3, 0x43, 0x44, 0x26, 0x18, 0x27, 0xd8, 0x24, 0xb1, 0x78, 0x06, 0xe1, 0xb1, - 0xbd, 0xdd, 0xb9, 0x99, 0xab, 0x3d, 0x68, 0x70, 0xcf, 0xd2, 0xe8, 0x22, 0x8c, 0xc9, 0x91, 0xd4, - 0x2e, 0xa2, 0xa4, 0xd1, 0x6f, 0x1a, 0x0e, 0x1b, 0x94, 0xef, 0xef, 0x60, 0xee, 0x8b, 0xb4, 0xb0, - 0xb6, 0x85, 0xa3, 0x77, 0x60, 0x4c, 0x6f, 0x63, 0x76, 0x6f, 0xce, 0x7f, 0x0b, 0x53, 0xa8, 0x02, - 0xaa, 0xe5, 0x3a, 0x0e, 0x1b, 0xbc, 0xed, 0x1b, 0x30, 0x54, 0xdf, 0x89, 0x1b, 0x89, 0x5f, 0x40, - 0xbe, 0x3d, 0x69, 0x74, 0x21, 0x5d, 0x7b, 0xec, 0x5d, 0x1e, 0xd1, 0x23, 0x9b, 0xc0, 0xe4, 0xfa, - 0x72, 0x8d, 0xbf, 0xfa, 0xbf, 0xc8, 0xad, 0x37, 0x2c, 0xa4, 0x9b, 0x75, 0x48, 0xa9, 0xd5, 0x45, - 0x1e, 0xda, 0x7f, 0x6c, 0xc1, 0x20, 0x7b, 0x53, 0x26, 0xef, 0x3d, 0xa2, 0x22, 0x8d, 0x46, 0x2f, - 0xc3, 0x10, 0xd9, 0xd8, 0x20, 0x8d, 0x44, 0x2c, 0x63, 0x19, 0xed, 0x3d, 0xb4, 0xc2, 0xa0, 0x74, - 0x71, 0xb2, 0xca, 0xf8, 0x5f, 0x2c, 0x88, 0xd1, 0xe7, 0xa0, 0x92, 0x78, 0x4d, 0xb2, 0xe8, 0xba, - 0xc4, 0x3d, 0xc4, 0x5d, 0x71, 0x25, 0x2c, 0xd6, 0x25, 0x13, 0x9c, 0xf2, 0xb3, 0xdf, 0x2b, 0x01, - 0xa4, 0x77, 0x2d, 0xf2, 0xba, 0xb9, 0xd4, 0xf1, 0xec, 0xd2, 0xd3, 0x5d, 0x9e, 0x5d, 0x42, 0x29, - 0xc3, 0x2e, 0x8f, 0x2e, 0xa9, 0xa1, 0x2a, 0x17, 0x1a, 0xaa, 0x81, 0x7e, 0x86, 0x6a, 0x19, 0x4e, - 0xa4, 0x77, 0x45, 0xcc, 0x4b, 0x77, 0x2c, 0x09, 0xe3, 0x7a, 0x16, 0x89, 0x3b, 0xe9, 0xed, 0xf7, - 0x2c, 0x10, 0x21, 0x6b, 0x05, 0x66, 0xab, 0x2b, 0x9f, 0x48, 0x31, 0xf2, 0x50, 0x3d, 0x5b, 0x24, - 0x9a, 0x4f, 0x64, 0x9f, 0x52, 0xeb, 0xc7, 0xc8, 0x39, 0x65, 0x70, 0xb5, 0x7f, 0xc3, 0x82, 0x51, - 0x8e, 0xbe, 0xc6, 0x74, 0xea, 0xfc, 0x76, 0xf5, 0x95, 0xe1, 0x93, 0xbd, 0x1e, 0x42, 0x19, 0xab, - 0x4c, 0x8f, 0xfa, 0xeb, 0x21, 0x12, 0x81, 0x53, 0x1a, 0xf4, 0x0c, 0x0c, 0xc7, 0xed, 0x3b, 0x8c, - 0x3c, 0x13, 0xbf, 0x56, 0xe7, 0x60, 0x2c, 0xf1, 0xf6, 0x3f, 0x2f, 0xc1, 0x54, 0x36, 0x7c, 0x11, - 0x61, 0x18, 0xe2, 0x3a, 0x76, 0x56, 0x3d, 0x3b, 0xc8, 0x97, 0xa3, 0x85, 0x3f, 0x02, 0x7f, 0x03, - 0x97, 0xc5, 0x9c, 0x09, 0x4e, 0x68, 0x03, 0x46, 0xdd, 0xf0, 0x5e, 0x70, 0xcf, 0x89, 0xdc, 0xc5, - 0xda, 0x9a, 0xf8, 0x12, 0x39, 0x01, 0x27, 0xd5, 0xb4, 0x80, 0x1e, 0x5c, 0xc9, 0x7c, 0x0b, 0x29, - 0x0a, 0xeb, 0x8c, 0xa9, 0x4d, 0xd9, 0x08, 0x83, 0x0d, 0x6f, 0xf3, 0x9a, 0xd3, 0x2a, 0x76, 0xb4, - 0xba, 0x2c, 0xc9, 0xb5, 0x3a, 0xc6, 0xc5, 0x2d, 0x7b, 0x8e, 0xc0, 0x29, 0x4b, 0xfb, 0x0f, 0x4e, - 0x82, 0x31, 0x17, 0x8c, 0x34, 0x9c, 0xd6, 0x03, 0x4f, 0xc3, 0xf9, 0x26, 0x8c, 0x90, 0x66, 0x2b, - 0xd9, 0xa9, 0x7a, 0x51, 0xb1, 0xa4, 0xca, 0x2b, 0x82, 0xba, 0x93, 0xbb, 0xc4, 0x60, 0xc5, 0xb1, - 0x47, 0x52, 0xd5, 0xf2, 0x43, 0x91, 0x54, 0x75, 0xe0, 0xcf, 0x25, 0xa9, 0xea, 0x1b, 0x30, 0xbc, - 0xe9, 0x25, 0x98, 0xb4, 0x42, 0x91, 0xb6, 0x20, 0x67, 0xf2, 0x5c, 0xe2, 0xc4, 0x9d, 0x99, 0x12, - 0x05, 0x02, 0x4b, 0x76, 0x68, 0x5d, 0x2d, 0xaa, 0xa1, 0x22, 0x7b, 0x79, 0xa7, 0xaf, 0xaf, 0xeb, - 0xb2, 0x12, 0x49, 0x54, 0x87, 0xdf, 0x7f, 0x12, 0x55, 0x95, 0xfa, 0x74, 0xe4, 0x41, 0xa5, 0x3e, - 0x35, 0x52, 0xc8, 0x56, 0x8e, 0x22, 0x85, 0xec, 0x7b, 0x16, 0x9c, 0x6a, 0x75, 0x4b, 0xc0, 0x2c, - 0x92, 0x98, 0x7e, 0xf2, 0x10, 0x29, 0xa9, 0x8d, 0xaa, 0xd9, 0x65, 0xf0, 0xae, 0x64, 0xb8, 0x7b, - 0xc5, 0x32, 0x17, 0xed, 0xe8, 0xfb, 0xcf, 0x45, 0x7b, 0xd4, 0xd9, 0x4e, 0xd3, 0xcc, 0xb4, 0xe3, - 0x47, 0x92, 0x99, 0x76, 0xe2, 0x01, 0x66, 0xa6, 0xd5, 0x72, 0xca, 0x4e, 0x3e, 0xd8, 0x9c, 0xb2, - 0x5b, 0xe6, 0xbe, 0xc4, 0x53, 0x98, 0xbe, 0x5c, 0x78, 0x5f, 0x32, 0x6a, 0x38, 0x78, 0x67, 0xe2, - 0xd9, 0x75, 0x4f, 0xbc, 0xcf, 0xec, 0xba, 0x46, 0x8e, 0x5a, 0x74, 0x14, 0x39, 0x6a, 0xdf, 0xd6, - 0x77, 0xd0, 0x93, 0x45, 0x6a, 0x50, 0x1b, 0x65, 0x67, 0x0d, 0xdd, 0xf6, 0xd0, 0xce, 0x2c, 0xb8, - 0xd3, 0xc7, 0x9d, 0x05, 0xf7, 0xd4, 0x11, 0x66, 0xc1, 0x3d, 0x7d, 0xac, 0x59, 0x70, 0x1f, 0x79, - 0x48, 0xb2, 0xe0, 0xce, 0x1c, 0x65, 0x16, 0x5c, 0x3a, 0xc0, 0x2d, 0x79, 0x55, 0x67, 0xe6, 0xd1, - 0x22, 0x03, 0xdc, 0xf5, 0x66, 0x0f, 0x1f, 0x60, 0x85, 0xc2, 0x29, 0x53, 0xfb, 0xaf, 0xc0, 0x99, - 0x83, 0x27, 0x58, 0xfa, 0xf6, 0x44, 0x2d, 0xf5, 0x6c, 0x65, 0xde, 0x9e, 0x60, 0xca, 0x9b, 0x46, - 0x55, 0x38, 0x4d, 0xe7, 0xb7, 0x2d, 0x78, 0xa4, 0x47, 0x16, 0xbb, 0xc2, 0xf7, 0xdc, 0x5a, 0x30, - 0xd9, 0x32, 0x8b, 0x16, 0xbe, 0x36, 0x6b, 0x64, 0xcd, 0x53, 0xb1, 0xc8, 0x19, 0x04, 0xce, 0xb2, - 0x5f, 0xfa, 0xd0, 0x0f, 0x7f, 0x7c, 0xe6, 0x03, 0x3f, 0xfa, 0xf1, 0x99, 0x0f, 0xfc, 0xd1, 0x8f, - 0xcf, 0x7c, 0xe0, 0xe7, 0xf6, 0xce, 0x58, 0x3f, 0xdc, 0x3b, 0x63, 0xfd, 0x68, 0xef, 0x8c, 0xf5, - 0x27, 0x7b, 0x67, 0xac, 0xf7, 0x7e, 0x72, 0xe6, 0x03, 0x9f, 0x2d, 0x6d, 0xbf, 0xf0, 0xff, 0x03, - 0x00, 0x00, 0xff, 0xff, 0x4c, 0xce, 0x2d, 0xad, 0x70, 0xc5, 0x00, 0x00, + 0x75, 0x98, 0x66, 0x17, 0x5f, 0xfb, 0xf0, 0xdd, 0x87, 0x3b, 0x82, 0x10, 0x79, 0x38, 0x0e, 0x45, + 0xea, 0x48, 0x1e, 0x01, 0xdd, 0x91, 0x14, 0x4f, 0xa2, 0x42, 0x09, 0xc0, 0x02, 0x77, 0xd0, 0x7d, + 0x2d, 0x7b, 0x71, 0x77, 0x14, 0xc5, 0x88, 0x9c, 0xdb, 0x69, 0x00, 0xc3, 0x1b, 0xcc, 0x2c, 0x67, + 0x66, 0x71, 0x07, 0x29, 0xaa, 0xb2, 0x15, 0x95, 0x9c, 0x94, 0x95, 0x84, 0x2e, 0x47, 0x55, 0x29, + 0x27, 0x55, 0x4a, 0xb9, 0x2a, 0x8e, 0xf2, 0x1d, 0x45, 0x65, 0x49, 0xae, 0xc8, 0x49, 0xc5, 0xb1, + 0x1c, 0xb9, 0x2a, 0x71, 0x54, 0xe5, 0x72, 0xec, 0x94, 0x2b, 0xb0, 0x09, 0x55, 0xfc, 0x33, 0x3f, + 0xe2, 0x7f, 0x48, 0x2a, 0x95, 0xea, 0xcf, 0xe9, 0x9e, 0xdd, 0xc5, 0xcc, 0x82, 0x07, 0xf8, 0xa4, + 0xf2, 0xbf, 0xdd, 0xf7, 0x5e, 0xbf, 0xfe, 0x98, 0xee, 0xd7, 0xef, 0xbd, 0x7e, 0xfd, 0x1a, 0xce, + 0xdd, 0xbd, 0x18, 0xcf, 0x79, 0xe1, 0xfc, 0xdd, 0xd6, 0x1d, 0x12, 0x05, 0x24, 0x21, 0xf1, 0x7c, + 0xf3, 0xee, 0xc6, 0xbc, 0xd3, 0xf4, 0xe6, 0xb7, 0xcf, 0xcf, 0x6f, 0x90, 0x80, 0x44, 0x4e, 0x42, + 0xdc, 0xb9, 0x66, 0x14, 0x26, 0x21, 0x7a, 0x8c, 0x53, 0xcf, 0xa5, 0xd4, 0x73, 0xcd, 0xbb, 0x1b, + 0x73, 0x4e, 0xd3, 0x9b, 0xdb, 0x3e, 0x3f, 0xf3, 0xfc, 0x86, 0x97, 0x6c, 0xb6, 0xee, 0xcc, 0x35, + 0xc2, 0xad, 0xf9, 0x8d, 0x70, 0x23, 0x9c, 0x67, 0x85, 0xee, 0xb4, 0xd6, 0xd9, 0x3f, 0xf6, 0x87, + 0xfd, 0xe2, 0xcc, 0x66, 0x5e, 0x14, 0x55, 0x3b, 0x4d, 0x6f, 0xcb, 0x69, 0x6c, 0x7a, 0x01, 0x89, + 0x76, 0x54, 0xe5, 0x11, 0x89, 0xc3, 0x56, 0xd4, 0x20, 0xd9, 0x26, 0x1c, 0x58, 0x2a, 0x9e, 0xdf, + 0x22, 0x89, 0xd3, 0xa1, 0xe1, 0x33, 0xf3, 0xdd, 0x4a, 0x45, 0xad, 0x20, 0xf1, 0xb6, 0xda, 0xab, + 0xf9, 0x78, 0x5e, 0x81, 0xb8, 0xb1, 0x49, 0xb6, 0x9c, 0xb6, 0x72, 0x2f, 0x74, 0x2b, 0xd7, 0x4a, + 0x3c, 0x7f, 0xde, 0x0b, 0x92, 0x38, 0x89, 0x0e, 0xea, 0x53, 0x4c, 0xa2, 0x6d, 0x12, 0xa5, 0x1d, + 0x22, 0xf7, 0x9d, 0xad, 0xa6, 0x4f, 0x3a, 0xf4, 0xc9, 0xfe, 0x43, 0x0b, 0xce, 0x2c, 0xdc, 0xae, + 0x2f, 0xfb, 0x4e, 0x9c, 0x78, 0x8d, 0x45, 0x3f, 0x6c, 0xdc, 0xad, 0x27, 0x61, 0x44, 0x6e, 0x85, + 0x7e, 0x6b, 0x8b, 0xd4, 0xd9, 0xf0, 0xa1, 0x73, 0x30, 0xb4, 0xcd, 0xfe, 0xaf, 0x56, 0xa7, 0xad, + 0x33, 0xd6, 0xd9, 0xca, 0xe2, 0xc4, 0x8f, 0x76, 0x67, 0x3f, 0xb4, 0xb7, 0x3b, 0x3b, 0x74, 0x4b, + 0xc0, 0xb1, 0xa2, 0x40, 0x4f, 0xc3, 0xc0, 0x7a, 0xbc, 0xb6, 0xd3, 0x24, 0xd3, 0x25, 0x46, 0x3b, + 0x26, 0x68, 0x07, 0x56, 0xea, 0x14, 0x8a, 0x05, 0x16, 0xcd, 0x43, 0xa5, 0xe9, 0x44, 0x89, 0x97, + 0x78, 0x61, 0x30, 0x5d, 0x3e, 0x63, 0x9d, 0xed, 0x5f, 0x9c, 0x14, 0xa4, 0x95, 0x9a, 0x44, 0xe0, + 0x94, 0x86, 0x36, 0x23, 0x22, 0x8e, 0x7b, 0x23, 0xf0, 0x77, 0xa6, 0xfb, 0xce, 0x58, 0x67, 0x87, + 0xd2, 0x66, 0x60, 0x01, 0xc7, 0x8a, 0xc2, 0xfe, 0x7e, 0x09, 0x86, 0x16, 0xd6, 0xd7, 0xbd, 0xc0, + 0x4b, 0x76, 0xd0, 0xdb, 0x30, 0x12, 0x84, 0x2e, 0x91, 0xff, 0x59, 0x2f, 0x86, 0x2f, 0x3c, 0x3b, + 0x77, 0xd0, 0x54, 0x9c, 0xbb, 0xae, 0x95, 0x58, 0x9c, 0xd8, 0xdb, 0x9d, 0x1d, 0xd1, 0x21, 0xd8, + 0xe0, 0x88, 0xde, 0x84, 0xe1, 0x66, 0xe8, 0xaa, 0x0a, 0x4a, 0xac, 0x82, 0x67, 0x0e, 0xae, 0xa0, + 0x96, 0x16, 0x58, 0x1c, 0xdf, 0xdb, 0x9d, 0x1d, 0xd6, 0x00, 0x58, 0x67, 0x87, 0x7c, 0x18, 0xa7, + 0x7f, 0x83, 0xc4, 0x53, 0x35, 0x94, 0x59, 0x0d, 0xcf, 0xe7, 0xd7, 0xa0, 0x15, 0x5a, 0x3c, 0xb1, + 0xb7, 0x3b, 0x3b, 0x9e, 0x01, 0xe2, 0x2c, 0x6b, 0xfb, 0x8b, 0x30, 0xb6, 0x90, 0x24, 0x4e, 0x63, + 0x93, 0xb8, 0xfc, 0xfb, 0xa2, 0x17, 0xa1, 0x2f, 0x70, 0xb6, 0x88, 0xf8, 0xfa, 0x67, 0xc4, 0xb0, + 0xf7, 0x5d, 0x77, 0xb6, 0xc8, 0xfe, 0xee, 0xec, 0xc4, 0xcd, 0xc0, 0x7b, 0xb7, 0x25, 0xe6, 0x0c, + 0x85, 0x61, 0x46, 0x8d, 0x2e, 0x00, 0xb8, 0x64, 0xdb, 0x6b, 0x90, 0x9a, 0x93, 0x6c, 0x8a, 0xd9, + 0x80, 0x44, 0x59, 0xa8, 0x2a, 0x0c, 0xd6, 0xa8, 0xec, 0xaf, 0x58, 0x50, 0x59, 0xd8, 0x0e, 0x3d, + 0xb7, 0x16, 0xba, 0x31, 0x6a, 0xc1, 0x78, 0x33, 0x22, 0xeb, 0x24, 0x52, 0xa0, 0x69, 0xeb, 0x4c, + 0xf9, 0xec, 0xf0, 0x85, 0x0b, 0x39, 0xfd, 0x36, 0x0b, 0x2d, 0x07, 0x49, 0xb4, 0xb3, 0xf8, 0x88, + 0xa8, 0x7a, 0x3c, 0x83, 0xc5, 0xd9, 0x3a, 0xec, 0x5f, 0x2a, 0xc1, 0xc9, 0x85, 0x2f, 0xb6, 0x22, + 0x52, 0xf5, 0xe2, 0xbb, 0xd9, 0xa5, 0xe0, 0x7a, 0xf1, 0xdd, 0xeb, 0xe9, 0x60, 0xa8, 0x39, 0x58, + 0x15, 0x70, 0xac, 0x28, 0xd0, 0xf3, 0x30, 0x48, 0x7f, 0xdf, 0xc4, 0xab, 0xa2, 0xf7, 0x27, 0x04, + 0xf1, 0x70, 0xd5, 0x49, 0x9c, 0x2a, 0x47, 0x61, 0x49, 0x83, 0xae, 0xc1, 0x70, 0x83, 0xad, 0xf7, + 0x8d, 0x6b, 0xa1, 0x4b, 0xd8, 0x17, 0xae, 0x2c, 0x3e, 0x47, 0xc9, 0x97, 0x52, 0xf0, 0xfe, 0xee, + 0xec, 0x34, 0x6f, 0x9b, 0x60, 0xa1, 0xe1, 0xb0, 0x5e, 0x1e, 0xd9, 0x6a, 0x21, 0xf6, 0x31, 0x4e, + 0xd0, 0x61, 0x11, 0x9e, 0xd5, 0xd6, 0x54, 0x3f, 0x5b, 0x53, 0x23, 0x5d, 0xd6, 0xd3, 0x3f, 0xb5, + 0xc4, 0x98, 0xac, 0x78, 0xbe, 0x29, 0x1e, 0x2e, 0x00, 0xc4, 0xa4, 0x11, 0x91, 0x44, 0x1b, 0x15, + 0xf5, 0x99, 0xeb, 0x0a, 0x83, 0x35, 0x2a, 0xba, 0xf8, 0xe3, 0x4d, 0x27, 0x62, 0xb3, 0x45, 0x8c, + 0x8d, 0x5a, 0xfc, 0x75, 0x89, 0xc0, 0x29, 0x8d, 0xb1, 0xf8, 0xcb, 0xb9, 0x8b, 0xff, 0xb7, 0x2c, + 0x18, 0x5c, 0xf4, 0x02, 0xd7, 0x0b, 0x36, 0xd0, 0xdb, 0x30, 0x44, 0x25, 0xba, 0xeb, 0x24, 0x8e, + 0x58, 0xf7, 0x1f, 0x93, 0x93, 0x47, 0x17, 0xb0, 0x72, 0xfa, 0xc4, 0x73, 0x94, 0x9a, 0x4e, 0xa2, + 0x1b, 0x77, 0xde, 0x21, 0x8d, 0xe4, 0x1a, 0x49, 0x9c, 0xb4, 0x3b, 0x29, 0x0c, 0x2b, 0xae, 0xe8, + 0x26, 0x0c, 0x24, 0x4e, 0xb4, 0x41, 0x12, 0xb1, 0xec, 0x73, 0x16, 0x25, 0xe7, 0x81, 0xe9, 0x94, + 0x23, 0x41, 0x83, 0xa4, 0x02, 0x72, 0x8d, 0x31, 0xc1, 0x82, 0x99, 0xdd, 0x80, 0x91, 0x25, 0xa7, + 0xe9, 0xdc, 0xf1, 0x7c, 0x2f, 0xf1, 0x48, 0x8c, 0x3e, 0x0a, 0x65, 0xc7, 0x75, 0xd9, 0x02, 0xa8, + 0x2c, 0x9e, 0xdc, 0xdb, 0x9d, 0x2d, 0x2f, 0xb8, 0xee, 0xfe, 0xee, 0x2c, 0x28, 0xaa, 0x1d, 0x4c, + 0x29, 0xd0, 0xb3, 0xd0, 0xe7, 0x46, 0x61, 0x73, 0xba, 0xc4, 0x28, 0x4f, 0xd1, 0x95, 0x5a, 0x8d, + 0xc2, 0x66, 0x86, 0x94, 0xd1, 0xd8, 0x3f, 0x2c, 0x01, 0x5a, 0x22, 0xcd, 0xcd, 0x95, 0xba, 0xf1, + 0x4d, 0xcf, 0xc2, 0xd0, 0x56, 0x18, 0x78, 0x49, 0x18, 0xc5, 0xa2, 0x42, 0x36, 0x2f, 0xae, 0x09, + 0x18, 0x56, 0x58, 0x74, 0x06, 0xfa, 0x9a, 0xe9, 0xf2, 0x1e, 0x91, 0xa2, 0x81, 0x2d, 0x6c, 0x86, + 0xa1, 0x14, 0xad, 0x98, 0x44, 0x62, 0x3e, 0x2b, 0x8a, 0x9b, 0x31, 0x89, 0x30, 0xc3, 0xa4, 0x33, + 0x88, 0xce, 0x2d, 0x31, 0x5b, 0x33, 0x33, 0x88, 0x62, 0xb0, 0x46, 0x85, 0xde, 0x82, 0x0a, 0xff, + 0x87, 0xc9, 0x3a, 0x9b, 0xba, 0xb9, 0x42, 0xe1, 0x6a, 0xd8, 0x70, 0xfc, 0xec, 0xe0, 0x8f, 0xb2, + 0x19, 0x27, 0x19, 0xe1, 0x94, 0xa7, 0x31, 0xe3, 0x06, 0x72, 0x67, 0xdc, 0xdf, 0xb3, 0x00, 0x2d, + 0x79, 0x81, 0x4b, 0xa2, 0x63, 0xd8, 0x3a, 0x7b, 0x5b, 0x0c, 0x7f, 0x4c, 0x9b, 0x16, 0x6e, 0x35, + 0xc3, 0x80, 0x04, 0xc9, 0x52, 0x18, 0xb8, 0x7c, 0x3b, 0xfd, 0x24, 0xf4, 0x25, 0xb4, 0x2a, 0xde, + 0xac, 0xa7, 0xe5, 0x67, 0xa1, 0x15, 0xec, 0xef, 0xce, 0x9e, 0x6a, 0x2f, 0xc1, 0x9a, 0xc0, 0xca, + 0xa0, 0x4f, 0xc0, 0x40, 0x9c, 0x38, 0x49, 0x2b, 0x16, 0x0d, 0x7d, 0x42, 0x36, 0xb4, 0xce, 0xa0, + 0xfb, 0xbb, 0xb3, 0xe3, 0xaa, 0x18, 0x07, 0x61, 0x51, 0x00, 0x3d, 0x03, 0x83, 0x5b, 0x24, 0x8e, + 0x9d, 0x0d, 0x29, 0xe0, 0xc6, 0x45, 0xd9, 0xc1, 0x6b, 0x1c, 0x8c, 0x25, 0x1e, 0x3d, 0x09, 0xfd, + 0x24, 0x8a, 0xc2, 0x48, 0xcc, 0x88, 0x51, 0x41, 0xd8, 0xbf, 0x4c, 0x81, 0x98, 0xe3, 0xec, 0xff, + 0x6e, 0xc1, 0xb8, 0x6a, 0x2b, 0xaf, 0xeb, 0x18, 0x96, 0xbc, 0x0b, 0xd0, 0x90, 0x1d, 0x8c, 0xd9, + 0x42, 0xd3, 0xea, 0xe8, 0x3c, 0xfd, 0xda, 0x07, 0x34, 0xad, 0x43, 0x81, 0x62, 0xac, 0xf1, 0xb5, + 0xff, 0x93, 0x05, 0x27, 0x32, 0x7d, 0xbb, 0xea, 0xc5, 0x09, 0x7a, 0xb3, 0xad, 0x7f, 0x73, 0xc5, + 0xfa, 0x47, 0x4b, 0xb3, 0xde, 0xa9, 0xf9, 0x22, 0x21, 0x5a, 0xdf, 0x30, 0xf4, 0x7b, 0x09, 0xd9, + 0x92, 0xdd, 0x7a, 0xbe, 0x60, 0xb7, 0x78, 0xfb, 0xd2, 0xaf, 0xb4, 0x4a, 0x79, 0x60, 0xce, 0xca, + 0xfe, 0x3f, 0x16, 0x54, 0x96, 0xc2, 0x60, 0xdd, 0xdb, 0xb8, 0xe6, 0x34, 0x8f, 0xe1, 0xfb, 0xd4, + 0xa1, 0x8f, 0x71, 0xe7, 0x5d, 0x38, 0x9f, 0xd7, 0x05, 0xd1, 0xb0, 0x39, 0xba, 0xa7, 0x72, 0x65, + 0x41, 0x89, 0x29, 0x0a, 0xc2, 0x8c, 0xd9, 0xcc, 0xcb, 0x50, 0x51, 0x04, 0x68, 0x02, 0xca, 0x77, + 0x09, 0xd7, 0x24, 0x2b, 0x98, 0xfe, 0x44, 0x53, 0xd0, 0xbf, 0xed, 0xf8, 0x2d, 0xb1, 0x78, 0x31, + 0xff, 0xf3, 0xc9, 0xd2, 0x45, 0xcb, 0xfe, 0x21, 0x5b, 0x81, 0xa2, 0x92, 0xe5, 0x60, 0x5b, 0x08, + 0x87, 0xaf, 0x5a, 0x30, 0xe5, 0x77, 0x10, 0x4a, 0x62, 0x4c, 0x0e, 0x23, 0xce, 0x1e, 0x13, 0xcd, + 0x9e, 0xea, 0x84, 0xc5, 0x1d, 0x6b, 0xa3, 0xb2, 0x3e, 0x6c, 0xd2, 0x09, 0xe7, 0xf8, 0xac, 0xe9, + 0x42, 0x07, 0xb8, 0x21, 0x60, 0x58, 0x61, 0xed, 0x3f, 0xb3, 0x60, 0x4a, 0xf5, 0xe3, 0x0a, 0xd9, + 0xa9, 0x13, 0x9f, 0x34, 0x92, 0x30, 0x7a, 0x58, 0x7a, 0xf2, 0x38, 0xff, 0x26, 0x5c, 0x26, 0x0d, + 0x0b, 0x06, 0xe5, 0x2b, 0x64, 0x87, 0x7f, 0x20, 0xbd, 0xa3, 0xe5, 0x03, 0x3b, 0xfa, 0x6f, 0x2d, + 0x18, 0x55, 0x1d, 0x3d, 0x86, 0x25, 0x77, 0xd5, 0x5c, 0x72, 0x1f, 0x2d, 0x38, 0x5f, 0xbb, 0x2c, + 0xb6, 0xbf, 0x5b, 0xa2, 0x62, 0x43, 0xd0, 0xd4, 0xa2, 0x90, 0x0e, 0x12, 0x95, 0xf8, 0x0f, 0xc9, + 0x57, 0xea, 0xad, 0xb3, 0x57, 0xc8, 0xce, 0x5a, 0x48, 0xb5, 0x89, 0xce, 0x9d, 0x35, 0x3e, 0x6a, + 0xdf, 0x81, 0x1f, 0xf5, 0x77, 0x4b, 0x70, 0x52, 0x0d, 0x8b, 0xb1, 0x4b, 0xff, 0x4c, 0x0e, 0xcc, + 0x79, 0x18, 0x76, 0xc9, 0xba, 0xd3, 0xf2, 0x13, 0x65, 0x4d, 0xf4, 0x73, 0x33, 0xb3, 0x9a, 0x82, + 0xb1, 0x4e, 0xd3, 0xc3, 0x58, 0x7e, 0x73, 0x98, 0xc9, 0xf3, 0xc4, 0xa1, 0xb3, 0x9e, 0x6a, 0x78, + 0x9a, 0x79, 0x38, 0xa2, 0x9b, 0x87, 0xc2, 0x14, 0x7c, 0x12, 0xfa, 0xbd, 0x2d, 0xba, 0xe7, 0x97, + 0xcc, 0xad, 0x7c, 0x95, 0x02, 0x31, 0xc7, 0xa1, 0xa7, 0x60, 0xb0, 0x11, 0x6e, 0x6d, 0x39, 0x81, + 0x3b, 0x5d, 0x66, 0x3a, 0xe7, 0x30, 0x55, 0x0b, 0x96, 0x38, 0x08, 0x4b, 0x1c, 0x7a, 0x0c, 0xfa, + 0x9c, 0x68, 0x23, 0x9e, 0xee, 0x63, 0x34, 0x43, 0xb4, 0xa6, 0x85, 0x68, 0x23, 0xc6, 0x0c, 0x4a, + 0x75, 0xc9, 0x7b, 0x61, 0x74, 0xd7, 0x0b, 0x36, 0xaa, 0x5e, 0xc4, 0x14, 0x43, 0x4d, 0x97, 0xbc, + 0xad, 0x30, 0x58, 0xa3, 0x42, 0x35, 0xe8, 0x6f, 0x86, 0x51, 0x12, 0x4f, 0x0f, 0xb0, 0x81, 0x7f, + 0x2e, 0x77, 0xf9, 0xf1, 0x7e, 0xd7, 0xc2, 0x28, 0x49, 0xbb, 0x42, 0xff, 0xc5, 0x98, 0x33, 0x42, + 0x4b, 0x50, 0x26, 0xc1, 0xf6, 0xf4, 0x20, 0xe3, 0xf7, 0x91, 0x83, 0xf9, 0x2d, 0x07, 0xdb, 0xb7, + 0x9c, 0x28, 0x95, 0x57, 0xcb, 0xc1, 0x36, 0xa6, 0xa5, 0x51, 0x03, 0x2a, 0xd2, 0x85, 0x15, 0x4f, + 0x0f, 0x15, 0x99, 0x8a, 0x58, 0x90, 0x63, 0xf2, 0x6e, 0xcb, 0x8b, 0xc8, 0x16, 0x09, 0x92, 0x38, + 0x35, 0xac, 0x24, 0x36, 0xc6, 0x29, 0x5f, 0xd4, 0x80, 0x11, 0xae, 0x7f, 0x5e, 0x0b, 0x5b, 0x41, + 0x12, 0x4f, 0x57, 0x58, 0x93, 0x73, 0x3c, 0x17, 0xb7, 0xd2, 0x12, 0x8b, 0x53, 0x82, 0xfd, 0x88, + 0x06, 0x8c, 0xb1, 0xc1, 0x14, 0xbd, 0x09, 0xa3, 0xbe, 0xb7, 0x4d, 0x02, 0x12, 0xc7, 0xb5, 0x28, + 0xbc, 0x43, 0xa6, 0x81, 0xf5, 0xe6, 0xc9, 0x3c, 0x2b, 0x3e, 0xbc, 0x43, 0x16, 0x27, 0xf7, 0x76, + 0x67, 0x47, 0xaf, 0xea, 0xa5, 0xb1, 0xc9, 0x0c, 0xbd, 0x05, 0x63, 0x54, 0xd9, 0xf5, 0x52, 0xf6, + 0xc3, 0xc5, 0xd9, 0xa3, 0xbd, 0xdd, 0xd9, 0x31, 0x6c, 0x14, 0xc7, 0x19, 0x76, 0x68, 0x0d, 0x2a, + 0xbe, 0xb7, 0x4e, 0x1a, 0x3b, 0x0d, 0x9f, 0x4c, 0x8f, 0x30, 0xde, 0x39, 0x8b, 0xf3, 0xaa, 0x24, + 0xe7, 0x06, 0x86, 0xfa, 0x8b, 0x53, 0x46, 0xe8, 0x16, 0x9c, 0x4a, 0x48, 0xb4, 0xe5, 0x05, 0x0e, + 0x5d, 0x54, 0x42, 0xfb, 0x65, 0xae, 0x92, 0x51, 0x36, 0x6b, 0x4f, 0x8b, 0x81, 0x3d, 0xb5, 0xd6, + 0x91, 0x0a, 0x77, 0x29, 0x8d, 0x6e, 0xc0, 0x38, 0x5b, 0x4f, 0xb5, 0x96, 0xef, 0xd7, 0x42, 0xdf, + 0x6b, 0xec, 0x4c, 0x8f, 0x31, 0x86, 0x4f, 0x49, 0x07, 0xc8, 0xaa, 0x89, 0xa6, 0x86, 0x61, 0xfa, + 0x0f, 0x67, 0x4b, 0x23, 0x1f, 0xc6, 0x63, 0xd2, 0x68, 0x45, 0x5e, 0xb2, 0x43, 0xe7, 0x3e, 0xb9, + 0x9f, 0x4c, 0x8f, 0x17, 0x31, 0x74, 0xeb, 0x66, 0x21, 0xee, 0x7d, 0xca, 0x00, 0x71, 0x96, 0x35, + 0x15, 0x15, 0x71, 0xe2, 0x7a, 0xc1, 0xf4, 0x04, 0x93, 0x40, 0x6a, 0x7d, 0xd5, 0x29, 0x10, 0x73, + 0x1c, 0xf3, 0x1f, 0xd0, 0x1f, 0x37, 0xa8, 0x94, 0x9e, 0x64, 0x84, 0xa9, 0xff, 0x40, 0x22, 0x70, + 0x4a, 0x43, 0x55, 0x83, 0x24, 0xd9, 0x99, 0x46, 0x8c, 0x54, 0x2d, 0xb5, 0xb5, 0xb5, 0xcf, 0x61, + 0x0a, 0x47, 0xb7, 0x60, 0x90, 0x04, 0xdb, 0x2b, 0x51, 0xb8, 0x35, 0x7d, 0xa2, 0x88, 0x0c, 0x58, + 0xe6, 0xc4, 0x7c, 0xff, 0x48, 0x4d, 0x18, 0x01, 0xc6, 0x92, 0x19, 0xba, 0x0f, 0xd3, 0x1d, 0xbe, + 0x12, 0xff, 0x28, 0x53, 0xec, 0xa3, 0x7c, 0x4a, 0x94, 0x9d, 0x5e, 0xeb, 0x42, 0xb7, 0x7f, 0x00, + 0x0e, 0x77, 0xe5, 0x6e, 0xdf, 0x81, 0x31, 0x25, 0xa8, 0xd8, 0xf7, 0x46, 0xb3, 0xd0, 0x4f, 0x65, + 0xb1, 0x34, 0xe8, 0x2b, 0x74, 0x50, 0xa9, 0x88, 0x8e, 0x31, 0x87, 0xb3, 0x41, 0xf5, 0xbe, 0x48, + 0x16, 0x77, 0x12, 0xc2, 0x0d, 0xbb, 0xb2, 0x36, 0xa8, 0x12, 0x81, 0x53, 0x1a, 0xfb, 0xff, 0x71, + 0x35, 0x29, 0x95, 0x86, 0x05, 0x76, 0x82, 0x73, 0x30, 0xb4, 0x19, 0xc6, 0x09, 0xa5, 0x66, 0x75, + 0xf4, 0xa7, 0x8a, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x02, 0xa3, 0x0d, 0xbd, 0x02, 0xb1, + 0x8d, 0x9d, 0x14, 0x45, 0xcc, 0xda, 0xb1, 0x49, 0x8b, 0x2e, 0xc2, 0x10, 0xf3, 0x72, 0x37, 0x42, + 0x5f, 0x98, 0x90, 0x72, 0x57, 0x1e, 0xaa, 0x09, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x6a, 0x88, + 0xd3, 0x26, 0xac, 0xd6, 0xc4, 0x06, 0xa2, 0x0c, 0xf1, 0xcb, 0x0c, 0x8a, 0x05, 0xd6, 0xfe, 0xd7, + 0x25, 0x6d, 0x94, 0xa9, 0x01, 0x44, 0xd0, 0x1b, 0x30, 0x78, 0xcf, 0xf1, 0x12, 0x2f, 0xd8, 0x10, + 0xda, 0xc3, 0x0b, 0x05, 0x77, 0x13, 0x56, 0xfc, 0x36, 0x2f, 0xca, 0x77, 0x3e, 0xf1, 0x07, 0x4b, + 0x86, 0x94, 0x77, 0xd4, 0x0a, 0x02, 0xca, 0xbb, 0xd4, 0x3b, 0x6f, 0xcc, 0x8b, 0x72, 0xde, 0xe2, + 0x0f, 0x96, 0x0c, 0xd1, 0x3a, 0x80, 0x9c, 0x4b, 0xc4, 0x15, 0xde, 0xe5, 0x8f, 0xf7, 0xc2, 0x7e, + 0x4d, 0x95, 0x5e, 0x1c, 0xa3, 0x7b, 0x6d, 0xfa, 0x1f, 0x6b, 0x9c, 0xed, 0x84, 0x29, 0x61, 0xed, + 0xcd, 0x42, 0x9f, 0xa7, 0x4b, 0xda, 0x89, 0x12, 0xe2, 0x2e, 0x24, 0x59, 0x07, 0xfd, 0xc1, 0x2a, + 0xf6, 0x9a, 0xb7, 0x45, 0xf4, 0xe5, 0x2f, 0x98, 0xe0, 0x94, 0x9f, 0xfd, 0xbd, 0x32, 0x4c, 0x77, + 0x6b, 0x2e, 0x9d, 0x92, 0xe4, 0xbe, 0x97, 0x2c, 0x51, 0x35, 0xc9, 0x32, 0xa7, 0xe4, 0xb2, 0x80, + 0x63, 0x45, 0x41, 0xe7, 0x46, 0xec, 0x6d, 0x48, 0x63, 0xa9, 0x3f, 0x9d, 0x1b, 0x75, 0x06, 0xc5, + 0x02, 0x4b, 0xe9, 0x22, 0xe2, 0xc4, 0xe2, 0x70, 0x43, 0x9b, 0x43, 0x98, 0x41, 0xb1, 0xc0, 0xea, + 0x0e, 0x91, 0xbe, 0x1c, 0x87, 0x88, 0x31, 0x44, 0xfd, 0x0f, 0x76, 0x88, 0xd0, 0x17, 0x00, 0xd6, + 0xbd, 0xc0, 0x8b, 0x37, 0x19, 0xf7, 0x81, 0x9e, 0xb9, 0x2b, 0x25, 0x6b, 0x45, 0x71, 0xc1, 0x1a, + 0x47, 0xf4, 0x12, 0x0c, 0xab, 0xe5, 0xb9, 0x5a, 0x9d, 0x1e, 0x34, 0x1d, 0xe2, 0xa9, 0xac, 0xaa, + 0x62, 0x9d, 0xce, 0x7e, 0x27, 0x3b, 0x5f, 0xc4, 0xaa, 0xd0, 0xc6, 0xd7, 0x2a, 0x3a, 0xbe, 0xa5, + 0x83, 0xc7, 0xd7, 0xfe, 0x6f, 0x65, 0x18, 0x37, 0x2a, 0x6b, 0xc5, 0x05, 0x24, 0xda, 0x6b, 0x74, + 0xc3, 0x72, 0x12, 0x22, 0xd6, 0xe4, 0xb9, 0x5e, 0x16, 0x8d, 0xbe, 0xbd, 0xd1, 0xb5, 0xc0, 0x39, + 0xa1, 0x4d, 0xa8, 0xf8, 0x4e, 0xcc, 0x5c, 0x2a, 0x44, 0xac, 0xc5, 0xde, 0xd8, 0xa6, 0xe6, 0x87, + 0x13, 0x27, 0xda, 0xee, 0xc1, 0x6b, 0x49, 0x99, 0xd3, 0xdd, 0x96, 0x2a, 0x3b, 0xf2, 0x44, 0x4d, + 0x35, 0x87, 0x6a, 0x44, 0x3b, 0x98, 0xe3, 0xd0, 0x45, 0x18, 0x89, 0x08, 0x9b, 0x29, 0x4b, 0x54, + 0x9f, 0x63, 0x53, 0xaf, 0x3f, 0x55, 0xfc, 0xb0, 0x86, 0xc3, 0x06, 0x65, 0xaa, 0xf7, 0x0f, 0x1c, + 0xa0, 0xf7, 0x3f, 0x03, 0x83, 0xec, 0x87, 0x9a, 0x15, 0xea, 0x0b, 0xad, 0x72, 0x30, 0x96, 0xf8, + 0xec, 0x24, 0x1a, 0x2a, 0x38, 0x89, 0x9e, 0x85, 0xb1, 0xaa, 0x43, 0xb6, 0xc2, 0x60, 0x39, 0x70, + 0x9b, 0xa1, 0x17, 0x24, 0x68, 0x1a, 0xfa, 0xd8, 0x7e, 0xc2, 0xd7, 0x7b, 0x1f, 0xe5, 0x80, 0xfb, + 0xa8, 0xee, 0x6e, 0xff, 0x71, 0x09, 0x46, 0xab, 0xc4, 0x27, 0x09, 0xe1, 0x76, 0x4f, 0x8c, 0x56, + 0x00, 0x6d, 0x44, 0x4e, 0x83, 0xd4, 0x48, 0xe4, 0x85, 0x6e, 0x9d, 0x34, 0xc2, 0x80, 0x1d, 0x44, + 0xd1, 0x0d, 0xf2, 0xd4, 0xde, 0xee, 0x2c, 0xba, 0xd4, 0x86, 0xc5, 0x1d, 0x4a, 0x20, 0x17, 0x46, + 0x9b, 0x11, 0x31, 0xfc, 0x86, 0x56, 0xbe, 0xaa, 0x51, 0xd3, 0x8b, 0x70, 0x6d, 0xd8, 0x00, 0x61, + 0x93, 0x29, 0xfa, 0x0c, 0x4c, 0x84, 0x51, 0x73, 0xd3, 0x09, 0xaa, 0xa4, 0x49, 0x02, 0x97, 0x9a, + 0x00, 0xc2, 0xdb, 0x31, 0xb5, 0xb7, 0x3b, 0x3b, 0x71, 0x23, 0x83, 0xc3, 0x6d, 0xd4, 0xe8, 0x0d, + 0x98, 0x6c, 0x46, 0x61, 0xd3, 0xd9, 0x60, 0x53, 0x46, 0x68, 0x2b, 0x5c, 0x36, 0x9d, 0xdb, 0xdb, + 0x9d, 0x9d, 0xac, 0x65, 0x91, 0xfb, 0xbb, 0xb3, 0x27, 0xd8, 0x90, 0x51, 0x48, 0x8a, 0xc4, 0xed, + 0x6c, 0xec, 0x77, 0xe1, 0x64, 0x35, 0xbc, 0x17, 0xdc, 0x73, 0x22, 0x77, 0xa1, 0xb6, 0xaa, 0x39, + 0x27, 0x5e, 0x97, 0xc6, 0x2f, 0x3f, 0xe0, 0xcb, 0xd9, 0xd9, 0x34, 0x1e, 0xdc, 0xec, 0x58, 0xf1, + 0x7c, 0xd2, 0xc5, 0x1d, 0xf2, 0xcf, 0x4a, 0x46, 0x9d, 0x29, 0xbd, 0x3a, 0xbb, 0xb0, 0xba, 0x9e, + 0x5d, 0x7c, 0x1e, 0x86, 0xd6, 0x3d, 0xe2, 0xbb, 0x98, 0xac, 0x8b, 0xaf, 0x75, 0xbe, 0xc8, 0xe1, + 0xce, 0x0a, 0x2d, 0x23, 0xbd, 0x63, 0xdc, 0x88, 0x5e, 0x11, 0x6c, 0xb0, 0x62, 0x88, 0x5a, 0x30, + 0x21, 0xed, 0x30, 0x89, 0x15, 0x8b, 0xfd, 0x85, 0x62, 0x66, 0x9e, 0x59, 0x0d, 0xfb, 0xbc, 0x38, + 0xc3, 0x10, 0xb7, 0x55, 0x41, 0xed, 0xe7, 0x2d, 0xba, 0xd5, 0xf5, 0xb1, 0xa9, 0xcf, 0xec, 0x67, + 0xe6, 0x0a, 0x60, 0x50, 0xfb, 0xd7, 0x2c, 0x78, 0xa4, 0x6d, 0xb4, 0x84, 0x9f, 0xe4, 0xc8, 0xbe, + 0x51, 0xd6, 0x59, 0x51, 0xca, 0x77, 0x56, 0xd8, 0x37, 0x60, 0x6a, 0x79, 0xab, 0x99, 0xec, 0x54, + 0x3d, 0xf3, 0xc8, 0xe5, 0x65, 0x18, 0xd8, 0x22, 0xae, 0xd7, 0xda, 0x12, 0x9f, 0x75, 0x56, 0xee, + 0x0b, 0xd7, 0x18, 0x74, 0x7f, 0x77, 0x76, 0xb4, 0x9e, 0x84, 0x91, 0xb3, 0x41, 0x38, 0x00, 0x0b, + 0x72, 0xfb, 0x7d, 0x0b, 0xc6, 0xa5, 0x7c, 0x58, 0x70, 0xdd, 0x88, 0xc4, 0x31, 0x9a, 0x81, 0x92, + 0xd7, 0x14, 0x8c, 0x40, 0x30, 0x2a, 0xad, 0xd6, 0x70, 0xc9, 0x6b, 0xa2, 0x37, 0xa0, 0xc2, 0x4f, + 0xea, 0xd2, 0xc9, 0xd1, 0xe3, 0xc9, 0x1f, 0xb3, 0x0d, 0xd7, 0x24, 0x0f, 0x9c, 0xb2, 0x93, 0x5a, + 0x32, 0xdb, 0x79, 0xca, 0xe6, 0xb9, 0xd1, 0x65, 0x01, 0xc7, 0x8a, 0x02, 0x9d, 0x85, 0xa1, 0x20, + 0x74, 0xf9, 0x61, 0x2a, 0x5f, 0xa7, 0x6c, 0xca, 0x5d, 0x17, 0x30, 0xac, 0xb0, 0xf6, 0xd7, 0x2d, + 0x18, 0x91, 0x7d, 0x2c, 0xa8, 0xb0, 0xd3, 0x45, 0x92, 0x2a, 0xeb, 0xe9, 0x22, 0xa1, 0x0a, 0x37, + 0xc3, 0x18, 0x7a, 0x76, 0xb9, 0x17, 0x3d, 0xdb, 0xfe, 0x8d, 0x12, 0x8c, 0xc9, 0xe6, 0xd4, 0x5b, + 0x77, 0x62, 0x42, 0xd5, 0x90, 0x8a, 0xc3, 0x07, 0x9f, 0xc8, 0x79, 0xf6, 0x7c, 0x9e, 0x2d, 0x66, + 0x7c, 0xb3, 0x54, 0xcd, 0x59, 0x90, 0x7c, 0x70, 0xca, 0x12, 0x6d, 0xc3, 0x64, 0x10, 0x26, 0x6c, + 0x7b, 0x53, 0xf8, 0x62, 0x27, 0x1d, 0xd9, 0x7a, 0x1e, 0x15, 0xf5, 0x4c, 0x5e, 0xcf, 0xf2, 0xc3, + 0xed, 0x55, 0xa0, 0x1b, 0xd2, 0xc7, 0x54, 0x66, 0x75, 0x3d, 0x5b, 0xac, 0xae, 0xee, 0x2e, 0x26, + 0xfb, 0x77, 0x2c, 0xa8, 0x48, 0xb2, 0xe3, 0x38, 0xf2, 0xba, 0x0d, 0x83, 0x31, 0xfb, 0x44, 0x72, + 0xb8, 0xce, 0x15, 0xeb, 0x02, 0xff, 0xae, 0xe9, 0x9e, 0xce, 0xff, 0xc7, 0x58, 0x72, 0x63, 0xce, + 0x76, 0xd5, 0x91, 0x87, 0xce, 0xd9, 0xae, 0x5a, 0xd6, 0xfd, 0x64, 0x6b, 0xd4, 0xf0, 0x06, 0x50, + 0xc5, 0xb4, 0x19, 0x91, 0x75, 0xef, 0x7e, 0x56, 0x31, 0xad, 0x31, 0x28, 0x16, 0x58, 0xb4, 0x0e, + 0x23, 0x0d, 0xe9, 0x8e, 0x4e, 0x45, 0xc8, 0xc7, 0x0a, 0xfa, 0xfe, 0xd5, 0x31, 0x12, 0x0f, 0x4d, + 0x5a, 0xd2, 0x38, 0x61, 0x83, 0x2f, 0x95, 0x53, 0xe9, 0x49, 0x79, 0xb9, 0xa0, 0xe3, 0x26, 0x22, + 0x49, 0x5a, 0x43, 0xd7, 0x43, 0x72, 0xfb, 0x5b, 0x16, 0x0c, 0x70, 0xff, 0x65, 0x31, 0x27, 0xb0, + 0x76, 0x40, 0x96, 0x8e, 0xe7, 0x2d, 0x0a, 0x14, 0xe7, 0x65, 0xe8, 0x36, 0x54, 0xd8, 0x0f, 0xe6, + 0x8b, 0x29, 0x17, 0x89, 0xd3, 0xe2, 0xf5, 0xeb, 0x4d, 0xbd, 0x25, 0x19, 0xe0, 0x94, 0x97, 0xfd, + 0x83, 0x32, 0x15, 0x7d, 0x29, 0xa9, 0xb1, 0xb7, 0x5b, 0xc7, 0xb1, 0xb7, 0x97, 0x8e, 0x7e, 0x6f, + 0x7f, 0x17, 0xc6, 0x1b, 0xda, 0x01, 0x5d, 0xfa, 0xc5, 0x2f, 0x14, 0x9c, 0x56, 0xda, 0xa9, 0x1e, + 0xf7, 0xd7, 0x2d, 0x99, 0xec, 0x70, 0x96, 0x3f, 0x22, 0x30, 0xc2, 0xe7, 0x83, 0xa8, 0xaf, 0x8f, + 0xd5, 0x37, 0x5f, 0x64, 0x86, 0xe9, 0x95, 0xb1, 0x59, 0x5c, 0xd7, 0x18, 0x61, 0x83, 0xad, 0xfd, + 0x2b, 0xfd, 0xd0, 0xbf, 0xbc, 0x4d, 0x82, 0xe4, 0x18, 0x44, 0xdd, 0x16, 0x8c, 0x79, 0xc1, 0x76, + 0xe8, 0x6f, 0x13, 0x97, 0xe3, 0x0f, 0xb7, 0xbd, 0x9f, 0x12, 0x95, 0x8c, 0xad, 0x1a, 0xcc, 0x70, + 0x86, 0xf9, 0x51, 0x78, 0x0a, 0x5e, 0x83, 0x01, 0x3e, 0x33, 0x84, 0x9b, 0x20, 0xc7, 0x9f, 0xcf, + 0x06, 0x56, 0xac, 0xa0, 0xd4, 0x9f, 0xc1, 0x8f, 0x12, 0x04, 0x23, 0xf4, 0x0e, 0x8c, 0xad, 0x7b, + 0x51, 0x9c, 0x50, 0x63, 0x3f, 0x4e, 0x9c, 0xad, 0xe6, 0x21, 0x7c, 0x04, 0x6a, 0x44, 0x56, 0x0c, + 0x4e, 0x38, 0xc3, 0x19, 0x6d, 0xc0, 0x28, 0x35, 0x51, 0xd3, 0xaa, 0x06, 0x7b, 0xae, 0x4a, 0xb9, + 0x08, 0xaf, 0xea, 0x8c, 0xb0, 0xc9, 0x97, 0x8a, 0xa4, 0x06, 0x33, 0x69, 0x87, 0x98, 0x76, 0xa3, + 0x44, 0x12, 0xb7, 0x65, 0x39, 0x8e, 0x4a, 0x36, 0x16, 0x29, 0x53, 0x31, 0x25, 0x5b, 0x1a, 0x0f, + 0x63, 0x7f, 0x87, 0xee, 0xc5, 0x74, 0x0c, 0x8f, 0x61, 0xfb, 0xba, 0x6c, 0x6e, 0x5f, 0x4f, 0x16, + 0xf8, 0xb2, 0x5d, 0xb6, 0xae, 0xb7, 0x61, 0x58, 0xfb, 0xf0, 0x68, 0x1e, 0x2a, 0x0d, 0x19, 0xcc, + 0x21, 0xa4, 0xb8, 0x52, 0xa5, 0x54, 0x94, 0x07, 0x4e, 0x69, 0xe8, 0xb8, 0x50, 0x15, 0x34, 0x1b, + 0xfa, 0x45, 0x15, 0x54, 0xcc, 0x30, 0xf6, 0x0b, 0x00, 0xcb, 0xf7, 0x49, 0x63, 0x81, 0x9b, 0x78, + 0xda, 0xf9, 0x9e, 0xd5, 0xfd, 0x7c, 0xcf, 0xfe, 0xb6, 0x05, 0x63, 0x2b, 0x4b, 0x86, 0x4e, 0x3f, + 0x07, 0xc0, 0x75, 0xe3, 0xdb, 0xb7, 0xaf, 0x4b, 0xff, 0x35, 0x77, 0x32, 0x2a, 0x28, 0xd6, 0x28, + 0xd0, 0xa3, 0x50, 0xf6, 0x5b, 0x81, 0x50, 0x59, 0x07, 0xf7, 0x76, 0x67, 0xcb, 0x57, 0x5b, 0x01, + 0xa6, 0x30, 0x2d, 0xc6, 0xaa, 0x5c, 0x38, 0xc6, 0x2a, 0x3f, 0xda, 0xf8, 0x1b, 0x65, 0x98, 0x58, + 0xf1, 0xc9, 0x7d, 0xa3, 0xd5, 0x4f, 0xc3, 0x80, 0x1b, 0x79, 0xdb, 0x24, 0xca, 0x2a, 0x02, 0x55, + 0x06, 0xc5, 0x02, 0x5b, 0x38, 0xec, 0xeb, 0xad, 0xf6, 0x8d, 0xfc, 0xe8, 0x42, 0xde, 0x72, 0xfb, + 0x8c, 0xd6, 0x61, 0x90, 0x9f, 0x07, 0xc7, 0xd3, 0xfd, 0x6c, 0x2a, 0xbe, 0x72, 0x70, 0x63, 0xb2, + 0xe3, 0x33, 0x27, 0xfc, 0x2b, 0x3c, 0xe0, 0x46, 0xc9, 0x32, 0x01, 0xc5, 0x92, 0xf9, 0xcc, 0x27, + 0x61, 0x44, 0xa7, 0xec, 0x29, 0xf2, 0xe6, 0xaf, 0x5b, 0x70, 0x62, 0xc5, 0x0f, 0x1b, 0x77, 0x33, + 0x71, 0x79, 0x2f, 0xc1, 0x30, 0x5d, 0x4c, 0xb1, 0x11, 0xb4, 0x6a, 0x44, 0xe7, 0x0a, 0x14, 0xd6, + 0xe9, 0xb4, 0x62, 0x37, 0x6f, 0xae, 0x56, 0x3b, 0x05, 0xf5, 0x0a, 0x14, 0xd6, 0xe9, 0xec, 0xdf, + 0xb3, 0xe0, 0xf1, 0x4b, 0x4b, 0xcb, 0x35, 0x12, 0xc5, 0x5e, 0x9c, 0x90, 0x20, 0x69, 0x8b, 0x2b, + 0xa6, 0x3a, 0xa3, 0xab, 0x35, 0x25, 0xd5, 0x19, 0xab, 0xac, 0x15, 0x02, 0xfb, 0xb0, 0x04, 0xd7, + 0x7f, 0xcb, 0x82, 0x13, 0x97, 0xbc, 0x04, 0x93, 0x66, 0x98, 0x0d, 0x05, 0x8e, 0x48, 0x33, 0x8c, + 0xbd, 0x24, 0x8c, 0x76, 0xb2, 0xa1, 0xc0, 0x58, 0x61, 0xb0, 0x46, 0xc5, 0x6b, 0xde, 0xf6, 0x62, + 0xda, 0xd2, 0x92, 0x69, 0xea, 0x62, 0x01, 0xc7, 0x8a, 0x82, 0x76, 0xcc, 0xf5, 0x22, 0xa6, 0x32, + 0xec, 0x88, 0x15, 0xac, 0x3a, 0x56, 0x95, 0x08, 0x9c, 0xd2, 0xd8, 0xff, 0xc0, 0x82, 0x93, 0x97, + 0xfc, 0x56, 0x9c, 0x90, 0x68, 0x3d, 0x36, 0x1a, 0xfb, 0x02, 0x54, 0x88, 0x54, 0xee, 0x45, 0x5b, + 0xd5, 0xa6, 0xa1, 0xb4, 0x7e, 0x1e, 0x87, 0xac, 0xe8, 0x0a, 0x84, 0xbb, 0xf6, 0x16, 0x9c, 0xf9, + 0x9b, 0x25, 0x18, 0xbd, 0xbc, 0xb6, 0x56, 0xbb, 0x44, 0x12, 0x21, 0x25, 0xf3, 0x9d, 0x52, 0x58, + 0xb3, 0xc8, 0x0f, 0x52, 0x7e, 0x5a, 0x89, 0xe7, 0xcf, 0xf1, 0xeb, 0x22, 0x73, 0xab, 0x41, 0x72, + 0x23, 0xaa, 0x27, 0x91, 0x17, 0x6c, 0x74, 0xb4, 0xe1, 0xa5, 0x2c, 0x2f, 0x77, 0x93, 0xe5, 0xe8, + 0x05, 0x18, 0x60, 0xf7, 0x55, 0xa4, 0xf2, 0xf1, 0x61, 0xa5, 0x27, 0x30, 0xe8, 0xfe, 0xee, 0x6c, + 0xe5, 0x26, 0x5e, 0xe5, 0x7f, 0xb0, 0x20, 0x45, 0x6f, 0xc1, 0xf0, 0x66, 0x92, 0x34, 0x2f, 0x13, + 0xc7, 0x25, 0x91, 0x94, 0x13, 0x67, 0x0f, 0x96, 0x13, 0x74, 0x38, 0x78, 0x81, 0x74, 0x69, 0xa5, + 0xb0, 0x18, 0xeb, 0x1c, 0xed, 0x3a, 0x40, 0x8a, 0x7b, 0x40, 0x36, 0x88, 0xfd, 0xf3, 0x25, 0x18, + 0xbc, 0xec, 0x04, 0xae, 0x4f, 0x22, 0xb4, 0x02, 0x7d, 0xe4, 0x3e, 0x69, 0x88, 0x8d, 0x3c, 0xa7, + 0xe9, 0xe9, 0x66, 0xc7, 0xfd, 0x6a, 0xf4, 0x3f, 0x66, 0xe5, 0x11, 0x86, 0x41, 0xda, 0xee, 0x4b, + 0x2a, 0x4a, 0xfc, 0xb9, 0xfc, 0x51, 0x50, 0x93, 0x82, 0xef, 0x94, 0x02, 0x84, 0x25, 0x23, 0xe6, + 0x81, 0x6a, 0x34, 0xeb, 0x54, 0xbc, 0x25, 0xc5, 0x2c, 0xbb, 0xb5, 0xa5, 0x1a, 0x27, 0x17, 0x7c, + 0xb9, 0x07, 0x4a, 0x02, 0x71, 0xca, 0xce, 0xbe, 0x08, 0x53, 0xec, 0x3c, 0xd6, 0x49, 0x36, 0x8d, + 0x55, 0x93, 0x3b, 0x3d, 0xed, 0x1f, 0x95, 0x60, 0x72, 0xb5, 0xbe, 0x54, 0x37, 0x7d, 0x87, 0x17, + 0x61, 0x84, 0x6f, 0xd0, 0x74, 0xd2, 0x39, 0xbe, 0x28, 0xaf, 0xce, 0x10, 0xd6, 0x34, 0x1c, 0x36, + 0x28, 0xd1, 0xe3, 0x50, 0xf6, 0xde, 0x0d, 0xb2, 0x51, 0x7d, 0xab, 0xaf, 0x5d, 0xc7, 0x14, 0x4e, + 0xd1, 0x74, 0xaf, 0xe7, 0x42, 0x4e, 0xa1, 0xd5, 0x7e, 0xff, 0x2a, 0x8c, 0x79, 0x71, 0x23, 0xf6, + 0x56, 0x03, 0x2a, 0x01, 0x9c, 0x86, 0x9c, 0xbe, 0xa9, 0x72, 0x4e, 0x9b, 0xaa, 0xb0, 0x38, 0x43, + 0xad, 0x49, 0xdc, 0xfe, 0xc2, 0xfa, 0x42, 0x6e, 0xb8, 0x38, 0x55, 0x85, 0x9a, 0xac, 0x77, 0x31, + 0x8b, 0x11, 0x12, 0xaa, 0x10, 0xef, 0x70, 0x8c, 0x25, 0xce, 0x7e, 0x07, 0x2a, 0x2a, 0xcc, 0x4b, + 0x46, 0x37, 0x5a, 0x5d, 0xa2, 0x1b, 0xf3, 0x25, 0x93, 0x74, 0xfc, 0x96, 0x3b, 0x3a, 0x7e, 0xff, + 0x85, 0x05, 0x69, 0x9c, 0x0a, 0xc2, 0x50, 0x69, 0x86, 0xec, 0x90, 0x28, 0x92, 0xa7, 0xb1, 0x4f, + 0xe5, 0x4c, 0x58, 0xbe, 0x60, 0xf8, 0x94, 0xaa, 0xc9, 0xb2, 0x38, 0x65, 0x83, 0xae, 0xc2, 0x60, + 0x33, 0x22, 0xf5, 0x84, 0x5d, 0x4d, 0xe8, 0x81, 0x23, 0x1f, 0x1b, 0x5e, 0x12, 0x4b, 0x16, 0xf6, + 0xbf, 0xb3, 0x00, 0xae, 0x7a, 0x5b, 0x5e, 0x82, 0x9d, 0x60, 0x83, 0x1c, 0x83, 0x55, 0x78, 0x1d, + 0xfa, 0xe2, 0x26, 0x69, 0x14, 0x3b, 0xe6, 0x4b, 0x5b, 0x56, 0x6f, 0x92, 0x46, 0xfa, 0x39, 0xe8, + 0x3f, 0xcc, 0xf8, 0xd8, 0xdf, 0x07, 0x18, 0x4b, 0xc9, 0xa8, 0x66, 0x8e, 0x9e, 0x37, 0x62, 0xf2, + 0x1f, 0xcd, 0xc4, 0xe4, 0x57, 0x18, 0xb5, 0x16, 0x86, 0x9f, 0x40, 0x79, 0xcb, 0xb9, 0x2f, 0x0c, + 0x81, 0x97, 0x8a, 0x36, 0x88, 0xd6, 0x34, 0x77, 0xcd, 0xb9, 0xcf, 0xf5, 0xae, 0xe7, 0xe4, 0x44, + 0xba, 0xe6, 0xdc, 0xdf, 0xe7, 0x87, 0x79, 0x6c, 0xc1, 0x52, 0xcb, 0xe3, 0x2b, 0x7f, 0x92, 0xfe, + 0x67, 0x32, 0x94, 0x56, 0xc7, 0x6a, 0xf5, 0x02, 0xe1, 0xc7, 0xec, 0xb1, 0x56, 0x2f, 0xc8, 0xd6, + 0xea, 0x05, 0x05, 0x6a, 0xf5, 0x58, 0xf0, 0xea, 0xa0, 0x70, 0xff, 0xb3, 0xc8, 0xbf, 0xe1, 0x0b, + 0x9f, 0xe8, 0xa9, 0x6a, 0x71, 0x8e, 0xc0, 0xab, 0x9f, 0x97, 0xca, 0xa6, 0x80, 0xe6, 0x36, 0x41, + 0x56, 0x8d, 0xfe, 0xa1, 0x05, 0x63, 0xe2, 0x37, 0x26, 0xef, 0xb6, 0x48, 0x9c, 0x88, 0x4d, 0xed, + 0x33, 0x87, 0x69, 0x8d, 0x60, 0xc1, 0x1b, 0xf5, 0x71, 0x29, 0x91, 0x4c, 0x64, 0x6e, 0xdb, 0x32, + 0xed, 0x41, 0xdf, 0xb7, 0x60, 0x6a, 0xcb, 0xb9, 0xcf, 0x6b, 0xe4, 0x30, 0xec, 0x24, 0x5e, 0x28, + 0xa2, 0x1b, 0x57, 0x7a, 0x9d, 0x27, 0x6d, 0x8c, 0x78, 0x73, 0x65, 0xe0, 0xd2, 0x54, 0x27, 0x92, + 0xdc, 0x46, 0x77, 0x6c, 0xe1, 0xcc, 0x3a, 0x0c, 0xc9, 0x89, 0xd9, 0x41, 0xcd, 0xaf, 0xea, 0x7b, + 0x77, 0x8e, 0x51, 0x3d, 0x27, 0x5d, 0x63, 0x73, 0xaf, 0xb5, 0x9c, 0x20, 0xf1, 0x92, 0x1d, 0xcd, + 0x2c, 0x60, 0xf5, 0x88, 0xa9, 0x78, 0xa4, 0xf5, 0xbc, 0x03, 0x23, 0xfa, 0xbc, 0x3b, 0xd2, 0xba, + 0xde, 0x85, 0x13, 0x1d, 0x66, 0xd5, 0x91, 0x56, 0x79, 0x0f, 0x1e, 0xed, 0x3a, 0x3f, 0x8e, 0xb2, + 0x62, 0xfb, 0x37, 0x2d, 0x5d, 0x74, 0x1e, 0x83, 0xd3, 0xe5, 0x9a, 0xe9, 0x74, 0x39, 0x5b, 0x74, + 0x0d, 0x75, 0xf1, 0xbc, 0xac, 0xeb, 0xcd, 0xa7, 0x5b, 0x02, 0x5a, 0x83, 0x01, 0x9f, 0x42, 0xe4, + 0x99, 0xd7, 0xb9, 0x5e, 0x56, 0x69, 0xaa, 0x94, 0x30, 0x78, 0x8c, 0x05, 0x2f, 0xfb, 0xfb, 0x16, + 0xf4, 0xfd, 0x05, 0xde, 0x18, 0x6a, 0x63, 0x2d, 0x2e, 0xbe, 0xcf, 0x61, 0xe7, 0xde, 0xf2, 0xfd, + 0x84, 0x04, 0x31, 0xd3, 0x41, 0xbb, 0x9d, 0xda, 0x0f, 0xd3, 0xaa, 0x64, 0x10, 0xc6, 0x2b, 0x30, + 0xea, 0x3b, 0x77, 0x88, 0x2f, 0x1d, 0xc6, 0x59, 0x8b, 0xed, 0xaa, 0x8e, 0xc4, 0x26, 0x2d, 0x2d, + 0xbc, 0xae, 0xfb, 0xd3, 0x85, 0x92, 0xa4, 0x0a, 0x1b, 0xce, 0x76, 0x6c, 0xd2, 0x52, 0x93, 0xe1, + 0x9e, 0x93, 0x34, 0x36, 0x85, 0x35, 0xa7, 0x9a, 0x7b, 0x9b, 0x02, 0x31, 0xc7, 0xa1, 0x05, 0x18, + 0x97, 0x33, 0xf6, 0x16, 0x35, 0xf3, 0xc3, 0x40, 0xe8, 0x99, 0xea, 0xd6, 0x31, 0x36, 0xd1, 0x38, + 0x4b, 0x8f, 0x3e, 0x09, 0x63, 0x74, 0x70, 0xc2, 0x56, 0x22, 0x43, 0x4c, 0xfa, 0x59, 0x88, 0x09, + 0x8b, 0x50, 0x5e, 0x33, 0x30, 0x38, 0x43, 0x69, 0xbf, 0x05, 0x27, 0xae, 0x86, 0x8e, 0xbb, 0xe8, + 0xf8, 0x4e, 0xd0, 0x20, 0xd1, 0x6a, 0xb0, 0x91, 0x7b, 0x7c, 0xad, 0x1f, 0x31, 0x97, 0xf2, 0x8e, + 0x98, 0xed, 0x08, 0x90, 0x5e, 0x81, 0x08, 0x8e, 0x7a, 0x13, 0x06, 0x3d, 0x5e, 0x95, 0x98, 0xb6, + 0xe7, 0xf3, 0xfc, 0x51, 0x6d, 0x6d, 0xd4, 0x82, 0x7d, 0x38, 0x00, 0x4b, 0x96, 0xd4, 0x04, 0xe9, + 0xe4, 0xc0, 0xca, 0xb7, 0xf2, 0xec, 0xbf, 0x69, 0xc1, 0xf8, 0xf5, 0xcc, 0x95, 0xd6, 0xa7, 0x61, + 0x80, 0x27, 0x46, 0xc8, 0xba, 0x58, 0xea, 0x0c, 0x8a, 0x05, 0xf6, 0x81, 0x5b, 0xf8, 0xbf, 0x5c, + 0x82, 0x0a, 0x0b, 0xb3, 0x6d, 0x52, 0x73, 0xe2, 0xe8, 0xd5, 0xd4, 0x6b, 0x86, 0x9a, 0x9a, 0x63, + 0x65, 0xaa, 0x86, 0x75, 0xd3, 0x52, 0xd1, 0x4d, 0x75, 0xd5, 0xb3, 0x90, 0x81, 0x99, 0x32, 0xe4, + 0xd7, 0x01, 0xc7, 0xcc, 0x9b, 0xa1, 0xf2, 0x1a, 0x28, 0x3b, 0xf4, 0x55, 0xb4, 0x0f, 0xdd, 0xa1, + 0xaf, 0x6a, 0x59, 0x17, 0xe1, 0x54, 0xd3, 0x1a, 0xcf, 0xc4, 0xf7, 0xa7, 0x59, 0xf0, 0xa4, 0xe3, + 0x7b, 0x5f, 0x24, 0xea, 0xc6, 0xf4, 0xac, 0x08, 0x86, 0x14, 0xd0, 0x7d, 0x26, 0x67, 0xc4, 0x3f, + 0x7e, 0x21, 0x3e, 0x2d, 0x62, 0x5f, 0x86, 0xf1, 0xcc, 0xd0, 0xa1, 0x97, 0xa0, 0xbf, 0xb9, 0xe9, + 0xc4, 0x24, 0x13, 0xc7, 0xd2, 0x5f, 0xa3, 0xc0, 0xfd, 0xdd, 0xd9, 0x31, 0x55, 0x80, 0x41, 0x30, + 0xa7, 0xb6, 0xbf, 0x5a, 0x82, 0xbe, 0xeb, 0xa1, 0x7b, 0x1c, 0x53, 0xed, 0xb2, 0x31, 0xd5, 0x9e, + 0xce, 0x4f, 0xa7, 0xd1, 0x75, 0x96, 0xd5, 0x32, 0xb3, 0xec, 0x6c, 0x01, 0x5e, 0x07, 0x4f, 0xb0, + 0x2d, 0x18, 0x66, 0xe9, 0x3a, 0x44, 0x20, 0xcf, 0x0b, 0x86, 0x65, 0x35, 0x9b, 0xb1, 0xac, 0xc6, + 0x35, 0x52, 0xcd, 0xbe, 0x7a, 0x06, 0x06, 0x45, 0xe0, 0x48, 0x36, 0x74, 0x54, 0xd0, 0x62, 0x89, + 0xb7, 0xff, 0x4d, 0x19, 0x8c, 0xf4, 0x20, 0xe8, 0x77, 0x2c, 0x98, 0x8b, 0xf8, 0x35, 0x1c, 0xb7, + 0xda, 0x8a, 0xbc, 0x60, 0xa3, 0xde, 0xd8, 0x24, 0x6e, 0xcb, 0xf7, 0x82, 0x8d, 0xd5, 0x8d, 0x20, + 0x54, 0xe0, 0xe5, 0xfb, 0xa4, 0xd1, 0x62, 0x7e, 0xda, 0xc2, 0x59, 0x49, 0xd4, 0xa1, 0xe9, 0x85, + 0xbd, 0xdd, 0xd9, 0x39, 0xdc, 0x53, 0x2d, 0xb8, 0xc7, 0x56, 0xa1, 0x3f, 0xb2, 0x60, 0x9e, 0x27, + 0xc8, 0x28, 0xde, 0x93, 0x42, 0x16, 0x69, 0x4d, 0x32, 0x4d, 0xd9, 0xad, 0x91, 0x68, 0x6b, 0xf1, + 0x65, 0x31, 0xc8, 0xf3, 0xb5, 0xde, 0x6a, 0xc5, 0xbd, 0x36, 0xd3, 0xfe, 0x0f, 0x65, 0x18, 0xa5, + 0xe3, 0x99, 0x5e, 0x8a, 0x7f, 0xc9, 0x98, 0x26, 0x4f, 0x64, 0xa6, 0xc9, 0xa4, 0x41, 0xfc, 0x60, + 0xee, 0xc3, 0xc7, 0x30, 0xe9, 0x3b, 0x71, 0x72, 0x99, 0x38, 0x51, 0x72, 0x87, 0x38, 0xec, 0x6c, + 0x32, 0x1b, 0xf7, 0x50, 0xe0, 0xb8, 0x53, 0x05, 0x23, 0x5d, 0xcd, 0x32, 0xc3, 0xed, 0xfc, 0xd1, + 0x36, 0x20, 0x76, 0x0e, 0x1a, 0x39, 0x41, 0xcc, 0xfb, 0xe2, 0x09, 0xbf, 0x6e, 0x6f, 0xb5, 0xce, + 0x88, 0x5a, 0xd1, 0xd5, 0x36, 0x6e, 0xb8, 0x43, 0x0d, 0xda, 0x49, 0x77, 0x7f, 0xd1, 0x93, 0xee, + 0x81, 0x9c, 0x98, 0xed, 0xaf, 0x59, 0x70, 0x82, 0x7e, 0x16, 0x33, 0xbe, 0x37, 0x46, 0x21, 0x8c, + 0xd3, 0x69, 0xe7, 0x93, 0x44, 0xc2, 0xc4, 0xfa, 0xca, 0xd1, 0xac, 0x4d, 0x3e, 0xa9, 0xfa, 0x76, + 0xc5, 0x64, 0x86, 0xb3, 0xdc, 0xed, 0x6f, 0x5b, 0xc0, 0x22, 0xee, 0x8e, 0x61, 0x33, 0xbb, 0x64, + 0x6e, 0x66, 0x76, 0xbe, 0xc4, 0xe8, 0xb2, 0x8f, 0xbd, 0x08, 0x13, 0x14, 0x5b, 0x8b, 0xc2, 0xfb, + 0x3b, 0x52, 0xd1, 0xce, 0x77, 0xf0, 0x7e, 0xad, 0xc4, 0x97, 0x8d, 0xba, 0x4f, 0x88, 0x7e, 0xc1, + 0x82, 0xa1, 0x86, 0xd3, 0x74, 0x1a, 0x3c, 0xb9, 0x52, 0x01, 0xef, 0x8c, 0x51, 0x7e, 0x6e, 0x49, + 0x94, 0xe5, 0x9e, 0x85, 0x8f, 0xc9, 0xae, 0x4b, 0x70, 0xae, 0x37, 0x41, 0x55, 0x3e, 0x73, 0x17, + 0x46, 0x0d, 0x66, 0x47, 0x6a, 0x86, 0xfe, 0x82, 0xc5, 0x85, 0xbe, 0x32, 0x15, 0xee, 0xc1, 0x64, + 0xa0, 0xfd, 0xa7, 0xe2, 0x4c, 0x6a, 0xc6, 0x73, 0xc5, 0xc5, 0x3a, 0x93, 0x82, 0x5a, 0x74, 0x61, + 0x86, 0x21, 0x6e, 0xaf, 0xc3, 0xfe, 0x55, 0x0b, 0x1e, 0xd1, 0x09, 0xb5, 0x0b, 0xa0, 0x79, 0x7e, + 0xe3, 0x2a, 0x0c, 0x85, 0x4d, 0x12, 0x39, 0xa9, 0x59, 0x74, 0x56, 0x8e, 0xff, 0x0d, 0x01, 0xdf, + 0xdf, 0x9d, 0x9d, 0xd2, 0xb9, 0x4b, 0x38, 0x56, 0x25, 0x91, 0x0d, 0x03, 0x6c, 0x5c, 0x62, 0x71, + 0x75, 0x97, 0x25, 0x1b, 0x62, 0x87, 0x2a, 0x31, 0x16, 0x18, 0xfb, 0xef, 0x58, 0x7c, 0xba, 0xe9, + 0x4d, 0x47, 0x5f, 0x82, 0x89, 0x2d, 0x6a, 0x41, 0x2d, 0xdf, 0x6f, 0xd2, 0x8d, 0x94, 0x1d, 0x27, + 0x5b, 0x45, 0xb6, 0x8f, 0x2e, 0xdd, 0x5d, 0x9c, 0x16, 0xad, 0x9f, 0xb8, 0x96, 0x61, 0x8b, 0xdb, + 0x2a, 0xb2, 0xff, 0x71, 0x89, 0xaf, 0x59, 0xa6, 0xc3, 0x3d, 0x03, 0x83, 0xcd, 0xd0, 0x5d, 0x5a, + 0xad, 0x62, 0x31, 0x56, 0x4a, 0xe8, 0xd4, 0x38, 0x18, 0x4b, 0x3c, 0xba, 0x00, 0x40, 0xee, 0x27, + 0x24, 0x0a, 0x1c, 0x5f, 0x1d, 0x03, 0x2b, 0x55, 0x69, 0x59, 0x61, 0xb0, 0x46, 0x45, 0xcb, 0x34, + 0xa3, 0x70, 0xdb, 0x73, 0xd9, 0xcd, 0x85, 0xb2, 0x59, 0xa6, 0xa6, 0x30, 0x58, 0xa3, 0xa2, 0x76, + 0x6b, 0x2b, 0x88, 0xf9, 0x36, 0xe6, 0xdc, 0x11, 0xb9, 0x71, 0x86, 0x52, 0xbb, 0xf5, 0xa6, 0x8e, + 0xc4, 0x26, 0x2d, 0xba, 0x02, 0x03, 0x89, 0xc3, 0x0e, 0x37, 0xfb, 0x8b, 0x44, 0x8a, 0xac, 0x51, + 0x5a, 0x3d, 0x19, 0x11, 0x2d, 0x8a, 0x05, 0x0b, 0xfb, 0x0f, 0x2a, 0x00, 0xa9, 0xd6, 0x85, 0xbe, + 0xda, 0xbe, 0xe0, 0x3f, 0x5e, 0x54, 0x65, 0x7b, 0x70, 0xab, 0x1d, 0xbd, 0x67, 0xc1, 0xb0, 0xe3, + 0xfb, 0x61, 0xc3, 0x49, 0xd8, 0xf0, 0x94, 0x8a, 0x8a, 0x1e, 0xd1, 0x92, 0x85, 0xb4, 0x2c, 0x6f, + 0xcc, 0x0b, 0xf2, 0xc0, 0x51, 0xc3, 0xe4, 0xb6, 0x47, 0x6f, 0x02, 0xfa, 0x98, 0xd4, 0xda, 0xf9, + 0x17, 0x9e, 0xc9, 0x6a, 0xed, 0x15, 0x26, 0x70, 0x35, 0x85, 0x1d, 0xbd, 0x65, 0xe4, 0x92, 0xe9, + 0x2b, 0x72, 0xfd, 0xd4, 0xd0, 0x43, 0xf2, 0xd2, 0xc8, 0xa0, 0x37, 0xf4, 0x90, 0xea, 0xfe, 0x22, + 0xf7, 0xbb, 0x35, 0x75, 0x38, 0x27, 0x9c, 0x3a, 0x81, 0x71, 0xd7, 0xdc, 0x79, 0x45, 0x58, 0xd8, + 0xf9, 0xfc, 0x1a, 0x32, 0x5b, 0x76, 0xba, 0xd7, 0x66, 0x10, 0x38, 0x5b, 0x05, 0x7a, 0x83, 0x07, + 0xbc, 0xaf, 0x06, 0xeb, 0xa1, 0x08, 0x0d, 0x3b, 0x57, 0xe0, 0x9b, 0xef, 0xc4, 0x09, 0xd9, 0xa2, + 0x65, 0xd2, 0xcd, 0xf5, 0xba, 0xe0, 0x82, 0x15, 0x3f, 0xb4, 0x06, 0x03, 0xec, 0xb6, 0x51, 0x3c, + 0x3d, 0x54, 0xc4, 0x13, 0x67, 0x5e, 0xb2, 0x4d, 0xd7, 0x0f, 0xfb, 0x1b, 0x63, 0xc1, 0x0b, 0x5d, + 0x96, 0xd7, 0xec, 0xe3, 0xd5, 0xe0, 0x66, 0x4c, 0xd8, 0x35, 0xfb, 0xca, 0xe2, 0x47, 0xd2, 0x7b, + 0xf3, 0x1c, 0xde, 0x31, 0x9b, 0x9e, 0x51, 0x92, 0x2a, 0x36, 0xe2, 0xbf, 0x4c, 0xd2, 0x37, 0x0d, + 0x45, 0x1a, 0x6a, 0xa6, 0xf4, 0x4b, 0x07, 0xfb, 0x96, 0xc9, 0x0c, 0x67, 0xb9, 0x1f, 0xeb, 0x96, + 0x3a, 0x13, 0xc0, 0x44, 0x76, 0x51, 0x1e, 0xe9, 0x16, 0xfe, 0x93, 0x3e, 0x18, 0x33, 0x27, 0x07, + 0x9a, 0x87, 0x8a, 0x60, 0xa2, 0x92, 0x76, 0xa9, 0x35, 0x70, 0x4d, 0x22, 0x70, 0x4a, 0xc3, 0xd2, + 0x97, 0xb1, 0xe2, 0x5a, 0x50, 0x50, 0x9a, 0xbe, 0x4c, 0x61, 0xb0, 0x46, 0x45, 0x35, 0xe1, 0x3b, + 0x61, 0x98, 0xa8, 0x9d, 0x40, 0xcd, 0x9b, 0x45, 0x06, 0xc5, 0x02, 0x4b, 0x77, 0x80, 0xbb, 0xf4, + 0x63, 0xfa, 0xa6, 0x57, 0x51, 0xed, 0x00, 0x57, 0x74, 0x24, 0x36, 0x69, 0xe9, 0x8e, 0x16, 0xc6, + 0x6c, 0x22, 0x0a, 0x7d, 0x3b, 0x0d, 0xb2, 0xaa, 0xf3, 0x1b, 0x78, 0x12, 0x8f, 0x3e, 0x07, 0x8f, + 0xa8, 0x0b, 0x73, 0x98, 0x7b, 0x69, 0x65, 0x8d, 0x03, 0x86, 0xc9, 0xfc, 0xc8, 0x52, 0x67, 0x32, + 0xdc, 0xad, 0x3c, 0x7a, 0x15, 0xc6, 0x84, 0xae, 0x2c, 0x39, 0x0e, 0x9a, 0x27, 0xf0, 0x57, 0x0c, + 0x2c, 0xce, 0x50, 0xa3, 0x2a, 0x4c, 0x50, 0x08, 0x53, 0x52, 0x25, 0x07, 0x7e, 0xf1, 0x4f, 0x6d, + 0xf5, 0x57, 0x32, 0x78, 0xdc, 0x56, 0x02, 0x2d, 0xc0, 0x38, 0x57, 0x56, 0xa8, 0x61, 0xc8, 0xbe, + 0x83, 0x88, 0xe7, 0x54, 0x0b, 0xe1, 0x86, 0x89, 0xc6, 0x59, 0x7a, 0x74, 0x11, 0x46, 0x9c, 0xa8, + 0xb1, 0xe9, 0x25, 0xa4, 0x91, 0xb4, 0x22, 0x9e, 0xc4, 0x42, 0x0b, 0x61, 0x58, 0xd0, 0x70, 0xd8, + 0xa0, 0xb4, 0xbf, 0x08, 0x27, 0x3a, 0x04, 0x8f, 0xd3, 0x89, 0xe3, 0x34, 0x3d, 0xd9, 0xa7, 0x4c, + 0xb8, 0xd4, 0x42, 0x6d, 0x55, 0xf6, 0x46, 0xa3, 0xa2, 0xb3, 0x93, 0xb9, 0xa7, 0xb5, 0x9c, 0x9a, + 0x6a, 0x76, 0xae, 0x48, 0x04, 0x4e, 0x69, 0xec, 0x3f, 0xaf, 0x80, 0xe6, 0xbd, 0x29, 0x10, 0x22, + 0x73, 0x11, 0x46, 0x64, 0x9a, 0x58, 0x2d, 0x3d, 0xa3, 0xea, 0xe6, 0x25, 0x0d, 0x87, 0x0d, 0x4a, + 0xda, 0xb6, 0x40, 0xfa, 0xa4, 0xb2, 0xc1, 0x59, 0xca, 0x59, 0x85, 0x53, 0x1a, 0x74, 0x0e, 0x86, + 0x62, 0xe2, 0xaf, 0x5f, 0xf5, 0x82, 0xbb, 0x62, 0x62, 0x2b, 0xc9, 0x5c, 0x17, 0x70, 0xac, 0x28, + 0xd0, 0x22, 0x94, 0x5b, 0x9e, 0x2b, 0xa6, 0xb2, 0x54, 0x1b, 0xca, 0x37, 0x57, 0xab, 0xfb, 0xbb, + 0xb3, 0x4f, 0x74, 0xcb, 0x99, 0x4b, 0xed, 0xf3, 0x78, 0x8e, 0x2e, 0x3f, 0x5a, 0xb8, 0x93, 0x9f, + 0x7e, 0xa0, 0x47, 0x3f, 0xfd, 0x05, 0x00, 0xd1, 0x6b, 0x39, 0x97, 0xcb, 0xe9, 0x57, 0xbb, 0xa4, + 0x30, 0x58, 0xa3, 0xa2, 0x56, 0x7e, 0x23, 0x22, 0x8e, 0x34, 0x84, 0x79, 0x50, 0xf3, 0xd0, 0xe1, + 0xad, 0xfc, 0xa5, 0x2c, 0x33, 0xdc, 0xce, 0x1f, 0x85, 0x30, 0xe9, 0x8a, 0x5b, 0x99, 0x69, 0xa5, + 0x95, 0xde, 0x23, 0xa9, 0x69, 0x85, 0xd5, 0x2c, 0x23, 0xdc, 0xce, 0x1b, 0x7d, 0x01, 0x66, 0x24, + 0xb0, 0xfd, 0x4a, 0x2c, 0x5b, 0x2e, 0xe5, 0xc5, 0xd3, 0x7b, 0xbb, 0xb3, 0x33, 0xd5, 0xae, 0x54, + 0xf8, 0x00, 0x0e, 0xe8, 0x4d, 0x18, 0x60, 0xe7, 0x3a, 0xf1, 0xf4, 0x30, 0xdb, 0xf1, 0x5e, 0x2c, + 0x12, 0x8f, 0x4f, 0x67, 0xfd, 0x1c, 0x3b, 0x1d, 0x12, 0x91, 0xa6, 0xe9, 0x61, 0x19, 0x03, 0x62, + 0xc1, 0x13, 0x35, 0x61, 0xd8, 0x09, 0x82, 0x30, 0x71, 0xb8, 0x22, 0x36, 0x52, 0x44, 0x97, 0xd4, + 0xaa, 0x58, 0x48, 0xcb, 0xf2, 0x7a, 0x54, 0xf0, 0x9a, 0x86, 0xc1, 0x7a, 0x15, 0xe8, 0x1e, 0x8c, + 0x87, 0xf7, 0xa8, 0xc0, 0x94, 0x47, 0x1b, 0xf1, 0xf4, 0xa8, 0xd9, 0xb1, 0x1c, 0x47, 0xad, 0x51, + 0x58, 0x93, 0x64, 0x26, 0x53, 0x9c, 0xad, 0x05, 0xcd, 0x19, 0xee, 0xea, 0xb1, 0x34, 0x9e, 0x3a, + 0x75, 0x57, 0xeb, 0xde, 0x69, 0x76, 0xed, 0x9a, 0xc7, 0x50, 0x32, 0x89, 0x30, 0x9e, 0xb9, 0x76, + 0x9d, 0xa2, 0xb0, 0x4e, 0x37, 0xf3, 0x09, 0x18, 0xd6, 0x06, 0xbe, 0x97, 0xc0, 0xdd, 0x99, 0x57, + 0x61, 0x22, 0x3b, 0xa0, 0x3d, 0x05, 0xfe, 0xfe, 0xef, 0x12, 0x8c, 0x77, 0x38, 0x37, 0xba, 0xeb, + 0xb1, 0xe0, 0x73, 0x43, 0xf4, 0x5d, 0xf1, 0x02, 0x17, 0x33, 0x8c, 0x29, 0xc0, 0x4a, 0x05, 0x04, + 0x98, 0x94, 0xa6, 0xe5, 0xae, 0xd2, 0x54, 0x08, 0xad, 0xbe, 0x0f, 0x22, 0xb4, 0xcc, 0x7d, 0xa2, + 0xbf, 0xd0, 0x3e, 0xf1, 0x00, 0x04, 0x9d, 0xb1, 0xd5, 0x0c, 0x16, 0xd8, 0x6a, 0xbe, 0x55, 0x82, + 0x89, 0x34, 0xc8, 0x59, 0xe4, 0x8e, 0x3e, 0xfa, 0x63, 0x88, 0x35, 0xe3, 0x18, 0x22, 0x2f, 0x35, + 0x74, 0xa6, 0x7d, 0x5d, 0x8f, 0x24, 0xde, 0xcc, 0x1c, 0x49, 0xbc, 0xd8, 0x23, 0xdf, 0x83, 0x8f, + 0x27, 0xbe, 0x57, 0x82, 0x93, 0xd9, 0x22, 0x4b, 0xbe, 0xe3, 0x6d, 0x1d, 0xc3, 0x78, 0x7d, 0xce, + 0x18, 0xaf, 0x97, 0x7b, 0xeb, 0x17, 0x6b, 0x64, 0xd7, 0x41, 0x73, 0x32, 0x83, 0xf6, 0x89, 0xc3, + 0x30, 0x3f, 0x78, 0xe4, 0x7e, 0xdf, 0x82, 0x47, 0x3b, 0x96, 0x3b, 0x06, 0xc7, 0xeb, 0xeb, 0xa6, + 0xe3, 0xf5, 0x85, 0x43, 0xf4, 0xae, 0x8b, 0x27, 0xf6, 0xd7, 0xca, 0x5d, 0x7a, 0xc5, 0x5c, 0x53, + 0x37, 0x60, 0xd8, 0x69, 0x34, 0x48, 0x1c, 0x5f, 0x0b, 0x5d, 0x95, 0xc0, 0xe9, 0x79, 0xb6, 0xb7, + 0xa4, 0xe0, 0xfd, 0xdd, 0xd9, 0x99, 0x2c, 0x8b, 0x14, 0x8d, 0x75, 0x0e, 0x66, 0x6a, 0xb9, 0xd2, + 0x11, 0xa5, 0x96, 0xbb, 0x00, 0xb0, 0xad, 0xac, 0xd8, 0xac, 0xc7, 0x4b, 0xb3, 0x6f, 0x35, 0x2a, + 0xf4, 0x57, 0x99, 0x46, 0xc8, 0x83, 0x34, 0xfa, 0xcc, 0xfb, 0x92, 0x39, 0xdf, 0x4f, 0x0f, 0xf8, + 0xe0, 0xd7, 0x32, 0x95, 0x77, 0x50, 0xb1, 0x44, 0x9f, 0x81, 0x89, 0x98, 0x5f, 0xfe, 0x5f, 0xf2, + 0x9d, 0x98, 0x45, 0xf7, 0x0b, 0x79, 0xca, 0x6e, 0x58, 0xd6, 0x33, 0x38, 0xdc, 0x46, 0x6d, 0x7f, + 0xb7, 0x0c, 0x1f, 0x3e, 0x60, 0xda, 0xa2, 0x05, 0xf3, 0xd4, 0xf6, 0xb9, 0xac, 0xff, 0x67, 0xa6, + 0x63, 0x61, 0xc3, 0x21, 0x94, 0xf9, 0xda, 0xa5, 0x0f, 0xfc, 0xb5, 0xbf, 0xa1, 0x7b, 0xeb, 0x78, + 0xdc, 0xe6, 0xa5, 0x43, 0x2f, 0xcc, 0x9f, 0x56, 0x67, 0xfd, 0x57, 0x2c, 0x78, 0xa2, 0x63, 0xb7, + 0x8c, 0x28, 0x91, 0x79, 0xa8, 0x34, 0x28, 0x50, 0xbb, 0x8b, 0x93, 0x5e, 0x82, 0x93, 0x08, 0x9c, + 0xd2, 0x18, 0xc1, 0x20, 0xa5, 0xdc, 0x60, 0x90, 0xdf, 0xb5, 0x60, 0x2a, 0xdb, 0x88, 0x63, 0x90, + 0x5b, 0x75, 0x53, 0x6e, 0xcd, 0xf5, 0xf6, 0xf1, 0xbb, 0x88, 0xac, 0xf7, 0xc6, 0xe0, 0x54, 0xdb, + 0xae, 0xc7, 0x47, 0xf1, 0xe7, 0x2c, 0x98, 0xdc, 0x60, 0xda, 0xbb, 0x76, 0xe1, 0x49, 0xf4, 0x2b, + 0xe7, 0x96, 0xd8, 0x81, 0xf7, 0xa4, 0xb8, 0x2d, 0xd2, 0x46, 0x82, 0xdb, 0x2b, 0x43, 0x5f, 0xb7, + 0x60, 0xca, 0xb9, 0x17, 0xb7, 0xbd, 0x6c, 0x22, 0x26, 0xd2, 0xab, 0x39, 0xce, 0xb2, 0x9c, 0x37, + 0x51, 0x16, 0xa7, 0xf7, 0x76, 0x67, 0xa7, 0x3a, 0x51, 0xe1, 0x8e, 0xb5, 0xd2, 0xef, 0xbb, 0x29, + 0xae, 0x53, 0x14, 0xbb, 0xba, 0xd7, 0xe9, 0xf2, 0x05, 0x17, 0x6b, 0x12, 0x83, 0x15, 0x47, 0xf4, + 0x36, 0x54, 0x36, 0xe4, 0x1d, 0xa7, 0xac, 0xd8, 0xec, 0x32, 0xcc, 0x9d, 0xae, 0x44, 0xf1, 0xd8, + 0x7d, 0x85, 0xc2, 0x29, 0x53, 0x74, 0x19, 0xca, 0xc1, 0x7a, 0x2c, 0x6e, 0x13, 0xe7, 0xc5, 0x00, + 0x99, 0x91, 0x57, 0xfc, 0x02, 0xe6, 0xf5, 0x95, 0x3a, 0xa6, 0x2c, 0x28, 0xa7, 0xe8, 0x8e, 0x2b, + 0xbc, 0xc4, 0x39, 0x9c, 0xf0, 0x62, 0xb5, 0x9d, 0x13, 0x5e, 0xac, 0x62, 0xca, 0x02, 0xd5, 0xa0, + 0x9f, 0x5d, 0xd6, 0x10, 0x2e, 0xe0, 0x9c, 0x2b, 0xe7, 0x6d, 0x57, 0x52, 0x78, 0x06, 0x44, 0x06, + 0xc6, 0x9c, 0x11, 0x5a, 0x83, 0x81, 0x06, 0x4b, 0xe2, 0x2f, 0x6c, 0xf3, 0xbc, 0x64, 0x0c, 0x6d, + 0x09, 0xff, 0xf9, 0xb9, 0x17, 0x87, 0x63, 0xc1, 0x8b, 0x71, 0x25, 0xcd, 0xcd, 0xf5, 0x58, 0x18, + 0xdf, 0x79, 0x5c, 0xdb, 0x9e, 0x63, 0x10, 0x5c, 0x19, 0x1c, 0x0b, 0x5e, 0xa8, 0x0a, 0xa5, 0xf5, + 0x86, 0x48, 0xa4, 0x9a, 0xe3, 0xfa, 0x35, 0x6f, 0xd3, 0x2e, 0x0e, 0xec, 0xed, 0xce, 0x96, 0x56, + 0x96, 0x70, 0x69, 0xbd, 0x81, 0x5e, 0x87, 0xc1, 0x75, 0x7e, 0x3f, 0x52, 0x24, 0x4d, 0x3d, 0x9f, + 0x77, 0x89, 0xb3, 0xed, 0x32, 0x25, 0xbf, 0x9f, 0x21, 0x10, 0x58, 0xb2, 0x63, 0xf9, 0xe4, 0xd4, + 0x8d, 0x4f, 0x91, 0x35, 0x75, 0xae, 0xb7, 0x1b, 0xa2, 0xc2, 0x26, 0x55, 0x50, 0xac, 0x71, 0xa4, + 0x73, 0xde, 0x91, 0xef, 0x91, 0xb0, 0x8c, 0xa9, 0xb9, 0x73, 0xbe, 0xe3, 0xf3, 0x25, 0x7c, 0xce, + 0x2b, 0x14, 0x4e, 0x99, 0xa2, 0x16, 0x8c, 0x6e, 0xc7, 0xcd, 0x4d, 0x22, 0x97, 0x3e, 0x4b, 0xa3, + 0x3a, 0x7c, 0xe1, 0x53, 0x39, 0xb9, 0x71, 0x45, 0x11, 0x2f, 0x4a, 0x5a, 0x8e, 0xdf, 0x26, 0xc1, + 0x58, 0x02, 0xaf, 0x5b, 0x3a, 0x5b, 0x6c, 0xd6, 0x42, 0x3f, 0xc9, 0xbb, 0xad, 0xf0, 0xce, 0x4e, + 0x42, 0x44, 0x9a, 0xd5, 0x9c, 0x4f, 0xf2, 0x1a, 0x27, 0x6e, 0xff, 0x24, 0x02, 0x81, 0x25, 0x3b, + 0x35, 0x64, 0x4c, 0x1a, 0x4f, 0x14, 0x1e, 0xb2, 0xb6, 0x3e, 0xa4, 0x43, 0xc6, 0xa4, 0x6f, 0xca, + 0x94, 0x49, 0xdd, 0xe6, 0x66, 0x98, 0x84, 0x41, 0x46, 0xf6, 0x4f, 0x16, 0x91, 0xba, 0xb5, 0x0e, + 0x25, 0xdb, 0xa5, 0x6e, 0x27, 0x2a, 0xdc, 0xb1, 0x56, 0x14, 0xc0, 0x58, 0x33, 0x8c, 0x92, 0x7b, + 0x61, 0x24, 0xe7, 0x21, 0x2a, 0x64, 0x23, 0x1a, 0x65, 0x44, 0xdd, 0x2c, 0x0c, 0xd7, 0xc4, 0xe0, + 0x0c, 0x77, 0xfb, 0x57, 0x07, 0xda, 0xb7, 0x77, 0xa6, 0xc0, 0xff, 0xed, 0xf6, 0xf3, 0xd2, 0xcf, + 0xf4, 0x6e, 0xa7, 0x3e, 0xc0, 0x93, 0xd3, 0xaf, 0x5b, 0x70, 0xaa, 0xd9, 0x71, 0xf3, 0x16, 0x1b, + 0x64, 0xaf, 0xe6, 0x2e, 0x1f, 0x24, 0x95, 0xb3, 0xb8, 0x33, 0x1e, 0x77, 0xa9, 0x33, 0xab, 0xf2, + 0x96, 0x3f, 0xb0, 0xca, 0x7b, 0x1b, 0x86, 0x98, 0x8e, 0x96, 0x66, 0x24, 0xe9, 0x31, 0x79, 0x07, + 0xdb, 0x6a, 0x97, 0x04, 0x0b, 0xac, 0x98, 0xd1, 0x81, 0x7b, 0x3c, 0xdb, 0x09, 0x4c, 0x18, 0x5a, + 0x64, 0xca, 0xe3, 0xf6, 0xc4, 0x8a, 0x18, 0x89, 0xc7, 0x6b, 0x07, 0x11, 0xef, 0xe7, 0x11, 0xe0, + 0x83, 0x2b, 0x43, 0xd5, 0x0e, 0x06, 0xcd, 0x80, 0x79, 0x38, 0x92, 0x6f, 0xd4, 0x1c, 0xaf, 0x22, + 0xfe, 0x4f, 0xac, 0x0e, 0x7a, 0x23, 0x37, 0x9e, 0x3e, 0x65, 0x1a, 0x4f, 0x4f, 0x67, 0x8d, 0xa7, + 0x36, 0x97, 0x89, 0x61, 0x37, 0x15, 0xcf, 0xf4, 0x59, 0x34, 0xe5, 0x8a, 0xed, 0xc3, 0x99, 0x3c, + 0xa1, 0xc4, 0x02, 0xa6, 0x5c, 0x75, 0x54, 0x98, 0x06, 0x4c, 0xb9, 0xab, 0x55, 0xcc, 0x30, 0x45, + 0x6f, 0xed, 0xdb, 0x3f, 0x5f, 0x82, 0x72, 0x2d, 0x74, 0x8f, 0xc1, 0x05, 0x74, 0xc9, 0x70, 0x01, + 0x3d, 0x95, 0xfb, 0x8a, 0x5c, 0x57, 0x87, 0xcf, 0x8d, 0x8c, 0xc3, 0xe7, 0xa3, 0xf9, 0xac, 0x0e, + 0x76, 0xef, 0x7c, 0xbf, 0x0c, 0xfa, 0x3b, 0x78, 0xe8, 0xbf, 0x1c, 0x26, 0x8e, 0xb6, 0x5c, 0xec, + 0x69, 0x3c, 0x51, 0x07, 0x8b, 0xb7, 0x92, 0xb7, 0xef, 0x7e, 0x6a, 0xc3, 0x69, 0x6f, 0x13, 0x6f, + 0x63, 0x33, 0x21, 0x6e, 0xb6, 0x63, 0xc7, 0x17, 0x4e, 0xfb, 0x67, 0x16, 0x8c, 0x67, 0x6a, 0x47, + 0x7e, 0xa7, 0x6b, 0x3b, 0x87, 0x74, 0xea, 0x4c, 0xe6, 0xde, 0xf3, 0x99, 0x03, 0x50, 0xbe, 0x79, + 0xe9, 0x38, 0x61, 0x3a, 0xa4, 0x72, 0xde, 0xc7, 0x58, 0xa3, 0x40, 0x2f, 0xc1, 0x70, 0x12, 0x36, + 0x43, 0x3f, 0xdc, 0xd8, 0xb9, 0x42, 0x64, 0x3e, 0x09, 0x75, 0xae, 0xb1, 0x96, 0xa2, 0xb0, 0x4e, + 0x67, 0xff, 0xa0, 0x0c, 0xd9, 0x57, 0x14, 0xff, 0x72, 0x9e, 0xfe, 0xf4, 0xcc, 0xd3, 0x3f, 0xb4, + 0x60, 0x82, 0xd6, 0xce, 0x02, 0x5c, 0x64, 0xd8, 0xab, 0x7a, 0x76, 0xc0, 0x3a, 0xe0, 0xd9, 0x81, + 0xa7, 0xa9, 0xb4, 0x73, 0xc3, 0x56, 0x22, 0x5c, 0x3d, 0x9a, 0x10, 0xa3, 0x50, 0x2c, 0xb0, 0x82, + 0x8e, 0x44, 0x91, 0xb8, 0x1f, 0xa4, 0xd3, 0x91, 0x28, 0xc2, 0x02, 0x2b, 0x5f, 0x25, 0xe8, 0xeb, + 0xf2, 0x2a, 0x01, 0xcb, 0xc8, 0x24, 0x82, 0x2a, 0x84, 0x5a, 0xa1, 0x65, 0x64, 0x92, 0xd1, 0x16, + 0x29, 0x8d, 0xfd, 0x9d, 0x32, 0x8c, 0xd4, 0x42, 0x37, 0x8d, 0x67, 0x7f, 0xd1, 0x88, 0x67, 0x3f, + 0x93, 0x89, 0x67, 0x9f, 0xd0, 0x69, 0x1f, 0x4c, 0x38, 0xbb, 0xc8, 0xdc, 0xc5, 0xde, 0xcd, 0x38, + 0x64, 0x28, 0xbb, 0x91, 0xb9, 0x4b, 0x31, 0xc2, 0x26, 0xdf, 0x9f, 0xa5, 0x10, 0xf6, 0xff, 0x6b, + 0xc1, 0x58, 0x2d, 0x74, 0xe9, 0x04, 0xfd, 0x59, 0x9a, 0x8d, 0x7a, 0xbe, 0xaf, 0x81, 0x03, 0xf2, + 0x7d, 0xfd, 0x2b, 0x0b, 0x06, 0x6b, 0xa1, 0x7b, 0x0c, 0x6e, 0xd0, 0x15, 0xd3, 0x0d, 0xfa, 0x44, + 0xae, 0xe4, 0xed, 0xe2, 0xf9, 0xfc, 0x6e, 0x19, 0x46, 0x69, 0x8b, 0xc3, 0x0d, 0xf9, 0xbd, 0x8c, + 0xb1, 0xb1, 0x0a, 0x8c, 0x0d, 0x55, 0x09, 0x43, 0xdf, 0x0f, 0xef, 0x65, 0xbf, 0xdd, 0x0a, 0x83, + 0x62, 0x81, 0x45, 0xe7, 0x60, 0xa8, 0x19, 0x91, 0x6d, 0x2f, 0x6c, 0xc5, 0xd9, 0xbb, 0x86, 0x35, + 0x01, 0xc7, 0x8a, 0x02, 0xbd, 0x08, 0x23, 0xb1, 0x17, 0x34, 0x88, 0x0c, 0xb9, 0xe8, 0x63, 0x21, + 0x17, 0x3c, 0xb5, 0xa2, 0x06, 0xc7, 0x06, 0x15, 0xba, 0x0d, 0x15, 0xf6, 0x9f, 0xad, 0xa0, 0xde, + 0x9f, 0x15, 0xe0, 0xf9, 0xc4, 0x24, 0x03, 0x9c, 0xf2, 0x42, 0x17, 0x00, 0x12, 0x19, 0x1c, 0x12, + 0x8b, 0xac, 0x28, 0x4a, 0x2f, 0x55, 0x61, 0x23, 0x31, 0xd6, 0xa8, 0xd0, 0x73, 0x50, 0x49, 0x1c, + 0xcf, 0xbf, 0xea, 0x05, 0x24, 0x16, 0xc1, 0x35, 0x22, 0x4d, 0xb2, 0x00, 0xe2, 0x14, 0x4f, 0xf7, + 0x7b, 0x76, 0xd3, 0x99, 0x3f, 0x59, 0x32, 0xc4, 0xa8, 0xd9, 0x7e, 0x7f, 0x55, 0x41, 0xb1, 0x46, + 0x61, 0x5f, 0x84, 0x93, 0xb5, 0xd0, 0xa5, 0x46, 0xfc, 0x4a, 0x18, 0xdd, 0x73, 0x22, 0x57, 0x7e, + 0xbf, 0x59, 0x99, 0x9d, 0x97, 0xee, 0xc9, 0xfd, 0xdc, 0x33, 0x68, 0x64, 0xdb, 0x7d, 0x81, 0xed, + 0xf8, 0x3d, 0x5e, 0x94, 0xf8, 0x71, 0x09, 0x50, 0x8d, 0x85, 0xaf, 0x18, 0x2f, 0xdc, 0x6c, 0xc2, + 0x58, 0x4c, 0xae, 0x7a, 0x41, 0xeb, 0xbe, 0x60, 0x55, 0xec, 0x66, 0x4a, 0x7d, 0x59, 0x2f, 0xc3, + 0xfd, 0x11, 0x26, 0x0c, 0x67, 0xf8, 0xd2, 0xc1, 0x8c, 0x5a, 0xc1, 0x42, 0x7c, 0x33, 0x26, 0x91, + 0x78, 0xd1, 0x85, 0x0d, 0x26, 0x96, 0x40, 0x9c, 0xe2, 0xe9, 0xe4, 0x61, 0x7f, 0xae, 0x87, 0x01, + 0x0e, 0xc3, 0x44, 0x4e, 0x37, 0x96, 0xe1, 0x5f, 0x83, 0x63, 0x83, 0x0a, 0xad, 0x00, 0x8a, 0x5b, + 0xcd, 0xa6, 0xcf, 0x4e, 0x04, 0x1d, 0xff, 0x52, 0x14, 0xb6, 0x9a, 0x3c, 0x8a, 0x59, 0x24, 0xc7, + 0xaf, 0xb7, 0x61, 0x71, 0x87, 0x12, 0x54, 0x58, 0xac, 0xc7, 0xec, 0xb7, 0xb8, 0xf6, 0xcc, 0xbd, + 0x8a, 0x75, 0x06, 0xc2, 0x12, 0x67, 0x7f, 0x99, 0x6d, 0x70, 0xec, 0xa9, 0x8d, 0xa4, 0x15, 0x11, + 0xb4, 0x05, 0xa3, 0x4d, 0xb6, 0x89, 0x25, 0x51, 0xe8, 0xfb, 0x44, 0xea, 0x97, 0x87, 0x0b, 0xa0, + 0xe1, 0xc9, 0xf5, 0x75, 0x76, 0xd8, 0xe4, 0x6e, 0xff, 0xe2, 0x18, 0x93, 0x55, 0xe2, 0x50, 0x76, + 0x50, 0x84, 0xca, 0x0a, 0x4d, 0xee, 0x23, 0x45, 0x1e, 0xcd, 0x4a, 0xf7, 0x01, 0x11, 0x78, 0x8b, + 0x25, 0x17, 0xf4, 0x79, 0x16, 0x08, 0xce, 0x05, 0x44, 0xf1, 0xa7, 0x00, 0x39, 0xbd, 0x11, 0x04, + 0x2e, 0x58, 0x60, 0x8d, 0x1d, 0xba, 0x0a, 0xa3, 0xe2, 0x65, 0x06, 0xe1, 0xa6, 0x28, 0x1b, 0x26, + 0xf6, 0x28, 0xd6, 0x91, 0xfb, 0x59, 0x00, 0x36, 0x0b, 0xa3, 0x0d, 0x78, 0x5c, 0x7b, 0x79, 0xa8, + 0x43, 0xb0, 0x17, 0x97, 0x3c, 0x4f, 0xec, 0xed, 0xce, 0x3e, 0xbe, 0x76, 0x10, 0x21, 0x3e, 0x98, + 0x0f, 0xba, 0x01, 0x27, 0x9d, 0x46, 0xe2, 0x6d, 0x93, 0x2a, 0x71, 0x5c, 0xdf, 0x0b, 0x88, 0x79, + 0x37, 0xfe, 0xd1, 0xbd, 0xdd, 0xd9, 0x93, 0x0b, 0x9d, 0x08, 0x70, 0xe7, 0x72, 0xe8, 0x53, 0x50, + 0x71, 0x83, 0x58, 0x8c, 0xc1, 0x80, 0xf1, 0xd0, 0x56, 0xa5, 0x7a, 0xbd, 0xae, 0xfa, 0x9f, 0xfe, + 0xc1, 0x69, 0x01, 0xf4, 0x2e, 0x7f, 0x48, 0x5e, 0x59, 0x33, 0xfc, 0x81, 0xb7, 0x97, 0x0b, 0xd9, + 0xcf, 0xc6, 0x8d, 0x15, 0xee, 0xc1, 0x53, 0x41, 0x95, 0xc6, 0x65, 0x16, 0xa3, 0x0a, 0xf4, 0x59, + 0x40, 0x31, 0x89, 0xb6, 0xbd, 0x06, 0x59, 0x68, 0xb0, 0x7c, 0xa4, 0xcc, 0xc7, 0x33, 0x64, 0xdc, + 0x2e, 0x40, 0xf5, 0x36, 0x0a, 0xdc, 0xa1, 0x14, 0xba, 0x4c, 0x25, 0x8f, 0x0e, 0x15, 0x31, 0xb0, + 0x52, 0x31, 0x9c, 0xae, 0x92, 0x66, 0x44, 0x1a, 0x4e, 0x42, 0x5c, 0x93, 0x23, 0xce, 0x94, 0xa3, + 0xfb, 0x92, 0x4a, 0x39, 0x0f, 0x66, 0xe4, 0x66, 0x7b, 0xda, 0x79, 0x6a, 0x67, 0x6d, 0x86, 0x71, + 0x72, 0x9d, 0x24, 0xf7, 0xc2, 0xe8, 0x2e, 0x3b, 0x69, 0x18, 0xd2, 0x92, 0xbb, 0xa5, 0x28, 0xac, + 0xd3, 0x51, 0x1d, 0x8a, 0x1d, 0x71, 0xad, 0x56, 0xd9, 0xf9, 0xc1, 0x50, 0xba, 0x76, 0x2e, 0x73, + 0x30, 0x96, 0x78, 0x49, 0xba, 0x5a, 0x5b, 0x62, 0x67, 0x01, 0x19, 0xd2, 0xd5, 0xda, 0x12, 0x96, + 0x78, 0x14, 0xb6, 0x3f, 0x67, 0x36, 0x56, 0xe4, 0x5c, 0xa6, 0x5d, 0x92, 0x17, 0x7c, 0xd1, 0xec, + 0x3e, 0x4c, 0xa8, 0x27, 0xd5, 0x78, 0xde, 0xcd, 0x78, 0x7a, 0xbc, 0xc8, 0x33, 0xf6, 0x1d, 0xd3, + 0x77, 0x2a, 0xbf, 0xde, 0x6a, 0x86, 0x27, 0x6e, 0xab, 0xc5, 0xc8, 0xf1, 0x30, 0x91, 0xfb, 0x8c, + 0xc0, 0x3c, 0x54, 0xe2, 0xd6, 0x1d, 0x37, 0xdc, 0x72, 0xbc, 0x80, 0x39, 0xec, 0xf5, 0x47, 0xd9, + 0x25, 0x02, 0xa7, 0x34, 0xa8, 0x06, 0x43, 0x8e, 0x30, 0xe1, 0x84, 0x63, 0x3d, 0xe7, 0x0e, 0xb8, + 0x34, 0xf8, 0xb8, 0x77, 0x55, 0xfe, 0xc3, 0x8a, 0x0b, 0x7a, 0x05, 0x46, 0xc5, 0x15, 0x26, 0x12, + 0xb1, 0x56, 0x9f, 0x30, 0xc3, 0xdd, 0xeb, 0x12, 0xc9, 0x26, 0x98, 0x49, 0x8b, 0x36, 0x60, 0x8c, + 0x72, 0x49, 0x05, 0xe0, 0xf4, 0x54, 0x6f, 0x32, 0x54, 0x4b, 0xd8, 0xac, 0xb3, 0xc1, 0x19, 0xb6, + 0xc8, 0x85, 0xc7, 0x9c, 0x56, 0x12, 0x6e, 0xd1, 0x95, 0x60, 0xae, 0x93, 0xb5, 0xf0, 0x2e, 0x09, + 0xa6, 0x4f, 0xb2, 0x19, 0x78, 0x66, 0x6f, 0x77, 0xf6, 0xb1, 0x85, 0x03, 0xe8, 0xf0, 0x81, 0x5c, + 0xd0, 0x5b, 0x30, 0x9c, 0x84, 0xbe, 0x88, 0x20, 0x8e, 0xa7, 0x4f, 0x15, 0xc9, 0x3c, 0xb3, 0xa6, + 0x0a, 0xe8, 0x6e, 0x0c, 0xc5, 0x04, 0xeb, 0x1c, 0x67, 0x3e, 0x0d, 0x93, 0x6d, 0x22, 0xa9, 0xa7, + 0x20, 0xcb, 0xff, 0xda, 0x0f, 0x15, 0xe5, 0xd1, 0x43, 0xf3, 0xa6, 0xf3, 0xf6, 0xd1, 0xac, 0xf3, + 0x76, 0x88, 0x2a, 0x50, 0xba, 0xbf, 0xf6, 0x0b, 0x1d, 0x1e, 0xd1, 0x7e, 0x36, 0x77, 0x0d, 0x16, + 0xbf, 0xf7, 0xd4, 0xc3, 0x53, 0xe3, 0xa9, 0x55, 0xd7, 0x77, 0xa0, 0x55, 0x57, 0xf0, 0x61, 0x38, + 0x6a, 0xbf, 0x35, 0x43, 0x77, 0xb5, 0x96, 0x7d, 0xf7, 0xa8, 0x46, 0x81, 0x98, 0xe3, 0x98, 0xde, + 0x4d, 0xf7, 0x54, 0xa6, 0x77, 0x0f, 0x1e, 0x52, 0xef, 0x96, 0x0c, 0x70, 0xca, 0x0b, 0x6d, 0xc3, + 0x64, 0xc3, 0x7c, 0xc6, 0x4a, 0xdd, 0x66, 0x7a, 0xbe, 0x87, 0x67, 0xa4, 0x5a, 0xda, 0x1b, 0x17, + 0x4b, 0x59, 0x7e, 0xb8, 0xbd, 0x0a, 0xf4, 0x0a, 0x0c, 0xbd, 0x1b, 0xc6, 0xec, 0x58, 0x41, 0x6c, + 0x2c, 0xf2, 0xd6, 0xc8, 0xd0, 0x6b, 0x37, 0xea, 0x0c, 0xbe, 0xbf, 0x3b, 0x3b, 0x5c, 0x0b, 0x5d, + 0xf9, 0x17, 0xab, 0x02, 0xe8, 0x2b, 0x16, 0x9c, 0x34, 0xd6, 0x99, 0x6a, 0x39, 0x1c, 0xa6, 0xe5, + 0x8f, 0x8b, 0x9a, 0x4f, 0xae, 0x76, 0xe2, 0x89, 0x3b, 0x57, 0x65, 0xff, 0x36, 0x77, 0x61, 0x0a, + 0xa7, 0x06, 0x89, 0x5b, 0xfe, 0x71, 0xe4, 0x9b, 0xbf, 0x61, 0xf8, 0x5b, 0x1e, 0x80, 0x13, 0xfd, + 0x3f, 0x5b, 0xcc, 0x89, 0xbe, 0x46, 0xb6, 0x9a, 0xbe, 0x93, 0x1c, 0x47, 0x0c, 0xee, 0xe7, 0x61, + 0x28, 0x11, 0xb5, 0x15, 0x4b, 0x96, 0xaf, 0x35, 0x8f, 0x1d, 0x2e, 0xa8, 0x8d, 0x49, 0x42, 0xb1, + 0x62, 0x68, 0xff, 0x7b, 0xfe, 0x55, 0x24, 0xe6, 0x18, 0x3c, 0x05, 0xd7, 0x4d, 0x4f, 0xc1, 0x33, + 0x85, 0xfb, 0xd2, 0xc5, 0x63, 0xf0, 0x03, 0xb3, 0x07, 0xcc, 0x7e, 0xf8, 0xe9, 0x39, 0xe5, 0xb1, + 0x7f, 0xc5, 0x82, 0xa9, 0x4e, 0x87, 0xe2, 0x54, 0xc1, 0xe0, 0xd6, 0x8b, 0x3a, 0xff, 0x52, 0xa3, + 0x7a, 0x4b, 0xc0, 0xb1, 0xa2, 0x28, 0x9c, 0xbd, 0xba, 0xb7, 0x04, 0x4b, 0x37, 0xc0, 0x7c, 0x10, + 0x0d, 0xbd, 0xca, 0x43, 0xee, 0x2d, 0xf5, 0x62, 0x59, 0x6f, 0xe1, 0xf6, 0xf6, 0xaf, 0x97, 0x60, + 0x8a, 0x3b, 0xa1, 0x17, 0xb6, 0x43, 0xcf, 0xad, 0x85, 0xae, 0xb8, 0x80, 0xe0, 0xc2, 0x48, 0x53, + 0x33, 0x3e, 0x8b, 0x25, 0x6c, 0xd1, 0xcd, 0xd5, 0x54, 0xe1, 0xd7, 0xa1, 0xd8, 0xe0, 0x4a, 0x6b, + 0x21, 0xdb, 0x5e, 0x43, 0xf9, 0x34, 0x4b, 0x3d, 0xef, 0x0c, 0xaa, 0x96, 0x65, 0x8d, 0x0f, 0x36, + 0xb8, 0x1e, 0xc1, 0xa3, 0x13, 0xf6, 0x3f, 0xb2, 0xe0, 0x91, 0x2e, 0x49, 0x5d, 0x68, 0x75, 0xf7, + 0x98, 0xe3, 0x5f, 0xbc, 0xb8, 0xa7, 0xaa, 0xe3, 0xc7, 0x01, 0x58, 0x60, 0xd1, 0x1d, 0x00, 0xee, + 0xce, 0x67, 0xef, 0xaf, 0x97, 0x8a, 0x44, 0x0d, 0xb5, 0xa5, 0x4e, 0xd0, 0x6e, 0xd5, 0xab, 0x17, + 0xd7, 0x35, 0xae, 0xf6, 0xb7, 0xcb, 0xd0, 0xcf, 0x1f, 0x76, 0xae, 0xc1, 0xe0, 0x26, 0x4f, 0x32, + 0xdb, 0x5b, 0x8e, 0xdb, 0xd4, 0xb8, 0xe0, 0x00, 0x2c, 0xd9, 0xa0, 0x6b, 0x70, 0x82, 0xee, 0x2c, + 0x9e, 0xe3, 0x57, 0x89, 0xef, 0xec, 0x48, 0x6b, 0x95, 0xbf, 0x44, 0x20, 0x53, 0x66, 0x9f, 0x58, + 0x6d, 0x27, 0xc1, 0x9d, 0xca, 0xa1, 0x57, 0xdb, 0x72, 0xc2, 0xf1, 0xe4, 0xbd, 0x4a, 0x53, 0x3d, + 0x38, 0x2f, 0x1c, 0xd5, 0xa7, 0x9b, 0x6d, 0x76, 0xb9, 0xf6, 0x7e, 0xae, 0x69, 0x8b, 0x9b, 0xb4, + 0x2c, 0xb6, 0xa0, 0xc5, 0x62, 0x2a, 0xd6, 0x36, 0x23, 0x12, 0x6f, 0x86, 0xbe, 0x2b, 0x9e, 0x7e, + 0x4c, 0x63, 0x0b, 0x32, 0x78, 0xdc, 0x56, 0x82, 0x72, 0x59, 0x77, 0x3c, 0xbf, 0x15, 0x91, 0x94, + 0xcb, 0x80, 0xc9, 0x65, 0x25, 0x83, 0xc7, 0x6d, 0x25, 0xe8, 0xdc, 0x3a, 0x29, 0x5e, 0x0b, 0x94, + 0x57, 0x98, 0x85, 0x08, 0xfa, 0x1c, 0x0c, 0xca, 0x40, 0xf6, 0x42, 0x99, 0x36, 0x44, 0xe0, 0x80, + 0x7a, 0x79, 0x50, 0x7b, 0x99, 0x4a, 0x84, 0xb0, 0x4b, 0x7e, 0x87, 0x79, 0x95, 0xee, 0x4f, 0x2d, + 0x38, 0xd1, 0x21, 0x20, 0x8b, 0x8b, 0xb4, 0x0d, 0x2f, 0x4e, 0x54, 0x5e, 0x7c, 0x4d, 0xa4, 0x71, + 0x38, 0x56, 0x14, 0x74, 0xb5, 0x70, 0xa1, 0x99, 0x15, 0x94, 0x22, 0x04, 0x44, 0x60, 0x7b, 0x13, + 0x94, 0xe8, 0x0c, 0xf4, 0xb5, 0x62, 0x12, 0xc9, 0x27, 0xe2, 0xa4, 0x9c, 0x67, 0x7e, 0x40, 0x86, + 0xa1, 0x6a, 0xeb, 0x86, 0x72, 0xc1, 0x69, 0x6a, 0x2b, 0x77, 0xc2, 0x71, 0x9c, 0xfd, 0x8d, 0x32, + 0x8c, 0x67, 0x02, 0x33, 0x69, 0x43, 0xb6, 0xc2, 0xc0, 0x4b, 0x42, 0x95, 0xfd, 0x8c, 0xbf, 0x4a, + 0x45, 0x9a, 0x9b, 0xd7, 0x04, 0x1c, 0x2b, 0x0a, 0xf4, 0xb4, 0x7c, 0x15, 0x34, 0x9b, 0xef, 0x7f, + 0xb1, 0x6a, 0x3c, 0x0c, 0x5a, 0xf4, 0xad, 0x8e, 0x27, 0xa1, 0xaf, 0x19, 0xaa, 0x47, 0x9e, 0xd5, + 0xf7, 0xc4, 0x8b, 0xd5, 0x5a, 0x18, 0xfa, 0x98, 0x21, 0xd1, 0x53, 0xa2, 0xf7, 0x99, 0x93, 0x0b, + 0xec, 0xb8, 0x61, 0xac, 0x0d, 0xc1, 0x33, 0x30, 0x78, 0x97, 0xec, 0x44, 0x5e, 0xb0, 0x91, 0x3d, + 0xb7, 0xb9, 0xc2, 0xc1, 0x58, 0xe2, 0xcd, 0xf7, 0x38, 0x06, 0x8f, 0xf8, 0x3d, 0x8e, 0xa1, 0xdc, + 0x7d, 0xf0, 0xbb, 0x16, 0x8c, 0xb3, 0x94, 0xa0, 0xe2, 0x02, 0xbd, 0x17, 0x06, 0xc7, 0xa0, 0x63, + 0x3c, 0x09, 0xfd, 0x11, 0xad, 0x34, 0x9b, 0x50, 0x9f, 0xb5, 0x04, 0x73, 0x1c, 0x7a, 0x0c, 0xfa, + 0x58, 0x13, 0xe8, 0x67, 0x1c, 0xe1, 0x99, 0xc7, 0xab, 0x4e, 0xe2, 0x60, 0x06, 0x65, 0x77, 0xa1, + 0x30, 0x69, 0xfa, 0x1e, 0x6f, 0x74, 0xea, 0x6e, 0x7d, 0xd8, 0xee, 0x42, 0x75, 0x6c, 0xe4, 0x83, + 0xba, 0x0b, 0xd5, 0x99, 0xf9, 0xc1, 0x7a, 0xfe, 0xff, 0x2a, 0xc1, 0xe9, 0x8e, 0xe5, 0xd2, 0x13, + 0xe0, 0x15, 0xe3, 0x04, 0xf8, 0x42, 0xe6, 0x04, 0xd8, 0x3e, 0xb8, 0xf4, 0x83, 0x39, 0x13, 0xee, + 0x7c, 0x54, 0x5b, 0x3e, 0xc6, 0xa3, 0xda, 0xbe, 0xa2, 0x2a, 0x4e, 0x7f, 0x8e, 0x8a, 0xf3, 0xfb, + 0x16, 0x3c, 0xda, 0x71, 0xc8, 0x1e, 0xba, 0xcb, 0x67, 0x1d, 0x5b, 0xd9, 0xc5, 0x3a, 0xf9, 0xe5, + 0x72, 0x97, 0x5e, 0x31, 0x3b, 0xe5, 0x2c, 0x95, 0x42, 0x0c, 0x19, 0x0b, 0xe5, 0x6d, 0x84, 0x4b, + 0x20, 0x0e, 0xc3, 0x0a, 0x8b, 0x62, 0xed, 0xf2, 0x16, 0x6f, 0xe4, 0xf2, 0x21, 0x17, 0xd4, 0x9c, + 0xe9, 0x27, 0xd7, 0xb3, 0x02, 0x64, 0xaf, 0x74, 0xdd, 0xd6, 0x2c, 0xcf, 0xf2, 0x61, 0x2c, 0xcf, + 0x91, 0xce, 0x56, 0x27, 0x5a, 0x80, 0xf1, 0x2d, 0x2f, 0x60, 0xcf, 0x78, 0x9a, 0xda, 0x93, 0xba, + 0x41, 0x7b, 0xcd, 0x44, 0xe3, 0x2c, 0xfd, 0xcc, 0x2b, 0x30, 0x7a, 0x78, 0xef, 0xda, 0xfb, 0x65, + 0xf8, 0xf0, 0x01, 0x42, 0x81, 0xef, 0x0e, 0xc6, 0x77, 0xd1, 0x76, 0x87, 0xb6, 0x6f, 0x53, 0x83, + 0xa9, 0xf5, 0x96, 0xef, 0xef, 0xb0, 0xf8, 0x29, 0xe2, 0x4a, 0x0a, 0xa1, 0xd4, 0xa8, 0xf7, 0xc2, + 0x57, 0x3a, 0xd0, 0xe0, 0x8e, 0x25, 0xd1, 0x67, 0x01, 0x85, 0x77, 0x58, 0xd2, 0x5c, 0x37, 0xcd, + 0x7a, 0xc0, 0x3e, 0x41, 0x39, 0x5d, 0xaa, 0x37, 0xda, 0x28, 0x70, 0x87, 0x52, 0x54, 0x4f, 0x65, + 0x4f, 0x8d, 0xab, 0x66, 0x65, 0xf4, 0x54, 0xac, 0x23, 0xb1, 0x49, 0x8b, 0x2e, 0xc1, 0xa4, 0xb3, + 0xed, 0x78, 0x3c, 0x09, 0x96, 0x64, 0xc0, 0x15, 0x55, 0xe5, 0xbf, 0x5a, 0xc8, 0x12, 0xe0, 0xf6, + 0x32, 0xa8, 0x69, 0x38, 0x24, 0x79, 0xba, 0xfc, 0x4f, 0x1d, 0x62, 0x06, 0x17, 0x76, 0x51, 0xda, + 0xff, 0xc3, 0xa2, 0x5b, 0x5f, 0x87, 0x17, 0x1f, 0xe9, 0x88, 0x28, 0x07, 0x9b, 0x76, 0x19, 0x4d, + 0x8d, 0xc8, 0x92, 0x8e, 0xc4, 0x26, 0x2d, 0x9f, 0x1a, 0x71, 0x1a, 0xce, 0x6d, 0x68, 0x9b, 0xe2, + 0x1e, 0xa7, 0xa2, 0xa0, 0x1a, 0xb4, 0xeb, 0x6d, 0x7b, 0x71, 0x18, 0x89, 0x05, 0xd4, 0x63, 0x70, + 0x6f, 0x2a, 0x2f, 0xab, 0x9c, 0x0d, 0x96, 0xfc, 0xec, 0x6f, 0x96, 0x60, 0x54, 0xd6, 0xf8, 0x5a, + 0x2b, 0x4c, 0x9c, 0x63, 0xd8, 0xd2, 0x5f, 0x33, 0xb6, 0xf4, 0xf9, 0x62, 0xd7, 0x5a, 0x59, 0xe3, + 0xba, 0x6e, 0xe5, 0x9f, 0xcb, 0x6c, 0xe5, 0xe7, 0x7b, 0x61, 0x7a, 0xf0, 0x16, 0xfe, 0x1f, 0x2d, + 0x98, 0x34, 0xe8, 0x8f, 0x61, 0x27, 0xa9, 0x99, 0x3b, 0xc9, 0x73, 0x3d, 0xf4, 0xa6, 0xcb, 0x0e, + 0xf2, 0x9d, 0x52, 0xa6, 0x17, 0x6c, 0xe7, 0xf8, 0x12, 0xf4, 0x6d, 0x3a, 0x91, 0x5b, 0x2c, 0x23, + 0x64, 0x5b, 0xf1, 0xb9, 0xcb, 0x4e, 0xe4, 0x72, 0xf9, 0x7f, 0x4e, 0xbd, 0x47, 0xe5, 0x44, 0x6e, + 0xee, 0x2d, 0x07, 0x56, 0x29, 0xba, 0x08, 0x03, 0x71, 0x23, 0x6c, 0xaa, 0x38, 0xd0, 0x33, 0xfc, + 0xad, 0x2a, 0x0a, 0xd9, 0xdf, 0x9d, 0x45, 0x66, 0x75, 0x14, 0x8c, 0x05, 0xfd, 0xcc, 0x06, 0x54, + 0x54, 0xd5, 0x47, 0x1a, 0x09, 0xff, 0x3f, 0xcb, 0x70, 0xa2, 0xc3, 0x5c, 0x41, 0x5f, 0x36, 0xc6, + 0xed, 0x95, 0x9e, 0x27, 0xdb, 0x07, 0x1c, 0xb9, 0x2f, 0x33, 0x4b, 0xc9, 0x15, 0xb3, 0xe3, 0x10, + 0xd5, 0xdf, 0x8c, 0x49, 0xb6, 0x7a, 0x0a, 0xca, 0xaf, 0x9e, 0x56, 0x7b, 0x6c, 0xc3, 0x4f, 0x2b, + 0x52, 0x2d, 0x3d, 0xd2, 0xef, 0xfc, 0x37, 0xfa, 0x60, 0xaa, 0xd3, 0xfd, 0x79, 0xf4, 0x35, 0x2b, + 0xf3, 0xec, 0xc3, 0xab, 0xbd, 0x5f, 0xc2, 0xe7, 0x6f, 0x41, 0x88, 0x9c, 0x33, 0x73, 0xe6, 0x43, + 0x10, 0xb9, 0x23, 0x2e, 0x6a, 0x67, 0xf7, 0x93, 0x22, 0xfe, 0x84, 0x87, 0x94, 0x0a, 0x9f, 0x39, + 0x44, 0x53, 0xc4, 0x2b, 0x20, 0x71, 0xe6, 0x7e, 0x92, 0x04, 0xe7, 0xdf, 0x4f, 0x92, 0x6d, 0x98, + 0xf1, 0x60, 0x58, 0xeb, 0xd7, 0x91, 0x4e, 0x83, 0xbb, 0x74, 0x8b, 0xd2, 0xda, 0x7d, 0xa4, 0x53, + 0xe1, 0xef, 0x5b, 0x90, 0x09, 0xda, 0x52, 0x6e, 0x19, 0xab, 0xab, 0x5b, 0xe6, 0x0c, 0xf4, 0x45, + 0xa1, 0x4f, 0xb2, 0x4f, 0x12, 0xe0, 0xd0, 0x27, 0x98, 0x61, 0xd4, 0x13, 0xb5, 0xe5, 0x6e, 0x4f, + 0xd4, 0x52, 0x3b, 0xdd, 0x27, 0xdb, 0x44, 0x3a, 0x49, 0x94, 0x18, 0xbf, 0x4a, 0x81, 0x98, 0xe3, + 0xec, 0xdf, 0x2b, 0xc3, 0x00, 0xf7, 0x44, 0x1c, 0xc3, 0x3e, 0x5d, 0x13, 0x4e, 0x81, 0x42, 0x77, + 0xd2, 0x79, 0xab, 0xe6, 0xaa, 0x4e, 0xe2, 0xf0, 0xc9, 0xa5, 0xfa, 0x98, 0x3a, 0x12, 0xd0, 0x9c, + 0x31, 0x0a, 0x33, 0x19, 0x5b, 0x17, 0x38, 0x0f, 0x6d, 0x4c, 0x36, 0x01, 0x62, 0xf6, 0x24, 0x22, + 0xe5, 0x21, 0x32, 0x6f, 0xbe, 0x58, 0xa8, 0x1d, 0x75, 0x55, 0x8c, 0xb7, 0x26, 0x4d, 0xf7, 0xa7, + 0x10, 0x58, 0xe3, 0x3d, 0xf3, 0x32, 0x54, 0x14, 0x71, 0x9e, 0x11, 0x30, 0xa2, 0x4f, 0xce, 0xbf, + 0x02, 0xe3, 0x99, 0xba, 0x7a, 0xb2, 0x21, 0x7e, 0xcb, 0x82, 0xf1, 0xcc, 0x6b, 0xee, 0xe8, 0xab, + 0x16, 0x4c, 0xf9, 0x1d, 0x1c, 0x51, 0xe2, 0x33, 0x1f, 0xc6, 0x85, 0xa5, 0xcc, 0x87, 0x4e, 0x58, + 0xdc, 0xb1, 0x36, 0x6a, 0x56, 0xf2, 0x17, 0x5e, 0x1d, 0x5f, 0xc4, 0xc0, 0x8e, 0xf0, 0x9c, 0xc3, + 0x1c, 0x86, 0x15, 0xd6, 0xfe, 0x89, 0x05, 0x93, 0x6d, 0x0f, 0x86, 0x3f, 0x2c, 0xdd, 0x10, 0xd9, + 0x95, 0x4b, 0x5d, 0xb2, 0x2b, 0xeb, 0xbd, 0x2c, 0x1f, 0xd8, 0xcb, 0x5f, 0xb7, 0x40, 0xcc, 0xd0, + 0x63, 0xd0, 0x00, 0x57, 0x4d, 0x0d, 0xf0, 0x23, 0x45, 0x26, 0x7d, 0x17, 0xd5, 0xef, 0x97, 0x4a, + 0x30, 0xc1, 0x09, 0x52, 0x9f, 0xfa, 0xc3, 0xf2, 0x71, 0x7a, 0x7b, 0xf5, 0x43, 0x3d, 0xb5, 0xd8, + 0xb9, 0xa7, 0xc6, 0xb7, 0xec, 0x3b, 0xf0, 0x5b, 0xfe, 0xb9, 0x05, 0x88, 0x8f, 0x49, 0xf6, 0x79, + 0x5c, 0xee, 0xdc, 0xd5, 0x0c, 0xba, 0x54, 0x72, 0x28, 0x0c, 0xd6, 0xa8, 0x1e, 0x70, 0x17, 0x32, + 0x27, 0x1a, 0xe5, 0xfc, 0x13, 0x8d, 0x1e, 0x7a, 0xfd, 0xdb, 0x65, 0xc8, 0x06, 0xc3, 0xa1, 0xb7, + 0x61, 0xa4, 0xe1, 0x34, 0x9d, 0x3b, 0x9e, 0xef, 0x25, 0x1e, 0x89, 0x8b, 0x1d, 0x99, 0x2e, 0x69, + 0x25, 0xc4, 0x41, 0x82, 0x06, 0xc1, 0x06, 0x47, 0x34, 0x07, 0xd0, 0x8c, 0xbc, 0x6d, 0xcf, 0x27, + 0x1b, 0x4c, 0x67, 0x65, 0xd1, 0xf4, 0xfc, 0xf4, 0x4f, 0x42, 0xb1, 0x46, 0xd1, 0x21, 0xfa, 0xba, + 0x7c, 0x1c, 0xd1, 0xd7, 0x7d, 0x3d, 0x46, 0x5f, 0xf7, 0x17, 0x8a, 0xbe, 0xc6, 0x70, 0x4a, 0xfa, + 0xff, 0xe9, 0xff, 0x15, 0xcf, 0x27, 0x3c, 0xc9, 0xac, 0x88, 0xb6, 0x9f, 0xd9, 0xdb, 0x9d, 0x3d, + 0x85, 0x3b, 0x52, 0xe0, 0x2e, 0x25, 0xed, 0x16, 0x9c, 0xa8, 0x93, 0xc8, 0x63, 0xb9, 0xff, 0xdc, + 0x74, 0x2d, 0x7d, 0x01, 0x2a, 0x51, 0x66, 0x19, 0xf7, 0x78, 0xa5, 0x5a, 0xcb, 0x16, 0x25, 0x97, + 0x6d, 0xca, 0xd2, 0xfe, 0x5b, 0x25, 0x18, 0x14, 0x61, 0x70, 0xc7, 0xa0, 0x7c, 0x5c, 0x31, 0x9c, + 0x04, 0xcf, 0xe4, 0xc9, 0x3f, 0xd6, 0xac, 0xae, 0xee, 0x81, 0x7a, 0xc6, 0x3d, 0xf0, 0x5c, 0x31, + 0x76, 0x07, 0x3b, 0x06, 0xfe, 0x79, 0x19, 0xc6, 0xcc, 0xb0, 0xc0, 0x63, 0x18, 0x96, 0xd7, 0x61, + 0x30, 0x16, 0x11, 0xaa, 0xa5, 0x22, 0x51, 0x57, 0xd9, 0x4f, 0x9c, 0x9e, 0xa5, 0x8a, 0x98, 0x54, + 0xc9, 0xae, 0x63, 0x10, 0x6c, 0xf9, 0x58, 0x82, 0x60, 0xf3, 0xa2, 0x35, 0xfb, 0x1e, 0x44, 0xb4, + 0xa6, 0xfd, 0x43, 0x26, 0xf2, 0x75, 0xf8, 0x31, 0x6c, 0xe3, 0xaf, 0x99, 0x9b, 0xc3, 0xb9, 0x42, + 0xf3, 0x4e, 0x34, 0xaf, 0xcb, 0x76, 0xfe, 0x3d, 0x0b, 0x86, 0x05, 0xe1, 0x31, 0x74, 0xe0, 0xb3, + 0x66, 0x07, 0x9e, 0x2a, 0xd4, 0x81, 0x2e, 0x2d, 0xff, 0x66, 0x49, 0xb5, 0xbc, 0x26, 0x9e, 0x34, + 0xcf, 0xcd, 0x74, 0x3c, 0xd4, 0x8c, 0xc2, 0x24, 0x6c, 0x84, 0xbe, 0x50, 0xe0, 0x1e, 0x4b, 0x2f, + 0x57, 0x71, 0xf8, 0xbe, 0xf6, 0x1b, 0x2b, 0x6a, 0x76, 0xf7, 0x27, 0x8c, 0x12, 0xb1, 0x81, 0x76, + 0x7a, 0x50, 0xdd, 0x05, 0x48, 0x5f, 0xb1, 0x16, 0xf7, 0x12, 0x7b, 0x7f, 0xaa, 0x3d, 0xbd, 0x2d, + 0xa5, 0x78, 0x61, 0x8d, 0xaf, 0x0c, 0xc3, 0x67, 0x75, 0xf4, 0x9b, 0x67, 0x00, 0xd7, 0x05, 0x1c, + 0x2b, 0x0a, 0xfb, 0x65, 0x26, 0xd9, 0xd9, 0x00, 0xf5, 0x76, 0x91, 0xe9, 0x17, 0x07, 0xd4, 0xd0, + 0x32, 0xc7, 0xde, 0x75, 0xfd, 0xba, 0x54, 0x51, 0xf1, 0x49, 0x9b, 0xa0, 0x47, 0xc2, 0xa6, 0xb7, + 0xab, 0x10, 0x69, 0x3b, 0x38, 0x7a, 0xb9, 0xb0, 0x44, 0xee, 0xe1, 0xa8, 0x88, 0x25, 0x77, 0x63, + 0x19, 0xad, 0x56, 0x6b, 0xd9, 0xfc, 0xd4, 0x4b, 0x12, 0x81, 0x53, 0x1a, 0x34, 0x2f, 0x0c, 0x4a, + 0xf3, 0xc5, 0x7b, 0x69, 0x50, 0xca, 0x21, 0xd1, 0x2c, 0xca, 0xf3, 0x30, 0xac, 0x9e, 0xfc, 0xa8, + 0xf1, 0xc7, 0x16, 0x2a, 0x5c, 0xbf, 0x5a, 0x4e, 0xc1, 0x58, 0xa7, 0x41, 0xab, 0x70, 0xc2, 0x55, + 0xb7, 0x2e, 0x6a, 0xad, 0x3b, 0xbe, 0xd7, 0xa0, 0x45, 0xf9, 0x8d, 0xc9, 0x47, 0xf6, 0x76, 0x67, + 0x4f, 0x54, 0xdb, 0xd1, 0xb8, 0x53, 0x19, 0xb4, 0x06, 0xe3, 0x31, 0x7f, 0xda, 0x44, 0x86, 0xd6, + 0x8b, 0xb4, 0xad, 0xcf, 0xca, 0x13, 0xab, 0xba, 0x89, 0xde, 0x67, 0x20, 0x2e, 0x15, 0x64, 0x30, + 0x7e, 0x96, 0x05, 0x7a, 0x15, 0xc6, 0x7c, 0xfd, 0xdd, 0xc6, 0x9a, 0xb8, 0x7c, 0xa2, 0x62, 0x90, + 0x8c, 0x57, 0x1d, 0x6b, 0x38, 0x43, 0x8d, 0x5e, 0x87, 0x69, 0x1d, 0x22, 0x32, 0xc1, 0x38, 0xc1, + 0x06, 0x89, 0xc5, 0x33, 0x08, 0x8f, 0xed, 0xed, 0xce, 0x4e, 0x5f, 0xed, 0x42, 0x83, 0xbb, 0x96, + 0x46, 0x17, 0x61, 0x44, 0x8e, 0xa4, 0x76, 0x11, 0x25, 0x8d, 0x7e, 0xd3, 0x70, 0xd8, 0xa0, 0xfc, + 0x60, 0x07, 0x73, 0x5f, 0xa2, 0x85, 0xb5, 0x2d, 0x1c, 0xbd, 0x03, 0x23, 0x7a, 0x1b, 0xb3, 0x7b, + 0x73, 0xfe, 0x5b, 0x98, 0x42, 0x15, 0x50, 0x2d, 0xd7, 0x71, 0xd8, 0xe0, 0x6d, 0xdf, 0x80, 0x81, + 0xfa, 0x4e, 0xdc, 0x48, 0xfc, 0x02, 0xf2, 0xed, 0x49, 0xa3, 0x0b, 0xe9, 0xda, 0x63, 0xef, 0xf2, + 0x88, 0x1e, 0xd9, 0x04, 0xc6, 0xd7, 0x96, 0x6a, 0xfc, 0xd5, 0xff, 0x05, 0x6e, 0xbd, 0x61, 0x21, + 0xdd, 0xac, 0x43, 0x4a, 0xad, 0x0e, 0xf2, 0xd0, 0xfe, 0x13, 0x0b, 0xfa, 0xd9, 0x9b, 0x32, 0x79, + 0xef, 0x11, 0x15, 0x69, 0x34, 0x7a, 0x09, 0x06, 0xc8, 0xfa, 0x3a, 0x69, 0x24, 0x62, 0x19, 0xcb, + 0x68, 0xef, 0x81, 0x65, 0x06, 0xa5, 0x8b, 0x93, 0x55, 0xc6, 0xff, 0x62, 0x41, 0x8c, 0x3e, 0x0f, + 0x95, 0xc4, 0xdb, 0x22, 0x0b, 0xae, 0x4b, 0xdc, 0x43, 0xdc, 0x15, 0x57, 0xc2, 0x62, 0x4d, 0x32, + 0xc1, 0x29, 0x3f, 0xfb, 0xbd, 0x12, 0x40, 0x7a, 0xd7, 0x22, 0xaf, 0x9b, 0x8b, 0x6d, 0xcf, 0x2e, + 0x3d, 0xdd, 0xe1, 0xd9, 0x25, 0x94, 0x32, 0xec, 0xf0, 0xe8, 0x92, 0x1a, 0xaa, 0x72, 0xa1, 0xa1, + 0xea, 0xeb, 0x65, 0xa8, 0x96, 0x60, 0x32, 0xbd, 0x2b, 0x62, 0x5e, 0xba, 0x63, 0x49, 0x18, 0xd7, + 0xb2, 0x48, 0xdc, 0x4e, 0x6f, 0xbf, 0x67, 0x81, 0x08, 0x59, 0x2b, 0x30, 0x5b, 0x5d, 0xf9, 0x44, + 0x8a, 0x91, 0x87, 0xea, 0xd9, 0x22, 0xd1, 0x7c, 0x22, 0xfb, 0x94, 0x5a, 0x3f, 0x46, 0xce, 0x29, + 0x83, 0xab, 0xfd, 0x1b, 0x16, 0x0c, 0x73, 0xf4, 0x35, 0xa6, 0x53, 0xe7, 0xb7, 0xab, 0xa7, 0x0c, + 0x9f, 0xec, 0xf5, 0x10, 0xca, 0x58, 0x65, 0x7a, 0xd4, 0x5f, 0x0f, 0x91, 0x08, 0x9c, 0xd2, 0xa0, + 0x67, 0x60, 0x30, 0x6e, 0xdd, 0x61, 0xe4, 0x99, 0xf8, 0xb5, 0x3a, 0x07, 0x63, 0x89, 0xb7, 0xff, + 0x65, 0x09, 0x26, 0xb2, 0xe1, 0x8b, 0x08, 0xc3, 0x00, 0xd7, 0xb1, 0xb3, 0xea, 0xd9, 0x41, 0xbe, + 0x1c, 0x2d, 0xfc, 0x11, 0xf8, 0x1b, 0xb8, 0x2c, 0xe6, 0x4c, 0x70, 0x42, 0xeb, 0x30, 0xec, 0x86, + 0xf7, 0x82, 0x7b, 0x4e, 0xe4, 0x2e, 0xd4, 0x56, 0xc5, 0x97, 0xc8, 0x09, 0x38, 0xa9, 0xa6, 0x05, + 0xf4, 0xe0, 0x4a, 0xe6, 0x5b, 0x48, 0x51, 0x58, 0x67, 0x4c, 0x6d, 0xca, 0x46, 0x18, 0xac, 0x7b, + 0x1b, 0xd7, 0x9c, 0x66, 0xb1, 0xa3, 0xd5, 0x25, 0x49, 0xae, 0xd5, 0x31, 0x2a, 0x6e, 0xd9, 0x73, + 0x04, 0x4e, 0x59, 0xda, 0x7f, 0x70, 0x02, 0x8c, 0xb9, 0x60, 0xa4, 0xe1, 0xb4, 0x1e, 0x78, 0x1a, + 0xce, 0x37, 0x61, 0x88, 0x6c, 0x35, 0x93, 0x9d, 0xaa, 0x17, 0x15, 0x4b, 0xaa, 0xbc, 0x2c, 0xa8, + 0xdb, 0xb9, 0x4b, 0x0c, 0x56, 0x1c, 0xbb, 0x24, 0x55, 0x2d, 0x3f, 0x14, 0x49, 0x55, 0xfb, 0xfe, + 0x42, 0x92, 0xaa, 0xbe, 0x0e, 0x83, 0x1b, 0x5e, 0x82, 0x49, 0x33, 0x14, 0x69, 0x0b, 0x72, 0x26, + 0xcf, 0x25, 0x4e, 0xdc, 0x9e, 0x29, 0x51, 0x20, 0xb0, 0x64, 0x87, 0xd6, 0xd4, 0xa2, 0x1a, 0x28, + 0xb2, 0x97, 0xb7, 0xfb, 0xfa, 0x3a, 0x2e, 0x2b, 0x91, 0x44, 0x75, 0xf0, 0x83, 0x27, 0x51, 0x55, + 0xa9, 0x4f, 0x87, 0x1e, 0x54, 0xea, 0x53, 0x23, 0x85, 0x6c, 0xe5, 0x28, 0x52, 0xc8, 0xbe, 0x67, + 0xc1, 0xc9, 0x66, 0xa7, 0x04, 0xcc, 0x22, 0x89, 0xe9, 0xa7, 0x0f, 0x91, 0x92, 0xda, 0xa8, 0x9a, + 0x5d, 0x06, 0xef, 0x48, 0x86, 0x3b, 0x57, 0x2c, 0x73, 0xd1, 0x0e, 0x7f, 0xf0, 0x5c, 0xb4, 0x47, + 0x9d, 0xed, 0x34, 0xcd, 0x4c, 0x3b, 0x7a, 0x24, 0x99, 0x69, 0xc7, 0x1e, 0x60, 0x66, 0x5a, 0x2d, + 0xa7, 0xec, 0xf8, 0x83, 0xcd, 0x29, 0xbb, 0x69, 0xee, 0x4b, 0x3c, 0x85, 0xe9, 0x4b, 0x85, 0xf7, + 0x25, 0xa3, 0x86, 0x83, 0x77, 0x26, 0x9e, 0x5d, 0x77, 0xf2, 0x03, 0x66, 0xd7, 0x35, 0x72, 0xd4, + 0xa2, 0xa3, 0xc8, 0x51, 0xfb, 0xb6, 0xbe, 0x83, 0x9e, 0x28, 0x52, 0x83, 0xda, 0x28, 0xdb, 0x6b, + 0xe8, 0xb4, 0x87, 0xb6, 0x67, 0xc1, 0x9d, 0x3a, 0xee, 0x2c, 0xb8, 0x27, 0x8f, 0x30, 0x0b, 0xee, + 0xa9, 0x63, 0xcd, 0x82, 0xfb, 0xc8, 0x43, 0x92, 0x05, 0x77, 0xfa, 0x28, 0xb3, 0xe0, 0xd2, 0x01, + 0x6e, 0xca, 0xab, 0x3a, 0xd3, 0x8f, 0x16, 0x19, 0xe0, 0x8e, 0x37, 0x7b, 0xf8, 0x00, 0x2b, 0x14, + 0x4e, 0x99, 0xda, 0x7f, 0x0d, 0x4e, 0x1f, 0x3c, 0xc1, 0xd2, 0xb7, 0x27, 0x6a, 0xa9, 0x67, 0x2b, + 0xf3, 0xf6, 0x04, 0x53, 0xde, 0x34, 0xaa, 0xc2, 0x69, 0x3a, 0xbf, 0x63, 0xc1, 0x23, 0x5d, 0xb2, + 0xd8, 0x15, 0xbe, 0xe7, 0xd6, 0x84, 0xf1, 0xa6, 0x59, 0xb4, 0xf0, 0xb5, 0x59, 0x23, 0x6b, 0x9e, + 0x8a, 0x45, 0xce, 0x20, 0x70, 0x96, 0xfd, 0xe2, 0x47, 0x7e, 0xf4, 0xfe, 0xe9, 0x0f, 0xfd, 0xf8, + 0xfd, 0xd3, 0x1f, 0xfa, 0xa3, 0xf7, 0x4f, 0x7f, 0xe8, 0xe7, 0xf6, 0x4e, 0x5b, 0x3f, 0xda, 0x3b, + 0x6d, 0xfd, 0x78, 0xef, 0xb4, 0xf5, 0xa7, 0x7b, 0xa7, 0xad, 0xf7, 0x7e, 0x72, 0xfa, 0x43, 0x6f, + 0x94, 0xb6, 0xcf, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb2, 0xb1, 0xc5, 0x2d, 0xcc, 0xc5, + 0x00, 0x00, } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto index 7425337af73..73eab9a5c3a 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto +++ b/staging/src/k8s.io/client-go/pkg/api/v1/generated.proto @@ -680,10 +680,18 @@ message DeleteOptions { // +optional optional Preconditions preconditions = 2; + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional optional bool orphanDependents = 3; + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + optional string propagationPolicy = 4; } // Represents downward API info for projecting into a projected volume. diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/meta.go b/staging/src/k8s.io/client-go/pkg/api/v1/meta.go index fd30ef1f584..bb1ae2ff79d 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/meta.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/meta.go @@ -63,6 +63,10 @@ func (meta *ObjectMeta) GetOwnerReferences() []metav1.OwnerReference { value := *meta.OwnerReferences[i].Controller ret[i].Controller = &value } + if meta.OwnerReferences[i].BlockOwnerDeletion != nil { + value := *meta.OwnerReferences[i].BlockOwnerDeletion + ret[i].BlockOwnerDeletion = &value + } } return ret } @@ -78,6 +82,10 @@ func (meta *ObjectMeta) SetOwnerReferences(references []metav1.OwnerReference) { value := *references[i].Controller newReferences[i].Controller = &value } + if references[i].BlockOwnerDeletion != nil { + value := *references[i].BlockOwnerDeletion + newReferences[i].BlockOwnerDeletion = &value + } } meta.OwnerReferences = newReferences } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go index 8b203c54b48..3ff5805149c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.generated.go @@ -51338,6 +51338,32 @@ func (x *Preconditions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } +func (x DeletionPropagation) CodecEncodeSelf(e *codec1978.Encoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperEncoder(e) + _, _, _ = h, z, r + yym1 := z.EncBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.EncExt(x) { + } else { + r.EncodeString(codecSelferC_UTF81234, string(x)) + } +} + +func (x *DeletionPropagation) CodecDecodeSelf(d *codec1978.Decoder) { + var h codecSelfer1234 + z, r := codec1978.GenHelperDecoder(d) + _, _, _ = h, z, r + yym1 := z.DecBinary() + _ = yym1 + if false { + } else if z.HasExtensions() && z.DecExt(x) { + } else { + *((*string)(x)) = r.DecodeString() + } +} + func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { var h codecSelfer1234 z, r := codec1978.GenHelperEncoder(e) @@ -51352,7 +51378,7 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { } else { yysep2 := !z.EncBinary() yy2arr2 := z.EncBasicHandle().StructToArray - var yyq2 [5]bool + var yyq2 [6]bool _, _, _ = yysep2, yyq2, yy2arr2 const yyr2 bool = false yyq2[0] = x.Kind != "" @@ -51362,9 +51388,9 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { yyq2[4] = x.OrphanDependents != nil var yynn2 int if yyr2 || yy2arr2 { - r.EncodeArrayStart(5) + r.EncodeArrayStart(6) } else { - yynn2 = 0 + yynn2 = 1 for _, b := range yyq2 { if b { yynn2++ @@ -51516,6 +51542,25 @@ func (x *DeleteOptions) CodecEncodeSelf(e *codec1978.Encoder) { } } } + if yyr2 || yy2arr2 { + z.EncSendContainerState(codecSelfer_containerArrayElem1234) + if x.PropagationPolicy == nil { + r.EncodeNil() + } else { + yy23 := *x.PropagationPolicy + yy23.CodecEncodeSelf(e) + } + } else { + z.EncSendContainerState(codecSelfer_containerMapKey1234) + r.EncodeString(codecSelferC_UTF81234, string("PropagationPolicy")) + z.EncSendContainerState(codecSelfer_containerMapValue1234) + if x.PropagationPolicy == nil { + r.EncodeNil() + } else { + yy25 := *x.PropagationPolicy + yy25.CodecEncodeSelf(e) + } + } if yyr2 || yy2arr2 { z.EncSendContainerState(codecSelfer_containerArrayEnd1234) } else { @@ -51644,6 +51689,17 @@ func (x *DeleteOptions) codecDecodeSelfFromMap(l int, d *codec1978.Decoder) { *((*bool)(x.OrphanDependents)) = r.DecodeBool() } } + case "PropagationPolicy": + if r.TryDecodeAsNil() { + if x.PropagationPolicy != nil { + x.PropagationPolicy = nil + } + } else { + if x.PropagationPolicy == nil { + x.PropagationPolicy = new(DeletionPropagation) + } + x.PropagationPolicy.CodecDecodeSelf(d) + } default: z.DecStructFieldNotFound(-1, yys3) } // end switch yys3 @@ -51655,16 +51711,16 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { var h codecSelfer1234 z, r := codec1978.GenHelperDecoder(d) _, _, _ = h, z, r - var yyj13 int - var yyb13 bool - var yyhl13 bool = l >= 0 - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + var yyj14 int + var yyb14 bool + var yyhl14 bool = l >= 0 + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51672,21 +51728,21 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.Kind = "" } else { - yyv14 := &x.Kind - yym15 := z.DecBinary() - _ = yym15 + yyv15 := &x.Kind + yym16 := z.DecBinary() + _ = yym16 if false { } else { - *((*string)(yyv14)) = r.DecodeString() + *((*string)(yyv15)) = r.DecodeString() } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51694,21 +51750,21 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if r.TryDecodeAsNil() { x.APIVersion = "" } else { - yyv16 := &x.APIVersion - yym17 := z.DecBinary() - _ = yym17 + yyv17 := &x.APIVersion + yym18 := z.DecBinary() + _ = yym18 if false { } else { - *((*string)(yyv16)) = r.DecodeString() + *((*string)(yyv17)) = r.DecodeString() } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51721,20 +51777,20 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.GracePeriodSeconds == nil { x.GracePeriodSeconds = new(int64) } - yym19 := z.DecBinary() - _ = yym19 + yym20 := z.DecBinary() + _ = yym20 if false { } else { *((*int64)(x.GracePeriodSeconds)) = int64(r.DecodeInt(64)) } } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51749,13 +51805,13 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { } x.Preconditions.CodecDecodeSelf(d) } - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l } else { - yyb13 = r.CheckBreak() + yyb14 = r.CheckBreak() } - if yyb13 { + if yyb14 { z.DecSendContainerState(codecSelfer_containerArrayEnd1234) return } @@ -51768,25 +51824,46 @@ func (x *DeleteOptions) codecDecodeSelfFromArray(l int, d *codec1978.Decoder) { if x.OrphanDependents == nil { x.OrphanDependents = new(bool) } - yym22 := z.DecBinary() - _ = yym22 + yym23 := z.DecBinary() + _ = yym23 if false { } else { *((*bool)(x.OrphanDependents)) = r.DecodeBool() } } - for { - yyj13++ - if yyhl13 { - yyb13 = yyj13 > l - } else { - yyb13 = r.CheckBreak() + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { + z.DecSendContainerState(codecSelfer_containerArrayEnd1234) + return + } + z.DecSendContainerState(codecSelfer_containerArrayElem1234) + if r.TryDecodeAsNil() { + if x.PropagationPolicy != nil { + x.PropagationPolicy = nil } - if yyb13 { + } else { + if x.PropagationPolicy == nil { + x.PropagationPolicy = new(DeletionPropagation) + } + x.PropagationPolicy.CodecDecodeSelf(d) + } + for { + yyj14++ + if yyhl14 { + yyb14 = yyj14 > l + } else { + yyb14 = r.CheckBreak() + } + if yyb14 { break } z.DecSendContainerState(codecSelfer_containerArrayElem1234) - z.DecStructFieldNotFound(yyj13-1, "") + z.DecStructFieldNotFound(yyj14-1, "") } z.DecSendContainerState(codecSelfer_containerArrayEnd1234) } @@ -65736,7 +65813,7 @@ func (x codecSelfer1234) decSlicev1_OwnerReference(v *[]pkg2_v1.OwnerReference, yyrg1 := len(yyv1) > 0 yyv21 := yyv1 - yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 72) + yyrl1, yyrt1 = z.DecInferLen(yyl1, z.DecBasicHandle().MaxInitLen, 80) if yyrt1 { if yyrl1 <= cap(yyv1) { yyv1 = yyv1[:yyrl1] diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types.go b/staging/src/k8s.io/client-go/pkg/api/v1/types.go index 2b7b025e9b5..1961f367df8 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types.go @@ -3432,6 +3432,20 @@ type Preconditions struct { UID *types.UID `json:"uid,omitempty" protobuf:"bytes,1,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` } +// DeletionPropagation decides if a deletion will propagate to the dependents of the object, and how the garbage collector will handle the propagation. +type DeletionPropagation string + +const ( + // Orphans the dependents. + DeletePropagationOrphan DeletionPropagation = "Orphan" + // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background. + DeletePropagationBackground DeletionPropagation = "Background" + // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. + // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp. + // This policy is cascading, i.e., the dependents will be deleted with Foreground. + DeletePropagationForeground DeletionPropagation = "Foreground" +) + // DeleteOptions may be provided when deleting an API object // DEPRECATED: This type has been moved to meta/v1 and will be removed soon. // +k8s:openapi-gen=false @@ -3450,10 +3464,18 @@ type DeleteOptions struct { // +optional Preconditions *Preconditions `json:"preconditions,omitempty" protobuf:"bytes,2,opt,name=preconditions"` + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional OrphanDependents *bool `json:"orphanDependents,omitempty" protobuf:"varint,3,opt,name=orphanDependents"` + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + PropagationPolicy *DeletionPropagation } // ListOptions is the query options to a standard REST list call. diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go index f0516f89fb1..bc7d261501c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/types_swagger_doc_generated.go @@ -355,7 +355,8 @@ var map_DeleteOptions = map[string]string{ "": "DeleteOptions may be provided when deleting an API object DEPRECATED: This type has been moved to meta/v1 and will be removed soon.", "gracePeriodSeconds": "The duration in seconds before the object should be deleted. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period for the specified type will be used. Defaults to a per object value if not specified. zero means delete immediately.", "preconditions": "Must be fulfilled before a deletion is carried out. If not possible, a 409 Conflict status will be returned.", - "orphanDependents": "Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list.", + "orphanDependents": "Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. Should the dependent objects be orphaned. If true/false, the \"orphan\" finalizer will be added to/removed from the object's finalizers list. Either this field or PropagationPolicy may be set, but not both.", + "PropagationPolicy": "Whether and how garbage collection will be performed. Defaults to Default. Either this field or OrphanDependents may be set, but not both.", } func (DeleteOptions) SwaggerDoc() map[string]string { diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go index a1bb04d7c62..96ee31815fe 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.conversion.go @@ -1064,6 +1064,7 @@ func autoConvert_v1_DeleteOptions_To_api_DeleteOptions(in *DeleteOptions, out *a out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds)) out.Preconditions = (*api.Preconditions)(unsafe.Pointer(in.Preconditions)) out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents)) + out.PropagationPolicy = (*api.DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy)) return nil } @@ -1075,6 +1076,7 @@ func autoConvert_api_DeleteOptions_To_v1_DeleteOptions(in *api.DeleteOptions, ou out.GracePeriodSeconds = (*int64)(unsafe.Pointer(in.GracePeriodSeconds)) out.Preconditions = (*Preconditions)(unsafe.Pointer(in.Preconditions)) out.OrphanDependents = (*bool)(unsafe.Pointer(in.OrphanDependents)) + out.PropagationPolicy = (*DeletionPropagation)(unsafe.Pointer(in.PropagationPolicy)) return nil } diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go index a1c916a6604..76fa388827c 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/zz_generated.deepcopy.go @@ -734,6 +734,11 @@ func DeepCopy_v1_DeleteOptions(in interface{}, out interface{}, c *conversion.Cl *out = new(bool) **out = **in } + if in.PropagationPolicy != nil { + in, out := &in.PropagationPolicy, &out.PropagationPolicy + *out = new(DeletionPropagation) + **out = **in + } return nil } } diff --git a/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go b/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go index 47fc350748b..2d56e395184 100644 --- a/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go +++ b/staging/src/k8s.io/client-go/pkg/api/zz_generated.deepcopy.go @@ -762,6 +762,11 @@ func DeepCopy_api_DeleteOptions(in interface{}, out interface{}, c *conversion.C *out = new(bool) **out = **in } + if in.PropagationPolicy != nil { + in, out := &in.PropagationPolicy, &out.PropagationPolicy + *out = new(DeletionPropagation) + **out = **in + } return nil } } diff --git a/vendor/BUILD b/vendor/BUILD index ea9b9565315..9cd8d19559d 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -10272,6 +10272,7 @@ go_library( "//vendor:k8s.io/apimachinery/pkg/api/validation/path", "//vendor:k8s.io/apimachinery/pkg/apis/meta/internalversion", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", + "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1/validation", "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/runtime/schema", "//vendor:k8s.io/apimachinery/pkg/util/uuid", From 5bfacf59f6396e15a6e010ca4d9fefca2b4c1bdd Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 23 Feb 2017 11:14:55 -0800 Subject: [PATCH 2/5] API --- .../configmap/configmap_controller_test.go | 2 +- .../daemonset/daemonset_controller_test.go | 2 +- .../ingress/ingress_controller_test.go | 4 +- .../namespace/namespace_controller_test.go | 2 +- .../secret/secret_controller_test.go | 2 +- .../util/deletionhelper/deletion_helper.go | 8 ++-- pkg/api/helpers.go | 2 +- pkg/api/meta_test.go | 46 ------------------ pkg/api/types.go | 22 +++++++++ pkg/api/v1/helpers.go | 2 +- pkg/api/v1/meta.go | 8 ++++ pkg/api/v1/types.go | 22 +++++++++ pkg/api/validation/validation.go | 1 - pkg/apimachinery/tests/api_meta_meta_test.go | 17 +++---- ...pis_meta_v1_unstructed_unstructure_test.go | 48 +++++++++++-------- .../core/namespace/storage/storage.go | 2 +- .../k8s.io/apimachinery/pkg/api/meta/meta.go | 14 ++++++ .../pkg/api/validation/objectmeta.go | 22 ++++++++- .../pkg/api/validation/objectmeta_test.go | 22 +++++++++ .../apimachinery/pkg/apis/meta/v1/meta.go | 8 ++++ .../apimachinery/pkg/apis/meta/v1/types.go | 37 +++++++++++++- .../apis/meta/v1/unstructured/unstructured.go | 36 ++++++++++---- .../pkg/apis/meta/v1/validation/validation.go | 16 +++++++ .../src/k8s.io/client-go/pkg/api/helpers.go | 2 +- .../k8s.io/client-go/pkg/api/v1/helpers.go | 2 +- 25 files changed, 247 insertions(+), 102 deletions(-) diff --git a/federation/pkg/federation-controller/configmap/configmap_controller_test.go b/federation/pkg/federation-controller/configmap/configmap_controller_test.go index 465b790d221..597f8416983 100644 --- a/federation/pkg/federation-controller/configmap/configmap_controller_test.go +++ b/federation/pkg/federation-controller/configmap/configmap_controller_test.go @@ -104,7 +104,7 @@ func TestConfigMapController(t *testing.T) { // There should be 2 updates to add both the finalizers. updatedConfigMap := GetConfigMapFromChan(configmapUpdateChan) assert.True(t, configmapController.hasFinalizerFunc(updatedConfigMap, deletionhelper.FinalizerDeleteFromUnderlyingClusters)) - assert.True(t, configmapController.hasFinalizerFunc(updatedConfigMap, metav1.FinalizerOrphan)) + assert.True(t, configmapController.hasFinalizerFunc(updatedConfigMap, metav1.FinalizerOrphanDependents)) // Verify that the configmap is created in underlying cluster1. createdConfigMap := GetConfigMapFromChan(cluster1CreateChan) diff --git a/federation/pkg/federation-controller/daemonset/daemonset_controller_test.go b/federation/pkg/federation-controller/daemonset/daemonset_controller_test.go index ef01b8d30a7..15e1d4c8820 100644 --- a/federation/pkg/federation-controller/daemonset/daemonset_controller_test.go +++ b/federation/pkg/federation-controller/daemonset/daemonset_controller_test.go @@ -105,7 +105,7 @@ func TestDaemonSetController(t *testing.T) { // There should be an update to add both the finalizers. updatedDaemonSet := GetDaemonSetFromChan(daemonsetUpdateChan) assert.True(t, daemonsetController.hasFinalizerFunc(updatedDaemonSet, deletionhelper.FinalizerDeleteFromUnderlyingClusters)) - assert.True(t, daemonsetController.hasFinalizerFunc(updatedDaemonSet, metav1.FinalizerOrphan)) + assert.True(t, daemonsetController.hasFinalizerFunc(updatedDaemonSet, metav1.FinalizerOrphanDependents)) daemonset1 = *updatedDaemonSet createdDaemonSet := GetDaemonSetFromChan(cluster1CreateChan) diff --git a/federation/pkg/federation-controller/ingress/ingress_controller_test.go b/federation/pkg/federation-controller/ingress/ingress_controller_test.go index df0145c5138..d4b3d66be7a 100644 --- a/federation/pkg/federation-controller/ingress/ingress_controller_test.go +++ b/federation/pkg/federation-controller/ingress/ingress_controller_test.go @@ -146,7 +146,7 @@ func TestIngressController(t *testing.T) { // There should be an update to add both the finalizers. updatedIngress := GetIngressFromChan(t, fedIngressUpdateChan) assert.True(t, ingressController.hasFinalizerFunc(updatedIngress, deletionhelper.FinalizerDeleteFromUnderlyingClusters)) - assert.True(t, ingressController.hasFinalizerFunc(updatedIngress, metav1.FinalizerOrphan), fmt.Sprintf("ingress does not have the orphan finalizer: %v", updatedIngress)) + assert.True(t, ingressController.hasFinalizerFunc(updatedIngress, metav1.FinalizerOrphanDependents), fmt.Sprintf("ingress does not have the orphan finalizer: %v", updatedIngress)) fedIngress = *updatedIngress t.Log("Checking that Ingress was correctly created in cluster 1") @@ -319,7 +319,7 @@ func WaitForFinalizersInFederationStore(ingressController *IngressController, st return false, err } ingress := obj.(*extensionsv1beta1.Ingress) - if ingressController.hasFinalizerFunc(ingress, metav1.FinalizerOrphan) && + if ingressController.hasFinalizerFunc(ingress, metav1.FinalizerOrphanDependents) && ingressController.hasFinalizerFunc(ingress, deletionhelper.FinalizerDeleteFromUnderlyingClusters) { return true, nil } diff --git a/federation/pkg/federation-controller/namespace/namespace_controller_test.go b/federation/pkg/federation-controller/namespace/namespace_controller_test.go index fe022c1a9c6..654a9efd388 100644 --- a/federation/pkg/federation-controller/namespace/namespace_controller_test.go +++ b/federation/pkg/federation-controller/namespace/namespace_controller_test.go @@ -133,7 +133,7 @@ func TestNamespaceController(t *testing.T) { // Delete the namespace with orphan finalizer (let namespaces // in underlying clusters be as is). // TODO: Add a test without orphan finalizer. - ns1.ObjectMeta.Finalizers = append(ns1.ObjectMeta.Finalizers, metav1.FinalizerOrphan) + ns1.ObjectMeta.Finalizers = append(ns1.ObjectMeta.Finalizers, metav1.FinalizerOrphanDependents) ns1.DeletionTimestamp = &metav1.Time{Time: time.Now()} namespaceWatch.Modify(&ns1) assert.Equal(t, ns1.Name, GetStringFromChan(nsDeleteChan)) diff --git a/federation/pkg/federation-controller/secret/secret_controller_test.go b/federation/pkg/federation-controller/secret/secret_controller_test.go index 5532a8025c8..bb71d343424 100644 --- a/federation/pkg/federation-controller/secret/secret_controller_test.go +++ b/federation/pkg/federation-controller/secret/secret_controller_test.go @@ -105,7 +105,7 @@ func TestSecretController(t *testing.T) { // There should be an update to add both the finalizers. updatedSecret := GetSecretFromChan(secretUpdateChan) assert.True(t, secretController.hasFinalizerFunc(updatedSecret, deletionhelper.FinalizerDeleteFromUnderlyingClusters)) - assert.True(t, secretController.hasFinalizerFunc(updatedSecret, metav1.FinalizerOrphan)) + assert.True(t, secretController.hasFinalizerFunc(updatedSecret, metav1.FinalizerOrphanDependents)) secret1 = *updatedSecret // Verify that the secret is created in underlying cluster1. diff --git a/federation/pkg/federation-controller/util/deletionhelper/deletion_helper.go b/federation/pkg/federation-controller/util/deletionhelper/deletion_helper.go index 528f017edfa..06adf8332d1 100644 --- a/federation/pkg/federation-controller/util/deletionhelper/deletion_helper.go +++ b/federation/pkg/federation-controller/util/deletionhelper/deletion_helper.go @@ -93,8 +93,8 @@ func (dh *DeletionHelper) EnsureFinalizers(obj runtime.Object) ( if !dh.hasFinalizerFunc(obj, FinalizerDeleteFromUnderlyingClusters) { finalizers = append(finalizers, FinalizerDeleteFromUnderlyingClusters) } - if !dh.hasFinalizerFunc(obj, metav1.FinalizerOrphan) { - finalizers = append(finalizers, metav1.FinalizerOrphan) + if !dh.hasFinalizerFunc(obj, metav1.FinalizerOrphanDependents) { + finalizers = append(finalizers, metav1.FinalizerOrphanDependents) } if len(finalizers) != 0 { glog.V(2).Infof("Adding finalizers %v to %s", finalizers, dh.objNameFunc(obj)) @@ -117,7 +117,7 @@ func (dh *DeletionHelper) HandleObjectInUnderlyingClusters(obj runtime.Object) ( glog.V(2).Infof("obj does not have %s finalizer. Nothing to do", FinalizerDeleteFromUnderlyingClusters) return obj, nil } - hasOrphanFinalizer := dh.hasFinalizerFunc(obj, metav1.FinalizerOrphan) + hasOrphanFinalizer := dh.hasFinalizerFunc(obj, metav1.FinalizerOrphanDependents) if hasOrphanFinalizer { glog.V(2).Infof("Found finalizer orphan. Nothing to do, just remove the finalizer") // If the obj has FinalizerOrphan finalizer, then we need to orphan the @@ -127,7 +127,7 @@ func (dh *DeletionHelper) HandleObjectInUnderlyingClusters(obj runtime.Object) ( if err != nil { return obj, err } - return dh.removeFinalizerFunc(obj, metav1.FinalizerOrphan) + return dh.removeFinalizerFunc(obj, metav1.FinalizerOrphanDependents) } glog.V(2).Infof("Deleting obj %s from underlying clusters", objName) diff --git a/pkg/api/helpers.go b/pkg/api/helpers.go index 6672ba2e288..970792fc74d 100644 --- a/pkg/api/helpers.go +++ b/pkg/api/helpers.go @@ -244,7 +244,7 @@ func IsServiceIPRequested(service *Service) bool { var standardFinalizers = sets.NewString( string(FinalizerKubernetes), - metav1.FinalizerOrphan, + metav1.FinalizerOrphanDependents, ) // HasAnnotation returns a bool if passed in annotation exists diff --git a/pkg/api/meta_test.go b/pkg/api/meta_test.go index ab355ecc891..f97758188ca 100644 --- a/pkg/api/meta_test.go +++ b/pkg/api/meta_test.go @@ -20,8 +20,6 @@ import ( "reflect" "testing" - "github.com/google/gofuzz" - "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -31,50 +29,6 @@ import ( var _ metav1.Object = &metav1.ObjectMeta{} -func getObjectMetaAndOwnerReferences() (objectMeta metav1.ObjectMeta, metaOwnerReferences []metav1.OwnerReference) { - fuzz.New().NilChance(.5).NumElements(1, 5).Fuzz(&objectMeta) - references := objectMeta.OwnerReferences - metaOwnerReferences = make([]metav1.OwnerReference, 0) - for i := 0; i < len(references); i++ { - metaOwnerReferences = append(metaOwnerReferences, metav1.OwnerReference{ - Kind: references[i].Kind, - Name: references[i].Name, - UID: references[i].UID, - APIVersion: references[i].APIVersion, - Controller: references[i].Controller, - }) - } - if len(references) == 0 { - objectMeta.OwnerReferences = make([]metav1.OwnerReference, 0) - } - return objectMeta, metaOwnerReferences -} - -func testGetOwnerReferences(t *testing.T) { - meta, expected := getObjectMetaAndOwnerReferences() - refs := meta.GetOwnerReferences() - if !reflect.DeepEqual(refs, expected) { - t.Errorf("expect %v\n got %v", expected, refs) - } -} - -func testSetOwnerReferences(t *testing.T) { - expected, newRefs := getObjectMetaAndOwnerReferences() - objectMeta := &metav1.ObjectMeta{} - objectMeta.SetOwnerReferences(newRefs) - if !reflect.DeepEqual(expected.OwnerReferences, objectMeta.OwnerReferences) { - t.Errorf("expect: %#v\n got: %#v", expected.OwnerReferences, objectMeta.OwnerReferences) - } -} - -func TestAccessOwnerReferences(t *testing.T) { - fuzzIter := 5 - for i := 0; i < fuzzIter; i++ { - testGetOwnerReferences(t) - testSetOwnerReferences(t) - } -} - func TestAccessorImplementations(t *testing.T) { for _, gv := range api.Registry.EnabledVersions() { internalGV := schema.GroupVersion{Group: gv.Group, Version: runtime.APIVersionInternal} diff --git a/pkg/api/types.go b/pkg/api/types.go index 427cc2e4019..70172c06cb3 100644 --- a/pkg/api/types.go +++ b/pkg/api/types.go @@ -3000,6 +3000,20 @@ type Preconditions struct { UID *types.UID } +// DeletionPropagation decides whether and how garbage collection will be performed. +type DeletionPropagation string + +const ( + // Orphans the dependents. + DeletePropagationOrphan DeletionPropagation = "Orphan" + // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background. + DeletePropagationBackground DeletionPropagation = "Background" + // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. + // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp. + // This policy is cascading, i.e., the dependents will be deleted with Foreground. + DeletePropagationForeground DeletionPropagation = "Foreground" +) + // DeleteOptions may be provided when deleting an API object // DEPRECATED: This type has been moved to meta/v1 and will be removed soon. type DeleteOptions struct { @@ -3016,10 +3030,18 @@ type DeleteOptions struct { // +optional Preconditions *Preconditions + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional OrphanDependents *bool + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + PropagationPolicy *DeletionPropagation } // ListOptions is the query options to a standard REST list call, and has future support for diff --git a/pkg/api/v1/helpers.go b/pkg/api/v1/helpers.go index 2bb238cacf6..b6443011628 100644 --- a/pkg/api/v1/helpers.go +++ b/pkg/api/v1/helpers.go @@ -84,7 +84,7 @@ func IsServiceIPRequested(service *Service) bool { var standardFinalizers = sets.NewString( string(FinalizerKubernetes), - metav1.FinalizerOrphan, + metav1.FinalizerOrphanDependents, ) func IsStandardFinalizerName(str string) bool { diff --git a/pkg/api/v1/meta.go b/pkg/api/v1/meta.go index fd30ef1f584..bb1ae2ff79d 100644 --- a/pkg/api/v1/meta.go +++ b/pkg/api/v1/meta.go @@ -63,6 +63,10 @@ func (meta *ObjectMeta) GetOwnerReferences() []metav1.OwnerReference { value := *meta.OwnerReferences[i].Controller ret[i].Controller = &value } + if meta.OwnerReferences[i].BlockOwnerDeletion != nil { + value := *meta.OwnerReferences[i].BlockOwnerDeletion + ret[i].BlockOwnerDeletion = &value + } } return ret } @@ -78,6 +82,10 @@ func (meta *ObjectMeta) SetOwnerReferences(references []metav1.OwnerReference) { value := *references[i].Controller newReferences[i].Controller = &value } + if references[i].BlockOwnerDeletion != nil { + value := *references[i].BlockOwnerDeletion + newReferences[i].BlockOwnerDeletion = &value + } } meta.OwnerReferences = newReferences } diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index 2b7b025e9b5..1961f367df8 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -3432,6 +3432,20 @@ type Preconditions struct { UID *types.UID `json:"uid,omitempty" protobuf:"bytes,1,opt,name=uid,casttype=k8s.io/apimachinery/pkg/types.UID"` } +// DeletionPropagation decides if a deletion will propagate to the dependents of the object, and how the garbage collector will handle the propagation. +type DeletionPropagation string + +const ( + // Orphans the dependents. + DeletePropagationOrphan DeletionPropagation = "Orphan" + // Deletes the object from the key-value store, the garbage collector will delete the dependents in the background. + DeletePropagationBackground DeletionPropagation = "Background" + // The object exists in the key-value store until the garbage collector deletes all the dependents whose ownerReference.blockOwnerDeletion=true from the key-value store. + // API sever will put the "DeletingDependents" finalizer on the object, and sets its deletionTimestamp. + // This policy is cascading, i.e., the dependents will be deleted with Foreground. + DeletePropagationForeground DeletionPropagation = "Foreground" +) + // DeleteOptions may be provided when deleting an API object // DEPRECATED: This type has been moved to meta/v1 and will be removed soon. // +k8s:openapi-gen=false @@ -3450,10 +3464,18 @@ type DeleteOptions struct { // +optional Preconditions *Preconditions `json:"preconditions,omitempty" protobuf:"bytes,2,opt,name=preconditions"` + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional OrphanDependents *bool `json:"orphanDependents,omitempty" protobuf:"varint,3,opt,name=orphanDependents"` + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + PropagationPolicy *DeletionPropagation } // ListOptions is the query options to a standard REST list call. diff --git a/pkg/api/validation/validation.go b/pkg/api/validation/validation.go index 8b002a4920e..0f8599313a7 100644 --- a/pkg/api/validation/validation.go +++ b/pkg/api/validation/validation.go @@ -295,7 +295,6 @@ func ValidateObjectMeta(meta *metav1.ObjectMeta, requiresNamespace bool, nameFn for i := range meta.Finalizers { allErrs = append(allErrs, validateKubeFinalizerName(string(meta.Finalizers[i]), fldPath.Child("finalizers").Index(i))...) } - return allErrs } diff --git a/pkg/apimachinery/tests/api_meta_meta_test.go b/pkg/apimachinery/tests/api_meta_meta_test.go index f0489fc04e1..fd20c842a7c 100644 --- a/pkg/apimachinery/tests/api_meta_meta_test.go +++ b/pkg/apimachinery/tests/api_meta_meta_test.go @@ -335,7 +335,7 @@ type MyAPIObject2 struct { metav1.ObjectMeta } -func getObjectMetaAndOwnerRefereneces() (myAPIObject2 MyAPIObject2, metaOwnerReferences []metav1.OwnerReference) { +func getObjectMetaAndOwnerReferences() (myAPIObject2 MyAPIObject2, metaOwnerReferences []metav1.OwnerReference) { fuzz.New().NilChance(.5).NumElements(1, 5).Fuzz(&myAPIObject2) references := myAPIObject2.ObjectMeta.OwnerReferences // This is necessary for the test to pass because the getter will return a @@ -343,11 +343,12 @@ func getObjectMetaAndOwnerRefereneces() (myAPIObject2 MyAPIObject2, metaOwnerRef metaOwnerReferences = make([]metav1.OwnerReference, 0) for i := 0; i < len(references); i++ { metaOwnerReferences = append(metaOwnerReferences, metav1.OwnerReference{ - Kind: references[i].Kind, - Name: references[i].Name, - UID: references[i].UID, - APIVersion: references[i].APIVersion, - Controller: references[i].Controller, + Kind: references[i].Kind, + Name: references[i].Name, + UID: references[i].UID, + APIVersion: references[i].APIVersion, + Controller: references[i].Controller, + BlockOwnerDeletion: references[i].BlockOwnerDeletion, }) } if len(references) == 0 { @@ -359,7 +360,7 @@ func getObjectMetaAndOwnerRefereneces() (myAPIObject2 MyAPIObject2, metaOwnerRef } func testGetOwnerReferences(t *testing.T) { - obj, expected := getObjectMetaAndOwnerRefereneces() + obj, expected := getObjectMetaAndOwnerReferences() accessor, err := meta.Accessor(&obj) if err != nil { t.Error(err) @@ -371,7 +372,7 @@ func testGetOwnerReferences(t *testing.T) { } func testSetOwnerReferences(t *testing.T) { - expected, references := getObjectMetaAndOwnerRefereneces() + expected, references := getObjectMetaAndOwnerReferences() obj := MyAPIObject2{} accessor, err := meta.Accessor(&obj) if err != nil { diff --git a/pkg/apimachinery/tests/apis_meta_v1_unstructed_unstructure_test.go b/pkg/apimachinery/tests/apis_meta_v1_unstructed_unstructure_test.go index ac74def8bf9..9121584b4c6 100644 --- a/pkg/apimachinery/tests/apis_meta_v1_unstructed_unstructure_test.go +++ b/pkg/apimachinery/tests/apis_meta_v1_unstructed_unstructure_test.go @@ -123,6 +123,7 @@ func TestDecode(t *testing.T) { } func TestUnstructuredGetters(t *testing.T) { + trueVar := true unstruct := unstructured.Unstructured{ Object: map[string]interface{}{ "kind": "test_kind", @@ -154,6 +155,10 @@ func TestUnstructuredGetters(t *testing.T) { "name": "podb", "apiVersion": "v1", "uid": "2", + // though these fields are of type *bool, but when + // decoded from JSON, they are unmarshalled as bool. + "controller": true, + "blockOwnerDeletion": true, }, }, "finalizers": []interface{}{ @@ -221,10 +226,12 @@ func TestUnstructuredGetters(t *testing.T) { UID: "1", }, { - Kind: "Pod", - Name: "podb", - APIVersion: "v1", - UID: "2", + Kind: "Pod", + Name: "podb", + APIVersion: "v1", + UID: "2", + Controller: &trueVar, + BlockOwnerDeletion: &trueVar, }, } if got, want := refs, expectedOwnerReferences; !reflect.DeepEqual(got, want) { @@ -263,18 +270,20 @@ func TestUnstructuredSetters(t *testing.T) { }, "ownerReferences": []map[string]interface{}{ { - "kind": "Pod", - "name": "poda", - "apiVersion": "v1", - "uid": "1", - "controller": (*bool)(nil), + "kind": "Pod", + "name": "poda", + "apiVersion": "v1", + "uid": "1", + "controller": (*bool)(nil), + "blockOwnerDeletion": (*bool)(nil), }, { - "kind": "Pod", - "name": "podb", - "apiVersion": "v1", - "uid": "2", - "controller": &trueVar, + "kind": "Pod", + "name": "podb", + "apiVersion": "v1", + "uid": "2", + "controller": &trueVar, + "blockOwnerDeletion": &trueVar, }, }, "finalizers": []interface{}{ @@ -307,11 +316,12 @@ func TestUnstructuredSetters(t *testing.T) { UID: "1", }, { - Kind: "Pod", - Name: "podb", - APIVersion: "v1", - UID: "2", - Controller: &trueVar, + Kind: "Pod", + Name: "podb", + APIVersion: "v1", + UID: "2", + Controller: &trueVar, + BlockOwnerDeletion: &trueVar, }, } unstruct.SetOwnerReferences(newOwnerReferences) diff --git a/pkg/registry/core/namespace/storage/storage.go b/pkg/registry/core/namespace/storage/storage.go index de7508ecfe9..269c94685b9 100644 --- a/pkg/registry/core/namespace/storage/storage.go +++ b/pkg/registry/core/namespace/storage/storage.go @@ -143,7 +143,7 @@ func (r *REST) Delete(ctx genericapirequest.Context, name string, options *metav newFinalizers := []string{} for i := range existingNamespace.ObjectMeta.Finalizers { finalizer := existingNamespace.ObjectMeta.Finalizers[i] - if string(finalizer) != metav1.FinalizerOrphan { + if string(finalizer) != metav1.FinalizerOrphanDependents { newFinalizers = append(newFinalizers, finalizer) } } diff --git a/staging/src/k8s.io/apimachinery/pkg/api/meta/meta.go b/staging/src/k8s.io/apimachinery/pkg/api/meta/meta.go index 4a958a92653..7492324ed95 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/meta/meta.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/meta/meta.go @@ -334,6 +334,14 @@ func extractFromOwnerReference(v reflect.Value, o *metav1.OwnerReference) error controller := *controllerPtr o.Controller = &controller } + var blockOwnerDeletionPtr *bool + if err := runtime.Field(v, "BlockOwnerDeletion", &blockOwnerDeletionPtr); err != nil { + return err + } + if blockOwnerDeletionPtr != nil { + block := *blockOwnerDeletionPtr + o.BlockOwnerDeletion = &block + } return nil } @@ -357,6 +365,12 @@ func setOwnerReference(v reflect.Value, o *metav1.OwnerReference) error { return err } } + if o.BlockOwnerDeletion != nil { + block := *(o.BlockOwnerDeletion) + if err := runtime.SetField(&block, v, "BlockOwnerDeletion"); err != nil { + return err + } + } return nil } diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go index f534dcc2a1a..0074e3c979b 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta.go @@ -171,8 +171,26 @@ func ValidateObjectMeta(meta *metav1.ObjectMeta, requiresNamespace bool, nameFn allErrs = append(allErrs, v1validation.ValidateLabels(meta.Labels, fldPath.Child("labels"))...) allErrs = append(allErrs, ValidateAnnotations(meta.Annotations, fldPath.Child("annotations"))...) allErrs = append(allErrs, ValidateOwnerReferences(meta.OwnerReferences, fldPath.Child("ownerReferences"))...) - for _, finalizer := range meta.Finalizers { - allErrs = append(allErrs, ValidateFinalizerName(finalizer, fldPath.Child("finalizers"))...) + allErrs = append(allErrs, ValidateFinalizers(meta.Finalizers, fldPath.Child("finalizers"))...) + return allErrs +} + +// ValidateFinalizers tests if the finalizers name are valid, and if there are conflicting finalizers. +func ValidateFinalizers(finalizers []string, fldPath *field.Path) field.ErrorList { + allErrs := field.ErrorList{} + hasFinalizerOrphanDependents := false + hasFinalizerDeleteDependents := false + for _, finalizer := range finalizers { + allErrs = append(allErrs, ValidateFinalizerName(finalizer, fldPath)...) + if finalizer == metav1.FinalizerOrphanDependents { + hasFinalizerOrphanDependents = true + } + if finalizer == metav1.FinalizerDeleteDependents { + hasFinalizerDeleteDependents = true + } + } + if hasFinalizerDeleteDependents && hasFinalizerOrphanDependents { + allErrs = append(allErrs, field.Invalid(fldPath, finalizers, fmt.Sprintf("finalizer %s and %s cannot be both set", metav1.FinalizerOrphanDependents, metav1.FinalizerDeleteDependents))) } return allErrs } diff --git a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go index abb9af9d8ec..a8041d7fec1 100644 --- a/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go +++ b/staging/src/k8s.io/apimachinery/pkg/api/validation/objectmeta_test.go @@ -277,6 +277,28 @@ func TestValidateFinalizersUpdate(t *testing.T) { } } +func TestValidateFinalizersPreventConflictingFinalizers(t *testing.T) { + testcases := map[string]struct { + ObjectMeta metav1.ObjectMeta + ExpectedErr string + }{ + "conflicting finalizers": { + ObjectMeta: metav1.ObjectMeta{Name: "test", ResourceVersion: "1", Finalizers: []string{metav1.FinalizerOrphanDependents, metav1.FinalizerDeleteDependents}}, + ExpectedErr: "cannot be both set", + }, + } + for name, tc := range testcases { + errs := ValidateObjectMeta(&tc.ObjectMeta, false, NameIsDNSSubdomain, field.NewPath("field")) + if len(errs) == 0 { + if len(tc.ExpectedErr) != 0 { + t.Errorf("case: %q, expected error to contain %q", name, tc.ExpectedErr) + } + } else if e, a := tc.ExpectedErr, errs.ToAggregate().Error(); !strings.Contains(a, e) { + t.Errorf("case: %q, expected error to contain %q, got error %q", name, e, a) + } + } +} + func TestValidateObjectMetaUpdatePreventsDeletionFieldMutation(t *testing.T) { now := metav1.NewTime(time.Unix(1000, 0).UTC()) later := metav1.NewTime(time.Unix(2000, 0).UTC()) diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go index 871858ec273..108e34f0f59 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go @@ -174,6 +174,10 @@ func (meta *ObjectMeta) GetOwnerReferences() []OwnerReference { value := *meta.OwnerReferences[i].Controller ret[i].Controller = &value } + if meta.OwnerReferences[i].BlockOwnerDeletion != nil { + value := *meta.OwnerReferences[i].BlockOwnerDeletion + ret[i].BlockOwnerDeletion = &value + } } return ret } @@ -189,6 +193,10 @@ func (meta *ObjectMeta) SetOwnerReferences(references []OwnerReference) { value := *references[i].Controller newReferences[i].Controller = &value } + if references[i].BlockOwnerDeletion != nil { + value := *references[i].BlockOwnerDeletion + newReferences[i].BlockOwnerDeletion = &value + } } meta.OwnerReferences = newReferences } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go index e9bade7690a..9a40b7e9adc 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/types.go @@ -73,7 +73,8 @@ type ListMeta struct { // These are internal finalizer values for Kubernetes-like APIs, must be qualified name unless defined here const ( - FinalizerOrphan string = "orphan" + FinalizerOrphanDependents string = "orphan" + FinalizerDeleteDependents string = "foregroundDeletion" ) // ObjectMeta is metadata that all persisted resources must have, which includes all objects @@ -255,6 +256,14 @@ type OwnerReference struct { // If true, this reference points to the managing controller. // +optional Controller *bool `json:"controller,omitempty" protobuf:"varint,6,opt,name=controller"` + // If true, AND if the owner has the "foregroundDeletion" finalizer, then + // the owner cannot be deleted from the key-value store until this + // reference is removed. + // Defaults to false. + // To set this field, a user needs "delete" permission of the owner, + // otherwise 422 (Unprocessable Entity) will be returned. + // +optional + BlockOwnerDeletion *bool `json:"blockOwnerDeletion,omitempty" protobuf:"varint,7,opt,name=blockOwnerDeletion"` } // ListOptions is the query options to a standard REST list call. @@ -305,6 +314,24 @@ type GetOptions struct { ResourceVersion string `json:"resourceVersion,omitempty" protobuf:"bytes,1,opt,name=resourceVersion"` } +// DeletionPropagation decides if a deletion will propagate to the dependents of +// the object, and how the garbage collector will handle the propagation. +type DeletionPropagation string + +const ( + // Orphans the dependents. + DeletePropagationOrphan DeletionPropagation = "Orphan" + // Deletes the object from the key-value store, the garbage collector will + // delete the dependents in the background. + DeletePropagationBackground DeletionPropagation = "Background" + // The object exists in the key-value store until the garbage collector + // deletes all the dependents whose ownerReference.blockOwnerDeletion=true + // from the key-value store. API sever will put the "foregroundDeletion" + // finalizer on the object, and sets its deletionTimestamp. This policy is + // cascading, i.e., the dependents will be deleted with Foreground. + DeletePropagationForeground DeletionPropagation = "Foreground" +) + // DeleteOptions may be provided when deleting an API object. type DeleteOptions struct { TypeMeta `json:",inline"` @@ -321,10 +348,18 @@ type DeleteOptions struct { // +optional Preconditions *Preconditions `json:"preconditions,omitempty" protobuf:"bytes,2,opt,name=preconditions"` + // Deprecated: please use the PropagationPolicy, this field will be deprecated in 1.7. // Should the dependent objects be orphaned. If true/false, the "orphan" // finalizer will be added to/removed from the object's finalizers list. + // Either this field or PropagationPolicy may be set, but not both. // +optional OrphanDependents *bool `json:"orphanDependents,omitempty" protobuf:"varint,3,opt,name=orphanDependents"` + + // Whether and how garbage collection will be performed. + // Defaults to Default. + // Either this field or OrphanDependents may be set, but not both. + // +optional + PropagationPolicy *DeletionPropagation `json:"propagationPolicy,omitempty" protobuf:"varint,4,opt,name=propagationPolicy"` } // Preconditions must be fulfilled before an operation (update, delete, etc.) is carried out. diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go index 318bea86d6a..ae20726b6ec 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go @@ -204,21 +204,31 @@ func (u *Unstructured) setNestedMap(value map[string]string, fields ...string) { func extractOwnerReference(src interface{}) metav1.OwnerReference { v := src.(map[string]interface{}) - controllerPtr, ok := (getNestedField(v, "controller")).(*bool) + // though this field is a *bool, but when decoded from JSON, it's + // unmarshalled as bool. + var controllerPtr *bool + controller, ok := (getNestedField(v, "controller")).(bool) if !ok { controllerPtr = nil } else { - if controllerPtr != nil { - controller := *controllerPtr - controllerPtr = &controller - } + controllerCopy := controller + controllerPtr = &controllerCopy + } + var blockOwnerDeletionPtr *bool + blockOwnerDeletion, ok := (getNestedField(v, "blockOwnerDeletion")).(bool) + if !ok { + blockOwnerDeletionPtr = nil + } else { + blockOwnerDeletionCopy := blockOwnerDeletion + blockOwnerDeletionPtr = &blockOwnerDeletionCopy } return metav1.OwnerReference{ - Kind: getNestedString(v, "kind"), - Name: getNestedString(v, "name"), - APIVersion: getNestedString(v, "apiVersion"), - UID: (types.UID)(getNestedString(v, "uid")), - Controller: controllerPtr, + Kind: getNestedString(v, "kind"), + Name: getNestedString(v, "name"), + APIVersion: getNestedString(v, "apiVersion"), + UID: (types.UID)(getNestedString(v, "uid")), + Controller: controllerPtr, + BlockOwnerDeletion: blockOwnerDeletionPtr, } } @@ -229,11 +239,17 @@ func setOwnerReference(src metav1.OwnerReference) map[string]interface{} { controller := *controllerPtr controllerPtr = &controller } + blockOwnerDeletionPtr := src.BlockOwnerDeletion + if blockOwnerDeletionPtr != nil { + blockOwnerDeletion := *blockOwnerDeletionPtr + blockOwnerDeletionPtr = &blockOwnerDeletion + } setNestedField(ret, src.Kind, "kind") setNestedField(ret, src.Name, "name") setNestedField(ret, src.APIVersion, "apiVersion") setNestedField(ret, string(src.UID), "uid") setNestedField(ret, controllerPtr, "controller") + setNestedField(ret, blockOwnerDeletionPtr, "blockOwnerDeletion") return ret } diff --git a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go index 7d2d355a2ac..f06f075bf77 100644 --- a/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go +++ b/staging/src/k8s.io/apimachinery/pkg/apis/meta/v1/validation/validation.go @@ -17,6 +17,8 @@ limitations under the License. package validation import ( + "fmt" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/validation" "k8s.io/apimachinery/pkg/util/validation/field" @@ -72,3 +74,17 @@ func ValidateLabels(labels map[string]string, fldPath *field.Path) field.ErrorLi } return allErrs } + +func ValidateDeleteOptions(options *metav1.DeleteOptions) field.ErrorList { + allErrs := field.ErrorList{} + if options.OrphanDependents != nil && options.PropagationPolicy != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath(""), options, "OrphanDependents and DeletionPropagation cannot be both set")) + } + if options.PropagationPolicy != nil && + *options.PropagationPolicy != metav1.DeletePropagationForeground && + *options.PropagationPolicy != metav1.DeletePropagationBackground && + *options.PropagationPolicy != metav1.DeletePropagationOrphan { + allErrs = append(allErrs, field.Invalid(field.NewPath(""), options, fmt.Sprintf("DeletionPropagation need to be one of %q, %q, %q or nil", metav1.DeletePropagationForeground, metav1.DeletePropagationBackground, metav1.DeletePropagationOrphan))) + } + return allErrs +} diff --git a/staging/src/k8s.io/client-go/pkg/api/helpers.go b/staging/src/k8s.io/client-go/pkg/api/helpers.go index 6672ba2e288..970792fc74d 100644 --- a/staging/src/k8s.io/client-go/pkg/api/helpers.go +++ b/staging/src/k8s.io/client-go/pkg/api/helpers.go @@ -244,7 +244,7 @@ func IsServiceIPRequested(service *Service) bool { var standardFinalizers = sets.NewString( string(FinalizerKubernetes), - metav1.FinalizerOrphan, + metav1.FinalizerOrphanDependents, ) // HasAnnotation returns a bool if passed in annotation exists diff --git a/staging/src/k8s.io/client-go/pkg/api/v1/helpers.go b/staging/src/k8s.io/client-go/pkg/api/v1/helpers.go index 8c804a6b890..05928dc009d 100644 --- a/staging/src/k8s.io/client-go/pkg/api/v1/helpers.go +++ b/staging/src/k8s.io/client-go/pkg/api/v1/helpers.go @@ -84,7 +84,7 @@ func IsServiceIPRequested(service *Service) bool { var standardFinalizers = sets.NewString( string(FinalizerKubernetes), - metav1.FinalizerOrphan, + metav1.FinalizerOrphanDependents, ) func IsStandardFinalizerName(str string) bool { From 93686da1044ea5396978a9bc86468dd3d1c32190 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 23 Feb 2017 11:15:46 -0800 Subject: [PATCH 3/5] registry changes --- .../apiserver/pkg/endpoints/installer.go | 2 + .../pkg/registry/generic/registry/store.go | 119 ++++++-- .../registry/generic/registry/store_test.go | 255 ++++++++++++++++-- .../apiserver/pkg/registry/rest/delete.go | 4 + .../apiserver/pkg/registry/rest/update.go | 6 +- 5 files changed, 341 insertions(+), 45 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/installer.go b/staging/src/k8s.io/apiserver/pkg/endpoints/installer.go index f39f4619bb2..db4a7215507 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/installer.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/installer.go @@ -1057,6 +1057,8 @@ func typeToJSON(typeName string) string { return "string" case "byte", "*byte": return "string" + case "v1.DeletionPropagation", "*v1.DeletionPropagation": + return "string" // TODO: Fix these when go-restful supports a way to specify an array query param: // https://github.com/emicklei/go-restful/issues/225 diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go index 5977613ed45..3f8f8d566e2 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store.go @@ -531,52 +531,121 @@ var ( errEmptiedFinalizers = fmt.Errorf("emptied finalizers") ) -// shouldUpdateFinalizers returns if we need to update the finalizers of the -// object, and the desired list of finalizers. When deciding whether to add -// the OrphanDependent finalizer, factors in the order of highest to lowest -// priority are: -// -// - options.OrphanDependents, -// - existing finalizers of the object -// - e.DeleteStrategy.DefaultGarbageCollectionPolicy -func shouldUpdateFinalizers(e *Store, accessor metav1.Object, options *metav1.DeleteOptions) (shouldUpdate bool, newFinalizers []string) { - shouldOrphan := false +// shouldUpdateFinalizerOrphanDependents returns if the finalizers need to be +// updated for FinalizerOrphanDependents. In the order of highest to lowest +// priority, there are three factors affect whether to add/remove the +// FinalizerOrphanDependents: options, existing finalizers of the object, +// and e.DeleteStrategy.DefaultGarbageCollectionPolicy. +func shouldUpdateFinalizerOrphanDependents(e *Store, accessor metav1.Object, options *metav1.DeleteOptions) (shouldUpdate bool, shouldOrphan bool) { + shouldOrphan = false // Get default orphan policy from this REST object type if gcStrategy, ok := e.DeleteStrategy.(rest.GarbageCollectionDeleteStrategy); ok { if gcStrategy.DefaultGarbageCollectionPolicy() == rest.OrphanDependents { shouldOrphan = true } } + // If a finalizer is set in the object, it overrides the default hasOrphanFinalizer := false finalizers := accessor.GetFinalizers() for _, f := range finalizers { - if f == metav1.FinalizerOrphan { + // validation should make sure the two cases won't be true at the same + // time. + switch f { + case metav1.FinalizerOrphanDependents: shouldOrphan = true hasOrphanFinalizer = true break + case metav1.FinalizerDeleteDependents: + shouldOrphan = false + break } - // TODO: update this when we add a finalizer indicating a preference for the other behavior } + // If an explicit policy was set at deletion time, that overrides both if options != nil && options.OrphanDependents != nil { shouldOrphan = *options.OrphanDependents } - if shouldOrphan && !hasOrphanFinalizer { - finalizers = append(finalizers, metav1.FinalizerOrphan) - return true, finalizers - } - if !shouldOrphan && hasOrphanFinalizer { - var newFinalizers []string - for _, f := range finalizers { - if f == metav1.FinalizerOrphan { - continue - } - newFinalizers = append(newFinalizers, f) + if options != nil && options.PropagationPolicy != nil { + switch *options.PropagationPolicy { + case metav1.DeletePropagationOrphan: + shouldOrphan = true + case metav1.DeletePropagationBackground, metav1.DeletePropagationForeground: + shouldOrphan = false } - return true, newFinalizers } - return false, finalizers + + shouldUpdate = shouldOrphan != hasOrphanFinalizer + return shouldUpdate, shouldOrphan +} + +// shouldUpdateFinalizerDeleteDependents returns if the finalizers need to be +// updated for FinalizerDeleteDependents. In the order of highest to lowest +// priority, there are three factors affect whether to add/remove the +// FinalizerDeleteDependents: options, existing finalizers of the object, and +// e.DeleteStrategy.DefaultGarbageCollectionPolicy. +func shouldUpdateFinalizerDeleteDependents(e *Store, accessor metav1.Object, options *metav1.DeleteOptions) (shouldUpdate bool, shouldDeleteDependentInForeground bool) { + // default to false + shouldDeleteDependentInForeground = false + + // If a finalizer is set in the object, it overrides the default + hasFinalizerDeleteDependents := false + finalizers := accessor.GetFinalizers() + for _, f := range finalizers { + // validation has made sure the two cases won't be true at the same + // time. + switch f { + case metav1.FinalizerDeleteDependents: + shouldDeleteDependentInForeground = true + hasFinalizerDeleteDependents = true + break + case metav1.FinalizerOrphanDependents: + shouldDeleteDependentInForeground = false + break + } + } + + // If an explicit policy was set at deletion time, that overrides both + if options != nil && options.OrphanDependents != nil { + shouldDeleteDependentInForeground = false + } + if options != nil && options.PropagationPolicy != nil { + switch *options.PropagationPolicy { + case metav1.DeletePropagationForeground: + shouldDeleteDependentInForeground = true + case metav1.DeletePropagationBackground, metav1.DeletePropagationOrphan: + shouldDeleteDependentInForeground = false + } + } + + shouldUpdate = shouldDeleteDependentInForeground != hasFinalizerDeleteDependents + return shouldUpdate, shouldDeleteDependentInForeground +} + +// shouldUpdateFinalizers returns if we need to update the finalizers of the +// object, and the desired list of finalizers. +func shouldUpdateFinalizers(e *Store, accessor metav1.Object, options *metav1.DeleteOptions) (shouldUpdate bool, newFinalizers []string) { + shouldUpdate1, shouldOrphan := shouldUpdateFinalizerOrphanDependents(e, accessor, options) + shouldUpdate2, shouldDeleteDependentInForeground := shouldUpdateFinalizerDeleteDependents(e, accessor, options) + oldFinalizers := accessor.GetFinalizers() + if !shouldUpdate1 && !shouldUpdate2 { + return false, oldFinalizers + } + + // first remove both finalizers, add them back if needed. + for _, f := range oldFinalizers { + if f == metav1.FinalizerOrphanDependents || f == metav1.FinalizerDeleteDependents { + continue + } + newFinalizers = append(newFinalizers, f) + } + if shouldOrphan { + newFinalizers = append(newFinalizers, metav1.FinalizerOrphanDependents) + } + if shouldDeleteDependentInForeground { + newFinalizers = append(newFinalizers, metav1.FinalizerDeleteDependents) + } + return true, newFinalizers } // markAsDeleting sets the obj's DeletionGracePeriodSeconds to 0, and sets the diff --git a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go index 5fa68c67776..5f92a4a4b5e 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/generic/registry/store_test.go @@ -818,7 +818,7 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { initialGeneration := int64(1) podWithOrphanFinalizer := func(name string) *example.Pod { return &example.Pod{ - ObjectMeta: metav1.ObjectMeta{Name: name, Finalizers: []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, Generation: initialGeneration}, + ObjectMeta: metav1.ObjectMeta{Name: name, Finalizers: []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, Generation: initialGeneration}, Spec: example.PodSpec{NodeName: "machine"}, } } @@ -836,7 +836,7 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { } podWithOnlyOrphanFinalizer := func(name string) *example.Pod { return &example.Pod{ - ObjectMeta: metav1.ObjectMeta{Name: name, Finalizers: []string{metav1.FinalizerOrphan}, Generation: initialGeneration}, + ObjectMeta: metav1.ObjectMeta{Name: name, Finalizers: []string{metav1.FinalizerOrphanDependents}, Generation: initialGeneration}, Spec: example.PodSpec{NodeName: "machine"}, } } @@ -864,28 +864,28 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { orphanOptions, defaultDeleteStrategy, false, - []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, + []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, }, { podWithOtherFinalizers("pod2"), orphanOptions, defaultDeleteStrategy, false, - []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphan}, + []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphanDependents}, }, { podWithNoFinalizer("pod3"), orphanOptions, defaultDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, { podWithOnlyOrphanFinalizer("pod4"), orphanOptions, defaultDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, // cases run with DeleteOptions.OrphanDedependents=false // these cases all have oprhanDeleteStrategy, which should be ignored @@ -927,14 +927,14 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nilOrphanOptions, defaultDeleteStrategy, false, - []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, + []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, }, { podWithOrphanFinalizer("pod10"), nilOrphanOptions, orphanDeleteStrategy, false, - []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, + []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, }, { podWithOtherFinalizers("pod11"), @@ -948,7 +948,7 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nilOrphanOptions, orphanDeleteStrategy, false, - []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphan}, + []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphanDependents}, }, { podWithNoFinalizer("pod13"), @@ -962,21 +962,21 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nilOrphanOptions, orphanDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, { podWithOnlyOrphanFinalizer("pod15"), nilOrphanOptions, defaultDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, { podWithOnlyOrphanFinalizer("pod16"), nilOrphanOptions, orphanDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, // cases run with nil DeleteOptions should have exact same behavior. @@ -987,14 +987,14 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nil, defaultDeleteStrategy, false, - []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, + []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, }, { podWithOrphanFinalizer("pod18"), nil, orphanDeleteStrategy, false, - []string{"foo.com/x", metav1.FinalizerOrphan, "bar.com/y"}, + []string{"foo.com/x", metav1.FinalizerOrphanDependents, "bar.com/y"}, }, { podWithOtherFinalizers("pod19"), @@ -1008,7 +1008,7 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nil, orphanDeleteStrategy, false, - []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphan}, + []string{"foo.com/x", "bar.com/y", metav1.FinalizerOrphanDependents}, }, { podWithNoFinalizer("pod21"), @@ -1022,21 +1022,21 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { nil, orphanDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, { podWithOnlyOrphanFinalizer("pod23"), nil, defaultDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, { podWithOnlyOrphanFinalizer("pod24"), nil, orphanDeleteStrategy, false, - []string{metav1.FinalizerOrphan}, + []string{metav1.FinalizerOrphanDependents}, }, } @@ -1084,6 +1084,225 @@ func TestStoreDeleteWithOrphanDependents(t *testing.T) { } } +// Test the DeleteOptions.PropagationPolicy is handled correctly +func TestStoreDeletionPropagation(t *testing.T) { + initialGeneration := int64(1) + + // defaultDeleteStrategy doesn't implement rest.GarbageCollectionDeleteStrategy. + defaultDeleteStrategy := &testRESTStrategy{scheme, names.SimpleNameGenerator, true, false, true} + // orphanDeleteStrategy indicates the default garbage collection policy is + // to orphan dependentes. + orphanDeleteStrategy := &testOrphanDeleteStrategy{defaultDeleteStrategy} + + foregroundPolicy := metav1.DeletePropagationForeground + backgroundPolicy := metav1.DeletePropagationBackground + orphanPolicy := metav1.DeletePropagationOrphan + + testcases := map[string]struct { + options *metav1.DeleteOptions + strategy rest.RESTDeleteStrategy + // finalizers that are already set in the object + existingFinalizers []string + expectedNotFound bool + expectedFinalizers []string + }{ + "no existing finalizers, PropagationPolicy=Foreground, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: defaultDeleteStrategy, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "no existing finalizers, PropagationPolicy=Foreground, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: orphanDeleteStrategy, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "no existing finalizers, PropagationPolicy=Background, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: defaultDeleteStrategy, + expectedNotFound: true, + }, + "no existing finalizers, PropagationPolicy=Background, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: orphanDeleteStrategy, + expectedNotFound: true, + }, + "no existing finalizers, PropagationPolicy=OrphanDependents, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: defaultDeleteStrategy, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "no existing finalizers, PropagationPolicy=OrphanDependents, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: orphanDeleteStrategy, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "no existing finalizers, PropagationPolicy=Default, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: defaultDeleteStrategy, + expectedNotFound: true, + }, + "no existing finalizers, PropagationPolicy=Default, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: orphanDeleteStrategy, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + + // all cases in the following block have "existing orphan finalizer" + "existing orphan finalizer, PropagationPolicy=Foreground, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "existing orphan finalizer, PropagationPolicy=Foreground, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "existing orphan finalizer, PropagationPolicy=Background, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedNotFound: true, + }, + "existing orphan finalizer, PropagationPolicy=Background, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedNotFound: true, + }, + "existing orphan finalizer, PropagationPolicy=OrphanDependents, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "existing orphan finalizer, PropagationPolicy=OrphanDependents, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "existing orphan finalizer, PropagationPolicy=Default, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "existing orphan finalizer, PropagationPolicy=Default, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerOrphanDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + + // all cases in the following block have "existing deleteDependents finalizer" + "existing deleteDependents finalizer, PropagationPolicy=Foreground, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "existing deleteDependents finalizer, PropagationPolicy=Foreground, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &foregroundPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "existing deleteDependents finalizer, PropagationPolicy=Background, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedNotFound: true, + }, + "existing deleteDependents finalizer, PropagationPolicy=Background, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &backgroundPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedNotFound: true, + }, + "existing deleteDependents finalizer, PropagationPolicy=OrphanDependents, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "existing deleteDependents finalizer, PropagationPolicy=OrphanDependents, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: &orphanPolicy}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerOrphanDependents}, + }, + "existing deleteDependents finalizer, PropagationPolicy=Default, defaultDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: defaultDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + "existing deleteDependents finalizer, PropagationPolicy=Default, orphanDeleteStrategy": { + options: &metav1.DeleteOptions{PropagationPolicy: nil}, + strategy: orphanDeleteStrategy, + existingFinalizers: []string{metav1.FinalizerDeleteDependents}, + expectedFinalizers: []string{metav1.FinalizerDeleteDependents}, + }, + } + + testContext := genericapirequest.WithNamespace(genericapirequest.NewContext(), "test") + destroyFunc, registry := NewTestGenericStoreRegistry(t) + registry.EnableGarbageCollection = true + defer destroyFunc() + + createPod := func(i int, finalizers []string) *example.Pod { + return &example.Pod{ + ObjectMeta: metav1.ObjectMeta{Name: fmt.Sprintf("pod-%d", i), Finalizers: finalizers, Generation: initialGeneration}, + Spec: example.PodSpec{NodeName: "machine"}, + } + } + + i := 0 + for title, tc := range testcases { + t.Logf("case title: %s", title) + registry.DeleteStrategy = tc.strategy + i++ + pod := createPod(i, tc.existingFinalizers) + // create pod + _, err := registry.Create(testContext, pod) + if err != nil { + t.Fatalf("Unexpected error: %v", err) + } + _, _, err = registry.Delete(testContext, pod.Name, tc.options) + obj, err := registry.Get(testContext, pod.Name, &metav1.GetOptions{}) + if tc.expectedNotFound { + if err == nil || !errors.IsNotFound(err) { + t.Fatalf("Unexpected error: %v", err) + } + continue + } + if !tc.expectedNotFound && err != nil { + t.Fatalf("Unexpected error: %v", err) + } + if !tc.expectedNotFound { + pod, ok := obj.(*example.Pod) + if !ok { + t.Fatalf("Expect the object to be a pod, but got %#v", obj) + } + if e, a := tc.expectedFinalizers, pod.ObjectMeta.Finalizers; !reflect.DeepEqual(e, a) { + t.Errorf("%v: Expect object %s to have finalizers %v, got %v", pod.Name, pod.ObjectMeta.Name, e, a) + } + if pod.ObjectMeta.DeletionTimestamp == nil { + t.Errorf("%v: Expect the object to have DeletionTimestamp set, but got %#v", pod.Name, pod.ObjectMeta) + } + if pod.ObjectMeta.DeletionGracePeriodSeconds == nil || *pod.ObjectMeta.DeletionGracePeriodSeconds != 0 { + t.Errorf("%v: Expect the object to have 0 DeletionGracePeriodSecond, but got %#v", pod.Name, pod.ObjectMeta) + } + if pod.Generation <= initialGeneration { + t.Errorf("%v: Deletion didn't increase Generation.", pod.Name) + } + } + } +} + func TestStoreDeleteCollection(t *testing.T) { podA := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "foo"}} podB := &example.Pod{ObjectMeta: metav1.ObjectMeta{Name: "bar"}} diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/delete.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/delete.go index 572114f99f8..ace4bab59be 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/delete.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/delete.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" @@ -66,6 +67,9 @@ func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, ob if kerr != nil { return false, false, kerr } + if errs := validation.ValidateDeleteOptions(options); len(errs) > 0 { + return false, false, errors.NewInvalid(schema.GroupKind{}, "", errs) + } // Checking the Preconditions here to fail early. They'll be enforced later on when we actually do the deletion, too. if options.Preconditions != nil && options.Preconditions.UID != nil && *options.Preconditions.UID != objectMeta.UID { return false, false, errors.NewConflict(schema.GroupResource{Group: gvk.Group, Resource: gvk.Kind}, objectMeta.Name, fmt.Errorf("the UID in the precondition (%s) does not match the UID in record (%s). The object might have been deleted and then recreated", *options.Preconditions.UID, objectMeta.UID)) diff --git a/staging/src/k8s.io/apiserver/pkg/registry/rest/update.go b/staging/src/k8s.io/apiserver/pkg/registry/rest/update.go index 51845bf4c39..f5c48de120a 100644 --- a/staging/src/k8s.io/apiserver/pkg/registry/rest/update.go +++ b/staging/src/k8s.io/apiserver/pkg/registry/rest/update.go @@ -22,6 +22,7 @@ import ( "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" genericvalidation "k8s.io/apimachinery/pkg/api/validation" + "k8s.io/apimachinery/pkg/api/validation/path" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" @@ -60,7 +61,7 @@ type RESTUpdateStrategy interface { } // TODO: add other common fields that require global validation. -func validateCommonFields(obj, old runtime.Object) (field.ErrorList, error) { +func validateCommonFields(obj, old runtime.Object, strategy RESTUpdateStrategy) (field.ErrorList, error) { allErrs := field.ErrorList{} objectMeta, err := metav1.ObjectMetaFor(obj) if err != nil { @@ -70,6 +71,7 @@ func validateCommonFields(obj, old runtime.Object) (field.ErrorList, error) { if err != nil { return nil, fmt.Errorf("failed to get old object metadata: %v", err) } + allErrs = append(allErrs, genericvalidation.ValidateObjectMeta(objectMeta, strategy.NamespaceScoped(), path.ValidatePathSegmentName, field.NewPath("metadata"))...) allErrs = append(allErrs, genericvalidation.ValidateObjectMetaUpdate(objectMeta, oldObjectMeta, field.NewPath("metadata"))...) return allErrs, nil @@ -103,7 +105,7 @@ func BeforeUpdate(strategy RESTUpdateStrategy, ctx genericapirequest.Context, ob objectMeta.ClusterName = "" // Ensure some common fields, like UID, are validated for all resources. - errs, err := validateCommonFields(obj, old) + errs, err := validateCommonFields(obj, old, strategy) if err != nil { return errors.NewInternalError(err) } From c3baf402f5c273da5a73ac078efeff905644ed3a Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 23 Feb 2017 11:16:13 -0800 Subject: [PATCH 4/5] gc changes --- pkg/controller/controller_ref_manager.go | 2 +- pkg/controller/controller_utils.go | 3 + .../garbagecollector/garbagecollector.go | 1045 ++++++----------- .../garbagecollector/garbagecollector_test.go | 153 ++- pkg/controller/garbagecollector/graph.go | 159 +++ .../garbagecollector/graph_builder.go | 497 ++++++++ pkg/controller/garbagecollector/operations.go | 135 +++ pkg/controller/garbagecollector/patch.go | 54 + pkg/controller/replicaset/replica_set.go | 14 +- .../replication/replication_controller.go | 13 +- 10 files changed, 1324 insertions(+), 751 deletions(-) create mode 100644 pkg/controller/garbagecollector/graph.go create mode 100644 pkg/controller/garbagecollector/graph_builder.go create mode 100644 pkg/controller/garbagecollector/operations.go create mode 100644 pkg/controller/garbagecollector/patch.go diff --git a/pkg/controller/controller_ref_manager.go b/pkg/controller/controller_ref_manager.go index 7fcc78bf508..226c9b8d3ec 100644 --- a/pkg/controller/controller_ref_manager.go +++ b/pkg/controller/controller_ref_manager.go @@ -191,7 +191,7 @@ func (m *PodControllerRefManager) AdoptPod(pod *v1.Pod) error { // Note that ValidateOwnerReferences() will reject this patch if another // OwnerReference exists with controller=true. addControllerPatch := fmt.Sprintf( - `{"metadata":{"ownerReferences":[{"apiVersion":"%s","kind":"%s","name":"%s","uid":"%s","controller":true}],"uid":"%s"}}`, + `{"metadata":{"ownerReferences":[{"apiVersion":"%s","kind":"%s","name":"%s","uid":"%s","controller":true,"blockOwnerDeletion":true}],"uid":"%s"}}`, m.controllerKind.GroupVersion(), m.controllerKind.Kind, m.controller.GetName(), m.controller.GetUID(), pod.UID) return m.podControl.PatchPod(pod.Namespace, pod.Name, []byte(addControllerPatch)) diff --git a/pkg/controller/controller_utils.go b/pkg/controller/controller_utils.go index 1bf2848ba8c..e090ee93fbf 100644 --- a/pkg/controller/controller_utils.go +++ b/pkg/controller/controller_utils.go @@ -483,6 +483,9 @@ func (r RealPodControl) CreatePodsWithControllerRef(namespace string, template * if controllerRef.Controller == nil || *controllerRef.Controller != true { return fmt.Errorf("controllerRef.Controller is not set") } + if controllerRef.BlockOwnerDeletion == nil || *controllerRef.BlockOwnerDeletion != true { + return fmt.Errorf("controllerRef.BlockOwnerDeletion is not set") + } return r.createPods("", namespace, template, controllerObject, controllerRef) } diff --git a/pkg/controller/garbagecollector/garbagecollector.go b/pkg/controller/garbagecollector/garbagecollector.go index 3e61ce18e83..1e12ff259bd 100644 --- a/pkg/controller/garbagecollector/garbagecollector.go +++ b/pkg/controller/garbagecollector/garbagecollector.go @@ -18,7 +18,6 @@ package garbagecollector import ( "fmt" - "sync" "time" "github.com/golang/glog" @@ -27,655 +26,128 @@ import ( "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" utilerrors "k8s.io/apimachinery/pkg/util/errors" utilruntime "k8s.io/apimachinery/pkg/util/runtime" - "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/dynamic" "k8s.io/client-go/tools/cache" - "k8s.io/client-go/util/clock" "k8s.io/client-go/util/workqueue" "k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly" - + // install the prometheus plugin + _ "k8s.io/kubernetes/pkg/util/workqueue/prometheus" // import known versions _ "k8s.io/client-go/kubernetes" ) const ResourceResyncTime time.Duration = 0 -type monitor struct { - store cache.Store - controller cache.Controller -} - -type objectReference struct { - metav1.OwnerReference - // This is needed by the dynamic client - Namespace string -} - -func (s objectReference) String() string { - return fmt.Sprintf("[%s/%s, namespace: %s, name: %s, uid: %s]", s.APIVersion, s.Kind, s.Namespace, s.Name, s.UID) -} - -// node does not require a lock to protect. The single-threaded -// Propagator.processEvent() is the sole writer of the nodes. The multi-threaded -// GarbageCollector.processItem() reads the nodes, but it only reads the fields -// that never get changed by Propagator.processEvent(). -type node struct { - identity objectReference - // dependents will be read by the orphan() routine, we need to protect it with a lock. - dependentsLock sync.RWMutex - dependents map[*node]struct{} - // When processing an Update event, we need to compare the updated - // ownerReferences with the owners recorded in the graph. - owners []metav1.OwnerReference -} - -func (ownerNode *node) addDependent(dependent *node) { - ownerNode.dependentsLock.Lock() - defer ownerNode.dependentsLock.Unlock() - ownerNode.dependents[dependent] = struct{}{} -} - -func (ownerNode *node) deleteDependent(dependent *node) { - ownerNode.dependentsLock.Lock() - defer ownerNode.dependentsLock.Unlock() - delete(ownerNode.dependents, dependent) -} - -type eventType int - -const ( - addEvent eventType = iota - updateEvent - deleteEvent -) - -type event struct { - eventType eventType - obj interface{} - // the update event comes with an old object, but it's not used by the garbage collector. - oldObj interface{} -} - -type concurrentUIDToNode struct { - *sync.RWMutex - uidToNode map[types.UID]*node -} - -func (m *concurrentUIDToNode) Write(node *node) { - m.Lock() - defer m.Unlock() - m.uidToNode[node.identity.UID] = node -} - -func (m *concurrentUIDToNode) Read(uid types.UID) (*node, bool) { - m.RLock() - defer m.RUnlock() - n, ok := m.uidToNode[uid] - return n, ok -} - -func (m *concurrentUIDToNode) Delete(uid types.UID) { - m.Lock() - defer m.Unlock() - delete(m.uidToNode, uid) -} - -type Propagator struct { - eventQueue *workqueue.TimedWorkQueue - // uidToNode doesn't require a lock to protect, because only the - // single-threaded Propagator.processEvent() reads/writes it. - uidToNode *concurrentUIDToNode - gc *GarbageCollector -} - -// addDependentToOwners adds n to owners' dependents list. If the owner does not -// exist in the p.uidToNode yet, a "virtual" node will be created to represent -// the owner. The "virtual" node will be enqueued to the dirtyQueue, so that -// processItem() will verify if the owner exists according to the API server. -func (p *Propagator) addDependentToOwners(n *node, owners []metav1.OwnerReference) { - for _, owner := range owners { - ownerNode, ok := p.uidToNode.Read(owner.UID) - if !ok { - // Create a "virtual" node in the graph for the owner if it doesn't - // exist in the graph yet. Then enqueue the virtual node into the - // dirtyQueue. The garbage processor will enqueue a virtual delete - // event to delete it from the graph if API server confirms this - // owner doesn't exist. - ownerNode = &node{ - identity: objectReference{ - OwnerReference: owner, - Namespace: n.identity.Namespace, - }, - dependents: make(map[*node]struct{}), - } - glog.V(6).Infof("add virtual node.identity: %s\n\n", ownerNode.identity) - p.uidToNode.Write(ownerNode) - p.gc.dirtyQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: p.gc.clock.Now(), Object: ownerNode}) - } - ownerNode.addDependent(n) - } -} - -// insertNode insert the node to p.uidToNode; then it finds all owners as listed -// in n.owners, and adds the node to their dependents list. -func (p *Propagator) insertNode(n *node) { - p.uidToNode.Write(n) - p.addDependentToOwners(n, n.owners) -} - -// removeDependentFromOwners remove n from owners' dependents list. -func (p *Propagator) removeDependentFromOwners(n *node, owners []metav1.OwnerReference) { - for _, owner := range owners { - ownerNode, ok := p.uidToNode.Read(owner.UID) - if !ok { - continue - } - ownerNode.deleteDependent(n) - } -} - -// removeNode removes the node from p.uidToNode, then finds all -// owners as listed in n.owners, and removes n from their dependents list. -func (p *Propagator) removeNode(n *node) { - p.uidToNode.Delete(n.identity.UID) - p.removeDependentFromOwners(n, n.owners) -} - -// TODO: profile this function to see if a naive N^2 algorithm performs better -// when the number of references is small. -func referencesDiffs(old []metav1.OwnerReference, new []metav1.OwnerReference) (added []metav1.OwnerReference, removed []metav1.OwnerReference) { - oldUIDToRef := make(map[string]metav1.OwnerReference) - for i := 0; i < len(old); i++ { - oldUIDToRef[string(old[i].UID)] = old[i] - } - oldUIDSet := sets.StringKeySet(oldUIDToRef) - newUIDToRef := make(map[string]metav1.OwnerReference) - for i := 0; i < len(new); i++ { - newUIDToRef[string(new[i].UID)] = new[i] - } - newUIDSet := sets.StringKeySet(newUIDToRef) - - addedUID := newUIDSet.Difference(oldUIDSet) - removedUID := oldUIDSet.Difference(newUIDSet) - - for uid := range addedUID { - added = append(added, newUIDToRef[uid]) - } - for uid := range removedUID { - removed = append(removed, oldUIDToRef[uid]) - } - return added, removed -} - -func shouldOrphanDependents(e *event, accessor metav1.Object) bool { - // The delta_fifo may combine the creation and update of the object into one - // event, so we need to check AddEvent as well. - if e.oldObj == nil { - if accessor.GetDeletionTimestamp() == nil { - return false - } - } else { - oldAccessor, err := meta.Accessor(e.oldObj) - if err != nil { - utilruntime.HandleError(fmt.Errorf("cannot access oldObj: %v", err)) - return false - } - // ignore the event if it's not updating DeletionTimestamp from non-nil to nil. - if accessor.GetDeletionTimestamp() == nil || oldAccessor.GetDeletionTimestamp() != nil { - return false - } - } - finalizers := accessor.GetFinalizers() - for _, finalizer := range finalizers { - if finalizer == metav1.FinalizerOrphan { - return true - } - } - return false -} - -// dependents are copies of pointers to the owner's dependents, they don't need to be locked. -func (gc *GarbageCollector) orhpanDependents(owner objectReference, dependents []*node) error { - var failedDependents []objectReference - var errorsSlice []error - for _, dependent := range dependents { - // the dependent.identity.UID is used as precondition - deleteOwnerRefPatch := fmt.Sprintf(`{"metadata":{"ownerReferences":[{"$patch":"delete","uid":"%s"}],"uid":"%s"}}`, owner.UID, dependent.identity.UID) - _, err := gc.patchObject(dependent.identity, []byte(deleteOwnerRefPatch)) - // note that if the target ownerReference doesn't exist in the - // dependent, strategic merge patch will NOT return an error. - if err != nil && !errors.IsNotFound(err) { - errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed with %v", dependent.identity, err)) - } - } - if len(failedDependents) != 0 { - return fmt.Errorf("failed to orphan dependents of owner %s, got errors: %s", owner, utilerrors.NewAggregate(errorsSlice).Error()) - } - glog.V(6).Infof("successfully updated all dependents") - return nil -} - -// TODO: Using Patch when strategicmerge supports deleting an entry from a -// slice of a base type. -func (gc *GarbageCollector) removeOrphanFinalizer(owner *node) error { - const retries = 5 - for count := 0; count < retries; count++ { - ownerObject, err := gc.getObject(owner.identity) - if err != nil { - return fmt.Errorf("cannot finalize owner %s, because cannot get it. The garbage collector will retry later.", owner.identity) - } - accessor, err := meta.Accessor(ownerObject) - if err != nil { - return fmt.Errorf("cannot access the owner object: %v. The garbage collector will retry later.", err) - } - finalizers := accessor.GetFinalizers() - var newFinalizers []string - found := false - for _, f := range finalizers { - if f == metav1.FinalizerOrphan { - found = true - break - } else { - newFinalizers = append(newFinalizers, f) - } - } - if !found { - glog.V(6).Infof("the orphan finalizer is already removed from object %s", owner.identity) - return nil - } - // remove the owner from dependent's OwnerReferences - ownerObject.SetFinalizers(newFinalizers) - _, err = gc.updateObject(owner.identity, ownerObject) - if err == nil { - return nil - } - if err != nil && !errors.IsConflict(err) { - return fmt.Errorf("cannot update the finalizers of owner %s, with error: %v, tried %d times", owner.identity, err, count+1) - } - // retry if it's a conflict - glog.V(6).Infof("got conflict updating the owner object %s, tried %d times", owner.identity, count+1) - } - return fmt.Errorf("updateMaxRetries(%d) has reached. The garbage collector will retry later for owner %v.", retries, owner.identity) -} - -// orphanFinalizer dequeues a node from the orphanQueue, then finds its dependents -// based on the graph maintained by the GC, then removes it from the -// OwnerReferences of its dependents, and finally updates the owner to remove -// the "Orphan" finalizer. The node is add back into the orphanQueue if any of -// these steps fail. -func (gc *GarbageCollector) orphanFinalizer() { - timedItem, quit := gc.orphanQueue.Get() - if quit { - return - } - defer gc.orphanQueue.Done(timedItem) - owner, ok := timedItem.Object.(*node) - if !ok { - utilruntime.HandleError(fmt.Errorf("expect *node, got %#v", timedItem.Object)) - } - // we don't need to lock each element, because they never get updated - owner.dependentsLock.RLock() - dependents := make([]*node, 0, len(owner.dependents)) - for dependent := range owner.dependents { - dependents = append(dependents, dependent) - } - owner.dependentsLock.RUnlock() - - err := gc.orhpanDependents(owner.identity, dependents) - if err != nil { - glog.V(6).Infof("orphanDependents for %s failed with %v", owner.identity, err) - gc.orphanQueue.Add(timedItem) - return - } - // update the owner, remove "orphaningFinalizer" from its finalizers list - err = gc.removeOrphanFinalizer(owner) - if err != nil { - glog.V(6).Infof("removeOrphanFinalizer for %s failed with %v", owner.identity, err) - gc.orphanQueue.Add(timedItem) - } - OrphanProcessingLatency.Observe(sinceInMicroseconds(gc.clock, timedItem.StartTime)) -} - -// Dequeueing an event from eventQueue, updating graph, populating dirty_queue. -func (p *Propagator) processEvent() { - timedItem, quit := p.eventQueue.Get() - if quit { - return - } - defer p.eventQueue.Done(timedItem) - event, ok := timedItem.Object.(*event) - if !ok { - utilruntime.HandleError(fmt.Errorf("expect a *event, got %v", timedItem.Object)) - return - } - obj := event.obj - accessor, err := meta.Accessor(obj) - if err != nil { - utilruntime.HandleError(fmt.Errorf("cannot access obj: %v", err)) - return - } - typeAccessor, err := meta.TypeAccessor(obj) - if err != nil { - utilruntime.HandleError(fmt.Errorf("cannot access obj: %v", err)) - return - } - glog.V(6).Infof("Propagator process object: %s/%s, namespace %s, name %s, event type %s", typeAccessor.GetAPIVersion(), typeAccessor.GetKind(), accessor.GetNamespace(), accessor.GetName(), event.eventType) - // Check if the node already exsits - existingNode, found := p.uidToNode.Read(accessor.GetUID()) - switch { - case (event.eventType == addEvent || event.eventType == updateEvent) && !found: - newNode := &node{ - identity: objectReference{ - OwnerReference: metav1.OwnerReference{ - APIVersion: typeAccessor.GetAPIVersion(), - Kind: typeAccessor.GetKind(), - UID: accessor.GetUID(), - Name: accessor.GetName(), - }, - Namespace: accessor.GetNamespace(), - }, - dependents: make(map[*node]struct{}), - owners: accessor.GetOwnerReferences(), - } - p.insertNode(newNode) - // the underlying delta_fifo may combine a creation and deletion into one event - if shouldOrphanDependents(event, accessor) { - glog.V(6).Infof("add %s to the orphanQueue", newNode.identity) - p.gc.orphanQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: p.gc.clock.Now(), Object: newNode}) - } - case (event.eventType == addEvent || event.eventType == updateEvent) && found: - // caveat: if GC observes the creation of the dependents later than the - // deletion of the owner, then the orphaning finalizer won't be effective. - if shouldOrphanDependents(event, accessor) { - glog.V(6).Infof("add %s to the orphanQueue", existingNode.identity) - p.gc.orphanQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: p.gc.clock.Now(), Object: existingNode}) - } - // add/remove owner refs - added, removed := referencesDiffs(existingNode.owners, accessor.GetOwnerReferences()) - if len(added) == 0 && len(removed) == 0 { - glog.V(6).Infof("The updateEvent %#v doesn't change node references, ignore", event) - return - } - // update the node itself - existingNode.owners = accessor.GetOwnerReferences() - // Add the node to its new owners' dependent lists. - p.addDependentToOwners(existingNode, added) - // remove the node from the dependent list of node that are no long in - // the node's owners list. - p.removeDependentFromOwners(existingNode, removed) - case event.eventType == deleteEvent: - if !found { - glog.V(6).Infof("%v doesn't exist in the graph, this shouldn't happen", accessor.GetUID()) - return - } - p.removeNode(existingNode) - existingNode.dependentsLock.RLock() - defer existingNode.dependentsLock.RUnlock() - if len(existingNode.dependents) > 0 { - p.gc.absentOwnerCache.Add(accessor.GetUID()) - } - for dep := range existingNode.dependents { - p.gc.dirtyQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: p.gc.clock.Now(), Object: dep}) - } - } - EventProcessingLatency.Observe(sinceInMicroseconds(p.gc.clock, timedItem.StartTime)) -} - -// GarbageCollector is responsible for carrying out cascading deletion, and -// removing ownerReferences from the dependents if the owner is deleted with -// DeleteOptions.OrphanDependents=true. +// GarbageCollector runs reflectors to watch for changes of managed API +// objects, funnels the results to a single-threaded dependencyGraphBuilder, +// which builds a graph caching the dependencies among objects. Triggered by the +// graph changes, the dependencyGraphBuilder enqueues objects that can +// potentially be garbage-collected to the `attemptToDelete` queue, and enqueues +// objects whose dependents need to be orphaned to the `attemptToOrphan` queue. +// The GarbageCollector has workers who consume these two queues, send requests +// to the API server to delete/update the objects accordingly. +// Note that having the dependencyGraphBuilder notify the garbage collector +// ensures that the garbage collector operates with a graph that is at least as +// up to date as the notification is sent. type GarbageCollector struct { restMapper meta.RESTMapper - // metaOnlyClientPool uses a special codec, which removes fields except for - // apiVersion, kind, and metadata during decoding. - metaOnlyClientPool dynamic.ClientPool // clientPool uses the regular dynamicCodec. We need it to update // finalizers. It can be removed if we support patching finalizers. - clientPool dynamic.ClientPool - dirtyQueue *workqueue.TimedWorkQueue - orphanQueue *workqueue.TimedWorkQueue - monitors []monitor - propagator *Propagator - clock clock.Clock - registeredRateLimiter *RegisteredRateLimiter - registeredRateLimiterForMonitors *RegisteredRateLimiter + clientPool dynamic.ClientPool + // garbage collector attempts to delete the items in attemptToDelete queue when the time is ripe. + attemptToDelete workqueue.RateLimitingInterface + // garbage collector attempts to orphan the dependents of the items in the attemptToOrphan queue, then deletes the items. + attemptToOrphan workqueue.RateLimitingInterface + dependencyGraphBuilder *GraphBuilder + // used to register exactly once the rate limiter of the dynamic client + // used by the garbage collector controller. + registeredRateLimiter *RegisteredRateLimiter // GC caches the owners that do not exist according to the API server. absentOwnerCache *UIDCache } -func gcListWatcher(client *dynamic.Client, resource schema.GroupVersionResource) *cache.ListWatch { - return &cache.ListWatch{ - ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { - // APIResource.Kind is not used by the dynamic client, so - // leave it empty. We want to list this resource in all - // namespaces if it's namespace scoped, so leave - // APIResource.Namespaced as false is all right. - apiResource := metav1.APIResource{Name: resource.Resource} - return client.ParameterCodec(dynamic.VersionedParameterEncoderWithV1Fallback). - Resource(&apiResource, metav1.NamespaceAll). - List(options) - }, - WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { - // APIResource.Kind is not used by the dynamic client, so - // leave it empty. We want to list this resource in all - // namespaces if it's namespace scoped, so leave - // APIResource.Namespaced as false is all right. - apiResource := metav1.APIResource{Name: resource.Resource} - return client.ParameterCodec(dynamic.VersionedParameterEncoderWithV1Fallback). - Resource(&apiResource, metav1.NamespaceAll). - Watch(options) - }, - } -} - -func (gc *GarbageCollector) monitorFor(resource schema.GroupVersionResource, kind schema.GroupVersionKind) (monitor, error) { - // TODO: consider store in one storage. - glog.V(6).Infof("create storage for resource %s", resource) - var monitor monitor - client, err := gc.metaOnlyClientPool.ClientForGroupVersionKind(kind) - if err != nil { - return monitor, err - } - gc.registeredRateLimiterForMonitors.registerIfNotPresent(resource.GroupVersion(), client, "garbage_collector_monitoring") - setObjectTypeMeta := func(obj interface{}) { - runtimeObject, ok := obj.(runtime.Object) - if !ok { - utilruntime.HandleError(fmt.Errorf("expected runtime.Object, got %#v", obj)) - } - runtimeObject.GetObjectKind().SetGroupVersionKind(kind) - } - monitor.store, monitor.controller = cache.NewInformer( - gcListWatcher(client, resource), - nil, - ResourceResyncTime, - cache.ResourceEventHandlerFuncs{ - // add the event to the propagator's eventQueue. - AddFunc: func(obj interface{}) { - setObjectTypeMeta(obj) - event := &event{ - eventType: addEvent, - obj: obj, - } - gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) - }, - UpdateFunc: func(oldObj, newObj interface{}) { - setObjectTypeMeta(newObj) - event := &event{updateEvent, newObj, oldObj} - gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) - }, - DeleteFunc: func(obj interface{}) { - // delta fifo may wrap the object in a cache.DeletedFinalStateUnknown, unwrap it - if deletedFinalStateUnknown, ok := obj.(cache.DeletedFinalStateUnknown); ok { - obj = deletedFinalStateUnknown.Obj - } - setObjectTypeMeta(obj) - event := &event{ - eventType: deleteEvent, - obj: obj, - } - gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) - }, - }, - ) - return monitor, nil -} - -var ignoredResources = map[schema.GroupVersionResource]struct{}{ - schema.GroupVersionResource{Group: "extensions", Version: "v1beta1", Resource: "replicationcontrollers"}: {}, - schema.GroupVersionResource{Group: "", Version: "v1", Resource: "bindings"}: {}, - schema.GroupVersionResource{Group: "", Version: "v1", Resource: "componentstatuses"}: {}, - schema.GroupVersionResource{Group: "", Version: "v1", Resource: "events"}: {}, - schema.GroupVersionResource{Group: "authentication.k8s.io", Version: "v1beta1", Resource: "tokenreviews"}: {}, - schema.GroupVersionResource{Group: "authentication.k8s.io", Version: "v1", Resource: "tokenreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "subjectaccessreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "selfsubjectaccessreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "localsubjectaccessreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1", Resource: "subjectaccessreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1", Resource: "selfsubjectaccessreviews"}: {}, - schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1", Resource: "localsubjectaccessreviews"}: {}, -} - func NewGarbageCollector(metaOnlyClientPool dynamic.ClientPool, clientPool dynamic.ClientPool, mapper meta.RESTMapper, deletableResources map[schema.GroupVersionResource]struct{}) (*GarbageCollector, error) { + attemptToDelete := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "garbage_collector_attempt_to_delete") + attemptToOrphan := workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "garbage_collector_attempt_to_orphan") + absentOwnerCache := NewUIDCache(500) gc := &GarbageCollector{ - metaOnlyClientPool: metaOnlyClientPool, - clientPool: clientPool, - restMapper: mapper, - clock: clock.RealClock{}, - dirtyQueue: workqueue.NewTimedWorkQueue(), - orphanQueue: workqueue.NewTimedWorkQueue(), - registeredRateLimiter: NewRegisteredRateLimiter(deletableResources), - registeredRateLimiterForMonitors: NewRegisteredRateLimiter(deletableResources), - absentOwnerCache: NewUIDCache(500), + clientPool: clientPool, + restMapper: mapper, + attemptToDelete: attemptToDelete, + attemptToOrphan: attemptToOrphan, + registeredRateLimiter: NewRegisteredRateLimiter(deletableResources), + absentOwnerCache: absentOwnerCache, } - gc.propagator = &Propagator{ - eventQueue: workqueue.NewTimedWorkQueue(), + gb := &GraphBuilder{ + metaOnlyClientPool: metaOnlyClientPool, + registeredRateLimiterForControllers: NewRegisteredRateLimiter(deletableResources), + restMapper: mapper, + graphChanges: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "garbage_collector_graph_changes"), uidToNode: &concurrentUIDToNode{ - RWMutex: &sync.RWMutex{}, uidToNode: make(map[types.UID]*node), }, - gc: gc, + attemptToDelete: attemptToDelete, + attemptToOrphan: attemptToOrphan, + absentOwnerCache: absentOwnerCache, } - for resource := range deletableResources { - if _, ok := ignoredResources[resource]; ok { - glog.V(6).Infof("ignore resource %#v", resource) - continue - } - kind, err := gc.restMapper.KindFor(resource) - if err != nil { - if _, ok := err.(*meta.NoResourceMatchError); ok { - // ignore NoResourceMatchErrors for now because TPRs won't be registered - // and hence the RestMapper does not know about them. The deletableResources - // though are using discovery which included TPRs. - // TODO: use dynamic discovery for RestMapper and deletableResources - glog.Warningf("ignore NoResourceMatchError for %v", resource) - continue - } - return nil, err - } - monitor, err := gc.monitorFor(resource, kind) - if err != nil { - return nil, err - } - gc.monitors = append(gc.monitors, monitor) + if err := gb.monitorsForResources(deletableResources); err != nil { + return nil, err } + gc.dependencyGraphBuilder = gb + return gc, nil } -func (gc *GarbageCollector) worker() { - timedItem, quit := gc.dirtyQueue.Get() +func (gc *GarbageCollector) Run(workers int, stopCh <-chan struct{}) { + defer gc.attemptToDelete.ShutDown() + defer gc.attemptToOrphan.ShutDown() + defer gc.dependencyGraphBuilder.graphChanges.ShutDown() + + glog.Infof("Garbage Collector: Initializing") + gc.dependencyGraphBuilder.Run(stopCh) + if !cache.WaitForCacheSync(stopCh, gc.dependencyGraphBuilder.HasSynced) { + return + } + glog.Infof("Garbage Collector: All resource monitors have synced. Proceeding to collect garbage") + + // gc workers + for i := 0; i < workers; i++ { + go wait.Until(gc.runAttemptToDeleteWorker, 1*time.Second, stopCh) + go wait.Until(gc.runAttemptToOrphanWorker, 1*time.Second, stopCh) + } + Register() + <-stopCh + glog.Infof("Garbage Collector: Shutting down") +} + +func (gc *GarbageCollector) runAttemptToDeleteWorker() { + for gc.attemptToDeleteWorker() { + } +} + +func (gc *GarbageCollector) attemptToDeleteWorker() bool { + item, quit := gc.attemptToDelete.Get() if quit { - return + return false } - defer gc.dirtyQueue.Done(timedItem) - err := gc.processItem(timedItem.Object.(*node)) + defer gc.attemptToDelete.Done(item) + n, ok := item.(*node) + if !ok { + utilruntime.HandleError(fmt.Errorf("expect *node, got %#v", item)) + return true + } + err := gc.attemptToDeleteItem(n) if err != nil { - utilruntime.HandleError(fmt.Errorf("Error syncing item %#v: %v", timedItem.Object, err)) + utilruntime.HandleError(fmt.Errorf("Error syncing item %#v: %v", n, err)) // retry if garbage collection of an object failed. - gc.dirtyQueue.Add(timedItem) - return + gc.attemptToDelete.AddRateLimited(item) } - DirtyProcessingLatency.Observe(sinceInMicroseconds(gc.clock, timedItem.StartTime)) -} - -// apiResource consults the REST mapper to translate an tuple to a metav1.APIResource struct. -func (gc *GarbageCollector) apiResource(apiVersion, kind string, namespaced bool) (*metav1.APIResource, error) { - fqKind := schema.FromAPIVersionAndKind(apiVersion, kind) - mapping, err := gc.restMapper.RESTMapping(fqKind.GroupKind(), apiVersion) - if err != nil { - return nil, fmt.Errorf("unable to get REST mapping for kind: %s, version: %s", kind, apiVersion) - } - glog.V(6).Infof("map kind %s, version %s to resource %s", kind, apiVersion, mapping.Resource) - resource := metav1.APIResource{ - Name: mapping.Resource, - Namespaced: namespaced, - Kind: kind, - } - return &resource, nil -} - -func (gc *GarbageCollector) deleteObject(item objectReference) error { - fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) - client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) - gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") - resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) - if err != nil { - return err - } - uid := item.UID - preconditions := metav1.Preconditions{UID: &uid} - deleteOptions := metav1.DeleteOptions{Preconditions: &preconditions} - return client.Resource(resource, item.Namespace).Delete(item.Name, &deleteOptions) -} - -func (gc *GarbageCollector) getObject(item objectReference) (*unstructured.Unstructured, error) { - fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) - client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) - gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") - resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) - if err != nil { - return nil, err - } - return client.Resource(resource, item.Namespace).Get(item.Name) -} - -func (gc *GarbageCollector) updateObject(item objectReference, obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { - fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) - client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) - gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") - resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) - if err != nil { - return nil, err - } - return client.Resource(resource, item.Namespace).Update(obj) -} - -func (gc *GarbageCollector) patchObject(item objectReference, patch []byte) (*unstructured.Unstructured, error) { - fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) - client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) - gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") - resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) - if err != nil { - return nil, err - } - return client.Resource(resource, item.Namespace).Patch(item.Name, types.StrategicMergePatchType, patch) -} - -func objectReferenceToUnstructured(ref objectReference) *unstructured.Unstructured { - ret := &unstructured.Unstructured{} - ret.SetKind(ref.Kind) - ret.SetAPIVersion(ref.APIVersion) - ret.SetUID(ref.UID) - ret.SetNamespace(ref.Namespace) - ret.SetName(ref.Name) - return ret + return true } func objectReferenceToMetadataOnlyObject(ref objectReference) *metaonly.MetadataOnlyObject { @@ -692,121 +164,284 @@ func objectReferenceToMetadataOnlyObject(ref objectReference) *metaonly.Metadata } } -func (gc *GarbageCollector) processItem(item *node) error { - // Get the latest item from the API server - latest, err := gc.getObject(item.identity) +// isDangling check if a reference is pointing to an object that doesn't exist. +// If isDangling looks up the referenced object at the API server, it also +// returns its latest state. +func (gc *GarbageCollector) isDangling(reference metav1.OwnerReference, item *node) ( + dangling bool, owner *unstructured.Unstructured, err error) { + if gc.absentOwnerCache.Has(reference.UID) { + glog.V(5).Infof("according to the absentOwnerCache, object %s's owner %s/%s, %s does not exist", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) + return true, nil, nil + } + // TODO: we need to verify the reference resource is supported by the + // system. If it's not a valid resource, the garbage collector should i) + // ignore the reference when decide if the object should be deleted, and + // ii) should update the object to remove such references. This is to + // prevent objects having references to an old resource from being + // deleted during a cluster upgrade. + fqKind := schema.FromAPIVersionAndKind(reference.APIVersion, reference.Kind) + client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) if err != nil { - if errors.IsNotFound(err) { - // the Propagator can add "virtual" node for an owner that doesn't - // exist yet, so we need to enqueue a virtual Delete event to remove - // the virtual node from Propagator.uidToNode. - glog.V(6).Infof("item %v not found, generating a virtual delete event", item.identity) - event := &event{ - eventType: deleteEvent, - obj: objectReferenceToMetadataOnlyObject(item.identity), - } - glog.V(6).Infof("generating virtual delete event for %s\n\n", event.obj) - gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) - return nil + return false, nil, err + } + resource, err := gc.apiResource(reference.APIVersion, reference.Kind, len(item.identity.Namespace) != 0) + if err != nil { + return false, nil, err + } + // TODO: It's only necessary to talk to the API server if the owner node + // is a "virtual" node. The local graph could lag behind the real + // status, but in practice, the difference is small. + owner, err = client.Resource(resource, item.identity.Namespace).Get(reference.Name) + switch { + case errors.IsNotFound(err): + gc.absentOwnerCache.Add(reference.UID) + glog.V(5).Infof("object %s's owner %s/%s, %s is not found", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) + return true, nil, nil + case err != nil: + return false, nil, err + } + + if owner.GetUID() != reference.UID { + glog.V(5).Infof("object %s's owner %s/%s, %s is not found, UID mismatch", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) + gc.absentOwnerCache.Add(reference.UID) + return true, nil, nil + } + return false, owner, nil +} + +// classify the latestReferences to three categories: +// solid: the owner exists, and is not "waitingForDependentsDeletion" +// dangling: the owner does not exist +// waitingForDependentsDeletion: the owner exists, its deletionTimestamp is non-nil, and it has +// FinalizerDeletingDependents +// This function communicates with the server. +func (gc *GarbageCollector) classifyReferences(item *node, latestReferences []metav1.OwnerReference) ( + solid, dangling, waitingForDependentsDeletion []metav1.OwnerReference, err error) { + for _, reference := range latestReferences { + isDangling, owner, err := gc.isDangling(reference, item) + if err != nil { + return nil, nil, nil, err } - return err - } - if latest.GetUID() != item.identity.UID { - glog.V(6).Infof("UID doesn't match, item %v not found, generating a virtual delete event", item.identity) - event := &event{ - eventType: deleteEvent, - obj: objectReferenceToMetadataOnlyObject(item.identity), - } - glog.V(6).Infof("generating virtual delete event for %s\n\n", event.obj) - gc.propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: event}) - return nil - } - ownerReferences := latest.GetOwnerReferences() - if len(ownerReferences) == 0 { - glog.V(6).Infof("object %s's doesn't have an owner, continue on next item", item.identity) - return nil - } - // TODO: we need to remove dangling references if the object is not to be - // deleted. - for _, reference := range ownerReferences { - if gc.absentOwnerCache.Has(reference.UID) { - glog.V(6).Infof("according to the absentOwnerCache, object %s's owner %s/%s, %s does not exist", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) + if isDangling { + dangling = append(dangling, reference) continue } - // TODO: we need to verify the reference resource is supported by the - // system. If it's not a valid resource, the garbage collector should i) - // ignore the reference when decide if the object should be deleted, and - // ii) should update the object to remove such references. This is to - // prevent objects having references to an old resource from being - // deleted during a cluster upgrade. - fqKind := schema.FromAPIVersionAndKind(reference.APIVersion, reference.Kind) - client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) + + ownerAccessor, err := meta.Accessor(owner) if err != nil { - return err + return nil, nil, nil, err } - resource, err := gc.apiResource(reference.APIVersion, reference.Kind, len(item.identity.Namespace) != 0) - if err != nil { - return err - } - owner, err := client.Resource(resource, item.identity.Namespace).Get(reference.Name) - if err == nil { - if owner.GetUID() != reference.UID { - glog.V(6).Infof("object %s's owner %s/%s, %s is not found, UID mismatch", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) - gc.absentOwnerCache.Add(reference.UID) - continue - } - glog.V(6).Infof("object %s has at least an existing owner, will not garbage collect", item.identity.UID) - return nil - } else if errors.IsNotFound(err) { - gc.absentOwnerCache.Add(reference.UID) - glog.V(6).Infof("object %s's owner %s/%s, %s is not found", item.identity.UID, reference.APIVersion, reference.Kind, reference.Name) + if ownerAccessor.GetDeletionTimestamp() != nil && hasDeleteDependentsFinalizer(ownerAccessor) { + waitingForDependentsDeletion = append(waitingForDependentsDeletion, reference) } else { - return err + solid = append(solid, reference) } } - glog.V(2).Infof("none of object %s's owners exist any more, will garbage collect it", item.identity) - return gc.deleteObject(item.identity) + return solid, dangling, waitingForDependentsDeletion, nil } -func (gc *GarbageCollector) Run(workers int, stopCh <-chan struct{}) { - glog.Infof("Garbage Collector: Initializing") - for _, monitor := range gc.monitors { - go monitor.controller.Run(stopCh) +func (gc *GarbageCollector) generateVirtualDeleteEvent(identity objectReference) { + event := &event{ + eventType: deleteEvent, + obj: objectReferenceToMetadataOnlyObject(identity), + } + glog.V(5).Infof("generating virtual delete event for %s\n\n", event.obj) + gc.dependencyGraphBuilder.enqueueChanges(event) +} + +func ownerRefsToUIDs(refs []metav1.OwnerReference) []types.UID { + var ret []types.UID + for _, ref := range refs { + ret = append(ret, ref.UID) + } + return ret +} + +func (gc *GarbageCollector) attemptToDeleteItem(item *node) error { + glog.V(2).Infof("processing item %s", item.identity) + // "being deleted" is an one-way trip to the final deletion. We'll just wait for the final deletion, and then process the object's dependents. + if item.isBeingDeleted() && !item.isDeletingDependents() { + glog.V(5).Infof("processing item %s returned at once, because its DeletionTimestamp is non-nil", item.identity) + return nil + } + // TODO: It's only necessary to talk to the API server if this is a + // "virtual" node. The local graph could lag behind the real status, but in + // practice, the difference is small. + latest, err := gc.getObject(item.identity) + switch { + case errors.IsNotFound(err): + // the GraphBuilder can add "virtual" node for an owner that doesn't + // exist yet, so we need to enqueue a virtual Delete event to remove + // the virtual node from GraphBuilder.uidToNode. + glog.V(5).Infof("item %v not found, generating a virtual delete event", item.identity) + gc.generateVirtualDeleteEvent(item.identity) + return nil + case err != nil: + return err } - wait.PollInfinite(10*time.Second, func() (bool, error) { - for _, monitor := range gc.monitors { - if !monitor.controller.HasSynced() { - glog.Infof("Garbage Collector: Waiting for resource monitors to be synced...") - return false, nil + if latest.GetUID() != item.identity.UID { + glog.V(5).Infof("UID doesn't match, item %v not found, generating a virtual delete event", item.identity) + gc.generateVirtualDeleteEvent(item.identity) + return nil + } + + // TODO: attemptToOrphanWorker() routine is similar. Consider merging + // attemptToOrphanWorker() into attemptToDeleteItem() as well. + if item.isDeletingDependents() { + return gc.processDeletingDependentsItem(item) + } + + // compute if we should delete the item + ownerReferences := latest.GetOwnerReferences() + if len(ownerReferences) == 0 { + glog.V(2).Infof("object %s's doesn't have an owner, continue on next item", item.identity) + return nil + } + + solid, dangling, waitingForDependentsDeletion, err := gc.classifyReferences(item, ownerReferences) + if err != nil { + return err + } + glog.V(5).Infof("classify references of %s.\nsolid: %#v\ndangling: %#v\nwaitingForDependentsDeletion: %#v\n", item.identity, solid, dangling, waitingForDependentsDeletion) + + switch { + case len(solid) != 0: + glog.V(2).Infof("object %s has at least one existing owner: %#v, will not garbage collect", solid, item.identity) + if len(dangling) != 0 || len(waitingForDependentsDeletion) != 0 { + glog.V(2).Infof("remove dangling references %#v and waiting references %#v for object %s", dangling, waitingForDependentsDeletion, item.identity) + } + // waitingForDependentsDeletion needs to be deleted from the + // ownerReferences, otherwise the referenced objects will be stuck with + // the FinalizerDeletingDependents and never get deleted. + patch := deleteOwnerRefPatch(item.identity.UID, append(ownerRefsToUIDs(dangling), ownerRefsToUIDs(waitingForDependentsDeletion)...)...) + _, err = gc.patchObject(item.identity, patch) + return err + case len(waitingForDependentsDeletion) != 0 && item.dependentsLength() != 0: + deps := item.getDependents() + for _, dep := range deps { + if dep.isDeletingDependents() { + // this circle detection has false positives, we need to + // apply a more rigorous detection if this turns out to be a + // problem. + // there are multiple workers run attemptToDeleteItem in + // parallel, the circle detection can fail in a race condition. + glog.V(2).Infof("processing object %s, some of its owners and its dependent [%s] have FinalizerDeletingDependents, to prevent potential cycle, its ownerReferences are going to be modified to be non-blocking, then the object is going to be deleted with Foreground", item.identity, dep.identity) + patch, err := item.patchToUnblockOwnerReferences() + if err != nil { + return err + } + if _, err := gc.patchObject(item.identity, patch); err != nil { + return err + } + break } } - return true, nil - }) - glog.Infof("Garbage Collector: All monitored resources synced. Proceeding to collect garbage") - - // worker - go wait.Until(gc.propagator.processEvent, 0, stopCh) - - for i := 0; i < workers; i++ { - go wait.Until(gc.worker, 0, stopCh) - go wait.Until(gc.orphanFinalizer, 0, stopCh) + glog.V(2).Infof("at least one owner of object %s has FinalizerDeletingDependents, and the object itself has dependents, so it is going to be deleted with Foreground", item.identity) + // the deletion event will be observed by the graphBuilder, so the item + // will be processed again in processDeletingDependentsItem. If it + // doesn't have dependents, the function will remove the + // FinalizerDeletingDependents from the item, resulting in the final + // deletion of the item. + policy := metav1.DeletePropagationForeground + return gc.deleteObject(item.identity, &policy) + default: + // item doesn't have any solid owner, so it needs to be garbage + // collected. Also, none of item's owners is waiting for the deletion of + // the dependents, so GC deletes item with Default. + glog.V(2).Infof("delete object %s with Default", item.identity) + return gc.deleteObject(item.identity, nil) } - Register() - <-stopCh - glog.Infof("Garbage Collector: Shutting down") - gc.dirtyQueue.ShutDown() - gc.orphanQueue.ShutDown() - gc.propagator.eventQueue.ShutDown() } -// *FOR TEST USE ONLY* It's not safe to call this function when the GC is still -// busy. -// GraphHasUID returns if the Propagator has a particular UID store in its +// process item that's waiting for its dependents to be deleted +func (gc *GarbageCollector) processDeletingDependentsItem(item *node) error { + blockingDependents := item.blockingDependents() + if len(blockingDependents) == 0 { + glog.V(2).Infof("remove DeleteDependents finalizer for item %s", item.identity) + return gc.removeFinalizer(item, metav1.FinalizerDeleteDependents) + } + for _, dep := range blockingDependents { + if !dep.isDeletingDependents() { + glog.V(2).Infof("adding %s to attemptToDelete, because its owner %s is deletingDependents", dep.identity, item.identity) + gc.attemptToDelete.Add(dep) + } + } + return nil +} + +// dependents are copies of pointers to the owner's dependents, they don't need to be locked. +func (gc *GarbageCollector) orphanDependents(owner objectReference, dependents []*node) error { + var failedDependents []objectReference + var errorsSlice []error + for _, dependent := range dependents { + // the dependent.identity.UID is used as precondition + patch := deleteOwnerRefPatch(dependent.identity.UID, owner.UID) + _, err := gc.patchObject(dependent.identity, patch) + // note that if the target ownerReference doesn't exist in the + // dependent, strategic merge patch will NOT return an error. + if err != nil && !errors.IsNotFound(err) { + errorsSlice = append(errorsSlice, fmt.Errorf("orphaning %s failed with %v", dependent.identity, err)) + } + } + if len(failedDependents) != 0 { + return fmt.Errorf("failed to orphan dependents of owner %s, got errors: %s", owner, utilerrors.NewAggregate(errorsSlice).Error()) + } + glog.V(5).Infof("successfully updated all dependents of owner %s", owner) + return nil +} + +func (gc *GarbageCollector) runAttemptToOrphanWorker() { + for gc.attemptToOrphanWorker() { + } +} + +// attemptToOrphanWorker dequeues a node from the attemptToOrphan, then finds its +// dependents based on the graph maintained by the GC, then removes it from the +// OwnerReferences of its dependents, and finally updates the owner to remove +// the "Orphan" finalizer. The node is added back into the attemptToOrphan if any of +// these steps fail. +func (gc *GarbageCollector) attemptToOrphanWorker() bool { + item, quit := gc.attemptToOrphan.Get() + if quit { + return false + } + defer gc.attemptToOrphan.Done(item) + owner, ok := item.(*node) + if !ok { + utilruntime.HandleError(fmt.Errorf("expect *node, got %#v", item)) + return true + } + // we don't need to lock each element, because they never get updated + owner.dependentsLock.RLock() + dependents := make([]*node, 0, len(owner.dependents)) + for dependent := range owner.dependents { + dependents = append(dependents, dependent) + } + owner.dependentsLock.RUnlock() + + err := gc.orphanDependents(owner.identity, dependents) + if err != nil { + glog.V(5).Infof("orphanDependents for %s failed with %v", owner.identity, err) + gc.attemptToOrphan.AddRateLimited(item) + return true + } + // update the owner, remove "orphaningFinalizer" from its finalizers list + err = gc.removeFinalizer(owner, metav1.FinalizerOrphanDependents) + if err != nil { + glog.V(5).Infof("removeOrphanFinalizer for %s failed with %v", owner.identity, err) + gc.attemptToOrphan.AddRateLimited(item) + } + return true +} + +// *FOR TEST USE ONLY* +// GraphHasUID returns if the GraphBuilder has a particular UID store in its // uidToNode graph. It's useful for debugging. +// This method is used by integration tests. func (gc *GarbageCollector) GraphHasUID(UIDs []types.UID) bool { for _, u := range UIDs { - if _, ok := gc.propagator.uidToNode.Read(u); ok { + if _, ok := gc.dependencyGraphBuilder.uidToNode.Read(u); ok { return true } } diff --git a/pkg/controller/garbagecollector/garbagecollector_test.go b/pkg/controller/garbagecollector/garbagecollector_test.go index ff658feda4b..901ae996799 100644 --- a/pkg/controller/garbagecollector/garbagecollector_test.go +++ b/pkg/controller/garbagecollector/garbagecollector_test.go @@ -19,6 +19,7 @@ package garbagecollector import ( "net/http" "net/http/httptest" + "reflect" "strings" "sync" "testing" @@ -27,15 +28,16 @@ import ( _ "k8s.io/kubernetes/pkg/api/install" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/json" "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/client-go/dynamic" restclient "k8s.io/client-go/rest" - "k8s.io/client-go/util/clock" "k8s.io/client-go/util/workqueue" "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/v1" @@ -53,7 +55,7 @@ func TestNewGarbageCollector(t *testing.T) { if err != nil { t.Fatal(err) } - assert.Equal(t, 1, len(gc.monitors)) + assert.Equal(t, 1, len(gc.dependencyGraphBuilder.monitors)) } // fakeAction records information about requests to aid in testing. @@ -142,8 +144,8 @@ func serilizeOrDie(t *testing.T, object interface{}) []byte { return data } -// test the processItem function making the expected actions. -func TestProcessItem(t *testing.T) { +// test the attemptToDeleteItem function making the expected actions. +func TestAttemptToDeleteItem(t *testing.T) { pod := getPod("ToBeDeletedPod", []metav1.OwnerReference{ { Kind: "ReplicationController", @@ -177,10 +179,10 @@ func TestProcessItem(t *testing.T) { }, Namespace: pod.Namespace, }, - // owners are intentionally left empty. The processItem routine should get the latest item from the server. + // owners are intentionally left empty. The attemptToDeleteItem routine should get the latest item from the server. owners: nil, } - err := gc.processItem(item) + err := gc.attemptToDeleteItem(item) if err != nil { t.Errorf("Unexpected Error: %v", err) } @@ -249,7 +251,7 @@ func TestProcessEvent(t *testing.T) { var testScenarios = []struct { name string // a series of events that will be supplied to the - // Propagator.eventQueue. + // GraphBuilder.eventQueue. events []event }{ { @@ -293,22 +295,19 @@ func TestProcessEvent(t *testing.T) { } for _, scenario := range testScenarios { - propagator := &Propagator{ - eventQueue: workqueue.NewTimedWorkQueue(), + dependencyGraphBuilder := &GraphBuilder{ + graphChanges: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), uidToNode: &concurrentUIDToNode{ - RWMutex: &sync.RWMutex{}, - uidToNode: make(map[types.UID]*node), - }, - gc: &GarbageCollector{ - dirtyQueue: workqueue.NewTimedWorkQueue(), - clock: clock.RealClock{}, - absentOwnerCache: NewUIDCache(2), + uidToNodeLock: sync.RWMutex{}, + uidToNode: make(map[types.UID]*node), }, + attemptToDelete: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()), + absentOwnerCache: NewUIDCache(2), } for i := 0; i < len(scenario.events); i++ { - propagator.eventQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: propagator.gc.clock.Now(), Object: &scenario.events[i]}) - propagator.processEvent() - verifyGraphInvariants(scenario.name, propagator.uidToNode.uidToNode, t) + dependencyGraphBuilder.graphChanges.Add(&scenario.events[i]) + dependencyGraphBuilder.processGraphChanges() + verifyGraphInvariants(scenario.name, dependencyGraphBuilder.uidToNode.uidToNode, t) } } } @@ -321,18 +320,18 @@ func TestDependentsRace(t *testing.T) { const updates = 100 owner := &node{dependents: make(map[*node]struct{})} ownerUID := types.UID("owner") - gc.propagator.uidToNode.Write(owner) + gc.dependencyGraphBuilder.uidToNode.Write(owner) go func() { for i := 0; i < updates; i++ { dependent := &node{} - gc.propagator.addDependentToOwners(dependent, []metav1.OwnerReference{{UID: ownerUID}}) - gc.propagator.removeDependentFromOwners(dependent, []metav1.OwnerReference{{UID: ownerUID}}) + gc.dependencyGraphBuilder.addDependentToOwners(dependent, []metav1.OwnerReference{{UID: ownerUID}}) + gc.dependencyGraphBuilder.removeDependentFromOwners(dependent, []metav1.OwnerReference{{UID: ownerUID}}) } }() go func() { - gc.orphanQueue.Add(&workqueue.TimedWorkQueueItem{StartTime: gc.clock.Now(), Object: owner}) + gc.attemptToOrphan.Add(owner) for i := 0; i < updates; i++ { - gc.orphanFinalizer() + gc.attemptToOrphanWorker() } }() } @@ -348,9 +347,13 @@ func TestGCListWatcher(t *testing.T) { if err != nil { t.Fatal(err) } - lw := gcListWatcher(client, podResource) - lw.Watch(metav1.ListOptions{ResourceVersion: "1"}) - lw.List(metav1.ListOptions{ResourceVersion: "1"}) + lw := listWatcher(client, podResource) + if _, err := lw.Watch(metav1.ListOptions{ResourceVersion: "1"}); err != nil { + t.Fatal(err) + } + if _, err := lw.List(metav1.ListOptions{ResourceVersion: "1"}); err != nil { + t.Fatal(err) + } if e, a := 2, len(testHandler.actions); e != a { t.Errorf("expect %d requests, got %d", e, a) } @@ -373,7 +376,7 @@ func podToGCNode(pod *v1.Pod) *node { }, Namespace: pod.Namespace, }, - // owners are intentionally left empty. The processItem routine should get the latest item from the server. + // owners are intentionally left empty. The attemptToDeleteItem routine should get the latest item from the server. owners: nil, } } @@ -447,12 +450,12 @@ func TestAbsentUIDCache(t *testing.T) { defer srv.Close() gc := setupGC(t, clientConfig) gc.absentOwnerCache = NewUIDCache(2) - gc.processItem(podToGCNode(rc1Pod1)) - gc.processItem(podToGCNode(rc2Pod1)) + gc.attemptToDeleteItem(podToGCNode(rc1Pod1)) + gc.attemptToDeleteItem(podToGCNode(rc2Pod1)) // rc1 should already be in the cache, no request should be sent. rc1 should be promoted in the UIDCache - gc.processItem(podToGCNode(rc1Pod2)) + gc.attemptToDeleteItem(podToGCNode(rc1Pod2)) // after this call, rc2 should be evicted from the UIDCache - gc.processItem(podToGCNode(rc3Pod1)) + gc.attemptToDeleteItem(podToGCNode(rc3Pod1)) // check cache if !gc.absentOwnerCache.Has(types.UID("1")) { t.Errorf("expected rc1 to be in the cache") @@ -474,3 +477,89 @@ func TestAbsentUIDCache(t *testing.T) { t.Errorf("expected only 1 GET rc1 request, got %d", count) } } + +func TestDeleteOwnerRefPatch(t *testing.T) { + original := v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "100", + OwnerReferences: []metav1.OwnerReference{ + {UID: "1"}, + {UID: "2"}, + {UID: "3"}, + }, + }, + } + originalData := serilizeOrDie(t, original) + expected := v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "100", + OwnerReferences: []metav1.OwnerReference{ + {UID: "1"}, + }, + }, + } + patch := deleteOwnerRefPatch("100", "2", "3") + patched, err := strategicpatch.StrategicMergePatch(originalData, patch, v1.Pod{}) + if err != nil { + t.Fatal(err) + } + var got v1.Pod + if err := json.Unmarshal(patched, &got); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(expected, got) { + t.Errorf("expected: %#v,\ngot: %#v", expected, got) + } +} + +func TestUnblockOwnerReference(t *testing.T) { + trueVar := true + falseVar := false + original := v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "100", + OwnerReferences: []metav1.OwnerReference{ + {UID: "1", BlockOwnerDeletion: &trueVar}, + {UID: "2", BlockOwnerDeletion: &falseVar}, + {UID: "3"}, + }, + }, + } + originalData := serilizeOrDie(t, original) + expected := v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + UID: "100", + OwnerReferences: []metav1.OwnerReference{ + {UID: "1", BlockOwnerDeletion: &falseVar}, + {UID: "2", BlockOwnerDeletion: &falseVar}, + {UID: "3"}, + }, + }, + } + accessor, err := meta.Accessor(&original) + if err != nil { + t.Fatal(err) + } + n := node{ + owners: accessor.GetOwnerReferences(), + } + patch, err := n.patchToUnblockOwnerReferences() + if err != nil { + t.Fatal(err) + } + patched, err := strategicpatch.StrategicMergePatch(originalData, patch, v1.Pod{}) + if err != nil { + t.Fatal(err) + } + var got v1.Pod + if err := json.Unmarshal(patched, &got); err != nil { + t.Fatal(err) + } + if !reflect.DeepEqual(expected, got) { + t.Errorf("expected: %#v,\ngot: %#v", expected, got) + t.Errorf("expected: %#v,\ngot: %#v", expected.OwnerReferences, got.OwnerReferences) + for _, ref := range got.OwnerReferences { + t.Errorf("ref.UID=%s, ref.BlockOwnerDeletion=%v", ref.UID, *ref.BlockOwnerDeletion) + } + } +} diff --git a/pkg/controller/garbagecollector/graph.go b/pkg/controller/garbagecollector/graph.go new file mode 100644 index 00000000000..59b36c2ebfa --- /dev/null +++ b/pkg/controller/garbagecollector/graph.go @@ -0,0 +1,159 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package garbagecollector + +import ( + "fmt" + "sync" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" +) + +type objectReference struct { + metav1.OwnerReference + // This is needed by the dynamic client + Namespace string +} + +func (s objectReference) String() string { + return fmt.Sprintf("[%s/%s, namespace: %s, name: %s, uid: %s]", s.APIVersion, s.Kind, s.Namespace, s.Name, s.UID) +} + +// The single-threaded GraphBuilder.processEvent() is the sole writer of the +// nodes. The multi-threaded GarbageCollector.processItem() reads the nodes. +// WARNING: node has different locks on different fields. setters and getters +// use the respective locks, so the return values of the getters can be +// inconsistent. +type node struct { + identity objectReference + // dependents will be read by the orphan() routine, we need to protect it with a lock. + dependentsLock sync.RWMutex + // dependents are the nodes that have node.identity as a + // metadata.ownerReference. + dependents map[*node]struct{} + // this is set by processEvent() if the object has non-nil DeletionTimestamp + // and has the FinalizerDeleteDependents. + deletingDependents bool + deletingDependentsLock sync.RWMutex + // this records if the object's deletionTimestamp is non-nil. + beingDeleted bool + beingDeletedLock sync.RWMutex + // when processing an Update event, we need to compare the updated + // ownerReferences with the owners recorded in the graph. + owners []metav1.OwnerReference +} + +// An object is on a one way trip to its final deletion if it starts being +// deleted, so we only provide a function to set beingDeleted to true. +func (n *node) markBeingDeleted() { + n.beingDeletedLock.Lock() + defer n.beingDeletedLock.Unlock() + n.beingDeleted = true +} + +func (n *node) isBeingDeleted() bool { + n.beingDeletedLock.RLock() + defer n.beingDeletedLock.RUnlock() + return n.beingDeleted +} + +func (n *node) markDeletingDependents() { + n.deletingDependentsLock.Lock() + defer n.deletingDependentsLock.Unlock() + n.deletingDependents = true +} + +func (n *node) isDeletingDependents() bool { + n.deletingDependentsLock.RLock() + defer n.deletingDependentsLock.RUnlock() + return n.deletingDependents +} + +func (ownerNode *node) addDependent(dependent *node) { + ownerNode.dependentsLock.Lock() + defer ownerNode.dependentsLock.Unlock() + ownerNode.dependents[dependent] = struct{}{} +} + +func (ownerNode *node) deleteDependent(dependent *node) { + ownerNode.dependentsLock.Lock() + defer ownerNode.dependentsLock.Unlock() + delete(ownerNode.dependents, dependent) +} + +func (ownerNode *node) dependentsLength() int { + ownerNode.dependentsLock.RLock() + defer ownerNode.dependentsLock.RUnlock() + return len(ownerNode.dependents) +} + +// Note that this function does not provide any synchronization guarantees; +// items could be added to or removed from ownerNode.dependents the moment this +// function returns. +func (ownerNode *node) getDependents() []*node { + ownerNode.dependentsLock.RLock() + defer ownerNode.dependentsLock.RUnlock() + var ret []*node + for dep := range ownerNode.dependents { + ret = append(ret, dep) + } + return ret +} + +// blockingDependents returns the dependents that are blocking the deletion of +// n, i.e., the dependent that has an ownerReference pointing to n, and +// the BlockOwnerDeletion field of that ownerReference is true. +// Note that this function does not provide any synchronization guarantees; +// items could be added to or removed from ownerNode.dependents the moment this +// function returns. +func (n *node) blockingDependents() []*node { + dependents := n.getDependents() + var ret []*node + for _, dep := range dependents { + for _, owner := range dep.owners { + if owner.UID == n.identity.UID && owner.BlockOwnerDeletion != nil && *owner.BlockOwnerDeletion { + ret = append(ret, dep) + } + } + } + return ret +} + +type concurrentUIDToNode struct { + uidToNodeLock sync.RWMutex + uidToNode map[types.UID]*node +} + +func (m *concurrentUIDToNode) Write(node *node) { + m.uidToNodeLock.Lock() + defer m.uidToNodeLock.Unlock() + m.uidToNode[node.identity.UID] = node +} + +func (m *concurrentUIDToNode) Read(uid types.UID) (*node, bool) { + m.uidToNodeLock.RLock() + defer m.uidToNodeLock.RUnlock() + n, ok := m.uidToNode[uid] + return n, ok +} + +func (m *concurrentUIDToNode) Delete(uid types.UID) { + m.uidToNodeLock.Lock() + defer m.uidToNodeLock.Unlock() + delete(m.uidToNode, uid) +} diff --git a/pkg/controller/garbagecollector/graph_builder.go b/pkg/controller/garbagecollector/graph_builder.go new file mode 100644 index 00000000000..a3d6754b8d9 --- /dev/null +++ b/pkg/controller/garbagecollector/graph_builder.go @@ -0,0 +1,497 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package garbagecollector + +import ( + "fmt" + "reflect" + "time" + + "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/apimachinery/pkg/util/sets" + "k8s.io/apimachinery/pkg/util/wait" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/tools/cache" + "k8s.io/client-go/util/workqueue" +) + +type eventType int + +const ( + addEvent eventType = iota + updateEvent + deleteEvent +) + +type event struct { + eventType eventType + obj interface{} + // the update event comes with an old object, but it's not used by the garbage collector. + oldObj interface{} +} + +// GraphBuilder: based on the events supplied by the informers, GraphBuilder updates +// uidToNode, a graph that caches the dependencies as we know, and enqueues +// items to the attemptToDelete and attemptToOrphan. +type GraphBuilder struct { + restMapper meta.RESTMapper + // each monitor list/watches a resource, the results are funneled to the + // dependencyGraphBuilder + monitors []cache.Controller + // metaOnlyClientPool uses a special codec, which removes fields except for + // apiVersion, kind, and metadata during decoding. + metaOnlyClientPool dynamic.ClientPool + // used to register exactly once the rate limiters of the clients used by + // the `monitors`. + registeredRateLimiterForControllers *RegisteredRateLimiter + // monitors are the producer of the graphChanges queue, graphBuilder alters + // the in-memory graph according to the changes. + graphChanges workqueue.RateLimitingInterface + // uidToNode doesn't require a lock to protect, because only the + // single-threaded GraphBuilder.processGraphChanges() reads/writes it. + uidToNode *concurrentUIDToNode + // GraphBuilder is the producer of attemptToDelete and attemptToOrphan, GC is the consumer. + attemptToDelete workqueue.RateLimitingInterface + attemptToOrphan workqueue.RateLimitingInterface + // GraphBuilder and GC share the absentOwnerCache. Objects that are known to + // be non-existent are added to the cached. + absentOwnerCache *UIDCache +} + +func listWatcher(client *dynamic.Client, resource schema.GroupVersionResource) *cache.ListWatch { + return &cache.ListWatch{ + ListFunc: func(options metav1.ListOptions) (runtime.Object, error) { + // APIResource.Kind is not used by the dynamic client, so + // leave it empty. We want to list this resource in all + // namespaces if it's namespace scoped, so leave + // APIResource.Namespaced as false is all right. + apiResource := metav1.APIResource{Name: resource.Resource} + return client.ParameterCodec(dynamic.VersionedParameterEncoderWithV1Fallback). + Resource(&apiResource, metav1.NamespaceAll). + List(options) + }, + WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) { + // APIResource.Kind is not used by the dynamic client, so + // leave it empty. We want to list this resource in all + // namespaces if it's namespace scoped, so leave + // APIResource.Namespaced as false is all right. + apiResource := metav1.APIResource{Name: resource.Resource} + return client.ParameterCodec(dynamic.VersionedParameterEncoderWithV1Fallback). + Resource(&apiResource, metav1.NamespaceAll). + Watch(options) + }, + } +} + +func (gb *GraphBuilder) controllerFor(resource schema.GroupVersionResource, kind schema.GroupVersionKind) (cache.Controller, error) { + // TODO: consider store in one storage. + glog.V(5).Infof("create storage for resource %s", resource) + client, err := gb.metaOnlyClientPool.ClientForGroupVersionKind(kind) + if err != nil { + return nil, err + } + gb.registeredRateLimiterForControllers.registerIfNotPresent(resource.GroupVersion(), client, "garbage_collector_monitoring") + setObjectTypeMeta := func(obj interface{}) { + runtimeObject, ok := obj.(runtime.Object) + if !ok { + utilruntime.HandleError(fmt.Errorf("expected runtime.Object, got %#v", obj)) + } + runtimeObject.GetObjectKind().SetGroupVersionKind(kind) + } + _, monitor := cache.NewInformer( + listWatcher(client, resource), + nil, + ResourceResyncTime, + cache.ResourceEventHandlerFuncs{ + // add the event to the dependencyGraphBuilder's graphChanges. + AddFunc: func(obj interface{}) { + setObjectTypeMeta(obj) + event := &event{ + eventType: addEvent, + obj: obj, + } + gb.graphChanges.Add(event) + }, + UpdateFunc: func(oldObj, newObj interface{}) { + setObjectTypeMeta(newObj) + // TODO: check if there are differences in the ownerRefs, + // finalizers, and DeletionTimestamp; if not, ignore the update. + event := &event{updateEvent, newObj, oldObj} + gb.graphChanges.Add(event) + }, + DeleteFunc: func(obj interface{}) { + // delta fifo may wrap the object in a cache.DeletedFinalStateUnknown, unwrap it + if deletedFinalStateUnknown, ok := obj.(cache.DeletedFinalStateUnknown); ok { + obj = deletedFinalStateUnknown.Obj + } + setObjectTypeMeta(obj) + event := &event{ + eventType: deleteEvent, + obj: obj, + } + gb.graphChanges.Add(event) + }, + }, + ) + return monitor, nil +} + +func (gb *GraphBuilder) monitorsForResources(resources map[schema.GroupVersionResource]struct{}) error { + for resource := range resources { + if _, ok := ignoredResources[resource]; ok { + glog.V(5).Infof("ignore resource %#v", resource) + continue + } + kind, err := gb.restMapper.KindFor(resource) + if err != nil { + return err + } + monitor, err := gb.controllerFor(resource, kind) + if err != nil { + return err + } + gb.monitors = append(gb.monitors, monitor) + } + return nil +} + +func (gb *GraphBuilder) HasSynced() bool { + for _, monitor := range gb.monitors { + if !monitor.HasSynced() { + return false + } + } + return true +} + +func (gb *GraphBuilder) Run(stopCh <-chan struct{}) { + for _, monitor := range gb.monitors { + go monitor.Run(stopCh) + } + go wait.Until(gb.runProcessGraphChanges, 1*time.Second, stopCh) +} + +var ignoredResources = map[schema.GroupVersionResource]struct{}{ + schema.GroupVersionResource{Group: "extensions", Version: "v1beta1", Resource: "replicationcontrollers"}: {}, + schema.GroupVersionResource{Group: "", Version: "v1", Resource: "bindings"}: {}, + schema.GroupVersionResource{Group: "", Version: "v1", Resource: "componentstatuses"}: {}, + schema.GroupVersionResource{Group: "", Version: "v1", Resource: "events"}: {}, + schema.GroupVersionResource{Group: "authentication.k8s.io", Version: "v1beta1", Resource: "tokenreviews"}: {}, + schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "subjectaccessreviews"}: {}, + schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "selfsubjectaccessreviews"}: {}, + schema.GroupVersionResource{Group: "authorization.k8s.io", Version: "v1beta1", Resource: "localsubjectaccessreviews"}: {}, +} + +func (gb *GraphBuilder) enqueueChanges(e *event) { + gb.graphChanges.Add(e) +} + +// addDependentToOwners adds n to owners' dependents list. If the owner does not +// exist in the gb.uidToNode yet, a "virtual" node will be created to represent +// the owner. The "virtual" node will be enqueued to the attemptToDelete, so that +// processItem() will verify if the owner exists according to the API server. +func (gb *GraphBuilder) addDependentToOwners(n *node, owners []metav1.OwnerReference) { + for _, owner := range owners { + ownerNode, ok := gb.uidToNode.Read(owner.UID) + if !ok { + // Create a "virtual" node in the graph for the owner if it doesn't + // exist in the graph yet. Then enqueue the virtual node into the + // attemptToDelete. The garbage processor will enqueue a virtual delete + // event to delete it from the graph if API server confirms this + // owner doesn't exist. + ownerNode = &node{ + identity: objectReference{ + OwnerReference: owner, + Namespace: n.identity.Namespace, + }, + dependents: make(map[*node]struct{}), + } + glog.V(5).Infof("add virtual node.identity: %s\n\n", ownerNode.identity) + gb.uidToNode.Write(ownerNode) + gb.attemptToDelete.Add(ownerNode) + } + ownerNode.addDependent(n) + } +} + +// insertNode insert the node to gb.uidToNode; then it finds all owners as listed +// in n.owners, and adds the node to their dependents list. +func (gb *GraphBuilder) insertNode(n *node) { + gb.uidToNode.Write(n) + gb.addDependentToOwners(n, n.owners) +} + +// removeDependentFromOwners remove n from owners' dependents list. +func (gb *GraphBuilder) removeDependentFromOwners(n *node, owners []metav1.OwnerReference) { + for _, owner := range owners { + ownerNode, ok := gb.uidToNode.Read(owner.UID) + if !ok { + continue + } + ownerNode.deleteDependent(n) + } +} + +// removeNode removes the node from gb.uidToNode, then finds all +// owners as listed in n.owners, and removes n from their dependents list. +func (gb *GraphBuilder) removeNode(n *node) { + gb.uidToNode.Delete(n.identity.UID) + gb.removeDependentFromOwners(n, n.owners) +} + +type ownerRefPair struct { + oldRef metav1.OwnerReference + newRef metav1.OwnerReference +} + +// TODO: profile this function to see if a naive N^2 algorithm performs better +// when the number of references is small. +func referencesDiffs(old []metav1.OwnerReference, new []metav1.OwnerReference) (added []metav1.OwnerReference, removed []metav1.OwnerReference, changed []ownerRefPair) { + oldUIDToRef := make(map[string]metav1.OwnerReference) + for i := 0; i < len(old); i++ { + oldUIDToRef[string(old[i].UID)] = old[i] + } + oldUIDSet := sets.StringKeySet(oldUIDToRef) + newUIDToRef := make(map[string]metav1.OwnerReference) + for i := 0; i < len(new); i++ { + newUIDToRef[string(new[i].UID)] = new[i] + } + newUIDSet := sets.StringKeySet(newUIDToRef) + + addedUID := newUIDSet.Difference(oldUIDSet) + removedUID := oldUIDSet.Difference(newUIDSet) + intersection := oldUIDSet.Intersection(newUIDSet) + + for uid := range addedUID { + added = append(added, newUIDToRef[uid]) + } + for uid := range removedUID { + removed = append(removed, oldUIDToRef[uid]) + } + for uid := range intersection { + if !reflect.DeepEqual(oldUIDToRef[uid], newUIDToRef[uid]) { + changed = append(changed, ownerRefPair{oldRef: oldUIDToRef[uid], newRef: newUIDToRef[uid]}) + } + } + return added, removed, changed +} + +// returns if the object in the event just transitions to "being deleted". +func deletionStarts(oldObj interface{}, newAccessor metav1.Object) bool { + // The delta_fifo may combine the creation and update of the object into one + // event, so if there is no oldObj, we just return if the newObj (via + // newAccessor) is being deleted. + if oldObj == nil { + if newAccessor.GetDeletionTimestamp() == nil { + return false + } + return true + } + oldAccessor, err := meta.Accessor(oldObj) + if err != nil { + utilruntime.HandleError(fmt.Errorf("cannot access oldObj: %v", err)) + return false + } + return beingDeleted(newAccessor) && !beingDeleted(oldAccessor) +} + +func beingDeleted(accessor metav1.Object) bool { + return accessor.GetDeletionTimestamp() != nil +} + +func hasDeleteDependentsFinalizer(accessor metav1.Object) bool { + finalizers := accessor.GetFinalizers() + for _, finalizer := range finalizers { + if finalizer == metav1.FinalizerDeleteDependents { + return true + } + } + return false +} + +func hasOrphanFinalizer(accessor metav1.Object) bool { + finalizers := accessor.GetFinalizers() + for _, finalizer := range finalizers { + if finalizer == metav1.FinalizerOrphanDependents { + return true + } + } + return false +} + +// this function takes newAccessor directly because the caller already +// instantiates an accessor for the newObj. +func startsWaitingForDependentsDeleted(oldObj interface{}, newAccessor metav1.Object) bool { + return deletionStarts(oldObj, newAccessor) && hasDeleteDependentsFinalizer(newAccessor) +} + +// this function takes newAccessor directly because the caller already +// instantiates an accessor for the newObj. +func startsWaitingForDependentsOrphaned(oldObj interface{}, newAccessor metav1.Object) bool { + return deletionStarts(oldObj, newAccessor) && hasOrphanFinalizer(newAccessor) +} + +// if an blocking ownerReference points to an object gets removed, or gets set to +// "BlockOwnerDeletion=false", add the object to the attemptToDelete queue. +func (gb *GraphBuilder) addUnblockedOwnersToDeleteQueue(removed []metav1.OwnerReference, changed []ownerRefPair) { + for _, ref := range removed { + if ref.BlockOwnerDeletion != nil && *ref.BlockOwnerDeletion { + node, found := gb.uidToNode.Read(ref.UID) + if !found { + glog.V(5).Infof("cannot find %s in uidToNode", ref.UID) + continue + } + gb.attemptToDelete.Add(node) + } + } + for _, c := range changed { + wasBlocked := c.oldRef.BlockOwnerDeletion != nil && *c.oldRef.BlockOwnerDeletion + isUnblocked := c.newRef.BlockOwnerDeletion == nil || (c.newRef.BlockOwnerDeletion != nil && !*c.newRef.BlockOwnerDeletion) + if wasBlocked && isUnblocked { + node, found := gb.uidToNode.Read(c.newRef.UID) + if !found { + glog.V(5).Infof("cannot find %s in uidToNode", c.newRef.UID) + continue + } + gb.attemptToDelete.Add(node) + } + } +} + +func (gb *GraphBuilder) processTransitions(oldObj interface{}, newAccessor metav1.Object, n *node) { + if startsWaitingForDependentsOrphaned(oldObj, newAccessor) { + glog.V(5).Infof("add %s to the attemptToOrphan", n.identity) + gb.attemptToOrphan.Add(n) + return + } + if startsWaitingForDependentsDeleted(oldObj, newAccessor) { + glog.V(2).Infof("add %s to the attemptToDelete, because it's waiting for its dependents to be deleted", n.identity) + // if the n is added as a "virtual" node, its deletingDependents field is not properly set, so always set it here. + n.markDeletingDependents() + for dep := range n.dependents { + gb.attemptToDelete.Add(dep) + } + gb.attemptToDelete.Add(n) + } +} + +func (gb *GraphBuilder) runProcessGraphChanges() { + for gb.processGraphChanges() { + } +} + +// Dequeueing an event from graphChanges, updating graph, populating dirty_queue. +func (gb *GraphBuilder) processGraphChanges() bool { + item, quit := gb.graphChanges.Get() + if quit { + return false + } + defer gb.graphChanges.Done(item) + event, ok := item.(*event) + if !ok { + utilruntime.HandleError(fmt.Errorf("expect a *event, got %v", item)) + return true + } + obj := event.obj + accessor, err := meta.Accessor(obj) + if err != nil { + utilruntime.HandleError(fmt.Errorf("cannot access obj: %v", err)) + return true + } + typeAccessor, err := meta.TypeAccessor(obj) + if err != nil { + utilruntime.HandleError(fmt.Errorf("cannot access obj: %v", err)) + return true + } + glog.V(5).Infof("GraphBuilder process object: %s/%s, namespace %s, name %s, event type %s", typeAccessor.GetAPIVersion(), typeAccessor.GetKind(), accessor.GetNamespace(), accessor.GetName(), event.eventType) + // Check if the node already exsits + existingNode, found := gb.uidToNode.Read(accessor.GetUID()) + switch { + case (event.eventType == addEvent || event.eventType == updateEvent) && !found: + newNode := &node{ + identity: objectReference{ + OwnerReference: metav1.OwnerReference{ + APIVersion: typeAccessor.GetAPIVersion(), + Kind: typeAccessor.GetKind(), + UID: accessor.GetUID(), + Name: accessor.GetName(), + }, + Namespace: accessor.GetNamespace(), + }, + dependents: make(map[*node]struct{}), + owners: accessor.GetOwnerReferences(), + deletingDependents: beingDeleted(accessor) && hasDeleteDependentsFinalizer(accessor), + beingDeleted: beingDeleted(accessor), + } + gb.insertNode(newNode) + // the underlying delta_fifo may combine a creation and a deletion into + // one event, so we need to further process the event. + gb.processTransitions(event.oldObj, accessor, newNode) + case (event.eventType == addEvent || event.eventType == updateEvent) && found: + // handle changes in ownerReferences + added, removed, changed := referencesDiffs(existingNode.owners, accessor.GetOwnerReferences()) + if len(added) != 0 || len(removed) != 0 || len(changed) != 0 { + // check if the changed dependency graph unblock owners that are + // waiting for the deletion of their dependents. + gb.addUnblockedOwnersToDeleteQueue(removed, changed) + // update the node itself + existingNode.owners = accessor.GetOwnerReferences() + // Add the node to its new owners' dependent lists. + gb.addDependentToOwners(existingNode, added) + // remove the node from the dependent list of node that are no longer in + // the node's owners list. + gb.removeDependentFromOwners(existingNode, removed) + } + + if beingDeleted(accessor) { + existingNode.markBeingDeleted() + } + gb.processTransitions(event.oldObj, accessor, existingNode) + case event.eventType == deleteEvent: + if !found { + glog.V(5).Infof("%v doesn't exist in the graph, this shouldn't happen", accessor.GetUID()) + return true + } + // removeNode updates the graph + gb.removeNode(existingNode) + existingNode.dependentsLock.RLock() + defer existingNode.dependentsLock.RUnlock() + if len(existingNode.dependents) > 0 { + gb.absentOwnerCache.Add(accessor.GetUID()) + } + for dep := range existingNode.dependents { + gb.attemptToDelete.Add(dep) + } + for _, owner := range existingNode.owners { + ownerNode, found := gb.uidToNode.Read(owner.UID) + if !found || !ownerNode.isDeletingDependents() { + continue + } + // this is to let attempToDeleteItem check if all the owner's + // dependents are deleted, if so, the owner will be deleted. + gb.attemptToDelete.Add(ownerNode) + } + } + return true +} diff --git a/pkg/controller/garbagecollector/operations.go b/pkg/controller/garbagecollector/operations.go new file mode 100644 index 00000000000..657045b6523 --- /dev/null +++ b/pkg/controller/garbagecollector/operations.go @@ -0,0 +1,135 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package garbagecollector + +import ( + "fmt" + + "github.com/golang/glog" + + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/client/retry" +) + +// apiResource consults the REST mapper to translate an tuple to a unversioned.APIResource struct. +func (gc *GarbageCollector) apiResource(apiVersion, kind string, namespaced bool) (*metav1.APIResource, error) { + fqKind := schema.FromAPIVersionAndKind(apiVersion, kind) + mapping, err := gc.restMapper.RESTMapping(fqKind.GroupKind(), apiVersion) + if err != nil { + return nil, fmt.Errorf("unable to get REST mapping for kind: %s, version: %s", kind, apiVersion) + } + glog.V(5).Infof("map kind %s, version %s to resource %s", kind, apiVersion, mapping.Resource) + resource := metav1.APIResource{ + Name: mapping.Resource, + Namespaced: namespaced, + Kind: kind, + } + return &resource, nil +} + +func (gc *GarbageCollector) deleteObject(item objectReference, policy *metav1.DeletionPropagation) error { + fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) + client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) + gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") + resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) + if err != nil { + return err + } + uid := item.UID + preconditions := metav1.Preconditions{UID: &uid} + deleteOptions := metav1.DeleteOptions{Preconditions: &preconditions, PropagationPolicy: policy} + return client.Resource(resource, item.Namespace).Delete(item.Name, &deleteOptions) +} + +func (gc *GarbageCollector) getObject(item objectReference) (*unstructured.Unstructured, error) { + fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) + client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) + gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") + resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) + if err != nil { + return nil, err + } + return client.Resource(resource, item.Namespace).Get(item.Name) +} + +func (gc *GarbageCollector) updateObject(item objectReference, obj *unstructured.Unstructured) (*unstructured.Unstructured, error) { + fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) + client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) + gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") + resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) + if err != nil { + return nil, err + } + return client.Resource(resource, item.Namespace).Update(obj) +} + +func (gc *GarbageCollector) patchObject(item objectReference, patch []byte) (*unstructured.Unstructured, error) { + fqKind := schema.FromAPIVersionAndKind(item.APIVersion, item.Kind) + client, err := gc.clientPool.ClientForGroupVersionKind(fqKind) + gc.registeredRateLimiter.registerIfNotPresent(fqKind.GroupVersion(), client, "garbage_collector_operation") + resource, err := gc.apiResource(item.APIVersion, item.Kind, len(item.Namespace) != 0) + if err != nil { + return nil, err + } + return client.Resource(resource, item.Namespace).Patch(item.Name, types.StrategicMergePatchType, patch) +} + +// TODO: Using Patch when strategicmerge supports deleting an entry from a +// slice of a base type. +func (gc *GarbageCollector) removeFinalizer(owner *node, targetFinalizer string) error { + err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { + ownerObject, err := gc.getObject(owner.identity) + if errors.IsNotFound(err) { + return nil + } + if err != nil { + return fmt.Errorf("cannot finalize owner %s, because cannot get it: %v. The garbage collector will retry later.", owner.identity, err) + } + accessor, err := meta.Accessor(ownerObject) + if err != nil { + return fmt.Errorf("cannot access the owner object %v: %v. The garbage collector will retry later.", ownerObject, err) + } + finalizers := accessor.GetFinalizers() + var newFinalizers []string + found := false + for _, f := range finalizers { + if f == targetFinalizer { + found = true + break + } + newFinalizers = append(newFinalizers, f) + } + if !found { + glog.V(5).Infof("the orphan finalizer is already removed from object %s", owner.identity) + return nil + } + // remove the owner from dependent's OwnerReferences + ownerObject.SetFinalizers(newFinalizers) + _, err = gc.updateObject(owner.identity, ownerObject) + return err + }) + if errors.IsConflict(err) { + return fmt.Errorf("updateMaxRetries(%d) has reached. The garbage collector will retry later for owner %v.", retry.DefaultBackoff.Steps, owner.identity) + } + return err +} diff --git a/pkg/controller/garbagecollector/patch.go b/pkg/controller/garbagecollector/patch.go new file mode 100644 index 00000000000..8f8f9fb75ab --- /dev/null +++ b/pkg/controller/garbagecollector/patch.go @@ -0,0 +1,54 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package garbagecollector + +import ( + "encoding/json" + "fmt" + "strings" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/kubernetes/pkg/controller/garbagecollector/metaonly" +) + +func deleteOwnerRefPatch(dependentUID types.UID, ownerUIDs ...types.UID) []byte { + var pieces []string + for _, ownerUID := range ownerUIDs { + pieces = append(pieces, fmt.Sprintf(`{"$patch":"delete","uid":"%s"}`, ownerUID)) + } + patch := fmt.Sprintf(`{"metadata":{"ownerReferences":[%s],"uid":"%s"}}`, strings.Join(pieces, ","), dependentUID) + return []byte(patch) +} + +// generate a patch that unsets the BlockOwnerDeletion field of all +// ownerReferences of node. +func (n *node) patchToUnblockOwnerReferences() ([]byte, error) { + var dummy metaonly.MetadataOnlyObject + var blockingRefs []metav1.OwnerReference + falseVar := false + for _, owner := range n.owners { + if owner.BlockOwnerDeletion != nil && *owner.BlockOwnerDeletion { + ref := owner + ref.BlockOwnerDeletion = &falseVar + blockingRefs = append(blockingRefs, ref) + } + } + dummy.ObjectMeta.SetOwnerReferences(blockingRefs) + dummy.ObjectMeta.UID = n.identity.UID + return json.Marshal(dummy) +} diff --git a/pkg/controller/replicaset/replica_set.go b/pkg/controller/replicaset/replica_set.go index 8cbe7c03ed7..e165a9e5c56 100644 --- a/pkg/controller/replicaset/replica_set.go +++ b/pkg/controller/replicaset/replica_set.go @@ -481,14 +481,14 @@ func (rsc *ReplicaSetController) manageReplicas(filteredPods []*v1.Pod, rs *exte go func() { defer wg.Done() var err error - - var trueVar = true + boolPtr := func(b bool) *bool { return &b } controllerRef := &metav1.OwnerReference{ - APIVersion: getRSKind().GroupVersion().String(), - Kind: getRSKind().Kind, - Name: rs.Name, - UID: rs.UID, - Controller: &trueVar, + APIVersion: getRSKind().GroupVersion().String(), + Kind: getRSKind().Kind, + Name: rs.Name, + UID: rs.UID, + BlockOwnerDeletion: boolPtr(true), + Controller: boolPtr(true), } err = rsc.podControl.CreatePodsWithControllerRef(rs.Namespace, &rs.Spec.Template, rs, controllerRef) if err != nil { diff --git a/pkg/controller/replication/replication_controller.go b/pkg/controller/replication/replication_controller.go index cd8e57e0241..fba38f0df82 100644 --- a/pkg/controller/replication/replication_controller.go +++ b/pkg/controller/replication/replication_controller.go @@ -479,13 +479,14 @@ func (rm *ReplicationManager) manageReplicas(filteredPods []*v1.Pod, rc *v1.Repl go func() { defer wg.Done() var err error - var trueVar = true + boolPtr := func(b bool) *bool { return &b } controllerRef := &metav1.OwnerReference{ - APIVersion: getRCKind().GroupVersion().String(), - Kind: getRCKind().Kind, - Name: rc.Name, - UID: rc.UID, - Controller: &trueVar, + APIVersion: getRCKind().GroupVersion().String(), + Kind: getRCKind().Kind, + Name: rc.Name, + UID: rc.UID, + BlockOwnerDeletion: boolPtr(true), + Controller: boolPtr(true), } err = rm.podControl.CreatePodsWithControllerRef(rc.Namespace, rc.Spec.Template, rc, controllerRef) if err != nil { From 31cb266340ac5d702a650ea30c730bb909cd99b5 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 23 Feb 2017 11:16:25 -0800 Subject: [PATCH 5/5] tests --- test/e2e/framework/metrics_util.go | 6 +- test/e2e/garbage_collector.go | 278 +++++++++++++++++- .../garbage_collector_test.go | 206 +++++++++++-- .../integration/replicaset/replicaset_test.go | 16 +- .../replicationcontroller_test.go | 16 +- 5 files changed, 478 insertions(+), 44 deletions(-) diff --git a/test/e2e/framework/metrics_util.go b/test/e2e/framework/metrics_util.go index b74b1627816..3dca060f14d 100644 --- a/test/e2e/framework/metrics_util.go +++ b/test/e2e/framework/metrics_util.go @@ -117,9 +117,9 @@ var InterestingApiServerMetrics = []string{ } var InterestingControllerManagerMetrics = []string{ - "garbage_collector_event_processing_latency_microseconds", - "garbage_collector_dirty_processing_latency_microseconds", - "garbage_collector_orphan_processing_latency_microseconds", + "garbage_collector_event_queue_latency", + "garbage_collector_dirty_queue_latency", + "garbage_collector_orhan_queue_latency", } var InterestingKubeletMetrics = []string{ diff --git a/test/e2e/garbage_collector.go b/test/e2e/garbage_collector.go index 6676e980143..c1f0fc4540f 100644 --- a/test/e2e/garbage_collector.go +++ b/test/e2e/garbage_collector.go @@ -20,7 +20,9 @@ import ( "fmt" "time" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/kubernetes/pkg/api/v1" v1beta1 "k8s.io/kubernetes/pkg/apis/extensions/v1beta1" @@ -30,8 +32,14 @@ import ( "k8s.io/kubernetes/test/e2e/framework" . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" ) +func getForegroundOptions() *metav1.DeleteOptions { + policy := metav1.DeletePropagationForeground + return &metav1.DeleteOptions{PropagationPolicy: &policy} +} + func getOrphanOptions() *metav1.DeleteOptions { var trueVar = true return &metav1.DeleteOptions{OrphanDependents: &trueVar} @@ -76,9 +84,11 @@ func newOwnerDeployment(f *framework.Framework, deploymentName string) *v1beta1. } } -func newOwnerRC(f *framework.Framework, name string) *v1.ReplicationController { - var replicas int32 - replicas = 2 +func getSelector() map[string]string { + return map[string]string{"app": "gc-test"} +} + +func newOwnerRC(f *framework.Framework, name string, replicas int32) *v1.ReplicationController { return &v1.ReplicationController{ TypeMeta: metav1.TypeMeta{ Kind: "ReplicationController", @@ -125,6 +135,27 @@ func verifyRemainingDeploymentsAndReplicaSets( return ret, nil } +func newGCPod(name string) *v1.Pod { + return &v1.Pod{ + TypeMeta: metav1.TypeMeta{ + Kind: "Pod", + APIVersion: "v1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: name, + }, + Spec: v1.PodSpec{ + TerminationGracePeriodSeconds: new(int64), + Containers: []v1.Container{ + { + Name: "nginx", + Image: "gcr.io/google_containers/nginx:1.7.9", + }, + }, + }, + } +} + // verifyRemainingObjects verifies if the number of the remaining replication // controllers and pods are rcNum and podNum. It returns error if the // communication with the API server fails. @@ -174,7 +205,7 @@ var _ = framework.KubeDescribe("Garbage collector", func() { rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) podClient := clientSet.Core().Pods(f.Namespace.Name) rcName := "simpletest.rc" - rc := newOwnerRC(f, rcName) + rc := newOwnerRC(f, rcName, 2) By("create the rc") rc, err := rcClient.Create(rc) if err != nil { @@ -225,9 +256,7 @@ var _ = framework.KubeDescribe("Garbage collector", func() { rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) podClient := clientSet.Core().Pods(f.Namespace.Name) rcName := "simpletest.rc" - rc := newOwnerRC(f, rcName) - replicas := int32(100) - rc.Spec.Replicas = &replicas + rc := newOwnerRC(f, rcName, 100) By("create the rc") rc, err := rcClient.Create(rc) if err != nil { @@ -287,7 +316,7 @@ var _ = framework.KubeDescribe("Garbage collector", func() { rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) podClient := clientSet.Core().Pods(f.Namespace.Name) rcName := "simpletest.rc" - rc := newOwnerRC(f, rcName) + rc := newOwnerRC(f, rcName, 2) By("create the rc") rc, err := rcClient.Create(rc) if err != nil { @@ -441,4 +470,237 @@ var _ = framework.KubeDescribe("Garbage collector", func() { gatherMetrics(f) }) + It("[Feature:GarbageCollector] should keep the rc around until all its pods are deleted if the deleteOptions says so", func() { + clientSet := f.ClientSet + rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) + podClient := clientSet.Core().Pods(f.Namespace.Name) + rcName := "simpletest.rc" + rc := newOwnerRC(f, rcName, 100) + By("create the rc") + rc, err := rcClient.Create(rc) + if err != nil { + framework.Failf("Failed to create replication controller: %v", err) + } + // wait for rc to create pods + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + rc, err := rcClient.Get(rc.Name, metav1.GetOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to get rc: %v", err) + } + if rc.Status.Replicas == *rc.Spec.Replicas { + return true, nil + } else { + return false, nil + } + }); err != nil { + framework.Failf("failed to wait for the rc.Status.Replicas to reach rc.Spec.Replicas: %v", err) + } + By("delete the rc") + deleteOptions := getForegroundOptions() + deleteOptions.Preconditions = metav1.NewUIDPreconditions(string(rc.UID)) + if err := rcClient.Delete(rc.ObjectMeta.Name, deleteOptions); err != nil { + framework.Failf("failed to delete the rc: %v", err) + } + By("wait for the rc to be deleted") + // default client QPS is 20, deleting each pod requires 2 requests, so 30s should be enough + if err := wait.Poll(1*time.Second, 30*time.Second, func() (bool, error) { + _, err := rcClient.Get(rc.Name, metav1.GetOptions{}) + if err == nil { + pods, _ := podClient.List(metav1.ListOptions{}) + framework.Logf("%d pods remaining", len(pods.Items)) + count := 0 + for _, pod := range pods.Items { + if pod.ObjectMeta.DeletionTimestamp == nil { + count++ + } + } + framework.Logf("%d pods has nil DeletionTimestamp", count) + framework.Logf("") + return false, nil + } else { + if errors.IsNotFound(err) { + return true, nil + } else { + return false, err + } + } + }); err != nil { + pods, err2 := podClient.List(metav1.ListOptions{}) + if err2 != nil { + framework.Failf("%v", err2) + } + framework.Logf("%d remaining pods are:", len(pods.Items)) + framework.Logf("The ObjectMeta of the remaining pods are:") + for _, pod := range pods.Items { + framework.Logf("%#v", pod.ObjectMeta) + } + framework.Failf("failed to delete the rc: %v", err) + } + // There shouldn't be any pods + pods, err := podClient.List(metav1.ListOptions{}) + if err != nil { + framework.Failf("%v", err) + } + if len(pods.Items) != 0 { + framework.Failf("expected no pods, got %#v", pods) + } + gatherMetrics(f) + }) + + // TODO: this should be an integration test + It("[Feature:GarbageCollector] should not delete dependents that have both valid owner and owner that's waiting for dependents to be deleted", func() { + clientSet := f.ClientSet + rcClient := clientSet.Core().ReplicationControllers(f.Namespace.Name) + podClient := clientSet.Core().Pods(f.Namespace.Name) + rc1Name := "simpletest-rc-to-be-deleted" + replicas := int32(100) + halfReplicas := int(replicas / 2) + rc1 := newOwnerRC(f, rc1Name, replicas) + By("create the rc1") + rc1, err := rcClient.Create(rc1) + if err != nil { + framework.Failf("Failed to create replication controller: %v", err) + } + rc2Name := "simpletest-rc-to-stay" + rc2 := newOwnerRC(f, rc2Name, 0) + rc2.Spec.Selector = nil + rc2.Spec.Template.ObjectMeta.Labels = map[string]string{"another.key": "another.value"} + By("create the rc2") + rc2, err = rcClient.Create(rc2) + if err != nil { + framework.Failf("Failed to create replication controller: %v", err) + } + // wait for rc1 to be stable + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + rc1, err := rcClient.Get(rc1.Name, metav1.GetOptions{}) + if err != nil { + return false, fmt.Errorf("Failed to get rc: %v", err) + } + if rc1.Status.Replicas == *rc1.Spec.Replicas { + return true, nil + } else { + return false, nil + } + }); err != nil { + framework.Failf("failed to wait for the rc.Status.Replicas to reach rc.Spec.Replicas: %v", err) + } + By(fmt.Sprintf("set half of pods created by rc %s to have rc %s as owner as well", rc1Name, rc2Name)) + pods, err := podClient.List(metav1.ListOptions{}) + Expect(err).NotTo(HaveOccurred()) + patch := fmt.Sprintf(`{"metadata":{"ownerReferences":[{"apiVersion":"v1","kind":"ReplicationController","name":"%s","uid":"%s"}]}}`, rc2.ObjectMeta.Name, rc2.ObjectMeta.UID) + for i := 0; i < halfReplicas; i++ { + pod := pods.Items[i] + _, err := podClient.Patch(pod.Name, types.StrategicMergePatchType, []byte(patch)) + Expect(err).NotTo(HaveOccurred()) + } + + By(fmt.Sprintf("delete the rc %s", rc1Name)) + deleteOptions := getForegroundOptions() + deleteOptions.Preconditions = metav1.NewUIDPreconditions(string(rc1.UID)) + if err := rcClient.Delete(rc1.ObjectMeta.Name, deleteOptions); err != nil { + framework.Failf("failed to delete the rc: %v", err) + } + By("wait for the rc to be deleted") + // default client QPS is 20, deleting each pod requires 2 requests, so 30s should be enough + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + _, err := rcClient.Get(rc1.Name, metav1.GetOptions{}) + if err == nil { + pods, _ := podClient.List(metav1.ListOptions{}) + framework.Logf("%d pods remaining", len(pods.Items)) + count := 0 + for _, pod := range pods.Items { + if pod.ObjectMeta.DeletionTimestamp == nil { + count++ + } + } + framework.Logf("%d pods has nil DeletionTimestamp", count) + framework.Logf("") + return false, nil + } else { + if errors.IsNotFound(err) { + return true, nil + } else { + return false, err + } + } + }); err != nil { + pods, err2 := podClient.List(metav1.ListOptions{}) + if err2 != nil { + framework.Failf("%v", err2) + } + framework.Logf("%d remaining pods are:", len(pods.Items)) + framework.Logf("ObjectMeta of remaining pods are:") + for _, pod := range pods.Items { + framework.Logf("%#v", pod.ObjectMeta) + } + framework.Failf("failed to delete rc %s, err: %v", rc1Name, err) + } + // half of the pods should still exist, + pods, err = podClient.List(metav1.ListOptions{}) + if err != nil { + framework.Failf("%v", err) + } + if len(pods.Items) != halfReplicas { + framework.Failf("expected %d pods, got %d", halfReplicas, len(pods.Items)) + } + for _, pod := range pods.Items { + if pod.ObjectMeta.DeletionTimestamp != nil { + framework.Failf("expected pod DeletionTimestamp to be nil, got %#v", pod.ObjectMeta) + } + // they should only have 1 ownerReference left + if len(pod.ObjectMeta.OwnerReferences) != 1 { + framework.Failf("expected pod to only have 1 owner, got %#v", pod.ObjectMeta.OwnerReferences) + } + } + gatherMetrics(f) + }) + + // TODO: should be an integration test + It("[Feature:GarbageCollector] should not be blocked by dependency circle", func() { + clientSet := f.ClientSet + podClient := clientSet.Core().Pods(f.Namespace.Name) + pod1 := newGCPod("pod1") + pod1, err := podClient.Create(pod1) + Expect(err).NotTo(HaveOccurred()) + pod2 := newGCPod("pod2") + pod2, err = podClient.Create(pod2) + Expect(err).NotTo(HaveOccurred()) + pod3 := newGCPod("pod3") + pod3, err = podClient.Create(pod3) + Expect(err).NotTo(HaveOccurred()) + // create circular dependency + addRefPatch := func(name string, uid types.UID) []byte { + return []byte(fmt.Sprintf(`{"metadata":{"ownerReferences":[{"apiVersion":"v1","kind":"Pod","name":"%s","uid":"%s","controller":true,"blockOwnerDeletion":true}]}}`, name, uid)) + } + pod1, err = podClient.Patch(pod1.Name, types.StrategicMergePatchType, addRefPatch(pod3.Name, pod3.UID)) + Expect(err).NotTo(HaveOccurred()) + framework.Logf("pod1.ObjectMeta.OwnerReferences=%#v", pod1.ObjectMeta.OwnerReferences) + pod2, err = podClient.Patch(pod2.Name, types.StrategicMergePatchType, addRefPatch(pod1.Name, pod1.UID)) + Expect(err).NotTo(HaveOccurred()) + framework.Logf("pod2.ObjectMeta.OwnerReferences=%#v", pod2.ObjectMeta.OwnerReferences) + pod3, err = podClient.Patch(pod3.Name, types.StrategicMergePatchType, addRefPatch(pod2.Name, pod2.UID)) + Expect(err).NotTo(HaveOccurred()) + framework.Logf("pod3.ObjectMeta.OwnerReferences=%#v", pod3.ObjectMeta.OwnerReferences) + // delete one pod, should result in the deletion of all pods + deleteOptions := getForegroundOptions() + deleteOptions.Preconditions = metav1.NewUIDPreconditions(string(pod1.UID)) + err = podClient.Delete(pod1.ObjectMeta.Name, deleteOptions) + Expect(err).NotTo(HaveOccurred()) + var pods *v1.PodList + var err2 error + if err := wait.Poll(5*time.Second, 30*time.Second, func() (bool, error) { + pods, err2 = podClient.List(metav1.ListOptions{}) + if err2 != nil { + return false, fmt.Errorf("Failed to list pods: %v", err) + } + if len(pods.Items) == 0 { + return true, nil + } else { + return false, nil + } + }); err != nil { + framework.Logf("pods are %#v", pods.Items) + framework.Failf("failed to wait for all pods to be deleted: %v", err) + } + }) }) diff --git a/test/integration/garbagecollector/garbage_collector_test.go b/test/integration/garbagecollector/garbage_collector_test.go index 5d337dddcad..8d6806adf5f 100644 --- a/test/integration/garbagecollector/garbage_collector_test.go +++ b/test/integration/garbagecollector/garbage_collector_test.go @@ -28,8 +28,8 @@ import ( "time" "github.com/golang/glog" - dto "github.com/prometheus/client_model/go" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/types" @@ -46,6 +46,11 @@ import ( "k8s.io/kubernetes/test/integration/framework" ) +func getForegroundOptions() *metav1.DeleteOptions { + policy := metav1.DeletePropagationForeground + return &metav1.DeleteOptions{PropagationPolicy: &policy} +} + func getOrphanOptions() *metav1.DeleteOptions { var trueVar = true return &metav1.DeleteOptions{OrphanDependents: &trueVar} @@ -296,7 +301,7 @@ func setupRCsPods(t *testing.T, gc *garbagecollector.GarbageCollector, clientSet } podUIDs = append(podUIDs, pod.ObjectMeta.UID) } - orphan := (options != nil && options.OrphanDependents != nil && *options.OrphanDependents) || (options == nil && len(initialFinalizers) != 0 && initialFinalizers[0] == metav1.FinalizerOrphan) + orphan := (options != nil && options.OrphanDependents != nil && *options.OrphanDependents) || (options == nil && len(initialFinalizers) != 0 && initialFinalizers[0] == metav1.FinalizerOrphanDependents) // if we intend to orphan the pods, we need wait for the gc to observe the // creation of the pods, otherwise if the deletion of RC is observed before // the creation of the pods, the pods will not be orphaned. @@ -355,9 +360,9 @@ func TestStressingCascadingDeletion(t *testing.T) { // rc is created with empty finalizers, deleted with nil delete options, pods will remain. go setupRCsPods(t, gc, clientSet, "collection1-"+strconv.Itoa(i), ns.Name, []string{}, nil, &wg, rcUIDs) // rc is created with the orphan finalizer, deleted with nil options, pods will remain. - go setupRCsPods(t, gc, clientSet, "collection2-"+strconv.Itoa(i), ns.Name, []string{metav1.FinalizerOrphan}, nil, &wg, rcUIDs) + go setupRCsPods(t, gc, clientSet, "collection2-"+strconv.Itoa(i), ns.Name, []string{metav1.FinalizerOrphanDependents}, nil, &wg, rcUIDs) // rc is created with the orphan finalizer, deleted with DeleteOptions.OrphanDependents=false, pods will be deleted. - go setupRCsPods(t, gc, clientSet, "collection3-"+strconv.Itoa(i), ns.Name, []string{metav1.FinalizerOrphan}, getNonOrphanOptions(), &wg, rcUIDs) + go setupRCsPods(t, gc, clientSet, "collection3-"+strconv.Itoa(i), ns.Name, []string{metav1.FinalizerOrphanDependents}, getNonOrphanOptions(), &wg, rcUIDs) // rc is created with empty finalizers, deleted with DeleteOptions.OrphanDependents=true, pods will remain. go setupRCsPods(t, gc, clientSet, "collection4-"+strconv.Itoa(i), ns.Name, []string{}, getOrphanOptions(), &wg, rcUIDs) } @@ -395,19 +400,6 @@ func TestStressingCascadingDeletion(t *testing.T) { if gc.GraphHasUID(uids) { t.Errorf("Expect all nodes representing replication controllers are removed from the Propagator's graph") } - metric := &dto.Metric{} - garbagecollector.EventProcessingLatency.Write(metric) - count := float64(metric.Summary.GetSampleCount()) - sum := metric.Summary.GetSampleSum() - t.Logf("Average time spent in GC's eventQueue is %.1f microseconds", sum/count) - garbagecollector.DirtyProcessingLatency.Write(metric) - count = float64(metric.Summary.GetSampleCount()) - sum = metric.Summary.GetSampleSum() - t.Logf("Average time spent in GC's dirtyQueue is %.1f microseconds", sum/count) - garbagecollector.OrphanProcessingLatency.Write(metric) - count = float64(metric.Summary.GetSampleCount()) - sum = metric.Summary.GetSampleSum() - t.Logf("Average time spent in GC's orphanQueue is %.1f microseconds", sum/count) } func TestOrphaning(t *testing.T) { @@ -480,3 +472,183 @@ func TestOrphaning(t *testing.T) { } } } + +func TestSolidOwnerDoesNotBlockWaitingOwner(t *testing.T) { + s, gc, clientSet := setup(t) + defer s.Close() + + ns := framework.CreateTestingNamespace("gc-foreground1", s, t) + defer framework.DeleteTestingNamespace(ns, s, t) + + podClient := clientSet.Core().Pods(ns.Name) + rcClient := clientSet.Core().ReplicationControllers(ns.Name) + // create the RC with the orphan finalizer set + toBeDeletedRC, err := rcClient.Create(newOwnerRC(toBeDeletedRCName, ns.Name)) + if err != nil { + t.Fatalf("Failed to create replication controller: %v", err) + } + remainingRC, err := rcClient.Create(newOwnerRC(remainingRCName, ns.Name)) + if err != nil { + t.Fatalf("Failed to create replication controller: %v", err) + } + trueVar := true + pod := newPod("pod", ns.Name, []metav1.OwnerReference{ + {UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRC.Name, BlockOwnerDeletion: &trueVar}, + {UID: remainingRC.ObjectMeta.UID, Name: remainingRC.Name}, + }) + _, err = podClient.Create(pod) + if err != nil { + t.Fatalf("Failed to create Pod: %v", err) + } + + stopCh := make(chan struct{}) + go gc.Run(5, stopCh) + defer close(stopCh) + + err = rcClient.Delete(toBeDeletedRCName, getForegroundOptions()) + if err != nil { + t.Fatalf("Failed to delete the rc: %v", err) + } + // verify the toBeDeleteRC is deleted + if err := wait.PollImmediate(5*time.Second, 30*time.Second, func() (bool, error) { + _, err := rcClient.Get(toBeDeletedRC.Name, metav1.GetOptions{}) + if err != nil { + if errors.IsNotFound(err) { + return true, nil + } + return false, err + } + return false, nil + }); err != nil { + t.Errorf("unexpected error: %v", err) + } + + // verify pods don't have the toBeDeleteRC as an owner anymore + pod, err = podClient.Get("pod", metav1.GetOptions{}) + if err != nil { + t.Fatalf("Failed to list pods: %v", err) + } + if len(pod.ObjectMeta.OwnerReferences) != 1 { + t.Errorf("expect pod to have only one ownerReference: got %#v", pod.ObjectMeta.OwnerReferences) + } else if pod.ObjectMeta.OwnerReferences[0].Name != remainingRC.Name { + t.Errorf("expect pod to have an ownerReference pointing to %s, got %#v", remainingRC.Name, pod.ObjectMeta.OwnerReferences) + } +} + +func TestNonBlockingOwnerRefDoesNotBlock(t *testing.T) { + s, gc, clientSet := setup(t) + defer s.Close() + + ns := framework.CreateTestingNamespace("gc-foreground2", s, t) + defer framework.DeleteTestingNamespace(ns, s, t) + + podClient := clientSet.Core().Pods(ns.Name) + rcClient := clientSet.Core().ReplicationControllers(ns.Name) + // create the RC with the orphan finalizer set + toBeDeletedRC, err := rcClient.Create(newOwnerRC(toBeDeletedRCName, ns.Name)) + if err != nil { + t.Fatalf("Failed to create replication controller: %v", err) + } + // BlockingOwnerDeletion is not set + pod1 := newPod("pod1", ns.Name, []metav1.OwnerReference{ + {UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRC.Name}, + }) + // adding finalizer that no controller handles, so that the pod won't be deleted + pod1.ObjectMeta.Finalizers = []string{"x/y"} + // BlockingOwnerDeletion is false + falseVar := false + pod2 := newPod("pod2", ns.Name, []metav1.OwnerReference{ + {UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRC.Name, BlockOwnerDeletion: &falseVar}, + }) + // adding finalizer that no controller handles, so that the pod won't be deleted + pod2.ObjectMeta.Finalizers = []string{"x/y"} + _, err = podClient.Create(pod1) + if err != nil { + t.Fatalf("Failed to create Pod: %v", err) + } + _, err = podClient.Create(pod2) + if err != nil { + t.Fatalf("Failed to create Pod: %v", err) + } + + stopCh := make(chan struct{}) + go gc.Run(5, stopCh) + defer close(stopCh) + + err = rcClient.Delete(toBeDeletedRCName, getForegroundOptions()) + if err != nil { + t.Fatalf("Failed to delete the rc: %v", err) + } + // verify the toBeDeleteRC is deleted + if err := wait.PollImmediate(5*time.Second, 30*time.Second, func() (bool, error) { + _, err := rcClient.Get(toBeDeletedRC.Name, metav1.GetOptions{}) + if err != nil { + if errors.IsNotFound(err) { + return true, nil + } + return false, err + } + return false, nil + }); err != nil { + t.Errorf("unexpected error: %v", err) + } + + // verify pods are still there + pods, err := podClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatalf("Failed to list pods: %v", err) + } + if len(pods.Items) != 2 { + t.Errorf("expect there to be 2 pods, got %#v", pods.Items) + } +} + +func TestBlockingOwnerRefDoesBlock(t *testing.T) { + s, gc, clientSet := setup(t) + defer s.Close() + + ns := framework.CreateTestingNamespace("gc-foreground2", s, t) + defer framework.DeleteTestingNamespace(ns, s, t) + + podClient := clientSet.Core().Pods(ns.Name) + rcClient := clientSet.Core().ReplicationControllers(ns.Name) + // create the RC with the orphan finalizer set + toBeDeletedRC, err := rcClient.Create(newOwnerRC(toBeDeletedRCName, ns.Name)) + if err != nil { + t.Fatalf("Failed to create replication controller: %v", err) + } + trueVar := true + pod := newPod("pod", ns.Name, []metav1.OwnerReference{ + {UID: toBeDeletedRC.ObjectMeta.UID, Name: toBeDeletedRC.Name, BlockOwnerDeletion: &trueVar}, + }) + // adding finalizer that no controller handles, so that the pod won't be deleted + pod.ObjectMeta.Finalizers = []string{"x/y"} + _, err = podClient.Create(pod) + if err != nil { + t.Fatalf("Failed to create Pod: %v", err) + } + + stopCh := make(chan struct{}) + go gc.Run(5, stopCh) + defer close(stopCh) + + err = rcClient.Delete(toBeDeletedRCName, getForegroundOptions()) + if err != nil { + t.Fatalf("Failed to delete the rc: %v", err) + } + time.Sleep(30 * time.Second) + // verify the toBeDeleteRC is NOT deleted + _, err = rcClient.Get(toBeDeletedRC.Name, metav1.GetOptions{}) + if err != nil { + t.Errorf("unexpected error: %v", err) + } + + // verify pods are still there + pods, err := podClient.List(metav1.ListOptions{}) + if err != nil { + t.Fatalf("Failed to list pods: %v", err) + } + if len(pods.Items) != 1 { + t.Errorf("expect there to be 1 pods, got %#v", pods.Items) + } +} diff --git a/test/integration/replicaset/replicaset_test.go b/test/integration/replicaset/replicaset_test.go index 755ed223d8f..b9feaff9449 100644 --- a/test/integration/replicaset/replicaset_test.go +++ b/test/integration/replicaset/replicaset_test.go @@ -169,7 +169,7 @@ func waitToObservePods(t *testing.T, podInformer cache.SharedIndexInformer, podN } func TestAdoption(t *testing.T) { - var trueVar = true + boolPtr := func(b bool) *bool { return &b } testCases := []struct { name string existingOwnerReferences func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference @@ -181,7 +181,7 @@ func TestAdoption(t *testing.T) { return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}} }, func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { @@ -190,29 +190,29 @@ func TestAdoption(t *testing.T) { return []metav1.OwnerReference{} }, func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { "pod refers rs as a controller", func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}} }, func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}} }, }, { "pod refers other rs as the controller, refers the rs as an owner", func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}, + {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}, {UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}, } }, func(rs *v1beta1.ReplicaSet) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: &trueVar}, + {UID: "1", Name: "anotherRS", APIVersion: "extensions/v1beta1", Kind: "ReplicaSet", Controller: boolPtr(true)}, {UID: rs.UID, Name: rs.Name, APIVersion: "extensions/v1beta1", Kind: "ReplicaSet"}, } }, @@ -255,7 +255,7 @@ func TestAdoption(t *testing.T) { return false, nil } }); err != nil { - t.Fatal(err) + t.Fatalf("test %q failed: %v", tc.name, err) } close(stopCh) } diff --git a/test/integration/replicationcontroller/replicationcontroller_test.go b/test/integration/replicationcontroller/replicationcontroller_test.go index 402106efeb2..4ee05ce72df 100644 --- a/test/integration/replicationcontroller/replicationcontroller_test.go +++ b/test/integration/replicationcontroller/replicationcontroller_test.go @@ -158,7 +158,7 @@ func waitToObservePods(t *testing.T, podInformer cache.SharedIndexInformer, podN } func TestAdoption(t *testing.T) { - var trueVar = true + boolPtr := func(b bool) *bool { return &b } testCases := []struct { name string existingOwnerReferences func(rc *v1.ReplicationController) []metav1.OwnerReference @@ -170,7 +170,7 @@ func TestAdoption(t *testing.T) { return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController"}} }, func(rc *v1.ReplicationController) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { @@ -179,29 +179,29 @@ func TestAdoption(t *testing.T) { return []metav1.OwnerReference{} }, func(rc *v1.ReplicationController) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true), BlockOwnerDeletion: boolPtr(true)}} }, }, { "pod refers rc as a controller", func(rc *v1.ReplicationController) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true)}} }, func(rc *v1.ReplicationController) []metav1.OwnerReference { - return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}} + return []metav1.OwnerReference{{UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true)}} }, }, { "pod refers other rc as the controller, refers the rc as an owner", func(rc *v1.ReplicationController) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRC", APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}, + {UID: "1", Name: "anotherRC", APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true)}, {UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController"}, } }, func(rc *v1.ReplicationController) []metav1.OwnerReference { return []metav1.OwnerReference{ - {UID: "1", Name: "anotherRC", APIVersion: "v1", Kind: "ReplicationController", Controller: &trueVar}, + {UID: "1", Name: "anotherRC", APIVersion: "v1", Kind: "ReplicationController", Controller: boolPtr(true)}, {UID: rc.UID, Name: rc.Name, APIVersion: "v1", Kind: "ReplicationController"}, } }, @@ -243,7 +243,7 @@ func TestAdoption(t *testing.T) { return false, nil } }); err != nil { - t.Fatal(err) + t.Fatalf("test %q failed: %v", tc.name, err) } close(stopCh) }