From 98aba159942c8bdf033cfbfc41da6630a5be8358 Mon Sep 17 00:00:00 2001 From: gussan <83329336+toyamagu-2021@users.noreply.github.com> Date: Sun, 15 Oct 2023 20:01:35 +0900 Subject: [PATCH] fix: retry only proper node (#11589) (#11839) Signed-off-by: toyamagu2021@gmail.com Signed-off-by: toyamagu-2021 --- api/jsonschema/schema.json | 17 + api/openapi-spec/swagger.json | 17 + docs/fields.md | 11 + .../base/crds/full/argoproj.io_workflows.yaml | 7 + pkg/apis/workflow/v1alpha1/generated.pb.go | 1717 ++++++++++------- pkg/apis/workflow/v1alpha1/generated.proto | 11 + .../workflow/v1alpha1/openapi_generated.go | 35 +- pkg/apis/workflow/v1alpha1/workflow_types.go | 10 + .../v1alpha1/zz_generated.deepcopy.go | 21 + .../IoArgoprojWorkflowV1alpha1NodeFlag.md | 14 + .../IoArgoprojWorkflowV1alpha1NodeStatus.md | 1 + ...io_argoproj_workflow_v1alpha1_node_flag.py | 259 +++ ..._argoproj_workflow_v1alpha1_node_status.py | 6 + .../client/argo_workflows/models/__init__.py | 1 + .../IoArgoprojWorkflowV1alpha1NodeFlag.md | 13 + .../IoArgoprojWorkflowV1alpha1NodeStatus.md | 1 + sdks/python/client/docs/WorkflowServiceApi.md | 8 + test/e2e/hooks_test.go | 80 + test/e2e/retry_test.go | 18 +- workflow/controller/container_set_template.go | 4 +- workflow/controller/dag.go | 18 +- workflow/controller/dag_test.go | 8 + workflow/controller/exit_handler.go | 2 +- workflow/controller/hooks.go | 5 +- workflow/controller/hooks_test.go | 25 +- workflow/controller/http_template.go | 2 +- workflow/controller/operator.go | 136 +- workflow/controller/operator_metrics_test.go | 2 + workflow/controller/operator_test.go | 214 +- workflow/controller/plugin_template.go | 2 +- workflow/controller/steps.go | 10 +- 31 files changed, 1818 insertions(+), 857 deletions(-) create mode 100644 sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md create mode 100644 sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_flag.py create mode 100644 sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index 425be6a897ca..2b38c630987a 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -5464,6 +5464,19 @@ }, "type": "object" }, + "io.argoproj.workflow.v1alpha1.NodeFlag": { + "properties": { + "hooked": { + "description": "Hooked tracks whether or not this node was triggered by hook or onExit", + "type": "boolean" + }, + "retried": { + "description": "Retried tracks whether or not this node was retried by retryStrategy", + "type": "boolean" + } + }, + "type": "object" + }, "io.argoproj.workflow.v1alpha1.NodeResult": { "properties": { "message": { @@ -5535,6 +5548,10 @@ "description": "Name is unique name in the node tree used to generate the node ID", "type": "string" }, + "nodeFlag": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.NodeFlag", + "description": "NodeFlag tracks some history of node. e.g.) hooked, retried, etc." + }, "outboundNodes": { "description": "OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step.\n\nIn the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children.", "items": { diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 8d2f5e604ade..60f60a33b470 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -9404,6 +9404,19 @@ } } }, + "io.argoproj.workflow.v1alpha1.NodeFlag": { + "type": "object", + "properties": { + "hooked": { + "description": "Hooked tracks whether or not this node was triggered by hook or onExit", + "type": "boolean" + }, + "retried": { + "description": "Retried tracks whether or not this node was retried by retryStrategy", + "type": "boolean" + } + } + }, "io.argoproj.workflow.v1alpha1.NodeResult": { "type": "object", "properties": { @@ -9481,6 +9494,10 @@ "description": "Name is unique name in the node tree used to generate the node ID", "type": "string" }, + "nodeFlag": { + "description": "NodeFlag tracks some history of node. e.g.) hooked, retried, etc.", + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.NodeFlag" + }, "outboundNodes": { "description": "OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step.\n\nIn the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children.", "type": "array", diff --git a/docs/fields.md b/docs/fields.md index 966f8d951f9b..4b8f4d2be476 100644 --- a/docs/fields.md +++ b/docs/fields.md @@ -1812,6 +1812,7 @@ NodeStatus contains status information about an individual node in the workflow |`memoizationStatus`|[`MemoizationStatus`](#memoizationstatus)|MemoizationStatus holds information about cached nodes| |`message`|`string`|A human readable message indicating details about why the node is in this condition.| |`name`|`string`|Name is unique name in the node tree used to generate the node ID| +|`nodeFlag`|[`NodeFlag`](#nodeflag)|NodeFlag tracks some history of node. e.g.) hooked, retried, etc.| |`outboundNodes`|`Array< string >`|OutboundNodes tracks the node IDs which are considered "outbound" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as "outbound". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step. In the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the "outbound" node. In the case of DAGs, outbound nodes are the "target" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children.| |`outputs`|[`Outputs`](#outputs)|Outputs captures output parameter values and artifact locations produced by this template invocation| |`phase`|`string`|Phase a simple, high-level summary of where the node is in its lifecycle. Can be used as a state machine. Will be one of these values "Pending", "Running" before the node is completed, or "Succeeded", "Skipped", "Failed", "Error", or "Omitted" as a final state.| @@ -3202,6 +3203,16 @@ MemoizationStatus is the status of this memoized node |`hit`|`boolean`|Hit indicates whether this node was created from a cache entry| |`key`|`string`|Key is the name of the key used for this node's cache| +## NodeFlag + +_No description available_ + +### Fields +| Field Name | Field Type | Description | +|:----------:|:----------:|---------------| +|`hooked`|`boolean`|Hooked tracks whether or not this node was triggered by hook or onExit| +|`retried`|`boolean`|Retried tracks whether or not this node was retried by retryStrategy| + ## NodeSynchronizationStatus NodeSynchronizationStatus stores the status of a node diff --git a/manifests/base/crds/full/argoproj.io_workflows.yaml b/manifests/base/crds/full/argoproj.io_workflows.yaml index 1dc4a552b2aa..ace9a944b056 100644 --- a/manifests/base/crds/full/argoproj.io_workflows.yaml +++ b/manifests/base/crds/full/argoproj.io_workflows.yaml @@ -20054,6 +20054,13 @@ spec: type: string name: type: string + nodeFlag: + properties: + hooked: + type: boolean + retried: + type: boolean + type: object outboundNodes: items: type: string diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index 0f48ed703ade..ec405028c8ab 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -2304,10 +2304,38 @@ func (m *MutexStatus) XXX_DiscardUnknown() { var xxx_messageInfo_MutexStatus proto.InternalMessageInfo +func (m *NodeFlag) Reset() { *m = NodeFlag{} } +func (*NodeFlag) ProtoMessage() {} +func (*NodeFlag) Descriptor() ([]byte, []int) { + return fileDescriptor_724696e352c3df5f, []int{81} +} +func (m *NodeFlag) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NodeFlag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil +} +func (m *NodeFlag) XXX_Merge(src proto.Message) { + xxx_messageInfo_NodeFlag.Merge(m, src) +} +func (m *NodeFlag) XXX_Size() int { + return m.Size() +} +func (m *NodeFlag) XXX_DiscardUnknown() { + xxx_messageInfo_NodeFlag.DiscardUnknown(m) +} + +var xxx_messageInfo_NodeFlag proto.InternalMessageInfo + func (m *NodeResult) Reset() { *m = NodeResult{} } func (*NodeResult) ProtoMessage() {} func (*NodeResult) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{81} + return fileDescriptor_724696e352c3df5f, []int{82} } func (m *NodeResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2335,7 +2363,7 @@ var xxx_messageInfo_NodeResult proto.InternalMessageInfo func (m *NodeStatus) Reset() { *m = NodeStatus{} } func (*NodeStatus) ProtoMessage() {} func (*NodeStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{82} + return fileDescriptor_724696e352c3df5f, []int{83} } func (m *NodeStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2363,7 +2391,7 @@ var xxx_messageInfo_NodeStatus proto.InternalMessageInfo func (m *NodeSynchronizationStatus) Reset() { *m = NodeSynchronizationStatus{} } func (*NodeSynchronizationStatus) ProtoMessage() {} func (*NodeSynchronizationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{83} + return fileDescriptor_724696e352c3df5f, []int{84} } func (m *NodeSynchronizationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2391,7 +2419,7 @@ var xxx_messageInfo_NodeSynchronizationStatus proto.InternalMessageInfo func (m *NoneStrategy) Reset() { *m = NoneStrategy{} } func (*NoneStrategy) ProtoMessage() {} func (*NoneStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{84} + return fileDescriptor_724696e352c3df5f, []int{85} } func (m *NoneStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2419,7 +2447,7 @@ var xxx_messageInfo_NoneStrategy proto.InternalMessageInfo func (m *OAuth2Auth) Reset() { *m = OAuth2Auth{} } func (*OAuth2Auth) ProtoMessage() {} func (*OAuth2Auth) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{85} + return fileDescriptor_724696e352c3df5f, []int{86} } func (m *OAuth2Auth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2447,7 +2475,7 @@ var xxx_messageInfo_OAuth2Auth proto.InternalMessageInfo func (m *OAuth2EndpointParam) Reset() { *m = OAuth2EndpointParam{} } func (*OAuth2EndpointParam) ProtoMessage() {} func (*OAuth2EndpointParam) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{86} + return fileDescriptor_724696e352c3df5f, []int{87} } func (m *OAuth2EndpointParam) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2475,7 +2503,7 @@ var xxx_messageInfo_OAuth2EndpointParam proto.InternalMessageInfo func (m *OSSArtifact) Reset() { *m = OSSArtifact{} } func (*OSSArtifact) ProtoMessage() {} func (*OSSArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{87} + return fileDescriptor_724696e352c3df5f, []int{88} } func (m *OSSArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2503,7 +2531,7 @@ var xxx_messageInfo_OSSArtifact proto.InternalMessageInfo func (m *OSSArtifactRepository) Reset() { *m = OSSArtifactRepository{} } func (*OSSArtifactRepository) ProtoMessage() {} func (*OSSArtifactRepository) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{88} + return fileDescriptor_724696e352c3df5f, []int{89} } func (m *OSSArtifactRepository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2531,7 +2559,7 @@ var xxx_messageInfo_OSSArtifactRepository proto.InternalMessageInfo func (m *OSSBucket) Reset() { *m = OSSBucket{} } func (*OSSBucket) ProtoMessage() {} func (*OSSBucket) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{89} + return fileDescriptor_724696e352c3df5f, []int{90} } func (m *OSSBucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2559,7 +2587,7 @@ var xxx_messageInfo_OSSBucket proto.InternalMessageInfo func (m *OSSLifecycleRule) Reset() { *m = OSSLifecycleRule{} } func (*OSSLifecycleRule) ProtoMessage() {} func (*OSSLifecycleRule) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{90} + return fileDescriptor_724696e352c3df5f, []int{91} } func (m *OSSLifecycleRule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2587,7 +2615,7 @@ var xxx_messageInfo_OSSLifecycleRule proto.InternalMessageInfo func (m *Object) Reset() { *m = Object{} } func (*Object) ProtoMessage() {} func (*Object) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{91} + return fileDescriptor_724696e352c3df5f, []int{92} } func (m *Object) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2615,7 +2643,7 @@ var xxx_messageInfo_Object proto.InternalMessageInfo func (m *Outputs) Reset() { *m = Outputs{} } func (*Outputs) ProtoMessage() {} func (*Outputs) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{92} + return fileDescriptor_724696e352c3df5f, []int{93} } func (m *Outputs) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2643,7 +2671,7 @@ var xxx_messageInfo_Outputs proto.InternalMessageInfo func (m *ParallelSteps) Reset() { *m = ParallelSteps{} } func (*ParallelSteps) ProtoMessage() {} func (*ParallelSteps) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{93} + return fileDescriptor_724696e352c3df5f, []int{94} } func (m *ParallelSteps) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2671,7 +2699,7 @@ var xxx_messageInfo_ParallelSteps proto.InternalMessageInfo func (m *Parameter) Reset() { *m = Parameter{} } func (*Parameter) ProtoMessage() {} func (*Parameter) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{94} + return fileDescriptor_724696e352c3df5f, []int{95} } func (m *Parameter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2699,7 +2727,7 @@ var xxx_messageInfo_Parameter proto.InternalMessageInfo func (m *Plugin) Reset() { *m = Plugin{} } func (*Plugin) ProtoMessage() {} func (*Plugin) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{95} + return fileDescriptor_724696e352c3df5f, []int{96} } func (m *Plugin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2727,7 +2755,7 @@ var xxx_messageInfo_Plugin proto.InternalMessageInfo func (m *PodGC) Reset() { *m = PodGC{} } func (*PodGC) ProtoMessage() {} func (*PodGC) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{96} + return fileDescriptor_724696e352c3df5f, []int{97} } func (m *PodGC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2755,7 +2783,7 @@ var xxx_messageInfo_PodGC proto.InternalMessageInfo func (m *Prometheus) Reset() { *m = Prometheus{} } func (*Prometheus) ProtoMessage() {} func (*Prometheus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{97} + return fileDescriptor_724696e352c3df5f, []int{98} } func (m *Prometheus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2783,7 +2811,7 @@ var xxx_messageInfo_Prometheus proto.InternalMessageInfo func (m *RawArtifact) Reset() { *m = RawArtifact{} } func (*RawArtifact) ProtoMessage() {} func (*RawArtifact) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{98} + return fileDescriptor_724696e352c3df5f, []int{99} } func (m *RawArtifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2811,7 +2839,7 @@ var xxx_messageInfo_RawArtifact proto.InternalMessageInfo func (m *ResourceTemplate) Reset() { *m = ResourceTemplate{} } func (*ResourceTemplate) ProtoMessage() {} func (*ResourceTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{99} + return fileDescriptor_724696e352c3df5f, []int{100} } func (m *ResourceTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2839,7 +2867,7 @@ var xxx_messageInfo_ResourceTemplate proto.InternalMessageInfo func (m *RetryAffinity) Reset() { *m = RetryAffinity{} } func (*RetryAffinity) ProtoMessage() {} func (*RetryAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{100} + return fileDescriptor_724696e352c3df5f, []int{101} } func (m *RetryAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2867,7 +2895,7 @@ var xxx_messageInfo_RetryAffinity proto.InternalMessageInfo func (m *RetryNodeAntiAffinity) Reset() { *m = RetryNodeAntiAffinity{} } func (*RetryNodeAntiAffinity) ProtoMessage() {} func (*RetryNodeAntiAffinity) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{101} + return fileDescriptor_724696e352c3df5f, []int{102} } func (m *RetryNodeAntiAffinity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2895,7 +2923,7 @@ var xxx_messageInfo_RetryNodeAntiAffinity proto.InternalMessageInfo func (m *RetryStrategy) Reset() { *m = RetryStrategy{} } func (*RetryStrategy) ProtoMessage() {} func (*RetryStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{102} + return fileDescriptor_724696e352c3df5f, []int{103} } func (m *RetryStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2923,7 +2951,7 @@ var xxx_messageInfo_RetryStrategy proto.InternalMessageInfo func (m *S3Artifact) Reset() { *m = S3Artifact{} } func (*S3Artifact) ProtoMessage() {} func (*S3Artifact) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{103} + return fileDescriptor_724696e352c3df5f, []int{104} } func (m *S3Artifact) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2951,7 +2979,7 @@ var xxx_messageInfo_S3Artifact proto.InternalMessageInfo func (m *S3ArtifactRepository) Reset() { *m = S3ArtifactRepository{} } func (*S3ArtifactRepository) ProtoMessage() {} func (*S3ArtifactRepository) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{104} + return fileDescriptor_724696e352c3df5f, []int{105} } func (m *S3ArtifactRepository) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2979,7 +3007,7 @@ var xxx_messageInfo_S3ArtifactRepository proto.InternalMessageInfo func (m *S3Bucket) Reset() { *m = S3Bucket{} } func (*S3Bucket) ProtoMessage() {} func (*S3Bucket) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{105} + return fileDescriptor_724696e352c3df5f, []int{106} } func (m *S3Bucket) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3007,7 +3035,7 @@ var xxx_messageInfo_S3Bucket proto.InternalMessageInfo func (m *S3EncryptionOptions) Reset() { *m = S3EncryptionOptions{} } func (*S3EncryptionOptions) ProtoMessage() {} func (*S3EncryptionOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{106} + return fileDescriptor_724696e352c3df5f, []int{107} } func (m *S3EncryptionOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3035,7 +3063,7 @@ var xxx_messageInfo_S3EncryptionOptions proto.InternalMessageInfo func (m *ScriptTemplate) Reset() { *m = ScriptTemplate{} } func (*ScriptTemplate) ProtoMessage() {} func (*ScriptTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{107} + return fileDescriptor_724696e352c3df5f, []int{108} } func (m *ScriptTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3063,7 +3091,7 @@ var xxx_messageInfo_ScriptTemplate proto.InternalMessageInfo func (m *SemaphoreHolding) Reset() { *m = SemaphoreHolding{} } func (*SemaphoreHolding) ProtoMessage() {} func (*SemaphoreHolding) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{108} + return fileDescriptor_724696e352c3df5f, []int{109} } func (m *SemaphoreHolding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3091,7 +3119,7 @@ var xxx_messageInfo_SemaphoreHolding proto.InternalMessageInfo func (m *SemaphoreRef) Reset() { *m = SemaphoreRef{} } func (*SemaphoreRef) ProtoMessage() {} func (*SemaphoreRef) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{109} + return fileDescriptor_724696e352c3df5f, []int{110} } func (m *SemaphoreRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3119,7 +3147,7 @@ var xxx_messageInfo_SemaphoreRef proto.InternalMessageInfo func (m *SemaphoreStatus) Reset() { *m = SemaphoreStatus{} } func (*SemaphoreStatus) ProtoMessage() {} func (*SemaphoreStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{110} + return fileDescriptor_724696e352c3df5f, []int{111} } func (m *SemaphoreStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3147,7 +3175,7 @@ var xxx_messageInfo_SemaphoreStatus proto.InternalMessageInfo func (m *Sequence) Reset() { *m = Sequence{} } func (*Sequence) ProtoMessage() {} func (*Sequence) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{111} + return fileDescriptor_724696e352c3df5f, []int{112} } func (m *Sequence) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3175,7 +3203,7 @@ var xxx_messageInfo_Sequence proto.InternalMessageInfo func (m *Submit) Reset() { *m = Submit{} } func (*Submit) ProtoMessage() {} func (*Submit) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{112} + return fileDescriptor_724696e352c3df5f, []int{113} } func (m *Submit) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3203,7 +3231,7 @@ var xxx_messageInfo_Submit proto.InternalMessageInfo func (m *SubmitOpts) Reset() { *m = SubmitOpts{} } func (*SubmitOpts) ProtoMessage() {} func (*SubmitOpts) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{113} + return fileDescriptor_724696e352c3df5f, []int{114} } func (m *SubmitOpts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3231,7 +3259,7 @@ var xxx_messageInfo_SubmitOpts proto.InternalMessageInfo func (m *SuppliedValueFrom) Reset() { *m = SuppliedValueFrom{} } func (*SuppliedValueFrom) ProtoMessage() {} func (*SuppliedValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{114} + return fileDescriptor_724696e352c3df5f, []int{115} } func (m *SuppliedValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3259,7 +3287,7 @@ var xxx_messageInfo_SuppliedValueFrom proto.InternalMessageInfo func (m *SuspendTemplate) Reset() { *m = SuspendTemplate{} } func (*SuspendTemplate) ProtoMessage() {} func (*SuspendTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{115} + return fileDescriptor_724696e352c3df5f, []int{116} } func (m *SuspendTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3287,7 +3315,7 @@ var xxx_messageInfo_SuspendTemplate proto.InternalMessageInfo func (m *Synchronization) Reset() { *m = Synchronization{} } func (*Synchronization) ProtoMessage() {} func (*Synchronization) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{116} + return fileDescriptor_724696e352c3df5f, []int{117} } func (m *Synchronization) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3315,7 +3343,7 @@ var xxx_messageInfo_Synchronization proto.InternalMessageInfo func (m *SynchronizationStatus) Reset() { *m = SynchronizationStatus{} } func (*SynchronizationStatus) ProtoMessage() {} func (*SynchronizationStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{117} + return fileDescriptor_724696e352c3df5f, []int{118} } func (m *SynchronizationStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3343,7 +3371,7 @@ var xxx_messageInfo_SynchronizationStatus proto.InternalMessageInfo func (m *TTLStrategy) Reset() { *m = TTLStrategy{} } func (*TTLStrategy) ProtoMessage() {} func (*TTLStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{118} + return fileDescriptor_724696e352c3df5f, []int{119} } func (m *TTLStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3399,7 @@ var xxx_messageInfo_TTLStrategy proto.InternalMessageInfo func (m *TarStrategy) Reset() { *m = TarStrategy{} } func (*TarStrategy) ProtoMessage() {} func (*TarStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{119} + return fileDescriptor_724696e352c3df5f, []int{120} } func (m *TarStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3399,7 +3427,7 @@ var xxx_messageInfo_TarStrategy proto.InternalMessageInfo func (m *Template) Reset() { *m = Template{} } func (*Template) ProtoMessage() {} func (*Template) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{120} + return fileDescriptor_724696e352c3df5f, []int{121} } func (m *Template) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3427,7 +3455,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo func (m *TemplateRef) Reset() { *m = TemplateRef{} } func (*TemplateRef) ProtoMessage() {} func (*TemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{121} + return fileDescriptor_724696e352c3df5f, []int{122} } func (m *TemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3455,7 +3483,7 @@ var xxx_messageInfo_TemplateRef proto.InternalMessageInfo func (m *TransformationStep) Reset() { *m = TransformationStep{} } func (*TransformationStep) ProtoMessage() {} func (*TransformationStep) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{122} + return fileDescriptor_724696e352c3df5f, []int{123} } func (m *TransformationStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3483,7 +3511,7 @@ var xxx_messageInfo_TransformationStep proto.InternalMessageInfo func (m *UserContainer) Reset() { *m = UserContainer{} } func (*UserContainer) ProtoMessage() {} func (*UserContainer) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{123} + return fileDescriptor_724696e352c3df5f, []int{124} } func (m *UserContainer) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3511,7 +3539,7 @@ var xxx_messageInfo_UserContainer proto.InternalMessageInfo func (m *ValueFrom) Reset() { *m = ValueFrom{} } func (*ValueFrom) ProtoMessage() {} func (*ValueFrom) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{124} + return fileDescriptor_724696e352c3df5f, []int{125} } func (m *ValueFrom) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3539,7 +3567,7 @@ var xxx_messageInfo_ValueFrom proto.InternalMessageInfo func (m *Version) Reset() { *m = Version{} } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{125} + return fileDescriptor_724696e352c3df5f, []int{126} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3567,7 +3595,7 @@ var xxx_messageInfo_Version proto.InternalMessageInfo func (m *VolumeClaimGC) Reset() { *m = VolumeClaimGC{} } func (*VolumeClaimGC) ProtoMessage() {} func (*VolumeClaimGC) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{126} + return fileDescriptor_724696e352c3df5f, []int{127} } func (m *VolumeClaimGC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3595,7 +3623,7 @@ var xxx_messageInfo_VolumeClaimGC proto.InternalMessageInfo func (m *Workflow) Reset() { *m = Workflow{} } func (*Workflow) ProtoMessage() {} func (*Workflow) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{127} + return fileDescriptor_724696e352c3df5f, []int{128} } func (m *Workflow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3623,7 +3651,7 @@ var xxx_messageInfo_Workflow proto.InternalMessageInfo func (m *WorkflowArtifactGCTask) Reset() { *m = WorkflowArtifactGCTask{} } func (*WorkflowArtifactGCTask) ProtoMessage() {} func (*WorkflowArtifactGCTask) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{128} + return fileDescriptor_724696e352c3df5f, []int{129} } func (m *WorkflowArtifactGCTask) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3651,7 +3679,7 @@ var xxx_messageInfo_WorkflowArtifactGCTask proto.InternalMessageInfo func (m *WorkflowArtifactGCTaskList) Reset() { *m = WorkflowArtifactGCTaskList{} } func (*WorkflowArtifactGCTaskList) ProtoMessage() {} func (*WorkflowArtifactGCTaskList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{129} + return fileDescriptor_724696e352c3df5f, []int{130} } func (m *WorkflowArtifactGCTaskList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3679,7 +3707,7 @@ var xxx_messageInfo_WorkflowArtifactGCTaskList proto.InternalMessageInfo func (m *WorkflowEventBinding) Reset() { *m = WorkflowEventBinding{} } func (*WorkflowEventBinding) ProtoMessage() {} func (*WorkflowEventBinding) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{130} + return fileDescriptor_724696e352c3df5f, []int{131} } func (m *WorkflowEventBinding) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3707,7 +3735,7 @@ var xxx_messageInfo_WorkflowEventBinding proto.InternalMessageInfo func (m *WorkflowEventBindingList) Reset() { *m = WorkflowEventBindingList{} } func (*WorkflowEventBindingList) ProtoMessage() {} func (*WorkflowEventBindingList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{131} + return fileDescriptor_724696e352c3df5f, []int{132} } func (m *WorkflowEventBindingList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3735,7 +3763,7 @@ var xxx_messageInfo_WorkflowEventBindingList proto.InternalMessageInfo func (m *WorkflowEventBindingSpec) Reset() { *m = WorkflowEventBindingSpec{} } func (*WorkflowEventBindingSpec) ProtoMessage() {} func (*WorkflowEventBindingSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{132} + return fileDescriptor_724696e352c3df5f, []int{133} } func (m *WorkflowEventBindingSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3763,7 +3791,7 @@ var xxx_messageInfo_WorkflowEventBindingSpec proto.InternalMessageInfo func (m *WorkflowLevelArtifactGC) Reset() { *m = WorkflowLevelArtifactGC{} } func (*WorkflowLevelArtifactGC) ProtoMessage() {} func (*WorkflowLevelArtifactGC) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{133} + return fileDescriptor_724696e352c3df5f, []int{134} } func (m *WorkflowLevelArtifactGC) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3791,7 +3819,7 @@ var xxx_messageInfo_WorkflowLevelArtifactGC proto.InternalMessageInfo func (m *WorkflowList) Reset() { *m = WorkflowList{} } func (*WorkflowList) ProtoMessage() {} func (*WorkflowList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{134} + return fileDescriptor_724696e352c3df5f, []int{135} } func (m *WorkflowList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3819,7 +3847,7 @@ var xxx_messageInfo_WorkflowList proto.InternalMessageInfo func (m *WorkflowMetadata) Reset() { *m = WorkflowMetadata{} } func (*WorkflowMetadata) ProtoMessage() {} func (*WorkflowMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{135} + return fileDescriptor_724696e352c3df5f, []int{136} } func (m *WorkflowMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3847,7 +3875,7 @@ var xxx_messageInfo_WorkflowMetadata proto.InternalMessageInfo func (m *WorkflowSpec) Reset() { *m = WorkflowSpec{} } func (*WorkflowSpec) ProtoMessage() {} func (*WorkflowSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{136} + return fileDescriptor_724696e352c3df5f, []int{137} } func (m *WorkflowSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3875,7 +3903,7 @@ var xxx_messageInfo_WorkflowSpec proto.InternalMessageInfo func (m *WorkflowStatus) Reset() { *m = WorkflowStatus{} } func (*WorkflowStatus) ProtoMessage() {} func (*WorkflowStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{137} + return fileDescriptor_724696e352c3df5f, []int{138} } func (m *WorkflowStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3903,7 +3931,7 @@ var xxx_messageInfo_WorkflowStatus proto.InternalMessageInfo func (m *WorkflowStep) Reset() { *m = WorkflowStep{} } func (*WorkflowStep) ProtoMessage() {} func (*WorkflowStep) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{138} + return fileDescriptor_724696e352c3df5f, []int{139} } func (m *WorkflowStep) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3931,7 +3959,7 @@ var xxx_messageInfo_WorkflowStep proto.InternalMessageInfo func (m *WorkflowTaskResult) Reset() { *m = WorkflowTaskResult{} } func (*WorkflowTaskResult) ProtoMessage() {} func (*WorkflowTaskResult) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{139} + return fileDescriptor_724696e352c3df5f, []int{140} } func (m *WorkflowTaskResult) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3959,7 +3987,7 @@ var xxx_messageInfo_WorkflowTaskResult proto.InternalMessageInfo func (m *WorkflowTaskResultList) Reset() { *m = WorkflowTaskResultList{} } func (*WorkflowTaskResultList) ProtoMessage() {} func (*WorkflowTaskResultList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{140} + return fileDescriptor_724696e352c3df5f, []int{141} } func (m *WorkflowTaskResultList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3987,7 +4015,7 @@ var xxx_messageInfo_WorkflowTaskResultList proto.InternalMessageInfo func (m *WorkflowTaskSet) Reset() { *m = WorkflowTaskSet{} } func (*WorkflowTaskSet) ProtoMessage() {} func (*WorkflowTaskSet) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{141} + return fileDescriptor_724696e352c3df5f, []int{142} } func (m *WorkflowTaskSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4015,7 +4043,7 @@ var xxx_messageInfo_WorkflowTaskSet proto.InternalMessageInfo func (m *WorkflowTaskSetList) Reset() { *m = WorkflowTaskSetList{} } func (*WorkflowTaskSetList) ProtoMessage() {} func (*WorkflowTaskSetList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{142} + return fileDescriptor_724696e352c3df5f, []int{143} } func (m *WorkflowTaskSetList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4043,7 +4071,7 @@ var xxx_messageInfo_WorkflowTaskSetList proto.InternalMessageInfo func (m *WorkflowTaskSetSpec) Reset() { *m = WorkflowTaskSetSpec{} } func (*WorkflowTaskSetSpec) ProtoMessage() {} func (*WorkflowTaskSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{143} + return fileDescriptor_724696e352c3df5f, []int{144} } func (m *WorkflowTaskSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4071,7 +4099,7 @@ var xxx_messageInfo_WorkflowTaskSetSpec proto.InternalMessageInfo func (m *WorkflowTaskSetStatus) Reset() { *m = WorkflowTaskSetStatus{} } func (*WorkflowTaskSetStatus) ProtoMessage() {} func (*WorkflowTaskSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{144} + return fileDescriptor_724696e352c3df5f, []int{145} } func (m *WorkflowTaskSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4099,7 +4127,7 @@ var xxx_messageInfo_WorkflowTaskSetStatus proto.InternalMessageInfo func (m *WorkflowTemplate) Reset() { *m = WorkflowTemplate{} } func (*WorkflowTemplate) ProtoMessage() {} func (*WorkflowTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{145} + return fileDescriptor_724696e352c3df5f, []int{146} } func (m *WorkflowTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4127,7 +4155,7 @@ var xxx_messageInfo_WorkflowTemplate proto.InternalMessageInfo func (m *WorkflowTemplateList) Reset() { *m = WorkflowTemplateList{} } func (*WorkflowTemplateList) ProtoMessage() {} func (*WorkflowTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{146} + return fileDescriptor_724696e352c3df5f, []int{147} } func (m *WorkflowTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4155,7 +4183,7 @@ var xxx_messageInfo_WorkflowTemplateList proto.InternalMessageInfo func (m *WorkflowTemplateRef) Reset() { *m = WorkflowTemplateRef{} } func (*WorkflowTemplateRef) ProtoMessage() {} func (*WorkflowTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{147} + return fileDescriptor_724696e352c3df5f, []int{148} } func (m *WorkflowTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4183,7 +4211,7 @@ var xxx_messageInfo_WorkflowTemplateRef proto.InternalMessageInfo func (m *ZipStrategy) Reset() { *m = ZipStrategy{} } func (*ZipStrategy) ProtoMessage() {} func (*ZipStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{148} + return fileDescriptor_724696e352c3df5f, []int{149} } func (m *ZipStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4301,6 +4329,7 @@ func init() { proto.RegisterType((*Mutex)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.Mutex") proto.RegisterType((*MutexHolding)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.MutexHolding") proto.RegisterType((*MutexStatus)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.MutexStatus") + proto.RegisterType((*NodeFlag)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.NodeFlag") proto.RegisterType((*NodeResult)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.NodeResult") proto.RegisterType((*NodeStatus)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.NodeStatus") proto.RegisterMapType((ResourcesDuration)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.NodeStatus.ResourcesDurationEntry") @@ -4389,682 +4418,686 @@ func init() { } var fileDescriptor_724696e352c3df5f = []byte{ - // 10797 bytes of a gzipped FileDescriptorProto + // 10862 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x6d, 0x70, 0x24, 0xc7, 0x75, 0x18, 0x67, 0x81, 0xc5, 0xc7, 0xc3, 0xc7, 0xe1, 0xfa, 0xbe, 0x96, 0x20, 0x79, 0xa0, 0x87, - 0x22, 0x43, 0xda, 0x14, 0xce, 0x3c, 0x4a, 0x09, 0x63, 0x25, 0x92, 0xf0, 0x71, 0xc0, 0x81, 0x00, - 0x0e, 0x60, 0x2f, 0x8e, 0x67, 0x52, 0x8c, 0xa4, 0xc1, 0x6e, 0x63, 0x77, 0x88, 0xdd, 0x99, 0xd5, - 0xcc, 0x2c, 0x70, 0xe0, 0x87, 0xa4, 0xd0, 0xfa, 0x8c, 0x65, 0x2b, 0x91, 0x25, 0x59, 0x52, 0x92, - 0x2a, 0x45, 0x91, 0x12, 0x96, 0xec, 0x8a, 0xcb, 0xfe, 0x95, 0xb2, 0xff, 0xa5, 0x52, 0x2e, 0xa5, - 0x9c, 0xaa, 0xc8, 0x65, 0xa5, 0xa4, 0x1f, 0x31, 0x18, 0x21, 0x89, 0xaa, 0xf2, 0xa1, 0xaa, 0x44, - 0x15, 0x3b, 0xf6, 0xe5, 0xa3, 0x52, 0xfd, 0x39, 0xdd, 0xb3, 0xb3, 0xb8, 0x05, 0xd8, 0xc0, 0xa9, - 0xec, 0x5f, 0xc0, 0xbe, 0x7e, 0xfd, 0x5e, 0x77, 0x4f, 0xf7, 0xeb, 0xd7, 0xef, 0xbd, 0x7e, 0x0d, - 0xeb, 0x35, 0x3f, 0xa9, 0xb7, 0x37, 0xa7, 0x2b, 0x61, 0xf3, 0x8a, 0x17, 0xd5, 0xc2, 0x56, 0x14, - 0xbe, 0xcc, 0xfe, 0x79, 0xe7, 0x6e, 0x18, 0x6d, 0x6f, 0x35, 0xc2, 0xdd, 0xf8, 0xca, 0xce, 0xd3, - 0x57, 0x5a, 0xdb, 0xb5, 0x2b, 0x5e, 0xcb, 0x8f, 0xaf, 0x48, 0xe8, 0x95, 0x9d, 0xa7, 0xbc, 0x46, - 0xab, 0xee, 0x3d, 0x75, 0xa5, 0x46, 0x02, 0x12, 0x79, 0x09, 0xa9, 0x4e, 0xb7, 0xa2, 0x30, 0x09, - 0xd1, 0xfb, 0x53, 0x8a, 0xd3, 0x92, 0x22, 0xfb, 0xe7, 0x43, 0x8a, 0xe2, 0xf4, 0xce, 0xd3, 0xd3, - 0xad, 0xed, 0xda, 0x34, 0xa5, 0x38, 0x2d, 0xa1, 0xd3, 0x92, 0xe2, 0xe4, 0x3b, 0xb5, 0x36, 0xd5, - 0xc2, 0x5a, 0x78, 0x85, 0x11, 0xde, 0x6c, 0x6f, 0xb1, 0x5f, 0xec, 0x07, 0xfb, 0x8f, 0x33, 0x9c, - 0x74, 0xb7, 0x9f, 0x89, 0xa7, 0xfd, 0x90, 0xb6, 0xef, 0x4a, 0x25, 0x8c, 0xc8, 0x95, 0x9d, 0x8e, - 0x46, 0x4d, 0xbe, 0x43, 0xc3, 0x69, 0x85, 0x0d, 0xbf, 0xb2, 0x97, 0x87, 0xf5, 0xae, 0x14, 0xab, - 0xe9, 0x55, 0xea, 0x7e, 0x40, 0xa2, 0xbd, 0xb4, 0xeb, 0x4d, 0x92, 0x78, 0x79, 0xb5, 0xae, 0x74, - 0xab, 0x15, 0xb5, 0x83, 0xc4, 0x6f, 0x92, 0x8e, 0x0a, 0x7f, 0xf5, 0x6e, 0x15, 0xe2, 0x4a, 0x9d, - 0x34, 0xbd, 0x8e, 0x7a, 0x4f, 0x77, 0xab, 0xd7, 0x4e, 0xfc, 0xc6, 0x15, 0x3f, 0x48, 0xe2, 0x24, - 0xca, 0x56, 0x72, 0xaf, 0xc1, 0xc0, 0x4c, 0x33, 0x6c, 0x07, 0x09, 0x7a, 0x0f, 0x14, 0x77, 0xbc, - 0x46, 0x9b, 0x94, 0x9c, 0x87, 0x9d, 0xc7, 0x87, 0x67, 0x1f, 0xfd, 0xce, 0xfe, 0xd4, 0x7d, 0x07, - 0xfb, 0x53, 0xc5, 0xe7, 0x29, 0xf0, 0xce, 0xfe, 0xd4, 0x79, 0x12, 0x54, 0xc2, 0xaa, 0x1f, 0xd4, - 0xae, 0xbc, 0x1c, 0x87, 0xc1, 0xf4, 0x8d, 0x76, 0x73, 0x93, 0x44, 0x98, 0xd7, 0x71, 0xff, 0xa8, - 0x00, 0x67, 0x66, 0xa2, 0x4a, 0xdd, 0xdf, 0x21, 0xe5, 0x84, 0xd2, 0xaf, 0xed, 0xa1, 0x3a, 0xf4, - 0x25, 0x5e, 0xc4, 0xc8, 0x8d, 0x5c, 0x5d, 0x9d, 0x7e, 0xbb, 0xdf, 0x7d, 0x7a, 0xc3, 0x8b, 0x24, - 0xed, 0xd9, 0xc1, 0x83, 0xfd, 0xa9, 0xbe, 0x0d, 0x2f, 0xc2, 0x94, 0x05, 0x6a, 0x40, 0x7f, 0x10, - 0x06, 0xa4, 0x54, 0x60, 0xac, 0x6e, 0xbc, 0x7d, 0x56, 0x37, 0xc2, 0x40, 0xf5, 0x63, 0x76, 0xe8, - 0x60, 0x7f, 0xaa, 0x9f, 0x42, 0x30, 0xe3, 0x42, 0xfb, 0xf5, 0x8a, 0xdf, 0x2a, 0xf5, 0xd9, 0xea, - 0xd7, 0x8b, 0x7e, 0xcb, 0xec, 0xd7, 0x8b, 0x7e, 0x0b, 0x53, 0x16, 0xee, 0x67, 0x0b, 0x30, 0x3c, - 0x13, 0xd5, 0xda, 0x4d, 0x12, 0x24, 0x31, 0xfa, 0x18, 0x40, 0xcb, 0x8b, 0xbc, 0x26, 0x49, 0x48, - 0x14, 0x97, 0x9c, 0x87, 0xfb, 0x1e, 0x1f, 0xb9, 0xba, 0xfc, 0xf6, 0xd9, 0xaf, 0x4b, 0x9a, 0xb3, - 0x48, 0x7c, 0x72, 0x50, 0xa0, 0x18, 0x6b, 0x2c, 0xd1, 0xab, 0x30, 0xec, 0x45, 0x89, 0xbf, 0xe5, - 0x55, 0x92, 0xb8, 0x54, 0x60, 0xfc, 0x9f, 0x7d, 0xfb, 0xfc, 0x67, 0x04, 0xc9, 0xd9, 0xb3, 0x82, - 0xfd, 0xb0, 0x84, 0xc4, 0x38, 0xe5, 0xe7, 0xfe, 0x6e, 0x3f, 0x8c, 0xcc, 0x44, 0xc9, 0xe2, 0x5c, - 0x39, 0xf1, 0x92, 0x76, 0x8c, 0xfe, 0xc0, 0x81, 0x73, 0x31, 0x1f, 0x36, 0x9f, 0xc4, 0xeb, 0x51, - 0x58, 0x21, 0x71, 0x4c, 0xaa, 0x62, 0x5c, 0xb6, 0xac, 0xb4, 0x4b, 0x32, 0x9b, 0x2e, 0x77, 0x32, - 0xba, 0x16, 0x24, 0xd1, 0xde, 0xec, 0x53, 0xa2, 0xcd, 0xe7, 0x72, 0x30, 0xde, 0x78, 0x6b, 0x0a, - 0xc9, 0xae, 0x50, 0x4a, 0xfc, 0x13, 0xe3, 0xbc, 0x56, 0xa3, 0xaf, 0x3a, 0x30, 0xda, 0x0a, 0xab, - 0x31, 0x26, 0x95, 0xb0, 0xdd, 0x22, 0x55, 0x31, 0xbc, 0x1f, 0xb2, 0xdb, 0x8d, 0x75, 0x8d, 0x03, - 0x6f, 0xff, 0x79, 0xd1, 0xfe, 0x51, 0xbd, 0x08, 0x1b, 0x4d, 0x41, 0xcf, 0xc0, 0x68, 0x10, 0x26, - 0xe5, 0x16, 0xa9, 0xf8, 0x5b, 0x3e, 0xa9, 0xb2, 0x89, 0x3f, 0x94, 0xd6, 0xbc, 0xa1, 0x95, 0x61, - 0x03, 0x73, 0x72, 0x01, 0x4a, 0xdd, 0x46, 0x0e, 0x4d, 0x40, 0xdf, 0x36, 0xd9, 0xe3, 0xc2, 0x06, - 0xd3, 0x7f, 0xd1, 0x79, 0x29, 0x80, 0xe8, 0x32, 0x1e, 0x12, 0x92, 0xe5, 0x17, 0x0a, 0xcf, 0x38, - 0x93, 0xef, 0x83, 0xb3, 0x1d, 0x4d, 0x3f, 0x0a, 0x01, 0xf7, 0xbb, 0x03, 0x30, 0x24, 0x3f, 0x05, - 0x7a, 0x18, 0xfa, 0x03, 0xaf, 0x29, 0xe5, 0xdc, 0xa8, 0xe8, 0x47, 0xff, 0x0d, 0xaf, 0x49, 0x57, - 0xb8, 0xd7, 0x24, 0x14, 0xa3, 0xe5, 0x25, 0x75, 0x46, 0x47, 0xc3, 0x58, 0xf7, 0x92, 0x3a, 0x66, - 0x25, 0xe8, 0x41, 0xe8, 0x6f, 0x86, 0x55, 0xc2, 0xc6, 0xa2, 0xc8, 0x25, 0xc4, 0x6a, 0x58, 0x25, - 0x98, 0x41, 0x69, 0xfd, 0xad, 0x28, 0x6c, 0x96, 0xfa, 0xcd, 0xfa, 0x0b, 0x51, 0xd8, 0xc4, 0xac, - 0x04, 0x7d, 0xc5, 0x81, 0x09, 0x39, 0xb7, 0x57, 0xc2, 0x8a, 0x97, 0xf8, 0x61, 0x50, 0x2a, 0x32, - 0x89, 0x82, 0xed, 0x2d, 0x29, 0x49, 0x79, 0xb6, 0x24, 0x9a, 0x30, 0x91, 0x2d, 0xc1, 0x1d, 0xad, - 0x40, 0x57, 0x01, 0x6a, 0x8d, 0x70, 0xd3, 0x6b, 0xd0, 0x01, 0x29, 0x0d, 0xb0, 0x2e, 0x28, 0xc9, - 0xb0, 0xa8, 0x4a, 0xb0, 0x86, 0x85, 0x6e, 0xc3, 0xa0, 0xc7, 0xa5, 0x7f, 0x69, 0x90, 0x75, 0xe2, - 0x39, 0x1b, 0x9d, 0x30, 0xb6, 0x93, 0xd9, 0x91, 0x83, 0xfd, 0xa9, 0x41, 0x01, 0xc4, 0x92, 0x1d, - 0x7a, 0x12, 0x86, 0xc2, 0x16, 0x6d, 0xb7, 0xd7, 0x28, 0x0d, 0xb1, 0x89, 0x39, 0x21, 0xda, 0x3a, - 0xb4, 0x26, 0xe0, 0x58, 0x61, 0xa0, 0x27, 0x60, 0x30, 0x6e, 0x6f, 0xd2, 0xef, 0x58, 0x1a, 0x66, - 0x1d, 0x3b, 0x23, 0x90, 0x07, 0xcb, 0x1c, 0x8c, 0x65, 0x39, 0x7a, 0x37, 0x8c, 0x44, 0xa4, 0xd2, - 0x8e, 0x62, 0x42, 0x3f, 0x6c, 0x09, 0x18, 0xed, 0x73, 0x02, 0x7d, 0x04, 0xa7, 0x45, 0x58, 0xc7, - 0x43, 0xef, 0x85, 0x71, 0xfa, 0x81, 0xaf, 0xdd, 0x6e, 0x45, 0x24, 0x8e, 0xe9, 0x57, 0x1d, 0x61, - 0x8c, 0x2e, 0x8a, 0x9a, 0xe3, 0x0b, 0x46, 0x29, 0xce, 0x60, 0xa3, 0xd7, 0x00, 0x3c, 0x25, 0x33, - 0x4a, 0xa3, 0x6c, 0x30, 0x57, 0xec, 0xcd, 0x88, 0xc5, 0xb9, 0xd9, 0x71, 0xfa, 0x1d, 0xd3, 0xdf, - 0x58, 0xe3, 0x47, 0xc7, 0xa7, 0x4a, 0x1a, 0x24, 0x21, 0xd5, 0xd2, 0x18, 0xeb, 0xb0, 0x1a, 0x9f, - 0x79, 0x0e, 0xc6, 0xb2, 0xdc, 0xfd, 0xfb, 0x05, 0xd0, 0xa8, 0xa0, 0x59, 0x18, 0x12, 0x72, 0x4d, - 0x2c, 0xc9, 0xd9, 0xc7, 0xe4, 0x77, 0x90, 0x5f, 0xf0, 0xce, 0x7e, 0xae, 0x3c, 0x54, 0xf5, 0xd0, - 0xeb, 0x30, 0xd2, 0x0a, 0xab, 0xab, 0x24, 0xf1, 0xaa, 0x5e, 0xe2, 0x89, 0xdd, 0xdc, 0xc2, 0x0e, - 0x23, 0x29, 0xce, 0x9e, 0xa1, 0x9f, 0x6e, 0x3d, 0x65, 0x81, 0x75, 0x7e, 0xe8, 0x59, 0x40, 0x31, - 0x89, 0x76, 0xfc, 0x0a, 0x99, 0xa9, 0x54, 0xa8, 0x4a, 0xc4, 0x16, 0x40, 0x1f, 0xeb, 0xcc, 0xa4, - 0xe8, 0x0c, 0x2a, 0x77, 0x60, 0xe0, 0x9c, 0x5a, 0xee, 0xf7, 0x0a, 0x30, 0xae, 0xf5, 0xb5, 0x45, - 0x2a, 0xe8, 0x4d, 0x07, 0xce, 0xa8, 0xed, 0x6c, 0x76, 0xef, 0x06, 0x9d, 0x55, 0x7c, 0xb3, 0x22, - 0x36, 0xbf, 0x2f, 0xe5, 0xa5, 0x7e, 0x0a, 0x3e, 0x5c, 0xd6, 0x5f, 0x12, 0x7d, 0x38, 0x93, 0x29, - 0xc5, 0xd9, 0x66, 0x4d, 0x7e, 0xd9, 0x81, 0xf3, 0x79, 0x24, 0x72, 0x64, 0x6e, 0x5d, 0x97, 0xb9, - 0x56, 0x85, 0x17, 0xe5, 0x4a, 0x3b, 0xa3, 0xcb, 0xf1, 0xff, 0x57, 0x80, 0x09, 0x7d, 0x0a, 0x31, - 0x4d, 0xe0, 0x5f, 0x38, 0x70, 0x41, 0xf6, 0x00, 0x93, 0xb8, 0xdd, 0xc8, 0x0c, 0x6f, 0xd3, 0xea, - 0xf0, 0xf2, 0x9d, 0x74, 0x26, 0x8f, 0x1f, 0x1f, 0xe6, 0x87, 0xc4, 0x30, 0x5f, 0xc8, 0xc5, 0xc1, - 0xf9, 0x4d, 0x9d, 0xfc, 0xa6, 0x03, 0x93, 0xdd, 0x89, 0xe6, 0x0c, 0x7c, 0xcb, 0x1c, 0xf8, 0x17, - 0xed, 0x75, 0x92, 0xb3, 0x67, 0xc3, 0xcf, 0x3a, 0xab, 0x7f, 0x80, 0xdf, 0x1c, 0x82, 0x8e, 0x3d, - 0x04, 0x3d, 0x05, 0x23, 0x42, 0x1c, 0xaf, 0x84, 0xb5, 0x98, 0x35, 0x72, 0x88, 0xaf, 0xb5, 0x99, - 0x14, 0x8c, 0x75, 0x1c, 0x54, 0x85, 0x42, 0xfc, 0xb4, 0x68, 0xba, 0x05, 0xf1, 0x56, 0x7e, 0x5a, - 0x69, 0x91, 0x03, 0x07, 0xfb, 0x53, 0x85, 0xf2, 0xd3, 0xb8, 0x10, 0x3f, 0x4d, 0x35, 0xf5, 0x9a, - 0x9f, 0xd8, 0xd3, 0xd4, 0x17, 0xfd, 0x44, 0xf1, 0x61, 0x9a, 0xfa, 0xa2, 0x9f, 0x60, 0xca, 0x82, - 0x9e, 0x40, 0xea, 0x49, 0xd2, 0x62, 0x3b, 0xbe, 0x95, 0x13, 0xc8, 0xf5, 0x8d, 0x8d, 0x75, 0xc5, - 0x8b, 0xe9, 0x17, 0x14, 0x82, 0x19, 0x17, 0xf4, 0x19, 0x87, 0x8e, 0x38, 0x2f, 0x0c, 0xa3, 0x3d, - 0xa1, 0x38, 0xdc, 0xb4, 0x37, 0x05, 0xc2, 0x68, 0x4f, 0x31, 0x17, 0x1f, 0x52, 0x15, 0x60, 0x9d, - 0x35, 0xeb, 0x78, 0x75, 0x2b, 0x66, 0x7a, 0x82, 0x9d, 0x8e, 0xcf, 0x2f, 0x94, 0x33, 0x1d, 0x9f, - 0x5f, 0x28, 0x63, 0xc6, 0x85, 0x7e, 0xd0, 0xc8, 0xdb, 0x15, 0x3a, 0x86, 0x85, 0x0f, 0x8a, 0xbd, - 0x5d, 0xf3, 0x83, 0x62, 0x6f, 0x17, 0x53, 0x16, 0x94, 0x53, 0x18, 0xc7, 0x4c, 0xa5, 0xb0, 0xc2, - 0x69, 0xad, 0x5c, 0x36, 0x39, 0xad, 0x95, 0xcb, 0x98, 0xb2, 0x60, 0x93, 0xb4, 0x12, 0x33, 0x7d, - 0xc4, 0xce, 0x24, 0x9d, 0xcb, 0x70, 0x5a, 0x9c, 0x2b, 0x63, 0xca, 0x82, 0x8a, 0x0c, 0xef, 0x95, - 0x76, 0xc4, 0x95, 0x99, 0x91, 0xab, 0x6b, 0x16, 0xe6, 0x0b, 0x25, 0xa7, 0xb8, 0x0d, 0x1f, 0xec, - 0x4f, 0x15, 0x19, 0x08, 0x73, 0x46, 0xee, 0xef, 0xf7, 0xa5, 0xe2, 0x42, 0xca, 0x73, 0xf4, 0xf7, - 0xd8, 0x46, 0x28, 0x64, 0x81, 0x50, 0x7d, 0x9d, 0x13, 0x53, 0x7d, 0xcf, 0xf1, 0x1d, 0xcf, 0x60, - 0x87, 0xb3, 0xfc, 0xd1, 0x17, 0x9c, 0xce, 0xb3, 0xad, 0x67, 0x7f, 0x2f, 0x4b, 0x37, 0x66, 0xbe, - 0x57, 0x1c, 0x7a, 0xe4, 0x9d, 0xfc, 0x8c, 0x93, 0x2a, 0x11, 0x71, 0xb7, 0x7d, 0xe0, 0xc3, 0xe6, - 0x3e, 0x60, 0xf1, 0x40, 0xae, 0xcb, 0xfd, 0xcf, 0x3a, 0x30, 0x26, 0xe1, 0x54, 0x3d, 0x8e, 0xd1, - 0x6d, 0x18, 0x92, 0x2d, 0x15, 0x5f, 0xcf, 0xa6, 0x2d, 0x40, 0x29, 0xf1, 0xaa, 0x31, 0x8a, 0x9b, - 0xfb, 0xe6, 0x00, 0xa0, 0x74, 0xaf, 0x6a, 0x85, 0xb1, 0xcf, 0x24, 0xd1, 0x31, 0x76, 0xa1, 0x40, - 0xdb, 0x85, 0x9e, 0xb7, 0xb9, 0x0b, 0xa5, 0xcd, 0x32, 0xf6, 0xa3, 0x2f, 0x64, 0xe4, 0x36, 0xdf, - 0x98, 0x3e, 0x74, 0x22, 0x72, 0x5b, 0x6b, 0xc2, 0xe1, 0x12, 0x7c, 0x47, 0x48, 0x70, 0xbe, 0x75, - 0xfd, 0xa2, 0x5d, 0x09, 0xae, 0xb5, 0x22, 0x2b, 0xcb, 0x23, 0x2e, 0x61, 0xf9, 0xde, 0x75, 0xcb, - 0xaa, 0x84, 0xd5, 0xb8, 0x9a, 0xb2, 0x36, 0xe2, 0xb2, 0x76, 0xc0, 0x16, 0x4f, 0x4d, 0xd6, 0x66, - 0x79, 0x2a, 0xa9, 0xfb, 0x8a, 0x94, 0xba, 0x7c, 0xd7, 0x7a, 0xc1, 0xb2, 0xd4, 0xd5, 0xf8, 0x76, - 0xca, 0xdf, 0x8f, 0xc0, 0x85, 0x4e, 0x3c, 0x4c, 0xb6, 0xd0, 0x15, 0x18, 0xae, 0x84, 0xc1, 0x96, - 0x5f, 0x5b, 0xf5, 0x5a, 0xe2, 0xbc, 0xa6, 0x64, 0xd1, 0x9c, 0x2c, 0xc0, 0x29, 0x0e, 0x7a, 0x88, - 0x0b, 0x1e, 0x6e, 0x11, 0x19, 0x11, 0xa8, 0x7d, 0xcb, 0x64, 0x8f, 0x49, 0xa1, 0x5f, 0x18, 0xfa, - 0xca, 0xd7, 0xa7, 0xee, 0xfb, 0xf8, 0xbf, 0x7b, 0xf8, 0x3e, 0xf7, 0x0f, 0xfb, 0xe0, 0x81, 0x5c, - 0x9e, 0x42, 0x5b, 0xff, 0x4d, 0x43, 0x5b, 0xd7, 0xca, 0x85, 0x14, 0xb9, 0x65, 0x53, 0x91, 0xd5, - 0xc8, 0xe7, 0xe9, 0xe5, 0x5a, 0x31, 0xce, 0x6f, 0x14, 0x1d, 0xa8, 0xc0, 0x6b, 0x92, 0xb8, 0xe5, - 0x55, 0x88, 0xe8, 0xbd, 0x1a, 0xa8, 0x1b, 0xb2, 0x00, 0xa7, 0x38, 0xfc, 0x08, 0xbd, 0xe5, 0xb5, - 0x1b, 0x89, 0x30, 0x94, 0x69, 0x47, 0x68, 0x06, 0xc6, 0xb2, 0x1c, 0xfd, 0x03, 0x07, 0x50, 0x27, - 0x57, 0xb1, 0x10, 0x37, 0x4e, 0x62, 0x1c, 0x66, 0x2f, 0x1e, 0x68, 0x87, 0x70, 0xad, 0xa7, 0x39, - 0xed, 0xd0, 0xbe, 0xe9, 0x47, 0xd3, 0x7d, 0x88, 0x1f, 0x0e, 0x7a, 0xb0, 0xa1, 0x31, 0x53, 0x4b, - 0xa5, 0x42, 0xe2, 0x98, 0x9b, 0xe3, 0x74, 0x53, 0x0b, 0x03, 0x63, 0x59, 0x8e, 0xa6, 0xa0, 0x48, - 0xa2, 0x28, 0x8c, 0xc4, 0x59, 0x9b, 0x4d, 0xe3, 0x6b, 0x14, 0x80, 0x39, 0xdc, 0xfd, 0x51, 0x01, - 0x4a, 0xdd, 0x4e, 0x27, 0xe8, 0x77, 0xb4, 0x73, 0xb5, 0x38, 0x39, 0x89, 0x83, 0x5f, 0x78, 0x72, - 0x67, 0xa2, 0xec, 0x01, 0xb0, 0xcb, 0x09, 0x5b, 0x94, 0xe2, 0x6c, 0x03, 0x27, 0xbf, 0xa8, 0x9d, - 0xb0, 0x75, 0x12, 0x39, 0x1b, 0xfc, 0x96, 0xb9, 0xc1, 0xaf, 0xdb, 0xee, 0x94, 0xbe, 0xcd, 0xff, - 0x71, 0x11, 0xce, 0xc9, 0xd2, 0x32, 0xa1, 0x5b, 0xe5, 0x73, 0x6d, 0x12, 0xed, 0xa1, 0xef, 0x3b, - 0x70, 0xde, 0xcb, 0x9a, 0x6e, 0x7c, 0x72, 0x02, 0x03, 0xad, 0x71, 0x9d, 0x9e, 0xc9, 0xe1, 0xc8, - 0x07, 0xfa, 0xaa, 0x18, 0xe8, 0xf3, 0x79, 0x28, 0x5d, 0xec, 0xee, 0xb9, 0x1d, 0x40, 0xcf, 0xc0, - 0xa8, 0x84, 0x33, 0x73, 0x0f, 0x5f, 0xe2, 0xca, 0xb8, 0x3d, 0xa3, 0x95, 0x61, 0x03, 0x93, 0xd6, - 0x4c, 0x48, 0xb3, 0xd5, 0xf0, 0x12, 0xa2, 0x19, 0x8a, 0x54, 0xcd, 0x0d, 0xad, 0x0c, 0x1b, 0x98, - 0xe8, 0x31, 0x18, 0x08, 0xc2, 0x2a, 0x59, 0xaa, 0x0a, 0x03, 0xf1, 0xb8, 0xa8, 0x33, 0x70, 0x83, - 0x41, 0xb1, 0x28, 0x45, 0x8f, 0xa6, 0xd6, 0xb8, 0x22, 0x5b, 0x42, 0x23, 0x79, 0x96, 0x38, 0xf4, - 0x8f, 0x1c, 0x18, 0xa6, 0x35, 0x36, 0xf6, 0x5a, 0x84, 0xee, 0x6d, 0xf4, 0x8b, 0x54, 0x4f, 0xe6, - 0x8b, 0xdc, 0x90, 0x6c, 0x4c, 0x53, 0xc7, 0xb0, 0x82, 0xbf, 0xf1, 0xd6, 0xd4, 0x90, 0xfc, 0x81, - 0xd3, 0x56, 0x4d, 0x2e, 0xc2, 0xfd, 0x5d, 0xbf, 0xe6, 0x91, 0x5c, 0x01, 0x7f, 0x03, 0xc6, 0xcd, - 0x46, 0x1c, 0xc9, 0x0f, 0xf0, 0xcf, 0xb5, 0x65, 0xc7, 0xfb, 0x25, 0xe4, 0xd9, 0x3d, 0xd3, 0x66, - 0xd5, 0x64, 0x98, 0x17, 0x53, 0xcf, 0x9c, 0x0c, 0xf3, 0x62, 0x32, 0xcc, 0xbb, 0x7f, 0xe0, 0xa4, - 0x4b, 0x53, 0x53, 0xf3, 0xe8, 0xc6, 0xdc, 0x8e, 0x1a, 0x42, 0x10, 0xab, 0x8d, 0xf9, 0x26, 0x5e, - 0xc1, 0x14, 0x8e, 0xbe, 0xa8, 0x49, 0x47, 0x5a, 0xad, 0x2d, 0xdc, 0x1a, 0x96, 0x4c, 0xf4, 0x06, - 0xe1, 0x4e, 0xf9, 0x27, 0x0a, 0x70, 0xb6, 0x09, 0xee, 0x17, 0x0a, 0xf0, 0xd0, 0xa1, 0x4a, 0x6b, - 0x6e, 0xc3, 0x9d, 0x7b, 0xde, 0x70, 0xba, 0xad, 0x45, 0xa4, 0x15, 0xde, 0xc4, 0x2b, 0xe2, 0x7b, - 0xa9, 0x6d, 0x0d, 0x73, 0x30, 0x96, 0xe5, 0x54, 0x75, 0xd8, 0x26, 0x7b, 0x0b, 0x61, 0xd4, 0xf4, - 0x12, 0x21, 0x1d, 0x94, 0xea, 0xb0, 0x2c, 0x0b, 0x70, 0x8a, 0xe3, 0x7e, 0xdf, 0x81, 0x6c, 0x03, - 0x90, 0x07, 0xe3, 0xed, 0x98, 0x44, 0x74, 0x4b, 0x2d, 0x93, 0x4a, 0x44, 0xe4, 0xf4, 0x7c, 0x74, - 0x9a, 0x7b, 0xfb, 0x69, 0x0f, 0xa7, 0x2b, 0x61, 0x44, 0xa6, 0x77, 0x9e, 0x9a, 0xe6, 0x18, 0xcb, - 0x64, 0xaf, 0x4c, 0x1a, 0x84, 0xd2, 0x98, 0x45, 0x07, 0xfb, 0x53, 0xe3, 0x37, 0x0d, 0x02, 0x38, - 0x43, 0x90, 0xb2, 0x68, 0x79, 0x71, 0xbc, 0x1b, 0x46, 0x55, 0xc1, 0xa2, 0x70, 0x64, 0x16, 0xeb, - 0x06, 0x01, 0x9c, 0x21, 0xe8, 0x7e, 0x8f, 0x1e, 0x1f, 0x75, 0xad, 0x15, 0x7d, 0x9d, 0xea, 0x3e, - 0x14, 0x32, 0xdb, 0x08, 0x37, 0xe7, 0xc2, 0x20, 0xf1, 0xfc, 0x80, 0xc8, 0x60, 0x81, 0x0d, 0x4b, - 0x3a, 0xb2, 0x41, 0x3b, 0xb5, 0xe1, 0x77, 0x96, 0xe1, 0x9c, 0xb6, 0x50, 0x1d, 0x67, 0xb3, 0x11, - 0x6e, 0x66, 0xbd, 0x80, 0x14, 0x09, 0xb3, 0x12, 0xf7, 0x27, 0x0e, 0x5c, 0xea, 0xa2, 0x8c, 0xa3, - 0x2f, 0x3b, 0x30, 0xb6, 0xf9, 0x53, 0xd1, 0x37, 0xb3, 0x19, 0xe8, 0xbd, 0x30, 0x4e, 0x01, 0x74, - 0x27, 0x12, 0x73, 0xb3, 0x60, 0x7a, 0xa8, 0x66, 0x8d, 0x52, 0x9c, 0xc1, 0x76, 0x7f, 0xad, 0x00, - 0x39, 0x5c, 0xd0, 0x93, 0x30, 0x44, 0x82, 0x6a, 0x2b, 0xf4, 0x83, 0x44, 0x08, 0x23, 0x25, 0xf5, - 0xae, 0x09, 0x38, 0x56, 0x18, 0xe2, 0xfc, 0x21, 0x06, 0xa6, 0xd0, 0x71, 0xfe, 0x10, 0x2d, 0x4f, - 0x71, 0x50, 0x0d, 0x26, 0x3c, 0xee, 0x5f, 0x61, 0x73, 0x8f, 0x4d, 0xd3, 0xbe, 0xa3, 0x4c, 0xd3, - 0xf3, 0xcc, 0xfd, 0x99, 0x21, 0x81, 0x3b, 0x88, 0xa2, 0x77, 0xc3, 0x48, 0x3b, 0x26, 0xe5, 0xf9, - 0xe5, 0xb9, 0x88, 0x54, 0xf9, 0xa9, 0x58, 0xf3, 0xfb, 0xdd, 0x4c, 0x8b, 0xb0, 0x8e, 0xe7, 0xfe, - 0x4b, 0x07, 0x06, 0x67, 0xbd, 0xca, 0x76, 0xb8, 0xb5, 0x45, 0x87, 0xa2, 0xda, 0x8e, 0x52, 0xc3, - 0x96, 0x36, 0x14, 0xf3, 0x02, 0x8e, 0x15, 0x06, 0xda, 0x80, 0x01, 0xbe, 0xe0, 0xc5, 0xb2, 0xfb, - 0x79, 0xad, 0x3f, 0x2a, 0x8e, 0x87, 0x4d, 0x87, 0x76, 0xe2, 0x37, 0xa6, 0x79, 0x1c, 0xcf, 0xf4, - 0x52, 0x90, 0xac, 0x45, 0xe5, 0x24, 0xf2, 0x83, 0xda, 0x2c, 0xd0, 0xed, 0x62, 0x81, 0xd1, 0xc0, - 0x82, 0x16, 0xed, 0x46, 0xd3, 0xbb, 0x2d, 0xd9, 0x09, 0xf1, 0xa3, 0xba, 0xb1, 0x9a, 0x16, 0x61, - 0x1d, 0xcf, 0xfd, 0x43, 0x07, 0x86, 0x67, 0xbd, 0xd8, 0xaf, 0xfc, 0x05, 0x12, 0x3e, 0x1f, 0x84, - 0xe2, 0x9c, 0x57, 0xa9, 0x13, 0x74, 0x33, 0x7b, 0xe8, 0x1d, 0xb9, 0xfa, 0x78, 0x1e, 0x1b, 0x75, - 0x00, 0xd6, 0x39, 0x8d, 0x75, 0x3b, 0x1a, 0xbb, 0x6f, 0x39, 0x30, 0x3e, 0xd7, 0xf0, 0x49, 0x90, - 0xcc, 0x91, 0x28, 0x61, 0x03, 0x57, 0x83, 0x89, 0x8a, 0x82, 0x1c, 0x67, 0xe8, 0xd8, 0x6c, 0x9d, - 0xcb, 0x90, 0xc0, 0x1d, 0x44, 0x51, 0x15, 0xce, 0x70, 0x58, 0xba, 0x2a, 0x8e, 0x34, 0x7e, 0xcc, - 0x3a, 0x3a, 0x67, 0x52, 0xc0, 0x59, 0x92, 0xee, 0x8f, 0x1d, 0xb8, 0x34, 0xd7, 0x68, 0xc7, 0x09, - 0x89, 0x6e, 0x09, 0x69, 0x24, 0xd5, 0x5b, 0xf4, 0x61, 0x18, 0x6a, 0x4a, 0x8f, 0xad, 0x73, 0x97, - 0x09, 0xcc, 0xe4, 0x19, 0xc5, 0xa6, 0x8d, 0x59, 0xdb, 0x7c, 0x99, 0x54, 0x92, 0x55, 0x92, 0x78, - 0x69, 0x78, 0x41, 0x0a, 0xc3, 0x8a, 0x2a, 0x6a, 0x41, 0x7f, 0xdc, 0x22, 0x15, 0x7b, 0xd1, 0x5d, - 0xb2, 0x0f, 0xe5, 0x16, 0xa9, 0xa4, 0x72, 0x9d, 0xf9, 0x1a, 0x19, 0x27, 0xf7, 0x7f, 0x3b, 0xf0, - 0x40, 0x97, 0xfe, 0xae, 0xf8, 0x71, 0x82, 0x5e, 0xea, 0xe8, 0xf3, 0x74, 0x6f, 0x7d, 0xa6, 0xb5, - 0x59, 0x8f, 0x95, 0x40, 0x90, 0x10, 0xad, 0xbf, 0x1f, 0x85, 0xa2, 0x9f, 0x90, 0xa6, 0x34, 0x43, - 0x5b, 0x30, 0x18, 0x75, 0xe9, 0xcb, 0xec, 0x98, 0x8c, 0xf1, 0x5b, 0xa2, 0xfc, 0x30, 0x67, 0xeb, - 0x6e, 0xc3, 0xc0, 0x5c, 0xd8, 0x68, 0x37, 0x83, 0xde, 0x22, 0x65, 0x92, 0xbd, 0x16, 0xc9, 0xee, - 0x91, 0x4c, 0xfd, 0x67, 0x25, 0xd2, 0x70, 0xd4, 0x97, 0x6f, 0x38, 0x72, 0xff, 0x95, 0x03, 0x74, - 0x55, 0x55, 0x7d, 0xe1, 0x49, 0xe4, 0xe4, 0x38, 0xc3, 0x87, 0x74, 0x72, 0x77, 0xf6, 0xa7, 0xc6, - 0x14, 0xa2, 0x46, 0xff, 0x83, 0x30, 0x10, 0xb3, 0x23, 0xb9, 0x68, 0xc3, 0x82, 0xd4, 0x9f, 0xf9, - 0x41, 0xfd, 0xce, 0xfe, 0x54, 0x4f, 0x61, 0x9b, 0xd3, 0x8a, 0xb6, 0x70, 0x7a, 0x0a, 0xaa, 0x54, - 0xe1, 0x6b, 0x92, 0x38, 0xf6, 0x6a, 0xf2, 0x84, 0xa7, 0x14, 0xbe, 0x55, 0x0e, 0xc6, 0xb2, 0xdc, - 0xfd, 0x92, 0x03, 0x63, 0x6a, 0xf3, 0xa2, 0xea, 0x3b, 0xba, 0xa1, 0x6f, 0x73, 0x7c, 0xa6, 0x3c, - 0xd4, 0x45, 0xe2, 0x88, 0x8d, 0xfc, 0xf0, 0x5d, 0xf0, 0x5d, 0x30, 0x5a, 0x25, 0x2d, 0x12, 0x54, - 0x49, 0x50, 0xa1, 0xc7, 0x6f, 0x3a, 0x43, 0x86, 0x67, 0x27, 0xe8, 0x79, 0x73, 0x5e, 0x83, 0x63, - 0x03, 0xcb, 0xfd, 0x86, 0x03, 0xf7, 0x2b, 0x72, 0x65, 0x92, 0x60, 0x92, 0x44, 0x7b, 0x2a, 0x4c, - 0xf3, 0x68, 0xbb, 0xd5, 0x2d, 0xaa, 0xff, 0x26, 0x11, 0x67, 0x7e, 0xbc, 0xed, 0x6a, 0x84, 0x6b, - 0xcb, 0x8c, 0x08, 0x96, 0xd4, 0xdc, 0x5f, 0xed, 0x83, 0xf3, 0x7a, 0x23, 0x95, 0x80, 0xf9, 0x25, - 0x07, 0x40, 0x8d, 0x00, 0xdd, 0x90, 0xfb, 0xec, 0xf8, 0xae, 0x8c, 0x2f, 0x95, 0x8a, 0x20, 0x05, - 0x8e, 0xb1, 0xc6, 0x16, 0xbd, 0x00, 0xa3, 0x3b, 0x74, 0x51, 0x90, 0x55, 0xaa, 0x2e, 0xc4, 0xa5, - 0x3e, 0xd6, 0x8c, 0xa9, 0xbc, 0x8f, 0xf9, 0x7c, 0x8a, 0x97, 0x9a, 0x03, 0x34, 0x60, 0x8c, 0x0d, - 0x52, 0xf4, 0xa4, 0x33, 0x16, 0xe9, 0x9f, 0x44, 0xd8, 0xc4, 0x3f, 0x60, 0xb1, 0x8f, 0xd9, 0xaf, - 0x3e, 0x7b, 0xf6, 0x60, 0x7f, 0x6a, 0xcc, 0x00, 0x61, 0xb3, 0x11, 0xee, 0x0b, 0xc0, 0xc6, 0xc2, - 0x0f, 0xda, 0x64, 0x2d, 0x40, 0x8f, 0x48, 0x1b, 0x1d, 0xf7, 0xab, 0x28, 0xc9, 0xa1, 0xdb, 0xe9, - 0xe8, 0x59, 0x76, 0xcb, 0xf3, 0x1b, 0x2c, 0x7c, 0x91, 0x62, 0xa9, 0xb3, 0xec, 0x02, 0x83, 0x62, - 0x51, 0xea, 0x4e, 0xc3, 0xe0, 0x1c, 0xed, 0x3b, 0x89, 0x28, 0x5d, 0x3d, 0xea, 0x78, 0xcc, 0x88, - 0x3a, 0x96, 0xd1, 0xc5, 0x1b, 0x70, 0x61, 0x2e, 0x22, 0x5e, 0x42, 0xca, 0x4f, 0xcf, 0xb6, 0x2b, - 0xdb, 0x24, 0xe1, 0xa1, 0x5d, 0x31, 0x7a, 0x0f, 0x8c, 0x85, 0x6c, 0xcb, 0x58, 0x09, 0x2b, 0xdb, - 0x7e, 0x50, 0x13, 0x26, 0xd7, 0x0b, 0x82, 0xca, 0xd8, 0x9a, 0x5e, 0x88, 0x4d, 0x5c, 0xf7, 0x3f, - 0x16, 0x60, 0x74, 0x2e, 0x0a, 0x03, 0x29, 0x16, 0x4f, 0x61, 0x2b, 0x4b, 0x8c, 0xad, 0xcc, 0x82, - 0xbb, 0x53, 0x6f, 0x7f, 0xb7, 0xed, 0x0c, 0xbd, 0xa6, 0x44, 0x64, 0x9f, 0xad, 0x23, 0x88, 0xc1, - 0x97, 0xd1, 0x4e, 0x3f, 0xb6, 0x29, 0x40, 0xdd, 0xff, 0xe4, 0xc0, 0x84, 0x8e, 0x7e, 0x0a, 0x3b, - 0x68, 0x6c, 0xee, 0xa0, 0x37, 0xec, 0xf6, 0xb7, 0xcb, 0xb6, 0xf9, 0xd9, 0x01, 0xb3, 0x9f, 0xcc, - 0xd7, 0xfd, 0x15, 0x07, 0x46, 0x77, 0x35, 0x80, 0xe8, 0xac, 0x6d, 0x25, 0xe6, 0x1d, 0x52, 0xcc, - 0xe8, 0xd0, 0x3b, 0x99, 0xdf, 0xd8, 0x68, 0x09, 0x95, 0xfb, 0x71, 0xa5, 0x4e, 0xaa, 0xed, 0x86, - 0xdc, 0xbe, 0xd5, 0x90, 0x96, 0x05, 0x1c, 0x2b, 0x0c, 0xf4, 0x12, 0x9c, 0xad, 0x84, 0x41, 0xa5, - 0x1d, 0x45, 0x24, 0xa8, 0xec, 0xad, 0xb3, 0x3b, 0x12, 0x62, 0x43, 0x9c, 0x16, 0xd5, 0xce, 0xce, - 0x65, 0x11, 0xee, 0xe4, 0x01, 0x71, 0x27, 0x21, 0xee, 0x2c, 0x88, 0xe9, 0x96, 0x25, 0x0e, 0x5c, - 0x9a, 0xb3, 0x80, 0x81, 0xb1, 0x2c, 0x47, 0x37, 0xe1, 0x52, 0x9c, 0x78, 0x51, 0xe2, 0x07, 0xb5, - 0x79, 0xe2, 0x55, 0x1b, 0x7e, 0x40, 0x8f, 0x12, 0x61, 0x50, 0xe5, 0xae, 0xc4, 0xbe, 0xd9, 0x07, - 0x0e, 0xf6, 0xa7, 0x2e, 0x95, 0xf3, 0x51, 0x70, 0xb7, 0xba, 0xe8, 0x83, 0x30, 0x29, 0xdc, 0x11, - 0x5b, 0xed, 0xc6, 0xb3, 0xe1, 0x66, 0x7c, 0xdd, 0x8f, 0xe9, 0x39, 0x7e, 0xc5, 0x6f, 0xfa, 0x09, - 0x73, 0x18, 0x16, 0x67, 0x2f, 0x1f, 0xec, 0x4f, 0x4d, 0x96, 0xbb, 0x62, 0xe1, 0x43, 0x28, 0x20, - 0x0c, 0x17, 0xb9, 0xf0, 0xeb, 0xa0, 0x3d, 0xc8, 0x68, 0x4f, 0x1e, 0xec, 0x4f, 0x5d, 0x5c, 0xc8, - 0xc5, 0xc0, 0x5d, 0x6a, 0xd2, 0x2f, 0x98, 0xf8, 0x4d, 0xf2, 0x4a, 0x18, 0x10, 0x16, 0xa8, 0xa2, - 0x7d, 0xc1, 0x0d, 0x01, 0xc7, 0x0a, 0x03, 0xbd, 0x9c, 0xce, 0x44, 0xba, 0x5c, 0x44, 0xc0, 0xc9, - 0xd1, 0x25, 0x1c, 0x3b, 0x9a, 0xdc, 0xd2, 0x28, 0xb1, 0x48, 0x4a, 0x83, 0xb6, 0xfb, 0x47, 0x05, - 0x40, 0x9d, 0x22, 0x02, 0x2d, 0xc3, 0x80, 0x57, 0x49, 0xfc, 0x1d, 0x19, 0x99, 0xf7, 0x48, 0xde, - 0xf6, 0xc9, 0x59, 0x61, 0xb2, 0x45, 0xe8, 0x0c, 0x21, 0xa9, 0x5c, 0x99, 0x61, 0x55, 0xb1, 0x20, - 0x81, 0x42, 0x38, 0xdb, 0xf0, 0xe2, 0x44, 0xce, 0xd5, 0x2a, 0xed, 0xb2, 0x10, 0xac, 0x3f, 0xdb, - 0x5b, 0xa7, 0x68, 0x8d, 0xd9, 0x0b, 0x74, 0xe6, 0xae, 0x64, 0x09, 0xe1, 0x4e, 0xda, 0xe8, 0x63, - 0x4c, 0x0f, 0xe1, 0x4a, 0xa2, 0x54, 0x00, 0x96, 0xad, 0xec, 0xd1, 0x9c, 0xa6, 0xa1, 0x83, 0x08, - 0x36, 0x58, 0x63, 0xe9, 0xfe, 0x6b, 0x80, 0xc1, 0xf9, 0x99, 0xc5, 0x0d, 0x2f, 0xde, 0xee, 0x41, - 0x35, 0xa7, 0xb3, 0x43, 0xe8, 0x50, 0xd9, 0xf5, 0x2d, 0x75, 0x2b, 0xac, 0x30, 0x50, 0x00, 0x03, - 0x7e, 0x40, 0x17, 0x44, 0x69, 0xdc, 0x96, 0xf9, 0x5b, 0x1d, 0x33, 0x98, 0x7d, 0x62, 0x89, 0x51, - 0xc7, 0x82, 0x0b, 0x7a, 0x0d, 0x86, 0x3d, 0x79, 0xb3, 0x45, 0x6c, 0x4b, 0xcb, 0x36, 0xec, 0xba, - 0x82, 0xa4, 0x1e, 0x59, 0x23, 0x40, 0x38, 0x65, 0x88, 0x3e, 0xee, 0xc0, 0x88, 0xec, 0x3a, 0x26, - 0x5b, 0xc2, 0xe5, 0xba, 0x6a, 0xaf, 0xcf, 0x98, 0x6c, 0xf1, 0xb0, 0x0b, 0x0d, 0x80, 0x75, 0x96, - 0x1d, 0xaa, 0x7c, 0xb1, 0x17, 0x55, 0x1e, 0xed, 0xc2, 0xf0, 0xae, 0x9f, 0xd4, 0xd9, 0xc6, 0x23, - 0x5c, 0x3d, 0x0b, 0x6f, 0xbf, 0xd5, 0x94, 0x5c, 0x3a, 0x62, 0xb7, 0x24, 0x03, 0x9c, 0xf2, 0x42, - 0x57, 0x38, 0x63, 0x76, 0x33, 0x88, 0x89, 0xac, 0x61, 0xb3, 0x02, 0x2b, 0xc0, 0x29, 0x0e, 0x1d, - 0xe2, 0x51, 0xfa, 0xab, 0x4c, 0x3e, 0xd2, 0xa6, 0xeb, 0x58, 0x84, 0xd2, 0x59, 0x98, 0x57, 0x92, - 0x22, 0x1f, 0xac, 0x5b, 0x1a, 0x0f, 0x6c, 0x70, 0xa4, 0x6b, 0x64, 0xb7, 0x4e, 0x02, 0x11, 0xea, - 0xaf, 0xd6, 0xc8, 0xad, 0x3a, 0x09, 0x30, 0x2b, 0x41, 0xaf, 0xf1, 0xa3, 0x05, 0xd7, 0x71, 0x45, - 0x58, 0xdc, 0x8a, 0x1d, 0xb5, 0x9b, 0xd3, 0xe4, 0xd1, 0xf6, 0xe9, 0x6f, 0xac, 0xf1, 0xa3, 0xea, - 0x72, 0x18, 0x5c, 0xbb, 0xed, 0x27, 0xe2, 0x8e, 0x80, 0x92, 0x74, 0x6b, 0x0c, 0x8a, 0x45, 0x29, - 0x0f, 0x29, 0xa0, 0x93, 0x20, 0x66, 0x17, 0x02, 0x86, 0xf5, 0x90, 0x02, 0x06, 0xc6, 0xb2, 0x1c, - 0xfd, 0x43, 0x07, 0x8a, 0xf5, 0x30, 0xdc, 0x8e, 0x4b, 0x63, 0x6c, 0x72, 0x58, 0x50, 0xf5, 0x84, - 0xc4, 0x99, 0xbe, 0x4e, 0xc9, 0x9a, 0xb7, 0x9e, 0x8a, 0x0c, 0x76, 0x67, 0x7f, 0x6a, 0x7c, 0xc5, - 0xdf, 0x22, 0x95, 0xbd, 0x4a, 0x83, 0x30, 0xc8, 0x1b, 0x6f, 0x69, 0x90, 0x6b, 0x3b, 0x24, 0x48, - 0x30, 0x6f, 0xd5, 0xe4, 0x67, 0x1d, 0x80, 0x94, 0x50, 0x8e, 0xef, 0x8e, 0x98, 0xde, 0x6e, 0x0b, - 0xe7, 0x3c, 0xa3, 0x69, 0xba, 0x33, 0xf0, 0xdf, 0x38, 0x30, 0x42, 0x3b, 0x27, 0x45, 0xe0, 0x63, - 0x30, 0x90, 0x78, 0x51, 0x8d, 0x48, 0xfb, 0xb5, 0xfa, 0x1c, 0x1b, 0x0c, 0x8a, 0x45, 0x29, 0x0a, - 0xa0, 0x98, 0x78, 0xf1, 0xb6, 0xd4, 0x2e, 0x97, 0xac, 0x0d, 0x71, 0xaa, 0x58, 0xd2, 0x5f, 0x31, - 0xe6, 0x6c, 0xd0, 0xe3, 0x30, 0x44, 0x15, 0x80, 0x05, 0x2f, 0x96, 0x21, 0x25, 0xa3, 0x54, 0x88, - 0x2f, 0x08, 0x18, 0x56, 0xa5, 0xee, 0xaf, 0x15, 0xa0, 0x7f, 0x9e, 0x9f, 0x33, 0x06, 0xe2, 0xb0, - 0x1d, 0x55, 0x88, 0xd0, 0x37, 0x2d, 0xcc, 0x69, 0x4a, 0xb7, 0xcc, 0x68, 0x6a, 0x9a, 0x3e, 0xfb, - 0x8d, 0x05, 0x2f, 0x7a, 0x90, 0x1d, 0x4f, 0x22, 0x2f, 0x88, 0xb7, 0x98, 0xa7, 0xc0, 0x0f, 0x03, - 0x31, 0x44, 0x16, 0x66, 0xe1, 0x86, 0x41, 0xb7, 0x9c, 0x90, 0x56, 0xea, 0xb0, 0x30, 0xcb, 0x70, - 0xa6, 0x0d, 0xee, 0xaf, 0x3b, 0x00, 0x69, 0xeb, 0xd1, 0x67, 0x1c, 0x18, 0xf3, 0xf4, 0x50, 0x46, - 0x31, 0x46, 0x6b, 0xf6, 0xdc, 0x8a, 0x8c, 0x2c, 0x3f, 0x62, 0x1b, 0x20, 0x6c, 0x32, 0x76, 0xdf, - 0x0d, 0x45, 0xb6, 0x3a, 0x98, 0x2e, 0x2e, 0x4c, 0xb2, 0x59, 0x1b, 0x8c, 0x34, 0xd5, 0x62, 0x85, - 0xe1, 0xbe, 0x04, 0xe3, 0xd7, 0x6e, 0x93, 0x4a, 0x3b, 0x09, 0x23, 0x6e, 0x90, 0xee, 0x72, 0x75, - 0xc5, 0x39, 0xd6, 0xd5, 0x95, 0x6f, 0x3b, 0x30, 0xa2, 0xc5, 0xb5, 0xd1, 0x9d, 0xba, 0x36, 0x57, - 0xe6, 0xe7, 0x6e, 0x31, 0x54, 0xcb, 0x56, 0x22, 0xe7, 0x38, 0xc9, 0x74, 0x1b, 0x51, 0x20, 0x9c, - 0x32, 0xbc, 0x4b, 0xdc, 0x99, 0xfb, 0xfb, 0x0e, 0x5c, 0xc8, 0x0d, 0xc2, 0xbb, 0xc7, 0xcd, 0x36, - 0x7c, 0xbf, 0x85, 0x1e, 0x7c, 0xbf, 0xbf, 0xed, 0x40, 0x4a, 0x89, 0x8a, 0xa2, 0xcd, 0xb4, 0xe5, - 0x9a, 0x28, 0x12, 0x9c, 0x44, 0x29, 0x7a, 0x0d, 0x2e, 0x99, 0x5f, 0xf0, 0x98, 0x6e, 0x00, 0x7e, - 0x66, 0xca, 0xa7, 0x84, 0xbb, 0xb1, 0x70, 0xbf, 0xea, 0x40, 0x71, 0xd1, 0x6b, 0xd7, 0x48, 0x4f, - 0x56, 0x1c, 0x2a, 0xc7, 0x22, 0xe2, 0x35, 0x12, 0xa9, 0xa7, 0x0b, 0x39, 0x86, 0x05, 0x0c, 0xab, - 0x52, 0x34, 0x03, 0xc3, 0x61, 0x8b, 0x18, 0xae, 0xab, 0x47, 0xe4, 0xe8, 0xad, 0xc9, 0x02, 0xba, - 0xed, 0x30, 0xee, 0x0a, 0x82, 0xd3, 0x5a, 0xee, 0xf7, 0x8b, 0x30, 0xa2, 0x5d, 0xd7, 0xa0, 0xba, - 0x40, 0x44, 0x5a, 0x61, 0x56, 0x5f, 0xa6, 0x13, 0x06, 0xb3, 0x12, 0xba, 0x06, 0x23, 0xb2, 0xe3, - 0xc7, 0x5c, 0x6c, 0x19, 0x6b, 0x10, 0x0b, 0x38, 0x56, 0x18, 0x68, 0x0a, 0x8a, 0x55, 0xd2, 0x4a, - 0xea, 0xac, 0x79, 0xfd, 0x3c, 0x66, 0x6d, 0x9e, 0x02, 0x30, 0x87, 0x53, 0x84, 0x2d, 0x92, 0x54, - 0xea, 0xcc, 0x60, 0x29, 0x82, 0xda, 0x16, 0x28, 0x00, 0x73, 0x78, 0x8e, 0x73, 0xad, 0x78, 0xf2, - 0xce, 0xb5, 0x01, 0xcb, 0xce, 0x35, 0xd4, 0x82, 0x73, 0x71, 0x5c, 0x5f, 0x8f, 0xfc, 0x1d, 0x2f, - 0x21, 0xe9, 0xec, 0x1b, 0x3c, 0x0a, 0x9f, 0x4b, 0xec, 0x02, 0x75, 0xf9, 0x7a, 0x96, 0x0a, 0xce, - 0x23, 0x8d, 0xca, 0x70, 0xc1, 0x0f, 0x62, 0x52, 0x69, 0x47, 0x64, 0xa9, 0x16, 0x84, 0x11, 0xb9, - 0x1e, 0xc6, 0x94, 0x9c, 0xb8, 0xfe, 0xa9, 0xc2, 0x3c, 0x97, 0xf2, 0x90, 0x70, 0x7e, 0x5d, 0xb4, - 0x08, 0x67, 0xab, 0x7e, 0xec, 0x6d, 0x36, 0x48, 0xb9, 0xbd, 0xd9, 0x0c, 0xe9, 0xa1, 0x8f, 0x5f, + 0x22, 0x43, 0xda, 0x14, 0xce, 0x3c, 0x4a, 0x09, 0x23, 0x25, 0x92, 0xf0, 0x71, 0xc0, 0x1d, 0x01, + 0x1c, 0xc0, 0x5e, 0x1c, 0xcf, 0xa4, 0x68, 0x49, 0x83, 0xdd, 0xc6, 0xee, 0x10, 0xbb, 0x33, 0xab, + 0x99, 0x59, 0xe0, 0xc0, 0x0f, 0x49, 0xa1, 0xf5, 0x19, 0xcb, 0x56, 0x22, 0x4b, 0xb2, 0xa4, 0x24, + 0x55, 0x8a, 0x22, 0x25, 0x2c, 0xd9, 0x15, 0x97, 0xfd, 0x2b, 0x65, 0xff, 0x4b, 0xa5, 0x5c, 0x4a, + 0x39, 0x55, 0x91, 0xcb, 0x4a, 0x49, 0x3f, 0x6c, 0x30, 0x42, 0x12, 0x55, 0xe5, 0x43, 0x55, 0x89, + 0x2a, 0x76, 0xec, 0xcb, 0x47, 0xa5, 0xfa, 0x73, 0xba, 0x67, 0x67, 0x71, 0x0b, 0x5c, 0x03, 0xc7, + 0xb2, 0x7f, 0x01, 0xfb, 0xfa, 0xf5, 0x7b, 0xdd, 0x3d, 0xdd, 0xaf, 0x5f, 0xbf, 0xf7, 0xfa, 0x35, + 0xac, 0xd5, 0xfc, 0xa4, 0xde, 0xde, 0x98, 0xae, 0x84, 0xcd, 0x4b, 0x5e, 0x54, 0x0b, 0x5b, 0x51, + 0xf8, 0x32, 0xfb, 0xe7, 0x9d, 0x3b, 0x61, 0xb4, 0xb5, 0xd9, 0x08, 0x77, 0xe2, 0x4b, 0xdb, 0x4f, + 0x5f, 0x6a, 0x6d, 0xd5, 0x2e, 0x79, 0x2d, 0x3f, 0xbe, 0x24, 0xa1, 0x97, 0xb6, 0x9f, 0xf2, 0x1a, + 0xad, 0xba, 0xf7, 0xd4, 0xa5, 0x1a, 0x09, 0x48, 0xe4, 0x25, 0xa4, 0x3a, 0xdd, 0x8a, 0xc2, 0x24, + 0x44, 0x1f, 0x48, 0x29, 0x4e, 0x4b, 0x8a, 0xec, 0x9f, 0x0f, 0x2b, 0x8a, 0xd3, 0xdb, 0x4f, 0x4f, + 0xb7, 0xb6, 0x6a, 0xd3, 0x94, 0xe2, 0xb4, 0x84, 0x4e, 0x4b, 0x8a, 0x93, 0xef, 0xd4, 0xda, 0x54, + 0x0b, 0x6b, 0xe1, 0x25, 0x46, 0x78, 0xa3, 0xbd, 0xc9, 0x7e, 0xb1, 0x1f, 0xec, 0x3f, 0xce, 0x70, + 0xd2, 0xdd, 0x7a, 0x26, 0x9e, 0xf6, 0x43, 0xda, 0xbe, 0x4b, 0x95, 0x30, 0x22, 0x97, 0xb6, 0x3b, + 0x1a, 0x35, 0xf9, 0x0e, 0x0d, 0xa7, 0x15, 0x36, 0xfc, 0xca, 0x6e, 0x1e, 0xd6, 0xbb, 0x52, 0xac, + 0xa6, 0x57, 0xa9, 0xfb, 0x01, 0x89, 0x76, 0xd3, 0xae, 0x37, 0x49, 0xe2, 0xe5, 0xd5, 0xba, 0xd4, + 0xad, 0x56, 0xd4, 0x0e, 0x12, 0xbf, 0x49, 0x3a, 0x2a, 0xfc, 0xf5, 0x3b, 0x55, 0x88, 0x2b, 0x75, + 0xd2, 0xf4, 0x3a, 0xea, 0x3d, 0xdd, 0xad, 0x5e, 0x3b, 0xf1, 0x1b, 0x97, 0xfc, 0x20, 0x89, 0x93, + 0x28, 0x5b, 0xc9, 0xbd, 0x02, 0x03, 0x33, 0xcd, 0xb0, 0x1d, 0x24, 0xe8, 0xbd, 0x50, 0xdc, 0xf6, + 0x1a, 0x6d, 0x52, 0x72, 0x1e, 0x76, 0x1e, 0x1f, 0x9e, 0x7d, 0xf4, 0xbb, 0x7b, 0x53, 0xf7, 0xed, + 0xef, 0x4d, 0x15, 0x9f, 0xa7, 0xc0, 0xdb, 0x7b, 0x53, 0x67, 0x49, 0x50, 0x09, 0xab, 0x7e, 0x50, + 0xbb, 0xf4, 0x72, 0x1c, 0x06, 0xd3, 0xd7, 0xdb, 0xcd, 0x0d, 0x12, 0x61, 0x5e, 0xc7, 0xfd, 0xa3, + 0x02, 0x9c, 0x9a, 0x89, 0x2a, 0x75, 0x7f, 0x9b, 0x94, 0x13, 0x4a, 0xbf, 0xb6, 0x8b, 0xea, 0xd0, + 0x97, 0x78, 0x11, 0x23, 0x37, 0x72, 0x79, 0x65, 0xfa, 0x6e, 0xbf, 0xfb, 0xf4, 0xba, 0x17, 0x49, + 0xda, 0xb3, 0x83, 0xfb, 0x7b, 0x53, 0x7d, 0xeb, 0x5e, 0x84, 0x29, 0x0b, 0xd4, 0x80, 0xfe, 0x20, + 0x0c, 0x48, 0xa9, 0xc0, 0x58, 0x5d, 0xbf, 0x7b, 0x56, 0xd7, 0xc3, 0x40, 0xf5, 0x63, 0x76, 0x68, + 0x7f, 0x6f, 0xaa, 0x9f, 0x42, 0x30, 0xe3, 0x42, 0xfb, 0xf5, 0x8a, 0xdf, 0x2a, 0xf5, 0xd9, 0xea, + 0xd7, 0x8b, 0x7e, 0xcb, 0xec, 0xd7, 0x8b, 0x7e, 0x0b, 0x53, 0x16, 0xee, 0xe7, 0x0a, 0x30, 0x3c, + 0x13, 0xd5, 0xda, 0x4d, 0x12, 0x24, 0x31, 0xfa, 0x38, 0x40, 0xcb, 0x8b, 0xbc, 0x26, 0x49, 0x48, + 0x14, 0x97, 0x9c, 0x87, 0xfb, 0x1e, 0x1f, 0xb9, 0xbc, 0x74, 0xf7, 0xec, 0xd7, 0x24, 0xcd, 0x59, + 0x24, 0x3e, 0x39, 0x28, 0x50, 0x8c, 0x35, 0x96, 0xe8, 0x55, 0x18, 0xf6, 0xa2, 0xc4, 0xdf, 0xf4, + 0x2a, 0x49, 0x5c, 0x2a, 0x30, 0xfe, 0xcf, 0xde, 0x3d, 0xff, 0x19, 0x41, 0x72, 0xf6, 0xb4, 0x60, + 0x3f, 0x2c, 0x21, 0x31, 0x4e, 0xf9, 0xb9, 0xbf, 0xdb, 0x0f, 0x23, 0x33, 0x51, 0xb2, 0x38, 0x57, + 0x4e, 0xbc, 0xa4, 0x1d, 0xa3, 0x3f, 0x70, 0xe0, 0x4c, 0xcc, 0x87, 0xcd, 0x27, 0xf1, 0x5a, 0x14, + 0x56, 0x48, 0x1c, 0x93, 0xaa, 0x18, 0x97, 0x4d, 0x2b, 0xed, 0x92, 0xcc, 0xa6, 0xcb, 0x9d, 0x8c, + 0xae, 0x04, 0x49, 0xb4, 0x3b, 0xfb, 0x94, 0x68, 0xf3, 0x99, 0x1c, 0x8c, 0x37, 0xde, 0x9a, 0x42, + 0xb2, 0x2b, 0x94, 0x12, 0xff, 0xc4, 0x38, 0xaf, 0xd5, 0xe8, 0x6b, 0x0e, 0x8c, 0xb6, 0xc2, 0x6a, + 0x8c, 0x49, 0x25, 0x6c, 0xb7, 0x48, 0x55, 0x0c, 0xef, 0x87, 0xed, 0x76, 0x63, 0x4d, 0xe3, 0xc0, + 0xdb, 0x7f, 0x56, 0xb4, 0x7f, 0x54, 0x2f, 0xc2, 0x46, 0x53, 0xd0, 0x33, 0x30, 0x1a, 0x84, 0x49, + 0xb9, 0x45, 0x2a, 0xfe, 0xa6, 0x4f, 0xaa, 0x6c, 0xe2, 0x0f, 0xa5, 0x35, 0xaf, 0x6b, 0x65, 0xd8, + 0xc0, 0x9c, 0x5c, 0x80, 0x52, 0xb7, 0x91, 0x43, 0x13, 0xd0, 0xb7, 0x45, 0x76, 0xb9, 0xb0, 0xc1, + 0xf4, 0x5f, 0x74, 0x56, 0x0a, 0x20, 0xba, 0x8c, 0x87, 0x84, 0x64, 0x79, 0x4f, 0xe1, 0x19, 0x67, + 0xf2, 0xfd, 0x70, 0xba, 0xa3, 0xe9, 0x87, 0x21, 0xe0, 0x7e, 0x6f, 0x00, 0x86, 0xe4, 0xa7, 0x40, + 0x0f, 0x43, 0x7f, 0xe0, 0x35, 0xa5, 0x9c, 0x1b, 0x15, 0xfd, 0xe8, 0xbf, 0xee, 0x35, 0xe9, 0x0a, + 0xf7, 0x9a, 0x84, 0x62, 0xb4, 0xbc, 0xa4, 0xce, 0xe8, 0x68, 0x18, 0x6b, 0x5e, 0x52, 0xc7, 0xac, + 0x04, 0x3d, 0x08, 0xfd, 0xcd, 0xb0, 0x4a, 0xd8, 0x58, 0x14, 0xb9, 0x84, 0x58, 0x09, 0xab, 0x04, + 0x33, 0x28, 0xad, 0xbf, 0x19, 0x85, 0xcd, 0x52, 0xbf, 0x59, 0x7f, 0x21, 0x0a, 0x9b, 0x98, 0x95, + 0xa0, 0xaf, 0x3a, 0x30, 0x21, 0xe7, 0xf6, 0x72, 0x58, 0xf1, 0x12, 0x3f, 0x0c, 0x4a, 0x45, 0x26, + 0x51, 0xb0, 0xbd, 0x25, 0x25, 0x29, 0xcf, 0x96, 0x44, 0x13, 0x26, 0xb2, 0x25, 0xb8, 0xa3, 0x15, + 0xe8, 0x32, 0x40, 0xad, 0x11, 0x6e, 0x78, 0x0d, 0x3a, 0x20, 0xa5, 0x01, 0xd6, 0x05, 0x25, 0x19, + 0x16, 0x55, 0x09, 0xd6, 0xb0, 0xd0, 0x2d, 0x18, 0xf4, 0xb8, 0xf4, 0x2f, 0x0d, 0xb2, 0x4e, 0x3c, + 0x67, 0xa3, 0x13, 0xc6, 0x76, 0x32, 0x3b, 0xb2, 0xbf, 0x37, 0x35, 0x28, 0x80, 0x58, 0xb2, 0x43, + 0x4f, 0xc2, 0x50, 0xd8, 0xa2, 0xed, 0xf6, 0x1a, 0xa5, 0x21, 0x36, 0x31, 0x27, 0x44, 0x5b, 0x87, + 0x56, 0x05, 0x1c, 0x2b, 0x0c, 0xf4, 0x04, 0x0c, 0xc6, 0xed, 0x0d, 0xfa, 0x1d, 0x4b, 0xc3, 0xac, + 0x63, 0xa7, 0x04, 0xf2, 0x60, 0x99, 0x83, 0xb1, 0x2c, 0x47, 0xef, 0x86, 0x91, 0x88, 0x54, 0xda, + 0x51, 0x4c, 0xe8, 0x87, 0x2d, 0x01, 0xa3, 0x7d, 0x46, 0xa0, 0x8f, 0xe0, 0xb4, 0x08, 0xeb, 0x78, + 0xe8, 0x7d, 0x30, 0x4e, 0x3f, 0xf0, 0x95, 0x5b, 0xad, 0x88, 0xc4, 0x31, 0xfd, 0xaa, 0x23, 0x8c, + 0xd1, 0x79, 0x51, 0x73, 0x7c, 0xc1, 0x28, 0xc5, 0x19, 0x6c, 0xf4, 0x1a, 0x80, 0xa7, 0x64, 0x46, + 0x69, 0x94, 0x0d, 0xe6, 0xb2, 0xbd, 0x19, 0xb1, 0x38, 0x37, 0x3b, 0x4e, 0xbf, 0x63, 0xfa, 0x1b, + 0x6b, 0xfc, 0xe8, 0xf8, 0x54, 0x49, 0x83, 0x24, 0xa4, 0x5a, 0x1a, 0x63, 0x1d, 0x56, 0xe3, 0x33, + 0xcf, 0xc1, 0x58, 0x96, 0xbb, 0xff, 0xa0, 0x00, 0x1a, 0x15, 0x34, 0x0b, 0x43, 0x42, 0xae, 0x89, + 0x25, 0x39, 0xfb, 0x98, 0xfc, 0x0e, 0xf2, 0x0b, 0xde, 0xde, 0xcb, 0x95, 0x87, 0xaa, 0x1e, 0x7a, + 0x1d, 0x46, 0x5a, 0x61, 0x75, 0x85, 0x24, 0x5e, 0xd5, 0x4b, 0x3c, 0xb1, 0x9b, 0x5b, 0xd8, 0x61, + 0x24, 0xc5, 0xd9, 0x53, 0xf4, 0xd3, 0xad, 0xa5, 0x2c, 0xb0, 0xce, 0x0f, 0x3d, 0x0b, 0x28, 0x26, + 0xd1, 0xb6, 0x5f, 0x21, 0x33, 0x95, 0x0a, 0x55, 0x89, 0xd8, 0x02, 0xe8, 0x63, 0x9d, 0x99, 0x14, + 0x9d, 0x41, 0xe5, 0x0e, 0x0c, 0x9c, 0x53, 0xcb, 0xfd, 0x7e, 0x01, 0xc6, 0xb5, 0xbe, 0xb6, 0x48, + 0x05, 0xbd, 0xe9, 0xc0, 0x29, 0xb5, 0x9d, 0xcd, 0xee, 0x5e, 0xa7, 0xb3, 0x8a, 0x6f, 0x56, 0xc4, + 0xe6, 0xf7, 0xa5, 0xbc, 0xd4, 0x4f, 0xc1, 0x87, 0xcb, 0xfa, 0x0b, 0xa2, 0x0f, 0xa7, 0x32, 0xa5, + 0x38, 0xdb, 0xac, 0xc9, 0xaf, 0x38, 0x70, 0x36, 0x8f, 0x44, 0x8e, 0xcc, 0xad, 0xeb, 0x32, 0xd7, + 0xaa, 0xf0, 0xa2, 0x5c, 0x69, 0x67, 0x74, 0x39, 0xfe, 0xff, 0x0a, 0x30, 0xa1, 0x4f, 0x21, 0xa6, + 0x09, 0xfc, 0x4b, 0x07, 0xce, 0xc9, 0x1e, 0x60, 0x12, 0xb7, 0x1b, 0x99, 0xe1, 0x6d, 0x5a, 0x1d, + 0x5e, 0xbe, 0x93, 0xce, 0xe4, 0xf1, 0xe3, 0xc3, 0xfc, 0x90, 0x18, 0xe6, 0x73, 0xb9, 0x38, 0x38, + 0xbf, 0xa9, 0x93, 0xdf, 0x72, 0x60, 0xb2, 0x3b, 0xd1, 0x9c, 0x81, 0x6f, 0x99, 0x03, 0xff, 0xa2, + 0xbd, 0x4e, 0x72, 0xf6, 0x6c, 0xf8, 0x59, 0x67, 0xf5, 0x0f, 0xf0, 0x9b, 0x43, 0xd0, 0xb1, 0x87, + 0xa0, 0xa7, 0x60, 0x44, 0x88, 0xe3, 0xe5, 0xb0, 0x16, 0xb3, 0x46, 0x0e, 0xf1, 0xb5, 0x36, 0x93, + 0x82, 0xb1, 0x8e, 0x83, 0xaa, 0x50, 0x88, 0x9f, 0x16, 0x4d, 0xb7, 0x20, 0xde, 0xca, 0x4f, 0x2b, + 0x2d, 0x72, 0x60, 0x7f, 0x6f, 0xaa, 0x50, 0x7e, 0x1a, 0x17, 0xe2, 0xa7, 0xa9, 0xa6, 0x5e, 0xf3, + 0x13, 0x7b, 0x9a, 0xfa, 0xa2, 0x9f, 0x28, 0x3e, 0x4c, 0x53, 0x5f, 0xf4, 0x13, 0x4c, 0x59, 0xd0, + 0x13, 0x48, 0x3d, 0x49, 0x5a, 0x6c, 0xc7, 0xb7, 0x72, 0x02, 0xb9, 0xba, 0xbe, 0xbe, 0xa6, 0x78, + 0x31, 0xfd, 0x82, 0x42, 0x30, 0xe3, 0x82, 0x3e, 0xeb, 0xd0, 0x11, 0xe7, 0x85, 0x61, 0xb4, 0x2b, + 0x14, 0x87, 0x1b, 0xf6, 0xa6, 0x40, 0x18, 0xed, 0x2a, 0xe6, 0xe2, 0x43, 0xaa, 0x02, 0xac, 0xb3, + 0x66, 0x1d, 0xaf, 0x6e, 0xc6, 0x4c, 0x4f, 0xb0, 0xd3, 0xf1, 0xf9, 0x85, 0x72, 0xa6, 0xe3, 0xf3, + 0x0b, 0x65, 0xcc, 0xb8, 0xd0, 0x0f, 0x1a, 0x79, 0x3b, 0x42, 0xc7, 0xb0, 0xf0, 0x41, 0xb1, 0xb7, + 0x63, 0x7e, 0x50, 0xec, 0xed, 0x60, 0xca, 0x82, 0x72, 0x0a, 0xe3, 0x98, 0xa9, 0x14, 0x56, 0x38, + 0xad, 0x96, 0xcb, 0x26, 0xa7, 0xd5, 0x72, 0x19, 0x53, 0x16, 0x6c, 0x92, 0x56, 0x62, 0xa6, 0x8f, + 0xd8, 0x99, 0xa4, 0x73, 0x19, 0x4e, 0x8b, 0x73, 0x65, 0x4c, 0x59, 0x50, 0x91, 0xe1, 0xbd, 0xd2, + 0x8e, 0xb8, 0x32, 0x33, 0x72, 0x79, 0xd5, 0xc2, 0x7c, 0xa1, 0xe4, 0x14, 0xb7, 0xe1, 0xfd, 0xbd, + 0xa9, 0x22, 0x03, 0x61, 0xce, 0xc8, 0xfd, 0xfd, 0xbe, 0x54, 0x5c, 0x48, 0x79, 0x8e, 0xfe, 0x3e, + 0xdb, 0x08, 0x85, 0x2c, 0x10, 0xaa, 0xaf, 0x73, 0x6c, 0xaa, 0xef, 0x19, 0xbe, 0xe3, 0x19, 0xec, + 0x70, 0x96, 0x3f, 0xfa, 0xa2, 0xd3, 0x79, 0xb6, 0xf5, 0xec, 0xef, 0x65, 0xe9, 0xc6, 0xcc, 0xf7, + 0x8a, 0x03, 0x8f, 0xbc, 0x93, 0x9f, 0x75, 0x52, 0x25, 0x22, 0xee, 0xb6, 0x0f, 0x7c, 0xc4, 0xdc, + 0x07, 0x2c, 0x1e, 0xc8, 0x75, 0xb9, 0xff, 0x39, 0x07, 0xc6, 0x24, 0x9c, 0xaa, 0xc7, 0x31, 0xba, + 0x05, 0x43, 0xb2, 0xa5, 0xe2, 0xeb, 0xd9, 0xb4, 0x05, 0x28, 0x25, 0x5e, 0x35, 0x46, 0x71, 0x73, + 0xdf, 0x1c, 0x00, 0x94, 0xee, 0x55, 0xad, 0x30, 0xf6, 0x99, 0x24, 0x3a, 0xc2, 0x2e, 0x14, 0x68, + 0xbb, 0xd0, 0xf3, 0x36, 0x77, 0xa1, 0xb4, 0x59, 0xc6, 0x7e, 0xf4, 0xc5, 0x8c, 0xdc, 0xe6, 0x1b, + 0xd3, 0x87, 0x8f, 0x45, 0x6e, 0x6b, 0x4d, 0x38, 0x58, 0x82, 0x6f, 0x0b, 0x09, 0xce, 0xb7, 0xae, + 0x5f, 0xb0, 0x2b, 0xc1, 0xb5, 0x56, 0x64, 0x65, 0x79, 0xc4, 0x25, 0x2c, 0xdf, 0xbb, 0x6e, 0x5a, + 0x95, 0xb0, 0x1a, 0x57, 0x53, 0xd6, 0x46, 0x5c, 0xd6, 0x0e, 0xd8, 0xe2, 0xa9, 0xc9, 0xda, 0x2c, + 0x4f, 0x25, 0x75, 0x5f, 0x91, 0x52, 0x97, 0xef, 0x5a, 0x2f, 0x58, 0x96, 0xba, 0x1a, 0xdf, 0x4e, + 0xf9, 0xfb, 0x51, 0x38, 0xd7, 0x89, 0x87, 0xc9, 0x26, 0xba, 0x04, 0xc3, 0x95, 0x30, 0xd8, 0xf4, + 0x6b, 0x2b, 0x5e, 0x4b, 0x9c, 0xd7, 0x94, 0x2c, 0x9a, 0x93, 0x05, 0x38, 0xc5, 0x41, 0x0f, 0x71, + 0xc1, 0xc3, 0x2d, 0x22, 0x23, 0x02, 0xb5, 0x6f, 0x89, 0xec, 0x32, 0x29, 0xf4, 0x9e, 0xa1, 0xaf, + 0x7e, 0x63, 0xea, 0xbe, 0x4f, 0xfc, 0xf1, 0xc3, 0xf7, 0xb9, 0x7f, 0xd8, 0x07, 0x0f, 0xe4, 0xf2, + 0x14, 0xda, 0xfa, 0x6f, 0x1a, 0xda, 0xba, 0x56, 0x2e, 0xa4, 0xc8, 0x4d, 0x9b, 0x8a, 0xac, 0x46, + 0x3e, 0x4f, 0x2f, 0xd7, 0x8a, 0x71, 0x7e, 0xa3, 0xe8, 0x40, 0x05, 0x5e, 0x93, 0xc4, 0x2d, 0xaf, + 0x42, 0x44, 0xef, 0xd5, 0x40, 0x5d, 0x97, 0x05, 0x38, 0xc5, 0xe1, 0x47, 0xe8, 0x4d, 0xaf, 0xdd, + 0x48, 0x84, 0xa1, 0x4c, 0x3b, 0x42, 0x33, 0x30, 0x96, 0xe5, 0xe8, 0x1f, 0x3a, 0x80, 0x3a, 0xb9, + 0x8a, 0x85, 0xb8, 0x7e, 0x1c, 0xe3, 0x30, 0x7b, 0x7e, 0x5f, 0x3b, 0x84, 0x6b, 0x3d, 0xcd, 0x69, + 0x87, 0xf6, 0x4d, 0x3f, 0x96, 0xee, 0x43, 0xfc, 0x70, 0xd0, 0x83, 0x0d, 0x8d, 0x99, 0x5a, 0x2a, + 0x15, 0x12, 0xc7, 0xdc, 0x1c, 0xa7, 0x9b, 0x5a, 0x18, 0x18, 0xcb, 0x72, 0x34, 0x05, 0x45, 0x12, + 0x45, 0x61, 0x24, 0xce, 0xda, 0x6c, 0x1a, 0x5f, 0xa1, 0x00, 0xcc, 0xe1, 0xee, 0x8f, 0x0b, 0x50, + 0xea, 0x76, 0x3a, 0x41, 0xbf, 0xa3, 0x9d, 0xab, 0xc5, 0xc9, 0x49, 0x1c, 0xfc, 0xc2, 0xe3, 0x3b, + 0x13, 0x65, 0x0f, 0x80, 0x5d, 0x4e, 0xd8, 0xa2, 0x14, 0x67, 0x1b, 0x38, 0xf9, 0x25, 0xed, 0x84, + 0xad, 0x93, 0xc8, 0xd9, 0xe0, 0x37, 0xcd, 0x0d, 0x7e, 0xcd, 0x76, 0xa7, 0xf4, 0x6d, 0xfe, 0x4f, + 0x8a, 0x70, 0x46, 0x96, 0x96, 0x09, 0xdd, 0x2a, 0x9f, 0x6b, 0x93, 0x68, 0x17, 0xfd, 0xc0, 0x81, + 0xb3, 0x5e, 0xd6, 0x74, 0xe3, 0x93, 0x63, 0x18, 0x68, 0x8d, 0xeb, 0xf4, 0x4c, 0x0e, 0x47, 0x3e, + 0xd0, 0x97, 0xc5, 0x40, 0x9f, 0xcd, 0x43, 0xe9, 0x62, 0x77, 0xcf, 0xed, 0x00, 0x7a, 0x06, 0x46, + 0x25, 0x9c, 0x99, 0x7b, 0xf8, 0x12, 0x57, 0xc6, 0xed, 0x19, 0xad, 0x0c, 0x1b, 0x98, 0xb4, 0x66, + 0x42, 0x9a, 0xad, 0x86, 0x97, 0x10, 0xcd, 0x50, 0xa4, 0x6a, 0xae, 0x6b, 0x65, 0xd8, 0xc0, 0x44, + 0x8f, 0xc1, 0x40, 0x10, 0x56, 0xc9, 0xb5, 0xaa, 0x30, 0x10, 0x8f, 0x8b, 0x3a, 0x03, 0xd7, 0x19, + 0x14, 0x8b, 0x52, 0xf4, 0x68, 0x6a, 0x8d, 0x2b, 0xb2, 0x25, 0x34, 0x92, 0x67, 0x89, 0x43, 0xff, + 0xd8, 0x81, 0x61, 0x5a, 0x63, 0x7d, 0xb7, 0x45, 0xe8, 0xde, 0x46, 0xbf, 0x48, 0xf5, 0x78, 0xbe, + 0xc8, 0x75, 0xc9, 0xc6, 0x34, 0x75, 0x0c, 0x2b, 0xf8, 0x1b, 0x6f, 0x4d, 0x0d, 0xc9, 0x1f, 0x38, + 0x6d, 0xd5, 0xe4, 0x22, 0xdc, 0xdf, 0xf5, 0x6b, 0x1e, 0xca, 0x15, 0xf0, 0xb7, 0x60, 0xdc, 0x6c, + 0xc4, 0xa1, 0xfc, 0x00, 0xff, 0x42, 0x5b, 0x76, 0xbc, 0x5f, 0x42, 0x9e, 0xdd, 0x33, 0x6d, 0x56, + 0x4d, 0x86, 0x79, 0x31, 0xf5, 0xcc, 0xc9, 0x30, 0x2f, 0x26, 0xc3, 0xbc, 0xfb, 0x07, 0x4e, 0xba, + 0x34, 0x35, 0x35, 0x8f, 0x6e, 0xcc, 0xed, 0xa8, 0x21, 0x04, 0xb1, 0xda, 0x98, 0x6f, 0xe0, 0x65, + 0x4c, 0xe1, 0xe8, 0x4b, 0x9a, 0x74, 0xa4, 0xd5, 0xda, 0xc2, 0xad, 0x61, 0xc9, 0x44, 0x6f, 0x10, + 0xee, 0x94, 0x7f, 0xa2, 0x00, 0x67, 0x9b, 0xe0, 0x7e, 0xb1, 0x00, 0x0f, 0x1d, 0xa8, 0xb4, 0xe6, + 0x36, 0xdc, 0xb9, 0xe7, 0x0d, 0xa7, 0xdb, 0x5a, 0x44, 0x5a, 0xe1, 0x0d, 0xbc, 0x2c, 0xbe, 0x97, + 0xda, 0xd6, 0x30, 0x07, 0x63, 0x59, 0x4e, 0x55, 0x87, 0x2d, 0xb2, 0xbb, 0x10, 0x46, 0x4d, 0x2f, + 0x11, 0xd2, 0x41, 0xa9, 0x0e, 0x4b, 0xb2, 0x00, 0xa7, 0x38, 0xee, 0x0f, 0x1c, 0xc8, 0x36, 0x00, + 0x79, 0x30, 0xde, 0x8e, 0x49, 0x44, 0xb7, 0xd4, 0x32, 0xa9, 0x44, 0x44, 0x4e, 0xcf, 0x47, 0xa7, + 0xb9, 0xb7, 0x9f, 0xf6, 0x70, 0xba, 0x12, 0x46, 0x64, 0x7a, 0xfb, 0xa9, 0x69, 0x8e, 0xb1, 0x44, + 0x76, 0xcb, 0xa4, 0x41, 0x28, 0x8d, 0x59, 0xb4, 0xbf, 0x37, 0x35, 0x7e, 0xc3, 0x20, 0x80, 0x33, + 0x04, 0x29, 0x8b, 0x96, 0x17, 0xc7, 0x3b, 0x61, 0x54, 0x15, 0x2c, 0x0a, 0x87, 0x66, 0xb1, 0x66, + 0x10, 0xc0, 0x19, 0x82, 0xee, 0xf7, 0xe9, 0xf1, 0x51, 0xd7, 0x5a, 0xd1, 0x37, 0xa8, 0xee, 0x43, + 0x21, 0xb3, 0x8d, 0x70, 0x63, 0x2e, 0x0c, 0x12, 0xcf, 0x0f, 0x88, 0x0c, 0x16, 0x58, 0xb7, 0xa4, + 0x23, 0x1b, 0xb4, 0x53, 0x1b, 0x7e, 0x67, 0x19, 0xce, 0x69, 0x0b, 0xd5, 0x71, 0x36, 0x1a, 0xe1, + 0x46, 0xd6, 0x0b, 0x48, 0x91, 0x30, 0x2b, 0x71, 0x7f, 0xea, 0xc0, 0x85, 0x2e, 0xca, 0x38, 0xfa, + 0x8a, 0x03, 0x63, 0x1b, 0x6f, 0x8b, 0xbe, 0x99, 0xcd, 0x40, 0xef, 0x83, 0x71, 0x0a, 0xa0, 0x3b, + 0x91, 0x98, 0x9b, 0x05, 0xd3, 0x43, 0x35, 0x6b, 0x94, 0xe2, 0x0c, 0xb6, 0xfb, 0x6b, 0x05, 0xc8, + 0xe1, 0x82, 0x9e, 0x84, 0x21, 0x12, 0x54, 0x5b, 0xa1, 0x1f, 0x24, 0x42, 0x18, 0x29, 0xa9, 0x77, + 0x45, 0xc0, 0xb1, 0xc2, 0x10, 0xe7, 0x0f, 0x31, 0x30, 0x85, 0x8e, 0xf3, 0x87, 0x68, 0x79, 0x8a, + 0x83, 0x6a, 0x30, 0xe1, 0x71, 0xff, 0x0a, 0x9b, 0x7b, 0x6c, 0x9a, 0xf6, 0x1d, 0x66, 0x9a, 0x9e, + 0x65, 0xee, 0xcf, 0x0c, 0x09, 0xdc, 0x41, 0x14, 0xbd, 0x1b, 0x46, 0xda, 0x31, 0x29, 0xcf, 0x2f, + 0xcd, 0x45, 0xa4, 0xca, 0x4f, 0xc5, 0x9a, 0xdf, 0xef, 0x46, 0x5a, 0x84, 0x75, 0x3c, 0xf7, 0x5f, + 0x39, 0x30, 0x38, 0xeb, 0x55, 0xb6, 0xc2, 0xcd, 0x4d, 0x3a, 0x14, 0xd5, 0x76, 0x94, 0x1a, 0xb6, + 0xb4, 0xa1, 0x98, 0x17, 0x70, 0xac, 0x30, 0xd0, 0x3a, 0x0c, 0xf0, 0x05, 0x2f, 0x96, 0xdd, 0xcf, + 0x6b, 0xfd, 0x51, 0x71, 0x3c, 0x6c, 0x3a, 0xb4, 0x13, 0xbf, 0x31, 0xcd, 0xe3, 0x78, 0xa6, 0xaf, + 0x05, 0xc9, 0x6a, 0x54, 0x4e, 0x22, 0x3f, 0xa8, 0xcd, 0x02, 0xdd, 0x2e, 0x16, 0x18, 0x0d, 0x2c, + 0x68, 0xd1, 0x6e, 0x34, 0xbd, 0x5b, 0x92, 0x9d, 0x10, 0x3f, 0xaa, 0x1b, 0x2b, 0x69, 0x11, 0xd6, + 0xf1, 0xdc, 0x3f, 0x74, 0x60, 0x78, 0xd6, 0x8b, 0xfd, 0xca, 0x5f, 0x22, 0xe1, 0xf3, 0x21, 0x28, + 0xce, 0x79, 0x95, 0x3a, 0x41, 0x37, 0xb2, 0x87, 0xde, 0x91, 0xcb, 0x8f, 0xe7, 0xb1, 0x51, 0x07, + 0x60, 0x9d, 0xd3, 0x58, 0xb7, 0xa3, 0xb1, 0xfb, 0x96, 0x03, 0xe3, 0x73, 0x0d, 0x9f, 0x04, 0xc9, + 0x1c, 0x89, 0x12, 0x36, 0x70, 0x35, 0x98, 0xa8, 0x28, 0xc8, 0x51, 0x86, 0x8e, 0xcd, 0xd6, 0xb9, + 0x0c, 0x09, 0xdc, 0x41, 0x14, 0x55, 0xe1, 0x14, 0x87, 0xa5, 0xab, 0xe2, 0x50, 0xe3, 0xc7, 0xac, + 0xa3, 0x73, 0x26, 0x05, 0x9c, 0x25, 0xe9, 0xfe, 0xc4, 0x81, 0x0b, 0x73, 0x8d, 0x76, 0x9c, 0x90, + 0xe8, 0xa6, 0x90, 0x46, 0x52, 0xbd, 0x45, 0x1f, 0x81, 0xa1, 0xa6, 0xf4, 0xd8, 0x3a, 0x77, 0x98, + 0xc0, 0x4c, 0x9e, 0x51, 0x6c, 0xda, 0x98, 0xd5, 0x8d, 0x97, 0x49, 0x25, 0x59, 0x21, 0x89, 0x97, + 0x86, 0x17, 0xa4, 0x30, 0xac, 0xa8, 0xa2, 0x16, 0xf4, 0xc7, 0x2d, 0x52, 0xb1, 0x17, 0xdd, 0x25, + 0xfb, 0x50, 0x6e, 0x91, 0x4a, 0x2a, 0xd7, 0x99, 0xaf, 0x91, 0x71, 0x72, 0xff, 0xb7, 0x03, 0x0f, + 0x74, 0xe9, 0xef, 0xb2, 0x1f, 0x27, 0xe8, 0xa5, 0x8e, 0x3e, 0x4f, 0xf7, 0xd6, 0x67, 0x5a, 0x9b, + 0xf5, 0x58, 0x09, 0x04, 0x09, 0xd1, 0xfa, 0xfb, 0x31, 0x28, 0xfa, 0x09, 0x69, 0x4a, 0x33, 0xb4, + 0x05, 0x83, 0x51, 0x97, 0xbe, 0xcc, 0x8e, 0xc9, 0x18, 0xbf, 0x6b, 0x94, 0x1f, 0xe6, 0x6c, 0xdd, + 0x2d, 0x18, 0x98, 0x0b, 0x1b, 0xed, 0x66, 0xd0, 0x5b, 0xa4, 0x4c, 0xb2, 0xdb, 0x22, 0xd9, 0x3d, + 0x92, 0xa9, 0xff, 0xac, 0x44, 0x1a, 0x8e, 0xfa, 0xf2, 0x0d, 0x47, 0xee, 0xbf, 0x76, 0x80, 0xae, + 0xaa, 0xaa, 0x2f, 0x3c, 0x89, 0x9c, 0x1c, 0x67, 0xf8, 0x90, 0x4e, 0xee, 0xf6, 0xde, 0xd4, 0x98, + 0x42, 0xd4, 0xe8, 0x7f, 0x08, 0x06, 0x62, 0x76, 0x24, 0x17, 0x6d, 0x58, 0x90, 0xfa, 0x33, 0x3f, + 0xa8, 0xdf, 0xde, 0x9b, 0xea, 0x29, 0x6c, 0x73, 0x5a, 0xd1, 0x16, 0x4e, 0x4f, 0x41, 0x95, 0x2a, + 0x7c, 0x4d, 0x12, 0xc7, 0x5e, 0x4d, 0x9e, 0xf0, 0x94, 0xc2, 0xb7, 0xc2, 0xc1, 0x58, 0x96, 0xbb, + 0x5f, 0x76, 0x60, 0x4c, 0x6d, 0x5e, 0x54, 0x7d, 0x47, 0xd7, 0xf5, 0x6d, 0x8e, 0xcf, 0x94, 0x87, + 0xba, 0x48, 0x1c, 0xb1, 0x91, 0x1f, 0xbc, 0x0b, 0xbe, 0x0b, 0x46, 0xab, 0xa4, 0x45, 0x82, 0x2a, + 0x09, 0x2a, 0xf4, 0xf8, 0x4d, 0x67, 0xc8, 0xf0, 0xec, 0x04, 0x3d, 0x6f, 0xce, 0x6b, 0x70, 0x6c, + 0x60, 0xb9, 0xdf, 0x74, 0xe0, 0x7e, 0x45, 0xae, 0x4c, 0x12, 0x4c, 0x92, 0x68, 0x57, 0x85, 0x69, + 0x1e, 0x6e, 0xb7, 0xba, 0x49, 0xf5, 0xdf, 0x24, 0xe2, 0xcc, 0x8f, 0xb6, 0x5d, 0x8d, 0x70, 0x6d, + 0x99, 0x11, 0xc1, 0x92, 0x9a, 0xfb, 0xab, 0x7d, 0x70, 0x56, 0x6f, 0xa4, 0x12, 0x30, 0xbf, 0xe4, + 0x00, 0xa8, 0x11, 0xa0, 0x1b, 0x72, 0x9f, 0x1d, 0xdf, 0x95, 0xf1, 0xa5, 0x52, 0x11, 0xa4, 0xc0, + 0x31, 0xd6, 0xd8, 0xa2, 0x17, 0x60, 0x74, 0x9b, 0x2e, 0x0a, 0xb2, 0x42, 0xd5, 0x85, 0xb8, 0xd4, + 0xc7, 0x9a, 0x31, 0x95, 0xf7, 0x31, 0x9f, 0x4f, 0xf1, 0x52, 0x73, 0x80, 0x06, 0x8c, 0xb1, 0x41, + 0x8a, 0x9e, 0x74, 0xc6, 0x22, 0xfd, 0x93, 0x08, 0x9b, 0xf8, 0x07, 0x2d, 0xf6, 0x31, 0xfb, 0xd5, + 0x67, 0x4f, 0xef, 0xef, 0x4d, 0x8d, 0x19, 0x20, 0x6c, 0x36, 0xc2, 0x7d, 0x01, 0xd8, 0x58, 0xf8, + 0x41, 0x9b, 0xac, 0x06, 0xe8, 0x11, 0x69, 0xa3, 0xe3, 0x7e, 0x15, 0x25, 0x39, 0x74, 0x3b, 0x1d, + 0x3d, 0xcb, 0x6e, 0x7a, 0x7e, 0x83, 0x85, 0x2f, 0x52, 0x2c, 0x75, 0x96, 0x5d, 0x60, 0x50, 0x2c, + 0x4a, 0xdd, 0x69, 0x18, 0x9c, 0xa3, 0x7d, 0x27, 0x11, 0xa5, 0xab, 0x47, 0x1d, 0x8f, 0x19, 0x51, + 0xc7, 0x32, 0xba, 0x78, 0x1d, 0xce, 0xcd, 0x45, 0xc4, 0x4b, 0x48, 0xf9, 0xe9, 0xd9, 0x76, 0x65, + 0x8b, 0x24, 0x3c, 0xb4, 0x2b, 0x46, 0xef, 0x85, 0xb1, 0x90, 0x6d, 0x19, 0xcb, 0x61, 0x65, 0xcb, + 0x0f, 0x6a, 0xc2, 0xe4, 0x7a, 0x4e, 0x50, 0x19, 0x5b, 0xd5, 0x0b, 0xb1, 0x89, 0xeb, 0xfe, 0xc7, + 0x02, 0x8c, 0xce, 0x45, 0x61, 0x20, 0xc5, 0xe2, 0x09, 0x6c, 0x65, 0x89, 0xb1, 0x95, 0x59, 0x70, + 0x77, 0xea, 0xed, 0xef, 0xb6, 0x9d, 0xa1, 0xd7, 0x94, 0x88, 0xec, 0xb3, 0x75, 0x04, 0x31, 0xf8, + 0x32, 0xda, 0xe9, 0xc7, 0x36, 0x05, 0xa8, 0xfb, 0x9f, 0x1c, 0x98, 0xd0, 0xd1, 0x4f, 0x60, 0x07, + 0x8d, 0xcd, 0x1d, 0xf4, 0xba, 0xdd, 0xfe, 0x76, 0xd9, 0x36, 0x3f, 0x37, 0x60, 0xf6, 0x93, 0xf9, + 0xba, 0xbf, 0xea, 0xc0, 0xe8, 0x8e, 0x06, 0x10, 0x9d, 0xb5, 0xad, 0xc4, 0xbc, 0x43, 0x8a, 0x19, + 0x1d, 0x7a, 0x3b, 0xf3, 0x1b, 0x1b, 0x2d, 0xa1, 0x72, 0x3f, 0xae, 0xd4, 0x49, 0xb5, 0xdd, 0x90, + 0xdb, 0xb7, 0x1a, 0xd2, 0xb2, 0x80, 0x63, 0x85, 0x81, 0x5e, 0x82, 0xd3, 0x95, 0x30, 0xa8, 0xb4, + 0xa3, 0x88, 0x04, 0x95, 0xdd, 0x35, 0x76, 0x47, 0x42, 0x6c, 0x88, 0xd3, 0xa2, 0xda, 0xe9, 0xb9, + 0x2c, 0xc2, 0xed, 0x3c, 0x20, 0xee, 0x24, 0xc4, 0x9d, 0x05, 0x31, 0xdd, 0xb2, 0xc4, 0x81, 0x4b, + 0x73, 0x16, 0x30, 0x30, 0x96, 0xe5, 0xe8, 0x06, 0x5c, 0x88, 0x13, 0x2f, 0x4a, 0xfc, 0xa0, 0x36, + 0x4f, 0xbc, 0x6a, 0xc3, 0x0f, 0xe8, 0x51, 0x22, 0x0c, 0xaa, 0xdc, 0x95, 0xd8, 0x37, 0xfb, 0xc0, + 0xfe, 0xde, 0xd4, 0x85, 0x72, 0x3e, 0x0a, 0xee, 0x56, 0x17, 0x7d, 0x08, 0x26, 0x85, 0x3b, 0x62, + 0xb3, 0xdd, 0x78, 0x36, 0xdc, 0x88, 0xaf, 0xfa, 0x31, 0x3d, 0xc7, 0x2f, 0xfb, 0x4d, 0x3f, 0x61, + 0x0e, 0xc3, 0xe2, 0xec, 0xc5, 0xfd, 0xbd, 0xa9, 0xc9, 0x72, 0x57, 0x2c, 0x7c, 0x00, 0x05, 0x84, + 0xe1, 0x3c, 0x17, 0x7e, 0x1d, 0xb4, 0x07, 0x19, 0xed, 0xc9, 0xfd, 0xbd, 0xa9, 0xf3, 0x0b, 0xb9, + 0x18, 0xb8, 0x4b, 0x4d, 0xfa, 0x05, 0x13, 0xbf, 0x49, 0x5e, 0x09, 0x03, 0xc2, 0x02, 0x55, 0xb4, + 0x2f, 0xb8, 0x2e, 0xe0, 0x58, 0x61, 0xa0, 0x97, 0xd3, 0x99, 0x48, 0x97, 0x8b, 0x08, 0x38, 0x39, + 0xbc, 0x84, 0x63, 0x47, 0x93, 0x9b, 0x1a, 0x25, 0x16, 0x49, 0x69, 0xd0, 0x76, 0xff, 0xa8, 0x00, + 0xa8, 0x53, 0x44, 0xa0, 0x25, 0x18, 0xf0, 0x2a, 0x89, 0xbf, 0x2d, 0x23, 0xf3, 0x1e, 0xc9, 0xdb, + 0x3e, 0x39, 0x2b, 0x4c, 0x36, 0x09, 0x9d, 0x21, 0x24, 0x95, 0x2b, 0x33, 0xac, 0x2a, 0x16, 0x24, + 0x50, 0x08, 0xa7, 0x1b, 0x5e, 0x9c, 0xc8, 0xb9, 0x5a, 0xa5, 0x5d, 0x16, 0x82, 0xf5, 0x67, 0x7b, + 0xeb, 0x14, 0xad, 0x31, 0x7b, 0x8e, 0xce, 0xdc, 0xe5, 0x2c, 0x21, 0xdc, 0x49, 0x1b, 0x7d, 0x9c, + 0xe9, 0x21, 0x5c, 0x49, 0x94, 0x0a, 0xc0, 0x92, 0x95, 0x3d, 0x9a, 0xd3, 0x34, 0x74, 0x10, 0xc1, + 0x06, 0x6b, 0x2c, 0xdd, 0x7f, 0x03, 0x30, 0x38, 0x3f, 0xb3, 0xb8, 0xee, 0xc5, 0x5b, 0x3d, 0xa8, + 0xe6, 0x74, 0x76, 0x08, 0x1d, 0x2a, 0xbb, 0xbe, 0xa5, 0x6e, 0x85, 0x15, 0x06, 0x0a, 0x60, 0xc0, + 0x0f, 0xe8, 0x82, 0x28, 0x8d, 0xdb, 0x32, 0x7f, 0xab, 0x63, 0x06, 0xb3, 0x4f, 0x5c, 0x63, 0xd4, + 0xb1, 0xe0, 0x82, 0x5e, 0x83, 0x61, 0x4f, 0xde, 0x6c, 0x11, 0xdb, 0xd2, 0x92, 0x0d, 0xbb, 0xae, + 0x20, 0xa9, 0x47, 0xd6, 0x08, 0x10, 0x4e, 0x19, 0xa2, 0x4f, 0x38, 0x30, 0x22, 0xbb, 0x8e, 0xc9, + 0xa6, 0x70, 0xb9, 0xae, 0xd8, 0xeb, 0x33, 0x26, 0x9b, 0x3c, 0xec, 0x42, 0x03, 0x60, 0x9d, 0x65, + 0x87, 0x2a, 0x5f, 0xec, 0x45, 0x95, 0x47, 0x3b, 0x30, 0xbc, 0xe3, 0x27, 0x75, 0xb6, 0xf1, 0x08, + 0x57, 0xcf, 0xc2, 0xdd, 0xb7, 0x9a, 0x92, 0x4b, 0x47, 0xec, 0xa6, 0x64, 0x80, 0x53, 0x5e, 0xe8, + 0x12, 0x67, 0xcc, 0x6e, 0x06, 0x31, 0x91, 0x35, 0x6c, 0x56, 0x60, 0x05, 0x38, 0xc5, 0xa1, 0x43, + 0x3c, 0x4a, 0x7f, 0x95, 0xc9, 0x47, 0xdb, 0x74, 0x1d, 0x8b, 0x50, 0x3a, 0x0b, 0xf3, 0x4a, 0x52, + 0xe4, 0x83, 0x75, 0x53, 0xe3, 0x81, 0x0d, 0x8e, 0x74, 0x8d, 0xec, 0xd4, 0x49, 0x20, 0x42, 0xfd, + 0xd5, 0x1a, 0xb9, 0x59, 0x27, 0x01, 0x66, 0x25, 0xe8, 0x35, 0x7e, 0xb4, 0xe0, 0x3a, 0xae, 0x08, + 0x8b, 0x5b, 0xb6, 0xa3, 0x76, 0x73, 0x9a, 0x3c, 0xda, 0x3e, 0xfd, 0x8d, 0x35, 0x7e, 0x54, 0x5d, + 0x0e, 0x83, 0x2b, 0xb7, 0xfc, 0x44, 0xdc, 0x11, 0x50, 0x92, 0x6e, 0x95, 0x41, 0xb1, 0x28, 0xe5, + 0x21, 0x05, 0x74, 0x12, 0xc4, 0xec, 0x42, 0xc0, 0xb0, 0x1e, 0x52, 0xc0, 0xc0, 0x58, 0x96, 0xa3, + 0x7f, 0xe4, 0x40, 0xb1, 0x1e, 0x86, 0x5b, 0x71, 0x69, 0x8c, 0x4d, 0x0e, 0x0b, 0xaa, 0x9e, 0x90, + 0x38, 0xd3, 0x57, 0x29, 0x59, 0xf3, 0xd6, 0x53, 0x91, 0xc1, 0x6e, 0xef, 0x4d, 0x8d, 0x2f, 0xfb, + 0x9b, 0xa4, 0xb2, 0x5b, 0x69, 0x10, 0x06, 0x79, 0xe3, 0x2d, 0x0d, 0x72, 0x65, 0x9b, 0x04, 0x09, + 0xe6, 0xad, 0x9a, 0xfc, 0x9c, 0x03, 0x90, 0x12, 0xca, 0xf1, 0xdd, 0x11, 0xd3, 0xdb, 0x6d, 0xe1, + 0x9c, 0x67, 0x34, 0x4d, 0x77, 0x06, 0xfe, 0x5b, 0x07, 0x46, 0x68, 0xe7, 0xa4, 0x08, 0x7c, 0x0c, + 0x06, 0x12, 0x2f, 0xaa, 0x11, 0x69, 0xbf, 0x56, 0x9f, 0x63, 0x9d, 0x41, 0xb1, 0x28, 0x45, 0x01, + 0x14, 0x13, 0x2f, 0xde, 0x92, 0xda, 0xe5, 0x35, 0x6b, 0x43, 0x9c, 0x2a, 0x96, 0xf4, 0x57, 0x8c, + 0x39, 0x1b, 0xf4, 0x38, 0x0c, 0x51, 0x05, 0x60, 0xc1, 0x8b, 0x65, 0x48, 0xc9, 0x28, 0x15, 0xe2, + 0x0b, 0x02, 0x86, 0x55, 0xa9, 0xfb, 0x6b, 0x05, 0xe8, 0x9f, 0xe7, 0xe7, 0x8c, 0x81, 0x38, 0x6c, + 0x47, 0x15, 0x22, 0xf4, 0x4d, 0x0b, 0x73, 0x9a, 0xd2, 0x2d, 0x33, 0x9a, 0x9a, 0xa6, 0xcf, 0x7e, + 0x63, 0xc1, 0x8b, 0x1e, 0x64, 0xc7, 0x93, 0xc8, 0x0b, 0xe2, 0x4d, 0xe6, 0x29, 0xf0, 0xc3, 0x40, + 0x0c, 0x91, 0x85, 0x59, 0xb8, 0x6e, 0xd0, 0x2d, 0x27, 0xa4, 0x95, 0x3a, 0x2c, 0xcc, 0x32, 0x9c, + 0x69, 0x83, 0xfb, 0xeb, 0x0e, 0x40, 0xda, 0x7a, 0xf4, 0x59, 0x07, 0xc6, 0x3c, 0x3d, 0x94, 0x51, + 0x8c, 0xd1, 0xaa, 0x3d, 0xb7, 0x22, 0x23, 0xcb, 0x8f, 0xd8, 0x06, 0x08, 0x9b, 0x8c, 0xdd, 0x77, + 0x43, 0x91, 0xad, 0x0e, 0xa6, 0x8b, 0x0b, 0x93, 0x6c, 0xd6, 0x06, 0x23, 0x4d, 0xb5, 0x58, 0x61, + 0xb8, 0x2f, 0xc1, 0xf8, 0x95, 0x5b, 0xa4, 0xd2, 0x4e, 0xc2, 0x88, 0x1b, 0xa4, 0xbb, 0x5c, 0x5d, + 0x71, 0x8e, 0x74, 0x75, 0xe5, 0x3b, 0x0e, 0x8c, 0x68, 0x71, 0x6d, 0x74, 0xa7, 0xae, 0xcd, 0x95, + 0xf9, 0xb9, 0x5b, 0x0c, 0xd5, 0x92, 0x95, 0xc8, 0x39, 0x4e, 0x32, 0xdd, 0x46, 0x14, 0x08, 0xa7, + 0x0c, 0xef, 0x10, 0x77, 0xe6, 0xfe, 0xbe, 0x03, 0xe7, 0x72, 0x83, 0xf0, 0xee, 0x71, 0xb3, 0x0d, + 0xdf, 0x6f, 0xa1, 0x07, 0xdf, 0xef, 0x6f, 0x3b, 0x90, 0x52, 0xa2, 0xa2, 0x68, 0x23, 0x6d, 0xb9, + 0x26, 0x8a, 0x04, 0x27, 0x51, 0x8a, 0x5e, 0x83, 0x0b, 0xe6, 0x17, 0x3c, 0xa2, 0x1b, 0x80, 0x9f, + 0x99, 0xf2, 0x29, 0xe1, 0x6e, 0x2c, 0xdc, 0xaf, 0x39, 0x50, 0x5c, 0xf4, 0xda, 0x35, 0xd2, 0x93, + 0x15, 0x87, 0xca, 0xb1, 0x88, 0x78, 0x8d, 0x44, 0xea, 0xe9, 0x42, 0x8e, 0x61, 0x01, 0xc3, 0xaa, + 0x14, 0xcd, 0xc0, 0x70, 0xd8, 0x22, 0x86, 0xeb, 0xea, 0x11, 0x39, 0x7a, 0xab, 0xb2, 0x80, 0x6e, + 0x3b, 0x8c, 0xbb, 0x82, 0xe0, 0xb4, 0x96, 0xfb, 0x83, 0x22, 0x8c, 0x68, 0xd7, 0x35, 0xa8, 0x2e, + 0x10, 0x91, 0x56, 0x98, 0xd5, 0x97, 0xe9, 0x84, 0xc1, 0xac, 0x84, 0xae, 0xc1, 0x88, 0x6c, 0xfb, + 0x31, 0x17, 0x5b, 0xc6, 0x1a, 0xc4, 0x02, 0x8e, 0x15, 0x06, 0x9a, 0x82, 0x62, 0x95, 0xb4, 0x92, + 0x3a, 0x6b, 0x5e, 0x3f, 0x8f, 0x59, 0x9b, 0xa7, 0x00, 0xcc, 0xe1, 0x14, 0x61, 0x93, 0x24, 0x95, + 0x3a, 0x33, 0x58, 0x8a, 0xa0, 0xb6, 0x05, 0x0a, 0xc0, 0x1c, 0x9e, 0xe3, 0x5c, 0x2b, 0x1e, 0xbf, + 0x73, 0x6d, 0xc0, 0xb2, 0x73, 0x0d, 0xb5, 0xe0, 0x4c, 0x1c, 0xd7, 0xd7, 0x22, 0x7f, 0xdb, 0x4b, + 0x48, 0x3a, 0xfb, 0x06, 0x0f, 0xc3, 0xe7, 0x02, 0xbb, 0x40, 0x5d, 0xbe, 0x9a, 0xa5, 0x82, 0xf3, + 0x48, 0xa3, 0x32, 0x9c, 0xf3, 0x83, 0x98, 0x54, 0xda, 0x11, 0xb9, 0x56, 0x0b, 0xc2, 0x88, 0x5c, + 0x0d, 0x63, 0x4a, 0x4e, 0x5c, 0xff, 0x54, 0x61, 0x9e, 0xd7, 0xf2, 0x90, 0x70, 0x7e, 0x5d, 0xb4, + 0x08, 0xa7, 0xab, 0x7e, 0xec, 0x6d, 0x34, 0x48, 0xb9, 0xbd, 0xd1, 0x0c, 0xe9, 0xa1, 0x8f, 0x5f, 0xc9, 0x18, 0x9a, 0xbd, 0x5f, 0x9a, 0x37, 0xe6, 0xb3, 0x08, 0xb8, 0xb3, 0x0e, 0x7a, 0x06, 0x46, 0x63, 0x3f, 0xa8, 0x35, 0xc8, 0x6c, 0xe4, 0x05, 0x95, 0xba, 0xb8, 0x37, 0xaa, 0xcc, 0xc0, 0x65, - 0xad, 0x0c, 0x1b, 0x98, 0x6c, 0xcd, 0xf3, 0x3a, 0x19, 0x6d, 0x50, 0x60, 0x8b, 0x52, 0xf7, 0x07, + 0xad, 0x0c, 0x1b, 0x98, 0x6c, 0xcd, 0xf3, 0x3a, 0x19, 0x6d, 0x50, 0x60, 0x8b, 0x52, 0xf7, 0x87, 0x0e, 0x8c, 0xea, 0x21, 0xd6, 0x54, 0xd3, 0x86, 0xfa, 0xfc, 0x42, 0x99, 0xef, 0x05, 0xf6, 0x76, - 0xfc, 0xeb, 0x8a, 0x66, 0x7a, 0x32, 0x4d, 0x61, 0x58, 0xe3, 0xd9, 0xc3, 0x85, 0xe9, 0x47, 0xa0, - 0xb8, 0x15, 0x52, 0x85, 0xa4, 0xcf, 0xb4, 0x1f, 0x2f, 0x50, 0x20, 0xe6, 0x65, 0xee, 0xff, 0x74, - 0xe0, 0x62, 0x7e, 0xf4, 0xf8, 0x4f, 0x43, 0x27, 0xaf, 0x02, 0xd0, 0xae, 0x18, 0x42, 0x5d, 0x4b, - 0x99, 0x20, 0x4b, 0xb0, 0x86, 0xd5, 0x5b, 0xb7, 0xff, 0x94, 0x2a, 0xc5, 0x29, 0x9f, 0xcf, 0x39, - 0x30, 0x46, 0xd9, 0x2e, 0x47, 0x9b, 0x46, 0x6f, 0xd7, 0xec, 0xf4, 0x56, 0x91, 0x4d, 0xcd, 0xe4, - 0x06, 0x18, 0x9b, 0xcc, 0xd1, 0xcf, 0xc1, 0xb0, 0x57, 0xad, 0x46, 0x24, 0x8e, 0x95, 0xc3, 0x89, - 0xf9, 0xc2, 0x67, 0x24, 0x10, 0xa7, 0xe5, 0x54, 0x88, 0xd6, 0xab, 0x5b, 0x31, 0x95, 0x4b, 0x42, - 0x70, 0x2b, 0x21, 0x4a, 0x99, 0x50, 0x38, 0x56, 0x18, 0xee, 0xaf, 0xf4, 0x83, 0xc9, 0x1b, 0x55, - 0xe1, 0xcc, 0x76, 0xb4, 0x39, 0xc7, 0xfc, 0xf5, 0xc7, 0xf1, 0x9b, 0x33, 0x7f, 0xf6, 0xb2, 0x49, - 0x01, 0x67, 0x49, 0x0a, 0x2e, 0xcb, 0x64, 0x2f, 0xf1, 0x36, 0x8f, 0xed, 0x35, 0x5f, 0x36, 0x29, - 0xe0, 0x2c, 0x49, 0xf4, 0x6e, 0x18, 0xd9, 0x8e, 0x36, 0xa5, 0x88, 0xce, 0x86, 0x60, 0x2c, 0xa7, - 0x45, 0x58, 0xc7, 0xa3, 0x43, 0xb8, 0x1d, 0x6d, 0xd2, 0x5d, 0x51, 0x26, 0x10, 0x50, 0x43, 0xb8, - 0x2c, 0xe0, 0x58, 0x61, 0xa0, 0x16, 0xa0, 0x6d, 0x39, 0x7a, 0x2a, 0x3a, 0x41, 0xec, 0x24, 0xbd, - 0x07, 0x37, 0xb0, 0xb0, 0xf0, 0xe5, 0x0e, 0x3a, 0x38, 0x87, 0x36, 0x7a, 0x01, 0x2e, 0x6d, 0x47, - 0x9b, 0x42, 0x59, 0x58, 0x8f, 0xfc, 0xa0, 0xe2, 0xb7, 0x8c, 0x64, 0x01, 0x53, 0xa2, 0xb9, 0x97, - 0x96, 0xf3, 0xd1, 0x70, 0xb7, 0xfa, 0xee, 0xef, 0xf4, 0x03, 0xbb, 0xe6, 0x48, 0x65, 0x61, 0x93, - 0x24, 0xf5, 0xb0, 0x9a, 0xd5, 0x7f, 0x56, 0x19, 0x14, 0x8b, 0x52, 0x19, 0xfc, 0x58, 0xe8, 0x12, - 0xfc, 0xb8, 0x0b, 0x83, 0x75, 0xe2, 0x55, 0x49, 0x24, 0xcd, 0x75, 0x2b, 0x76, 0x2e, 0x66, 0x5e, - 0x67, 0x44, 0xd3, 0x63, 0x38, 0xff, 0x1d, 0x63, 0xc9, 0x0d, 0xfd, 0x02, 0x8c, 0x53, 0x45, 0x26, - 0x6c, 0x27, 0xd2, 0x36, 0xdd, 0xcf, 0x6c, 0xd3, 0x6c, 0x47, 0xdd, 0x30, 0x4a, 0x70, 0x06, 0x13, - 0xcd, 0xc3, 0x84, 0xb0, 0x23, 0x2b, 0x33, 0xa0, 0x18, 0x58, 0x95, 0xc5, 0xa1, 0x9c, 0x29, 0xc7, - 0x1d, 0x35, 0x58, 0xf0, 0x5a, 0x58, 0xe5, 0xae, 0x44, 0x3d, 0x78, 0x2d, 0xac, 0xee, 0x61, 0x56, - 0x82, 0x5e, 0x81, 0x21, 0xfa, 0x77, 0x21, 0x0a, 0x9b, 0xc2, 0x36, 0xb3, 0x6e, 0x67, 0x74, 0x28, - 0x0f, 0x71, 0x52, 0x64, 0x0a, 0xde, 0xac, 0xe0, 0x82, 0x15, 0x3f, 0x7a, 0x5e, 0x91, 0xfb, 0x70, - 0x79, 0xdb, 0x6f, 0x3d, 0x4f, 0x22, 0x7f, 0x6b, 0x8f, 0x29, 0x0d, 0x43, 0xe9, 0x79, 0x65, 0xa9, - 0x03, 0x03, 0xe7, 0xd4, 0x72, 0x3f, 0x57, 0x80, 0x51, 0xfd, 0xb6, 0xec, 0xdd, 0x22, 0x62, 0xe3, - 0x74, 0x52, 0xf0, 0xd3, 0xe9, 0x75, 0x0b, 0xdd, 0xbe, 0xdb, 0x84, 0xa8, 0x43, 0xbf, 0xd7, 0x16, - 0xda, 0xa2, 0x15, 0x23, 0x18, 0xeb, 0x71, 0x3b, 0xa9, 0xf3, 0x6b, 0x55, 0x2c, 0x56, 0x95, 0x71, - 0x70, 0x3f, 0xd9, 0x07, 0x43, 0xb2, 0x10, 0x7d, 0xc2, 0x01, 0x48, 0x63, 0x86, 0x84, 0x28, 0x5d, - 0xb7, 0x11, 0x50, 0xa2, 0x87, 0x3b, 0x69, 0x86, 0x6b, 0x05, 0xc7, 0x1a, 0x5f, 0x94, 0xc0, 0x40, - 0x48, 0x1b, 0x77, 0xd5, 0xde, 0x8d, 0xef, 0x35, 0xca, 0xf8, 0x2a, 0xe3, 0x9e, 0x9a, 0xcd, 0x18, - 0x0c, 0x0b, 0x5e, 0xf4, 0x04, 0xb8, 0x29, 0x43, 0xd9, 0xec, 0x99, 0x98, 0x55, 0x74, 0x5c, 0x7a, - 0xa0, 0x53, 0x20, 0x9c, 0x32, 0x74, 0x9f, 0x82, 0x71, 0x73, 0x31, 0xd0, 0x13, 0xc1, 0xe6, 0x5e, - 0x42, 0xb8, 0xbd, 0x61, 0x94, 0x9f, 0x08, 0x66, 0x29, 0x00, 0x73, 0xb8, 0xfb, 0x3d, 0xaa, 0x07, - 0x28, 0xf1, 0xd2, 0x83, 0x89, 0xff, 0x11, 0xdd, 0x58, 0xd6, 0xed, 0xd8, 0xf5, 0x31, 0x18, 0x66, - 0xff, 0xb0, 0x85, 0xde, 0x67, 0xcb, 0xf1, 0x9c, 0xb6, 0x53, 0x2c, 0x75, 0xa6, 0x13, 0x3c, 0x2f, - 0x19, 0xe1, 0x94, 0xa7, 0x1b, 0xc2, 0x44, 0x16, 0x1b, 0x7d, 0x00, 0x46, 0x63, 0xb9, 0xad, 0xa6, - 0x77, 0xbf, 0x7a, 0xdc, 0x7e, 0x99, 0xdd, 0xb7, 0xac, 0x55, 0xc7, 0x06, 0x31, 0x77, 0x0d, 0x06, - 0xac, 0x0e, 0xa1, 0xfb, 0x2d, 0x07, 0x86, 0x99, 0xe7, 0xad, 0x16, 0x79, 0xcd, 0xb4, 0x4a, 0xdf, - 0x21, 0xa3, 0x1e, 0xc3, 0x20, 0x3f, 0xa3, 0xcb, 0x88, 0x15, 0x0b, 0x52, 0x86, 0x27, 0x6a, 0x4b, - 0xa5, 0x0c, 0x37, 0x06, 0xc4, 0x58, 0x72, 0x72, 0x3f, 0x55, 0x80, 0x81, 0xa5, 0xa0, 0xd5, 0xfe, - 0x4b, 0x9f, 0x2c, 0x6c, 0x15, 0xfa, 0x97, 0x12, 0xd2, 0x34, 0x73, 0xda, 0x8d, 0xce, 0x3e, 0xaa, - 0xe7, 0xb3, 0x2b, 0x99, 0xf9, 0xec, 0xb0, 0xb7, 0x2b, 0x03, 0xba, 0x84, 0x8d, 0x38, 0xbd, 0xff, - 0xf6, 0x24, 0x0c, 0xaf, 0x78, 0x9b, 0xa4, 0xb1, 0x4c, 0xf6, 0xd8, 0x6d, 0x35, 0x1e, 0x5c, 0xe0, - 0xa4, 0x07, 0x7b, 0x23, 0x10, 0x60, 0x1e, 0xc6, 0x19, 0xb6, 0x5a, 0x0c, 0xf4, 0xe4, 0x40, 0xd2, - 0x84, 0x40, 0x8e, 0x79, 0x72, 0xd0, 0x92, 0x01, 0x69, 0x58, 0xee, 0x34, 0x8c, 0xa4, 0x54, 0x7a, - 0xe0, 0xfa, 0x93, 0x02, 0x8c, 0x19, 0xa6, 0x6e, 0xc3, 0x01, 0xe8, 0xdc, 0xd5, 0x01, 0x68, 0x38, - 0xe4, 0x0a, 0xf7, 0xda, 0x21, 0xd7, 0x77, 0xfa, 0x0e, 0x39, 0xf3, 0x23, 0xf5, 0xf7, 0xf4, 0x91, - 0x1a, 0xd0, 0xbf, 0xe2, 0x07, 0xdb, 0xbd, 0xc9, 0x99, 0xb8, 0x12, 0xb6, 0x3a, 0xe4, 0x4c, 0x99, - 0x02, 0x31, 0x2f, 0x93, 0x9a, 0x4b, 0x5f, 0xbe, 0xe6, 0xe2, 0x7e, 0xc2, 0x81, 0xd1, 0x55, 0x2f, - 0xf0, 0xb7, 0x48, 0x9c, 0xb0, 0x79, 0x95, 0x9c, 0xe8, 0xad, 0xa5, 0xd1, 0x2e, 0xf7, 0xef, 0xdf, - 0x70, 0xe0, 0xec, 0x2a, 0x69, 0x86, 0xfe, 0x2b, 0x5e, 0x1a, 0x2f, 0x49, 0xdb, 0x5e, 0xf7, 0x13, - 0x11, 0x1e, 0xa6, 0xda, 0x7e, 0xdd, 0x4f, 0x30, 0x85, 0xdf, 0xc5, 0x8e, 0xcb, 0xee, 0x03, 0xd0, - 0x03, 0x9a, 0x76, 0x93, 0x2e, 0x8d, 0x84, 0x94, 0x05, 0x38, 0xc5, 0x71, 0x7f, 0xd7, 0x81, 0x41, - 0xde, 0x08, 0x15, 0x62, 0xea, 0x74, 0xa1, 0x5d, 0x87, 0x22, 0xab, 0x27, 0x66, 0xf5, 0xa2, 0x05, - 0xf5, 0x87, 0x92, 0xe3, 0x6b, 0x90, 0xfd, 0x8b, 0x39, 0x03, 0x76, 0x6c, 0xf1, 0x6e, 0xcf, 0xa8, - 0x50, 0xd1, 0xf4, 0xd8, 0xc2, 0xa0, 0x58, 0x94, 0xba, 0x5f, 0xeb, 0x83, 0x21, 0x95, 0x76, 0x8a, - 0x25, 0x05, 0x08, 0x82, 0x30, 0xf1, 0x78, 0x60, 0x01, 0x97, 0xd5, 0x1f, 0xb0, 0x97, 0xf6, 0x6a, - 0x7a, 0x26, 0xa5, 0xce, 0xfd, 0x77, 0xea, 0x10, 0xaa, 0x95, 0x60, 0xbd, 0x11, 0xe8, 0xa3, 0x30, - 0xd0, 0xa0, 0xd2, 0x47, 0x8a, 0xee, 0xe7, 0x2d, 0x36, 0x87, 0x89, 0x35, 0xd1, 0x12, 0x35, 0x42, - 0x1c, 0x88, 0x05, 0xd7, 0xc9, 0xf7, 0xc2, 0x44, 0xb6, 0xd5, 0x77, 0xbb, 0xe8, 0x37, 0xac, 0x5f, - 0x13, 0xfc, 0xeb, 0x42, 0x7a, 0x1e, 0xbd, 0xaa, 0xfb, 0x1c, 0x8c, 0xac, 0x92, 0x24, 0xf2, 0x2b, - 0x8c, 0xc0, 0xdd, 0x26, 0x57, 0x4f, 0xfa, 0xc3, 0xa7, 0xd9, 0x64, 0xa5, 0x34, 0x63, 0xf4, 0x1a, - 0x40, 0x2b, 0x0a, 0xe9, 0xf9, 0x95, 0xb4, 0xe5, 0xc7, 0xb6, 0xa0, 0x0f, 0xaf, 0x2b, 0x9a, 0xdc, - 0xe5, 0x9c, 0xfe, 0xc6, 0x1a, 0x3f, 0xf7, 0x45, 0x28, 0xae, 0xb6, 0x13, 0x72, 0xbb, 0x07, 0x89, - 0x75, 0xd4, 0x9b, 0xef, 0xee, 0x07, 0x60, 0x94, 0xd1, 0xbe, 0x1e, 0x36, 0xe8, 0xb6, 0x4a, 0x87, - 0xa6, 0x49, 0x7f, 0x67, 0x9d, 0x02, 0x0c, 0x09, 0xf3, 0x32, 0xba, 0x64, 0xea, 0x61, 0xa3, 0xaa, - 0x6e, 0x01, 0xa9, 0x09, 0x71, 0x9d, 0x41, 0xb1, 0x28, 0x75, 0x7f, 0xa9, 0x00, 0x23, 0xac, 0xa2, - 0x10, 0x37, 0x7b, 0x30, 0x58, 0xe7, 0x7c, 0xc4, 0x18, 0x5a, 0x08, 0xa9, 0xd3, 0x5b, 0xaf, 0x9d, - 0xe5, 0x38, 0x00, 0x4b, 0x7e, 0x94, 0xf5, 0xae, 0xe7, 0x27, 0x94, 0x75, 0xe1, 0x64, 0x59, 0xdf, - 0xe2, 0x6c, 0xb0, 0xe4, 0xe7, 0x7e, 0xa9, 0x00, 0xc0, 0xb2, 0x88, 0xf1, 0x5b, 0xab, 0x3f, 0x0f, - 0xc5, 0x56, 0xdd, 0x8b, 0xb3, 0x9e, 0xbe, 0xe2, 0x3a, 0x05, 0xde, 0x11, 0xf7, 0x72, 0xd9, 0x0f, - 0xcc, 0x11, 0xf5, 0x68, 0xf6, 0xc2, 0xe1, 0xd1, 0xec, 0xa8, 0x05, 0x83, 0x61, 0x3b, 0xa1, 0xca, - 0xa4, 0xd8, 0x8d, 0x2d, 0x38, 0xba, 0xd7, 0x38, 0x41, 0x1e, 0x02, 0x2e, 0x7e, 0x60, 0xc9, 0x06, - 0x3d, 0x03, 0x43, 0xad, 0x28, 0xac, 0xd1, 0xcd, 0x55, 0xec, 0xbf, 0x0f, 0x4a, 0x85, 0x65, 0x5d, - 0xc0, 0xef, 0x68, 0xff, 0x63, 0x85, 0xed, 0xfe, 0xe8, 0x0c, 0x1f, 0x17, 0x31, 0x39, 0x26, 0xa1, - 0xe0, 0x4b, 0xd3, 0x11, 0x08, 0x12, 0x85, 0xa5, 0x79, 0x5c, 0xf0, 0xab, 0x6a, 0xe2, 0x17, 0xba, - 0x4e, 0xfc, 0x77, 0xc3, 0x48, 0xd5, 0x8f, 0x5b, 0x0d, 0x6f, 0xef, 0x46, 0x8e, 0xdd, 0x6e, 0x3e, - 0x2d, 0xc2, 0x3a, 0x1e, 0x7a, 0x52, 0xdc, 0x5d, 0xe8, 0x37, 0x6c, 0x35, 0xf2, 0xee, 0x42, 0x7a, - 0x2b, 0x9a, 0x5f, 0x5b, 0xc8, 0xde, 0x1e, 0x2f, 0xf6, 0x7c, 0x7b, 0x3c, 0xab, 0x2a, 0x0d, 0x9c, - 0xbe, 0xaa, 0xf4, 0x1e, 0x18, 0x93, 0x3f, 0x99, 0xfe, 0x52, 0x3a, 0xcf, 0x5a, 0xaf, 0xec, 0xc9, - 0x1b, 0x7a, 0x21, 0x36, 0x71, 0xd3, 0x49, 0x3b, 0xd8, 0xeb, 0xa4, 0xbd, 0x0a, 0xb0, 0x19, 0xb6, - 0x83, 0xaa, 0x17, 0xed, 0x2d, 0xcd, 0x8b, 0x48, 0x47, 0xa5, 0x99, 0xcd, 0xaa, 0x12, 0xac, 0x61, - 0xe9, 0x13, 0x7d, 0xf8, 0x2e, 0x13, 0xfd, 0x03, 0x30, 0xcc, 0xa2, 0x42, 0x49, 0x75, 0x26, 0x11, - 0x31, 0x40, 0x47, 0x09, 0x20, 0x54, 0x42, 0xb1, 0x2c, 0x89, 0xe0, 0x94, 0x1e, 0xfa, 0x20, 0xc0, - 0x96, 0x1f, 0xf8, 0x71, 0x9d, 0x51, 0x1f, 0x39, 0x32, 0x75, 0xd5, 0xcf, 0x05, 0x45, 0x05, 0x6b, - 0x14, 0xd1, 0x4b, 0x70, 0x96, 0xc4, 0x89, 0xdf, 0xf4, 0x12, 0x52, 0x55, 0xb7, 0xfd, 0x4a, 0xcc, - 0xd8, 0xa8, 0xe2, 0x72, 0xaf, 0x65, 0x11, 0xee, 0xe4, 0x01, 0x71, 0x27, 0x21, 0x63, 0x45, 0x4e, - 0x1e, 0x65, 0x45, 0xa2, 0x3f, 0x73, 0xe0, 0x6c, 0x44, 0x78, 0x60, 0x48, 0xac, 0x1a, 0x76, 0x81, - 0xc9, 0xcb, 0x8a, 0x8d, 0x04, 0xdd, 0x2a, 0x13, 0x07, 0xce, 0x72, 0xe1, 0x9a, 0x05, 0x91, 0xbd, - 0xef, 0x28, 0xbf, 0x93, 0x07, 0x7c, 0xe3, 0xad, 0xa9, 0xa9, 0xce, 0x44, 0xf1, 0x8a, 0x38, 0x5d, - 0x79, 0x7f, 0xe7, 0xad, 0xa9, 0x09, 0xf9, 0x3b, 0x1d, 0xb4, 0x8e, 0x4e, 0xd2, 0x7d, 0xaf, 0x15, - 0x56, 0x97, 0xd6, 0x45, 0xb0, 0x96, 0xda, 0xf7, 0xd6, 0x29, 0x10, 0xf3, 0x32, 0xf4, 0x38, 0x0c, - 0x55, 0x3d, 0xd2, 0x0c, 0x03, 0x95, 0x6a, 0x95, 0xa9, 0xdb, 0xf3, 0x02, 0x86, 0x55, 0x29, 0x6a, - 0xc0, 0x80, 0xcf, 0xce, 0xf4, 0x22, 0x32, 0xd3, 0x82, 0x21, 0x81, 0xdb, 0x08, 0x64, 0x5c, 0x26, - 0x13, 0xc2, 0x82, 0x87, 0x2e, 0xf5, 0xcf, 0x9c, 0x8e, 0xd4, 0x7f, 0x1c, 0x86, 0x2a, 0x75, 0xbf, - 0x51, 0x8d, 0x48, 0x50, 0x9a, 0x60, 0x87, 0x5b, 0x36, 0x12, 0x73, 0x02, 0x86, 0x55, 0x29, 0xfa, - 0x6b, 0x30, 0x16, 0xb6, 0x13, 0xb6, 0xc8, 0xe9, 0xf7, 0x8f, 0x4b, 0x67, 0x19, 0x3a, 0x8b, 0xb3, - 0x59, 0xd3, 0x0b, 0xb0, 0x89, 0x47, 0x85, 0x6d, 0x3d, 0x8c, 0x59, 0xfa, 0x16, 0x26, 0x6c, 0x2f, - 0x9a, 0xc2, 0xf6, 0xba, 0x56, 0x86, 0x0d, 0x4c, 0xf4, 0x15, 0x07, 0xce, 0x36, 0xb3, 0x67, 0x9d, - 0xd2, 0x25, 0x36, 0x32, 0x65, 0x1b, 0x3a, 0x71, 0x86, 0x34, 0x0f, 0x47, 0xee, 0x00, 0xe3, 0xce, - 0x46, 0xb0, 0x44, 0x4a, 0xf1, 0x5e, 0x50, 0xa9, 0x47, 0x61, 0x60, 0x36, 0xef, 0x7e, 0x5b, 0xd7, - 0x87, 0xd8, 0x2a, 0xcb, 0x63, 0x31, 0x7b, 0xff, 0xc1, 0xfe, 0xd4, 0x85, 0xdc, 0x22, 0x9c, 0xdf, - 0xa8, 0xc9, 0x79, 0xb8, 0x98, 0xbf, 0x52, 0xef, 0xa6, 0x9c, 0xf7, 0xe9, 0xca, 0xf9, 0x02, 0xdc, - 0xdf, 0xb5, 0x51, 0x54, 0xe6, 0x4b, 0xc5, 0xcc, 0x31, 0x65, 0x7e, 0x87, 0x22, 0x35, 0x0e, 0xa3, - 0x7a, 0x8e, 0x7f, 0xf7, 0xff, 0xf6, 0x01, 0xa4, 0x26, 0x65, 0xe4, 0xc1, 0x38, 0x37, 0x5f, 0x2f, - 0xcd, 0x1f, 0xfb, 0xe2, 0xf3, 0x9c, 0x41, 0x00, 0x67, 0x08, 0xa2, 0x26, 0x20, 0x0e, 0xe1, 0xbf, - 0x8f, 0xe3, 0x86, 0x64, 0x5e, 0xbb, 0xb9, 0x0e, 0x22, 0x38, 0x87, 0x30, 0xed, 0x51, 0x12, 0x6e, - 0x93, 0xe0, 0x26, 0x5e, 0x39, 0xce, 0xed, 0x79, 0xee, 0xb8, 0x32, 0x08, 0xe0, 0x0c, 0x41, 0xe4, - 0xc2, 0x00, 0x33, 0x63, 0xc8, 0x58, 0x66, 0x26, 0x5e, 0xd8, 0x9e, 0x1f, 0x63, 0x51, 0x82, 0xbe, - 0xe4, 0xc0, 0xb8, 0x4c, 0x02, 0xc0, 0x0c, 0x87, 0x32, 0x8a, 0xf9, 0xa6, 0x2d, 0x97, 0xc0, 0x35, - 0x9d, 0x7a, 0x1a, 0x23, 0x68, 0x80, 0x63, 0x9c, 0x69, 0x84, 0xfb, 0x02, 0x9c, 0xcb, 0xa9, 0x6e, - 0xe5, 0xf0, 0xf7, 0x6d, 0x07, 0x46, 0xb4, 0xdc, 0x74, 0xe8, 0x35, 0x18, 0x0e, 0xcb, 0xd6, 0x03, - 0xd3, 0xd6, 0xca, 0x1d, 0x81, 0x69, 0x0a, 0x84, 0x53, 0x86, 0xbd, 0xc4, 0xd3, 0xe5, 0x26, 0xd2, - 0xbb, 0xc7, 0xcd, 0x3e, 0x72, 0x3c, 0xdd, 0xaf, 0x14, 0x21, 0xa5, 0x74, 0xc4, 0xe4, 0x14, 0x69, - 0xf4, 0x5d, 0xe1, 0xd0, 0xe8, 0xbb, 0x2a, 0x9c, 0xf1, 0x98, 0xdb, 0xf5, 0x98, 0x29, 0x29, 0x78, - 0x6a, 0x52, 0x93, 0x02, 0xce, 0x92, 0xa4, 0x5c, 0xe2, 0xb4, 0x2a, 0xe3, 0xd2, 0x7f, 0x64, 0x2e, - 0x65, 0x93, 0x02, 0xce, 0x92, 0x44, 0x2f, 0x41, 0xa9, 0xc2, 0xae, 0x58, 0xf2, 0x3e, 0x2e, 0x6d, - 0xdd, 0x08, 0x93, 0xf5, 0x88, 0xc4, 0x24, 0x48, 0x44, 0xf2, 0xa9, 0x87, 0xc5, 0x28, 0x94, 0xe6, - 0xba, 0xe0, 0xe1, 0xae, 0x14, 0xe8, 0x81, 0x81, 0xf9, 0x6d, 0xfd, 0x64, 0x8f, 0x09, 0x11, 0xe1, - 0xd0, 0x56, 0x07, 0x86, 0xb2, 0x5e, 0x88, 0x4d, 0x5c, 0xf4, 0xcb, 0x0e, 0x8c, 0x35, 0xa4, 0x65, - 0x1b, 0xb7, 0x1b, 0x32, 0x93, 0x22, 0xb6, 0x32, 0xfd, 0x56, 0x74, 0xca, 0x5c, 0x97, 0x30, 0x40, - 0xd8, 0xe4, 0x9d, 0xcd, 0x0f, 0x32, 0xd4, 0x63, 0x7e, 0x90, 0xef, 0x39, 0x30, 0x91, 0xe5, 0x86, - 0xb6, 0xe1, 0xa1, 0xa6, 0x17, 0x6d, 0x2f, 0x05, 0x5b, 0x11, 0xbb, 0xb3, 0x90, 0xf0, 0xc9, 0x30, - 0xb3, 0x95, 0x90, 0x68, 0xde, 0xdb, 0xe3, 0x9e, 0xc2, 0xa2, 0x7a, 0x8a, 0xe7, 0xa1, 0xd5, 0xc3, - 0x90, 0xf1, 0xe1, 0xb4, 0x50, 0x19, 0x2e, 0x50, 0x04, 0x96, 0x3e, 0xcc, 0x0f, 0x83, 0x94, 0x49, - 0x81, 0x31, 0x51, 0x71, 0x73, 0xab, 0x79, 0x48, 0x38, 0xbf, 0xae, 0x3b, 0x04, 0x03, 0xfc, 0xbe, - 0x96, 0xfb, 0x6f, 0x0b, 0x20, 0x75, 0xbb, 0xbf, 0xdc, 0xce, 0x27, 0xba, 0x0f, 0x46, 0xcc, 0x3e, - 0x23, 0x4c, 0x07, 0x6c, 0x1f, 0x14, 0xb9, 0xf6, 0x44, 0x09, 0x55, 0x7a, 0xc9, 0x6d, 0x3f, 0x99, - 0x0b, 0xab, 0xd2, 0x60, 0xc0, 0x94, 0xde, 0x6b, 0x02, 0x86, 0x55, 0xa9, 0xfb, 0x09, 0x07, 0xc6, - 0x68, 0x2f, 0x1b, 0x0d, 0xd2, 0x28, 0x27, 0xa4, 0x15, 0xa3, 0x18, 0x8a, 0x31, 0xfd, 0xc7, 0x9e, - 0xe1, 0x2b, 0xbd, 0xa6, 0x47, 0x5a, 0x9a, 0x6b, 0x82, 0x32, 0xc1, 0x9c, 0x97, 0xfb, 0x66, 0x1f, - 0x0c, 0xab, 0xc1, 0xee, 0xc1, 0x7a, 0x78, 0x35, 0x4d, 0x83, 0xc9, 0x85, 0x68, 0x49, 0x4b, 0x81, - 0x49, 0x4f, 0xf9, 0x33, 0xc1, 0x1e, 0xcf, 0x07, 0x90, 0xe6, 0xc3, 0x7c, 0xd2, 0x74, 0xac, 0x5e, - 0xd4, 0xbd, 0x75, 0x1a, 0xbe, 0xf0, 0xb0, 0xde, 0xd6, 0xfd, 0xda, 0xfd, 0xb6, 0x36, 0x24, 0xe5, - 0xb4, 0xeb, 0xee, 0xd0, 0xce, 0xbc, 0x90, 0x52, 0xec, 0xe9, 0x85, 0x94, 0x27, 0xa0, 0x9f, 0x04, - 0xed, 0x26, 0xd3, 0x76, 0x86, 0x99, 0x96, 0xdf, 0x7f, 0x2d, 0x68, 0x37, 0xcd, 0x9e, 0x31, 0x14, - 0xf4, 0x5e, 0x18, 0xa9, 0x92, 0xb8, 0x12, 0xf9, 0xec, 0x92, 0xbb, 0x30, 0x93, 0x3c, 0xc8, 0x6c, - 0x4f, 0x29, 0xd8, 0xac, 0xa8, 0x57, 0x70, 0x5f, 0x81, 0x81, 0xf5, 0x46, 0xbb, 0xe6, 0x07, 0xa8, - 0x05, 0x03, 0xfc, 0xca, 0xbb, 0xd8, 0xb0, 0x2d, 0x1c, 0x1d, 0xf9, 0x6a, 0xd7, 0x62, 0x2e, 0xf8, - 0x6d, 0x4d, 0xc1, 0xc7, 0xfd, 0xad, 0x02, 0xd0, 0x73, 0xee, 0xe2, 0x1c, 0xfa, 0x9b, 0x1d, 0x0f, - 0x82, 0xfc, 0x4c, 0xce, 0x83, 0x20, 0x63, 0x0c, 0x39, 0xe7, 0x2d, 0x90, 0x06, 0x8c, 0x31, 0x57, - 0x80, 0xdc, 0xc6, 0x84, 0x66, 0xfc, 0x74, 0x8f, 0xb7, 0xc4, 0xf5, 0xaa, 0x42, 0xa8, 0xeb, 0x20, - 0x6c, 0x12, 0x47, 0x7b, 0x70, 0x8e, 0x67, 0x53, 0x9c, 0x27, 0x0d, 0x6f, 0xcf, 0xc8, 0x9a, 0xd4, - 0xf3, 0xcd, 0x74, 0x59, 0x8b, 0x87, 0x33, 0xcf, 0x77, 0x92, 0xc3, 0x79, 0x3c, 0xdc, 0xdf, 0xeb, - 0x07, 0xcd, 0x58, 0xdf, 0xc3, 0xca, 0xfa, 0x48, 0xc6, 0x35, 0xb3, 0x6a, 0xc5, 0x35, 0x23, 0xfd, - 0x1d, 0x5c, 0x5a, 0x99, 0xde, 0x18, 0xda, 0xa8, 0x3a, 0x69, 0xb4, 0xc4, 0xba, 0x54, 0x8d, 0xba, - 0x4e, 0x1a, 0x2d, 0xcc, 0x4a, 0xd4, 0x55, 0xbb, 0xfe, 0xae, 0x57, 0xed, 0xea, 0x50, 0xac, 0x79, - 0xed, 0x1a, 0x11, 0xb1, 0x89, 0x16, 0xbc, 0x70, 0x2c, 0xf8, 0x9f, 0x7b, 0xe1, 0xd8, 0xbf, 0x98, - 0x33, 0xa0, 0x82, 0xa1, 0x2e, 0x83, 0x35, 0x84, 0x75, 0xd4, 0x82, 0x60, 0x50, 0xf1, 0x1f, 0x5c, - 0x30, 0xa8, 0x9f, 0x38, 0x65, 0x86, 0x5a, 0x30, 0x58, 0xe1, 0x79, 0x2d, 0x84, 0x8a, 0xb2, 0x64, - 0xe3, 0x2e, 0x21, 0x23, 0xc8, 0x8d, 0x27, 0xe2, 0x07, 0x96, 0x6c, 0xdc, 0x2b, 0x30, 0xa2, 0xbd, - 0x61, 0x40, 0x3f, 0x83, 0x4a, 0xa9, 0xa0, 0x7d, 0x86, 0x79, 0x2f, 0xf1, 0x30, 0x2b, 0x71, 0xbf, - 0xd1, 0x0f, 0xca, 0x88, 0xa5, 0xdf, 0x7c, 0xf3, 0x2a, 0x5a, 0x02, 0x18, 0xe3, 0xca, 0x75, 0x18, - 0x60, 0x51, 0x4a, 0xd5, 0xb8, 0x26, 0x89, 0x6a, 0xea, 0xd8, 0x2c, 0x44, 0xbb, 0x52, 0xe3, 0x56, - 0xf5, 0x42, 0x6c, 0xe2, 0x52, 0x1d, 0xbc, 0x29, 0x9c, 0xd7, 0xd9, 0xd0, 0x60, 0xe9, 0xd4, 0xc6, - 0x0a, 0x03, 0x7d, 0xc2, 0x81, 0xd1, 0xa6, 0xe6, 0xeb, 0x16, 0x21, 0x8a, 0x36, 0x5c, 0x2d, 0x1a, - 0x55, 0x1e, 0x4a, 0xa4, 0x43, 0xb0, 0xc1, 0x15, 0x2d, 0xc2, 0xd9, 0x98, 0x24, 0x6b, 0xbb, 0x01, - 0x89, 0xd4, 0x8d, 0x74, 0x91, 0xa2, 0x40, 0xdd, 0x0b, 0x28, 0x67, 0x11, 0x70, 0x67, 0x9d, 0xdc, - 0xa8, 0xce, 0xe2, 0x91, 0xa3, 0x3a, 0xe7, 0x61, 0x62, 0xcb, 0xf3, 0x1b, 0xed, 0x88, 0x74, 0x8d, - 0x0d, 0x5d, 0xc8, 0x94, 0xe3, 0x8e, 0x1a, 0xec, 0x6a, 0x4a, 0xc3, 0xab, 0xc5, 0xa5, 0x41, 0xed, - 0x6a, 0x0a, 0x05, 0x60, 0x0e, 0x77, 0x7f, 0xc3, 0x01, 0x9e, 0x1b, 0x66, 0x66, 0x6b, 0xcb, 0x0f, - 0xfc, 0x64, 0x0f, 0x7d, 0xd5, 0x81, 0x89, 0x20, 0xac, 0x92, 0x99, 0x20, 0xf1, 0x25, 0xd0, 0x5e, - 0xc2, 0x6e, 0xc6, 0xeb, 0x46, 0x86, 0x3c, 0x4f, 0x34, 0x90, 0x85, 0xe2, 0x8e, 0x66, 0xb8, 0x97, - 0xe0, 0x42, 0x2e, 0x01, 0xf7, 0x7b, 0x7d, 0x60, 0xa6, 0xb8, 0x41, 0xcf, 0x41, 0xb1, 0xc1, 0x92, - 0x2e, 0x38, 0xc7, 0xcc, 0x5d, 0xc4, 0xc6, 0x8a, 0x67, 0x65, 0xe0, 0x94, 0xd0, 0x3c, 0x8c, 0xb0, - 0xbc, 0x39, 0x22, 0x25, 0x06, 0x5f, 0x11, 0x6e, 0xfa, 0x4e, 0x98, 0x2a, 0xba, 0x63, 0xfe, 0xc4, - 0x7a, 0x35, 0xf4, 0x2a, 0x0c, 0x6e, 0xf2, 0xec, 0x81, 0xf6, 0x9c, 0x6d, 0x22, 0x1d, 0x21, 0xd3, - 0xa3, 0x64, 0x6e, 0xc2, 0x3b, 0xe9, 0xbf, 0x58, 0x72, 0x44, 0x7b, 0x30, 0xe4, 0xc9, 0x6f, 0xda, - 0x6f, 0xeb, 0xaa, 0x81, 0x31, 0x7f, 0x44, 0x2c, 0x89, 0xfc, 0x86, 0x8a, 0x5d, 0x26, 0xe8, 0xa6, - 0xd8, 0x53, 0xd0, 0xcd, 0xb7, 0x1c, 0x80, 0xf4, 0xa9, 0x05, 0x74, 0x1b, 0x86, 0xe2, 0xa7, 0x0d, - 0xbb, 0x84, 0x8d, 0x3b, 0xe6, 0x82, 0xa2, 0x76, 0x0f, 0x53, 0x40, 0xb0, 0xe2, 0x76, 0x37, 0x5b, - 0xca, 0x4f, 0x1c, 0x38, 0x9f, 0xf7, 0x24, 0xc4, 0x3d, 0x6c, 0xf1, 0x51, 0xcd, 0x28, 0xa2, 0xc2, - 0x7a, 0x44, 0xb6, 0xfc, 0xdb, 0x39, 0x39, 0x6c, 0x79, 0x01, 0x4e, 0x71, 0xdc, 0x37, 0x06, 0x41, - 0x31, 0x3e, 0x21, 0xb3, 0xcb, 0x63, 0xf4, 0x7c, 0x55, 0x4b, 0xaf, 0x06, 0x2a, 0x3c, 0xcc, 0xa0, - 0x58, 0x94, 0xd2, 0x33, 0x96, 0x0c, 0x17, 0x17, 0x22, 0x9b, 0xcd, 0x42, 0x19, 0x56, 0x8e, 0x55, - 0x69, 0x9e, 0x21, 0xa7, 0x78, 0x2a, 0x86, 0x9c, 0x01, 0xfb, 0x86, 0x9c, 0x27, 0x60, 0x30, 0x0a, - 0x1b, 0x64, 0x06, 0xdf, 0x10, 0x27, 0x87, 0x34, 0x41, 0x31, 0x07, 0x63, 0x59, 0x7e, 0x4c, 0x53, - 0x06, 0xfa, 0x6d, 0xe7, 0x10, 0x5b, 0xd1, 0xb0, 0xad, 0x3d, 0x21, 0x37, 0xe1, 0x17, 0x3b, 0x06, - 0x1d, 0xc7, 0x00, 0xf5, 0x35, 0x07, 0xce, 0x92, 0xa0, 0x12, 0xed, 0x31, 0x3a, 0x82, 0x9a, 0x70, - 0xf6, 0xde, 0xb4, 0xb1, 0xf8, 0xae, 0x65, 0x89, 0x73, 0x4f, 0x4e, 0x07, 0x18, 0x77, 0x36, 0x03, - 0xad, 0xc1, 0x50, 0xc5, 0x13, 0x33, 0x62, 0xe4, 0x28, 0x33, 0x82, 0x3b, 0xca, 0x66, 0xc4, 0x54, - 0x50, 0x44, 0xdc, 0x1f, 0x15, 0xe0, 0x5c, 0x4e, 0x93, 0xd8, 0xd5, 0xa2, 0x26, 0x9d, 0x91, 0x4b, - 0xd5, 0xec, 0x7a, 0x5c, 0x16, 0x70, 0xac, 0x30, 0xd0, 0x3a, 0x9c, 0xdf, 0x6e, 0xc6, 0x29, 0x95, - 0xb9, 0x30, 0x48, 0xc8, 0x6d, 0xb9, 0x3a, 0xa5, 0x23, 0xf8, 0xfc, 0x72, 0x0e, 0x0e, 0xce, 0xad, - 0x49, 0xd5, 0x17, 0x12, 0x78, 0x9b, 0x0d, 0x92, 0x16, 0x89, 0x8b, 0x71, 0x4a, 0x7d, 0xb9, 0x96, - 0x29, 0xc7, 0x1d, 0x35, 0xd0, 0x67, 0x1c, 0x78, 0x20, 0x26, 0xd1, 0x0e, 0x89, 0xca, 0x7e, 0x95, - 0xcc, 0xb5, 0xe3, 0x24, 0x6c, 0x92, 0xe8, 0x98, 0xd6, 0xd1, 0xa9, 0x83, 0xfd, 0xa9, 0x07, 0xca, - 0xdd, 0xa9, 0xe1, 0xc3, 0x58, 0xb9, 0x9f, 0x71, 0x60, 0xbc, 0xcc, 0x0e, 0xde, 0x4a, 0x97, 0xb6, - 0x9d, 0xf2, 0xf1, 0x31, 0x95, 0xca, 0x21, 0x23, 0x15, 0xcd, 0xe4, 0x0b, 0xee, 0xcb, 0x30, 0x51, - 0x26, 0x4d, 0xaf, 0x55, 0x67, 0xb7, 0x5a, 0x79, 0xa4, 0xd2, 0x15, 0x18, 0x8e, 0x25, 0x2c, 0xfb, - 0xca, 0x8b, 0x42, 0xc6, 0x29, 0x0e, 0x7a, 0x94, 0x47, 0x55, 0xc9, 0xbb, 0x31, 0xc3, 0xfc, 0xd4, - 0xc1, 0x43, 0xb1, 0x62, 0x2c, 0xcb, 0xdc, 0x37, 0x1d, 0x18, 0x4d, 0xeb, 0x93, 0x2d, 0x54, 0x83, - 0x33, 0x15, 0xed, 0x5e, 0x59, 0x1a, 0xd1, 0xdf, 0xfb, 0x15, 0x34, 0x9e, 0x89, 0xd6, 0x24, 0x82, - 0xb3, 0x54, 0x8f, 0x1e, 0x94, 0xf6, 0xf9, 0x02, 0x9c, 0x51, 0x4d, 0x15, 0x7e, 0xc2, 0xd7, 0xb3, - 0xb1, 0x63, 0xd8, 0x46, 0x52, 0x1a, 0x73, 0xec, 0x0f, 0x89, 0x1f, 0x7b, 0x3d, 0x1b, 0x3f, 0x76, - 0xa2, 0xec, 0x3b, 0x5c, 0x9f, 0xdf, 0x2a, 0xc0, 0x90, 0x4a, 0x91, 0xf3, 0x1c, 0x14, 0xd9, 0x51, - 0xf2, 0xed, 0x29, 0xc4, 0xec, 0x58, 0x8a, 0x39, 0x25, 0x4a, 0x92, 0x85, 0xbf, 0x1c, 0x3b, 0x3f, - 0xe8, 0x30, 0x37, 0x3e, 0x7a, 0x51, 0x82, 0x39, 0x25, 0xb4, 0x0c, 0x7d, 0x24, 0xa8, 0x0a, 0xcd, - 0xf8, 0xe8, 0x04, 0xd9, 0x7b, 0x4c, 0xd7, 0x82, 0x2a, 0xa6, 0x54, 0x58, 0x92, 0x4a, 0xae, 0x00, - 0x65, 0x5e, 0xdf, 0x10, 0xda, 0x8f, 0x28, 0x75, 0x7f, 0xb9, 0x0f, 0x06, 0xca, 0xed, 0x4d, 0xaa, - 0xe3, 0x7f, 0xd3, 0x81, 0x73, 0xbb, 0x99, 0xe4, 0xb9, 0xe9, 0x1c, 0xbf, 0x69, 0xcf, 0x00, 0xab, - 0x87, 0x60, 0x3d, 0x20, 0x9f, 0x16, 0xcf, 0x29, 0xc4, 0x79, 0xcd, 0x31, 0xf2, 0x57, 0xf6, 0x9d, - 0x48, 0xfe, 0xca, 0xdb, 0x27, 0x7c, 0x49, 0x60, 0xac, 0xdb, 0x05, 0x01, 0xf7, 0xf7, 0x8a, 0x00, - 0xfc, 0x6b, 0xac, 0xb5, 0x92, 0x5e, 0xcc, 0x64, 0xcf, 0xc0, 0x68, 0x8d, 0x04, 0x24, 0x92, 0x01, - 0x76, 0x99, 0x87, 0x5d, 0x16, 0xb5, 0x32, 0x6c, 0x60, 0xb2, 0x33, 0x49, 0x90, 0x44, 0x7b, 0x5c, - 0x6f, 0xcd, 0x5e, 0x04, 0x50, 0x25, 0x58, 0xc3, 0x42, 0xd3, 0x86, 0xc7, 0x83, 0xfb, 0xbf, 0xc7, - 0x0f, 0x71, 0x50, 0xbc, 0x17, 0xc6, 0xcd, 0xac, 0x1a, 0x42, 0x59, 0x53, 0xfe, 0x6a, 0x33, 0x19, - 0x07, 0xce, 0x60, 0xd3, 0x49, 0x5c, 0x8d, 0xf6, 0x70, 0x3b, 0x10, 0x5a, 0x9b, 0x9a, 0xc4, 0xf3, - 0x0c, 0x8a, 0x45, 0x29, 0x4b, 0x47, 0xc0, 0xf6, 0x2f, 0x0e, 0x17, 0x29, 0x0d, 0xd2, 0x74, 0x04, - 0x5a, 0x19, 0x36, 0x30, 0x29, 0x07, 0x61, 0x66, 0x04, 0x73, 0x99, 0x64, 0x6c, 0x83, 0x2d, 0x18, - 0x0f, 0x4d, 0xf3, 0x08, 0x57, 0x61, 0xde, 0xd5, 0xe3, 0xd4, 0x33, 0xea, 0xf2, 0x38, 0x83, 0x8c, - 0x35, 0x25, 0x43, 0x9f, 0xaa, 0xad, 0x7a, 0xbc, 0xfc, 0xa8, 0x19, 0x9f, 0xd9, 0x35, 0xa4, 0x7d, - 0x1d, 0xce, 0xb7, 0xc2, 0xea, 0x7a, 0xe4, 0x87, 0x91, 0x9f, 0xec, 0xcd, 0x35, 0xbc, 0x38, 0x66, - 0x13, 0x63, 0xcc, 0x54, 0x67, 0xd6, 0x73, 0x70, 0x70, 0x6e, 0x4d, 0x7a, 0xc0, 0x68, 0x09, 0x20, - 0x8b, 0xcd, 0x2a, 0x72, 0x85, 0x4c, 0x22, 0x62, 0x55, 0xea, 0x9e, 0x83, 0xb3, 0xe5, 0x76, 0xab, - 0xd5, 0xf0, 0x49, 0x55, 0x79, 0x14, 0xdc, 0xf7, 0xc1, 0x19, 0x91, 0xdd, 0x52, 0x29, 0x0f, 0x47, - 0xca, 0xc5, 0xec, 0xfe, 0x99, 0x03, 0x67, 0x32, 0x91, 0x30, 0xe8, 0xd5, 0xec, 0x96, 0x6f, 0xc5, - 0x66, 0xa6, 0x6f, 0xf6, 0x7c, 0x91, 0xe6, 0xaa, 0x0f, 0x75, 0x19, 0xf1, 0x6d, 0xed, 0xa6, 0x05, - 0x8b, 0x8b, 0xe6, 0x3b, 0x82, 0x1e, 0x36, 0xee, 0x7e, 0xba, 0x00, 0xf9, 0xe1, 0x47, 0xe8, 0xa3, - 0x9d, 0x03, 0xf0, 0x9c, 0xc5, 0x01, 0x10, 0xf1, 0x4f, 0xdd, 0xc7, 0x20, 0x30, 0xc7, 0x60, 0xd5, - 0xd2, 0x18, 0x08, 0xbe, 0x9d, 0x23, 0xf1, 0xbf, 0x1c, 0x18, 0xd9, 0xd8, 0x58, 0x51, 0x26, 0x2e, - 0x0c, 0x17, 0x63, 0x7e, 0x93, 0x9c, 0x79, 0x69, 0xe7, 0xc2, 0x66, 0x8b, 0x3b, 0x6d, 0x85, 0x33, - 0x99, 0x25, 0x1a, 0x2d, 0xe7, 0x62, 0xe0, 0x2e, 0x35, 0xd1, 0x12, 0x9c, 0xd3, 0x4b, 0xca, 0xda, - 0xbb, 0x6e, 0x45, 0x91, 0xbd, 0xa5, 0xb3, 0x18, 0xe7, 0xd5, 0xc9, 0x92, 0x12, 0xd6, 0x4a, 0xb6, - 0x5d, 0xe5, 0x90, 0x12, 0xc5, 0x38, 0xaf, 0x8e, 0xbb, 0x06, 0x23, 0x1b, 0x5e, 0xa4, 0x3a, 0xfe, - 0x7e, 0x98, 0xa8, 0x84, 0x4d, 0x69, 0x25, 0x5a, 0x21, 0x3b, 0xa4, 0x21, 0xba, 0xcc, 0x1f, 0x53, - 0xc8, 0x94, 0xe1, 0x0e, 0x6c, 0xf7, 0xbf, 0x5f, 0x06, 0x75, 0x33, 0xae, 0x87, 0x1d, 0xa6, 0xa5, - 0x02, 0x33, 0x8b, 0x96, 0x03, 0x33, 0x95, 0xac, 0xcd, 0x04, 0x67, 0x26, 0x69, 0x70, 0xe6, 0x80, - 0xed, 0xe0, 0x4c, 0xa5, 0x30, 0x76, 0x04, 0x68, 0x7e, 0xd9, 0x81, 0xd1, 0x20, 0xac, 0x12, 0xe5, - 0x8a, 0x1b, 0x64, 0x5a, 0xeb, 0x4b, 0xf6, 0x22, 0xce, 0x79, 0xa0, 0xa1, 0x20, 0xcf, 0xc3, 0x77, - 0xd5, 0x16, 0xa5, 0x17, 0x61, 0xa3, 0x1d, 0x68, 0x41, 0xb3, 0x5b, 0x72, 0xf7, 0xc0, 0x83, 0x79, - 0xc7, 0x8d, 0xbb, 0x1a, 0x21, 0x6f, 0x6b, 0x7a, 0xd3, 0xb0, 0x2d, 0x7b, 0x9c, 0xbc, 0xee, 0xa4, - 0x79, 0x39, 0x64, 0xae, 0xdc, 0x54, 0x9f, 0x72, 0x61, 0x80, 0xc7, 0xf9, 0x8a, 0x3c, 0x41, 0xcc, - 0xf9, 0xc6, 0x63, 0x80, 0xb1, 0x28, 0x41, 0x89, 0x74, 0xf7, 0x8f, 0xd8, 0xca, 0x7c, 0x6f, 0x84, - 0x13, 0xe4, 0xfb, 0xfb, 0xd1, 0xb3, 0xfa, 0x31, 0x76, 0xb4, 0x97, 0x63, 0xec, 0x58, 0xd7, 0x23, - 0xec, 0xe7, 0x1c, 0x18, 0xad, 0x68, 0x99, 0xe8, 0x4b, 0x8f, 0xdb, 0x7a, 0x71, 0x37, 0xef, 0xc1, - 0x00, 0xee, 0xd3, 0x31, 0x32, 0xdf, 0x1b, 0xdc, 0x59, 0x72, 0x44, 0x76, 0x66, 0x67, 0x5b, 0xbf, - 0x95, 0x7c, 0x08, 0xa6, 0x0d, 0x40, 0x46, 0x3e, 0x52, 0x18, 0x16, 0xbc, 0xd0, 0x6b, 0x30, 0x24, - 0x43, 0xc5, 0x45, 0x20, 0x37, 0xb6, 0x61, 0x64, 0x37, 0x3d, 0x79, 0x32, 0xa3, 0x1a, 0x87, 0x62, - 0xc5, 0x11, 0xd5, 0xa1, 0xaf, 0xea, 0xd5, 0x44, 0x48, 0xf7, 0xaa, 0x9d, 0x8c, 0x95, 0x92, 0x27, - 0x3b, 0x5e, 0xcd, 0xcf, 0x2c, 0x62, 0xca, 0x02, 0xdd, 0x4e, 0x53, 0x79, 0x4f, 0x58, 0xdb, 0x7d, - 0x4d, 0x35, 0x89, 0x5b, 0x25, 0x3a, 0x32, 0x83, 0x57, 0x85, 0xf3, 0xf3, 0xaf, 0x30, 0xb6, 0x0b, - 0x76, 0x52, 0x5e, 0xf2, 0xfc, 0x1a, 0xa9, 0x03, 0x95, 0x72, 0x61, 0x2f, 0xfd, 0xff, 0xac, 0x2d, - 0x2e, 0x2c, 0x4b, 0x44, 0xf6, 0x85, 0xff, 0x06, 0x0c, 0xb4, 0x58, 0x0c, 0x47, 0xe9, 0xe7, 0x6c, - 0xed, 0x2d, 0x3c, 0x26, 0x84, 0xcf, 0x4d, 0xfe, 0x3f, 0x16, 0x3c, 0xd0, 0x35, 0x18, 0xe4, 0x2f, - 0x52, 0xf0, 0x90, 0xfa, 0x91, 0xab, 0x93, 0xdd, 0xdf, 0xb5, 0x48, 0x37, 0x0a, 0xfe, 0x3b, 0xc6, - 0xb2, 0x2e, 0xfa, 0xbc, 0x03, 0xe3, 0x54, 0xa2, 0xa6, 0x4f, 0x68, 0x94, 0x90, 0x2d, 0x99, 0x75, - 0x33, 0xa6, 0x1a, 0x89, 0x94, 0x35, 0xea, 0x98, 0xb4, 0x64, 0xb0, 0xc3, 0x19, 0xf6, 0xe8, 0x75, - 0x18, 0x8a, 0xfd, 0x2a, 0xa9, 0x78, 0x51, 0x5c, 0x3a, 0x77, 0x32, 0x4d, 0x49, 0xdd, 0x2d, 0x82, - 0x11, 0x56, 0x2c, 0x73, 0x5f, 0xba, 0x3f, 0x7f, 0x8f, 0x5f, 0xba, 0xff, 0xdb, 0x0e, 0x5c, 0xe0, - 0x19, 0xd4, 0xb3, 0xe9, 0xf3, 0x2f, 0x1c, 0xd3, 0xbc, 0xc2, 0xee, 0x02, 0xcc, 0xe4, 0x91, 0xc4, - 0xf9, 0x9c, 0x58, 0x0a, 0x56, 0xf3, 0xc5, 0x93, 0x8b, 0x56, 0xdd, 0x8e, 0xbd, 0xbf, 0x72, 0x82, - 0x9e, 0x82, 0x91, 0x96, 0xd8, 0x0e, 0xfd, 0xb8, 0xc9, 0x6e, 0x76, 0xf4, 0xf1, 0xdb, 0x6f, 0xeb, - 0x29, 0x18, 0xeb, 0x38, 0x46, 0x3e, 0xde, 0x27, 0x0e, 0xcb, 0xc7, 0x8b, 0x6e, 0xc2, 0x48, 0x12, - 0x36, 0x44, 0x4a, 0xca, 0xb8, 0x54, 0x62, 0x33, 0xf0, 0x72, 0xde, 0xda, 0xda, 0x50, 0x68, 0xe9, - 0x49, 0x36, 0x85, 0xc5, 0x58, 0xa7, 0xc3, 0xa2, 0x69, 0x45, 0x66, 0xfa, 0x88, 0x1d, 0x61, 0xef, - 0xcf, 0x44, 0xd3, 0xea, 0x85, 0xd8, 0xc4, 0x45, 0x8b, 0x70, 0xb6, 0xd5, 0x71, 0x06, 0xe6, 0x77, - 0xbb, 0x54, 0x44, 0x43, 0xe7, 0x01, 0xb8, 0xb3, 0x8e, 0x71, 0xfa, 0x7d, 0xe0, 0xb0, 0xd3, 0x6f, - 0x97, 0xec, 0xb4, 0x0f, 0x1e, 0x27, 0x3b, 0x2d, 0xaa, 0xc2, 0x83, 0x5e, 0x3b, 0x09, 0x59, 0x26, - 0x14, 0xb3, 0x0a, 0x0f, 0x2c, 0x7e, 0x98, 0xc7, 0x2a, 0x1f, 0xec, 0x4f, 0x3d, 0x38, 0x73, 0x08, - 0x1e, 0x3e, 0x94, 0x0a, 0x7a, 0x05, 0x86, 0x88, 0xc8, 0xb0, 0x5b, 0xfa, 0x19, 0x5b, 0x4a, 0x82, - 0x99, 0xb3, 0x57, 0x06, 0x7c, 0x72, 0x18, 0x56, 0xfc, 0xd0, 0x06, 0x8c, 0xd4, 0xc3, 0x38, 0x99, - 0x69, 0xf8, 0x5e, 0x4c, 0xe2, 0xd2, 0x43, 0x6c, 0xd2, 0xe4, 0xea, 0x5e, 0xd7, 0x25, 0x5a, 0x3a, - 0x67, 0xae, 0xa7, 0x35, 0xb1, 0x4e, 0x06, 0x11, 0xe6, 0x7c, 0x64, 0x51, 0xd5, 0xd2, 0x8f, 0x73, - 0x99, 0x75, 0xec, 0xb1, 0x3c, 0xca, 0xeb, 0x61, 0xb5, 0x6c, 0x62, 0x2b, 0xef, 0xa3, 0x0e, 0xc4, - 0x59, 0x9a, 0xe8, 0x19, 0x18, 0x6d, 0x85, 0xd5, 0x72, 0x8b, 0x54, 0xd6, 0xbd, 0xa4, 0x52, 0x2f, - 0x4d, 0x99, 0x56, 0xb7, 0x75, 0xad, 0x0c, 0x1b, 0x98, 0xa8, 0x05, 0x83, 0x4d, 0x7e, 0x45, 0xbe, - 0xf4, 0x88, 0xad, 0xb3, 0x8d, 0xb8, 0x73, 0xcf, 0xf5, 0x05, 0xf1, 0x03, 0x4b, 0x36, 0xe8, 0x1f, - 0x3b, 0x70, 0x26, 0x73, 0x57, 0xa9, 0xf4, 0x0e, 0x6b, 0x2a, 0x8b, 0x49, 0x78, 0xf6, 0x31, 0x36, - 0x7c, 0x26, 0xf0, 0x4e, 0x27, 0x08, 0x67, 0x5b, 0xc4, 0xc7, 0x85, 0xe5, 0xb9, 0x28, 0x3d, 0x6a, - 0x6f, 0x5c, 0x18, 0x41, 0x39, 0x2e, 0xec, 0x07, 0x96, 0x6c, 0xd0, 0x13, 0x30, 0x28, 0x52, 0xd2, - 0x95, 0x1e, 0x33, 0x3d, 0xc8, 0x22, 0x73, 0x1d, 0x96, 0xe5, 0x93, 0xef, 0x83, 0xb3, 0x1d, 0x47, - 0xb7, 0x23, 0x25, 0x5b, 0xf8, 0x75, 0x07, 0xf4, 0x6b, 0xc6, 0xd6, 0x9f, 0xb5, 0x78, 0x06, 0x46, - 0x2b, 0xfc, 0xf1, 0x3b, 0x7e, 0x51, 0xb9, 0xdf, 0xb4, 0x7f, 0xce, 0x69, 0x65, 0xd8, 0xc0, 0x74, - 0xaf, 0x03, 0xea, 0xcc, 0x39, 0x7e, 0xac, 0x4c, 0x3e, 0xff, 0xd4, 0x81, 0x31, 0x43, 0x67, 0xb0, - 0xee, 0x23, 0x5c, 0x00, 0xd4, 0xf4, 0xa3, 0x28, 0x8c, 0xf4, 0x57, 0xc6, 0x44, 0x8e, 0x65, 0x76, - 0x49, 0x6c, 0xb5, 0xa3, 0x14, 0xe7, 0xd4, 0x70, 0x7f, 0xab, 0x1f, 0xd2, 0x88, 0x67, 0x95, 0xd4, - 0xd5, 0xe9, 0x9a, 0xd4, 0xf5, 0x49, 0x18, 0x7a, 0x39, 0x0e, 0x83, 0xf5, 0x34, 0xf5, 0xab, 0xfa, - 0x16, 0xcf, 0x96, 0xd7, 0x6e, 0x30, 0x4c, 0x85, 0xc1, 0xb0, 0x3f, 0xb2, 0xe0, 0x37, 0x92, 0xce, - 0xdc, 0xa0, 0xcf, 0x3e, 0xc7, 0xe1, 0x58, 0x61, 0xb0, 0x07, 0xc7, 0x76, 0x88, 0x32, 0x8c, 0xa7, - 0x0f, 0x8e, 0xf1, 0xe7, 0x04, 0x58, 0x19, 0xba, 0x02, 0xc3, 0xca, 0xa8, 0x2e, 0x2c, 0xf5, 0x6a, - 0xa4, 0x94, 0xe5, 0x1d, 0xa7, 0x38, 0x4c, 0x21, 0x14, 0x86, 0x58, 0x61, 0x42, 0x29, 0xdb, 0x38, - 0x9e, 0x64, 0x4c, 0xbb, 0x5c, 0xb6, 0x4b, 0x30, 0x56, 0x2c, 0xf3, 0xfc, 0xa4, 0xc3, 0x27, 0xe2, - 0x27, 0xd5, 0xc2, 0xef, 0x8b, 0xbd, 0x86, 0xdf, 0x9b, 0x73, 0x7b, 0xa8, 0xa7, 0xb9, 0xfd, 0xc9, - 0x3e, 0x18, 0x7c, 0x9e, 0x44, 0x2c, 0x25, 0xf6, 0x13, 0x30, 0xb8, 0xc3, 0xff, 0xcd, 0x5e, 0xbf, - 0x14, 0x18, 0x58, 0x96, 0xd3, 0xef, 0xb6, 0xd9, 0xf6, 0x1b, 0xd5, 0xf9, 0x74, 0x15, 0xa7, 0xd9, - 0xf4, 0x64, 0x01, 0x4e, 0x71, 0x68, 0x85, 0x1a, 0xd5, 0xec, 0x9b, 0x4d, 0xbf, 0xe3, 0x2d, 0xed, - 0x45, 0x59, 0x80, 0x53, 0x1c, 0xf4, 0x18, 0x0c, 0xd4, 0xfc, 0x64, 0xc3, 0xab, 0x65, 0xbd, 0x7c, - 0x8b, 0x0c, 0x8a, 0x45, 0x29, 0x73, 0x13, 0xf9, 0xc9, 0x46, 0x44, 0x98, 0x65, 0xb7, 0x23, 0x0f, - 0xc3, 0xa2, 0x56, 0x86, 0x0d, 0x4c, 0xd6, 0xa4, 0x50, 0xf4, 0x4c, 0x04, 0x61, 0xa6, 0x4d, 0x92, - 0x05, 0x38, 0xc5, 0xa1, 0xf3, 0xbf, 0x12, 0x36, 0x5b, 0x7e, 0x43, 0x84, 0x07, 0x6b, 0xf3, 0x7f, - 0x4e, 0xc0, 0xb1, 0xc2, 0xa0, 0xd8, 0x54, 0x84, 0x51, 0xf1, 0x93, 0x7d, 0xdc, 0x69, 0x5d, 0xc0, - 0xb1, 0xc2, 0x70, 0x9f, 0x87, 0x31, 0xbe, 0x92, 0xe7, 0x1a, 0x9e, 0xdf, 0x5c, 0x9c, 0x43, 0xd7, - 0x3a, 0xc2, 0xef, 0x9f, 0xc8, 0x09, 0xbf, 0xbf, 0x60, 0x54, 0xea, 0x0c, 0xc3, 0x77, 0x7f, 0x50, - 0x80, 0xa1, 0x53, 0x7c, 0x1f, 0xef, 0xd4, 0x9f, 0x7a, 0x45, 0xb7, 0x33, 0x6f, 0xe3, 0xad, 0xdb, - 0xbc, 0x4d, 0x73, 0xe8, 0xbb, 0x78, 0xff, 0xa5, 0x00, 0x17, 0x25, 0xaa, 0x3c, 0xcb, 0x2d, 0xce, - 0xb1, 0xc7, 0x9d, 0x4e, 0x7e, 0xa0, 0x23, 0x63, 0xa0, 0xd7, 0xed, 0x9d, 0x46, 0x17, 0xe7, 0xba, - 0x0e, 0xf5, 0x2b, 0x99, 0xa1, 0xc6, 0x56, 0xb9, 0x1e, 0x3e, 0xd8, 0x7f, 0xee, 0xc0, 0x64, 0xfe, - 0x60, 0x9f, 0xc2, 0x73, 0x84, 0xaf, 0x9b, 0xcf, 0x11, 0xfe, 0xa2, 0xbd, 0x29, 0x66, 0x76, 0xa5, - 0xcb, 0xc3, 0x84, 0x7f, 0xea, 0xc0, 0x79, 0x59, 0x81, 0xed, 0x9e, 0xb3, 0x7e, 0xc0, 0x02, 0x51, - 0x4e, 0x7e, 0x9a, 0xbd, 0x66, 0x4c, 0xb3, 0x17, 0xed, 0x75, 0x5c, 0xef, 0x47, 0xd7, 0x67, 0x9c, - 0xff, 0xc4, 0x81, 0x52, 0x5e, 0x85, 0x53, 0xf8, 0xe4, 0xaf, 0x9a, 0x9f, 0xfc, 0xf9, 0x93, 0xe9, - 0x79, 0xf7, 0x0f, 0x5e, 0xea, 0x36, 0x50, 0xa8, 0x21, 0xf5, 0x2a, 0xc7, 0x96, 0x8f, 0x96, 0xb3, - 0xc8, 0x57, 0xd0, 0x1a, 0x30, 0x10, 0xb3, 0xa8, 0x0d, 0x31, 0x05, 0xae, 0xdb, 0xd0, 0xb6, 0x28, - 0x3d, 0x61, 0x63, 0x67, 0xff, 0x63, 0xc1, 0xc3, 0xfd, 0x8d, 0x02, 0x5c, 0x52, 0xcf, 0x8c, 0x92, - 0x1d, 0xd2, 0x48, 0xd7, 0x07, 0x7b, 0x40, 0xc0, 0x53, 0x3f, 0xed, 0x3d, 0x20, 0x90, 0xb2, 0x48, - 0xd7, 0x42, 0x0a, 0xc3, 0x1a, 0x4f, 0x54, 0x86, 0x0b, 0x2c, 0xe1, 0xff, 0x82, 0x1f, 0x78, 0x0d, - 0xff, 0x15, 0x12, 0x61, 0xd2, 0x0c, 0x77, 0xbc, 0x86, 0xd0, 0xd4, 0xd5, 0x0d, 0xdc, 0x85, 0x3c, - 0x24, 0x9c, 0x5f, 0xb7, 0xe3, 0xc4, 0xdd, 0xd7, 0xeb, 0x89, 0xdb, 0xfd, 0x63, 0x07, 0x46, 0x4f, - 0xf1, 0x51, 0xd6, 0xd0, 0x5c, 0x12, 0xcf, 0xda, 0x5b, 0x12, 0x5d, 0x96, 0xc1, 0x7e, 0x11, 0x3a, - 0xde, 0xa9, 0x44, 0x9f, 0x72, 0x54, 0x5c, 0x0b, 0x8f, 0xfd, 0xfb, 0xa0, 0xbd, 0x76, 0x1c, 0x25, - 0xc3, 0x21, 0xfa, 0x5a, 0x26, 0xed, 0x63, 0xc1, 0x56, 0x6a, 0xa4, 0x8e, 0xd6, 0x1c, 0x23, 0xfd, - 0xe3, 0x97, 0x1d, 0x00, 0xde, 0x4e, 0x91, 0x35, 0x9a, 0xb6, 0x6d, 0xf3, 0xc4, 0x46, 0x8a, 0x32, - 0xe1, 0x4d, 0x53, 0x4b, 0x28, 0x2d, 0xc0, 0x5a, 0x4b, 0xde, 0x46, 0x5e, 0xc7, 0xb7, 0x9d, 0x52, - 0xf2, 0xf3, 0x0e, 0x9c, 0xc9, 0x34, 0x37, 0xa7, 0xfe, 0x96, 0xf9, 0x7e, 0x9d, 0x05, 0xcd, 0xca, - 0xcc, 0x25, 0xac, 0x1b, 0x4f, 0xfe, 0x9b, 0x0b, 0xc6, 0x03, 0xbf, 0xe8, 0x55, 0x18, 0x96, 0x96, - 0x0f, 0x39, 0xbd, 0x6d, 0xbe, 0xe3, 0xa9, 0x8e, 0x37, 0x12, 0x12, 0xe3, 0x94, 0x5f, 0x26, 0x6c, - 0xae, 0xd0, 0x53, 0xd8, 0xdc, 0xbd, 0x7d, 0x05, 0x34, 0xdf, 0x2e, 0xdd, 0x7f, 0x22, 0x76, 0xe9, - 0x07, 0xad, 0xdb, 0xa5, 0x1f, 0x3a, 0x65, 0xbb, 0xb4, 0xe6, 0x24, 0x2c, 0xbe, 0x0d, 0x27, 0xe1, - 0xab, 0x70, 0x7e, 0x27, 0x3d, 0x74, 0xaa, 0x99, 0x24, 0xd2, 0x00, 0x3d, 0x91, 0x6b, 0x8d, 0xa6, - 0x07, 0xe8, 0x38, 0x21, 0x41, 0xa2, 0x1d, 0x57, 0xd3, 0x88, 0xbd, 0xe7, 0x73, 0xc8, 0xe1, 0x5c, - 0x26, 0x59, 0x6f, 0xcf, 0x60, 0x0f, 0xde, 0x9e, 0x37, 0x1d, 0xb8, 0xe0, 0x75, 0xdc, 0xe1, 0xc2, - 0x64, 0x4b, 0x84, 0x9c, 0xdc, 0xb2, 0xa7, 0x42, 0x18, 0xe4, 0x85, 0x5b, 0x2d, 0xaf, 0x08, 0xe7, - 0x37, 0x08, 0x3d, 0x9a, 0xba, 0xde, 0x79, 0x9c, 0x67, 0xbe, 0x9f, 0xfc, 0x6b, 0xd9, 0x78, 0x1e, - 0x60, 0x43, 0xff, 0x61, 0xbb, 0xa7, 0x6d, 0x0b, 0x31, 0x3d, 0x23, 0x6f, 0x23, 0xa6, 0x27, 0xe3, - 0x7a, 0x1b, 0xb5, 0xe4, 0x7a, 0x0b, 0x60, 0xc2, 0x6f, 0x7a, 0x35, 0xb2, 0xde, 0x6e, 0x34, 0xf8, - 0x1d, 0x10, 0xf9, 0xd2, 0x6a, 0xae, 0x05, 0x6f, 0x25, 0xac, 0x78, 0x8d, 0xec, 0x83, 0xd6, 0xea, - 0xae, 0xcb, 0x52, 0x86, 0x12, 0xee, 0xa0, 0x4d, 0x27, 0x2c, 0xcb, 0x47, 0x47, 0x12, 0x3a, 0xda, - 0x2c, 0x70, 0x64, 0x88, 0x4f, 0xd8, 0xeb, 0x29, 0x18, 0xeb, 0x38, 0x68, 0x19, 0x86, 0xab, 0x41, - 0x2c, 0xae, 0xa3, 0x9e, 0x61, 0xc2, 0xec, 0x9d, 0x54, 0x04, 0xce, 0xdf, 0x28, 0xab, 0x8b, 0xa8, - 0x0f, 0xe6, 0xa4, 0x3a, 0x54, 0xe5, 0x38, 0xad, 0x8f, 0x56, 0x19, 0x31, 0xf1, 0x0c, 0x15, 0x8f, - 0xe7, 0x78, 0xb8, 0x8b, 0xc3, 0x68, 0xfe, 0x86, 0x7c, 0x48, 0x6b, 0x4c, 0xb0, 0x13, 0xef, 0x49, - 0xa5, 0x14, 0xb4, 0x17, 0x6f, 0xcf, 0x1e, 0xfa, 0xe2, 0x2d, 0xcb, 0x71, 0x9a, 0x34, 0x94, 0x7b, - 0xf8, 0xb2, 0xb5, 0x1c, 0xa7, 0x69, 0xa4, 0xa4, 0xc8, 0x71, 0x9a, 0x02, 0xb0, 0xce, 0x12, 0xad, - 0x75, 0x73, 0x93, 0x9f, 0x63, 0x42, 0xe3, 0xe8, 0x4e, 0x6f, 0xdd, 0x5f, 0x7a, 0xfe, 0x50, 0x7f, - 0x69, 0x87, 0x7f, 0xf7, 0xc2, 0x11, 0xfc, 0xbb, 0x75, 0x96, 0x7d, 0x72, 0x71, 0x4e, 0xb8, 0xd4, - 0x2d, 0x9c, 0xef, 0x58, 0x8a, 0x0e, 0x1e, 0x79, 0xca, 0xfe, 0xc5, 0x9c, 0x41, 0xd7, 0x80, 0xea, - 0x4b, 0xc7, 0x0e, 0xa8, 0xa6, 0xe2, 0x39, 0x85, 0xb3, 0x34, 0xa6, 0x45, 0x21, 0x9e, 0x53, 0x30, - 0xd6, 0x71, 0xb2, 0xde, 0xd2, 0xfb, 0x4f, 0xcc, 0x5b, 0x3a, 0x79, 0x0a, 0xde, 0xd2, 0x07, 0x7a, - 0xf6, 0x96, 0xde, 0x86, 0x73, 0xad, 0xb0, 0x3a, 0xef, 0xc7, 0x51, 0x9b, 0x5d, 0x8a, 0x9b, 0x6d, - 0x57, 0x6b, 0x24, 0x61, 0xee, 0xd6, 0x91, 0xab, 0xef, 0xd4, 0x1b, 0xd9, 0x62, 0x0b, 0x59, 0xae, - 0xd1, 0x4c, 0x05, 0x66, 0x3a, 0x61, 0x51, 0xb7, 0x39, 0x85, 0x38, 0x8f, 0x85, 0xee, 0xa7, 0x7d, - 0xf8, 0x74, 0xfc, 0xb4, 0xef, 0x87, 0xa1, 0xb8, 0xde, 0x4e, 0xaa, 0xe1, 0x6e, 0xc0, 0x9c, 0xf1, - 0xc3, 0xb3, 0xef, 0x50, 0xa6, 0x6c, 0x01, 0xbf, 0xb3, 0x3f, 0x35, 0x21, 0xff, 0xd7, 0xac, 0xd8, - 0x02, 0x82, 0xbe, 0xde, 0xe5, 0xfe, 0x8e, 0x7b, 0x92, 0xf7, 0x77, 0x2e, 0x1d, 0xe9, 0xee, 0x4e, - 0x9e, 0x33, 0xfa, 0x91, 0x9f, 0x3a, 0x67, 0xf4, 0x57, 0x1d, 0x18, 0xdb, 0xd1, 0x5d, 0x06, 0xc2, - 0x61, 0x6e, 0x21, 0x70, 0xc7, 0xf0, 0x44, 0xcc, 0xba, 0x54, 0xce, 0x19, 0xa0, 0x3b, 0x59, 0x00, - 0x36, 0x5b, 0x92, 0x13, 0x54, 0xf4, 0xe8, 0xbd, 0x0a, 0x2a, 0x7a, 0x9d, 0xc9, 0x31, 0x79, 0xc8, - 0x65, 0x5e, 0x74, 0xbb, 0x31, 0xc5, 0x52, 0x26, 0xaa, 0x90, 0x62, 0x9d, 0x1f, 0xfa, 0x9c, 0x03, - 0x13, 0xf2, 0x5c, 0x26, 0x5c, 0x7e, 0xb1, 0x88, 0x8a, 0xb4, 0x79, 0x1c, 0x64, 0x61, 0xf5, 0x1b, - 0x19, 0x3e, 0xb8, 0x83, 0x33, 0x95, 0xea, 0x2a, 0x08, 0xad, 0x16, 0xb3, 0xe0, 0x5f, 0xa1, 0xc3, - 0xcc, 0xa4, 0x60, 0xac, 0xe3, 0xa0, 0x6f, 0xa8, 0x67, 0xec, 0x9f, 0x60, 0x02, 0xfd, 0x05, 0xcb, - 0xba, 0xa9, 0x8d, 0xb7, 0xec, 0xd1, 0x17, 0x1d, 0x98, 0xd8, 0xcd, 0x18, 0x34, 0x44, 0x58, 0x28, - 0xb6, 0x6f, 0x2a, 0xe1, 0xc3, 0x9d, 0x85, 0xe2, 0x8e, 0x16, 0xa0, 0xcf, 0x9a, 0x86, 0x4e, 0x1e, - 0x3f, 0x6a, 0x71, 0x00, 0x33, 0x86, 0x55, 0x7e, 0xcd, 0x2d, 0xdf, 0xe2, 0xf9, 0xb6, 0xe3, 0x43, - 0x26, 0x69, 0x67, 0xd2, 0x8f, 0x95, 0x53, 0x95, 0x98, 0xf6, 0x16, 0x0b, 0x8b, 0xdd, 0xf8, 0xfc, - 0xba, 0xb9, 0xe5, 0x3f, 0x9f, 0x83, 0x71, 0xd3, 0xb7, 0x87, 0xde, 0x65, 0x3e, 0xc0, 0x70, 0x39, - 0x9b, 0xcb, 0x7e, 0x4c, 0xe2, 0x1b, 0xf9, 0xec, 0x8d, 0x84, 0xf3, 0x85, 0x13, 0x4d, 0x38, 0xdf, - 0x77, 0x3a, 0x09, 0xe7, 0x27, 0x4e, 0x22, 0xe1, 0xfc, 0xd9, 0x23, 0x25, 0x9c, 0xd7, 0x12, 0xfe, - 0xf7, 0xdf, 0x25, 0xe1, 0xff, 0x0c, 0x9c, 0x91, 0x77, 0x7f, 0x88, 0xc8, 0x24, 0xce, 0xdd, 0xfe, - 0x97, 0x44, 0x95, 0x33, 0x73, 0x66, 0x31, 0xce, 0xe2, 0xd3, 0x45, 0x56, 0x0c, 0x58, 0xcd, 0x01, - 0x5b, 0xcf, 0xf5, 0x98, 0x53, 0x8b, 0x1d, 0x9f, 0x85, 0x88, 0x92, 0xd1, 0xce, 0x45, 0x06, 0xbb, - 0x23, 0xff, 0xc1, 0xbc, 0x05, 0xe8, 0x25, 0x28, 0x85, 0x5b, 0x5b, 0x8d, 0xd0, 0xab, 0xa6, 0x59, - 0xf1, 0x65, 0x5c, 0x02, 0xbf, 0xbb, 0xa9, 0x52, 0xb7, 0xae, 0x75, 0xc1, 0xc3, 0x5d, 0x29, 0xa0, - 0x37, 0xa9, 0x62, 0x92, 0x84, 0x11, 0xa9, 0xa6, 0xb6, 0x9a, 0x61, 0xd6, 0x67, 0x62, 0xbd, 0xcf, - 0x65, 0x93, 0x0f, 0xef, 0xbd, 0xfa, 0x28, 0x99, 0x52, 0x9c, 0x6d, 0x16, 0x8a, 0xe0, 0x62, 0x2b, - 0xcf, 0x54, 0x14, 0x8b, 0x1b, 0x4b, 0x87, 0x19, 0xac, 0xe4, 0xd2, 0xbd, 0x98, 0x6b, 0x6c, 0x8a, - 0x71, 0x17, 0xca, 0x7a, 0xbe, 0xfc, 0xa1, 0xd3, 0xc9, 0x97, 0xff, 0x31, 0x80, 0x8a, 0x4c, 0xe5, - 0x25, 0x8d, 0x0f, 0xcb, 0x56, 0xae, 0xd2, 0x70, 0x9a, 0xda, 0x6b, 0x9e, 0x8a, 0x0d, 0xd6, 0x58, - 0xa2, 0xff, 0x93, 0xfb, 0xb4, 0x03, 0xb7, 0xb0, 0xd4, 0xac, 0xcf, 0x89, 0x9f, 0xba, 0xe7, 0x1d, - 0xfe, 0x89, 0x03, 0x93, 0x7c, 0xe6, 0x65, 0x95, 0x7b, 0xaa, 0x5a, 0x88, 0xbb, 0x3d, 0xb6, 0x43, - 0x57, 0x58, 0x14, 0x5f, 0xd9, 0xe0, 0xca, 0x1c, 0xdd, 0x87, 0xb4, 0x04, 0x7d, 0x39, 0xe7, 0x48, - 0x71, 0xc6, 0x96, 0xcd, 0x32, 0xff, 0x59, 0x80, 0x73, 0x07, 0xbd, 0x9c, 0x22, 0xfe, 0x59, 0x57, - 0x93, 0x2a, 0x62, 0xcd, 0xfb, 0x5b, 0x27, 0x64, 0x52, 0xd5, 0xdf, 0x2e, 0x38, 0x92, 0x61, 0xf5, - 0xf3, 0x0e, 0x4c, 0x78, 0x99, 0x50, 0x13, 0x66, 0x07, 0xb2, 0x62, 0x93, 0x9a, 0x89, 0xd2, 0xf8, - 0x15, 0xa6, 0xe4, 0x65, 0xa3, 0x5a, 0x70, 0x07, 0xf3, 0xc9, 0x4f, 0x39, 0xfc, 0xc1, 0xa3, 0xae, - 0x7a, 0xd1, 0xa6, 0xa9, 0x17, 0xad, 0xd8, 0x7c, 0x72, 0x45, 0x57, 0xd0, 0x7e, 0xd5, 0x81, 0xf3, - 0x79, 0x62, 0x3b, 0xa7, 0x49, 0x1f, 0x36, 0x9b, 0x64, 0xf1, 0x28, 0xa2, 0x37, 0xc8, 0xce, 0x3b, - 0x13, 0x7f, 0x32, 0xac, 0xb9, 0xd6, 0x12, 0xd2, 0xb2, 0x1e, 0x98, 0x1c, 0xc0, 0x80, 0x1f, 0x34, - 0xfc, 0x80, 0x88, 0x4b, 0x88, 0x36, 0x0f, 0x66, 0xe2, 0x5d, 0x17, 0x4a, 0x1d, 0x0b, 0x2e, 0xf7, - 0xd8, 0xd3, 0x96, 0x7d, 0xb3, 0xaa, 0xff, 0xf4, 0xdf, 0xac, 0xda, 0x85, 0xe1, 0x5d, 0x3f, 0xa9, - 0xb3, 0x08, 0x01, 0xe1, 0xc0, 0xb2, 0x70, 0x79, 0x8f, 0x92, 0x4b, 0xfb, 0x7e, 0x4b, 0x32, 0xc0, - 0x29, 0x2f, 0x74, 0x85, 0x33, 0x66, 0xe1, 0xc8, 0xd9, 0x38, 0xd1, 0x5b, 0xb2, 0x00, 0xa7, 0x38, - 0x74, 0xb0, 0x46, 0xe9, 0x2f, 0x99, 0xa4, 0x47, 0xe4, 0x92, 0xb5, 0x91, 0x23, 0x50, 0x50, 0xe4, - 0x57, 0x64, 0x6f, 0x69, 0x3c, 0xb0, 0xc1, 0x51, 0xa5, 0xf3, 0x1d, 0xea, 0x9a, 0xce, 0xf7, 0x35, - 0xa6, 0x85, 0x24, 0x7e, 0xd0, 0x26, 0x6b, 0x81, 0x08, 0x62, 0x5e, 0xb1, 0x73, 0xa1, 0x97, 0xd3, - 0xe4, 0xe7, 0xca, 0xf4, 0x37, 0xd6, 0xf8, 0x69, 0x7e, 0x84, 0x91, 0x43, 0xfd, 0x08, 0xa9, 0x1d, - 0x61, 0xd4, 0xba, 0x1d, 0x21, 0x21, 0x2d, 0x2b, 0x76, 0x84, 0x9f, 0xaa, 0x33, 0xee, 0x9f, 0x3b, - 0x80, 0x94, 0x32, 0xe1, 0xc5, 0xdb, 0xe2, 0xa1, 0xc1, 0x93, 0x8f, 0x14, 0xfc, 0xb8, 0x03, 0x10, - 0xa8, 0x97, 0x0d, 0xed, 0xee, 0x5a, 0x9c, 0x66, 0xda, 0x80, 0x14, 0x86, 0x35, 0x9e, 0xee, 0xff, - 0x70, 0xd2, 0x80, 0xdc, 0xb4, 0xef, 0xa7, 0x10, 0x19, 0xb5, 0x67, 0x46, 0x46, 0x6d, 0x58, 0xb4, - 0x47, 0xab, 0x6e, 0x74, 0x89, 0x91, 0xfa, 0x71, 0x01, 0xce, 0xe8, 0xc8, 0x65, 0x72, 0x1a, 0x1f, - 0x7b, 0xd7, 0x08, 0x0b, 0xbd, 0x69, 0xb7, 0xbf, 0x65, 0xe1, 0xd6, 0xc8, 0x0b, 0x41, 0xfe, 0x58, - 0x26, 0x04, 0xf9, 0x96, 0x7d, 0xd6, 0x87, 0xc7, 0x21, 0xff, 0x57, 0x07, 0xce, 0x65, 0x6a, 0x9c, - 0xc2, 0x04, 0xdb, 0x31, 0x27, 0xd8, 0x73, 0xd6, 0x7b, 0xdd, 0x65, 0x76, 0x7d, 0xb3, 0xd0, 0xd1, - 0x5b, 0x76, 0x32, 0xf9, 0xa4, 0x03, 0xc5, 0xc4, 0x8b, 0xb7, 0x65, 0x90, 0xd2, 0x87, 0x4f, 0x64, - 0x06, 0x4c, 0xd3, 0xff, 0x85, 0x74, 0x56, 0xed, 0x63, 0x30, 0xcc, 0xb9, 0x4f, 0x7e, 0xc2, 0x01, - 0x48, 0x91, 0xee, 0x95, 0xca, 0xea, 0x7e, 0xbb, 0x00, 0x17, 0x72, 0xa7, 0x11, 0xfa, 0xb4, 0x32, - 0x33, 0x39, 0xb6, 0x43, 0xf0, 0x0c, 0x46, 0xba, 0xb5, 0x69, 0xcc, 0xb0, 0x36, 0x09, 0x23, 0xd3, - 0xbd, 0x3a, 0x70, 0x08, 0x31, 0xad, 0x0d, 0xd6, 0x8f, 0x9c, 0x34, 0xaa, 0x53, 0x25, 0xeb, 0xf9, - 0x0b, 0x78, 0x33, 0xc5, 0xfd, 0xb1, 0x16, 0xb6, 0x2f, 0x3b, 0x7a, 0x0a, 0xb2, 0x62, 0xd7, 0x94, - 0x15, 0xd8, 0xbe, 0x73, 0xb4, 0x8b, 0xb0, 0xf8, 0x08, 0xe4, 0x79, 0x4b, 0x7b, 0xcb, 0xf4, 0x67, - 0xdc, 0xf1, 0x2c, 0xf4, 0x7c, 0xc7, 0x73, 0x0c, 0x46, 0x5e, 0xf4, 0x5b, 0xca, 0xb1, 0x37, 0xfd, - 0x9d, 0x1f, 0x5e, 0xbe, 0xef, 0xbb, 0x3f, 0xbc, 0x7c, 0xdf, 0x0f, 0x7e, 0x78, 0xf9, 0xbe, 0x8f, - 0x1f, 0x5c, 0x76, 0xbe, 0x73, 0x70, 0xd9, 0xf9, 0xee, 0xc1, 0x65, 0xe7, 0x07, 0x07, 0x97, 0x9d, - 0x7f, 0x7f, 0x70, 0xd9, 0xf9, 0xbb, 0xff, 0xe1, 0xf2, 0x7d, 0x2f, 0x0e, 0xc9, 0x8e, 0xfd, 0xff, - 0x00, 0x00, 0x00, 0xff, 0xff, 0x55, 0xec, 0xee, 0x8b, 0x1d, 0xd3, 0x00, 0x00, + 0xfc, 0xab, 0x8a, 0x66, 0x7a, 0x32, 0x4d, 0x61, 0x58, 0xe3, 0xd9, 0xc3, 0x85, 0xe9, 0x47, 0xa0, + 0xb8, 0x19, 0x52, 0x85, 0xa4, 0xcf, 0xb4, 0x1f, 0x2f, 0x50, 0x20, 0xe6, 0x65, 0xee, 0xff, 0x74, + 0xe0, 0x7c, 0x7e, 0xf4, 0xf8, 0xdb, 0xa1, 0x93, 0x97, 0x01, 0x68, 0x57, 0x0c, 0xa1, 0xae, 0xa5, + 0x4c, 0x90, 0x25, 0x58, 0xc3, 0xea, 0xad, 0xdb, 0x7f, 0x46, 0x95, 0xe2, 0x94, 0xcf, 0xe7, 0x1d, + 0x18, 0xa3, 0x6c, 0x97, 0xa2, 0x0d, 0xa3, 0xb7, 0xab, 0x76, 0x7a, 0xab, 0xc8, 0xa6, 0x66, 0x72, + 0x03, 0x8c, 0x4d, 0xe6, 0xe8, 0xe7, 0x60, 0xd8, 0xab, 0x56, 0x23, 0x12, 0xc7, 0xca, 0xe1, 0xc4, + 0x7c, 0xe1, 0x33, 0x12, 0x88, 0xd3, 0x72, 0x2a, 0x44, 0xeb, 0xd5, 0xcd, 0x98, 0xca, 0x25, 0x21, + 0xb8, 0x95, 0x10, 0xa5, 0x4c, 0x28, 0x1c, 0x2b, 0x0c, 0xf7, 0x57, 0xfa, 0xc1, 0xe4, 0x8d, 0xaa, + 0x70, 0x6a, 0x2b, 0xda, 0x98, 0x63, 0xfe, 0xfa, 0xa3, 0xf8, 0xcd, 0x99, 0x3f, 0x7b, 0xc9, 0xa4, + 0x80, 0xb3, 0x24, 0x05, 0x97, 0x25, 0xb2, 0x9b, 0x78, 0x1b, 0x47, 0xf6, 0x9a, 0x2f, 0x99, 0x14, + 0x70, 0x96, 0x24, 0x7a, 0x37, 0x8c, 0x6c, 0x45, 0x1b, 0x52, 0x44, 0x67, 0x43, 0x30, 0x96, 0xd2, + 0x22, 0xac, 0xe3, 0xd1, 0x21, 0xdc, 0x8a, 0x36, 0xe8, 0xae, 0x28, 0x13, 0x08, 0xa8, 0x21, 0x5c, + 0x12, 0x70, 0xac, 0x30, 0x50, 0x0b, 0xd0, 0x96, 0x1c, 0x3d, 0x15, 0x9d, 0x20, 0x76, 0x92, 0xde, + 0x83, 0x1b, 0x58, 0x58, 0xf8, 0x52, 0x07, 0x1d, 0x9c, 0x43, 0x1b, 0xbd, 0x00, 0x17, 0xb6, 0xa2, + 0x0d, 0xa1, 0x2c, 0xac, 0x45, 0x7e, 0x50, 0xf1, 0x5b, 0x46, 0xb2, 0x80, 0x29, 0xd1, 0xdc, 0x0b, + 0x4b, 0xf9, 0x68, 0xb8, 0x5b, 0x7d, 0xf7, 0x77, 0xfa, 0x81, 0x5d, 0x73, 0xa4, 0xb2, 0xb0, 0x49, + 0x92, 0x7a, 0x58, 0xcd, 0xea, 0x3f, 0x2b, 0x0c, 0x8a, 0x45, 0xa9, 0x0c, 0x7e, 0x2c, 0x74, 0x09, + 0x7e, 0xdc, 0x81, 0xc1, 0x3a, 0xf1, 0xaa, 0x24, 0x92, 0xe6, 0xba, 0x65, 0x3b, 0x17, 0x33, 0xaf, + 0x32, 0xa2, 0xe9, 0x31, 0x9c, 0xff, 0x8e, 0xb1, 0xe4, 0x86, 0xde, 0x03, 0xe3, 0x54, 0x91, 0x09, + 0xdb, 0x89, 0xb4, 0x4d, 0xf7, 0x33, 0xdb, 0x34, 0xdb, 0x51, 0xd7, 0x8d, 0x12, 0x9c, 0xc1, 0x44, + 0xf3, 0x30, 0x21, 0xec, 0xc8, 0xca, 0x0c, 0x28, 0x06, 0x56, 0x65, 0x71, 0x28, 0x67, 0xca, 0x71, + 0x47, 0x0d, 0x16, 0xbc, 0x16, 0x56, 0xb9, 0x2b, 0x51, 0x0f, 0x5e, 0x0b, 0xab, 0xbb, 0x98, 0x95, + 0xa0, 0x57, 0x60, 0x88, 0xfe, 0x5d, 0x88, 0xc2, 0xa6, 0xb0, 0xcd, 0xac, 0xd9, 0x19, 0x1d, 0xca, + 0x43, 0x9c, 0x14, 0x99, 0x82, 0x37, 0x2b, 0xb8, 0x60, 0xc5, 0x8f, 0x9e, 0x57, 0xe4, 0x3e, 0x5c, + 0xde, 0xf2, 0x5b, 0xcf, 0x93, 0xc8, 0xdf, 0xdc, 0x65, 0x4a, 0xc3, 0x50, 0x7a, 0x5e, 0xb9, 0xd6, + 0x81, 0x81, 0x73, 0x6a, 0xb9, 0x9f, 0x2f, 0xc0, 0xa8, 0x7e, 0x5b, 0xf6, 0x4e, 0x11, 0xb1, 0x71, + 0x3a, 0x29, 0xf8, 0xe9, 0xf4, 0xaa, 0x85, 0x6e, 0xdf, 0x69, 0x42, 0xd4, 0xa1, 0xdf, 0x6b, 0x0b, + 0x6d, 0xd1, 0x8a, 0x11, 0x8c, 0xf5, 0xb8, 0x9d, 0xd4, 0xf9, 0xb5, 0x2a, 0x16, 0xab, 0xca, 0x38, + 0xb8, 0x9f, 0xea, 0x83, 0x21, 0x59, 0x88, 0x3e, 0xe9, 0x00, 0xa4, 0x31, 0x43, 0x42, 0x94, 0xae, + 0xd9, 0x08, 0x28, 0xd1, 0xc3, 0x9d, 0x34, 0xc3, 0xb5, 0x82, 0x63, 0x8d, 0x2f, 0x4a, 0x60, 0x20, + 0xa4, 0x8d, 0xbb, 0x6c, 0xef, 0xc6, 0xf7, 0x2a, 0x65, 0x7c, 0x99, 0x71, 0x4f, 0xcd, 0x66, 0x0c, + 0x86, 0x05, 0x2f, 0x7a, 0x02, 0xdc, 0x90, 0xa1, 0x6c, 0xf6, 0x4c, 0xcc, 0x2a, 0x3a, 0x2e, 0x3d, + 0xd0, 0x29, 0x10, 0x4e, 0x19, 0xba, 0x4f, 0xc1, 0xb8, 0xb9, 0x18, 0xe8, 0x89, 0x60, 0x63, 0x37, + 0x21, 0xdc, 0xde, 0x30, 0xca, 0x4f, 0x04, 0xb3, 0x14, 0x80, 0x39, 0xdc, 0xfd, 0x3e, 0xd5, 0x03, + 0x94, 0x78, 0xe9, 0xc1, 0xc4, 0xff, 0x88, 0x6e, 0x2c, 0xeb, 0x76, 0xec, 0xfa, 0x38, 0x0c, 0xb3, + 0x7f, 0xd8, 0x42, 0xef, 0xb3, 0xe5, 0x78, 0x4e, 0xdb, 0x29, 0x96, 0x3a, 0xd3, 0x09, 0x9e, 0x97, + 0x8c, 0x70, 0xca, 0xd3, 0x0d, 0x61, 0x22, 0x8b, 0x8d, 0x3e, 0x08, 0xa3, 0xb1, 0xdc, 0x56, 0xd3, + 0xbb, 0x5f, 0x3d, 0x6e, 0xbf, 0xcc, 0xee, 0x5b, 0xd6, 0xaa, 0x63, 0x83, 0x98, 0xbb, 0x0a, 0x03, + 0x56, 0x87, 0xd0, 0xfd, 0xb6, 0x03, 0xc3, 0xcc, 0xf3, 0x56, 0x8b, 0xbc, 0x66, 0x5a, 0xa5, 0xef, + 0x80, 0x51, 0x8f, 0x61, 0x90, 0x9f, 0xd1, 0x65, 0xc4, 0x8a, 0x05, 0x29, 0xc3, 0x13, 0xb5, 0xa5, + 0x52, 0x86, 0x1b, 0x03, 0x62, 0x2c, 0x39, 0xb9, 0x9f, 0x2e, 0xc0, 0xc0, 0xb5, 0xa0, 0xd5, 0xfe, + 0x2b, 0x9f, 0x2c, 0x6c, 0x05, 0xfa, 0xaf, 0x25, 0xa4, 0x69, 0xe6, 0xb4, 0x1b, 0x9d, 0x7d, 0x54, + 0xcf, 0x67, 0x57, 0x32, 0xf3, 0xd9, 0x61, 0x6f, 0x47, 0x06, 0x74, 0x09, 0x1b, 0x71, 0x7a, 0xff, + 0xed, 0x49, 0x18, 0x5e, 0xf6, 0x36, 0x48, 0x63, 0x89, 0xec, 0xb2, 0xdb, 0x6a, 0x3c, 0xb8, 0xc0, + 0x49, 0x0f, 0xf6, 0x46, 0x20, 0xc0, 0x3c, 0x8c, 0x33, 0x6c, 0xb5, 0x18, 0xe8, 0xc9, 0x81, 0xa4, + 0x09, 0x81, 0x1c, 0xf3, 0xe4, 0xa0, 0x25, 0x03, 0xd2, 0xb0, 0xdc, 0x69, 0x18, 0x49, 0xa9, 0xf4, + 0xc0, 0xf5, 0xa7, 0x05, 0x18, 0x33, 0x4c, 0xdd, 0x86, 0x03, 0xd0, 0xb9, 0xa3, 0x03, 0xd0, 0x70, + 0xc8, 0x15, 0xee, 0xb5, 0x43, 0xae, 0xef, 0xe4, 0x1d, 0x72, 0xe6, 0x47, 0xea, 0xef, 0xe9, 0x23, + 0x35, 0xa0, 0x7f, 0xd9, 0x0f, 0xb6, 0x7a, 0x93, 0x33, 0x71, 0x25, 0x6c, 0x75, 0xc8, 0x99, 0x32, + 0x05, 0x62, 0x5e, 0x26, 0x35, 0x97, 0xbe, 0x7c, 0xcd, 0xc5, 0xfd, 0xa4, 0x03, 0xa3, 0x2b, 0x5e, + 0xe0, 0x6f, 0x92, 0x38, 0x61, 0xf3, 0x2a, 0x39, 0xd6, 0x5b, 0x4b, 0xa3, 0x5d, 0xee, 0xdf, 0xbf, + 0xe1, 0xc0, 0xe9, 0x15, 0xd2, 0x0c, 0xfd, 0x57, 0xbc, 0x34, 0x5e, 0x92, 0xb6, 0xbd, 0xee, 0x27, + 0x22, 0x3c, 0x4c, 0xb5, 0xfd, 0xaa, 0x9f, 0x60, 0x0a, 0xbf, 0x83, 0x1d, 0x97, 0xdd, 0x07, 0xa0, + 0x07, 0x34, 0xed, 0x26, 0x5d, 0x1a, 0x09, 0x29, 0x0b, 0x70, 0x8a, 0xe3, 0xfe, 0xae, 0x03, 0x83, + 0xbc, 0x11, 0x2a, 0xc4, 0xd4, 0xe9, 0x42, 0xbb, 0x0e, 0x45, 0x56, 0x4f, 0xcc, 0xea, 0x45, 0x0b, + 0xea, 0x0f, 0x25, 0xc7, 0xd7, 0x20, 0xfb, 0x17, 0x73, 0x06, 0xec, 0xd8, 0xe2, 0xdd, 0x9a, 0x51, + 0xa1, 0xa2, 0xe9, 0xb1, 0x85, 0x41, 0xb1, 0x28, 0x75, 0xbf, 0xde, 0x07, 0x43, 0x2a, 0xed, 0x14, + 0x4b, 0x0a, 0x10, 0x04, 0x61, 0xe2, 0xf1, 0xc0, 0x02, 0x2e, 0xab, 0x3f, 0x68, 0x2f, 0xed, 0xd5, + 0xf4, 0x4c, 0x4a, 0x9d, 0xfb, 0xef, 0xd4, 0x21, 0x54, 0x2b, 0xc1, 0x7a, 0x23, 0xd0, 0xc7, 0x60, + 0xa0, 0x41, 0xa5, 0x8f, 0x14, 0xdd, 0xcf, 0x5b, 0x6c, 0x0e, 0x13, 0x6b, 0xa2, 0x25, 0x6a, 0x84, + 0x38, 0x10, 0x0b, 0xae, 0x93, 0xef, 0x83, 0x89, 0x6c, 0xab, 0xef, 0x74, 0xd1, 0x6f, 0x58, 0xbf, + 0x26, 0xf8, 0x37, 0x85, 0xf4, 0x3c, 0x7c, 0x55, 0xf7, 0x39, 0x18, 0x59, 0x21, 0x49, 0xe4, 0x57, + 0x18, 0x81, 0x3b, 0x4d, 0xae, 0x9e, 0xf4, 0x87, 0xcf, 0xb0, 0xc9, 0x4a, 0x69, 0xc6, 0xe8, 0x35, + 0x80, 0x56, 0x14, 0xd2, 0xf3, 0x2b, 0x69, 0xcb, 0x8f, 0x6d, 0x41, 0x1f, 0x5e, 0x53, 0x34, 0xb9, + 0xcb, 0x39, 0xfd, 0x8d, 0x35, 0x7e, 0xee, 0x8b, 0x50, 0x5c, 0x69, 0x27, 0xe4, 0x56, 0x0f, 0x12, + 0xeb, 0xb0, 0x37, 0xdf, 0xdd, 0x0f, 0xc2, 0x28, 0xa3, 0x7d, 0x35, 0x6c, 0xd0, 0x6d, 0x95, 0x0e, + 0x4d, 0x93, 0xfe, 0xce, 0x3a, 0x05, 0x18, 0x12, 0xe6, 0x65, 0x74, 0xc9, 0xd4, 0xc3, 0x46, 0x55, + 0xdd, 0x02, 0x52, 0x13, 0xe2, 0x2a, 0x83, 0x62, 0x51, 0xea, 0xfe, 0x52, 0x01, 0x46, 0x58, 0x45, + 0x21, 0x6e, 0x76, 0x61, 0xb0, 0xce, 0xf9, 0x88, 0x31, 0xb4, 0x10, 0x52, 0xa7, 0xb7, 0x5e, 0x3b, + 0xcb, 0x71, 0x00, 0x96, 0xfc, 0x28, 0xeb, 0x1d, 0xcf, 0x4f, 0x28, 0xeb, 0xc2, 0xf1, 0xb2, 0xbe, + 0xc9, 0xd9, 0x60, 0xc9, 0xcf, 0xfd, 0x45, 0x60, 0xb7, 0x6b, 0x17, 0x1a, 0x5e, 0x8d, 0x8f, 0x5c, + 0xb8, 0x45, 0xaa, 0x42, 0xe6, 0x6a, 0x23, 0x47, 0xa1, 0x58, 0x94, 0xf2, 0x1b, 0x8b, 0x49, 0xe4, + 0xab, 0xa8, 0x5c, 0xed, 0xc6, 0x22, 0x03, 0xcb, 0x18, 0xec, 0xaa, 0xfb, 0xe5, 0x02, 0x00, 0x4b, + 0x52, 0xc6, 0x2f, 0xc5, 0xfe, 0x3c, 0x14, 0x5b, 0x75, 0x2f, 0xce, 0x3a, 0x12, 0x8b, 0x6b, 0x14, + 0x78, 0x5b, 0x5c, 0xfb, 0x65, 0x3f, 0x30, 0x47, 0xd4, 0x83, 0xe5, 0x0b, 0x07, 0x07, 0xcb, 0xa3, + 0x16, 0x0c, 0x86, 0xed, 0x84, 0xea, 0xaa, 0x62, 0xb3, 0xb7, 0xe0, 0x47, 0x5f, 0xe5, 0x04, 0x79, + 0x84, 0xb9, 0xf8, 0x81, 0x25, 0x1b, 0xf4, 0x0c, 0x0c, 0xb5, 0xa2, 0xb0, 0x46, 0xf7, 0x6e, 0xb1, + 0xbd, 0x3f, 0x28, 0xf5, 0xa1, 0x35, 0x01, 0xbf, 0xad, 0xfd, 0x8f, 0x15, 0xb6, 0xfb, 0xc7, 0x13, + 0x7c, 0x5c, 0xc4, 0xdc, 0x9b, 0x84, 0x82, 0x2f, 0x2d, 0x53, 0x20, 0x48, 0x14, 0xae, 0xcd, 0xe3, + 0x82, 0x5f, 0x55, 0xeb, 0xaa, 0xd0, 0x75, 0x5d, 0xbd, 0x1b, 0x46, 0xaa, 0x7e, 0xdc, 0x6a, 0x78, + 0xbb, 0xd7, 0x73, 0xcc, 0x82, 0xf3, 0x69, 0x11, 0xd6, 0xf1, 0xd0, 0x93, 0xe2, 0x6a, 0x44, 0xbf, + 0x61, 0x0a, 0x92, 0x57, 0x23, 0xd2, 0x4b, 0xd7, 0xfc, 0x56, 0x44, 0xf6, 0x72, 0x7a, 0xb1, 0xe7, + 0xcb, 0xe9, 0x59, 0x4d, 0x6c, 0xe0, 0xe4, 0x35, 0xb1, 0xf7, 0xc2, 0x98, 0xfc, 0xc9, 0xd4, 0xa3, + 0xd2, 0x59, 0xd6, 0x7a, 0x65, 0xae, 0x5e, 0xd7, 0x0b, 0xb1, 0x89, 0x9b, 0x4e, 0xda, 0xc1, 0x5e, + 0x27, 0xed, 0x65, 0x80, 0x8d, 0xb0, 0x1d, 0x54, 0xbd, 0x68, 0xf7, 0xda, 0xbc, 0x08, 0xa4, 0x54, + 0x8a, 0xdf, 0xac, 0x2a, 0xc1, 0x1a, 0x96, 0x3e, 0xd1, 0x87, 0xef, 0x30, 0xd1, 0x3f, 0x08, 0xc3, + 0x2c, 0xe8, 0x94, 0x54, 0x67, 0x12, 0x11, 0x62, 0x74, 0x98, 0xf8, 0x44, 0x25, 0x73, 0xcb, 0x92, + 0x08, 0x4e, 0xe9, 0xa1, 0x0f, 0x01, 0x6c, 0xfa, 0x81, 0x1f, 0xd7, 0x19, 0xf5, 0x91, 0x43, 0x53, + 0x57, 0xfd, 0x5c, 0x50, 0x54, 0xb0, 0x46, 0x11, 0xbd, 0x04, 0xa7, 0x49, 0x9c, 0xf8, 0x4d, 0x2f, + 0x21, 0x55, 0x75, 0x99, 0xb0, 0xc4, 0x6c, 0x99, 0x2a, 0xec, 0xf7, 0x4a, 0x16, 0xe1, 0x76, 0x1e, + 0x10, 0x77, 0x12, 0x32, 0x56, 0xe4, 0xe4, 0x61, 0x56, 0x24, 0xfa, 0x73, 0x07, 0x4e, 0x47, 0x84, + 0xc7, 0x9d, 0xc4, 0xaa, 0x61, 0xe7, 0x98, 0x38, 0xae, 0xd8, 0xc8, 0xff, 0xad, 0x12, 0x7d, 0xe0, + 0x2c, 0x17, 0xae, 0xb8, 0x10, 0xd9, 0xfb, 0x8e, 0xf2, 0xdb, 0x79, 0xc0, 0x37, 0xde, 0x9a, 0x9a, + 0xea, 0xcc, 0x43, 0xaf, 0x88, 0xd3, 0x95, 0xf7, 0x77, 0xdf, 0x9a, 0x9a, 0x90, 0xbf, 0xd3, 0x41, + 0xeb, 0xe8, 0x24, 0xdd, 0x56, 0x5b, 0x61, 0xf5, 0xda, 0x9a, 0x88, 0x05, 0x53, 0xdb, 0xea, 0x1a, + 0x05, 0x62, 0x5e, 0x86, 0x1e, 0x87, 0xa1, 0xaa, 0x47, 0x9a, 0x61, 0xa0, 0x32, 0xb9, 0x32, 0x6d, + 0x7e, 0x5e, 0xc0, 0xb0, 0x2a, 0xa5, 0x67, 0x88, 0x40, 0x6c, 0x29, 0xa5, 0x07, 0x6c, 0x9d, 0x21, + 0xe4, 0x26, 0xc5, 0xb9, 0xca, 0x5f, 0x58, 0x71, 0x42, 0x0d, 0x18, 0xf0, 0x99, 0xa1, 0x42, 0x84, + 0x9b, 0x5a, 0xb0, 0x8e, 0x70, 0xc3, 0x87, 0x0c, 0x36, 0x65, 0xa2, 0x5f, 0xf0, 0xd0, 0xf7, 0x9a, + 0x53, 0x27, 0xb3, 0xd7, 0x3c, 0x0e, 0x43, 0x95, 0xba, 0xdf, 0xa8, 0x46, 0x24, 0x28, 0x4d, 0xb0, + 0x13, 0x3b, 0x1b, 0x89, 0x39, 0x01, 0xc3, 0xaa, 0x14, 0xfd, 0x0d, 0x18, 0x0b, 0xdb, 0x09, 0x13, + 0x2d, 0x74, 0x9c, 0xe2, 0xd2, 0x69, 0x86, 0xce, 0x82, 0x87, 0x56, 0xf5, 0x02, 0x6c, 0xe2, 0x51, + 0x11, 0x5f, 0x0f, 0x63, 0x96, 0x93, 0x86, 0x89, 0xf8, 0xf3, 0xa6, 0x88, 0xbf, 0xaa, 0x95, 0x61, + 0x03, 0x13, 0x7d, 0xd5, 0x81, 0xd3, 0xcd, 0xec, 0x01, 0xae, 0x74, 0x81, 0x8d, 0x4c, 0xd9, 0x86, + 0xa2, 0x9f, 0x21, 0xcd, 0x63, 0xac, 0x3b, 0xc0, 0xb8, 0xb3, 0x11, 0x2c, 0x3b, 0x54, 0xbc, 0x1b, + 0x54, 0xea, 0x51, 0x18, 0x98, 0xcd, 0xbb, 0xdf, 0xd6, 0x9d, 0x28, 0xb6, 0xb6, 0xf3, 0x58, 0xcc, + 0xde, 0xbf, 0xbf, 0x37, 0x75, 0x2e, 0xb7, 0x08, 0xe7, 0x37, 0x6a, 0x72, 0x1e, 0xce, 0xe7, 0xcb, + 0x87, 0x3b, 0x9d, 0x38, 0xfa, 0xf4, 0x13, 0xc7, 0x02, 0xdc, 0xdf, 0xb5, 0x51, 0x74, 0xa7, 0x91, + 0xda, 0xa6, 0x63, 0xee, 0x34, 0x1d, 0xda, 0xe1, 0x38, 0x8c, 0xea, 0x0f, 0x17, 0xb8, 0xff, 0xb7, + 0x0f, 0x20, 0xb5, 0x93, 0x23, 0x0f, 0xc6, 0xb9, 0x4d, 0xfe, 0xda, 0xfc, 0x91, 0x6f, 0x73, 0xcf, + 0x19, 0x04, 0x70, 0x86, 0x20, 0x6a, 0x02, 0xe2, 0x10, 0xfe, 0xfb, 0x28, 0xbe, 0x55, 0xe6, 0x8a, + 0x9c, 0xeb, 0x20, 0x82, 0x73, 0x08, 0xd3, 0x1e, 0x25, 0xe1, 0x16, 0x09, 0x6e, 0xe0, 0xe5, 0xa3, + 0xa4, 0x04, 0xe0, 0xde, 0x38, 0x83, 0x00, 0xce, 0x10, 0x44, 0x2e, 0x0c, 0x30, 0xdb, 0x8c, 0x0c, + 0xd0, 0x66, 0xe2, 0x85, 0x69, 0x1a, 0x31, 0x16, 0x25, 0xe8, 0xcb, 0x0e, 0x8c, 0xcb, 0xcc, 0x06, + 0xcc, 0x1a, 0x2a, 0x43, 0xb3, 0x6f, 0xd8, 0xf2, 0x73, 0x5c, 0xd1, 0xa9, 0xa7, 0x81, 0x8f, 0x06, + 0x38, 0xc6, 0x99, 0x46, 0xb8, 0x2f, 0xc0, 0x99, 0x9c, 0xea, 0x56, 0x4e, 0xb4, 0xdf, 0x71, 0x60, + 0x44, 0x4b, 0xb8, 0x87, 0x5e, 0x83, 0xe1, 0xb0, 0x6c, 0x3d, 0xda, 0x6e, 0xb5, 0xdc, 0x11, 0x6d, + 0xa7, 0x40, 0x38, 0x65, 0xd8, 0x4b, 0x90, 0x60, 0x6e, 0x76, 0xc0, 0x7b, 0xdc, 0xec, 0x43, 0x07, + 0x09, 0xfe, 0x4a, 0x11, 0x52, 0x4a, 0x87, 0xcc, 0xb8, 0x91, 0x86, 0x14, 0x16, 0x0e, 0x0c, 0x29, + 0xac, 0xc2, 0x29, 0x8f, 0xf9, 0x92, 0x8f, 0x98, 0x67, 0x83, 0xe7, 0x5b, 0x35, 0x29, 0xe0, 0x2c, + 0x49, 0xca, 0x25, 0x4e, 0xab, 0x32, 0x2e, 0xfd, 0x87, 0xe6, 0x52, 0x36, 0x29, 0xe0, 0x2c, 0x49, + 0xf4, 0x12, 0x94, 0x2a, 0xec, 0xde, 0x28, 0xef, 0xe3, 0xb5, 0xcd, 0xeb, 0x61, 0xb2, 0x16, 0x91, + 0x98, 0x04, 0x89, 0xc8, 0xa8, 0xf5, 0xb0, 0x18, 0x85, 0xd2, 0x5c, 0x17, 0x3c, 0xdc, 0x95, 0x02, + 0x3d, 0xa6, 0x30, 0x67, 0xb4, 0x9f, 0xec, 0x32, 0x21, 0x22, 0xbc, 0xf4, 0xea, 0x98, 0x52, 0xd6, + 0x0b, 0xb1, 0x89, 0x8b, 0x7e, 0xd9, 0x81, 0xb1, 0x86, 0x34, 0xd7, 0xe3, 0x76, 0x43, 0xa6, 0x87, + 0xc4, 0x56, 0xa6, 0xdf, 0xb2, 0x4e, 0x99, 0xeb, 0x12, 0x06, 0x08, 0x9b, 0xbc, 0xb3, 0x49, 0x4f, + 0x86, 0x7a, 0x4c, 0x7a, 0xf2, 0x7d, 0x07, 0x26, 0xb2, 0xdc, 0xd0, 0x16, 0x3c, 0xd4, 0xf4, 0xa2, + 0xad, 0x6b, 0xc1, 0x66, 0xc4, 0x2e, 0x62, 0x24, 0x7c, 0x32, 0xcc, 0x6c, 0x26, 0x24, 0x9a, 0xf7, + 0x76, 0xb9, 0xfb, 0xb3, 0xa8, 0xde, 0x17, 0x7a, 0x68, 0xe5, 0x20, 0x64, 0x7c, 0x30, 0x2d, 0x54, + 0x86, 0x73, 0x14, 0x81, 0xe5, 0x44, 0xf3, 0xc3, 0x20, 0x65, 0x52, 0x60, 0x4c, 0x54, 0x30, 0xe0, + 0x4a, 0x1e, 0x12, 0xce, 0xaf, 0xeb, 0x0e, 0xc1, 0x00, 0xbf, 0x84, 0xe6, 0xfe, 0xbb, 0x02, 0x48, + 0xdd, 0xee, 0xaf, 0xb6, 0x47, 0x8d, 0xee, 0x83, 0x11, 0xb3, 0x0a, 0x09, 0x83, 0x05, 0xdb, 0x07, + 0x45, 0x02, 0x41, 0x51, 0x42, 0x95, 0x5e, 0x72, 0xcb, 0x4f, 0xe6, 0xc2, 0xaa, 0x34, 0x53, 0x30, + 0xa5, 0xf7, 0x8a, 0x80, 0x61, 0x55, 0xea, 0x7e, 0xd2, 0x81, 0x31, 0xda, 0xcb, 0x46, 0x83, 0x34, + 0xca, 0x09, 0x69, 0xc5, 0x28, 0x86, 0x62, 0x4c, 0xff, 0xb1, 0x67, 0xcd, 0x4b, 0xef, 0x1e, 0x92, + 0x96, 0xe6, 0x6f, 0xa1, 0x4c, 0x30, 0xe7, 0xe5, 0xbe, 0xd9, 0x07, 0xc3, 0x6a, 0xb0, 0x7b, 0x30, + 0x89, 0x5e, 0x4e, 0x73, 0x7b, 0x72, 0x21, 0x5a, 0xd2, 0xf2, 0x7a, 0xde, 0xa6, 0x43, 0x17, 0xec, + 0xf2, 0x24, 0x07, 0x69, 0x92, 0xcf, 0x27, 0x4d, 0x6f, 0xf1, 0x79, 0xdd, 0x05, 0xa9, 0xe1, 0x0b, + 0xb7, 0xf1, 0x2d, 0xdd, 0x59, 0xdf, 0x6f, 0x6b, 0x43, 0x52, 0x9e, 0xc8, 0xee, 0x5e, 0xfa, 0xcc, + 0xb3, 0x2f, 0xc5, 0x9e, 0x9e, 0x7d, 0x79, 0x02, 0xfa, 0x49, 0xd0, 0x6e, 0x32, 0x6d, 0x67, 0x98, + 0x69, 0xf9, 0xfd, 0x57, 0x82, 0x76, 0xd3, 0xec, 0x19, 0x43, 0x41, 0xef, 0x83, 0x91, 0x2a, 0x89, + 0x2b, 0x91, 0xcf, 0x6e, 0xee, 0x0b, 0xe3, 0xcc, 0x83, 0xcc, 0xe2, 0x95, 0x82, 0xcd, 0x8a, 0x7a, + 0x05, 0xf7, 0x15, 0x18, 0x58, 0x6b, 0xb4, 0x6b, 0x7e, 0x80, 0x5a, 0x30, 0xc0, 0xef, 0xf1, 0x8b, + 0x0d, 0xdb, 0xc2, 0xd1, 0x91, 0xaf, 0x76, 0x2d, 0x90, 0x84, 0x5f, 0x41, 0x15, 0x7c, 0xdc, 0xdf, + 0x2a, 0x00, 0x3d, 0x5d, 0x2f, 0xce, 0xa1, 0xbf, 0xdd, 0xf1, 0xca, 0xc9, 0xcf, 0xe4, 0xbc, 0x72, + 0x32, 0xc6, 0x90, 0x73, 0x1e, 0x38, 0x69, 0xc0, 0x18, 0xf3, 0x6f, 0xc8, 0x6d, 0x4c, 0x68, 0xc6, + 0x4f, 0xf7, 0x78, 0xf5, 0x5d, 0xaf, 0x2a, 0x84, 0xba, 0x0e, 0xc2, 0x26, 0x71, 0xb4, 0x0b, 0x67, + 0x78, 0x8a, 0xc8, 0x79, 0xd2, 0xf0, 0x76, 0x8d, 0x54, 0x50, 0x3d, 0x5f, 0xb7, 0x97, 0xb5, 0x78, + 0x8c, 0xf6, 0x7c, 0x27, 0x39, 0x9c, 0xc7, 0xc3, 0xfd, 0xbd, 0x7e, 0xd0, 0x3c, 0x10, 0x3d, 0xac, + 0xac, 0x8f, 0x66, 0xfc, 0x4d, 0x2b, 0x56, 0xfc, 0x4d, 0xd2, 0x89, 0xc3, 0xa5, 0x95, 0xe9, 0x62, + 0xa2, 0x8d, 0xaa, 0x93, 0x46, 0x4b, 0xac, 0x4b, 0xd5, 0xa8, 0xab, 0xa4, 0xd1, 0xc2, 0xac, 0x44, + 0xdd, 0x1f, 0xec, 0xef, 0x7a, 0x7f, 0xb0, 0x0e, 0xc5, 0x9a, 0xd7, 0xae, 0x11, 0x11, 0x70, 0x69, + 0xc1, 0xb5, 0xc8, 0x6e, 0x34, 0x70, 0xd7, 0x22, 0xfb, 0x17, 0x73, 0x06, 0x54, 0x30, 0xd4, 0x65, + 0x04, 0x8a, 0xb0, 0xc9, 0x5a, 0x10, 0x0c, 0x2a, 0xa8, 0x85, 0x0b, 0x06, 0xf5, 0x13, 0xa7, 0xcc, + 0x50, 0x0b, 0x06, 0x2b, 0x3c, 0x59, 0x87, 0x50, 0x51, 0xae, 0xd9, 0xb8, 0x20, 0xc9, 0x08, 0x72, + 0xe3, 0x89, 0xf8, 0x81, 0x25, 0x1b, 0xf7, 0x12, 0x8c, 0x68, 0x0f, 0x33, 0xd0, 0xcf, 0xa0, 0xf2, + 0x44, 0x68, 0x9f, 0x61, 0xde, 0x4b, 0x3c, 0xcc, 0x4a, 0xdc, 0x6f, 0xf6, 0x83, 0x32, 0x9d, 0xe9, + 0xd7, 0xf9, 0xbc, 0x8a, 0x96, 0xd5, 0xc6, 0xb8, 0x47, 0x1e, 0x06, 0x58, 0x94, 0x52, 0x35, 0xae, + 0x49, 0xa2, 0x9a, 0x3a, 0x36, 0x0b, 0xd1, 0xae, 0xd4, 0xb8, 0x15, 0xbd, 0x10, 0x9b, 0xb8, 0x54, + 0x07, 0x6f, 0x0a, 0x8f, 0x7c, 0x36, 0xde, 0x59, 0x7a, 0xea, 0xb1, 0xc2, 0x40, 0x9f, 0x74, 0x60, + 0xb4, 0xa9, 0x39, 0xf0, 0x45, 0xdc, 0xa5, 0x0d, 0xff, 0x91, 0x46, 0x95, 0xc7, 0x47, 0xe9, 0x10, + 0x6c, 0x70, 0x45, 0x8b, 0x70, 0x3a, 0x26, 0xc9, 0xea, 0x4e, 0x40, 0x22, 0x75, 0xcd, 0x5e, 0xe4, + 0x5d, 0x50, 0x97, 0x1d, 0xca, 0x59, 0x04, 0xdc, 0x59, 0x27, 0x37, 0x54, 0xb5, 0x78, 0xe8, 0x50, + 0xd5, 0x79, 0x98, 0xd8, 0xf4, 0xfc, 0x46, 0x3b, 0x22, 0x5d, 0x03, 0x5e, 0x17, 0x32, 0xe5, 0xb8, + 0xa3, 0x06, 0xbb, 0x6f, 0xd3, 0xf0, 0x6a, 0x71, 0x69, 0x50, 0xbb, 0x6f, 0x43, 0x01, 0x98, 0xc3, + 0xdd, 0xdf, 0x70, 0x80, 0x27, 0xbc, 0x99, 0xd9, 0xdc, 0xf4, 0x03, 0x3f, 0xd9, 0x45, 0x5f, 0x73, + 0x60, 0x22, 0x08, 0xab, 0x64, 0x26, 0x48, 0x7c, 0x09, 0xb4, 0x97, 0x85, 0x9c, 0xf1, 0xba, 0x9e, + 0x21, 0xcf, 0xb3, 0x27, 0x64, 0xa1, 0xb8, 0xa3, 0x19, 0xee, 0x05, 0x38, 0x97, 0x4b, 0xc0, 0xfd, + 0x7e, 0x1f, 0x98, 0x79, 0x7b, 0xd0, 0x73, 0x50, 0x6c, 0xb0, 0x4c, 0x12, 0xce, 0x11, 0x13, 0x32, + 0xb1, 0xb1, 0xe2, 0xa9, 0x26, 0x38, 0x25, 0x34, 0x0f, 0x23, 0x2c, 0x19, 0x90, 0xc8, 0xf3, 0xc1, + 0x57, 0x84, 0x9b, 0x3e, 0x7e, 0xa6, 0x8a, 0x6e, 0x9b, 0x3f, 0xb1, 0x5e, 0x0d, 0xbd, 0x0a, 0x83, + 0x1b, 0x3c, 0x25, 0xa2, 0x3d, 0x17, 0x9f, 0xc8, 0xb1, 0xc8, 0xf4, 0x28, 0x99, 0x70, 0xf1, 0x76, + 0xfa, 0x2f, 0x96, 0x1c, 0xd1, 0x2e, 0x0c, 0x79, 0xf2, 0x9b, 0xf6, 0xdb, 0xba, 0x3f, 0x61, 0xcc, + 0x1f, 0x11, 0x20, 0x23, 0xbf, 0xa1, 0x62, 0x97, 0x89, 0x24, 0x2a, 0xf6, 0x14, 0x49, 0xf4, 0x6d, + 0x07, 0x20, 0x7d, 0x3f, 0x02, 0xdd, 0x82, 0xa1, 0xf8, 0x69, 0xc3, 0x2e, 0x61, 0xe3, 0xe2, 0xbc, + 0xa0, 0xa8, 0x5d, 0x2e, 0x15, 0x10, 0xac, 0xb8, 0xdd, 0xc9, 0x96, 0xf2, 0x53, 0x07, 0xce, 0xe6, + 0xbd, 0x73, 0x71, 0x0f, 0x5b, 0x7c, 0x58, 0x33, 0x8a, 0xa8, 0xb0, 0x16, 0x91, 0x4d, 0xff, 0x56, + 0x4e, 0x62, 0x5e, 0x5e, 0x80, 0x53, 0x1c, 0xf7, 0x8d, 0x41, 0x50, 0x8c, 0x8f, 0xc9, 0xec, 0xf2, + 0x18, 0x3d, 0x5f, 0xd5, 0xd2, 0xfb, 0x8e, 0x0a, 0x0f, 0x33, 0x28, 0x16, 0xa5, 0xf4, 0x8c, 0x25, + 0x63, 0xe0, 0x85, 0xc8, 0x66, 0xb3, 0x50, 0xc6, 0xca, 0x63, 0x55, 0x9a, 0x67, 0xc8, 0x29, 0x9e, + 0x88, 0x21, 0x67, 0xc0, 0xbe, 0x21, 0xe7, 0x09, 0x18, 0x8c, 0xc2, 0x06, 0x99, 0xc1, 0xd7, 0xc5, + 0xc9, 0x21, 0x8d, 0x61, 0xe0, 0x60, 0x2c, 0xcb, 0x8f, 0x68, 0xca, 0x40, 0xbf, 0xed, 0x1c, 0x60, + 0x2b, 0x1a, 0xb6, 0xb5, 0x27, 0xe4, 0x66, 0x31, 0x63, 0xc7, 0xa0, 0xa3, 0x18, 0xa0, 0xbe, 0xee, + 0xc0, 0x69, 0x12, 0x54, 0xa2, 0x5d, 0x46, 0x47, 0x50, 0x13, 0x2e, 0xe6, 0x1b, 0x36, 0x16, 0xdf, + 0x95, 0x2c, 0x71, 0xee, 0xc9, 0xe9, 0x00, 0xe3, 0xce, 0x66, 0xa0, 0x55, 0x18, 0xaa, 0x78, 0x62, + 0x46, 0x8c, 0x1c, 0x66, 0x46, 0x70, 0x47, 0xd9, 0x8c, 0x98, 0x0a, 0x8a, 0x88, 0xfb, 0xe3, 0x02, + 0x9c, 0xc9, 0x69, 0x12, 0xbb, 0x2f, 0xd5, 0xa4, 0x33, 0xf2, 0x5a, 0x35, 0xbb, 0x1e, 0x97, 0x04, + 0x1c, 0x2b, 0x0c, 0xb4, 0x06, 0x67, 0xb7, 0x9a, 0x71, 0x4a, 0x65, 0x2e, 0x0c, 0x12, 0x72, 0x4b, + 0xae, 0x4e, 0xe9, 0x7e, 0x3e, 0xbb, 0x94, 0x83, 0x83, 0x73, 0x6b, 0x52, 0xf5, 0x85, 0x04, 0xde, + 0x46, 0x83, 0xa4, 0x45, 0xe2, 0xb6, 0x9f, 0x52, 0x5f, 0xae, 0x64, 0xca, 0x71, 0x47, 0x0d, 0xf4, + 0x59, 0x07, 0x1e, 0x88, 0x49, 0xb4, 0x4d, 0xa2, 0xb2, 0x5f, 0x25, 0x73, 0xed, 0x38, 0x09, 0x9b, + 0x24, 0x3a, 0xa2, 0x75, 0x74, 0x6a, 0x7f, 0x6f, 0xea, 0x81, 0x72, 0x77, 0x6a, 0xf8, 0x20, 0x56, + 0xee, 0x67, 0x1d, 0x18, 0x2f, 0xb3, 0x83, 0xb7, 0xd2, 0xa5, 0x6d, 0xe7, 0xb1, 0x7c, 0x4c, 0xe5, + 0xa7, 0xc8, 0x48, 0x45, 0x33, 0xa3, 0x84, 0xfb, 0x32, 0x4c, 0x94, 0x49, 0xd3, 0x6b, 0xd5, 0xd9, + 0x55, 0x5d, 0x1e, 0x7e, 0x75, 0x09, 0x86, 0x63, 0x09, 0xcb, 0x3e, 0x5d, 0xa3, 0x90, 0x71, 0x8a, + 0x83, 0x1e, 0xe5, 0xa1, 0x62, 0xf2, 0xc2, 0xcf, 0x30, 0x3f, 0x75, 0xf0, 0xf8, 0xb2, 0x18, 0xcb, + 0x32, 0xf7, 0x4d, 0x07, 0x46, 0xd3, 0xfa, 0x64, 0x13, 0xd5, 0xe0, 0x54, 0x45, 0xbb, 0x2c, 0x97, + 0x5e, 0x53, 0xe8, 0xfd, 0x5e, 0x1d, 0x4f, 0xaf, 0x6b, 0x12, 0xc1, 0x59, 0xaa, 0x87, 0x8f, 0xb4, + 0xfb, 0x42, 0x01, 0x4e, 0xa9, 0xa6, 0x0a, 0x3f, 0xe1, 0xeb, 0xd9, 0x80, 0x38, 0x6c, 0x23, 0xd3, + 0x8e, 0x39, 0xf6, 0x07, 0x04, 0xc5, 0xbd, 0x9e, 0x0d, 0x8a, 0x3b, 0x56, 0xf6, 0x1d, 0xae, 0xcf, + 0x6f, 0x17, 0x60, 0x48, 0xe5, 0xfd, 0x79, 0x0e, 0x8a, 0xec, 0x28, 0x79, 0x77, 0x0a, 0x31, 0x3b, + 0x96, 0x62, 0x4e, 0x89, 0x92, 0x64, 0x41, 0x37, 0x47, 0x4e, 0x7a, 0x3a, 0xcc, 0x8d, 0x8f, 0x5e, + 0x94, 0x60, 0x4e, 0x09, 0x2d, 0x41, 0x1f, 0x09, 0xaa, 0x42, 0x33, 0x3e, 0x3c, 0x41, 0xf6, 0xc8, + 0xd4, 0x95, 0xa0, 0x8a, 0x29, 0x15, 0x96, 0x79, 0x93, 0x2b, 0x40, 0x99, 0x27, 0x45, 0x84, 0xf6, + 0x23, 0x4a, 0xdd, 0x5f, 0xee, 0x83, 0x81, 0x72, 0x7b, 0x83, 0xea, 0xf8, 0xdf, 0x72, 0xe0, 0xcc, + 0x4e, 0x26, 0x23, 0x70, 0x3a, 0xc7, 0x6f, 0xd8, 0x33, 0xc0, 0xea, 0x81, 0x5f, 0x0f, 0xc8, 0xf7, + 0xd2, 0x73, 0x0a, 0x71, 0x5e, 0x73, 0x8c, 0xa4, 0x9c, 0x7d, 0xc7, 0x92, 0x94, 0xf3, 0xd6, 0x31, + 0xdf, 0x7c, 0x18, 0xeb, 0x76, 0xeb, 0xc1, 0xfd, 0xbd, 0x22, 0x00, 0xff, 0x1a, 0xab, 0xad, 0xa4, + 0x17, 0x33, 0xd9, 0x33, 0x30, 0x5a, 0x23, 0x01, 0x89, 0x64, 0x58, 0x5f, 0xe6, 0xb5, 0x9a, 0x45, + 0xad, 0x0c, 0x1b, 0x98, 0xec, 0x4c, 0x12, 0x24, 0xd1, 0x2e, 0xd7, 0x5b, 0xb3, 0xb7, 0x1b, 0x54, + 0x09, 0xd6, 0xb0, 0xd0, 0xb4, 0xe1, 0xf1, 0xe0, 0xfe, 0xef, 0xf1, 0x03, 0x1c, 0x14, 0xef, 0x83, + 0x71, 0x33, 0x55, 0x88, 0x50, 0xd6, 0x94, 0xbf, 0xda, 0xcc, 0x30, 0x82, 0x33, 0xd8, 0x74, 0x12, + 0x57, 0xa3, 0x5d, 0xdc, 0x0e, 0x84, 0xd6, 0xa6, 0x26, 0xf1, 0x3c, 0x83, 0x62, 0x51, 0xca, 0x72, + 0x2c, 0xb0, 0xfd, 0x8b, 0xc3, 0x45, 0x9e, 0x86, 0x34, 0xc7, 0x82, 0x56, 0x86, 0x0d, 0x4c, 0xca, + 0x41, 0x98, 0x19, 0xc1, 0x5c, 0x26, 0x19, 0xdb, 0x60, 0x0b, 0xc6, 0x43, 0xd3, 0x3c, 0xc2, 0x55, + 0x98, 0x77, 0xf5, 0x38, 0xf5, 0x8c, 0xba, 0x3c, 0xce, 0x20, 0x63, 0x4d, 0xc9, 0xd0, 0xa7, 0x6a, + 0xab, 0x7e, 0x09, 0x60, 0xd4, 0x8c, 0x0a, 0xed, 0x1a, 0xa7, 0xbf, 0x06, 0x67, 0x5b, 0x61, 0x75, + 0x2d, 0xf2, 0xc3, 0xc8, 0x4f, 0x76, 0xe7, 0x1a, 0x5e, 0x1c, 0xb3, 0x89, 0x31, 0x66, 0xaa, 0x33, + 0x6b, 0x39, 0x38, 0x38, 0xb7, 0x26, 0x3d, 0x60, 0xb4, 0x04, 0x90, 0xc5, 0x66, 0x15, 0xb9, 0x42, + 0x26, 0x11, 0xb1, 0x2a, 0x75, 0xcf, 0xc0, 0xe9, 0x72, 0xbb, 0xd5, 0x6a, 0xf8, 0xa4, 0xaa, 0x3c, + 0x0a, 0xee, 0xfb, 0xe1, 0x94, 0x48, 0xd9, 0xa9, 0x94, 0x87, 0x43, 0x25, 0x98, 0x76, 0xff, 0xdc, + 0x81, 0x53, 0x99, 0x48, 0x18, 0xf4, 0x6a, 0x76, 0xcb, 0xb7, 0x62, 0x33, 0xd3, 0x37, 0x7b, 0xbe, + 0x48, 0x73, 0xd5, 0x87, 0xba, 0x0c, 0x63, 0xb7, 0x76, 0x7d, 0x84, 0x05, 0x7b, 0xf3, 0x1d, 0x41, + 0x8f, 0x85, 0x77, 0x3f, 0x53, 0x80, 0xfc, 0xf0, 0x23, 0xf4, 0xb1, 0xce, 0x01, 0x78, 0xce, 0xe2, + 0x00, 0x88, 0xf8, 0xa7, 0xee, 0x63, 0x10, 0x98, 0x63, 0xb0, 0x62, 0x69, 0x0c, 0x04, 0xdf, 0xce, + 0x91, 0xf8, 0x5f, 0x0e, 0x8c, 0xac, 0xaf, 0x2f, 0x2b, 0x13, 0x17, 0x86, 0xf3, 0x31, 0xbf, 0x1e, + 0xcf, 0xbc, 0xb4, 0x73, 0x61, 0xb3, 0xc5, 0x9d, 0xb6, 0xc2, 0x99, 0xcc, 0xb2, 0xa7, 0x96, 0x73, + 0x31, 0x70, 0x97, 0x9a, 0xe8, 0x1a, 0x9c, 0xd1, 0x4b, 0xca, 0xda, 0x63, 0x75, 0x45, 0x91, 0x92, + 0xa6, 0xb3, 0x18, 0xe7, 0xd5, 0xc9, 0x92, 0x12, 0xd6, 0x4a, 0xb6, 0x5d, 0xe5, 0x90, 0x12, 0xc5, + 0x38, 0xaf, 0x8e, 0xbb, 0x0a, 0x23, 0xeb, 0x5e, 0xa4, 0x3a, 0xfe, 0x01, 0x98, 0xa8, 0x84, 0x4d, + 0x69, 0x25, 0x5a, 0x26, 0xdb, 0xa4, 0x21, 0xba, 0xcc, 0x5f, 0x88, 0xc8, 0x94, 0xe1, 0x0e, 0x6c, + 0xf7, 0xbf, 0x5f, 0x04, 0x75, 0xdd, 0xaf, 0x87, 0x1d, 0xa6, 0xa5, 0x02, 0x33, 0x8b, 0x96, 0x03, + 0x33, 0x95, 0xac, 0xcd, 0x04, 0x67, 0x26, 0x69, 0x70, 0xe6, 0x80, 0xed, 0xe0, 0x4c, 0xa5, 0x30, + 0x76, 0x04, 0x68, 0x7e, 0xc5, 0x81, 0xd1, 0x20, 0xac, 0x12, 0xe5, 0x8a, 0x1b, 0x64, 0x5a, 0xeb, + 0x4b, 0xf6, 0xe2, 0xdc, 0x79, 0xa0, 0xa1, 0x20, 0xcf, 0x83, 0x86, 0xd5, 0x16, 0xa5, 0x17, 0x61, + 0xa3, 0x1d, 0x68, 0x41, 0xb3, 0x5b, 0x72, 0xf7, 0xc0, 0x83, 0x79, 0xc7, 0x8d, 0x3b, 0x1a, 0x21, + 0x6f, 0x69, 0x7a, 0xd3, 0xb0, 0x2d, 0x7b, 0x9c, 0xbc, 0xc3, 0xa5, 0x79, 0x39, 0x64, 0x02, 0xe0, + 0x54, 0x9f, 0x72, 0x61, 0x80, 0x47, 0x17, 0x8b, 0xe4, 0x47, 0xcc, 0xf9, 0xc6, 0x23, 0x8f, 0xb1, + 0x28, 0x41, 0x89, 0x74, 0xf7, 0x8f, 0xd8, 0x4a, 0xe7, 0x6f, 0x84, 0x13, 0xe4, 0xfb, 0xfb, 0xd1, + 0xb3, 0xfa, 0x31, 0x76, 0xb4, 0x97, 0x63, 0xec, 0x58, 0xd7, 0x23, 0xec, 0xe7, 0x1d, 0x18, 0xad, + 0x68, 0xe9, 0xf5, 0x4b, 0x8f, 0xdb, 0x7a, 0x46, 0x38, 0xef, 0x15, 0x04, 0xee, 0xd3, 0x31, 0xd2, + 0xf9, 0x1b, 0xdc, 0x59, 0xc6, 0x47, 0x76, 0x66, 0x67, 0x5b, 0xbf, 0x95, 0x24, 0x0f, 0xa6, 0x0d, + 0x40, 0x46, 0x3e, 0x52, 0x18, 0x16, 0xbc, 0xd0, 0x6b, 0x30, 0x24, 0x03, 0xd4, 0x45, 0x20, 0x37, + 0xb6, 0x61, 0x64, 0x37, 0x3d, 0x79, 0x32, 0x4d, 0x1c, 0x87, 0x62, 0xc5, 0x11, 0xd5, 0xa1, 0xaf, + 0xea, 0xd5, 0x44, 0x48, 0xf7, 0x8a, 0x9d, 0x34, 0x9c, 0x92, 0x27, 0x3b, 0x5e, 0xcd, 0xcf, 0x2c, + 0x62, 0xca, 0x02, 0xdd, 0x4a, 0xf3, 0x93, 0x4f, 0x58, 0xdb, 0x7d, 0x4d, 0x35, 0x89, 0x5b, 0x25, + 0x3a, 0xd2, 0x9d, 0x57, 0x85, 0xf3, 0xf3, 0xaf, 0x31, 0xb6, 0x0b, 0x76, 0xf2, 0x78, 0xf2, 0xa4, + 0x21, 0xa9, 0x03, 0x95, 0x72, 0xa9, 0x27, 0x49, 0xab, 0xf4, 0xb3, 0xb6, 0xb8, 0xb0, 0xd4, 0x17, + 0xfc, 0xc5, 0xe7, 0xf5, 0xf5, 0x35, 0xcc, 0xa8, 0xa3, 0x06, 0x0c, 0xb4, 0x58, 0x0c, 0x47, 0xe9, + 0xe7, 0x6c, 0xed, 0x2d, 0x3c, 0x26, 0x84, 0xcf, 0x4d, 0xfe, 0x3f, 0x16, 0x3c, 0xd0, 0x15, 0x18, + 0xe4, 0xcf, 0x6c, 0xf0, 0x90, 0xfa, 0x91, 0xcb, 0x93, 0xdd, 0x1f, 0xeb, 0x48, 0x37, 0x0a, 0xfe, + 0x3b, 0xc6, 0xb2, 0x2e, 0xfa, 0x82, 0x03, 0xe3, 0x54, 0xa2, 0xa6, 0xef, 0x82, 0x94, 0x90, 0x2d, + 0x99, 0x75, 0x23, 0xa6, 0x1a, 0x89, 0x94, 0x35, 0xea, 0x98, 0x74, 0xcd, 0x60, 0x87, 0x33, 0xec, + 0xd1, 0xeb, 0x30, 0x14, 0xfb, 0x55, 0x52, 0xf1, 0xa2, 0xb8, 0x74, 0xe6, 0x78, 0x9a, 0x92, 0xba, + 0x5b, 0x04, 0x23, 0xac, 0x58, 0xe6, 0x3e, 0xdf, 0x7f, 0xf6, 0x1e, 0x3f, 0xdf, 0xff, 0x77, 0x1c, + 0x38, 0xc7, 0xd3, 0xc2, 0x67, 0xdf, 0x04, 0x38, 0x77, 0x44, 0xf3, 0x0a, 0xbb, 0x0b, 0x30, 0x93, + 0x47, 0x12, 0xe7, 0x73, 0x62, 0x79, 0x65, 0xcd, 0x67, 0x5c, 0xce, 0x5b, 0x75, 0x3b, 0xf6, 0xfe, + 0x74, 0x0b, 0x7a, 0x0a, 0x46, 0x5a, 0x62, 0x3b, 0xf4, 0xe3, 0x26, 0xbb, 0xd9, 0xd1, 0xc7, 0xef, + 0xdc, 0xad, 0xa5, 0x60, 0xac, 0xe3, 0x18, 0x49, 0x86, 0x9f, 0x38, 0x28, 0xc9, 0x30, 0xba, 0x01, + 0x23, 0x49, 0xd8, 0x10, 0x79, 0x36, 0xe3, 0x52, 0x89, 0xcd, 0xc0, 0x8b, 0x79, 0x6b, 0x6b, 0x5d, + 0xa1, 0xa5, 0x27, 0xd9, 0x14, 0x16, 0x63, 0x9d, 0x0e, 0x8b, 0xa6, 0x15, 0xe9, 0xf6, 0x23, 0x76, + 0x84, 0xbd, 0x3f, 0x13, 0x4d, 0xab, 0x17, 0x62, 0x13, 0x17, 0x2d, 0xc2, 0xe9, 0x56, 0xc7, 0x19, + 0x98, 0xdf, 0x28, 0x53, 0x11, 0x0d, 0x9d, 0x07, 0xe0, 0xce, 0x3a, 0xc6, 0xe9, 0xf7, 0x81, 0x83, + 0x4e, 0xbf, 0x5d, 0x52, 0xee, 0x3e, 0x78, 0x94, 0x94, 0xbb, 0xa8, 0x0a, 0x0f, 0x7a, 0xed, 0x24, + 0x64, 0xe9, 0x5d, 0xcc, 0x2a, 0x3c, 0xb0, 0xf8, 0x61, 0x1e, 0xab, 0xbc, 0xbf, 0x37, 0xf5, 0xe0, + 0xcc, 0x01, 0x78, 0xf8, 0x40, 0x2a, 0xe8, 0x15, 0x18, 0x22, 0x22, 0x6d, 0x70, 0xe9, 0x67, 0x6c, + 0x29, 0x09, 0x66, 0x22, 0x62, 0x19, 0xf0, 0xc9, 0x61, 0x58, 0xf1, 0x43, 0xeb, 0x30, 0x52, 0x0f, + 0xe3, 0x64, 0xa6, 0xe1, 0x7b, 0x31, 0x89, 0x4b, 0x0f, 0xb1, 0x49, 0x93, 0xab, 0x7b, 0x5d, 0x95, + 0x68, 0xe9, 0x9c, 0xb9, 0x9a, 0xd6, 0xc4, 0x3a, 0x19, 0x44, 0x98, 0xf3, 0x91, 0x45, 0x55, 0x4b, + 0x3f, 0xce, 0x45, 0xd6, 0xb1, 0xc7, 0xf2, 0x28, 0xaf, 0x85, 0xd5, 0xb2, 0x89, 0xad, 0xbc, 0x8f, + 0x3a, 0x10, 0x67, 0x69, 0xa2, 0x67, 0x60, 0xb4, 0x15, 0x56, 0xcb, 0x2d, 0x52, 0x59, 0xf3, 0x92, + 0x4a, 0xbd, 0x34, 0x65, 0x5a, 0xdd, 0xd6, 0xb4, 0x32, 0x6c, 0x60, 0xa2, 0x16, 0x0c, 0x36, 0xf9, + 0xbd, 0xff, 0xd2, 0x23, 0xb6, 0xce, 0x36, 0x22, 0x91, 0x00, 0xd7, 0x17, 0xc4, 0x0f, 0x2c, 0xd9, + 0xa0, 0x7f, 0xe2, 0xc0, 0xa9, 0xcc, 0x5d, 0xa5, 0xd2, 0x3b, 0xac, 0xa9, 0x2c, 0x26, 0xe1, 0xd9, + 0xc7, 0xd8, 0xf0, 0x99, 0xc0, 0xdb, 0x9d, 0x20, 0x9c, 0x6d, 0x11, 0x1f, 0x17, 0x96, 0xbc, 0xa3, + 0xf4, 0xa8, 0xbd, 0x71, 0x61, 0x04, 0xe5, 0xb8, 0xb0, 0x1f, 0x58, 0xb2, 0x41, 0x4f, 0xc0, 0xa0, + 0xc8, 0xb3, 0x57, 0x7a, 0xcc, 0xf4, 0x20, 0x8b, 0x74, 0x7c, 0x58, 0x96, 0x4f, 0xbe, 0x1f, 0x4e, + 0x77, 0x1c, 0xdd, 0x0e, 0x95, 0x41, 0xe2, 0xd7, 0x1d, 0xd0, 0x2f, 0x37, 0x5b, 0x7f, 0xab, 0xe3, + 0x19, 0x18, 0xad, 0xf0, 0x17, 0xfd, 0xf8, 0xf5, 0xe8, 0x7e, 0xd3, 0xfe, 0x39, 0xa7, 0x95, 0x61, + 0x03, 0xd3, 0xbd, 0x0a, 0xa8, 0x33, 0x91, 0xfa, 0x91, 0xd2, 0x13, 0xfd, 0x33, 0x07, 0xc6, 0x0c, + 0x9d, 0xc1, 0xba, 0x8f, 0x70, 0x01, 0x50, 0xd3, 0x8f, 0xa2, 0x30, 0xd2, 0x9f, 0x4e, 0x13, 0x29, + 0x0c, 0xd8, 0x25, 0xb1, 0x95, 0x8e, 0x52, 0x9c, 0x53, 0xc3, 0xfd, 0xad, 0x7e, 0x48, 0x23, 0x9e, + 0x55, 0xa6, 0x5a, 0xa7, 0x6b, 0xa6, 0xda, 0x27, 0x61, 0xe8, 0xe5, 0x38, 0x0c, 0xd6, 0xd2, 0x7c, + 0xb6, 0xea, 0x5b, 0x3c, 0x5b, 0x5e, 0xbd, 0xce, 0x30, 0x15, 0x06, 0xc3, 0xfe, 0xe8, 0x82, 0xdf, + 0x48, 0x3a, 0x13, 0x9e, 0x3e, 0xfb, 0x1c, 0x87, 0x63, 0x85, 0xc1, 0x5e, 0x51, 0xdb, 0x26, 0xca, + 0x30, 0x9e, 0xbe, 0xa2, 0xc6, 0xdf, 0x48, 0x60, 0x65, 0xe8, 0x12, 0x0c, 0x2b, 0xa3, 0xba, 0xb0, + 0xd4, 0xab, 0x91, 0x52, 0x96, 0x77, 0x9c, 0xe2, 0x30, 0x85, 0x50, 0x18, 0x62, 0x85, 0x09, 0xa5, + 0x6c, 0xe3, 0x78, 0x92, 0x31, 0xed, 0x72, 0xd9, 0x2e, 0xc1, 0x58, 0xb1, 0xcc, 0xf3, 0x93, 0x0e, + 0x1f, 0x8b, 0x9f, 0x54, 0x0b, 0xbf, 0x2f, 0xf6, 0x1a, 0x7e, 0x6f, 0xce, 0xed, 0xa1, 0x9e, 0xe6, + 0xf6, 0xa7, 0xfa, 0x60, 0xf0, 0x79, 0x12, 0xb1, 0x3c, 0xdf, 0x4f, 0xc0, 0xe0, 0x36, 0xff, 0x37, + 0x7b, 0xfd, 0x52, 0x60, 0x60, 0x59, 0x4e, 0xbf, 0xdb, 0x46, 0xdb, 0x6f, 0x54, 0xe7, 0xd3, 0x55, + 0x9c, 0xa6, 0x08, 0x94, 0x05, 0x38, 0xc5, 0xa1, 0x15, 0x6a, 0x54, 0xb3, 0x6f, 0x36, 0xfd, 0x8e, + 0x07, 0xc2, 0x17, 0x65, 0x01, 0x4e, 0x71, 0xd0, 0x63, 0x30, 0x50, 0xf3, 0x93, 0x75, 0xaf, 0x96, + 0xf5, 0xf2, 0x2d, 0x32, 0x28, 0x16, 0xa5, 0xcc, 0x4d, 0xe4, 0x27, 0xeb, 0x11, 0x61, 0x96, 0xdd, + 0x8e, 0xec, 0x0f, 0x8b, 0x5a, 0x19, 0x36, 0x30, 0x59, 0x93, 0x42, 0xd1, 0x33, 0x11, 0x84, 0x99, + 0x36, 0x49, 0x16, 0xe0, 0x14, 0x87, 0xce, 0xff, 0x4a, 0xd8, 0x6c, 0xf9, 0x0d, 0x11, 0x1e, 0xac, + 0xcd, 0xff, 0x39, 0x01, 0xc7, 0x0a, 0x83, 0x62, 0x53, 0x11, 0x46, 0xc5, 0x4f, 0xf6, 0xc5, 0xaa, + 0x35, 0x01, 0xc7, 0x0a, 0xc3, 0x7d, 0x1e, 0xc6, 0xf8, 0x4a, 0x9e, 0x6b, 0x78, 0x7e, 0x73, 0x71, + 0x0e, 0x5d, 0xe9, 0x08, 0xbf, 0x7f, 0x22, 0x27, 0xfc, 0xfe, 0x9c, 0x51, 0xa9, 0x33, 0x0c, 0xdf, + 0xfd, 0x61, 0x01, 0x86, 0x4e, 0xf0, 0xd1, 0xbf, 0x13, 0x7f, 0xbf, 0x16, 0xdd, 0xca, 0x3c, 0xf8, + 0xb7, 0x66, 0xf3, 0x36, 0xcd, 0x81, 0x8f, 0xfd, 0xfd, 0x97, 0x02, 0x9c, 0x97, 0xa8, 0xf2, 0x2c, + 0xb7, 0x38, 0xc7, 0x5e, 0xac, 0x3a, 0xfe, 0x81, 0x8e, 0x8c, 0x81, 0x5e, 0xb3, 0x77, 0x1a, 0x5d, + 0x9c, 0xeb, 0x3a, 0xd4, 0xaf, 0x64, 0x86, 0x1a, 0x5b, 0xe5, 0x7a, 0xf0, 0x60, 0xff, 0x85, 0x03, + 0x93, 0xf9, 0x83, 0x7d, 0x02, 0x6f, 0x2c, 0xbe, 0x6e, 0xbe, 0xb1, 0xf8, 0x0b, 0xf6, 0xa6, 0x98, + 0xd9, 0x95, 0x2e, 0xaf, 0x2d, 0xfe, 0x99, 0x03, 0x67, 0x65, 0x05, 0xb6, 0x7b, 0xce, 0xfa, 0x01, + 0x0b, 0x44, 0x39, 0xfe, 0x69, 0xf6, 0x9a, 0x31, 0xcd, 0x5e, 0xb4, 0xd7, 0x71, 0xbd, 0x1f, 0x5d, + 0xdf, 0xa6, 0xfe, 0x53, 0x07, 0x4a, 0x79, 0x15, 0x4e, 0xe0, 0x93, 0xbf, 0x6a, 0x7e, 0xf2, 0xe7, + 0x8f, 0xa7, 0xe7, 0xdd, 0x3f, 0x78, 0xa9, 0xdb, 0x40, 0xa1, 0x86, 0xd4, 0xab, 0x1c, 0x5b, 0x3e, + 0x5a, 0xce, 0x22, 0x5f, 0x41, 0x6b, 0xc0, 0x40, 0xcc, 0xa2, 0x36, 0xc4, 0x14, 0xb8, 0x6a, 0x43, + 0xdb, 0xa2, 0xf4, 0x84, 0x8d, 0x9d, 0xfd, 0x8f, 0x05, 0x0f, 0xf7, 0x37, 0x0a, 0x70, 0x41, 0xbd, + 0x9d, 0x4a, 0xb6, 0x49, 0x23, 0x5d, 0x1f, 0xec, 0x55, 0x04, 0x4f, 0xfd, 0xb4, 0xf7, 0x2a, 0x42, + 0xca, 0x22, 0x5d, 0x0b, 0x29, 0x0c, 0x6b, 0x3c, 0x51, 0x19, 0xce, 0xb1, 0x57, 0x0c, 0x16, 0xfc, + 0xc0, 0x6b, 0xf8, 0xaf, 0x90, 0x08, 0x93, 0x66, 0xb8, 0xed, 0x35, 0x84, 0xa6, 0xae, 0x6e, 0xe0, + 0x2e, 0xe4, 0x21, 0xe1, 0xfc, 0xba, 0x1d, 0x27, 0xee, 0xbe, 0x5e, 0x4f, 0xdc, 0xee, 0x9f, 0x38, + 0x30, 0x7a, 0x82, 0x2f, 0xcd, 0x86, 0xe6, 0x92, 0x78, 0xd6, 0xde, 0x92, 0xe8, 0xb2, 0x0c, 0xf6, + 0x8a, 0xd0, 0xf1, 0xf8, 0x26, 0xfa, 0xb4, 0xa3, 0xe2, 0x5a, 0x78, 0xec, 0xdf, 0x87, 0xec, 0xb5, + 0xe3, 0x30, 0x69, 0x1b, 0xd1, 0xd7, 0x33, 0xb9, 0x2c, 0x0b, 0xb6, 0x12, 0x32, 0x75, 0xb4, 0xe6, + 0x08, 0x39, 0x2d, 0xbf, 0xe2, 0x00, 0xf0, 0x76, 0x8a, 0x54, 0xd8, 0xb4, 0x6d, 0x1b, 0xc7, 0x36, + 0x52, 0x94, 0x09, 0x6f, 0x9a, 0x5a, 0x42, 0x69, 0x01, 0xd6, 0x5a, 0x72, 0x17, 0xc9, 0x2a, 0xef, + 0x3a, 0x4f, 0xe6, 0x17, 0x1c, 0x38, 0x95, 0x69, 0x6e, 0x4e, 0xfd, 0x4d, 0xf3, 0x51, 0x3e, 0x0b, + 0x9a, 0x95, 0x99, 0x20, 0x59, 0x37, 0x9e, 0xfc, 0x37, 0x17, 0x8c, 0x57, 0x8b, 0xd1, 0xab, 0x30, + 0x2c, 0x2d, 0x1f, 0x72, 0x7a, 0xdb, 0x7c, 0x9c, 0x54, 0x1d, 0x6f, 0x24, 0x24, 0xc6, 0x29, 0xbf, + 0x4c, 0xd8, 0x5c, 0xa1, 0xa7, 0xb0, 0xb9, 0x7b, 0xfb, 0xb4, 0x69, 0xbe, 0x5d, 0xba, 0xff, 0x58, + 0xec, 0xd2, 0x0f, 0x5a, 0xb7, 0x4b, 0x3f, 0x74, 0xc2, 0x76, 0x69, 0xcd, 0x49, 0x58, 0xbc, 0x0b, + 0x27, 0xe1, 0xab, 0x70, 0x76, 0x3b, 0x3d, 0x74, 0xaa, 0x99, 0x24, 0xd2, 0x00, 0x3d, 0x91, 0x6b, + 0x8d, 0xa6, 0x07, 0xe8, 0x38, 0x21, 0x41, 0xa2, 0x1d, 0x57, 0xd3, 0x88, 0xbd, 0xe7, 0x73, 0xc8, + 0xe1, 0x5c, 0x26, 0x59, 0x6f, 0xcf, 0x60, 0x0f, 0xde, 0x9e, 0x37, 0x1d, 0x38, 0xe7, 0x75, 0xdc, + 0xe1, 0xc2, 0x64, 0x53, 0x84, 0x9c, 0xdc, 0xb4, 0xa7, 0x42, 0x18, 0xe4, 0x85, 0x5b, 0x2d, 0xaf, + 0x08, 0xe7, 0x37, 0x08, 0x3d, 0x9a, 0xba, 0xde, 0x79, 0x9c, 0x67, 0xbe, 0x9f, 0xfc, 0xeb, 0xd9, + 0x78, 0x1e, 0x60, 0x43, 0xff, 0x11, 0xbb, 0xa7, 0x6d, 0x0b, 0x31, 0x3d, 0x23, 0x77, 0x11, 0xd3, + 0x93, 0x71, 0xbd, 0x8d, 0x5a, 0x72, 0xbd, 0x05, 0x30, 0xe1, 0x37, 0xbd, 0x1a, 0x59, 0x6b, 0x37, + 0x1a, 0xfc, 0x0e, 0x88, 0x7c, 0x3e, 0x36, 0xd7, 0x82, 0xb7, 0x1c, 0x56, 0xbc, 0x46, 0xf6, 0x95, + 0x6e, 0x75, 0xd7, 0xe5, 0x5a, 0x86, 0x12, 0xee, 0xa0, 0x4d, 0x27, 0x2c, 0xcb, 0x47, 0x47, 0x12, + 0x3a, 0xda, 0x2c, 0x70, 0x64, 0x88, 0x4f, 0xd8, 0xab, 0x29, 0x18, 0xeb, 0x38, 0x68, 0x09, 0x86, + 0xab, 0x41, 0x2c, 0xae, 0xa3, 0x9e, 0x62, 0xc2, 0xec, 0x9d, 0x54, 0x04, 0xce, 0x5f, 0x2f, 0xab, + 0x8b, 0xa8, 0x0f, 0xe6, 0x24, 0x58, 0x54, 0xe5, 0x38, 0xad, 0x8f, 0x56, 0x18, 0x31, 0xf1, 0xb6, + 0x16, 0x8f, 0xe7, 0x78, 0xb8, 0x8b, 0xc3, 0x68, 0xfe, 0xba, 0x7c, 0x1d, 0x6c, 0x4c, 0xb0, 0x13, + 0x8f, 0x64, 0xa5, 0x14, 0xb4, 0x67, 0x7c, 0x4f, 0x1f, 0xf8, 0x8c, 0x2f, 0xcb, 0xac, 0x9a, 0x34, + 0x94, 0x7b, 0xf8, 0xa2, 0xb5, 0xcc, 0xaa, 0x69, 0xa4, 0xa4, 0xc8, 0xac, 0x9a, 0x02, 0xb0, 0xce, + 0x12, 0xad, 0x76, 0x73, 0x93, 0x9f, 0x61, 0x42, 0xe3, 0xf0, 0x4e, 0x6f, 0xdd, 0x5f, 0x7a, 0xf6, + 0x40, 0x7f, 0x69, 0x87, 0x7f, 0xf7, 0xdc, 0x21, 0xfc, 0xbb, 0x75, 0x96, 0xf3, 0x72, 0x71, 0x4e, + 0xb8, 0xd4, 0x2d, 0x9c, 0xef, 0x58, 0x8a, 0x0e, 0x1e, 0x79, 0xca, 0xfe, 0xc5, 0x9c, 0x41, 0xd7, + 0x80, 0xea, 0x0b, 0x47, 0x0e, 0xa8, 0xa6, 0xe2, 0x39, 0x85, 0xb3, 0xe4, 0xa9, 0x45, 0x21, 0x9e, + 0x53, 0x30, 0xd6, 0x71, 0xb2, 0xde, 0xd2, 0xfb, 0x8f, 0xcd, 0x5b, 0x3a, 0x79, 0x02, 0xde, 0xd2, + 0x07, 0x7a, 0xf6, 0x96, 0xde, 0x82, 0x33, 0xad, 0xb0, 0x3a, 0xef, 0xc7, 0x51, 0x9b, 0x5d, 0x8a, + 0x9b, 0x6d, 0x57, 0x6b, 0x24, 0x61, 0xee, 0xd6, 0x91, 0xcb, 0xef, 0xd4, 0x1b, 0xd9, 0x62, 0x0b, + 0x59, 0xae, 0xd1, 0x4c, 0x05, 0x66, 0x3a, 0x61, 0x51, 0xb7, 0x39, 0x85, 0x38, 0x8f, 0x85, 0xee, + 0xa7, 0x7d, 0xf8, 0x64, 0xfc, 0xb4, 0x1f, 0x80, 0xa1, 0xb8, 0xde, 0x4e, 0xaa, 0xe1, 0x4e, 0xc0, + 0x9c, 0xf1, 0xc3, 0xb3, 0xef, 0x50, 0xa6, 0x6c, 0x01, 0xbf, 0xbd, 0x37, 0x35, 0x21, 0xff, 0xd7, + 0xac, 0xd8, 0x02, 0x82, 0xbe, 0xd1, 0xe5, 0xfe, 0x8e, 0x7b, 0x9c, 0xf7, 0x77, 0x2e, 0x1c, 0xea, + 0xee, 0x4e, 0x9e, 0x33, 0xfa, 0x91, 0xb7, 0x9d, 0x33, 0xfa, 0x6b, 0x0e, 0x8c, 0x6d, 0xeb, 0x2e, + 0x03, 0xe1, 0x30, 0xb7, 0x10, 0xb8, 0x63, 0x78, 0x22, 0x66, 0x5d, 0x2a, 0xe7, 0x0c, 0xd0, 0xed, + 0x2c, 0x00, 0x9b, 0x2d, 0xc9, 0x09, 0x2a, 0x7a, 0xf4, 0x5e, 0x05, 0x15, 0xbd, 0xce, 0xe4, 0x98, + 0x3c, 0xe4, 0x32, 0x2f, 0xba, 0xdd, 0x98, 0x62, 0x29, 0x13, 0x55, 0x48, 0xb1, 0xce, 0x0f, 0x7d, + 0xde, 0x81, 0x09, 0x79, 0x2e, 0x13, 0x2e, 0xbf, 0x58, 0x44, 0x45, 0xda, 0x3c, 0x0e, 0xb2, 0xb0, + 0xfa, 0xf5, 0x0c, 0x1f, 0xdc, 0xc1, 0x99, 0x4a, 0x75, 0x15, 0x84, 0x56, 0x8b, 0x59, 0xf0, 0xaf, + 0xd0, 0x61, 0x66, 0x52, 0x30, 0xd6, 0x71, 0xd0, 0x37, 0xd5, 0xdb, 0xfc, 0x4f, 0x30, 0x81, 0xfe, + 0x82, 0x65, 0xdd, 0xd4, 0xc6, 0x03, 0xfd, 0xe8, 0x4b, 0x0e, 0x4c, 0xec, 0x64, 0x0c, 0x1a, 0x22, + 0x2c, 0x14, 0xdb, 0x37, 0x95, 0xf0, 0xe1, 0xce, 0x42, 0x71, 0x47, 0x0b, 0xd0, 0xe7, 0x4c, 0x43, + 0x27, 0x8f, 0x1f, 0xb5, 0x38, 0x80, 0x19, 0xc3, 0x2a, 0xbf, 0xe6, 0x96, 0x6f, 0xf1, 0xbc, 0xeb, + 0xf8, 0x90, 0x49, 0xda, 0x99, 0xf4, 0x63, 0xe5, 0x54, 0x25, 0xa6, 0xbd, 0xc5, 0xc2, 0x62, 0x37, + 0x3e, 0xbf, 0x6e, 0x6e, 0xf9, 0xcf, 0x67, 0x60, 0xdc, 0xf4, 0xed, 0xa1, 0x77, 0x99, 0xcf, 0x3e, + 0x5c, 0xcc, 0x66, 0xd0, 0x1f, 0x93, 0xf8, 0x46, 0x16, 0x7d, 0x23, 0xcd, 0x7d, 0xe1, 0x58, 0xd3, + 0xdc, 0xf7, 0x9d, 0x4c, 0x9a, 0xfb, 0x89, 0xe3, 0x48, 0x73, 0x7f, 0xfa, 0x50, 0x69, 0xee, 0xb5, + 0x67, 0x06, 0xfa, 0xef, 0xf0, 0xcc, 0xc0, 0x0c, 0x9c, 0x92, 0x77, 0x7f, 0x88, 0xc8, 0x24, 0xce, + 0xdd, 0xfe, 0x17, 0x44, 0x95, 0x53, 0x73, 0x66, 0x31, 0xce, 0xe2, 0xd3, 0x45, 0x56, 0x0c, 0x58, + 0xcd, 0x01, 0x5b, 0x6f, 0x10, 0x99, 0x53, 0x8b, 0x1d, 0x9f, 0x85, 0x88, 0x92, 0xd1, 0xce, 0x45, + 0x06, 0xbb, 0x2d, 0xff, 0xc1, 0xbc, 0x05, 0xe8, 0x25, 0x28, 0x85, 0x9b, 0x9b, 0x8d, 0xd0, 0xab, + 0xa6, 0xb9, 0xf8, 0x65, 0x5c, 0x02, 0xbf, 0xbb, 0xa9, 0x52, 0xb7, 0xae, 0x76, 0xc1, 0xc3, 0x5d, + 0x29, 0xa0, 0x37, 0xa9, 0x62, 0x92, 0x84, 0x11, 0xa9, 0xa6, 0xb6, 0x9a, 0x61, 0xd6, 0x67, 0x62, + 0xbd, 0xcf, 0x65, 0x93, 0x0f, 0xef, 0xbd, 0xfa, 0x28, 0x99, 0x52, 0x9c, 0x6d, 0x16, 0x8a, 0xe0, + 0x7c, 0x2b, 0xcf, 0x54, 0x14, 0x8b, 0x1b, 0x4b, 0x07, 0x19, 0xac, 0xe4, 0xd2, 0x3d, 0x9f, 0x6b, + 0x6c, 0x8a, 0x71, 0x17, 0xca, 0x7a, 0xbe, 0xfc, 0xa1, 0x93, 0xc9, 0x97, 0xff, 0x71, 0x80, 0x8a, + 0x4c, 0xe5, 0x25, 0x8d, 0x0f, 0x4b, 0x56, 0xae, 0xd2, 0x70, 0x9a, 0xda, 0x13, 0xa5, 0x8a, 0x0d, + 0xd6, 0x58, 0xa2, 0xff, 0x93, 0xfb, 0xa0, 0x04, 0xb7, 0xb0, 0xd4, 0xac, 0xcf, 0x89, 0xb7, 0xdd, + 0xa3, 0x12, 0xff, 0xd4, 0x81, 0x49, 0x3e, 0xf3, 0xb2, 0xca, 0x3d, 0x55, 0x2d, 0xc4, 0xdd, 0x1e, + 0xdb, 0xa1, 0x2b, 0x2c, 0x8a, 0xaf, 0x6c, 0x70, 0x65, 0x8e, 0xee, 0x03, 0x5a, 0x82, 0xbe, 0x92, + 0x73, 0xa4, 0x38, 0x65, 0xcb, 0x66, 0x99, 0xff, 0x2c, 0xc0, 0x99, 0xfd, 0x5e, 0x4e, 0x11, 0xff, + 0xbc, 0xab, 0x49, 0x15, 0xb1, 0xe6, 0xfd, 0xe2, 0x31, 0x99, 0x54, 0xf5, 0xb7, 0x0b, 0x0e, 0x65, + 0x58, 0xfd, 0x82, 0x03, 0x13, 0x5e, 0x26, 0xd4, 0x84, 0xd9, 0x81, 0xac, 0xd8, 0xa4, 0x66, 0xa2, + 0x34, 0x7e, 0x85, 0x29, 0x79, 0xd9, 0xa8, 0x16, 0xdc, 0xc1, 0x7c, 0xf2, 0xd3, 0x0e, 0x7f, 0x66, + 0xa9, 0xab, 0x5e, 0xb4, 0x61, 0xea, 0x45, 0xcb, 0x36, 0x1f, 0x7a, 0xd1, 0x15, 0xb4, 0x5f, 0x75, + 0xe0, 0x6c, 0x9e, 0xd8, 0xce, 0x69, 0xd2, 0x47, 0xcc, 0x26, 0x59, 0x3c, 0x8a, 0xe8, 0x0d, 0xb2, + 0xf3, 0xce, 0xc4, 0x9f, 0x0e, 0x6b, 0xae, 0xb5, 0x84, 0xb4, 0xac, 0x07, 0x26, 0x07, 0x30, 0xe0, + 0x07, 0x0d, 0x3f, 0x20, 0xe2, 0x12, 0xa2, 0xcd, 0x83, 0x99, 0x78, 0xd7, 0x85, 0x52, 0xc7, 0x82, + 0xcb, 0x3d, 0xf6, 0xb4, 0x65, 0x5f, 0xca, 0xea, 0x3f, 0xf9, 0x97, 0xb2, 0x76, 0x60, 0x78, 0xc7, + 0x4f, 0xea, 0x2c, 0x42, 0x40, 0x38, 0xb0, 0x2c, 0x5c, 0xde, 0xa3, 0xe4, 0xd2, 0xbe, 0xdf, 0x94, + 0x0c, 0x70, 0xca, 0x0b, 0x5d, 0xe2, 0x8c, 0x59, 0x38, 0x72, 0x36, 0x4e, 0xf4, 0xa6, 0x2c, 0xc0, + 0x29, 0x0e, 0x1d, 0xac, 0x51, 0xfa, 0x4b, 0x26, 0xe9, 0x11, 0xb9, 0x64, 0x6d, 0xe4, 0x08, 0x14, + 0x14, 0xf9, 0x15, 0xd9, 0x9b, 0x1a, 0x0f, 0x6c, 0x70, 0x54, 0xe9, 0x7c, 0x87, 0xba, 0xa6, 0xf3, + 0x7d, 0x8d, 0x69, 0x21, 0x89, 0x1f, 0xb4, 0xc9, 0x6a, 0x20, 0x82, 0x98, 0x97, 0xed, 0x5c, 0xe8, + 0xe5, 0x34, 0xf9, 0xb9, 0x32, 0xfd, 0x8d, 0x35, 0x7e, 0x9a, 0x1f, 0x61, 0xe4, 0x40, 0x3f, 0x42, + 0x6a, 0x47, 0x18, 0xb5, 0x6e, 0x47, 0x48, 0x48, 0xcb, 0x8a, 0x1d, 0xe1, 0x6d, 0x75, 0xc6, 0xfd, + 0x0b, 0x07, 0x90, 0x52, 0x26, 0xbc, 0x78, 0x4b, 0x3c, 0x6f, 0x78, 0xfc, 0x91, 0x82, 0x9f, 0x70, + 0x00, 0x02, 0xf5, 0x9e, 0xa2, 0xdd, 0x5d, 0x8b, 0xd3, 0x4c, 0x1b, 0x90, 0xc2, 0xb0, 0xc6, 0xd3, + 0xfd, 0x1f, 0x4e, 0x1a, 0x90, 0x9b, 0xf6, 0xfd, 0x04, 0x22, 0xa3, 0x76, 0xcd, 0xc8, 0xa8, 0x75, + 0x8b, 0xf6, 0x68, 0xd5, 0x8d, 0x2e, 0x31, 0x52, 0x3f, 0x29, 0xc0, 0x29, 0x1d, 0xb9, 0x4c, 0x4e, + 0xe2, 0x63, 0xef, 0x18, 0x61, 0xa1, 0x37, 0xec, 0xf6, 0xb7, 0x2c, 0xdc, 0x1a, 0x79, 0x21, 0xc8, + 0x1f, 0xcf, 0x84, 0x20, 0xdf, 0xb4, 0xcf, 0xfa, 0xe0, 0x38, 0xe4, 0xff, 0xea, 0xc0, 0x99, 0x4c, + 0x8d, 0x13, 0x98, 0x60, 0xdb, 0xe6, 0x04, 0x7b, 0xce, 0x7a, 0xaf, 0xbb, 0xcc, 0xae, 0x6f, 0x15, + 0x3a, 0x7a, 0xcb, 0x4e, 0x26, 0x9f, 0x72, 0xa0, 0x98, 0x78, 0xf1, 0x96, 0x0c, 0x52, 0xfa, 0xc8, + 0xb1, 0xcc, 0x80, 0x69, 0xfa, 0xbf, 0x90, 0xce, 0xaa, 0x7d, 0x0c, 0x86, 0x39, 0xf7, 0xc9, 0x4f, + 0x3a, 0x00, 0x29, 0xd2, 0xbd, 0x52, 0x59, 0xdd, 0xef, 0x14, 0xe0, 0x5c, 0xee, 0x34, 0x42, 0x9f, + 0x51, 0x66, 0x26, 0xc7, 0x76, 0x08, 0x9e, 0xc1, 0x48, 0xb7, 0x36, 0x8d, 0x19, 0xd6, 0x26, 0x61, + 0x64, 0xba, 0x57, 0x07, 0x0e, 0x21, 0xa6, 0xb5, 0xc1, 0xfa, 0xb1, 0x93, 0x46, 0x75, 0xaa, 0x64, + 0x3d, 0x7f, 0x09, 0x6f, 0xa6, 0xb8, 0x3f, 0xd1, 0xc2, 0xf6, 0x65, 0x47, 0x4f, 0x40, 0x56, 0xec, + 0x98, 0xb2, 0x02, 0xdb, 0x77, 0x8e, 0x76, 0x11, 0x16, 0x1f, 0x85, 0x3c, 0x6f, 0x69, 0x6f, 0x99, + 0xfe, 0x8c, 0x3b, 0x9e, 0x85, 0x9e, 0xef, 0x78, 0x8e, 0xc1, 0xc8, 0x8b, 0x7e, 0x4b, 0x39, 0xf6, + 0xa6, 0xbf, 0xfb, 0xa3, 0x8b, 0xf7, 0x7d, 0xef, 0x47, 0x17, 0xef, 0xfb, 0xe1, 0x8f, 0x2e, 0xde, + 0xf7, 0x89, 0xfd, 0x8b, 0xce, 0x77, 0xf7, 0x2f, 0x3a, 0xdf, 0xdb, 0xbf, 0xe8, 0xfc, 0x70, 0xff, + 0xa2, 0xf3, 0xef, 0xf7, 0x2f, 0x3a, 0x7f, 0xef, 0x3f, 0x5c, 0xbc, 0xef, 0xc5, 0x21, 0xd9, 0xb1, + 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x3a, 0x9e, 0x0a, 0xf2, 0xd3, 0x00, 0x00, } func (m *Amount) Marshal() (dAtA []byte, err error) { @@ -9166,6 +9199,45 @@ func (m *MutexStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NodeFlag) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NodeFlag) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NodeFlag) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i-- + if m.Retried { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + i-- + if m.Hooked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + return len(dAtA) - i, nil +} + func (m *NodeResult) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -9236,6 +9308,20 @@ func (m *NodeStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.NodeFlag != nil { + { + size, err := m.NodeFlag.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1 + i-- + dAtA[i] = 0xda + } i -= len(m.Progress) copy(dAtA[i:], m.Progress) i = encodeVarintGenerated(dAtA, i, uint64(len(m.Progress))) @@ -15399,6 +15485,17 @@ func (m *MutexStatus) Size() (n int) { return n } +func (m *NodeFlag) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 2 + n += 2 + return n +} + func (m *NodeResult) Size() (n int) { if m == nil { return 0 @@ -15496,6 +15593,10 @@ func (m *NodeStatus) Size() (n int) { } l = len(m.Progress) n += 2 + l + sovGenerated(uint64(l)) + if m.NodeFlag != nil { + l = m.NodeFlag.Size() + n += 2 + l + sovGenerated(uint64(l)) + } return n } @@ -18208,6 +18309,17 @@ func (this *MutexStatus) String() string { }, "") return s } +func (this *NodeFlag) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&NodeFlag{`, + `Hooked:` + fmt.Sprintf("%v", this.Hooked) + `,`, + `Retried:` + fmt.Sprintf("%v", this.Retried) + `,`, + `}`, + }, "") + return s +} func (this *NodeResult) String() string { if this == nil { return "nil" @@ -18260,6 +18372,7 @@ func (this *NodeStatus) String() string { `EstimatedDuration:` + fmt.Sprintf("%v", this.EstimatedDuration) + `,`, `SynchronizationStatus:` + strings.Replace(this.SynchronizationStatus.String(), "NodeSynchronizationStatus", "NodeSynchronizationStatus", 1) + `,`, `Progress:` + fmt.Sprintf("%v", this.Progress) + `,`, + `NodeFlag:` + strings.Replace(this.NodeFlag.String(), "NodeFlag", "NodeFlag", 1) + `,`, `}`, }, "") return s @@ -32005,6 +32118,96 @@ func (m *MutexStatus) Unmarshal(dAtA []byte) error { } return nil } +func (m *NodeFlag) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: NodeFlag: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NodeFlag: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hooked", 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 + } + } + m.Hooked = bool(v != 0) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Retried", 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 + } + } + m.Retried = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NodeResult) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -33063,6 +33266,42 @@ func (m *NodeStatus) Unmarshal(dAtA []byte) error { } m.Progress = Progress(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 27: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeFlag", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.NodeFlag == nil { + m.NodeFlag = &NodeFlag{} + } + if err := m.NodeFlag.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index 57a6a14dbd3d..77f248a90006 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -975,6 +975,14 @@ message MutexStatus { repeated MutexHolding waiting = 2; } +message NodeFlag { + // Hooked tracks whether or not this node was triggered by hook or onExit + optional bool hooked = 1; + + // Retried tracks whether or not this node was retried by retryStrategy + optional bool retried = 2; +} + message NodeResult { optional string phase = 1; @@ -1044,6 +1052,9 @@ message NodeStatus { // Daemoned tracks whether or not this node was daemoned and need to be terminated optional bool daemoned = 13; + // NodeFlag tracks some history of node. e.g.) hooked, retried, etc. + optional NodeFlag nodeFlag = 27; + // Inputs captures input parameter values and artifact locations supplied to this template invocation optional Inputs inputs = 14; diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index 3b32a9ac7894..fb2c39e4628a 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -95,6 +95,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Mutex": schema_pkg_apis_workflow_v1alpha1_Mutex(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.MutexHolding": schema_pkg_apis_workflow_v1alpha1_MutexHolding(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.MutexStatus": schema_pkg_apis_workflow_v1alpha1_MutexStatus(ref), + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeFlag": schema_pkg_apis_workflow_v1alpha1_NodeFlag(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeResult": schema_pkg_apis_workflow_v1alpha1_NodeResult(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeStatus": schema_pkg_apis_workflow_v1alpha1_NodeStatus(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeSynchronizationStatus": schema_pkg_apis_workflow_v1alpha1_NodeSynchronizationStatus(ref), @@ -3945,6 +3946,32 @@ func schema_pkg_apis_workflow_v1alpha1_MutexStatus(ref common.ReferenceCallback) } } +func schema_pkg_apis_workflow_v1alpha1_NodeFlag(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "hooked": { + SchemaProps: spec.SchemaProps{ + Description: "Hooked tracks whether or not this node was triggered by hook or onExit", + Type: []string{"boolean"}, + Format: "", + }, + }, + "retried": { + SchemaProps: spec.SchemaProps{ + Description: "Retried tracks whether or not this node was retried by retryStrategy", + Type: []string{"boolean"}, + Format: "", + }, + }, + }, + }, + }, + } +} + func schema_pkg_apis_workflow_v1alpha1_NodeResult(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -4119,6 +4146,12 @@ func schema_pkg_apis_workflow_v1alpha1_NodeStatus(ref common.ReferenceCallback) Format: "", }, }, + "nodeFlag": { + SchemaProps: spec.SchemaProps{ + Description: "NodeFlag tracks some history of node. e.g.) hooked, retried, etc.", + Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeFlag"), + }, + }, "inputs": { SchemaProps: spec.SchemaProps{ Description: "Inputs captures input parameter values and artifact locations supplied to this template invocation", @@ -4185,7 +4218,7 @@ func schema_pkg_apis_workflow_v1alpha1_NodeStatus(ref common.ReferenceCallback) }, }, Dependencies: []string{ - "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Inputs", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.MemoizationStatus", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeSynchronizationStatus", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Outputs", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TemplateRef", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Inputs", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.MemoizationStatus", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeFlag", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.NodeSynchronizationStatus", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Outputs", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TemplateRef", "k8s.io/apimachinery/pkg/apis/meta/v1.Time"}, } } diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index c87ec44f1681..a487ff31f4e5 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -2221,6 +2221,9 @@ type NodeStatus struct { // Daemoned tracks whether or not this node was daemoned and need to be terminated Daemoned *bool `json:"daemoned,omitempty" protobuf:"varint,13,opt,name=daemoned"` + // NodeFlag tracks some history of node. e.g.) hooked, retried, etc. + NodeFlag *NodeFlag `json:"nodeFlag,omitempty" protobuf:"bytes,27,opt,name=nodeFlag"` + // Inputs captures input parameter values and artifact locations supplied to this template invocation Inputs *Inputs `json:"inputs,omitempty" protobuf:"bytes,14,opt,name=inputs"` @@ -3817,3 +3820,10 @@ type NodeSynchronizationStatus struct { // Waiting is the name of the lock that this node is waiting for Waiting string `json:"waiting,omitempty" protobuf:"bytes,1,opt,name=waiting"` } + +type NodeFlag struct { + // Hooked tracks whether or not this node was triggered by hook or onExit + Hooked bool `json:"hooked,omitempty" protobuf:"varint,1,opt,name=hooked"` + // Retried tracks whether or not this node was retried by retryStrategy + Retried bool `json:"retried,omitempty" protobuf:"varint,2,opt,name=retried"` +} diff --git a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go index e2c9793f70f1..4bb0f316dd95 100644 --- a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go @@ -2068,6 +2068,22 @@ func (in *MutexStatus) DeepCopy() *MutexStatus { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *NodeFlag) DeepCopyInto(out *NodeFlag) { + *out = *in + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NodeFlag. +func (in *NodeFlag) DeepCopy() *NodeFlag { + if in == nil { + return nil + } + out := new(NodeFlag) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *NodeResult) DeepCopyInto(out *NodeResult) { *out = *in @@ -2111,6 +2127,11 @@ func (in *NodeStatus) DeepCopyInto(out *NodeStatus) { *out = new(bool) **out = **in } + if in.NodeFlag != nil { + in, out := &in.NodeFlag, &out.NodeFlag + *out = new(NodeFlag) + **out = **in + } if in.Inputs != nil { in, out := &in.Inputs, &out.Inputs *out = new(Inputs) diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md new file mode 100644 index 000000000000..a948474ce45a --- /dev/null +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md @@ -0,0 +1,14 @@ + + +# IoArgoprojWorkflowV1alpha1NodeFlag + + +## Properties + +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**hooked** | **Boolean** | Hooked tracks whether or not this node was triggered by hook or onExit | [optional] +**retried** | **Boolean** | Retried tracks whether or not this node was retried by retryStrategy | [optional] + + + diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md index 04129681b54b..b5bf0f6db691 100644 --- a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md @@ -20,6 +20,7 @@ Name | Type | Description | Notes **memoizationStatus** | [**IoArgoprojWorkflowV1alpha1MemoizationStatus**](IoArgoprojWorkflowV1alpha1MemoizationStatus.md) | | [optional] **message** | **String** | A human readable message indicating details about why the node is in this condition. | [optional] **name** | **String** | Name is unique name in the node tree used to generate the node ID | +**nodeFlag** | [**IoArgoprojWorkflowV1alpha1NodeFlag**](IoArgoprojWorkflowV1alpha1NodeFlag.md) | | [optional] **outboundNodes** | **List<String>** | OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step. In the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children. | [optional] **outputs** | [**IoArgoprojWorkflowV1alpha1Outputs**](IoArgoprojWorkflowV1alpha1Outputs.md) | | [optional] **phase** | **String** | Phase a simple, high-level summary of where the node is in its lifecycle. Can be used as a state machine. Will be one of these values \"Pending\", \"Running\" before the node is completed, or \"Succeeded\", \"Skipped\", \"Failed\", \"Error\", or \"Omitted\" as a final state. | [optional] diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_flag.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_flag.py new file mode 100644 index 000000000000..f9225e196e42 --- /dev/null +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_flag.py @@ -0,0 +1,259 @@ +""" + Argo Workflows API + + Argo Workflows is an open source container-native workflow engine for orchestrating parallel jobs on Kubernetes. For more information, please see https://argoproj.github.io/argo-workflows/ # noqa: E501 + + The version of the OpenAPI document: VERSION + Generated by: https://openapi-generator.tech +""" + + +import re # noqa: F401 +import sys # noqa: F401 + +from argo_workflows.model_utils import ( # noqa: F401 + ApiTypeError, + ModelComposed, + ModelNormal, + ModelSimple, + cached_property, + change_keys_js_to_python, + convert_js_args_to_python_args, + date, + datetime, + file_type, + none_type, + validate_get_composed_info, + OpenApiModel +) +from argo_workflows.exceptions import ApiAttributeError + + + +class IoArgoprojWorkflowV1alpha1NodeFlag(ModelNormal): + """NOTE: This class is auto generated by OpenAPI Generator. + Ref: https://openapi-generator.tech + + Do not edit the class manually. + + Attributes: + allowed_values (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + with a capitalized key describing the allowed value and an allowed + value. These dicts store the allowed enum values. + attribute_map (dict): The key is attribute name + and the value is json key in definition. + discriminator_value_class_map (dict): A dict to go from the discriminator + variable value to the discriminator class name. + validations (dict): The key is the tuple path to the attribute + and the for var_name this is (var_name,). The value is a dict + that stores validations for max_length, min_length, max_items, + min_items, exclusive_maximum, inclusive_maximum, exclusive_minimum, + inclusive_minimum, and regex. + additional_properties_type (tuple): A tuple of classes accepted + as additional properties values. + """ + + allowed_values = { + } + + validations = { + } + + @cached_property + def additional_properties_type(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + """ + return (bool, date, datetime, dict, float, int, list, str, none_type,) # noqa: E501 + + _nullable = False + + @cached_property + def openapi_types(): + """ + This must be a method because a model may have properties that are + of type self, this must run after the class is loaded + + Returns + openapi_types (dict): The key is attribute name + and the value is attribute type. + """ + return { + 'hooked': (bool,), # noqa: E501 + 'retried': (bool,), # noqa: E501 + } + + @cached_property + def discriminator(): + return None + + + attribute_map = { + 'hooked': 'hooked', # noqa: E501 + 'retried': 'retried', # noqa: E501 + } + + read_only_vars = { + } + + _composed_schemas = {} + + @classmethod + @convert_js_args_to_python_args + def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 + """IoArgoprojWorkflowV1alpha1NodeFlag - a model defined in OpenAPI + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + hooked (bool): Hooked tracks whether or not this node was triggered by hook or onExit. [optional] # noqa: E501 + retried (bool): Retried tracks whether or not this node was retried by retryStrategy. [optional] # noqa: E501 + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + self = super(OpenApiModel, cls).__new__(cls) + + if args: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + return self + + required_properties = set([ + '_data_store', + '_check_type', + '_spec_property_naming', + '_path_to_item', + '_configuration', + '_visited_composed_classes', + ]) + + @convert_js_args_to_python_args + def __init__(self, *args, **kwargs): # noqa: E501 + """IoArgoprojWorkflowV1alpha1NodeFlag - a model defined in OpenAPI + + Keyword Args: + _check_type (bool): if True, values for parameters in openapi_types + will be type checked and a TypeError will be + raised if the wrong type is input. + Defaults to True + _path_to_item (tuple/list): This is a list of keys or values to + drill down to the model in received_data + when deserializing a response + _spec_property_naming (bool): True if the variable names in the input data + are serialized names, as specified in the OpenAPI document. + False if the variable names in the input data + are pythonic names, e.g. snake case (default) + _configuration (Configuration): the instance to use when + deserializing a file_type parameter. + If passed, type conversion is attempted + If omitted no type conversion is done. + _visited_composed_classes (tuple): This stores a tuple of + classes that we have traveled through so that + if we see that class again we will not use its + discriminator again. + When traveling through a discriminator, the + composed schema that is + is traveled through is added to this set. + For example if Animal has a discriminator + petType and we pass in "Dog", and the class Dog + allOf includes Animal, we move through Animal + once using the discriminator, and pick Dog. + Then in Dog, we will make an instance of the + Animal class but this time we won't travel + through its discriminator because we passed in + _visited_composed_classes = (Animal,) + hooked (bool): Hooked tracks whether or not this node was triggered by hook or onExit. [optional] # noqa: E501 + retried (bool): Retried tracks whether or not this node was retried by retryStrategy. [optional] # noqa: E501 + """ + + _check_type = kwargs.pop('_check_type', True) + _spec_property_naming = kwargs.pop('_spec_property_naming', False) + _path_to_item = kwargs.pop('_path_to_item', ()) + _configuration = kwargs.pop('_configuration', None) + _visited_composed_classes = kwargs.pop('_visited_composed_classes', ()) + + if args: + raise ApiTypeError( + "Invalid positional arguments=%s passed to %s. Remove those invalid positional arguments." % ( + args, + self.__class__.__name__, + ), + path_to_item=_path_to_item, + valid_classes=(self.__class__,), + ) + + self._data_store = {} + self._check_type = _check_type + self._spec_property_naming = _spec_property_naming + self._path_to_item = _path_to_item + self._configuration = _configuration + self._visited_composed_classes = _visited_composed_classes + (self.__class__,) + + for var_name, var_value in kwargs.items(): + if var_name not in self.attribute_map and \ + self._configuration is not None and \ + self._configuration.discard_unknown_keys and \ + self.additional_properties_type is None: + # discard variable. + continue + setattr(self, var_name, var_value) + if var_name in self.read_only_vars: + raise ApiAttributeError(f"`{var_name}` is a read-only attribute. Use `from_openapi_data` to instantiate " + f"class with read only attributes.") diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_status.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_status.py index d186d241de01..95cfcb7caf9b 100644 --- a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_status.py +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_status.py @@ -32,11 +32,13 @@ def lazy_import(): from argo_workflows.model.io_argoproj_workflow_v1alpha1_inputs import IoArgoprojWorkflowV1alpha1Inputs from argo_workflows.model.io_argoproj_workflow_v1alpha1_memoization_status import IoArgoprojWorkflowV1alpha1MemoizationStatus + from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_flag import IoArgoprojWorkflowV1alpha1NodeFlag from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_synchronization_status import IoArgoprojWorkflowV1alpha1NodeSynchronizationStatus from argo_workflows.model.io_argoproj_workflow_v1alpha1_outputs import IoArgoprojWorkflowV1alpha1Outputs from argo_workflows.model.io_argoproj_workflow_v1alpha1_template_ref import IoArgoprojWorkflowV1alpha1TemplateRef globals()['IoArgoprojWorkflowV1alpha1Inputs'] = IoArgoprojWorkflowV1alpha1Inputs globals()['IoArgoprojWorkflowV1alpha1MemoizationStatus'] = IoArgoprojWorkflowV1alpha1MemoizationStatus + globals()['IoArgoprojWorkflowV1alpha1NodeFlag'] = IoArgoprojWorkflowV1alpha1NodeFlag globals()['IoArgoprojWorkflowV1alpha1NodeSynchronizationStatus'] = IoArgoprojWorkflowV1alpha1NodeSynchronizationStatus globals()['IoArgoprojWorkflowV1alpha1Outputs'] = IoArgoprojWorkflowV1alpha1Outputs globals()['IoArgoprojWorkflowV1alpha1TemplateRef'] = IoArgoprojWorkflowV1alpha1TemplateRef @@ -108,6 +110,7 @@ def openapi_types(): 'inputs': (IoArgoprojWorkflowV1alpha1Inputs,), # noqa: E501 'memoization_status': (IoArgoprojWorkflowV1alpha1MemoizationStatus,), # noqa: E501 'message': (str,), # noqa: E501 + 'node_flag': (IoArgoprojWorkflowV1alpha1NodeFlag,), # noqa: E501 'outbound_nodes': ([str],), # noqa: E501 'outputs': (IoArgoprojWorkflowV1alpha1Outputs,), # noqa: E501 'phase': (str,), # noqa: E501 @@ -140,6 +143,7 @@ def discriminator(): 'inputs': 'inputs', # noqa: E501 'memoization_status': 'memoizationStatus', # noqa: E501 'message': 'message', # noqa: E501 + 'node_flag': 'nodeFlag', # noqa: E501 'outbound_nodes': 'outboundNodes', # noqa: E501 'outputs': 'outputs', # noqa: E501 'phase': 'phase', # noqa: E501 @@ -209,6 +213,7 @@ def _from_openapi_data(cls, id, name, type, *args, **kwargs): # noqa: E501 inputs (IoArgoprojWorkflowV1alpha1Inputs): [optional] # noqa: E501 memoization_status (IoArgoprojWorkflowV1alpha1MemoizationStatus): [optional] # noqa: E501 message (str): A human readable message indicating details about why the node is in this condition.. [optional] # noqa: E501 + node_flag (IoArgoprojWorkflowV1alpha1NodeFlag): [optional] # noqa: E501 outbound_nodes ([str]): OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step. In the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children.. [optional] # noqa: E501 outputs (IoArgoprojWorkflowV1alpha1Outputs): [optional] # noqa: E501 phase (str): Phase a simple, high-level summary of where the node is in its lifecycle. Can be used as a state machine. Will be one of these values \"Pending\", \"Running\" before the node is completed, or \"Succeeded\", \"Skipped\", \"Failed\", \"Error\", or \"Omitted\" as a final state.. [optional] # noqa: E501 @@ -319,6 +324,7 @@ def __init__(self, id, name, type, *args, **kwargs): # noqa: E501 inputs (IoArgoprojWorkflowV1alpha1Inputs): [optional] # noqa: E501 memoization_status (IoArgoprojWorkflowV1alpha1MemoizationStatus): [optional] # noqa: E501 message (str): A human readable message indicating details about why the node is in this condition.. [optional] # noqa: E501 + node_flag (IoArgoprojWorkflowV1alpha1NodeFlag): [optional] # noqa: E501 outbound_nodes ([str]): OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step. In the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children.. [optional] # noqa: E501 outputs (IoArgoprojWorkflowV1alpha1Outputs): [optional] # noqa: E501 phase (str): Phase a simple, high-level summary of where the node is in its lifecycle. Can be used as a state machine. Will be one of these values \"Pending\", \"Running\" before the node is completed, or \"Succeeded\", \"Skipped\", \"Failed\", \"Error\", or \"Omitted\" as a final state.. [optional] # noqa: E501 diff --git a/sdks/python/client/argo_workflows/models/__init__.py b/sdks/python/client/argo_workflows/models/__init__.py index e0014ed54eea..cce85dae48ff 100644 --- a/sdks/python/client/argo_workflows/models/__init__.py +++ b/sdks/python/client/argo_workflows/models/__init__.py @@ -248,6 +248,7 @@ from argo_workflows.model.io_argoproj_workflow_v1alpha1_mutex import IoArgoprojWorkflowV1alpha1Mutex from argo_workflows.model.io_argoproj_workflow_v1alpha1_mutex_holding import IoArgoprojWorkflowV1alpha1MutexHolding from argo_workflows.model.io_argoproj_workflow_v1alpha1_mutex_status import IoArgoprojWorkflowV1alpha1MutexStatus +from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_flag import IoArgoprojWorkflowV1alpha1NodeFlag from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_result import IoArgoprojWorkflowV1alpha1NodeResult from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_status import IoArgoprojWorkflowV1alpha1NodeStatus from argo_workflows.model.io_argoproj_workflow_v1alpha1_node_synchronization_status import IoArgoprojWorkflowV1alpha1NodeSynchronizationStatus diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md new file mode 100644 index 000000000000..f9113f86d045 --- /dev/null +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeFlag.md @@ -0,0 +1,13 @@ +# IoArgoprojWorkflowV1alpha1NodeFlag + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**hooked** | **bool** | Hooked tracks whether or not this node was triggered by hook or onExit | [optional] +**retried** | **bool** | Retried tracks whether or not this node was retried by retryStrategy | [optional] +**any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] + +[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) + + diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md index 3db201a0d997..d1c5d7fa3e80 100644 --- a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeStatus.md @@ -18,6 +18,7 @@ Name | Type | Description | Notes **inputs** | [**IoArgoprojWorkflowV1alpha1Inputs**](IoArgoprojWorkflowV1alpha1Inputs.md) | | [optional] **memoization_status** | [**IoArgoprojWorkflowV1alpha1MemoizationStatus**](IoArgoprojWorkflowV1alpha1MemoizationStatus.md) | | [optional] **message** | **str** | A human readable message indicating details about why the node is in this condition. | [optional] +**node_flag** | [**IoArgoprojWorkflowV1alpha1NodeFlag**](IoArgoprojWorkflowV1alpha1NodeFlag.md) | | [optional] **outbound_nodes** | **[str]** | OutboundNodes tracks the node IDs which are considered \"outbound\" nodes to a template invocation. For every invocation of a template, there are nodes which we considered as \"outbound\". Essentially, these are last nodes in the execution sequence to run, before the template is considered completed. These nodes are then connected as parents to a following step. In the case of single pod steps (i.e. container, script, resource templates), this list will be nil since the pod itself is already considered the \"outbound\" node. In the case of DAGs, outbound nodes are the \"target\" tasks (tasks with no children). In the case of steps, outbound nodes are all the containers involved in the last step group. NOTE: since templates are composable, the list of outbound nodes are carried upwards when a DAG/steps template invokes another DAG/steps template. In other words, the outbound nodes of a template, will be a superset of the outbound nodes of its last children. | [optional] **outputs** | [**IoArgoprojWorkflowV1alpha1Outputs**](IoArgoprojWorkflowV1alpha1Outputs.md) | | [optional] **phase** | **str** | Phase a simple, high-level summary of where the node is in its lifecycle. Can be used as a state machine. Will be one of these values \"Pending\", \"Running\" before the node is completed, or \"Succeeded\", \"Skipped\", \"Failed\", \"Error\", or \"Omitted\" as a final state. | [optional] diff --git a/sdks/python/client/docs/WorkflowServiceApi.md b/sdks/python/client/docs/WorkflowServiceApi.md index 2b3a0643d43a..7e1c5adad0d3 100644 --- a/sdks/python/client/docs/WorkflowServiceApi.md +++ b/sdks/python/client/docs/WorkflowServiceApi.md @@ -11176,6 +11176,10 @@ with argo_workflows.ApiClient(configuration) as api_client: ), message="message_example", name="name_example", + node_flag=IoArgoprojWorkflowV1alpha1NodeFlag( + hooked=True, + retried=True, + ), outbound_nodes=[ "outbound_nodes_example", ], @@ -38723,6 +38727,10 @@ with argo_workflows.ApiClient(configuration) as api_client: ), message="message_example", name="name_example", + node_flag=IoArgoprojWorkflowV1alpha1NodeFlag( + hooked=True, + retried=True, + ), outbound_nodes=[ "outbound_nodes_example", ], diff --git a/test/e2e/hooks_test.go b/test/e2e/hooks_test.go index 666d5942e81f..3eafa1f59206 100644 --- a/test/e2e/hooks_test.go +++ b/test/e2e/hooks_test.go @@ -567,6 +567,86 @@ spec: }) } +func (s *HooksSuite) TestWorkflowLevelHooksWithRetry() { + s.Given(). + Workflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: test-workflow-level-hooks-with-retry +spec: + templates: + - name: argosay + container: + image: argoproj/argosay:v2 + command: + - /bin/sh + - '-c' + args: + - /bin/sleep 1; exit 1 + retryStrategy: + limit: 1 + - name: hook + container: + image: argoproj/argosay:v2 + command: + - /bin/sh + - '-c' + args: + - /argosay + entrypoint: argosay + hooks: + failed: + template: hook + expression: workflow.status == "Failed" + running: + template: hook + expression: workflow.status == "Running" +`).When(). + SubmitWorkflow(). + WaitForWorkflow(fixtures.ToBeFailed). + Then(). + ExpectWorkflow(func(t *testing.T, metadata *v1.ObjectMeta, status *v1alpha1.WorkflowStatus) { + assert.Equal(t, status.Phase, v1alpha1.WorkflowFailed) + assert.Equal(t, status.Progress, v1alpha1.Progress("2/4")) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-workflow-level-hooks-with-retry.hooks.running" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeSucceeded, status.Phase) + assert.Equal(t, true, status.NodeFlag.Hooked) + assert.Equal(t, false, status.NodeFlag.Retried) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-workflow-level-hooks-with-retry.hooks.failed" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeSucceeded, status.Phase) + assert.Equal(t, true, status.NodeFlag.Hooked) + assert.Equal(t, false, status.NodeFlag.Retried) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-workflow-level-hooks-with-retry" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeFailed, status.Phase) + assert.Equal(t, v1alpha1.NodeTypeRetry, status.Type) + assert.Nil(t, status.NodeFlag) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-workflow-level-hooks-with-retry(0)" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeFailed, status.Phase) + assert.Equal(t, false, status.NodeFlag.Hooked) + assert.Equal(t, true, status.NodeFlag.Retried) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-workflow-level-hooks-with-retry(1)" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeFailed, status.Phase) + assert.Equal(t, false, status.NodeFlag.Hooked) + assert.Equal(t, true, status.NodeFlag.Retried) + }) +} + func TestHooksSuite(t *testing.T) { suite.Run(t, new(HooksSuite)) } diff --git a/test/e2e/retry_test.go b/test/e2e/retry_test.go index 5806965bf3d5..a34104619d21 100644 --- a/test/e2e/retry_test.go +++ b/test/e2e/retry_test.go @@ -9,8 +9,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" + apiv1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" "github.com/argoproj/argo-workflows/v3/test/e2e/fixtures" ) @@ -23,7 +25,7 @@ func (s *RetryTestSuite) TestRetryLimit() { s.Given(). Workflow(` metadata: - generateName: test-retry-limit- + name: test-retry-limit spec: entrypoint: main templates: @@ -46,6 +48,20 @@ spec: ExpectWorkflow(func(t *testing.T, _ *metav1.ObjectMeta, status *wfv1.WorkflowStatus) { assert.Equal(t, wfv1.WorkflowPhase("Failed"), status.Phase) assert.Equal(t, "No more retries left", status.Message) + assert.Equal(t, v1alpha1.Progress("0/1"), status.Progress) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-retry-limit" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeFailed, status.Phase) + assert.Equal(t, v1alpha1.NodeTypeRetry, status.Type) + assert.Nil(t, status.NodeFlag) + }). + ExpectWorkflowNode(func(status v1alpha1.NodeStatus) bool { + return status.Name == "test-retry-limit(0)" + }, func(t *testing.T, status *v1alpha1.NodeStatus, pod *apiv1.Pod) { + assert.Equal(t, v1alpha1.NodeFailed, status.Phase) + assert.Equal(t, true, status.NodeFlag.Retried) }) } diff --git a/workflow/controller/container_set_template.go b/workflow/controller/container_set_template.go index c5a7865ed7df..6905c82452f0 100644 --- a/workflow/controller/container_set_template.go +++ b/workflow/controller/container_set_template.go @@ -10,7 +10,7 @@ import ( func (woc *wfOperationCtx) executeContainerSet(ctx context.Context, nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } includeScriptOutput, err := woc.includeScriptOutput(nodeName, opts.boundaryID) if err != nil { @@ -32,7 +32,7 @@ func (woc *wfOperationCtx) executeContainerSet(ctx context.Context, nodeName str ctxNodeName := fmt.Sprintf("%s.%s", nodeName, c.Name) _, err := woc.wf.GetNodeByName(ctxNodeName) if err != nil { - _ = woc.initializeNode(ctxNodeName, wfv1.NodeTypeContainer, templateScope, orgTmpl, node.ID, wfv1.NodePending) + _ = woc.initializeNode(ctxNodeName, wfv1.NodeTypeContainer, templateScope, orgTmpl, node.ID, wfv1.NodePending, opts.nodeFlag) } } for _, c := range tmpl.ContainerSet.GetGraph() { diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 29755d301c5d..a5fc603fbf54 100644 --- a/workflow/controller/dag.go +++ b/workflow/controller/dag.go @@ -227,7 +227,7 @@ func (woc *wfOperationCtx) executeDAG(ctx context.Context, nodeName string, tmpl node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeDAG, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeDAG, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning, opts.nodeFlag) } defer func() { @@ -506,7 +506,7 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex } execute, proceed, err := dagCtx.evaluateDependsLogic(taskName) if err != nil { - woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, err.Error()) + woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, &wfv1.NodeFlag{}, err.Error()) connectDependencies(nodeName) return } @@ -516,7 +516,7 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex } if !execute { // Given the results of this node's dependencies, this node should not be executed. Mark it omitted - woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeOmitted, "omitted: depends condition not met") + woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeOmitted, &wfv1.NodeFlag{}, "omitted: depends condition not met") connectDependencies(nodeName) return } @@ -526,7 +526,7 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex // First resolve/substitute params/artifacts from our dependencies newTask, err := woc.resolveDependencyReferences(dagCtx, task) if err != nil { - woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, err.Error()) + woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, &wfv1.NodeFlag{}, err.Error()) connectDependencies(nodeName) return } @@ -535,7 +535,7 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex // expandedTasks will be a single element list of the same task expandedTasks, err := expandTask(*newTask) if err != nil { - woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, err.Error()) + woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, &wfv1.NodeFlag{}, err.Error()) connectDependencies(nodeName) return } @@ -547,11 +547,11 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex // DAG task with empty withParams list should be skipped if len(expandedTasks) == 0 { skipReason := "Skipped, empty params" - woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeSkipped, skipReason) + woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeSkipped, &wfv1.NodeFlag{}, skipReason) connectDependencies(nodeName) } else if taskGroupNode == nil { connectDependencies(nodeName) - taskGroupNode = woc.initializeNode(nodeName, wfv1.NodeTypeTaskGroup, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeRunning, "") + taskGroupNode = woc.initializeNode(nodeName, wfv1.NodeTypeTaskGroup, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeRunning, &wfv1.NodeFlag{}, "") } } @@ -566,12 +566,12 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex // Check the task's when clause to decide if it should execute proceed, err := shouldExecute(t.When) if err != nil { - woc.initializeNode(taskNodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, err.Error()) + woc.initializeNode(taskNodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeError, &wfv1.NodeFlag{}, err.Error()) continue } if !proceed { skipReason := fmt.Sprintf("when '%s' evaluated false", t.When) - woc.initializeNode(taskNodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeSkipped, skipReason) + woc.initializeNode(taskNodeName, wfv1.NodeTypeSkipped, dagTemplateScope, task, dagCtx.boundaryID, wfv1.NodeSkipped, &wfv1.NodeFlag{}, skipReason) continue } } diff --git a/workflow/controller/dag_test.go b/workflow/controller/dag_test.go index fd8e0f6b2b58..1ce7d1f9b47f 100644 --- a/workflow/controller/dag_test.go +++ b/workflow/controller/dag_test.go @@ -1467,6 +1467,8 @@ status: templateName: echo templateScope: local/dag-diamond-dj7q5 type: Pod + nodeFlag: + retried: true phase: Running resourcesDuration: cpu: 2 @@ -1686,6 +1688,7 @@ func TestRetryStrategyNodes(t *testing.T) { onExitNode, err := woc.wf.GetNodeByName("wf-retry-pol.onExit") if assert.NoError(t, err) { assert.NotNil(t, onExitNode) + assert.True(t, onExitNode.NodeFlag.Hooked) assert.Equal(t, wfv1.NodePending, onExitNode.Phase) } @@ -1853,6 +1856,7 @@ func TestOnExitDAGPhase(t *testing.T) { retryNode, err = woc.wf.GetNodeByName("dag-diamond-88trp.B.onExit") if assert.NoError(t, err) { assert.NotNil(t, retryNode) + assert.True(t, retryNode.NodeFlag.Hooked) assert.Equal(t, wfv1.NodePending, retryNode.Phase) } @@ -1979,6 +1983,7 @@ func TestOnExitNonLeaf(t *testing.T) { retryNode, err := woc.wf.GetNodeByName("exit-handler-bug-example.step-2.onExit") if assert.NoError(t, err) { assert.NotNil(t, retryNode) + assert.True(t, retryNode.NodeFlag.Hooked) assert.Equal(t, wfv1.NodePending, retryNode.Phase) } @@ -2251,6 +2256,7 @@ func TestDagTargetTaskOnExit(t *testing.T) { onExitNode, err := woc.wf.GetNodeByName("dag-primay-branch-6bnnl.A.onExit") if assert.NoError(t, err) { assert.NotNil(t, onExitNode) + assert.True(t, onExitNode.NodeFlag.Hooked) assert.Equal(t, wfv1.NodePending, onExitNode.Phase) } } @@ -3587,12 +3593,14 @@ func TestRetryTypeDagTaskRunExitNodeAfterCompleted(t *testing.T) { onExitNode := woc.wf.Status.Nodes.FindByDisplayName("printA.onExit") assert.NotNil(t, onExitNode) assert.Equal(t, wfv1.NodeRunning, onExitNode.Phase) + assert.True(t, onExitNode.NodeFlag.Hooked) // exitNode succeeded makePodsPhase(ctx, woc, v1.PodSucceeded) woc.operate(ctx) onExitNode = woc.wf.Status.Nodes.FindByDisplayName("printA.onExit") assert.Equal(t, wfv1.NodeSucceeded, onExitNode.Phase) + assert.True(t, onExitNode.NodeFlag.Hooked) // run next DAGTask woc.operate(ctx) diff --git a/workflow/controller/exit_handler.go b/workflow/controller/exit_handler.go index 3ff4a50297ec..292bba2bb029 100644 --- a/workflow/controller/exit_handler.go +++ b/workflow/controller/exit_handler.go @@ -41,9 +41,9 @@ func (woc *wfOperationCtx) runOnExitNode(ctx context.Context, exitHook *wfv1.Lif } onExitNode, err := woc.executeTemplate(ctx, onExitNodeName, &wfv1.WorkflowStep{Template: exitHook.Template, TemplateRef: exitHook.TemplateRef}, tmplCtx, resolvedArgs, &executeTemplateOpts{ - boundaryID: boundaryID, onExitTemplate: true, + nodeFlag: &wfv1.NodeFlag{Hooked: true}, }) woc.addChildNode(parentNode.Name, onExitNodeName) return true, onExitNode, err diff --git a/workflow/controller/hooks.go b/workflow/controller/hooks.go index ed122e3853eb..750ab939e915 100644 --- a/workflow/controller/hooks.go +++ b/workflow/controller/hooks.go @@ -32,7 +32,9 @@ func (woc *wfOperationCtx) executeWfLifeCycleHook(ctx context.Context, tmplCtx * // executeTemplated should be invoked when hookedNode != nil, because we should reexecute the function to check mutex condition, etc. if execute || hookedNode != nil { woc.log.WithField("lifeCycleHook", hookName).WithField("node", hookNodeName).Infof("Running workflow level hooks") - hookNode, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, hook.Arguments, &executeTemplateOpts{}) + hookNode, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, hook.Arguments, + &executeTemplateOpts{nodeFlag: &wfv1.NodeFlag{Hooked: true}}, + ) if err != nil { return true, err } @@ -88,6 +90,7 @@ func (woc *wfOperationCtx) executeTmplLifeCycleHook(ctx context.Context, scope * } hookNode, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, resolvedArgs, &executeTemplateOpts{ boundaryID: boundaryID, + nodeFlag: &wfv1.NodeFlag{Hooked: true}, }) if err != nil { return false, err diff --git a/workflow/controller/hooks_test.go b/workflow/controller/hooks_test.go index c67027f3a24f..7a4ab353cb81 100644 --- a/workflow/controller/hooks_test.go +++ b/workflow/controller/hooks_test.go @@ -145,6 +145,7 @@ status: woc.operate(ctx) node := woc.wf.Status.Nodes.FindByDisplayName("lifecycle-hook-bgsf6.hooks.error") assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) node = woc.wf.Status.Nodes.FindByDisplayName("lifecycle-hook-bgsf6.hooks.running") assert.Nil(t, node) assert.Equal(t, wfv1.WorkflowError, woc.wf.Status.Phase) @@ -264,6 +265,7 @@ status: woc.operate(ctx) node := woc.wf.Status.Nodes.FindByDisplayName("step1.hooks.error") assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) node = woc.wf.Status.Nodes.FindByDisplayName("step1.hooks.running") assert.Nil(t, node) } @@ -548,7 +550,9 @@ status: ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - assert.NotNil(t, woc.wf.Status.Nodes.FindByDisplayName("step-1.hooks.error")) + node := woc.wf.Status.Nodes.FindByDisplayName("step-1.hooks.error") + assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) } func TestTemplateRefWithHook(t *testing.T) { @@ -774,8 +778,9 @@ status: for _, node := range woc.wf.Status.Nodes { fmt.Println(node.DisplayName, node.Phase) } - assert.NotNil(t, woc.wf.Status.Nodes.FindByDisplayName("step-1.hooks.error")) - + node := woc.wf.Status.Nodes.FindByDisplayName("step-1.hooks.error") + assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) } func TestWfTemplateRefWithHook(t *testing.T) { @@ -935,6 +940,7 @@ status: woc.operate(ctx) node := woc.wf.Status.Nodes.FindByDisplayName("lifecycle-hook-fh7t4.hooks.Failed") assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) } func TestWfHookHasFailures(t *testing.T) { @@ -995,6 +1001,7 @@ spec: assert.NoError(t, err) node = woc.wf.Status.Nodes.FindByDisplayName("hook-failures.hooks.failure") assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) assert.Equal(t, wfv1.NodeFailed, node.Phase) } @@ -1118,6 +1125,7 @@ spec: node := woc.wf.Status.Nodes.FindByDisplayName("hook-running.hooks.running") assert.NotNil(t, node) assert.Equal(t, wfv1.NodePending, node.Phase) + assert.True(t, node.NodeFlag.Hooked) // Make all pods running makePodsPhase(ctx, woc, apiv1.PodRunning) @@ -1125,6 +1133,7 @@ spec: woc.operate(ctx) node = woc.wf.Status.Nodes.FindByDisplayName("hook-running.hooks.running") assert.Equal(t, wfv1.NodeRunning, node.Phase) + assert.True(t, node.NodeFlag.Hooked) // Make main pod completed podcs := woc.controller.kubeclientset.CoreV1().Pods(woc.wf.GetNamespace()) @@ -1137,8 +1146,10 @@ spec: assert.Equal(t, wfv1.Progress("1/2"), woc.wf.Status.Progress) node = woc.wf.Status.Nodes.FindByDisplayName("hook-running") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.Nil(t, node.NodeFlag) node = woc.wf.Status.Nodes.FindByDisplayName("hook-running.hooks.running") assert.Equal(t, wfv1.NodeRunning, node.Phase) + assert.True(t, node.NodeFlag.Hooked) assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // Make all pod completed @@ -1148,8 +1159,10 @@ spec: assert.Equal(t, wfv1.Progress("2/2"), woc.wf.Status.Progress) node = woc.wf.Status.Nodes.FindByDisplayName("hook-running.hooks.running") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.True(t, node.NodeFlag.Hooked) node = woc.wf.Status.Nodes.FindByDisplayName("hook-running") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.Nil(t, node.NodeFlag) assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } @@ -1200,6 +1213,7 @@ spec: woc.operate(ctx) node := woc.wf.Status.Nodes.FindByDisplayName("job.hooks.running") assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) assert.Equal(t, wfv1.NodePending, node.Phase) // Make all pods running @@ -1208,6 +1222,7 @@ spec: woc.operate(ctx) node = woc.wf.Status.Nodes.FindByDisplayName("job.hooks.running") assert.Equal(t, wfv1.NodeRunning, node.Phase) + assert.True(t, node.NodeFlag.Hooked) // Make main pod completed podcs := woc.controller.kubeclientset.CoreV1().Pods(woc.wf.GetNamespace()) @@ -1221,8 +1236,10 @@ spec: assert.Equal(t, wfv1.Progress("1/2"), woc.wf.Status.Progress) node = woc.wf.Status.Nodes.FindByDisplayName("job") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.Nil(t, node.NodeFlag) node = woc.wf.Status.Nodes.FindByDisplayName("job.hooks.running") assert.Equal(t, wfv1.NodeRunning, node.Phase) + assert.True(t, node.NodeFlag.Hooked) assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) // Make all pod completed @@ -1232,7 +1249,9 @@ spec: assert.Equal(t, wfv1.Progress("2/2"), woc.wf.Status.Progress) node = woc.wf.Status.Nodes.FindByDisplayName("job.hooks.running") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.True(t, node.NodeFlag.Hooked) node = woc.wf.Status.Nodes.FindByDisplayName("job") assert.Equal(t, wfv1.NodeSucceeded, node.Phase) + assert.Nil(t, node.NodeFlag) assert.Equal(t, wfv1.WorkflowSucceeded, woc.wf.Status.Phase) } diff --git a/workflow/controller/http_template.go b/workflow/controller/http_template.go index bf874b1a5b10..0bbd9fcbfde2 100644 --- a/workflow/controller/http_template.go +++ b/workflow/controller/http_template.go @@ -7,7 +7,7 @@ import ( func (woc *wfOperationCtx) executeHTTPTemplate(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) *wfv1.NodeStatus { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeHTTP, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeHTTP, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) woc.taskSet[node.ID] = *tmpl } return node diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index ce7efa10d433..98ebbaf7fbc8 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -431,7 +431,8 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { woc.log.Infof("Running OnExit handler: %s", woc.execWf.Spec.OnExit) onExitNodeName := common.GenerateOnExitNodeName(woc.wf.ObjectMeta.Name) exitHook := woc.execWf.Spec.GetExitHook(woc.execWf.Spec.Arguments) - onExitNode, err = woc.executeTemplate(ctx, onExitNodeName, &wfv1.WorkflowStep{Template: exitHook.Template, TemplateRef: exitHook.TemplateRef}, tmplCtx, exitHook.Arguments, &executeTemplateOpts{onExitTemplate: true}) + onExitNode, err = woc.executeTemplate(ctx, onExitNodeName, &wfv1.WorkflowStep{Template: exitHook.Template, TemplateRef: exitHook.TemplateRef}, tmplCtx, exitHook.Arguments, &executeTemplateOpts{ + onExitTemplate: true, nodeFlag: &wfv1.NodeFlag{Hooked: true}}) if err != nil { x := fmt.Errorf("error in exit template execution : %w", err) switch err { @@ -921,9 +922,12 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate return node, true, nil } - lastChildNode := getChildNodeIndex(node, woc.wf.Status.Nodes, -1) + childNodeIds, lastChildNode := getChildNodeIdsAndLastRetriedNode(node, woc.wf.Status.Nodes) + if len(childNodeIds) == 0 { + return node, true, nil + } - if retryStrategy.Expression != "" && len(node.Children) > 0 { + if retryStrategy.Expression != "" && len(childNodeIds) > 0 { localScope := buildRetryStrategyLocalScope(node, woc.wf.Status.Nodes) scope := env.GetFuncMap(localScope) shouldContinue, err := argoexpr.EvalBool(retryStrategy.Expression, scope) @@ -964,12 +968,15 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate if retryStrategy.Backoff != nil { maxDurationDeadline := time.Time{} // Process max duration limit - if retryStrategy.Backoff.MaxDuration != "" && len(node.Children) > 0 { + if retryStrategy.Backoff.MaxDuration != "" && len(childNodeIds) > 0 { maxDuration, err := parseStringToDuration(retryStrategy.Backoff.MaxDuration) if err != nil { return nil, false, err } - firstChildNode := getChildNodeIndex(node, woc.wf.Status.Nodes, 0) + firstChildNode, err := woc.wf.Status.Nodes.Get(childNodeIds[0]) + if err != nil { + return nil, false, err + } maxDurationDeadline = firstChildNode.StartedAt.Add(maxDuration) if time.Now().After(maxDurationDeadline) { woc.log.Infoln("Max duration limit exceeded. Failing...") @@ -995,7 +1002,7 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate if retryStrategyBackoffFactor != nil && *retryStrategyBackoffFactor > 0 { // Formula: timeToWait = duration * factor^retry_number // Note that timeToWait should equal to duration for the first retry attempt. - timeToWait = baseDuration * time.Duration(math.Pow(float64(*retryStrategyBackoffFactor), float64(len(node.Children)-1))) + timeToWait = baseDuration * time.Duration(math.Pow(float64(*retryStrategyBackoffFactor), float64(len(childNodeIds)-1))) } waitingDeadline := lastChildNode.FinishedAt.Add(timeToWait) @@ -1006,7 +1013,7 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate } // See if we have waited past the deadline - if time.Now().Before(waitingDeadline) && retryStrategy.Limit != nil && int32(len(node.Children)) <= int32(retryStrategy.Limit.IntValue()) { + if time.Now().Before(waitingDeadline) && retryStrategy.Limit != nil && int32(len(childNodeIds)) <= int32(retryStrategy.Limit.IntValue()) { woc.requeueAfter(timeToWait) retryMessage := fmt.Sprintf("Backoff for %s", humanize.Duration(timeToWait)) return woc.markNodePhase(node.Name, node.Phase, retryMessage), false, nil @@ -1054,12 +1061,12 @@ func (woc *wfOperationCtx) processNodeRetries(node *wfv1.NodeStatus, retryStrate if err != nil { return nil, false, err } - if retryStrategy.Limit != nil && limit != nil && int32(len(node.Children)) > *limit { + if retryStrategy.Limit != nil && limit != nil && int32(len(childNodeIds)) > *limit { woc.log.Infoln("No more retries left. Failing...") return woc.markNodePhase(node.Name, lastChildNode.Phase, "No more retries left"), true, nil } - woc.log.Infof("%d child nodes of %s failed. Trying again...", len(node.Children), node.Name) + woc.log.Infof("%d child nodes of %s failed. Trying again...", len(childNodeIds), node.Name) return node, true, nil } @@ -1741,9 +1748,12 @@ func buildRetryStrategyLocalScope(node *wfv1.NodeStatus, nodes wfv1.Nodes) map[s localScope := make(map[string]interface{}) // `retries` variable - localScope[common.LocalVarRetries] = strconv.Itoa(len(node.Children) - 1) + childNodeIds, lastChildNode := getChildNodeIdsAndLastRetriedNode(node, nodes) - lastChildNode := getChildNodeIndex(node, nodes, -1) + if lastChildNode == nil || len(childNodeIds) == 0 { + return localScope + } + localScope[common.LocalVarRetries] = strconv.Itoa(len(childNodeIds) - 1) exitCode := "-1" if lastChildNode.Outputs != nil && lastChildNode.Outputs.ExitCode != nil { @@ -1765,6 +1775,8 @@ type executeTemplateOpts struct { onExitTemplate bool // activeDeadlineSeconds is a deadline to set to any pods executed. This is necessary for pods to inherit backoff.maxDuration executionDeadline time.Time + // nodeFlag tracks node information such as hook or retry + nodeFlag *wfv1.NodeFlag } // executeTemplate executes the template with the given arguments and returns the created NodeStatus @@ -1787,12 +1799,12 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, defer func() { woc.currentStackDepth-- }() if woc.currentStackDepth >= woc.controller.maxStackDepth && os.Getenv("DISABLE_MAX_RECURSION") != "true" { - return woc.initializeNodeOrMarkError(node, nodeName, tmplCtx.GetTemplateScope(), orgTmpl, opts.boundaryID, ErrMaxDepthExceeded), ErrMaxDepthExceeded + return woc.initializeNodeOrMarkError(node, nodeName, tmplCtx.GetTemplateScope(), orgTmpl, opts.boundaryID, opts.nodeFlag, ErrMaxDepthExceeded), ErrMaxDepthExceeded } newTmplCtx, resolvedTmpl, templateStored, err := tmplCtx.ResolveTemplate(orgTmpl) if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } // A new template was stored during resolution, persist it if templateStored { @@ -1817,13 +1829,13 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, // Merge Template defaults to template err = woc.mergedTemplateDefaultsInto(resolvedTmpl) if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } // Inputs has been processed with arguments already, so pass empty arguments. processedTmpl, err := common.ProcessArgs(resolvedTmpl, &args, woc.globalParams, localParams, false, woc.wf.Namespace, woc.controller.configMapInformer.GetIndexer()) if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } // Check if this is a fulfilled node for synchronization. @@ -1863,11 +1875,11 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, if processedTmpl.Synchronization != nil { lockAcquired, wfUpdated, msg, err := woc.controller.syncManager.TryAcquire(woc.wf, woc.wf.NodeID(nodeName), processedTmpl.Synchronization) if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } if !lockAcquired { if node == nil { - node = woc.initializeExecutableNode(nodeName, wfutil.GetNodeType(processedTmpl), templateScope, processedTmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, msg) + node = woc.initializeExecutableNode(nodeName, wfutil.GetNodeType(processedTmpl), templateScope, processedTmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag, msg) } lockName, err := argosync.GetLockName(processedTmpl.Synchronization, woc.wf.Namespace) if err != nil { @@ -1900,12 +1912,12 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, if memoizationCache == nil { err := fmt.Errorf("cache could not be found or created") woc.log.WithFields(log.Fields{"cacheName": processedTmpl.Memoize.Cache.ConfigMap.Name}).WithError(err) - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } entry, err := memoizationCache.Load(ctx, processedTmpl.Memoize.Key) if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } hit := entry.Hit() @@ -1914,7 +1926,7 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, maxAge, err := time.ParseDuration(processedTmpl.Memoize.MaxAge) if err != nil { err := fmt.Errorf("invalid maxAge: %s", err) - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } maxAgeOutputs, ok := entry.GetOutputsWithMaxAge(maxAge) if !ok { @@ -1933,14 +1945,14 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, } if hit { if node == nil { - node = woc.initializeCacheHitNode(nodeName, processedTmpl, templateScope, orgTmpl, opts.boundaryID, outputs, memoizationStatus) + node = woc.initializeCacheHitNode(nodeName, processedTmpl, templateScope, orgTmpl, opts.boundaryID, outputs, memoizationStatus, opts.nodeFlag) } else { woc.log.Infof("Node %s is using mutex with memoize. Cache is hit.", nodeName) woc.updateAsCacheHitNode(node, outputs, memoizationStatus) } } else { if node == nil { - node = woc.initializeCacheNode(nodeName, processedTmpl, templateScope, orgTmpl, opts.boundaryID, memoizationStatus) + node = woc.initializeCacheNode(nodeName, processedTmpl, templateScope, orgTmpl, opts.boundaryID, memoizationStatus, opts.nodeFlag) } else { woc.log.Infof("Node %s is using mutex with memoize. Cache is NOT hit", nodeName) woc.updateAsCacheNode(node, memoizationStatus) @@ -1980,8 +1992,12 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, retryParentNode := node if retryParentNode == nil { woc.log.Debugf("Inject a retry node for node %s", retryNodeName) - retryParentNode = woc.initializeExecutableNode(retryNodeName, wfv1.NodeTypeRetry, templateScope, processedTmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning) + retryParentNode = woc.initializeExecutableNode(retryNodeName, wfv1.NodeTypeRetry, templateScope, processedTmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning, opts.nodeFlag) } + if opts.nodeFlag == nil { + opts.nodeFlag = &wfv1.NodeFlag{} + } + opts.nodeFlag.Retried = true processedRetryParentNode, continueExecution, err := woc.processNodeRetries(retryParentNode, *woc.retryStrategy(processedTmpl), opts) if err != nil { return woc.markNodeError(retryNodeName, err), err @@ -1990,7 +2006,8 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, return retryParentNode, nil } retryParentNode = processedRetryParentNode - lastChildNode := getChildNodeIndex(retryParentNode, woc.wf.Status.Nodes, -1) + childNodeIDs, lastChildNode := getChildNodeIdsAndLastRetriedNode(retryParentNode, woc.wf.Status.Nodes) + // The retry node might have completed by now. if retryParentNode.Fulfilled() { // If retry node has completed, set the output of the last child node to its output. @@ -2012,7 +2029,7 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, if processedTmpl.Synchronization != nil { woc.controller.syncManager.Release(woc.wf, node.ID, processedTmpl.Synchronization) } - lastChildNode := getChildNodeIndex(retryParentNode, woc.wf.Status.Nodes, -1) + _, lastChildNode := getChildNodeIdsAndLastRetriedNode(retryParentNode, woc.wf.Status.Nodes) if lastChildNode != nil { retryParentNode.Outputs = lastChildNode.Outputs.DeepCopy() woc.wf.Status.Nodes.Set(node.ID, *retryParentNode) @@ -2028,8 +2045,9 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, nodeName = lastChildNode.Name node = lastChildNode } else { + retryNum := len(childNodeIDs) // Create a new child node and append it to the retry node. - nodeName = fmt.Sprintf("%s(%d)", retryNodeName, len(retryParentNode.Children)) + nodeName = fmt.Sprintf("%s(%d)", retryNodeName, retryNum) woc.addChildNode(retryNodeName, nodeName) node = nil @@ -2039,14 +2057,14 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, localParams[common.LocalVarPodName] = woc.getPodName(nodeName, processedTmpl.Name) } // Inject the retryAttempt number - localParams[common.LocalVarRetries] = strconv.Itoa(len(retryParentNode.Children)) + localParams[common.LocalVarRetries] = strconv.Itoa(retryNum) processedTmpl, err = common.SubstituteParams(processedTmpl, map[string]string{}, localParams) if errorsutil.IsTransientErr(err) { return node, err } if err != nil { - return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, err), err + return woc.initializeNodeOrMarkError(node, nodeName, templateScope, orgTmpl, opts.boundaryID, opts.nodeFlag, err), err } } } @@ -2074,7 +2092,7 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, node = woc.executePluginTemplate(nodeName, templateScope, processedTmpl, orgTmpl, opts) default: err = errors.Errorf(errors.CodeBadRequest, "Template '%s' missing specification", processedTmpl.Name) - return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, wfv1.NodeError, err.Error()), err + return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, opts.boundaryID, wfv1.NodeError, opts.nodeFlag, err.Error()), err } if err != nil { @@ -2346,8 +2364,8 @@ func (woc *wfOperationCtx) markWorkflowError(ctx context.Context, err error) { var stepsOrDagSeparator = regexp.MustCompile(`^(\[\d+\])?\.`) // initializeExecutableNode initializes a node and stores the template. -func (woc *wfOperationCtx) initializeExecutableNode(nodeName string, nodeType wfv1.NodeType, templateScope string, executeTmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, phase wfv1.NodePhase, messages ...string) *wfv1.NodeStatus { - node := woc.initializeNode(nodeName, nodeType, templateScope, orgTmpl, boundaryID, phase) +func (woc *wfOperationCtx) initializeExecutableNode(nodeName string, nodeType wfv1.NodeType, templateScope string, executeTmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, phase wfv1.NodePhase, nodeFlag *wfv1.NodeFlag, messages ...string) *wfv1.NodeStatus { + node := woc.initializeNode(nodeName, nodeType, templateScope, orgTmpl, boundaryID, phase, nodeFlag) // Set the input values to the node. if executeTmpl.Inputs.HasInputs() { @@ -2370,16 +2388,16 @@ func (woc *wfOperationCtx) initializeExecutableNode(nodeName string, nodeType wf } // initializeNodeOrMarkError initializes an error node or mark a node if it already exists. -func (woc *wfOperationCtx) initializeNodeOrMarkError(node *wfv1.NodeStatus, nodeName string, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, err error) *wfv1.NodeStatus { +func (woc *wfOperationCtx) initializeNodeOrMarkError(node *wfv1.NodeStatus, nodeName string, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, nodeFlag *wfv1.NodeFlag, err error) *wfv1.NodeStatus { if node != nil { return woc.markNodeError(nodeName, err) } - return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, err.Error()) + return woc.initializeNode(nodeName, wfv1.NodeTypeSkipped, templateScope, orgTmpl, boundaryID, wfv1.NodeError, nodeFlag, err.Error()) } // Creates a node status that is or will be cached -func (woc *wfOperationCtx) initializeCacheNode(nodeName string, resolvedTmpl *wfv1.Template, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, memStat *wfv1.MemoizationStatus, messages ...string) *wfv1.NodeStatus { +func (woc *wfOperationCtx) initializeCacheNode(nodeName string, resolvedTmpl *wfv1.Template, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, memStat *wfv1.MemoizationStatus, nodeFlag *wfv1.NodeFlag, messages ...string) *wfv1.NodeStatus { if resolvedTmpl.Memoize == nil { err := fmt.Errorf("cannot initialize a cached node from a non-memoized template") woc.log.WithFields(log.Fields{"namespace": woc.wf.Namespace, "wfName": woc.wf.Name}).WithError(err) @@ -2387,21 +2405,21 @@ func (woc *wfOperationCtx) initializeCacheNode(nodeName string, resolvedTmpl *wf } woc.log.Debug("Initializing cached node ", nodeName, common.GetTemplateHolderString(orgTmpl), boundaryID) - node := woc.initializeExecutableNode(nodeName, wfutil.GetNodeType(resolvedTmpl), templateScope, resolvedTmpl, orgTmpl, boundaryID, wfv1.NodePending, messages...) + node := woc.initializeExecutableNode(nodeName, wfutil.GetNodeType(resolvedTmpl), templateScope, resolvedTmpl, orgTmpl, boundaryID, wfv1.NodePending, nodeFlag, messages...) node.MemoizationStatus = memStat return node } // Creates a node status that has been cached, completely initialized, and marked as finished -func (woc *wfOperationCtx) initializeCacheHitNode(nodeName string, resolvedTmpl *wfv1.Template, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, outputs *wfv1.Outputs, memStat *wfv1.MemoizationStatus, messages ...string) *wfv1.NodeStatus { - node := woc.initializeCacheNode(nodeName, resolvedTmpl, templateScope, orgTmpl, boundaryID, memStat, messages...) +func (woc *wfOperationCtx) initializeCacheHitNode(nodeName string, resolvedTmpl *wfv1.Template, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, outputs *wfv1.Outputs, memStat *wfv1.MemoizationStatus, nodeFlag *wfv1.NodeFlag, messages ...string) *wfv1.NodeStatus { + node := woc.initializeCacheNode(nodeName, resolvedTmpl, templateScope, orgTmpl, boundaryID, memStat, nodeFlag, messages...) node.Phase = wfv1.NodeSucceeded node.Outputs = outputs node.FinishedAt = metav1.Time{Time: time.Now().UTC()} return node } -func (woc *wfOperationCtx) initializeNode(nodeName string, nodeType wfv1.NodeType, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, phase wfv1.NodePhase, messages ...string) *wfv1.NodeStatus { +func (woc *wfOperationCtx) initializeNode(nodeName string, nodeType wfv1.NodeType, templateScope string, orgTmpl wfv1.TemplateReferenceHolder, boundaryID string, phase wfv1.NodePhase, nodeFlag *wfv1.NodeFlag, messages ...string) *wfv1.NodeStatus { woc.log.Debugf("Initializing node %s: template: %s, boundaryID: %s", nodeName, common.GetTemplateHolderString(orgTmpl), boundaryID) nodeID := woc.wf.NodeID(nodeName) @@ -2419,6 +2437,7 @@ func (woc *wfOperationCtx) initializeNode(nodeName string, nodeType wfv1.NodeTyp Type: nodeType, BoundaryID: boundaryID, Phase: phase, + NodeFlag: nodeFlag, StartedAt: metav1.Time{Time: time.Now().UTC()}, EstimatedDuration: woc.estimateNodeDuration(nodeName), } @@ -2675,7 +2694,7 @@ func (woc *wfOperationCtx) checkParallelism(tmpl *wfv1.Template, node *wfv1.Node func (woc *wfOperationCtx) executeContainer(ctx context.Context, nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } // Check if the output of this container is referenced elsewhere in the Workflow. If so, make sure to include it during @@ -2879,7 +2898,7 @@ loop: func (woc *wfOperationCtx) executeScript(ctx context.Context, nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } else if !node.Pending() { return node, nil } @@ -3151,7 +3170,7 @@ func (woc *wfOperationCtx) executeResource(ctx context.Context, nodeName string, node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } else if !node.Pending() { return node, nil } @@ -3187,7 +3206,7 @@ func (woc *wfOperationCtx) executeResource(ctx context.Context, nodeName string, func (woc *wfOperationCtx) executeData(ctx context.Context, nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePod, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } else if !node.Pending() { return node, nil } @@ -3210,7 +3229,7 @@ func (woc *wfOperationCtx) executeData(ctx context.Context, nodeName string, tem func (woc *wfOperationCtx) executeSuspend(nodeName string, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSuspend, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) woc.resolveInputFieldsForSuspendNode(node) } woc.log.Infof("node %s suspended", nodeName) @@ -3941,3 +3960,34 @@ func setWfPodNamesAnnotation(wf *wfv1.Workflow) { wf.Annotations[common.AnnotationKeyPodNameVersion] = podNameVersion.String() } + +// getChildNodeIdsAndLastRetriedNode returns child node ids and last retried node, which are marked as `NodeStatus.NodeFlag.Retried=true`. +// This function aims to remove some unnecessary child nodes for `NodeType: Retry`, such as hooked nodes. +func getChildNodeIdsAndLastRetriedNode(node *wfv1.NodeStatus, nodes wfv1.Nodes) ([]string, *wfv1.NodeStatus) { + childNodeIds := getChildNodeIdsRetried(node, nodes) + + if len(childNodeIds) == 0 { + return []string{}, nil + } + + lastChildNode, err := nodes.Get(childNodeIds[len(childNodeIds)-1]) + if err != nil { + panic(fmt.Sprintf("could not find nodeId %s in Children of node %+v", childNodeIds[len(childNodeIds)-1], node)) + } + return childNodeIds, lastChildNode +} + +// getChildNodeIdsRetried returns child node ids `NodeStatus.NodeFlag.Retried` are set to true. +func getChildNodeIdsRetried(node *wfv1.NodeStatus, nodes wfv1.Nodes) []string { + childrenIds := []string{} + for i := 0; i < len(node.Children); i++ { + n := getChildNodeIndex(node, nodes, i) + if n == nil || n.NodeFlag == nil { + continue + } + if n.NodeFlag.Retried { + childrenIds = append(childrenIds, n.ID) + } + } + return childrenIds +} diff --git a/workflow/controller/operator_metrics_test.go b/workflow/controller/operator_metrics_test.go index fa619df61cb7..51b597ee9d69 100644 --- a/workflow/controller/operator_metrics_test.go +++ b/workflow/controller/operator_metrics_test.go @@ -719,6 +719,8 @@ status: templateName: A templateScope: local/metrics-eg-lq4nj type: Pod + nodeFlag: + retried: true metrics-eg-lq4nj-4266717436: boundaryID: metrics-eg-lq4nj children: diff --git a/workflow/controller/operator_test.go b/workflow/controller/operator_test.go index 41965b27c79d..0e3a431c8d73 100644 --- a/workflow/controller/operator_test.go +++ b/workflow/controller/operator_test.go @@ -527,7 +527,7 @@ func TestProcessNodeRetries(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") woc.wf.Status.Nodes[nodeID] = *node @@ -540,8 +540,8 @@ func TestProcessNodeRetries(t *testing.T) { // Add child nodes. for i := 0; i < 2; i++ { - childNode := fmt.Sprintf("child-node-%d", i) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) } @@ -572,9 +572,20 @@ func TestProcessNodeRetries(t *testing.T) { assert.NoError(t, err) assert.Equal(t, n.Phase, wfv1.NodeRunning) + // Add a hook node that has Succeeded + childHookedNode := "child-node.hooks.running" + woc.initializeNode(childHookedNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeSucceeded, &wfv1.NodeFlag{Hooked: true}) + woc.addChildNode(nodeName, childHookedNode) + + n, err = woc.wf.GetNodeByName(nodeName) + assert.NoError(t, err) + n, _, err = woc.processNodeRetries(n, retries, &executeTemplateOpts{}) + assert.NoError(t, err) + assert.Equal(t, n.Phase, wfv1.NodeRunning) + // Add a third node that has failed. - childNode := "child-node-3" - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed) + childNode := fmt.Sprintf("%s(%d)", nodeName, 3) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) n, err = woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -598,7 +609,7 @@ func TestProcessNodeRetriesOnErrors(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") retries.RetryPolicy = wfv1.RetryPolicyAlways @@ -612,8 +623,8 @@ func TestProcessNodeRetriesOnErrors(t *testing.T) { // Add child nodes. for i := 0; i < 2; i++ { - childNode := fmt.Sprintf("child-node-%d", i) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) } @@ -645,8 +656,8 @@ func TestProcessNodeRetriesOnErrors(t *testing.T) { assert.Equal(t, n.Phase, wfv1.NodeRunning) // Add a third node that has errored. - childNode := "child-node-3" - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError) + childNode := fmt.Sprintf("%s(%d)", nodeName, 3) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) n, err = woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -670,7 +681,7 @@ func TestProcessNodeRetriesOnTransientErrors(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") retries.RetryPolicy = wfv1.RetryPolicyOnTransientError @@ -684,8 +695,8 @@ func TestProcessNodeRetriesOnTransientErrors(t *testing.T) { // Add child nodes. for i := 0; i < 2; i++ { - childNode := fmt.Sprintf("child-node-%d", i) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) } @@ -722,8 +733,8 @@ func TestProcessNodeRetriesOnTransientErrors(t *testing.T) { _ = os.Unsetenv(transientEnvVarKey) // Add a third node that has errored. - childNode := "child-node-3" - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError) + childNode := fmt.Sprintf("%s(%d)", nodeName, 3) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) n, err = woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -747,7 +758,7 @@ func TestProcessNodeRetriesWithBackoff(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") retries.Backoff = &wfv1.Backoff{ @@ -764,8 +775,8 @@ func TestProcessNodeRetriesWithBackoff(t *testing.T) { lastChild := getChildNodeIndex(node, woc.wf.Status.Nodes, -1) assert.Nil(t, lastChild) - woc.initializeNode("child-node-1", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) - woc.addChildNode(nodeName, "child-node-1") + woc.initializeNode(nodeName+"(0)", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) + woc.addChildNode(nodeName, nodeName+"(0)") n, err := woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -803,7 +814,7 @@ func TestProcessNodeRetriesWithExponentialBackoff(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") retries.RetryPolicy = wfv1.RetryPolicyAlways @@ -819,8 +830,8 @@ func TestProcessNodeRetriesWithExponentialBackoff(t *testing.T) { lastChild := getChildNodeIndex(node, woc.wf.Status.Nodes, -1) require.Nil(lastChild) - woc.initializeNode("child-node-1", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed) - woc.addChildNode(nodeName, "child-node-1") + woc.initializeNode(nodeName+"(0)", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed, &wfv1.NodeFlag{Retried: true}) + woc.addChildNode(nodeName, nodeName+"(0)") n, err := woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -836,8 +847,8 @@ func TestProcessNodeRetriesWithExponentialBackoff(t *testing.T) { require.LessOrEqual(backoff, 300) require.Less(295, backoff) - woc.initializeNode("child-node-2", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError) - woc.addChildNode(nodeName, "child-node-2") + woc.initializeNode(nodeName+"(1)", wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeError, &wfv1.NodeFlag{Retried: true}) + woc.addChildNode(nodeName, nodeName+"(1)") n, err = woc.wf.GetNodeByName(nodeName) assert.NoError(t, err) @@ -897,7 +908,7 @@ func TestProcessNodesNoRetryWithError(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) retries := wfv1.RetryStrategy{} retries.Limit = intstrutil.ParsePtr("2") retries.RetryPolicy = wfv1.RetryPolicyOnFailure @@ -911,8 +922,8 @@ func TestProcessNodesNoRetryWithError(t *testing.T) { // Add child nodes. for i := 0; i < 2; i++ { - childNode := fmt.Sprintf("child-node-%d", i) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) } @@ -1029,6 +1040,8 @@ status: templateName: retry-backoff templateScope: local/retry-backoff-s69z6 type: Pod + nodeFlag: + retried: true retry-backoff-s69z6-1807967148: displayName: retry-backoff-s69z6(0) finishedAt: "2020-05-05T15:18:43Z" @@ -1060,6 +1073,8 @@ status: templateName: retry-backoff templateScope: local/retry-backoff-s69z6 type: Pod + nodeFlag: + retried: true phase: Running resourcesDuration: cpu: 5 @@ -3425,14 +3440,12 @@ func TestStepsOnExit(t *testing.T) { woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - onExitNodeIsPresent := false - for _, node := range woc.wf.Status.Nodes { - if strings.Contains(node.Name, "onExit") { - onExitNodeIsPresent = true - break - } - } - assert.True(t, onExitNodeIsPresent) + node := woc.wf.Status.Nodes.FindByDisplayName("leafA.onExit") + assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) + assert.Equal(t, wfv1.NodePending, node.Phase) + node = woc.wf.Status.Nodes.FindByDisplayName("leafB.onExit") + assert.Nil(t, node) } var onExitFailures = ` @@ -3470,6 +3483,10 @@ func TestStepsOnExitFailures(t *testing.T) { woc.operate(ctx) assert.Contains(t, woc.globalParams[common.GlobalVarWorkflowFailures], `[{\"displayName\":\"exit-handlers\",\"message\":\"Pod failed\",\"templateName\":\"intentional-fail\",\"phase\":\"Failed\",\"podName\":\"exit-handlers\"`) + node := woc.wf.Status.Nodes.FindByDisplayName("exit-handlers") + assert.NotNil(t, node) + assert.Equal(t, wfv1.NodeFailed, node.Phase) + assert.Nil(t, node.NodeFlag) } var onExitTimeout = ` @@ -3508,16 +3525,10 @@ func TestStepsOnExitTimeout(t *testing.T) { woc = newWorkflowOperationCtx(woc.wf, controller) woc.operate(ctx) - wf, err = wfcset.Get(ctx, wf.ObjectMeta.Name, metav1.GetOptions{}) - assert.Nil(t, err) - onExitNodeIsPresent := false - for _, node := range wf.Status.Nodes { - if strings.Contains(node.Name, "onExit") && node.Phase == wfv1.NodePending { - onExitNodeIsPresent = true - break - } - } - assert.True(t, onExitNodeIsPresent) + node := woc.wf.Status.Nodes.FindByDisplayName("exit-handlers.onExit") + assert.NotNil(t, node) + assert.True(t, node.NodeFlag.Hooked) + assert.Equal(t, wfv1.NodePending, node.Phase) } func TestEventNodeEvents(t *testing.T) { @@ -4538,6 +4549,8 @@ status: templateName: echo templateScope: local/echo-wngc4 type: Pod + nodeFlag: + retried: true phase: Running startedAt: "2020-05-07T17:40:57Z" ` @@ -4631,6 +4644,8 @@ status: templateName: echo templateScope: local/echo-r6v49 type: Pod + nodeFlag: + retried: true phase: Running resourcesDuration: cpu: 1 @@ -5470,7 +5485,7 @@ func TestPropagateMaxDurationProcess(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) retries := wfv1.RetryStrategy{ Limit: intstrutil.ParsePtr("2"), Backoff: &wfv1.Backoff{ @@ -5481,8 +5496,8 @@ func TestPropagateMaxDurationProcess(t *testing.T) { } woc.wf.Status.Nodes[woc.wf.NodeID(nodeName)] = *node - childNode := fmt.Sprintf("child-node-%d", 0) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed) + childNode := fmt.Sprintf("%s(%d)", nodeName, 0) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeFailed, &wfv1.NodeFlag{Retried: true}) woc.addChildNode(nodeName, childNode) var opts executeTemplateOpts @@ -6751,7 +6766,7 @@ func TestRetryOnDiffHost(t *testing.T) { // Add the parent node for retries. nodeName := "test-node" nodeID := woc.wf.NodeID(nodeName) - node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) hostSelector := "kubernetes.io/hostname" retries := wfv1.RetryStrategy{} @@ -6768,8 +6783,8 @@ func TestRetryOnDiffHost(t *testing.T) { assert.Nil(t, lastChild) // Add child node. - childNode := fmt.Sprintf("child-node-%d", 0) - woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning) + childNode := fmt.Sprintf("%s(%d)", nodeName, 0) + woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) woc.addChildNode(nodeName, childNode) n, err := woc.wf.GetNodeByName(nodeName) @@ -7962,6 +7977,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-2346402485: boundaryID: retry-script-9z9pv children: @@ -7997,6 +8014,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-3940097040: boundaryID: retry-script-9z9pv children: @@ -8150,6 +8169,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-2346402485: boundaryID: retry-script-9z9pv children: @@ -8185,6 +8206,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-3940097040: boundaryID: retry-script-9z9pv children: @@ -8320,6 +8343,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-2346402485: boundaryID: retry-script-9z9pv children: @@ -8355,6 +8380,8 @@ status: templateName: retry-script templateScope: local/retry-script-9z9pv type: Pod + nodeFlag: + retried: true retry-script-9z9pv-3940097040: boundaryID: retry-script-9z9pv children: @@ -8499,6 +8526,8 @@ status: templateName: output templateScope: local/exit-handler-with-param-xbh52 type: Pod + nodeFlag: + retried: true exit-handler-with-param-xbh52-2034140834: boundaryID: exit-handler-with-param-xbh52 displayName: step-1(0) @@ -8524,6 +8553,8 @@ status: templateName: output templateScope: local/exit-handler-with-param-xbh52 type: Pod + nodeFlag: + retried: true exit-handler-with-param-xbh52-3203867295: boundaryID: exit-handler-with-param-xbh52 children: @@ -9628,3 +9659,86 @@ func TestMaxDepthEnvVariable(t *testing.T) { _ = os.Unsetenv("DISABLE_MAX_RECURSION") } + +func TestGetChildNodeIdsAndLastRetriedNode(t *testing.T) { + nodeName := "test-node" + setup := func() *wfOperationCtx { + cancel, controller := newController() + defer cancel() + assert.NotNil(t, controller) + wf := wfv1.MustUnmarshalWorkflow(helloWorldWf) + assert.NotNil(t, wf) + woc := newWorkflowOperationCtx(wf, controller) + assert.NotNil(t, woc) + // Verify that there are no nodes in the wf status. + assert.Zero(t, len(woc.wf.Status.Nodes)) + + // Add the parent node for retries. + nodeID := woc.wf.NodeID(nodeName) + node := woc.initializeNode(nodeName, wfv1.NodeTypeRetry, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{}) + woc.wf.Status.Nodes[nodeID] = *node + + // Ensure there are no child nodes yet. + lastChild := getChildNodeIndex(node, woc.wf.Status.Nodes, -1) + assert.Nil(t, lastChild) + return woc + } + t.Run("lastChildNode", func(t *testing.T) { + woc := setup() + childNodes := []*wfv1.NodeStatus{} + // Add child nodes. + for i := 0; i < 2; i++ { + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + childNodes = append(childNodes, woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true})) + woc.addChildNode(nodeName, childNode) + } + node, err := woc.wf.GetNodeByName(nodeName) + assert.NoError(t, err) + childNodeIds, lastChildNode := getChildNodeIdsAndLastRetriedNode(node, woc.wf.Status.Nodes) + + assert.Equal(t, 2, len(childNodeIds)) + assert.Equal(t, childNodes[1].ID, lastChildNode.ID) + }) + + t.Run("Ignore hooked node", func(t *testing.T) { + woc := setup() + childNodes := []*wfv1.NodeStatus{} + // Add child nodes. + for i := 0; i < 2; i++ { + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + childNodes = append(childNodes, woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true})) + woc.addChildNode(nodeName, childNode) + } + + // Add child hooked nodes + childNode := fmt.Sprintf("%s.hook.running", nodeName) + childNodes = append(childNodes, woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Hooked: true})) + woc.addChildNode(nodeName, childNode) + + node, err := woc.wf.GetNodeByName(nodeName) + assert.NoError(t, err) + childNodeIds, lastChildNode := getChildNodeIdsAndLastRetriedNode(node, woc.wf.Status.Nodes) + + assert.Equal(t, 2, len(childNodeIds)) + // ignore the hooked node + assert.Equal(t, childNodes[1].ID, lastChildNode.ID) + }) + + t.Run("Retry hooked node", func(t *testing.T) { + woc := setup() + childNodes := []*wfv1.NodeStatus{} + // Add child hooked noes + for i := 0; i < 2; i++ { + childNode := fmt.Sprintf("%s(%d)", nodeName, i) + childNodes = append(childNodes, woc.initializeNode(childNode, wfv1.NodeTypePod, "", &wfv1.WorkflowStep{}, "", wfv1.NodeRunning, &wfv1.NodeFlag{Retried: true, Hooked: true})) + woc.addChildNode(nodeName, childNode) + } + + node, err := woc.wf.GetNodeByName(nodeName) + assert.NoError(t, err) + childNodeIds, lastChildNode := getChildNodeIdsAndLastRetriedNode(node, woc.wf.Status.Nodes) + + assert.Equal(t, 2, len(childNodeIds)) + assert.Equal(t, childNodes[1].ID, lastChildNode.ID) + }) +} diff --git a/workflow/controller/plugin_template.go b/workflow/controller/plugin_template.go index 75d86bacfa2b..6aebe8bb100e 100644 --- a/workflow/controller/plugin_template.go +++ b/workflow/controller/plugin_template.go @@ -10,7 +10,7 @@ func (woc *wfOperationCtx) executePluginTemplate(nodeName string, templateScope if opts.boundaryID == "" { woc.log.Warnf("[DEBUG] boundaryID was nil") } - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePlugin, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypePlugin, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodePending, opts.nodeFlag) } if !node.Fulfilled() { woc.taskSet[node.ID] = *tmpl diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go index 1d3a21d5f99a..181e0d0a7c8f 100644 --- a/workflow/controller/steps.go +++ b/workflow/controller/steps.go @@ -38,7 +38,7 @@ type stepsContext struct { func (woc *wfOperationCtx) executeSteps(ctx context.Context, nodeName string, tmplCtx *templateresolution.Context, templateScope string, tmpl *wfv1.Template, orgTmpl wfv1.TemplateReferenceHolder, opts *executeTemplateOpts) (*wfv1.NodeStatus, error) { node, err := woc.wf.GetNodeByName(nodeName) if err != nil { - node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning) + node = woc.initializeExecutableNode(nodeName, wfv1.NodeTypeSteps, templateScope, tmpl, orgTmpl, opts.boundaryID, wfv1.NodeRunning, opts.nodeFlag) } defer func() { @@ -68,7 +68,7 @@ func (woc *wfOperationCtx) executeSteps(ctx context.Context, nodeName string, tm { sgNode, err := woc.wf.GetNodeByName(sgNodeName) if err != nil { - _ = woc.initializeNode(sgNodeName, wfv1.NodeTypeStepGroup, stepTemplateScope, &wfv1.WorkflowStep{}, stepsCtx.boundaryID, wfv1.NodeRunning) + _ = woc.initializeNode(sgNodeName, wfv1.NodeTypeStepGroup, stepTemplateScope, &wfv1.WorkflowStep{}, stepsCtx.boundaryID, wfv1.NodeRunning, &wfv1.NodeFlag{}) } else if !sgNode.Fulfilled() { _ = woc.markNodePhase(sgNodeName, wfv1.NodeRunning) } @@ -258,7 +258,7 @@ func (woc *wfOperationCtx) executeStepGroup(ctx context.Context, stepGroup []wfv // Check the step's when clause to decide if it should execute proceed, err := shouldExecute(step.When) if err != nil { - woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeError, err.Error()) + woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeError, &wfv1.NodeFlag{}, err.Error()) woc.addChildNode(sgNodeName, childNodeName) woc.markNodeError(childNodeName, err) return woc.markNodeError(sgNodeName, err), nil @@ -267,7 +267,7 @@ func (woc *wfOperationCtx) executeStepGroup(ctx context.Context, stepGroup []wfv if _, err := woc.wf.GetNodeByName(childNodeName); err != nil { skipReason := fmt.Sprintf("when '%s' evaluated false", step.When) woc.log.Infof("Skipping %s: %s", childNodeName, skipReason) - woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeSkipped, skipReason) + woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeSkipped, &wfv1.NodeFlag{}, skipReason) woc.addChildNode(sgNodeName, childNodeName) } continue @@ -487,7 +487,7 @@ func (woc *wfOperationCtx) expandStepGroup(sgNodeName string, stepGroup []wfv1.W stepTemplateScope := stepsCtx.tmplCtx.GetTemplateScope() skipReason := "Skipped, empty params" woc.log.Infof("Skipping %s: %s", childNodeName, skipReason) - woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeSkipped, skipReason) + woc.initializeNode(childNodeName, wfv1.NodeTypeSkipped, stepTemplateScope, &step, stepsCtx.boundaryID, wfv1.NodeSkipped, &wfv1.NodeFlag{}, skipReason) woc.addChildNode(sgNodeName, childNodeName) } }