diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index 664f5a2c5802..35ce2886c0e3 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -5518,6 +5518,10 @@ "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.Arguments", "description": "Arguments hold arguments to the template" }, + "expression": { + "description": "Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored", + "type": "string" + }, "template": { "description": "Template is the name of the template to execute by the hook", "type": "string" @@ -7416,6 +7420,13 @@ "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.ExecutorConfig", "description": "Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1." }, + "hooks": { + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.LifecycleHook" + }, + "description": "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + "type": "object" + }, "hostAliases": { "items": { "$ref": "#/definitions/io.k8s.api.core.v1.HostAlias" @@ -7932,6 +7943,13 @@ "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.ExecutorConfig", "description": "Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1." }, + "hooks": { + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.LifecycleHook" + }, + "description": "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + "type": "object" + }, "hostAliases": { "items": { "$ref": "#/definitions/io.k8s.api.core.v1.HostAlias" diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 4699cbb40171..2d7ac2c3eae9 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -9784,6 +9784,10 @@ "description": "Arguments hold arguments to the template", "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.Arguments" }, + "expression": { + "description": "Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored", + "type": "string" + }, "template": { "description": "Template is the name of the template to execute by the hook", "type": "string" @@ -11661,6 +11665,13 @@ "description": "Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1.", "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.ExecutorConfig" }, + "hooks": { + "description": "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.LifecycleHook" + } + }, "hostAliases": { "type": "array", "items": { @@ -12168,6 +12179,13 @@ "description": "Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1.", "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.ExecutorConfig" }, + "hooks": { + "description": "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.workflow.v1alpha1.LifecycleHook" + } + }, "hostAliases": { "type": "array", "items": { diff --git a/docs/fields.md b/docs/fields.md index ee2cf39976d3..586e360d1f69 100644 --- a/docs/fields.md +++ b/docs/fields.md @@ -200,6 +200,10 @@ Workflow is the definition of a workflow resource - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -603,6 +607,10 @@ WorkflowSpec is the specification of a Workflow. - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -759,6 +767,7 @@ WorkflowSpec is the specification of a Workflow. |`dnsPolicy`|`string`|Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.| |`entrypoint`|`string`|Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.| |`executor`|[`ExecutorConfig`](#executorconfig)|Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1.| +|`hooks`|[`LifecycleHook`](#lifecyclehook)|Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step| |`hostAliases`|`Array<`[`HostAlias`](#hostalias)`>`|_No description available_| |`hostNetwork`|`boolean`|Host networking requested for this workflow pod. Default to false.| |`imagePullSecrets`|`Array<`[`LocalObjectReference`](#localobjectreference)`>`|ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod| @@ -1014,6 +1023,10 @@ CronWorkflowSpec is the specification of a CronWorkflow - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -1381,6 +1394,10 @@ WorkflowTemplateSpec is a spec of WorkflowTemplate. - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -1537,6 +1554,7 @@ WorkflowTemplateSpec is a spec of WorkflowTemplate. |`dnsPolicy`|`string`|Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.| |`entrypoint`|`string`|Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.| |`executor`|[`ExecutorConfig`](#executorconfig)|Executor holds configurations of executor containers of the io.argoproj.workflow.v1alpha1.| +|`hooks`|[`LifecycleHook`](#lifecyclehook)|Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step| |`hostAliases`|`Array<`[`HostAlias`](#hostalias)`>`|_No description available_| |`hostNetwork`|`boolean`|Host networking requested for this workflow pod. Default to false.| |`imagePullSecrets`|`Array<`[`LocalObjectReference`](#localobjectreference)`>`|ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod| @@ -1796,6 +1814,31 @@ ExecutorConfig holds configurations of an executor container. |:----------:|:----------:|---------------| |`serviceAccountName`|`string`|ServiceAccountName specifies the service account name of the executor container.| +## LifecycleHook + +_No description available_ + +
+Examples with this field (click to open) +
+ +- [`exit-handler-with-artifacts.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/exit-handler-with-artifacts.yaml) + +- [`exit-handler-with-param.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/exit-handler-with-param.yaml) + +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) +
+ +### Fields +| Field Name | Field Type | Description | +|:----------:|:----------:|---------------| +|`arguments`|[`Arguments`](#arguments)|Arguments hold arguments to the template| +|`expression`|`string`|Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored| +|`template`|`string`|Template is the name of the template to execute by the hook| +|`templateRef`|[`TemplateRef`](#templateref)|TemplateRef is the reference to the template resource to execute by the hook| + ## Metrics Metrics are a list of metrics emitted from a Workflow/Template @@ -2470,6 +2513,40 @@ Parameter indicate a passed string parameter to a service template with an optio |`value`|`string`|Value is the literal value to use for the parameter. If specified in the context of an input parameter, the value takes precedence over any passed values| |`valueFrom`|[`ValueFrom`](#valuefrom)|ValueFrom is the source for the output parameter's value| +## TemplateRef + +TemplateRef is a reference of template resource. + +
+Examples with this field (click to open) +
+ +- [`cluster-wftmpl-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/cluster-wftmpl-dag.yaml) + +- [`clustertemplates.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/clustertemplates.yaml) + +- [`mixed-cluster-namespaced-wftmpl-steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/mixed-cluster-namespaced-wftmpl-steps.yaml) + +- [`cron-backfill.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cron-backfill.yaml) + +- [`dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/dag.yaml) + +- [`hello-world.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/hello-world.yaml) + +- [`retry-with-steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/retry-with-steps.yaml) + +- [`steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/steps.yaml) + +- [`templates.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/templates.yaml) +
+ +### Fields +| Field Name | Field Type | Description | +|:----------:|:----------:|---------------| +|`clusterScope`|`boolean`|ClusterScope indicates the referred template is cluster scoped (i.e. a ClusterWorkflowTemplate).| +|`name`|`string`|Name is the resource name of the template.| +|`template`|`string`|Template is the name of referred template in the resource.| + ## Prometheus Prometheus is a prometheus metric to be emitted @@ -2726,6 +2803,10 @@ _No description available_ - [`input-artifact-oss.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/input-artifact-oss.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`sidecar-nginx.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/sidecar-nginx.yaml) - [`sidecar.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/sidecar.yaml) @@ -3184,6 +3265,10 @@ WorkflowStep is a reference to a template to execute in a series of step - [`k8s-wait-wf.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/k8s-wait-wf.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) - [`loops-param-argument.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-param-argument.yaml) @@ -3341,40 +3426,6 @@ NodeSynchronizationStatus stores the status of a node |:----------:|:----------:|---------------| |`waiting`|`string`|Waiting is the name of the lock that this node is waiting for| -## TemplateRef - -TemplateRef is a reference of template resource. - -
-Examples with this field (click to open) -
- -- [`cluster-wftmpl-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/cluster-wftmpl-dag.yaml) - -- [`clustertemplates.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/clustertemplates.yaml) - -- [`mixed-cluster-namespaced-wftmpl-steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cluster-workflow-template/mixed-cluster-namespaced-wftmpl-steps.yaml) - -- [`cron-backfill.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/cron-backfill.yaml) - -- [`dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/dag.yaml) - -- [`hello-world.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/hello-world.yaml) - -- [`retry-with-steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/retry-with-steps.yaml) - -- [`steps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/steps.yaml) - -- [`templates.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/workflow-template/templates.yaml) -
- -### Fields -| Field Name | Field Type | Description | -|:----------:|:----------:|---------------| -|`clusterScope`|`boolean`|ClusterScope indicates the referred template is cluster scoped (i.e. a ClusterWorkflowTemplate).| -|`name`|`string`|Name is the resource name of the template.| -|`template`|`string`|Template is the name of referred template in the resource.| - ## MutexStatus MutexStatus contains which objects hold mutex locks, and which objects this workflow is waiting on to release locks. @@ -3551,6 +3602,10 @@ HTTPArtifact allows an file served on HTTP to be placed as an input artifact in - [`input-artifact-oss.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/input-artifact-oss.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`sidecar-nginx.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/sidecar-nginx.yaml) - [`sidecar.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/sidecar.yaml) @@ -4098,26 +4153,6 @@ ContinueOn defines if a workflow should continue even if a task or step fails/er |`error`|`boolean`|_No description available_| |`failed`|`boolean`|_No description available_| -## LifecycleHook - -_No description available_ - -
-Examples with this field (click to open) -
- -- [`exit-handler-with-artifacts.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/exit-handler-with-artifacts.yaml) - -- [`exit-handler-with-param.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/exit-handler-with-param.yaml) -
- -### Fields -| Field Name | Field Type | Description | -|:----------:|:----------:|---------------| -|`arguments`|[`Arguments`](#arguments)|Arguments hold arguments to the template| -|`template`|`string`|Template is the name of the template to execute by the hook| -|`templateRef`|[`TemplateRef`](#templateref)|TemplateRef is the reference to the template resource to execute by the hook| - ## Item Item expands a single workflow step into multiple parallel steps The value of Item can be a map, string, bool, or number @@ -4697,6 +4732,10 @@ ObjectMeta is metadata that all persisted resources must have, which includes al - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -5274,6 +5313,10 @@ A single application container that you want to run within a pod. - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) @@ -5956,6 +5999,10 @@ PersistentVolumeClaimSpec describes the common attributes of storage devices and - [`key-only-artifact.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/key-only-artifact.yaml) +- [`life-cycle-hooks-tmpl-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-tmpl-level.yaml) + +- [`life-cycle-hooks-wf-level.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/life-cycle-hooks-wf-level.yaml) + - [`loops-dag.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-dag.yaml) - [`loops-maps.yaml`](https://github.com/argoproj/argo-workflows/blob/master/examples/loops-maps.yaml) diff --git a/examples/life-cycle-hooks-tmpl-level.yaml b/examples/life-cycle-hooks-tmpl-level.yaml new file mode 100644 index 000000000000..58bdbeb8c7ba --- /dev/null +++ b/examples/life-cycle-hooks-tmpl-level.yaml @@ -0,0 +1,39 @@ + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: lifecycle-hook-tmpl-level- + spec: + entrypoint: main + templates: + - name: main + steps: + - - name: step-1 + hooks: + exit: + # Expr will not support `-` on variable name. Variable should wrap with `[]` + expression: steps["step-1"].status == "Running" + template: http + success: + expression: steps["step-1"].status == "Succeeded" + template: http + template: echo + - - name: step2 + hooks: + exit: + expression: steps.step2.status == "Running" + template: http + success: + expression: steps.step2.status == "Succeeded" + template: http + template: echo + + - name: echo + container: + image: alpine:3.6 + command: [sh, -c] + args: ["echo \"it was heads\""] + + - name: http + http: + # url: http://dummy.restapiexample.com/api/v1/employees + url: "https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json" diff --git a/examples/life-cycle-hooks-wf-level.yaml b/examples/life-cycle-hooks-wf-level.yaml new file mode 100644 index 000000000000..9ff62de7b2c1 --- /dev/null +++ b/examples/life-cycle-hooks-wf-level.yaml @@ -0,0 +1,28 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + generateName: lifecycle-hook- +spec: + entrypoint: main + hooks: + exit: + template: http + running: + expression: workflow.status == "Running" + template: http + templates: + - name: main + steps: + - - name: step1 + template: heads + + - name: heads + container: + image: alpine:3.6 + command: [sh, -c] + args: ["echo \"it was heads\""] + + - name: http + http: + # url: http://dummy.restapiexample.com/api/v1/employees + url: "https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json" \ No newline at end of file diff --git a/manifests/base/crds/full/argoproj.io_clusterworkflowtemplates.yaml b/manifests/base/crds/full/argoproj.io_clusterworkflowtemplates.yaml index d7f7f6ace1aa..19b35d5ce717 100644 --- a/manifests/base/crds/full/argoproj.io_clusterworkflowtemplates.yaml +++ b/manifests/base/crds/full/argoproj.io_clusterworkflowtemplates.yaml @@ -811,6 +811,413 @@ spec: serviceAccountName: type: string type: object + hooks: + additionalProperties: + properties: + arguments: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + type: object + expression: + type: string + template: + type: string + templateRef: + properties: + clusterScope: + type: boolean + name: + type: string + template: + type: string + type: object + required: + - template + type: object + type: object hostAliases: items: properties: @@ -3704,6 +4111,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -10175,6 +10584,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: diff --git a/manifests/base/crds/full/argoproj.io_cronworkflows.yaml b/manifests/base/crds/full/argoproj.io_cronworkflows.yaml index 91d5e2ef0431..5e10a0f70e96 100644 --- a/manifests/base/crds/full/argoproj.io_cronworkflows.yaml +++ b/manifests/base/crds/full/argoproj.io_cronworkflows.yaml @@ -832,6 +832,413 @@ spec: serviceAccountName: type: string type: object + hooks: + additionalProperties: + properties: + arguments: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + type: object + expression: + type: string + template: + type: string + templateRef: + properties: + clusterScope: + type: boolean + name: + type: string + template: + type: string + type: object + required: + - template + type: object + type: object hostAliases: items: properties: @@ -3725,6 +4132,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -10196,6 +10605,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: diff --git a/manifests/base/crds/full/argoproj.io_workflows.yaml b/manifests/base/crds/full/argoproj.io_workflows.yaml index 99c7715b5bd8..97bbc7a0c2a9 100644 --- a/manifests/base/crds/full/argoproj.io_workflows.yaml +++ b/manifests/base/crds/full/argoproj.io_workflows.yaml @@ -820,6 +820,413 @@ spec: serviceAccountName: type: string type: object + hooks: + additionalProperties: + properties: + arguments: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + type: object + expression: + type: string + template: + type: string + templateRef: + properties: + clusterScope: + type: boolean + name: + type: string + template: + type: string + type: object + required: + - template + type: object + type: object hostAliases: items: properties: @@ -3713,6 +4120,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -10184,6 +10593,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -19661,6 +20072,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -24320,6 +24733,413 @@ spec: serviceAccountName: type: string type: object + hooks: + additionalProperties: + properties: + arguments: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + type: object + expression: + type: string + template: + type: string + templateRef: + properties: + clusterScope: + type: boolean + name: + type: string + template: + type: string + type: object + required: + - template + type: object + type: object hostAliases: items: properties: @@ -27213,6 +28033,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -33684,6 +34506,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: diff --git a/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml b/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml index 271ae379c4e8..3625956678ec 100644 --- a/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml +++ b/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml @@ -2625,6 +2625,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: diff --git a/manifests/base/crds/full/argoproj.io_workflowtemplates.yaml b/manifests/base/crds/full/argoproj.io_workflowtemplates.yaml index dea3887c0bd9..da8034b781c9 100644 --- a/manifests/base/crds/full/argoproj.io_workflowtemplates.yaml +++ b/manifests/base/crds/full/argoproj.io_workflowtemplates.yaml @@ -810,6 +810,413 @@ spec: serviceAccountName: type: string type: object + hooks: + additionalProperties: + properties: + arguments: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + type: object + expression: + type: string + template: + type: string + templateRef: + properties: + clusterScope: + type: boolean + name: + type: string + template: + type: string + type: object + required: + - template + type: object + type: object hostAliases: items: properties: @@ -3703,6 +4110,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: @@ -10174,6 +10583,8 @@ spec: type: object type: array type: object + expression: + type: string template: type: string templateRef: diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index 1f6357e4045a..b2bd374e6f27 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -3569,6 +3569,7 @@ func init() { proto.RegisterType((*WorkflowEventBindingSpec)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowEventBindingSpec") proto.RegisterType((*WorkflowList)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowList") proto.RegisterType((*WorkflowSpec)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowSpec") + proto.RegisterMapType((LifecycleHooks)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowSpec.HooksEntry") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowSpec.NodeSelectorEntry") proto.RegisterType((*WorkflowStatus)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowStatus") proto.RegisterMapType((Nodes)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowStatus.NodesEntry") @@ -3594,570 +3595,572 @@ func init() { } var fileDescriptor_724696e352c3df5f = []byte{ - // 9006 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x5b, 0x6c, 0x64, 0xc9, - 0x75, 0xd8, 0xde, 0x26, 0x9b, 0xec, 0x3e, 0x7c, 0xd7, 0xbc, 0x7a, 0xb9, 0xbb, 0xc3, 0xf5, 0x5d, - 0xef, 0x66, 0xc7, 0x5e, 0x91, 0xde, 0x19, 0x29, 0xd9, 0x48, 0x88, 0x2c, 0x36, 0x39, 0x7c, 0x2c, - 0x9f, 0x5b, 0xcd, 0x99, 0xc9, 0x3e, 0x22, 0xeb, 0xb2, 0xbb, 0xd8, 0x7d, 0x97, 0xdd, 0xf7, 0xf6, - 0xde, 0x7b, 0x9b, 0x8f, 0x7d, 0x48, 0x8a, 0xfc, 0xd0, 0x6e, 0x2c, 0xc7, 0x79, 0x38, 0xb6, 0xac, - 0xc4, 0x80, 0xe1, 0x58, 0xb1, 0xe1, 0x18, 0x09, 0x04, 0xe4, 0xcb, 0x01, 0xf2, 0x15, 0x04, 0x0a, - 0x12, 0x20, 0x0e, 0xac, 0xc4, 0x02, 0x92, 0x50, 0x11, 0x93, 0xf8, 0x23, 0x81, 0x83, 0x20, 0x88, - 0x64, 0x61, 0x92, 0x8f, 0xa0, 0x9e, 0xb7, 0xea, 0xf6, 0x6d, 0x0e, 0x39, 0x73, 0xc9, 0x11, 0xe2, - 0xfc, 0x75, 0x9f, 0x3a, 0x75, 0x4e, 0x55, 0xdd, 0xaa, 0x53, 0xa7, 0xce, 0x39, 0x75, 0x0a, 0x36, - 0xeb, 0x6e, 0xd4, 0xe8, 0x6c, 0x4f, 0x57, 0xfd, 0xd6, 0x8c, 0x13, 0xd4, 0xfd, 0x76, 0xe0, 0xbf, - 0xcd, 0x7e, 0x7c, 0x6c, 0xdf, 0x0f, 0x76, 0x77, 0x9a, 0xfe, 0x7e, 0x38, 0xb3, 0x77, 0x6b, 0xa6, - 0xbd, 0x5b, 0x9f, 0x71, 0xda, 0x6e, 0x38, 0x23, 0xa1, 0x33, 0x7b, 0x2f, 0x3b, 0xcd, 0x76, 0xc3, - 0x79, 0x79, 0xa6, 0x4e, 0x3c, 0x12, 0x38, 0x11, 0xa9, 0x4d, 0xb7, 0x03, 0x3f, 0xf2, 0xd1, 0x67, - 0x62, 0x8a, 0xd3, 0x92, 0x22, 0xfb, 0xf1, 0x53, 0x8a, 0xe2, 0xf4, 0xde, 0xad, 0xe9, 0xf6, 0x6e, - 0x7d, 0x9a, 0x52, 0x9c, 0x96, 0xd0, 0x69, 0x49, 0x71, 0xf2, 0x63, 0x5a, 0x9b, 0xea, 0x7e, 0xdd, - 0x9f, 0x61, 0x84, 0xb7, 0x3b, 0x3b, 0xec, 0x1f, 0xfb, 0xc3, 0x7e, 0x71, 0x86, 0x93, 0xf6, 0xee, - 0x2b, 0xe1, 0xb4, 0xeb, 0xd3, 0xf6, 0xcd, 0x54, 0xfd, 0x80, 0xcc, 0xec, 0x75, 0x35, 0x6a, 0xf2, - 0x86, 0x86, 0xd3, 0xf6, 0x9b, 0x6e, 0xf5, 0x70, 0x66, 0xef, 0xe5, 0x6d, 0x12, 0x75, 0xb7, 0x7f, - 0xf2, 0xe3, 0x31, 0x6a, 0xcb, 0xa9, 0x36, 0x5c, 0x8f, 0x04, 0x87, 0x71, 0xff, 0x5b, 0x24, 0x72, - 0xd2, 0x18, 0xcc, 0xf4, 0xaa, 0x15, 0x74, 0xbc, 0xc8, 0x6d, 0x91, 0xae, 0x0a, 0x7f, 0xf6, 0x41, - 0x15, 0xc2, 0x6a, 0x83, 0xb4, 0x9c, 0xae, 0x7a, 0xb7, 0x7a, 0xd5, 0xeb, 0x44, 0x6e, 0x73, 0xc6, - 0xf5, 0xa2, 0x30, 0x0a, 0x92, 0x95, 0xec, 0xdb, 0x30, 0x30, 0xdb, 0xf2, 0x3b, 0x5e, 0x84, 0x3e, - 0x05, 0xf9, 0x3d, 0xa7, 0xd9, 0x21, 0x25, 0xeb, 0x59, 0xeb, 0xc5, 0x62, 0xf9, 0xf9, 0x6f, 0x1e, - 0x4d, 0x3d, 0x71, 0x7c, 0x34, 0x95, 0xbf, 0x4b, 0x81, 0xf7, 0x8f, 0xa6, 0x2e, 0x13, 0xaf, 0xea, - 0xd7, 0x5c, 0xaf, 0x3e, 0xf3, 0x76, 0xe8, 0x7b, 0xd3, 0xeb, 0x9d, 0xd6, 0x36, 0x09, 0x30, 0xaf, - 0x63, 0xff, 0x41, 0x0e, 0xc6, 0x66, 0x83, 0x6a, 0xc3, 0xdd, 0x23, 0x95, 0x88, 0xd2, 0xaf, 0x1f, - 0xa2, 0x06, 0xf4, 0x45, 0x4e, 0xc0, 0xc8, 0x0d, 0xdd, 0x5c, 0x9b, 0x7e, 0xd4, 0x8f, 0x3f, 0xbd, - 0xe5, 0x04, 0x92, 0x76, 0x79, 0xf0, 0xf8, 0x68, 0xaa, 0x6f, 0xcb, 0x09, 0x30, 0x65, 0x81, 0x9a, - 0xd0, 0xef, 0xf9, 0x1e, 0x29, 0xe5, 0x18, 0xab, 0xf5, 0x47, 0x67, 0xb5, 0xee, 0x7b, 0xaa, 0x1f, - 0xe5, 0xc2, 0xf1, 0xd1, 0x54, 0x3f, 0x85, 0x60, 0xc6, 0x85, 0xf6, 0xeb, 0x5d, 0xb7, 0x5d, 0xea, - 0xcb, 0xaa, 0x5f, 0x6f, 0xb8, 0x6d, 0xb3, 0x5f, 0x6f, 0xb8, 0x6d, 0x4c, 0x59, 0xd8, 0x1f, 0xe5, - 0xa0, 0x38, 0x1b, 0xd4, 0x3b, 0x2d, 0xe2, 0x45, 0x21, 0xfa, 0x02, 0x40, 0xdb, 0x09, 0x9c, 0x16, - 0x89, 0x48, 0x10, 0x96, 0xac, 0x67, 0xfb, 0x5e, 0x1c, 0xba, 0xb9, 0xf2, 0xe8, 0xec, 0x37, 0x25, - 0xcd, 0x32, 0x12, 0x9f, 0x1c, 0x14, 0x28, 0xc4, 0x1a, 0x4b, 0xf4, 0x1e, 0x14, 0x9d, 0x20, 0x72, - 0x77, 0x9c, 0x6a, 0x14, 0x96, 0x72, 0x8c, 0xff, 0xab, 0x8f, 0xce, 0x7f, 0x56, 0x90, 0x2c, 0x4f, - 0x08, 0xf6, 0x45, 0x09, 0x09, 0x71, 0xcc, 0xcf, 0xfe, 0xad, 0x3c, 0x14, 0x64, 0x01, 0x7a, 0x16, - 0xfa, 0x3d, 0xa7, 0x25, 0xa7, 0xea, 0xb0, 0xa8, 0xd8, 0xbf, 0xee, 0xb4, 0xe8, 0x47, 0x72, 0x5a, - 0x84, 0x62, 0xb4, 0x9d, 0xa8, 0xc1, 0xa6, 0x84, 0x86, 0xb1, 0xe9, 0x44, 0x0d, 0xcc, 0x4a, 0xd0, - 0xd3, 0xd0, 0xdf, 0xf2, 0x6b, 0x84, 0x7d, 0xc7, 0x3c, 0xff, 0xc8, 0x6b, 0x7e, 0x8d, 0x60, 0x06, - 0xa5, 0xf5, 0x77, 0x02, 0xbf, 0x55, 0xea, 0x37, 0xeb, 0x2f, 0x04, 0x7e, 0x0b, 0xb3, 0x12, 0xf4, - 0x55, 0x0b, 0xc6, 0x65, 0xf3, 0x56, 0xfd, 0xaa, 0x13, 0xb9, 0xbe, 0x57, 0xca, 0xb3, 0x49, 0x81, - 0xb3, 0x1b, 0x15, 0x49, 0xb9, 0x5c, 0x12, 0x4d, 0x18, 0x4f, 0x96, 0xe0, 0xae, 0x56, 0xa0, 0x9b, - 0x00, 0xf5, 0xa6, 0xbf, 0xed, 0x34, 0xe9, 0x80, 0x94, 0x06, 0x58, 0x17, 0xd4, 0xc7, 0x5d, 0x54, - 0x25, 0x58, 0xc3, 0x42, 0x07, 0x30, 0xe8, 0xf0, 0x05, 0x5c, 0x1a, 0x64, 0x9d, 0x78, 0x2d, 0x8b, - 0x4e, 0x18, 0x12, 0xa1, 0x3c, 0x74, 0x7c, 0x34, 0x35, 0x28, 0x80, 0x58, 0xb2, 0x43, 0x2f, 0x41, - 0xc1, 0x6f, 0xd3, 0x76, 0x3b, 0xcd, 0x52, 0xe1, 0x59, 0xeb, 0xc5, 0x42, 0x79, 0x5c, 0xb4, 0xb5, - 0xb0, 0x21, 0xe0, 0x58, 0x61, 0xa0, 0x1b, 0x30, 0x18, 0x76, 0xb6, 0xe9, 0x77, 0x2c, 0x15, 0x59, - 0xc7, 0xc6, 0x04, 0xf2, 0x60, 0x85, 0x83, 0xb1, 0x2c, 0x47, 0x9f, 0x80, 0xa1, 0x80, 0x54, 0x3b, - 0x41, 0x48, 0xe8, 0x87, 0x2d, 0x01, 0xa3, 0x7d, 0x49, 0xa0, 0x0f, 0xe1, 0xb8, 0x08, 0xeb, 0x78, - 0xe8, 0xd3, 0x30, 0x4a, 0x3f, 0xf0, 0xed, 0x83, 0x76, 0x40, 0xc2, 0x90, 0x7e, 0xd5, 0x21, 0xc6, - 0xe8, 0xaa, 0xa8, 0x39, 0xba, 0x60, 0x94, 0xe2, 0x04, 0xb6, 0xfd, 0x7b, 0x83, 0xd0, 0xf5, 0x91, - 0xd0, 0xcb, 0x30, 0x24, 0xfa, 0xbb, 0xea, 0xd7, 0x43, 0x36, 0x71, 0x0b, 0xe5, 0x31, 0xda, 0x8e, - 0xd9, 0x18, 0x8c, 0x75, 0x1c, 0x54, 0x83, 0x5c, 0x78, 0x4b, 0xc8, 0xb4, 0xd5, 0x47, 0xff, 0x18, - 0x95, 0x5b, 0x6a, 0xa5, 0x0d, 0x1c, 0x1f, 0x4d, 0xe5, 0x2a, 0xb7, 0x70, 0x2e, 0xbc, 0x45, 0xa5, - 0x59, 0xdd, 0x8d, 0xb2, 0x93, 0x66, 0x8b, 0x6e, 0xa4, 0xf8, 0x30, 0x69, 0xb6, 0xe8, 0x46, 0x98, - 0xb2, 0xa0, 0x52, 0xba, 0x11, 0x45, 0x6d, 0xb6, 0xa4, 0x32, 0x91, 0xd2, 0x4b, 0x5b, 0x5b, 0x9b, - 0x8a, 0x17, 0x5b, 0xc0, 0x14, 0x82, 0x19, 0x17, 0xf4, 0xa1, 0x45, 0x47, 0x9c, 0x17, 0xfa, 0xc1, - 0xa1, 0x58, 0x99, 0x77, 0xb2, 0x5b, 0x99, 0x7e, 0x70, 0xa8, 0x98, 0x8b, 0x0f, 0xa9, 0x0a, 0xb0, - 0xce, 0x9a, 0x75, 0xbc, 0xb6, 0x13, 0xb2, 0x85, 0x98, 0x4d, 0xc7, 0xe7, 0x17, 0x2a, 0x89, 0x8e, - 0xcf, 0x2f, 0x54, 0x30, 0xe3, 0x42, 0x3f, 0x68, 0xe0, 0xec, 0x8b, 0x45, 0x9c, 0xc1, 0x07, 0xc5, - 0xce, 0xbe, 0xf9, 0x41, 0xb1, 0xb3, 0x8f, 0x29, 0x0b, 0xca, 0xc9, 0x0f, 0x43, 0xb6, 0x66, 0x33, - 0xe1, 0xb4, 0x51, 0xa9, 0x98, 0x9c, 0x36, 0x2a, 0x15, 0x4c, 0x59, 0xb0, 0x49, 0x5a, 0x0d, 0xd9, - 0x82, 0xcf, 0x66, 0x92, 0xce, 0x25, 0x38, 0x2d, 0xce, 0x55, 0x30, 0x65, 0x61, 0x7f, 0x64, 0xc1, - 0x88, 0x2c, 0xa2, 0x42, 0x24, 0x44, 0x07, 0x50, 0x90, 0x1f, 0x53, 0xe8, 0x32, 0x59, 0x6e, 0x7a, - 0x4a, 0xd4, 0x49, 0x08, 0x56, 0xdc, 0xec, 0xdf, 0xcd, 0x03, 0x52, 0x60, 0xd2, 0xf6, 0x43, 0x97, - 0x4d, 0xa7, 0x87, 0x10, 0x25, 0x9e, 0x26, 0x4a, 0xee, 0x66, 0x29, 0x4a, 0xe2, 0x66, 0x19, 0x42, - 0xe5, 0x6f, 0x24, 0x16, 0x1f, 0x97, 0x2e, 0x3f, 0x75, 0x2e, 0x8b, 0x4f, 0x6b, 0xc2, 0xc9, 0xcb, - 0x70, 0x4f, 0x2c, 0x43, 0x2e, 0x7f, 0xfe, 0x62, 0xb6, 0xcb, 0x50, 0x6b, 0x45, 0x72, 0x41, 0x06, - 0x7c, 0x99, 0x70, 0x01, 0x74, 0x2f, 0xd3, 0x65, 0xa2, 0x71, 0x35, 0x17, 0x4c, 0xc0, 0x17, 0xcc, - 0x40, 0x56, 0x3c, 0xb5, 0x05, 0x93, 0xe4, 0xa9, 0x96, 0xce, 0x3b, 0x70, 0xa5, 0x1b, 0x07, 0x93, - 0x1d, 0x34, 0x03, 0xc5, 0xaa, 0xef, 0xed, 0xb8, 0xf5, 0x35, 0xa7, 0x2d, 0x54, 0x36, 0xa5, 0xeb, - 0xcd, 0xc9, 0x02, 0x1c, 0xe3, 0xa0, 0x67, 0xa0, 0x6f, 0x97, 0x1c, 0x0a, 0xdd, 0x6d, 0x48, 0xa0, - 0xf6, 0xad, 0x90, 0x43, 0x4c, 0xe1, 0x9f, 0x2c, 0x7c, 0xf5, 0xd7, 0xa7, 0x9e, 0xf8, 0xe2, 0xbf, - 0x7f, 0xf6, 0x09, 0xfb, 0x5f, 0xf7, 0xc1, 0x53, 0xa9, 0x3c, 0x2b, 0x91, 0x13, 0x75, 0x42, 0xf4, - 0xbb, 0x16, 0x5c, 0x71, 0xd2, 0xca, 0xc5, 0x4a, 0xbe, 0x97, 0xdd, 0x8c, 0x34, 0xc8, 0x97, 0x9f, - 0x11, 0x8d, 0x4e, 0x1f, 0x11, 0x9c, 0xde, 0x28, 0x3a, 0x50, 0x54, 0x79, 0x0d, 0xdb, 0x4e, 0x95, - 0x88, 0xde, 0xab, 0x81, 0x5a, 0x97, 0x05, 0x38, 0xc6, 0xa1, 0xca, 0x50, 0x8d, 0xec, 0x38, 0x9d, - 0x26, 0xdf, 0xc0, 0x0b, 0xb1, 0x32, 0x34, 0xcf, 0xc1, 0x58, 0x96, 0xa3, 0xbf, 0x63, 0x01, 0xea, - 0xe6, 0x2a, 0x16, 0xc3, 0xd6, 0x79, 0x8c, 0x43, 0xf9, 0xea, 0xf1, 0xd1, 0x54, 0x8a, 0x00, 0xc3, - 0x29, 0xed, 0xd0, 0xbe, 0xe9, 0xbf, 0xb0, 0xe0, 0x52, 0xca, 0x32, 0xa7, 0x93, 0xa2, 0x13, 0x34, - 0xc5, 0xfc, 0x51, 0x93, 0xe2, 0x0e, 0x5e, 0xc5, 0x14, 0x8e, 0x7e, 0xc9, 0x82, 0x31, 0x6d, 0xb5, - 0xcf, 0x76, 0x84, 0xf2, 0x9f, 0x91, 0x22, 0x6b, 0x10, 0x2e, 0x5f, 0x13, 0xec, 0xc7, 0x12, 0x05, - 0x38, 0xd9, 0x04, 0xfb, 0xbb, 0x16, 0x3c, 0x73, 0xa2, 0xd0, 0x4a, 0x6d, 0xb8, 0xf5, 0xd8, 0x1b, - 0x4e, 0xa7, 0x56, 0x40, 0xda, 0xfe, 0x1d, 0xbc, 0x2a, 0x66, 0xa2, 0x9a, 0x5a, 0x98, 0x83, 0xb1, - 0x2c, 0xb7, 0xff, 0xd0, 0x82, 0x24, 0x3d, 0xe4, 0xc0, 0x68, 0x27, 0x24, 0x01, 0x9d, 0xaa, 0x15, - 0x52, 0x0d, 0x88, 0xdc, 0x3b, 0x9f, 0x9f, 0xe6, 0x56, 0x0a, 0xda, 0xe0, 0xe9, 0xaa, 0x1f, 0x90, - 0xe9, 0xbd, 0x97, 0xa7, 0x39, 0xc6, 0x0a, 0x39, 0xac, 0x90, 0x26, 0xa1, 0x34, 0xca, 0x88, 0xea, - 0xd9, 0x77, 0x0c, 0x02, 0x38, 0x41, 0x90, 0xb2, 0x68, 0x3b, 0x61, 0xb8, 0xef, 0x07, 0x35, 0xc1, - 0x22, 0x77, 0x66, 0x16, 0x9b, 0x06, 0x01, 0x9c, 0x20, 0x68, 0xff, 0x53, 0x0b, 0x06, 0xcb, 0x4e, - 0x75, 0xd7, 0xdf, 0xd9, 0xa1, 0xc7, 0x94, 0x5a, 0x27, 0xe0, 0xc7, 0x3c, 0x3e, 0x09, 0xd5, 0xde, - 0x3d, 0x2f, 0xe0, 0x58, 0x61, 0xa0, 0x2d, 0x18, 0xe0, 0xc3, 0x21, 0x1a, 0xf5, 0x13, 0x5a, 0xa3, - 0x94, 0x75, 0x86, 0x7d, 0xb9, 0x4e, 0xe4, 0x36, 0xa7, 0xb9, 0x75, 0x66, 0x7a, 0xd9, 0x8b, 0x36, - 0x82, 0x4a, 0x14, 0xb8, 0x5e, 0xbd, 0x0c, 0xc7, 0x47, 0x53, 0x03, 0x0b, 0x8c, 0x06, 0x16, 0xb4, - 0xe8, 0x89, 0xa6, 0xe5, 0x1c, 0x48, 0x76, 0x6c, 0xcd, 0x17, 0xe3, 0x13, 0xcd, 0x5a, 0x5c, 0x84, - 0x75, 0x3c, 0xfb, 0xb3, 0x90, 0x9f, 0x73, 0xaa, 0x0d, 0x82, 0xee, 0x24, 0x25, 0xf1, 0xd0, 0xcd, - 0x17, 0xd3, 0x46, 0x4b, 0x49, 0x65, 0x7d, 0xc0, 0x46, 0x7a, 0xc9, 0x6b, 0xfb, 0x7b, 0x16, 0x5c, - 0x9b, 0x6b, 0x76, 0xc2, 0x88, 0x04, 0xf7, 0xc4, 0x14, 0xdc, 0x22, 0xad, 0x76, 0xd3, 0x89, 0x08, - 0xfa, 0x1c, 0x14, 0x5a, 0x24, 0x72, 0x6a, 0x4e, 0xe4, 0x08, 0x8e, 0xbd, 0x87, 0x82, 0x4d, 0x62, - 0x8a, 0x4d, 0xdb, 0xb0, 0xb1, 0xfd, 0x36, 0xa9, 0x46, 0x6b, 0x24, 0x72, 0xe2, 0xb3, 0x6b, 0x0c, - 0xc3, 0x8a, 0x2a, 0x3a, 0x80, 0xfe, 0xb0, 0x4d, 0xaa, 0xd9, 0xa9, 0x37, 0xc9, 0x3e, 0x54, 0xda, - 0xa4, 0x1a, 0x9b, 0x00, 0xe8, 0x3f, 0xcc, 0x38, 0xda, 0xff, 0xdb, 0x82, 0xa7, 0x7a, 0xf4, 0x7b, - 0xd5, 0x0d, 0x23, 0xf4, 0x56, 0x57, 0xdf, 0xa7, 0x4f, 0xd7, 0x77, 0x5a, 0x9b, 0xf5, 0x5c, 0x4d, - 0x31, 0x09, 0xd1, 0xfa, 0xfd, 0x79, 0xc8, 0xbb, 0x11, 0x69, 0x49, 0x53, 0xcc, 0xeb, 0x8f, 0xde, - 0xf1, 0x1e, 0x7d, 0x29, 0x8f, 0x48, 0x5b, 0xe0, 0x32, 0xe5, 0x87, 0x39, 0x5b, 0xfb, 0x9f, 0x5b, - 0x40, 0xa7, 0x43, 0xcd, 0x15, 0x07, 0xdc, 0xfe, 0xe8, 0xb0, 0x2d, 0x4d, 0x32, 0x72, 0xff, 0xeb, - 0xdf, 0x3a, 0x6c, 0x93, 0xfb, 0x47, 0x53, 0x23, 0x0a, 0x91, 0x02, 0x30, 0x43, 0x45, 0x9f, 0x85, - 0x81, 0x90, 0xed, 0xd3, 0x42, 0xc2, 0x2c, 0x88, 0x4a, 0x03, 0x7c, 0xf7, 0xbe, 0x7f, 0x34, 0x75, - 0x2a, 0x8b, 0xeb, 0xb4, 0xa2, 0xcd, 0xeb, 0x61, 0x41, 0x95, 0x8a, 0xb0, 0x16, 0x09, 0x43, 0xa7, - 0x4e, 0xc4, 0x4a, 0x51, 0x22, 0x6c, 0x8d, 0x83, 0xb1, 0x2c, 0xb7, 0xff, 0x96, 0x05, 0xb4, 0x89, - 0x91, 0x43, 0x59, 0xac, 0xfb, 0x35, 0x82, 0xd6, 0xd9, 0x52, 0xe1, 0x00, 0xf1, 0xf1, 0x9e, 0xe9, - 0xb1, 0x54, 0x38, 0x92, 0xa1, 0xd3, 0x70, 0x10, 0x8e, 0x49, 0xa0, 0x8f, 0xc3, 0x70, 0x8d, 0xb4, - 0x89, 0x57, 0x23, 0x5e, 0xd5, 0x25, 0xfc, 0xa3, 0x15, 0xcb, 0xe3, 0xc7, 0x47, 0x53, 0xc3, 0xf3, - 0x1a, 0x1c, 0x1b, 0x58, 0xf6, 0x9f, 0x58, 0x70, 0x59, 0x91, 0xab, 0x90, 0x48, 0x2d, 0xab, 0x9f, - 0xb6, 0x00, 0x14, 0x71, 0xaa, 0xd3, 0xd2, 0x29, 0xb0, 0x91, 0xc1, 0x14, 0xd0, 0x07, 0x21, 0x5e, - 0x78, 0x0a, 0x1c, 0x62, 0x8d, 0x2d, 0x7a, 0x1d, 0x86, 0xf7, 0xfc, 0x66, 0xa7, 0x45, 0xd6, 0xfc, - 0x8e, 0x17, 0x85, 0xa5, 0x3e, 0xd6, 0x8c, 0xa9, 0xb4, 0x71, 0xba, 0x1b, 0xe3, 0x95, 0x2f, 0x0b, - 0xb2, 0xc3, 0x1a, 0x30, 0xc4, 0x06, 0x29, 0xfb, 0x75, 0x60, 0x4c, 0x5d, 0xaf, 0x43, 0x36, 0x3c, - 0xf4, 0x1c, 0xe4, 0x49, 0x10, 0xf8, 0x81, 0x38, 0xed, 0xa8, 0x09, 0x79, 0x9b, 0x02, 0x31, 0x2f, - 0x43, 0x2f, 0x50, 0x99, 0xeb, 0x36, 0x49, 0x8d, 0xcd, 0xa7, 0x42, 0x79, 0x54, 0xce, 0xa7, 0x05, - 0x06, 0xc5, 0xa2, 0xd4, 0x9e, 0x86, 0xc1, 0x39, 0xca, 0x84, 0x04, 0x94, 0xae, 0x6e, 0xf4, 0x1e, - 0x31, 0x8c, 0xde, 0xd2, 0xb8, 0xbd, 0x05, 0x57, 0xe6, 0x02, 0x42, 0x05, 0xc1, 0xad, 0x72, 0xa7, - 0xba, 0x4b, 0x22, 0x6e, 0x96, 0x0a, 0xd1, 0xa7, 0x60, 0xc4, 0x67, 0x12, 0x69, 0xd5, 0xaf, 0xee, - 0xba, 0x5e, 0x5d, 0x28, 0x61, 0x57, 0x04, 0x95, 0x91, 0x0d, 0xbd, 0x10, 0x9b, 0xb8, 0xf6, 0x7f, - 0xce, 0xc1, 0xf0, 0x5c, 0xe0, 0x7b, 0x72, 0xb5, 0x5d, 0x80, 0xa4, 0x8c, 0x0c, 0x49, 0x99, 0x81, - 0x95, 0x52, 0x6f, 0x7f, 0x2f, 0x29, 0x89, 0xde, 0x57, 0xcb, 0xbc, 0x2f, 0x2b, 0x65, 0xd3, 0xe0, - 0xcb, 0x68, 0xc7, 0x1f, 0xdb, 0x14, 0x02, 0xf6, 0x7f, 0xb1, 0x60, 0x5c, 0x47, 0xbf, 0x00, 0xc1, - 0x1c, 0x9a, 0x82, 0x79, 0x3d, 0xdb, 0xfe, 0xf6, 0x90, 0xc6, 0x1f, 0x0d, 0x98, 0xfd, 0xa4, 0x1f, - 0x00, 0x7d, 0xd5, 0x82, 0xe1, 0x7d, 0x0d, 0x20, 0x3a, 0xbb, 0x9e, 0xdd, 0x1e, 0xc9, 0xbe, 0xfa, - 0x8f, 0xca, 0xf5, 0xac, 0x43, 0xef, 0x27, 0xfe, 0x63, 0xa3, 0x25, 0x54, 0x9d, 0x0a, 0xab, 0x0d, - 0x52, 0xeb, 0x34, 0xe5, 0x51, 0x47, 0x0d, 0x69, 0x45, 0xc0, 0xb1, 0xc2, 0x40, 0x6f, 0xc1, 0x44, - 0xd5, 0xf7, 0xaa, 0x9d, 0x20, 0x20, 0x5e, 0xf5, 0x70, 0x93, 0xf9, 0xe9, 0x84, 0x50, 0x9f, 0x16, - 0xd5, 0x26, 0xe6, 0x92, 0x08, 0xf7, 0xd3, 0x80, 0xb8, 0x9b, 0x10, 0xb7, 0x29, 0x87, 0x54, 0xec, - 0xb2, 0xf3, 0x50, 0x41, 0xb7, 0x29, 0x33, 0x30, 0x96, 0xe5, 0xe8, 0x0e, 0x5c, 0x0b, 0x23, 0xaa, - 0x2b, 0x7b, 0xf5, 0x79, 0xe2, 0xd4, 0x9a, 0xae, 0x47, 0xd5, 0x51, 0xdf, 0xab, 0xf1, 0x03, 0x7e, - 0x5f, 0xf9, 0xa9, 0xe3, 0xa3, 0xa9, 0x6b, 0x95, 0x74, 0x14, 0xdc, 0xab, 0x2e, 0xfa, 0x2c, 0x4c, - 0x86, 0x9d, 0x6a, 0x95, 0x84, 0xe1, 0x4e, 0xa7, 0xf9, 0xaa, 0xbf, 0x1d, 0x2e, 0xb9, 0x21, 0xd5, - 0xa5, 0x57, 0xdd, 0x96, 0x1b, 0xb1, 0x63, 0x7c, 0xbe, 0x7c, 0xfd, 0xf8, 0x68, 0x6a, 0xb2, 0xd2, - 0x13, 0x0b, 0x9f, 0x40, 0x01, 0x61, 0xb8, 0xca, 0x85, 0x5f, 0x17, 0xed, 0x41, 0x46, 0x7b, 0xf2, - 0xf8, 0x68, 0xea, 0xea, 0x42, 0x2a, 0x06, 0xee, 0x51, 0x93, 0x7e, 0xc1, 0xc8, 0x6d, 0x91, 0x77, - 0x7d, 0x8f, 0x30, 0x1b, 0xa0, 0xf6, 0x05, 0xb7, 0x04, 0x1c, 0x2b, 0x0c, 0xf4, 0x76, 0x3c, 0x13, - 0xe9, 0x72, 0x11, 0xb6, 0xbc, 0xb3, 0x4b, 0xb8, 0xcb, 0xc7, 0x47, 0x53, 0xe3, 0xf7, 0x34, 0x4a, - 0x74, 0xc9, 0x61, 0x83, 0xb6, 0xfd, 0x07, 0x39, 0x40, 0xdd, 0x22, 0x02, 0xad, 0xc0, 0x80, 0x53, - 0x8d, 0xdc, 0x3d, 0x22, 0x9c, 0x67, 0xcf, 0xa5, 0xed, 0x53, 0x9c, 0x15, 0x26, 0x3b, 0x84, 0xce, - 0x10, 0x12, 0xcb, 0x95, 0x59, 0x56, 0x15, 0x0b, 0x12, 0xc8, 0x87, 0x89, 0xa6, 0x13, 0x46, 0x72, - 0xae, 0xd6, 0x68, 0x97, 0x85, 0x60, 0xfd, 0xb1, 0xd3, 0x75, 0x8a, 0xd6, 0x28, 0x5f, 0xa1, 0x33, - 0x77, 0x35, 0x49, 0x08, 0x77, 0xd3, 0x46, 0x5f, 0x60, 0x1b, 0x3e, 0x57, 0x74, 0xe4, 0x4e, 0xbb, - 0x92, 0xc9, 0x86, 0xcf, 0x69, 0x1a, 0x9b, 0xbd, 0x60, 0x83, 0x35, 0x96, 0xf6, 0xbf, 0x04, 0x18, - 0x9c, 0x9f, 0x5d, 0xdc, 0x72, 0xc2, 0xdd, 0x53, 0x38, 0xe0, 0xe8, 0xec, 0x10, 0xca, 0x4a, 0x72, - 0x7d, 0x4b, 0x25, 0x06, 0x2b, 0x0c, 0xe4, 0xc1, 0x80, 0xeb, 0xd1, 0x05, 0x51, 0x1a, 0xcd, 0xca, - 0xc4, 0xaa, 0xb4, 0x57, 0x76, 0x90, 0x5a, 0x66, 0xd4, 0xb1, 0xe0, 0x82, 0xde, 0x87, 0xa2, 0x23, - 0x1d, 0xab, 0x62, 0x5b, 0x5a, 0xc9, 0xe2, 0xb4, 0x2d, 0x48, 0xea, 0xbe, 0x4c, 0x01, 0xc2, 0x31, - 0x43, 0xf4, 0x45, 0x0b, 0x86, 0x64, 0xd7, 0x31, 0xd9, 0x11, 0x46, 0x98, 0xb5, 0xec, 0xfa, 0x8c, - 0xc9, 0x0e, 0x37, 0x86, 0x6a, 0x00, 0xac, 0xb3, 0xec, 0x52, 0x47, 0xf3, 0xa7, 0x51, 0x47, 0xd1, - 0x3e, 0x14, 0xf7, 0xdd, 0xa8, 0xc1, 0x36, 0x9e, 0xd2, 0x00, 0x9b, 0x82, 0x0b, 0x8f, 0xde, 0x6a, - 0x4a, 0x2e, 0x1e, 0xb1, 0x7b, 0x92, 0x01, 0x8e, 0x79, 0xa1, 0x19, 0xce, 0x98, 0x39, 0xa6, 0x99, - 0xc8, 0x2a, 0x9a, 0x15, 0x58, 0x01, 0x8e, 0x71, 0xe8, 0x10, 0x0f, 0xd3, 0x7f, 0x15, 0xf2, 0x4e, - 0x87, 0xae, 0x63, 0xe1, 0xa5, 0xc8, 0x60, 0x5e, 0x49, 0x8a, 0x7c, 0xb0, 0xee, 0x69, 0x3c, 0xb0, - 0xc1, 0x91, 0xae, 0x91, 0xfd, 0x06, 0xf1, 0x84, 0x9b, 0x52, 0xad, 0x91, 0x7b, 0x0d, 0xe2, 0x61, - 0x56, 0x82, 0xde, 0xe7, 0x3a, 0x3c, 0xd7, 0x71, 0x99, 0x7f, 0x32, 0x13, 0x4f, 0x5f, 0xac, 0x37, - 0x97, 0x47, 0xa5, 0xf2, 0xce, 0xff, 0x63, 0x8d, 0x1f, 0x55, 0x97, 0x7d, 0xef, 0xf6, 0x81, 0x1b, - 0x09, 0xff, 0xa6, 0x92, 0x74, 0x1b, 0x0c, 0x8a, 0x45, 0x29, 0x37, 0x32, 0xd2, 0x49, 0x10, 0x96, - 0x86, 0xcd, 0x63, 0x14, 0x9f, 0x29, 0x21, 0x96, 0xe5, 0xe8, 0xd7, 0x2c, 0xc8, 0x37, 0x7c, 0x7f, - 0x37, 0x2c, 0x8d, 0xb0, 0xc9, 0x91, 0x81, 0xaa, 0x27, 0x24, 0xce, 0xf4, 0x12, 0x25, 0x7b, 0xdb, - 0x8b, 0x82, 0xc3, 0xf2, 0xcb, 0x52, 0x01, 0x62, 0xb0, 0xfb, 0x47, 0x53, 0xa3, 0xab, 0xee, 0x0e, - 0xa9, 0x1e, 0x56, 0x9b, 0x84, 0x41, 0xbe, 0xf4, 0x1d, 0x0d, 0x72, 0x7b, 0x8f, 0x78, 0x11, 0xe6, - 0xad, 0x9a, 0xfc, 0xc8, 0x02, 0x88, 0x09, 0xa1, 0x71, 0x6e, 0x67, 0x66, 0x42, 0x8c, 0x99, 0x96, - 0x11, 0x91, 0xe7, 0x01, 0x2e, 0xc9, 0x33, 0x38, 0x50, 0x19, 0x4d, 0x13, 0x27, 0x8a, 0x4f, 0xe6, - 0x5e, 0xb1, 0xec, 0x7f, 0x65, 0xc1, 0x10, 0xed, 0x9c, 0x14, 0x81, 0x2f, 0xc0, 0x40, 0xe4, 0x04, - 0x75, 0x61, 0x29, 0xd3, 0x3e, 0xc7, 0x16, 0x83, 0x62, 0x51, 0x8a, 0x3c, 0xc8, 0x47, 0x4e, 0xb8, - 0x2b, 0xb5, 0xcb, 0xe5, 0xcc, 0x86, 0x38, 0x56, 0x2c, 0xe9, 0xbf, 0x10, 0x73, 0x36, 0xe8, 0x45, - 0x28, 0x50, 0x05, 0x60, 0xc1, 0x09, 0xa5, 0x91, 0x79, 0x98, 0x0a, 0xf1, 0x05, 0x01, 0xc3, 0xaa, - 0xd4, 0xfe, 0x9b, 0x39, 0xe8, 0x9f, 0xe7, 0xe7, 0x8c, 0x81, 0xd0, 0xef, 0x04, 0x55, 0x22, 0xf4, - 0xcd, 0x0c, 0xe6, 0x34, 0xa5, 0x5b, 0x61, 0x34, 0x35, 0x4d, 0x9f, 0xfd, 0xc7, 0x82, 0x17, 0xfa, - 0x25, 0x0b, 0x46, 0xa3, 0xc0, 0xf1, 0xc2, 0x1d, 0x3f, 0x68, 0x71, 0x03, 0x59, 0x2e, 0xab, 0x59, - 0xb8, 0x65, 0xd0, 0xad, 0x44, 0xa4, 0x1d, 0x87, 0x03, 0x98, 0x65, 0x38, 0xd1, 0x06, 0xfb, 0x57, - 0x2c, 0x80, 0xb8, 0xf5, 0xe8, 0x43, 0x0b, 0x46, 0x1c, 0xdd, 0xc1, 0x28, 0xc6, 0x68, 0x23, 0x3b, - 0x63, 0x2f, 0x23, 0x5b, 0x9e, 0xa0, 0x27, 0x50, 0x03, 0x84, 0x4d, 0xc6, 0xf6, 0x27, 0x20, 0xcf, - 0x56, 0x07, 0xd3, 0xc5, 0x85, 0x95, 0x2f, 0x69, 0xda, 0x94, 0xd6, 0x3f, 0xac, 0x30, 0xec, 0xb7, - 0x60, 0xf4, 0xf6, 0x01, 0xa9, 0x76, 0x22, 0x3f, 0xe0, 0xd6, 0x40, 0xf4, 0x2a, 0xa0, 0x90, 0x04, - 0x7b, 0x6e, 0x95, 0xcc, 0x56, 0xab, 0xf4, 0x64, 0xbd, 0x1e, 0xeb, 0x06, 0x93, 0x82, 0x12, 0xaa, - 0x74, 0x61, 0xe0, 0x94, 0x5a, 0xf6, 0xef, 0x58, 0x30, 0xa4, 0x79, 0x9b, 0xe8, 0x4e, 0x5d, 0x9f, - 0xab, 0xf0, 0x73, 0xb7, 0x18, 0xaa, 0x95, 0x4c, 0xfc, 0x59, 0x9c, 0x64, 0xbc, 0x8d, 0x28, 0x10, - 0x8e, 0x19, 0x3e, 0xc0, 0x13, 0x65, 0xff, 0x33, 0x0b, 0xae, 0xa4, 0xba, 0xc6, 0x1e, 0x73, 0xb3, - 0x67, 0xa0, 0xb8, 0x4b, 0x0e, 0x17, 0xd8, 0x1c, 0x4c, 0x3a, 0x92, 0x56, 0x64, 0x01, 0x8e, 0x71, - 0xec, 0x6f, 0x58, 0x10, 0x53, 0xa2, 0xa2, 0x68, 0x3b, 0x6e, 0xb9, 0x26, 0x8a, 0x04, 0x27, 0x51, - 0x8a, 0xde, 0x87, 0x6b, 0xe6, 0x17, 0x64, 0xe6, 0xe2, 0xb3, 0x9b, 0xe2, 0xf9, 0x99, 0x29, 0x9d, - 0x12, 0xee, 0xc5, 0xc2, 0xbe, 0x0b, 0xf9, 0x45, 0xa7, 0x53, 0x27, 0xa7, 0x32, 0xe2, 0x50, 0x31, - 0x16, 0x10, 0xa7, 0x19, 0x49, 0x35, 0x5d, 0x88, 0x31, 0x2c, 0x60, 0x58, 0x95, 0xda, 0xdf, 0xeb, - 0x87, 0x21, 0x2d, 0x8a, 0x85, 0xee, 0xe3, 0x01, 0x69, 0xfb, 0x49, 0x5d, 0x97, 0x7e, 0x6c, 0xcc, - 0x4a, 0xe8, 0xfa, 0x09, 0xc8, 0x9e, 0x1b, 0x72, 0x91, 0x63, 0xac, 0x1f, 0x2c, 0xe0, 0x58, 0x61, - 0xa0, 0x29, 0xc8, 0xd7, 0x48, 0x3b, 0x6a, 0x30, 0x69, 0xda, 0x5f, 0x2e, 0xd2, 0xa6, 0xce, 0x53, - 0x00, 0xe6, 0x70, 0x8a, 0xb0, 0x43, 0xa2, 0x6a, 0x83, 0x59, 0xf5, 0x8a, 0x1c, 0x61, 0x81, 0x02, - 0x30, 0x87, 0xa7, 0x38, 0x57, 0xf2, 0xe7, 0xef, 0x5c, 0x19, 0xc8, 0xd8, 0xb9, 0x82, 0xda, 0x70, - 0x29, 0x0c, 0x1b, 0x9b, 0x81, 0xbb, 0xe7, 0x44, 0x24, 0x9e, 0x39, 0x83, 0x67, 0xe1, 0x73, 0xed, - 0xf8, 0x68, 0xea, 0x52, 0xa5, 0xb2, 0x94, 0xa4, 0x82, 0xd3, 0x48, 0xa3, 0x0a, 0x5c, 0x71, 0xbd, - 0x90, 0x54, 0x3b, 0x01, 0x59, 0xae, 0x7b, 0x7e, 0x40, 0x96, 0xfc, 0x90, 0x92, 0x13, 0x61, 0x67, - 0xca, 0x69, 0xbb, 0x9c, 0x86, 0x84, 0xd3, 0xeb, 0xa2, 0x45, 0x98, 0xa8, 0xb9, 0xa1, 0xb3, 0xdd, - 0x24, 0x95, 0xce, 0x76, 0xcb, 0xa7, 0x07, 0x36, 0x1e, 0xa9, 0x52, 0x28, 0x3f, 0x29, 0x4d, 0x13, - 0xf3, 0x49, 0x04, 0xdc, 0x5d, 0xc7, 0xfe, 0xb6, 0x05, 0xc3, 0x7a, 0x48, 0x01, 0xd5, 0x61, 0xa1, - 0x31, 0xbf, 0x50, 0xe1, 0x52, 0x36, 0xbb, 0xbd, 0x74, 0x49, 0xd1, 0x8c, 0xcf, 0x7c, 0x31, 0x0c, - 0x6b, 0x3c, 0x4f, 0x11, 0x46, 0xf9, 0x1c, 0xe4, 0x77, 0x7c, 0xba, 0xd5, 0xf7, 0x99, 0x96, 0xd9, - 0x05, 0x0a, 0xc4, 0xbc, 0xcc, 0xfe, 0x5f, 0x16, 0x5c, 0x4d, 0x8f, 0x96, 0xf8, 0x61, 0xe8, 0xe4, - 0x4d, 0x00, 0xda, 0x15, 0x43, 0x5c, 0x6a, 0xb1, 0xb0, 0xb2, 0x04, 0x6b, 0x58, 0xa7, 0xeb, 0xf6, - 0xf7, 0xa9, 0xba, 0x19, 0xf3, 0xf9, 0x8a, 0x05, 0x23, 0x94, 0xed, 0x4a, 0xb0, 0x6d, 0xf4, 0x76, - 0x23, 0x9b, 0xde, 0x2a, 0xb2, 0xb1, 0x01, 0xda, 0x00, 0x63, 0x93, 0x39, 0xfa, 0x71, 0x28, 0x3a, - 0xb5, 0x5a, 0x40, 0xc2, 0x50, 0xb9, 0x23, 0x98, 0x8b, 0x6f, 0x56, 0x02, 0x71, 0x5c, 0x4e, 0x45, - 0x5c, 0xa3, 0xb6, 0x13, 0x52, 0xa9, 0x21, 0xec, 0x6e, 0x4a, 0xc4, 0x51, 0x26, 0x14, 0x8e, 0x15, - 0x86, 0xfd, 0x0b, 0xfd, 0x60, 0xf2, 0x46, 0x35, 0x18, 0xdb, 0x0d, 0xb6, 0xe7, 0x98, 0x1b, 0xf2, - 0x61, 0x1c, 0xc2, 0x97, 0x8e, 0x8f, 0xa6, 0xc6, 0x56, 0x4c, 0x0a, 0x38, 0x49, 0x52, 0x70, 0x59, - 0x21, 0x87, 0x91, 0xb3, 0xfd, 0x30, 0x1b, 0x91, 0xe4, 0xa2, 0x53, 0xc0, 0x49, 0x92, 0xe8, 0x13, - 0x30, 0xb4, 0x1b, 0x6c, 0x4b, 0x01, 0x9a, 0xf4, 0xc2, 0xae, 0xc4, 0x45, 0x58, 0xc7, 0xa3, 0x43, - 0xb8, 0x1b, 0x6c, 0xd3, 0x0d, 0x47, 0x86, 0x15, 0xab, 0x21, 0x5c, 0x11, 0x70, 0xac, 0x30, 0x50, - 0x1b, 0xd0, 0xae, 0x1c, 0x3d, 0xe5, 0x74, 0x15, 0x72, 0xfe, 0xf4, 0x3e, 0x5b, 0x16, 0x82, 0xb1, - 0xd2, 0x45, 0x07, 0xa7, 0xd0, 0x46, 0xaf, 0xc3, 0xb5, 0xdd, 0x60, 0x5b, 0x6c, 0xc3, 0x9b, 0x81, - 0xeb, 0x55, 0xdd, 0xb6, 0x11, 0x42, 0x3c, 0x25, 0x9a, 0x7b, 0x6d, 0x25, 0x1d, 0x0d, 0xf7, 0xaa, - 0x6f, 0xff, 0xd7, 0x1c, 0xb0, 0xd8, 0x4c, 0xaa, 0x59, 0xb4, 0x48, 0xd4, 0xf0, 0x6b, 0x49, 0xcd, - 0x62, 0x8d, 0x41, 0xb1, 0x28, 0x95, 0xc1, 0x1e, 0xb9, 0x1e, 0xc1, 0x1e, 0xfb, 0x30, 0xd8, 0x20, - 0x4e, 0x8d, 0x04, 0xd2, 0x10, 0xb6, 0x9a, 0x4d, 0x34, 0xe9, 0x12, 0x23, 0x1a, 0x1f, 0x70, 0xf9, - 0xff, 0x10, 0x4b, 0x6e, 0xe8, 0x93, 0x30, 0x4a, 0x75, 0x04, 0xbf, 0x13, 0x49, 0xab, 0x6f, 0x3f, - 0xb3, 0xfa, 0xb2, 0xfd, 0x6e, 0xcb, 0x28, 0xc1, 0x09, 0x4c, 0x34, 0x0f, 0xe3, 0xc2, 0x42, 0xab, - 0x0c, 0x6c, 0x62, 0x60, 0x55, 0x6c, 0x77, 0x25, 0x51, 0x8e, 0xbb, 0x6a, 0x50, 0x89, 0xbc, 0xed, - 0xd7, 0x78, 0x3c, 0xab, 0x26, 0x91, 0xcb, 0x7e, 0xed, 0x10, 0xb3, 0x12, 0xfb, 0x37, 0xe8, 0x3e, - 0xa2, 0x85, 0xc6, 0x3e, 0x28, 0x72, 0x26, 0x8c, 0x07, 0x93, 0x9f, 0x97, 0x96, 0x32, 0x18, 0xcc, - 0x07, 0x0c, 0xa4, 0xfd, 0x2d, 0x2a, 0x1a, 0xd5, 0x88, 0x9f, 0xc2, 0x9e, 0xf8, 0x9c, 0x7e, 0x32, - 0xef, 0xa5, 0xe4, 0x7d, 0x01, 0x8a, 0xec, 0xc7, 0x42, 0xe0, 0xb7, 0x84, 0x59, 0x0f, 0x67, 0x39, - 0x33, 0xc4, 0x09, 0x94, 0x89, 0xc9, 0xbb, 0x92, 0x11, 0x8e, 0x79, 0xda, 0x3e, 0x8c, 0x27, 0xb1, - 0xd1, 0x9b, 0x30, 0x1c, 0x4a, 0x49, 0x13, 0x87, 0x9e, 0x9d, 0x52, 0x22, 0x31, 0x23, 0x53, 0x45, - 0xab, 0x8e, 0x0d, 0x62, 0xf6, 0x06, 0x0c, 0x64, 0x3a, 0x84, 0xf6, 0xd7, 0x2d, 0x28, 0x32, 0x33, - 0x7f, 0x3d, 0x70, 0x5a, 0x71, 0x95, 0xbe, 0x13, 0x46, 0x3d, 0x84, 0x41, 0x7e, 0x20, 0x90, 0x7e, - 0xe8, 0x0c, 0x26, 0x10, 0xbf, 0x94, 0x14, 0x4f, 0x20, 0x7e, 0xf2, 0x08, 0xb1, 0xe4, 0x64, 0xff, - 0x5c, 0x0e, 0x06, 0x96, 0xbd, 0x76, 0xe7, 0x4f, 0xfd, 0xc5, 0x98, 0x35, 0xe8, 0x5f, 0x8e, 0x48, - 0xcb, 0xbc, 0xbf, 0x35, 0x5c, 0x7e, 0x5e, 0xbf, 0xbb, 0x55, 0x32, 0xef, 0x6e, 0x61, 0x67, 0x5f, - 0x46, 0x40, 0x08, 0x83, 0x54, 0x1c, 0x7e, 0xf7, 0x12, 0x14, 0x57, 0x9d, 0x6d, 0xd2, 0x5c, 0x21, - 0x87, 0x21, 0x3d, 0x89, 0x70, 0x4f, 0xa6, 0x15, 0x9f, 0x44, 0x0c, 0xaf, 0xe3, 0x34, 0x0c, 0x31, - 0x6c, 0xc6, 0xe8, 0x14, 0xf8, 0xff, 0x24, 0x07, 0x23, 0x86, 0x45, 0xcc, 0xf0, 0x13, 0x58, 0x0f, - 0xf4, 0x13, 0x18, 0x76, 0xfb, 0xdc, 0xe3, 0xb6, 0xdb, 0xf7, 0x5d, 0xb8, 0xdd, 0xde, 0x6e, 0x42, - 0xff, 0xaa, 0xeb, 0xed, 0x9e, 0x6e, 0xb5, 0x87, 0x55, 0xbf, 0xdd, 0xb5, 0xda, 0x2b, 0x14, 0x88, - 0x79, 0x99, 0xdc, 0x1a, 0xfa, 0xd2, 0xb7, 0x06, 0xfb, 0x4b, 0x16, 0x4c, 0xac, 0x91, 0x96, 0xef, - 0xbe, 0xeb, 0xc4, 0xf1, 0x35, 0xb4, 0x52, 0xc3, 0x8d, 0x44, 0x28, 0x86, 0xaa, 0xb4, 0xe4, 0x46, - 0x98, 0xc2, 0x1f, 0x60, 0x33, 0x61, 0xd1, 0xc0, 0x54, 0x65, 0x5b, 0x8f, 0x75, 0xa7, 0x38, 0x72, - 0x46, 0x16, 0xe0, 0x18, 0xc7, 0xfe, 0x3d, 0x0b, 0x06, 0x79, 0x23, 0x88, 0xa4, 0x6d, 0xf5, 0xa0, - 0xdd, 0x80, 0x3c, 0xab, 0x27, 0xa6, 0xc6, 0x62, 0x06, 0xb6, 0x74, 0x4a, 0x8e, 0x4f, 0x64, 0xf6, - 0x13, 0x73, 0x06, 0x4c, 0x91, 0x71, 0x0e, 0x66, 0x55, 0x68, 0x51, 0xac, 0xc8, 0x30, 0x28, 0x16, - 0xa5, 0xf6, 0xd7, 0xfa, 0xa0, 0x20, 0xbd, 0x94, 0x3c, 0x2c, 0xde, 0xf3, 0xfc, 0xc8, 0xe1, 0x4e, - 0x3c, 0x2e, 0xaa, 0xde, 0x7c, 0xf4, 0x56, 0x4a, 0x0e, 0xd3, 0xb3, 0x31, 0x75, 0x6e, 0x2b, 0x57, - 0x6a, 0xa9, 0x56, 0x82, 0xf5, 0x46, 0xa0, 0xcf, 0xc3, 0x40, 0x93, 0x2e, 0x61, 0x29, 0xb9, 0xee, - 0x66, 0xd8, 0x1c, 0x26, 0x1b, 0x44, 0x4b, 0xd4, 0x08, 0x71, 0x20, 0x16, 0x5c, 0x27, 0x3f, 0x0d, - 0xe3, 0xc9, 0x56, 0xa7, 0x18, 0xe6, 0x2f, 0x1b, 0x7b, 0x97, 0x66, 0x47, 0x9f, 0xfc, 0xf3, 0x42, - 0x04, 0x9d, 0xbd, 0xaa, 0xfd, 0x1a, 0x0c, 0xad, 0x91, 0x28, 0x70, 0xab, 0x8c, 0xc0, 0x83, 0x26, - 0xd7, 0xa9, 0xb6, 0xcf, 0x2f, 0xb3, 0xc9, 0x4a, 0x69, 0x86, 0xe8, 0x7d, 0x80, 0x76, 0xe0, 0x53, - 0x8d, 0x96, 0x74, 0xe4, 0xc7, 0xce, 0x40, 0x51, 0xdd, 0x54, 0x34, 0xb9, 0x7b, 0x27, 0xfe, 0x8f, - 0x35, 0x7e, 0xf6, 0x0d, 0xc8, 0xaf, 0x75, 0x22, 0x72, 0xf0, 0x60, 0x51, 0x61, 0xbf, 0x09, 0xc3, - 0x0c, 0x75, 0xc9, 0x6f, 0xd2, 0x4d, 0x82, 0xf6, 0xb4, 0x45, 0xff, 0x27, 0x0d, 0x6a, 0x0c, 0x09, - 0xf3, 0x32, 0xba, 0x02, 0x1a, 0x7e, 0xb3, 0x46, 0x02, 0x31, 0x1e, 0xea, 0xfb, 0x2e, 0x31, 0x28, - 0x16, 0xa5, 0xf6, 0x4f, 0xe7, 0x60, 0x88, 0x55, 0x14, 0xd2, 0xe3, 0x10, 0x06, 0x1b, 0x9c, 0x8f, - 0x18, 0x92, 0x0c, 0xa2, 0x51, 0xf4, 0xd6, 0x6b, 0x4a, 0x27, 0x07, 0x60, 0xc9, 0x8f, 0xb2, 0xde, - 0x77, 0xdc, 0x88, 0xb2, 0xce, 0x9d, 0x2f, 0xeb, 0x7b, 0x9c, 0x0d, 0x96, 0xfc, 0xec, 0x7f, 0x67, - 0x01, 0xac, 0xfb, 0x35, 0x82, 0x49, 0xd8, 0x69, 0x46, 0xe8, 0x27, 0x20, 0xdf, 0x6e, 0x38, 0x61, - 0xd2, 0x48, 0x9e, 0xdf, 0xa4, 0xc0, 0xfb, 0x47, 0x53, 0x45, 0x8a, 0xcb, 0xfe, 0x60, 0x8e, 0xa8, - 0x07, 0x33, 0xe6, 0x4e, 0x0e, 0x66, 0x44, 0x6d, 0x18, 0xf4, 0x3b, 0x11, 0x55, 0x8d, 0xc4, 0x0e, - 0x95, 0x81, 0x8f, 0x68, 0x83, 0x13, 0xe4, 0x57, 0x38, 0xc5, 0x1f, 0x2c, 0xd9, 0xd8, 0x7f, 0x34, - 0xc6, 0x7b, 0x27, 0x3e, 0xf1, 0x24, 0xe4, 0x5c, 0x79, 0xc2, 0x03, 0xd1, 0xcc, 0xdc, 0xf2, 0x3c, - 0xce, 0xb9, 0x35, 0x35, 0x1b, 0x73, 0x3d, 0x37, 0xae, 0x4f, 0xc0, 0x50, 0xcd, 0x0d, 0xdb, 0x4d, - 0xe7, 0x70, 0x3d, 0xe5, 0x78, 0x3d, 0x1f, 0x17, 0x61, 0x1d, 0x0f, 0xbd, 0x24, 0x02, 0x50, 0xfb, - 0x8d, 0x23, 0x95, 0x0c, 0x40, 0x2d, 0xd0, 0xe6, 0x69, 0xb1, 0xa7, 0xaf, 0xc0, 0xb0, 0xdc, 0x56, - 0x19, 0x17, 0x7e, 0x9c, 0x52, 0x81, 0x89, 0x5b, 0x5a, 0x19, 0x36, 0x30, 0xbb, 0x94, 0x80, 0x81, - 0x8b, 0x77, 0xde, 0x7f, 0x0a, 0x46, 0xe4, 0x5f, 0xb6, 0x9b, 0x97, 0x2e, 0xb3, 0xd6, 0x2b, 0xb3, - 0xcf, 0x96, 0x5e, 0x88, 0x4d, 0xdc, 0x78, 0xea, 0x0d, 0x9e, 0x76, 0xea, 0xdd, 0x04, 0xd8, 0xf6, - 0x3b, 0x5e, 0xcd, 0x09, 0x0e, 0x97, 0xe7, 0x45, 0xa8, 0x8f, 0x52, 0x89, 0xcb, 0xaa, 0x04, 0x6b, - 0x58, 0xfa, 0x74, 0x2d, 0x3e, 0x60, 0xba, 0xbe, 0x09, 0x45, 0x16, 0x16, 0x45, 0x6a, 0xb3, 0x91, - 0x70, 0x82, 0x9f, 0x25, 0x82, 0x46, 0x29, 0x0f, 0x15, 0x49, 0x04, 0xc7, 0xf4, 0xd0, 0x67, 0x01, - 0x76, 0x5c, 0xcf, 0x0d, 0x1b, 0x8c, 0xfa, 0xd0, 0x99, 0xa9, 0xab, 0x7e, 0x2e, 0x28, 0x2a, 0x58, - 0xa3, 0x88, 0xde, 0x82, 0x09, 0x12, 0x46, 0x6e, 0xcb, 0x89, 0x48, 0x4d, 0xc5, 0xe5, 0x97, 0x98, - 0x4d, 0x40, 0x05, 0xa6, 0xdd, 0x4e, 0x22, 0xdc, 0x4f, 0x03, 0xe2, 0x6e, 0x42, 0xe8, 0x15, 0x28, - 0xb4, 0x03, 0xbf, 0x1e, 0x90, 0x30, 0x2c, 0x4d, 0xb2, 0x61, 0x7c, 0x5a, 0x2a, 0xc7, 0x9b, 0x02, - 0x7e, 0x5f, 0xfb, 0x8d, 0x15, 0x36, 0xfa, 0x81, 0x05, 0x13, 0x01, 0xe1, 0x9e, 0xd1, 0x50, 0x35, - 0xec, 0x0a, 0x93, 0x7a, 0xd5, 0x2c, 0x12, 0x24, 0xc8, 0xc5, 0x3e, 0x8d, 0x93, 0x5c, 0xf8, 0x76, - 0x4f, 0x64, 0xef, 0xbb, 0xca, 0xef, 0xa7, 0x01, 0xbf, 0xf4, 0x9d, 0xa9, 0xa9, 0xee, 0x6c, 0x1d, - 0x8a, 0x38, 0x5d, 0x79, 0x7f, 0xe5, 0x3b, 0x53, 0xe3, 0xf2, 0x7f, 0x3c, 0x68, 0x5d, 0x9d, 0xa4, - 0xbb, 0x57, 0xdb, 0xaf, 0x2d, 0x6f, 0x8a, 0x68, 0x05, 0xb5, 0x7b, 0x6d, 0x52, 0x20, 0xe6, 0x65, - 0xe8, 0x45, 0x28, 0xd4, 0x1c, 0xd2, 0xf2, 0x3d, 0x52, 0x2b, 0x8d, 0xc4, 0xee, 0xa0, 0x79, 0x01, - 0xc3, 0xaa, 0x14, 0x35, 0x61, 0xc0, 0x65, 0xe7, 0x4c, 0x11, 0x9a, 0x94, 0xc1, 0xe1, 0x96, 0x9f, - 0x5b, 0x65, 0x60, 0x12, 0x13, 0xa5, 0x82, 0x87, 0x2e, 0xbb, 0xc7, 0x2e, 0x44, 0x76, 0xd3, 0x91, - 0xa8, 0x36, 0xdc, 0x66, 0x2d, 0x20, 0x5e, 0x69, 0x9c, 0x1d, 0xdb, 0xd8, 0x48, 0xcc, 0x09, 0x18, - 0x56, 0xa5, 0xe8, 0xcf, 0xc1, 0x88, 0xdf, 0x89, 0xd8, 0x22, 0xa7, 0xdf, 0x3f, 0x2c, 0x4d, 0x30, - 0x74, 0xe6, 0x68, 0xde, 0xd0, 0x0b, 0xb0, 0x89, 0x47, 0x85, 0x6d, 0xc3, 0x0f, 0x23, 0xfa, 0x87, - 0x09, 0xdb, 0xab, 0xa6, 0xb0, 0x5d, 0xd2, 0xca, 0xb0, 0x81, 0x89, 0xbe, 0x6a, 0xc1, 0x44, 0x2b, - 0x79, 0x00, 0x29, 0x5d, 0x63, 0x23, 0x53, 0xc9, 0x42, 0x51, 0x4d, 0x90, 0xe6, 0xf1, 0x78, 0x5d, - 0x60, 0xdc, 0xdd, 0x08, 0x76, 0xb7, 0x30, 0x3c, 0xf4, 0xaa, 0x8d, 0xc0, 0xf7, 0xcc, 0xe6, 0x3d, - 0xc9, 0x9a, 0xf7, 0x66, 0x46, 0xab, 0x2c, 0x8d, 0x45, 0xf9, 0xc9, 0xe3, 0xa3, 0xa9, 0x2b, 0xa9, - 0x45, 0x38, 0xbd, 0x51, 0x93, 0xf3, 0x70, 0x35, 0x7d, 0xa5, 0x3e, 0x48, 0x63, 0xee, 0xd3, 0x35, - 0xe6, 0x05, 0x78, 0xb2, 0x67, 0xa3, 0xa8, 0xcc, 0x97, 0xea, 0x95, 0x65, 0xca, 0xfc, 0x2e, 0x75, - 0x68, 0x14, 0x86, 0xf5, 0x1c, 0x2b, 0xcc, 0xeb, 0xaf, 0xdd, 0x6b, 0xa5, 0xe7, 0x7c, 0xbf, 0x92, - 0xb9, 0xfb, 0x7c, 0xa3, 0xd2, 0xe5, 0x3e, 0x57, 0x20, 0x1c, 0x33, 0x3c, 0x8d, 0xd7, 0x3f, 0xf5, - 0x12, 0xee, 0x63, 0x6e, 0xf6, 0x99, 0xbd, 0xfe, 0xff, 0xb6, 0x1f, 0x62, 0x4a, 0xe8, 0x25, 0x28, - 0x10, 0xaf, 0xd6, 0xf6, 0x5d, 0x2f, 0x4a, 0x5a, 0x62, 0x6e, 0x0b, 0x38, 0x56, 0x18, 0x5a, 0x8c, - 0x40, 0xee, 0xc4, 0x18, 0x81, 0x1a, 0x8c, 0x39, 0xcc, 0x84, 0x1d, 0x7b, 0x78, 0xfb, 0xce, 0xec, - 0x92, 0x99, 0x35, 0x29, 0xe0, 0x24, 0x49, 0xca, 0x25, 0x8c, 0xab, 0x32, 0x2e, 0xfd, 0x67, 0xe6, - 0x52, 0x31, 0x29, 0xe0, 0x24, 0x49, 0xf4, 0x16, 0x94, 0xaa, 0xec, 0x22, 0x08, 0xef, 0xe3, 0xf2, - 0xce, 0xba, 0x1f, 0x6d, 0x06, 0x24, 0x24, 0x1e, 0xf7, 0xc0, 0x17, 0xca, 0xcf, 0x8a, 0x51, 0x28, - 0xcd, 0xf5, 0xc0, 0xc3, 0x3d, 0x29, 0x50, 0xad, 0x8e, 0xf9, 0x97, 0xdd, 0xe8, 0x70, 0xcb, 0xdf, - 0x25, 0xd2, 0x39, 0xa0, 0xb4, 0xba, 0x8a, 0x5e, 0x88, 0x4d, 0x5c, 0xf4, 0xf3, 0x16, 0x8c, 0x34, - 0xa5, 0x61, 0x0d, 0x77, 0x9a, 0x32, 0x8b, 0x0b, 0xce, 0x64, 0xfa, 0xad, 0xea, 0x94, 0xb9, 0xc0, - 0x37, 0x40, 0xd8, 0xe4, 0x6d, 0x7f, 0xcb, 0x82, 0xf1, 0x64, 0x35, 0xb4, 0x0b, 0xcf, 0xb4, 0x9c, - 0x60, 0x77, 0xd9, 0xdb, 0x09, 0x58, 0x88, 0x64, 0xc4, 0xbf, 0xea, 0xec, 0x4e, 0x44, 0x82, 0x79, - 0xe7, 0x90, 0x07, 0x42, 0xe5, 0x55, 0xe2, 0xa9, 0x67, 0xd6, 0x4e, 0x42, 0xc6, 0x27, 0xd3, 0x42, - 0x15, 0xb8, 0x42, 0x11, 0xe6, 0x49, 0x93, 0x50, 0x09, 0x15, 0x33, 0xc9, 0x31, 0x26, 0xca, 0xd5, - 0xbf, 0x96, 0x86, 0x84, 0xd3, 0xeb, 0xda, 0x05, 0x18, 0xe0, 0xe1, 0xe1, 0xf6, 0xbf, 0xc9, 0x81, - 0xdc, 0x49, 0xff, 0x74, 0x9b, 0x9f, 0x91, 0x0d, 0x03, 0x01, 0x3b, 0xd3, 0x8a, 0x83, 0x1a, 0x53, - 0x6a, 0xf8, 0x29, 0x17, 0x8b, 0x12, 0xaa, 0x62, 0x90, 0x03, 0x37, 0x9a, 0xf3, 0x6b, 0xf2, 0x78, - 0xc6, 0x54, 0x8c, 0xdb, 0x02, 0x86, 0x55, 0xa9, 0xfd, 0x33, 0x16, 0x8c, 0xd0, 0x5e, 0x36, 0x9b, - 0xa4, 0x59, 0x89, 0x48, 0x3b, 0x44, 0x21, 0xe4, 0x43, 0xfa, 0x23, 0x3b, 0x63, 0x41, 0x7c, 0x2b, - 0x80, 0xb4, 0x35, 0xb3, 0x28, 0x65, 0x82, 0x39, 0x2f, 0xfb, 0xb7, 0xfb, 0xa0, 0xa8, 0x06, 0xfb, - 0x14, 0xb6, 0xd6, 0x9b, 0xf1, 0x3d, 0x7c, 0x2e, 0x0d, 0x4b, 0xda, 0x1d, 0x7c, 0x7a, 0xa6, 0x9a, - 0xf5, 0x0e, 0xf9, 0xb5, 0xde, 0xf8, 0x42, 0xfe, 0x4b, 0xa6, 0x6b, 0xe5, 0xaa, 0x6e, 0xaf, 0xd7, - 0xf0, 0x85, 0x8f, 0xe5, 0x40, 0xf7, 0x6c, 0xf5, 0x67, 0xb5, 0xb3, 0x28, 0x1f, 0x56, 0x6f, 0x97, - 0x56, 0x22, 0x99, 0x54, 0xfe, 0x54, 0xc9, 0xa4, 0x6e, 0x40, 0x3f, 0xf1, 0x3a, 0x2d, 0x16, 0x22, - 0x5e, 0x64, 0x3a, 0x55, 0xff, 0x6d, 0xaf, 0xd3, 0x32, 0x7b, 0xc6, 0x50, 0xd0, 0xa7, 0x61, 0xa8, - 0x46, 0xc2, 0x6a, 0xe0, 0xb2, 0x3b, 0x75, 0xe2, 0x50, 0xfa, 0x34, 0x3b, 0xe9, 0xc7, 0x60, 0xb3, - 0xa2, 0x5e, 0xc1, 0x7e, 0x17, 0x06, 0x36, 0x9b, 0x9d, 0xba, 0xeb, 0xa1, 0x36, 0x0c, 0xf0, 0x1b, - 0x76, 0x62, 0xe7, 0xcd, 0x40, 0x51, 0xe7, 0xab, 0x5d, 0x8b, 0x8c, 0xe6, 0x97, 0x43, 0x04, 0x1f, - 0xfb, 0x1f, 0x59, 0x40, 0x4f, 0x15, 0x8b, 0x73, 0xe8, 0x2f, 0x40, 0x21, 0x14, 0xba, 0x8c, 0x98, - 0x26, 0x3f, 0xa2, 0x22, 0x28, 0x05, 0xfc, 0xfe, 0xd1, 0xd4, 0x08, 0x43, 0x96, 0x00, 0xac, 0xaa, - 0xa0, 0x26, 0x8c, 0x30, 0x6b, 0xa8, 0xdc, 0x8f, 0x84, 0xfd, 0xfa, 0xd6, 0x29, 0x2f, 0xa5, 0xe9, - 0x55, 0x85, 0x74, 0xd6, 0x41, 0xd8, 0x24, 0x6e, 0xff, 0xe3, 0x7e, 0xd0, 0x8c, 0x86, 0xa7, 0x98, - 0xde, 0xef, 0x24, 0x4c, 0xc4, 0x6b, 0x99, 0x98, 0x88, 0xa5, 0xdd, 0x95, 0x8b, 0x0c, 0xd3, 0x2a, - 0x4c, 0x1b, 0xd5, 0x20, 0xcd, 0xb6, 0x58, 0x1c, 0xaa, 0x51, 0x4b, 0xa4, 0xd9, 0xc6, 0xac, 0x44, - 0x85, 0xd7, 0xf7, 0xf7, 0x0c, 0xaf, 0x6f, 0x40, 0xbe, 0xee, 0x74, 0xea, 0x44, 0x44, 0x4d, 0x64, - 0xe0, 0x0d, 0x60, 0xf1, 0x86, 0xdc, 0x1b, 0xc0, 0x7e, 0x62, 0xce, 0x80, 0xae, 0xce, 0x86, 0xf4, - 0x99, 0x0a, 0x83, 0x50, 0x06, 0xab, 0x53, 0xb9, 0x61, 0xf9, 0xea, 0x54, 0x7f, 0x71, 0xcc, 0x8c, - 0x9e, 0x17, 0xab, 0xfc, 0x2e, 0xab, 0xd8, 0xf0, 0x97, 0xb3, 0xb8, 0x3f, 0xc0, 0x08, 0xf2, 0xf3, - 0xa2, 0xf8, 0x83, 0x25, 0x1b, 0x7b, 0x06, 0x86, 0xb4, 0x94, 0x50, 0xf4, 0x33, 0xa8, 0x6b, 0x94, - 0xda, 0x67, 0x98, 0x77, 0x22, 0x07, 0xb3, 0x12, 0xfb, 0x6f, 0xf7, 0x81, 0x3a, 0xb7, 0xeb, 0xd1, - 0xee, 0x4e, 0x55, 0xcb, 0xa5, 0x60, 0x5c, 0xb3, 0xf2, 0x3d, 0x2c, 0x4a, 0xa9, 0x52, 0xd4, 0x22, - 0x41, 0x5d, 0x9d, 0x14, 0x84, 0x7c, 0x55, 0x4a, 0xd1, 0x9a, 0x5e, 0x88, 0x4d, 0x5c, 0xaa, 0xd1, - 0xb6, 0x1c, 0xcf, 0xdd, 0x21, 0x61, 0x94, 0x0c, 0x5a, 0x5a, 0x13, 0x70, 0xac, 0x30, 0xd0, 0x22, - 0x4c, 0x84, 0x24, 0xda, 0xd8, 0xf7, 0x48, 0xa0, 0xae, 0x7f, 0x89, 0xfb, 0x80, 0x2a, 0x90, 0xaf, - 0x92, 0x44, 0xc0, 0xdd, 0x75, 0x52, 0x03, 0x3d, 0xf2, 0x67, 0x0e, 0xf4, 0x98, 0x87, 0xf1, 0x1d, - 0xc7, 0x6d, 0x76, 0x02, 0xd2, 0x33, 0x5c, 0x64, 0x21, 0x51, 0x8e, 0xbb, 0x6a, 0xb0, 0x58, 0xd2, - 0xa6, 0x53, 0x0f, 0x4b, 0x83, 0x5a, 0x2c, 0x29, 0x05, 0x60, 0x0e, 0xb7, 0xff, 0xbe, 0x05, 0x23, - 0x98, 0x44, 0xc1, 0xe1, 0xec, 0xce, 0x8e, 0xeb, 0xb9, 0xd1, 0x21, 0xfa, 0x55, 0x0b, 0xc6, 0x3d, - 0xbf, 0x46, 0x66, 0xbd, 0xc8, 0x95, 0xc0, 0xec, 0xf2, 0xe5, 0x30, 0x5e, 0xeb, 0x09, 0xf2, 0xfc, - 0x56, 0x5f, 0x12, 0x8a, 0xbb, 0x9a, 0x61, 0x5f, 0x83, 0x2b, 0xa9, 0x04, 0xec, 0x6f, 0xf5, 0x89, - 0x6e, 0xa8, 0x8f, 0xff, 0x1a, 0xe4, 0x9b, 0xec, 0x86, 0xa3, 0xf5, 0x90, 0x09, 0x38, 0xd8, 0x58, - 0xf1, 0x2b, 0x90, 0x9c, 0x12, 0x9a, 0x87, 0xa1, 0x80, 0xf2, 0x10, 0xf7, 0x4f, 0xf9, 0x54, 0xb4, - 0xe3, 0x84, 0x82, 0xaa, 0xe8, 0xbe, 0xf9, 0x17, 0xeb, 0xd5, 0xd0, 0x7b, 0x30, 0xb8, 0xcd, 0x73, - 0x8a, 0x64, 0x67, 0x9e, 0x17, 0x49, 0x4a, 0x98, 0x16, 0x21, 0x33, 0x96, 0xdc, 0x8f, 0x7f, 0x62, - 0xc9, 0x11, 0x1d, 0x42, 0xc1, 0x91, 0xdf, 0xb4, 0x3f, 0xab, 0xe8, 0x43, 0x63, 0xfe, 0x70, 0xdd, - 0x4e, 0x7d, 0x43, 0xc5, 0x8e, 0x2a, 0x12, 0x24, 0xce, 0xa9, 0x98, 0x50, 0x24, 0xb4, 0x7c, 0x8a, - 0x1a, 0x96, 0xfd, 0x75, 0x0b, 0x20, 0xce, 0x36, 0x86, 0x0e, 0xa0, 0x10, 0xde, 0x32, 0x8e, 0xd7, - 0x59, 0x5c, 0xe8, 0x12, 0x14, 0xb5, 0x4b, 0x0f, 0x02, 0x82, 0x15, 0xb7, 0x07, 0x99, 0x04, 0xfe, - 0xa7, 0x05, 0x97, 0xd3, 0xb2, 0xa2, 0x3d, 0xc6, 0x16, 0x9f, 0xd5, 0x1a, 0x20, 0x2a, 0x6c, 0x06, - 0x64, 0xc7, 0x3d, 0x48, 0x3a, 0xe6, 0x57, 0x64, 0x01, 0x8e, 0x71, 0xec, 0x6f, 0x0c, 0x80, 0x62, - 0x7c, 0x4e, 0xd6, 0x83, 0x17, 0xe8, 0xe9, 0xa2, 0x1e, 0xe7, 0xba, 0x51, 0x78, 0x98, 0x41, 0xb1, - 0x28, 0xa5, 0x27, 0x0c, 0x19, 0x9d, 0x2d, 0x44, 0x36, 0x9b, 0x85, 0x32, 0x90, 0x1b, 0xab, 0xd2, - 0x34, 0x7b, 0x44, 0xfe, 0x42, 0xec, 0x11, 0x03, 0xd9, 0xdb, 0x23, 0x6e, 0xc0, 0x60, 0xe0, 0x37, - 0xc9, 0x2c, 0x5e, 0x17, 0x7a, 0x73, 0x9c, 0xa3, 0x89, 0x83, 0xb1, 0x2c, 0x47, 0x9f, 0x80, 0xa1, - 0x4e, 0x48, 0x2a, 0xf3, 0x2b, 0x73, 0x01, 0xa9, 0x85, 0x22, 0xe0, 0x5d, 0x39, 0xd5, 0xee, 0xc4, - 0x45, 0x58, 0xc7, 0x43, 0xdf, 0xb0, 0x4e, 0x30, 0x79, 0x14, 0xb3, 0xda, 0x13, 0x52, 0xb3, 0x6b, - 0xb0, 0x43, 0xc0, 0xc3, 0xd8, 0x51, 0xbe, 0x66, 0xc1, 0x04, 0xf1, 0xaa, 0xc1, 0x21, 0xa3, 0x23, - 0xa8, 0x09, 0xc7, 0xd2, 0x9d, 0x2c, 0x16, 0xdf, 0xed, 0x24, 0x71, 0x6e, 0x35, 0xee, 0x02, 0xe3, - 0xee, 0x66, 0xd8, 0x7f, 0x94, 0x83, 0x4b, 0x29, 0x14, 0x58, 0x70, 0x70, 0x8b, 0x4e, 0xa0, 0xe5, - 0x5a, 0x72, 0xf9, 0xac, 0x08, 0x38, 0x56, 0x18, 0x68, 0x13, 0x2e, 0xef, 0xb6, 0xc2, 0x98, 0xca, - 0x9c, 0xef, 0x45, 0xe4, 0x40, 0x2e, 0x26, 0xe9, 0x23, 0xba, 0xbc, 0x92, 0x82, 0x83, 0x53, 0x6b, - 0x52, 0x6d, 0x83, 0x78, 0xce, 0x76, 0x93, 0xc4, 0x45, 0x22, 0xb4, 0x5d, 0x69, 0x1b, 0xb7, 0x13, - 0xe5, 0xb8, 0xab, 0x06, 0xfa, 0xd0, 0x82, 0xa7, 0x42, 0x12, 0xec, 0x91, 0xa0, 0xe2, 0xd6, 0xc8, - 0x5c, 0x27, 0x8c, 0xfc, 0x16, 0x09, 0x1e, 0xd2, 0x26, 0x37, 0x75, 0x7c, 0x34, 0xf5, 0x54, 0xa5, - 0x37, 0x35, 0x7c, 0x12, 0x2b, 0xfb, 0x43, 0x0b, 0x46, 0x2b, 0xec, 0x94, 0xa8, 0x74, 0xce, 0xac, - 0x53, 0xfa, 0xbc, 0xa0, 0xae, 0x39, 0x26, 0x84, 0x98, 0x79, 0x31, 0xd1, 0x7e, 0x1b, 0xc6, 0x2b, - 0xa4, 0xe5, 0xb4, 0x1b, 0xec, 0xd6, 0x08, 0x0f, 0x45, 0x98, 0x81, 0x62, 0x28, 0x61, 0xc9, 0x9c, - 0x88, 0x0a, 0x19, 0xc7, 0x38, 0xe8, 0x79, 0x1e, 0x36, 0x21, 0xa3, 0x74, 0x8b, 0x5c, 0x3b, 0xe7, - 0xb1, 0x16, 0x21, 0x96, 0x65, 0xf6, 0x3e, 0x0c, 0xc7, 0xd5, 0xc9, 0x0e, 0xaa, 0xc3, 0x58, 0x55, - 0x0b, 0x0c, 0x8f, 0xe3, 0x4f, 0x4f, 0x1f, 0x43, 0xce, 0x64, 0xd1, 0x9c, 0x49, 0x04, 0x27, 0xa9, - 0xda, 0xbf, 0x98, 0x83, 0x31, 0xc5, 0x59, 0x38, 0x04, 0x3e, 0x48, 0x86, 0x7a, 0xe0, 0x2c, 0xae, - 0x5f, 0x9b, 0x23, 0x79, 0x42, 0xb8, 0xc7, 0x07, 0xc9, 0x70, 0x8f, 0x73, 0x65, 0xdf, 0xe5, 0xe3, - 0xf8, 0x7a, 0x0e, 0x0a, 0xea, 0x32, 0xf8, 0x6b, 0x90, 0x67, 0x07, 0xa8, 0x47, 0xd3, 0x46, 0xd9, - 0x61, 0x0c, 0x73, 0x4a, 0x94, 0x24, 0xf3, 0x73, 0x3f, 0x74, 0x86, 0xb9, 0x22, 0xb7, 0x7b, 0x39, - 0x41, 0x84, 0x39, 0x25, 0xb4, 0x02, 0x7d, 0xc4, 0xab, 0x09, 0xb5, 0xf4, 0xec, 0x04, 0x59, 0x3e, - 0xd0, 0xdb, 0x5e, 0x0d, 0x53, 0x2a, 0x2c, 0x1d, 0x13, 0xd7, 0x3e, 0xfa, 0xcd, 0xe5, 0x21, 0x54, - 0x0f, 0x51, 0x6a, 0xff, 0x7c, 0x1f, 0x0c, 0x54, 0x3a, 0xdb, 0x54, 0xc1, 0xfe, 0x4d, 0x0b, 0x2e, - 0xed, 0x27, 0xb2, 0x8f, 0xc5, 0x53, 0xf6, 0x4e, 0xf6, 0xa9, 0xdd, 0x30, 0xd9, 0x29, 0x3f, 0x25, - 0xda, 0x75, 0x29, 0xa5, 0x10, 0xa7, 0x35, 0xc7, 0xc8, 0xd4, 0xd4, 0x77, 0x4e, 0x39, 0xed, 0xce, - 0x37, 0xce, 0x75, 0xa4, 0x57, 0x8c, 0xab, 0xfd, 0x83, 0x3c, 0x00, 0xff, 0x1a, 0x1b, 0xed, 0xe8, - 0x34, 0xc6, 0xa1, 0x57, 0x60, 0x58, 0x3e, 0x2a, 0xb1, 0x1e, 0x07, 0xf6, 0x28, 0xe7, 0xee, 0xa2, - 0x56, 0x86, 0x0d, 0x4c, 0x76, 0x20, 0xf0, 0xa2, 0xe0, 0x90, 0x2b, 0x8d, 0xfd, 0x89, 0x03, 0x81, - 0x2a, 0xc1, 0x1a, 0x16, 0x9a, 0x36, 0x8c, 0xed, 0x3c, 0x6b, 0xc5, 0xe8, 0x09, 0xb6, 0xf1, 0x4f, - 0xc1, 0x88, 0xfa, 0xb7, 0xe0, 0x36, 0x49, 0xd2, 0xa9, 0xb2, 0xa9, 0x17, 0x62, 0x13, 0x17, 0x7d, - 0x1a, 0x46, 0xcd, 0xcb, 0xa7, 0x42, 0xcd, 0x52, 0x57, 0xbf, 0xcd, 0x3b, 0xab, 0x38, 0x81, 0x4d, - 0x57, 0x40, 0x2d, 0x38, 0xc4, 0x1d, 0x4f, 0xe8, 0x5b, 0x6a, 0x05, 0xcc, 0x33, 0x28, 0x16, 0xa5, - 0x74, 0x08, 0xf9, 0x56, 0xc6, 0xe1, 0xe2, 0xf6, 0xa0, 0x1a, 0xc2, 0x8a, 0x56, 0x86, 0x0d, 0x4c, - 0xca, 0x41, 0x58, 0xe6, 0xc0, 0x5c, 0x63, 0x09, 0x73, 0x5a, 0x1b, 0x46, 0x7d, 0xd3, 0xb0, 0xc1, - 0x43, 0x61, 0x3e, 0x7e, 0xca, 0x79, 0x6b, 0xd4, 0xe5, 0xb7, 0x5d, 0x12, 0x76, 0x90, 0x04, 0x7d, - 0xaa, 0x70, 0xea, 0xa1, 0xae, 0xc3, 0x66, 0x14, 0x57, 0xcf, 0x68, 0xd4, 0x4d, 0xb8, 0xdc, 0xf6, - 0x6b, 0x9b, 0x81, 0xeb, 0x07, 0x6e, 0x74, 0x38, 0xd7, 0x74, 0xc2, 0x90, 0xcd, 0xaa, 0x11, 0x53, - 0xb3, 0xd9, 0x4c, 0xc1, 0xc1, 0xa9, 0x35, 0xe9, 0xd1, 0xa0, 0x2d, 0x80, 0x2c, 0x82, 0x23, 0xcf, - 0x8f, 0x06, 0x12, 0x11, 0xab, 0x52, 0xfb, 0x12, 0x4c, 0x54, 0x3a, 0xed, 0x76, 0xd3, 0x25, 0x35, - 0x65, 0x09, 0xb7, 0x7f, 0x12, 0xc6, 0x44, 0x12, 0x28, 0xa5, 0x47, 0x9c, 0x29, 0x13, 0xa8, 0xfd, - 0x03, 0x0b, 0xc6, 0x12, 0xfe, 0x72, 0xf4, 0x5e, 0x72, 0xf7, 0xcf, 0xc4, 0xb1, 0xa1, 0x6f, 0xfc, - 0x7c, 0x85, 0xa7, 0x6a, 0x12, 0x0d, 0x19, 0xdd, 0x99, 0x59, 0x90, 0x34, 0x8b, 0x81, 0xe4, 0xdb, - 0x89, 0x1e, 0x22, 0x6a, 0x7f, 0x39, 0x07, 0xe9, 0x41, 0x0a, 0xe8, 0xf3, 0xdd, 0x03, 0xf0, 0x5a, - 0x86, 0x03, 0x20, 0xa2, 0x24, 0x7a, 0x8f, 0x81, 0x67, 0x8e, 0xc1, 0x5a, 0x46, 0x63, 0x20, 0xf8, - 0x76, 0x8f, 0xc4, 0x9f, 0x58, 0x30, 0xb4, 0xb5, 0xb5, 0xaa, 0x8c, 0x53, 0x18, 0xae, 0x86, 0xfc, - 0x5a, 0x18, 0xf3, 0x2e, 0xce, 0xf9, 0xad, 0x36, 0x77, 0x36, 0x0a, 0x27, 0x28, 0xcb, 0xc7, 0x55, - 0x49, 0xc5, 0xc0, 0x3d, 0x6a, 0xa2, 0x65, 0xb8, 0xa4, 0x97, 0x08, 0x13, 0xa3, 0x70, 0x78, 0xf2, - 0x8b, 0xd2, 0xdd, 0xc5, 0x38, 0xad, 0x4e, 0x92, 0x94, 0xb0, 0x33, 0x8a, 0xa7, 0x52, 0xba, 0x48, - 0x89, 0x62, 0x9c, 0x56, 0xc7, 0xde, 0x80, 0x21, 0xed, 0xe1, 0x1e, 0xf4, 0x19, 0x18, 0xaf, 0xfa, - 0x2d, 0x69, 0xdf, 0x59, 0x25, 0x7b, 0xa4, 0x29, 0xba, 0xcc, 0x4c, 0x80, 0x73, 0x89, 0x32, 0xdc, - 0x85, 0x6d, 0xff, 0x8f, 0xeb, 0xa0, 0x6e, 0x86, 0x9c, 0x62, 0x7b, 0x6a, 0xab, 0xf0, 0xad, 0x7c, - 0xc6, 0xe1, 0x5b, 0x4a, 0xd6, 0x26, 0x42, 0xb8, 0xa2, 0x38, 0x84, 0x6b, 0x20, 0xeb, 0x10, 0x2e, - 0xa5, 0x6d, 0x76, 0x85, 0x71, 0xfd, 0xb2, 0x05, 0xc3, 0x9e, 0x5f, 0x23, 0xca, 0x85, 0x34, 0xc8, - 0x54, 0xde, 0xb7, 0xb2, 0x8b, 0x4b, 0xe5, 0xe1, 0x48, 0x82, 0x3c, 0x0f, 0xf2, 0x53, 0x5b, 0x94, - 0x5e, 0x84, 0x8d, 0x76, 0xa0, 0x05, 0xcd, 0xe2, 0xc8, 0x93, 0x30, 0x3d, 0x9d, 0x76, 0xf4, 0x78, - 0xa0, 0xf9, 0xf0, 0x40, 0x53, 0xba, 0x8a, 0x59, 0x59, 0xd2, 0xe4, 0x4d, 0x05, 0xcd, 0x31, 0x20, - 0x53, 0xca, 0xc5, 0xca, 0x98, 0x0d, 0x03, 0x3c, 0x1a, 0x50, 0x3c, 0x21, 0xc3, 0xfc, 0x55, 0x3c, - 0x52, 0x10, 0x8b, 0x12, 0x14, 0x49, 0x37, 0xf5, 0x50, 0x56, 0x99, 0x58, 0x0d, 0x37, 0x78, 0xba, - 0x9f, 0x1a, 0xbd, 0xaa, 0x9f, 0x68, 0x87, 0x4f, 0x73, 0xa2, 0x1d, 0xe9, 0x79, 0x9a, 0xfd, 0x8a, - 0x05, 0xc3, 0x55, 0x2d, 0xd5, 0x6c, 0xe9, 0xc5, 0xac, 0xf2, 0x29, 0xa7, 0x25, 0xb0, 0xe5, 0x17, - 0x1b, 0xf5, 0x12, 0x6c, 0x70, 0x67, 0x39, 0x84, 0xd8, 0xf1, 0x9d, 0x6d, 0xfd, 0x43, 0x37, 0x37, - 0x33, 0xd8, 0x1e, 0x0c, 0x73, 0x00, 0xff, 0x8c, 0x1c, 0x86, 0x05, 0x2f, 0xf4, 0x3e, 0x14, 0x64, - 0x40, 0xa9, 0x08, 0xf7, 0xc4, 0x59, 0x98, 0xc7, 0x4d, 0xe7, 0x97, 0xcc, 0x3c, 0xc2, 0xa1, 0x58, - 0x71, 0x44, 0x0d, 0xe8, 0xab, 0x39, 0x75, 0x11, 0xf8, 0xb9, 0x96, 0x4d, 0x62, 0x27, 0xc9, 0x93, - 0x9d, 0xcd, 0xe6, 0x67, 0x17, 0x31, 0x65, 0x81, 0x0e, 0xe2, 0x8c, 0x97, 0xe3, 0x99, 0xed, 0xbe, - 0xa6, 0x9a, 0xc4, 0x0d, 0x14, 0x5d, 0x09, 0x34, 0x6b, 0xc2, 0x5f, 0xf8, 0x67, 0x18, 0xdb, 0x85, - 0x6c, 0x32, 0x43, 0xf1, 0x37, 0x37, 0x62, 0x9f, 0x23, 0xe5, 0xc2, 0xde, 0x1a, 0xfa, 0xb1, 0xac, - 0xb8, 0x2c, 0x6d, 0x6d, 0x6d, 0x76, 0xbd, 0x31, 0xd4, 0x84, 0x81, 0x36, 0x8b, 0x3d, 0x28, 0xfd, - 0x78, 0x56, 0x7b, 0x0b, 0x8f, 0x65, 0xe0, 0x73, 0x93, 0xff, 0xc6, 0x82, 0x07, 0xba, 0x0d, 0x83, - 0x3c, 0x43, 0x32, 0x0f, 0xbc, 0x1d, 0xba, 0x39, 0xd9, 0x3b, 0xcf, 0x72, 0xbc, 0x51, 0xf0, 0xff, - 0x21, 0x96, 0x75, 0xd1, 0x2f, 0x5a, 0x30, 0x4a, 0x25, 0x6a, 0x9c, 0xd2, 0xb9, 0x84, 0xb2, 0x92, - 0x59, 0x77, 0x42, 0xaa, 0x91, 0x48, 0x59, 0xa3, 0x8e, 0x49, 0xcb, 0x06, 0x3b, 0x9c, 0x60, 0x8f, - 0x3e, 0x80, 0x42, 0xe8, 0xd6, 0x48, 0xd5, 0x09, 0xc2, 0xd2, 0xa5, 0xf3, 0x69, 0x4a, 0xec, 0x28, - 0x11, 0x8c, 0xb0, 0x62, 0x89, 0xfe, 0x3a, 0x7b, 0x80, 0x41, 0x3c, 0x96, 0x23, 0xde, 0x71, 0xbb, - 0x7c, 0x6e, 0xef, 0xb8, 0x71, 0xff, 0x81, 0xc9, 0x0e, 0x27, 0xf9, 0xa3, 0xbf, 0x6c, 0xc1, 0x15, - 0x9e, 0x68, 0x34, 0x99, 0x65, 0xf6, 0xca, 0x43, 0xda, 0x66, 0x58, 0xc4, 0xf0, 0x6c, 0x1a, 0x49, - 0x9c, 0xce, 0x89, 0x65, 0x2a, 0x0b, 0x74, 0x97, 0x2a, 0x8b, 0xdb, 0xce, 0xce, 0x61, 0xa8, 0x9e, - 0x85, 0x63, 0x11, 0x2b, 0x06, 0x08, 0x9b, 0x8c, 0xd1, 0xcb, 0x30, 0xd4, 0x16, 0xdb, 0xa1, 0x1b, - 0xb6, 0x58, 0xfc, 0x77, 0x1f, 0xbf, 0x23, 0xb3, 0x19, 0x83, 0xb1, 0x8e, 0x63, 0xa4, 0xad, 0xbb, - 0x71, 0x52, 0xda, 0x3a, 0x74, 0x07, 0x86, 0x22, 0xbf, 0x49, 0x02, 0x71, 0x52, 0x2d, 0xb1, 0x19, - 0x78, 0x3d, 0x6d, 0x6d, 0x6d, 0x29, 0xb4, 0xf8, 0x24, 0x1b, 0xc3, 0x42, 0xac, 0xd3, 0x61, 0xe1, - 0x9c, 0x22, 0x81, 0x6b, 0xc0, 0x8e, 0xb0, 0x4f, 0x26, 0xc2, 0x39, 0xf5, 0x42, 0x6c, 0xe2, 0xa2, - 0x45, 0x98, 0x68, 0x77, 0x9d, 0x81, 0xf9, 0x0d, 0x10, 0x15, 0x8b, 0xd0, 0x7d, 0x00, 0xee, 0xae, - 0x63, 0x9c, 0x7e, 0x9f, 0x3a, 0xe9, 0xf4, 0xdb, 0x23, 0x89, 0xdb, 0xd3, 0x0f, 0x93, 0xc4, 0x0d, - 0xd5, 0xe0, 0x69, 0xa7, 0x13, 0xf9, 0xec, 0x0e, 0xbf, 0x59, 0x85, 0x47, 0xb6, 0x3e, 0xcb, 0x83, - 0x65, 0x8f, 0x8f, 0xa6, 0x9e, 0x9e, 0x3d, 0x01, 0x0f, 0x9f, 0x48, 0x05, 0xbd, 0x0b, 0x05, 0x22, - 0x12, 0xd1, 0x95, 0x7e, 0x24, 0x2b, 0x25, 0xc1, 0x4c, 0x6d, 0x27, 0x03, 0x15, 0x39, 0x0c, 0x2b, - 0x7e, 0x68, 0x0b, 0x86, 0x1a, 0x7e, 0x18, 0xcd, 0x36, 0x5d, 0x27, 0x24, 0x61, 0xe9, 0x19, 0x36, - 0x69, 0x52, 0x75, 0xaf, 0x25, 0x89, 0x16, 0xcf, 0x99, 0xa5, 0xb8, 0x26, 0xd6, 0xc9, 0x20, 0xc2, - 0xdc, 0x86, 0x2c, 0xac, 0x57, 0xba, 0x74, 0xae, 0xb3, 0x8e, 0xbd, 0x90, 0x46, 0x79, 0xd3, 0xaf, - 0x55, 0x4c, 0x6c, 0xe5, 0x37, 0xd4, 0x81, 0x38, 0x49, 0x13, 0xbd, 0x02, 0xc3, 0x6d, 0xbf, 0x56, - 0x69, 0x93, 0xea, 0xa6, 0x13, 0x55, 0x1b, 0xa5, 0x29, 0xd3, 0x64, 0xb7, 0xa9, 0x95, 0x61, 0x03, - 0x13, 0xb5, 0x61, 0xb0, 0xc5, 0x6f, 0xb7, 0x96, 0x9e, 0xcb, 0xea, 0x6c, 0x23, 0xae, 0xcb, 0x72, - 0x7d, 0x41, 0xfc, 0xc1, 0x92, 0x0d, 0xfa, 0xbb, 0x16, 0x8c, 0x25, 0x6e, 0x34, 0x94, 0x7e, 0x34, - 0x33, 0x95, 0xc5, 0x24, 0x5c, 0x7e, 0x81, 0x0d, 0x9f, 0x09, 0xbc, 0xdf, 0x0d, 0xc2, 0xc9, 0x16, - 0xf1, 0x71, 0x61, 0x57, 0xd4, 0x4b, 0xcf, 0x67, 0x37, 0x2e, 0x8c, 0xa0, 0x1c, 0x17, 0xf6, 0x07, - 0x4b, 0x36, 0xe8, 0x06, 0x0c, 0x8a, 0xfc, 0x32, 0xa5, 0x17, 0x4c, 0xdf, 0xaf, 0x48, 0x43, 0x83, - 0x65, 0xf9, 0xe4, 0x4f, 0xc2, 0x44, 0xd7, 0xd1, 0xed, 0x4c, 0xf7, 0xa4, 0x7f, 0xc5, 0x02, 0xfd, - 0x32, 0x62, 0xe6, 0xd9, 0x9f, 0x5f, 0x81, 0xe1, 0x2a, 0x7f, 0x7a, 0x84, 0x5f, 0x67, 0xec, 0x37, - 0xed, 0x9f, 0x73, 0x5a, 0x19, 0x36, 0x30, 0xed, 0x25, 0x40, 0xdd, 0xa9, 0x39, 0x13, 0x91, 0x26, - 0xd6, 0xa9, 0x22, 0x4d, 0x7e, 0xcb, 0x82, 0x11, 0x43, 0x67, 0xc8, 0xdc, 0x5d, 0xb8, 0x00, 0xa8, - 0xe5, 0x06, 0x81, 0x1f, 0xe8, 0xaf, 0x5e, 0x88, 0x5c, 0x84, 0x2c, 0x4f, 0xd3, 0x5a, 0x57, 0x29, - 0x4e, 0xa9, 0x61, 0xff, 0xc3, 0x7e, 0x88, 0x23, 0x75, 0x55, 0x86, 0x36, 0xab, 0x67, 0x86, 0xb6, - 0x97, 0xa0, 0xf0, 0x76, 0xe8, 0x7b, 0x9b, 0x71, 0x1e, 0x37, 0xf5, 0x2d, 0x5e, 0xad, 0x6c, 0xac, - 0x33, 0x4c, 0x85, 0xc1, 0xb0, 0xdf, 0x59, 0x70, 0x9b, 0x51, 0x77, 0xa2, 0xaf, 0x57, 0x5f, 0xe3, - 0x70, 0xac, 0x30, 0xd8, 0xbb, 0x1c, 0x7b, 0x44, 0x19, 0xc6, 0xe3, 0x77, 0x39, 0x78, 0xd6, 0x5d, - 0x56, 0x86, 0x66, 0xa0, 0xa8, 0xec, 0xea, 0xc2, 0xcc, 0xaf, 0x46, 0x4a, 0xd9, 0xdf, 0x71, 0x8c, - 0xc3, 0x14, 0x42, 0x61, 0x88, 0x15, 0x26, 0x94, 0x4a, 0x16, 0xc7, 0x93, 0x84, 0x69, 0x97, 0xcb, - 0x76, 0x09, 0xc6, 0x8a, 0x65, 0x9a, 0xcf, 0xb4, 0x78, 0x1e, 0x3e, 0x53, 0x3d, 0x6c, 0x3c, 0x7f, - 0xda, 0xb0, 0x71, 0x73, 0x6e, 0x17, 0x4e, 0x35, 0xb7, 0x7f, 0xb6, 0x0f, 0x06, 0xef, 0x92, 0x80, - 0x65, 0x9f, 0xbc, 0x01, 0x83, 0x7b, 0xfc, 0x67, 0xf2, 0x92, 0x96, 0xc0, 0xc0, 0xb2, 0x9c, 0x7e, - 0xb7, 0xed, 0x8e, 0xdb, 0xac, 0xcd, 0xc7, 0xab, 0x58, 0x7d, 0xb7, 0xb2, 0x2c, 0xc0, 0x31, 0x0e, - 0xad, 0x50, 0xa7, 0x9a, 0x7d, 0xab, 0xe5, 0x46, 0xc9, 0x08, 0xa2, 0x45, 0x59, 0x80, 0x63, 0x1c, - 0xf4, 0x02, 0x0c, 0xd4, 0xdd, 0x68, 0xcb, 0xa9, 0x27, 0x5d, 0x84, 0x8b, 0x0c, 0x8a, 0x45, 0x29, - 0xf3, 0x31, 0xb9, 0xd1, 0x56, 0x40, 0x98, 0x65, 0xb7, 0xeb, 0xb6, 0xf6, 0xa2, 0x56, 0x86, 0x0d, - 0x4c, 0xd6, 0x24, 0x5f, 0xf4, 0x4c, 0xf8, 0x7e, 0xe2, 0x26, 0xc9, 0x02, 0x1c, 0xe3, 0xd0, 0xf9, - 0x5f, 0xf5, 0x5b, 0x6d, 0xb7, 0x29, 0x22, 0x6a, 0xb5, 0xf9, 0x3f, 0x27, 0xe0, 0x58, 0x61, 0x50, - 0x6c, 0x2a, 0xc2, 0xa8, 0xf8, 0x49, 0xbe, 0x81, 0xb0, 0x29, 0xe0, 0x58, 0x61, 0xd8, 0x77, 0x61, - 0x84, 0xaf, 0xe4, 0xb9, 0xa6, 0xe3, 0xb6, 0x16, 0xe7, 0xd0, 0xed, 0xae, 0xb0, 0xf1, 0x1b, 0x29, - 0x61, 0xe3, 0x57, 0x8c, 0x4a, 0xdd, 0xe1, 0xe3, 0xf6, 0xb7, 0x73, 0x50, 0xb8, 0xc0, 0x67, 0x64, - 0xda, 0xc6, 0x33, 0x32, 0x59, 0x3f, 0x26, 0x92, 0xf6, 0x84, 0xcc, 0x41, 0xe2, 0x09, 0x99, 0xcd, - 0x2c, 0x6f, 0x81, 0x9c, 0xf8, 0x7c, 0xcc, 0xf7, 0x2d, 0xb8, 0x2c, 0x51, 0x99, 0x50, 0x2b, 0xbb, - 0x1e, 0x0b, 0x2e, 0x38, 0xff, 0x61, 0x7e, 0xdf, 0x18, 0xe6, 0x37, 0xb2, 0xeb, 0xb2, 0xde, 0x8f, - 0x9e, 0x6f, 0x9b, 0x7d, 0xcf, 0x82, 0x52, 0x5a, 0x85, 0x0b, 0x78, 0x3f, 0xe7, 0x3d, 0xf3, 0xfd, - 0x9c, 0xbb, 0xe7, 0xd3, 0xf3, 0x1e, 0xef, 0xe8, 0x7c, 0xbf, 0x47, 0xbf, 0xd9, 0xa3, 0x35, 0x4d, - 0xb9, 0xdd, 0x59, 0x59, 0xb9, 0xce, 0x38, 0x8b, 0xf4, 0x7d, 0xb3, 0x09, 0x03, 0x21, 0xf3, 0xc4, - 0x8b, 0x29, 0xb0, 0x94, 0xc5, 0x26, 0x48, 0xe9, 0x09, 0xd3, 0x27, 0xfb, 0x8d, 0x05, 0x0f, 0xfb, - 0x3f, 0x58, 0x30, 0x7c, 0x81, 0x8f, 0x24, 0xf9, 0xe6, 0x47, 0x7e, 0x35, 0xbb, 0x8f, 0xdc, 0xe3, - 0xc3, 0xfe, 0xda, 0x75, 0x30, 0xde, 0x23, 0x42, 0xef, 0x41, 0x51, 0x6a, 0xa0, 0xf2, 0x76, 0x59, - 0x96, 0xcf, 0x8e, 0xa8, 0x6d, 0x46, 0x42, 0x42, 0x1c, 0xf3, 0x4b, 0xc4, 0x3e, 0xe4, 0x4e, 0x15, - 0xfb, 0xf0, 0x78, 0x1f, 0x2d, 0x49, 0xb7, 0x0f, 0xf4, 0x9f, 0x8b, 0x7d, 0xe0, 0xe9, 0xcc, 0xed, - 0x03, 0xcf, 0x5c, 0xb0, 0x7d, 0x40, 0x33, 0xd6, 0xe6, 0x1f, 0xc1, 0x58, 0xfb, 0x1e, 0x5c, 0xde, - 0x8b, 0x37, 0x7f, 0x35, 0x93, 0xc4, 0xdb, 0x2b, 0x37, 0x52, 0xad, 0x02, 0x54, 0x91, 0x09, 0x23, - 0xe2, 0x45, 0x9a, 0xda, 0x10, 0x47, 0x4e, 0xdc, 0x4d, 0x21, 0x87, 0x53, 0x99, 0x24, 0xad, 0x6e, - 0x83, 0xa7, 0xb0, 0xba, 0xfd, 0x76, 0xcf, 0x07, 0x97, 0x0b, 0xe7, 0xfb, 0xe0, 0xf2, 0x93, 0x67, - 0x7e, 0x6c, 0xf9, 0xf9, 0xd8, 0x05, 0xc2, 0xe3, 0x6d, 0xd2, 0xfd, 0x15, 0x5f, 0x4b, 0xfa, 0x55, - 0x81, 0x0d, 0xfd, 0xe7, 0xb2, 0xd5, 0x7a, 0x32, 0xf0, 0xad, 0x0e, 0x3d, 0x82, 0x6f, 0x35, 0x61, - 0x02, 0x1d, 0xce, 0xc8, 0x04, 0xea, 0xc1, 0xb8, 0xdb, 0x72, 0xea, 0x64, 0xb3, 0xd3, 0x6c, 0xf2, - 0xb0, 0x5c, 0xf9, 0x30, 0x4c, 0xea, 0x49, 0x6a, 0xd5, 0xaf, 0x3a, 0xcd, 0xe4, 0xfb, 0x5b, 0x2a, - 0xfc, 0x78, 0x39, 0x41, 0x09, 0x77, 0xd1, 0xa6, 0x13, 0x96, 0x65, 0x0f, 0x21, 0x11, 0x1d, 0x6d, - 0xe6, 0xc0, 0x13, 0x2f, 0xe3, 0x2f, 0xc5, 0x60, 0xac, 0xe3, 0xa0, 0x15, 0x28, 0xd6, 0xbc, 0x50, - 0x5c, 0xe8, 0x19, 0x63, 0xc2, 0xec, 0x63, 0x54, 0x04, 0xce, 0xaf, 0x57, 0xd4, 0x55, 0x9e, 0xa7, - 0x53, 0x12, 0xd3, 0xa8, 0x72, 0x1c, 0xd7, 0x47, 0x6b, 0x8c, 0x98, 0xc8, 0xed, 0xcd, 0xfd, 0x6a, - 0xcf, 0xf6, 0x30, 0xdc, 0xcd, 0xaf, 0xcb, 0xec, 0xe4, 0x23, 0x82, 0x9d, 0x48, 0xd2, 0x1d, 0x53, - 0xd0, 0x1e, 0xe8, 0x99, 0x38, 0xf1, 0x81, 0x1e, 0x96, 0x91, 0x2a, 0x6a, 0x2a, 0x33, 0xfd, 0xf5, - 0xcc, 0x32, 0x52, 0xc5, 0x11, 0x2b, 0x22, 0x23, 0x55, 0x0c, 0xc0, 0x3a, 0x4b, 0xb4, 0xd1, 0xcb, - 0x5d, 0x71, 0x89, 0x09, 0x8d, 0xb3, 0x3b, 0x1f, 0x74, 0xbb, 0xf5, 0xe5, 0x13, 0xed, 0xd6, 0x5d, - 0x76, 0xf6, 0x2b, 0x67, 0xb0, 0xb3, 0x37, 0x58, 0xae, 0xa0, 0xc5, 0x39, 0xe1, 0xda, 0xc8, 0x40, - 0xa1, 0x63, 0x57, 0x7c, 0x79, 0x04, 0x10, 0xfb, 0x89, 0x39, 0x83, 0x9e, 0x81, 0x6d, 0xd7, 0x1e, - 0x3a, 0xb0, 0x8d, 0x8a, 0xe7, 0x18, 0xce, 0x92, 0x4e, 0xe5, 0x85, 0x78, 0x8e, 0xc1, 0x58, 0xc7, - 0x49, 0x5a, 0xad, 0x9f, 0x3c, 0x37, 0xab, 0xf5, 0xe4, 0x05, 0x58, 0xad, 0x9f, 0x3a, 0xb5, 0xd5, - 0xfa, 0x03, 0xb8, 0xd4, 0xf6, 0x6b, 0xf3, 0x6e, 0x18, 0x74, 0xd8, 0x3d, 0x85, 0x72, 0xa7, 0x56, - 0x27, 0x11, 0x33, 0x7b, 0x0f, 0xdd, 0xbc, 0xa9, 0x37, 0xb2, 0xcd, 0x16, 0xf2, 0xf4, 0xde, 0xcb, - 0xdb, 0x24, 0xe2, 0x1f, 0x33, 0x59, 0x8b, 0x1d, 0x98, 0x58, 0x08, 0x54, 0x4a, 0x21, 0x4e, 0xe3, - 0xa3, 0x1b, 0xcd, 0x9f, 0xbd, 0x18, 0xa3, 0xf9, 0x67, 0xa0, 0x10, 0x36, 0x3a, 0x51, 0xcd, 0xdf, - 0xf7, 0x98, 0x67, 0xa4, 0xa8, 0x9e, 0xe8, 0x2c, 0x54, 0x04, 0xfc, 0xfe, 0xd1, 0xd4, 0xb8, 0xfc, - 0xad, 0x99, 0x14, 0x04, 0x04, 0xfd, 0x7a, 0x8f, 0x48, 0x6c, 0xfb, 0x3c, 0x23, 0xb1, 0xaf, 0x9d, - 0x29, 0x0a, 0x3b, 0xcd, 0x33, 0xf0, 0xdc, 0x0f, 0x9d, 0x67, 0xe0, 0x57, 0x2d, 0x18, 0xd9, 0xd3, - 0xed, 0x37, 0xc2, 0x7b, 0x91, 0x81, 0x17, 0xd5, 0x30, 0x0b, 0x95, 0x6d, 0x2a, 0xec, 0x0c, 0xd0, - 0xfd, 0x24, 0x00, 0x9b, 0x2d, 0x49, 0xf1, 0xf0, 0x3e, 0xff, 0xb8, 0x3c, 0xbc, 0x1f, 0x30, 0x61, - 0x26, 0x83, 0xaf, 0x98, 0x4b, 0x23, 0xdb, 0x00, 0x2f, 0x29, 0x18, 0x55, 0x7c, 0x97, 0xce, 0x0f, - 0x7d, 0xc5, 0x82, 0x71, 0x79, 0x38, 0x13, 0xf6, 0xd7, 0x50, 0x84, 0xa8, 0x64, 0x79, 0x26, 0x64, - 0x31, 0x8e, 0x5b, 0x09, 0x3e, 0xb8, 0x8b, 0x33, 0x15, 0xed, 0x2a, 0x22, 0xa0, 0x1e, 0xb2, 0x48, - 0x2c, 0xa1, 0xc8, 0xcc, 0xc6, 0x60, 0xac, 0xe3, 0x3c, 0xba, 0x93, 0xe7, 0x0f, 0x11, 0x8c, 0x26, - 0x1e, 0x4c, 0xfd, 0xb8, 0x99, 0xa5, 0xf4, 0x7a, 0x32, 0x55, 0xe4, 0x88, 0xc4, 0x37, 0xd2, 0x45, - 0x1a, 0xf9, 0x1c, 0x73, 0xe7, 0x9a, 0xcf, 0xb1, 0xef, 0x62, 0xf2, 0x39, 0x8e, 0x9f, 0x47, 0x3e, - 0xc7, 0x89, 0x33, 0xe5, 0x73, 0xd4, 0xf2, 0x69, 0xf6, 0x3f, 0x20, 0x9f, 0xe6, 0x2c, 0x8c, 0xc9, - 0xa0, 0x59, 0x22, 0x12, 0xf5, 0x71, 0x7b, 0xf9, 0x35, 0x51, 0x65, 0x6c, 0xce, 0x2c, 0xc6, 0x49, - 0x7c, 0xf4, 0x91, 0x05, 0x79, 0x8f, 0xd5, 0x1c, 0xc8, 0x2a, 0x45, 0xb5, 0x39, 0xb5, 0xd8, 0x79, - 0x47, 0x24, 0x86, 0x96, 0x61, 0x42, 0x79, 0x06, 0xbb, 0x2f, 0x7f, 0x60, 0xde, 0x02, 0xf4, 0x16, - 0x94, 0xfc, 0x9d, 0x9d, 0xa6, 0xef, 0xd4, 0xe2, 0xa4, 0x93, 0xd2, 0xa0, 0xcf, 0x2f, 0x3d, 0xa8, - 0xa4, 0x5b, 0x1b, 0x3d, 0xf0, 0x70, 0x4f, 0x0a, 0xf4, 0xc0, 0x3a, 0x16, 0x46, 0x7e, 0x40, 0x6a, - 0xf1, 0xe1, 0xba, 0xc8, 0xfa, 0x4c, 0x32, 0xef, 0x73, 0xc5, 0xe4, 0xc3, 0x7b, 0xaf, 0x3e, 0x4a, - 0xa2, 0x14, 0x27, 0x9b, 0x85, 0x02, 0xb8, 0xda, 0x4e, 0x3b, 0xdb, 0x87, 0x22, 0xd4, 0xf7, 0x24, - 0x0b, 0x83, 0x5c, 0xba, 0x57, 0x53, 0xad, 0x03, 0x21, 0xee, 0x41, 0x59, 0x4f, 0x47, 0x59, 0xb8, - 0x98, 0x74, 0x94, 0xe6, 0x33, 0xc7, 0x23, 0x17, 0xfe, 0xcc, 0x31, 0xfa, 0x3f, 0xa9, 0x99, 0x53, - 0xf9, 0x91, 0xb8, 0x9e, 0xf9, 0x9c, 0xf8, 0xa1, 0xcb, 0x9e, 0xfa, 0xf7, 0x2c, 0x98, 0xe4, 0x33, - 0x2f, 0xa9, 0x88, 0xb1, 0x07, 0xe4, 0x47, 0xcf, 0xc5, 0xe7, 0xc3, 0xdc, 0xdf, 0x15, 0x83, 0x2b, - 0x73, 0x45, 0x9c, 0xd0, 0x12, 0xf4, 0xcb, 0x29, 0xea, 0xdf, 0x58, 0x56, 0x46, 0xa6, 0xf4, 0xac, - 0x9b, 0x97, 0x8e, 0x4f, 0xa3, 0xf1, 0xfd, 0x83, 0x9e, 0x36, 0x30, 0xc4, 0x9a, 0xf7, 0x97, 0xce, - 0xc9, 0x06, 0xa6, 0xa7, 0x06, 0x3d, 0x8b, 0x25, 0x6c, 0xf2, 0xe7, 0x44, 0x6e, 0xf2, 0x9e, 0x19, - 0xf4, 0xb7, 0xcd, 0x57, 0x71, 0x57, 0xb3, 0xcc, 0x1f, 0xac, 0xa7, 0xf2, 0xff, 0xab, 0x16, 0x5c, - 0x4e, 0x13, 0x92, 0x29, 0x4d, 0xfa, 0x9c, 0xd9, 0xa4, 0x0c, 0x95, 0x34, 0xbd, 0x41, 0xd9, 0x24, - 0x4d, 0xfd, 0x5e, 0x51, 0xf3, 0x3c, 0x44, 0xa4, 0x7d, 0x8e, 0xaf, 0xa7, 0x8f, 0xfc, 0xff, 0xd7, - 0xd3, 0x2f, 0x22, 0x01, 0xbb, 0xf1, 0x0e, 0x7a, 0xfe, 0x71, 0xbd, 0x83, 0x3e, 0xf0, 0x30, 0xef, - 0xa0, 0x0f, 0x3e, 0xb6, 0x77, 0xd0, 0x0b, 0xa7, 0x7c, 0x07, 0xbd, 0xf8, 0x43, 0xfa, 0x0e, 0xfa, - 0x6f, 0xa8, 0xc7, 0xcd, 0xb9, 0x32, 0xf0, 0x7a, 0xb6, 0xa9, 0x28, 0xff, 0xdf, 0x7b, 0xe1, 0xfc, - 0x8f, 0x73, 0x30, 0xa6, 0xb6, 0x6e, 0x27, 0xdc, 0xad, 0x90, 0xe8, 0x02, 0xc2, 0x26, 0xf6, 0x8d, - 0xb0, 0x89, 0x2c, 0x2d, 0x55, 0xbc, 0x0b, 0x3d, 0x83, 0x54, 0xbe, 0x90, 0x08, 0x52, 0xb9, 0x97, - 0x3d, 0xeb, 0x93, 0x63, 0x55, 0xfe, 0x9b, 0x05, 0x97, 0x12, 0x35, 0x2e, 0xc0, 0x91, 0xbf, 0x67, - 0x3a, 0xf2, 0x5f, 0xcb, 0xbc, 0xd7, 0x3d, 0xfc, 0xf9, 0xbf, 0x99, 0xeb, 0xea, 0x2d, 0xd3, 0x0b, - 0x7f, 0xd6, 0x92, 0x0f, 0xe4, 0x5b, 0x59, 0x7b, 0xea, 0x34, 0x36, 0xd3, 0xec, 0x8d, 0x7c, 0xbe, - 0x5a, 0x53, 0xdf, 0xcd, 0x9f, 0xfc, 0x19, 0x0b, 0x20, 0x46, 0x7a, 0x5c, 0x2a, 0x8c, 0xfd, 0x3b, - 0x39, 0xb8, 0x92, 0x3a, 0x8d, 0xd0, 0x97, 0xd5, 0x21, 0x9f, 0x0f, 0xd4, 0xf6, 0x39, 0xcd, 0x57, - 0xfd, 0xac, 0x3f, 0x62, 0x9c, 0xf5, 0xc5, 0x11, 0xff, 0x71, 0x29, 0xa0, 0x22, 0x4b, 0xb1, 0x36, - 0x58, 0xff, 0xdd, 0x82, 0xf1, 0xe4, 0x61, 0xe3, 0x02, 0x44, 0xd6, 0x81, 0x21, 0xb2, 0xee, 0x66, - 0x6f, 0x5c, 0xef, 0x19, 0xe5, 0xf5, 0xc7, 0x5a, 0x78, 0x9b, 0x44, 0xbe, 0x00, 0x99, 0xb1, 0x6f, - 0xca, 0x0c, 0x9c, 0x7d, 0x8f, 0x7b, 0x08, 0x8d, 0x77, 0x20, 0xcd, 0xbf, 0x70, 0xba, 0x2c, 0x27, - 0x46, 0x88, 0x7a, 0xee, 0xd4, 0x21, 0xea, 0xbf, 0x90, 0xeb, 0x1e, 0x62, 0x26, 0xa8, 0x3e, 0xa4, - 0xaa, 0x99, 0x76, 0xda, 0xcd, 0x2e, 0x11, 0x84, 0x71, 0xb6, 0x56, 0x6d, 0x34, 0x4e, 0xd6, 0x06, - 0x67, 0xf4, 0x76, 0xdc, 0x12, 0xfa, 0xa5, 0x1e, 0x98, 0x51, 0xa8, 0xd7, 0x34, 0x67, 0xf6, 0xed, - 0x7b, 0x1a, 0x25, 0x66, 0x69, 0x37, 0x68, 0xdb, 0x23, 0x30, 0xf4, 0x86, 0xdb, 0x56, 0xae, 0x81, - 0xe9, 0x6f, 0x7e, 0xf7, 0xfa, 0x13, 0xbf, 0xff, 0xdd, 0xeb, 0x4f, 0x7c, 0xfb, 0xbb, 0xd7, 0x9f, - 0xf8, 0xe2, 0xf1, 0x75, 0xeb, 0x9b, 0xc7, 0xd7, 0xad, 0xdf, 0x3f, 0xbe, 0x6e, 0x7d, 0xfb, 0xf8, - 0xba, 0xf5, 0x1f, 0x8f, 0xaf, 0x5b, 0x7f, 0xed, 0x3f, 0x5d, 0x7f, 0xe2, 0x8d, 0x82, 0xec, 0xdb, - 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x36, 0x6f, 0xeb, 0x4f, 0x97, 0xaa, 0x00, 0x00, + // 9035 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x6d, 0x6c, 0x24, 0xc9, + 0x75, 0xd8, 0xf5, 0x90, 0x43, 0xce, 0x3c, 0x92, 0x4b, 0x6e, 0xed, 0xd7, 0x1c, 0x6f, 0x6f, 0xb9, + 0xee, 0xf3, 0x5d, 0x6e, 0xed, 0x13, 0xe9, 0xdb, 0x95, 0x92, 0x8b, 0x84, 0xc8, 0xe2, 0x90, 0xcb, + 0x25, 0x8f, 0x9f, 0x57, 0xc3, 0xdd, 0x8d, 0xee, 0x2e, 0xb2, 0x9a, 0x33, 0xc5, 0x99, 0x3e, 0xce, + 0x74, 0xcf, 0x75, 0xf7, 0xf0, 0xe3, 0x3e, 0x24, 0x45, 0xfe, 0xd0, 0x5d, 0x2c, 0xc7, 0xf9, 0x70, + 0x6c, 0x59, 0x49, 0x00, 0xc3, 0xb1, 0x62, 0xc3, 0x31, 0x12, 0x08, 0xc8, 0x2f, 0xe7, 0x6f, 0x10, + 0x28, 0x48, 0x90, 0x38, 0xb0, 0x12, 0x0b, 0x48, 0x42, 0x45, 0x4c, 0xe2, 0x1f, 0x09, 0x1c, 0x04, + 0x46, 0x24, 0x0b, 0x9b, 0xfc, 0x08, 0xea, 0xb3, 0xab, 0x7a, 0x7a, 0xb8, 0xc3, 0xdd, 0x26, 0xf7, + 0x10, 0xe7, 0xdf, 0xcc, 0xab, 0x57, 0xef, 0x55, 0x55, 0x57, 0xbd, 0x7a, 0xf5, 0xde, 0xab, 0x57, + 0xb0, 0x51, 0x77, 0xa3, 0x46, 0x67, 0x6b, 0xba, 0xea, 0xb7, 0x66, 0x9c, 0xa0, 0xee, 0xb7, 0x03, + 0xff, 0x2d, 0xf6, 0xe3, 0x63, 0x7b, 0x7e, 0xb0, 0xb3, 0xdd, 0xf4, 0xf7, 0xc2, 0x99, 0xdd, 0x5b, + 0x33, 0xed, 0x9d, 0xfa, 0x8c, 0xd3, 0x76, 0xc3, 0x19, 0x09, 0x9d, 0xd9, 0x7d, 0xd9, 0x69, 0xb6, + 0x1b, 0xce, 0xcb, 0x33, 0x75, 0xe2, 0x91, 0xc0, 0x89, 0x48, 0x6d, 0xba, 0x1d, 0xf8, 0x91, 0x8f, + 0x3e, 0x13, 0x53, 0x9c, 0x96, 0x14, 0xd9, 0x8f, 0x9f, 0x52, 0x14, 0xa7, 0x77, 0x6f, 0x4d, 0xb7, + 0x77, 0xea, 0xd3, 0x94, 0xe2, 0xb4, 0x84, 0x4e, 0x4b, 0x8a, 0x93, 0x1f, 0xd3, 0xda, 0x54, 0xf7, + 0xeb, 0xfe, 0x0c, 0x23, 0xbc, 0xd5, 0xd9, 0x66, 0xff, 0xd8, 0x1f, 0xf6, 0x8b, 0x33, 0x9c, 0xb4, + 0x77, 0x5e, 0x09, 0xa7, 0x5d, 0x9f, 0xb6, 0x6f, 0xa6, 0xea, 0x07, 0x64, 0x66, 0xb7, 0xab, 0x51, + 0x93, 0x37, 0x34, 0x9c, 0xb6, 0xdf, 0x74, 0xab, 0x07, 0x33, 0xbb, 0x2f, 0x6f, 0x91, 0xa8, 0xbb, + 0xfd, 0x93, 0x1f, 0x8f, 0x51, 0x5b, 0x4e, 0xb5, 0xe1, 0x7a, 0x24, 0x38, 0x88, 0xfb, 0xdf, 0x22, + 0x91, 0x93, 0xc6, 0x60, 0xa6, 0x57, 0xad, 0xa0, 0xe3, 0x45, 0x6e, 0x8b, 0x74, 0x55, 0xf8, 0xb3, + 0x0f, 0xab, 0x10, 0x56, 0x1b, 0xa4, 0xe5, 0x74, 0xd5, 0xbb, 0xd5, 0xab, 0x5e, 0x27, 0x72, 0x9b, + 0x33, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0xdf, 0x86, 0xa1, 0xd9, 0x96, 0xdf, 0xf1, 0x22, + 0xf4, 0x29, 0xc8, 0xef, 0x3a, 0xcd, 0x0e, 0x29, 0x59, 0xd7, 0xad, 0x17, 0x8b, 0xe5, 0xe7, 0xbf, + 0x75, 0x38, 0xf5, 0xd4, 0xd1, 0xe1, 0x54, 0xfe, 0x1e, 0x05, 0x3e, 0x38, 0x9c, 0xba, 0x48, 0xbc, + 0xaa, 0x5f, 0x73, 0xbd, 0xfa, 0xcc, 0x5b, 0xa1, 0xef, 0x4d, 0xaf, 0x75, 0x5a, 0x5b, 0x24, 0xc0, + 0xbc, 0x8e, 0xfd, 0xfb, 0x39, 0x18, 0x9f, 0x0d, 0xaa, 0x0d, 0x77, 0x97, 0x54, 0x22, 0x4a, 0xbf, + 0x7e, 0x80, 0x1a, 0x30, 0x10, 0x39, 0x01, 0x23, 0x37, 0x72, 0x73, 0x75, 0xfa, 0x71, 0x3f, 0xfe, + 0xf4, 0xa6, 0x13, 0x48, 0xda, 0xe5, 0xe1, 0xa3, 0xc3, 0xa9, 0x81, 0x4d, 0x27, 0xc0, 0x94, 0x05, + 0x6a, 0xc2, 0xa0, 0xe7, 0x7b, 0xa4, 0x94, 0x63, 0xac, 0xd6, 0x1e, 0x9f, 0xd5, 0x9a, 0xef, 0xa9, + 0x7e, 0x94, 0x0b, 0x47, 0x87, 0x53, 0x83, 0x14, 0x82, 0x19, 0x17, 0xda, 0xaf, 0x77, 0xdc, 0x76, + 0x69, 0x20, 0xab, 0x7e, 0xbd, 0xee, 0xb6, 0xcd, 0x7e, 0xbd, 0xee, 0xb6, 0x31, 0x65, 0x61, 0x7f, + 0x98, 0x83, 0xe2, 0x6c, 0x50, 0xef, 0xb4, 0x88, 0x17, 0x85, 0xe8, 0x8b, 0x00, 0x6d, 0x27, 0x70, + 0x5a, 0x24, 0x22, 0x41, 0x58, 0xb2, 0xae, 0x0f, 0xbc, 0x38, 0x72, 0x73, 0xf9, 0xf1, 0xd9, 0x6f, + 0x48, 0x9a, 0x65, 0x24, 0x3e, 0x39, 0x28, 0x50, 0x88, 0x35, 0x96, 0xe8, 0x5d, 0x28, 0x3a, 0x41, + 0xe4, 0x6e, 0x3b, 0xd5, 0x28, 0x2c, 0xe5, 0x18, 0xff, 0x57, 0x1f, 0x9f, 0xff, 0xac, 0x20, 0x59, + 0x3e, 0x2f, 0xd8, 0x17, 0x25, 0x24, 0xc4, 0x31, 0x3f, 0xfb, 0x37, 0xf3, 0x50, 0x90, 0x05, 0xe8, + 0x3a, 0x0c, 0x7a, 0x4e, 0x4b, 0x4e, 0xd5, 0x51, 0x51, 0x71, 0x70, 0xcd, 0x69, 0xd1, 0x8f, 0xe4, + 0xb4, 0x08, 0xc5, 0x68, 0x3b, 0x51, 0x83, 0x4d, 0x09, 0x0d, 0x63, 0xc3, 0x89, 0x1a, 0x98, 0x95, + 0xa0, 0xab, 0x30, 0xd8, 0xf2, 0x6b, 0x84, 0x7d, 0xc7, 0x3c, 0xff, 0xc8, 0xab, 0x7e, 0x8d, 0x60, + 0x06, 0xa5, 0xf5, 0xb7, 0x03, 0xbf, 0x55, 0x1a, 0x34, 0xeb, 0x2f, 0x04, 0x7e, 0x0b, 0xb3, 0x12, + 0xf4, 0x35, 0x0b, 0x26, 0x64, 0xf3, 0x56, 0xfc, 0xaa, 0x13, 0xb9, 0xbe, 0x57, 0xca, 0xb3, 0x49, + 0x81, 0xb3, 0x1b, 0x15, 0x49, 0xb9, 0x5c, 0x12, 0x4d, 0x98, 0x48, 0x96, 0xe0, 0xae, 0x56, 0xa0, + 0x9b, 0x00, 0xf5, 0xa6, 0xbf, 0xe5, 0x34, 0xe9, 0x80, 0x94, 0x86, 0x58, 0x17, 0xd4, 0xc7, 0xbd, + 0xa3, 0x4a, 0xb0, 0x86, 0x85, 0xf6, 0x61, 0xd8, 0xe1, 0x0b, 0xb8, 0x34, 0xcc, 0x3a, 0xf1, 0x5a, + 0x16, 0x9d, 0x30, 0x24, 0x42, 0x79, 0xe4, 0xe8, 0x70, 0x6a, 0x58, 0x00, 0xb1, 0x64, 0x87, 0x5e, + 0x82, 0x82, 0xdf, 0xa6, 0xed, 0x76, 0x9a, 0xa5, 0xc2, 0x75, 0xeb, 0xc5, 0x42, 0x79, 0x42, 0xb4, + 0xb5, 0xb0, 0x2e, 0xe0, 0x58, 0x61, 0xa0, 0x1b, 0x30, 0x1c, 0x76, 0xb6, 0xe8, 0x77, 0x2c, 0x15, + 0x59, 0xc7, 0xc6, 0x05, 0xf2, 0x70, 0x85, 0x83, 0xb1, 0x2c, 0x47, 0x9f, 0x80, 0x91, 0x80, 0x54, + 0x3b, 0x41, 0x48, 0xe8, 0x87, 0x2d, 0x01, 0xa3, 0x7d, 0x41, 0xa0, 0x8f, 0xe0, 0xb8, 0x08, 0xeb, + 0x78, 0xe8, 0xd3, 0x70, 0x8e, 0x7e, 0xe0, 0xdb, 0xfb, 0xed, 0x80, 0x84, 0x21, 0xfd, 0xaa, 0x23, + 0x8c, 0xd1, 0x65, 0x51, 0xf3, 0xdc, 0x82, 0x51, 0x8a, 0x13, 0xd8, 0xf6, 0xef, 0x0e, 0x43, 0xd7, + 0x47, 0x42, 0x2f, 0xc3, 0x88, 0xe8, 0xef, 0x8a, 0x5f, 0x0f, 0xd9, 0xc4, 0x2d, 0x94, 0xc7, 0x69, + 0x3b, 0x66, 0x63, 0x30, 0xd6, 0x71, 0x50, 0x0d, 0x72, 0xe1, 0x2d, 0x21, 0xd3, 0x56, 0x1e, 0xff, + 0x63, 0x54, 0x6e, 0xa9, 0x95, 0x36, 0x74, 0x74, 0x38, 0x95, 0xab, 0xdc, 0xc2, 0xb9, 0xf0, 0x16, + 0x95, 0x66, 0x75, 0x37, 0xca, 0x4e, 0x9a, 0xdd, 0x71, 0x23, 0xc5, 0x87, 0x49, 0xb3, 0x3b, 0x6e, + 0x84, 0x29, 0x0b, 0x2a, 0xa5, 0x1b, 0x51, 0xd4, 0x66, 0x4b, 0x2a, 0x13, 0x29, 0xbd, 0xb8, 0xb9, + 0xb9, 0xa1, 0x78, 0xb1, 0x05, 0x4c, 0x21, 0x98, 0x71, 0x41, 0x1f, 0x58, 0x74, 0xc4, 0x79, 0xa1, + 0x1f, 0x1c, 0x88, 0x95, 0x79, 0x37, 0xbb, 0x95, 0xe9, 0x07, 0x07, 0x8a, 0xb9, 0xf8, 0x90, 0xaa, + 0x00, 0xeb, 0xac, 0x59, 0xc7, 0x6b, 0xdb, 0x21, 0x5b, 0x88, 0xd9, 0x74, 0x7c, 0x7e, 0xa1, 0x92, + 0xe8, 0xf8, 0xfc, 0x42, 0x05, 0x33, 0x2e, 0xf4, 0x83, 0x06, 0xce, 0x9e, 0x58, 0xc4, 0x19, 0x7c, + 0x50, 0xec, 0xec, 0x99, 0x1f, 0x14, 0x3b, 0x7b, 0x98, 0xb2, 0xa0, 0x9c, 0xfc, 0x30, 0x64, 0x6b, + 0x36, 0x13, 0x4e, 0xeb, 0x95, 0x8a, 0xc9, 0x69, 0xbd, 0x52, 0xc1, 0x94, 0x05, 0x9b, 0xa4, 0xd5, + 0x90, 0x2d, 0xf8, 0x6c, 0x26, 0xe9, 0x5c, 0x82, 0xd3, 0x9d, 0xb9, 0x0a, 0xa6, 0x2c, 0xec, 0x0f, + 0x2d, 0x18, 0x93, 0x45, 0x54, 0x88, 0x84, 0x68, 0x1f, 0x0a, 0xf2, 0x63, 0x0a, 0x5d, 0x26, 0xcb, + 0x4d, 0x4f, 0x89, 0x3a, 0x09, 0xc1, 0x8a, 0x9b, 0xfd, 0x3b, 0x79, 0x40, 0x0a, 0x4c, 0xda, 0x7e, + 0xe8, 0xb2, 0xe9, 0xf4, 0x08, 0xa2, 0xc4, 0xd3, 0x44, 0xc9, 0xbd, 0x2c, 0x45, 0x49, 0xdc, 0x2c, + 0x43, 0xa8, 0xfc, 0x8d, 0xc4, 0xe2, 0xe3, 0xd2, 0xe5, 0xa7, 0x4e, 0x65, 0xf1, 0x69, 0x4d, 0x38, + 0x7e, 0x19, 0xee, 0x8a, 0x65, 0xc8, 0xe5, 0xcf, 0x5f, 0xcc, 0x76, 0x19, 0x6a, 0xad, 0x48, 0x2e, + 0xc8, 0x80, 0x2f, 0x13, 0x2e, 0x80, 0xee, 0x67, 0xba, 0x4c, 0x34, 0xae, 0xe6, 0x82, 0x09, 0xf8, + 0x82, 0x19, 0xca, 0x8a, 0xa7, 0xb6, 0x60, 0x92, 0x3c, 0xd5, 0xd2, 0x79, 0x1b, 0x2e, 0x75, 0xe3, + 0x60, 0xb2, 0x8d, 0x66, 0xa0, 0x58, 0xf5, 0xbd, 0x6d, 0xb7, 0xbe, 0xea, 0xb4, 0x85, 0xca, 0xa6, + 0x74, 0xbd, 0x39, 0x59, 0x80, 0x63, 0x1c, 0xf4, 0x2c, 0x0c, 0xec, 0x90, 0x03, 0xa1, 0xbb, 0x8d, + 0x08, 0xd4, 0x81, 0x65, 0x72, 0x80, 0x29, 0xfc, 0x93, 0x85, 0xaf, 0xfd, 0xda, 0xd4, 0x53, 0x5f, + 0xfa, 0x0f, 0xd7, 0x9f, 0xb2, 0xff, 0xcd, 0x00, 0x3c, 0x93, 0xca, 0xb3, 0x12, 0x39, 0x51, 0x27, + 0x44, 0xbf, 0x63, 0xc1, 0x25, 0x27, 0xad, 0x5c, 0xac, 0xe4, 0xfb, 0xd9, 0xcd, 0x48, 0x83, 0x7c, + 0xf9, 0x59, 0xd1, 0xe8, 0xf4, 0x11, 0xc1, 0xe9, 0x8d, 0xa2, 0x03, 0x45, 0x95, 0xd7, 0xb0, 0xed, + 0x54, 0x89, 0xe8, 0xbd, 0x1a, 0xa8, 0x35, 0x59, 0x80, 0x63, 0x1c, 0xaa, 0x0c, 0xd5, 0xc8, 0xb6, + 0xd3, 0x69, 0xf2, 0x0d, 0xbc, 0x10, 0x2b, 0x43, 0xf3, 0x1c, 0x8c, 0x65, 0x39, 0xfa, 0x3b, 0x16, + 0xa0, 0x6e, 0xae, 0x62, 0x31, 0x6c, 0x9e, 0xc6, 0x38, 0x94, 0x2f, 0x1f, 0x1d, 0x4e, 0xa5, 0x08, + 0x30, 0x9c, 0xd2, 0x0e, 0xed, 0x9b, 0xfe, 0x0b, 0x0b, 0x2e, 0xa4, 0x2c, 0x73, 0x3a, 0x29, 0x3a, + 0x41, 0x53, 0xcc, 0x1f, 0x35, 0x29, 0xee, 0xe2, 0x15, 0x4c, 0xe1, 0xe8, 0x97, 0x2c, 0x18, 0xd7, + 0x56, 0xfb, 0x6c, 0x47, 0x28, 0xff, 0x19, 0x29, 0xb2, 0x06, 0xe1, 0xf2, 0x15, 0xc1, 0x7e, 0x3c, + 0x51, 0x80, 0x93, 0x4d, 0xb0, 0xbf, 0x67, 0xc1, 0xb3, 0xc7, 0x0a, 0xad, 0xd4, 0x86, 0x5b, 0x4f, + 0xbc, 0xe1, 0x74, 0x6a, 0x05, 0xa4, 0xed, 0xdf, 0xc5, 0x2b, 0x62, 0x26, 0xaa, 0xa9, 0x85, 0x39, + 0x18, 0xcb, 0x72, 0xfb, 0x0f, 0x2c, 0x48, 0xd2, 0x43, 0x0e, 0x9c, 0xeb, 0x84, 0x24, 0xa0, 0x53, + 0xb5, 0x42, 0xaa, 0x01, 0x91, 0x7b, 0xe7, 0xf3, 0xd3, 0xdc, 0x4a, 0x41, 0x1b, 0x3c, 0x5d, 0xf5, + 0x03, 0x32, 0xbd, 0xfb, 0xf2, 0x34, 0xc7, 0x58, 0x26, 0x07, 0x15, 0xd2, 0x24, 0x94, 0x46, 0x19, + 0x51, 0x3d, 0xfb, 0xae, 0x41, 0x00, 0x27, 0x08, 0x52, 0x16, 0x6d, 0x27, 0x0c, 0xf7, 0xfc, 0xa0, + 0x26, 0x58, 0xe4, 0x4e, 0xcc, 0x62, 0xc3, 0x20, 0x80, 0x13, 0x04, 0xed, 0x7f, 0x6a, 0xc1, 0x70, + 0xd9, 0xa9, 0xee, 0xf8, 0xdb, 0xdb, 0xf4, 0x98, 0x52, 0xeb, 0x04, 0xfc, 0x98, 0xc7, 0x27, 0xa1, + 0xda, 0xbb, 0xe7, 0x05, 0x1c, 0x2b, 0x0c, 0xb4, 0x09, 0x43, 0x7c, 0x38, 0x44, 0xa3, 0x7e, 0x42, + 0x6b, 0x94, 0xb2, 0xce, 0xb0, 0x2f, 0xd7, 0x89, 0xdc, 0xe6, 0x34, 0xb7, 0xce, 0x4c, 0x2f, 0x79, + 0xd1, 0x7a, 0x50, 0x89, 0x02, 0xd7, 0xab, 0x97, 0xe1, 0xe8, 0x70, 0x6a, 0x68, 0x81, 0xd1, 0xc0, + 0x82, 0x16, 0x3d, 0xd1, 0xb4, 0x9c, 0x7d, 0xc9, 0x8e, 0xad, 0xf9, 0x62, 0x7c, 0xa2, 0x59, 0x8d, + 0x8b, 0xb0, 0x8e, 0x67, 0x7f, 0x0e, 0xf2, 0x73, 0x4e, 0xb5, 0x41, 0xd0, 0xdd, 0xa4, 0x24, 0x1e, + 0xb9, 0xf9, 0x62, 0xda, 0x68, 0x29, 0xa9, 0xac, 0x0f, 0xd8, 0x58, 0x2f, 0x79, 0x6d, 0x7f, 0xdf, + 0x82, 0x2b, 0x73, 0xcd, 0x4e, 0x18, 0x91, 0xe0, 0xbe, 0x98, 0x82, 0x9b, 0xa4, 0xd5, 0x6e, 0x3a, + 0x11, 0x41, 0x9f, 0x87, 0x42, 0x8b, 0x44, 0x4e, 0xcd, 0x89, 0x1c, 0xc1, 0xb1, 0xf7, 0x50, 0xb0, + 0x49, 0x4c, 0xb1, 0x69, 0x1b, 0xd6, 0xb7, 0xde, 0x22, 0xd5, 0x68, 0x95, 0x44, 0x4e, 0x7c, 0x76, + 0x8d, 0x61, 0x58, 0x51, 0x45, 0xfb, 0x30, 0x18, 0xb6, 0x49, 0x35, 0x3b, 0xf5, 0x26, 0xd9, 0x87, + 0x4a, 0x9b, 0x54, 0x63, 0x13, 0x00, 0xfd, 0x87, 0x19, 0x47, 0xfb, 0x7f, 0x5b, 0xf0, 0x4c, 0x8f, + 0x7e, 0xaf, 0xb8, 0x61, 0x84, 0xde, 0xec, 0xea, 0xfb, 0x74, 0x7f, 0x7d, 0xa7, 0xb5, 0x59, 0xcf, + 0xd5, 0x14, 0x93, 0x10, 0xad, 0xdf, 0x5f, 0x80, 0xbc, 0x1b, 0x91, 0x96, 0x34, 0xc5, 0x7c, 0xf6, + 0xf1, 0x3b, 0xde, 0xa3, 0x2f, 0xe5, 0x31, 0x69, 0x0b, 0x5c, 0xa2, 0xfc, 0x30, 0x67, 0x6b, 0xff, + 0x73, 0x0b, 0xe8, 0x74, 0xa8, 0xb9, 0xe2, 0x80, 0x3b, 0x18, 0x1d, 0xb4, 0xa5, 0x49, 0x46, 0xee, + 0x7f, 0x83, 0x9b, 0x07, 0x6d, 0xf2, 0xe0, 0x70, 0x6a, 0x4c, 0x21, 0x52, 0x00, 0x66, 0xa8, 0xe8, + 0x73, 0x30, 0x14, 0xb2, 0x7d, 0x5a, 0x48, 0x98, 0x05, 0x51, 0x69, 0x88, 0xef, 0xde, 0x0f, 0x0e, + 0xa7, 0xfa, 0xb2, 0xb8, 0x4e, 0x2b, 0xda, 0xbc, 0x1e, 0x16, 0x54, 0xa9, 0x08, 0x6b, 0x91, 0x30, + 0x74, 0xea, 0x44, 0xac, 0x14, 0x25, 0xc2, 0x56, 0x39, 0x18, 0xcb, 0x72, 0xfb, 0x6f, 0x59, 0x40, + 0x9b, 0x18, 0x39, 0x94, 0xc5, 0x9a, 0x5f, 0x23, 0x68, 0x8d, 0x2d, 0x15, 0x0e, 0x10, 0x1f, 0xef, + 0xd9, 0x1e, 0x4b, 0x85, 0x23, 0x19, 0x3a, 0x0d, 0x07, 0xe1, 0x98, 0x04, 0xfa, 0x38, 0x8c, 0xd6, + 0x48, 0x9b, 0x78, 0x35, 0xe2, 0x55, 0x5d, 0xc2, 0x3f, 0x5a, 0xb1, 0x3c, 0x71, 0x74, 0x38, 0x35, + 0x3a, 0xaf, 0xc1, 0xb1, 0x81, 0x65, 0xff, 0x89, 0x05, 0x17, 0x15, 0xb9, 0x0a, 0x89, 0xd4, 0xb2, + 0xfa, 0x69, 0x0b, 0x40, 0x11, 0xa7, 0x3a, 0x2d, 0x9d, 0x02, 0xeb, 0x19, 0x4c, 0x01, 0x7d, 0x10, + 0xe2, 0x85, 0xa7, 0xc0, 0x21, 0xd6, 0xd8, 0xa2, 0xcf, 0xc2, 0xe8, 0xae, 0xdf, 0xec, 0xb4, 0xc8, + 0xaa, 0xdf, 0xf1, 0xa2, 0xb0, 0x34, 0xc0, 0x9a, 0x31, 0x95, 0x36, 0x4e, 0xf7, 0x62, 0xbc, 0xf2, + 0x45, 0x41, 0x76, 0x54, 0x03, 0x86, 0xd8, 0x20, 0x65, 0x7f, 0x16, 0x18, 0x53, 0xd7, 0xeb, 0x90, + 0x75, 0x0f, 0x3d, 0x07, 0x79, 0x12, 0x04, 0x7e, 0x20, 0x4e, 0x3b, 0x6a, 0x42, 0xde, 0xa6, 0x40, + 0xcc, 0xcb, 0xd0, 0x0b, 0x54, 0xe6, 0xba, 0x4d, 0x52, 0x63, 0xf3, 0xa9, 0x50, 0x3e, 0x27, 0xe7, + 0xd3, 0x02, 0x83, 0x62, 0x51, 0x6a, 0x4f, 0xc3, 0xf0, 0x1c, 0x65, 0x42, 0x02, 0x4a, 0x57, 0x37, + 0x7a, 0x8f, 0x19, 0x46, 0x6f, 0x69, 0xdc, 0xde, 0x84, 0x4b, 0x73, 0x01, 0xa1, 0x82, 0xe0, 0x56, + 0xb9, 0x53, 0xdd, 0x21, 0x11, 0x37, 0x4b, 0x85, 0xe8, 0x53, 0x30, 0xe6, 0x33, 0x89, 0xb4, 0xe2, + 0x57, 0x77, 0x5c, 0xaf, 0x2e, 0x94, 0xb0, 0x4b, 0x82, 0xca, 0xd8, 0xba, 0x5e, 0x88, 0x4d, 0x5c, + 0xfb, 0xbf, 0xe4, 0x60, 0x74, 0x2e, 0xf0, 0x3d, 0xb9, 0xda, 0xce, 0x40, 0x52, 0x46, 0x86, 0xa4, + 0xcc, 0xc0, 0x4a, 0xa9, 0xb7, 0xbf, 0x97, 0x94, 0x44, 0xef, 0xa9, 0x65, 0x3e, 0x90, 0x95, 0xb2, + 0x69, 0xf0, 0x65, 0xb4, 0xe3, 0x8f, 0x6d, 0x0a, 0x01, 0xfb, 0xbf, 0x5a, 0x30, 0xa1, 0xa3, 0x9f, + 0x81, 0x60, 0x0e, 0x4d, 0xc1, 0xbc, 0x96, 0x6d, 0x7f, 0x7b, 0x48, 0xe3, 0x0f, 0x87, 0xcc, 0x7e, + 0xd2, 0x0f, 0x80, 0xbe, 0x66, 0xc1, 0xe8, 0x9e, 0x06, 0x10, 0x9d, 0x5d, 0xcb, 0x6e, 0x8f, 0x64, + 0x5f, 0xfd, 0x47, 0xe5, 0x7a, 0xd6, 0xa1, 0x0f, 0x12, 0xff, 0xb1, 0xd1, 0x12, 0xaa, 0x4e, 0x85, + 0xd5, 0x06, 0xa9, 0x75, 0x9a, 0xf2, 0xa8, 0xa3, 0x86, 0xb4, 0x22, 0xe0, 0x58, 0x61, 0xa0, 0x37, + 0xe1, 0x7c, 0xd5, 0xf7, 0xaa, 0x9d, 0x20, 0x20, 0x5e, 0xf5, 0x60, 0x83, 0xf9, 0xe9, 0x84, 0x50, + 0x9f, 0x16, 0xd5, 0xce, 0xcf, 0x25, 0x11, 0x1e, 0xa4, 0x01, 0x71, 0x37, 0x21, 0x6e, 0x53, 0x0e, + 0xa9, 0xd8, 0x65, 0xe7, 0xa1, 0x82, 0x6e, 0x53, 0x66, 0x60, 0x2c, 0xcb, 0xd1, 0x5d, 0xb8, 0x12, + 0x46, 0x54, 0x57, 0xf6, 0xea, 0xf3, 0xc4, 0xa9, 0x35, 0x5d, 0x8f, 0xaa, 0xa3, 0xbe, 0x57, 0xe3, + 0x07, 0xfc, 0x81, 0xf2, 0x33, 0x47, 0x87, 0x53, 0x57, 0x2a, 0xe9, 0x28, 0xb8, 0x57, 0x5d, 0xf4, + 0x39, 0x98, 0x0c, 0x3b, 0xd5, 0x2a, 0x09, 0xc3, 0xed, 0x4e, 0xf3, 0x55, 0x7f, 0x2b, 0x5c, 0x74, + 0x43, 0xaa, 0x4b, 0xaf, 0xb8, 0x2d, 0x37, 0x62, 0xc7, 0xf8, 0x7c, 0xf9, 0xda, 0xd1, 0xe1, 0xd4, + 0x64, 0xa5, 0x27, 0x16, 0x3e, 0x86, 0x02, 0xc2, 0x70, 0x99, 0x0b, 0xbf, 0x2e, 0xda, 0xc3, 0x8c, + 0xf6, 0xe4, 0xd1, 0xe1, 0xd4, 0xe5, 0x85, 0x54, 0x0c, 0xdc, 0xa3, 0x26, 0xfd, 0x82, 0x91, 0xdb, + 0x22, 0xef, 0xf8, 0x1e, 0x61, 0x36, 0x40, 0xed, 0x0b, 0x6e, 0x0a, 0x38, 0x56, 0x18, 0xe8, 0xad, + 0x78, 0x26, 0xd2, 0xe5, 0x22, 0x6c, 0x79, 0x27, 0x97, 0x70, 0x17, 0x8f, 0x0e, 0xa7, 0x26, 0xee, + 0x6b, 0x94, 0xe8, 0x92, 0xc3, 0x06, 0x6d, 0xfb, 0xf7, 0x73, 0x80, 0xba, 0x45, 0x04, 0x5a, 0x86, + 0x21, 0xa7, 0x1a, 0xb9, 0xbb, 0x44, 0x38, 0xcf, 0x9e, 0x4b, 0xdb, 0xa7, 0x38, 0x2b, 0x4c, 0xb6, + 0x09, 0x9d, 0x21, 0x24, 0x96, 0x2b, 0xb3, 0xac, 0x2a, 0x16, 0x24, 0x90, 0x0f, 0xe7, 0x9b, 0x4e, + 0x18, 0xc9, 0xb9, 0x5a, 0xa3, 0x5d, 0x16, 0x82, 0xf5, 0xc7, 0xfa, 0xeb, 0x14, 0xad, 0x51, 0xbe, + 0x44, 0x67, 0xee, 0x4a, 0x92, 0x10, 0xee, 0xa6, 0x8d, 0xbe, 0xc8, 0x36, 0x7c, 0xae, 0xe8, 0xc8, + 0x9d, 0x76, 0x39, 0x93, 0x0d, 0x9f, 0xd3, 0x34, 0x36, 0x7b, 0xc1, 0x06, 0x6b, 0x2c, 0xed, 0x7f, + 0x09, 0x30, 0x3c, 0x3f, 0x7b, 0x67, 0xd3, 0x09, 0x77, 0xfa, 0x70, 0xc0, 0xd1, 0xd9, 0x21, 0x94, + 0x95, 0xe4, 0xfa, 0x96, 0x4a, 0x0c, 0x56, 0x18, 0xc8, 0x83, 0x21, 0xd7, 0xa3, 0x0b, 0xa2, 0x74, + 0x2e, 0x2b, 0x13, 0xab, 0xd2, 0x5e, 0xd9, 0x41, 0x6a, 0x89, 0x51, 0xc7, 0x82, 0x0b, 0x7a, 0x0f, + 0x8a, 0x8e, 0x74, 0xac, 0x8a, 0x6d, 0x69, 0x39, 0x8b, 0xd3, 0xb6, 0x20, 0xa9, 0xfb, 0x32, 0x05, + 0x08, 0xc7, 0x0c, 0xd1, 0x97, 0x2c, 0x18, 0x91, 0x5d, 0xc7, 0x64, 0x5b, 0x18, 0x61, 0x56, 0xb3, + 0xeb, 0x33, 0x26, 0xdb, 0xdc, 0x18, 0xaa, 0x01, 0xb0, 0xce, 0xb2, 0x4b, 0x1d, 0xcd, 0xf7, 0xa3, + 0x8e, 0xa2, 0x3d, 0x28, 0xee, 0xb9, 0x51, 0x83, 0x6d, 0x3c, 0xa5, 0x21, 0x36, 0x05, 0x17, 0x1e, + 0xbf, 0xd5, 0x94, 0x5c, 0x3c, 0x62, 0xf7, 0x25, 0x03, 0x1c, 0xf3, 0x42, 0x33, 0x9c, 0x31, 0x73, + 0x4c, 0x33, 0x91, 0x55, 0x34, 0x2b, 0xb0, 0x02, 0x1c, 0xe3, 0xd0, 0x21, 0x1e, 0xa5, 0xff, 0x2a, + 0xe4, 0xed, 0x0e, 0x5d, 0xc7, 0xc2, 0x4b, 0x91, 0xc1, 0xbc, 0x92, 0x14, 0xf9, 0x60, 0xdd, 0xd7, + 0x78, 0x60, 0x83, 0x23, 0x5d, 0x23, 0x7b, 0x0d, 0xe2, 0x09, 0x37, 0xa5, 0x5a, 0x23, 0xf7, 0x1b, + 0xc4, 0xc3, 0xac, 0x04, 0xbd, 0xc7, 0x75, 0x78, 0xae, 0xe3, 0x32, 0xff, 0x64, 0x26, 0x9e, 0xbe, + 0x58, 0x6f, 0x2e, 0x9f, 0x93, 0xca, 0x3b, 0xff, 0x8f, 0x35, 0x7e, 0x54, 0x5d, 0xf6, 0xbd, 0xdb, + 0xfb, 0x6e, 0x24, 0xfc, 0x9b, 0x4a, 0xd2, 0xad, 0x33, 0x28, 0x16, 0xa5, 0xdc, 0xc8, 0x48, 0x27, + 0x41, 0x58, 0x1a, 0x35, 0x8f, 0x51, 0x7c, 0xa6, 0x84, 0x58, 0x96, 0xa3, 0xbf, 0x6b, 0x41, 0xbe, + 0xe1, 0xfb, 0x3b, 0x61, 0x69, 0x8c, 0x4d, 0x8e, 0x0c, 0x54, 0x3d, 0x21, 0x71, 0xa6, 0x17, 0x29, + 0xd9, 0xdb, 0x5e, 0x14, 0x1c, 0x94, 0x5f, 0x96, 0x0a, 0x10, 0x83, 0x3d, 0x38, 0x9c, 0x3a, 0xb7, + 0xe2, 0x6e, 0x93, 0xea, 0x41, 0xb5, 0x49, 0x18, 0xe4, 0xcb, 0xdf, 0xd5, 0x20, 0xb7, 0x77, 0x89, + 0x17, 0x61, 0xde, 0xaa, 0xc9, 0x0f, 0x2d, 0x80, 0x98, 0x10, 0x9a, 0xe0, 0x76, 0x66, 0x26, 0xc4, + 0x98, 0x69, 0x19, 0x11, 0x79, 0x1e, 0xe0, 0x92, 0x3c, 0x83, 0x03, 0x95, 0xd1, 0x34, 0x71, 0xa2, + 0xf8, 0x64, 0xee, 0x15, 0xcb, 0xfe, 0xd7, 0x16, 0x8c, 0xd0, 0xce, 0x49, 0x11, 0xf8, 0x02, 0x0c, + 0x45, 0x4e, 0x50, 0x17, 0x96, 0x32, 0xed, 0x73, 0x6c, 0x32, 0x28, 0x16, 0xa5, 0xc8, 0x83, 0x7c, + 0xe4, 0x84, 0x3b, 0x52, 0xbb, 0x5c, 0xca, 0x6c, 0x88, 0x63, 0xc5, 0x92, 0xfe, 0x0b, 0x31, 0x67, + 0x83, 0x5e, 0x84, 0x02, 0x55, 0x00, 0x16, 0x9c, 0x50, 0x1a, 0x99, 0x47, 0xa9, 0x10, 0x5f, 0x10, + 0x30, 0xac, 0x4a, 0xed, 0xbf, 0x99, 0x83, 0xc1, 0x79, 0x7e, 0xce, 0x18, 0x0a, 0xfd, 0x4e, 0x50, + 0x25, 0x42, 0xdf, 0xcc, 0x60, 0x4e, 0x53, 0xba, 0x15, 0x46, 0x53, 0xd3, 0xf4, 0xd9, 0x7f, 0x2c, + 0x78, 0xa1, 0x5f, 0xb2, 0xe0, 0x5c, 0x14, 0x38, 0x5e, 0xb8, 0xed, 0x07, 0x2d, 0x6e, 0x20, 0xcb, + 0x65, 0x35, 0x0b, 0x37, 0x0d, 0xba, 0x95, 0x88, 0xb4, 0xe3, 0x70, 0x00, 0xb3, 0x0c, 0x27, 0xda, + 0x60, 0xff, 0x8a, 0x05, 0x10, 0xb7, 0x1e, 0x7d, 0x60, 0xc1, 0x98, 0xa3, 0x3b, 0x18, 0xc5, 0x18, + 0xad, 0x67, 0x67, 0xec, 0x65, 0x64, 0xcb, 0xe7, 0xe9, 0x09, 0xd4, 0x00, 0x61, 0x93, 0xb1, 0xfd, + 0x09, 0xc8, 0xb3, 0xd5, 0xc1, 0x74, 0x71, 0x61, 0xe5, 0x4b, 0x9a, 0x36, 0xa5, 0xf5, 0x0f, 0x2b, + 0x0c, 0xfb, 0x4d, 0x38, 0x77, 0x7b, 0x9f, 0x54, 0x3b, 0x91, 0x1f, 0x70, 0x6b, 0x20, 0x7a, 0x15, + 0x50, 0x48, 0x82, 0x5d, 0xb7, 0x4a, 0x66, 0xab, 0x55, 0x7a, 0xb2, 0x5e, 0x8b, 0x75, 0x83, 0x49, + 0x41, 0x09, 0x55, 0xba, 0x30, 0x70, 0x4a, 0x2d, 0xfb, 0xb7, 0x2d, 0x18, 0xd1, 0xbc, 0x4d, 0x74, + 0xa7, 0xae, 0xcf, 0x55, 0xf8, 0xb9, 0x5b, 0x0c, 0xd5, 0x72, 0x26, 0xfe, 0x2c, 0x4e, 0x32, 0xde, + 0x46, 0x14, 0x08, 0xc7, 0x0c, 0x1f, 0xe2, 0x89, 0xb2, 0xff, 0x99, 0x05, 0x97, 0x52, 0x5d, 0x63, + 0x4f, 0xb8, 0xd9, 0x33, 0x50, 0xdc, 0x21, 0x07, 0x0b, 0x6c, 0x0e, 0x26, 0x1d, 0x49, 0xcb, 0xb2, + 0x00, 0xc7, 0x38, 0xf6, 0x37, 0x2d, 0x88, 0x29, 0x51, 0x51, 0xb4, 0x15, 0xb7, 0x5c, 0x13, 0x45, + 0x82, 0x93, 0x28, 0x45, 0xef, 0xc1, 0x15, 0xf3, 0x0b, 0x32, 0x73, 0xf1, 0xc9, 0x4d, 0xf1, 0xfc, + 0xcc, 0x94, 0x4e, 0x09, 0xf7, 0x62, 0x61, 0xdf, 0x83, 0xfc, 0x1d, 0xa7, 0x53, 0x27, 0x7d, 0x19, + 0x71, 0xa8, 0x18, 0x0b, 0x88, 0xd3, 0x8c, 0xa4, 0x9a, 0x2e, 0xc4, 0x18, 0x16, 0x30, 0xac, 0x4a, + 0xed, 0xef, 0x0f, 0xc2, 0x88, 0x16, 0xc5, 0x42, 0xf7, 0xf1, 0x80, 0xb4, 0xfd, 0xa4, 0xae, 0x4b, + 0x3f, 0x36, 0x66, 0x25, 0x74, 0xfd, 0x04, 0x64, 0xd7, 0x0d, 0xb9, 0xc8, 0x31, 0xd6, 0x0f, 0x16, + 0x70, 0xac, 0x30, 0xd0, 0x14, 0xe4, 0x6b, 0xa4, 0x1d, 0x35, 0x98, 0x34, 0x1d, 0x2c, 0x17, 0x69, + 0x53, 0xe7, 0x29, 0x00, 0x73, 0x38, 0x45, 0xd8, 0x26, 0x51, 0xb5, 0xc1, 0xac, 0x7a, 0x45, 0x8e, + 0xb0, 0x40, 0x01, 0x98, 0xc3, 0x53, 0x9c, 0x2b, 0xf9, 0xd3, 0x77, 0xae, 0x0c, 0x65, 0xec, 0x5c, + 0x41, 0x6d, 0xb8, 0x10, 0x86, 0x8d, 0x8d, 0xc0, 0xdd, 0x75, 0x22, 0x12, 0xcf, 0x9c, 0xe1, 0x93, + 0xf0, 0xb9, 0x72, 0x74, 0x38, 0x75, 0xa1, 0x52, 0x59, 0x4c, 0x52, 0xc1, 0x69, 0xa4, 0x51, 0x05, + 0x2e, 0xb9, 0x5e, 0x48, 0xaa, 0x9d, 0x80, 0x2c, 0xd5, 0x3d, 0x3f, 0x20, 0x8b, 0x7e, 0x48, 0xc9, + 0x89, 0xb0, 0x33, 0xe5, 0xb4, 0x5d, 0x4a, 0x43, 0xc2, 0xe9, 0x75, 0xd1, 0x1d, 0x38, 0x5f, 0x73, + 0x43, 0x67, 0xab, 0x49, 0x2a, 0x9d, 0xad, 0x96, 0x4f, 0x0f, 0x6c, 0x3c, 0x52, 0xa5, 0x50, 0x7e, + 0x5a, 0x9a, 0x26, 0xe6, 0x93, 0x08, 0xb8, 0xbb, 0x8e, 0xfd, 0x1d, 0x0b, 0x46, 0xf5, 0x90, 0x02, + 0xaa, 0xc3, 0x42, 0x63, 0x7e, 0xa1, 0xc2, 0xa5, 0x6c, 0x76, 0x7b, 0xe9, 0xa2, 0xa2, 0x19, 0x9f, + 0xf9, 0x62, 0x18, 0xd6, 0x78, 0xf6, 0x11, 0x46, 0xf9, 0x1c, 0xe4, 0xb7, 0x7d, 0xba, 0xd5, 0x0f, + 0x98, 0x96, 0xd9, 0x05, 0x0a, 0xc4, 0xbc, 0xcc, 0xfe, 0x5f, 0x16, 0x5c, 0x4e, 0x8f, 0x96, 0xf8, + 0x28, 0x74, 0xf2, 0x26, 0x00, 0xed, 0x8a, 0x21, 0x2e, 0xb5, 0x58, 0x58, 0x59, 0x82, 0x35, 0xac, + 0xfe, 0xba, 0xfd, 0x03, 0xaa, 0x6e, 0xc6, 0x7c, 0xbe, 0x6a, 0xc1, 0x18, 0x65, 0xbb, 0x1c, 0x6c, + 0x19, 0xbd, 0x5d, 0xcf, 0xa6, 0xb7, 0x8a, 0x6c, 0x6c, 0x80, 0x36, 0xc0, 0xd8, 0x64, 0x8e, 0x7e, + 0x1c, 0x8a, 0x4e, 0xad, 0x16, 0x90, 0x30, 0x54, 0xee, 0x08, 0xe6, 0xe2, 0x9b, 0x95, 0x40, 0x1c, + 0x97, 0x53, 0x11, 0xd7, 0xa8, 0x6d, 0x87, 0x54, 0x6a, 0x08, 0xbb, 0x9b, 0x12, 0x71, 0x94, 0x09, + 0x85, 0x63, 0x85, 0x61, 0xff, 0xc2, 0x20, 0x98, 0xbc, 0x51, 0x0d, 0xc6, 0x77, 0x82, 0xad, 0x39, + 0xe6, 0x86, 0x7c, 0x14, 0x87, 0xf0, 0x85, 0xa3, 0xc3, 0xa9, 0xf1, 0x65, 0x93, 0x02, 0x4e, 0x92, + 0x14, 0x5c, 0x96, 0xc9, 0x41, 0xe4, 0x6c, 0x3d, 0xca, 0x46, 0x24, 0xb9, 0xe8, 0x14, 0x70, 0x92, + 0x24, 0xfa, 0x04, 0x8c, 0xec, 0x04, 0x5b, 0x52, 0x80, 0x26, 0xbd, 0xb0, 0xcb, 0x71, 0x11, 0xd6, + 0xf1, 0xe8, 0x10, 0xee, 0x04, 0x5b, 0x74, 0xc3, 0x91, 0x61, 0xc5, 0x6a, 0x08, 0x97, 0x05, 0x1c, + 0x2b, 0x0c, 0xd4, 0x06, 0xb4, 0x23, 0x47, 0x4f, 0x39, 0x5d, 0x85, 0x9c, 0xef, 0xdf, 0x67, 0xcb, + 0x42, 0x30, 0x96, 0xbb, 0xe8, 0xe0, 0x14, 0xda, 0xe8, 0xb3, 0x70, 0x65, 0x27, 0xd8, 0x12, 0xdb, + 0xf0, 0x46, 0xe0, 0x7a, 0x55, 0xb7, 0x6d, 0x84, 0x10, 0x4f, 0x89, 0xe6, 0x5e, 0x59, 0x4e, 0x47, + 0xc3, 0xbd, 0xea, 0xdb, 0xff, 0x2d, 0x07, 0x2c, 0x36, 0x93, 0x6a, 0x16, 0x2d, 0x12, 0x35, 0xfc, + 0x5a, 0x52, 0xb3, 0x58, 0x65, 0x50, 0x2c, 0x4a, 0x65, 0xb0, 0x47, 0xae, 0x47, 0xb0, 0xc7, 0x1e, + 0x0c, 0x37, 0x88, 0x53, 0x23, 0x81, 0x34, 0x84, 0xad, 0x64, 0x13, 0x4d, 0xba, 0xc8, 0x88, 0xc6, + 0x07, 0x5c, 0xfe, 0x3f, 0xc4, 0x92, 0x1b, 0xfa, 0x24, 0x9c, 0xa3, 0x3a, 0x82, 0xdf, 0x89, 0xa4, + 0xd5, 0x77, 0x90, 0x59, 0x7d, 0xd9, 0x7e, 0xb7, 0x69, 0x94, 0xe0, 0x04, 0x26, 0x9a, 0x87, 0x09, + 0x61, 0xa1, 0x55, 0x06, 0x36, 0x31, 0xb0, 0x2a, 0xb6, 0xbb, 0x92, 0x28, 0xc7, 0x5d, 0x35, 0xa8, + 0x44, 0xde, 0xf2, 0x6b, 0x3c, 0x9e, 0x55, 0x93, 0xc8, 0x65, 0xbf, 0x76, 0x80, 0x59, 0x89, 0xfd, + 0xeb, 0x74, 0x1f, 0xd1, 0x42, 0x63, 0x1f, 0x16, 0x39, 0x13, 0xc6, 0x83, 0xc9, 0xcf, 0x4b, 0x8b, + 0x19, 0x0c, 0xe6, 0x43, 0x06, 0xd2, 0xfe, 0x36, 0x15, 0x8d, 0x6a, 0xc4, 0xfb, 0xb0, 0x27, 0x3e, + 0xa7, 0x9f, 0xcc, 0x7b, 0x29, 0x79, 0x5f, 0x84, 0x22, 0xfb, 0xb1, 0x10, 0xf8, 0x2d, 0x61, 0xd6, + 0xc3, 0x59, 0xce, 0x0c, 0x71, 0x02, 0x65, 0x62, 0xf2, 0x9e, 0x64, 0x84, 0x63, 0x9e, 0xb6, 0x0f, + 0x13, 0x49, 0x6c, 0xf4, 0x06, 0x8c, 0x86, 0x52, 0xd2, 0xc4, 0xa1, 0x67, 0x7d, 0x4a, 0x24, 0x66, + 0x64, 0xaa, 0x68, 0xd5, 0xb1, 0x41, 0xcc, 0x5e, 0x87, 0xa1, 0x4c, 0x87, 0xd0, 0xfe, 0x86, 0x05, + 0x45, 0x66, 0xe6, 0xaf, 0x07, 0x4e, 0x2b, 0xae, 0x32, 0x70, 0xcc, 0xa8, 0x87, 0x30, 0xcc, 0x0f, + 0x04, 0xd2, 0x0f, 0x9d, 0xc1, 0x04, 0xe2, 0x97, 0x92, 0xe2, 0x09, 0xc4, 0x4f, 0x1e, 0x21, 0x96, + 0x9c, 0xec, 0x9f, 0xcb, 0xc1, 0xd0, 0x92, 0xd7, 0xee, 0xfc, 0xa9, 0xbf, 0x18, 0xb3, 0x0a, 0x83, + 0x4b, 0x11, 0x69, 0x99, 0xf7, 0xb7, 0x46, 0xcb, 0xcf, 0xeb, 0x77, 0xb7, 0x4a, 0xe6, 0xdd, 0x2d, + 0xec, 0xec, 0xc9, 0x08, 0x08, 0x61, 0x90, 0x8a, 0xc3, 0xef, 0x5e, 0x82, 0xe2, 0x8a, 0xb3, 0x45, + 0x9a, 0xcb, 0xe4, 0x20, 0xa4, 0x27, 0x11, 0xee, 0xc9, 0xb4, 0xe2, 0x93, 0x88, 0xe1, 0x75, 0x9c, + 0x86, 0x11, 0x86, 0xcd, 0x18, 0xf5, 0x81, 0xff, 0xc7, 0x39, 0x18, 0x33, 0x2c, 0x62, 0x86, 0x9f, + 0xc0, 0x7a, 0xa8, 0x9f, 0xc0, 0xb0, 0xdb, 0xe7, 0x9e, 0xb4, 0xdd, 0x7e, 0xe0, 0xec, 0xed, 0xf6, + 0x37, 0x01, 0x48, 0x7c, 0x31, 0x65, 0xd0, 0xd4, 0x55, 0xb5, 0x4b, 0x29, 0x1a, 0x96, 0xdd, 0x84, + 0xc1, 0x15, 0xd7, 0xdb, 0xe9, 0x4f, 0x42, 0x84, 0x55, 0xbf, 0xdd, 0x25, 0x21, 0x2a, 0x14, 0x88, + 0x79, 0x99, 0xdc, 0x4e, 0x06, 0xd2, 0xb7, 0x13, 0xfb, 0xcb, 0x16, 0x9c, 0x5f, 0x25, 0x2d, 0xdf, + 0x7d, 0xc7, 0x89, 0x63, 0x72, 0x68, 0xa5, 0x86, 0x1b, 0x89, 0xf0, 0x0d, 0x55, 0x69, 0xd1, 0x8d, + 0x30, 0x85, 0x3f, 0xc4, 0xce, 0xc2, 0x22, 0x88, 0xa9, 0x9a, 0xb7, 0x16, 0xeb, 0x5b, 0x71, 0xb4, + 0x8d, 0x2c, 0xc0, 0x31, 0x8e, 0xfd, 0xbb, 0x16, 0x0c, 0xf3, 0x46, 0x10, 0x49, 0xdb, 0xea, 0x41, + 0xbb, 0x01, 0x79, 0x56, 0x4f, 0x4c, 0xa7, 0x3b, 0x19, 0xd8, 0xdf, 0x29, 0x39, 0x3e, 0xf9, 0xd9, + 0x4f, 0xcc, 0x19, 0x30, 0xe5, 0xc7, 0xd9, 0x9f, 0x55, 0xe1, 0x48, 0xb1, 0xf2, 0xc3, 0xa0, 0x58, + 0x94, 0xda, 0x5f, 0x1f, 0x80, 0x82, 0xf4, 0x6c, 0xf2, 0x50, 0x7a, 0xcf, 0xf3, 0x23, 0x87, 0x3b, + 0xfe, 0xb8, 0x78, 0x7b, 0xe3, 0xf1, 0x5b, 0x29, 0x39, 0x4c, 0xcf, 0xc6, 0xd4, 0xb9, 0x7d, 0x5d, + 0xa9, 0xb2, 0x5a, 0x09, 0xd6, 0x1b, 0x81, 0xbe, 0x00, 0x43, 0x4d, 0xba, 0xec, 0xa5, 0xb4, 0xbb, + 0x97, 0x61, 0x73, 0x98, 0x3c, 0x11, 0x2d, 0x51, 0x23, 0xc4, 0x81, 0x58, 0x70, 0x9d, 0xfc, 0x34, + 0x4c, 0x24, 0x5b, 0x9d, 0x62, 0xcc, 0xbf, 0x68, 0xec, 0x77, 0x9a, 0xed, 0x7d, 0xf2, 0xcf, 0x0b, + 0xb1, 0x75, 0xf2, 0xaa, 0xf6, 0x6b, 0x30, 0xb2, 0x4a, 0xa2, 0xc0, 0xad, 0x32, 0x02, 0x0f, 0x9b, + 0x5c, 0x7d, 0x6d, 0xb9, 0x5f, 0x61, 0x93, 0x95, 0xd2, 0x0c, 0xd1, 0x7b, 0x00, 0xed, 0xc0, 0xa7, + 0x5a, 0x30, 0xe9, 0xc8, 0x8f, 0x9d, 0x81, 0x72, 0xbb, 0xa1, 0x68, 0x72, 0x97, 0x50, 0xfc, 0x1f, + 0x6b, 0xfc, 0xec, 0x1b, 0x90, 0x5f, 0xed, 0x44, 0x64, 0xff, 0xe1, 0xa2, 0xc2, 0x7e, 0x03, 0x46, + 0x19, 0xea, 0xa2, 0xdf, 0xa4, 0x1b, 0x0b, 0xed, 0x69, 0x8b, 0xfe, 0x4f, 0x1a, 0xe1, 0x18, 0x12, + 0xe6, 0x65, 0x74, 0x05, 0x34, 0xfc, 0x66, 0x8d, 0x04, 0x62, 0x3c, 0xd4, 0xf7, 0x5d, 0x64, 0x50, + 0x2c, 0x4a, 0xed, 0x9f, 0xce, 0xc1, 0x08, 0xab, 0x28, 0xa4, 0xc7, 0x01, 0x0c, 0x37, 0x38, 0x1f, + 0x31, 0x24, 0x19, 0x44, 0xb0, 0xe8, 0xad, 0xd7, 0x14, 0x55, 0x0e, 0xc0, 0x92, 0x1f, 0x65, 0xbd, + 0xe7, 0xb8, 0x11, 0x65, 0x9d, 0x3b, 0x5d, 0xd6, 0xf7, 0x39, 0x1b, 0x2c, 0xf9, 0xd9, 0xff, 0xde, + 0x02, 0x58, 0xf3, 0x6b, 0x04, 0x93, 0xb0, 0xd3, 0x8c, 0xd0, 0x4f, 0x40, 0xbe, 0xdd, 0x70, 0xc2, + 0xa4, 0x61, 0x3d, 0xbf, 0x41, 0x81, 0x0f, 0x0e, 0xa7, 0x8a, 0x14, 0x97, 0xfd, 0xc1, 0x1c, 0x51, + 0x0f, 0x80, 0xcc, 0x1d, 0x1f, 0x00, 0x89, 0xda, 0x30, 0xec, 0x77, 0x22, 0xaa, 0x4e, 0x89, 0x5d, + 0x2d, 0x03, 0xbf, 0xd2, 0x3a, 0x27, 0xc8, 0xaf, 0x7d, 0x8a, 0x3f, 0x58, 0xb2, 0xb1, 0xff, 0x70, + 0x9c, 0xf7, 0x4e, 0x7c, 0xe2, 0x49, 0xc8, 0xb9, 0xf2, 0x54, 0x08, 0xa2, 0x99, 0xb9, 0xa5, 0x79, + 0x9c, 0x73, 0x6b, 0x6a, 0x36, 0xe6, 0x7a, 0x6e, 0x5c, 0x9f, 0x80, 0x91, 0x9a, 0x1b, 0xb6, 0x9b, + 0xce, 0xc1, 0x5a, 0xca, 0x91, 0x7c, 0x3e, 0x2e, 0xc2, 0x3a, 0x1e, 0x7a, 0x49, 0x04, 0xad, 0x0e, + 0x1a, 0xc7, 0x30, 0x19, 0xb4, 0x5a, 0xa0, 0xcd, 0xd3, 0xe2, 0x55, 0x5f, 0x81, 0x51, 0xb9, 0x15, + 0x33, 0x2e, 0xfc, 0x08, 0xa6, 0x82, 0x19, 0x37, 0xb5, 0x32, 0x6c, 0x60, 0x76, 0x29, 0x0e, 0x43, + 0x67, 0xaf, 0x38, 0x7c, 0x0a, 0xc6, 0xe4, 0x5f, 0xb6, 0x9b, 0x97, 0x2e, 0xb2, 0xd6, 0x2b, 0x53, + 0xd1, 0xa6, 0x5e, 0x88, 0x4d, 0xdc, 0x78, 0xea, 0x0d, 0xf7, 0x3b, 0xf5, 0x6e, 0x02, 0x6c, 0xf9, + 0x1d, 0xaf, 0xe6, 0x04, 0x07, 0x4b, 0xf3, 0x22, 0x3c, 0x48, 0xe9, 0x29, 0x65, 0x55, 0x82, 0x35, + 0x2c, 0x7d, 0xba, 0x16, 0x1f, 0x32, 0x5d, 0xdf, 0x80, 0x22, 0x0b, 0xa5, 0x22, 0xb5, 0xd9, 0x48, + 0x38, 0xce, 0x4f, 0x12, 0x75, 0xa3, 0x94, 0x87, 0x8a, 0x24, 0x82, 0x63, 0x7a, 0xe8, 0x73, 0x00, + 0xdb, 0xae, 0xe7, 0x86, 0x0d, 0x46, 0x7d, 0xe4, 0xc4, 0xd4, 0x55, 0x3f, 0x17, 0x14, 0x15, 0xac, + 0x51, 0x44, 0x6f, 0xc2, 0x79, 0x12, 0x46, 0x6e, 0xcb, 0x89, 0x48, 0x4d, 0xc5, 0xf2, 0x97, 0x98, + 0x1d, 0x41, 0x05, 0xb3, 0xdd, 0x4e, 0x22, 0x3c, 0x48, 0x03, 0xe2, 0x6e, 0x42, 0xe8, 0x15, 0x28, + 0xb4, 0x03, 0xbf, 0x4e, 0x95, 0xbf, 0xd2, 0x24, 0x1b, 0xc6, 0xab, 0x52, 0xa1, 0xde, 0x10, 0xf0, + 0x07, 0xda, 0x6f, 0xac, 0xb0, 0xd1, 0x0f, 0x2d, 0x38, 0x1f, 0x10, 0xee, 0x4d, 0x0d, 0x55, 0xc3, + 0x2e, 0x31, 0xa9, 0x57, 0xcd, 0x22, 0xa9, 0x82, 0x5c, 0xec, 0xd3, 0x38, 0xc9, 0x85, 0x6f, 0xf7, + 0x44, 0xf6, 0xbe, 0xab, 0xfc, 0x41, 0x1a, 0xf0, 0xcb, 0xdf, 0x9d, 0x9a, 0xea, 0xce, 0xf0, 0xa1, + 0x88, 0xd3, 0x95, 0xf7, 0x57, 0xbe, 0x3b, 0x35, 0x21, 0xff, 0xc7, 0x83, 0xd6, 0xd5, 0x49, 0xba, + 0x7b, 0xb5, 0xfd, 0xda, 0xd2, 0x86, 0x88, 0x70, 0x50, 0xbb, 0xd7, 0x06, 0x05, 0x62, 0x5e, 0x86, + 0x5e, 0x84, 0x42, 0xcd, 0x21, 0x2d, 0xdf, 0x23, 0xb5, 0xd2, 0x58, 0xec, 0x42, 0x9a, 0x17, 0x30, + 0xac, 0x4a, 0x51, 0x13, 0x86, 0x5c, 0x76, 0x36, 0x15, 0xe1, 0x4c, 0x19, 0x1c, 0x88, 0xf9, 0x59, + 0x57, 0x06, 0x33, 0x31, 0x51, 0x2a, 0x78, 0xe8, 0xb2, 0x7b, 0xfc, 0x4c, 0x64, 0x37, 0x1d, 0x89, + 0x6a, 0xc3, 0x6d, 0xd6, 0x02, 0xe2, 0x95, 0x26, 0xd8, 0x51, 0x8f, 0x8d, 0xc4, 0x9c, 0x80, 0x61, + 0x55, 0x8a, 0xfe, 0x1c, 0x8c, 0xf9, 0x9d, 0x88, 0x2d, 0x72, 0xfa, 0xfd, 0xc3, 0xd2, 0x79, 0x86, + 0xce, 0x9c, 0xd3, 0xeb, 0x7a, 0x01, 0x36, 0xf1, 0xa8, 0xb0, 0x6d, 0xf8, 0x61, 0x44, 0xff, 0x30, + 0x61, 0x7b, 0xd9, 0x14, 0xb6, 0x8b, 0x5a, 0x19, 0x36, 0x30, 0xd1, 0xd7, 0x2c, 0x38, 0xdf, 0x4a, + 0x1e, 0x40, 0x4a, 0x57, 0xd8, 0xc8, 0x54, 0xb2, 0x50, 0x54, 0x13, 0xa4, 0x79, 0x0c, 0x5f, 0x17, + 0x18, 0x77, 0x37, 0x82, 0xdd, 0x47, 0x0c, 0x0f, 0xbc, 0x6a, 0x23, 0xf0, 0x3d, 0xb3, 0x79, 0x4f, + 0xb3, 0xe6, 0xbd, 0x91, 0xd1, 0x2a, 0x4b, 0x63, 0x51, 0x7e, 0xfa, 0xe8, 0x70, 0xea, 0x52, 0x6a, + 0x11, 0x4e, 0x6f, 0xd4, 0xe4, 0x3c, 0x5c, 0x4e, 0x5f, 0xa9, 0x0f, 0xd3, 0x98, 0x07, 0x74, 0x8d, + 0x79, 0x01, 0x9e, 0xee, 0xd9, 0x28, 0x2a, 0xf3, 0xa5, 0x7a, 0x65, 0x99, 0x32, 0xbf, 0x4b, 0x1d, + 0x3a, 0x07, 0xa3, 0x7a, 0x5e, 0x16, 0x16, 0x29, 0xa0, 0xdd, 0x85, 0x45, 0xef, 0x41, 0xd1, 0xaf, + 0x64, 0xee, 0x72, 0x5f, 0xaf, 0x74, 0xb9, 0xdc, 0x15, 0x08, 0xc7, 0x0c, 0xfb, 0x89, 0x14, 0x48, + 0xbd, 0xb8, 0xfb, 0x84, 0x9b, 0x7d, 0xe2, 0x48, 0x81, 0x7f, 0x37, 0x08, 0x31, 0x25, 0xf4, 0x12, + 0x14, 0x88, 0x57, 0x6b, 0xfb, 0xae, 0x17, 0x25, 0xad, 0x37, 0xb7, 0x05, 0x1c, 0x2b, 0x0c, 0x2d, + 0xae, 0x20, 0x77, 0x6c, 0x5c, 0x41, 0x0d, 0xc6, 0x1d, 0x66, 0xf6, 0x8e, 0xbd, 0xc2, 0x03, 0x27, + 0x76, 0xe3, 0xcc, 0x9a, 0x14, 0x70, 0x92, 0x24, 0xe5, 0x12, 0xc6, 0x55, 0x19, 0x97, 0xc1, 0x13, + 0x73, 0xa9, 0x98, 0x14, 0x70, 0x92, 0x24, 0x7a, 0x13, 0x4a, 0x55, 0x76, 0x79, 0x84, 0xf7, 0x71, + 0x69, 0x7b, 0xcd, 0x8f, 0x36, 0x02, 0x12, 0x12, 0x8f, 0x7b, 0xed, 0x0b, 0xe5, 0xeb, 0x62, 0x14, + 0x4a, 0x73, 0x3d, 0xf0, 0x70, 0x4f, 0x0a, 0x54, 0xab, 0x63, 0x3e, 0x69, 0x37, 0x3a, 0xd8, 0xf4, + 0x77, 0x88, 0x74, 0x28, 0x28, 0xad, 0xae, 0xa2, 0x17, 0x62, 0x13, 0x17, 0xfd, 0xbc, 0x05, 0x63, + 0x4d, 0x69, 0x8c, 0xc3, 0x9d, 0xa6, 0xcc, 0xfc, 0x82, 0x33, 0x99, 0x7e, 0x2b, 0x3a, 0x65, 0x2e, + 0xf0, 0x0d, 0x10, 0x36, 0x79, 0xdb, 0xdf, 0xb6, 0x60, 0x22, 0x59, 0x0d, 0xed, 0xc0, 0xb3, 0x2d, + 0x27, 0xd8, 0x59, 0xf2, 0xb6, 0x03, 0x16, 0x56, 0x19, 0xf1, 0xaf, 0x3a, 0xbb, 0x1d, 0x91, 0x60, + 0xde, 0x39, 0xe0, 0xc1, 0x53, 0x79, 0x95, 0xac, 0xea, 0xd9, 0xd5, 0xe3, 0x90, 0xf1, 0xf1, 0xb4, + 0x50, 0x05, 0x2e, 0x51, 0x84, 0x79, 0xd2, 0x24, 0x54, 0x42, 0xc5, 0x4c, 0x72, 0x8c, 0x89, 0x0a, + 0x0f, 0x58, 0x4d, 0x43, 0xc2, 0xe9, 0x75, 0xed, 0x02, 0x0c, 0xf1, 0x90, 0x72, 0xfb, 0xdf, 0xe6, + 0x40, 0xee, 0xa4, 0x7f, 0xba, 0x4d, 0xd6, 0xc8, 0x86, 0xa1, 0x80, 0x9d, 0x69, 0xc5, 0x41, 0x8d, + 0x29, 0x35, 0xfc, 0x94, 0x8b, 0x45, 0x09, 0x55, 0x31, 0xc8, 0xbe, 0x1b, 0xcd, 0xf9, 0x35, 0x79, + 0x3c, 0x63, 0x2a, 0xc6, 0x6d, 0x01, 0xc3, 0xaa, 0xd4, 0xfe, 0x19, 0x0b, 0xc6, 0x68, 0x2f, 0x9b, + 0x4d, 0xd2, 0xac, 0x44, 0xa4, 0x1d, 0xa2, 0x10, 0xf2, 0x21, 0xfd, 0x91, 0x9d, 0xb1, 0x20, 0xbe, + 0x49, 0x40, 0xda, 0x9a, 0x59, 0x94, 0x32, 0xc1, 0x9c, 0x97, 0xfd, 0x5b, 0x03, 0x50, 0x54, 0x83, + 0xdd, 0x87, 0xad, 0xf5, 0x66, 0x7c, 0x77, 0x9f, 0x4b, 0xc3, 0x92, 0x76, 0x6f, 0x9f, 0x9e, 0xa9, + 0x66, 0xbd, 0x03, 0x7e, 0x15, 0x38, 0xbe, 0xc4, 0xff, 0x92, 0xe9, 0x8e, 0xb9, 0xac, 0xdb, 0xf8, + 0x35, 0x7c, 0xe1, 0x97, 0xd9, 0xd7, 0xbd, 0x61, 0x83, 0x59, 0xed, 0x2c, 0xca, 0xef, 0xd5, 0xdb, + 0x0d, 0x96, 0x48, 0x40, 0x95, 0xef, 0x2b, 0x01, 0xd5, 0x0d, 0x18, 0x24, 0x5e, 0xa7, 0xc5, 0xc2, + 0xca, 0x8b, 0x4c, 0xa7, 0x1a, 0xbc, 0xed, 0x75, 0x5a, 0x66, 0xcf, 0x18, 0x0a, 0xfa, 0x34, 0x8c, + 0xd4, 0x48, 0x58, 0x0d, 0x5c, 0x76, 0x0f, 0x4f, 0x1c, 0x4a, 0xaf, 0xb2, 0x93, 0x7e, 0x0c, 0x36, + 0x2b, 0xea, 0x15, 0xec, 0x77, 0x60, 0x68, 0xa3, 0xd9, 0xa9, 0xbb, 0x1e, 0x6a, 0xc3, 0x10, 0xbf, + 0x95, 0x27, 0x76, 0xde, 0x0c, 0x14, 0x75, 0xbe, 0xda, 0xb5, 0x68, 0x6a, 0x7e, 0xa1, 0x44, 0xf0, + 0xb1, 0xff, 0xb1, 0x05, 0xf4, 0x54, 0x71, 0x67, 0x0e, 0xfd, 0x05, 0x28, 0x84, 0x42, 0x97, 0x11, + 0xd3, 0xe4, 0x47, 0x54, 0xd4, 0xa5, 0x80, 0x3f, 0x38, 0x9c, 0x1a, 0x63, 0xc8, 0x12, 0x80, 0x55, + 0x15, 0xd4, 0x84, 0x31, 0x66, 0x0d, 0x95, 0xfb, 0x91, 0xb0, 0x5f, 0xdf, 0xea, 0xf3, 0x22, 0x9b, + 0x5e, 0x55, 0x48, 0x67, 0x1d, 0x84, 0x4d, 0xe2, 0xf6, 0x3f, 0x19, 0x04, 0xcd, 0x68, 0xd8, 0xc7, + 0xf4, 0x7e, 0x3b, 0x61, 0x22, 0x5e, 0xcd, 0xc4, 0x44, 0x2c, 0xed, 0xae, 0x5c, 0x64, 0x98, 0x56, + 0x61, 0xda, 0xa8, 0x06, 0x69, 0xb6, 0xc5, 0xe2, 0x50, 0x8d, 0x5a, 0x24, 0xcd, 0x36, 0x66, 0x25, + 0x2a, 0x24, 0x7f, 0xb0, 0x67, 0x48, 0x7e, 0x03, 0xf2, 0x75, 0xa7, 0x53, 0x27, 0x22, 0xd2, 0x22, + 0x03, 0x6f, 0x00, 0x8b, 0x51, 0xe4, 0xde, 0x00, 0xf6, 0x13, 0x73, 0x06, 0x74, 0x75, 0x36, 0xa4, + 0x9f, 0x55, 0x18, 0x84, 0x32, 0x58, 0x9d, 0xca, 0x75, 0xcb, 0x57, 0xa7, 0xfa, 0x8b, 0x63, 0x66, + 0xf4, 0xbc, 0x58, 0xe5, 0xf7, 0x5f, 0xc5, 0x86, 0xbf, 0x94, 0xc5, 0x9d, 0x03, 0x46, 0x90, 0x9f, + 0x17, 0xc5, 0x1f, 0x2c, 0xd9, 0xd8, 0x33, 0x30, 0xa2, 0xa5, 0x91, 0xa2, 0x9f, 0x41, 0x5d, 0xbd, + 0xd4, 0x3e, 0xc3, 0xbc, 0x13, 0x39, 0x98, 0x95, 0xd8, 0x7f, 0x7b, 0x00, 0xd4, 0xb9, 0x5d, 0x8f, + 0x90, 0x77, 0xaa, 0x5a, 0xfe, 0x05, 0xe3, 0x6a, 0x96, 0xef, 0x61, 0x51, 0x4a, 0x95, 0xa2, 0x16, + 0x09, 0xea, 0xea, 0xa4, 0x20, 0xe4, 0xab, 0x52, 0x8a, 0x56, 0xf5, 0x42, 0x6c, 0xe2, 0x52, 0x8d, + 0xb6, 0xe5, 0x78, 0xee, 0x36, 0x09, 0xa3, 0x64, 0xa0, 0xd3, 0xaa, 0x80, 0x63, 0x85, 0x81, 0xee, + 0xc0, 0xf9, 0x90, 0x44, 0xeb, 0x7b, 0x1e, 0x09, 0xd4, 0x95, 0x31, 0x71, 0x87, 0x50, 0x05, 0xff, + 0x55, 0x92, 0x08, 0xb8, 0xbb, 0x4e, 0x6a, 0x70, 0x48, 0xfe, 0xc4, 0xc1, 0x21, 0xf3, 0x30, 0xb1, + 0xed, 0xb8, 0xcd, 0x4e, 0x40, 0x7a, 0x86, 0x98, 0x2c, 0x24, 0xca, 0x71, 0x57, 0x0d, 0x16, 0x7f, + 0xda, 0x74, 0xea, 0x61, 0x69, 0x58, 0x8b, 0x3f, 0xa5, 0x00, 0xcc, 0xe1, 0xf6, 0x3f, 0xb0, 0x60, + 0x0c, 0x93, 0x28, 0x38, 0x98, 0xdd, 0xde, 0x76, 0x3d, 0x37, 0x3a, 0x40, 0xbf, 0x6a, 0xc1, 0x84, + 0xe7, 0xd7, 0xc8, 0xac, 0x17, 0xb9, 0x12, 0x98, 0x5d, 0x8e, 0x1d, 0xc6, 0x6b, 0x2d, 0x41, 0x9e, + 0xdf, 0x04, 0x4c, 0x42, 0x71, 0x57, 0x33, 0xec, 0x2b, 0x70, 0x29, 0x95, 0x80, 0xfd, 0xed, 0x01, + 0xd1, 0x0d, 0xf5, 0xf1, 0x5f, 0x83, 0x7c, 0x93, 0xdd, 0x8a, 0xb4, 0x1e, 0x31, 0x69, 0x07, 0x1b, + 0x2b, 0x7e, 0x6d, 0x92, 0x53, 0x42, 0xf3, 0x30, 0x12, 0x50, 0x1e, 0xe2, 0xce, 0x2a, 0x9f, 0x8a, + 0x76, 0x9c, 0x84, 0x50, 0x15, 0x3d, 0x30, 0xff, 0x62, 0xbd, 0x1a, 0x7a, 0x17, 0x86, 0xb7, 0x78, + 0x1e, 0x92, 0xec, 0xcc, 0xf3, 0x22, 0xb1, 0x09, 0xd3, 0x22, 0x64, 0x96, 0x93, 0x07, 0xf1, 0x4f, + 0x2c, 0x39, 0xa2, 0x03, 0x28, 0x38, 0xf2, 0x9b, 0x0e, 0x66, 0x15, 0xb1, 0x68, 0xcc, 0x1f, 0xae, + 0xdb, 0xa9, 0x6f, 0xa8, 0xd8, 0x25, 0xdc, 0xdd, 0xf9, 0xbe, 0xdc, 0xdd, 0xdf, 0xb0, 0x00, 0xe2, + 0x0c, 0x65, 0x68, 0x1f, 0x0a, 0xe1, 0x2d, 0xe3, 0x78, 0x9d, 0xc5, 0x25, 0x30, 0x41, 0x51, 0xbb, + 0x28, 0x21, 0x20, 0x58, 0x71, 0x7b, 0x98, 0x49, 0xe0, 0x8f, 0x2d, 0xb8, 0x98, 0x96, 0x49, 0xed, + 0x09, 0xb6, 0xf8, 0xa4, 0xd6, 0x00, 0x51, 0x61, 0x23, 0x20, 0xdb, 0xee, 0x7e, 0xd2, 0x31, 0xbf, + 0x2c, 0x0b, 0x70, 0x8c, 0x63, 0x7f, 0x73, 0x08, 0x14, 0xe3, 0x53, 0xb2, 0x1e, 0xbc, 0x40, 0x4f, + 0x17, 0xf5, 0x38, 0x3f, 0x8e, 0xc2, 0xc3, 0x0c, 0x8a, 0x45, 0x29, 0x3d, 0x61, 0xc8, 0x88, 0x6e, + 0x21, 0xb2, 0xd9, 0x2c, 0x94, 0xc1, 0xdf, 0x58, 0x95, 0xa6, 0xd9, 0x23, 0xf2, 0x67, 0x62, 0x8f, + 0x18, 0xca, 0xde, 0x1e, 0x71, 0x03, 0x86, 0x03, 0xbf, 0x49, 0x66, 0xf1, 0x9a, 0xd0, 0x9b, 0xe3, + 0xbc, 0x4e, 0x1c, 0x8c, 0x65, 0x39, 0xfa, 0x04, 0x8c, 0x74, 0x42, 0x52, 0x99, 0x5f, 0x9e, 0x0b, + 0x48, 0x2d, 0x14, 0x41, 0xf2, 0xca, 0xa9, 0x76, 0x37, 0x2e, 0xc2, 0x3a, 0x1e, 0xfa, 0xa6, 0x75, + 0x8c, 0xc9, 0xa3, 0x98, 0xd5, 0x9e, 0x90, 0x9a, 0x91, 0x83, 0x1d, 0x02, 0x1e, 0xc5, 0x8e, 0xf2, + 0x75, 0x0b, 0xce, 0x13, 0xaf, 0x1a, 0x1c, 0x30, 0x3a, 0x82, 0x9a, 0x70, 0x2c, 0xdd, 0xcd, 0x62, + 0xf1, 0xdd, 0x4e, 0x12, 0xe7, 0x56, 0xe3, 0x2e, 0x30, 0xee, 0x6e, 0x86, 0xfd, 0x87, 0x39, 0xb8, + 0x90, 0x42, 0x81, 0x05, 0x14, 0xb7, 0xe8, 0x04, 0x5a, 0xaa, 0x25, 0x97, 0xcf, 0xb2, 0x80, 0x63, + 0x85, 0x81, 0x36, 0xe0, 0xe2, 0x4e, 0x2b, 0x8c, 0xa9, 0xcc, 0xf9, 0x5e, 0x44, 0xf6, 0xe5, 0x62, + 0x92, 0x3e, 0xa2, 0x8b, 0xcb, 0x29, 0x38, 0x38, 0xb5, 0x26, 0xd5, 0x36, 0x88, 0xe7, 0x6c, 0x35, + 0x49, 0x5c, 0x24, 0xc2, 0xe1, 0x95, 0xb6, 0x71, 0x3b, 0x51, 0x8e, 0xbb, 0x6a, 0xa0, 0x0f, 0x2c, + 0x78, 0x26, 0x24, 0xc1, 0x2e, 0x09, 0x2a, 0x6e, 0x8d, 0xcc, 0x75, 0xc2, 0xc8, 0x6f, 0x91, 0xe0, + 0x11, 0x6d, 0x72, 0x53, 0x47, 0x87, 0x53, 0xcf, 0x54, 0x7a, 0x53, 0xc3, 0xc7, 0xb1, 0xb2, 0x3f, + 0xb0, 0xe0, 0x5c, 0x85, 0x9d, 0x12, 0x95, 0xce, 0x99, 0x75, 0x1a, 0xa0, 0x17, 0xd4, 0xd5, 0xc8, + 0x84, 0x10, 0x33, 0x2f, 0x33, 0xda, 0x6f, 0xc1, 0x44, 0x85, 0xb4, 0x9c, 0x76, 0x83, 0xdd, 0x34, + 0xe1, 0xa1, 0x08, 0x33, 0x50, 0x0c, 0x25, 0x2c, 0x99, 0x47, 0x51, 0x21, 0xe3, 0x18, 0x07, 0x3d, + 0xcf, 0xc3, 0x26, 0x64, 0x64, 0x6f, 0x91, 0x6b, 0xe7, 0x3c, 0xd6, 0x22, 0xc4, 0xb2, 0xcc, 0xde, + 0x83, 0xd1, 0xb8, 0x3a, 0xd9, 0x46, 0x75, 0x18, 0xaf, 0x6a, 0xc1, 0xe4, 0x71, 0xcc, 0x6a, 0xff, + 0x71, 0xe7, 0x4c, 0x16, 0xcd, 0x99, 0x44, 0x70, 0x92, 0xaa, 0xfd, 0x8b, 0x39, 0x18, 0x57, 0x9c, + 0x85, 0x43, 0xe0, 0xfd, 0x64, 0xa8, 0x07, 0xce, 0xe2, 0xca, 0xb6, 0x39, 0x92, 0xc7, 0x84, 0x7b, + 0xbc, 0x9f, 0x0c, 0xf7, 0x38, 0x55, 0xf6, 0x5d, 0x3e, 0x8e, 0x6f, 0xe4, 0xa0, 0xa0, 0x2e, 0x90, + 0xbf, 0x06, 0x79, 0x76, 0x80, 0x7a, 0x3c, 0x6d, 0x94, 0x1d, 0xc6, 0x30, 0xa7, 0x44, 0x49, 0x32, + 0x3f, 0xf7, 0x23, 0x67, 0xa5, 0x2b, 0x72, 0xbb, 0x97, 0x13, 0x44, 0x98, 0x53, 0x42, 0xcb, 0x30, + 0x40, 0xbc, 0x9a, 0x50, 0x4b, 0x4f, 0x4e, 0x90, 0xe5, 0x10, 0xbd, 0xed, 0xd5, 0x30, 0xa5, 0xc2, + 0x52, 0x38, 0x71, 0xed, 0x63, 0xd0, 0x5c, 0x1e, 0x42, 0xf5, 0x10, 0xa5, 0xf6, 0xcf, 0x0f, 0xc0, + 0x50, 0xa5, 0xb3, 0x45, 0x15, 0xec, 0xdf, 0xb0, 0xe0, 0xc2, 0x5e, 0x22, 0x63, 0x59, 0x3c, 0x65, + 0xef, 0x66, 0x9f, 0x0e, 0x0e, 0x93, 0xed, 0xf2, 0x33, 0xa2, 0x5d, 0x17, 0x52, 0x0a, 0x71, 0x5a, + 0x73, 0x8c, 0xec, 0x4e, 0x03, 0xa7, 0x94, 0x07, 0xef, 0x74, 0x63, 0x63, 0xc7, 0x7a, 0xc5, 0xc5, + 0xda, 0x3f, 0xcc, 0x03, 0xf0, 0xaf, 0xb1, 0xde, 0x8e, 0xfa, 0x31, 0x0e, 0xbd, 0x02, 0xa3, 0xf2, + 0x21, 0x8a, 0xb5, 0x38, 0xb0, 0x47, 0x39, 0x77, 0xef, 0x68, 0x65, 0xd8, 0xc0, 0x64, 0x07, 0x02, + 0x2f, 0x0a, 0x0e, 0xb8, 0xd2, 0x98, 0x8c, 0x7f, 0x55, 0x25, 0x58, 0xc3, 0x42, 0xd3, 0x86, 0xb1, + 0x9d, 0x67, 0xba, 0x38, 0x77, 0x8c, 0x6d, 0xfc, 0x53, 0x30, 0xa6, 0xfe, 0x2d, 0xb8, 0x4d, 0x92, + 0x74, 0xaa, 0x6c, 0xe8, 0x85, 0xd8, 0xc4, 0x45, 0x9f, 0x86, 0x73, 0xe6, 0x85, 0x55, 0xa1, 0x66, + 0xa9, 0xeb, 0xe2, 0xe6, 0x3d, 0x57, 0x9c, 0xc0, 0xa6, 0x2b, 0xa0, 0x16, 0x1c, 0xe0, 0x8e, 0x27, + 0xf4, 0x2d, 0xb5, 0x02, 0xe6, 0x19, 0x14, 0x8b, 0x52, 0x3a, 0x84, 0x7c, 0x2b, 0xe3, 0x70, 0x71, + 0xe3, 0x50, 0x0d, 0x61, 0x45, 0x2b, 0xc3, 0x06, 0x26, 0xe5, 0x20, 0x2c, 0x73, 0x60, 0xae, 0xb1, + 0x84, 0x39, 0xad, 0x0d, 0xe7, 0x7c, 0xd3, 0xb0, 0xc1, 0x43, 0x61, 0x3e, 0xde, 0xe7, 0xbc, 0x35, + 0xea, 0xf2, 0x1b, 0x32, 0x09, 0x3b, 0x48, 0x82, 0x3e, 0x55, 0x38, 0xf5, 0x50, 0xd7, 0x51, 0x33, + 0x8a, 0xab, 0x67, 0x34, 0xea, 0x06, 0x5c, 0x6c, 0xfb, 0xb5, 0x8d, 0xc0, 0xf5, 0x03, 0x37, 0x3a, + 0x98, 0x6b, 0x3a, 0x61, 0xc8, 0x66, 0xd5, 0x98, 0xa9, 0xd9, 0x6c, 0xa4, 0xe0, 0xe0, 0xd4, 0x9a, + 0xf4, 0x68, 0xd0, 0x16, 0x40, 0x16, 0xc1, 0x91, 0xe7, 0x47, 0x03, 0x89, 0x88, 0x55, 0xa9, 0x7d, + 0x01, 0xce, 0x57, 0x3a, 0xed, 0x76, 0xd3, 0x25, 0x35, 0x65, 0x09, 0xb7, 0x7f, 0x12, 0xc6, 0x45, + 0xe2, 0x28, 0xa5, 0x47, 0x9c, 0x28, 0x7b, 0xa8, 0xfd, 0x43, 0x0b, 0xc6, 0x13, 0xfe, 0x72, 0xf4, + 0x6e, 0x72, 0xf7, 0xcf, 0xc4, 0xb1, 0xa1, 0x6f, 0xfc, 0x7c, 0x85, 0xa7, 0x6a, 0x12, 0x0d, 0x19, + 0xdd, 0x99, 0x59, 0x90, 0x34, 0x8b, 0x81, 0xe4, 0xdb, 0x89, 0x1e, 0x22, 0x6a, 0x7f, 0x25, 0x07, + 0xe9, 0x41, 0x0a, 0xe8, 0x0b, 0xdd, 0x03, 0xf0, 0x5a, 0x86, 0x03, 0x20, 0xa2, 0x24, 0x7a, 0x8f, + 0x81, 0x67, 0x8e, 0xc1, 0x6a, 0x46, 0x63, 0x20, 0xf8, 0x76, 0x8f, 0xc4, 0x9f, 0x58, 0x30, 0xb2, + 0xb9, 0xb9, 0xa2, 0x8c, 0x53, 0x18, 0x2e, 0x87, 0xfc, 0x2a, 0x19, 0xf3, 0x2e, 0xce, 0xf9, 0xad, + 0x36, 0x77, 0x36, 0x0a, 0x27, 0x28, 0xcb, 0xe1, 0x55, 0x49, 0xc5, 0xc0, 0x3d, 0x6a, 0xa2, 0x25, + 0xb8, 0xa0, 0x97, 0x08, 0x13, 0xa3, 0x70, 0x78, 0xf2, 0xcb, 0xd5, 0xdd, 0xc5, 0x38, 0xad, 0x4e, + 0x92, 0x94, 0xb0, 0x33, 0x8a, 0xe7, 0x55, 0xba, 0x48, 0x89, 0x62, 0x9c, 0x56, 0xc7, 0x5e, 0x87, + 0x11, 0xed, 0xb1, 0x1f, 0xf4, 0x19, 0x98, 0xa8, 0xfa, 0x2d, 0x69, 0xdf, 0x59, 0x21, 0xbb, 0xa4, + 0x29, 0xba, 0xcc, 0x4c, 0x80, 0x73, 0x89, 0x32, 0xdc, 0x85, 0x6d, 0xff, 0xcf, 0x6b, 0xa0, 0x6e, + 0x93, 0xf4, 0xb1, 0x3d, 0xb5, 0x55, 0xf8, 0x56, 0x3e, 0xe3, 0xf0, 0x2d, 0x25, 0x6b, 0x13, 0x21, + 0x5c, 0x51, 0x1c, 0xc2, 0x35, 0x94, 0x75, 0x08, 0x97, 0xd2, 0x36, 0xbb, 0xc2, 0xb8, 0x7e, 0xd9, + 0x82, 0x51, 0xcf, 0xaf, 0x11, 0xe5, 0x42, 0x1a, 0x66, 0x2a, 0xef, 0x9b, 0xd9, 0xc5, 0xa5, 0xf2, + 0x70, 0x24, 0x41, 0x9e, 0x07, 0xf9, 0xa9, 0x2d, 0x4a, 0x2f, 0xc2, 0x46, 0x3b, 0xd0, 0x82, 0x66, + 0x71, 0xe4, 0x89, 0x9b, 0xae, 0xa6, 0x1d, 0x3d, 0x1e, 0x6a, 0x3e, 0xdc, 0xd7, 0x94, 0xae, 0x62, + 0x56, 0x96, 0x34, 0x79, 0x53, 0x41, 0x73, 0x0c, 0xc8, 0x34, 0x74, 0xb1, 0x32, 0x66, 0xc3, 0x10, + 0x8f, 0x06, 0x14, 0xcf, 0xce, 0x30, 0x7f, 0x15, 0x8f, 0x14, 0xc4, 0xa2, 0x04, 0x45, 0xd2, 0x4d, + 0x3d, 0x92, 0x55, 0xf6, 0x56, 0xc3, 0x0d, 0x9e, 0xee, 0xa7, 0x46, 0xaf, 0xea, 0x27, 0xda, 0xd1, + 0x7e, 0x4e, 0xb4, 0x63, 0x3d, 0x4f, 0xb3, 0x5f, 0xb5, 0x60, 0xb4, 0xaa, 0xa5, 0xa7, 0x2d, 0xbd, + 0x98, 0x55, 0x0e, 0xe6, 0xb4, 0xa4, 0xb7, 0xfc, 0x32, 0xa4, 0x5e, 0x82, 0x0d, 0xee, 0x2c, 0xef, + 0x10, 0x3b, 0xbe, 0xb3, 0xad, 0x7f, 0xe4, 0xe6, 0x46, 0x06, 0xdb, 0x83, 0x61, 0x0e, 0xe0, 0x9f, + 0x91, 0xc3, 0xb0, 0xe0, 0x85, 0xde, 0x83, 0x82, 0x0c, 0x28, 0x15, 0xe1, 0x9e, 0x38, 0x0b, 0xf3, + 0xb8, 0xe9, 0xfc, 0x92, 0xd9, 0x4a, 0x38, 0x14, 0x2b, 0x8e, 0xa8, 0x01, 0x03, 0x35, 0xa7, 0x2e, + 0x02, 0x3f, 0x57, 0xb3, 0x49, 0x06, 0x25, 0x79, 0xb2, 0xb3, 0xd9, 0xfc, 0xec, 0x1d, 0x4c, 0x59, + 0xa0, 0xfd, 0x38, 0x4b, 0xe6, 0x44, 0x66, 0xbb, 0xaf, 0xa9, 0x26, 0x71, 0x03, 0x45, 0x57, 0xd2, + 0xcd, 0x9a, 0xf0, 0x17, 0xfe, 0x19, 0xc6, 0x76, 0x21, 0x9b, 0x6c, 0x52, 0xfc, 0x9d, 0x8e, 0xd8, + 0xe7, 0x48, 0xb9, 0xb0, 0xf7, 0x89, 0x7e, 0x2c, 0x2b, 0x2e, 0x8b, 0x9b, 0x9b, 0x1b, 0x5d, 0xef, + 0x12, 0x35, 0x61, 0xa8, 0xcd, 0x62, 0x0f, 0x4a, 0x3f, 0x9e, 0xd5, 0xde, 0xc2, 0x63, 0x19, 0xf8, + 0xdc, 0xe4, 0xbf, 0xb1, 0xe0, 0x81, 0x6e, 0xc3, 0x30, 0xcf, 0xaa, 0xcc, 0x03, 0x6f, 0x47, 0x6e, + 0x4e, 0xf6, 0xce, 0xcd, 0x1c, 0x6f, 0x14, 0xfc, 0x7f, 0x88, 0x65, 0x5d, 0xf4, 0x8b, 0x16, 0x9c, + 0xa3, 0x12, 0x35, 0x4e, 0x03, 0x5d, 0x42, 0x59, 0xc9, 0xac, 0xbb, 0x21, 0xd5, 0x48, 0xa4, 0xac, + 0x51, 0xc7, 0xa4, 0x25, 0x83, 0x1d, 0x4e, 0xb0, 0x47, 0xef, 0x43, 0x21, 0x74, 0x6b, 0xa4, 0xea, + 0x04, 0x61, 0xe9, 0xc2, 0xe9, 0x34, 0x25, 0x76, 0x94, 0x08, 0x46, 0x58, 0xb1, 0x44, 0x7f, 0x9d, + 0x3d, 0xda, 0x20, 0x1e, 0xd8, 0x11, 0x6f, 0xbf, 0x5d, 0x3c, 0xb5, 0xb7, 0xdf, 0xb8, 0xff, 0xc0, + 0x64, 0x87, 0x93, 0xfc, 0xd1, 0x5f, 0xb6, 0xe0, 0x12, 0x4f, 0x4e, 0x9a, 0xcc, 0x4c, 0x7b, 0xe9, + 0x11, 0x6d, 0x33, 0x2c, 0x62, 0x78, 0x36, 0x8d, 0x24, 0x4e, 0xe7, 0xc4, 0xb2, 0x9b, 0x05, 0xba, + 0x4b, 0x95, 0xc5, 0x6d, 0x67, 0xe7, 0x30, 0x54, 0x4f, 0xc9, 0xb1, 0x88, 0x15, 0x03, 0x84, 0x4d, + 0xc6, 0xe8, 0x65, 0x18, 0x69, 0x8b, 0xed, 0xd0, 0x0d, 0x5b, 0x2c, 0xfe, 0x7b, 0x80, 0xdf, 0x91, + 0xd9, 0x88, 0xc1, 0x58, 0xc7, 0x31, 0x52, 0xdd, 0xdd, 0x38, 0x2e, 0xd5, 0x1d, 0xba, 0x0b, 0x23, + 0x91, 0xdf, 0x24, 0x81, 0x38, 0xa9, 0x96, 0xd8, 0x0c, 0xbc, 0x96, 0xb6, 0xb6, 0x36, 0x15, 0x5a, + 0x7c, 0x92, 0x8d, 0x61, 0x21, 0xd6, 0xe9, 0xb0, 0x70, 0x4e, 0x91, 0xf4, 0x35, 0x60, 0x47, 0xd8, + 0xa7, 0x13, 0xe1, 0x9c, 0x7a, 0x21, 0x36, 0x71, 0xd1, 0x1d, 0x38, 0xdf, 0xee, 0x3a, 0x03, 0xf3, + 0x1b, 0x20, 0x2a, 0x16, 0xa1, 0xfb, 0x00, 0xdc, 0x5d, 0xc7, 0x38, 0xfd, 0x3e, 0x73, 0xdc, 0xe9, + 0xb7, 0x47, 0xe2, 0xb7, 0xab, 0x8f, 0x92, 0xf8, 0x0d, 0xd5, 0xe0, 0xaa, 0xd3, 0x89, 0x7c, 0x76, + 0xef, 0xdf, 0xac, 0xc2, 0x23, 0x5b, 0xaf, 0xf3, 0x60, 0xd9, 0xa3, 0xc3, 0xa9, 0xab, 0xb3, 0xc7, + 0xe0, 0xe1, 0x63, 0xa9, 0xa0, 0x77, 0xa0, 0x40, 0x44, 0xf2, 0xba, 0xd2, 0x8f, 0x64, 0xa5, 0x24, + 0x98, 0xe9, 0xf0, 0x64, 0xa0, 0x22, 0x87, 0x61, 0xc5, 0x0f, 0x6d, 0xc2, 0x48, 0xc3, 0x0f, 0xa3, + 0xd9, 0xa6, 0xeb, 0x84, 0x24, 0x2c, 0x3d, 0xcb, 0x26, 0x4d, 0xaa, 0xee, 0xb5, 0x28, 0xd1, 0xe2, + 0x39, 0xb3, 0x18, 0xd7, 0xc4, 0x3a, 0x19, 0x44, 0x98, 0xdb, 0x90, 0x85, 0xf5, 0x4a, 0x97, 0xce, + 0x35, 0xd6, 0xb1, 0x17, 0xd2, 0x28, 0x6f, 0xf8, 0xb5, 0x8a, 0x89, 0xad, 0xfc, 0x86, 0x3a, 0x10, + 0x27, 0x69, 0xa2, 0x57, 0x60, 0xb4, 0xed, 0xd7, 0x2a, 0x6d, 0x52, 0xdd, 0x70, 0xa2, 0x6a, 0xa3, + 0x34, 0x65, 0x9a, 0xec, 0x36, 0xb4, 0x32, 0x6c, 0x60, 0xa2, 0x36, 0x0c, 0xb7, 0xf8, 0xed, 0xd6, + 0xd2, 0x73, 0x59, 0x9d, 0x6d, 0xc4, 0x75, 0x59, 0xae, 0x2f, 0x88, 0x3f, 0x58, 0xb2, 0x41, 0x7f, + 0xcf, 0x82, 0xf1, 0xc4, 0x8d, 0x86, 0xd2, 0x8f, 0x66, 0xa6, 0xb2, 0x98, 0x84, 0xcb, 0x2f, 0xb0, + 0xe1, 0x33, 0x81, 0x0f, 0xba, 0x41, 0x38, 0xd9, 0x22, 0x3e, 0x2e, 0xec, 0x8a, 0x7a, 0xe9, 0xf9, + 0xec, 0xc6, 0x85, 0x11, 0x94, 0xe3, 0xc2, 0xfe, 0x60, 0xc9, 0x06, 0xdd, 0x80, 0x61, 0x91, 0x93, + 0xa6, 0xf4, 0x82, 0xe9, 0xfb, 0x15, 0xa9, 0x6b, 0xb0, 0x2c, 0x9f, 0xfc, 0x49, 0x38, 0xdf, 0x75, + 0x74, 0x3b, 0xd1, 0x3d, 0xe9, 0x5f, 0xb1, 0x40, 0xbf, 0x8c, 0x98, 0x79, 0xc6, 0xe8, 0x57, 0x60, + 0xb4, 0xca, 0x9f, 0x2b, 0xe1, 0xd7, 0x19, 0x07, 0x4d, 0xfb, 0xe7, 0x9c, 0x56, 0x86, 0x0d, 0x4c, + 0x7b, 0x11, 0x50, 0x77, 0x3a, 0xcf, 0x44, 0xa4, 0x89, 0xd5, 0x57, 0xa4, 0xc9, 0x6f, 0x5a, 0x30, + 0x66, 0xe8, 0x0c, 0x99, 0xbb, 0x0b, 0x17, 0x00, 0xb5, 0xdc, 0x20, 0xf0, 0x03, 0xfd, 0xa5, 0x0c, + 0x91, 0xbf, 0x90, 0xe5, 0x76, 0x5a, 0xed, 0x2a, 0xc5, 0x29, 0x35, 0xec, 0x7f, 0x34, 0x08, 0x71, + 0xa4, 0xae, 0xca, 0xea, 0x66, 0xf5, 0xcc, 0xea, 0xf6, 0x12, 0x14, 0xde, 0x0a, 0x7d, 0x6f, 0x23, + 0xce, 0xfd, 0xa6, 0xbe, 0xc5, 0xab, 0x95, 0xf5, 0x35, 0x86, 0xa9, 0x30, 0x18, 0xf6, 0xdb, 0x0b, + 0x6e, 0x33, 0xea, 0x4e, 0x0e, 0xf6, 0xea, 0x6b, 0x1c, 0x8e, 0x15, 0x06, 0x7b, 0xcb, 0x63, 0x97, + 0x28, 0xc3, 0x78, 0xfc, 0x96, 0x07, 0xcf, 0xd4, 0xcb, 0xca, 0xd0, 0x0c, 0x14, 0x95, 0x5d, 0x5d, + 0x98, 0xf9, 0xd5, 0x48, 0x29, 0xfb, 0x3b, 0x8e, 0x71, 0x98, 0x42, 0x28, 0x0c, 0xb1, 0xc2, 0x84, + 0x52, 0xc9, 0xe2, 0x78, 0x92, 0x30, 0xed, 0x72, 0xd9, 0x2e, 0xc1, 0x58, 0xb1, 0x4c, 0xf3, 0x99, + 0x16, 0x4f, 0xc3, 0x67, 0xaa, 0x87, 0x8d, 0xe7, 0xfb, 0x0d, 0x1b, 0x37, 0xe7, 0x76, 0xa1, 0xaf, + 0xb9, 0xfd, 0xb3, 0x03, 0x30, 0x7c, 0x8f, 0x04, 0x2c, 0x63, 0xe5, 0x0d, 0x18, 0xde, 0xe5, 0x3f, + 0x93, 0x97, 0xb4, 0x04, 0x06, 0x96, 0xe5, 0xf4, 0xbb, 0x6d, 0x75, 0xdc, 0x66, 0x6d, 0x3e, 0x5e, + 0xc5, 0xea, 0xbb, 0x95, 0x65, 0x01, 0x8e, 0x71, 0x68, 0x85, 0x3a, 0xd5, 0xec, 0x5b, 0x2d, 0x37, + 0x4a, 0x46, 0x10, 0xdd, 0x91, 0x05, 0x38, 0xc6, 0x41, 0x2f, 0xc0, 0x50, 0xdd, 0x8d, 0x36, 0x9d, + 0x7a, 0xd2, 0x45, 0x78, 0x87, 0x41, 0xb1, 0x28, 0x65, 0x3e, 0x26, 0x37, 0xda, 0x0c, 0x08, 0xb3, + 0xec, 0x76, 0xdd, 0xd6, 0xbe, 0xa3, 0x95, 0x61, 0x03, 0x93, 0x35, 0xc9, 0x17, 0x3d, 0x13, 0xbe, + 0x9f, 0xb8, 0x49, 0xb2, 0x00, 0xc7, 0x38, 0x74, 0xfe, 0x57, 0xfd, 0x56, 0xdb, 0x6d, 0x8a, 0x88, + 0x5a, 0x6d, 0xfe, 0xcf, 0x09, 0x38, 0x56, 0x18, 0x14, 0x9b, 0x8a, 0x30, 0x2a, 0x7e, 0x92, 0xef, + 0x26, 0x6c, 0x08, 0x38, 0x56, 0x18, 0xf6, 0x3d, 0x18, 0xe3, 0x2b, 0x79, 0xae, 0xe9, 0xb8, 0xad, + 0x3b, 0x73, 0xe8, 0x76, 0x57, 0xd8, 0xf8, 0x8d, 0x94, 0xb0, 0xf1, 0x4b, 0x46, 0xa5, 0xee, 0xf0, + 0x71, 0xfb, 0x3b, 0x39, 0x28, 0x9c, 0xe1, 0xd3, 0x33, 0x6d, 0xe3, 0xe9, 0x99, 0xac, 0x1f, 0x20, + 0x49, 0x7b, 0x76, 0x66, 0x3f, 0xf1, 0xec, 0xcc, 0x46, 0x96, 0xb7, 0x40, 0x8e, 0x7d, 0x72, 0xe6, + 0x07, 0x16, 0x5c, 0x94, 0xa8, 0x4c, 0xa8, 0x95, 0x5d, 0x8f, 0x05, 0x17, 0x9c, 0xfe, 0x30, 0xbf, + 0x67, 0x0c, 0xf3, 0xeb, 0xd9, 0x75, 0x59, 0xef, 0x47, 0xcf, 0xf7, 0xd0, 0xbe, 0x6f, 0x41, 0x29, + 0xad, 0xc2, 0x19, 0xbc, 0xb9, 0xf3, 0xae, 0xf9, 0xe6, 0xce, 0xbd, 0xd3, 0xe9, 0x79, 0x8f, 0xb7, + 0x77, 0x7e, 0xd0, 0xa3, 0xdf, 0xec, 0xa1, 0x9b, 0xa6, 0xdc, 0xee, 0xac, 0xac, 0x5c, 0x67, 0x9c, + 0x45, 0xfa, 0xbe, 0xd9, 0x84, 0xa1, 0x90, 0x79, 0xe2, 0xc5, 0x14, 0x58, 0xcc, 0x62, 0x13, 0xa4, + 0xf4, 0x84, 0xe9, 0x93, 0xfd, 0xc6, 0x82, 0x87, 0xfd, 0x1f, 0x2d, 0x18, 0x3d, 0xc3, 0x87, 0x95, + 0x7c, 0xf3, 0x23, 0xbf, 0x9a, 0xdd, 0x47, 0xee, 0xf1, 0x61, 0xff, 0xd5, 0x75, 0x30, 0xde, 0x30, + 0x42, 0xef, 0x42, 0x51, 0x6a, 0xa0, 0xf2, 0x76, 0x59, 0x96, 0x4f, 0x95, 0xa8, 0x6d, 0x46, 0x42, + 0x42, 0x1c, 0xf3, 0x4b, 0xc4, 0x3e, 0xe4, 0xfa, 0x8a, 0x7d, 0x78, 0xb2, 0x0f, 0x9d, 0xa4, 0xdb, + 0x07, 0x06, 0x4f, 0xc5, 0x3e, 0x70, 0x35, 0x73, 0xfb, 0xc0, 0xb3, 0x67, 0x6c, 0x1f, 0xd0, 0x8c, + 0xb5, 0xf9, 0xc7, 0x30, 0xd6, 0xbe, 0x0b, 0x17, 0x77, 0xe3, 0xcd, 0x5f, 0xcd, 0x24, 0xf1, 0x5e, + 0xcb, 0x8d, 0x54, 0xab, 0x00, 0x55, 0x64, 0xc2, 0x88, 0x78, 0x91, 0xa6, 0x36, 0xc4, 0x91, 0x13, + 0xf7, 0x52, 0xc8, 0xe1, 0x54, 0x26, 0x49, 0xab, 0xdb, 0x70, 0x1f, 0x56, 0xb7, 0xdf, 0xea, 0xf9, + 0x48, 0x73, 0xe1, 0x74, 0x1f, 0x69, 0x7e, 0xfa, 0xc4, 0x0f, 0x34, 0x3f, 0x1f, 0xbb, 0x40, 0x78, + 0xbc, 0x4d, 0xba, 0xbf, 0xe2, 0xeb, 0x49, 0xbf, 0x2a, 0xb0, 0xa1, 0xff, 0x7c, 0xb6, 0x5a, 0x4f, + 0x06, 0xbe, 0xd5, 0x91, 0xc7, 0xf0, 0xad, 0x26, 0x4c, 0xa0, 0xa3, 0x19, 0x99, 0x40, 0x3d, 0x98, + 0x70, 0x5b, 0x4e, 0x9d, 0x6c, 0x74, 0x9a, 0x4d, 0x1e, 0x96, 0x2b, 0x1f, 0x93, 0x49, 0x3d, 0x49, + 0xad, 0xf8, 0x55, 0xa7, 0x99, 0x7c, 0xb3, 0x4b, 0x85, 0x1f, 0x2f, 0x25, 0x28, 0xe1, 0x2e, 0xda, + 0x74, 0xc2, 0xb2, 0xec, 0x21, 0x24, 0xa2, 0xa3, 0xcd, 0x1c, 0x78, 0xe2, 0x35, 0xfd, 0xc5, 0x18, + 0x8c, 0x75, 0x1c, 0xb4, 0x0c, 0xc5, 0x9a, 0x17, 0x8a, 0x0b, 0x3d, 0xe3, 0x4c, 0x98, 0x7d, 0x8c, + 0x8a, 0xc0, 0xf9, 0xb5, 0x8a, 0xba, 0xca, 0x73, 0x35, 0x25, 0x31, 0x8d, 0x2a, 0xc7, 0x71, 0x7d, + 0xb4, 0xca, 0x88, 0x89, 0x7c, 0xe0, 0xdc, 0xaf, 0x76, 0xbd, 0x87, 0xe1, 0x6e, 0x7e, 0x4d, 0x66, + 0x34, 0x1f, 0x13, 0xec, 0x44, 0x62, 0xef, 0x98, 0x82, 0xf6, 0xa8, 0xcf, 0xf9, 0x63, 0x1f, 0xf5, + 0x61, 0x19, 0xa9, 0xa2, 0xa6, 0x32, 0xd3, 0x5f, 0xcb, 0x2c, 0x23, 0x55, 0x1c, 0xb1, 0x22, 0x32, + 0x52, 0xc5, 0x00, 0xac, 0xb3, 0x44, 0xeb, 0xbd, 0xdc, 0x15, 0x17, 0x98, 0xd0, 0x38, 0xb9, 0xf3, + 0x41, 0xb7, 0x5b, 0x5f, 0x3c, 0xd6, 0x6e, 0xdd, 0x65, 0x67, 0xbf, 0x74, 0x02, 0x3b, 0x7b, 0x83, + 0xe5, 0x0a, 0xba, 0x33, 0x27, 0x5c, 0x1b, 0x19, 0x28, 0x74, 0xec, 0x8a, 0x2f, 0x8f, 0x00, 0x62, + 0x3f, 0x31, 0x67, 0xd0, 0x33, 0xb0, 0xed, 0xca, 0x23, 0x07, 0xb6, 0x51, 0xf1, 0x1c, 0xc3, 0x59, + 0xd2, 0xa9, 0xbc, 0x10, 0xcf, 0x31, 0x18, 0xeb, 0x38, 0x49, 0xab, 0xf5, 0xd3, 0xa7, 0x66, 0xb5, + 0x9e, 0x3c, 0x03, 0xab, 0xf5, 0x33, 0x7d, 0x5b, 0xad, 0xdf, 0x87, 0x0b, 0x6d, 0xbf, 0x36, 0xef, + 0x86, 0x41, 0x87, 0xdd, 0x53, 0x28, 0x77, 0x6a, 0x75, 0x12, 0x31, 0xb3, 0xf7, 0xc8, 0xcd, 0x9b, + 0x7a, 0x23, 0xdb, 0x6c, 0x21, 0x4f, 0xef, 0xbe, 0xbc, 0x45, 0x22, 0xfe, 0x31, 0x93, 0xb5, 0xd8, + 0x81, 0x89, 0x85, 0x40, 0xa5, 0x14, 0xe2, 0x34, 0x3e, 0xba, 0xd1, 0xfc, 0xfa, 0xd9, 0x18, 0xcd, + 0x3f, 0x03, 0x85, 0xb0, 0xd1, 0x89, 0x6a, 0xfe, 0x9e, 0xc7, 0x3c, 0x23, 0x45, 0xf5, 0xac, 0x67, + 0xa1, 0x22, 0xe0, 0x0f, 0x0e, 0xa7, 0x26, 0xe4, 0x6f, 0xcd, 0xa4, 0x20, 0x20, 0xe8, 0xd7, 0x7a, + 0x44, 0x62, 0xdb, 0xa7, 0x19, 0x89, 0x7d, 0xe5, 0x44, 0x51, 0xd8, 0x69, 0x9e, 0x81, 0xe7, 0x3e, + 0x72, 0x9e, 0x81, 0x5f, 0xb5, 0x60, 0x6c, 0x57, 0xb7, 0xdf, 0x08, 0xef, 0x45, 0x06, 0x5e, 0x54, + 0xc3, 0x2c, 0x54, 0xb6, 0xa9, 0xb0, 0x33, 0x40, 0x0f, 0x92, 0x00, 0x6c, 0xb6, 0x24, 0xc5, 0xc3, + 0xfb, 0xfc, 0x93, 0xf2, 0xf0, 0xbe, 0xcf, 0x84, 0x99, 0x0c, 0xbe, 0x62, 0x2e, 0x8d, 0x6c, 0x03, + 0xbc, 0xa4, 0x60, 0x54, 0xf1, 0x5d, 0x3a, 0x3f, 0xf4, 0x55, 0x0b, 0x26, 0xe4, 0xe1, 0x4c, 0xd8, + 0x5f, 0x43, 0x11, 0xa2, 0x92, 0xe5, 0x99, 0x90, 0xc5, 0x38, 0x6e, 0x26, 0xf8, 0xe0, 0x2e, 0xce, + 0x54, 0xb4, 0xab, 0x88, 0x80, 0x7a, 0xc8, 0x22, 0xb1, 0x84, 0x22, 0x33, 0x1b, 0x83, 0xb1, 0x8e, + 0x83, 0x7e, 0x5d, 0x3d, 0xd7, 0x77, 0x23, 0xab, 0x27, 0xe4, 0x0d, 0x05, 0x35, 0x93, 0x37, 0xfb, + 0x1e, 0xd7, 0x13, 0xf5, 0x91, 0x7a, 0xf4, 0xef, 0x0f, 0x10, 0x9c, 0x4b, 0xbc, 0x4a, 0xfb, 0x71, + 0x33, 0xad, 0xeb, 0xb5, 0x64, 0x6e, 0xcd, 0x31, 0x89, 0x6f, 0xe4, 0xd7, 0x34, 0x12, 0x60, 0xe6, + 0x4e, 0x35, 0x01, 0xe6, 0xc0, 0xd9, 0x24, 0xc0, 0x9c, 0x38, 0x8d, 0x04, 0x98, 0xe7, 0x4f, 0x94, + 0x00, 0x53, 0x4b, 0x40, 0x3a, 0xf8, 0x90, 0x04, 0xa4, 0xb3, 0x30, 0x2e, 0xa3, 0x8c, 0x89, 0xc8, + 0x6c, 0xc8, 0x1d, 0x0c, 0x57, 0x44, 0x95, 0xf1, 0x39, 0xb3, 0x18, 0x27, 0xf1, 0xd1, 0x87, 0x16, + 0xe4, 0x3d, 0x56, 0x73, 0x28, 0xab, 0x9c, 0xde, 0xe6, 0xd4, 0x62, 0x07, 0x44, 0xb1, 0xfe, 0x64, + 0x5c, 0x55, 0x9e, 0xc1, 0x1e, 0xc8, 0x1f, 0x98, 0xb7, 0x00, 0xbd, 0x09, 0x25, 0x7f, 0x7b, 0xbb, + 0xe9, 0x3b, 0xb5, 0x38, 0x4b, 0xa7, 0xf4, 0x80, 0xf0, 0x5b, 0x22, 0x2a, 0x4b, 0xd9, 0x7a, 0x0f, + 0x3c, 0xdc, 0x93, 0x02, 0x3d, 0xe1, 0x8f, 0x87, 0x91, 0x1f, 0x90, 0x5a, 0x6c, 0x8d, 0x28, 0xb2, + 0x3e, 0x93, 0xcc, 0xfb, 0x5c, 0x31, 0xf9, 0xf0, 0xde, 0xab, 0x8f, 0x92, 0x28, 0xc5, 0xc9, 0x66, + 0xa1, 0x00, 0x2e, 0xb7, 0xd3, 0x8c, 0x21, 0xa1, 0x88, 0x8d, 0x3e, 0xce, 0x24, 0x23, 0x97, 0xee, + 0xe5, 0x54, 0x73, 0x4a, 0x88, 0x7b, 0x50, 0xd6, 0xf3, 0x77, 0x16, 0xce, 0x26, 0x7f, 0xa7, 0xf9, + 0x96, 0xf4, 0xd8, 0x99, 0xbf, 0x25, 0x8d, 0xfe, 0x4f, 0x6a, 0xaa, 0x59, 0x6e, 0x43, 0xa8, 0x67, + 0x3e, 0x27, 0x3e, 0x72, 0xe9, 0x66, 0xff, 0xbe, 0x05, 0x93, 0x7c, 0xe6, 0x25, 0x35, 0x57, 0xf6, + 0x4a, 0xff, 0xb9, 0x53, 0x71, 0x92, 0xb1, 0x78, 0x81, 0x8a, 0xc1, 0x95, 0xf9, 0x6e, 0x8e, 0x69, + 0x09, 0xfa, 0xe5, 0x14, 0x7d, 0x79, 0x3c, 0x2b, 0xab, 0x5c, 0x7a, 0x9a, 0xd2, 0x0b, 0x47, 0xfd, + 0xa8, 0xc8, 0xff, 0xb0, 0xa7, 0xd1, 0x10, 0xb1, 0xe6, 0xfd, 0xa5, 0x53, 0x32, 0x1a, 0xea, 0xb9, + 0x54, 0x4f, 0x62, 0x3a, 0x9c, 0xfc, 0x39, 0x91, 0xcc, 0xbd, 0xa7, 0x16, 0xb2, 0x65, 0x6a, 0x21, + 0x2b, 0x59, 0x26, 0x5c, 0xd6, 0xd5, 0xa1, 0xbf, 0x6a, 0xc1, 0xc5, 0x34, 0x21, 0x99, 0xd2, 0xa4, + 0xcf, 0x9b, 0x4d, 0xca, 0x50, 0xab, 0xd5, 0x1b, 0x94, 0x4d, 0x96, 0xd9, 0xef, 0x17, 0x35, 0x57, + 0x4d, 0x44, 0xda, 0xa7, 0xf8, 0x44, 0xfd, 0xd8, 0xff, 0x7f, 0xa2, 0xfe, 0x2c, 0x32, 0xd6, 0x1b, + 0x8f, 0xcd, 0xe7, 0x9f, 0xd4, 0x63, 0xf3, 0x43, 0x8f, 0xf2, 0xd8, 0xfc, 0xf0, 0x13, 0x7b, 0x6c, + 0xbe, 0xd0, 0xe7, 0x63, 0xf3, 0xc5, 0x8f, 0xe8, 0x63, 0xf3, 0xf1, 0x91, 0x74, 0x34, 0xf3, 0x23, + 0x69, 0x44, 0xda, 0xff, 0xef, 0x3d, 0x23, 0xff, 0x47, 0x39, 0x18, 0x57, 0x5b, 0xb7, 0x13, 0xee, + 0x54, 0x48, 0x74, 0x06, 0x71, 0x26, 0x7b, 0x46, 0x9c, 0x49, 0x96, 0xa6, 0x3d, 0xde, 0x85, 0x9e, + 0x51, 0x3d, 0x5f, 0x4c, 0x44, 0xf5, 0xdc, 0xcf, 0x9e, 0xf5, 0xf1, 0xc1, 0x3d, 0xff, 0xdd, 0x82, + 0x0b, 0x89, 0x1a, 0x67, 0x10, 0xf9, 0xb0, 0x6b, 0x46, 0x3e, 0xbc, 0x96, 0x79, 0xaf, 0x7b, 0x04, + 0x40, 0xfc, 0x46, 0xae, 0xab, 0xb7, 0x4c, 0x2f, 0xfc, 0x59, 0x0b, 0xf2, 0x91, 0x13, 0xee, 0xc8, + 0x20, 0x88, 0xcf, 0x9f, 0xca, 0x0c, 0x98, 0xa6, 0xbf, 0xc5, 0x6a, 0x55, 0xed, 0x63, 0x30, 0xcc, + 0xb9, 0x4f, 0xfe, 0x8c, 0x05, 0x10, 0x23, 0x3d, 0x29, 0x15, 0xc6, 0xfe, 0xed, 0x1c, 0x5c, 0x4a, + 0x9d, 0x46, 0xe8, 0x2b, 0xea, 0x90, 0xcf, 0x07, 0x6a, 0xeb, 0x94, 0xe6, 0xab, 0x7e, 0xd6, 0x1f, + 0x33, 0xce, 0xfa, 0xe2, 0x88, 0xff, 0xa4, 0x14, 0x50, 0x91, 0xd6, 0x59, 0x1b, 0xac, 0xff, 0x61, + 0xc1, 0x44, 0xf2, 0xb0, 0x71, 0x06, 0x22, 0x6b, 0xdf, 0x10, 0x59, 0xf7, 0xb2, 0xf7, 0x46, 0xf4, + 0x0c, 0x8b, 0xfb, 0x23, 0x2d, 0x1e, 0x50, 0x22, 0x9f, 0x81, 0xcc, 0xd8, 0x33, 0x65, 0x06, 0xce, + 0xbe, 0xc7, 0x3d, 0x84, 0xc6, 0xdb, 0x90, 0xe6, 0x90, 0xe9, 0x2f, 0x2d, 0x8c, 0x11, 0xd3, 0x9f, + 0xeb, 0x3b, 0xa6, 0xff, 0x17, 0x72, 0xdd, 0x43, 0xcc, 0x04, 0xd5, 0x07, 0x54, 0x35, 0xd3, 0x4e, + 0xbb, 0xd9, 0x65, 0xce, 0x30, 0xce, 0xd6, 0xaa, 0x8d, 0xc6, 0xc9, 0xda, 0xe0, 0x8c, 0xde, 0x8a, + 0x5b, 0x42, 0xbf, 0xd4, 0x43, 0x53, 0x30, 0xf5, 0x9a, 0xe6, 0xcc, 0x21, 0x70, 0x5f, 0xa3, 0xc4, + 0x5c, 0x13, 0x06, 0x6d, 0x7b, 0x0c, 0x46, 0x5e, 0x77, 0xdb, 0xca, 0x97, 0x32, 0xfd, 0xad, 0xef, + 0x5d, 0x7b, 0xea, 0xf7, 0xbe, 0x77, 0xed, 0xa9, 0xef, 0x7c, 0xef, 0xda, 0x53, 0x5f, 0x3a, 0xba, + 0x66, 0x7d, 0xeb, 0xe8, 0x9a, 0xf5, 0x7b, 0x47, 0xd7, 0xac, 0xef, 0x1c, 0x5d, 0xb3, 0xfe, 0xd3, + 0xd1, 0x35, 0xeb, 0xaf, 0xfd, 0xe7, 0x6b, 0x4f, 0xbd, 0x5e, 0x90, 0x7d, 0xfb, 0xbf, 0x01, 0x00, + 0x00, 0xff, 0xff, 0x4c, 0xa2, 0x9c, 0xc6, 0xfc, 0xab, 0x00, 0x00, } func (m *Amount) Marshal() (dAtA []byte, err error) { @@ -6751,6 +6754,11 @@ func (m *LifecycleHook) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.Expression) + copy(dAtA[i:], m.Expression) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Expression))) + i-- + dAtA[i] = 0x22 if m.TemplateRef != nil { { size, err := m.TemplateRef.MarshalToSizedBuffer(dAtA[:i]) @@ -10138,6 +10146,37 @@ func (m *WorkflowSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.Hooks) > 0 { + keysForHooks := make([]string, 0, len(m.Hooks)) + for k := range m.Hooks { + keysForHooks = append(keysForHooks, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForHooks) + for iNdEx := len(keysForHooks) - 1; iNdEx >= 0; iNdEx-- { + v := m.Hooks[LifecycleEvent(keysForHooks[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForHooks[iNdEx]) + copy(dAtA[i:], keysForHooks[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForHooks[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xca + } + } if m.ArchiveLogs != nil { i-- if *m.ArchiveLogs { @@ -12337,6 +12376,8 @@ func (m *LifecycleHook) Size() (n int) { l = m.TemplateRef.Size() n += 1 + l + sovGenerated(uint64(l)) } + l = len(m.Expression) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -13706,6 +13747,15 @@ func (m *WorkflowSpec) Size() (n int) { if m.ArchiveLogs != nil { n += 3 } + if len(m.Hooks) > 0 { + for k, v := range m.Hooks { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -14658,6 +14708,7 @@ func (this *LifecycleHook) String() string { `Template:` + fmt.Sprintf("%v", this.Template) + `,`, `Arguments:` + strings.Replace(strings.Replace(this.Arguments.String(), "Arguments", "Arguments", 1), `&`, ``, 1) + `,`, `TemplateRef:` + strings.Replace(this.TemplateRef.String(), "TemplateRef", "TemplateRef", 1) + `,`, + `Expression:` + fmt.Sprintf("%v", this.Expression) + `,`, `}`, }, "") return s @@ -15578,6 +15629,16 @@ func (this *WorkflowSpec) String() string { mapStringForNodeSelector += fmt.Sprintf("%v: %v,", k, this.NodeSelector[k]) } mapStringForNodeSelector += "}" + keysForHooks := make([]string, 0, len(this.Hooks)) + for k := range this.Hooks { + keysForHooks = append(keysForHooks, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForHooks) + mapStringForHooks := "LifecycleHooks{" + for _, k := range keysForHooks { + mapStringForHooks += fmt.Sprintf("%v: %v,", k, this.Hooks[LifecycleEvent(k)]) + } + mapStringForHooks += "}" s := strings.Join([]string{`&WorkflowSpec{`, `Templates:` + repeatedStringForTemplates + `,`, `Entrypoint:` + fmt.Sprintf("%v", this.Entrypoint) + `,`, @@ -15618,6 +15679,7 @@ func (this *WorkflowSpec) String() string { `PodMetadata:` + strings.Replace(this.PodMetadata.String(), "Metadata", "Metadata", 1) + `,`, `TemplateDefaults:` + strings.Replace(this.TemplateDefaults.String(), "Template", "Template", 1) + `,`, `ArchiveLogs:` + valueToStringGenerated(this.ArchiveLogs) + `,`, + `Hooks:` + mapStringForHooks + `,`, `}`, }, "") return s @@ -23586,6 +23648,38 @@ func (m *LifecycleHook) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Expression", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Expression = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -35424,6 +35518,135 @@ func (m *WorkflowSpec) Unmarshal(dAtA []byte) error { } b := bool(v != 0) m.ArchiveLogs = &b + case 41: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hooks", 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.Hooks == nil { + m.Hooks = make(LifecycleHooks) + } + var mapkey LifecycleEvent + mapvalue := &LifecycleHook{} + for iNdEx < postIndex { + entryPreIndex := 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) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = LifecycleEvent(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &LifecycleHook{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Hooks[LifecycleEvent(mapkey)] = *mapvalue + 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 b16a4783af97..ad7831942018 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -658,6 +658,10 @@ message LifecycleHook { // TemplateRef is the reference to the template resource to execute by the hook optional TemplateRef templateRef = 3; + + // Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not + // be retried and the retry strategy will be ignored + optional string expression = 4; } // A link to another app. @@ -1729,6 +1733,10 @@ message WorkflowSpec { // ArchiveLogs indicates if the container logs should be archived optional bool archiveLogs = 40; + + // Hooks holds the lifecycle hook which is invoked at lifecycle of + // step, irrespective of the success, failure, or error status of the primary step + map hooks = 41; } // WorkflowStatus contains overall status information about a workflow diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index b9d65229dfbd..d7badd8b37a6 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -2765,6 +2765,13 @@ func schema_pkg_apis_workflow_v1alpha1_LifecycleHook(ref common.ReferenceCallbac Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TemplateRef"), }, }, + "expression": { + SchemaProps: spec.SchemaProps{ + Description: "Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored", + Type: []string{"string"}, + Format: "", + }, + }, }, Required: []string{"template"}, }, @@ -6411,11 +6418,26 @@ func schema_pkg_apis_workflow_v1alpha1_WorkflowSpec(ref common.ReferenceCallback Format: "", }, }, + "hooks": { + SchemaProps: spec.SchemaProps{ + Description: "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.LifecycleHook"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Arguments", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ArtifactRepositoryRef", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ExecutorConfig", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metadata", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metrics", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.PodGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.RetryStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Synchronization", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TTLStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Template", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.VolumeClaimGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTemplateRef", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume", "k8s.io/api/policy/v1beta1.PodDisruptionBudgetSpec"}, + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Arguments", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ArtifactRepositoryRef", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ExecutorConfig", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.LifecycleHook", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metadata", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metrics", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.PodGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.RetryStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Synchronization", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TTLStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Template", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.VolumeClaimGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTemplateRef", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume", "k8s.io/api/policy/v1beta1.PodDisruptionBudgetSpec"}, } } @@ -7318,6 +7340,21 @@ func schema_pkg_apis_workflow_v1alpha1_WorkflowTemplateSpec(ref common.Reference Format: "", }, }, + "hooks": { + SchemaProps: spec.SchemaProps{ + Description: "Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.LifecycleHook"), + }, + }, + }, + }, + }, "workflowMetadata": { SchemaProps: spec.SchemaProps{ Description: "WorkflowMetadata contains some metadata of the workflow to be refer", @@ -7328,7 +7365,7 @@ func schema_pkg_apis_workflow_v1alpha1_WorkflowTemplateSpec(ref common.Reference }, }, Dependencies: []string{ - "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Arguments", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ArtifactRepositoryRef", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ExecutorConfig", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metadata", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metrics", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.PodGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.RetryStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Synchronization", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TTLStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Template", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.VolumeClaimGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTemplateRef", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume", "k8s.io/api/policy/v1beta1.PodDisruptionBudgetSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Arguments", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ArtifactRepositoryRef", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.ExecutorConfig", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.LifecycleHook", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metadata", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Metrics", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.PodGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.RetryStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Synchronization", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.TTLStrategy", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Template", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.VolumeClaimGC", "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTemplateRef", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.HostAlias", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PersistentVolumeClaim", "k8s.io/api/core/v1.PodDNSConfig", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration", "k8s.io/api/core/v1.Volume", "k8s.io/api/policy/v1beta1.PodDisruptionBudgetSpec", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, } } diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 60c7891e60f4..b5e8be4ccce1 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -373,6 +373,24 @@ type WorkflowSpec struct { // ArchiveLogs indicates if the container logs should be archived ArchiveLogs *bool `json:"archiveLogs,omitempty" protobuf:"varint,40,opt,name=archiveLogs"` + + // Hooks holds the lifecycle hook which is invoked at lifecycle of + // step, irrespective of the success, failure, or error status of the primary step + Hooks LifecycleHooks `json:"hooks,omitempty" protobuf:"bytes,41,opt,name=hooks"` +} + +func (wfs *WorkflowSpec) GetExitHook(args Arguments) *LifecycleHook { + if !wfs.HasExitHook() { + return nil + } + if wfs.OnExit != "" { + return &LifecycleHook{Template: wfs.OnExit, Arguments: args} + } + return wfs.Hooks.GetExitHook().WithArgs(args) +} + +func (wfs *WorkflowSpec) HasExitHook() bool { + return (wfs.Hooks != nil && wfs.Hooks.HasExitHook()) || wfs.OnExit != "" } // GetVolumeClaimGC returns the VolumeClaimGC that was defined in the workflow spec. If none was provided, a default value is returned. @@ -1203,6 +1221,10 @@ func (lchs LifecycleHooks) GetExitHook() *LifecycleHook { return nil } +func (lchs LifecycleHooks) HasExitHook() bool { + return lchs.GetExitHook() != nil +} + type LifecycleHook struct { // Template is the name of the template to execute by the hook Template string `json:"template," protobuf:"bytes,1,opt,name=template"` @@ -1210,6 +1232,9 @@ type LifecycleHook struct { Arguments Arguments `json:"arguments,omitempty" protobuf:"bytes,2,opt,name=arguments"` // TemplateRef is the reference to the template resource to execute by the hook TemplateRef *TemplateRef `json:"templateRef,omitempty" protobuf:"bytes,3,opt,name=templateRef"` + // Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not + // be retried and the retry strategy will be ignored + Expression string `json:"expression,omitempty" protobuf:"bytes,4,opt,name=expression"` } func (lch *LifecycleHook) WithArgs(args Arguments) *LifecycleHook { @@ -1223,7 +1248,7 @@ func (lch *LifecycleHook) WithArgs(args Arguments) *LifecycleHook { var _ TemplateReferenceHolder = &WorkflowStep{} func (step *WorkflowStep) HasExitHook() bool { - return (step.Hooks != nil && step.Hooks.GetExitHook() != nil) || step.OnExit != "" + return (step.Hooks != nil && step.Hooks.HasExitHook()) || step.OnExit != "" } func (step *WorkflowStep) GetExitHook(args Arguments) *LifecycleHook { @@ -2541,7 +2566,7 @@ func (t *DAGTask) GetExitHook(args Arguments) *LifecycleHook { } func (t *DAGTask) HasExitHook() bool { - return (t.Hooks != nil && t.Hooks.GetExitHook() != nil) || t.OnExit != "" + return (t.Hooks != nil && t.Hooks.HasExitHook()) || t.OnExit != "" } func (t *DAGTask) GetTemplate() *Template { diff --git a/pkg/apis/workflow/v1alpha1/workflow_types_test.go b/pkg/apis/workflow/v1alpha1/workflow_types_test.go index 881be5ba2527..e0e59c8bd127 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types_test.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types_test.go @@ -1069,3 +1069,30 @@ func TestTemplateGetType(t *testing.T) { tmpl := Template{HTTP: &HTTP{}} assert.Equal(t, TemplateTypeHTTP, tmpl.GetType()) } + +func TestWfSpecGetExitHook(t *testing.T) { + wfSpec := WorkflowSpec{OnExit: "test"} + hooks := wfSpec.GetExitHook(wfSpec.Arguments) + assert.Equal(t, "test", hooks.Template) + wfSpec = WorkflowSpec{Hooks: LifecycleHooks{"exit": LifecycleHook{Template: "hook"}}} + hooks = wfSpec.GetExitHook(wfSpec.Arguments) + assert.Equal(t, "hook", hooks.Template) +} + +func TestDagSpecGetExitHook(t *testing.T) { + dagTask := DAGTask{Name: "A", OnExit: "test"} + hooks := dagTask.GetExitHook(dagTask.Arguments) + assert.Equal(t, "test", hooks.Template) + dagTask = DAGTask{Name: "A", Hooks: LifecycleHooks{"exit": LifecycleHook{Template: "hook"}}} + hooks = dagTask.GetExitHook(dagTask.Arguments) + assert.Equal(t, "hook", hooks.Template) +} + +func TestStepSpecGetExitHook(t *testing.T) { + step := WorkflowStep{Name: "A", OnExit: "test"} + hooks := step.GetExitHook(step.Arguments) + assert.Equal(t, "test", hooks.Template) + step = WorkflowStep{Name: "A", Hooks: LifecycleHooks{"exit": LifecycleHook{Template: "hook"}}} + hooks = step.GetExitHook(step.Arguments) + assert.Equal(t, "hook", hooks.Template) +} diff --git a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go index 9d21c5d5c314..0621b956e681 100644 --- a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go @@ -3167,6 +3167,13 @@ func (in *WorkflowSpec) DeepCopyInto(out *WorkflowSpec) { *out = new(bool) **out = **in } + if in.Hooks != nil { + in, out := &in.Hooks, &out.Hooks + *out = make(LifecycleHooks, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } return } diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md index 3fc623a0fc40..c4b0ff16703f 100644 --- a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md @@ -8,6 +8,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **arguments** | [**IoArgoprojWorkflowV1alpha1Arguments**](IoArgoprojWorkflowV1alpha1Arguments.md) | | [optional] +**expression** | **String** | Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored | [optional] **template** | **String** | Template is the name of the template to execute by the hook | **templateRef** | [**IoArgoprojWorkflowV1alpha1TemplateRef**](IoArgoprojWorkflowV1alpha1TemplateRef.md) | | [optional] diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md index 2f1389c41493..3de6152989a4 100644 --- a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md @@ -18,6 +18,7 @@ Name | Type | Description | Notes **dnsPolicy** | **String** | Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. | [optional] **entrypoint** | **String** | Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1. | [optional] **executor** | [**IoArgoprojWorkflowV1alpha1ExecutorConfig**](IoArgoprojWorkflowV1alpha1ExecutorConfig.md) | | [optional] +**hooks** | [**Map<String, IoArgoprojWorkflowV1alpha1LifecycleHook>**](IoArgoprojWorkflowV1alpha1LifecycleHook.md) | Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step | [optional] **hostAliases** | [**List<io.kubernetes.client.openapi.models.V1HostAlias>**](io.kubernetes.client.openapi.models.V1HostAlias.md) | | [optional] **hostNetwork** | **Boolean** | Host networking requested for this workflow pod. Default to false. | [optional] **imagePullSecrets** | [**List<io.kubernetes.client.openapi.models.V1LocalObjectReference>**](io.kubernetes.client.openapi.models.V1LocalObjectReference.md) | ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod | [optional] diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md index ffea8fc2aff3..b92ba0efa72f 100644 --- a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md @@ -18,6 +18,7 @@ Name | Type | Description | Notes **dnsPolicy** | **String** | Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. | [optional] **entrypoint** | **String** | Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1. | [optional] **executor** | [**IoArgoprojWorkflowV1alpha1ExecutorConfig**](IoArgoprojWorkflowV1alpha1ExecutorConfig.md) | | [optional] +**hooks** | [**Map<String, IoArgoprojWorkflowV1alpha1LifecycleHook>**](IoArgoprojWorkflowV1alpha1LifecycleHook.md) | Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step | [optional] **hostAliases** | [**List<io.kubernetes.client.openapi.models.V1HostAlias>**](io.kubernetes.client.openapi.models.V1HostAlias.md) | | [optional] **hostNetwork** | **Boolean** | Host networking requested for this workflow pod. Default to false. | [optional] **imagePullSecrets** | [**List<io.kubernetes.client.openapi.models.V1LocalObjectReference>**](io.kubernetes.client.openapi.models.V1LocalObjectReference.md) | ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod | [optional] diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_lifecycle_hook.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_lifecycle_hook.py index ecf32afd4690..d2a32eb7f8bc 100644 --- a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_lifecycle_hook.py +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_lifecycle_hook.py @@ -91,6 +91,7 @@ def openapi_types(): return { 'template': (str,), # noqa: E501 'arguments': (IoArgoprojWorkflowV1alpha1Arguments,), # noqa: E501 + 'expression': (str,), # noqa: E501 'template_ref': (IoArgoprojWorkflowV1alpha1TemplateRef,), # noqa: E501 } @@ -102,6 +103,7 @@ def discriminator(): attribute_map = { 'template': 'template', # noqa: E501 'arguments': 'arguments', # noqa: E501 + 'expression': 'expression', # noqa: E501 'template_ref': 'templateRef', # noqa: E501 } @@ -150,6 +152,7 @@ def _from_openapi_data(cls, template, *args, **kwargs): # noqa: E501 through its discriminator because we passed in _visited_composed_classes = (Animal,) arguments (IoArgoprojWorkflowV1alpha1Arguments): [optional] # noqa: E501 + expression (str): Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored. [optional] # noqa: E501 template_ref (IoArgoprojWorkflowV1alpha1TemplateRef): [optional] # noqa: E501 """ @@ -237,6 +240,7 @@ def __init__(self, template, *args, **kwargs): # noqa: E501 through its discriminator because we passed in _visited_composed_classes = (Animal,) arguments (IoArgoprojWorkflowV1alpha1Arguments): [optional] # noqa: E501 + expression (str): Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored. [optional] # noqa: E501 template_ref (IoArgoprojWorkflowV1alpha1TemplateRef): [optional] # noqa: E501 """ diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_spec.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_spec.py index 125d863203af..9720f36ed8db 100644 --- a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_spec.py +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_spec.py @@ -35,6 +35,7 @@ def lazy_import(): from argo_workflows.model.io_argoproj_workflow_v1alpha1_arguments import IoArgoprojWorkflowV1alpha1Arguments from argo_workflows.model.io_argoproj_workflow_v1alpha1_artifact_repository_ref import IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef from argo_workflows.model.io_argoproj_workflow_v1alpha1_executor_config import IoArgoprojWorkflowV1alpha1ExecutorConfig + from argo_workflows.model.io_argoproj_workflow_v1alpha1_lifecycle_hook import IoArgoprojWorkflowV1alpha1LifecycleHook from argo_workflows.model.io_argoproj_workflow_v1alpha1_metadata import IoArgoprojWorkflowV1alpha1Metadata from argo_workflows.model.io_argoproj_workflow_v1alpha1_metrics import IoArgoprojWorkflowV1alpha1Metrics from argo_workflows.model.io_argoproj_workflow_v1alpha1_pod_gc import IoArgoprojWorkflowV1alpha1PodGC @@ -56,6 +57,7 @@ def lazy_import(): globals()['IoArgoprojWorkflowV1alpha1Arguments'] = IoArgoprojWorkflowV1alpha1Arguments globals()['IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef'] = IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef globals()['IoArgoprojWorkflowV1alpha1ExecutorConfig'] = IoArgoprojWorkflowV1alpha1ExecutorConfig + globals()['IoArgoprojWorkflowV1alpha1LifecycleHook'] = IoArgoprojWorkflowV1alpha1LifecycleHook globals()['IoArgoprojWorkflowV1alpha1Metadata'] = IoArgoprojWorkflowV1alpha1Metadata globals()['IoArgoprojWorkflowV1alpha1Metrics'] = IoArgoprojWorkflowV1alpha1Metrics globals()['IoArgoprojWorkflowV1alpha1PodGC'] = IoArgoprojWorkflowV1alpha1PodGC @@ -137,6 +139,7 @@ def openapi_types(): 'dns_policy': (str,), # noqa: E501 'entrypoint': (str,), # noqa: E501 'executor': (IoArgoprojWorkflowV1alpha1ExecutorConfig,), # noqa: E501 + 'hooks': ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)},), # noqa: E501 'host_aliases': ([HostAlias],), # noqa: E501 'host_network': (bool,), # noqa: E501 'image_pull_secrets': ([LocalObjectReference],), # noqa: E501 @@ -184,6 +187,7 @@ def discriminator(): 'dns_policy': 'dnsPolicy', # noqa: E501 'entrypoint': 'entrypoint', # noqa: E501 'executor': 'executor', # noqa: E501 + 'hooks': 'hooks', # noqa: E501 'host_aliases': 'hostAliases', # noqa: E501 'host_network': 'hostNetwork', # noqa: E501 'image_pull_secrets': 'imagePullSecrets', # noqa: E501 @@ -266,6 +270,7 @@ def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 dns_policy (str): Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.. [optional] # noqa: E501 entrypoint (str): Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.. [optional] # noqa: E501 executor (IoArgoprojWorkflowV1alpha1ExecutorConfig): [optional] # noqa: E501 + hooks ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}): Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step. [optional] # noqa: E501 host_aliases ([HostAlias]): [optional] # noqa: E501 host_network (bool): Host networking requested for this workflow pod. Default to false.. [optional] # noqa: E501 image_pull_secrets ([LocalObjectReference]): ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod. [optional] # noqa: E501 @@ -386,6 +391,7 @@ def __init__(self, *args, **kwargs): # noqa: E501 dns_policy (str): Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.. [optional] # noqa: E501 entrypoint (str): Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.. [optional] # noqa: E501 executor (IoArgoprojWorkflowV1alpha1ExecutorConfig): [optional] # noqa: E501 + hooks ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}): Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step. [optional] # noqa: E501 host_aliases ([HostAlias]): [optional] # noqa: E501 host_network (bool): Host networking requested for this workflow pod. Default to false.. [optional] # noqa: E501 image_pull_secrets ([LocalObjectReference]): ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod. [optional] # noqa: E501 diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_template_spec.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_template_spec.py index d2e69554af56..8a7a9881453a 100644 --- a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_template_spec.py +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_workflow_template_spec.py @@ -35,6 +35,7 @@ def lazy_import(): from argo_workflows.model.io_argoproj_workflow_v1alpha1_arguments import IoArgoprojWorkflowV1alpha1Arguments from argo_workflows.model.io_argoproj_workflow_v1alpha1_artifact_repository_ref import IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef from argo_workflows.model.io_argoproj_workflow_v1alpha1_executor_config import IoArgoprojWorkflowV1alpha1ExecutorConfig + from argo_workflows.model.io_argoproj_workflow_v1alpha1_lifecycle_hook import IoArgoprojWorkflowV1alpha1LifecycleHook from argo_workflows.model.io_argoproj_workflow_v1alpha1_metadata import IoArgoprojWorkflowV1alpha1Metadata from argo_workflows.model.io_argoproj_workflow_v1alpha1_metrics import IoArgoprojWorkflowV1alpha1Metrics from argo_workflows.model.io_argoproj_workflow_v1alpha1_pod_gc import IoArgoprojWorkflowV1alpha1PodGC @@ -57,6 +58,7 @@ def lazy_import(): globals()['IoArgoprojWorkflowV1alpha1Arguments'] = IoArgoprojWorkflowV1alpha1Arguments globals()['IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef'] = IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef globals()['IoArgoprojWorkflowV1alpha1ExecutorConfig'] = IoArgoprojWorkflowV1alpha1ExecutorConfig + globals()['IoArgoprojWorkflowV1alpha1LifecycleHook'] = IoArgoprojWorkflowV1alpha1LifecycleHook globals()['IoArgoprojWorkflowV1alpha1Metadata'] = IoArgoprojWorkflowV1alpha1Metadata globals()['IoArgoprojWorkflowV1alpha1Metrics'] = IoArgoprojWorkflowV1alpha1Metrics globals()['IoArgoprojWorkflowV1alpha1PodGC'] = IoArgoprojWorkflowV1alpha1PodGC @@ -139,6 +141,7 @@ def openapi_types(): 'dns_policy': (str,), # noqa: E501 'entrypoint': (str,), # noqa: E501 'executor': (IoArgoprojWorkflowV1alpha1ExecutorConfig,), # noqa: E501 + 'hooks': ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)},), # noqa: E501 'host_aliases': ([HostAlias],), # noqa: E501 'host_network': (bool,), # noqa: E501 'image_pull_secrets': ([LocalObjectReference],), # noqa: E501 @@ -187,6 +190,7 @@ def discriminator(): 'dns_policy': 'dnsPolicy', # noqa: E501 'entrypoint': 'entrypoint', # noqa: E501 'executor': 'executor', # noqa: E501 + 'hooks': 'hooks', # noqa: E501 'host_aliases': 'hostAliases', # noqa: E501 'host_network': 'hostNetwork', # noqa: E501 'image_pull_secrets': 'imagePullSecrets', # noqa: E501 @@ -270,6 +274,7 @@ def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 dns_policy (str): Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.. [optional] # noqa: E501 entrypoint (str): Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.. [optional] # noqa: E501 executor (IoArgoprojWorkflowV1alpha1ExecutorConfig): [optional] # noqa: E501 + hooks ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}): Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step. [optional] # noqa: E501 host_aliases ([HostAlias]): [optional] # noqa: E501 host_network (bool): Host networking requested for this workflow pod. Default to false.. [optional] # noqa: E501 image_pull_secrets ([LocalObjectReference]): ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod. [optional] # noqa: E501 @@ -391,6 +396,7 @@ def __init__(self, *args, **kwargs): # noqa: E501 dns_policy (str): Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'.. [optional] # noqa: E501 entrypoint (str): Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1.. [optional] # noqa: E501 executor (IoArgoprojWorkflowV1alpha1ExecutorConfig): [optional] # noqa: E501 + hooks ({str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}): Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step. [optional] # noqa: E501 host_aliases ([HostAlias]): [optional] # noqa: E501 host_network (bool): Host networking requested for this workflow pod. Default to false.. [optional] # noqa: E501 image_pull_secrets ([LocalObjectReference]): ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod. [optional] # noqa: E501 diff --git a/sdks/python/client/docs/ClusterWorkflowTemplateServiceApi.md b/sdks/python/client/docs/ClusterWorkflowTemplateServiceApi.md index ae79b407d676..022b6ddaa650 100644 --- a/sdks/python/client/docs/ClusterWorkflowTemplateServiceApi.md +++ b/sdks/python/client/docs/ClusterWorkflowTemplateServiceApi.md @@ -456,6 +456,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -1809,6 +2008,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -3666,6 +3866,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -5212,6 +5413,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -7069,6 +7271,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -8466,44 +8669,243 @@ with argo_workflows.ApiClient() as api_client: config_map_key_ref=ConfigMapKeySelector( key="key_example", name="name_example", - optional=True, + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( + config_map="config_map_example", + key="key_example", + ), + automount_service_account_token=True, + dns_config=PodDNSConfig( + nameservers=[ + "nameservers_example", + ], + options=[ + PodDNSConfigOption( + name="name_example", + value="value_example", + ), + ], + searches=[ + "searches_example", + ], + ), + dns_policy="dns_policy_example", + entrypoint="entrypoint_example", + executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( + service_account_name="service_account_name_example", + ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), ), - default="default_example", - event="event_example", - expression="expression_example", - jq_filter="jq_filter_example", - json_path="json_path_example", - parameter="parameter_example", - path="path_example", - supplied={}, - ), + ], ), - ], - ), - artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( - config_map="config_map_example", - key="key_example", - ), - automount_service_account_token=True, - dns_config=PodDNSConfig( - nameservers=[ - "nameservers_example", - ], - options=[ - PodDNSConfigOption( + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, name="name_example", - value="value_example", + template="template_example", ), - ], - searches=[ - "searches_example", - ], - ), - dns_policy="dns_policy_example", - entrypoint="entrypoint_example", - executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( - service_account_name="service_account_name_example", - ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -9857,6 +10259,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -11714,6 +12117,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -13260,6 +13664,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -15117,6 +15522,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -16470,6 +16876,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -17823,6 +18428,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -19680,6 +20286,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -21226,6 +21833,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -23083,6 +23691,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, diff --git a/sdks/python/client/docs/CronWorkflowServiceApi.md b/sdks/python/client/docs/CronWorkflowServiceApi.md index 2de538be4133..ff5df6e4f797 100644 --- a/sdks/python/client/docs/CronWorkflowServiceApi.md +++ b/sdks/python/client/docs/CronWorkflowServiceApi.md @@ -509,6 +509,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -1862,6 +2061,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -3719,6 +3919,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -5265,6 +5466,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -7122,6 +7324,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -8550,44 +8753,243 @@ with argo_workflows.ApiClient() as api_client: config_map_key_ref=ConfigMapKeySelector( key="key_example", name="name_example", - optional=True, + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( + config_map="config_map_example", + key="key_example", + ), + automount_service_account_token=True, + dns_config=PodDNSConfig( + nameservers=[ + "nameservers_example", + ], + options=[ + PodDNSConfigOption( + name="name_example", + value="value_example", + ), + ], + searches=[ + "searches_example", + ], + ), + dns_policy="dns_policy_example", + entrypoint="entrypoint_example", + executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( + service_account_name="service_account_name_example", + ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), ), - default="default_example", - event="event_example", - expression="expression_example", - jq_filter="jq_filter_example", - json_path="json_path_example", - parameter="parameter_example", - path="path_example", - supplied={}, - ), + ], ), - ], - ), - artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( - config_map="config_map_example", - key="key_example", - ), - automount_service_account_token=True, - dns_config=PodDNSConfig( - nameservers=[ - "nameservers_example", - ], - options=[ - PodDNSConfigOption( + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, name="name_example", - value="value_example", + template="template_example", ), - ], - searches=[ - "searches_example", - ], - ), - dns_policy="dns_policy_example", - entrypoint="entrypoint_example", - executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( - service_account_name="service_account_name_example", - ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -9941,6 +10343,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -11798,6 +12201,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -13344,6 +13748,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -15201,6 +15606,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -16739,6 +17145,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -18092,6 +18697,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -19949,6 +20555,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -21495,6 +22102,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -23352,6 +23960,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md index 0d166ee6c823..283ca30e77fd 100644 --- a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1LifecycleHook.md @@ -6,6 +6,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **template** | **str** | Template is the name of the template to execute by the hook | **arguments** | [**IoArgoprojWorkflowV1alpha1Arguments**](IoArgoprojWorkflowV1alpha1Arguments.md) | | [optional] +**expression** | **str** | Expression is a condition expression for when a node will be retried. If it evaluates to false, the node will not be retried and the retry strategy will be ignored | [optional] **template_ref** | [**IoArgoprojWorkflowV1alpha1TemplateRef**](IoArgoprojWorkflowV1alpha1TemplateRef.md) | | [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] diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md index db35d29bfa3d..e1c6b943a031 100644 --- a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowSpec.md @@ -15,6 +15,7 @@ Name | Type | Description | Notes **dns_policy** | **str** | Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. | [optional] **entrypoint** | **str** | Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1. | [optional] **executor** | [**IoArgoprojWorkflowV1alpha1ExecutorConfig**](IoArgoprojWorkflowV1alpha1ExecutorConfig.md) | | [optional] +**hooks** | [**{str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}**](IoArgoprojWorkflowV1alpha1LifecycleHook.md) | Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step | [optional] **host_aliases** | [**[HostAlias]**](HostAlias.md) | | [optional] **host_network** | **bool** | Host networking requested for this workflow pod. Default to false. | [optional] **image_pull_secrets** | [**[LocalObjectReference]**](LocalObjectReference.md) | ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod | [optional] diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md index acad0676f93f..5349531a6847 100644 --- a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1WorkflowTemplateSpec.md @@ -15,6 +15,7 @@ Name | Type | Description | Notes **dns_policy** | **str** | Set DNS policy for the pod. Defaults to \"ClusterFirst\". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. | [optional] **entrypoint** | **str** | Entrypoint is a template reference to the starting point of the io.argoproj.workflow.v1alpha1. | [optional] **executor** | [**IoArgoprojWorkflowV1alpha1ExecutorConfig**](IoArgoprojWorkflowV1alpha1ExecutorConfig.md) | | [optional] +**hooks** | [**{str: (IoArgoprojWorkflowV1alpha1LifecycleHook,)}**](IoArgoprojWorkflowV1alpha1LifecycleHook.md) | Hooks holds the lifecycle hook which is invoked at lifecycle of step, irrespective of the success, failure, or error status of the primary step | [optional] **host_aliases** | [**[HostAlias]**](HostAlias.md) | | [optional] **host_network** | **bool** | Host networking requested for this workflow pod. Default to false. | [optional] **image_pull_secrets** | [**[LocalObjectReference]**](LocalObjectReference.md) | ImagePullSecrets is a list of references to secrets in the same namespace to use for pulling any images in pods that reference this ServiceAccount. ImagePullSecrets are distinct from Secrets because Secrets can be mounted in the pod, but ImagePullSecrets are only accessed by the kubelet. More info: https://kubernetes.io/docs/concepts/containers/images/#specifying-imagepullsecrets-on-a-pod | [optional] diff --git a/sdks/python/client/docs/WorkflowServiceApi.md b/sdks/python/client/docs/WorkflowServiceApi.md index a0645602872a..c549222cbe3a 100644 --- a/sdks/python/client/docs/WorkflowServiceApi.md +++ b/sdks/python/client/docs/WorkflowServiceApi.md @@ -471,6 +471,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -1824,6 +2023,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -3681,6 +3881,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -5227,6 +5428,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -7084,6 +7286,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -10063,6 +10266,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -11920,6 +12124,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -12628,6 +12833,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -13981,6 +14385,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -15838,6 +16243,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -17384,6 +17790,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -19241,6 +19648,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -20672,6 +21080,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -22025,6 +22632,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -23882,6 +24490,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -25428,6 +26037,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -27285,6 +27895,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -30264,6 +30875,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -32121,6 +32733,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -32829,6 +33442,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -34182,6 +34994,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -36039,6 +36852,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -37585,6 +38399,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -39442,6 +40257,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, diff --git a/sdks/python/client/docs/WorkflowTemplateServiceApi.md b/sdks/python/client/docs/WorkflowTemplateServiceApi.md index 75bf53ba14ad..1f8c505bfb64 100644 --- a/sdks/python/client/docs/WorkflowTemplateServiceApi.md +++ b/sdks/python/client/docs/WorkflowTemplateServiceApi.md @@ -458,6 +458,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -1811,6 +2010,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -3668,6 +3868,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -5214,6 +5415,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -7071,6 +7273,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -8475,44 +8678,243 @@ with argo_workflows.ApiClient() as api_client: config_map_key_ref=ConfigMapKeySelector( key="key_example", name="name_example", - optional=True, + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( + config_map="config_map_example", + key="key_example", + ), + automount_service_account_token=True, + dns_config=PodDNSConfig( + nameservers=[ + "nameservers_example", + ], + options=[ + PodDNSConfigOption( + name="name_example", + value="value_example", + ), + ], + searches=[ + "searches_example", + ], + ), + dns_policy="dns_policy_example", + entrypoint="entrypoint_example", + executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( + service_account_name="service_account_name_example", + ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), ), - default="default_example", - event="event_example", - expression="expression_example", - jq_filter="jq_filter_example", - json_path="json_path_example", - parameter="parameter_example", - path="path_example", - supplied={}, - ), + ], ), - ], - ), - artifact_repository_ref=IoArgoprojWorkflowV1alpha1ArtifactRepositoryRef( - config_map="config_map_example", - key="key_example", - ), - automount_service_account_token=True, - dns_config=PodDNSConfig( - nameservers=[ - "nameservers_example", - ], - options=[ - PodDNSConfigOption( + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, name="name_example", - value="value_example", + template="template_example", ), - ], - searches=[ - "searches_example", - ], - ), - dns_policy="dns_policy_example", - entrypoint="entrypoint_example", - executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( - service_account_name="service_account_name_example", - ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -9866,6 +10268,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -11723,6 +12126,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -13269,6 +13673,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -15126,6 +15531,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -16491,6 +16897,205 @@ with argo_workflows.ApiClient() as api_client: executor=IoArgoprojWorkflowV1alpha1ExecutorConfig( service_account_name="service_account_name_example", ), + hooks={ + "key": IoArgoprojWorkflowV1alpha1LifecycleHook( + arguments=IoArgoprojWorkflowV1alpha1Arguments( + artifacts=[ + IoArgoprojWorkflowV1alpha1Artifact( + archive=IoArgoprojWorkflowV1alpha1ArchiveStrategy( + _none={}, + tar=IoArgoprojWorkflowV1alpha1TarStrategy( + compression_level=1, + ), + zip={}, + ), + archive_logs=True, + artifactory=IoArgoprojWorkflowV1alpha1ArtifactoryArtifact( + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + url="url_example", + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + _from="_from_example", + from_expression="from_expression_example", + gcs=IoArgoprojWorkflowV1alpha1GCSArtifact( + bucket="bucket_example", + key="key_example", + service_account_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + git=IoArgoprojWorkflowV1alpha1GitArtifact( + depth=1, + disable_submodules=True, + fetch=[ + "fetch_example", + ], + insecure_ignore_host_key=True, + password_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + repo="repo_example", + revision="revision_example", + ssh_private_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + username_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + global_name="global_name_example", + hdfs=IoArgoprojWorkflowV1alpha1HDFSArtifact( + addresses=[ + "addresses_example", + ], + force=True, + hdfs_user="hdfs_user_example", + krb_c_cache_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_config_config_map=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_keytab_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + krb_realm="krb_realm_example", + krb_service_principal_name="krb_service_principal_name_example", + krb_username="krb_username_example", + path="path_example", + ), + http=IoArgoprojWorkflowV1alpha1HTTPArtifact( + headers=[ + IoArgoprojWorkflowV1alpha1Header( + name="name_example", + value="value_example", + ), + ], + url="url_example", + ), + mode=1, + name="name_example", + optional=True, + oss=IoArgoprojWorkflowV1alpha1OSSArtifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=True, + endpoint="endpoint_example", + key="key_example", + lifecycle_rule=IoArgoprojWorkflowV1alpha1OSSLifecycleRule( + mark_deletion_after_days=1, + mark_infrequent_access_after_days=1, + ), + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + security_token="security_token_example", + ), + path="path_example", + raw=IoArgoprojWorkflowV1alpha1RawArtifact( + data="data_example", + ), + recurse_mode=True, + s3=IoArgoprojWorkflowV1alpha1S3Artifact( + access_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + bucket="bucket_example", + create_bucket_if_not_present=IoArgoprojWorkflowV1alpha1CreateS3BucketOptions( + object_locking=True, + ), + encryption_options=IoArgoprojWorkflowV1alpha1S3EncryptionOptions( + enable_encryption=True, + kms_encryption_context="kms_encryption_context_example", + kms_key_id="kms_key_id_example", + server_side_customer_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + ), + endpoint="endpoint_example", + insecure=True, + key="key_example", + region="region_example", + role_arn="role_arn_example", + secret_key_secret=SecretKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + use_sdk_creds=True, + ), + sub_path="sub_path_example", + ), + ], + parameters=[ + IoArgoprojWorkflowV1alpha1Parameter( + default="default_example", + description="description_example", + enum=[ + "enum_example", + ], + global_name="global_name_example", + name="name_example", + value="value_example", + value_from=IoArgoprojWorkflowV1alpha1ValueFrom( + config_map_key_ref=ConfigMapKeySelector( + key="key_example", + name="name_example", + optional=True, + ), + default="default_example", + event="event_example", + expression="expression_example", + jq_filter="jq_filter_example", + json_path="json_path_example", + parameter="parameter_example", + path="path_example", + supplied={}, + ), + ), + ], + ), + expression="expression_example", + template="template_example", + template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( + cluster_scope=True, + name="name_example", + template="template_example", + ), + ), + }, host_aliases=[ HostAlias( hostnames=[ @@ -17844,6 +18449,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -19701,6 +20307,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -21247,6 +21854,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, @@ -23104,6 +23712,7 @@ with argo_workflows.ApiClient() as api_client: ), ], ), + expression="expression_example", template="template_example", template_ref=IoArgoprojWorkflowV1alpha1TemplateRef( cluster_scope=True, diff --git a/util/template/expression_template.go b/util/template/expression_template.go index 219ef55abe14..e2982c2dc8a2 100644 --- a/util/template/expression_template.go +++ b/util/template/expression_template.go @@ -58,7 +58,7 @@ func expressionReplace(w io.Writer, expression string, env map[string]interface{ return w.Write(resultMarshaled[1 : marshaledLength-1]) } -func envMap(replaceMap map[string]string) map[string]interface{} { +func EnvMap(replaceMap map[string]string) map[string]interface{} { envMap := make(map[string]interface{}) for k, v := range replaceMap { envMap[k] = v diff --git a/util/template/template.go b/util/template/template.go index 97f2580b6810..e776b31b8b5f 100644 --- a/util/template/template.go +++ b/util/template/template.go @@ -36,7 +36,7 @@ func (t *impl) Replace(replaceMap map[string]string, allowUnresolved bool) (stri kind, expression := parseTag(tag) switch kind { case kindExpression: - env := exprenv.GetFuncMap(envMap(replaceMap)) + env := exprenv.GetFuncMap(EnvMap(replaceMap)) return expressionReplace(w, expression, env, allowUnresolved) default: return simpleReplace(w, tag, replaceMap, allowUnresolved) diff --git a/workflow/controller/dag.go b/workflow/controller/dag.go index 1f474d05b845..00fc56a13e7a 100644 --- a/workflow/controller/dag.go +++ b/workflow/controller/dag.go @@ -247,6 +247,21 @@ func (woc *wfOperationCtx) executeDAG(ctx context.Context, nodeName string, tmpl // complete (since the DAG itself will have succeeded). To ensure that their exit handlers are run we also run them here. Note that // calls to runOnExitNode are idempotent: it is fine if they are called more than once for the same task. taskNode := dagCtx.getTaskNode(taskName) + + if taskNode != nil { + task := dagCtx.GetTask(taskName) + scope, err := woc.buildLocalScopeFromTask(dagCtx, task) + if err != nil { + woc.markNodeError(node.Name, err) + return node, err + } + scope.addParamToScope(fmt.Sprintf("tasks.%s.status", task.Name), string(node.Phase)) + _, err = woc.executeTmplLifeCycleHook(ctx, woc.globalParams.Merge(scope.getParameters()), dagCtx.GetTask(taskName).Hooks, taskNode, dagCtx.boundaryID, dagCtx.tmplCtx, "tasks."+taskName) + if err != nil { + woc.markNodeError(node.Name, err) + return node, err + } + } if taskNode != nil && taskNode.Fulfilled() { if taskNode.Completed() { // Run the node's onExit node, if any. Since this is a target task, we don't need to consider the status @@ -358,6 +373,21 @@ func (woc *wfOperationCtx) executeDAGTask(ctx context.Context, dagCtx *dagContex woc.controller.syncManager.Release(woc.wf, node.ID, tmpl.Synchronization) } + task := dagCtx.GetTask(taskName) + scope, err := woc.buildLocalScopeFromTask(dagCtx, task) + if err != nil { + woc.markNodeError(node.Name, err) + } + scope.addParamToScope(fmt.Sprintf("tasks.%s.status", task.Name), string(node.Phase)) + hookCompleted, err := woc.executeTmplLifeCycleHook(ctx, woc.globalParams.Merge(scope.getParameters()), dagCtx.GetTask(taskName).Hooks, node, dagCtx.boundaryID, dagCtx.tmplCtx, "tasks."+taskName) + if err != nil { + woc.markNodeError(node.Name, err) + } + // Check all hooks are completes + if !hookCompleted { + return + } + if node.Completed() { // Run the node's onExit node, if any. hasOnExitNode, onExitNode, err := woc.runOnExitNode(ctx, task.GetExitHook(woc.execWf.Spec.Arguments), node, dagCtx.boundaryID, dagCtx.tmplCtx, "tasks."+taskName) diff --git a/workflow/controller/hooks.go b/workflow/controller/hooks.go new file mode 100644 index 000000000000..573b1a28e4ec --- /dev/null +++ b/workflow/controller/hooks.go @@ -0,0 +1,91 @@ +package controller + +import ( + "context" + "fmt" + + wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/util/expr/argoexpr" + "github.com/argoproj/argo-workflows/v3/util/expr/env" + "github.com/argoproj/argo-workflows/v3/util/template" + "github.com/argoproj/argo-workflows/v3/workflow/templateresolution" +) + +func (woc *wfOperationCtx) executeWfLifeCycleHook(ctx context.Context, tmplCtx *templateresolution.Context) error { + for hookName, hook := range woc.wf.Spec.Hooks { + //exit hook will be execute in runOnExitNode + if hookName == wfv1.ExitLifecycleEvent { + continue + } + execute, err := argoexpr.EvalBool(hook.Expression, env.GetFuncMap(template.EnvMap(woc.globalParams))) + if err != nil { + return err + } + if execute { + hookNodeName := generateLifeHookNodeName(woc.wf.ObjectMeta.Name, string(hookName)) + woc.log.WithField("lifeCycleHook", hookName).WithField("node", hookNodeName).Infof("Running workflow level hooks") + _, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, hook.Arguments, &executeTemplateOpts{}) + if err != nil { + return err + } + woc.addChildNode(woc.wf.Name, hookNodeName) + } + } + + return nil +} + +func (woc *wfOperationCtx) executeTmplLifeCycleHook(ctx context.Context, envMap map[string]string, lifeCycleHooks wfv1.LifecycleHooks, parentNode *wfv1.NodeStatus, boundaryID string, tmplCtx *templateresolution.Context, prefix string) (bool, error) { + var hookNodes []*wfv1.NodeStatus + completed := false + for hookName, hook := range lifeCycleHooks { + //exit hook will be execute in runOnExitNode + if hookName == wfv1.ExitLifecycleEvent { + continue + } + execute, err := argoexpr.EvalBool(hook.Expression, env.GetFuncMap(template.EnvMap(envMap))) + if err != nil { + return completed, err + } + if execute { + outputs := parentNode.Outputs + if parentNode.Type == wfv1.NodeTypeRetry { + lastChildNode := getChildNodeIndex(parentNode, woc.wf.Status.Nodes, -1) + outputs = lastChildNode.Outputs + } + hookNodeName := generateLifeHookNodeName(parentNode.Name, string(hookName)) + woc.log.WithField("lifeCycleHook", hookName).WithField("node", hookNodeName).WithField("hookName", hookName).Info("Running hooks") + resolvedArgs := hook.Arguments + var err error + if !resolvedArgs.IsEmpty() && outputs != nil { + resolvedArgs, err = woc.resolveExitTmplArgument(hook.Arguments, prefix, outputs) + if err != nil { + return completed, err + } + } + hookNode, err := woc.executeTemplate(ctx, hookNodeName, &wfv1.WorkflowStep{Template: hook.Template, TemplateRef: hook.TemplateRef}, tmplCtx, resolvedArgs, &executeTemplateOpts{ + boundaryID: boundaryID, + }) + if err != nil { + return completed, err + } + woc.addChildNode(parentNode.Name, hookNodeName) + hookNodes = append(hookNodes, hookNode) + + } + } + completed = true + + // All hook nodes are completed + for _, hookNode := range hookNodes { + if !hookNode.Fulfilled() { + completed = false + break + } + } + return completed, nil +} + +func generateLifeHookNodeName(parentNodeName string, hookName string) string { + return fmt.Sprintf("%s.hooks.%s", parentNodeName, hookName) +} diff --git a/workflow/controller/hooks_test.go b/workflow/controller/hooks_test.go new file mode 100644 index 000000000000..fa6e093a38d1 --- /dev/null +++ b/workflow/controller/hooks_test.go @@ -0,0 +1,775 @@ +package controller + +import ( + "context" + "fmt" + "testing" + + "github.com/stretchr/testify/assert" + + wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" +) + +func TestExecuteWfLifeCycleHook(t *testing.T) { + wf := wfv1.MustUnmarshalWorkflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: lifecycle-hook-bgsf6 + namespace: argo + resourceVersion: "33638" +spec: + entrypoint: main + hooks: + exit: + template: http + error: + expression: workflow.status == "Error" + template: http + running: + expression: workflow.status == "Running" + template: http + templates: + - name: main + steps: + - - name: step1 + template: heads + - container: + args: + - echo "it was heads" + command: + - sh + - -c + image: alpine:3.6 + name: "" + name: heads + - http: + url: https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json + name: http +status: + artifactRepositoryRef: + artifactRepository: + archiveLogs: true + s3: + accessKeySecret: + key: accesskey + name: my-minio-cred + bucket: my-bucket + endpoint: minio:9000 + insecure: true + secretKeySecret: + key: secretkey + name: my-minio-cred + configMap: artifact-repositories + key: default-v1 + namespace: argo + conditions: + - status: "False" + type: PodRunning + - status: "True" + type: Completed + finishedAt: "2022-01-26T19:25:42Z" + nodes: + lifecycle-hook-bgsf6: + children: + - lifecycle-hook-bgsf6-2367710970 + displayName: lifecycle-hook-bgsf6 + finishedAt: "2022-01-26T19:25:42Z" + id: lifecycle-hook-bgsf6 + name: lifecycle-hook-bgsf6 + outboundNodes: + - lifecycle-hook-bgsf6-3057272397 + phase: Error + progress: 1/1 + resourcesDuration: + cpu: 4 + memory: 2 + startedAt: "2022-01-26T19:23:48Z" + templateName: main + templateScope: local/lifecycle-hook-bgsf6 + type: Steps + lifecycle-hook-bgsf6-2367710970: + boundaryID: lifecycle-hook-bgsf6 + children: + - lifecycle-hook-bgsf6-3057272397 + displayName: '[0]' + finishedAt: "2022-01-26T19:25:42Z" + id: lifecycle-hook-bgsf6-2367710970 + name: lifecycle-hook-bgsf6[0] + phase: Error + progress: 1/1 + resourcesDuration: + cpu: 4 + memory: 2 + startedAt: "2022-01-26T19:23:48Z" + templateScope: local/lifecycle-hook-bgsf6 + type: StepGroup + lifecycle-hook-bgsf6-3057272397: + boundaryID: lifecycle-hook-bgsf6 + displayName: step1 + finishedAt: "2022-01-26T19:25:41Z" + hostNodeName: k3d-k3s-default-server-0 + id: lifecycle-hook-bgsf6-3057272397 + name: lifecycle-hook-bgsf6[0].step1 + outputs: + artifacts: + - name: main-logs + s3: + key: lifecycle-hook-bgsf6/lifecycle-hook-bgsf6-3057272397/main.log + exitCode: "0" + phase: Error + progress: 1/1 + resourcesDuration: + cpu: 4 + memory: 2 + startedAt: "2022-01-26T19:23:48Z" + templateName: heads + templateScope: local/lifecycle-hook-bgsf6 + type: Pod + phase: Error + progress: 1/1 + resourcesDuration: + cpu: 4 + memory: 2 + startedAt: "2022-01-26T19:23:48Z" +`) + + cancel, controller := newController(wf) + defer cancel() + + ctx := context.Background() + woc := newWorkflowOperationCtx(wf, controller) + woc.operate(ctx) + node := woc.wf.Status.Nodes.FindByDisplayName("lifecycle-hook-bgsf6.hooks.error") + assert.NotNil(t, node) + node = woc.wf.Status.Nodes.FindByDisplayName("lifecycle-hook-bgsf6.hooks.running") + assert.Nil(t, node) +} + +func TestExecuteTmplLifeCycleHook(t *testing.T) { + wf := wfv1.MustUnmarshalWorkflow(` +apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: lifecycle-hook-tmpl-levelg8mqq + namespace: argo +spec: + entrypoint: main + templates: + - name: main + steps: + - - hooks: + running: + expression: steps.step1.status == "Running" + template: http + error: + expression: steps.step1.status == "Error" + template: http + name: step1 + template: echo + - container: + args: + - echo "it was heads" + command: + - sh + - -c + image: alpine:3.6 + name: echo + - http: + url: https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json + name: http +status: + conditions: + - status: "False" + type: PodRunning + - status: "True" + type: Completed + finishedAt: "2022-01-26T21:28:37Z" + nodes: + lifecycle-hook-tmpl-levelg8mqq: + children: + - lifecycle-hook-tmpl-levelg8mqq-2902815070 + displayName: lifecycle-hook-tmpl-levelg8mqq + finishedAt: "2022-01-26T21:28:37Z" + id: lifecycle-hook-tmpl-levelg8mqq + name: lifecycle-hook-tmpl-levelg8mqq + outboundNodes: + - lifecycle-hook-tmpl-levelg8mqq-3824639481 + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-26T21:28:33Z" + templateName: main + templateScope: local/lifecycle-hook-tmpl-levelg8mqq + type: Steps + lifecycle-hook-tmpl-levelg8mqq-2902815070: + boundaryID: lifecycle-hook-tmpl-levelg8mqq + children: + - lifecycle-hook-tmpl-levelg8mqq-3824639481 + displayName: '[0]' + finishedAt: "2022-01-26T21:28:37Z" + id: lifecycle-hook-tmpl-levelg8mqq-2902815070 + name: lifecycle-hook-tmpl-levelg8mqq[0] + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-26T21:28:33Z" + templateScope: local/lifecycle-hook-tmpl-levelg8mqq + type: StepGroup + lifecycle-hook-tmpl-levelg8mqq-3824639481: + boundaryID: lifecycle-hook-tmpl-levelg8mqq + children: + - lifecycle-hook-tmpl-levelg8mqq-4216202210 + displayName: step1 + finishedAt: "2022-01-26T21:28:36Z" + hostNodeName: k3d-k3s-default-server-0 + id: lifecycle-hook-tmpl-levelg8mqq-3824639481 + name: lifecycle-hook-tmpl-levelg8mqq[0].step1 + outputs: + artifacts: + - name: main-logs + s3: + key: lifecycle-hook-tmpl-levelg8mqq/lifecycle-hook-tmpl-levelg8mqq-3824639481/main.log + exitCode: "0" + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-26T21:28:33Z" + templateName: echo + templateScope: local/lifecycle-hook-tmpl-levelg8mqq + type: Pod + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-26T21:28:33Z" +`) + + cancel, controller := newController(wf) + defer cancel() + + ctx := context.Background() + woc := newWorkflowOperationCtx(wf, controller) + woc.operate(ctx) + node := woc.wf.Status.Nodes.FindByDisplayName("step1.hooks.error") + assert.NotNil(t, node) + node = woc.wf.Status.Nodes.FindByDisplayName("step1.hooks.running") + assert.Nil(t, node) +} + +const wftWithHook = ` +apiVersion: argoproj.io/v1alpha1 +kind: WorkflowTemplate +metadata: + name: workflow-template-whalesay-template + namespace: default +spec: + hooks: + exit: + template: http + running: + expression: workflow.status == "Running" + template: http + templates: + - name: main + steps: + - - name: step-1 + hooks: + exit: + expression: steps["step-1"].status == "Running" + template: http + error: + expression: steps["step-1"].status == "Error" + template: http + template: echo + - - name: step2 + hooks: + exit: + expression: steps.step2.status == "Running" + template: http + error: + expression: steps.step2.status == "Error" + template: http + template: echo + + - name: echo + container: + image: alpine:3.6 + command: [sh, -c] + args: ["echo \"it was heads\""] + + - name: http + http: + # url: http://dummy.restapiexample.com/api/v1/employees + url: "https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json" + volumes: + - name: data + emptyDir: {} +` + +func TestWorkflowTemplateRefWithHook(t *testing.T) { + wf := wfv1.MustUnmarshalWorkflow(`apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: workflow-template-whalesay-template-hjgcg +spec: + arguments: + parameters: + - name: message + value: test + entrypoint: main + workflowTemplateRef: + name: workflow-template-whalesay-template +status: + conditions: + - status: "False" + type: PodRunning + - status: "True" + type: Completed + estimatedDuration: 6 + finishedAt: "2022-01-28T00:09:11Z" + nodes: + workflow-template-whalesay-template-hjgcg: + children: + - workflow-template-whalesay-template-hjgcg-2088741593 + displayName: workflow-template-whalesay-template-hjgcg + estimatedDuration: 4 + finishedAt: "2022-01-28T00:09:11Z" + id: workflow-template-whalesay-template-hjgcg + name: workflow-template-whalesay-template-hjgcg + outboundNodes: + - workflow-template-whalesay-template-hjgcg-2492429498 + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 2 + memory: 0 + startedAt: "2022-01-28T00:09:02Z" + templateName: main + templateScope: local/ + type: Steps + workflow-template-whalesay-template-hjgcg-1408741: + boundaryID: workflow-template-whalesay-template-hjgcg + children: + - workflow-template-whalesay-template-hjgcg-1411106350 + - workflow-template-whalesay-template-hjgcg-412929452 + - workflow-template-whalesay-template-hjgcg-948010596 + displayName: step-1 + finishedAt: "2022-01-28T00:09:05Z" + hostNodeName: k3d-k3s-default-server-0 + id: workflow-template-whalesay-template-hjgcg-1408741 + name: workflow-template-whalesay-template-hjgcg[0].step-1 + outputs: + artifacts: + - name: main-logs + s3: + key: workflow-template-whalesay-template-hjgcg/workflow-template-whalesay-template-hjgcg-1408741/main.log + exitCode: "0" + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-28T00:09:02Z" + templateName: echo + templateScope: local/ + type: Pod + workflow-template-whalesay-template-hjgcg-948010596: + boundaryID: workflow-template-whalesay-template-hjgcg + children: + - workflow-template-whalesay-template-hjgcg-2492429498 + displayName: '[1]' + finishedAt: "2022-01-28T00:09:11Z" + id: workflow-template-whalesay-template-hjgcg-948010596 + name: workflow-template-whalesay-template-hjgcg[1] + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-28T00:09:07Z" + templateScope: local/ + type: StepGroup + workflow-template-whalesay-template-hjgcg-2088741593: + boundaryID: workflow-template-whalesay-template-hjgcg + children: + - workflow-template-whalesay-template-hjgcg-1408741 + displayName: '[0]' + finishedAt: "2022-01-28T00:09:07Z" + id: workflow-template-whalesay-template-hjgcg-2088741593 + name: workflow-template-whalesay-template-hjgcg[0] + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 2 + memory: 0 + startedAt: "2022-01-28T00:09:02Z" + templateScope: local/ + type: StepGroup + workflow-template-whalesay-template-hjgcg-2492429498: + boundaryID: workflow-template-whalesay-template-hjgcg + children: + - workflow-template-whalesay-template-hjgcg-369778373 + - workflow-template-whalesay-template-hjgcg-2107567333 + displayName: step2 + finishedAt: "2022-01-28T00:09:10Z" + hostNodeName: k3d-k3s-default-server-0 + id: workflow-template-whalesay-template-hjgcg-2492429498 + name: workflow-template-whalesay-template-hjgcg[1].step2 + outputs: + artifacts: + - name: main-logs + s3: + key: workflow-template-whalesay-template-hjgcg/workflow-template-whalesay-template-hjgcg-2492429498/main.log + exitCode: "0" + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-28T00:09:07Z" + templateName: echo + templateScope: local/ + type: Pod + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 2 + memory: 0 + startedAt: "2022-01-28T00:09:02Z" + storedTemplates: + namespaced/workflow-template-whalesay-template/echo: + container: + args: + - echo "it was heads" + command: + - sh + - -c + image: alpine:3.6 + name: "" + resources: {} + inputs: {} + metadata: {} + name: echo + outputs: {} + namespaced/workflow-template-whalesay-template/main: + inputs: {} + metadata: {} + name: main + outputs: {} + steps: + - - hooks: + exit: + expression: steps["step-1"].status == "Running" + template: http + success: + expression: steps["step-1"].status == "Succeeded" + template: http + name: step-1 + template: echo + - - hooks: + exit: + expression: steps.step2.status == "Running" + template: http + success: + expression: steps.step2.status == "Succeeded" + template: http + name: step2 + template: echo + storedWorkflowTemplateSpec: + activeDeadlineSeconds: 300 + arguments: + parameters: + - name: message + value: test + entrypoint: main + hooks: + exit: + template: http + running: + expression: workflow.status == "Running" + template: http + podSpecPatch: | + terminationGracePeriodSeconds: 3 + templates: + - name: main + steps: + - - hooks: + exit: + template: http + error: + expression: steps["step-1"].status == "Error" + template: http + name: step-1 + template: echo + - - hooks: + exit: + expression: steps.step2.status == "Running" + template: http + error: + expression: steps.step2.status == "Error" + template: http + name: step2 + template: echo + - container: + args: + - echo "it was heads" + command: + - sh + - -c + image: alpine:3.6 + name: "" + name: echo + - http: + url: https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json + name: http + ttlStrategy: + secondsAfterCompletion: 600 + volumes: + - emptyDir: {} + name: data + workflowTemplateRef: + name: workflow-template-whalesay-template +`) + cancel, controller := newController(wf, wfv1.MustUnmarshalWorkflowTemplate(wftWithHook)) + defer cancel() + + ctx := context.Background() + woc := newWorkflowOperationCtx(wf, controller) + woc.operate(ctx) + assert.NotNil(t, woc.wf.Status.Nodes.FindByDisplayName("step-1.hooks.error")) +} + +func TestTemplateRefWithHook(t *testing.T) { + wf := wfv1.MustUnmarshalWorkflow(`apiVersion: argoproj.io/v1alpha1 +kind: Workflow +metadata: + name: workflow-template-whalesay-template-1 + namespace: default +spec: + + entrypoint: main + + templates: + - name: main + steps: + - - hooks: + exit: + expression: steps["step-1"].status == "Running" + templateRef: + name: workflow-template-whalesay-template + template: http + error: + expression: steps["step-1"].status == "Error" + template: "" + templateRef: + name: workflow-template-whalesay-template + template: http + name: step-1 + templateRef: + name: workflow-template-whalesay-template + template: main + ttlStrategy: + secondsAfterCompletion: 600 +status: + conditions: + - status: "False" + type: PodRunning + - status: "True" + type: Completed + finishedAt: "2022-01-28T07:01:04Z" + nodes: + workflow-template-whalesay-template-1: + children: + - workflow-template-whalesay-template-1-1761665519 + displayName: workflow-template-whalesay-template-1 + finishedAt: "2022-01-28T07:01:04Z" + id: workflow-template-whalesay-template-1 + name: workflow-template-whalesay-template-1 + outboundNodes: + - workflow-template-whalesay-template-1-79192944 + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 3 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + templateName: main + templateScope: local/workflow-template-whalesay-template-1 + type: Steps + workflow-template-whalesay-template-1-1236010667: + boundaryID: workflow-template-whalesay-template-1-1438125631 + children: + - workflow-template-whalesay-template-1-2715724931 + displayName: '[0]' + finishedAt: "2022-01-28T07:01:00Z" + id: workflow-template-whalesay-template-1-1236010667 + name: workflow-template-whalesay-template-1[0].step-1[0] + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 3 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + templateScope: namespaced/workflow-template-whalesay-template + type: StepGroup + workflow-template-whalesay-template-1-1438125631: + boundaryID: workflow-template-whalesay-template-1 + children: + - workflow-template-whalesay-template-1-1236010667 + - workflow-template-whalesay-template-1-986640140 + - workflow-template-whalesay-template-1-1359034694 + displayName: step-1 + finishedAt: "2022-01-28T07:01:04Z" + id: workflow-template-whalesay-template-1-1438125631 + name: workflow-template-whalesay-template-1[0].step-1 + outboundNodes: + - workflow-template-whalesay-template-1-79192944 + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 3 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + templateRef: + name: workflow-template-whalesay-template + template: main + templateScope: local/workflow-template-whalesay-template-1 + type: Steps + workflow-template-whalesay-template-1-1761665519: + boundaryID: workflow-template-whalesay-template-1 + children: + - workflow-template-whalesay-template-1-1438125631 + displayName: '[0]' + finishedAt: "2022-01-28T07:01:04Z" + id: workflow-template-whalesay-template-1-1761665519 + name: workflow-template-whalesay-template-1[0] + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 3 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + templateScope: local/workflow-template-whalesay-template-1 + type: StepGroup + workflow-template-whalesay-template-1-2377035854: + boundaryID: workflow-template-whalesay-template-1-1438125631 + children: + - workflow-template-whalesay-template-1-79192944 + displayName: '[1]' + finishedAt: "2022-01-28T07:01:04Z" + id: workflow-template-whalesay-template-1-2377035854 + name: workflow-template-whalesay-template-1[0].step-1[1] + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 2 + memory: 0 + startedAt: "2022-01-28T07:01:00Z" + templateScope: namespaced/workflow-template-whalesay-template + type: StepGroup + workflow-template-whalesay-template-1-2715724931: + boundaryID: workflow-template-whalesay-template-1-1438125631 + children: + - workflow-template-whalesay-template-1-3456567280 + - workflow-template-whalesay-template-1-1403479850 + - workflow-template-whalesay-template-1-2377035854 + displayName: step-1 + finishedAt: "2022-01-28T07:00:58Z" + hostNodeName: k3d-k3s-default-server-0 + id: workflow-template-whalesay-template-1-2715724931 + name: workflow-template-whalesay-template-1[0].step-1[0].step-1 + outputs: + artifacts: + - name: main-logs + s3: + key: workflow-template-whalesay-template-1/workflow-template-whalesay-template-1-2715724931/main.log + exitCode: "0" + phase: Running + progress: 1/1 + resourcesDuration: + cpu: 1 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + templateName: echo + templateScope: namespaced/workflow-template-whalesay-template + type: Pod + phase: Running + progress: 2/2 + resourcesDuration: + cpu: 3 + memory: 0 + startedAt: "2022-01-28T07:00:55Z" + storedTemplates: + namespaced/workflow-template-whalesay-template/echo: + container: + args: + - echo "it was heads" + command: + - sh + - -c + image: alpine:3.6 + name: "" + resources: {} + inputs: {} + metadata: {} + name: echo + outputs: {} + namespaced/workflow-template-whalesay-template/http: + http: + url: https://raw.githubusercontent.com/argoproj/argo-workflows/4e450e250168e6b4d51a126b784e90b11a0162bc/pkg/apis/workflow/v1alpha1/generated.swagger.json + inputs: {} + metadata: {} + name: http + outputs: {} + namespaced/workflow-template-whalesay-template/main: + inputs: {} + metadata: {} + name: main + outputs: {} + steps: + - - arguments: {} + hooks: + exit: + arguments: {} + expression: steps["step-1"].status == "Running" + template: http + error: + arguments: {} + expression: steps["step-1"].status == "Error" + template: http + name: step-1 + template: echo + - - arguments: {} + hooks: + exit: + arguments: {} + expression: steps.step2.status == "Running" + template: http + error: + arguments: {} + expression: steps.step2.status == "Error" + template: http + name: step2 + template: echo + +`) + cancel, controller := newController(wf, wfv1.MustUnmarshalWorkflowTemplate(wftWithHook)) + defer cancel() + + ctx := context.Background() + woc := newWorkflowOperationCtx(wf, controller) + woc.operate(ctx) + 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")) + +} diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 1051fbdef9b4..892293fbae99 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -357,14 +357,6 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { return } - // Reconcile TaskSet and Agent for HTTP templates - woc.taskSetReconciliation(ctx) - - if node == nil || !node.Fulfilled() { - // node can be nil if a workflow created immediately in a parallelism == 0 state - return - } - workflowStatus := map[wfv1.NodePhase]wfv1.WorkflowPhase{ wfv1.NodePending: wfv1.WorkflowPending, wfv1.NodeRunning: wfv1.WorkflowRunning, @@ -375,10 +367,22 @@ func (woc *wfOperationCtx) operate(ctx context.Context) { wfv1.NodeOmitted: wfv1.WorkflowSucceeded, }[node.Phase] - var onExitNode *wfv1.NodeStatus - if woc.execWf.Spec.OnExit != "" && woc.GetShutdownStrategy().ShouldExecute(true) { - woc.globalParams[common.GlobalVarWorkflowStatus] = string(workflowStatus) + woc.globalParams[common.GlobalVarWorkflowStatus] = string(workflowStatus) + + err = woc.executeWfLifeCycleHook(ctx, tmplCtx) + if err != nil { + woc.markNodeError(node.Name, err) + } + // Reconcile TaskSet and Agent for HTTP templates + woc.taskSetReconciliation(ctx) + + if !node.Fulfilled() { + // node can be nil if a workflow created immediately in a parallelism == 0 state + return + } + var onExitNode *wfv1.NodeStatus + if woc.execWf.Spec.HasExitHook() && woc.GetShutdownStrategy().ShouldExecute(true) { var failures []failedNodeStatus for _, node := range woc.wf.Status.Nodes { if node.Phase == wfv1.NodeFailed || node.Phase == wfv1.NodeError { @@ -403,7 +407,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) - onExitNode, err = woc.executeTemplate(ctx, onExitNodeName, &wfv1.WorkflowStep{Template: woc.execWf.Spec.OnExit}, tmplCtx, woc.execWf.Spec.Arguments, &executeTemplateOpts{onExitTemplate: true}) + 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}) if err != nil { x := fmt.Errorf("error in exit template execution : %w", err) switch err { @@ -1820,6 +1825,9 @@ func (woc *wfOperationCtx) executeTemplate(ctx context.Context, nodeName string, localParams[common.LocalVarRetries] = strconv.Itoa(len(retryParentNode.Children)) 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 } diff --git a/workflow/controller/steps.go b/workflow/controller/steps.go index 609e5d551962..2acfe5434816 100644 --- a/workflow/controller/steps.go +++ b/workflow/controller/steps.go @@ -269,6 +269,16 @@ func (woc *wfOperationCtx) executeStepGroup(ctx context.Context, stepGroup []wfv for _, childNodeID := range node.Children { childNode := woc.wf.Status.Nodes[childNodeID] step := nodeSteps[childNode.Name] + stepsCtx.scope.addParamToScope(fmt.Sprintf("steps.%s.status", childNode.DisplayName), string(childNode.Phase)) + hookCompleted, err := woc.executeTmplLifeCycleHook(ctx, woc.globalParams.Merge(stepsCtx.scope.getParameters()), step.Hooks, &childNode, stepsCtx.boundaryID, stepsCtx.tmplCtx, "steps."+step.Name) + if err != nil { + woc.markNodeError(node.Name, err) + } + // Check all hooks are completed + if !hookCompleted { + return node + } + if !childNode.Fulfilled() { completed = false } else if childNode.Completed() { diff --git a/workflow/validate/validate.go b/workflow/validate/validate.go index f2f8a623c58e..3ff68b87602c 100644 --- a/workflow/validate/validate.go +++ b/workflow/validate/validate.go @@ -1254,7 +1254,6 @@ func (ctx *templateValidationCtx) validateDAG(scope map[string]interface{}, tmpl if err = verifyNoCycles(tmpl, dagValidationCtx); err != nil { return err } - err = resolveAllVariables(scope, ctx.globalParams, tmpl.DAG.Target) if err != nil { return errors.Errorf(errors.CodeBadRequest, "templates.%s.targets %s", tmpl.Name, err.Error()) @@ -1267,6 +1266,10 @@ func (ctx *templateValidationCtx) validateDAG(scope map[string]interface{}, tmpl resolvedTmpl := resolvedTemplates[task.Name] // add all tasks outputs to scope so that a nested DAGs can have outputs prefix := fmt.Sprintf("tasks.%s", task.Name) + // add self status reference for hooks + if task.Hooks != nil { + scope[fmt.Sprintf("%s.status", prefix)] = true + } ctx.addOutputsToScope(resolvedTmpl, prefix, scope, false, false) if task.HasExitHook() { ctx.addOutputsToScope(resolvedTmpl, prefix, scope, false, false) diff --git a/workflow/validate/validate_dag_test.go b/workflow/validate/validate_dag_test.go index a640713896d4..b831561fcb73 100644 --- a/workflow/validate/validate_dag_test.go +++ b/workflow/validate/validate_dag_test.go @@ -616,7 +616,6 @@ func TestDAGStatusReference(t *testing.T) { if assert.NotNil(t, err) { assert.Contains(t, err.Error(), "failed to resolve {{tasks.B.status}}") } - _, err = validate(dagStatusNoFutureReferenceWhenFutureReferenceHasChild) // Can't reference the status of steps that have not run yet, even if the referenced steps have children if assert.NotNil(t, err) {