From cc002f2cfe4d2ebfd985d803d7d38ea4a83ca626 Mon Sep 17 00:00:00 2001
From: Gokul Krishnan A V <52277763+gokulav137@users.noreply.github.com>
Date: Sun, 17 Sep 2023 11:03:35 +0530
Subject: [PATCH] feat(sensor): email trigger (#2793)
Signed-off-by: gokulav137
Signed-off-by: jmillage
---
api/jsonschema/schema.json | 53 +
api/openapi-spec/swagger.json | 53 +
api/sensor.html | 147 ++
api/sensor.md | 145 ++
controllers/sensor/validate.go | 26 +
docs/sensors/triggers/email-trigger.md | 104 ++
examples/sensors/email-trigger.yaml | 33 +
pkg/apis/common/common.go | 1 +
pkg/apis/sensor/v1alpha1/generated.pb.go | 1306 ++++++++++++-----
pkg/apis/sensor/v1alpha1/generated.proto | 44 +
pkg/apis/sensor/v1alpha1/openapi_generated.go | 101 +-
pkg/apis/sensor/v1alpha1/types.go | 35 +
.../sensor/v1alpha1/zz_generated.deepcopy.go | 38 +
sensors/trigger.go | 9 +
sensors/triggers/email/email.go | 165 +++
sensors/triggers/email/email_test.go | 201 +++
16 files changed, 2091 insertions(+), 370 deletions(-)
create mode 100644 docs/sensors/triggers/email-trigger.md
create mode 100644 examples/sensors/email-trigger.yaml
create mode 100644 sensors/triggers/email/email.go
create mode 100644 sensors/triggers/email/email_test.go
diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json
index b105ea5e64..44ed8c853f 100644
--- a/api/jsonschema/schema.json
+++ b/api/jsonschema/schema.json
@@ -3424,6 +3424,55 @@
],
"type": "object"
},
+ "io.argoproj.sensor.v1alpha1.EmailTrigger": {
+ "description": "EmailTrigger refers to the specification of the email notification trigger.",
+ "properties": {
+ "body": {
+ "description": "Body refers to the body/content of the email send.",
+ "type": "string"
+ },
+ "from": {
+ "description": "From refers to the address from which the email is send from.",
+ "type": "string"
+ },
+ "host": {
+ "description": "Host refers to the smtp host url to which email is send.",
+ "type": "string"
+ },
+ "parameters": {
+ "description": "Parameters is the list of key-value extracted from event's payload that are applied to the trigger resource.",
+ "items": {
+ "$ref": "#/definitions/io.argoproj.sensor.v1alpha1.TriggerParameter"
+ },
+ "type": "array"
+ },
+ "port": {
+ "description": "Port refers to the smtp server port to which email is send. Defaults to 0.",
+ "format": "int32",
+ "type": "integer"
+ },
+ "smtpPassword": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector",
+ "description": "SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server."
+ },
+ "subject": {
+ "description": "Subject refers to the subject line for the email send.",
+ "type": "string"
+ },
+ "to": {
+ "description": "To refers to the email addresses to which the emails are send.",
+ "items": {
+ "type": "string"
+ },
+ "type": "array"
+ },
+ "username": {
+ "description": "Username refers to the username used to connect to the smtp server.",
+ "type": "string"
+ }
+ },
+ "type": "object"
+ },
"io.argoproj.sensor.v1alpha1.Event": {
"description": "Event represents the cloudevent received from an event source.",
"properties": {
@@ -4496,6 +4545,10 @@
"$ref": "#/definitions/io.argoproj.sensor.v1alpha1.CustomTrigger",
"description": "CustomTrigger refers to the trigger designed to connect to a gRPC trigger server and execute a custom trigger."
},
+ "email": {
+ "$ref": "#/definitions/io.argoproj.sensor.v1alpha1.EmailTrigger",
+ "description": "Email refers to the trigger designed to send an email notification"
+ },
"http": {
"$ref": "#/definitions/io.argoproj.sensor.v1alpha1.HTTPTrigger",
"description": "HTTP refers to the trigger designed to dispatch a HTTP request with on-the-fly constructable payload."
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index b4613fc589..298282c0f2 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -3407,6 +3407,55 @@
}
}
},
+ "io.argoproj.sensor.v1alpha1.EmailTrigger": {
+ "description": "EmailTrigger refers to the specification of the email notification trigger.",
+ "type": "object",
+ "properties": {
+ "body": {
+ "description": "Body refers to the body/content of the email send.",
+ "type": "string"
+ },
+ "from": {
+ "description": "From refers to the address from which the email is send from.",
+ "type": "string"
+ },
+ "host": {
+ "description": "Host refers to the smtp host url to which email is send.",
+ "type": "string"
+ },
+ "parameters": {
+ "description": "Parameters is the list of key-value extracted from event's payload that are applied to the trigger resource.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/io.argoproj.sensor.v1alpha1.TriggerParameter"
+ }
+ },
+ "port": {
+ "description": "Port refers to the smtp server port to which email is send. Defaults to 0.",
+ "type": "integer",
+ "format": "int32"
+ },
+ "smtpPassword": {
+ "description": "SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server.",
+ "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector"
+ },
+ "subject": {
+ "description": "Subject refers to the subject line for the email send.",
+ "type": "string"
+ },
+ "to": {
+ "description": "To refers to the email addresses to which the emails are send.",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "username": {
+ "description": "Username refers to the username used to connect to the smtp server.",
+ "type": "string"
+ }
+ }
+ },
"io.argoproj.sensor.v1alpha1.Event": {
"description": "Event represents the cloudevent received from an event source.",
"type": "object",
@@ -4474,6 +4523,10 @@
"description": "CustomTrigger refers to the trigger designed to connect to a gRPC trigger server and execute a custom trigger.",
"$ref": "#/definitions/io.argoproj.sensor.v1alpha1.CustomTrigger"
},
+ "email": {
+ "description": "Email refers to the trigger designed to send an email notification",
+ "$ref": "#/definitions/io.argoproj.sensor.v1alpha1.EmailTrigger"
+ },
"http": {
"description": "HTTP refers to the trigger designed to dispatch a HTTP request with on-the-fly constructable payload.",
"$ref": "#/definitions/io.argoproj.sensor.v1alpha1.HTTPTrigger"
diff --git a/api/sensor.html b/api/sensor.html
index a66488d3d5..0b152aee7b 100644
--- a/api/sensor.html
+++ b/api/sensor.html
@@ -803,6 +803,138 @@ DataFilter
+EmailTrigger
+
+
+(Appears on:
+TriggerTemplate)
+
+
+
EmailTrigger refers to the specification of the email notification trigger.
+
+
+
+
+Field |
+Description |
+
+
+
+
+
+parameters
+
+
+[]TriggerParameter
+
+
+ |
+
+(Optional)
+ Parameters is the list of key-value extracted from event’s payload that are applied to
+the trigger resource.
+ |
+
+
+
+username
+
+string
+
+ |
+
+(Optional)
+ Username refers to the username used to connect to the smtp server.
+ |
+
+
+
+smtpPassword
+
+
+Kubernetes core/v1.SecretKeySelector
+
+
+ |
+
+(Optional)
+ SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server.
+ |
+
+
+
+host
+
+string
+
+ |
+
+ Host refers to the smtp host url to which email is send.
+ |
+
+
+
+port
+
+int32
+
+ |
+
+(Optional)
+ Port refers to the smtp server port to which email is send.
+Defaults to 0.
+ |
+
+
+
+to
+
+[]string
+
+ |
+
+(Optional)
+ To refers to the email addresses to which the emails are send.
+ |
+
+
+
+from
+
+string
+
+ |
+
+(Optional)
+ From refers to the address from which the email is send from.
+ |
+
+
+
+subject
+
+string
+
+ |
+
+(Optional)
+ Subject refers to the subject line for the email send.
+ |
+
+
+
+body
+
+string
+
+ |
+
+(Optional)
+ Body refers to the body/content of the email send.
+ |
+
+
+
Event
@@ -3332,6 +3464,7 @@
AzureServiceBus refers to the trigger designed to place messages on Azure Service Bus
+
+
+email
+
+
+EmailTrigger
+
+
+ |
+
+(Optional)
+ Email refers to the trigger designed to send an email notification
+ |
+
URLArtifact
diff --git a/api/sensor.md b/api/sensor.md
index 514fee6a25..7794974fa5 100644
--- a/api/sensor.md
+++ b/api/sensor.md
@@ -856,6 +856,138 @@ and
+
+EmailTrigger
+
+
+(Appears on:
+TriggerTemplate)
+
+
+
+EmailTrigger refers to the specification of the email notification
+trigger.
+
+
+
+
+
+
+Field
+ |
+
+Description
+ |
+
+
+
+
+
+parameters
+ \[\]TriggerParameter
+
+ |
+
+(Optional)
+
+Parameters is the list of key-value extracted from event’s payload that
+are applied to the trigger resource.
+
+ |
+
+
+
+username string
+ |
+
+(Optional)
+
+Username refers to the username used to connect to the smtp server.
+
+ |
+
+
+
+smtpPassword
+
+Kubernetes core/v1.SecretKeySelector
+ |
+
+(Optional)
+
+SMTPPassword refers to the Kubernetes secret that holds the smtp
+password used to connect to smtp server.
+
+ |
+
+
+
+host string
+ |
+
+
+Host refers to the smtp host url to which email is send.
+
+ |
+
+
+
+port int32
+ |
+
+(Optional)
+
+Port refers to the smtp server port to which email is send. Defaults to
+0.
+
+ |
+
+
+
+to \[\]string
+ |
+
+(Optional)
+
+To refers to the email addresses to which the emails are send.
+
+ |
+
+
+
+from string
+ |
+
+(Optional)
+
+From refers to the address from which the email is send from.
+
+ |
+
+
+
+subject string
+ |
+
+(Optional)
+
+Subject refers to the subject line for the email send.
+
+ |
+
+
+
+body string
+ |
+
+(Optional)
+
+Body refers to the body/content of the email send.
+
+ |
+
+
+
Event
@@ -3462,6 +3594,7 @@ TriggerParameter
AzureEventHubsTrigger,
AzureServiceBusTrigger,
CustomTrigger,
+EmailTrigger,
HTTPTrigger,
KafkaTrigger,
NATSTrigger,
@@ -3954,6 +4087,18 @@ Azure Service Bus
+
+
+email
+ EmailTrigger
+ |
+
+(Optional)
+
+Email refers to the trigger designed to send an email notification
+
+ |
+
diff --git a/controllers/sensor/validate.go b/controllers/sensor/validate.go
index 9b474c1dd1..e480e2bcb2 100644
--- a/controllers/sensor/validate.go
+++ b/controllers/sensor/validate.go
@@ -148,6 +148,11 @@ func validateTriggerTemplate(template *v1alpha1.TriggerTemplate) error {
return fmt.Errorf("template %s is invalid, %w", template.Name, err)
}
}
+ if template.Email != nil {
+ if err := validateEmailTrigger(template.Email); err != nil {
+ return fmt.Errorf("template %s is invalid, %w", template.Name, err)
+ }
+ }
return nil
}
@@ -365,6 +370,27 @@ func validateSlackTrigger(trigger *v1alpha1.SlackTrigger) error {
return nil
}
+// validateEmailTrigger validates the Email trigger
+func validateEmailTrigger(trigger *v1alpha1.EmailTrigger) error {
+ if trigger == nil {
+ return fmt.Errorf("trigger can't be nil")
+ }
+ if trigger.Host == "" {
+ return fmt.Errorf("host can't be empty")
+ }
+ if 0 > trigger.Port || trigger.Port > 65535 {
+ return fmt.Errorf("port: %v, port should be between 0-65535", trigger.Port)
+ }
+ if trigger.Parameters != nil {
+ for i, parameter := range trigger.Parameters {
+ if err := validateTriggerParameter(¶meter); err != nil {
+ return fmt.Errorf("resource parameter index: %d. err: %w", i, err)
+ }
+ }
+ }
+ return nil
+}
+
// validateCustomTrigger validates the custom trigger.
func validateCustomTrigger(trigger *v1alpha1.CustomTrigger) error {
if trigger == nil {
diff --git a/docs/sensors/triggers/email-trigger.md b/docs/sensors/triggers/email-trigger.md
new file mode 100644
index 0000000000..a53de6689c
--- /dev/null
+++ b/docs/sensors/triggers/email-trigger.md
@@ -0,0 +1,104 @@
+# Email Trigger
+
+The Email trigger is used to send a custom email to a desired set of email addresses using an SMTP server. The intended use is for notifications for a build pipeline, but can be used for any notification scenario.
+
+## Prerequisite
+
+1. Deploy the eventbus in the namespace.
+
+2. Have an SMTP server setup.
+
+3. Create a kubernetes secret with the SMTP password in your cluster.
+
+ kubectl create secret generic smtp-secret --from-literal=password=$SMTP_PASSWORD
+
+ **Note**: If your SMTP server doesnot require authentication this step can be skipped.
+
+4. Create a webhook event-source.
+
+ kubectl -n argo-events apply -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/event-sources/webhook.yaml
+
+5. Set up port-forwarding to expose the http server. We will
+ use port-forwarding here.
+
+ kubectl port-forward -n argo-events 12000:12000
+
+## Email Trigger
+
+Lets say we want to send an email to a dynamic recepient using a custom email body template.
+
+The custom email body template we are going to use is the following:
+```
+Hi ,
+ Hello There
+
+Thanks,
+Obi
+```
+where the name has to be substituted with the receiver name from the event.
+
+1. Create a sensor with Email trigger.
+
+ kubectl -n argo-events apply -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/sensors/email-trigger.yaml
+
+ **Note**: Please update ```email.port```, ```email.host``` and ```email.username``` to that of your SMTP server.
+ If your SMTP server doesnot require authentication, the ```email.username``` and ```email.smtpPassword``` should be ommitted.
+
+2. Send a http request to the event-source-pod to fire the Email trigger.
+
+ curl -d '{"name":"Luke", "to":"your@email.com"}' -H "Content-Type: application/json" -X POST http://localhost:12000/example
+
+ **Note**: You can modify the value for key ```"to"``` to send the email to your address.
+
+2. Alternatively you can skip providing the ```"to"``` in the payload to send an email to static email address provided in the trigger.
+
+ curl -d '{"name":"Luke"}' -H "Content-Type: application/json" -X POST http://localhost:12000/example
+
+ **Note**: You have to remove the parameterization for ```email.to.0``` and add ```email.to``` like so:
+ ```yaml
+ email:
+ ...
+ to:
+ - target1@email.com
+ - target2@email.com
+ ...
+ ```
+
+## Parameterization
+
+We can parameterize the to, from, subject and body of the email trigger for dynamic capabilities.
+
+The email trigger parameters have the following structure,
+
+ - parameters:
+ - src:
+ dependencyName: test-dep
+ dataKey: body.to
+ dest: email.to.0
+ - src:
+ dependencyName: test-dep
+ dataKey: body.to
+ dest: email.to.-1
+ - src:
+ dependencyName: test-dep
+ dataKey: body.from
+ dest: email.from
+ - src:
+ dependencyName: test-dep
+ dataKey: body.subject
+ dest: email.subject
+ - src:
+ dependencyName: test-dep
+ dataKey: body.emailBody
+ dest: email.body
+
+
+- ```email.to.index``` can be used to overwite an email address already specified in the trigger at the provided index. (where index is an integer)
+- ```email.to.-1``` can be used to append a new email address to the addresses to which an email will be sent.
+- ```email.from``` can be used to specify the from address of the email sent.
+- ```email.body``` can be used to specify the body of the email which will be sent.
+- ```email.subject``` can be used to specify the subject of the email which will be sent.
+
+To understand more on parameterization, take a look at [this tutorial](https://argoproj.github.io/argo-events/tutorials/02-parameterization/).
+
+The complete specification of Email trigger is available [here](https://github.com/argoproj/argo-events/blob/master/api/sensor.md#emailtrigger).
diff --git a/examples/sensors/email-trigger.yaml b/examples/sensors/email-trigger.yaml
new file mode 100644
index 0000000000..32fca3f19b
--- /dev/null
+++ b/examples/sensors/email-trigger.yaml
@@ -0,0 +1,33 @@
+apiVersion: argoproj.io/v1alpha1
+kind: Sensor
+metadata:
+ name: webhook
+spec:
+ dependencies:
+ - name: test-dep
+ eventSourceName: webhook
+ eventName: example
+ triggers:
+ - parameters:
+ - src:
+ dependencyName: test-dep
+ dataKey: body.to
+ dest: email.to.-1
+ - src:
+ dependencyName: test-dep
+ dataTemplate: "Hi {{.Input.body.name}},\n\n\tHello There.\n\nThanks,\nObi"
+ dest: email.body
+ template:
+ name: email-trigger
+ email:
+ username: username
+ smtpPassword:
+ key: password
+ name: smtp-secret
+ # to:
+ # - target1@email.com
+ # - target2@email.com
+ host: smtp.example.net
+ port: 587
+ from: example@email.com
+ subject: Hello There
diff --git a/pkg/apis/common/common.go b/pkg/apis/common/common.go
index 8c762c85b3..4ae537a2c8 100644
--- a/pkg/apis/common/common.go
+++ b/pkg/apis/common/common.go
@@ -101,6 +101,7 @@ var (
K8sTrigger TriggerType = "Kubernetes"
AzureEventHubsTrigger TriggerType = "AzureEventHubs"
AzureServiceBusTrigger TriggerType = "AzureServiceBus"
+ EmailTrigger TriggerType = "Email"
)
// EventBusType is the type of event bus
diff --git a/pkg/apis/sensor/v1alpha1/generated.pb.go b/pkg/apis/sensor/v1alpha1/generated.pb.go
index 1dd2786cc0..1027e3736e 100644
--- a/pkg/apis/sensor/v1alpha1/generated.pb.go
+++ b/pkg/apis/sensor/v1alpha1/generated.pb.go
@@ -300,10 +300,38 @@ func (m *DataFilter) XXX_DiscardUnknown() {
var xxx_messageInfo_DataFilter proto.InternalMessageInfo
+func (m *EmailTrigger) Reset() { *m = EmailTrigger{} }
+func (*EmailTrigger) ProtoMessage() {}
+func (*EmailTrigger) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6c4bded897df1f16, []int{9}
+}
+func (m *EmailTrigger) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *EmailTrigger) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+}
+func (m *EmailTrigger) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_EmailTrigger.Merge(m, src)
+}
+func (m *EmailTrigger) XXX_Size() int {
+ return m.Size()
+}
+func (m *EmailTrigger) XXX_DiscardUnknown() {
+ xxx_messageInfo_EmailTrigger.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EmailTrigger proto.InternalMessageInfo
+
func (m *Event) Reset() { *m = Event{} }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{9}
+ return fileDescriptor_6c4bded897df1f16, []int{10}
}
func (m *Event) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -331,7 +359,7 @@ var xxx_messageInfo_Event proto.InternalMessageInfo
func (m *EventContext) Reset() { *m = EventContext{} }
func (*EventContext) ProtoMessage() {}
func (*EventContext) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{10}
+ return fileDescriptor_6c4bded897df1f16, []int{11}
}
func (m *EventContext) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -359,7 +387,7 @@ var xxx_messageInfo_EventContext proto.InternalMessageInfo
func (m *EventDependency) Reset() { *m = EventDependency{} }
func (*EventDependency) ProtoMessage() {}
func (*EventDependency) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{11}
+ return fileDescriptor_6c4bded897df1f16, []int{12}
}
func (m *EventDependency) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -387,7 +415,7 @@ var xxx_messageInfo_EventDependency proto.InternalMessageInfo
func (m *EventDependencyFilter) Reset() { *m = EventDependencyFilter{} }
func (*EventDependencyFilter) ProtoMessage() {}
func (*EventDependencyFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{12}
+ return fileDescriptor_6c4bded897df1f16, []int{13}
}
func (m *EventDependencyFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -415,7 +443,7 @@ var xxx_messageInfo_EventDependencyFilter proto.InternalMessageInfo
func (m *EventDependencyTransformer) Reset() { *m = EventDependencyTransformer{} }
func (*EventDependencyTransformer) ProtoMessage() {}
func (*EventDependencyTransformer) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{13}
+ return fileDescriptor_6c4bded897df1f16, []int{14}
}
func (m *EventDependencyTransformer) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -443,7 +471,7 @@ var xxx_messageInfo_EventDependencyTransformer proto.InternalMessageInfo
func (m *ExprFilter) Reset() { *m = ExprFilter{} }
func (*ExprFilter) ProtoMessage() {}
func (*ExprFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{14}
+ return fileDescriptor_6c4bded897df1f16, []int{15}
}
func (m *ExprFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -471,7 +499,7 @@ var xxx_messageInfo_ExprFilter proto.InternalMessageInfo
func (m *FileArtifact) Reset() { *m = FileArtifact{} }
func (*FileArtifact) ProtoMessage() {}
func (*FileArtifact) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{15}
+ return fileDescriptor_6c4bded897df1f16, []int{16}
}
func (m *FileArtifact) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -499,7 +527,7 @@ var xxx_messageInfo_FileArtifact proto.InternalMessageInfo
func (m *GitArtifact) Reset() { *m = GitArtifact{} }
func (*GitArtifact) ProtoMessage() {}
func (*GitArtifact) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{16}
+ return fileDescriptor_6c4bded897df1f16, []int{17}
}
func (m *GitArtifact) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -527,7 +555,7 @@ var xxx_messageInfo_GitArtifact proto.InternalMessageInfo
func (m *GitCreds) Reset() { *m = GitCreds{} }
func (*GitCreds) ProtoMessage() {}
func (*GitCreds) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{17}
+ return fileDescriptor_6c4bded897df1f16, []int{18}
}
func (m *GitCreds) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -555,7 +583,7 @@ var xxx_messageInfo_GitCreds proto.InternalMessageInfo
func (m *GitRemoteConfig) Reset() { *m = GitRemoteConfig{} }
func (*GitRemoteConfig) ProtoMessage() {}
func (*GitRemoteConfig) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{18}
+ return fileDescriptor_6c4bded897df1f16, []int{19}
}
func (m *GitRemoteConfig) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -583,7 +611,7 @@ var xxx_messageInfo_GitRemoteConfig proto.InternalMessageInfo
func (m *HTTPTrigger) Reset() { *m = HTTPTrigger{} }
func (*HTTPTrigger) ProtoMessage() {}
func (*HTTPTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{19}
+ return fileDescriptor_6c4bded897df1f16, []int{20}
}
func (m *HTTPTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -611,7 +639,7 @@ var xxx_messageInfo_HTTPTrigger proto.InternalMessageInfo
func (m *K8SResourcePolicy) Reset() { *m = K8SResourcePolicy{} }
func (*K8SResourcePolicy) ProtoMessage() {}
func (*K8SResourcePolicy) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{20}
+ return fileDescriptor_6c4bded897df1f16, []int{21}
}
func (m *K8SResourcePolicy) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -639,7 +667,7 @@ var xxx_messageInfo_K8SResourcePolicy proto.InternalMessageInfo
func (m *KafkaTrigger) Reset() { *m = KafkaTrigger{} }
func (*KafkaTrigger) ProtoMessage() {}
func (*KafkaTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{21}
+ return fileDescriptor_6c4bded897df1f16, []int{22}
}
func (m *KafkaTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -667,7 +695,7 @@ var xxx_messageInfo_KafkaTrigger proto.InternalMessageInfo
func (m *LogTrigger) Reset() { *m = LogTrigger{} }
func (*LogTrigger) ProtoMessage() {}
func (*LogTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{22}
+ return fileDescriptor_6c4bded897df1f16, []int{23}
}
func (m *LogTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -695,7 +723,7 @@ var xxx_messageInfo_LogTrigger proto.InternalMessageInfo
func (m *NATSTrigger) Reset() { *m = NATSTrigger{} }
func (*NATSTrigger) ProtoMessage() {}
func (*NATSTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{23}
+ return fileDescriptor_6c4bded897df1f16, []int{24}
}
func (m *NATSTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -723,7 +751,7 @@ var xxx_messageInfo_NATSTrigger proto.InternalMessageInfo
func (m *OpenWhiskTrigger) Reset() { *m = OpenWhiskTrigger{} }
func (*OpenWhiskTrigger) ProtoMessage() {}
func (*OpenWhiskTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{24}
+ return fileDescriptor_6c4bded897df1f16, []int{25}
}
func (m *OpenWhiskTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -751,7 +779,7 @@ var xxx_messageInfo_OpenWhiskTrigger proto.InternalMessageInfo
func (m *PayloadField) Reset() { *m = PayloadField{} }
func (*PayloadField) ProtoMessage() {}
func (*PayloadField) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{25}
+ return fileDescriptor_6c4bded897df1f16, []int{26}
}
func (m *PayloadField) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -779,7 +807,7 @@ var xxx_messageInfo_PayloadField proto.InternalMessageInfo
func (m *PulsarTrigger) Reset() { *m = PulsarTrigger{} }
func (*PulsarTrigger) ProtoMessage() {}
func (*PulsarTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{26}
+ return fileDescriptor_6c4bded897df1f16, []int{27}
}
func (m *PulsarTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -807,7 +835,7 @@ var xxx_messageInfo_PulsarTrigger proto.InternalMessageInfo
func (m *RateLimit) Reset() { *m = RateLimit{} }
func (*RateLimit) ProtoMessage() {}
func (*RateLimit) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{27}
+ return fileDescriptor_6c4bded897df1f16, []int{28}
}
func (m *RateLimit) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -835,7 +863,7 @@ var xxx_messageInfo_RateLimit proto.InternalMessageInfo
func (m *Sensor) Reset() { *m = Sensor{} }
func (*Sensor) ProtoMessage() {}
func (*Sensor) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{28}
+ return fileDescriptor_6c4bded897df1f16, []int{29}
}
func (m *Sensor) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -863,7 +891,7 @@ var xxx_messageInfo_Sensor proto.InternalMessageInfo
func (m *SensorList) Reset() { *m = SensorList{} }
func (*SensorList) ProtoMessage() {}
func (*SensorList) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{29}
+ return fileDescriptor_6c4bded897df1f16, []int{30}
}
func (m *SensorList) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -891,7 +919,7 @@ var xxx_messageInfo_SensorList proto.InternalMessageInfo
func (m *SensorSpec) Reset() { *m = SensorSpec{} }
func (*SensorSpec) ProtoMessage() {}
func (*SensorSpec) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{30}
+ return fileDescriptor_6c4bded897df1f16, []int{31}
}
func (m *SensorSpec) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -919,7 +947,7 @@ var xxx_messageInfo_SensorSpec proto.InternalMessageInfo
func (m *SensorStatus) Reset() { *m = SensorStatus{} }
func (*SensorStatus) ProtoMessage() {}
func (*SensorStatus) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{31}
+ return fileDescriptor_6c4bded897df1f16, []int{32}
}
func (m *SensorStatus) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -947,7 +975,7 @@ var xxx_messageInfo_SensorStatus proto.InternalMessageInfo
func (m *SlackSender) Reset() { *m = SlackSender{} }
func (*SlackSender) ProtoMessage() {}
func (*SlackSender) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{32}
+ return fileDescriptor_6c4bded897df1f16, []int{33}
}
func (m *SlackSender) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -975,7 +1003,7 @@ var xxx_messageInfo_SlackSender proto.InternalMessageInfo
func (m *SlackThread) Reset() { *m = SlackThread{} }
func (*SlackThread) ProtoMessage() {}
func (*SlackThread) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{33}
+ return fileDescriptor_6c4bded897df1f16, []int{34}
}
func (m *SlackThread) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1003,7 +1031,7 @@ var xxx_messageInfo_SlackThread proto.InternalMessageInfo
func (m *SlackTrigger) Reset() { *m = SlackTrigger{} }
func (*SlackTrigger) ProtoMessage() {}
func (*SlackTrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{34}
+ return fileDescriptor_6c4bded897df1f16, []int{35}
}
func (m *SlackTrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1031,7 +1059,7 @@ var xxx_messageInfo_SlackTrigger proto.InternalMessageInfo
func (m *StandardK8STrigger) Reset() { *m = StandardK8STrigger{} }
func (*StandardK8STrigger) ProtoMessage() {}
func (*StandardK8STrigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{35}
+ return fileDescriptor_6c4bded897df1f16, []int{36}
}
func (m *StandardK8STrigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1059,7 +1087,7 @@ var xxx_messageInfo_StandardK8STrigger proto.InternalMessageInfo
func (m *StatusPolicy) Reset() { *m = StatusPolicy{} }
func (*StatusPolicy) ProtoMessage() {}
func (*StatusPolicy) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{36}
+ return fileDescriptor_6c4bded897df1f16, []int{37}
}
func (m *StatusPolicy) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1087,7 +1115,7 @@ var xxx_messageInfo_StatusPolicy proto.InternalMessageInfo
func (m *Template) Reset() { *m = Template{} }
func (*Template) ProtoMessage() {}
func (*Template) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{37}
+ return fileDescriptor_6c4bded897df1f16, []int{38}
}
func (m *Template) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1115,7 +1143,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo
func (m *TimeFilter) Reset() { *m = TimeFilter{} }
func (*TimeFilter) ProtoMessage() {}
func (*TimeFilter) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{38}
+ return fileDescriptor_6c4bded897df1f16, []int{39}
}
func (m *TimeFilter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1143,7 +1171,7 @@ var xxx_messageInfo_TimeFilter proto.InternalMessageInfo
func (m *Trigger) Reset() { *m = Trigger{} }
func (*Trigger) ProtoMessage() {}
func (*Trigger) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{39}
+ return fileDescriptor_6c4bded897df1f16, []int{40}
}
func (m *Trigger) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1171,7 +1199,7 @@ var xxx_messageInfo_Trigger proto.InternalMessageInfo
func (m *TriggerParameter) Reset() { *m = TriggerParameter{} }
func (*TriggerParameter) ProtoMessage() {}
func (*TriggerParameter) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{40}
+ return fileDescriptor_6c4bded897df1f16, []int{41}
}
func (m *TriggerParameter) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1199,7 +1227,7 @@ var xxx_messageInfo_TriggerParameter proto.InternalMessageInfo
func (m *TriggerParameterSource) Reset() { *m = TriggerParameterSource{} }
func (*TriggerParameterSource) ProtoMessage() {}
func (*TriggerParameterSource) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{41}
+ return fileDescriptor_6c4bded897df1f16, []int{42}
}
func (m *TriggerParameterSource) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1227,7 +1255,7 @@ var xxx_messageInfo_TriggerParameterSource proto.InternalMessageInfo
func (m *TriggerPolicy) Reset() { *m = TriggerPolicy{} }
func (*TriggerPolicy) ProtoMessage() {}
func (*TriggerPolicy) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{42}
+ return fileDescriptor_6c4bded897df1f16, []int{43}
}
func (m *TriggerPolicy) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1255,7 +1283,7 @@ var xxx_messageInfo_TriggerPolicy proto.InternalMessageInfo
func (m *TriggerTemplate) Reset() { *m = TriggerTemplate{} }
func (*TriggerTemplate) ProtoMessage() {}
func (*TriggerTemplate) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{43}
+ return fileDescriptor_6c4bded897df1f16, []int{44}
}
func (m *TriggerTemplate) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1283,7 +1311,7 @@ var xxx_messageInfo_TriggerTemplate proto.InternalMessageInfo
func (m *URLArtifact) Reset() { *m = URLArtifact{} }
func (*URLArtifact) ProtoMessage() {}
func (*URLArtifact) Descriptor() ([]byte, []int) {
- return fileDescriptor_6c4bded897df1f16, []int{44}
+ return fileDescriptor_6c4bded897df1f16, []int{45}
}
func (m *URLArtifact) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1319,6 +1347,7 @@ func init() {
proto.RegisterType((*CustomTrigger)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.CustomTrigger")
proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.CustomTrigger.SpecEntry")
proto.RegisterType((*DataFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.DataFilter")
+ proto.RegisterType((*EmailTrigger)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EmailTrigger")
proto.RegisterType((*Event)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.Event")
proto.RegisterType((*EventContext)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventContext")
proto.RegisterType((*EventDependency)(nil), "github.com.argoproj.argo_events.pkg.apis.sensor.v1alpha1.EventDependency")
@@ -1367,309 +1396,317 @@ func init() {
}
var fileDescriptor_6c4bded897df1f16 = []byte{
- // 4830 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x3c, 0x4d, 0x8f, 0x63, 0xc7,
- 0x71, 0x4b, 0x0e, 0x39, 0x43, 0xd6, 0x70, 0x76, 0x66, 0x7b, 0xb5, 0x12, 0x35, 0x96, 0x96, 0x1b,
- 0x1a, 0x51, 0xd6, 0x86, 0xcd, 0x91, 0x56, 0x71, 0x3c, 0x56, 0x60, 0x5b, 0x1c, 0xce, 0x8c, 0xf6,
- 0x83, 0xbb, 0x3b, 0xaa, 0xc7, 0x95, 0x90, 0x0f, 0x43, 0x7a, 0xf3, 0xd8, 0x24, 0x9f, 0xe6, 0xf1,
- 0x3d, 0x6e, 0x77, 0x73, 0x56, 0x23, 0xc0, 0x89, 0x1d, 0x23, 0x09, 0x8c, 0x00, 0x72, 0x0e, 0x3e,
- 0xe4, 0x64, 0x04, 0x08, 0x72, 0x08, 0x90, 0x43, 0x80, 0xfc, 0x03, 0xe7, 0xa2, 0xa3, 0x73, 0xf3,
- 0x21, 0x19, 0x44, 0xe3, 0x53, 0x0e, 0x46, 0xe2, 0x53, 0x82, 0xbd, 0x24, 0xe8, 0x8f, 0xf7, 0x49,
- 0xae, 0x76, 0xb8, 0x5c, 0xcd, 0x1a, 0xf0, 0x8d, 0xaf, 0xab, 0xba, 0xaa, 0xbb, 0xba, 0xba, 0xba,
- 0xaa, 0xba, 0x9a, 0x70, 0xbd, 0xef, 0x8a, 0xc1, 0x78, 0xbf, 0xe1, 0x04, 0xc3, 0x0d, 0x9b, 0xf5,
- 0x83, 0x11, 0x0b, 0x3e, 0x50, 0x3f, 0xbe, 0x4a, 0x0f, 0xa9, 0x2f, 0xf8, 0xc6, 0xe8, 0xa0, 0xbf,
- 0x61, 0x8f, 0x5c, 0xbe, 0xc1, 0xa9, 0xcf, 0x03, 0xb6, 0x71, 0xf8, 0x9a, 0xed, 0x8d, 0x06, 0xf6,
- 0x6b, 0x1b, 0x7d, 0xea, 0x53, 0x66, 0x0b, 0xda, 0x6d, 0x8c, 0x58, 0x20, 0x02, 0xb2, 0x19, 0x53,
- 0x6a, 0x84, 0x94, 0xd4, 0x8f, 0xf7, 0x34, 0xa5, 0xc6, 0xe8, 0xa0, 0xdf, 0x90, 0x94, 0x1a, 0x9a,
- 0x52, 0x23, 0xa4, 0xb4, 0xfe, 0xed, 0x53, 0x8f, 0xc1, 0x09, 0x86, 0xc3, 0xc0, 0xcf, 0xb2, 0x5e,
- 0xff, 0x6a, 0x82, 0x40, 0x3f, 0xe8, 0x07, 0x1b, 0xaa, 0x79, 0x7f, 0xdc, 0x53, 0x5f, 0xea, 0x43,
- 0xfd, 0x32, 0xe8, 0xf5, 0x83, 0x4d, 0xde, 0x70, 0x03, 0x49, 0x72, 0xc3, 0x09, 0x18, 0xdd, 0x38,
- 0x9c, 0x98, 0xcd, 0xfa, 0xef, 0xc6, 0x38, 0x43, 0xdb, 0x19, 0xb8, 0x3e, 0x65, 0x47, 0xf1, 0x38,
- 0x86, 0x54, 0xd8, 0xd3, 0x7a, 0x6d, 0x3c, 0xaa, 0x17, 0x1b, 0xfb, 0xc2, 0x1d, 0xd2, 0x89, 0x0e,
- 0xbf, 0xf7, 0xb8, 0x0e, 0xdc, 0x19, 0xd0, 0xa1, 0x9d, 0xed, 0x57, 0x7f, 0x58, 0x80, 0xb5, 0xe6,
- 0xbb, 0x56, 0xdb, 0x1e, 0xee, 0x77, 0xed, 0x0e, 0x73, 0xfb, 0x7d, 0xca, 0xc8, 0x26, 0x54, 0x7a,
- 0x63, 0xdf, 0x11, 0x6e, 0xe0, 0xdf, 0xb1, 0x87, 0xb4, 0x9a, 0xbb, 0x92, 0xbb, 0x5a, 0xde, 0x7a,
- 0xee, 0x93, 0xe3, 0xda, 0xb9, 0x93, 0xe3, 0x5a, 0x65, 0x37, 0x01, 0xc3, 0x14, 0x26, 0x41, 0x28,
- 0xdb, 0x8e, 0x43, 0x39, 0xbf, 0x45, 0x8f, 0xaa, 0xf9, 0x2b, 0xb9, 0xab, 0xcb, 0xd7, 0x7e, 0xbb,
- 0xa1, 0x87, 0x26, 0x97, 0xac, 0x21, 0xa5, 0xd4, 0x38, 0x7c, 0xad, 0x61, 0x51, 0x87, 0x51, 0x71,
- 0x8b, 0x1e, 0x59, 0xd4, 0xa3, 0x8e, 0x08, 0xd8, 0xd6, 0xca, 0xc9, 0x71, 0xad, 0xdc, 0x0c, 0xfb,
- 0x62, 0x4c, 0x46, 0xd2, 0xe4, 0x21, 0x7a, 0x75, 0x61, 0x66, 0x9a, 0x51, 0x33, 0xc6, 0x64, 0xc8,
- 0x2b, 0xb0, 0xc8, 0x68, 0xdf, 0x0d, 0xfc, 0x6a, 0x41, 0xcd, 0xed, 0xbc, 0x99, 0xdb, 0x22, 0xaa,
- 0x56, 0x34, 0x50, 0x32, 0x86, 0xa5, 0x91, 0x7d, 0xe4, 0x05, 0x76, 0xb7, 0x5a, 0xbc, 0xb2, 0x70,
- 0x75, 0xf9, 0xda, 0xcd, 0xc6, 0x93, 0x6a, 0x67, 0xc3, 0x48, 0x77, 0xcf, 0x66, 0xf6, 0x90, 0x0a,
- 0xca, 0xb6, 0x56, 0x0d, 0xd3, 0xa5, 0x3d, 0xcd, 0x02, 0x43, 0x5e, 0xe4, 0x4f, 0x00, 0x46, 0x21,
- 0x1a, 0xaf, 0x2e, 0x3e, 0x75, 0xce, 0xc4, 0x70, 0x86, 0xa8, 0x89, 0x63, 0x82, 0x23, 0x79, 0x03,
- 0xce, 0xbb, 0xfe, 0x61, 0xe0, 0xd8, 0x72, 0x61, 0x3b, 0x47, 0x23, 0x5a, 0x5d, 0x52, 0x62, 0x22,
- 0x27, 0xc7, 0xb5, 0xf3, 0x37, 0x52, 0x10, 0xcc, 0x60, 0x92, 0x2f, 0xc1, 0x12, 0x0b, 0x3c, 0xda,
- 0xc4, 0x3b, 0xd5, 0x92, 0xea, 0x14, 0x4d, 0x13, 0x75, 0x33, 0x86, 0xf0, 0xfa, 0x2f, 0xf3, 0x70,
- 0xb1, 0xc9, 0xfa, 0xc1, 0xbb, 0x01, 0x3b, 0xe8, 0x79, 0xc1, 0x83, 0x50, 0xff, 0x7c, 0x58, 0xe4,
- 0xc1, 0x98, 0x39, 0x5a, 0xf3, 0xe6, 0x9a, 0x7a, 0x93, 0x09, 0xb7, 0x67, 0x3b, 0xa2, 0x6d, 0x86,
- 0xb8, 0x05, 0x72, 0x95, 0x2d, 0x45, 0x1d, 0x0d, 0x17, 0x72, 0x1d, 0xca, 0xc1, 0x48, 0x6e, 0x0b,
- 0xa9, 0x10, 0x79, 0x35, 0xe8, 0x2f, 0x9b, 0x41, 0x97, 0xef, 0x86, 0x80, 0x87, 0xc7, 0xb5, 0x4b,
- 0xc9, 0xc1, 0x46, 0x00, 0x8c, 0x3b, 0x67, 0x16, 0x6e, 0xe1, 0xcc, 0x17, 0xee, 0x25, 0x28, 0xd8,
- 0xac, 0xcf, 0xab, 0x85, 0x2b, 0x0b, 0x57, 0xcb, 0x5b, 0xa5, 0x93, 0xe3, 0x5a, 0xa1, 0xc9, 0xfa,
- 0x1c, 0x55, 0x6b, 0xfd, 0x57, 0x72, 0xb3, 0x67, 0x04, 0x42, 0x2c, 0xc8, 0xf3, 0xd7, 0x8d, 0xa0,
- 0x7f, 0xff, 0xf4, 0x43, 0xd5, 0x16, 0xb4, 0x61, 0xbd, 0x1e, 0x12, 0xdc, 0x5a, 0x3c, 0x39, 0xae,
- 0xe5, 0xad, 0xd7, 0x31, 0xcf, 0x5f, 0x27, 0x75, 0x58, 0x74, 0x7d, 0xcf, 0xf5, 0xa9, 0x11, 0xa7,
- 0x92, 0xfa, 0x0d, 0xd5, 0x82, 0x06, 0x42, 0xba, 0x50, 0xe8, 0xb9, 0x1e, 0x35, 0x5b, 0x7a, 0xf7,
- 0xc9, 0xa5, 0xb4, 0xeb, 0x7a, 0x34, 0x1a, 0x85, 0x9a, 0xb3, 0x6c, 0x41, 0x45, 0x9d, 0xbc, 0x0f,
- 0x0b, 0x63, 0xe6, 0xa9, 0x6d, 0xbe, 0x7c, 0x6d, 0xe7, 0xc9, 0x99, 0xdc, 0xc3, 0x76, 0xc4, 0x63,
- 0xe9, 0xe4, 0xb8, 0xb6, 0x70, 0x0f, 0xdb, 0x28, 0x49, 0x93, 0x7b, 0x50, 0x76, 0x02, 0xbf, 0xe7,
- 0xf6, 0x87, 0xf6, 0xa8, 0x5a, 0x54, 0x7c, 0xae, 0x4e, 0xb3, 0x4f, 0x2d, 0x85, 0x74, 0xdb, 0x1e,
- 0x4d, 0x98, 0xa8, 0x56, 0xd8, 0x1d, 0x63, 0x4a, 0x72, 0xe0, 0x7d, 0x57, 0x54, 0x17, 0xe7, 0x1d,
- 0xf8, 0x5b, 0xae, 0x48, 0x0f, 0xfc, 0x2d, 0x57, 0xa0, 0x24, 0x4d, 0x1c, 0x28, 0x31, 0x6a, 0x36,
- 0xda, 0x92, 0x62, 0xf3, 0x8d, 0x99, 0xd7, 0x1f, 0x0d, 0x81, 0xad, 0xca, 0xc9, 0x71, 0xad, 0x14,
- 0x7e, 0x61, 0x44, 0xb8, 0xfe, 0xcf, 0x05, 0xb8, 0xd4, 0xfc, 0x68, 0xcc, 0xe8, 0x8e, 0x24, 0x70,
- 0x7d, 0xbc, 0xcf, 0xc3, 0x5d, 0x7e, 0x05, 0x0a, 0xbd, 0xfb, 0x5d, 0xdf, 0x9c, 0x2e, 0x15, 0xa3,
- 0xd9, 0x85, 0xdd, 0xb7, 0xb7, 0xef, 0xa0, 0x82, 0x48, 0x53, 0x32, 0x18, 0xef, 0xab, 0x23, 0x28,
- 0x9f, 0x36, 0x25, 0xd7, 0x75, 0x33, 0x86, 0x70, 0x32, 0x82, 0x8b, 0x7c, 0x60, 0x33, 0xda, 0x8d,
- 0x8e, 0x10, 0xd5, 0x6d, 0xa6, 0xe3, 0xe2, 0x85, 0x93, 0xe3, 0xda, 0x45, 0x6b, 0x92, 0x0a, 0x4e,
- 0x23, 0x4d, 0xba, 0xb0, 0x9a, 0x69, 0x36, 0x4a, 0x76, 0x4a, 0x6e, 0x17, 0x4f, 0x8e, 0x6b, 0xab,
- 0x19, 0x6e, 0x98, 0x25, 0xf9, 0x1b, 0x7a, 0x00, 0xd5, 0xff, 0xa7, 0x00, 0xcf, 0x2b, 0xad, 0xb1,
- 0x28, 0x3b, 0x74, 0x1d, 0xba, 0x35, 0x8e, 0xd4, 0xa6, 0x0f, 0x6b, 0x4e, 0xe0, 0xfb, 0x54, 0x39,
- 0x1d, 0x96, 0x60, 0xae, 0xdf, 0x37, 0xd6, 0xeb, 0x94, 0x82, 0x7f, 0xee, 0xe4, 0xb8, 0xb6, 0xd6,
- 0xca, 0x90, 0xc0, 0x09, 0xa2, 0x64, 0x03, 0xca, 0xf7, 0xc7, 0x74, 0x4c, 0x13, 0xfa, 0x77, 0x21,
- 0x3c, 0x15, 0xde, 0x0e, 0x01, 0x18, 0xe3, 0xc8, 0x0e, 0x22, 0x18, 0xb9, 0x4e, 0xa4, 0x79, 0x89,
- 0x0e, 0x9d, 0x10, 0x80, 0x31, 0x0e, 0xd9, 0x86, 0x35, 0x3e, 0xde, 0xe7, 0x0e, 0x73, 0x47, 0x91,
- 0xaf, 0xa5, 0xfd, 0x91, 0xaa, 0xe9, 0xb7, 0x66, 0x65, 0xe0, 0x38, 0xd1, 0x83, 0xdc, 0x83, 0x05,
- 0xe1, 0x71, 0x63, 0x79, 0xde, 0x98, 0x79, 0x07, 0x77, 0xda, 0x96, 0xb6, 0x3f, 0xda, 0x3a, 0x74,
- 0xda, 0x16, 0x4a, 0x7a, 0x49, 0xcd, 0x5b, 0x7c, 0x66, 0x9a, 0xb7, 0x74, 0xe6, 0x9a, 0xd7, 0x87,
- 0x4b, 0xad, 0xc0, 0xef, 0xba, 0x52, 0xbc, 0x1c, 0x29, 0xa7, 0x62, 0xeb, 0xa8, 0xe3, 0x0e, 0xa9,
- 0x34, 0x57, 0x0e, 0x0b, 0x26, 0xcc, 0x55, 0x8b, 0x05, 0x3e, 0x2a, 0x08, 0xf9, 0x0a, 0x94, 0xa4,
- 0xab, 0xfd, 0x51, 0x10, 0x1d, 0x7b, 0x6b, 0x06, 0xab, 0xd4, 0x31, 0xed, 0x18, 0x61, 0xd4, 0x3f,
- 0xce, 0xc1, 0x0b, 0x19, 0x4e, 0x2d, 0xe6, 0x0a, 0xca, 0x5c, 0x9b, 0x70, 0x58, 0xdc, 0x57, 0x5c,
- 0x8d, 0x66, 0xdf, 0x7d, 0x72, 0x01, 0x4c, 0x9d, 0x8c, 0x3e, 0x8f, 0xf5, 0x6f, 0x34, 0xac, 0xea,
- 0xff, 0x54, 0x84, 0x95, 0xd6, 0x98, 0x8b, 0x60, 0x18, 0x6e, 0xb5, 0x0d, 0xe9, 0x79, 0xb3, 0x43,
- 0xca, 0xee, 0x61, 0xdb, 0xcc, 0x3b, 0x52, 0x68, 0x2b, 0x04, 0x60, 0x8c, 0x23, 0xdd, 0x6a, 0x4e,
- 0x9d, 0x31, 0xd3, 0xf3, 0x2f, 0xc5, 0x6e, 0xb5, 0xa5, 0x5a, 0xd1, 0x40, 0xc9, 0x3d, 0x00, 0x87,
- 0x32, 0xa1, 0xf7, 0xe6, 0x6c, 0x46, 0xfa, 0xbc, 0x5c, 0xbb, 0x56, 0xd4, 0x19, 0x13, 0x84, 0xc8,
- 0x4d, 0x20, 0x7a, 0x2c, 0x72, 0x5f, 0xdc, 0x3d, 0xa4, 0x8c, 0xb9, 0xdd, 0x70, 0x47, 0xad, 0x9b,
- 0xa1, 0x10, 0x6b, 0x02, 0x03, 0xa7, 0xf4, 0x22, 0x1c, 0x0a, 0x7c, 0x44, 0x1d, 0x63, 0x75, 0xdf,
- 0x9e, 0x63, 0x01, 0x92, 0x22, 0x6d, 0x58, 0x23, 0xea, 0xec, 0xf8, 0x82, 0x1d, 0xc5, 0x1a, 0x24,
- 0x9b, 0x50, 0x31, 0x7b, 0xe6, 0x7e, 0x7f, 0x62, 0xcf, 0x2f, 0x9d, 0xdd, 0x9e, 0x5f, 0xff, 0x3a,
- 0x94, 0x23, 0xb9, 0x90, 0x35, 0x58, 0x38, 0xa0, 0x47, 0x5a, 0xdd, 0x50, 0xfe, 0x24, 0xcf, 0x41,
- 0xf1, 0xd0, 0xf6, 0xc6, 0x66, 0x53, 0xa1, 0xfe, 0x78, 0x23, 0xbf, 0x99, 0xab, 0xff, 0x32, 0x07,
- 0xb0, 0x6d, 0x0b, 0x7b, 0xd7, 0xf5, 0x84, 0xf6, 0x28, 0x46, 0xb6, 0x18, 0x64, 0xb7, 0xe8, 0x9e,
- 0x2d, 0x06, 0xa8, 0x20, 0xe4, 0x2b, 0x50, 0x10, 0x32, 0x9c, 0xc9, 0xa7, 0xac, 0x6c, 0x41, 0x06,
- 0x2e, 0x0f, 0x8f, 0x6b, 0xa5, 0x9b, 0xd6, 0xdd, 0x3b, 0x2a, 0xa8, 0x51, 0x58, 0xa4, 0x16, 0x32,
- 0x5e, 0x50, 0xee, 0x74, 0xf9, 0xe4, 0xb8, 0x56, 0x7c, 0x47, 0x36, 0x98, 0x31, 0x90, 0x37, 0x01,
- 0x9c, 0x60, 0x28, 0x05, 0x28, 0x02, 0x66, 0x14, 0xed, 0x4a, 0x28, 0xe3, 0x56, 0x04, 0x79, 0x98,
- 0xfa, 0xc2, 0x44, 0x1f, 0x65, 0x33, 0xe8, 0x70, 0xe4, 0xd9, 0x82, 0x2a, 0x0b, 0x9e, 0xb4, 0x19,
- 0xa6, 0x1d, 0x23, 0x8c, 0xfa, 0x4f, 0x72, 0x50, 0x54, 0x7e, 0x14, 0x19, 0xc2, 0x92, 0x13, 0xf8,
- 0x82, 0x7e, 0x28, 0x8c, 0x89, 0x98, 0xc3, 0x7f, 0x56, 0x14, 0x5b, 0x9a, 0xda, 0xd6, 0xb2, 0x5c,
- 0x21, 0xf3, 0x81, 0x21, 0x0f, 0x19, 0x57, 0x74, 0x6d, 0x61, 0x2b, 0xb9, 0x55, 0xb4, 0x8f, 0x2d,
- 0xe5, 0x8e, 0xaa, 0xf5, 0x8d, 0xd2, 0xdf, 0xfc, 0x6d, 0xed, 0xdc, 0xf7, 0xfe, 0xed, 0xca, 0xb9,
- 0xfa, 0xaf, 0xf2, 0x50, 0x49, 0x92, 0x23, 0xeb, 0x90, 0x77, 0xbb, 0x66, 0x41, 0xc0, 0xcc, 0x2c,
- 0x7f, 0x63, 0x1b, 0xf3, 0x6e, 0x57, 0x59, 0x0b, 0xed, 0x7d, 0xe6, 0xd3, 0x41, 0x78, 0x26, 0x3c,
- 0xfb, 0x1a, 0x2c, 0xcb, 0xdd, 0x71, 0x48, 0x19, 0x97, 0x01, 0x9a, 0x3e, 0x59, 0x2f, 0x1a, 0xe4,
- 0x65, 0xa9, 0x39, 0xef, 0x68, 0x10, 0x26, 0xf1, 0xa4, 0x36, 0xa8, 0xb5, 0x2e, 0xa4, 0xb5, 0x21,
- 0xb1, 0xbe, 0x4d, 0x58, 0x95, 0xe3, 0x57, 0x93, 0xf4, 0x85, 0x42, 0xd6, 0x6b, 0xf0, 0x82, 0x41,
- 0x5e, 0x95, 0x93, 0x6c, 0x69, 0xb0, 0xea, 0x97, 0xc5, 0x97, 0x2e, 0x2a, 0x1f, 0xef, 0x7f, 0x40,
- 0x1d, 0xed, 0xa9, 0x27, 0x5c, 0x54, 0x4b, 0x37, 0x63, 0x08, 0x27, 0x6d, 0x28, 0x48, 0xe3, 0x6f,
- 0x5c, 0xed, 0x2f, 0x27, 0xcc, 0x5d, 0x94, 0xb1, 0x89, 0xd7, 0x68, 0x48, 0x85, 0x2d, 0x0d, 0xa0,
- 0xb2, 0xd6, 0xf1, 0xd8, 0xa5, 0xbd, 0x56, 0x54, 0x12, 0x32, 0xff, 0xb8, 0x00, 0xab, 0x4a, 0xe6,
- 0xdb, 0x74, 0x44, 0xfd, 0x2e, 0xf5, 0x9d, 0x23, 0x39, 0x77, 0x3f, 0xce, 0xdc, 0x44, 0xfd, 0x95,
- 0x07, 0xa1, 0x20, 0x72, 0xee, 0x4a, 0x2f, 0xb4, 0xac, 0x13, 0x3e, 0x4e, 0x34, 0xf7, 0x9d, 0x34,
- 0x18, 0xb3, 0xf8, 0xf2, 0x78, 0x50, 0x4d, 0xd3, 0xfc, 0x9d, 0x9d, 0x10, 0x80, 0x31, 0x0e, 0x39,
- 0x84, 0xa5, 0x9e, 0xda, 0xa9, 0xdc, 0xb8, 0xca, 0x77, 0xe7, 0x54, 0xda, 0x78, 0xc6, 0xda, 0x02,
- 0x68, 0xed, 0xd5, 0xbf, 0x39, 0x86, 0xcc, 0xc8, 0xf7, 0x73, 0x50, 0x16, 0xcc, 0xf6, 0x79, 0x2f,
- 0x60, 0x43, 0xe3, 0x28, 0x75, 0x9e, 0x1a, 0xeb, 0x4e, 0x48, 0x99, 0x9a, 0x70, 0x2e, 0x6a, 0xc0,
- 0x98, 0x2b, 0x71, 0xe1, 0x79, 0x33, 0x9c, 0x76, 0xd0, 0x77, 0x1d, 0xdb, 0xd3, 0xf9, 0x83, 0x80,
- 0x19, 0xbd, 0x79, 0xcd, 0x48, 0xee, 0xf9, 0xdd, 0xa9, 0x58, 0x0f, 0x8f, 0x6b, 0xab, 0x99, 0x26,
- 0x7c, 0x04, 0xc1, 0xfa, 0x3f, 0x14, 0xe1, 0xd2, 0x54, 0xf1, 0x90, 0x7d, 0xa3, 0x82, 0xda, 0x64,
- 0x6c, 0xcf, 0x61, 0xdc, 0xdd, 0x21, 0x35, 0x22, 0x2f, 0xa5, 0x15, 0x33, 0x69, 0x99, 0xf2, 0x67,
- 0x60, 0x99, 0x7a, 0xc6, 0x32, 0xe9, 0x5c, 0xcb, 0x1c, 0x53, 0x8a, 0xcf, 0x91, 0x78, 0xbf, 0xc4,
- 0x36, 0x8e, 0xb8, 0x50, 0xa4, 0x1f, 0x8e, 0x98, 0x4e, 0xad, 0xcc, 0xc5, 0x68, 0xe7, 0xc3, 0x11,
- 0x33, 0x8c, 0x56, 0x0c, 0xa3, 0xa2, 0x6c, 0xe3, 0xa8, 0x39, 0x90, 0xf7, 0xe1, 0xa2, 0x64, 0x99,
- 0xd5, 0x13, 0x6d, 0x9a, 0x1a, 0xa6, 0xcb, 0xc5, 0xed, 0x49, 0x94, 0x69, 0x4a, 0x32, 0x8d, 0x94,
- 0xe4, 0x20, 0x59, 0x4d, 0xd7, 0xc4, 0x88, 0xc3, 0xce, 0x24, 0xca, 0x54, 0x0e, 0x53, 0x48, 0x29,
- 0xdb, 0xae, 0xa2, 0x14, 0x93, 0x39, 0x8c, 0x6d, 0xbb, 0x6a, 0x45, 0x03, 0xad, 0xbf, 0x0f, 0xeb,
- 0x8f, 0xde, 0x4e, 0xf2, 0xf4, 0xf8, 0xe0, 0x7e, 0xf6, 0xf4, 0xb8, 0xf9, 0x36, 0xe6, 0x3f, 0xb8,
- 0x9f, 0xe0, 0x90, 0xff, 0x4c, 0x0e, 0x3f, 0xc9, 0x01, 0xc4, 0x22, 0x97, 0x96, 0x51, 0x8e, 0x37,
- 0x6b, 0x19, 0x25, 0x06, 0x2a, 0x08, 0xf1, 0x61, 0xb1, 0xe7, 0x52, 0xaf, 0xcb, 0xab, 0x79, 0xb5,
- 0xd4, 0x73, 0xe8, 0xaf, 0xf1, 0x74, 0x76, 0x25, 0xb9, 0x78, 0x80, 0xea, 0x93, 0xa3, 0xe1, 0x52,
- 0x7f, 0x15, 0x2a, 0xc9, 0x0c, 0xd6, 0xe3, 0xbd, 0x98, 0xfa, 0x5f, 0x14, 0x61, 0x39, 0x91, 0xd6,
- 0x21, 0x2f, 0xeb, 0x1c, 0x97, 0xee, 0xb0, 0x6c, 0x3a, 0xc4, 0x09, 0xaa, 0x6f, 0xc1, 0x79, 0xc7,
- 0x0b, 0x7c, 0xba, 0xed, 0x32, 0xe5, 0x43, 0x1f, 0x19, 0x89, 0x3d, 0x6f, 0x30, 0xcf, 0xb7, 0x52,
- 0x50, 0xcc, 0x60, 0x13, 0x07, 0x8a, 0x0e, 0xa3, 0x5d, 0x6e, 0x1c, 0xf5, 0xad, 0xb9, 0x72, 0x51,
- 0x2d, 0x49, 0x49, 0xbb, 0x52, 0xea, 0x27, 0x6a, 0xda, 0xe4, 0x8f, 0xa0, 0xc2, 0xf9, 0x40, 0x79,
- 0xfa, 0x2a, 0x28, 0x98, 0x29, 0x97, 0xb2, 0x76, 0x72, 0x5c, 0xab, 0x58, 0xd6, 0xf5, 0xa8, 0x3b,
- 0xa6, 0x88, 0x49, 0x2f, 0xab, 0xe7, 0x7a, 0x54, 0x8a, 0x30, 0xeb, 0x65, 0xed, 0x9a, 0x76, 0x8c,
- 0x30, 0xa4, 0x66, 0xed, 0x33, 0xdb, 0x77, 0x06, 0x66, 0x43, 0x44, 0x0b, 0xb7, 0xa5, 0x5a, 0xd1,
- 0x40, 0xa5, 0xd8, 0x85, 0xdd, 0x37, 0x0a, 0x1e, 0x89, 0xbd, 0x63, 0xf7, 0x51, 0xb6, 0x4b, 0x30,
- 0xa3, 0x3d, 0x93, 0x04, 0x8f, 0xc0, 0x48, 0x7b, 0x28, 0xdb, 0xc9, 0x10, 0x16, 0x19, 0x1d, 0x06,
- 0x82, 0x56, 0xcb, 0x6a, 0xaa, 0x37, 0xe6, 0x12, 0x2b, 0x2a, 0x52, 0x26, 0x90, 0x07, 0x7d, 0x93,
- 0x21, 0x5b, 0xd0, 0x30, 0x21, 0x16, 0x5c, 0x72, 0x7d, 0x1d, 0x7e, 0xdd, 0xe8, 0xfb, 0x01, 0xa3,
- 0xd7, 0x03, 0xae, 0x6e, 0x54, 0x40, 0x45, 0x6a, 0x2f, 0x9b, 0xf1, 0x5d, 0xba, 0x31, 0x0d, 0x09,
- 0xa7, 0xf7, 0xad, 0xff, 0x63, 0x0e, 0x4a, 0xe1, 0x9a, 0x92, 0xbb, 0x50, 0x1a, 0x73, 0xca, 0x22,
- 0xbf, 0xe3, 0xd4, 0xab, 0xa7, 0x52, 0x87, 0xf7, 0x4c, 0x57, 0x8c, 0x88, 0x48, 0x82, 0x23, 0x9b,
- 0xf3, 0x07, 0x01, 0xeb, 0xce, 0x76, 0x97, 0xa4, 0x08, 0xee, 0x99, 0xae, 0x18, 0x11, 0xa9, 0xbf,
- 0x0d, 0xab, 0x19, 0x51, 0x9d, 0xc2, 0x51, 0x7a, 0x09, 0x0a, 0x63, 0xe6, 0x69, 0x63, 0x60, 0x52,
- 0xea, 0xf7, 0xb0, 0x6d, 0xa1, 0x6a, 0xad, 0xff, 0xe7, 0x22, 0x2c, 0x5f, 0xef, 0x74, 0xf6, 0xc2,
- 0x90, 0xf9, 0x31, 0x5b, 0x31, 0x11, 0x60, 0xe5, 0xcf, 0x30, 0xa9, 0x62, 0x52, 0x44, 0x0b, 0x4f,
- 0x39, 0x45, 0xf4, 0x0a, 0x2c, 0x0e, 0xa9, 0x18, 0x04, 0xdd, 0xec, 0x2d, 0xda, 0x6d, 0xd5, 0x8a,
- 0x06, 0x9a, 0x09, 0x6b, 0x8b, 0x67, 0x1e, 0xd6, 0x7e, 0x09, 0x96, 0xa4, 0x6b, 0x12, 0x8c, 0xb5,
- 0x93, 0xbe, 0x10, 0x4b, 0xaa, 0xa3, 0x9b, 0x31, 0x84, 0x93, 0x3e, 0x94, 0xf7, 0x6d, 0xee, 0x3a,
- 0xcd, 0xb1, 0x18, 0x18, 0x4f, 0x7d, 0x76, 0x79, 0x6d, 0x85, 0x14, 0xb4, 0x3f, 0x18, 0x7d, 0x62,
- 0x4c, 0x9b, 0x7c, 0x17, 0x96, 0x06, 0xd4, 0xee, 0x4a, 0x81, 0x94, 0x94, 0x40, 0xf0, 0xc9, 0x05,
- 0x92, 0x50, 0xc0, 0xc6, 0x75, 0x4d, 0x54, 0xe7, 0x18, 0xe2, 0x7c, 0xb9, 0x6e, 0xc5, 0x90, 0x27,
- 0x39, 0x84, 0x15, 0xbd, 0xa1, 0x0d, 0xa4, 0x5a, 0x56, 0x83, 0xf8, 0xe6, 0xec, 0x17, 0x40, 0x09,
- 0x2a, 0x5b, 0x17, 0x4e, 0x8e, 0x6b, 0x2b, 0xc9, 0x16, 0x8e, 0x69, 0x36, 0xeb, 0x6f, 0x40, 0x25,
- 0x39, 0xc2, 0x99, 0xa2, 0xfd, 0x3f, 0x5f, 0x80, 0x0b, 0xb7, 0x36, 0xad, 0xf0, 0x92, 0x61, 0x2f,
- 0xf0, 0x5c, 0xe7, 0x88, 0xfc, 0x29, 0x2c, 0x7a, 0xf6, 0x3e, 0xf5, 0x78, 0x35, 0xa7, 0xa6, 0xf0,
- 0xee, 0x93, 0xcb, 0x71, 0x82, 0x78, 0xa3, 0xad, 0x28, 0x6b, 0x61, 0x46, 0xda, 0xad, 0x1b, 0xd1,
- 0xb0, 0x25, 0xef, 0xc1, 0xd2, 0xbe, 0xed, 0x1c, 0x04, 0xbd, 0x9e, 0xb1, 0x52, 0x9b, 0x4f, 0xa0,
- 0x30, 0xaa, 0xbf, 0x76, 0x71, 0xcd, 0x07, 0x86, 0x54, 0xa5, 0xe9, 0xa6, 0x8c, 0x05, 0xec, 0xae,
- 0x6f, 0x40, 0x46, 0x6b, 0xd5, 0x7e, 0x4e, 0x98, 0xee, 0x9d, 0x69, 0x48, 0x38, 0xbd, 0xef, 0xfa,
- 0x37, 0x60, 0x39, 0x31, 0xb9, 0x99, 0xd6, 0xe1, 0xa7, 0x4b, 0x50, 0xb9, 0x65, 0xf7, 0x0e, 0xec,
- 0x53, 0x1a, 0xbd, 0x2f, 0x42, 0x51, 0xe5, 0xbc, 0x8d, 0xdb, 0x11, 0x39, 0xbd, 0x2a, 0x27, 0x8e,
- 0x1a, 0x26, 0x83, 0xc9, 0x91, 0xcd, 0x84, 0x4a, 0x55, 0xaa, 0x89, 0x15, 0xe3, 0x60, 0x72, 0x2f,
- 0x04, 0x60, 0x8c, 0x93, 0x31, 0x2a, 0x85, 0x33, 0x37, 0x2a, 0x9b, 0x50, 0x61, 0xf4, 0xfe, 0xd8,
- 0x55, 0xd7, 0x35, 0x07, 0x3a, 0xff, 0x5e, 0x8c, 0x8b, 0x24, 0x30, 0x01, 0xc3, 0x14, 0xa6, 0xf4,
- 0x46, 0x9c, 0x60, 0x38, 0x62, 0x94, 0x73, 0x65, 0x8f, 0x4a, 0xb1, 0x37, 0xd2, 0x32, 0xed, 0x18,
- 0x61, 0x48, 0xef, 0xad, 0xe7, 0x8d, 0xf9, 0x60, 0x57, 0xd2, 0x90, 0x0e, 0xb2, 0x32, 0x4b, 0xc5,
- 0xd8, 0x7b, 0xdb, 0x4d, 0x41, 0x31, 0x83, 0x1d, 0xda, 0xfe, 0xd2, 0xe7, 0x77, 0x3d, 0x50, 0x3e,
- 0xc3, 0x93, 0xec, 0x9b, 0xb0, 0x1a, 0xa9, 0x80, 0xeb, 0xf7, 0x43, 0x07, 0xa6, 0xac, 0xaf, 0xd3,
- 0xf6, 0xd2, 0x20, 0xcc, 0xe2, 0xca, 0x93, 0x20, 0x4c, 0x23, 0x2d, 0xa7, 0xd3, 0x35, 0x61, 0x0a,
- 0x29, 0x84, 0x93, 0x3f, 0x80, 0x02, 0xb7, 0xb9, 0x57, 0xad, 0x3c, 0xe9, 0xcd, 0x78, 0xd3, 0x6a,
- 0x1b, 0xc9, 0x29, 0xa7, 0x41, 0x7e, 0xa3, 0x22, 0x49, 0xbe, 0x9f, 0x83, 0xf3, 0xba, 0x1e, 0x07,
- 0x69, 0xdf, 0xe5, 0x82, 0x1d, 0x55, 0x57, 0x66, 0xbd, 0xe6, 0x0d, 0xb9, 0xa4, 0xc8, 0x18, 0x7e,
- 0xaa, 0x4c, 0x23, 0x0d, 0xc1, 0x0c, 0xc3, 0xfa, 0x5d, 0x80, 0x76, 0xd0, 0x0f, 0x77, 0x70, 0x13,
- 0x56, 0x5d, 0x5f, 0x50, 0x76, 0x68, 0x7b, 0x16, 0x75, 0x02, 0xbf, 0xcb, 0xd5, 0x6e, 0x2e, 0xc4,
- 0xd9, 0xa0, 0x1b, 0x69, 0x30, 0x66, 0xf1, 0xeb, 0x7f, 0xbf, 0x00, 0xcb, 0x77, 0x9a, 0x1d, 0xeb,
- 0x94, 0x46, 0x21, 0x91, 0x38, 0xcb, 0x3f, 0x26, 0x71, 0x96, 0x50, 0xb5, 0x85, 0x67, 0x76, 0x13,
- 0x75, 0xf6, 0x06, 0xe6, 0xf3, 0xb9, 0xd7, 0xab, 0xff, 0xa8, 0x00, 0x6b, 0x77, 0x47, 0xd4, 0x7f,
- 0x77, 0xe0, 0xf2, 0x83, 0xc4, 0x5d, 0xfc, 0x20, 0xe0, 0x22, 0xeb, 0x06, 0x4b, 0x3f, 0x1f, 0x15,
- 0x24, 0xb9, 0x73, 0xf2, 0x8f, 0xd9, 0x39, 0x1b, 0x50, 0x96, 0x9e, 0x33, 0x1f, 0xd9, 0xce, 0x44,
- 0x5e, 0xf0, 0x4e, 0x08, 0xc0, 0x18, 0x47, 0x55, 0x8d, 0x8d, 0xc5, 0xa0, 0x13, 0x1c, 0x50, 0x7f,
- 0xb6, 0xc0, 0x4f, 0x57, 0x8d, 0x85, 0x7d, 0x31, 0x26, 0x43, 0xae, 0x01, 0xd8, 0x71, 0x05, 0x9b,
- 0x0e, 0xfa, 0x22, 0x89, 0x37, 0xe3, 0xfa, 0xb5, 0x04, 0xd6, 0x6f, 0xea, 0x95, 0x27, 0x42, 0x25,
- 0x99, 0xa8, 0x38, 0xc5, 0x35, 0x4a, 0x18, 0x35, 0xe5, 0x1f, 0x15, 0x35, 0xd5, 0xff, 0xaf, 0x0c,
- 0x2b, 0x7b, 0x63, 0x8f, 0xdb, 0xec, 0x69, 0x3a, 0x09, 0xcf, 0xba, 0xbc, 0x2a, 0xa1, 0x20, 0x85,
- 0x33, 0x54, 0x90, 0x11, 0x5c, 0x14, 0x1e, 0xef, 0xb0, 0x31, 0x17, 0x2d, 0xca, 0x04, 0x37, 0x29,
- 0x92, 0xe2, 0xcc, 0xc5, 0x2d, 0x9d, 0xb6, 0x95, 0xa5, 0x82, 0xd3, 0x48, 0x93, 0x7d, 0x58, 0x17,
- 0x1e, 0x6f, 0x7a, 0x5e, 0xf0, 0x20, 0x4c, 0x08, 0xc4, 0x15, 0x13, 0xc6, 0x69, 0xa9, 0x9b, 0xf1,
- 0xae, 0x77, 0xda, 0xd6, 0x23, 0x30, 0xf1, 0x33, 0xa8, 0x90, 0xdb, 0x6a, 0x56, 0xef, 0xd8, 0x9e,
- 0xdb, 0xb5, 0x85, 0x4a, 0x29, 0x28, 0x9d, 0x5a, 0x52, 0xc4, 0xbf, 0x10, 0x26, 0x21, 0x3b, 0x6d,
- 0x2b, 0x8b, 0x82, 0xd3, 0xfa, 0x7d, 0x5e, 0x7e, 0x4e, 0x17, 0x56, 0x23, 0xa3, 0x62, 0xe4, 0x5e,
- 0x9e, 0xb9, 0xcc, 0xa7, 0x99, 0xa6, 0x80, 0x59, 0x92, 0xe4, 0xbb, 0x70, 0x21, 0xae, 0x3f, 0x31,
- 0x9e, 0xba, 0x72, 0x6c, 0xe6, 0x89, 0x26, 0x2e, 0x9d, 0x1c, 0xd7, 0x2e, 0xb4, 0xb2, 0x64, 0x71,
- 0x92, 0x13, 0xf9, 0xbb, 0x1c, 0xac, 0xc9, 0x21, 0x35, 0xc5, 0x80, 0xfa, 0x1f, 0x29, 0x95, 0xe4,
- 0xd5, 0x65, 0xa5, 0xe1, 0xdf, 0x99, 0x23, 0xfb, 0x99, 0xdc, 0xff, 0x8d, 0x66, 0x86, 0xbe, 0x0e,
- 0xaa, 0xa2, 0x42, 0x97, 0x2c, 0x18, 0x27, 0x06, 0x44, 0xfa, 0xc9, 0x41, 0x9a, 0xb5, 0xa8, 0xcc,
- 0x5c, 0xf9, 0xd3, 0xcc, 0x90, 0xc0, 0x09, 0xa2, 0xeb, 0x2d, 0xb8, 0x34, 0x75, 0xb4, 0x33, 0x45,
- 0x49, 0x7f, 0x96, 0x83, 0x32, 0xda, 0x82, 0xb6, 0xdd, 0xa1, 0x2b, 0xc8, 0x35, 0x28, 0x8c, 0x7d,
- 0x37, 0x3c, 0x60, 0x2f, 0x87, 0x16, 0xf3, 0x9e, 0xef, 0x8a, 0x87, 0xc7, 0xb5, 0xf3, 0x11, 0x22,
- 0x95, 0x2d, 0xa8, 0x70, 0xa5, 0x53, 0xa6, 0xbc, 0x78, 0x2e, 0xf8, 0x1e, 0x65, 0x12, 0xa0, 0xb8,
- 0x14, 0x63, 0xa7, 0x0c, 0xd3, 0x60, 0xcc, 0xe2, 0xd7, 0x7f, 0x9a, 0x87, 0x45, 0x4b, 0x2d, 0x0b,
- 0x79, 0x1f, 0x4a, 0x43, 0x2a, 0x6c, 0x75, 0x59, 0xa2, 0xd3, 0x73, 0xaf, 0x9e, 0xee, 0x0a, 0xf2,
- 0xae, 0xf2, 0xc2, 0x6e, 0x53, 0x61, 0xc7, 0xf6, 0x31, 0x6e, 0xc3, 0x88, 0x2a, 0xe9, 0x99, 0x92,
- 0x89, 0xfc, 0xbc, 0xb7, 0x4b, 0x7a, 0xc4, 0xd6, 0x88, 0x3a, 0x53, 0xab, 0x24, 0x7c, 0x58, 0xe4,
- 0xc2, 0x16, 0x63, 0x3e, 0x7f, 0xe9, 0xa8, 0xe1, 0xa4, 0xa8, 0x25, 0x6e, 0x10, 0xd4, 0x37, 0x1a,
- 0x2e, 0xf5, 0x7f, 0xcd, 0x01, 0x68, 0xc4, 0xb6, 0xcb, 0x05, 0xf9, 0xe3, 0x09, 0x41, 0x36, 0x4e,
- 0x27, 0x48, 0xd9, 0x5b, 0x89, 0x31, 0x0a, 0xf7, 0xc2, 0x96, 0x84, 0x10, 0x29, 0x14, 0x5d, 0x41,
- 0x87, 0xe1, 0xe5, 0xc3, 0x9b, 0xf3, 0xce, 0x2d, 0x3e, 0x49, 0x6f, 0x48, 0xb2, 0xa8, 0xa9, 0xd7,
- 0x3f, 0x59, 0x0c, 0xe7, 0x24, 0x05, 0x4b, 0x7e, 0x90, 0x83, 0x4a, 0x37, 0xbc, 0x82, 0x71, 0x69,
- 0x98, 0x4b, 0xb9, 0xf1, 0xd4, 0x2e, 0x49, 0xe3, 0xc0, 0x78, 0x3b, 0xc1, 0x06, 0x53, 0x4c, 0x49,
- 0x00, 0x25, 0xa1, 0xad, 0x45, 0x38, 0xfd, 0xe6, 0xdc, 0xe7, 0x6b, 0xa2, 0x9e, 0xc2, 0x90, 0xc6,
- 0x88, 0x09, 0xf1, 0x12, 0xd5, 0x17, 0x73, 0x5f, 0x6e, 0x84, 0xf5, 0x1a, 0x3a, 0xfd, 0x3c, 0x59,
- 0xbd, 0x41, 0x6e, 0x02, 0x31, 0xb9, 0x98, 0x5d, 0xdb, 0xf5, 0x68, 0x17, 0x83, 0xb1, 0xaf, 0x53,
- 0xa7, 0xa5, 0xb8, 0x3c, 0x69, 0x67, 0x02, 0x03, 0xa7, 0xf4, 0x22, 0x9b, 0x50, 0x51, 0xe3, 0xd9,
- 0x1a, 0xf3, 0x84, 0x83, 0x1b, 0x09, 0x79, 0x27, 0x01, 0xc3, 0x14, 0x26, 0xb9, 0x0a, 0x25, 0x46,
- 0x47, 0x9e, 0xeb, 0xd8, 0x3a, 0xfb, 0x50, 0x0c, 0x4b, 0x77, 0x75, 0x1b, 0x46, 0x50, 0xd2, 0x86,
- 0xe7, 0x18, 0x3d, 0x74, 0xa5, 0x4f, 0x7f, 0xdd, 0xe5, 0x22, 0x60, 0x47, 0xca, 0x44, 0x99, 0xfc,
- 0x43, 0xf5, 0xe4, 0xb8, 0xf6, 0x1c, 0x4e, 0x81, 0xe3, 0xd4, 0x5e, 0xe4, 0xc7, 0x39, 0x58, 0xf1,
- 0x82, 0x7e, 0xdf, 0xf5, 0xfb, 0xfa, 0x02, 0xcc, 0xe4, 0x3d, 0xdf, 0x7d, 0x1a, 0x76, 0xa2, 0xd1,
- 0x4e, 0x52, 0xd6, 0x47, 0xcb, 0x25, 0x23, 0x8c, 0x95, 0x14, 0x0c, 0xd3, 0x83, 0x58, 0x7f, 0x13,
- 0xc8, 0x64, 0xdf, 0x99, 0x0c, 0x7d, 0x00, 0x95, 0xa4, 0x19, 0x21, 0xef, 0x45, 0xe6, 0x49, 0x5b,
- 0x87, 0xaf, 0xcf, 0x1e, 0xd4, 0x7f, 0xb6, 0x3d, 0xfa, 0x0e, 0x2c, 0x5b, 0x9e, 0xed, 0x1c, 0x58,
- 0x72, 0xe7, 0xa8, 0x12, 0xa2, 0xd4, 0xbd, 0x4b, 0xe2, 0x72, 0x6b, 0xca, 0xa5, 0xca, 0x15, 0x28,
- 0xb8, 0x4e, 0x14, 0xc4, 0x45, 0xe6, 0xf5, 0x86, 0x13, 0xf8, 0xa8, 0x20, 0xf5, 0x7f, 0xc9, 0x19,
- 0xfa, 0x9d, 0x01, 0xa3, 0x76, 0x97, 0x58, 0x70, 0x69, 0x48, 0x39, 0xb7, 0xfb, 0xb4, 0xd9, 0xef,
- 0x33, 0xda, 0x57, 0xcf, 0x06, 0x6e, 0x85, 0xd2, 0x89, 0xd3, 0x8f, 0xb7, 0xa7, 0x21, 0xe1, 0xf4,
- 0xbe, 0xe4, 0x3d, 0x78, 0x71, 0x9f, 0x05, 0x76, 0xd7, 0xb1, 0xa5, 0x05, 0x54, 0x18, 0x9d, 0xa0,
- 0x35, 0xb0, 0x7d, 0x9f, 0x7a, 0xa6, 0x78, 0xf0, 0xb7, 0x0c, 0xe1, 0x17, 0xb7, 0x1e, 0x85, 0x88,
- 0x8f, 0xa6, 0x51, 0xff, 0xdf, 0x02, 0x54, 0xf4, 0x2c, 0x4c, 0xfc, 0x91, 0x8e, 0x1d, 0x72, 0xcf,
- 0x20, 0x9c, 0x07, 0xae, 0xc6, 0xa3, 0xa2, 0xdc, 0xfc, 0xcc, 0x35, 0x8f, 0x56, 0xd4, 0x19, 0x13,
- 0x84, 0x64, 0x5c, 0xee, 0x18, 0xb1, 0x2d, 0xa4, 0xe3, 0xf2, 0x50, 0x48, 0x21, 0x5c, 0xa2, 0x9a,
- 0xc5, 0x30, 0xf7, 0x35, 0x11, 0xaa, 0x91, 0x1e, 0x86, 0x70, 0xf2, 0x35, 0x58, 0xb6, 0x85, 0xb0,
- 0x9d, 0xc1, 0x50, 0x4a, 0xc1, 0x58, 0x97, 0xa8, 0xe4, 0xaa, 0x19, 0x83, 0x30, 0x89, 0xa7, 0x6e,
- 0x4e, 0xbd, 0xc0, 0x39, 0xe0, 0x13, 0x37, 0xa7, 0xaa, 0x15, 0x0d, 0x94, 0x0c, 0x61, 0x51, 0x28,
- 0xe5, 0x32, 0x57, 0x2c, 0x73, 0x3c, 0x6f, 0x48, 0x68, 0x6a, 0xcc, 0x4e, 0x7f, 0xa3, 0x61, 0x22,
- 0xd9, 0x71, 0xb5, 0x57, 0x4c, 0x74, 0x30, 0x2f, 0x3b, 0xbd, 0xf1, 0x92, 0xd5, 0xad, 0xf2, 0x1b,
- 0x0d, 0x93, 0xfa, 0x7f, 0x2f, 0x00, 0xb1, 0x84, 0xed, 0x77, 0x6d, 0xd6, 0xbd, 0xb5, 0x69, 0x3d,
- 0xab, 0x57, 0x4d, 0x77, 0x26, 0x5f, 0x35, 0xbd, 0x3a, 0xed, 0x55, 0xd3, 0x17, 0x6e, 0x8d, 0xf7,
- 0x29, 0xf3, 0xa9, 0xa0, 0x3c, 0xbc, 0xfd, 0xf8, 0xb5, 0x7c, 0xdb, 0xd4, 0x83, 0x95, 0x91, 0x2d,
- 0x9c, 0x81, 0x25, 0x98, 0x2d, 0x68, 0xff, 0xc8, 0x28, 0xf1, 0x9b, 0xa1, 0x99, 0xdf, 0x4b, 0x02,
- 0x1f, 0x1e, 0xd7, 0x7e, 0xe7, 0x51, 0x4f, 0x22, 0xc5, 0xd1, 0x88, 0xf2, 0x86, 0x42, 0x57, 0x45,
- 0x7d, 0x69, 0xb2, 0xe4, 0x1a, 0x80, 0xe7, 0x1e, 0x52, 0xed, 0xe2, 0x2a, 0xd5, 0x2f, 0xc5, 0x63,
- 0x6b, 0x47, 0x10, 0x4c, 0x60, 0xd5, 0x37, 0xa0, 0xa2, 0x8d, 0xb4, 0xb9, 0x94, 0xaa, 0x41, 0xd1,
- 0x96, 0x61, 0xaf, 0xb2, 0x33, 0x45, 0x5d, 0xee, 0xa0, 0xe2, 0x60, 0xd4, 0xed, 0xf5, 0x1f, 0x96,
- 0x20, 0x72, 0x11, 0x88, 0x33, 0xe1, 0x51, 0xce, 0xfe, 0x10, 0xe7, 0xb6, 0x21, 0xa0, 0x4f, 0xf3,
- 0xf0, 0x2b, 0xe1, 0x58, 0x9a, 0xe2, 0x68, 0xd7, 0xa1, 0x4d, 0xc7, 0x09, 0xc6, 0xa6, 0x6c, 0x2f,
- 0x3f, 0x59, 0x1c, 0x9d, 0xc6, 0xc0, 0x29, 0xbd, 0xc8, 0x4d, 0xf5, 0xe4, 0x49, 0xd8, 0x52, 0xa6,
- 0xc6, 0x71, 0x7a, 0xf9, 0x11, 0x4f, 0x9e, 0x34, 0x52, 0xf4, 0xce, 0x49, 0x7f, 0x62, 0xdc, 0x9d,
- 0xec, 0xc0, 0xd2, 0x61, 0xe0, 0x8d, 0x87, 0x34, 0xcc, 0xb1, 0xae, 0x4f, 0xa3, 0xf4, 0x8e, 0x42,
- 0x49, 0x24, 0x1d, 0x75, 0x17, 0x0c, 0xfb, 0x12, 0x0a, 0xab, 0x2a, 0xc3, 0xe0, 0x8a, 0x23, 0x53,
- 0x23, 0x66, 0xf2, 0x23, 0xaf, 0x4c, 0x23, 0xb7, 0x17, 0x74, 0xad, 0x34, 0xb6, 0x79, 0x8f, 0x93,
- 0x6e, 0xc4, 0x2c, 0x4d, 0xf2, 0x71, 0x0e, 0x2a, 0x7e, 0xd0, 0xa5, 0xa1, 0x6d, 0x36, 0x89, 0xc2,
- 0xce, 0xfc, 0x6e, 0x63, 0xe3, 0x4e, 0x82, 0xac, 0xf6, 0x60, 0x22, 0x77, 0x2e, 0x09, 0xc2, 0x14,
- 0x7f, 0x72, 0x0f, 0x96, 0x45, 0xe0, 0x99, 0x3d, 0x1a, 0x66, 0x0f, 0x2f, 0x4f, 0x9b, 0x73, 0x27,
- 0x42, 0x8b, 0x2d, 0x79, 0xdc, 0xc6, 0x31, 0x49, 0x87, 0xf8, 0xb0, 0xe6, 0x0e, 0xed, 0x3e, 0xdd,
- 0x1b, 0x7b, 0x9e, 0x3e, 0x90, 0x42, 0x7f, 0x6d, 0xea, 0xdb, 0x36, 0x69, 0x88, 0x3c, 0xb3, 0x2f,
- 0x68, 0x8f, 0x32, 0xea, 0x3b, 0x34, 0x8e, 0xed, 0x6f, 0x64, 0x28, 0xe1, 0x04, 0x6d, 0xf2, 0x16,
- 0x5c, 0x18, 0x31, 0x37, 0x50, 0xa2, 0xf6, 0x6c, 0xae, 0x9d, 0xda, 0xb2, 0x52, 0xce, 0x17, 0x0d,
- 0x99, 0x0b, 0x7b, 0x59, 0x04, 0x9c, 0xec, 0x23, 0xdd, 0xdb, 0xb0, 0x51, 0x25, 0x50, 0x8c, 0x7b,
- 0x1b, 0xf6, 0xc5, 0x08, 0x4a, 0x76, 0xa1, 0x64, 0xf7, 0x7a, 0xae, 0x2f, 0x31, 0x97, 0x95, 0xaa,
- 0xbc, 0x34, 0x6d, 0x6a, 0x4d, 0x83, 0xa3, 0xe9, 0x84, 0x5f, 0x18, 0xf5, 0x5d, 0xff, 0x36, 0x5c,
- 0x98, 0x58, 0xba, 0x99, 0x1c, 0x48, 0x0b, 0x20, 0xae, 0xa7, 0x24, 0x5f, 0x84, 0x22, 0x17, 0x36,
- 0x0b, 0x53, 0x05, 0x51, 0xf8, 0x66, 0xc9, 0x46, 0xd4, 0x30, 0xe9, 0xc5, 0x71, 0x11, 0x8c, 0xb2,
- 0x5e, 0x9c, 0x25, 0x82, 0x11, 0x2a, 0x48, 0xfd, 0x2f, 0x8b, 0xb0, 0x14, 0x9e, 0x3c, 0x3c, 0x11,
- 0xe6, 0xe4, 0xe6, 0x2d, 0x36, 0x32, 0x44, 0x1f, 0x1b, 0xed, 0xa4, 0x8f, 0x8b, 0xfc, 0x99, 0x1f,
- 0x17, 0x07, 0xb0, 0x38, 0x52, 0xc6, 0xd8, 0x18, 0xa8, 0xb7, 0xe6, 0xe7, 0xad, 0xc8, 0xe9, 0xb3,
- 0x56, 0xff, 0x46, 0xc3, 0x82, 0xdc, 0x87, 0x15, 0x46, 0x05, 0x3b, 0x4a, 0x9d, 0x4d, 0xf3, 0xe4,
- 0xee, 0x54, 0x25, 0x05, 0x26, 0x49, 0x62, 0x9a, 0x03, 0x19, 0x41, 0x99, 0x85, 0x59, 0x23, 0x63,
- 0xea, 0x5a, 0x4f, 0x3e, 0xc5, 0x28, 0x01, 0xa5, 0x2d, 0x75, 0xf4, 0x89, 0x31, 0x13, 0xed, 0x14,
- 0xb6, 0xa9, 0xcd, 0xc5, 0x5d, 0xdf, 0xa1, 0x26, 0x0b, 0x9c, 0x70, 0x0a, 0x23, 0x10, 0x26, 0xf1,
- 0xea, 0xff, 0x95, 0x83, 0xb5, 0xec, 0xea, 0x91, 0x03, 0x58, 0xe0, 0xcc, 0x31, 0xda, 0xb8, 0xf7,
- 0xf4, 0xd4, 0x42, 0xfb, 0x40, 0x3a, 0x87, 0x6b, 0x31, 0x07, 0x25, 0x17, 0xb9, 0x5b, 0xba, 0x94,
- 0x8b, 0xec, 0x6e, 0xd9, 0xa6, 0x5c, 0xa0, 0x82, 0x90, 0x76, 0xd2, 0x57, 0x5a, 0x48, 0x95, 0xc1,
- 0xa6, 0x7c, 0xa5, 0x17, 0xb3, 0xfc, 0xa6, 0x79, 0x4a, 0xf5, 0x1f, 0x2e, 0xc0, 0xf3, 0xd3, 0x07,
- 0x46, 0xbe, 0x05, 0xe7, 0xa3, 0x94, 0xc7, 0x51, 0xe2, 0xcf, 0x15, 0xa2, 0xdb, 0xfc, 0xed, 0x14,
- 0x14, 0x33, 0xd8, 0xd2, 0x39, 0x31, 0x95, 0xcf, 0xe1, 0x3f, 0x2c, 0x24, 0xae, 0xb5, 0x5a, 0x11,
- 0x04, 0x13, 0x58, 0xa4, 0x09, 0xab, 0xe6, 0xab, 0x93, 0x4c, 0x76, 0x24, 0x4a, 0xfd, 0x5b, 0x69,
- 0x30, 0x66, 0xf1, 0x65, 0xe8, 0x20, 0x9d, 0x88, 0xf0, 0x91, 0x6b, 0x22, 0x74, 0xd8, 0xd6, 0xcd,
- 0x18, 0xc2, 0xc9, 0x26, 0x54, 0xe4, 0xcf, 0x4e, 0xfa, 0x55, 0x4b, 0x9c, 0xfe, 0x49, 0xc0, 0x30,
- 0x85, 0x19, 0x3f, 0xb7, 0xd1, 0xc1, 0xc3, 0xe4, 0x73, 0x9b, 0x6b, 0x00, 0x63, 0x4e, 0xd1, 0x7e,
- 0x20, 0x89, 0x98, 0x8b, 0x82, 0x68, 0xf2, 0xf7, 0x22, 0x08, 0x26, 0xb0, 0xea, 0xbf, 0xc8, 0xc1,
- 0x4a, 0x6a, 0xff, 0x92, 0x1e, 0x2c, 0x1c, 0x6c, 0x86, 0xc1, 0xf9, 0xad, 0xa7, 0x58, 0x2d, 0xa4,
- 0xb5, 0xee, 0xd6, 0x26, 0x47, 0xc9, 0x80, 0x7c, 0x10, 0xe5, 0x01, 0xe6, 0xae, 0x83, 0x4f, 0xfa,
- 0x96, 0xc6, 0xd7, 0x4f, 0xa7, 0x04, 0xfe, 0x7d, 0x05, 0x56, 0x33, 0x86, 0xf9, 0x14, 0xa5, 0x8d,
- 0x5a, 0x99, 0xcc, 0xf3, 0xc0, 0x29, 0xca, 0x14, 0x3e, 0x1c, 0x4c, 0x60, 0x91, 0xbe, 0x96, 0x9e,
- 0xb6, 0xa9, 0xed, 0xb9, 0xa6, 0x94, 0x09, 0x90, 0x32, 0xe2, 0xfb, 0x41, 0x0e, 0x2a, 0x76, 0xe2,
- 0xff, 0x16, 0x8c, 0x49, 0xbd, 0x3d, 0x4f, 0xd4, 0x34, 0xf1, 0x57, 0x13, 0xba, 0x72, 0x38, 0x09,
- 0xc0, 0x14, 0x53, 0xe2, 0x40, 0x61, 0x20, 0x44, 0xf8, 0xae, 0x7f, 0xe7, 0xa9, 0xd4, 0xe8, 0xe9,
- 0x7a, 0x10, 0xd9, 0x80, 0x8a, 0x38, 0x79, 0x00, 0x65, 0xfb, 0x01, 0xd7, 0xff, 0xc1, 0x62, 0x1e,
- 0xfc, 0xcf, 0x13, 0x1c, 0x66, 0xfe, 0xce, 0xc5, 0x5c, 0x92, 0x87, 0xad, 0x18, 0xf3, 0x22, 0x0c,
- 0x16, 0x1d, 0xf5, 0x3c, 0xd1, 0xc4, 0xe1, 0x6f, 0x3d, 0xa5, 0x67, 0x8e, 0xfa, 0xf8, 0x4a, 0x35,
- 0xa1, 0xe1, 0x44, 0xfa, 0x50, 0x3c, 0xb0, 0x7b, 0x07, 0xb6, 0x89, 0xc5, 0xe7, 0xd8, 0x15, 0xc9,
- 0x1a, 0x34, 0x6d, 0x2d, 0x54, 0x0b, 0x6a, 0xfa, 0x72, 0xe9, 0x7c, 0x5b, 0x70, 0x73, 0x5d, 0x37,
- 0xc7, 0xd2, 0x25, 0xaa, 0x5a, 0xf4, 0xd2, 0xc9, 0x06, 0x54, 0xc4, 0xe5, 0x6c, 0x54, 0x32, 0xc6,
- 0x5c, 0xd6, 0xed, 0xce, 0x9b, 0xc8, 0x48, 0xce, 0x46, 0xb5, 0xa0, 0xa6, 0x2f, 0x75, 0x24, 0x08,
- 0xab, 0x36, 0x8c, 0xbb, 0x3a, 0x87, 0x8e, 0x64, 0x0b, 0x40, 0xb4, 0x8e, 0x44, 0xad, 0x18, 0xf3,
- 0x22, 0xef, 0xc1, 0x82, 0x17, 0xf4, 0xcd, 0x45, 0xdb, 0x1c, 0x97, 0x3a, 0x71, 0xb5, 0x91, 0xde,
- 0xe8, 0xed, 0xa0, 0x8f, 0x92, 0x32, 0xf9, 0xab, 0x1c, 0x9c, 0xb7, 0x53, 0xff, 0x10, 0x61, 0xaa,
- 0xa1, 0xe6, 0x78, 0x1d, 0x36, 0xf5, 0x1f, 0x27, 0x74, 0x5d, 0x54, 0x1a, 0x84, 0x19, 0xd6, 0xca,
- 0x6d, 0x54, 0xf7, 0x96, 0xd5, 0xf3, 0xf3, 0x6e, 0x89, 0xd4, 0xfd, 0xa7, 0x71, 0x1b, 0x55, 0x13,
- 0x1a, 0x16, 0xe4, 0xc7, 0x39, 0x75, 0x34, 0x27, 0x1f, 0x68, 0x57, 0x57, 0xe7, 0x7e, 0x70, 0x3c,
- 0xfd, 0x51, 0x79, 0xea, 0xb4, 0x4f, 0x22, 0x60, 0x76, 0x08, 0xe4, 0x47, 0x39, 0x58, 0xb5, 0xd3,
- 0xff, 0xbe, 0x50, 0x5d, 0x9b, 0xd7, 0x53, 0x9b, 0xfe, 0x77, 0x0e, 0xe6, 0x7e, 0x3c, 0x0d, 0xc3,
- 0x2c, 0xf7, 0xba, 0x03, 0xcb, 0x89, 0x3f, 0x60, 0x39, 0x45, 0x85, 0xca, 0x35, 0x80, 0x43, 0xca,
- 0xdc, 0xde, 0x51, 0x8b, 0x32, 0x61, 0x12, 0xca, 0xd1, 0xd1, 0xf6, 0x4e, 0x04, 0xc1, 0x04, 0xd6,
- 0x56, 0xe3, 0x93, 0x4f, 0x2f, 0x9f, 0xfb, 0xd9, 0xa7, 0x97, 0xcf, 0xfd, 0xfc, 0xd3, 0xcb, 0xe7,
- 0xbe, 0x77, 0x72, 0x39, 0xf7, 0xc9, 0xc9, 0xe5, 0xdc, 0xcf, 0x4e, 0x2e, 0xe7, 0x7e, 0x7e, 0x72,
- 0x39, 0xf7, 0x1f, 0x27, 0x97, 0x73, 0x7f, 0xfd, 0x8b, 0xcb, 0xe7, 0xfe, 0xb0, 0x14, 0xce, 0xe8,
- 0xff, 0x03, 0x00, 0x00, 0xff, 0xff, 0xcf, 0x04, 0xdc, 0x30, 0xf3, 0x4c, 0x00, 0x00,
+ // 4960 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0xcd, 0x8f, 0x63, 0xc7,
+ 0x71, 0xf8, 0x92, 0x43, 0xce, 0x90, 0x35, 0x9c, 0x8f, 0xed, 0xd5, 0xae, 0xa9, 0xb1, 0xb4, 0xdc,
+ 0x1f, 0x8d, 0x9f, 0xb2, 0x36, 0x64, 0x8e, 0xb4, 0x8a, 0xe3, 0xb1, 0x02, 0xdb, 0xe2, 0x7c, 0x69,
+ 0x3f, 0xb8, 0x3b, 0xa3, 0x22, 0x47, 0x42, 0x3e, 0x0c, 0xe9, 0xcd, 0x63, 0x93, 0x7c, 0x9a, 0xc7,
+ 0xf7, 0xb8, 0xdd, 0xcd, 0x59, 0x51, 0x80, 0x13, 0x3b, 0x46, 0x12, 0x18, 0x01, 0xe4, 0x1c, 0x7c,
+ 0xc8, 0xc9, 0x08, 0x10, 0xe4, 0x10, 0x20, 0x87, 0x00, 0xf9, 0x0f, 0x1c, 0x20, 0xd0, 0xd1, 0xb9,
+ 0xf9, 0x10, 0x0c, 0xa2, 0x71, 0x2e, 0x39, 0x18, 0x89, 0x4f, 0x09, 0xf6, 0x92, 0xa0, 0x3f, 0xde,
+ 0x27, 0x39, 0xda, 0xe1, 0x72, 0x35, 0x32, 0xe0, 0x1b, 0x5f, 0x55, 0x75, 0x55, 0x77, 0xbd, 0xea,
+ 0xea, 0xaa, 0xea, 0x7a, 0x84, 0xdb, 0x5d, 0x47, 0xf4, 0x86, 0x87, 0x35, 0xdb, 0xef, 0xaf, 0x5b,
+ 0xac, 0xeb, 0x0f, 0x98, 0xff, 0xbe, 0xfa, 0xf1, 0x55, 0x7a, 0x4c, 0x3d, 0xc1, 0xd7, 0x07, 0x47,
+ 0xdd, 0x75, 0x6b, 0xe0, 0xf0, 0x75, 0x4e, 0x3d, 0xee, 0xb3, 0xf5, 0xe3, 0x57, 0x2d, 0x77, 0xd0,
+ 0xb3, 0x5e, 0x5d, 0xef, 0x52, 0x8f, 0x32, 0x4b, 0xd0, 0x76, 0x6d, 0xc0, 0x7c, 0xe1, 0x93, 0x8d,
+ 0x88, 0x53, 0x2d, 0xe0, 0xa4, 0x7e, 0xbc, 0xab, 0x39, 0xd5, 0x06, 0x47, 0xdd, 0x9a, 0xe4, 0x54,
+ 0xd3, 0x9c, 0x6a, 0x01, 0xa7, 0xb5, 0x6f, 0x9f, 0x7b, 0x0e, 0xb6, 0xdf, 0xef, 0xfb, 0x5e, 0x5a,
+ 0xf4, 0xda, 0x57, 0x63, 0x0c, 0xba, 0x7e, 0xd7, 0x5f, 0x57, 0xe0, 0xc3, 0x61, 0x47, 0x3d, 0xa9,
+ 0x07, 0xf5, 0xcb, 0x90, 0x57, 0x8f, 0x36, 0x78, 0xcd, 0xf1, 0x25, 0xcb, 0x75, 0xdb, 0x67, 0x74,
+ 0xfd, 0x78, 0x6c, 0x35, 0x6b, 0xbf, 0x1d, 0xd1, 0xf4, 0x2d, 0xbb, 0xe7, 0x78, 0x94, 0x8d, 0xa2,
+ 0x79, 0xf4, 0xa9, 0xb0, 0x26, 0x8d, 0x5a, 0x3f, 0x6b, 0x14, 0x1b, 0x7a, 0xc2, 0xe9, 0xd3, 0xb1,
+ 0x01, 0xbf, 0xf3, 0xa4, 0x01, 0xdc, 0xee, 0xd1, 0xbe, 0x95, 0x1e, 0x57, 0x7d, 0x9c, 0x83, 0xd5,
+ 0xfa, 0x3b, 0xcd, 0x86, 0xd5, 0x3f, 0x6c, 0x5b, 0x2d, 0xe6, 0x74, 0xbb, 0x94, 0x91, 0x0d, 0x28,
+ 0x75, 0x86, 0x9e, 0x2d, 0x1c, 0xdf, 0x7b, 0x60, 0xf5, 0x69, 0x39, 0x73, 0x23, 0x73, 0xb3, 0xb8,
+ 0xf9, 0xdc, 0xc7, 0x27, 0x95, 0x4b, 0xa7, 0x27, 0x95, 0xd2, 0x6e, 0x0c, 0x87, 0x09, 0x4a, 0x82,
+ 0x50, 0xb4, 0x6c, 0x9b, 0x72, 0x7e, 0x8f, 0x8e, 0xca, 0xd9, 0x1b, 0x99, 0x9b, 0x8b, 0xb7, 0xfe,
+ 0x7f, 0x4d, 0x4f, 0x4d, 0xbe, 0xb2, 0x9a, 0xd4, 0x52, 0xed, 0xf8, 0xd5, 0x5a, 0x93, 0xda, 0x8c,
+ 0x8a, 0x7b, 0x74, 0xd4, 0xa4, 0x2e, 0xb5, 0x85, 0xcf, 0x36, 0x97, 0x4e, 0x4f, 0x2a, 0xc5, 0x7a,
+ 0x30, 0x16, 0x23, 0x36, 0x92, 0x27, 0x0f, 0xc8, 0xcb, 0x73, 0x53, 0xf3, 0x0c, 0xc1, 0x18, 0xb1,
+ 0x21, 0x2f, 0xc1, 0x3c, 0xa3, 0x5d, 0xc7, 0xf7, 0xca, 0x39, 0xb5, 0xb6, 0x65, 0xb3, 0xb6, 0x79,
+ 0x54, 0x50, 0x34, 0x58, 0x32, 0x84, 0x85, 0x81, 0x35, 0x72, 0x7d, 0xab, 0x5d, 0xce, 0xdf, 0x98,
+ 0xbb, 0xb9, 0x78, 0xeb, 0x6e, 0xed, 0x69, 0xad, 0xb3, 0x66, 0xb4, 0xbb, 0x6f, 0x31, 0xab, 0x4f,
+ 0x05, 0x65, 0x9b, 0x2b, 0x46, 0xe8, 0xc2, 0xbe, 0x16, 0x81, 0x81, 0x2c, 0xf2, 0x47, 0x00, 0x83,
+ 0x80, 0x8c, 0x97, 0xe7, 0x9f, 0xb9, 0x64, 0x62, 0x24, 0x43, 0x08, 0xe2, 0x18, 0x93, 0x48, 0x5e,
+ 0x87, 0x65, 0xc7, 0x3b, 0xf6, 0x6d, 0x4b, 0xbe, 0xd8, 0xd6, 0x68, 0x40, 0xcb, 0x0b, 0x4a, 0x4d,
+ 0xe4, 0xf4, 0xa4, 0xb2, 0x7c, 0x27, 0x81, 0xc1, 0x14, 0x25, 0xf9, 0x32, 0x2c, 0x30, 0xdf, 0xa5,
+ 0x75, 0x7c, 0x50, 0x2e, 0xa8, 0x41, 0xe1, 0x32, 0x51, 0x83, 0x31, 0xc0, 0x57, 0x7f, 0x99, 0x85,
+ 0x2b, 0x75, 0xd6, 0xf5, 0xdf, 0xf1, 0xd9, 0x51, 0xc7, 0xf5, 0x1f, 0x05, 0xf6, 0xe7, 0xc1, 0x3c,
+ 0xf7, 0x87, 0xcc, 0xd6, 0x96, 0x37, 0xd3, 0xd2, 0xeb, 0x4c, 0x38, 0x1d, 0xcb, 0x16, 0x0d, 0x33,
+ 0xc5, 0x4d, 0x90, 0x6f, 0xb9, 0xa9, 0xb8, 0xa3, 0x91, 0x42, 0x6e, 0x43, 0xd1, 0x1f, 0xc8, 0x6d,
+ 0x21, 0x0d, 0x22, 0xab, 0x26, 0xfd, 0x15, 0x33, 0xe9, 0xe2, 0x5e, 0x80, 0x78, 0x7c, 0x52, 0xb9,
+ 0x1a, 0x9f, 0x6c, 0x88, 0xc0, 0x68, 0x70, 0xea, 0xc5, 0xcd, 0x5d, 0xf8, 0x8b, 0x7b, 0x01, 0x72,
+ 0x16, 0xeb, 0xf2, 0x72, 0xee, 0xc6, 0xdc, 0xcd, 0xe2, 0x66, 0xe1, 0xf4, 0xa4, 0x92, 0xab, 0xb3,
+ 0x2e, 0x47, 0x05, 0xad, 0xfe, 0x4a, 0x6e, 0xf6, 0x94, 0x42, 0x48, 0x13, 0xb2, 0xfc, 0x35, 0xa3,
+ 0xe8, 0xdf, 0x3d, 0xff, 0x54, 0xb5, 0x07, 0xad, 0x35, 0x5f, 0x0b, 0x18, 0x6e, 0xce, 0x9f, 0x9e,
+ 0x54, 0xb2, 0xcd, 0xd7, 0x30, 0xcb, 0x5f, 0x23, 0x55, 0x98, 0x77, 0x3c, 0xd7, 0xf1, 0xa8, 0x51,
+ 0xa7, 0xd2, 0xfa, 0x1d, 0x05, 0x41, 0x83, 0x21, 0x6d, 0xc8, 0x75, 0x1c, 0x97, 0x9a, 0x2d, 0xbd,
+ 0xfb, 0xf4, 0x5a, 0xda, 0x75, 0x5c, 0x1a, 0xce, 0x42, 0xad, 0x59, 0x42, 0x50, 0x71, 0x27, 0xef,
+ 0xc1, 0xdc, 0x90, 0xb9, 0x6a, 0x9b, 0x2f, 0xde, 0xda, 0x79, 0x7a, 0x21, 0x07, 0xd8, 0x08, 0x65,
+ 0x2c, 0x9c, 0x9e, 0x54, 0xe6, 0x0e, 0xb0, 0x81, 0x92, 0x35, 0x39, 0x80, 0xa2, 0xed, 0x7b, 0x1d,
+ 0xa7, 0xdb, 0xb7, 0x06, 0xe5, 0xbc, 0x92, 0x73, 0x73, 0x92, 0x7f, 0xda, 0x52, 0x44, 0xf7, 0xad,
+ 0xc1, 0x98, 0x8b, 0xda, 0x0a, 0x86, 0x63, 0xc4, 0x49, 0x4e, 0xbc, 0xeb, 0x88, 0xf2, 0xfc, 0xac,
+ 0x13, 0x7f, 0xd3, 0x11, 0xc9, 0x89, 0xbf, 0xe9, 0x08, 0x94, 0xac, 0x89, 0x0d, 0x05, 0x46, 0xcd,
+ 0x46, 0x5b, 0x50, 0x62, 0xbe, 0x31, 0xf5, 0xfb, 0x47, 0xc3, 0x60, 0xb3, 0x74, 0x7a, 0x52, 0x29,
+ 0x04, 0x4f, 0x18, 0x32, 0xae, 0xfe, 0x63, 0x0e, 0xae, 0xd6, 0x3f, 0x1c, 0x32, 0xba, 0x23, 0x19,
+ 0xdc, 0x1e, 0x1e, 0xf2, 0x60, 0x97, 0xdf, 0x80, 0x5c, 0xe7, 0x61, 0xdb, 0x33, 0xa7, 0x4b, 0xc9,
+ 0x58, 0x76, 0x6e, 0xf7, 0xad, 0xed, 0x07, 0xa8, 0x30, 0xd2, 0x95, 0xf4, 0x86, 0x87, 0xea, 0x08,
+ 0xca, 0x26, 0x5d, 0xc9, 0x6d, 0x0d, 0xc6, 0x00, 0x4f, 0x06, 0x70, 0x85, 0xf7, 0x2c, 0x46, 0xdb,
+ 0xe1, 0x11, 0xa2, 0x86, 0x4d, 0x75, 0x5c, 0x7c, 0xe1, 0xf4, 0xa4, 0x72, 0xa5, 0x39, 0xce, 0x05,
+ 0x27, 0xb1, 0x26, 0x6d, 0x58, 0x49, 0x81, 0x8d, 0x91, 0x9d, 0x53, 0xda, 0x95, 0xd3, 0x93, 0xca,
+ 0x4a, 0x4a, 0x1a, 0xa6, 0x59, 0xfe, 0x86, 0x1e, 0x40, 0xd5, 0xff, 0xce, 0xc1, 0x35, 0x65, 0x35,
+ 0x4d, 0xca, 0x8e, 0x1d, 0x9b, 0x6e, 0x0e, 0x43, 0xb3, 0xe9, 0xc2, 0xaa, 0xed, 0x7b, 0x1e, 0x55,
+ 0x41, 0x47, 0x53, 0x30, 0xc7, 0xeb, 0x1a, 0xef, 0x75, 0x4e, 0xc5, 0x3f, 0x77, 0x7a, 0x52, 0x59,
+ 0xdd, 0x4a, 0xb1, 0xc0, 0x31, 0xa6, 0x64, 0x1d, 0x8a, 0x0f, 0x87, 0x74, 0x48, 0x63, 0xf6, 0x77,
+ 0x39, 0x38, 0x15, 0xde, 0x0a, 0x10, 0x18, 0xd1, 0xc8, 0x01, 0xc2, 0x1f, 0x38, 0x76, 0x68, 0x79,
+ 0xb1, 0x01, 0xad, 0x00, 0x81, 0x11, 0x0d, 0xd9, 0x86, 0x55, 0x3e, 0x3c, 0xe4, 0x36, 0x73, 0x06,
+ 0x61, 0xac, 0xa5, 0xe3, 0x91, 0xb2, 0x19, 0xb7, 0xda, 0x4c, 0xe1, 0x71, 0x6c, 0x04, 0x39, 0x80,
+ 0x39, 0xe1, 0x72, 0xe3, 0x79, 0x5e, 0x9f, 0x7a, 0x07, 0xb7, 0x1a, 0x4d, 0xed, 0x7f, 0xb4, 0x77,
+ 0x68, 0x35, 0x9a, 0x28, 0xf9, 0xc5, 0x2d, 0x6f, 0xfe, 0x73, 0xb3, 0xbc, 0x85, 0x0b, 0xb7, 0xbc,
+ 0x2e, 0x5c, 0xdd, 0xf2, 0xbd, 0xb6, 0x23, 0xd5, 0xcb, 0x91, 0x72, 0x2a, 0x36, 0x47, 0x2d, 0xa7,
+ 0x4f, 0xa5, 0xbb, 0xb2, 0x99, 0x3f, 0xe6, 0xae, 0xb6, 0x98, 0xef, 0xa1, 0xc2, 0x90, 0x97, 0xa1,
+ 0x20, 0x43, 0xed, 0x0f, 0xfd, 0xf0, 0xd8, 0x5b, 0x35, 0x54, 0x85, 0x96, 0x81, 0x63, 0x48, 0x51,
+ 0xfd, 0x28, 0x03, 0x5f, 0x48, 0x49, 0xda, 0x62, 0x8e, 0xa0, 0xcc, 0xb1, 0x08, 0x87, 0xf9, 0x43,
+ 0x25, 0xd5, 0x58, 0xf6, 0xde, 0xd3, 0x2b, 0x60, 0xe2, 0x62, 0xf4, 0x79, 0xac, 0x7f, 0xa3, 0x11,
+ 0x55, 0xfd, 0x87, 0x3c, 0x2c, 0x6d, 0x0d, 0xb9, 0xf0, 0xfb, 0xc1, 0x56, 0x5b, 0x97, 0x91, 0x37,
+ 0x3b, 0xa6, 0xec, 0x00, 0x1b, 0x66, 0xdd, 0xa1, 0x41, 0x37, 0x03, 0x04, 0x46, 0x34, 0x32, 0xac,
+ 0xe6, 0xd4, 0x1e, 0x32, 0xbd, 0xfe, 0x42, 0x14, 0x56, 0x37, 0x15, 0x14, 0x0d, 0x96, 0x1c, 0x00,
+ 0xd8, 0x94, 0x09, 0xbd, 0x37, 0xa7, 0x73, 0xd2, 0xcb, 0xf2, 0xdd, 0x6d, 0x85, 0x83, 0x31, 0xc6,
+ 0x88, 0xdc, 0x05, 0xa2, 0xe7, 0x22, 0xf7, 0xc5, 0xde, 0x31, 0x65, 0xcc, 0x69, 0x07, 0x3b, 0x6a,
+ 0xcd, 0x4c, 0x85, 0x34, 0xc7, 0x28, 0x70, 0xc2, 0x28, 0xc2, 0x21, 0xc7, 0x07, 0xd4, 0x36, 0x5e,
+ 0xf7, 0xad, 0x19, 0x5e, 0x40, 0x5c, 0xa5, 0xb5, 0xe6, 0x80, 0xda, 0x3b, 0x9e, 0x60, 0xa3, 0xc8,
+ 0x82, 0x24, 0x08, 0x95, 0xb0, 0xcf, 0x3d, 0xee, 0x8f, 0xed, 0xf9, 0x85, 0x8b, 0xdb, 0xf3, 0x6b,
+ 0x5f, 0x87, 0x62, 0xa8, 0x17, 0xb2, 0x0a, 0x73, 0x47, 0x74, 0xa4, 0xcd, 0x0d, 0xe5, 0x4f, 0xf2,
+ 0x1c, 0xe4, 0x8f, 0x2d, 0x77, 0x68, 0x36, 0x15, 0xea, 0x87, 0xd7, 0xb3, 0x1b, 0x99, 0xea, 0x2f,
+ 0x33, 0x00, 0xdb, 0x96, 0xb0, 0x76, 0x1d, 0x57, 0xe8, 0x88, 0x62, 0x60, 0x89, 0x5e, 0x7a, 0x8b,
+ 0xee, 0x5b, 0xa2, 0x87, 0x0a, 0x43, 0x5e, 0x86, 0x9c, 0x90, 0xe9, 0x4c, 0x36, 0xe1, 0x65, 0x73,
+ 0x32, 0x71, 0x79, 0x7c, 0x52, 0x29, 0xdc, 0x6d, 0xee, 0x3d, 0x50, 0x49, 0x8d, 0xa2, 0x22, 0x95,
+ 0x40, 0xf0, 0x9c, 0x0a, 0xa7, 0x8b, 0xa7, 0x27, 0x95, 0xfc, 0xdb, 0x12, 0x60, 0xe6, 0x40, 0xde,
+ 0x00, 0xb0, 0xfd, 0xbe, 0x54, 0xa0, 0xf0, 0x99, 0x31, 0xb4, 0x1b, 0x81, 0x8e, 0xb7, 0x42, 0xcc,
+ 0xe3, 0xc4, 0x13, 0xc6, 0xc6, 0x28, 0x9f, 0x41, 0xfb, 0x03, 0xd7, 0x12, 0x54, 0x79, 0xf0, 0xb8,
+ 0xcf, 0x30, 0x70, 0x0c, 0x29, 0xaa, 0xff, 0x3e, 0x07, 0xa5, 0x9d, 0xbe, 0xe5, 0xb8, 0xc1, 0x0e,
+ 0x4d, 0x1a, 0x4c, 0xe6, 0xc2, 0x0d, 0xe6, 0x65, 0x28, 0x0c, 0x39, 0x65, 0x5e, 0x74, 0x44, 0x86,
+ 0xd3, 0x3f, 0x30, 0x70, 0x0c, 0x29, 0xc8, 0x1f, 0x40, 0x89, 0xf7, 0xc5, 0x60, 0xdf, 0xe2, 0xfc,
+ 0x91, 0xcf, 0xda, 0xd3, 0x6d, 0xfc, 0xd5, 0xd3, 0x93, 0x4a, 0xa9, 0x79, 0xbf, 0xb5, 0x1f, 0x0c,
+ 0xc7, 0x04, 0x33, 0xf9, 0xf2, 0x7b, 0x3e, 0x17, 0xe6, 0x2d, 0x84, 0x2f, 0xff, 0xb6, 0xcf, 0x05,
+ 0x2a, 0x8c, 0x32, 0x0f, 0x9f, 0x09, 0xa5, 0xe7, 0x7c, 0xcc, 0x3c, 0x7c, 0x26, 0x50, 0x61, 0xc8,
+ 0x35, 0xc8, 0x0a, 0x5f, 0xed, 0xbb, 0xa2, 0x4e, 0x67, 0x5a, 0x3e, 0x66, 0x85, 0xaf, 0x42, 0x55,
+ 0xe6, 0xf7, 0x4d, 0x16, 0x1c, 0x85, 0xaa, 0xcc, 0xef, 0xa3, 0xc2, 0xc8, 0x50, 0x95, 0x0f, 0x0f,
+ 0xdf, 0xa7, 0xb6, 0x48, 0x67, 0xbd, 0x4d, 0x0d, 0xc6, 0x00, 0x2f, 0x99, 0x1d, 0xfa, 0xed, 0x51,
+ 0xb9, 0x98, 0x64, 0xb6, 0xe9, 0xb7, 0x47, 0xa8, 0x30, 0xd5, 0x9f, 0x64, 0x20, 0xaf, 0xc2, 0x65,
+ 0xd2, 0x87, 0x05, 0xdb, 0xf7, 0x04, 0xfd, 0x40, 0x98, 0x93, 0x60, 0x86, 0x34, 0x49, 0x71, 0xdc,
+ 0xd2, 0xdc, 0x36, 0x17, 0xe5, 0xd4, 0xcc, 0x03, 0x06, 0x32, 0x64, 0xfa, 0xd8, 0xb6, 0x84, 0xa5,
+ 0x5e, 0x65, 0x49, 0xa7, 0x52, 0x72, 0x7b, 0xa1, 0x82, 0xbe, 0x5e, 0xf8, 0xab, 0xbf, 0xae, 0x5c,
+ 0xfa, 0xde, 0xbf, 0xde, 0xb8, 0x54, 0xfd, 0x55, 0x16, 0x4a, 0x71, 0x76, 0x64, 0x0d, 0xb2, 0x4e,
+ 0xdb, 0xec, 0x3b, 0x30, 0x2b, 0xca, 0xde, 0xd9, 0xc6, 0xac, 0xd3, 0x56, 0x87, 0x82, 0x4e, 0x32,
+ 0xb2, 0xc9, 0x5a, 0x4b, 0x2a, 0x0b, 0xff, 0x1a, 0x2c, 0x4a, 0x27, 0x78, 0x4c, 0x19, 0x97, 0x79,
+ 0xb8, 0x0e, 0xa0, 0xae, 0x18, 0xe2, 0x45, 0xe9, 0x20, 0xde, 0xd6, 0x28, 0x8c, 0xd3, 0x49, 0x75,
+ 0xaa, 0x2d, 0x9d, 0x7a, 0xef, 0xb1, 0x6d, 0x5c, 0x87, 0x15, 0x39, 0x7f, 0xb5, 0x48, 0x4f, 0x28,
+ 0x62, 0xbd, 0xd5, 0xbe, 0x60, 0x88, 0x57, 0xe4, 0x22, 0xb7, 0x34, 0x5a, 0x8d, 0x4b, 0xd3, 0xc7,
+ 0x5f, 0xef, 0xfc, 0x13, 0x5e, 0x6f, 0x03, 0x72, 0xf2, 0x8c, 0x37, 0x19, 0xd5, 0x57, 0x62, 0xc6,
+ 0x1d, 0x16, 0xe6, 0xa2, 0x77, 0xd4, 0xa7, 0xc2, 0x92, 0xe6, 0xae, 0x0e, 0xe5, 0x68, 0xee, 0xf2,
+ 0x58, 0x56, 0x5c, 0x62, 0x3a, 0xff, 0x28, 0x07, 0x2b, 0x4a, 0xe7, 0xdb, 0x74, 0x40, 0xbd, 0x36,
+ 0xf5, 0xec, 0x91, 0x5c, 0xbb, 0x17, 0x15, 0xe8, 0xc2, 0xf1, 0x2a, 0x50, 0x54, 0x18, 0xb9, 0x76,
+ 0x65, 0x17, 0x5a, 0xd7, 0xb1, 0x50, 0x36, 0x5c, 0xfb, 0x4e, 0x12, 0x8d, 0x69, 0x7a, 0x19, 0x05,
+ 0x28, 0xd0, 0xa4, 0xb0, 0x76, 0x27, 0x40, 0x60, 0x44, 0x43, 0x8e, 0x61, 0xa1, 0xa3, 0x1c, 0x32,
+ 0x37, 0x19, 0xd1, 0xde, 0x8c, 0x46, 0x1b, 0xad, 0x58, 0x3b, 0x7a, 0x6d, 0xbd, 0xfa, 0x37, 0xc7,
+ 0x40, 0x18, 0xf9, 0x7e, 0x06, 0x8a, 0x82, 0x59, 0x1e, 0xef, 0xf8, 0xac, 0x6f, 0xe2, 0xe1, 0xd6,
+ 0x33, 0x13, 0xdd, 0x0a, 0x38, 0x53, 0x93, 0xb5, 0x87, 0x00, 0x8c, 0xa4, 0x12, 0x07, 0xae, 0x99,
+ 0xe9, 0x34, 0xfc, 0xae, 0x63, 0x5b, 0xae, 0x2e, 0x13, 0xf9, 0xcc, 0xd8, 0xcd, 0xab, 0x46, 0x73,
+ 0xd7, 0x76, 0x27, 0x52, 0x3d, 0x3e, 0xa9, 0xac, 0xa4, 0x40, 0x78, 0x06, 0xc3, 0xea, 0xdf, 0xe5,
+ 0xe1, 0xea, 0x44, 0xf5, 0x90, 0x43, 0x63, 0x82, 0xda, 0x65, 0x6c, 0xcf, 0x70, 0x1e, 0x38, 0x7d,
+ 0x6a, 0x54, 0x5e, 0x48, 0x1a, 0x66, 0xdc, 0x33, 0x65, 0x2f, 0xc0, 0x33, 0x75, 0x8c, 0x67, 0xd2,
+ 0x25, 0xb5, 0x19, 0x96, 0x14, 0x85, 0x0b, 0xd1, 0x7e, 0x89, 0x7c, 0x1c, 0x71, 0x20, 0x4f, 0x3f,
+ 0x18, 0x30, 0x5d, 0x41, 0x9b, 0x49, 0xd0, 0xce, 0x07, 0x03, 0x66, 0x04, 0x2d, 0x19, 0x41, 0x79,
+ 0x09, 0xe3, 0xa8, 0x25, 0x90, 0xf7, 0xe0, 0x8a, 0x14, 0x99, 0xb6, 0x13, 0xed, 0x9a, 0x6a, 0x66,
+ 0xc8, 0x95, 0xed, 0x71, 0x92, 0x49, 0x46, 0x32, 0x89, 0x95, 0x94, 0x20, 0x45, 0x4d, 0xb6, 0xc4,
+ 0x50, 0xc2, 0xce, 0x38, 0xc9, 0x44, 0x09, 0x13, 0x58, 0x29, 0xdf, 0xae, 0x92, 0x51, 0x73, 0x34,
+ 0x46, 0xbe, 0x5d, 0x41, 0xd1, 0x60, 0xab, 0xef, 0xc1, 0xda, 0xd9, 0xdb, 0x49, 0x9e, 0x1e, 0xef,
+ 0x3f, 0x4c, 0x9f, 0x1e, 0x77, 0xdf, 0xc2, 0xec, 0xfb, 0x0f, 0x63, 0x12, 0xb2, 0x9f, 0x2a, 0xe1,
+ 0x27, 0x19, 0x80, 0x48, 0xe5, 0xd2, 0x33, 0xca, 0xf9, 0xa6, 0x3d, 0xa3, 0xa4, 0x40, 0x85, 0x21,
+ 0x1e, 0xcc, 0x77, 0x1c, 0xea, 0xb6, 0x79, 0x39, 0xab, 0x5e, 0xf5, 0x0c, 0xf6, 0x6b, 0x02, 0xda,
+ 0x5d, 0xc9, 0x2e, 0x9a, 0xa0, 0x7a, 0xe4, 0x68, 0xa4, 0x54, 0x5f, 0x81, 0x52, 0xbc, 0x50, 0xf9,
+ 0xe4, 0x60, 0xb5, 0xfa, 0x67, 0x79, 0x58, 0x8c, 0x55, 0xef, 0xc8, 0x8b, 0xba, 0x94, 0xa9, 0x07,
+ 0x2c, 0x9a, 0x01, 0x51, 0x1d, 0xf2, 0x5b, 0xb0, 0x6c, 0xbb, 0xbe, 0x47, 0xb7, 0x1d, 0xa6, 0x22,
+ 0xa6, 0x91, 0xd1, 0xd8, 0x35, 0x43, 0xb9, 0xbc, 0x95, 0xc0, 0x62, 0x8a, 0x9a, 0xd8, 0x90, 0xb7,
+ 0x19, 0x6d, 0x73, 0x13, 0x96, 0x6d, 0xce, 0x54, 0x72, 0xdc, 0x92, 0x9c, 0x74, 0xc4, 0xac, 0x7e,
+ 0xa2, 0xe6, 0xad, 0x42, 0x40, 0xde, 0x53, 0x71, 0x9d, 0xca, 0xfd, 0x72, 0xd3, 0x87, 0x80, 0xcd,
+ 0xdb, 0xe1, 0x70, 0x4c, 0x30, 0x93, 0xd1, 0x68, 0xc7, 0x71, 0xa9, 0x54, 0x61, 0x3a, 0x98, 0xde,
+ 0x35, 0x70, 0x0c, 0x29, 0xa4, 0x65, 0x1d, 0x32, 0xcb, 0xb3, 0x7b, 0x66, 0x43, 0x84, 0x2f, 0x6e,
+ 0x53, 0x41, 0xd1, 0x60, 0xa5, 0xda, 0x85, 0xd5, 0x35, 0x06, 0x1e, 0xaa, 0xbd, 0x65, 0x75, 0x51,
+ 0xc2, 0x25, 0x9a, 0xd1, 0x8e, 0x89, 0xfa, 0x42, 0x34, 0xd2, 0x0e, 0x4a, 0x38, 0xe9, 0xc3, 0x3c,
+ 0xa3, 0x7d, 0x5f, 0x50, 0x15, 0xef, 0x2d, 0xde, 0xba, 0x33, 0x93, 0x5a, 0x51, 0xb1, 0x32, 0xf5,
+ 0x1a, 0xd0, 0x17, 0x56, 0x12, 0x82, 0x46, 0x08, 0x69, 0xc2, 0x55, 0xc7, 0xd3, 0x59, 0xf6, 0x9d,
+ 0xae, 0xe7, 0x33, 0x2a, 0xe3, 0xdf, 0x7b, 0x74, 0x54, 0x06, 0x95, 0x90, 0xbf, 0x68, 0xe6, 0x77,
+ 0xf5, 0xce, 0x24, 0x22, 0x9c, 0x3c, 0xb6, 0xfa, 0xf7, 0x19, 0x28, 0x04, 0xef, 0x94, 0xec, 0xc5,
+ 0x42, 0xfe, 0xa9, 0xea, 0x6e, 0xa5, 0x33, 0xb2, 0x82, 0x3d, 0x28, 0x0c, 0x82, 0x8c, 0x20, 0x3b,
+ 0x35, 0xc3, 0x30, 0x1b, 0x08, 0x99, 0x54, 0xdf, 0x82, 0x95, 0x94, 0xaa, 0xce, 0x11, 0x28, 0xbd,
+ 0x00, 0xb9, 0x21, 0x73, 0xb5, 0x33, 0x30, 0x37, 0x27, 0x07, 0xd8, 0x68, 0xa2, 0x82, 0x56, 0xff,
+ 0x63, 0x1e, 0x16, 0x6f, 0xb7, 0x5a, 0xfb, 0x41, 0xde, 0xf5, 0x84, 0xad, 0x18, 0xcb, 0xa3, 0xb3,
+ 0x17, 0x58, 0x3b, 0x33, 0x95, 0xc0, 0xb9, 0x67, 0x5c, 0x09, 0x7c, 0x09, 0xe6, 0xfb, 0x54, 0xf4,
+ 0xfc, 0x76, 0xfa, 0xb2, 0xf4, 0xbe, 0x82, 0xa2, 0xc1, 0xa6, 0x92, 0xd1, 0xfc, 0x85, 0x27, 0xa3,
+ 0x5f, 0x86, 0x05, 0x19, 0x9a, 0xf8, 0x43, 0x1d, 0xa4, 0xcf, 0x45, 0x9a, 0x6a, 0x69, 0x30, 0x06,
+ 0x78, 0xd2, 0x85, 0xe2, 0xa1, 0xc5, 0x1d, 0xbb, 0x3e, 0x14, 0x3d, 0x13, 0xa9, 0x4f, 0xaf, 0xaf,
+ 0xcd, 0x80, 0x83, 0x8e, 0x07, 0xc3, 0x47, 0x8c, 0x78, 0x93, 0xef, 0xc2, 0x42, 0x8f, 0x5a, 0x6d,
+ 0xa9, 0x90, 0x82, 0x52, 0x08, 0x3e, 0xbd, 0x42, 0x62, 0x06, 0x58, 0xbb, 0xad, 0x99, 0xea, 0x52,
+ 0x52, 0x74, 0x2d, 0xa2, 0xa1, 0x18, 0xc8, 0x24, 0xc7, 0xb0, 0xa4, 0x37, 0xb4, 0xc1, 0x94, 0x8b,
+ 0x6a, 0x12, 0xdf, 0x9c, 0xfe, 0x9e, 0x2f, 0xc6, 0x65, 0xf3, 0xf2, 0xe9, 0x49, 0x65, 0x29, 0x0e,
+ 0xe1, 0x98, 0x14, 0xb3, 0xf6, 0x3a, 0x94, 0xe2, 0x33, 0x9c, 0xaa, 0xa8, 0xf3, 0xa7, 0x73, 0x70,
+ 0xf9, 0xde, 0x46, 0x33, 0xb8, 0x4b, 0xda, 0xf7, 0x5d, 0xc7, 0x1e, 0x91, 0x3f, 0x86, 0x79, 0xd7,
+ 0x3a, 0xa4, 0x6e, 0x50, 0xe5, 0x78, 0xe7, 0xe9, 0xf5, 0x38, 0xc6, 0xbc, 0xd6, 0x50, 0x9c, 0xb5,
+ 0x32, 0x43, 0xeb, 0xd6, 0x40, 0x34, 0x62, 0xc9, 0xbb, 0xb0, 0x70, 0x68, 0xd9, 0x47, 0x7e, 0xa7,
+ 0x63, 0xbc, 0xd4, 0xc6, 0x53, 0x18, 0x8c, 0x1a, 0xaf, 0x43, 0x5c, 0xf3, 0x80, 0x01, 0x57, 0xe9,
+ 0xba, 0x29, 0x63, 0x3e, 0xdb, 0xf3, 0x0c, 0xca, 0x58, 0xad, 0xda, 0xcf, 0x31, 0xd7, 0xbd, 0x33,
+ 0x89, 0x08, 0x27, 0x8f, 0x5d, 0xfb, 0x06, 0x2c, 0xc6, 0x16, 0x37, 0xd5, 0x7b, 0xf8, 0xe9, 0x02,
+ 0x94, 0xee, 0x59, 0x9d, 0x23, 0xeb, 0x9c, 0x4e, 0xef, 0x4b, 0x90, 0x57, 0x57, 0x1b, 0x26, 0xec,
+ 0x08, 0x83, 0x5e, 0x75, 0xf5, 0x81, 0x1a, 0x27, 0x93, 0xc9, 0x81, 0xc5, 0x84, 0xaa, 0x48, 0xab,
+ 0x85, 0xe5, 0xa3, 0x64, 0x72, 0x3f, 0x40, 0x60, 0x44, 0x93, 0x72, 0x2a, 0xb9, 0x0b, 0x77, 0x2a,
+ 0x1b, 0x50, 0x62, 0xf4, 0xe1, 0xd0, 0x51, 0xb7, 0x72, 0x47, 0xdc, 0x14, 0x8f, 0xc2, 0x5e, 0x18,
+ 0x8c, 0xe1, 0x30, 0x41, 0x29, 0xa3, 0x11, 0xdb, 0xef, 0x0f, 0x18, 0xe5, 0x5c, 0xf9, 0xa3, 0x42,
+ 0x14, 0x8d, 0x6c, 0x19, 0x38, 0x86, 0x14, 0x32, 0x7a, 0xeb, 0xb8, 0x43, 0xde, 0xdb, 0x95, 0x3c,
+ 0x64, 0x80, 0xac, 0xdc, 0x52, 0x3e, 0x8a, 0xde, 0x76, 0x13, 0x58, 0x4c, 0x51, 0x07, 0xbe, 0xbf,
+ 0xf0, 0xd9, 0xdd, 0x02, 0x15, 0x2f, 0xf0, 0x24, 0xfb, 0x26, 0xac, 0x84, 0x26, 0xe0, 0x78, 0xdd,
+ 0x20, 0x80, 0x29, 0xea, 0x5b, 0xd3, 0xfd, 0x24, 0x0a, 0xd3, 0xb4, 0xf2, 0x24, 0x08, 0xca, 0x48,
+ 0x8b, 0xc9, 0x72, 0x4d, 0x50, 0x42, 0x0a, 0xf0, 0xe4, 0xf7, 0x20, 0xc7, 0x2d, 0xee, 0x96, 0x4b,
+ 0x4f, 0xdb, 0x00, 0x51, 0x6f, 0x36, 0x8c, 0xe6, 0x54, 0xd0, 0x20, 0x9f, 0x51, 0xb1, 0x24, 0xdf,
+ 0xcf, 0xc0, 0xb2, 0x6e, 0xbb, 0x42, 0xda, 0x75, 0xb8, 0x60, 0xa3, 0xf2, 0xd2, 0xb4, 0xb7, 0xf9,
+ 0x81, 0x94, 0x04, 0x1b, 0x23, 0x4f, 0x75, 0xe3, 0x24, 0x31, 0x98, 0x12, 0x58, 0xdd, 0x03, 0x68,
+ 0xf8, 0xdd, 0x60, 0x07, 0xd7, 0x61, 0xc5, 0xf1, 0x04, 0x65, 0xc7, 0x96, 0xdb, 0xa4, 0xb6, 0xef,
+ 0xb5, 0xb9, 0xda, 0xcd, 0xb9, 0xa8, 0x1a, 0x74, 0x27, 0x89, 0xc6, 0x34, 0x7d, 0xf5, 0x6f, 0xe7,
+ 0x60, 0xf1, 0x41, 0xbd, 0xd5, 0x3c, 0xa7, 0x53, 0x88, 0x15, 0xce, 0xb2, 0x4f, 0x28, 0x9c, 0xc5,
+ 0x4c, 0x6d, 0xee, 0x73, 0xbb, 0x70, 0xbc, 0x78, 0x07, 0xf3, 0xd9, 0x5c, 0xdf, 0x56, 0x7f, 0x94,
+ 0x83, 0xd5, 0xbd, 0x01, 0xf5, 0xde, 0xe9, 0x39, 0xfc, 0x28, 0xd6, 0x72, 0xa1, 0x6a, 0xe4, 0x99,
+ 0x33, 0x6b, 0xe4, 0xb1, 0x9d, 0x93, 0x7d, 0xc2, 0xce, 0x59, 0x87, 0xa2, 0x8c, 0x9c, 0xf9, 0xc0,
+ 0xb2, 0xc7, 0xea, 0x82, 0x0f, 0x02, 0x04, 0x46, 0x34, 0xaa, 0x39, 0x70, 0x28, 0x7a, 0x2d, 0xff,
+ 0x88, 0x7a, 0xd3, 0x25, 0x7e, 0xba, 0x39, 0x30, 0x18, 0x8b, 0x11, 0x1b, 0x72, 0x0b, 0xc0, 0x8a,
+ 0x1a, 0x15, 0x75, 0xd2, 0x17, 0x6a, 0xbc, 0x1e, 0xb5, 0x29, 0xc6, 0xa8, 0x7e, 0x53, 0x6f, 0xb6,
+ 0x11, 0x4a, 0xf1, 0x42, 0xc5, 0x39, 0x6e, 0xcb, 0x82, 0xac, 0x29, 0x7b, 0x56, 0xd6, 0x54, 0xfd,
+ 0xdf, 0x22, 0x2c, 0xed, 0x0f, 0x5d, 0x6e, 0xb1, 0x67, 0x19, 0x24, 0x7c, 0xde, 0x5d, 0x74, 0x31,
+ 0x03, 0xc9, 0x5d, 0xa0, 0x81, 0x0c, 0xe0, 0x8a, 0x70, 0x79, 0x8b, 0x0d, 0xb9, 0xd8, 0xa2, 0x4c,
+ 0x70, 0x53, 0x22, 0xc9, 0x4f, 0xdd, 0xc3, 0xd4, 0x6a, 0x34, 0xd3, 0x5c, 0x70, 0x12, 0x6b, 0x72,
+ 0x08, 0x6b, 0xc2, 0xe5, 0x75, 0xd7, 0xf5, 0x1f, 0x05, 0x05, 0x81, 0xa8, 0x31, 0xc6, 0x04, 0x2d,
+ 0x55, 0x33, 0xdf, 0xb5, 0x56, 0xa3, 0x79, 0x06, 0x25, 0x7e, 0x0a, 0x17, 0x72, 0x5f, 0xad, 0xea,
+ 0x6d, 0xcb, 0x75, 0xda, 0x96, 0x50, 0x25, 0x05, 0x65, 0x53, 0x0b, 0x8a, 0xf9, 0x17, 0x83, 0x22,
+ 0x64, 0xab, 0xd1, 0x4c, 0x93, 0xe0, 0xa4, 0x71, 0x9f, 0x55, 0x9c, 0xd3, 0x86, 0x95, 0xd0, 0xa9,
+ 0x18, 0xbd, 0x17, 0xa7, 0xee, 0xe6, 0xaa, 0x27, 0x39, 0x60, 0x9a, 0x25, 0xf9, 0x2e, 0x5c, 0x8e,
+ 0xda, 0x8c, 0x4c, 0xa4, 0xae, 0x02, 0x9b, 0x59, 0xb2, 0x89, 0xab, 0xa7, 0x27, 0x95, 0xcb, 0x5b,
+ 0x69, 0xb6, 0x38, 0x2e, 0x89, 0xfc, 0x4d, 0x06, 0x56, 0xe5, 0x94, 0xea, 0xa2, 0x47, 0xbd, 0x0f,
+ 0x95, 0x49, 0xf2, 0xf2, 0xa2, 0xb2, 0xf0, 0xef, 0xcc, 0x50, 0xfd, 0x8c, 0xef, 0xff, 0x5a, 0x3d,
+ 0xc5, 0x5f, 0x27, 0x55, 0x61, 0x3f, 0x53, 0x1a, 0x8d, 0x63, 0x13, 0x22, 0xdd, 0xf8, 0x24, 0xcd,
+ 0xbb, 0x28, 0x4d, 0xdd, 0xe0, 0x55, 0x4f, 0xb1, 0xc0, 0x31, 0xa6, 0x6b, 0x5b, 0x70, 0x75, 0xe2,
+ 0x6c, 0xa7, 0xca, 0x92, 0xfe, 0x24, 0x03, 0x45, 0xb4, 0x04, 0x6d, 0x38, 0x7d, 0x47, 0x90, 0x5b,
+ 0x90, 0x1b, 0x7a, 0x4e, 0x70, 0xc0, 0x5e, 0x0f, 0x3c, 0xe6, 0x81, 0xe7, 0x88, 0xc7, 0x27, 0x95,
+ 0xe5, 0x90, 0x90, 0x4a, 0x08, 0x2a, 0x5a, 0x19, 0x94, 0xa9, 0x28, 0x9e, 0x0b, 0xbe, 0x4f, 0x99,
+ 0x44, 0x28, 0x29, 0xf9, 0x28, 0x28, 0xc3, 0x24, 0x1a, 0xd3, 0xf4, 0xd5, 0x9f, 0x66, 0x61, 0xbe,
+ 0xa9, 0x5e, 0x0b, 0x79, 0x0f, 0x0a, 0x7d, 0x2a, 0x2c, 0x75, 0x59, 0xa2, 0xcb, 0x73, 0xaf, 0x9c,
+ 0xef, 0x0a, 0x72, 0x4f, 0x45, 0x61, 0xf7, 0xa9, 0xb0, 0x22, 0xff, 0x18, 0xc1, 0x30, 0xe4, 0x4a,
+ 0x3a, 0xa6, 0x33, 0x26, 0x3b, 0xeb, 0xed, 0x92, 0x9e, 0x71, 0x73, 0x40, 0xed, 0x89, 0xcd, 0x30,
+ 0x1e, 0xcc, 0x73, 0x61, 0x89, 0x21, 0x9f, 0xbd, 0x43, 0xd8, 0x48, 0x52, 0xdc, 0x62, 0x37, 0x08,
+ 0xea, 0x19, 0x8d, 0x94, 0xea, 0xbf, 0x64, 0x00, 0x34, 0x61, 0xc3, 0xe1, 0x82, 0xfc, 0xe1, 0x98,
+ 0x22, 0x6b, 0xe7, 0x53, 0xa4, 0x1c, 0xad, 0xd4, 0x18, 0xa6, 0x7b, 0x01, 0x24, 0xa6, 0x44, 0x0a,
+ 0x79, 0x47, 0xd0, 0x7e, 0x70, 0xf9, 0xf0, 0xc6, 0xac, 0x6b, 0x8b, 0x4e, 0xd2, 0x3b, 0x92, 0x2d,
+ 0x6a, 0xee, 0xd5, 0x8f, 0xe7, 0x83, 0x35, 0x49, 0xc5, 0x92, 0x1f, 0x64, 0xa0, 0xd4, 0x0e, 0xae,
+ 0x60, 0x1c, 0x1a, 0xd4, 0x52, 0xee, 0x3c, 0xb3, 0x4b, 0xd2, 0x28, 0x31, 0xde, 0x8e, 0x89, 0xc1,
+ 0x84, 0x50, 0xe2, 0x43, 0x41, 0x68, 0x6f, 0x11, 0x2c, 0xbf, 0x3e, 0xf3, 0xf9, 0x1a, 0x6b, 0x9b,
+ 0x31, 0xac, 0x31, 0x14, 0x42, 0xdc, 0x58, 0x93, 0xcd, 0xcc, 0x97, 0x1b, 0x41, 0x5b, 0x8e, 0x2e,
+ 0x3f, 0x8f, 0x37, 0xe9, 0x90, 0xbb, 0x40, 0x4c, 0x2d, 0x66, 0xd7, 0x72, 0x5c, 0xda, 0x46, 0x7f,
+ 0xe8, 0xe9, 0xd2, 0x69, 0x21, 0xea, 0x42, 0xdb, 0x19, 0xa3, 0xc0, 0x09, 0xa3, 0xc8, 0x06, 0x94,
+ 0xd4, 0x7c, 0x36, 0x87, 0x3c, 0x16, 0xe0, 0x86, 0x4a, 0xde, 0x89, 0xe1, 0x30, 0x41, 0x49, 0x6e,
+ 0x42, 0x81, 0xd1, 0x81, 0xeb, 0xd8, 0x96, 0xae, 0x3e, 0xe4, 0x83, 0x0e, 0x6d, 0x0d, 0xc3, 0x10,
+ 0x4b, 0x1a, 0xf0, 0x1c, 0xa3, 0xc7, 0x8e, 0x8c, 0xe9, 0x6f, 0x3b, 0x5c, 0xf8, 0x6c, 0xa4, 0x5c,
+ 0x94, 0xa9, 0x3f, 0x94, 0x4f, 0x4f, 0x2a, 0xcf, 0xe1, 0x04, 0x3c, 0x4e, 0x1c, 0x45, 0x7e, 0x9c,
+ 0x81, 0x25, 0xd7, 0xef, 0x76, 0x1d, 0xaf, 0xab, 0x2f, 0xc0, 0x4c, 0xdd, 0xf3, 0x9d, 0x67, 0xe1,
+ 0x27, 0x6a, 0x8d, 0x38, 0x67, 0x7d, 0xb4, 0x5c, 0x35, 0xca, 0x58, 0x4a, 0xe0, 0x30, 0x39, 0x89,
+ 0xb5, 0x37, 0x80, 0x8c, 0x8f, 0x9d, 0xca, 0xd1, 0xfb, 0x50, 0x8a, 0xbb, 0x11, 0xf2, 0x6e, 0xe8,
+ 0x9e, 0xb4, 0x77, 0xf8, 0xfa, 0xf4, 0x49, 0xfd, 0xa7, 0xfb, 0xa3, 0xef, 0xc0, 0x62, 0xd3, 0xb5,
+ 0xec, 0xa3, 0xa6, 0xdc, 0x39, 0x2c, 0xd1, 0x6a, 0x95, 0x79, 0x62, 0xab, 0xd5, 0x0d, 0xc8, 0x39,
+ 0x76, 0x98, 0xc4, 0x85, 0xee, 0xf5, 0x8e, 0xed, 0x7b, 0xa8, 0x30, 0xd5, 0x7f, 0xca, 0x18, 0xfe,
+ 0xad, 0x1e, 0xa3, 0x56, 0x9b, 0x34, 0xe1, 0x6a, 0x9f, 0x72, 0x6e, 0x75, 0x69, 0xbd, 0xdb, 0x65,
+ 0xb4, 0xab, 0xbe, 0x0e, 0xb9, 0x17, 0x68, 0x27, 0x2a, 0x3f, 0xde, 0x9f, 0x44, 0x84, 0x93, 0xc7,
+ 0x92, 0x77, 0xe1, 0xf9, 0x43, 0xe6, 0x5b, 0x6d, 0xdb, 0x92, 0x1e, 0x50, 0x51, 0xb4, 0xfc, 0xad,
+ 0x9e, 0xe5, 0x79, 0xd4, 0x35, 0x3d, 0xa2, 0xff, 0xcf, 0x30, 0x7e, 0x7e, 0xf3, 0x2c, 0x42, 0x3c,
+ 0x9b, 0x47, 0xf5, 0x7f, 0x72, 0x50, 0xd2, 0xab, 0xf8, 0x35, 0xe9, 0x88, 0x3b, 0x00, 0xe0, 0x6a,
+ 0x3e, 0x2a, 0xcb, 0xcd, 0x4e, 0xdd, 0xda, 0xda, 0x0c, 0x07, 0x63, 0x8c, 0x91, 0xcc, 0xcb, 0x6d,
+ 0xa3, 0xb6, 0xb9, 0x64, 0x5e, 0x1e, 0x28, 0x29, 0xc0, 0x4b, 0x52, 0xf3, 0x32, 0xcc, 0x7d, 0x4d,
+ 0x48, 0x6a, 0xb4, 0x87, 0x01, 0x9e, 0x7c, 0x0d, 0x16, 0x2d, 0x21, 0x2c, 0xbb, 0xd7, 0x97, 0x5a,
+ 0x30, 0xde, 0x25, 0x6c, 0xb9, 0xaa, 0x47, 0x28, 0x8c, 0xd3, 0xa9, 0x9b, 0x53, 0xd7, 0xb7, 0x8f,
+ 0xf8, 0xd8, 0xcd, 0xa9, 0x82, 0xa2, 0xc1, 0x92, 0x3e, 0xcc, 0x0b, 0x65, 0x5c, 0xe6, 0x8a, 0x65,
+ 0x86, 0xaf, 0x58, 0x62, 0x96, 0x1a, 0x89, 0xd3, 0xcf, 0x68, 0x84, 0x48, 0x71, 0x5c, 0xed, 0x15,
+ 0x93, 0x1d, 0xcc, 0x2a, 0x4e, 0x6f, 0xbc, 0x78, 0x13, 0xb3, 0x7c, 0x46, 0x23, 0xa4, 0xfa, 0x5f,
+ 0x73, 0x40, 0x9a, 0xc2, 0xf2, 0xda, 0x16, 0x6b, 0xdf, 0xdb, 0x68, 0x7e, 0x5e, 0x1f, 0xaf, 0x3d,
+ 0x18, 0xff, 0x78, 0xed, 0x95, 0x49, 0x1f, 0xaf, 0x7d, 0xf1, 0xde, 0xf0, 0x90, 0x32, 0x8f, 0x0a,
+ 0xca, 0x83, 0xdb, 0x8f, 0x5f, 0xcb, 0x4f, 0xd8, 0x3a, 0xb0, 0x34, 0xb0, 0x84, 0xdd, 0x6b, 0x0a,
+ 0x66, 0x09, 0xda, 0x1d, 0x19, 0x23, 0x7e, 0x23, 0x70, 0xf3, 0xfb, 0x71, 0xe4, 0xe3, 0x93, 0xca,
+ 0x6f, 0x9d, 0xf5, 0xe5, 0xab, 0x18, 0x0d, 0x28, 0xaf, 0x29, 0x72, 0xd5, 0xd4, 0x97, 0x64, 0x4b,
+ 0x6e, 0x01, 0xb8, 0xce, 0x31, 0xd5, 0x21, 0xae, 0x32, 0xfd, 0x42, 0x34, 0xb7, 0x46, 0x88, 0xc1,
+ 0x18, 0x55, 0x75, 0x1d, 0x4a, 0xda, 0x49, 0x9b, 0x4b, 0xa9, 0x0a, 0xe4, 0x2d, 0x99, 0xf6, 0x2a,
+ 0x3f, 0x93, 0xd7, 0xed, 0x0e, 0x2a, 0x0f, 0x46, 0x0d, 0xaf, 0xfe, 0xb0, 0x00, 0x61, 0x88, 0x40,
+ 0xec, 0xb1, 0x88, 0x72, 0xfa, 0xef, 0xad, 0xee, 0x1b, 0x06, 0xfa, 0x34, 0x0f, 0x9e, 0x62, 0x81,
+ 0xa5, 0xe9, 0x81, 0x77, 0x6c, 0x5a, 0xb7, 0x6d, 0x7f, 0x68, 0xda, 0xf6, 0xb2, 0xe3, 0x3d, 0xf0,
+ 0x49, 0x0a, 0x9c, 0x30, 0x8a, 0xdc, 0x55, 0x5f, 0xb6, 0x09, 0x4b, 0xea, 0xd4, 0x04, 0x4e, 0x2f,
+ 0x9e, 0xf1, 0x65, 0x9b, 0x26, 0x0a, 0x3f, 0x67, 0xd3, 0x8f, 0x18, 0x0d, 0x27, 0x3b, 0xb0, 0x70,
+ 0xec, 0xbb, 0xc3, 0x3e, 0x0d, 0x6a, 0xac, 0x6b, 0x93, 0x38, 0xbd, 0xad, 0x48, 0x62, 0x45, 0x47,
+ 0x3d, 0x04, 0x83, 0xb1, 0x84, 0xc2, 0x8a, 0xaa, 0x30, 0x38, 0x62, 0x64, 0x7a, 0xc4, 0x4c, 0x7d,
+ 0xe4, 0xa5, 0x49, 0xec, 0xf6, 0xfd, 0x76, 0x33, 0x49, 0x6d, 0x3e, 0xbb, 0x4a, 0x02, 0x31, 0xcd,
+ 0x93, 0x7c, 0x94, 0x81, 0x92, 0xe7, 0xb7, 0x69, 0xe0, 0x9b, 0x4d, 0xa1, 0xb0, 0x35, 0x7b, 0xd8,
+ 0x58, 0x7b, 0x10, 0x63, 0xab, 0x23, 0x98, 0x30, 0x9c, 0x8b, 0xa3, 0x30, 0x21, 0x9f, 0x1c, 0xc0,
+ 0xa2, 0xf0, 0x5d, 0xb3, 0x47, 0x83, 0xea, 0xe1, 0xf5, 0x49, 0x6b, 0x6e, 0x85, 0x64, 0x91, 0x27,
+ 0x8f, 0x60, 0x1c, 0xe3, 0x7c, 0x88, 0x07, 0xab, 0x4e, 0xdf, 0xea, 0xd2, 0xfd, 0xa1, 0xeb, 0xea,
+ 0x03, 0x29, 0x88, 0xd7, 0x26, 0x7e, 0xc2, 0x28, 0x1d, 0x91, 0x6b, 0xf6, 0x05, 0xed, 0x50, 0x46,
+ 0x3d, 0x9b, 0x46, 0xb9, 0xfd, 0x9d, 0x14, 0x27, 0x1c, 0xe3, 0x4d, 0xde, 0x84, 0xcb, 0x03, 0xe6,
+ 0xf8, 0x4a, 0xd5, 0xae, 0xc5, 0x75, 0x50, 0xab, 0x1b, 0xa1, 0x9f, 0x37, 0x6c, 0x2e, 0xef, 0xa7,
+ 0x09, 0x70, 0x7c, 0x8c, 0x0c, 0x6f, 0x03, 0xa0, 0x2a, 0xa0, 0x98, 0xf0, 0x36, 0x18, 0x8b, 0x21,
+ 0x96, 0xec, 0x42, 0xc1, 0xea, 0x74, 0x1c, 0x4f, 0x52, 0x2e, 0x2a, 0x53, 0x79, 0x61, 0xd2, 0xd2,
+ 0xea, 0x86, 0x46, 0xf3, 0x09, 0x9e, 0x30, 0x1c, 0xbb, 0xf6, 0x6d, 0xb8, 0x3c, 0xf6, 0xea, 0xa6,
+ 0x0a, 0x20, 0x9b, 0x00, 0x51, 0x3f, 0x25, 0xf9, 0x12, 0xe4, 0xb9, 0xb0, 0x58, 0x50, 0x2a, 0x08,
+ 0xd3, 0xb7, 0xa6, 0x04, 0xa2, 0xc6, 0xc9, 0x28, 0x8e, 0x0b, 0x7f, 0x90, 0x8e, 0xe2, 0x9a, 0xc2,
+ 0x1f, 0xa0, 0xc2, 0x54, 0xff, 0x3c, 0x0f, 0x0b, 0xc1, 0xc9, 0xc3, 0x63, 0x69, 0x4e, 0x66, 0xd6,
+ 0x66, 0x23, 0xc3, 0xf4, 0x89, 0xd9, 0x4e, 0xf2, 0xb8, 0xc8, 0x5e, 0xf8, 0x71, 0x71, 0x04, 0xf3,
+ 0x03, 0xe5, 0x8c, 0x8d, 0x83, 0x7a, 0x73, 0x76, 0xd9, 0x8a, 0x9d, 0x3e, 0x6b, 0xf5, 0x6f, 0x34,
+ 0x22, 0xc8, 0x43, 0x58, 0x62, 0x54, 0xb0, 0x51, 0xe2, 0x6c, 0x9a, 0xa5, 0x76, 0xa7, 0x3a, 0x29,
+ 0x30, 0xce, 0x12, 0x93, 0x12, 0xc8, 0x00, 0x8a, 0x2c, 0xa8, 0x1a, 0x19, 0x57, 0xb7, 0xf5, 0xf4,
+ 0x4b, 0x0c, 0x0b, 0x50, 0xda, 0x53, 0x87, 0x8f, 0x18, 0x09, 0xd1, 0x41, 0x61, 0x83, 0x5a, 0x5c,
+ 0xec, 0x79, 0x36, 0x35, 0x55, 0xe0, 0x58, 0x50, 0x18, 0xa2, 0x30, 0x4e, 0x57, 0xfd, 0xcf, 0x0c,
+ 0xac, 0xa6, 0xdf, 0x1e, 0x39, 0x82, 0x39, 0xce, 0x6c, 0x63, 0x8d, 0xfb, 0xcf, 0xce, 0x2c, 0x74,
+ 0x0c, 0xa4, 0x6b, 0xb8, 0x4d, 0x66, 0xa3, 0x94, 0x22, 0x77, 0x4b, 0x9b, 0x72, 0x91, 0xde, 0x2d,
+ 0xdb, 0x94, 0x0b, 0x54, 0x18, 0xd2, 0x88, 0xc7, 0x4a, 0x73, 0x89, 0x36, 0xd8, 0x44, 0xac, 0xf4,
+ 0x7c, 0x5a, 0xde, 0xa4, 0x48, 0xa9, 0xfa, 0xc3, 0x39, 0xb8, 0x36, 0x79, 0x62, 0xe4, 0x5b, 0xb0,
+ 0x1c, 0x96, 0x3c, 0x46, 0xb1, 0xff, 0xd0, 0x08, 0x6f, 0xf3, 0xb7, 0x13, 0x58, 0x4c, 0x51, 0xcb,
+ 0xe0, 0xc4, 0x74, 0x3e, 0x07, 0x7f, 0xa4, 0x11, 0xbb, 0xd6, 0xda, 0x0a, 0x31, 0x18, 0xa3, 0x22,
+ 0x75, 0x58, 0x31, 0x4f, 0xad, 0x78, 0xb1, 0x23, 0xd6, 0xea, 0xbf, 0x95, 0x44, 0x63, 0x9a, 0x5e,
+ 0xa6, 0x0e, 0x32, 0x88, 0x08, 0xbe, 0x65, 0x8e, 0xa5, 0x0e, 0xdb, 0x1a, 0x8c, 0x01, 0x9e, 0x6c,
+ 0x40, 0x49, 0xfe, 0x6c, 0x25, 0x3f, 0x5e, 0x8a, 0xca, 0x3f, 0x31, 0x1c, 0x26, 0x28, 0xa3, 0xaf,
+ 0xaa, 0x74, 0xf2, 0x30, 0xfe, 0x55, 0xd5, 0x2d, 0x80, 0x21, 0xa7, 0x68, 0x3d, 0x92, 0x4c, 0xcc,
+ 0x45, 0x41, 0xb8, 0xf8, 0x83, 0x10, 0x83, 0x31, 0xaa, 0xea, 0x2f, 0x32, 0xb0, 0x94, 0xd8, 0xbf,
+ 0xa4, 0x03, 0x73, 0x47, 0x1b, 0x41, 0x72, 0x7e, 0xef, 0x19, 0x76, 0x0b, 0x69, 0xab, 0xbb, 0xb7,
+ 0xc1, 0x51, 0x0a, 0x20, 0xef, 0x87, 0x75, 0x80, 0x99, 0xfb, 0xe0, 0xe3, 0xb1, 0xa5, 0x89, 0xf5,
+ 0x93, 0x25, 0x81, 0x7f, 0x5e, 0x86, 0x95, 0x94, 0x63, 0x3e, 0x47, 0x6b, 0xa3, 0x36, 0x26, 0xf3,
+ 0x15, 0xe8, 0x04, 0x63, 0x0a, 0xbe, 0x0f, 0x8d, 0x51, 0x91, 0xae, 0xd6, 0x9e, 0xf6, 0xa9, 0x8d,
+ 0x99, 0x96, 0x94, 0x4a, 0x90, 0x52, 0xea, 0xfb, 0x41, 0x06, 0x4a, 0x56, 0xec, 0x6f, 0x35, 0x8c,
+ 0x4b, 0xbd, 0x3f, 0x4b, 0xd6, 0x34, 0xf6, 0x8f, 0x22, 0xba, 0x73, 0x38, 0x8e, 0xc0, 0x84, 0x50,
+ 0x62, 0x43, 0xae, 0x27, 0x44, 0xf0, 0xf7, 0x0d, 0x3b, 0xcf, 0xa4, 0x47, 0x4f, 0xf7, 0x83, 0x48,
+ 0x00, 0x2a, 0xe6, 0xe4, 0x11, 0x14, 0xad, 0x47, 0x5c, 0xff, 0xd5, 0x8e, 0xf9, 0x5f, 0x87, 0x59,
+ 0x92, 0xc3, 0xd4, 0xbf, 0xf6, 0x98, 0x4b, 0xf2, 0x00, 0x8a, 0x91, 0x2c, 0xc2, 0x60, 0xde, 0x56,
+ 0x5f, 0xa1, 0x9a, 0x3c, 0xfc, 0xcd, 0x67, 0xf4, 0x35, 0xab, 0x3e, 0xbe, 0x12, 0x20, 0x34, 0x92,
+ 0x48, 0x17, 0xf2, 0x47, 0x56, 0xe7, 0xc8, 0x32, 0xb9, 0xf8, 0x0c, 0xbb, 0x22, 0xde, 0x83, 0xa6,
+ 0xbd, 0x85, 0x82, 0xa0, 0xe6, 0x2f, 0x5f, 0x9d, 0x67, 0x09, 0x6e, 0xae, 0xeb, 0x66, 0x78, 0x75,
+ 0xb1, 0xae, 0x16, 0xfd, 0xea, 0x24, 0x00, 0x15, 0x73, 0xb9, 0x1a, 0x55, 0x8c, 0x31, 0x97, 0x75,
+ 0xbb, 0xb3, 0x16, 0x32, 0xe2, 0xab, 0x51, 0x10, 0xd4, 0xfc, 0xa5, 0x8d, 0xf8, 0x41, 0xd7, 0x86,
+ 0x09, 0x57, 0x67, 0xb0, 0x91, 0x74, 0x03, 0x88, 0xb6, 0x91, 0x10, 0x8a, 0x91, 0x2c, 0xf2, 0x2e,
+ 0xcc, 0xb9, 0x7e, 0xd7, 0x5c, 0xb4, 0xcd, 0x70, 0xa9, 0x13, 0x75, 0x1b, 0xe9, 0x8d, 0xde, 0xf0,
+ 0xbb, 0x28, 0x39, 0x93, 0xbf, 0xc8, 0xc0, 0xb2, 0x95, 0xf8, 0x23, 0x10, 0xd3, 0x0d, 0x35, 0xc3,
+ 0xd7, 0x61, 0x13, 0xff, 0x58, 0x44, 0xf7, 0x45, 0x25, 0x51, 0x98, 0x12, 0xad, 0xc2, 0x46, 0x75,
+ 0x6f, 0x59, 0x5e, 0x9e, 0x75, 0x4b, 0x24, 0xee, 0x3f, 0x4d, 0xd8, 0xa8, 0x40, 0x68, 0x44, 0x90,
+ 0x1f, 0x67, 0xd4, 0xd1, 0x1c, 0xff, 0x0e, 0xbf, 0xbc, 0x32, 0xf3, 0x77, 0xe5, 0x93, 0xff, 0x3b,
+ 0x20, 0x71, 0xda, 0xc7, 0x09, 0x30, 0x3d, 0x05, 0xf2, 0xa3, 0x0c, 0xac, 0x58, 0xc9, 0x3f, 0xd9,
+ 0x28, 0xaf, 0xce, 0x1a, 0xa9, 0x4d, 0xfe, 0xd7, 0x0e, 0x73, 0x3f, 0x9e, 0xc4, 0x61, 0x5a, 0xba,
+ 0xdc, 0x66, 0xb4, 0x6f, 0x39, 0x6e, 0xf9, 0xf2, 0xcc, 0x9f, 0x94, 0xc5, 0xbe, 0x92, 0xd6, 0xdb,
+ 0x4c, 0x41, 0x50, 0xf3, 0xaf, 0xda, 0xb0, 0x18, 0xfb, 0x43, 0x9f, 0x73, 0xb4, 0xc2, 0xdc, 0x02,
+ 0x38, 0xa6, 0xcc, 0xe9, 0x8c, 0xb6, 0x28, 0x13, 0xa6, 0x72, 0x1d, 0x9e, 0xa1, 0x6f, 0x87, 0x18,
+ 0x8c, 0x51, 0x6d, 0xd6, 0x3e, 0xfe, 0xe4, 0xfa, 0xa5, 0x9f, 0x7d, 0x72, 0xfd, 0xd2, 0xcf, 0x3f,
+ 0xb9, 0x7e, 0xe9, 0x7b, 0xa7, 0xd7, 0x33, 0x1f, 0x9f, 0x5e, 0xcf, 0xfc, 0xec, 0xf4, 0x7a, 0xe6,
+ 0xe7, 0xa7, 0xd7, 0x33, 0xff, 0x76, 0x7a, 0x3d, 0xf3, 0x97, 0xbf, 0xb8, 0x7e, 0xe9, 0xf7, 0x0b,
+ 0xc1, 0x9c, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x9a, 0xb7, 0x97, 0x51, 0x43, 0x4f, 0x00, 0x00,
}
func (m *AWSLambdaTrigger) Marshal() (dAtA []byte, err error) {
@@ -2334,6 +2371,92 @@ func (m *DataFilter) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *EmailTrigger) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *EmailTrigger) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *EmailTrigger) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ i -= len(m.Body)
+ copy(dAtA[i:], m.Body)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Body)))
+ i--
+ dAtA[i] = 0x4a
+ i -= len(m.Subject)
+ copy(dAtA[i:], m.Subject)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Subject)))
+ i--
+ dAtA[i] = 0x42
+ i -= len(m.From)
+ copy(dAtA[i:], m.From)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.From)))
+ i--
+ dAtA[i] = 0x3a
+ if len(m.To) > 0 {
+ for iNdEx := len(m.To) - 1; iNdEx >= 0; iNdEx-- {
+ i -= len(m.To[iNdEx])
+ copy(dAtA[i:], m.To[iNdEx])
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.To[iNdEx])))
+ i--
+ dAtA[i] = 0x32
+ }
+ }
+ i = encodeVarintGenerated(dAtA, i, uint64(m.Port))
+ i--
+ dAtA[i] = 0x28
+ i -= len(m.Host)
+ copy(dAtA[i:], m.Host)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Host)))
+ i--
+ dAtA[i] = 0x22
+ if m.SMTPPassword != nil {
+ {
+ size, err := m.SMTPPassword.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
+ }
+ i -= len(m.Username)
+ copy(dAtA[i:], m.Username)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.Username)))
+ i--
+ dAtA[i] = 0x12
+ if len(m.Parameters) > 0 {
+ for iNdEx := len(m.Parameters) - 1; iNdEx >= 0; iNdEx-- {
+ {
+ size, err := m.Parameters[iNdEx].MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ }
+ }
+ return len(dAtA) - i, nil
+}
+
func (m *Event) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -4557,6 +4680,20 @@ func (m *TriggerTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ if m.Email != nil {
+ {
+ size, err := m.Email.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1
+ i--
+ dAtA[i] = 0x8a
+ }
if m.AzureServiceBus != nil {
{
size, err := m.AzureServiceBus.MarshalToSizedBuffer(dAtA[:i])
@@ -5047,6 +5184,42 @@ func (m *DataFilter) Size() (n int) {
return n
}
+func (m *EmailTrigger) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ if len(m.Parameters) > 0 {
+ for _, e := range m.Parameters {
+ l = e.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ l = len(m.Username)
+ n += 1 + l + sovGenerated(uint64(l))
+ if m.SMTPPassword != nil {
+ l = m.SMTPPassword.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ l = len(m.Host)
+ n += 1 + l + sovGenerated(uint64(l))
+ n += 1 + sovGenerated(uint64(m.Port))
+ if len(m.To) > 0 {
+ for _, s := range m.To {
+ l = len(s)
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ }
+ l = len(m.From)
+ n += 1 + l + sovGenerated(uint64(l))
+ l = len(m.Subject)
+ n += 1 + l + sovGenerated(uint64(l))
+ l = len(m.Body)
+ n += 1 + l + sovGenerated(uint64(l))
+ return n
+}
+
func (m *Event) Size() (n int) {
if m == nil {
return 0
@@ -5933,6 +6106,10 @@ func (m *TriggerTemplate) Size() (n int) {
l = m.AzureServiceBus.Size()
n += 2 + l + sovGenerated(uint64(l))
}
+ if m.Email != nil {
+ l = m.Email.Size()
+ n += 2 + l + sovGenerated(uint64(l))
+ }
return n
}
@@ -6137,6 +6314,29 @@ func (this *DataFilter) String() string {
}, "")
return s
}
+func (this *EmailTrigger) String() string {
+ if this == nil {
+ return "nil"
+ }
+ repeatedStringForParameters := "[]TriggerParameter{"
+ for _, f := range this.Parameters {
+ repeatedStringForParameters += strings.Replace(strings.Replace(f.String(), "TriggerParameter", "TriggerParameter", 1), `&`, ``, 1) + ","
+ }
+ repeatedStringForParameters += "}"
+ s := strings.Join([]string{`&EmailTrigger{`,
+ `Parameters:` + repeatedStringForParameters + `,`,
+ `Username:` + fmt.Sprintf("%v", this.Username) + `,`,
+ `SMTPPassword:` + strings.Replace(fmt.Sprintf("%v", this.SMTPPassword), "SecretKeySelector", "v1.SecretKeySelector", 1) + `,`,
+ `Host:` + fmt.Sprintf("%v", this.Host) + `,`,
+ `Port:` + fmt.Sprintf("%v", this.Port) + `,`,
+ `To:` + fmt.Sprintf("%v", this.To) + `,`,
+ `From:` + fmt.Sprintf("%v", this.From) + `,`,
+ `Subject:` + fmt.Sprintf("%v", this.Subject) + `,`,
+ `Body:` + fmt.Sprintf("%v", this.Body) + `,`,
+ `}`,
+ }, "")
+ return s
+}
func (this *EventDependency) String() string {
if this == nil {
return "nil"
@@ -6765,6 +6965,7 @@ func (this *TriggerTemplate) String() string {
`Pulsar:` + strings.Replace(this.Pulsar.String(), "PulsarTrigger", "PulsarTrigger", 1) + `,`,
`ConditionsReset:` + repeatedStringForConditionsReset + `,`,
`AzureServiceBus:` + strings.Replace(this.AzureServiceBus.String(), "AzureServiceBusTrigger", "AzureServiceBusTrigger", 1) + `,`,
+ `Email:` + strings.Replace(this.Email.String(), "EmailTrigger", "EmailTrigger", 1) + `,`,
`}`,
}, "")
return s
@@ -8905,7 +9106,7 @@ func (m *DataFilter) Unmarshal(dAtA []byte) error {
}
return nil
}
-func (m *Event) Unmarshal(dAtA []byte) error {
+func (m *EmailTrigger) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
for iNdEx < l {
@@ -8928,15 +9129,15 @@ func (m *Event) Unmarshal(dAtA []byte) error {
fieldNum := int32(wire >> 3)
wireType := int(wire & 0x7)
if wireType == 4 {
- return fmt.Errorf("proto: Event: wiretype end group for non-group")
+ return fmt.Errorf("proto: EmailTrigger: wiretype end group for non-group")
}
if fieldNum <= 0 {
- return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
+ return fmt.Errorf("proto: EmailTrigger: illegal tag %d (wire type %d)", fieldNum, wire)
}
switch fieldNum {
case 1:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Context", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Parameters", wireType)
}
var msglen int
for shift := uint(0); ; shift += 7 {
@@ -8963,18 +9164,16 @@ func (m *Event) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- if m.Context == nil {
- m.Context = &EventContext{}
- }
- if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ m.Parameters = append(m.Parameters, TriggerParameter{})
+ if err := m.Parameters[len(m.Parameters)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
return err
}
iNdEx = postIndex
case 2:
if wireType != 2 {
- return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType)
+ return fmt.Errorf("proto: wrong wireType = %d for field Username", wireType)
}
- var byteLen int
+ var stringLen uint64
for shift := uint(0); ; shift += 7 {
if shift >= 64 {
return ErrIntOverflowGenerated
@@ -8984,40 +9183,373 @@ func (m *Event) Unmarshal(dAtA []byte) error {
}
b := dAtA[iNdEx]
iNdEx++
- byteLen |= int(b&0x7F) << shift
+ stringLen |= uint64(b&0x7F) << shift
if b < 0x80 {
break
}
}
- if byteLen < 0 {
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
return ErrInvalidLengthGenerated
}
- postIndex := iNdEx + byteLen
+ postIndex := iNdEx + intStringLen
if postIndex < 0 {
return ErrInvalidLengthGenerated
}
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
- if m.Data == nil {
- m.Data = []byte{}
- }
+ m.Username = string(dAtA[iNdEx:postIndex])
iNdEx = postIndex
- default:
- iNdEx = preIndex
- skippy, err := skipGenerated(dAtA[iNdEx:])
- if err != nil {
- return err
- }
- if (skippy < 0) || (iNdEx+skippy) < 0 {
- return ErrInvalidLengthGenerated
- }
- if (iNdEx + skippy) > l {
- return io.ErrUnexpectedEOF
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field SMTPPassword", wireType)
}
- iNdEx += skippy
- }
+ 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.SMTPPassword == nil {
+ m.SMTPPassword = &v1.SecretKeySelector{}
+ }
+ if err := m.SMTPPassword.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Host", 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.Host = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 5:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Port", wireType)
+ }
+ m.Port = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ m.Port |= int32(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field To", 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.To = append(m.To, string(dAtA[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 7:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field From", 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.From = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 8:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Subject", 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.Subject = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 9:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Body", 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.Body = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipGenerated(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Event) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Event: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Event: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Context", 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.Context == nil {
+ m.Context = &EventContext{}
+ }
+ if err := m.Context.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Data", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ byteLen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Data = append(m.Data[:0], dAtA[iNdEx:postIndex]...)
+ if m.Data == nil {
+ m.Data = []byte{}
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipGenerated(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
}
if iNdEx > l {
@@ -16747,6 +17279,42 @@ func (m *TriggerTemplate) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 17:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Email", 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.Email == nil {
+ m.Email = &EmailTrigger{}
+ }
+ if err := m.Email.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/pkg/apis/sensor/v1alpha1/generated.proto b/pkg/apis/sensor/v1alpha1/generated.proto
index 57839a8adb..4fb1ec3d4e 100644
--- a/pkg/apis/sensor/v1alpha1/generated.proto
+++ b/pkg/apis/sensor/v1alpha1/generated.proto
@@ -232,6 +232,46 @@ message DataFilter {
optional string template = 5;
}
+// EmailTrigger refers to the specification of the email notification trigger.
+message EmailTrigger {
+ // Parameters is the list of key-value extracted from event's payload that are applied to
+ // the trigger resource.
+ // +optional
+ repeated TriggerParameter parameters = 1;
+
+ // Username refers to the username used to connect to the smtp server.
+ // +optional
+ optional string username = 2;
+
+ // SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server.
+ // +optional
+ optional k8s.io.api.core.v1.SecretKeySelector smtpPassword = 3;
+
+ // Host refers to the smtp host url to which email is send.
+ optional string host = 4;
+
+ // Port refers to the smtp server port to which email is send.
+ // Defaults to 0.
+ // +optional
+ optional int32 port = 5;
+
+ // To refers to the email addresses to which the emails are send.
+ // +optional
+ repeated string to = 6;
+
+ // From refers to the address from which the email is send from.
+ // +optional
+ optional string from = 7;
+
+ // Subject refers to the subject line for the email send.
+ // +optional
+ optional string subject = 8;
+
+ // Body refers to the body/content of the email send.
+ // +optional
+ optional string body = 9;
+}
+
// Event represents the cloudevent received from an event source.
// +protobuf.options.(gogoproto.goproto_stringer)=false
message Event {
@@ -1033,6 +1073,10 @@ message TriggerTemplate {
// AzureServiceBus refers to the trigger designed to place messages on Azure Service Bus
// +optional
optional AzureServiceBusTrigger azureServiceBus = 16;
+
+ // Email refers to the trigger designed to send an email notification
+ // +optional
+ optional EmailTrigger email = 17;
}
// URLArtifact contains information about an artifact at an http endpoint.
diff --git a/pkg/apis/sensor/v1alpha1/openapi_generated.go b/pkg/apis/sensor/v1alpha1/openapi_generated.go
index 3f65ff92a7..1b6b3318e1 100644
--- a/pkg/apis/sensor/v1alpha1/openapi_generated.go
+++ b/pkg/apis/sensor/v1alpha1/openapi_generated.go
@@ -39,6 +39,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConditionsResetCriteria": schema_pkg_apis_sensor_v1alpha1_ConditionsResetCriteria(ref),
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.CustomTrigger": schema_pkg_apis_sensor_v1alpha1_CustomTrigger(ref),
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.DataFilter": schema_pkg_apis_sensor_v1alpha1_DataFilter(ref),
+ "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EmailTrigger": schema_pkg_apis_sensor_v1alpha1_EmailTrigger(ref),
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.Event": schema_pkg_apis_sensor_v1alpha1_Event(ref),
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventContext": schema_pkg_apis_sensor_v1alpha1_EventContext(ref),
"github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EventDependency": schema_pkg_apis_sensor_v1alpha1_EventDependency(ref),
@@ -623,6 +624,98 @@ func schema_pkg_apis_sensor_v1alpha1_DataFilter(ref common.ReferenceCallback) co
}
}
+func schema_pkg_apis_sensor_v1alpha1_EmailTrigger(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Description: "EmailTrigger refers to the specification of the email notification trigger.",
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "parameters": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Parameters is the list of key-value extracted from event's payload that are applied to the trigger resource.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.TriggerParameter"),
+ },
+ },
+ },
+ },
+ },
+ "username": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Username refers to the username used to connect to the smtp server.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "smtpPassword": {
+ SchemaProps: spec.SchemaProps{
+ Description: "SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server.",
+ Ref: ref("k8s.io/api/core/v1.SecretKeySelector"),
+ },
+ },
+ "host": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Host refers to the smtp host url to which email is send.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "port": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Port refers to the smtp server port to which email is send. Defaults to 0.",
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ "to": {
+ SchemaProps: spec.SchemaProps{
+ Description: "To refers to the email addresses to which the emails are send.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "from": {
+ SchemaProps: spec.SchemaProps{
+ Description: "From refers to the address from which the email is send from.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "subject": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Subject refers to the subject line for the email send.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "body": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Body refers to the body/content of the email send.",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.TriggerParameter", "k8s.io/api/core/v1.SecretKeySelector"},
+ }
+}
+
func schema_pkg_apis_sensor_v1alpha1_Event(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
@@ -2599,12 +2692,18 @@ func schema_pkg_apis_sensor_v1alpha1_TriggerTemplate(ref common.ReferenceCallbac
Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AzureServiceBusTrigger"),
},
},
+ "email": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Email refers to the trigger designed to send an email notification",
+ Ref: ref("github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EmailTrigger"),
+ },
+ },
},
Required: []string{"name"},
},
},
Dependencies: []string{
- "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AWSLambdaTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ArgoWorkflowTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AzureEventHubsTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AzureServiceBusTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConditionsResetCriteria", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.CustomTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.HTTPTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.KafkaTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.LogTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.NATSTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.OpenWhiskTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.PulsarTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SlackTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.StandardK8STrigger"},
+ "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AWSLambdaTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ArgoWorkflowTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AzureEventHubsTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.AzureServiceBusTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.ConditionsResetCriteria", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.CustomTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.EmailTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.HTTPTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.KafkaTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.LogTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.NATSTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.OpenWhiskTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.PulsarTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.SlackTrigger", "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1.StandardK8STrigger"},
}
}
diff --git a/pkg/apis/sensor/v1alpha1/types.go b/pkg/apis/sensor/v1alpha1/types.go
index 2661746d03..fdfd9016b9 100644
--- a/pkg/apis/sensor/v1alpha1/types.go
+++ b/pkg/apis/sensor/v1alpha1/types.go
@@ -402,6 +402,9 @@ type TriggerTemplate struct {
// AzureServiceBus refers to the trigger designed to place messages on Azure Service Bus
// +optional
AzureServiceBus *AzureServiceBusTrigger `json:"azureServiceBus,omitempty" protobuf:"bytes,16,opt,name=azureServiceBus"`
+ // Email refers to the trigger designed to send an email notification
+ // +optional
+ Email *EmailTrigger `json:"email,omitempty" protobuf:"bytes,17,opt,name=email"`
}
type ConditionsResetCriteria struct {
@@ -688,6 +691,38 @@ type CustomTrigger struct {
Payload []TriggerParameter `json:"payload" protobuf:"bytes,7,rep,name=payload"`
}
+// EmailTrigger refers to the specification of the email notification trigger.
+type EmailTrigger struct {
+ // Parameters is the list of key-value extracted from event's payload that are applied to
+ // the trigger resource.
+ // +optional
+ Parameters []TriggerParameter `json:"parameters,omitempty" protobuf:"bytes,1,rep,name=parameters"`
+ // Username refers to the username used to connect to the smtp server.
+ // +optional
+ Username string `json:"username,omitempty" protobuf:"bytes,2,opt,name=username"`
+ // SMTPPassword refers to the Kubernetes secret that holds the smtp password used to connect to smtp server.
+ // +optional
+ SMTPPassword *corev1.SecretKeySelector `json:"smtpPassword,omitempty" protobuf:"bytes,3,opt,name=smtpPassword"`
+ // Host refers to the smtp host url to which email is send.
+ Host string `json:"host,omitempty" protobuf:"bytes,4,opt,name=host"`
+ // Port refers to the smtp server port to which email is send.
+ // Defaults to 0.
+ // +optional
+ Port int32 `json:"port,omitempty" protobuf:"varint,5,opt,name=port"`
+ // To refers to the email addresses to which the emails are send.
+ // +optional
+ To []string `json:"to,omitempty" protobuf:"bytes,6,rep,name=to"`
+ // From refers to the address from which the email is send from.
+ // +optional
+ From string `json:"from,omitempty" protobuf:"bytes,7,opt,name=from"`
+ // Subject refers to the subject line for the email send.
+ // +optional
+ Subject string `json:"subject,omitempty" protobuf:"bytes,8,opt,name=subject"`
+ // Body refers to the body/content of the email send.
+ // +optional
+ Body string `json:"body,omitempty" protobuf:"bytes,9,opt,name=body"`
+}
+
// SlackTrigger refers to the specification of the slack notification trigger.
type SlackTrigger struct {
// Parameters is the list of key-value extracted from event's payload that are applied to
diff --git a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go
index 3518c80580..2f76878edd 100644
--- a/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/sensor/v1alpha1/zz_generated.deepcopy.go
@@ -336,6 +336,39 @@ func (in *DataFilter) DeepCopy() *DataFilter {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *EmailTrigger) DeepCopyInto(out *EmailTrigger) {
+ *out = *in
+ if in.Parameters != nil {
+ in, out := &in.Parameters, &out.Parameters
+ *out = make([]TriggerParameter, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ if in.SMTPPassword != nil {
+ in, out := &in.SMTPPassword, &out.SMTPPassword
+ *out = new(v1.SecretKeySelector)
+ (*in).DeepCopyInto(*out)
+ }
+ if in.To != nil {
+ in, out := &in.To, &out.To
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EmailTrigger.
+func (in *EmailTrigger) DeepCopy() *EmailTrigger {
+ if in == nil {
+ return nil
+ }
+ out := new(EmailTrigger)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Event) DeepCopyInto(out *Event) {
*out = *in
@@ -1402,6 +1435,11 @@ func (in *TriggerTemplate) DeepCopyInto(out *TriggerTemplate) {
*out = new(AzureServiceBusTrigger)
(*in).DeepCopyInto(*out)
}
+ if in.Email != nil {
+ in, out := &in.Email, &out.Email
+ *out = new(EmailTrigger)
+ (*in).DeepCopyInto(*out)
+ }
return
}
diff --git a/sensors/trigger.go b/sensors/trigger.go
index 0d70e9b495..004d5d2c25 100644
--- a/sensors/trigger.go
+++ b/sensors/trigger.go
@@ -29,6 +29,7 @@ import (
eventhubs "github.com/argoproj/argo-events/sensors/triggers/azure-event-hubs"
servicebus "github.com/argoproj/argo-events/sensors/triggers/azure-service-bus"
customtrigger "github.com/argoproj/argo-events/sensors/triggers/custom-trigger"
+ "github.com/argoproj/argo-events/sensors/triggers/email"
"github.com/argoproj/argo-events/sensors/triggers/http"
"github.com/argoproj/argo-events/sensors/triggers/kafka"
logtrigger "github.com/argoproj/argo-events/sensors/triggers/log"
@@ -161,5 +162,13 @@ func (sensorCtx *SensorContext) GetTrigger(ctx context.Context, trigger *v1alpha
return result
}
+ if trigger.Template.Email != nil {
+ result, err := email.NewEmailTrigger(sensorCtx.sensor, trigger, log)
+ if err != nil {
+ log.Errorw("failed to new a Email trigger", zap.Error(err))
+ return nil
+ }
+ return result
+ }
return nil
}
diff --git a/sensors/triggers/email/email.go b/sensors/triggers/email/email.go
new file mode 100644
index 0000000000..21f6426788
--- /dev/null
+++ b/sensors/triggers/email/email.go
@@ -0,0 +1,165 @@
+/*
+Copyright 2020 BlackRock, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+package email
+
+import (
+ "context"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "regexp"
+
+ notifications "github.com/argoproj/notifications-engine/pkg/services"
+ "go.uber.org/zap"
+
+ "github.com/argoproj/argo-events/common"
+ "github.com/argoproj/argo-events/common/logging"
+ apicommon "github.com/argoproj/argo-events/pkg/apis/common"
+ "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
+ "github.com/argoproj/argo-events/sensors/triggers"
+)
+
+type EmailTrigger struct {
+ // Sensor refer to the sensor object
+ Sensor *v1alpha1.Sensor
+ // Trigger refers to the trigger resource
+ Trigger *v1alpha1.Trigger
+ // Logger to log stuff
+ Logger *zap.SugaredLogger
+ // emailSvc refers to the Email notification service.
+ emailSvc notifications.NotificationService
+}
+
+// NewEmailTrigger returns a new Email trigger context
+func NewEmailTrigger(sensor *v1alpha1.Sensor, trigger *v1alpha1.Trigger, logger *zap.SugaredLogger) (*EmailTrigger, error) {
+ emailTrigger := trigger.Template.Email
+ var smtpPassword string
+ if emailTrigger.SMTPPassword != nil {
+ var err error
+ smtpPassword, err = common.GetSecretFromVolume(emailTrigger.SMTPPassword)
+ if err != nil {
+ return nil, fmt.Errorf("failed to retrieve the smtp password, %w", err)
+ }
+ }
+ emailSvc := notifications.NewEmailService(
+ notifications.EmailOptions{
+ Host: emailTrigger.Host,
+ Port: int(emailTrigger.Port),
+ Username: emailTrigger.Username,
+ Password: smtpPassword,
+ From: emailTrigger.From,
+ },
+ )
+ return &EmailTrigger{
+ Sensor: sensor,
+ Trigger: trigger,
+ Logger: logger.With(logging.LabelTriggerType, apicommon.EmailTrigger),
+ emailSvc: emailSvc,
+ }, nil
+}
+
+// GetTriggerType returns the type of the trigger
+func (t *EmailTrigger) GetTriggerType() apicommon.TriggerType {
+ return apicommon.EmailTrigger
+}
+
+func (t *EmailTrigger) FetchResource(ctx context.Context) (interface{}, error) {
+ return t.Trigger.Template.Email, nil
+}
+
+func (t *EmailTrigger) ApplyResourceParameters(events map[string]*v1alpha1.Event, resource interface{}) (interface{}, error) {
+ resourceBytes, err := json.Marshal(resource)
+ if err != nil {
+ return nil, fmt.Errorf("failed to marshal the Email trigger resource, %w", err)
+ }
+ parameters := t.Trigger.Template.Email.Parameters
+
+ if parameters != nil {
+ updatedResourceBytes, err := triggers.ApplyParams(resourceBytes, t.Trigger.Template.Email.Parameters, events)
+ if err != nil {
+ return nil, err
+ }
+
+ var st *v1alpha1.EmailTrigger
+ if err := json.Unmarshal(updatedResourceBytes, &st); err != nil {
+ return nil, fmt.Errorf("failed to unmarshal the updated Email trigger resource after applying resource parameters, %w", err)
+ }
+
+ return st, nil
+ }
+
+ return resource, nil
+}
+
+// Execute executes the trigger
+func (t *EmailTrigger) Execute(ctx context.Context, events map[string]*v1alpha1.Event, resource interface{}) (interface{}, error) {
+ t.Logger.Info("executing EmailTrigger")
+ _, ok := resource.(*v1alpha1.EmailTrigger)
+ if !ok {
+ return nil, fmt.Errorf("failed to marshal the Email trigger resource")
+ }
+
+ emailTrigger := t.Trigger.Template.Email
+
+ if len(emailTrigger.To) == 0 {
+ return nil, fmt.Errorf("to can't be empty")
+ }
+ body := emailTrigger.Body
+ if body == "" {
+ return nil, fmt.Errorf("body can't be empty")
+ }
+ subject := emailTrigger.Subject
+ if subject == "" {
+ return nil, fmt.Errorf("subject can't be empty")
+ }
+ t.Logger.Infow("sending emails...", zap.Any("to", emailTrigger.To))
+ var errs error
+ validEmail := regexp.MustCompile(`^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$`)
+ for _, addr := range emailTrigger.To {
+ if !validEmail.MatchString(addr) {
+ t.Logger.Error("invalid emailId", zap.Any("to", addr))
+ errs = errors.Join(errs, fmt.Errorf("to emailId can't be invalid %v", addr))
+ continue
+ }
+ notification := notifications.Notification{
+ Message: emailTrigger.Body,
+ Email: ¬ifications.EmailNotification{
+ Subject: emailTrigger.Subject,
+ Body: emailTrigger.Body,
+ },
+ }
+ destination := notifications.Destination{
+ Service: "email",
+ Recipient: addr,
+ }
+ err := t.emailSvc.Send(notification, destination)
+ if err != nil {
+ t.Logger.Errorw("unable to send emails to emailId", zap.Any("to", addr), zap.Error(err))
+ errs = errors.Join(errs, fmt.Errorf("failed to send emails to emailId %v, %w", addr, err))
+ }
+ }
+ if errs != nil {
+ return nil, errs
+ }
+ t.Logger.Infow("message successfully sent to emailIds", zap.Any("message", emailTrigger.Body), zap.Any("to", emailTrigger.To))
+ t.Logger.Info("finished executing EmailTrigger")
+ return nil, nil
+}
+
+// No Policies for EmailTrigger
+func (t *EmailTrigger) ApplyPolicy(ctx context.Context, resource interface{}) error {
+ return nil
+}
diff --git a/sensors/triggers/email/email_test.go b/sensors/triggers/email/email_test.go
new file mode 100644
index 0000000000..a307b44938
--- /dev/null
+++ b/sensors/triggers/email/email_test.go
@@ -0,0 +1,201 @@
+/*
+Copyright 2020 BlackRock, Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+package email
+
+import (
+ "context"
+ "errors"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ corev1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+
+ "github.com/argoproj/argo-events/common/logging"
+ "github.com/argoproj/argo-events/pkg/apis/sensor/v1alpha1"
+ "github.com/argoproj/notifications-engine/pkg/services"
+)
+
+var sensorObj = &v1alpha1.Sensor{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "fake-sensor",
+ Namespace: "fake",
+ },
+ Spec: v1alpha1.SensorSpec{
+ Triggers: []v1alpha1.Trigger{
+ {
+ Template: &v1alpha1.TriggerTemplate{
+ Name: "fake-trigger",
+ Email: &v1alpha1.EmailTrigger{
+ SMTPPassword: &corev1.SecretKeySelector{
+ LocalObjectReference: corev1.LocalObjectReference{
+ Name: "secret",
+ },
+ Key: "password",
+ },
+ Host: "fake-host",
+ Port: 468,
+ Username: "fake-username",
+ To: []string{"fake1@email.com", "fake2@email.com"},
+ From: "fake-email",
+ Subject: "fake-subject",
+ Body: "fake-body",
+ },
+ },
+ },
+ },
+ },
+}
+
+func getEmailTrigger(n services.NotificationService) *EmailTrigger {
+ return &EmailTrigger{
+ Sensor: sensorObj.DeepCopy(),
+ Trigger: sensorObj.Spec.Triggers[0].DeepCopy(),
+ Logger: logging.NewArgoEventsLogger(),
+ emailSvc: n,
+ }
+}
+
+func TestEmailTrigger_FetchResource(t *testing.T) {
+ trigger := getEmailTrigger(nil)
+ resource, err := trigger.FetchResource(context.TODO())
+ assert.Nil(t, err)
+ assert.NotNil(t, resource)
+
+ ot, ok := resource.(*v1alpha1.EmailTrigger)
+ assert.Equal(t, true, ok)
+ assert.Equal(t, "fake-host", ot.Host)
+ assert.Equal(t, int32(468), ot.Port)
+ assert.Equal(t, "fake-username", ot.Username)
+ assert.Equal(t, []string{"fake1@email.com", "fake2@email.com"}, ot.To)
+ assert.Equal(t, "fake-email", ot.From)
+ assert.Equal(t, "fake-subject", ot.Subject)
+ assert.Equal(t, "fake-body", ot.Body)
+}
+
+func TestEmailTrigger_ApplyResourceParameters(t *testing.T) {
+ trigger := getEmailTrigger(nil)
+
+ testEvents := map[string]*v1alpha1.Event{
+ "fake-dependency": {
+ Context: &v1alpha1.EventContext{
+ ID: "1",
+ Type: "webhook",
+ Source: "webhook-gateway",
+ DataContentType: "application/json",
+ SpecVersion: "1.0",
+ Subject: "example-1",
+ },
+ Data: []byte(`{"to": "real@email.com", "name": "Luke"}`),
+ },
+ }
+
+ trigger.Trigger.Template.Email.Parameters = []v1alpha1.TriggerParameter{
+ {
+ Src: &v1alpha1.TriggerParameterSource{
+ DependencyName: "fake-dependency",
+ DataKey: "to",
+ },
+ Dest: "to.0",
+ },
+ {
+ Src: &v1alpha1.TriggerParameterSource{
+ DependencyName: "fake-dependency",
+ DataKey: "body",
+ DataTemplate: "Hi {{.Input.name}},\n\tHello There.\nThanks,\nObi",
+ },
+ Dest: "body",
+ },
+ }
+
+ resource, err := trigger.ApplyResourceParameters(testEvents, trigger.Trigger.Template.Email)
+ assert.Nil(t, err)
+ assert.NotNil(t, resource)
+
+ ot, ok := resource.(*v1alpha1.EmailTrigger)
+ assert.Equal(t, true, ok)
+ assert.Equal(t, "fake-host", ot.Host)
+ assert.Equal(t, int32(468), ot.Port)
+ assert.Equal(t, "fake-username", ot.Username)
+ assert.Equal(t, []string{"real@email.com", "fake2@email.com"}, ot.To)
+ assert.Equal(t, "fake-email", ot.From)
+ assert.Equal(t, "fake-subject", ot.Subject)
+ assert.Equal(t, "Hi Luke,\n\tHello There.\nThanks,\nObi", ot.Body)
+}
+
+// Mock Notification Service that returns an error on Send
+type MockNotificationServiceError struct{}
+
+// Mocks a send error
+func (m *MockNotificationServiceError) Send(n services.Notification, d services.Destination) error {
+ return errors.New("")
+}
+
+// Mock Notification Service that returns nil on Send
+type MockNotificationService struct{}
+
+// Mocks a successful send
+func (m *MockNotificationService) Send(n services.Notification, d services.Destination) error {
+ return nil
+}
+
+func TestEmailTrigger_Execute(t *testing.T) {
+ t.Run("Unmarshallable resource", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, nil)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Empty to scenario", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ trigger.Trigger.Template.Email.To = make([]string, 0)
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Invalid to scenario", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ trigger.Trigger.Template.Email.To = []string{"not@a@valid.email"}
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Empty subject scenario", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ trigger.Trigger.Template.Email.Subject = ""
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Empty body scenario", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ trigger.Trigger.Template.Email.Body = ""
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Error when sending email", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationServiceError{})
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.NotNil(t, err)
+ })
+
+ t.Run("Email send successfully", func(t *testing.T) {
+ trigger := getEmailTrigger(&MockNotificationService{})
+ _, err := trigger.Execute(context.TODO(), map[string]*v1alpha1.Event{}, trigger.Trigger.Template.Email)
+ assert.Nil(t, err)
+ })
+}