diff --git a/api/event-source.html b/api/event-source.html index de319fcbd2..d1956a18d8 100644 --- a/api/event-source.html +++ b/api/event-source.html @@ -2179,6 +2179,19 @@

EventSource

AzureQueueStorage event source

+ + +sftp
+ + +map[string]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource + + + + +

SFTP event sources

+ + @@ -2222,6 +2235,7 @@

EventSourceFilter PulsarEventSource, RedisEventSource, RedisStreamEventSource, +SFTPEventSource, SNSEventSource, SQSEventSource, SlackEventSource, @@ -2691,6 +2705,19 @@

EventSourceSpec

AzureQueueStorage event source

+ + +sftp
+ + +map[string]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource + + + + +

SFTP event sources

+ +

EventSourceStatus @@ -5087,6 +5114,128 @@

ResourceFilter +

SFTPEventSource +

+

+(Appears on: +EventSourceSpec) +

+

+

SFTPEventSource describes an event-source for sftp related events.

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldDescription
+eventType
+ +string + +
+

Type of file operations to watch +Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information

+
+watchPathConfig
+ + +WatchPathConfig + + +
+

WatchPathConfig contains configuration about the file path to watch

+
+username
+ + +Kubernetes core/v1.SecretKeySelector + + +
+

Username required for authentication if any.

+
+password
+ + +Kubernetes core/v1.SecretKeySelector + + +
+

Password required for authentication if any.

+
+address
+ + +Kubernetes core/v1.SecretKeySelector + + +
+

Address sftp address.

+
+metadata
+ +map[string]string + +
+(Optional) +

Metadata holds the user defined metadata which will passed along the event payload.

+
+filter
+ + +EventSourceFilter + + +
+(Optional) +

Filter

+
+pollIntervalDuration
+ +string + +
+(Optional) +

PollIntervalDuration the interval at which to poll the SFTP server +defaults to 10 seconds

+

SNSEventSource

@@ -6034,7 +6183,8 @@

WatchPathConfig

(Appears on: FileEventSource, -HDFSEventSource) +HDFSEventSource, +SFTPEventSource)

diff --git a/api/event-source.md b/api/event-source.md index 3a22eff490..0345e36d06 100644 --- a/api/event-source.md +++ b/api/event-source.md @@ -2258,6 +2258,19 @@ AzureQueueStorage event source

+ + +sftp
+ +map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource + + + +

+SFTP event sources +

+ + @@ -2299,6 +2312,7 @@ EventSourceFilter PulsarEventSource, RedisEventSource, RedisStreamEventSource, +SFTPEventSource, SNSEventSource, SQSEventSource, SlackEventSource, @@ -2772,6 +2786,19 @@ AzureQueueStorage event source

+ + +sftp
+ +map\[string\]github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource + + + +

+SFTP event sources +

+ +

@@ -5197,6 +5224,129 @@ treated as valid. +

+SFTPEventSource +

+

+(Appears on: +EventSourceSpec) +

+

+

+SFTPEventSource describes an event-source for sftp related events. +

+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+Field + +Description +
+eventType
string +
+

+Type of file operations to watch Refer +https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go +for more information +

+
+watchPathConfig
+ WatchPathConfig + +
+

+WatchPathConfig contains configuration about the file path to watch +

+
+username
+ +Kubernetes core/v1.SecretKeySelector +
+

+Username required for authentication if any. +

+
+password
+ +Kubernetes core/v1.SecretKeySelector +
+

+Password required for authentication if any. +

+
+address
+ +Kubernetes core/v1.SecretKeySelector +
+

+Address sftp address. +

+
+metadata
map\[string\]string +
+(Optional) +

+Metadata holds the user defined metadata which will passed along the +event payload. +

+
+filter
+ EventSourceFilter + +
+(Optional) +

+Filter +

+
+pollIntervalDuration
string +
+(Optional) +

+PollIntervalDuration the interval at which to poll the SFTP server +defaults to 10 seconds +

+

SNSEventSource

@@ -6165,7 +6315,8 @@ WatchPathConfig

(Appears on: FileEventSource, -HDFSEventSource) +HDFSEventSource, +SFTPEventSource)

diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index 5fe741174c..92159a984e 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -1602,6 +1602,13 @@ "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.Service", "description": "Service is the specifications of the service to expose the event source" }, + "sftp": { + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.SFTPEventSource" + }, + "description": "SFTP event sources", + "type": "object" + }, "slack": { "additionalProperties": { "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.SlackEventSource" @@ -2579,6 +2586,51 @@ }, "type": "object" }, + "io.argoproj.eventsource.v1alpha1.SFTPEventSource": { + "description": "SFTPEventSource describes an event-source for sftp related events.", + "properties": { + "address": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector", + "description": "Address sftp address." + }, + "eventType": { + "description": "Type of file operations to watch Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information", + "type": "string" + }, + "filter": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.EventSourceFilter", + "description": "Filter" + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "description": "Metadata holds the user defined metadata which will passed along the event payload.", + "type": "object" + }, + "password": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector", + "description": "Password required for authentication if any." + }, + "pollIntervalDuration": { + "description": "PollIntervalDuration the interval at which to poll the SFTP server defaults to 10 seconds", + "type": "string" + }, + "username": { + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector", + "description": "Username required for authentication if any." + }, + "watchPathConfig": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.WatchPathConfig", + "description": "WatchPathConfig contains configuration about the file path to watch" + } + }, + "required": [ + "eventType", + "watchPathConfig" + ], + "type": "object" + }, "io.argoproj.eventsource.v1alpha1.SNSEventSource": { "description": "SNSEventSource refers to event-source for AWS SNS related events", "properties": { diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 27f948163e..b3aab781e6 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -1586,6 +1586,13 @@ "description": "Service is the specifications of the service to expose the event source", "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.Service" }, + "sftp": { + "description": "SFTP event sources", + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.SFTPEventSource" + } + }, "slack": { "description": "Slack event sources", "type": "object", @@ -2562,6 +2569,51 @@ } } }, + "io.argoproj.eventsource.v1alpha1.SFTPEventSource": { + "description": "SFTPEventSource describes an event-source for sftp related events.", + "type": "object", + "required": [ + "eventType", + "watchPathConfig" + ], + "properties": { + "address": { + "description": "Address sftp address.", + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector" + }, + "eventType": { + "description": "Type of file operations to watch Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information", + "type": "string" + }, + "filter": { + "description": "Filter", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.EventSourceFilter" + }, + "metadata": { + "description": "Metadata holds the user defined metadata which will passed along the event payload.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "password": { + "description": "Password required for authentication if any.", + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector" + }, + "pollIntervalDuration": { + "description": "PollIntervalDuration the interval at which to poll the SFTP server defaults to 10 seconds", + "type": "string" + }, + "username": { + "description": "Username required for authentication if any.", + "$ref": "#/definitions/io.k8s.api.core.v1.SecretKeySelector" + }, + "watchPathConfig": { + "description": "WatchPathConfig contains configuration about the file path to watch", + "$ref": "#/definitions/io.argoproj.eventsource.v1alpha1.WatchPathConfig" + } + } + }, "io.argoproj.eventsource.v1alpha1.SNSEventSource": { "description": "SNSEventSource refers to event-source for AWS SNS related events", "type": "object", diff --git a/docs/eventsources/setup/sftp.md b/docs/eventsources/setup/sftp.md new file mode 100644 index 0000000000..bf211e6840 --- /dev/null +++ b/docs/eventsources/setup/sftp.md @@ -0,0 +1,53 @@ +# SFTP + +SFTP event-source polls an SFTP server to identify changes and helps sensor trigger workloads. + +## Event Structure + +The structure of an event dispatched by the event-source over the eventbus looks like following, + + { + "context": { + "type": "type_of_event_source", + "specversion": "cloud_events_version", + "source": "name_of_the_event_source", + "id": "unique_event_id", + "time": "event_time", + "datacontenttype": "type_of_data", + "subject": "name_of_the_configuration_within_event_source" + }, + "data": { + "name": "Relative path to the file or directory", + "op": "File operation that triggered the event" // Create, Remove + } + } + +## Specification + +SFTP event-source specification is available [here](https://github.com/argoproj/argo-events/blob/master/api/event-source.md#sftpeventsource). + +## Setup + +1. Create the event source by running the following command. + + kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/event-sources/sftp.yaml + +1. The event source has configuration to poll the sftp server every 10 seconds for `test-data` directory and file(s) called `x.txt`. + +1. Create the sensor by running the following command. + + kubectl apply -n argo-events -f https://raw.githubusercontent.com/argoproj/argo-events/stable/examples/sensors/sftp.yaml + +1. Log into the event-source pod by running following command. + + kubectl -n argo-events exec -it -c sftp-events -- /bin/bash + +1. Create a file called `x.txt` under `test-data` directory on the SFTP server. + +1. Once you create file `x.txt`, the sensor will trigger argo workflow. Run `argo list` to find the workflow. + +1. For real-world use cases, you should use PersistentVolumeClaim. + +## Troubleshoot + +Please read the [FAQ](https://argoproj.github.io/argo-events/FAQ/). diff --git a/eventsources/eventing.go b/eventsources/eventing.go index 5364c47c0e..06a8f5ce1b 100644 --- a/eventsources/eventing.go +++ b/eventsources/eventing.go @@ -46,6 +46,7 @@ import ( "github.com/argoproj/argo-events/eventsources/sources/redis" redisstream "github.com/argoproj/argo-events/eventsources/sources/redis_stream" "github.com/argoproj/argo-events/eventsources/sources/resource" + "github.com/argoproj/argo-events/eventsources/sources/sftp" "github.com/argoproj/argo-events/eventsources/sources/slack" "github.com/argoproj/argo-events/eventsources/sources/storagegrid" "github.com/argoproj/argo-events/eventsources/sources/stripe" @@ -166,6 +167,16 @@ func GetEventingServers(eventSource *v1alpha1.EventSource, metrics *eventsourcem } result[apicommon.FileEvent] = servers } + if len(eventSource.Spec.SFTP) != 0 { + servers := []EventingServer{} + for k, v := range eventSource.Spec.SFTP { + if v.Filter != nil { + filters[k] = v.Filter + } + servers = append(servers, &sftp.EventListener{EventSourceName: eventSource.Name, EventName: k, SFTPEventSource: v, Metrics: metrics}) + } + result[apicommon.SFTPEvent] = servers + } if len(eventSource.Spec.Github) != 0 { servers := []EventingServer{} for k, v := range eventSource.Spec.Github { diff --git a/eventsources/sources/sftp/start.go b/eventsources/sources/sftp/start.go new file mode 100644 index 0000000000..e0ac2aa642 --- /dev/null +++ b/eventsources/sources/sftp/start.go @@ -0,0 +1,282 @@ +/* +Copyright 2018 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 sftp + +import ( + "context" + "encoding/json" + "fmt" + "io/fs" + "regexp" + "strings" + "time" + + "github.com/fsnotify/fsnotify" + "github.com/pkg/sftp" + "go.uber.org/zap" + "golang.org/x/crypto/ssh" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/common/logging" + eventsourcecommon "github.com/argoproj/argo-events/eventsources/common" + "github.com/argoproj/argo-events/eventsources/common/fsevent" + "github.com/argoproj/argo-events/eventsources/sources" + metrics "github.com/argoproj/argo-events/metrics" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +// EventListener implements Eventing for sftp event source +type EventListener struct { + EventSourceName string + EventName string + SFTPEventSource v1alpha1.SFTPEventSource + Metrics *metrics.Metrics +} + +// GetEventSourceName returns name of event source +func (el *EventListener) GetEventSourceName() string { + return el.EventSourceName +} + +// GetEventName returns name of event +func (el *EventListener) GetEventName() string { + return el.EventName +} + +// GetEventSourceType return type of event server +func (el *EventListener) GetEventSourceType() apicommon.EventSourceType { + return apicommon.SFTPEvent +} + +// StartListening starts listening events +func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byte, ...eventsourcecommon.Option) error) error { + log := logging.FromContext(ctx). + With(logging.LabelEventSourceType, el.GetEventSourceType(), logging.LabelEventName, el.GetEventName()) + defer sources.Recover(el.GetEventName()) + + username, err := common.GetSecretFromVolume(el.SFTPEventSource.Username) + if err != nil { + return fmt.Errorf("username not found, %w", err) + } + password, err := common.GetSecretFromVolume(el.SFTPEventSource.Password) + if err != nil { + return fmt.Errorf("password not found, %w", err) + } + address, err := common.GetSecretFromVolume(el.SFTPEventSource.Address) + if err != nil { + return fmt.Errorf("address not found, %w", err) + } + + sftpConfig := &ssh.ClientConfig{ + User: username, + Auth: []ssh.AuthMethod{ssh.Password(password)}, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), // TODO: enable host key callback + } + + var sshClient *ssh.Client + err = common.DoWithRetry(nil, func() error { + var err error + sshClient, err = ssh.Dial("tcp", address, sftpConfig) + return err + }) + if err != nil { + return fmt.Errorf("dialing sftp address %s: %w", address, err) + } + + sftpClient, err := sftp.NewClient(sshClient) + if err != nil { + return fmt.Errorf("new sftp client: %w", err) + } + defer sftpClient.Close() + + if err := el.listenEvents(ctx, sftpClient, dispatch, log); err != nil { + log.Error("failed to listen to events", zap.Error(err)) + return err + } + return nil +} + +// listenEvents listen to sftp related events. +func (el *EventListener) listenEvents(ctx context.Context, sftpClient *sftp.Client, dispatch func([]byte, ...eventsourcecommon.Option) error, log *zap.SugaredLogger) error { + sftpEventSource := &el.SFTPEventSource + + log.Info("identifying new files in sftp...") + startingFiles, err := sftpNonDirFiles(sftpClient, sftpEventSource.WatchPathConfig.Directory) + if err != nil { + return fmt.Errorf("failed to read directory %s for %s, %w", sftpEventSource.WatchPathConfig.Directory, el.GetEventName(), err) + } + + // TODO: do we need some sort of stateful mechanism to capture changes between event source restarts? + // This would allow loading startingFiles from store/cache rather than initializing starting files from remote sftp source + + var pathRegexp *regexp.Regexp + if sftpEventSource.WatchPathConfig.PathRegexp != "" { + log.Infow("matching file path with configured regex...", zap.Any("regex", sftpEventSource.WatchPathConfig.PathRegexp)) + pathRegexp, err = regexp.Compile(sftpEventSource.WatchPathConfig.PathRegexp) + if err != nil { + return fmt.Errorf("failed to match file path with configured regex %s for %s, %w", sftpEventSource.WatchPathConfig.PathRegexp, el.GetEventName(), err) + } + } + + processOne := func(event fsnotify.Event) error { + defer func(start time.Time) { + el.Metrics.EventProcessingDuration(el.GetEventSourceName(), el.GetEventName(), float64(time.Since(start)/time.Millisecond)) + }(time.Now()) + + log.Infow("sftp event", zap.Any("event-type", event.Op.String()), zap.Any("descriptor-name", event.Name)) + + fileEvent := fsevent.Event{Name: event.Name, Op: fsevent.NewOp(event.Op.String()), Metadata: el.SFTPEventSource.Metadata} + payload, err := json.Marshal(fileEvent) + if err != nil { + return fmt.Errorf("failed to marshal the event to the fs event, %w", err) + } + log.Infow("dispatching sftp event on data channel...", zap.Any("event-type", event.Op.String()), zap.Any("descriptor-name", event.Name)) + if err = dispatch(payload); err != nil { + return fmt.Errorf("failed to dispatch an sftp event, %w", err) + } + return nil + } + + maybeProcess := func(fi fs.FileInfo, op fsnotify.Op) error { + matched := false + relPath := strings.TrimPrefix(fi.Name(), sftpEventSource.WatchPathConfig.Directory) + if sftpEventSource.WatchPathConfig.Path != "" && sftpEventSource.WatchPathConfig.Path == relPath { + matched = true + } else if pathRegexp != nil && pathRegexp.MatchString(relPath) { + matched = true + } + if matched && sftpEventSource.EventType == op.String() { + if err = processOne(fsnotify.Event{ + Name: fi.Name(), + Op: op, + }); err != nil { + log.Errorw("failed to process a sftp event", zap.Error(err)) + el.Metrics.EventProcessingFailed(el.GetEventSourceName(), el.GetEventName()) + } + } + + return nil + } + + pollIntervalDuration := time.Second * 10 + if d, err := time.ParseDuration(sftpEventSource.PollIntervalDuration); err != nil { + pollIntervalDuration = d + } else { + log.Errorw("failed parsing poll interval duration.. falling back to %s: %w", pollIntervalDuration.String(), err) + } + + log.Info("listening to sftp notifications... polling interval %s", pollIntervalDuration.String()) + for { + select { + case <-time.After(pollIntervalDuration): + + files, err := sftpNonDirFiles(sftpClient, sftpEventSource.WatchPathConfig.Directory) + if err != nil { + return fmt.Errorf("failed to read directory %s for %s, %w", sftpEventSource.WatchPathConfig.Directory, el.GetEventName(), err) + } + + fileDiff := diffFiles(startingFiles, files) + if fileDiff.isEmpty() { + continue + } + + log.Infof("found %d new files and %d removed files", len(fileDiff.new), len(fileDiff.removed)) + + for _, fi := range fileDiff.removed { + if err = maybeProcess(fi, fsnotify.Remove); err != nil { + log.Errorw("failed to process a file event", zap.Error(err)) + el.Metrics.EventProcessingFailed(el.GetEventSourceName(), el.GetEventName()) + } + } + for _, fi := range fileDiff.new { + if err = maybeProcess(fi, fsnotify.Create); err != nil { + log.Errorw("failed to process a file event", zap.Error(err)) + el.Metrics.EventProcessingFailed(el.GetEventSourceName(), el.GetEventName()) + } + } + + // TODO: errors processing files will result in dropped events + // adjusting the logic for overwriting startingFiles could enable the next tick + // to capture the event + startingFiles = files + + case <-ctx.Done(): + log.Info("event source has been stopped") + return nil + } + } +} + +func sftpNonDirFiles(sftpClient *sftp.Client, dir string) ([]fs.FileInfo, error) { + var files []fs.FileInfo + err := common.DoWithRetry(nil, func() error { + var err error + files, err = sftpClient.ReadDir(dir) + return err + }) + if err != nil { + return nil, err + } + var nonDirFiles []fs.FileInfo + for _, f := range files { + if !f.IsDir() { + nonDirFiles = append(nonDirFiles, f) + } + } + + files = nonDirFiles + return files, nil +} + +type fileDiff struct { + new []fs.FileInfo + removed []fs.FileInfo +} + +func (f fileDiff) isEmpty() bool { + return (len(f.new) + len(f.removed)) == 0 +} + +func diffFiles(startingFiles, currentFiles []fs.FileInfo) fileDiff { + fileMap := make(map[string]fs.FileInfo) + for _, file := range currentFiles { + fileMap[file.Name()] = file + } + + var diff fileDiff + + for _, startingFile := range startingFiles { + name := startingFile.Name() + + if newFile, ok := fileMap[name]; !ok { + diff.removed = append(diff.removed, startingFile) + } else { + delete(fileMap, name) + + if newFile.Size() != startingFile.Size() || newFile.ModTime() != startingFile.ModTime() { + diff.new = append(diff.new, newFile) + } + } + } + + for _, newFile := range fileMap { + diff.new = append(diff.new, newFile) + } + + return diff +} diff --git a/eventsources/sources/sftp/validate.go b/eventsources/sources/sftp/validate.go new file mode 100644 index 0000000000..da8df9b512 --- /dev/null +++ b/eventsources/sources/sftp/validate.go @@ -0,0 +1,41 @@ +/* +Copyright 2018 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 sftp + +import ( + "context" + "fmt" + + "github.com/argoproj/argo-events/common" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +// ValidateEventSource validates sftp event source +func (listener *EventListener) ValidateEventSource(ctx context.Context) error { + return validate(&listener.SFTPEventSource) +} + +func validate(sftpEventSource *v1alpha1.SFTPEventSource) error { + if sftpEventSource == nil { + return common.ErrNilEventSource + } + if sftpEventSource.EventType == "" { + return fmt.Errorf("type must be specified") + } + err := sftpEventSource.WatchPathConfig.Validate() + return err +} diff --git a/eventsources/sources/sftp/validate_test.go b/eventsources/sources/sftp/validate_test.go new file mode 100644 index 0000000000..0f56f1b113 --- /dev/null +++ b/eventsources/sources/sftp/validate_test.go @@ -0,0 +1,54 @@ +/* +Copyright 2018 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 sftp + +import ( + "context" + "fmt" + "os" + "testing" + + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" + + "github.com/argoproj/argo-events/eventsources/sources" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" +) + +func TestValidateEventSource(t *testing.T) { + listener := &EventListener{} + + err := listener.ValidateEventSource(context.Background()) + assert.Error(t, err) + assert.Equal(t, "type must be specified", err.Error()) + + content, err := os.ReadFile(fmt.Sprintf("%s/%s", sources.EventSourceDir, "sftp.yaml")) + assert.Nil(t, err) + + var eventSource *v1alpha1.EventSource + err = yaml.Unmarshal(content, &eventSource) + assert.Nil(t, err) + assert.NotNil(t, eventSource.Spec.SFTP) + + for _, value := range eventSource.Spec.SFTP { + l := &EventListener{ + SFTPEventSource: value, + } + err := l.ValidateEventSource(context.Background()) + assert.NoError(t, err) + } +} diff --git a/examples/event-sources/sftp.yaml b/examples/event-sources/sftp.yaml new file mode 100644 index 0000000000..7458acaeef --- /dev/null +++ b/examples/event-sources/sftp.yaml @@ -0,0 +1,40 @@ +apiVersion: argoproj.io/v1alpha1 +kind: EventSource +metadata: + name: sftp +spec: + template: + container: + volumeMounts: + - mountPath: /test-data + name: test-data + volumes: + - name: test-data + emptyDir: {} + sftp: + example: + username: + key: username + name: username + password: + key: password + name: password + address: + key: address + name: address + watchPathConfig: + # directory to watch + directory: /test-data/ + # path to watch + path: x.txt + pollIntervalDuration: 10s + # type of the event + # supported types are: CREATE, REMOVE + eventType: CREATE + +# example-with-path-regex: +# watchPathConfig: +# directory: "/bin/" +# # the eventsource will watch events for path that matches following regex +# pathRegexp: "([a-z]+).txt" +# eventType: "CREATE" diff --git a/examples/sensors/sftp.yaml b/examples/sensors/sftp.yaml new file mode 100644 index 0000000000..03c2168d46 --- /dev/null +++ b/examples/sensors/sftp.yaml @@ -0,0 +1,40 @@ +apiVersion: argoproj.io/v1alpha1 +kind: Sensor +metadata: + name: sftp +spec: + template: + serviceAccountName: operate-workflow-sa + dependencies: + - name: test-dep + eventSourceName: sftp + eventName: example + triggers: + - template: + name: sftp-workflow-trigger + k8s: + operation: create + source: + resource: + apiVersion: argoproj.io/v1alpha1 + kind: Workflow + metadata: + generateName: sftp-watcher- + spec: + entrypoint: whalesay + templates: + - + container: + args: + - "hello" # it will get replaced by the event payload + command: + - cowsay + image: "docker/whalesay:latest" + name: whalesay + parameters: + - src: + dependencyName: test-dep + dataKey: name + dest: spec.templates.0.container.args.0 + retryStrategy: + steps: 3 diff --git a/go.mod b/go.mod index ccdd71d238..ca13c28f92 100644 --- a/go.mod +++ b/go.mod @@ -59,6 +59,7 @@ require ( github.com/nats-io/nats.go v1.25.0 github.com/nats-io/stan.go v0.10.4 github.com/nsqio/go-nsq v1.1.0 + github.com/pkg/sftp v1.13.5 github.com/prometheus/client_golang v1.15.1 github.com/rabbitmq/amqp091-go v1.8.1 github.com/radovskyb/watcher v1.0.7 @@ -126,6 +127,7 @@ require ( github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect + github.com/kr/fs v0.1.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/linkedin/goavro/v2 v2.11.1 // indirect github.com/mitchellh/go-wordwrap v1.0.1 // indirect diff --git a/go.sum b/go.sum index 9e929f3853..cb19dc17fc 100644 --- a/go.sum +++ b/go.sum @@ -772,6 +772,7 @@ github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8t github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -973,6 +974,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= +github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1270,6 +1273,7 @@ golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220307211146-efcb8507fb70/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= diff --git a/pkg/apis/common/common.go b/pkg/apis/common/common.go index 593da55fe0..8c762c85b3 100644 --- a/pkg/apis/common/common.go +++ b/pkg/apis/common/common.go @@ -28,6 +28,7 @@ var ( MinioEvent EventSourceType = "minio" CalendarEvent EventSourceType = "calendar" FileEvent EventSourceType = "file" + SFTPEvent EventSourceType = "sftp" ResourceEvent EventSourceType = "resource" WebhookEvent EventSourceType = "webhook" AMQPEvent EventSourceType = "amqp" @@ -77,6 +78,7 @@ var ( ResourceEvent, HDFSEvent, FileEvent, + SFTPEvent, GenericEvent, } ) diff --git a/pkg/apis/eventsource/v1alpha1/generated.pb.go b/pkg/apis/eventsource/v1alpha1/generated.pb.go index b08c2896c1..e59fc4e828 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.pb.go +++ b/pkg/apis/eventsource/v1alpha1/generated.pb.go @@ -1250,10 +1250,38 @@ func (m *ResourceFilter) XXX_DiscardUnknown() { var xxx_messageInfo_ResourceFilter proto.InternalMessageInfo +func (m *SFTPEventSource) Reset() { *m = SFTPEventSource{} } +func (*SFTPEventSource) ProtoMessage() {} +func (*SFTPEventSource) Descriptor() ([]byte, []int) { + return fileDescriptor_c9ac5d6cd016403b, []int{43} +} +func (m *SFTPEventSource) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SFTPEventSource) 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 *SFTPEventSource) XXX_Merge(src proto.Message) { + xxx_messageInfo_SFTPEventSource.Merge(m, src) +} +func (m *SFTPEventSource) XXX_Size() int { + return m.Size() +} +func (m *SFTPEventSource) XXX_DiscardUnknown() { + xxx_messageInfo_SFTPEventSource.DiscardUnknown(m) +} + +var xxx_messageInfo_SFTPEventSource proto.InternalMessageInfo + func (m *SNSEventSource) Reset() { *m = SNSEventSource{} } func (*SNSEventSource) ProtoMessage() {} func (*SNSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{43} + return fileDescriptor_c9ac5d6cd016403b, []int{44} } func (m *SNSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1281,7 +1309,7 @@ var xxx_messageInfo_SNSEventSource proto.InternalMessageInfo func (m *SQSEventSource) Reset() { *m = SQSEventSource{} } func (*SQSEventSource) ProtoMessage() {} func (*SQSEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{44} + return fileDescriptor_c9ac5d6cd016403b, []int{45} } func (m *SQSEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1309,7 +1337,7 @@ var xxx_messageInfo_SQSEventSource proto.InternalMessageInfo func (m *Selector) Reset() { *m = Selector{} } func (*Selector) ProtoMessage() {} func (*Selector) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{45} + return fileDescriptor_c9ac5d6cd016403b, []int{46} } func (m *Selector) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1337,7 +1365,7 @@ var xxx_messageInfo_Selector proto.InternalMessageInfo func (m *Service) Reset() { *m = Service{} } func (*Service) ProtoMessage() {} func (*Service) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{46} + return fileDescriptor_c9ac5d6cd016403b, []int{47} } func (m *Service) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1365,7 +1393,7 @@ var xxx_messageInfo_Service proto.InternalMessageInfo func (m *SlackEventSource) Reset() { *m = SlackEventSource{} } func (*SlackEventSource) ProtoMessage() {} func (*SlackEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{47} + return fileDescriptor_c9ac5d6cd016403b, []int{48} } func (m *SlackEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1393,7 +1421,7 @@ var xxx_messageInfo_SlackEventSource proto.InternalMessageInfo func (m *StorageGridEventSource) Reset() { *m = StorageGridEventSource{} } func (*StorageGridEventSource) ProtoMessage() {} func (*StorageGridEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{48} + return fileDescriptor_c9ac5d6cd016403b, []int{49} } func (m *StorageGridEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1421,7 +1449,7 @@ var xxx_messageInfo_StorageGridEventSource proto.InternalMessageInfo func (m *StorageGridFilter) Reset() { *m = StorageGridFilter{} } func (*StorageGridFilter) ProtoMessage() {} func (*StorageGridFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{49} + return fileDescriptor_c9ac5d6cd016403b, []int{50} } func (m *StorageGridFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1449,7 +1477,7 @@ var xxx_messageInfo_StorageGridFilter proto.InternalMessageInfo func (m *StripeEventSource) Reset() { *m = StripeEventSource{} } func (*StripeEventSource) ProtoMessage() {} func (*StripeEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{50} + return fileDescriptor_c9ac5d6cd016403b, []int{51} } func (m *StripeEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1477,7 +1505,7 @@ var xxx_messageInfo_StripeEventSource proto.InternalMessageInfo func (m *Template) Reset() { *m = Template{} } func (*Template) ProtoMessage() {} func (*Template) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{51} + return fileDescriptor_c9ac5d6cd016403b, []int{52} } func (m *Template) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1505,7 +1533,7 @@ var xxx_messageInfo_Template proto.InternalMessageInfo func (m *WatchPathConfig) Reset() { *m = WatchPathConfig{} } func (*WatchPathConfig) ProtoMessage() {} func (*WatchPathConfig) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{52} + return fileDescriptor_c9ac5d6cd016403b, []int{53} } func (m *WatchPathConfig) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1533,7 +1561,7 @@ var xxx_messageInfo_WatchPathConfig proto.InternalMessageInfo func (m *WebhookContext) Reset() { *m = WebhookContext{} } func (*WebhookContext) ProtoMessage() {} func (*WebhookContext) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{53} + return fileDescriptor_c9ac5d6cd016403b, []int{54} } func (m *WebhookContext) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1561,7 +1589,7 @@ var xxx_messageInfo_WebhookContext proto.InternalMessageInfo func (m *WebhookEventSource) Reset() { *m = WebhookEventSource{} } func (*WebhookEventSource) ProtoMessage() {} func (*WebhookEventSource) Descriptor() ([]byte, []int) { - return fileDescriptor_c9ac5d6cd016403b, []int{54} + return fileDescriptor_c9ac5d6cd016403b, []int{55} } func (m *WebhookEventSource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1641,6 +1669,7 @@ func init() { proto.RegisterMapType((map[string]RedisEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.RedisEntry") proto.RegisterMapType((map[string]RedisStreamEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.RedisStreamEntry") proto.RegisterMapType((map[string]ResourceEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.ResourceEntry") + proto.RegisterMapType((map[string]SFTPEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SftpEntry") proto.RegisterMapType((map[string]SlackEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SlackEntry") proto.RegisterMapType((map[string]SNSEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SnsEntry") proto.RegisterMapType((map[string]SQSEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.EventSourceSpec.SqsEntry") @@ -1682,6 +1711,8 @@ func init() { proto.RegisterType((*ResourceEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceEventSource.MetadataEntry") proto.RegisterType((*ResourceFilter)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.ResourceFilter") + proto.RegisterType((*SFTPEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.SFTPEventSource") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.SFTPEventSource.MetadataEntry") proto.RegisterType((*SNSEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.SNSEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.SNSEventSource.MetadataEntry") proto.RegisterType((*SQSEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.SQSEventSource") @@ -1708,442 +1739,449 @@ func init() { } var fileDescriptor_c9ac5d6cd016403b = []byte{ - // 6951 bytes of a gzipped FileDescriptorProto + // 7064 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x7d, 0x4d, 0x6c, 0x24, 0xc7, - 0x75, 0xb0, 0x9a, 0x9c, 0x19, 0xce, 0x3c, 0xfe, 0xd7, 0xae, 0x56, 0x23, 0x5a, 0xda, 0xdd, 0x8f, - 0x82, 0x17, 0xab, 0xef, 0x93, 0xb9, 0x9f, 0xf4, 0x7d, 0x8e, 0x65, 0x29, 0x96, 0x31, 0x43, 0xee, - 0x0f, 0xb5, 0x24, 0x97, 0xac, 0xe6, 0xea, 0xc7, 0xb2, 0x24, 0xf7, 0xf4, 0x14, 0x87, 0x6d, 0xf6, - 0x74, 0x0f, 0xbb, 0x7b, 0xb8, 0xcb, 0x05, 0x62, 0x1b, 0x06, 0x9c, 0xd8, 0xfa, 0xb1, 0xad, 0x24, - 0x4e, 0x82, 0x04, 0x3e, 0x38, 0x09, 0x7c, 0x48, 0x82, 0x1c, 0x8d, 0x5c, 0x03, 0xe4, 0x60, 0x24, - 0x39, 0x38, 0xc9, 0xc5, 0xb1, 0x81, 0x85, 0xbd, 0x41, 0x6e, 0xb9, 0x04, 0x3e, 0x25, 0xa7, 0xa0, - 0x7e, 0xba, 0xba, 0xfa, 0x67, 0xb8, 0x33, 0x9c, 0x1e, 0x52, 0x1b, 0xe4, 0x36, 0x53, 0xef, 0xd5, - 0x7b, 0xaf, 0xab, 0x5e, 0xbd, 0xaa, 0x57, 0xf5, 0x5e, 0x15, 0xac, 0xb7, 0xac, 0x60, 0xb7, 0xdb, - 0x58, 0x32, 0xdd, 0xf6, 0x15, 0xc3, 0x6b, 0xb9, 0x1d, 0xcf, 0xfd, 0x32, 0xfb, 0xf1, 0x29, 0x72, - 0x40, 0x9c, 0xc0, 0xbf, 0xd2, 0xd9, 0x6b, 0x5d, 0x31, 0x3a, 0x96, 0x7f, 0x85, 0xff, 0x77, 0xbb, - 0x9e, 0x49, 0xae, 0x1c, 0x3c, 0x6f, 0xd8, 0x9d, 0x5d, 0xe3, 0xf9, 0x2b, 0x2d, 0xe2, 0x10, 0xcf, - 0x08, 0x48, 0x73, 0xa9, 0xe3, 0xb9, 0x81, 0x8b, 0x3e, 0x17, 0x91, 0x5b, 0x0a, 0xc9, 0xb1, 0x1f, - 0xef, 0xf2, 0xea, 0x4b, 0x9d, 0xbd, 0xd6, 0x12, 0x25, 0xb7, 0xa4, 0x90, 0x5b, 0x0a, 0xc9, 0x2d, - 0x7c, 0xbe, 0x6f, 0x69, 0x4c, 0xb7, 0xdd, 0x76, 0x9d, 0x24, 0xff, 0x85, 0x4f, 0x29, 0x04, 0x5a, - 0x6e, 0xcb, 0xbd, 0xc2, 0x8a, 0x1b, 0xdd, 0x1d, 0xf6, 0x8f, 0xfd, 0x61, 0xbf, 0x04, 0xfa, 0xe2, - 0xde, 0x8b, 0xfe, 0x92, 0xe5, 0x52, 0x92, 0x57, 0x4c, 0xd7, 0xa3, 0x1f, 0x96, 0x22, 0xf9, 0xff, - 0x23, 0x9c, 0xb6, 0x61, 0xee, 0x5a, 0x0e, 0xf1, 0x0e, 0x23, 0x39, 0xda, 0x24, 0x30, 0xb2, 0x6a, - 0x5d, 0xe9, 0x55, 0xcb, 0xeb, 0x3a, 0x81, 0xd5, 0x26, 0xa9, 0x0a, 0xbf, 0xf6, 0xb0, 0x0a, 0xbe, - 0xb9, 0x4b, 0xda, 0x46, 0xb2, 0xde, 0xe2, 0x7f, 0x68, 0x30, 0x5f, 0x5b, 0xdf, 0xda, 0x5c, 0x76, - 0x1d, 0xbf, 0xdb, 0x26, 0xcb, 0xae, 0xb3, 0x63, 0xb5, 0xd0, 0xa7, 0x61, 0xd2, 0xe4, 0x05, 0xde, - 0xb6, 0xd1, 0xaa, 0x6a, 0x17, 0xb5, 0xcb, 0x95, 0xfa, 0x99, 0x1f, 0xdf, 0xbf, 0xf0, 0xd8, 0x83, - 0xfb, 0x17, 0x26, 0x97, 0x23, 0x10, 0x56, 0xf1, 0xd0, 0xb3, 0x30, 0x61, 0x74, 0x03, 0xb7, 0x66, - 0xee, 0x55, 0xc7, 0x2e, 0x6a, 0x97, 0xcb, 0xf5, 0x59, 0x51, 0x65, 0xa2, 0xc6, 0x8b, 0x71, 0x08, - 0x47, 0x57, 0xa0, 0x42, 0xee, 0x9a, 0x76, 0xd7, 0xb7, 0x0e, 0x48, 0x75, 0x9c, 0x21, 0xcf, 0x0b, - 0xe4, 0xca, 0xd5, 0x10, 0x80, 0x23, 0x1c, 0x4a, 0xdb, 0x71, 0xd7, 0x5c, 0xd3, 0xb0, 0xab, 0x85, - 0x38, 0xed, 0x0d, 0x5e, 0x8c, 0x43, 0x38, 0xba, 0x04, 0x25, 0xc7, 0x7d, 0xdd, 0xb0, 0x82, 0x6a, - 0x91, 0x61, 0xce, 0x08, 0xcc, 0xd2, 0x06, 0x2b, 0xc5, 0x02, 0xba, 0xf8, 0x6f, 0x93, 0x30, 0x4b, - 0xbf, 0xfd, 0x2a, 0x55, 0x0e, 0x9d, 0xe9, 0x12, 0x7a, 0x1a, 0xc6, 0xbb, 0x9e, 0x2d, 0xbe, 0x78, - 0x52, 0x54, 0x1c, 0xbf, 0x8d, 0xd7, 0x30, 0x2d, 0x47, 0x2f, 0xc2, 0x14, 0xb9, 0x6b, 0xee, 0x1a, - 0x4e, 0x8b, 0x6c, 0x18, 0x6d, 0xc2, 0x3e, 0xb3, 0x52, 0x3f, 0x2b, 0xf0, 0xa6, 0xae, 0x2a, 0x30, - 0x1c, 0xc3, 0x54, 0x6b, 0x6e, 0x1f, 0x76, 0xf8, 0x37, 0x67, 0xd4, 0xa4, 0x30, 0x1c, 0xc3, 0x44, - 0x2f, 0x00, 0x78, 0x6e, 0x37, 0xb0, 0x9c, 0xd6, 0x4d, 0x72, 0xc8, 0x3e, 0xbe, 0x52, 0x47, 0xa2, - 0x1e, 0x60, 0x09, 0xc1, 0x0a, 0x16, 0xfa, 0x0d, 0x98, 0x37, 0x5d, 0xc7, 0x21, 0x66, 0x60, 0xb9, - 0x4e, 0xdd, 0x30, 0xf7, 0xdc, 0x9d, 0x1d, 0xd6, 0x1a, 0x93, 0x2f, 0xbc, 0xb8, 0xd4, 0xf7, 0x20, - 0xe3, 0xa3, 0x64, 0x49, 0xd4, 0xaf, 0x3f, 0xfe, 0xe0, 0xfe, 0x85, 0xf9, 0xe5, 0x24, 0x59, 0x9c, - 0xe6, 0x84, 0x9e, 0x83, 0xf2, 0x97, 0x7d, 0xd7, 0xa9, 0xbb, 0xcd, 0xc3, 0x6a, 0x89, 0xf5, 0xc1, - 0x9c, 0x10, 0xb8, 0xfc, 0xaa, 0x7e, 0x6b, 0x83, 0x96, 0x63, 0x89, 0x81, 0x6e, 0xc3, 0x78, 0x60, - 0xfb, 0xd5, 0x09, 0x26, 0xde, 0x4b, 0x03, 0x8b, 0xb7, 0xbd, 0xa6, 0x73, 0xb5, 0xad, 0x4f, 0xd0, - 0xbe, 0xda, 0x5e, 0xd3, 0x31, 0xa5, 0x87, 0xde, 0xd3, 0xa0, 0x4c, 0xc7, 0x57, 0xd3, 0x08, 0x8c, - 0x6a, 0xf9, 0xe2, 0xf8, 0xe5, 0xc9, 0x17, 0xbe, 0xb8, 0x34, 0x94, 0x81, 0x59, 0x4a, 0x68, 0xcb, - 0xd2, 0xba, 0x20, 0x7f, 0xd5, 0x09, 0xbc, 0xc3, 0xe8, 0x1b, 0xc3, 0x62, 0x2c, 0xf9, 0xa3, 0xdf, - 0xd7, 0x60, 0x36, 0xec, 0xd5, 0x15, 0x62, 0xda, 0x86, 0x47, 0xaa, 0x15, 0xf6, 0xc1, 0x6f, 0xe4, - 0x21, 0x53, 0x9c, 0xb2, 0x68, 0x8e, 0x33, 0x0f, 0xee, 0x5f, 0x98, 0x4d, 0x80, 0x70, 0x52, 0x0a, - 0xf4, 0xbe, 0x06, 0x53, 0xfb, 0x5d, 0xd2, 0x95, 0x62, 0x01, 0x13, 0xeb, 0x76, 0x0e, 0x62, 0x6d, - 0x29, 0x64, 0x85, 0x4c, 0x73, 0x54, 0xd9, 0xd5, 0x72, 0x1c, 0x63, 0x8e, 0xbe, 0x0a, 0x15, 0xf6, - 0xbf, 0x6e, 0x39, 0xcd, 0xea, 0x24, 0x93, 0x04, 0xe7, 0x25, 0x09, 0xa5, 0x29, 0xc4, 0x98, 0xa6, - 0x76, 0x46, 0x16, 0xe2, 0x88, 0x27, 0xba, 0x03, 0x13, 0xc2, 0xa4, 0x55, 0xa7, 0x18, 0xfb, 0xcd, - 0x1c, 0xd8, 0xc7, 0xac, 0x6b, 0x7d, 0x92, 0x5a, 0x2d, 0x51, 0x84, 0x43, 0x6e, 0xe8, 0x0d, 0x28, - 0x18, 0xdd, 0x60, 0xb7, 0x3a, 0x7d, 0xcc, 0x61, 0x50, 0x37, 0x7c, 0xcb, 0xac, 0x75, 0x83, 0xdd, - 0x7a, 0xf9, 0xc1, 0xfd, 0x0b, 0x05, 0xfa, 0x0b, 0x33, 0x8a, 0x08, 0x43, 0xa5, 0xeb, 0xd9, 0x3a, - 0x31, 0x3d, 0x12, 0x54, 0x67, 0x18, 0xf9, 0x4f, 0x2e, 0xf1, 0xf9, 0x82, 0x52, 0x58, 0xa2, 0x53, - 0xd7, 0xd2, 0xc1, 0xf3, 0x4b, 0x1c, 0xe3, 0x26, 0x39, 0xd4, 0x89, 0x4d, 0xcc, 0xc0, 0xf5, 0x78, - 0x33, 0xdd, 0xc6, 0x6b, 0x1c, 0x82, 0x23, 0x32, 0x28, 0x80, 0xd2, 0x8e, 0x65, 0x07, 0xc4, 0xab, - 0xce, 0xe6, 0xd2, 0x4a, 0xca, 0xa8, 0xba, 0xc6, 0xe8, 0xd6, 0x81, 0x5a, 0x6c, 0xfe, 0x1b, 0x0b, - 0x5e, 0x0b, 0x2f, 0xc3, 0x74, 0x6c, 0xc8, 0xa1, 0x39, 0x18, 0xdf, 0x23, 0x87, 0xdc, 0x5c, 0x63, - 0xfa, 0x13, 0x9d, 0x85, 0xe2, 0x81, 0x61, 0x77, 0x85, 0x69, 0xc6, 0xfc, 0xcf, 0x4b, 0x63, 0x2f, - 0x6a, 0x8b, 0x3f, 0xd1, 0xe0, 0xc9, 0x9e, 0x83, 0x85, 0xce, 0x2f, 0xcd, 0xae, 0x67, 0x34, 0x6c, - 0xc2, 0xa8, 0x29, 0xf3, 0xcb, 0x0a, 0x2f, 0xc6, 0x21, 0x9c, 0x1a, 0x64, 0x3a, 0x8d, 0xad, 0x10, - 0x9b, 0x04, 0x44, 0xcc, 0x74, 0xd2, 0x20, 0xd7, 0x24, 0x04, 0x2b, 0x58, 0xd4, 0x22, 0x5a, 0x4e, - 0x40, 0x3c, 0xc7, 0xb0, 0xc5, 0x74, 0x27, 0xad, 0xc5, 0xaa, 0x28, 0xc7, 0x12, 0x43, 0x99, 0xc1, - 0x0a, 0x47, 0xce, 0x60, 0x9f, 0x83, 0x33, 0x19, 0xda, 0xad, 0x54, 0xd7, 0x8e, 0xac, 0xfe, 0x27, - 0x63, 0x70, 0x2e, 0x7b, 0x9c, 0xa2, 0x8b, 0x50, 0x70, 0xe8, 0x04, 0xc7, 0x27, 0xc2, 0x29, 0x41, - 0xa0, 0xc0, 0x26, 0x36, 0x06, 0x51, 0x1b, 0x6c, 0x6c, 0xa0, 0x06, 0x1b, 0xef, 0xab, 0xc1, 0x62, - 0x0b, 0x84, 0x42, 0x1f, 0x0b, 0x84, 0x3e, 0x67, 0x7d, 0x4a, 0xd8, 0xf0, 0x5a, 0xdd, 0x36, 0x55, - 0x42, 0x36, 0x39, 0x55, 0x22, 0xc2, 0xb5, 0x10, 0x80, 0x23, 0x9c, 0xc5, 0xf7, 0x8a, 0xf0, 0x64, - 0xed, 0x5e, 0xd7, 0x23, 0x4c, 0x47, 0xfd, 0x1b, 0xdd, 0x86, 0xba, 0x60, 0xb8, 0x08, 0x85, 0x9d, - 0xfd, 0xa6, 0x93, 0x6c, 0xa8, 0x6b, 0x5b, 0x2b, 0x1b, 0x98, 0x41, 0x50, 0x07, 0xce, 0xf8, 0xbb, - 0x86, 0x47, 0x9a, 0x35, 0xd3, 0x24, 0xbe, 0x7f, 0x93, 0x1c, 0xca, 0xa5, 0x43, 0xdf, 0x03, 0xf1, - 0x89, 0x07, 0xf7, 0x2f, 0x9c, 0xd1, 0xd3, 0x54, 0x70, 0x16, 0x69, 0xd4, 0x84, 0xd9, 0x44, 0x31, - 0x6b, 0xf4, 0xbe, 0xb9, 0xb1, 0x89, 0x23, 0xc1, 0x0d, 0x27, 0x49, 0x52, 0x05, 0xd8, 0xed, 0x36, - 0xd8, 0xb7, 0xf0, 0x45, 0x89, 0x54, 0x80, 0x1b, 0xbc, 0x18, 0x87, 0x70, 0xf4, 0xbb, 0xea, 0x54, - 0x5c, 0x64, 0x53, 0xf1, 0xce, 0xb0, 0x66, 0xb5, 0x57, 0x8f, 0x0c, 0x30, 0x29, 0x47, 0x46, 0xac, - 0xf4, 0xa8, 0x18, 0xb1, 0x9f, 0x17, 0xe1, 0x29, 0xf6, 0xe9, 0x6c, 0xcc, 0xea, 0x81, 0xeb, 0x19, - 0x2d, 0xa2, 0xea, 0xe3, 0xab, 0x80, 0x7c, 0x5e, 0x5a, 0x33, 0x4d, 0xb7, 0xeb, 0x04, 0x1b, 0xd1, - 0x30, 0x5e, 0x10, 0x6d, 0x81, 0xf4, 0x14, 0x06, 0xce, 0xa8, 0x85, 0x5a, 0x30, 0x17, 0xad, 0xed, - 0xf4, 0xc0, 0xb3, 0x9c, 0xd6, 0x60, 0x6a, 0x7b, 0xf6, 0xc1, 0xfd, 0x0b, 0x73, 0xcb, 0x09, 0x12, - 0x38, 0x45, 0x94, 0x8e, 0x49, 0x36, 0x03, 0x33, 0x59, 0xc7, 0xe3, 0x63, 0x72, 0x2b, 0x04, 0xe0, - 0x08, 0x27, 0xb6, 0xc0, 0x2c, 0x3c, 0x74, 0x81, 0xf9, 0x34, 0x8c, 0x37, 0xed, 0x7d, 0x61, 0x17, - 0xe4, 0xa2, 0x7e, 0x65, 0x6d, 0x0b, 0xd3, 0x72, 0xba, 0x36, 0x8b, 0xb4, 0xb3, 0xc4, 0xb4, 0xd3, - 0xca, 0x43, 0x3b, 0x7b, 0x74, 0xd1, 0xb1, 0x14, 0x74, 0xe2, 0xe4, 0x14, 0x14, 0xbd, 0x0c, 0xd3, - 0x4d, 0x62, 0xba, 0x4d, 0xb2, 0x4e, 0x7c, 0xdf, 0x68, 0x91, 0x6a, 0x99, 0x35, 0xdc, 0xe3, 0x42, - 0xd0, 0xe9, 0x15, 0x15, 0x88, 0xe3, 0xb8, 0xc3, 0x69, 0xf7, 0x4f, 0x4b, 0xb0, 0xc0, 0x9a, 0x4e, - 0x27, 0xde, 0x81, 0x65, 0x92, 0x7a, 0xd7, 0x57, 0x75, 0x3b, 0x4b, 0x1f, 0xb5, 0x91, 0xeb, 0xe3, - 0x58, 0x1f, 0xfa, 0x78, 0x05, 0x2a, 0x81, 0xdb, 0xb1, 0xcc, 0x2c, 0x05, 0xde, 0x0e, 0x01, 0x38, - 0xc2, 0x41, 0x2b, 0x30, 0xe7, 0x77, 0x1b, 0xbe, 0xe9, 0x59, 0x1d, 0xca, 0x57, 0xb1, 0xa2, 0x55, - 0x51, 0x6f, 0x4e, 0x4f, 0xc0, 0x71, 0xaa, 0x46, 0xe8, 0x39, 0x15, 0x73, 0xf6, 0x9c, 0x06, 0x73, - 0xdf, 0xbe, 0xa7, 0x0e, 0x9f, 0x09, 0x36, 0x7c, 0x5a, 0x79, 0x0c, 0x9f, 0x4c, 0x1d, 0x38, 0xd6, - 0xe0, 0x29, 0x9f, 0xe0, 0xe0, 0x79, 0x13, 0x9e, 0xd8, 0xe9, 0xda, 0xf6, 0xe1, 0x56, 0xd7, 0xb0, - 0xad, 0x1d, 0x8b, 0x34, 0x69, 0x47, 0xf9, 0x1d, 0xc3, 0xe4, 0xfe, 0x5e, 0xa5, 0x7e, 0x41, 0x88, - 0xfc, 0xc4, 0xb5, 0x6c, 0x34, 0xdc, 0xab, 0xfe, 0x70, 0x43, 0xeb, 0x67, 0x1a, 0x4c, 0xd7, 0xad, - 0xa0, 0xd1, 0x35, 0xf7, 0x48, 0x40, 0x9d, 0x03, 0xe4, 0x41, 0xb1, 0x41, 0x7d, 0x06, 0x31, 0x84, - 0xb6, 0x86, 0x6c, 0x1e, 0x49, 0x3c, 0x72, 0x44, 0x2a, 0x0f, 0xee, 0x5f, 0x28, 0xb2, 0xbf, 0x98, - 0xb3, 0x42, 0xb7, 0x01, 0x5c, 0xea, 0x93, 0x6c, 0xbb, 0x7b, 0xc4, 0x19, 0x6c, 0x2e, 0x99, 0xa1, - 0x8b, 0xc5, 0x5b, 0xb5, 0xb0, 0x32, 0x56, 0x08, 0x2d, 0xfe, 0x48, 0x03, 0x94, 0xe6, 0x8f, 0x6e, - 0x41, 0xb9, 0xeb, 0xd3, 0x15, 0xb5, 0x98, 0x01, 0xfb, 0xe6, 0x35, 0x45, 0x55, 0xea, 0xb6, 0xa8, - 0x8a, 0x25, 0x11, 0x4a, 0xb0, 0x63, 0xf8, 0xfe, 0x1d, 0xd7, 0x6b, 0x0e, 0x26, 0x3c, 0x23, 0xb8, - 0x29, 0xaa, 0x62, 0x49, 0x64, 0xf1, 0x57, 0x13, 0x70, 0x56, 0x0a, 0x9e, 0x98, 0xc6, 0x9b, 0x6c, - 0x21, 0x7c, 0xc3, 0x75, 0xf7, 0x6e, 0x39, 0xd7, 0x2c, 0xc7, 0xf2, 0x77, 0xc5, 0x72, 0x5e, 0x4e, - 0xe3, 0x2b, 0x29, 0x0c, 0x9c, 0x51, 0x0b, 0x7d, 0x47, 0x1d, 0xa0, 0x63, 0x6c, 0x80, 0x1a, 0x79, - 0x75, 0xf6, 0x71, 0x87, 0xe6, 0xc4, 0x1d, 0xd2, 0xd8, 0x75, 0xdd, 0x3d, 0xb1, 0x30, 0x5d, 0x1f, - 0x52, 0x9e, 0xd7, 0x39, 0xb5, 0x65, 0xd7, 0x09, 0xc8, 0xdd, 0x80, 0x7b, 0xd8, 0xa2, 0x0c, 0x87, - 0xac, 0xd0, 0x97, 0x85, 0x87, 0x5d, 0x60, 0x2c, 0xd7, 0xf2, 0x6a, 0x82, 0x4c, 0x9f, 0x7b, 0x11, - 0x4a, 0xbc, 0x16, 0x5b, 0xee, 0x56, 0xb8, 0xa9, 0xe0, 0xcb, 0x55, 0x2c, 0x20, 0xe8, 0x53, 0x50, - 0x74, 0xef, 0x38, 0x62, 0xf5, 0x59, 0xa9, 0x3f, 0x21, 0x1a, 0x6c, 0x76, 0x85, 0x74, 0x3c, 0x62, - 0x1a, 0x01, 0x69, 0xde, 0xa2, 0x60, 0xcc, 0xb1, 0xd0, 0xaf, 0x03, 0x50, 0x11, 0x89, 0x49, 0x35, - 0x8b, 0x2d, 0x08, 0x2a, 0xf5, 0xa7, 0x44, 0x9d, 0xb3, 0x51, 0x9d, 0x4d, 0x89, 0x83, 0x15, 0x7c, - 0x74, 0x03, 0x66, 0x3c, 0xd2, 0x71, 0x7d, 0x2b, 0x70, 0xbd, 0x43, 0xdd, 0xee, 0xb6, 0x98, 0x55, - 0xac, 0xd4, 0x2f, 0x0a, 0x0a, 0xd5, 0x88, 0x02, 0x8e, 0xe1, 0xe1, 0x44, 0x3d, 0xf4, 0x81, 0x06, - 0x53, 0xb2, 0xc8, 0x22, 0x7e, 0xb5, 0xc2, 0x54, 0x0a, 0xe7, 0xd5, 0x9e, 0x11, 0xfb, 0x68, 0x7b, - 0x14, 0x2b, 0xfc, 0x70, 0x8c, 0xbb, 0x62, 0xe6, 0xe1, 0x51, 0x59, 0xc4, 0xdf, 0x83, 0x33, 0x19, - 0x5f, 0x8b, 0x9e, 0x09, 0xf5, 0x81, 0xaf, 0xd6, 0xa7, 0xc5, 0xc7, 0x17, 0x63, 0x5a, 0xf0, 0x4a, - 0xaa, 0x1f, 0xf9, 0xfa, 0xe4, 0x9c, 0xc0, 0x9e, 0x39, 0xba, 0xf7, 0x16, 0xff, 0xa9, 0x02, 0x0b, - 0x92, 0x39, 0x9d, 0x62, 0x89, 0xa7, 0xda, 0x1d, 0x65, 0x64, 0x6a, 0x27, 0x37, 0x32, 0xe3, 0xaa, - 0x3d, 0x36, 0xb4, 0x6a, 0x8f, 0x1f, 0x53, 0xb5, 0x7f, 0x3b, 0xa9, 0xda, 0x05, 0xa6, 0xda, 0x6f, - 0xe4, 0xa5, 0xda, 0xbc, 0xbd, 0x07, 0x54, 0xf0, 0x7e, 0x4c, 0xc9, 0x1b, 0x30, 0x69, 0x30, 0xc7, - 0x9c, 0x4f, 0xac, 0xa5, 0x41, 0xe6, 0xa6, 0xd9, 0x07, 0xf7, 0x2f, 0x4c, 0xd6, 0xa2, 0xda, 0x58, - 0x25, 0x85, 0xde, 0x81, 0x69, 0xd1, 0x4b, 0x62, 0x03, 0x71, 0x62, 0x10, 0xda, 0xf3, 0xd4, 0x5f, - 0x78, 0x5d, 0xad, 0x8f, 0xe3, 0xe4, 0xd0, 0x6b, 0x70, 0xae, 0x11, 0x36, 0x8f, 0xcf, 0x9a, 0xa7, - 0x6e, 0xf8, 0xe4, 0x36, 0x5e, 0x13, 0xf6, 0xe9, 0xbc, 0x68, 0xa1, 0x73, 0x89, 0x46, 0x14, 0x58, - 0xb8, 0x47, 0xed, 0x1e, 0x13, 0x68, 0xe5, 0x58, 0x13, 0x68, 0x6c, 0x85, 0x0b, 0xb9, 0xac, 0x70, - 0x7b, 0x0f, 0xc1, 0x63, 0xad, 0x70, 0x27, 0x4f, 0x70, 0x85, 0x2b, 0x9c, 0x8e, 0xa9, 0x7c, 0x9d, - 0x8e, 0xe1, 0x2c, 0xea, 0x77, 0x34, 0x78, 0xb2, 0xe7, 0x28, 0x43, 0x2f, 0xc4, 0xcc, 0x8b, 0x16, - 0x3f, 0x41, 0xeb, 0x61, 0x54, 0x86, 0xb5, 0xb3, 0x7f, 0x5a, 0x84, 0x33, 0xcb, 0x86, 0x4d, 0x9c, - 0xa6, 0x11, 0x33, 0xb0, 0xcf, 0x41, 0xd9, 0x37, 0x77, 0x49, 0xb3, 0x6b, 0x87, 0xbb, 0x32, 0xb2, - 0x87, 0x75, 0x51, 0x8e, 0x25, 0x86, 0xdc, 0x36, 0x3e, 0x30, 0x6c, 0xc1, 0x3f, 0xbe, 0x6d, 0x7c, - 0x20, 0xb7, 0x8d, 0x0f, 0x0c, 0x1b, 0xbd, 0x04, 0x33, 0x62, 0x3f, 0xd4, 0x75, 0x56, 0x8c, 0x80, - 0xf8, 0xd5, 0x71, 0x66, 0x31, 0x10, 0x95, 0xf7, 0x6a, 0x0c, 0x82, 0x13, 0x98, 0x94, 0x53, 0x60, - 0xb5, 0xc9, 0x3d, 0xd7, 0x09, 0x1d, 0x51, 0xc9, 0x69, 0x5b, 0x94, 0x63, 0x89, 0x81, 0xbe, 0x9d, - 0xde, 0xd0, 0xfb, 0xd2, 0x90, 0xca, 0x97, 0xd1, 0x58, 0x03, 0x0c, 0x85, 0xaf, 0x6b, 0x30, 0xd9, - 0x21, 0x9e, 0x6f, 0xf9, 0x01, 0x71, 0x4c, 0x22, 0x2c, 0xe0, 0xad, 0x3c, 0x06, 0xc4, 0x66, 0x44, - 0x96, 0xdb, 0x4a, 0xa5, 0x00, 0xab, 0x4c, 0x4f, 0xc7, 0xe3, 0x1c, 0x6e, 0xe0, 0xdc, 0x85, 0xb3, - 0xcb, 0x46, 0x60, 0xee, 0x76, 0x3b, 0x7c, 0x50, 0x76, 0x3d, 0x23, 0xb0, 0x5c, 0x07, 0x3d, 0x0b, - 0x13, 0xc4, 0x31, 0x1a, 0x36, 0x69, 0x26, 0x8f, 0x43, 0xae, 0xf2, 0x62, 0x1c, 0xc2, 0xd1, 0xa7, - 0x61, 0xb2, 0x6d, 0xdc, 0x5d, 0x11, 0x35, 0x85, 0x9a, 0xca, 0x60, 0x81, 0xf5, 0x08, 0x84, 0x55, - 0xbc, 0xc5, 0xaf, 0xc0, 0x59, 0xce, 0x72, 0xdd, 0xe8, 0x28, 0x2d, 0xda, 0xc7, 0xc9, 0xc3, 0x0a, - 0xcc, 0x99, 0x1e, 0x31, 0x02, 0xb2, 0xba, 0xb3, 0xe1, 0x06, 0x57, 0xef, 0x5a, 0x7e, 0x20, 0x8e, - 0x20, 0xe4, 0xde, 0xc9, 0x72, 0x02, 0x8e, 0x53, 0x35, 0x16, 0xbf, 0x3b, 0x01, 0xe8, 0x6a, 0xdb, - 0x0a, 0x82, 0xf8, 0x02, 0xe8, 0x12, 0x94, 0x1a, 0x9e, 0xbb, 0x27, 0x57, 0x61, 0xf2, 0x18, 0xa1, - 0xce, 0x4a, 0xb1, 0x80, 0x52, 0x9b, 0x62, 0xee, 0x1a, 0x8e, 0x43, 0xec, 0x68, 0xc9, 0x22, 0x6d, - 0xca, 0xb2, 0x84, 0x60, 0x05, 0x8b, 0x85, 0x55, 0xf0, 0x7f, 0xca, 0x3e, 0x51, 0x14, 0x56, 0x11, - 0x81, 0xb0, 0x8a, 0x17, 0x73, 0x63, 0x0b, 0x79, 0xbb, 0xb1, 0xc5, 0x1c, 0xdc, 0xd8, 0xec, 0x70, - 0x83, 0xd2, 0xa9, 0x84, 0x1b, 0x4c, 0xf4, 0x1b, 0x6e, 0x50, 0xce, 0x79, 0xd3, 0xec, 0x43, 0xd5, - 0x24, 0x72, 0x97, 0xe8, 0xdd, 0x61, 0xc7, 0x7f, 0x4a, 0x3d, 0x8f, 0xb5, 0x38, 0x78, 0x64, 0xfc, - 0xa2, 0x8f, 0xc6, 0x60, 0x2e, 0x69, 0x72, 0xd1, 0x3d, 0x98, 0x30, 0xb9, 0x85, 0x12, 0x1e, 0x89, - 0x3e, 0xf4, 0x44, 0x93, 0xb6, 0x77, 0xe2, 0x4c, 0x9e, 0x43, 0x70, 0xc8, 0x10, 0x7d, 0x4d, 0x83, - 0x8a, 0x19, 0x1a, 0x29, 0xb1, 0xe3, 0x33, 0x34, 0xfb, 0x0c, 0xa3, 0xc7, 0x0f, 0xda, 0x25, 0x04, - 0x47, 0x4c, 0x17, 0x7f, 0x3e, 0x06, 0x93, 0xaa, 0x7d, 0xfa, 0x92, 0xa2, 0x65, 0xbc, 0x3d, 0xfe, - 0xaf, 0x32, 0x76, 0x65, 0xec, 0x57, 0x24, 0x04, 0xc5, 0xa6, 0xa3, 0xf9, 0x56, 0x83, 0x2e, 0x6d, - 0x68, 0xe7, 0x44, 0x76, 0x2a, 0x2a, 0x53, 0x14, 0xa7, 0x03, 0x05, 0xbf, 0x43, 0x4c, 0xf1, 0xb9, - 0x1b, 0xf9, 0xa9, 0x8d, 0xde, 0x21, 0x66, 0x64, 0xd0, 0xe9, 0x3f, 0xcc, 0x38, 0xa1, 0xbb, 0x50, - 0xf2, 0x03, 0x23, 0xe8, 0xfa, 0x62, 0x37, 0x28, 0x47, 0x55, 0xd5, 0x19, 0xdd, 0xc8, 0x8a, 0xf3, - 0xff, 0x58, 0xf0, 0x5b, 0xbc, 0x0e, 0xf3, 0x29, 0xbd, 0xa6, 0xa6, 0x9d, 0xdc, 0xed, 0x78, 0xc4, - 0xa7, 0xab, 0xa3, 0xe4, 0x72, 0xf1, 0xaa, 0x84, 0x60, 0x05, 0x6b, 0xf1, 0x17, 0x1a, 0xcc, 0x2a, - 0x94, 0xd6, 0x2c, 0x3f, 0x40, 0x5f, 0x4c, 0x75, 0xd5, 0x52, 0x7f, 0x5d, 0x45, 0x6b, 0xb3, 0x8e, - 0x92, 0xe3, 0x3b, 0x2c, 0x51, 0xba, 0xc9, 0x85, 0xa2, 0x15, 0x90, 0xb6, 0x2f, 0x76, 0xf4, 0x5e, - 0xcd, 0xaf, 0xcd, 0xa2, 0x9d, 0x87, 0x55, 0xca, 0x00, 0x73, 0x3e, 0x8b, 0x7f, 0x56, 0x8f, 0x7d, - 0x22, 0xed, 0x3f, 0x16, 0xd5, 0x46, 0x8b, 0xea, 0x5d, 0x5f, 0x39, 0x67, 0x8c, 0xa2, 0xda, 0x14, - 0x18, 0x8e, 0x61, 0xa2, 0x7d, 0x28, 0x07, 0xa4, 0xdd, 0xb1, 0x8d, 0x20, 0x3c, 0x0a, 0xbf, 0x3e, - 0xe4, 0x17, 0x6c, 0x0b, 0x72, 0x7c, 0x96, 0x0a, 0xff, 0x61, 0xc9, 0x06, 0xb5, 0x61, 0xc2, 0xe7, - 0x67, 0x0a, 0x42, 0xcf, 0xae, 0x0d, 0xc9, 0x31, 0x3c, 0xa1, 0x60, 0xc6, 0x43, 0xfc, 0xc1, 0x21, - 0x0f, 0xf4, 0x15, 0x28, 0xb6, 0x2d, 0xc7, 0x72, 0xc5, 0x26, 0xc2, 0x9b, 0xf9, 0x0e, 0xa4, 0xa5, - 0x75, 0x4a, 0x9b, 0x4f, 0x03, 0xb2, 0xbf, 0x58, 0x19, 0xe6, 0x6c, 0x59, 0xfc, 0x9b, 0x29, 0x16, - 0xd5, 0x62, 0x8d, 0xfe, 0xc5, 0x9c, 0x65, 0x90, 0x6b, 0xf6, 0xf8, 0x6c, 0x14, 0x16, 0x63, 0xc9, - 0x1f, 0xdd, 0x83, 0xc2, 0x8e, 0x65, 0x13, 0x71, 0xbc, 0xfa, 0x46, 0xce, 0x72, 0x5c, 0xb3, 0x6c, - 0xc2, 0x65, 0x88, 0x02, 0x30, 0x2c, 0x9b, 0x60, 0xc6, 0x93, 0x35, 0x84, 0x47, 0x38, 0x0d, 0x71, - 0x40, 0x95, 0x77, 0x43, 0x60, 0x41, 0x3e, 0xd1, 0x10, 0x61, 0x31, 0x96, 0xfc, 0xd1, 0x6f, 0x6a, - 0xd1, 0x0e, 0x1b, 0x0f, 0x4a, 0x7c, 0x2b, 0x67, 0x59, 0xc4, 0x76, 0x0b, 0x17, 0x45, 0x2e, 0xdb, - 0x53, 0x7b, 0x6e, 0xf7, 0xa0, 0x60, 0xb4, 0xf7, 0x3b, 0x62, 0xa9, 0x92, 0x77, 0x8f, 0xd4, 0xda, - 0xfb, 0x9d, 0x44, 0x8f, 0xd4, 0xd6, 0xb7, 0x36, 0x31, 0xe3, 0x49, 0x87, 0xc6, 0x9e, 0xb1, 0xb3, - 0x17, 0x6e, 0xa6, 0xe4, 0x3d, 0x34, 0x6e, 0x52, 0xda, 0x89, 0xa1, 0xc1, 0xca, 0x30, 0x67, 0x4b, - 0xbf, 0xbd, 0xbd, 0x1f, 0x04, 0xd5, 0xc9, 0x91, 0x7c, 0xfb, 0xfa, 0x7e, 0x10, 0x24, 0xbe, 0x7d, - 0x7d, 0x6b, 0x7b, 0x1b, 0x33, 0x9e, 0x94, 0xb7, 0x63, 0x04, 0x7e, 0x75, 0x6a, 0x24, 0xbc, 0x37, - 0x8c, 0xc0, 0x4f, 0xf0, 0xde, 0xa8, 0x6d, 0xeb, 0x98, 0xf1, 0x44, 0x07, 0x30, 0xee, 0x3b, 0x7e, - 0x75, 0x9a, 0xb1, 0x7e, 0x3d, 0x67, 0xd6, 0xba, 0x23, 0x38, 0xcb, 0x08, 0x0b, 0x7d, 0x43, 0xc7, - 0x94, 0x21, 0xe3, 0xbb, 0xef, 0x57, 0x67, 0x46, 0xc3, 0x77, 0x3f, 0xc5, 0x77, 0x8b, 0xf2, 0xdd, - 0xf7, 0xd1, 0xd7, 0x35, 0x28, 0x75, 0xba, 0x0d, 0xbd, 0xdb, 0xa8, 0xce, 0x32, 0xde, 0x5f, 0xc8, - 0x99, 0xf7, 0x26, 0x23, 0xce, 0xd9, 0xcb, 0x35, 0x06, 0x2f, 0xc4, 0x82, 0x33, 0x13, 0x82, 0x73, - 0xad, 0xce, 0x8d, 0x44, 0x88, 0xeb, 0x8c, 0x5a, 0x42, 0x08, 0x5e, 0x88, 0x05, 0xe7, 0x50, 0x08, - 0xdb, 0x68, 0x54, 0xe7, 0x47, 0x25, 0x84, 0x6d, 0x64, 0x08, 0x61, 0x1b, 0x5c, 0x08, 0xdb, 0x68, - 0x50, 0xd5, 0xdf, 0x6d, 0xee, 0xf8, 0x55, 0x34, 0x12, 0xd5, 0xbf, 0xd1, 0xdc, 0x49, 0xaa, 0xfe, - 0x8d, 0x95, 0x6b, 0x3a, 0x66, 0x3c, 0xa9, 0xc9, 0xf1, 0x6d, 0xc3, 0xdc, 0xab, 0x9e, 0x19, 0x89, - 0xc9, 0xd1, 0x29, 0xed, 0x84, 0xc9, 0x61, 0x65, 0x98, 0xb3, 0x45, 0xbf, 0xa7, 0xc1, 0xa4, 0x08, - 0xb1, 0xba, 0xee, 0x59, 0xcd, 0xea, 0xd9, 0x7c, 0x3c, 0xc4, 0xa4, 0x18, 0x11, 0x07, 0x2e, 0x8c, - 0xdc, 0x5d, 0x50, 0x20, 0x58, 0x15, 0x04, 0xfd, 0xb1, 0x06, 0x33, 0x46, 0x2c, 0x98, 0xae, 0xfa, - 0x38, 0x93, 0xad, 0x91, 0xf7, 0x94, 0x10, 0x8f, 0xd8, 0x63, 0xe2, 0xc9, 0xdd, 0xd4, 0x38, 0x10, - 0x27, 0x24, 0x62, 0xea, 0xeb, 0x07, 0x9e, 0xd5, 0x21, 0xd5, 0x73, 0x23, 0x51, 0x5f, 0x9d, 0x11, - 0x4f, 0xa8, 0x2f, 0x2f, 0xc4, 0x82, 0x33, 0x9b, 0xba, 0x09, 0x77, 0xc9, 0xab, 0x4f, 0x8c, 0x64, - 0xea, 0x0e, 0x1d, 0xfe, 0xf8, 0xd4, 0x2d, 0x4a, 0x71, 0xc8, 0x9c, 0xea, 0xb2, 0x47, 0x9a, 0x96, - 0x5f, 0xad, 0x8e, 0x44, 0x97, 0x31, 0xa5, 0x9d, 0xd0, 0x65, 0x56, 0x86, 0x39, 0x5b, 0x6a, 0xce, - 0x1d, 0x7f, 0xbf, 0xfa, 0xe4, 0x48, 0xcc, 0xf9, 0x86, 0xbf, 0x9f, 0x30, 0xe7, 0x1b, 0xfa, 0x16, - 0xa6, 0x0c, 0x85, 0x39, 0xb7, 0x7d, 0xc3, 0xab, 0x2e, 0x8c, 0xc8, 0x9c, 0x53, 0xe2, 0x29, 0x73, - 0x4e, 0x0b, 0xb1, 0xe0, 0xcc, 0xb4, 0x80, 0x65, 0x51, 0x59, 0x66, 0xf5, 0x13, 0x23, 0xd1, 0x82, - 0xeb, 0x9c, 0x7a, 0x42, 0x0b, 0x44, 0x29, 0x0e, 0x99, 0xa3, 0xcb, 0x74, 0x55, 0xdb, 0xb1, 0x2d, - 0xd3, 0xf0, 0xab, 0x4f, 0x5d, 0xd4, 0x2e, 0x17, 0xb9, 0xe3, 0x83, 0x45, 0x19, 0x96, 0x50, 0xf4, - 0x43, 0x0d, 0x66, 0x13, 0xc7, 0x64, 0xd5, 0xa7, 0x99, 0xe8, 0x66, 0xce, 0xa2, 0xd7, 0xe3, 0x5c, - 0xf8, 0x27, 0xc8, 0xc0, 0x86, 0xe4, 0x09, 0x4d, 0x52, 0x28, 0xf4, 0x6d, 0x0d, 0x2a, 0xb2, 0xac, - 0x7a, 0x9e, 0x89, 0xf8, 0xf6, 0xa8, 0x44, 0xe4, 0xc2, 0xc9, 0x30, 0xbd, 0xe8, 0x44, 0x3e, 0x12, - 0x81, 0x59, 0x6d, 0xa6, 0xf3, 0x7a, 0xe0, 0x11, 0xa3, 0x5d, 0xbd, 0x30, 0x12, 0xab, 0x8d, 0x23, - 0x0e, 0x09, 0xab, 0xad, 0x40, 0xb0, 0x2a, 0x08, 0xeb, 0x52, 0x23, 0x1e, 0x25, 0x57, 0xbd, 0x38, - 0x92, 0x2e, 0x4d, 0xc6, 0xe2, 0xc5, 0xbb, 0x34, 0x01, 0xc5, 0x49, 0xa1, 0xd0, 0x5f, 0x6a, 0x30, - 0x6f, 0x24, 0xa3, 0x61, 0xab, 0xff, 0x8b, 0x89, 0x4a, 0x46, 0x21, 0x6a, 0x2c, 0xea, 0x96, 0x09, - 0xfb, 0xa4, 0x10, 0x76, 0x3e, 0x05, 0xc7, 0x69, 0xd1, 0x16, 0xba, 0x00, 0x91, 0x6b, 0x9d, 0xb1, - 0x7d, 0xb9, 0xa5, 0x6e, 0x5f, 0x4e, 0xbe, 0xf0, 0xf2, 0xc0, 0x1b, 0xc8, 0xfa, 0xff, 0xab, 0x79, - 0x81, 0xb5, 0x63, 0x98, 0x81, 0xb2, 0xf7, 0xb9, 0xf0, 0x1d, 0x0d, 0xa6, 0x63, 0xee, 0x74, 0x06, - 0xeb, 0xdd, 0x38, 0x6b, 0x9c, 0xff, 0x89, 0x9b, 0x2a, 0xd1, 0x6f, 0x69, 0x50, 0x91, 0x8e, 0x75, - 0x86, 0x34, 0xcd, 0xb8, 0x34, 0xc3, 0x6e, 0x14, 0x32, 0x56, 0xd9, 0x92, 0xd0, 0xb6, 0x89, 0x79, - 0xd8, 0xa3, 0x6f, 0x1b, 0xc9, 0x2e, 0x5b, 0xa2, 0x0f, 0x35, 0x98, 0x52, 0xfd, 0xec, 0x0c, 0x81, - 0x5a, 0x71, 0x81, 0xb6, 0xf2, 0x89, 0xa3, 0x39, 0xa2, 0xaf, 0xa4, 0xcb, 0x3d, 0xfa, 0xbe, 0x4a, - 0xe4, 0x41, 0xaa, 0x92, 0x7c, 0x4b, 0x03, 0x88, 0xfc, 0xef, 0x0c, 0x51, 0x48, 0x5c, 0x94, 0x61, - 0x8f, 0x68, 0x39, 0xaf, 0xde, 0xad, 0x22, 0x9d, 0xf1, 0xd1, 0xb7, 0x0a, 0x75, 0xf2, 0x7b, 0x48, - 0xf2, 0x4d, 0x0d, 0x2a, 0xd2, 0x35, 0x1f, 0x7d, 0xa3, 0x50, 0x97, 0x9f, 0x2f, 0x9e, 0xd3, 0xa2, - 0x7c, 0x43, 0x83, 0x72, 0xe8, 0xaa, 0x67, 0x48, 0x62, 0xc6, 0x25, 0x19, 0x36, 0xfc, 0x4b, 0xdf, - 0xd0, 0x7b, 0x34, 0x09, 0x93, 0x63, 0xff, 0xc4, 0xe4, 0xd8, 0xea, 0x25, 0xc7, 0xfb, 0x1a, 0x4c, - 0x2a, 0x6e, 0x7c, 0x86, 0x28, 0x3b, 0x71, 0x51, 0x86, 0x3d, 0x9d, 0x10, 0xcc, 0x7a, 0x4b, 0xa3, - 0xf8, 0xf3, 0xa3, 0x97, 0x46, 0x30, 0x3b, 0x52, 0x9a, 0xd0, 0xb1, 0x3f, 0x11, 0x69, 0x28, 0xb3, - 0xde, 0xc3, 0x59, 0x3a, 0xf9, 0xa3, 0x1f, 0xce, 0x37, 0x56, 0xae, 0xe9, 0x47, 0x18, 0xb9, 0xc8, - 0xe3, 0x1f, 0xfd, 0x78, 0xe6, 0xbc, 0xb2, 0x65, 0xf9, 0x9e, 0x06, 0x73, 0x49, 0xb7, 0x3f, 0x43, - 0xa2, 0xbd, 0xb8, 0x44, 0xc3, 0xa6, 0x77, 0xab, 0x1c, 0xb3, 0xe5, 0xfa, 0x23, 0x0d, 0xce, 0x64, - 0xb8, 0xfc, 0x19, 0xa2, 0x39, 0x71, 0xd1, 0xde, 0x18, 0x55, 0x66, 0x60, 0x52, 0xb3, 0x15, 0x9f, - 0x7f, 0xf4, 0x9a, 0x2d, 0x98, 0xf5, 0x5e, 0x4e, 0xa8, 0xbe, 0xff, 0xe8, 0x97, 0x13, 0xe9, 0xd0, - 0x82, 0xa4, 0x7e, 0x47, 0xbb, 0x00, 0xa3, 0xd7, 0x6f, 0xce, 0xab, 0xf7, 0x3c, 0x11, 0xee, 0x09, - 0x8c, 0x7e, 0x9e, 0xd8, 0xd0, 0xb7, 0x8e, 0x9c, 0x27, 0xe4, 0xfe, 0xc0, 0x49, 0xcc, 0x13, 0x8c, - 0x59, 0x6f, 0x8d, 0x51, 0xf7, 0x09, 0x46, 0xaf, 0x31, 0x21, 0xb7, 0x6c, 0x79, 0xbe, 0xaf, 0x29, - 0x89, 0x2c, 0x8a, 0xf3, 0x9f, 0x21, 0x97, 0x1b, 0x97, 0xeb, 0xcd, 0x91, 0x45, 0xd2, 0xaa, 0xf2, - 0x7d, 0xa4, 0xc1, 0x4c, 0xdc, 0xf3, 0xcf, 0x90, 0xcc, 0x8a, 0x4b, 0xa6, 0x8f, 0x20, 0x49, 0x26, - 0x69, 0xb9, 0x93, 0xae, 0xff, 0xe8, 0x2d, 0xb7, 0xca, 0xb1, 0x77, 0x5f, 0x66, 0x79, 0xfd, 0xa3, - 0xef, 0xcb, 0xde, 0x79, 0x7f, 0xaa, 0x7c, 0x3f, 0xd0, 0xe0, 0x5c, 0xb6, 0xab, 0x9f, 0x21, 0xe1, - 0x7e, 0x5c, 0xc2, 0xb7, 0x46, 0x98, 0xd8, 0xab, 0x86, 0x32, 0x05, 0xb1, 0xc0, 0x12, 0x1e, 0x75, - 0x82, 0xde, 0x95, 0x71, 0x2e, 0x3c, 0x1c, 0xe4, 0x33, 0x83, 0xef, 0x1d, 0x1c, 0x1d, 0xce, 0xf2, - 0xd7, 0x05, 0x98, 0x4d, 0xf8, 0xd1, 0xec, 0x22, 0x05, 0xfa, 0x97, 0xdd, 0x3a, 0xa4, 0xc5, 0x53, - 0x53, 0xaf, 0x86, 0x00, 0x1c, 0xe1, 0xa0, 0x8f, 0x34, 0x98, 0xbd, 0x63, 0x04, 0xe6, 0xee, 0xa6, - 0x11, 0xec, 0xf2, 0x98, 0xa4, 0x9c, 0x56, 0x54, 0xaf, 0xc7, 0xa9, 0x46, 0xbb, 0x48, 0x09, 0x00, - 0x4e, 0xf2, 0x47, 0xcf, 0xc2, 0x44, 0xc7, 0xb5, 0x6d, 0xcb, 0x69, 0x89, 0xeb, 0x23, 0xe4, 0xb6, - 0xe8, 0x26, 0x2f, 0xc6, 0x21, 0x3c, 0x7e, 0xed, 0x4f, 0x21, 0x97, 0xd3, 0xfe, 0x44, 0x93, 0x1e, - 0x2b, 0x08, 0xaf, 0xf8, 0xa8, 0x04, 0xe1, 0xfd, 0x43, 0x01, 0x50, 0xda, 0xd6, 0x3f, 0xec, 0x62, - 0xac, 0x4b, 0x50, 0x32, 0x23, 0x55, 0x51, 0xc2, 0x66, 0x45, 0x8f, 0x0a, 0x28, 0x0f, 0x68, 0xf7, - 0x89, 0xd9, 0xf5, 0x48, 0xfa, 0x1e, 0x14, 0x5e, 0x8e, 0x25, 0xc6, 0x80, 0x69, 0xfe, 0x1f, 0xa6, - 0x83, 0xd2, 0xdf, 0xcd, 0x7d, 0xd2, 0x1b, 0xa0, 0xf3, 0x6f, 0xb3, 0x6b, 0x4f, 0x76, 0x45, 0xde, - 0x4c, 0x69, 0xe0, 0x64, 0xd7, 0x9a, 0xac, 0x8c, 0x15, 0x42, 0xa7, 0x73, 0x29, 0xc0, 0x70, 0x3a, - 0xf5, 0xf7, 0x1a, 0xcc, 0x70, 0x47, 0xb3, 0xd6, 0xe9, 0x2c, 0x7b, 0xa4, 0xe9, 0xd3, 0xc6, 0xe9, - 0x78, 0xd6, 0x81, 0x11, 0x90, 0x30, 0x27, 0x63, 0xb0, 0xc6, 0xd9, 0x94, 0x95, 0xb1, 0x42, 0x08, - 0x3d, 0x03, 0x45, 0xa3, 0xd3, 0x59, 0x5d, 0x61, 0x32, 0x8c, 0x47, 0xe7, 0x57, 0x35, 0x5a, 0x88, - 0x39, 0x0c, 0xbd, 0x02, 0x33, 0x96, 0xe3, 0x07, 0x86, 0x6d, 0xb3, 0xe0, 0xcf, 0xd5, 0x15, 0xa6, - 0x8a, 0xe3, 0xd1, 0x69, 0xe4, 0x6a, 0x0c, 0x8a, 0x13, 0xd8, 0x8b, 0x7f, 0x33, 0x09, 0xf3, 0x29, - 0xbf, 0x19, 0x2d, 0xc0, 0x98, 0xc5, 0xa3, 0xe5, 0xc7, 0xeb, 0x20, 0x28, 0x8d, 0xad, 0xae, 0xe0, - 0x31, 0xab, 0xa9, 0xa6, 0xd5, 0x8d, 0x9d, 0x5c, 0x5a, 0x9d, 0x4c, 0x30, 0x1d, 0xef, 0x37, 0xc1, - 0x34, 0x4a, 0x62, 0x11, 0x49, 0x20, 0x19, 0x59, 0x78, 0x51, 0xe2, 0x0b, 0x56, 0xf0, 0xfb, 0x4a, - 0x53, 0xbb, 0x05, 0x65, 0xa3, 0x63, 0x1d, 0x23, 0x47, 0x8d, 0x9d, 0x6c, 0xd5, 0x36, 0x57, 0x79, - 0x82, 0x9a, 0x24, 0x32, 0xf2, 0xec, 0x34, 0xd5, 0x5c, 0x95, 0x1f, 0x6a, 0xae, 0x2e, 0x41, 0xc9, - 0x30, 0x03, 0xeb, 0x80, 0x88, 0x3c, 0x33, 0x69, 0x04, 0x6b, 0xac, 0x14, 0x0b, 0xa8, 0xb8, 0x5e, - 0x31, 0x08, 0x27, 0x65, 0x48, 0x5d, 0xaf, 0x18, 0x82, 0xb0, 0x8a, 0x87, 0x5e, 0x86, 0x69, 0xae, - 0x34, 0x61, 0x86, 0xdc, 0x24, 0xab, 0x28, 0xef, 0xe5, 0xb8, 0xae, 0x02, 0x71, 0x1c, 0x17, 0xd5, - 0x60, 0x96, 0x17, 0xdc, 0xee, 0xd8, 0xae, 0xd1, 0xa4, 0xd5, 0xa7, 0xe2, 0x5a, 0x71, 0x3d, 0x0e, - 0xc6, 0x49, 0xfc, 0x1e, 0x29, 0x75, 0xd3, 0xc7, 0x4a, 0xa9, 0xfb, 0x40, 0xb5, 0xd5, 0x3c, 0x2e, - 0xe8, 0x9d, 0xbc, 0x77, 0xb2, 0x06, 0x30, 0xd5, 0xef, 0x25, 0x13, 0x3f, 0x79, 0xb8, 0xd0, 0xb0, - 0xa6, 0x95, 0x0e, 0xaf, 0xa6, 0x9a, 0xda, 0xd9, 0x57, 0xc2, 0xe7, 0x67, 0x60, 0xda, 0xf5, 0x5a, - 0x86, 0x63, 0xdd, 0x63, 0x06, 0xc7, 0x67, 0x61, 0x43, 0x15, 0xae, 0xad, 0xb7, 0x54, 0x00, 0x8e, - 0xe3, 0xa1, 0x7b, 0x50, 0x69, 0x85, 0x56, 0xb6, 0x3a, 0x9f, 0x8b, 0x9d, 0x89, 0x5b, 0x6d, 0x1e, - 0xa7, 0x2e, 0xcb, 0x70, 0xc4, 0x4e, 0x99, 0x95, 0xd0, 0xa3, 0x32, 0x2b, 0xbd, 0x57, 0x66, 0x66, - 0x3c, 0xbe, 0xe1, 0x78, 0x4a, 0x19, 0xd0, 0x9f, 0x85, 0x8a, 0x48, 0x3e, 0x14, 0x73, 0x57, 0xa5, - 0xfe, 0x09, 0xa1, 0x2a, 0x67, 0x52, 0x09, 0xd0, 0xab, 0x2b, 0x38, 0xc2, 0x56, 0x0c, 0xef, 0x78, - 0xbf, 0xf9, 0xc1, 0x85, 0xfc, 0xf2, 0x83, 0x75, 0x78, 0x9c, 0x27, 0x82, 0xe9, 0xfa, 0xda, 0x6b, - 0xc4, 0xb3, 0x76, 0x2c, 0x93, 0xe7, 0x81, 0xf1, 0xdb, 0x96, 0x9e, 0x16, 0x1f, 0xf1, 0xf8, 0xd5, - 0x2c, 0x24, 0x9c, 0x5d, 0x57, 0x58, 0x3a, 0xdb, 0x90, 0x96, 0xae, 0x94, 0xb2, 0x74, 0x11, 0x10, - 0xc7, 0x71, 0x7b, 0x98, 0xa9, 0xf2, 0xf0, 0x66, 0xaa, 0x92, 0x97, 0x99, 0x8a, 0x6b, 0xdc, 0x00, - 0x66, 0xea, 0x32, 0x94, 0x45, 0xbf, 0xfb, 0x2c, 0x74, 0xb6, 0x22, 0x32, 0xb2, 0x44, 0x19, 0x96, - 0x50, 0xda, 0xe1, 0x3e, 0xeb, 0x49, 0xde, 0xe1, 0x93, 0x03, 0x77, 0xb8, 0x1e, 0xd5, 0xc6, 0x2a, - 0x29, 0x65, 0xa0, 0x4f, 0x9d, 0x60, 0xd2, 0xf1, 0x22, 0x94, 0x5a, 0x9e, 0xdb, 0xed, 0xf0, 0xe0, - 0x55, 0xa1, 0xe4, 0xd7, 0x59, 0x09, 0x16, 0x90, 0xe1, 0x8c, 0xc1, 0xf7, 0x2b, 0x30, 0x9b, 0xd8, - 0xf1, 0xcf, 0xf4, 0x84, 0xb5, 0x53, 0xf6, 0x84, 0x2f, 0x42, 0x21, 0xa0, 0x8b, 0x86, 0xb1, 0x78, - 0x7a, 0x24, 0x5b, 0x2d, 0x30, 0x08, 0x1d, 0x3c, 0xe6, 0x2e, 0x31, 0xf7, 0xc2, 0x04, 0x61, 0xb1, - 0xfa, 0x93, 0x83, 0x67, 0x59, 0x05, 0xe2, 0x38, 0x2e, 0xfa, 0x3f, 0x50, 0x31, 0x9a, 0x4d, 0x8f, - 0xf8, 0xbe, 0xb8, 0xfd, 0xa0, 0xc2, 0x6d, 0x7e, 0x2d, 0x2c, 0xc4, 0x11, 0x9c, 0xae, 0x8e, 0x76, - 0x9b, 0x3b, 0xfe, 0x6d, 0x5f, 0xf8, 0xb7, 0x4a, 0xce, 0x30, 0x6d, 0x4a, 0x5a, 0x8e, 0x25, 0x06, - 0x6a, 0xc2, 0xec, 0x9e, 0xd7, 0x58, 0x5e, 0x36, 0xcc, 0x5d, 0x72, 0x1c, 0x9f, 0x88, 0xdd, 0x4a, - 0x78, 0x33, 0x4e, 0x01, 0x27, 0x49, 0x0a, 0x2e, 0x37, 0xc9, 0x61, 0x60, 0x34, 0x8e, 0xb3, 0x26, - 0x0c, 0xb9, 0xa8, 0x14, 0x70, 0x92, 0x24, 0x5d, 0xc1, 0xed, 0x79, 0x8d, 0x30, 0xb5, 0x52, 0x5c, - 0x55, 0x20, 0x57, 0x70, 0x37, 0x23, 0x10, 0x56, 0xf1, 0x68, 0x83, 0xed, 0x79, 0x0d, 0x4c, 0x0c, - 0xbb, 0x2d, 0x6e, 0x83, 0x92, 0x0d, 0x76, 0x53, 0x94, 0x63, 0x89, 0x81, 0x3a, 0x80, 0xe8, 0xd7, - 0xb1, 0x7e, 0x97, 0xb9, 0x61, 0x22, 0x9b, 0xef, 0x72, 0xd6, 0xd7, 0x48, 0x24, 0xf5, 0x83, 0xce, - 0x51, 0x73, 0x77, 0x33, 0x45, 0x07, 0x67, 0xd0, 0x46, 0x6f, 0xc2, 0x13, 0x7b, 0x5e, 0x43, 0x6c, - 0xc0, 0x6d, 0x7a, 0x96, 0x63, 0x5a, 0x1d, 0x83, 0x27, 0xab, 0x4e, 0xc6, 0x2f, 0xaf, 0xba, 0x99, - 0x8d, 0x86, 0x7b, 0xd5, 0x8f, 0x6f, 0xcb, 0x4c, 0xe5, 0xb2, 0x2d, 0x93, 0x18, 0xae, 0xc7, 0xda, - 0x96, 0x99, 0x7e, 0x54, 0x16, 0x2b, 0x3f, 0xd2, 0x00, 0xb1, 0x58, 0x87, 0xf0, 0xf6, 0x75, 0x66, - 0xfc, 0xd0, 0x15, 0xa8, 0x30, 0xeb, 0xa7, 0x64, 0x5f, 0xc9, 0xdd, 0xbd, 0xeb, 0x21, 0x00, 0x47, - 0x38, 0xd4, 0x47, 0x71, 0xed, 0x26, 0x91, 0x29, 0xd3, 0xd2, 0x47, 0xb9, 0xc5, 0x4a, 0xb1, 0x80, - 0xa2, 0xeb, 0x30, 0xef, 0x91, 0x86, 0x61, 0x1b, 0x8e, 0x49, 0xf4, 0xc0, 0x33, 0x02, 0xd2, 0x3a, - 0x14, 0x96, 0x44, 0xc6, 0x53, 0xe1, 0x24, 0x02, 0x4e, 0xd7, 0x59, 0xfc, 0xe7, 0x32, 0xcc, 0x25, - 0x83, 0x34, 0x1e, 0xb6, 0x9b, 0x74, 0x05, 0x2a, 0x1d, 0xc3, 0x0b, 0x2c, 0x25, 0xa1, 0x5c, 0x7e, - 0xd5, 0x66, 0x08, 0xc0, 0x11, 0x0e, 0x75, 0xfb, 0xd9, 0xdd, 0x7a, 0x42, 0x42, 0xe9, 0xf6, 0xb3, - 0xbb, 0xf7, 0x30, 0x87, 0x65, 0x67, 0x29, 0x17, 0x4e, 0x2c, 0x4b, 0xf9, 0x63, 0x71, 0x59, 0xdf, - 0xfb, 0xe9, 0xcb, 0xfa, 0xde, 0xce, 0x39, 0x02, 0x67, 0x30, 0xb7, 0x6b, 0xda, 0x54, 0xf5, 0x59, - 0x64, 0x65, 0x6f, 0xe5, 0x21, 0x52, 0x6c, 0xa0, 0x70, 0xef, 0x29, 0x56, 0x84, 0xe3, 0xac, 0xd1, - 0x26, 0x9c, 0xb5, 0xad, 0xb6, 0xc5, 0x4f, 0x6b, 0xfc, 0x4d, 0xe2, 0xe9, 0xc4, 0x74, 0x9d, 0x26, - 0x33, 0xd4, 0xe3, 0xd1, 0x46, 0xc8, 0x5a, 0x06, 0x0e, 0xce, 0xac, 0x89, 0x9e, 0x85, 0x89, 0x03, - 0xe2, 0xb1, 0x2c, 0x52, 0x88, 0xdf, 0x90, 0xfb, 0x1a, 0x2f, 0xc6, 0x21, 0x1c, 0xbd, 0x09, 0x05, - 0xdf, 0xf0, 0x6d, 0xb1, 0x50, 0x3b, 0x46, 0x50, 0x61, 0x4d, 0x5f, 0x13, 0xea, 0xc1, 0xae, 0x22, - 0xa3, 0xff, 0x31, 0x23, 0x79, 0x4a, 0x0b, 0xb6, 0x68, 0x43, 0x78, 0xfa, 0xa8, 0x0d, 0xe1, 0xe1, - 0x8c, 0xe2, 0x0f, 0x4a, 0x30, 0x9b, 0x88, 0xba, 0x7a, 0x98, 0x69, 0x91, 0x96, 0x62, 0xec, 0x08, - 0x4b, 0xf1, 0x1c, 0x94, 0x4d, 0xdb, 0x22, 0x4e, 0xb0, 0xda, 0x14, 0x16, 0x25, 0xca, 0x6d, 0xe4, - 0xe5, 0x2b, 0x58, 0x62, 0x9c, 0xb6, 0x5d, 0x51, 0x0d, 0x40, 0xb1, 0xdf, 0xdb, 0x0f, 0x4a, 0xa3, - 0x7c, 0x6c, 0x21, 0x9f, 0x1c, 0xcb, 0x44, 0xc7, 0x7e, 0xec, 0x6f, 0xfe, 0x0c, 0x2f, 0xf0, 0xaf, - 0xe4, 0x7d, 0x81, 0xff, 0x70, 0x63, 0xe4, 0xef, 0xc6, 0xa0, 0xbc, 0x51, 0xdb, 0xd6, 0xd9, 0x8d, - 0x98, 0x6f, 0xc5, 0xef, 0xfc, 0x1c, 0x46, 0xc8, 0xf4, 0xe5, 0x9e, 0xd7, 0xe8, 0xd0, 0x1a, 0xf8, - 0x5e, 0xcf, 0x0a, 0x1f, 0x7d, 0xd4, 0xcf, 0xe4, 0xd5, 0xd1, 0x32, 0x14, 0x9c, 0xbd, 0x41, 0xef, - 0x2c, 0x67, 0x6d, 0xb6, 0x71, 0x93, 0x1c, 0x62, 0x56, 0x19, 0xdd, 0x06, 0x30, 0x3d, 0xd2, 0x24, - 0x4e, 0x60, 0x89, 0x27, 0x63, 0x06, 0x3b, 0x5f, 0x58, 0x96, 0x95, 0xb1, 0x42, 0x68, 0xf1, 0x9b, - 0x25, 0x98, 0x4b, 0x46, 0x57, 0x3e, 0xcc, 0xe4, 0x3c, 0x0b, 0x13, 0x7e, 0x97, 0xdd, 0xb4, 0x20, - 0x8c, 0x8e, 0x9c, 0x06, 0x74, 0x5e, 0x8c, 0x43, 0x78, 0xb6, 0x29, 0x19, 0x3f, 0x15, 0x53, 0x52, - 0xe8, 0xd7, 0x94, 0xe4, 0xbd, 0xa0, 0x79, 0x3f, 0x7d, 0x1d, 0xf7, 0xdb, 0x39, 0xc7, 0xc3, 0x0e, - 0x60, 0x4b, 0x88, 0x18, 0xd5, 0x13, 0xb9, 0xdc, 0x51, 0x10, 0x0e, 0xc4, 0xd4, 0x7d, 0xa1, 0x8f, - 0xe0, 0xd5, 0x51, 0x3f, 0x2b, 0xc2, 0x4c, 0x3c, 0x5c, 0x8a, 0xba, 0xc5, 0xbb, 0xae, 0x1f, 0x88, - 0xcd, 0x82, 0xe4, 0xbb, 0x51, 0x37, 0x22, 0x10, 0x56, 0xf1, 0xfa, 0x9b, 0x93, 0x9f, 0x85, 0x09, - 0x71, 0x29, 0x92, 0x98, 0x92, 0xe5, 0x28, 0x12, 0x17, 0x27, 0xe1, 0x10, 0xfe, 0x3f, 0x13, 0xb2, - 0xed, 0xa3, 0x6f, 0xa5, 0x27, 0xe4, 0xb7, 0x72, 0x8d, 0x8d, 0xfb, 0xb8, 0xcf, 0xc7, 0xc3, 0x29, - 0xf7, 0x9b, 0x30, 0x9f, 0x3a, 0xbc, 0xe9, 0xef, 0x82, 0xd6, 0x0b, 0x50, 0x74, 0x8c, 0x36, 0xe1, - 0xf7, 0xb2, 0x54, 0xf8, 0xf4, 0xc6, 0xee, 0xf0, 0xc6, 0xbc, 0x7c, 0xf1, 0x87, 0x25, 0x98, 0x4f, - 0xc5, 0x80, 0x33, 0x97, 0x57, 0x1e, 0x00, 0x24, 0x1c, 0xf9, 0xcc, 0x6d, 0xff, 0x57, 0x60, 0x86, - 0x0d, 0x8c, 0xcd, 0xc4, 0xb1, 0x81, 0x3c, 0xc4, 0xde, 0x8e, 0x41, 0x71, 0x02, 0xbb, 0x3f, 0x97, - 0xf9, 0x15, 0x98, 0x51, 0x2f, 0x9d, 0x5f, 0x5d, 0x11, 0xc7, 0xc2, 0x92, 0x89, 0x1e, 0x83, 0xe2, - 0x04, 0x36, 0xbb, 0xb1, 0x5f, 0x4e, 0x9e, 0x62, 0x3b, 0xae, 0x38, 0xf8, 0x8d, 0xfd, 0x09, 0x12, - 0x38, 0x45, 0x14, 0x35, 0x60, 0x81, 0x6f, 0xdf, 0xab, 0x02, 0xc9, 0xcd, 0x7f, 0xee, 0x17, 0x2f, - 0x0a, 0xa1, 0x17, 0x56, 0x7a, 0x62, 0xe2, 0x23, 0xa8, 0x0c, 0x78, 0xcd, 0xd8, 0x07, 0xe9, 0xe7, - 0xc7, 0xde, 0xc9, 0x3b, 0x73, 0xe0, 0x58, 0x63, 0xb0, 0xf2, 0xa8, 0x8c, 0xc1, 0x1f, 0x4e, 0xd2, - 0x81, 0x92, 0x08, 0x82, 0x45, 0x8b, 0x50, 0x62, 0xba, 0x49, 0xa7, 0x17, 0x79, 0x12, 0xc0, 0x94, - 0xd6, 0xc7, 0x02, 0xd2, 0xc7, 0x26, 0xb9, 0x58, 0xb2, 0x8d, 0xf7, 0x58, 0xb2, 0x75, 0xe0, 0x4c, - 0x60, 0xfb, 0xdb, 0x5e, 0xd7, 0x0f, 0x96, 0x89, 0x17, 0xf8, 0x42, 0x75, 0x0b, 0x03, 0xbf, 0xd9, - 0xb3, 0xbd, 0xa6, 0x27, 0xa9, 0xe0, 0x2c, 0xd2, 0x54, 0x81, 0x03, 0xdb, 0xaf, 0xd9, 0xb6, 0x7b, - 0x27, 0x8c, 0x2c, 0x88, 0x26, 0x1b, 0x31, 0x8d, 0x48, 0x05, 0xde, 0x5e, 0xd3, 0x7b, 0x60, 0xe2, - 0x23, 0xa8, 0xa0, 0x75, 0xf6, 0x55, 0xaf, 0x19, 0xb6, 0xd5, 0x34, 0x02, 0x42, 0xa7, 0x63, 0xb6, - 0x7b, 0xcd, 0x47, 0x87, 0x3c, 0x6e, 0xdc, 0x5e, 0xd3, 0x93, 0x28, 0x38, 0xab, 0xde, 0xa8, 0xde, - 0xed, 0xcb, 0x9c, 0xbd, 0xcb, 0xa7, 0x32, 0x7b, 0x57, 0x06, 0x1b, 0xe5, 0x90, 0xd3, 0x28, 0x4f, - 0xa8, 0xfc, 0x00, 0xa3, 0xbc, 0x09, 0xb3, 0xf2, 0x55, 0x04, 0xa1, 0xb3, 0x93, 0x03, 0x9f, 0x7e, - 0xd4, 0xe2, 0x14, 0x70, 0x92, 0xe4, 0x29, 0xed, 0x28, 0xfd, 0x85, 0x06, 0x73, 0x54, 0x92, 0x5a, - 0xb0, 0x4b, 0x9c, 0x7b, 0x9b, 0x86, 0x67, 0xb4, 0xc3, 0xab, 0x6c, 0x76, 0x72, 0x6f, 0xf2, 0x5a, - 0x82, 0x11, 0x6f, 0x7a, 0x79, 0xbf, 0x68, 0x12, 0x8c, 0x53, 0x92, 0xd1, 0xa9, 0x2f, 0x2a, 0x3b, - 0xce, 0xe3, 0x7b, 0x67, 0xe3, 0x8c, 0xc2, 0xa9, 0x2f, 0x49, 0x74, 0x28, 0x1b, 0xbb, 0xb0, 0x0c, - 0x8f, 0x67, 0x7e, 0xea, 0x40, 0x86, 0xfa, 0x1b, 0x25, 0x11, 0xc8, 0x9e, 0x83, 0x2f, 0x90, 0xf7, - 0x13, 0x1b, 0x74, 0x61, 0xe5, 0xc8, 0x27, 0x58, 0x12, 0x4f, 0xf3, 0x44, 0x8f, 0xae, 0x44, 0x38, - 0x68, 0x01, 0xc6, 0x9a, 0x0d, 0x66, 0xea, 0x8b, 0x51, 0x1c, 0xdf, 0x4a, 0x1d, 0x8f, 0x35, 0x1b, - 0xe8, 0x32, 0x94, 0x85, 0x93, 0x11, 0x86, 0xb9, 0x31, 0xb6, 0xc2, 0x03, 0xf1, 0xb1, 0x84, 0x8e, - 0x6a, 0x59, 0x3f, 0x82, 0xfd, 0xfb, 0x64, 0xcf, 0x7d, 0xec, 0x37, 0xda, 0x06, 0xb3, 0xd0, 0xcf, - 0x29, 0xb7, 0xe7, 0x42, 0x7c, 0x2f, 0x37, 0x7d, 0x35, 0xee, 0x70, 0x0b, 0x96, 0xbf, 0x2a, 0xc1, - 0xb9, 0xec, 0xf4, 0x8a, 0x8f, 0xcd, 0x68, 0xe0, 0xca, 0x3d, 0x9e, 0xa9, 0xdc, 0x9f, 0x84, 0x09, - 0x9f, 0x09, 0x1e, 0x9e, 0xfc, 0xf3, 0x7b, 0x0d, 0x79, 0x11, 0x0e, 0x61, 0xe8, 0x55, 0x40, 0x6d, - 0xe3, 0xee, 0xba, 0xdf, 0x5a, 0x76, 0xbb, 0xec, 0xaa, 0x56, 0x4c, 0x0c, 0x7e, 0x8f, 0x70, 0x31, - 0x8a, 0xaf, 0x59, 0x4f, 0x61, 0xe0, 0x8c, 0x5a, 0x2c, 0x56, 0x21, 0x76, 0xfe, 0x93, 0x08, 0xf4, - 0x39, 0xf2, 0xc0, 0x66, 0x44, 0xeb, 0x8f, 0x8f, 0xd2, 0x0b, 0x77, 0x73, 0x24, 0x39, 0x37, 0x1f, - 0xf7, 0xd5, 0xfb, 0x49, 0x0e, 0x9d, 0x9f, 0x17, 0xe0, 0x4c, 0xc6, 0x9d, 0x0b, 0x71, 0xeb, 0xad, - 0xf5, 0x61, 0xbd, 0xf7, 0x65, 0x4b, 0xe5, 0x13, 0x68, 0x1d, 0x0a, 0x75, 0x44, 0x33, 0x7d, 0xa0, - 0xc1, 0x59, 0x76, 0xc0, 0x1e, 0x9e, 0xea, 0x85, 0x77, 0x4d, 0x8e, 0x0b, 0xcd, 0xec, 0xeb, 0xd2, - 0xd7, 0xeb, 0x19, 0x14, 0xa2, 0x53, 0xc7, 0x2c, 0x28, 0xce, 0xe4, 0x8a, 0x96, 0x01, 0x64, 0x32, - 0x4f, 0x38, 0x92, 0x9f, 0x61, 0x57, 0xd7, 0xca, 0xd2, 0xff, 0x64, 0x87, 0xf7, 0x4a, 0x6b, 0x33, - 0xcf, 0x48, 0xa9, 0x36, 0x8a, 0x0b, 0xfe, 0x33, 0xba, 0xb7, 0xff, 0x11, 0x30, 0x9c, 0x76, 0xfd, - 0xf9, 0x38, 0xcc, 0xc4, 0x3b, 0x12, 0x5d, 0x82, 0x52, 0xc7, 0x23, 0x3b, 0xd6, 0xdd, 0xe4, 0x3d, - 0xef, 0x9b, 0xac, 0x14, 0x0b, 0x28, 0x72, 0xa1, 0x64, 0x1b, 0x0d, 0x3a, 0xdf, 0xf3, 0x7b, 0x76, - 0xaf, 0x0f, 0x7d, 0x67, 0x6c, 0x78, 0xca, 0x10, 0x32, 0x5c, 0x63, 0xe4, 0xb1, 0x60, 0x43, 0x19, - 0xee, 0x58, 0xc4, 0x6e, 0xf2, 0x70, 0xce, 0x51, 0x30, 0xbc, 0xc6, 0xc8, 0x63, 0xc1, 0x06, 0xbd, - 0x05, 0x15, 0x7e, 0x39, 0x7e, 0xb3, 0x7e, 0x28, 0x3c, 0xdc, 0xff, 0xdd, 0x9f, 0xca, 0x6e, 0x5b, - 0x6d, 0x12, 0x0d, 0xc7, 0xe5, 0x90, 0x08, 0x8e, 0xe8, 0xb1, 0xa7, 0x7f, 0x77, 0x02, 0xe2, 0xe9, - 0x81, 0xe1, 0x85, 0x2f, 0xf3, 0x46, 0x4f, 0xff, 0x4a, 0x08, 0x56, 0xb0, 0x16, 0xff, 0xb5, 0x04, - 0x33, 0xf1, 0x7b, 0x23, 0x4e, 0x29, 0x28, 0xf7, 0x39, 0x28, 0xb3, 0x0d, 0x85, 0x9a, 0xe7, 0x24, - 0x5f, 0xdf, 0xd8, 0x16, 0xe5, 0x58, 0x62, 0x20, 0x0c, 0x15, 0xe3, 0x78, 0xef, 0xed, 0xf2, 0x08, - 0x3b, 0xf9, 0xd2, 0x6e, 0x44, 0x86, 0xd2, 0xf4, 0x43, 0xf4, 0xc1, 0x76, 0x1f, 0x18, 0x4d, 0x59, - 0x8c, 0x23, 0x32, 0x54, 0xf3, 0x3d, 0xd2, 0x0a, 0x77, 0x15, 0x14, 0xcd, 0xc7, 0xac, 0x14, 0x0b, - 0x28, 0x7a, 0x16, 0x26, 0x3c, 0xd7, 0x26, 0x35, 0xbc, 0x21, 0x66, 0x65, 0xb9, 0xe1, 0x8e, 0x79, - 0x31, 0x0e, 0xe1, 0xa3, 0xd8, 0x6c, 0x8e, 0x2b, 0xc0, 0x00, 0x53, 0xe5, 0x75, 0x98, 0x3f, 0x10, - 0x3b, 0x15, 0xba, 0xd5, 0x72, 0x8c, 0x20, 0xca, 0xdd, 0x90, 0x81, 0x4b, 0xaf, 0x25, 0x11, 0x70, - 0xba, 0xce, 0xe9, 0xcd, 0xb9, 0xc4, 0x69, 0x76, 0x5c, 0xcb, 0x09, 0x92, 0x73, 0xee, 0x55, 0x51, - 0x8e, 0x25, 0xc6, 0x70, 0x56, 0xf1, 0x6f, 0x27, 0x60, 0x26, 0x7e, 0x2f, 0x4a, 0x5c, 0x87, 0xb5, - 0x11, 0xe8, 0xf0, 0x58, 0xde, 0x3a, 0x3c, 0x7e, 0xa4, 0x0e, 0x3f, 0x03, 0x45, 0xf6, 0x48, 0xab, - 0xd8, 0xb6, 0x96, 0x9b, 0xdc, 0x2c, 0x83, 0x17, 0x73, 0x18, 0xaa, 0xc1, 0xec, 0x1d, 0xc3, 0x0a, - 0xa8, 0x35, 0xe3, 0x81, 0x3b, 0xfc, 0x4c, 0x73, 0x5c, 0x8d, 0xca, 0x8d, 0x81, 0x71, 0x12, 0x7f, - 0x90, 0xb1, 0x32, 0xd8, 0x2e, 0xf2, 0x2b, 0x30, 0xc3, 0x84, 0x14, 0xcf, 0x32, 0xaf, 0x36, 0x45, - 0xac, 0xa9, 0xdc, 0x80, 0xdf, 0x52, 0xa1, 0x2b, 0x38, 0x81, 0x1d, 0x1f, 0x99, 0x95, 0x7c, 0x46, - 0xe6, 0xd6, 0x31, 0x47, 0xa6, 0x78, 0x86, 0x19, 0x7a, 0x3c, 0xc3, 0x7c, 0x3a, 0xaf, 0x59, 0xa9, - 0xe3, 0x6d, 0xea, 0x61, 0xe3, 0x0d, 0xbd, 0x05, 0x53, 0x3e, 0xbf, 0xf1, 0x9f, 0xc7, 0xd5, 0x4f, - 0x0f, 0xa2, 0xce, 0x73, 0x0f, 0xee, 0x5f, 0x98, 0xd2, 0x95, 0xea, 0x38, 0x46, 0x6c, 0xb8, 0xc1, - 0xfc, 0x55, 0x28, 0x87, 0x8c, 0x68, 0x43, 0xcb, 0x7a, 0x51, 0x43, 0xd3, 0x21, 0xc4, 0x88, 0x5c, - 0x81, 0x8a, 0xdb, 0x21, 0xb1, 0xe7, 0x7a, 0xe4, 0x24, 0x7e, 0x2b, 0x04, 0xe0, 0x08, 0x87, 0x8e, - 0x22, 0xce, 0x35, 0x71, 0x54, 0xf4, 0x1a, 0x2d, 0x14, 0x42, 0x2c, 0x7e, 0x4d, 0x83, 0xf0, 0x0e, - 0x7c, 0xb4, 0x02, 0xc5, 0x8e, 0xeb, 0x05, 0x7c, 0x8b, 0x7e, 0xf2, 0x85, 0x0b, 0xd9, 0xed, 0xc3, - 0xa3, 0x84, 0x5d, 0x2f, 0x88, 0x28, 0xd2, 0x7f, 0x3e, 0xe6, 0x95, 0xa9, 0x9c, 0xa6, 0xdd, 0xf5, - 0x03, 0xe2, 0xad, 0x6e, 0x26, 0xe5, 0x5c, 0x0e, 0x01, 0x38, 0xc2, 0x59, 0xfc, 0xf7, 0x02, 0xcc, - 0x25, 0xaf, 0xca, 0x41, 0xef, 0xc0, 0xb4, 0x6f, 0xb5, 0x1c, 0xcb, 0x69, 0x89, 0x4d, 0x38, 0x6d, - 0xe0, 0x14, 0x41, 0x5d, 0xad, 0x8f, 0xe3, 0xe4, 0x72, 0x8b, 0x7a, 0x39, 0x9d, 0x37, 0x51, 0xdf, - 0x4f, 0x67, 0xcb, 0xbf, 0x9d, 0xf3, 0x65, 0x45, 0xff, 0xbd, 0xd3, 0xe5, 0x7f, 0x55, 0x84, 0x73, - 0xd9, 0x97, 0x21, 0x9d, 0xd2, 0xa2, 0x35, 0x4a, 0x07, 0x1b, 0xeb, 0x99, 0x0e, 0x16, 0xb5, 0xf3, - 0x78, 0x4e, 0x97, 0x1b, 0xc9, 0x06, 0x38, 0xda, 0xd4, 0xca, 0xe5, 0x74, 0xe1, 0xa1, 0xcb, 0xe9, - 0x4b, 0x50, 0x12, 0xf7, 0xc0, 0x26, 0x96, 0xa9, 0x75, 0x7e, 0x4b, 0xab, 0x80, 0x2a, 0x4b, 0x81, - 0xd2, 0x91, 0x4b, 0x01, 0xba, 0xb4, 0x91, 0x2f, 0x4f, 0x4f, 0x0c, 0xbe, 0xb4, 0x91, 0x0f, 0x4f, - 0x47, 0x64, 0x58, 0xc2, 0x6f, 0xc7, 0x8a, 0x1e, 0xab, 0x8c, 0x12, 0x7e, 0x37, 0x57, 0x6f, 0xe3, - 0x35, 0x2c, 0xa0, 0xf1, 0x2d, 0xa5, 0x4a, 0x2e, 0x5b, 0x4a, 0xd9, 0x3a, 0x77, 0x52, 0x0e, 0xb5, - 0x09, 0xf3, 0xa9, 0x3e, 0xef, 0xdb, 0xa5, 0xbe, 0x04, 0x25, 0xbf, 0xbb, 0x43, 0xf1, 0x12, 0x77, - 0x45, 0xe8, 0xac, 0x14, 0x0b, 0xe8, 0xe2, 0x77, 0x0b, 0x94, 0x4b, 0xe2, 0xda, 0xac, 0x53, 0x1a, - 0x55, 0x2f, 0xc3, 0x34, 0x77, 0x6a, 0x5f, 0x57, 0xd2, 0xf8, 0xcb, 0xca, 0x46, 0xa5, 0x0a, 0xc4, - 0x71, 0x5c, 0xb4, 0xca, 0xd4, 0x64, 0x60, 0xb7, 0x10, 0x84, 0x26, 0xd1, 0x89, 0x5b, 0x10, 0x40, - 0xcf, 0xc3, 0x24, 0xfb, 0x08, 0xde, 0xe4, 0x62, 0x77, 0x87, 0x25, 0xec, 0x5d, 0x8d, 0x8a, 0xb1, - 0x8a, 0x13, 0x3f, 0xa2, 0x2c, 0xe6, 0x72, 0x44, 0x99, 0xea, 0x95, 0x93, 0xd2, 0xbb, 0x6f, 0x97, - 0x41, 0xbe, 0xec, 0x83, 0xcc, 0xd4, 0xfb, 0x4a, 0x9f, 0x1d, 0x78, 0x13, 0x38, 0x14, 0x85, 0x6f, - 0x98, 0x67, 0x4c, 0x49, 0xaf, 0x02, 0x12, 0x0f, 0xfa, 0x88, 0x45, 0x35, 0xcb, 0xb4, 0xe1, 0x8a, - 0x2b, 0x77, 0xbb, 0xf5, 0x14, 0x06, 0xce, 0xa8, 0x85, 0x5e, 0x65, 0xaf, 0x89, 0x05, 0x86, 0xe5, - 0x48, 0xcb, 0xfb, 0x74, 0x8f, 0x3c, 0x2e, 0x8e, 0x24, 0xdf, 0x05, 0xe3, 0x7f, 0x71, 0x54, 0x1d, - 0x5d, 0x85, 0x89, 0x03, 0xd7, 0xee, 0xb6, 0xe5, 0x23, 0xc5, 0x0b, 0x59, 0x94, 0x5e, 0x63, 0x28, - 0x4a, 0xde, 0x01, 0xaf, 0x82, 0xc3, 0xba, 0x88, 0xc0, 0x2c, 0x0b, 0x13, 0xb0, 0x82, 0x43, 0x31, - 0x00, 0xc4, 0xd4, 0x7b, 0x29, 0x8b, 0xdc, 0xa6, 0xdb, 0xd4, 0xe3, 0xd8, 0xfc, 0xc4, 0x38, 0x51, - 0x88, 0x93, 0x34, 0xd1, 0x35, 0x28, 0x1b, 0x3b, 0x3b, 0x96, 0x63, 0x05, 0x87, 0xe2, 0x48, 0xec, - 0xa9, 0x2c, 0xfa, 0x35, 0x81, 0x23, 0xee, 0x7b, 0x10, 0xff, 0xb0, 0xac, 0x8b, 0x6e, 0xc3, 0x64, - 0xe0, 0xda, 0x62, 0x5d, 0xea, 0x8b, 0xad, 0x86, 0xf3, 0x59, 0xa4, 0xb6, 0x25, 0x5a, 0x74, 0xcc, - 0x12, 0x95, 0xf9, 0x58, 0xa5, 0x83, 0x7e, 0x47, 0x83, 0x29, 0xc7, 0x6d, 0x92, 0x70, 0xe8, 0x89, - 0x6d, 0xff, 0x37, 0x73, 0x7a, 0x91, 0x6a, 0x69, 0x43, 0xa1, 0xcd, 0x47, 0x88, 0xbc, 0x07, 0x40, - 0x05, 0xe1, 0x98, 0x10, 0xc8, 0x81, 0x39, 0xab, 0x6d, 0xb4, 0xc8, 0x66, 0xd7, 0x16, 0x61, 0x4e, - 0xe1, 0x5b, 0xeb, 0x99, 0xd9, 0x7f, 0x6b, 0xae, 0x69, 0xd8, 0xfc, 0x45, 0x37, 0x4c, 0x76, 0x88, - 0xc7, 0x1e, 0x96, 0x93, 0x27, 0xd6, 0xab, 0x09, 0x4a, 0x38, 0x45, 0x1b, 0x5d, 0x87, 0xf9, 0x8e, - 0x67, 0xb9, 0xac, 0xdf, 0x6c, 0xc3, 0xe7, 0x2f, 0x7a, 0x41, 0x3c, 0xe5, 0x6b, 0x33, 0x89, 0x80, - 0xd3, 0x75, 0x78, 0x9a, 0x32, 0x2f, 0x64, 0xbe, 0x5c, 0x31, 0x4c, 0x53, 0xe6, 0x65, 0x58, 0x42, - 0x17, 0x3e, 0x0f, 0xf3, 0xa9, 0xb6, 0x19, 0xc8, 0x20, 0xfc, 0x81, 0x06, 0xc9, 0x9c, 0x59, 0xea, - 0x37, 0x34, 0x2d, 0x8f, 0x11, 0x3c, 0x4c, 0x9e, 0x19, 0xac, 0x84, 0x00, 0x1c, 0xe1, 0xa0, 0x8b, - 0x50, 0xe8, 0x18, 0xc1, 0x6e, 0x32, 0x5c, 0x88, 0x92, 0xc4, 0x0c, 0xc2, 0x5e, 0x10, 0xa6, 0xff, - 0x48, 0x8b, 0xdc, 0xed, 0x08, 0x37, 0x28, 0x7a, 0x41, 0x58, 0x42, 0xb0, 0x82, 0xb5, 0xf8, 0x8f, - 0x45, 0x98, 0x89, 0xcf, 0x2d, 0x31, 0x67, 0x53, 0x7b, 0xa8, 0xb3, 0x79, 0x09, 0x4a, 0x6d, 0x12, - 0xec, 0xba, 0xcd, 0xe4, 0x3c, 0xb9, 0xce, 0x4a, 0xb1, 0x80, 0x32, 0xf1, 0x5d, 0x2f, 0x10, 0x62, - 0x45, 0xe2, 0xbb, 0x5e, 0x80, 0x19, 0x24, 0x8c, 0x76, 0x2a, 0xf4, 0x88, 0x76, 0x6a, 0xc1, 0x1c, - 0xbf, 0xb2, 0x6f, 0x99, 0x78, 0xc1, 0xb1, 0xa3, 0xf4, 0xf4, 0x04, 0x09, 0x9c, 0x22, 0x8a, 0x9a, - 0xd4, 0xda, 0xd0, 0x32, 0x56, 0xf9, 0x98, 0x29, 0xc0, 0x7a, 0x9c, 0x02, 0x4e, 0x92, 0x1c, 0xc5, - 0x6e, 0x64, 0xbc, 0x1f, 0x8f, 0x7d, 0x07, 0x54, 0x39, 0xaf, 0x3b, 0xa0, 0x5e, 0x82, 0x99, 0xb6, - 0x71, 0x77, 0xd3, 0x38, 0xb4, 0x5d, 0xa3, 0xa9, 0x5b, 0xf7, 0x88, 0xc8, 0x52, 0x63, 0x2f, 0x3d, - 0xaf, 0xc7, 0x20, 0x38, 0x81, 0x39, 0xdc, 0x04, 0xfc, 0x87, 0x63, 0x80, 0xd2, 0x57, 0x91, 0xa3, - 0x0f, 0x35, 0x98, 0xb9, 0x13, 0x6b, 0xa3, 0xd1, 0x2c, 0xce, 0xe4, 0xb6, 0x57, 0xbc, 0x1c, 0x27, - 0x98, 0x2b, 0x0e, 0xce, 0xd8, 0xc9, 0x39, 0x92, 0xf5, 0xa5, 0x1f, 0xff, 0xf2, 0xfc, 0x63, 0x3f, - 0xf9, 0xe5, 0xf9, 0xc7, 0x7e, 0xfa, 0xcb, 0xf3, 0x8f, 0x7d, 0xed, 0xc1, 0x79, 0xed, 0xc7, 0x0f, - 0xce, 0x6b, 0x3f, 0x79, 0x70, 0x5e, 0xfb, 0xe9, 0x83, 0xf3, 0xda, 0x2f, 0x1e, 0x9c, 0xd7, 0xbe, - 0xfb, 0x2f, 0xe7, 0x1f, 0xfb, 0x42, 0x39, 0xa4, 0xfa, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x8e, - 0xf5, 0x35, 0x2f, 0x3e, 0x9b, 0x00, 0x00, + 0x75, 0xb0, 0x9a, 0x9c, 0x19, 0xce, 0x3c, 0xfe, 0xd7, 0xae, 0x56, 0x23, 0x5a, 0xda, 0xdd, 0x6f, + 0x04, 0x2f, 0x56, 0xdf, 0x27, 0x73, 0x3f, 0x29, 0x71, 0x2c, 0x4b, 0xb1, 0x8c, 0x19, 0x72, 0x7f, + 0xa8, 0x25, 0xb9, 0x64, 0x35, 0x57, 0x3f, 0x96, 0x25, 0xb9, 0xd9, 0x53, 0x1c, 0xb6, 0xd9, 0xd3, + 0x3d, 0xec, 0xee, 0xa1, 0x96, 0x0b, 0xc4, 0x36, 0x0c, 0x38, 0xb1, 0xf5, 0x63, 0x5b, 0x49, 0x9c, + 0x04, 0x09, 0x7c, 0x70, 0x12, 0xf8, 0x92, 0x20, 0xc8, 0xc9, 0xc8, 0x35, 0x40, 0x0e, 0x46, 0x92, + 0x83, 0x93, 0x5c, 0x14, 0x1b, 0x58, 0xd8, 0x1b, 0xe4, 0x96, 0x4b, 0xe0, 0x53, 0x72, 0x0a, 0xea, + 0xa7, 0xab, 0xab, 0x7f, 0x86, 0x3b, 0xc3, 0xe9, 0x21, 0xb5, 0x46, 0x6e, 0x33, 0xf5, 0x5e, 0xbd, + 0xf7, 0xba, 0xea, 0xbd, 0x57, 0xaf, 0x5e, 0xfd, 0xc1, 0x5a, 0xcb, 0x0a, 0x76, 0xbb, 0xdb, 0x8b, + 0xa6, 0xdb, 0xbe, 0x62, 0x78, 0x2d, 0xb7, 0xe3, 0xb9, 0x5f, 0x66, 0x3f, 0x3e, 0x45, 0x0e, 0x88, + 0x13, 0xf8, 0x57, 0x3a, 0x7b, 0xad, 0x2b, 0x46, 0xc7, 0xf2, 0xaf, 0xf0, 0xff, 0x6e, 0xd7, 0x33, + 0xc9, 0x95, 0x83, 0x67, 0x0d, 0xbb, 0xb3, 0x6b, 0x3c, 0x7b, 0xa5, 0x45, 0x1c, 0xe2, 0x19, 0x01, + 0x69, 0x2e, 0x76, 0x3c, 0x37, 0x70, 0xd1, 0xe7, 0x22, 0x72, 0x8b, 0x21, 0x39, 0xf6, 0xe3, 0x6d, + 0x5e, 0x7d, 0xb1, 0xb3, 0xd7, 0x5a, 0xa4, 0xe4, 0x16, 0x15, 0x72, 0x8b, 0x21, 0xb9, 0x85, 0xcf, + 0xf7, 0x2d, 0x8d, 0xe9, 0xb6, 0xdb, 0xae, 0x93, 0xe4, 0xbf, 0xf0, 0x29, 0x85, 0x40, 0xcb, 0x6d, + 0xb9, 0x57, 0x58, 0xf1, 0x76, 0x77, 0x87, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0x81, 0x5e, 0xdb, 0x7b, + 0xde, 0x5f, 0xb4, 0x5c, 0x4a, 0xf2, 0x8a, 0xe9, 0x7a, 0xf4, 0xc3, 0x52, 0x24, 0x7f, 0x3d, 0xc2, + 0x69, 0x1b, 0xe6, 0xae, 0xe5, 0x10, 0xef, 0x30, 0x92, 0xa3, 0x4d, 0x02, 0x23, 0xab, 0xd6, 0x95, + 0x5e, 0xb5, 0xbc, 0xae, 0x13, 0x58, 0x6d, 0x92, 0xaa, 0xf0, 0x1b, 0x0f, 0xaa, 0xe0, 0x9b, 0xbb, + 0xa4, 0x6d, 0x24, 0xeb, 0xd5, 0xfe, 0x4b, 0x83, 0xf9, 0xfa, 0xda, 0xe6, 0xc6, 0x92, 0xeb, 0xf8, + 0xdd, 0x36, 0x59, 0x72, 0x9d, 0x1d, 0xab, 0x85, 0x3e, 0x0d, 0x93, 0x26, 0x2f, 0xf0, 0xb6, 0x8c, + 0x56, 0x55, 0xbb, 0xa8, 0x5d, 0xae, 0x34, 0xce, 0xfc, 0xf8, 0xde, 0x85, 0x47, 0xee, 0xdf, 0xbb, + 0x30, 0xb9, 0x14, 0x81, 0xb0, 0x8a, 0x87, 0x9e, 0x86, 0x09, 0xa3, 0x1b, 0xb8, 0x75, 0x73, 0xaf, + 0x3a, 0x76, 0x51, 0xbb, 0x5c, 0x6e, 0xcc, 0x8a, 0x2a, 0x13, 0x75, 0x5e, 0x8c, 0x43, 0x38, 0xba, + 0x02, 0x15, 0x72, 0xc7, 0xb4, 0xbb, 0xbe, 0x75, 0x40, 0xaa, 0xe3, 0x0c, 0x79, 0x5e, 0x20, 0x57, + 0xae, 0x86, 0x00, 0x1c, 0xe1, 0x50, 0xda, 0x8e, 0xbb, 0xea, 0x9a, 0x86, 0x5d, 0x2d, 0xc4, 0x69, + 0xaf, 0xf3, 0x62, 0x1c, 0xc2, 0xd1, 0x25, 0x28, 0x39, 0xee, 0xab, 0x86, 0x15, 0x54, 0x8b, 0x0c, + 0x73, 0x46, 0x60, 0x96, 0xd6, 0x59, 0x29, 0x16, 0xd0, 0xda, 0x7f, 0x4c, 0xc2, 0x2c, 0xfd, 0xf6, + 0xab, 0x54, 0x39, 0x74, 0xa6, 0x4b, 0xe8, 0x49, 0x18, 0xef, 0x7a, 0xb6, 0xf8, 0xe2, 0x49, 0x51, + 0x71, 0xfc, 0x36, 0x5e, 0xc5, 0xb4, 0x1c, 0x3d, 0x0f, 0x53, 0xe4, 0x8e, 0xb9, 0x6b, 0x38, 0x2d, + 0xb2, 0x6e, 0xb4, 0x09, 0xfb, 0xcc, 0x4a, 0xe3, 0xac, 0xc0, 0x9b, 0xba, 0xaa, 0xc0, 0x70, 0x0c, + 0x53, 0xad, 0xb9, 0x75, 0xd8, 0xe1, 0xdf, 0x9c, 0x51, 0x93, 0xc2, 0x70, 0x0c, 0x13, 0x3d, 0x07, + 0xe0, 0xb9, 0xdd, 0xc0, 0x72, 0x5a, 0x37, 0xc9, 0x21, 0xfb, 0xf8, 0x4a, 0x03, 0x89, 0x7a, 0x80, + 0x25, 0x04, 0x2b, 0x58, 0xe8, 0xb7, 0x60, 0xde, 0x74, 0x1d, 0x87, 0x98, 0x81, 0xe5, 0x3a, 0x0d, + 0xc3, 0xdc, 0x73, 0x77, 0x76, 0x58, 0x6b, 0x4c, 0x3e, 0xf7, 0xfc, 0x62, 0xdf, 0x46, 0xc6, 0xad, + 0x64, 0x51, 0xd4, 0x6f, 0x3c, 0x7a, 0xff, 0xde, 0x85, 0xf9, 0xa5, 0x24, 0x59, 0x9c, 0xe6, 0x84, + 0x9e, 0x81, 0xf2, 0x97, 0x7d, 0xd7, 0x69, 0xb8, 0xcd, 0xc3, 0x6a, 0x89, 0xf5, 0xc1, 0x9c, 0x10, + 0xb8, 0xfc, 0xb2, 0x7e, 0x6b, 0x9d, 0x96, 0x63, 0x89, 0x81, 0x6e, 0xc3, 0x78, 0x60, 0xfb, 0xd5, + 0x09, 0x26, 0xde, 0x0b, 0x03, 0x8b, 0xb7, 0xb5, 0xaa, 0x73, 0xb5, 0x6d, 0x4c, 0xd0, 0xbe, 0xda, + 0x5a, 0xd5, 0x31, 0xa5, 0x87, 0xde, 0xd5, 0xa0, 0x4c, 0xed, 0xab, 0x69, 0x04, 0x46, 0xb5, 0x7c, + 0x71, 0xfc, 0xf2, 0xe4, 0x73, 0x5f, 0x5c, 0x1c, 0xca, 0xc1, 0x2c, 0x26, 0xb4, 0x65, 0x71, 0x4d, + 0x90, 0xbf, 0xea, 0x04, 0xde, 0x61, 0xf4, 0x8d, 0x61, 0x31, 0x96, 0xfc, 0xd1, 0x1f, 0x6a, 0x30, + 0x1b, 0xf6, 0xea, 0x32, 0x31, 0x6d, 0xc3, 0x23, 0xd5, 0x0a, 0xfb, 0xe0, 0xd7, 0xf2, 0x90, 0x29, + 0x4e, 0x59, 0x34, 0xc7, 0x99, 0xfb, 0xf7, 0x2e, 0xcc, 0x26, 0x40, 0x38, 0x29, 0x05, 0x7a, 0x4f, + 0x83, 0xa9, 0xfd, 0x2e, 0xe9, 0x4a, 0xb1, 0x80, 0x89, 0x75, 0x3b, 0x07, 0xb1, 0x36, 0x15, 0xb2, + 0x42, 0xa6, 0x39, 0xaa, 0xec, 0x6a, 0x39, 0x8e, 0x31, 0x47, 0x5f, 0x85, 0x0a, 0xfb, 0xdf, 0xb0, + 0x9c, 0x66, 0x75, 0x92, 0x49, 0x82, 0xf3, 0x92, 0x84, 0xd2, 0x14, 0x62, 0x4c, 0x53, 0x3f, 0x23, + 0x0b, 0x71, 0xc4, 0x13, 0xbd, 0x03, 0x13, 0xc2, 0xa5, 0x55, 0xa7, 0x18, 0xfb, 0x8d, 0x1c, 0xd8, + 0xc7, 0xbc, 0x6b, 0x63, 0x92, 0x7a, 0x2d, 0x51, 0x84, 0x43, 0x6e, 0xe8, 0x35, 0x28, 0x18, 0xdd, + 0x60, 0xb7, 0x3a, 0x7d, 0x4c, 0x33, 0x68, 0x18, 0xbe, 0x65, 0xd6, 0xbb, 0xc1, 0x6e, 0xa3, 0x7c, + 0xff, 0xde, 0x85, 0x02, 0xfd, 0x85, 0x19, 0x45, 0x84, 0xa1, 0xd2, 0xf5, 0x6c, 0x9d, 0x98, 0x1e, + 0x09, 0xaa, 0x33, 0x8c, 0xfc, 0x27, 0x17, 0xf9, 0x78, 0x41, 0x29, 0x2c, 0xd2, 0xa1, 0x6b, 0xf1, + 0xe0, 0xd9, 0x45, 0x8e, 0x71, 0x93, 0x1c, 0xea, 0xc4, 0x26, 0x66, 0xe0, 0x7a, 0xbc, 0x99, 0x6e, + 0xe3, 0x55, 0x0e, 0xc1, 0x11, 0x19, 0x14, 0x40, 0x69, 0xc7, 0xb2, 0x03, 0xe2, 0x55, 0x67, 0x73, + 0x69, 0x25, 0xc5, 0xaa, 0xae, 0x31, 0xba, 0x0d, 0xa0, 0x1e, 0x9b, 0xff, 0xc6, 0x82, 0xd7, 0xc2, + 0x8b, 0x30, 0x1d, 0x33, 0x39, 0x34, 0x07, 0xe3, 0x7b, 0xe4, 0x90, 0xbb, 0x6b, 0x4c, 0x7f, 0xa2, + 0xb3, 0x50, 0x3c, 0x30, 0xec, 0xae, 0x70, 0xcd, 0x98, 0xff, 0x79, 0x61, 0xec, 0x79, 0xad, 0xf6, + 0x13, 0x0d, 0x1e, 0xef, 0x69, 0x2c, 0x74, 0x7c, 0x69, 0x76, 0x3d, 0x63, 0xdb, 0x26, 0x8c, 0x9a, + 0x32, 0xbe, 0x2c, 0xf3, 0x62, 0x1c, 0xc2, 0xa9, 0x43, 0xa6, 0xc3, 0xd8, 0x32, 0xb1, 0x49, 0x40, + 0xc4, 0x48, 0x27, 0x1d, 0x72, 0x5d, 0x42, 0xb0, 0x82, 0x45, 0x3d, 0xa2, 0xe5, 0x04, 0xc4, 0x73, + 0x0c, 0x5b, 0x0c, 0x77, 0xd2, 0x5b, 0xac, 0x88, 0x72, 0x2c, 0x31, 0x94, 0x11, 0xac, 0x70, 0xe4, + 0x08, 0xf6, 0x39, 0x38, 0x93, 0xa1, 0xdd, 0x4a, 0x75, 0xed, 0xc8, 0xea, 0x7f, 0x36, 0x06, 0xe7, + 0xb2, 0xed, 0x14, 0x5d, 0x84, 0x82, 0x43, 0x07, 0x38, 0x3e, 0x10, 0x4e, 0x09, 0x02, 0x05, 0x36, + 0xb0, 0x31, 0x88, 0xda, 0x60, 0x63, 0x03, 0x35, 0xd8, 0x78, 0x5f, 0x0d, 0x16, 0x0b, 0x10, 0x0a, + 0x7d, 0x04, 0x08, 0x7d, 0x8e, 0xfa, 0x94, 0xb0, 0xe1, 0xb5, 0xba, 0x6d, 0xaa, 0x84, 0x6c, 0x70, + 0xaa, 0x44, 0x84, 0xeb, 0x21, 0x00, 0x47, 0x38, 0xb5, 0x77, 0x8b, 0xf0, 0x78, 0xfd, 0x6e, 0xd7, + 0x23, 0x4c, 0x47, 0xfd, 0x1b, 0xdd, 0x6d, 0x35, 0x60, 0xb8, 0x08, 0x85, 0x9d, 0xfd, 0xa6, 0x93, + 0x6c, 0xa8, 0x6b, 0x9b, 0xcb, 0xeb, 0x98, 0x41, 0x50, 0x07, 0xce, 0xf8, 0xbb, 0x86, 0x47, 0x9a, + 0x75, 0xd3, 0x24, 0xbe, 0x7f, 0x93, 0x1c, 0xca, 0xd0, 0xa1, 0x6f, 0x43, 0x7c, 0xec, 0xfe, 0xbd, + 0x0b, 0x67, 0xf4, 0x34, 0x15, 0x9c, 0x45, 0x1a, 0x35, 0x61, 0x36, 0x51, 0xcc, 0x1a, 0xbd, 0x6f, + 0x6e, 0x6c, 0xe0, 0x48, 0x70, 0xc3, 0x49, 0x92, 0x54, 0x01, 0x76, 0xbb, 0xdb, 0xec, 0x5b, 0x78, + 0x50, 0x22, 0x15, 0xe0, 0x06, 0x2f, 0xc6, 0x21, 0x1c, 0xfd, 0xbe, 0x3a, 0x14, 0x17, 0xd9, 0x50, + 0xbc, 0x33, 0xac, 0x5b, 0xed, 0xd5, 0x23, 0x03, 0x0c, 0xca, 0x91, 0x13, 0x2b, 0x3d, 0x2c, 0x4e, + 0xec, 0x67, 0x45, 0x78, 0x82, 0x7d, 0x3a, 0xb3, 0x59, 0x3d, 0x70, 0x3d, 0xa3, 0x45, 0x54, 0x7d, + 0x7c, 0x19, 0x90, 0xcf, 0x4b, 0xeb, 0xa6, 0xe9, 0x76, 0x9d, 0x60, 0x3d, 0x32, 0xe3, 0x05, 0xd1, + 0x16, 0x48, 0x4f, 0x61, 0xe0, 0x8c, 0x5a, 0xa8, 0x05, 0x73, 0x51, 0x6c, 0xa7, 0x07, 0x9e, 0xe5, + 0xb4, 0x06, 0x53, 0xdb, 0xb3, 0xf7, 0xef, 0x5d, 0x98, 0x5b, 0x4a, 0x90, 0xc0, 0x29, 0xa2, 0xd4, + 0x26, 0xd9, 0x08, 0xcc, 0x64, 0x1d, 0x8f, 0xdb, 0xe4, 0x66, 0x08, 0xc0, 0x11, 0x4e, 0x2c, 0xc0, + 0x2c, 0x3c, 0x30, 0xc0, 0x7c, 0x12, 0xc6, 0x9b, 0xf6, 0xbe, 0xf0, 0x0b, 0x32, 0xa8, 0x5f, 0x5e, + 0xdd, 0xc4, 0xb4, 0x9c, 0xc6, 0x66, 0x91, 0x76, 0x96, 0x98, 0x76, 0x5a, 0x79, 0x68, 0x67, 0x8f, + 0x2e, 0x3a, 0x96, 0x82, 0x4e, 0x9c, 0x9c, 0x82, 0xa2, 0x17, 0x61, 0xba, 0x49, 0x4c, 0xb7, 0x49, + 0xd6, 0x88, 0xef, 0x1b, 0x2d, 0x52, 0x2d, 0xb3, 0x86, 0x7b, 0x54, 0x08, 0x3a, 0xbd, 0xac, 0x02, + 0x71, 0x1c, 0x77, 0x38, 0xed, 0xfe, 0xa8, 0x04, 0x0b, 0xac, 0xe9, 0x74, 0xe2, 0x1d, 0x58, 0x26, + 0x69, 0x74, 0x7d, 0x55, 0xb7, 0xb3, 0xf4, 0x51, 0x1b, 0xb9, 0x3e, 0x8e, 0xf5, 0xa1, 0x8f, 0x57, + 0xa0, 0x12, 0xb8, 0x1d, 0xcb, 0xcc, 0x52, 0xe0, 0xad, 0x10, 0x80, 0x23, 0x1c, 0xb4, 0x0c, 0x73, + 0x7e, 0x77, 0xdb, 0x37, 0x3d, 0xab, 0x43, 0xf9, 0x2a, 0x5e, 0xb4, 0x2a, 0xea, 0xcd, 0xe9, 0x09, + 0x38, 0x4e, 0xd5, 0x08, 0x67, 0x4e, 0xc5, 0x9c, 0x67, 0x4e, 0x83, 0x4d, 0xdf, 0xbe, 0xa7, 0x9a, + 0xcf, 0x04, 0x33, 0x9f, 0x56, 0x1e, 0xe6, 0x93, 0xa9, 0x03, 0xc7, 0x32, 0x9e, 0xf2, 0x09, 0x1a, + 0xcf, 0xeb, 0xf0, 0xd8, 0x4e, 0xd7, 0xb6, 0x0f, 0x37, 0xbb, 0x86, 0x6d, 0xed, 0x58, 0xa4, 0x49, + 0x3b, 0xca, 0xef, 0x18, 0x26, 0x9f, 0xef, 0x55, 0x1a, 0x17, 0x84, 0xc8, 0x8f, 0x5d, 0xcb, 0x46, + 0xc3, 0xbd, 0xea, 0x0f, 0x67, 0x5a, 0x3f, 0xd5, 0x60, 0xba, 0x61, 0x05, 0xdb, 0x5d, 0x73, 0x8f, + 0x04, 0x74, 0x72, 0x80, 0x3c, 0x28, 0x6e, 0xd3, 0x39, 0x83, 0x30, 0xa1, 0xcd, 0x21, 0x9b, 0x47, + 0x12, 0x8f, 0x26, 0x22, 0x95, 0xfb, 0xf7, 0x2e, 0x14, 0xd9, 0x5f, 0xcc, 0x59, 0xa1, 0xdb, 0x00, + 0x2e, 0x9d, 0x93, 0x6c, 0xb9, 0x7b, 0xc4, 0x19, 0x6c, 0x2c, 0x99, 0xa1, 0xc1, 0xe2, 0xad, 0x7a, + 0x58, 0x19, 0x2b, 0x84, 0x6a, 0x3f, 0xd2, 0x00, 0xa5, 0xf9, 0xa3, 0x5b, 0x50, 0xee, 0xfa, 0x34, + 0xa2, 0x16, 0x23, 0x60, 0xdf, 0xbc, 0xa6, 0xa8, 0x4a, 0xdd, 0x16, 0x55, 0xb1, 0x24, 0x42, 0x09, + 0x76, 0x0c, 0xdf, 0x7f, 0xc7, 0xf5, 0x9a, 0x83, 0x09, 0xcf, 0x08, 0x6e, 0x88, 0xaa, 0x58, 0x12, + 0xa9, 0xfd, 0x72, 0x02, 0xce, 0x4a, 0xc1, 0x13, 0xc3, 0x78, 0x93, 0x05, 0xc2, 0x37, 0x5c, 0x77, + 0xef, 0x96, 0x73, 0xcd, 0x72, 0x2c, 0x7f, 0x57, 0x84, 0xf3, 0x72, 0x18, 0x5f, 0x4e, 0x61, 0xe0, + 0x8c, 0x5a, 0xe8, 0x3b, 0xaa, 0x81, 0x8e, 0x31, 0x03, 0x35, 0xf2, 0xea, 0xec, 0xe3, 0x9a, 0xe6, + 0xc4, 0x3b, 0x64, 0x7b, 0xd7, 0x75, 0xf7, 0x44, 0x60, 0xba, 0x36, 0xa4, 0x3c, 0xaf, 0x72, 0x6a, + 0x4b, 0xae, 0x13, 0x90, 0x3b, 0x01, 0x9f, 0x61, 0x8b, 0x32, 0x1c, 0xb2, 0x42, 0x5f, 0x16, 0x33, + 0xec, 0x02, 0x63, 0xb9, 0x9a, 0x57, 0x13, 0x64, 0xce, 0xb9, 0x6b, 0x50, 0xe2, 0xb5, 0x58, 0xb8, + 0x5b, 0xe1, 0xae, 0x82, 0x87, 0xab, 0x58, 0x40, 0xd0, 0xa7, 0xa0, 0xe8, 0xbe, 0xe3, 0x88, 0xe8, + 0xb3, 0xd2, 0x78, 0x4c, 0x34, 0xd8, 0xec, 0x32, 0xe9, 0x78, 0xc4, 0x34, 0x02, 0xd2, 0xbc, 0x45, + 0xc1, 0x98, 0x63, 0xa1, 0xdf, 0x04, 0xa0, 0x22, 0x12, 0x93, 0x6a, 0x16, 0x0b, 0x08, 0x2a, 0x8d, + 0x27, 0x44, 0x9d, 0xb3, 0x51, 0x9d, 0x0d, 0x89, 0x83, 0x15, 0x7c, 0x74, 0x03, 0x66, 0x3c, 0xd2, + 0x71, 0x7d, 0x2b, 0x70, 0xbd, 0x43, 0xdd, 0xee, 0xb6, 0x98, 0x57, 0xac, 0x34, 0x2e, 0x0a, 0x0a, + 0xd5, 0x88, 0x02, 0x8e, 0xe1, 0xe1, 0x44, 0x3d, 0xf4, 0xbe, 0x06, 0x53, 0xb2, 0xc8, 0x22, 0x7e, + 0xb5, 0xc2, 0x54, 0x0a, 0xe7, 0xd5, 0x9e, 0x11, 0xfb, 0x28, 0x3d, 0x8a, 0x15, 0x7e, 0x38, 0xc6, + 0x5d, 0x71, 0xf3, 0xf0, 0xb0, 0x04, 0xf1, 0x77, 0xe1, 0x4c, 0xc6, 0xd7, 0xa2, 0xa7, 0x42, 0x7d, + 0xe0, 0xd1, 0xfa, 0xb4, 0xf8, 0xf8, 0x62, 0x4c, 0x0b, 0x5e, 0x4a, 0xf5, 0x23, 0x8f, 0x4f, 0xce, + 0x09, 0xec, 0x99, 0xa3, 0x7b, 0xaf, 0xf6, 0x2f, 0x15, 0x58, 0x90, 0xcc, 0xe9, 0x10, 0x4b, 0x3c, + 0xd5, 0xef, 0x28, 0x96, 0xa9, 0x9d, 0x9c, 0x65, 0xc6, 0x55, 0x7b, 0x6c, 0x68, 0xd5, 0x1e, 0x3f, + 0xa6, 0x6a, 0xff, 0x6e, 0x52, 0xb5, 0x0b, 0x4c, 0xb5, 0x5f, 0xcb, 0x4b, 0xb5, 0x79, 0x7b, 0x0f, + 0xa8, 0xe0, 0xfd, 0xb8, 0x92, 0xd7, 0x60, 0xd2, 0x60, 0x13, 0x73, 0x3e, 0xb0, 0x96, 0x06, 0x19, + 0x9b, 0x66, 0xef, 0xdf, 0xbb, 0x30, 0x59, 0x8f, 0x6a, 0x63, 0x95, 0x14, 0x7a, 0x0b, 0xa6, 0x45, + 0x2f, 0x89, 0x04, 0xe2, 0xc4, 0x20, 0xb4, 0xe7, 0xe9, 0x7c, 0xe1, 0x55, 0xb5, 0x3e, 0x8e, 0x93, + 0x43, 0xaf, 0xc0, 0xb9, 0xed, 0xb0, 0x79, 0x7c, 0xd6, 0x3c, 0x0d, 0xc3, 0x27, 0xb7, 0xf1, 0xaa, + 0xf0, 0x4f, 0xe7, 0x45, 0x0b, 0x9d, 0x4b, 0x34, 0xa2, 0xc0, 0xc2, 0x3d, 0x6a, 0xf7, 0x18, 0x40, + 0x2b, 0xc7, 0x1a, 0x40, 0x63, 0x11, 0x2e, 0xe4, 0x12, 0xe1, 0xf6, 0x36, 0xc1, 0x63, 0x45, 0xb8, + 0x93, 0x27, 0x18, 0xe1, 0x8a, 0x49, 0xc7, 0x54, 0xbe, 0x93, 0x8e, 0xe1, 0x3c, 0xea, 0x77, 0x34, + 0x78, 0xbc, 0xa7, 0x95, 0xa1, 0xe7, 0x62, 0xee, 0x45, 0x8b, 0xaf, 0xa0, 0xf5, 0x70, 0x2a, 0xc3, + 0xfa, 0xd9, 0x3f, 0x2f, 0xc2, 0x99, 0x25, 0xc3, 0x26, 0x4e, 0xd3, 0x88, 0x39, 0xd8, 0x67, 0xa0, + 0xec, 0x9b, 0xbb, 0xa4, 0xd9, 0xb5, 0xc3, 0xac, 0x8c, 0xec, 0x61, 0x5d, 0x94, 0x63, 0x89, 0x21, + 0xd3, 0xc6, 0x07, 0x86, 0x2d, 0xf8, 0xc7, 0xd3, 0xc6, 0x07, 0x32, 0x6d, 0x7c, 0x60, 0xd8, 0xe8, + 0x05, 0x98, 0x11, 0xf9, 0x50, 0xd7, 0x59, 0x36, 0x02, 0xe2, 0x57, 0xc7, 0x99, 0xc7, 0x40, 0x54, + 0xde, 0xab, 0x31, 0x08, 0x4e, 0x60, 0x52, 0x4e, 0x81, 0xd5, 0x26, 0x77, 0x5d, 0x27, 0x9c, 0x88, + 0x4a, 0x4e, 0x5b, 0xa2, 0x1c, 0x4b, 0x0c, 0xf4, 0xed, 0x74, 0x42, 0xef, 0x4b, 0x43, 0x2a, 0x5f, + 0x46, 0x63, 0x0d, 0x60, 0x0a, 0x5f, 0xd7, 0x60, 0xb2, 0x43, 0x3c, 0xdf, 0xf2, 0x03, 0xe2, 0x98, + 0x44, 0x78, 0xc0, 0x5b, 0x79, 0x18, 0xc4, 0x46, 0x44, 0x96, 0xfb, 0x4a, 0xa5, 0x00, 0xab, 0x4c, + 0x4f, 0x67, 0xc6, 0x39, 0x9c, 0xe1, 0xdc, 0x81, 0xb3, 0x4b, 0x46, 0x60, 0xee, 0x76, 0x3b, 0xdc, + 0x28, 0xbb, 0x9e, 0x11, 0x58, 0xae, 0x83, 0x9e, 0x86, 0x09, 0xe2, 0x18, 0xdb, 0x36, 0x69, 0x26, + 0x97, 0x43, 0xae, 0xf2, 0x62, 0x1c, 0xc2, 0xd1, 0xa7, 0x61, 0xb2, 0x6d, 0xdc, 0x59, 0x16, 0x35, + 0x85, 0x9a, 0xca, 0xcd, 0x02, 0x6b, 0x11, 0x08, 0xab, 0x78, 0xb5, 0xaf, 0xc0, 0x59, 0xce, 0x72, + 0xcd, 0xe8, 0x28, 0x2d, 0xda, 0xc7, 0xca, 0xc3, 0x32, 0xcc, 0x99, 0x1e, 0x31, 0x02, 0xb2, 0xb2, + 0xb3, 0xee, 0x06, 0x57, 0xef, 0x58, 0x7e, 0x20, 0x96, 0x20, 0x64, 0xee, 0x64, 0x29, 0x01, 0xc7, + 0xa9, 0x1a, 0xb5, 0xef, 0x4e, 0x00, 0xba, 0xda, 0xb6, 0x82, 0x20, 0x1e, 0x00, 0x5d, 0x82, 0xd2, + 0xb6, 0xe7, 0xee, 0xc9, 0x28, 0x4c, 0x2e, 0x23, 0x34, 0x58, 0x29, 0x16, 0x50, 0xea, 0x53, 0xcc, + 0x5d, 0xc3, 0x71, 0x88, 0x1d, 0x85, 0x2c, 0xd2, 0xa7, 0x2c, 0x49, 0x08, 0x56, 0xb0, 0xd8, 0xb6, + 0x0a, 0xfe, 0x4f, 0xc9, 0x13, 0x45, 0xdb, 0x2a, 0x22, 0x10, 0x56, 0xf1, 0x62, 0xd3, 0xd8, 0x42, + 0xde, 0xd3, 0xd8, 0x62, 0x0e, 0xd3, 0xd8, 0xec, 0xed, 0x06, 0xa5, 0x53, 0xd9, 0x6e, 0x30, 0xd1, + 0xef, 0x76, 0x83, 0x72, 0xce, 0x49, 0xb3, 0x0f, 0x54, 0x97, 0xc8, 0xa7, 0x44, 0x6f, 0x0f, 0x6b, + 0xff, 0x29, 0xf5, 0x3c, 0x56, 0x70, 0xf0, 0xd0, 0xcc, 0x8b, 0x3e, 0x1c, 0x83, 0xb9, 0xa4, 0xcb, + 0x45, 0x77, 0x61, 0xc2, 0xe4, 0x1e, 0x4a, 0xcc, 0x48, 0xf4, 0xa1, 0x07, 0x9a, 0xb4, 0xbf, 0x13, + 0x6b, 0xf2, 0x1c, 0x82, 0x43, 0x86, 0xe8, 0x6b, 0x1a, 0x54, 0xcc, 0xd0, 0x49, 0x89, 0x8c, 0xcf, + 0xd0, 0xec, 0x33, 0x9c, 0x1e, 0x5f, 0x68, 0x97, 0x10, 0x1c, 0x31, 0xad, 0xfd, 0x6c, 0x0c, 0x26, + 0x55, 0xff, 0xf4, 0x25, 0x45, 0xcb, 0x78, 0x7b, 0xfc, 0x7f, 0xc5, 0x76, 0xe5, 0xde, 0xaf, 0x48, + 0x08, 0x8a, 0x4d, 0xad, 0xf9, 0xd6, 0x36, 0x0d, 0x6d, 0x68, 0xe7, 0x44, 0x7e, 0x2a, 0x2a, 0x53, + 0x14, 0xa7, 0x03, 0x05, 0xbf, 0x43, 0x4c, 0xf1, 0xb9, 0xeb, 0xf9, 0xa9, 0x8d, 0xde, 0x21, 0x66, + 0xe4, 0xd0, 0xe9, 0x3f, 0xcc, 0x38, 0xa1, 0x3b, 0x50, 0xf2, 0x03, 0x23, 0xe8, 0xfa, 0x22, 0x1b, + 0x94, 0xa3, 0xaa, 0xea, 0x8c, 0x6e, 0xe4, 0xc5, 0xf9, 0x7f, 0x2c, 0xf8, 0xd5, 0xae, 0xc3, 0x7c, + 0x4a, 0xaf, 0xa9, 0x6b, 0x27, 0x77, 0x3a, 0x1e, 0xf1, 0x69, 0x74, 0x94, 0x0c, 0x17, 0xaf, 0x4a, + 0x08, 0x56, 0xb0, 0x6a, 0x3f, 0xd7, 0x60, 0x56, 0xa1, 0xb4, 0x6a, 0xf9, 0x01, 0xfa, 0x62, 0xaa, + 0xab, 0x16, 0xfb, 0xeb, 0x2a, 0x5a, 0x9b, 0x75, 0x94, 0xb4, 0xef, 0xb0, 0x44, 0xe9, 0x26, 0x17, + 0x8a, 0x56, 0x40, 0xda, 0xbe, 0xc8, 0xe8, 0xbd, 0x9c, 0x5f, 0x9b, 0x45, 0x99, 0x87, 0x15, 0xca, + 0x00, 0x73, 0x3e, 0xb5, 0xbf, 0x5e, 0x8e, 0x7d, 0x22, 0xed, 0x3f, 0xb6, 0xab, 0x8d, 0x16, 0x35, + 0xba, 0xbe, 0xb2, 0xce, 0x18, 0xed, 0x6a, 0x53, 0x60, 0x38, 0x86, 0x89, 0xf6, 0xa1, 0x1c, 0x90, + 0x76, 0xc7, 0x36, 0x82, 0x70, 0x29, 0xfc, 0xfa, 0x90, 0x5f, 0xb0, 0x25, 0xc8, 0xf1, 0x51, 0x2a, + 0xfc, 0x87, 0x25, 0x1b, 0xd4, 0x86, 0x09, 0x9f, 0xaf, 0x29, 0x08, 0x3d, 0xbb, 0x36, 0x24, 0xc7, + 0x70, 0x85, 0x82, 0x39, 0x0f, 0xf1, 0x07, 0x87, 0x3c, 0xd0, 0x57, 0xa0, 0xd8, 0xb6, 0x1c, 0xcb, + 0x15, 0x49, 0x84, 0xd7, 0xf3, 0x35, 0xa4, 0xc5, 0x35, 0x4a, 0x9b, 0x0f, 0x03, 0xb2, 0xbf, 0x58, + 0x19, 0xe6, 0x6c, 0xd9, 0xfe, 0x37, 0x53, 0x04, 0xd5, 0x22, 0x46, 0xff, 0x62, 0xce, 0x32, 0xc8, + 0x98, 0x3d, 0x3e, 0x1a, 0x85, 0xc5, 0x58, 0xf2, 0x47, 0x77, 0xa1, 0xb0, 0x63, 0xd9, 0x44, 0x2c, + 0xaf, 0xbe, 0x96, 0xb3, 0x1c, 0xd7, 0x2c, 0x9b, 0x70, 0x19, 0xa2, 0x0d, 0x18, 0x96, 0x4d, 0x30, + 0xe3, 0xc9, 0x1a, 0xc2, 0x23, 0x9c, 0x86, 0x58, 0xa0, 0xca, 0xbb, 0x21, 0xb0, 0x20, 0x9f, 0x68, + 0x88, 0xb0, 0x18, 0x4b, 0xfe, 0xe8, 0xb7, 0xb5, 0x28, 0xc3, 0xc6, 0x37, 0x25, 0xbe, 0x91, 0xb3, + 0x2c, 0x22, 0xdd, 0xc2, 0x45, 0x91, 0x61, 0x7b, 0x2a, 0xe7, 0x76, 0x17, 0x0a, 0x46, 0x7b, 0xbf, + 0x23, 0x42, 0x95, 0xbc, 0x7b, 0xa4, 0xde, 0xde, 0xef, 0x24, 0x7a, 0xa4, 0xbe, 0xb6, 0xb9, 0x81, + 0x19, 0x4f, 0x6a, 0x1a, 0x7b, 0xc6, 0xce, 0x5e, 0x98, 0x4c, 0xc9, 0xdb, 0x34, 0x6e, 0x52, 0xda, + 0x09, 0xd3, 0x60, 0x65, 0x98, 0xb3, 0xa5, 0xdf, 0xde, 0xde, 0x0f, 0x82, 0xea, 0xe4, 0x48, 0xbe, + 0x7d, 0x6d, 0x3f, 0x08, 0x12, 0xdf, 0xbe, 0xb6, 0xb9, 0xb5, 0x85, 0x19, 0x4f, 0xca, 0xdb, 0x31, + 0x02, 0xbf, 0x3a, 0x35, 0x12, 0xde, 0xeb, 0x46, 0xe0, 0x27, 0x78, 0xaf, 0xd7, 0xb7, 0x74, 0xcc, + 0x78, 0xa2, 0x03, 0x18, 0xf7, 0x1d, 0xbf, 0x3a, 0xcd, 0x58, 0xbf, 0x9a, 0x33, 0x6b, 0xdd, 0x11, + 0x9c, 0xe5, 0x0e, 0x0b, 0x7d, 0x5d, 0xc7, 0x94, 0x21, 0xe3, 0xbb, 0xef, 0x57, 0x67, 0x46, 0xc3, + 0x77, 0x3f, 0xc5, 0x77, 0x93, 0xf2, 0xdd, 0xf7, 0xd1, 0xd7, 0x35, 0x28, 0x75, 0xba, 0xdb, 0x7a, + 0x77, 0xbb, 0x3a, 0xcb, 0x78, 0x7f, 0x21, 0x67, 0xde, 0x1b, 0x8c, 0x38, 0x67, 0x2f, 0x63, 0x0c, + 0x5e, 0x88, 0x05, 0x67, 0x26, 0x04, 0xe7, 0x5a, 0x9d, 0x1b, 0x89, 0x10, 0xd7, 0x19, 0xb5, 0x84, + 0x10, 0xbc, 0x10, 0x0b, 0xce, 0xa1, 0x10, 0xb6, 0xb1, 0x5d, 0x9d, 0x1f, 0x95, 0x10, 0xb6, 0x91, + 0x21, 0x84, 0x6d, 0x70, 0x21, 0x6c, 0x63, 0x9b, 0xaa, 0xfe, 0x6e, 0x73, 0xc7, 0xaf, 0xa2, 0x91, + 0xa8, 0xfe, 0x8d, 0xe6, 0x4e, 0x52, 0xf5, 0x6f, 0x2c, 0x5f, 0xd3, 0x31, 0xe3, 0x49, 0x5d, 0x8e, + 0x6f, 0x1b, 0xe6, 0x5e, 0xf5, 0xcc, 0x48, 0x5c, 0x8e, 0x4e, 0x69, 0x27, 0x5c, 0x0e, 0x2b, 0xc3, + 0x9c, 0x2d, 0xfa, 0x03, 0x0d, 0x26, 0xc5, 0x16, 0xab, 0xeb, 0x9e, 0xd5, 0xac, 0x9e, 0xcd, 0x67, + 0x86, 0x98, 0x14, 0x23, 0xe2, 0xc0, 0x85, 0x91, 0xd9, 0x05, 0x05, 0x82, 0x55, 0x41, 0xd0, 0x9f, + 0x6a, 0x30, 0x63, 0xc4, 0x36, 0xd3, 0x55, 0x1f, 0x65, 0xb2, 0x6d, 0xe7, 0x3d, 0x24, 0xc4, 0x77, + 0xec, 0x31, 0xf1, 0x64, 0x36, 0x35, 0x0e, 0xc4, 0x09, 0x89, 0x98, 0xfa, 0xfa, 0x81, 0x67, 0x75, + 0x48, 0xf5, 0xdc, 0x48, 0xd4, 0x57, 0x67, 0xc4, 0x13, 0xea, 0xcb, 0x0b, 0xb1, 0xe0, 0xcc, 0x86, + 0x6e, 0xc2, 0xa7, 0xe4, 0xd5, 0xc7, 0x46, 0x32, 0x74, 0x87, 0x13, 0xfe, 0xf8, 0xd0, 0x2d, 0x4a, + 0x71, 0xc8, 0x9c, 0xea, 0xb2, 0x47, 0x9a, 0x96, 0x5f, 0xad, 0x8e, 0x44, 0x97, 0x31, 0xa5, 0x9d, + 0xd0, 0x65, 0x56, 0x86, 0x39, 0x5b, 0xea, 0xce, 0x1d, 0x7f, 0xbf, 0xfa, 0xf8, 0x48, 0xdc, 0xf9, + 0xba, 0xbf, 0x9f, 0x70, 0xe7, 0xeb, 0xfa, 0x26, 0xa6, 0x0c, 0x85, 0x3b, 0xb7, 0x7d, 0xc3, 0xab, + 0x2e, 0x8c, 0xc8, 0x9d, 0x53, 0xe2, 0x29, 0x77, 0x4e, 0x0b, 0xb1, 0xe0, 0xcc, 0xb4, 0x80, 0x9d, + 0xa2, 0xb2, 0xcc, 0xea, 0x27, 0x46, 0xa2, 0x05, 0xd7, 0x39, 0xf5, 0x84, 0x16, 0x88, 0x52, 0x1c, + 0x32, 0x47, 0x97, 0x69, 0x54, 0xdb, 0xb1, 0x2d, 0xd3, 0xf0, 0xab, 0x4f, 0x5c, 0xd4, 0x2e, 0x17, + 0xf9, 0xc4, 0x07, 0x8b, 0x32, 0x2c, 0xa1, 0xe8, 0x87, 0x1a, 0xcc, 0x26, 0x96, 0xc9, 0xaa, 0x4f, + 0x32, 0xd1, 0xcd, 0x9c, 0x45, 0x6f, 0xc4, 0xb9, 0xf0, 0x4f, 0x90, 0x1b, 0x1b, 0x92, 0x2b, 0x34, + 0x49, 0xa1, 0xd0, 0xb7, 0x35, 0xa8, 0xc8, 0xb2, 0xea, 0x79, 0x26, 0xe2, 0x9b, 0xa3, 0x12, 0x91, + 0x0b, 0x27, 0xb7, 0xe9, 0x45, 0x2b, 0xf2, 0x91, 0x08, 0xcc, 0x6b, 0x33, 0x9d, 0xd7, 0x03, 0x8f, + 0x18, 0xed, 0xea, 0x85, 0x91, 0x78, 0x6d, 0x1c, 0x71, 0x48, 0x78, 0x6d, 0x05, 0x82, 0x55, 0x41, + 0x58, 0x97, 0x1a, 0xf1, 0x5d, 0x72, 0xd5, 0x8b, 0x23, 0xe9, 0xd2, 0xe4, 0x5e, 0xbc, 0x78, 0x97, + 0x26, 0xa0, 0x38, 0x29, 0x14, 0xfa, 0x2b, 0x0d, 0xe6, 0x8d, 0xe4, 0x6e, 0xd8, 0xea, 0xff, 0x61, + 0xa2, 0x92, 0x51, 0x88, 0x1a, 0xdb, 0x75, 0xcb, 0x84, 0x7d, 0x5c, 0x08, 0x3b, 0x9f, 0x82, 0xe3, + 0xb4, 0x68, 0x34, 0x48, 0xf1, 0x77, 0x82, 0x4e, 0xb5, 0x36, 0x92, 0x20, 0x45, 0xdf, 0x09, 0x92, + 0xf3, 0x22, 0xfd, 0xda, 0xd6, 0x06, 0x66, 0x3c, 0x17, 0xba, 0x00, 0xd1, 0xb4, 0x3e, 0x23, 0x75, + 0xba, 0xa9, 0xa6, 0x4e, 0x27, 0x9f, 0x7b, 0x71, 0xe0, 0xe4, 0xb5, 0xfe, 0x6b, 0x75, 0x2f, 0xb0, + 0x76, 0x0c, 0x33, 0x50, 0xf2, 0xae, 0x0b, 0xdf, 0xd1, 0x60, 0x3a, 0x36, 0x95, 0xcf, 0x60, 0xbd, + 0x1b, 0x67, 0x8d, 0xf3, 0x5f, 0xed, 0x53, 0x25, 0xfa, 0x1d, 0x0d, 0x2a, 0x72, 0x52, 0x9f, 0x21, + 0x4d, 0x33, 0x2e, 0xcd, 0xb0, 0x49, 0x4a, 0xc6, 0x2a, 0x5b, 0x12, 0xda, 0x36, 0xb1, 0xd9, 0xfd, + 0xe8, 0xdb, 0x46, 0xb2, 0xcb, 0x96, 0xe8, 0x03, 0x0d, 0xa6, 0xd4, 0x39, 0x7e, 0x86, 0x40, 0xad, + 0xb8, 0x40, 0x9b, 0xf9, 0xec, 0xe1, 0x39, 0xa2, 0xaf, 0xe4, 0x74, 0x7f, 0xf4, 0x7d, 0x95, 0x38, + 0x83, 0xa9, 0x4a, 0xf2, 0x2d, 0x0d, 0x20, 0x9a, 0xfb, 0x67, 0x88, 0x42, 0xe2, 0xa2, 0x0c, 0xbb, + 0x3c, 0xcc, 0x79, 0xf5, 0x6e, 0x15, 0x99, 0x08, 0x18, 0x7d, 0xab, 0xac, 0x6d, 0x6e, 0x6d, 0xf5, + 0x90, 0xe4, 0x9b, 0x1a, 0x54, 0x64, 0x5a, 0x60, 0xf4, 0x8d, 0xb2, 0x5e, 0xdf, 0xd2, 0x79, 0xe0, + 0x9e, 0x16, 0xe5, 0x1b, 0x1a, 0x94, 0xc3, 0x34, 0x41, 0x86, 0x24, 0x66, 0x5c, 0x92, 0x61, 0xb7, + 0x9e, 0xe9, 0xeb, 0x7a, 0x8f, 0x26, 0x61, 0x72, 0xec, 0x9f, 0x98, 0x1c, 0x9b, 0xbd, 0xe4, 0x78, + 0x4f, 0x83, 0x49, 0x25, 0x85, 0x90, 0x21, 0xca, 0x4e, 0x5c, 0x94, 0x61, 0x57, 0x46, 0x04, 0xb3, + 0xde, 0xd2, 0x28, 0xb9, 0x84, 0xd1, 0x4b, 0x23, 0x98, 0x1d, 0x29, 0x4d, 0x98, 0x54, 0x38, 0x11, + 0x69, 0x28, 0xb3, 0xde, 0xe6, 0x2c, 0x13, 0x0c, 0xa3, 0x37, 0xe7, 0x1b, 0xcb, 0xd7, 0xf4, 0x23, + 0x9c, 0x5c, 0x94, 0x6d, 0x18, 0xbd, 0x3d, 0x73, 0x5e, 0xd9, 0xb2, 0x7c, 0x4f, 0x83, 0xb9, 0x64, + 0xca, 0x21, 0x43, 0xa2, 0xbd, 0xb8, 0x44, 0xc3, 0x1e, 0x2d, 0x57, 0x39, 0x66, 0xcb, 0xf5, 0x27, + 0x1a, 0x9c, 0xc9, 0x48, 0x37, 0x64, 0x88, 0xe6, 0xc4, 0x45, 0x7b, 0x6d, 0x54, 0xa7, 0x12, 0x93, + 0x9a, 0xad, 0xe4, 0x1b, 0x46, 0xaf, 0xd9, 0x82, 0x59, 0xef, 0x70, 0x42, 0xcd, 0x3b, 0x8c, 0x3e, + 0x9c, 0x48, 0x6f, 0x6b, 0x48, 0xea, 0x77, 0x94, 0x81, 0x18, 0xbd, 0x7e, 0x73, 0x5e, 0xbd, 0xc7, + 0x89, 0x30, 0x1f, 0x31, 0xfa, 0x71, 0x62, 0x5d, 0xdf, 0x3c, 0x72, 0x9c, 0x90, 0xb9, 0x89, 0x93, + 0x18, 0x27, 0x18, 0xb3, 0xde, 0x1a, 0xa3, 0xe6, 0x28, 0x46, 0xaf, 0x31, 0x21, 0xb7, 0x6c, 0x79, + 0xbe, 0xaf, 0x29, 0x87, 0x68, 0x94, 0xc4, 0x43, 0x86, 0x5c, 0x6e, 0x5c, 0xae, 0xd7, 0x47, 0xb6, + 0x8b, 0x57, 0x95, 0xef, 0x43, 0x0d, 0x66, 0xe2, 0x59, 0x87, 0x0c, 0xc9, 0xac, 0xb8, 0x64, 0xfa, + 0x08, 0x0e, 0xe8, 0x24, 0x3d, 0x77, 0x32, 0xed, 0x30, 0x7a, 0xcf, 0xad, 0x72, 0xec, 0xdd, 0x97, + 0x59, 0x19, 0x87, 0xd1, 0xf7, 0x65, 0xef, 0x33, 0x87, 0xaa, 0x7c, 0x3f, 0xd0, 0xe0, 0x5c, 0x76, + 0x9a, 0x21, 0x43, 0xc2, 0xfd, 0xb8, 0x84, 0x6f, 0x8c, 0xf0, 0x50, 0x71, 0x32, 0x56, 0x91, 0x79, + 0x86, 0xd1, 0xc7, 0x2a, 0xfa, 0xb5, 0xad, 0x1e, 0x13, 0xb2, 0x5a, 0x10, 0xdb, 0x5e, 0xc3, 0xf7, + 0xde, 0xa0, 0xb7, 0xe5, 0x6e, 0x1f, 0xbe, 0x29, 0xe6, 0x33, 0x83, 0x67, 0x31, 0x8e, 0xde, 0xd4, + 0xf3, 0xb7, 0x05, 0x98, 0x4d, 0xcc, 0xe8, 0xd9, 0x75, 0x12, 0xf4, 0x2f, 0xbb, 0x7b, 0x49, 0x8b, + 0x1f, 0xd0, 0xbd, 0x1a, 0x02, 0x70, 0x84, 0x83, 0x3e, 0xd4, 0x60, 0xf6, 0x1d, 0x23, 0x30, 0x77, + 0x37, 0x8c, 0x60, 0x97, 0xef, 0xcc, 0xca, 0xa9, 0xbd, 0x5e, 0x8d, 0x53, 0x8d, 0x72, 0x69, 0x09, + 0x00, 0x4e, 0xf2, 0x47, 0x4f, 0xc3, 0x44, 0xc7, 0xb5, 0x6d, 0xcb, 0x69, 0x89, 0x4b, 0x34, 0x64, + 0x72, 0x78, 0x83, 0x17, 0xe3, 0x10, 0x1e, 0xbf, 0xfc, 0xa8, 0x90, 0xcb, 0x9e, 0x87, 0x44, 0x93, + 0x1e, 0x6b, 0x2b, 0x62, 0xf1, 0x61, 0xd9, 0x8a, 0xf8, 0x4f, 0x05, 0x40, 0xe9, 0x51, 0xe7, 0x41, + 0xd7, 0x83, 0x5d, 0x82, 0x92, 0x19, 0xa9, 0x8a, 0xb2, 0x79, 0x58, 0xf4, 0xa8, 0x80, 0xf2, 0x6d, + 0xfd, 0x3e, 0x31, 0xbb, 0x1e, 0x49, 0xdf, 0x06, 0xc3, 0xcb, 0xb1, 0xc4, 0x18, 0xf0, 0xb2, 0x83, + 0x0f, 0xd2, 0x5b, 0xf3, 0xdf, 0xce, 0x7d, 0xf8, 0x1d, 0xa0, 0xf3, 0x6f, 0xb3, 0xcb, 0x5f, 0x76, + 0xc5, 0xe9, 0xa1, 0xd2, 0xc0, 0x47, 0x7e, 0xeb, 0xb2, 0x32, 0x56, 0x08, 0x9d, 0xce, 0xd5, 0x08, + 0xc3, 0xe9, 0xd4, 0x3f, 0x6a, 0x30, 0xc3, 0xa7, 0xbc, 0xf5, 0x4e, 0x67, 0xc9, 0x23, 0x4d, 0x9f, + 0x36, 0x4e, 0xc7, 0xb3, 0x0e, 0x8c, 0x80, 0x84, 0x27, 0x53, 0x06, 0x6b, 0x9c, 0x0d, 0x59, 0x19, + 0x2b, 0x84, 0xd0, 0x53, 0x50, 0x34, 0x3a, 0x9d, 0x95, 0x65, 0x26, 0xc3, 0x78, 0xb4, 0x8a, 0x57, + 0xa7, 0x85, 0x98, 0xc3, 0xd0, 0x4b, 0x30, 0x63, 0x39, 0x7e, 0x60, 0xd8, 0x36, 0xdb, 0x02, 0xbb, + 0xb2, 0xcc, 0x54, 0x71, 0x3c, 0x5a, 0x93, 0x5d, 0x89, 0x41, 0x71, 0x02, 0xbb, 0xf6, 0x77, 0x93, + 0x30, 0x9f, 0x9a, 0xc1, 0xa3, 0x05, 0x18, 0xb3, 0xf8, 0x99, 0x81, 0xf1, 0x06, 0x08, 0x4a, 0x63, + 0x2b, 0xcb, 0x78, 0xcc, 0x6a, 0xaa, 0x87, 0x0b, 0xc7, 0x4e, 0xee, 0x70, 0xa1, 0x3c, 0x66, 0x3b, + 0xde, 0xef, 0x31, 0xdb, 0xe8, 0x28, 0x8f, 0x38, 0x0a, 0x93, 0x71, 0x16, 0x31, 0x3a, 0xfe, 0x83, + 0x15, 0xfc, 0xbe, 0x0e, 0xeb, 0xdd, 0x82, 0xb2, 0xd1, 0xb1, 0x8e, 0x71, 0x52, 0x8f, 0xad, 0xef, + 0xd5, 0x37, 0x56, 0xf8, 0x31, 0x3d, 0x49, 0x64, 0xe4, 0x67, 0xf4, 0x54, 0x77, 0x55, 0x7e, 0xa0, + 0xbb, 0xba, 0x04, 0x25, 0xc3, 0x0c, 0xac, 0x03, 0x22, 0x4e, 0xdb, 0x49, 0x27, 0x58, 0x67, 0xa5, + 0x58, 0x40, 0xc5, 0x25, 0x93, 0x41, 0x38, 0x28, 0x43, 0xea, 0x92, 0xc9, 0x10, 0x84, 0x55, 0x3c, + 0xf4, 0x22, 0x4c, 0x73, 0xa5, 0x09, 0xcf, 0x09, 0x4e, 0xb2, 0x8a, 0xf2, 0x76, 0x92, 0xeb, 0x2a, + 0x10, 0xc7, 0x71, 0x51, 0x1d, 0x66, 0x79, 0xc1, 0xed, 0x8e, 0xed, 0x1a, 0x4d, 0x5a, 0x7d, 0x2a, + 0xae, 0x15, 0xd7, 0xe3, 0x60, 0x9c, 0xc4, 0xef, 0x71, 0xb0, 0x70, 0xfa, 0x58, 0x07, 0x0b, 0xdf, + 0x57, 0x7d, 0x35, 0xdf, 0x1d, 0xf5, 0x56, 0xde, 0x39, 0xb5, 0x01, 0x5c, 0xf5, 0xbb, 0xc9, 0xe3, + 0xaf, 0x7c, 0xd3, 0xd4, 0xb0, 0xae, 0x95, 0x9a, 0x57, 0x53, 0x3d, 0xe0, 0xda, 0xd7, 0xb1, 0xd7, + 0xcf, 0xc0, 0xb4, 0xeb, 0xb5, 0x0c, 0xc7, 0xba, 0xcb, 0x1c, 0x8e, 0xcf, 0x36, 0x4f, 0x55, 0xb8, + 0xb6, 0xde, 0x52, 0x01, 0x38, 0x8e, 0x87, 0xee, 0x42, 0xa5, 0x15, 0x7a, 0xd9, 0xea, 0x7c, 0x2e, + 0x7e, 0x26, 0xee, 0xb5, 0xf9, 0x6e, 0x7d, 0x59, 0x86, 0x23, 0x76, 0xca, 0xa8, 0x84, 0x1e, 0x96, + 0x51, 0xe9, 0xdd, 0x32, 0x73, 0xe3, 0xf1, 0xd4, 0xe7, 0x29, 0x9d, 0x03, 0xff, 0x2c, 0x54, 0xc4, + 0x11, 0x4c, 0x31, 0x76, 0x55, 0x1a, 0x9f, 0x10, 0xaa, 0x72, 0x26, 0x75, 0x0c, 0x7c, 0x65, 0x19, + 0x47, 0xd8, 0x8a, 0xe3, 0x1d, 0xef, 0xf7, 0x94, 0x74, 0x21, 0xbf, 0x53, 0xd2, 0x3a, 0x3c, 0xca, + 0x8f, 0xc3, 0xe9, 0xfa, 0xea, 0x2b, 0xc4, 0xb3, 0x76, 0x2c, 0x93, 0x9f, 0x86, 0xe3, 0x77, 0x4e, + 0x3d, 0x29, 0x3e, 0xe2, 0xd1, 0xab, 0x59, 0x48, 0x38, 0xbb, 0xae, 0xf0, 0x74, 0xb6, 0x21, 0x3d, + 0x5d, 0x29, 0xe5, 0xe9, 0x22, 0x20, 0x8e, 0xe3, 0xf6, 0x70, 0x53, 0xe5, 0xe1, 0xdd, 0x54, 0x25, + 0x2f, 0x37, 0x15, 0xd7, 0xb8, 0x01, 0xdc, 0xd4, 0x65, 0x28, 0x8b, 0x7e, 0xf7, 0xd9, 0x06, 0xe2, + 0x8a, 0x38, 0x97, 0x26, 0xca, 0xb0, 0x84, 0xd2, 0x0e, 0xf7, 0x59, 0x4f, 0xf2, 0x0e, 0x9f, 0x1c, + 0xb8, 0xc3, 0xf5, 0xa8, 0x36, 0x56, 0x49, 0x29, 0x86, 0x3e, 0x75, 0x82, 0x47, 0xaf, 0x6b, 0x50, + 0x6a, 0x79, 0x6e, 0xb7, 0xc3, 0xb7, 0xf0, 0x0a, 0x25, 0xbf, 0xce, 0x4a, 0xb0, 0x80, 0x0c, 0xe7, + 0x0c, 0xbe, 0x5f, 0x81, 0xd9, 0xc4, 0xda, 0x43, 0xe6, 0x4c, 0x58, 0x3b, 0xe5, 0x99, 0xf0, 0x45, + 0x28, 0x04, 0x34, 0x68, 0x18, 0x8b, 0x1f, 0x12, 0x65, 0xd1, 0x02, 0x83, 0x50, 0xe3, 0x31, 0x77, + 0x89, 0xb9, 0x17, 0x1e, 0x93, 0x16, 0xd1, 0x9f, 0x34, 0x9e, 0x25, 0x15, 0x88, 0xe3, 0xb8, 0xe8, + 0xff, 0x41, 0xc5, 0x68, 0x36, 0x3d, 0xe2, 0xfb, 0xe2, 0x0e, 0x88, 0x0a, 0xf7, 0xf9, 0xf5, 0xb0, + 0x10, 0x47, 0x70, 0x1a, 0x1d, 0xed, 0x36, 0x77, 0xfc, 0xdb, 0xbe, 0x98, 0xdf, 0x2a, 0x27, 0xa7, + 0x69, 0x53, 0xd2, 0x72, 0x2c, 0x31, 0x50, 0x13, 0x66, 0xf7, 0xbc, 0xed, 0xa5, 0x25, 0xc3, 0xdc, + 0x25, 0xc7, 0x99, 0x13, 0xb1, 0xbb, 0x19, 0x6f, 0xc6, 0x29, 0xe0, 0x24, 0x49, 0xc1, 0xe5, 0x26, + 0x39, 0x0c, 0x8c, 0xed, 0xe3, 0xc4, 0x84, 0x21, 0x17, 0x95, 0x02, 0x4e, 0x92, 0xa4, 0x11, 0xdc, + 0x9e, 0xb7, 0x1d, 0x1e, 0x30, 0x15, 0x17, 0x36, 0xc8, 0x08, 0xee, 0x66, 0x04, 0xc2, 0x2a, 0x1e, + 0x6d, 0xb0, 0x3d, 0x6f, 0x1b, 0x13, 0xc3, 0x6e, 0x8b, 0x3b, 0xb1, 0x64, 0x83, 0xdd, 0x14, 0xe5, + 0x58, 0x62, 0xa0, 0x0e, 0x20, 0xfa, 0x75, 0xac, 0xdf, 0xe5, 0x09, 0x39, 0x71, 0xa6, 0xf1, 0x72, + 0xd6, 0xd7, 0x48, 0x24, 0xf5, 0x83, 0xce, 0x51, 0x77, 0x77, 0x33, 0x45, 0x07, 0x67, 0xd0, 0x46, + 0xaf, 0xc3, 0x63, 0x7b, 0xde, 0xb6, 0x48, 0x05, 0x6e, 0x78, 0x96, 0x63, 0x5a, 0x1d, 0x83, 0x1f, + 0xd9, 0x9d, 0x8c, 0x5f, 0xe1, 0x75, 0x33, 0x1b, 0x0d, 0xf7, 0xaa, 0x1f, 0x4f, 0xcb, 0x4c, 0xe5, + 0x92, 0x96, 0x49, 0x98, 0xeb, 0xb1, 0xd2, 0x32, 0xd3, 0x0f, 0x4b, 0xb0, 0xf2, 0x23, 0x0d, 0x10, + 0xdb, 0x75, 0x11, 0xde, 0x41, 0xcf, 0x9c, 0x1f, 0xba, 0x02, 0x15, 0xe6, 0xfd, 0x94, 0x33, 0x68, + 0x32, 0xbb, 0x77, 0x3d, 0x04, 0xe0, 0x08, 0x87, 0xce, 0x51, 0x5c, 0xbb, 0x49, 0xe4, 0xc1, 0x71, + 0x39, 0x47, 0xb9, 0xc5, 0x4a, 0xb1, 0x80, 0xa2, 0xeb, 0x30, 0xef, 0x91, 0x6d, 0xc3, 0x36, 0x1c, + 0x93, 0xe8, 0x81, 0x67, 0x04, 0xa4, 0x75, 0x28, 0x3c, 0x89, 0xdc, 0x55, 0x86, 0x93, 0x08, 0x38, + 0x5d, 0xa7, 0xf6, 0xaf, 0x65, 0x98, 0x4b, 0x6e, 0x17, 0x79, 0x50, 0x36, 0xe9, 0x0a, 0x54, 0x3a, + 0x86, 0x17, 0x58, 0xca, 0xb1, 0x7a, 0xf9, 0x55, 0x1b, 0x21, 0x00, 0x47, 0x38, 0x74, 0xda, 0xcf, + 0x6e, 0x18, 0x14, 0x12, 0xca, 0x69, 0x3f, 0xbb, 0x81, 0x10, 0x73, 0x58, 0xf6, 0x59, 0xed, 0xc2, + 0x89, 0x9d, 0xd5, 0xfe, 0x58, 0x5c, 0x59, 0xf8, 0x5e, 0xfa, 0xca, 0xc2, 0x37, 0x73, 0xde, 0x0b, + 0x34, 0xd8, 0xb4, 0x6b, 0xda, 0x54, 0xf5, 0x59, 0x9c, 0x4d, 0xdf, 0xcc, 0x43, 0xa4, 0x98, 0xa1, + 0xf0, 0xd9, 0x53, 0xac, 0x08, 0xc7, 0x59, 0xa3, 0x0d, 0x38, 0x6b, 0x5b, 0x6d, 0x8b, 0xaf, 0x1b, + 0xf9, 0x1b, 0xc4, 0xd3, 0x89, 0xe9, 0x3a, 0x4d, 0xe6, 0xa8, 0xc7, 0xa3, 0x44, 0xc8, 0x6a, 0x06, + 0x0e, 0xce, 0xac, 0x89, 0x9e, 0x86, 0x89, 0x03, 0xe2, 0xb1, 0xb3, 0xb4, 0x10, 0xbf, 0x27, 0xf8, + 0x15, 0x5e, 0x8c, 0x43, 0x38, 0x7a, 0x1d, 0x0a, 0xbe, 0xe1, 0xdb, 0x22, 0x50, 0x3b, 0xc6, 0xf6, + 0xc6, 0xba, 0xbe, 0x2a, 0xd4, 0x83, 0x5d, 0xc8, 0x46, 0xff, 0x63, 0x46, 0xf2, 0x94, 0x02, 0xb6, + 0x28, 0x21, 0x3c, 0x7d, 0x54, 0x42, 0x78, 0x38, 0xa7, 0xf8, 0x83, 0x12, 0xcc, 0x26, 0xf6, 0x7f, + 0x3d, 0xc8, 0xb5, 0x48, 0x4f, 0x31, 0x76, 0x84, 0xa7, 0x78, 0x06, 0xca, 0xa6, 0x6d, 0x11, 0x27, + 0x58, 0x69, 0x0a, 0x8f, 0x12, 0x9d, 0xf0, 0xe4, 0xe5, 0xcb, 0x58, 0x62, 0x9c, 0xb6, 0x5f, 0x51, + 0x1d, 0x40, 0xb1, 0xdf, 0x3b, 0x20, 0x4a, 0xa3, 0x7c, 0x72, 0x22, 0x9f, 0x93, 0xa6, 0x89, 0x8e, + 0xfd, 0xd8, 0xdf, 0x7f, 0x1a, 0x3e, 0x63, 0x50, 0xc9, 0xfb, 0x19, 0x83, 0xe1, 0x6c, 0xe4, 0x1f, + 0xc6, 0xa0, 0xbc, 0x5e, 0xdf, 0xd2, 0xd9, 0xbd, 0xa0, 0x6f, 0xc4, 0x6f, 0x3e, 0x1d, 0x46, 0xc8, + 0xf4, 0x15, 0xa7, 0xd7, 0xa8, 0x69, 0x0d, 0x7c, 0xbb, 0x69, 0x85, 0x5b, 0x1f, 0x9d, 0x67, 0xf2, + 0xea, 0x68, 0x09, 0x0a, 0xce, 0xde, 0xa0, 0x37, 0xb7, 0xb3, 0x36, 0x5b, 0xbf, 0x49, 0x0e, 0x31, + 0xab, 0x8c, 0x6e, 0x03, 0x98, 0x1e, 0x69, 0x12, 0x27, 0xb0, 0xc4, 0xc3, 0x39, 0x83, 0xad, 0x2f, + 0x2c, 0xc9, 0xca, 0x58, 0x21, 0x54, 0xfb, 0x66, 0x09, 0xe6, 0x92, 0xfb, 0x3c, 0x1f, 0xe4, 0x72, + 0x9e, 0x86, 0x09, 0xbf, 0xcb, 0xee, 0x9b, 0x10, 0x4e, 0x47, 0x0e, 0x03, 0x3a, 0x2f, 0xc6, 0x21, + 0x3c, 0xdb, 0x95, 0x8c, 0x9f, 0x8a, 0x2b, 0x29, 0xf4, 0xeb, 0x4a, 0xf2, 0x0e, 0x68, 0xde, 0x4b, + 0x5f, 0x4a, 0xfe, 0x66, 0xce, 0x3b, 0x73, 0x07, 0xf0, 0x25, 0x44, 0x58, 0xf5, 0x44, 0x2e, 0x37, + 0x35, 0x84, 0x86, 0x98, 0xba, 0x35, 0xf5, 0x21, 0xbc, 0x40, 0xeb, 0xa7, 0x45, 0x98, 0x89, 0x6f, + 0xdc, 0xa2, 0xd3, 0xe2, 0x5d, 0xd7, 0x0f, 0x44, 0xb2, 0x20, 0xf9, 0x7a, 0xd6, 0x8d, 0x08, 0x84, + 0x55, 0xbc, 0xfe, 0xc6, 0xe4, 0xa7, 0x61, 0x42, 0x5c, 0x0d, 0x25, 0x86, 0x64, 0x69, 0x45, 0xe2, + 0xfa, 0x28, 0x1c, 0xc2, 0xff, 0x77, 0x40, 0xb6, 0x7d, 0xf4, 0xad, 0xf4, 0x80, 0xfc, 0x46, 0xae, + 0xbb, 0xf4, 0x3e, 0xee, 0xe3, 0xf1, 0x70, 0xca, 0xfd, 0x3a, 0xcc, 0xa7, 0x16, 0x6f, 0xfa, 0xbb, + 0xa6, 0xf6, 0x02, 0x14, 0x1d, 0xa3, 0x4d, 0xf8, 0xed, 0x34, 0x15, 0x3e, 0xbc, 0xb1, 0x9b, 0xcc, + 0x31, 0x2f, 0xaf, 0xfd, 0xb0, 0x04, 0xf3, 0xa9, 0xdd, 0xe8, 0x6c, 0xca, 0x2b, 0x17, 0x00, 0x12, + 0x13, 0xf9, 0xcc, 0xb4, 0xff, 0x4b, 0x30, 0xc3, 0x0c, 0x63, 0x23, 0xb1, 0x6c, 0x20, 0x17, 0xb1, + 0xb7, 0x62, 0x50, 0x9c, 0xc0, 0xee, 0x6f, 0xca, 0xfc, 0x12, 0xcc, 0xa8, 0x57, 0xef, 0xaf, 0x2c, + 0x8b, 0x65, 0x61, 0xc9, 0x44, 0x8f, 0x41, 0x71, 0x02, 0x9b, 0xbd, 0x5b, 0x20, 0x07, 0x4f, 0x91, + 0x8e, 0x2b, 0x0e, 0xfe, 0x6e, 0x41, 0x82, 0x04, 0x4e, 0x11, 0x45, 0xdb, 0xb0, 0xc0, 0xd3, 0xf7, + 0xaa, 0x40, 0x32, 0xf9, 0xcf, 0xe7, 0xc5, 0x35, 0x21, 0xf4, 0xc2, 0x72, 0x4f, 0x4c, 0x7c, 0x04, + 0x95, 0x01, 0x2f, 0x5b, 0x7b, 0x3f, 0xfd, 0x08, 0xdb, 0x5b, 0x79, 0x9f, 0x61, 0x38, 0x96, 0x0d, + 0x56, 0x1e, 0x16, 0x1b, 0xfc, 0xe1, 0x24, 0x35, 0x94, 0xc4, 0x76, 0x5c, 0x54, 0x83, 0x12, 0xd3, + 0x4d, 0x3a, 0xbc, 0xc8, 0x95, 0x00, 0xa6, 0xb4, 0x3e, 0x16, 0x90, 0x3e, 0x92, 0xe4, 0x22, 0x64, + 0x1b, 0xef, 0x11, 0xb2, 0x75, 0xe0, 0x4c, 0x60, 0xfb, 0x5b, 0x5e, 0xd7, 0x0f, 0x96, 0x88, 0x17, + 0xf8, 0x42, 0x75, 0x0b, 0x03, 0xbf, 0x5c, 0xb4, 0xb5, 0xaa, 0x27, 0xa9, 0xe0, 0x2c, 0xd2, 0x54, + 0x81, 0x03, 0xdb, 0xaf, 0xdb, 0xb6, 0xfb, 0x4e, 0xb8, 0xb3, 0x20, 0x1a, 0x6c, 0xc4, 0x30, 0x22, + 0x15, 0x78, 0x6b, 0x55, 0xef, 0x81, 0x89, 0x8f, 0xa0, 0x82, 0xd6, 0xd8, 0x57, 0xbd, 0x62, 0xd8, + 0x56, 0xd3, 0x08, 0x08, 0x1d, 0x8e, 0x59, 0xf6, 0x9a, 0x5b, 0x87, 0x5c, 0x6e, 0xdc, 0x5a, 0xd5, + 0x93, 0x28, 0x38, 0xab, 0xde, 0xa8, 0x5e, 0x2f, 0xcc, 0x1c, 0xbd, 0xcb, 0xa7, 0x32, 0x7a, 0x57, + 0x06, 0xb3, 0x72, 0xc8, 0xc9, 0xca, 0x13, 0x2a, 0x3f, 0x80, 0x95, 0x37, 0x61, 0x56, 0xbe, 0x0d, + 0x21, 0x74, 0x76, 0x72, 0xe0, 0xd5, 0x8f, 0x7a, 0x9c, 0x02, 0x4e, 0x92, 0x3c, 0xa5, 0x8c, 0xd2, + 0x5f, 0x6a, 0x30, 0x47, 0x25, 0xa9, 0x07, 0xbb, 0xc4, 0xb9, 0xbb, 0x61, 0x78, 0x46, 0x3b, 0xbc, + 0xd0, 0x67, 0x27, 0xf7, 0x26, 0xaf, 0x27, 0x18, 0xf1, 0xa6, 0x97, 0xb7, 0xac, 0x26, 0xc1, 0x38, + 0x25, 0x19, 0x1d, 0xfa, 0xa2, 0xb2, 0xe3, 0x3c, 0x41, 0x78, 0x36, 0xce, 0x28, 0x1c, 0xfa, 0x92, + 0x44, 0x87, 0xf2, 0xb1, 0x0b, 0x4b, 0xf0, 0x68, 0xe6, 0xa7, 0x0e, 0xe4, 0xa8, 0xbf, 0x51, 0x12, + 0x5b, 0xea, 0x73, 0x98, 0x0b, 0xe4, 0xfd, 0xd0, 0x08, 0x0d, 0xac, 0x1c, 0xf9, 0x10, 0x4d, 0xe2, + 0x81, 0xa2, 0xe8, 0xe9, 0x99, 0x08, 0x07, 0x2d, 0xc0, 0x58, 0x73, 0x9b, 0xb9, 0xfa, 0x62, 0xb4, + 0x8f, 0x6f, 0xb9, 0x81, 0xc7, 0x9a, 0xdb, 0xe8, 0x32, 0x94, 0xc5, 0x24, 0x23, 0xdc, 0xe6, 0xc6, + 0xd8, 0x8a, 0x19, 0x88, 0x8f, 0x25, 0x74, 0x54, 0x61, 0xfd, 0x08, 0xf2, 0xf7, 0xc9, 0x9e, 0xfb, + 0xd8, 0x27, 0xda, 0x06, 0xf3, 0xd0, 0xcf, 0x28, 0x77, 0x08, 0x43, 0x3c, 0x97, 0x9b, 0xbe, 0x20, + 0x78, 0xb8, 0x80, 0xe5, 0x6f, 0x4a, 0x70, 0x2e, 0xfb, 0xa0, 0xc7, 0xc7, 0xc6, 0x1a, 0xb8, 0x72, + 0x8f, 0x67, 0x2a, 0xf7, 0x27, 0x61, 0xc2, 0x67, 0x82, 0x87, 0x2b, 0xff, 0xfc, 0x76, 0x47, 0x5e, + 0x84, 0x43, 0x18, 0x7a, 0x19, 0x50, 0xdb, 0xb8, 0xb3, 0xe6, 0xb7, 0x96, 0xdc, 0x2e, 0xbb, 0xb0, + 0x16, 0x13, 0x83, 0xdf, 0xa6, 0x5c, 0x8c, 0xf6, 0xd7, 0xac, 0xa5, 0x30, 0x70, 0x46, 0x2d, 0xb6, + 0x57, 0x21, 0xb6, 0xfe, 0x93, 0xd8, 0xe8, 0x73, 0xe4, 0x82, 0xcd, 0x88, 0xe2, 0x8f, 0x0f, 0xd3, + 0x81, 0xbb, 0x39, 0x92, 0xd3, 0x3f, 0x1f, 0xf7, 0xe8, 0xfd, 0x24, 0x4d, 0xe7, 0x67, 0x05, 0x38, + 0x93, 0x71, 0xfb, 0x43, 0xdc, 0x7b, 0x6b, 0x7d, 0x78, 0xef, 0x7d, 0xd9, 0x52, 0xf9, 0x6c, 0xb4, + 0x0e, 0x85, 0x3a, 0xa2, 0x99, 0xde, 0xd7, 0xe0, 0x2c, 0x5b, 0x60, 0x0f, 0x57, 0xf5, 0xc2, 0x1b, + 0x37, 0xc7, 0x85, 0x66, 0xf6, 0x75, 0xf5, 0xed, 0xf5, 0x0c, 0x0a, 0xd1, 0xaa, 0x63, 0x16, 0x14, + 0x67, 0x72, 0x45, 0x4b, 0x00, 0xf2, 0x30, 0x4f, 0x68, 0xc9, 0x4f, 0xb1, 0x0b, 0x7c, 0x65, 0xe9, + 0x7f, 0xb3, 0xc5, 0x7b, 0xa5, 0xb5, 0xd9, 0xcc, 0x48, 0xa9, 0x36, 0x8a, 0x67, 0x0e, 0x32, 0xba, + 0xb7, 0x7f, 0x0b, 0x18, 0x4e, 0xbb, 0xfe, 0x62, 0x1c, 0x66, 0xe2, 0x1d, 0x89, 0x2e, 0x41, 0xa9, + 0xe3, 0x91, 0x1d, 0xeb, 0x4e, 0xf2, 0xb6, 0xfb, 0x0d, 0x56, 0x8a, 0x05, 0x14, 0xb9, 0x50, 0xb2, + 0x8d, 0x6d, 0x3a, 0xde, 0xf3, 0xdb, 0x86, 0xaf, 0x0f, 0x7d, 0x73, 0x6e, 0xb8, 0xca, 0x10, 0x32, + 0x5c, 0x65, 0xe4, 0xb1, 0x60, 0x43, 0x19, 0xee, 0x58, 0xc4, 0x6e, 0xf2, 0xed, 0x9c, 0xa3, 0x60, + 0x78, 0x8d, 0x91, 0xc7, 0x82, 0x0d, 0x7a, 0x03, 0x2a, 0xfc, 0x89, 0x80, 0x66, 0xe3, 0x50, 0xcc, + 0x70, 0xff, 0x6f, 0x7f, 0x2a, 0xbb, 0x65, 0xb5, 0x49, 0x64, 0x8e, 0x4b, 0x21, 0x11, 0x1c, 0xd1, + 0x63, 0x0f, 0x20, 0xef, 0x04, 0xc4, 0xd3, 0x03, 0xc3, 0x0b, 0xdf, 0x27, 0x8e, 0x1e, 0x40, 0x96, + 0x10, 0xac, 0x60, 0xd5, 0x3e, 0x2a, 0xc1, 0x6c, 0xe2, 0x68, 0xdd, 0xaf, 0xc6, 0x29, 0x36, 0xf5, + 0x39, 0x83, 0xf1, 0xbc, 0x9f, 0x33, 0x28, 0xe4, 0x11, 0x1e, 0xac, 0xc2, 0x84, 0xd8, 0xde, 0x37, + 0x58, 0x9a, 0x8e, 0x45, 0x0a, 0x61, 0x04, 0x13, 0x92, 0x88, 0x2f, 0x0a, 0x97, 0x72, 0x59, 0x14, + 0x4e, 0xe8, 0xc5, 0xc7, 0xfe, 0x45, 0xd9, 0x0d, 0x38, 0xdb, 0x71, 0x6d, 0x3b, 0xdc, 0x5f, 0x29, + 0xdf, 0x0a, 0x29, 0xc7, 0x4f, 0xd7, 0x6c, 0x64, 0xe0, 0xe0, 0xcc, 0x9a, 0xc3, 0x39, 0xc2, 0x7f, + 0x2f, 0xc1, 0x4c, 0xfc, 0x72, 0x98, 0x53, 0xda, 0xef, 0xfe, 0x0c, 0x94, 0x59, 0xae, 0xae, 0xee, + 0x39, 0xc9, 0xe7, 0x7d, 0xb6, 0x44, 0x39, 0x96, 0x18, 0x08, 0x43, 0xc5, 0x38, 0xde, 0x83, 0xde, + 0x7c, 0xf3, 0xaa, 0x7c, 0xca, 0x3b, 0x22, 0x43, 0x69, 0xfa, 0x21, 0xfa, 0x60, 0xc6, 0xc3, 0x68, + 0xca, 0x62, 0x1c, 0x91, 0xa1, 0x83, 0x8a, 0x47, 0x5a, 0x61, 0xc2, 0x4e, 0x19, 0x54, 0x30, 0x2b, + 0xc5, 0x02, 0x8a, 0x9e, 0x86, 0x09, 0xcf, 0xb5, 0x49, 0x1d, 0xaf, 0x8b, 0x80, 0x57, 0xae, 0x65, + 0x61, 0x5e, 0x8c, 0x43, 0xf8, 0x28, 0xd6, 0x71, 0xe2, 0x0a, 0x30, 0x80, 0x09, 0x5d, 0x87, 0xf9, + 0x03, 0x91, 0x04, 0xd4, 0xad, 0x96, 0x63, 0x04, 0xd1, 0xb1, 0x28, 0xb9, 0x27, 0xf0, 0x95, 0x24, + 0x02, 0x4e, 0xd7, 0x39, 0xbd, 0x70, 0x96, 0x38, 0xcd, 0x8e, 0x6b, 0x39, 0x41, 0x32, 0x9c, 0xbd, + 0x2a, 0xca, 0xb1, 0xc4, 0x18, 0xce, 0xce, 0xfe, 0x7e, 0x02, 0x66, 0xe2, 0x97, 0x1f, 0xc5, 0x75, + 0x58, 0x1b, 0x81, 0x0e, 0x8f, 0xe5, 0xad, 0xc3, 0xe3, 0x47, 0xea, 0xf0, 0x53, 0x50, 0x64, 0xaf, + 0x40, 0x8b, 0x15, 0x21, 0xb9, 0x7e, 0xc4, 0x8e, 0xe9, 0x63, 0x0e, 0x43, 0x75, 0x3a, 0x08, 0x5b, + 0x01, 0x0d, 0x14, 0xf8, 0x9e, 0x38, 0x3e, 0xae, 0x8c, 0xab, 0x83, 0x66, 0x0c, 0x8c, 0x93, 0xf8, + 0x83, 0xd8, 0xca, 0x60, 0x0b, 0x34, 0x2f, 0xc1, 0x0c, 0x13, 0x52, 0xbc, 0xfb, 0xbe, 0xd2, 0x14, + 0x4e, 0x59, 0xae, 0x6d, 0x6d, 0xaa, 0xd0, 0x65, 0x9c, 0xc0, 0x8e, 0x5b, 0x66, 0x25, 0x1f, 0xcb, + 0xdc, 0x3c, 0xa6, 0x65, 0x8a, 0x77, 0xde, 0xa1, 0xc7, 0x3b, 0xef, 0xa7, 0xf3, 0x5c, 0x9e, 0x6a, + 0x6f, 0x53, 0x0f, 0xb2, 0x37, 0xf4, 0x06, 0x4c, 0xf9, 0xfc, 0x49, 0x11, 0x7e, 0x64, 0x65, 0x7a, + 0x10, 0x75, 0x9e, 0xbb, 0x7f, 0xef, 0xc2, 0x94, 0xae, 0x54, 0xc7, 0x31, 0x62, 0xc3, 0x19, 0xf3, + 0x57, 0xa1, 0x1c, 0x32, 0xa2, 0x0d, 0x2d, 0xeb, 0x45, 0x0d, 0x4d, 0x4d, 0x88, 0x11, 0xb9, 0x02, + 0x15, 0xb7, 0x43, 0x62, 0xef, 0x81, 0xc9, 0x30, 0xf5, 0x56, 0x08, 0xc0, 0x11, 0x0e, 0xb5, 0x22, + 0xce, 0x35, 0xb1, 0x0a, 0xfb, 0x0a, 0x2d, 0x14, 0x42, 0xd4, 0xbe, 0xa6, 0x41, 0xf8, 0xc8, 0x06, + 0x5a, 0x86, 0x62, 0xc7, 0xf5, 0x02, 0xbe, 0xfa, 0x35, 0xf9, 0xdc, 0x85, 0xec, 0xf6, 0xe1, 0x1b, + 0xf0, 0x5d, 0x2f, 0x88, 0x28, 0xd2, 0x7f, 0x3e, 0xe6, 0x95, 0xa9, 0x9c, 0xa6, 0xdd, 0xf5, 0x03, + 0xe2, 0xad, 0x6c, 0x24, 0xe5, 0x5c, 0x0a, 0x01, 0x38, 0xc2, 0xa9, 0xfd, 0x67, 0x01, 0xe6, 0x92, + 0xf7, 0x61, 0xa1, 0xb7, 0x60, 0xda, 0xb7, 0x5a, 0x8e, 0xe5, 0xb4, 0x44, 0x7e, 0x5b, 0x1b, 0xf8, + 0xf4, 0xad, 0xae, 0xd6, 0xc7, 0x71, 0x72, 0xb9, 0x6d, 0x28, 0x3b, 0x9d, 0x47, 0x97, 0xdf, 0x4b, + 0x5f, 0x44, 0xf1, 0x66, 0xce, 0x37, 0x92, 0xfd, 0x6a, 0xdf, 0x44, 0xf1, 0xcb, 0x22, 0x9c, 0xcb, + 0xbe, 0xf1, 0xec, 0x94, 0x82, 0xd6, 0xe8, 0xa4, 0xe5, 0x58, 0xcf, 0x93, 0x96, 0x51, 0x3b, 0x8f, + 0xe7, 0x74, 0x83, 0x99, 0x6c, 0x80, 0xa3, 0x5d, 0xad, 0x0c, 0xa7, 0x0b, 0x0f, 0x0c, 0xa7, 0x2f, + 0x41, 0x49, 0x5c, 0x34, 0x9d, 0x08, 0x53, 0x1b, 0xfc, 0x1a, 0x68, 0x01, 0x55, 0x42, 0x81, 0xd2, + 0x91, 0xa1, 0x00, 0x0d, 0x6d, 0xe4, 0xd3, 0xf6, 0x13, 0x83, 0x87, 0x36, 0xf2, 0x65, 0xfb, 0x88, + 0x0c, 0x3b, 0x4b, 0xdf, 0xb1, 0xa2, 0xd7, 0x70, 0xa3, 0xb3, 0xf4, 0x1b, 0x2b, 0xb7, 0xf1, 0x2a, + 0x16, 0xd0, 0x78, 0xb6, 0xb6, 0x92, 0x4b, 0xb6, 0x36, 0x5b, 0xe7, 0x4e, 0x2a, 0x57, 0x65, 0xc2, + 0x7c, 0xaa, 0xcf, 0xfb, 0xce, 0x56, 0x5d, 0x82, 0x92, 0xdf, 0xdd, 0xa1, 0x78, 0x89, 0x6b, 0x58, + 0x74, 0x56, 0x8a, 0x05, 0xb4, 0xf6, 0xdd, 0x02, 0xe5, 0x92, 0xb8, 0x1b, 0xef, 0x94, 0xac, 0xea, + 0x45, 0x98, 0xe6, 0xf9, 0xa2, 0x57, 0x95, 0x1b, 0x32, 0xca, 0xca, 0x1a, 0x80, 0x0a, 0xc4, 0x71, + 0x5c, 0xb4, 0xc2, 0xd4, 0x64, 0xe0, 0x69, 0x21, 0x08, 0x4d, 0xa2, 0x03, 0xb7, 0x20, 0x80, 0x9e, + 0x85, 0x49, 0xf6, 0x11, 0xbc, 0xc9, 0x45, 0xe2, 0x94, 0x9d, 0x85, 0xbd, 0x1a, 0x15, 0x63, 0x15, + 0x27, 0xbe, 0xfa, 0x5f, 0xcc, 0x65, 0xf5, 0x3f, 0xd5, 0x2b, 0x27, 0xa5, 0x77, 0xdf, 0x2e, 0x83, + 0x7c, 0x3a, 0x0c, 0x99, 0xa9, 0x07, 0xdc, 0x3e, 0x3b, 0xf0, 0xfa, 0x4a, 0x28, 0x0a, 0x4f, 0x36, + 0x65, 0x0c, 0x49, 0x2f, 0x03, 0x12, 0x2f, 0x86, 0x89, 0xa0, 0x9a, 0x1d, 0x62, 0xe3, 0x8a, 0x2b, + 0x17, 0x92, 0xf4, 0x14, 0x06, 0xce, 0xa8, 0x85, 0x5e, 0x66, 0xcf, 0x15, 0x06, 0x86, 0xe5, 0x48, + 0xcf, 0xfb, 0x64, 0x8f, 0x23, 0x92, 0x1c, 0x49, 0x3e, 0x3c, 0xc8, 0xff, 0xe2, 0xa8, 0x3a, 0xba, + 0x0a, 0x13, 0x07, 0xae, 0xdd, 0x6d, 0xcb, 0x57, 0xd0, 0x17, 0xb2, 0x28, 0xbd, 0xc2, 0x50, 0x94, + 0x23, 0x3d, 0xbc, 0x0a, 0x0e, 0xeb, 0x22, 0x02, 0xb3, 0x6c, 0x07, 0x8e, 0x15, 0x1c, 0x0a, 0x03, + 0x10, 0x43, 0xef, 0xa5, 0x2c, 0x72, 0x1b, 0x6e, 0x53, 0x8f, 0x63, 0xf3, 0xcd, 0x18, 0x89, 0x42, + 0x9c, 0xa4, 0x89, 0xae, 0x41, 0xd9, 0xd8, 0xd9, 0xb1, 0x1c, 0x2b, 0x38, 0x14, 0xab, 0xcd, 0x4f, + 0x64, 0xd1, 0xaf, 0x0b, 0x1c, 0x71, 0x95, 0x8a, 0xf8, 0x87, 0x65, 0x5d, 0x74, 0x1b, 0x26, 0x03, + 0xd7, 0x16, 0x71, 0xa9, 0x2f, 0x52, 0x0d, 0xe7, 0xb3, 0x48, 0x6d, 0x49, 0xb4, 0x68, 0x05, 0x33, + 0x2a, 0xf3, 0xb1, 0x4a, 0x07, 0xfd, 0x9e, 0x06, 0x53, 0x8e, 0xdb, 0x24, 0xa1, 0xe9, 0x89, 0x15, + 0xb5, 0xd7, 0x73, 0x7a, 0xf2, 0x6e, 0x71, 0x5d, 0xa1, 0xcd, 0x2d, 0x44, 0x5e, 0xb1, 0xa1, 0x82, + 0x70, 0x4c, 0x08, 0xe4, 0xc0, 0x9c, 0xd5, 0x36, 0x5a, 0x64, 0xa3, 0x6b, 0x8b, 0x1d, 0x84, 0xbe, + 0x18, 0x3c, 0x32, 0x0f, 0xd6, 0xae, 0xba, 0xa6, 0x61, 0xf3, 0x27, 0x23, 0x31, 0xd9, 0x21, 0x1e, + 0x7b, 0xb9, 0x52, 0x6e, 0x06, 0x59, 0x49, 0x50, 0xc2, 0x29, 0xda, 0xe8, 0x3a, 0xcc, 0x77, 0x3c, + 0xcb, 0x65, 0xfd, 0x66, 0x1b, 0x3e, 0x7f, 0x32, 0x10, 0xe2, 0xa7, 0x29, 0x37, 0x92, 0x08, 0x38, + 0x5d, 0x87, 0xdf, 0x00, 0xc0, 0x0b, 0xd9, 0x5c, 0xae, 0x18, 0xde, 0x00, 0xc0, 0xcb, 0xb0, 0x84, + 0x2e, 0x7c, 0x1e, 0xe6, 0x53, 0x6d, 0x33, 0x90, 0x43, 0xf8, 0x23, 0x0d, 0x92, 0x29, 0x6d, 0x3a, + 0x6f, 0x68, 0x5a, 0x1e, 0x23, 0x78, 0x98, 0x4c, 0xc3, 0x2f, 0x87, 0x00, 0x1c, 0xe1, 0xa0, 0x8b, + 0x50, 0xe8, 0x18, 0xc1, 0x6e, 0x72, 0x27, 0x1e, 0x25, 0x89, 0x19, 0x84, 0x3d, 0x51, 0x4e, 0xff, + 0x91, 0x16, 0xb9, 0xd3, 0x11, 0xd3, 0xa0, 0xe8, 0x89, 0x72, 0x09, 0xc1, 0x0a, 0x56, 0xed, 0x9f, + 0x8b, 0x30, 0x13, 0x1f, 0x5b, 0x62, 0x93, 0x4d, 0xed, 0x81, 0x93, 0xcd, 0x4b, 0x50, 0x6a, 0x93, + 0x60, 0xd7, 0x6d, 0x26, 0xc7, 0xc9, 0x35, 0x56, 0x8a, 0x05, 0x94, 0x89, 0xef, 0x7a, 0x81, 0x10, + 0x2b, 0x12, 0xdf, 0xf5, 0x02, 0xcc, 0x20, 0xe1, 0x46, 0xc2, 0x42, 0x8f, 0x8d, 0x84, 0x2d, 0x98, + 0xe3, 0xf7, 0x72, 0x2e, 0x11, 0x2f, 0x38, 0xf6, 0x06, 0x58, 0x3d, 0x41, 0x02, 0xa7, 0x88, 0xa2, + 0x26, 0xf5, 0x36, 0xb4, 0x8c, 0x55, 0x3e, 0xe6, 0xe9, 0x7a, 0x3d, 0x4e, 0x01, 0x27, 0x49, 0x8e, + 0x22, 0x1b, 0x19, 0xef, 0xc7, 0x63, 0x5f, 0xaf, 0x56, 0xce, 0xeb, 0x7a, 0xb5, 0x17, 0x60, 0xa6, + 0x6d, 0xdc, 0xd9, 0x30, 0x0e, 0x6d, 0xd7, 0x68, 0xea, 0xd6, 0x5d, 0x22, 0x0e, 0x80, 0xb2, 0xa7, + 0xe4, 0xd7, 0x62, 0x10, 0x9c, 0xc0, 0x1c, 0x6e, 0x00, 0xfe, 0xe3, 0x31, 0x40, 0xe9, 0xf7, 0x06, + 0xd0, 0x07, 0x1a, 0xcc, 0xbc, 0x13, 0x6b, 0xa3, 0xd1, 0x04, 0x67, 0x32, 0xed, 0x15, 0x2f, 0xc7, + 0x09, 0xe6, 0xca, 0x04, 0x67, 0xec, 0xe4, 0x26, 0x92, 0x8d, 0xc5, 0x1f, 0xff, 0xe2, 0xfc, 0x23, + 0x3f, 0xf9, 0xc5, 0xf9, 0x47, 0x3e, 0xfa, 0xc5, 0xf9, 0x47, 0xbe, 0x76, 0xff, 0xbc, 0xf6, 0xe3, + 0xfb, 0xe7, 0xb5, 0x9f, 0xdc, 0x3f, 0xaf, 0x7d, 0x74, 0xff, 0xbc, 0xf6, 0xf3, 0xfb, 0xe7, 0xb5, + 0xef, 0xfe, 0xdb, 0xf9, 0x47, 0xbe, 0x50, 0x0e, 0xa9, 0xfe, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xd3, 0xbe, 0x2f, 0x43, 0x9f, 0x9f, 0x00, 0x00, } func (m *AMQPConsumeConfig) Marshal() (dAtA []byte, err error) { @@ -3783,6 +3821,37 @@ func (m *EventSourceSpec) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.SFTP) > 0 { + keysForSFTP := make([]string, 0, len(m.SFTP)) + for k := range m.SFTP { + keysForSFTP = append(keysForSFTP, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForSFTP) + for iNdEx := len(keysForSFTP) - 1; iNdEx >= 0; iNdEx-- { + v := m.SFTP[string(keysForSFTP[iNdEx])] + baseI := i + { + size, err := (&v).MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(keysForSFTP[iNdEx]) + copy(dAtA[i:], keysForSFTP[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForSFTP[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0x92 + } + } if len(m.AzureQueueStorage) > 0 { keysForAzureQueueStorage := make([]string, 0, len(m.AzureQueueStorage)) for k := range m.AzureQueueStorage { @@ -6749,6 +6818,121 @@ func (m *ResourceFilter) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SFTPEventSource) 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 *SFTPEventSource) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SFTPEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + i -= len(m.PollIntervalDuration) + copy(dAtA[i:], m.PollIntervalDuration) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.PollIntervalDuration))) + i-- + dAtA[i] = 0x42 + if m.Filter != nil { + { + size, err := m.Filter.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.Metadata) > 0 { + keysForMetadata := make([]string, 0, len(m.Metadata)) + for k := range m.Metadata { + keysForMetadata = append(keysForMetadata, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + for iNdEx := len(keysForMetadata) - 1; iNdEx >= 0; iNdEx-- { + v := m.Metadata[string(keysForMetadata[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForMetadata[iNdEx]) + copy(dAtA[i:], keysForMetadata[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForMetadata[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x32 + } + } + if m.Address != nil { + { + size, err := m.Address.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } + if m.Password != nil { + { + size, err := m.Password.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + if m.Username != nil { + { + size, err := m.Username.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + { + size, err := m.WatchPathConfig.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + i -= len(m.EventType) + copy(dAtA[i:], m.EventType) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.EventType))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *SNSEventSource) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8602,6 +8786,15 @@ func (m *EventSourceSpec) Size() (n int) { n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize)) } } + if len(m.SFTP) > 0 { + for k, v := range m.SFTP { + _ = k + _ = v + l = v.Size() + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + l + sovGenerated(uint64(l)) + n += mapEntrySize + 2 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -9326,6 +9519,45 @@ func (m *ResourceFilter) Size() (n int) { return n } +func (m *SFTPEventSource) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EventType) + n += 1 + l + sovGenerated(uint64(l)) + l = m.WatchPathConfig.Size() + n += 1 + l + sovGenerated(uint64(l)) + if m.Username != nil { + l = m.Username.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Password != nil { + l = m.Password.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if m.Address != nil { + l = m.Address.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + if len(m.Metadata) > 0 { + for k, v := range m.Metadata { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } + if m.Filter != nil { + l = m.Filter.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + l = len(m.PollIntervalDuration) + n += 1 + l + sovGenerated(uint64(l)) + return n +} + func (m *SNSEventSource) Size() (n int) { if m == nil { return 0 @@ -10401,6 +10633,16 @@ func (this *EventSourceSpec) String() string { mapStringForAzureQueueStorage += fmt.Sprintf("%v: %v,", k, this.AzureQueueStorage[k]) } mapStringForAzureQueueStorage += "}" + keysForSFTP := make([]string, 0, len(this.SFTP)) + for k := range this.SFTP { + keysForSFTP = append(keysForSFTP, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForSFTP) + mapStringForSFTP := "map[string]SFTPEventSource{" + for _, k := range keysForSFTP { + mapStringForSFTP += fmt.Sprintf("%v: %v,", k, this.SFTP[k]) + } + mapStringForSFTP += "}" s := strings.Join([]string{`&EventSourceSpec{`, `EventBusName:` + fmt.Sprintf("%v", this.EventBusName) + `,`, `Template:` + strings.Replace(this.Template.String(), "Template", "Template", 1) + `,`, @@ -10435,6 +10677,7 @@ func (this *EventSourceSpec) String() string { `RedisStream:` + mapStringForRedisStream + `,`, `AzureServiceBus:` + mapStringForAzureServiceBus + `,`, `AzureQueueStorage:` + mapStringForAzureQueueStorage + `,`, + `SFTP:` + mapStringForSFTP + `,`, `}`, }, "") return s @@ -10943,6 +11186,33 @@ func (this *ResourceFilter) String() string { }, "") return s } +func (this *SFTPEventSource) String() string { + if this == nil { + return "nil" + } + keysForMetadata := make([]string, 0, len(this.Metadata)) + for k := range this.Metadata { + keysForMetadata = append(keysForMetadata, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + mapStringForMetadata := "map[string]string{" + for _, k := range keysForMetadata { + mapStringForMetadata += fmt.Sprintf("%v: %v,", k, this.Metadata[k]) + } + mapStringForMetadata += "}" + s := strings.Join([]string{`&SFTPEventSource{`, + `EventType:` + fmt.Sprintf("%v", this.EventType) + `,`, + `WatchPathConfig:` + strings.Replace(strings.Replace(this.WatchPathConfig.String(), "WatchPathConfig", "WatchPathConfig", 1), `&`, ``, 1) + `,`, + `Username:` + strings.Replace(fmt.Sprintf("%v", this.Username), "SecretKeySelector", "v1.SecretKeySelector", 1) + `,`, + `Password:` + strings.Replace(fmt.Sprintf("%v", this.Password), "SecretKeySelector", "v1.SecretKeySelector", 1) + `,`, + `Address:` + strings.Replace(fmt.Sprintf("%v", this.Address), "SecretKeySelector", "v1.SecretKeySelector", 1) + `,`, + `Metadata:` + mapStringForMetadata + `,`, + `Filter:` + strings.Replace(this.Filter.String(), "EventSourceFilter", "EventSourceFilter", 1) + `,`, + `PollIntervalDuration:` + fmt.Sprintf("%v", this.PollIntervalDuration) + `,`, + `}`, + }, "") + return s +} func (this *SNSEventSource) String() string { if this == nil { return "nil" @@ -20479,14 +20749,143 @@ func (m *EventSourceSpec) Unmarshal(dAtA []byte) error { } m.AzureQueueStorage[mapkey] = *mapvalue iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenerated(dAtA[iNdEx:]) - if err != nil { - return err + case 34: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SFTP", wireType) } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenerated + 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.SFTP == nil { + m.SFTP = make(map[string]SFTPEventSource) + } + var mapkey string + mapvalue := &SFTPEventSource{} + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthGenerated + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthGenerated + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &SFTPEventSource{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.SFTP[mapkey] = *mapvalue + 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 @@ -27901,6 +28300,424 @@ func (m *ResourceFilter) Unmarshal(dAtA []byte) error { } return nil } +func (m *SFTPEventSource) 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: SFTPEventSource: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SFTPEventSource: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EventType", 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.EventType = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WatchPathConfig", 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 err := m.WatchPathConfig.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Username", 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.Username == nil { + m.Username = &v1.SecretKeySelector{} + } + if err := m.Username.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Password", 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.Password == nil { + m.Password = &v1.SecretKeySelector{} + } + if err := m.Password.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", 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.Address == nil { + m.Address = &v1.SecretKeySelector{} + } + if err := m.Address.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", 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.Metadata == nil { + m.Metadata = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Metadata[mapkey] = mapvalue + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Filter", 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.Filter == nil { + m.Filter = &EventSourceFilter{} + } + if err := m.Filter.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PollIntervalDuration", 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.PollIntervalDuration = 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 *SNSEventSource) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/eventsource/v1alpha1/generated.proto b/pkg/apis/eventsource/v1alpha1/generated.proto index 0b622edc6f..7a52967e93 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.proto +++ b/pkg/apis/eventsource/v1alpha1/generated.proto @@ -640,6 +640,9 @@ message EventSourceSpec { // AzureQueueStorage event source map azureQueueStorage = 33; + + // SFTP event sources + map sftp = 34; } // EventSourceStatus holds the status of the event-source resource @@ -1340,6 +1343,38 @@ message ResourceFilter { optional bool afterStart = 5; } +// SFTPEventSource describes an event-source for sftp related events. +message SFTPEventSource { + // Type of file operations to watch + // Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information + optional string eventType = 1; + + // WatchPathConfig contains configuration about the file path to watch + optional WatchPathConfig watchPathConfig = 2; + + // Username required for authentication if any. + optional k8s.io.api.core.v1.SecretKeySelector username = 3; + + // Password required for authentication if any. + optional k8s.io.api.core.v1.SecretKeySelector password = 4; + + // Address sftp address. + optional k8s.io.api.core.v1.SecretKeySelector address = 5; + + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + map metadata = 6; + + // Filter + // +optional + optional EventSourceFilter filter = 7; + + // PollIntervalDuration the interval at which to poll the SFTP server + // defaults to 10 seconds + // +optional + optional string pollIntervalDuration = 8; +} + // SNSEventSource refers to event-source for AWS SNS related events message SNSEventSource { // Webhook configuration for http server diff --git a/pkg/apis/eventsource/v1alpha1/openapi_generated.go b/pkg/apis/eventsource/v1alpha1/openapi_generated.go index b3fef4677b..1fab206d0b 100644 --- a/pkg/apis/eventsource/v1alpha1/openapi_generated.go +++ b/pkg/apis/eventsource/v1alpha1/openapi_generated.go @@ -73,6 +73,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource": schema_pkg_apis_eventsource_v1alpha1_RedisStreamEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource": schema_pkg_apis_eventsource_v1alpha1_ResourceEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceFilter": schema_pkg_apis_eventsource_v1alpha1_ResourceFilter(ref), + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource": schema_pkg_apis_eventsource_v1alpha1_SFTPEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource": schema_pkg_apis_eventsource_v1alpha1_SNSEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource": schema_pkg_apis_eventsource_v1alpha1_SQSEventSource(ref), "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Selector": schema_pkg_apis_eventsource_v1alpha1_Selector(ref), @@ -1785,11 +1786,26 @@ func schema_pkg_apis_eventsource_v1alpha1_EventSourceSpec(ref common.ReferenceCa }, }, }, + "sftp": { + SchemaProps: spec.SchemaProps{ + Description: "SFTP event sources", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource"), + }, + }, + }, + }, + }, }, }, }, Dependencies: []string{ - "github.com/argoproj/argo-events/pkg/apis/common.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureQueueStorageEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureServiceBusEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketServerEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Service", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Template", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookEventSource"}, + "github.com/argoproj/argo-events/pkg/apis/common.S3Artifact", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AMQPEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureEventsHubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureQueueStorageEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.AzureServiceBusEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.BitbucketServerEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.CalendarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EmitterEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.FileEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GenericEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GithubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.GitlabEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.HDFSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.KafkaEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.MQTTEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NATSEventsSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.NSQEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PubSubEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.PulsarEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.RedisStreamEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.ResourceEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SFTPEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SNSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SQSEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Service", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.SlackEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StorageGridEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.StripeEventSource", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.Template", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WebhookEventSource"}, } } @@ -3478,6 +3494,85 @@ func schema_pkg_apis_eventsource_v1alpha1_ResourceFilter(ref common.ReferenceCal } } +func schema_pkg_apis_eventsource_v1alpha1_SFTPEventSource(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "SFTPEventSource describes an event-source for sftp related events.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "eventType": { + SchemaProps: spec.SchemaProps{ + Description: "Type of file operations to watch Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + "watchPathConfig": { + SchemaProps: spec.SchemaProps{ + Description: "WatchPathConfig contains configuration about the file path to watch", + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WatchPathConfig"), + }, + }, + "username": { + SchemaProps: spec.SchemaProps{ + Description: "Username required for authentication if any.", + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, + "password": { + SchemaProps: spec.SchemaProps{ + Description: "Password required for authentication if any.", + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, + "address": { + SchemaProps: spec.SchemaProps{ + Description: "Address sftp address.", + Ref: ref("k8s.io/api/core/v1.SecretKeySelector"), + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Metadata holds the user defined metadata which will passed along the event payload.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, + "filter": { + SchemaProps: spec.SchemaProps{ + Description: "Filter", + Ref: ref("github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceFilter"), + }, + }, + "pollIntervalDuration": { + SchemaProps: spec.SchemaProps{ + Description: "PollIntervalDuration the interval at which to poll the SFTP server defaults to 10 seconds", + Default: "", + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"eventType", "watchPathConfig"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.EventSourceFilter", "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1.WatchPathConfig", "k8s.io/api/core/v1.SecretKeySelector"}, + } +} + func schema_pkg_apis_eventsource_v1alpha1_SNSEventSource(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/eventsource/v1alpha1/types.go b/pkg/apis/eventsource/v1alpha1/types.go index 390d4676eb..d27fe84fea 100644 --- a/pkg/apis/eventsource/v1alpha1/types.go +++ b/pkg/apis/eventsource/v1alpha1/types.go @@ -120,6 +120,8 @@ type EventSourceSpec struct { AzureServiceBus map[string]AzureServiceBusEventSource `json:"azureServiceBus,omitempty" protobuf:"bytes,32,rep,name=azureServiceBus"` // AzureQueueStorage event source AzureQueueStorage map[string]AzureQueueStorageEventSource `json:"azureQueueStorage,omitempty" protobuf:"bytes,33,rep,name=azureQueueStorage"` + // SFTP event sources + SFTP map[string]SFTPEventSource `json:"sftp,omitempty" protobuf:"bytes,34,rep,name=sftp"` } func (e EventSourceSpec) GetReplicas() int32 { @@ -288,6 +290,31 @@ type FileEventSource struct { Filter *EventSourceFilter `json:"filter,omitempty" protobuf:"bytes,5,opt,name=filter"` } +// SFTPEventSource describes an event-source for sftp related events. +type SFTPEventSource struct { + // Type of file operations to watch + // Refer https://github.com/fsnotify/fsnotify/blob/master/fsnotify.go for more information + EventType string `json:"eventType" protobuf:"bytes,1,opt,name=eventType"` + // WatchPathConfig contains configuration about the file path to watch + WatchPathConfig WatchPathConfig `json:"watchPathConfig" protobuf:"bytes,2,opt,name=watchPathConfig"` + // Username required for authentication if any. + Username *corev1.SecretKeySelector `json:"username,omitempty" protobuf:"bytes,3,opt,name=username"` + // Password required for authentication if any. + Password *corev1.SecretKeySelector `json:"password,omitempty" protobuf:"bytes,4,opt,name=password"` + // Address sftp address. + Address *corev1.SecretKeySelector `json:"address,omitempty" protobuf:"bytes,5,opt,name=address"` + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + Metadata map[string]string `json:"metadata,omitempty" protobuf:"bytes,6,rep,name=metadata"` + // Filter + // +optional + Filter *EventSourceFilter `json:"filter,omitempty" protobuf:"bytes,7,opt,name=filter"` + // PollIntervalDuration the interval at which to poll the SFTP server + // defaults to 10 seconds + // +optional + PollIntervalDuration string `json:"pollIntervalDuration" protobuf:"varint,8,opt,name=pollIntervalDuration"` +} + // ResourceEventType is the type of event for the K8s resource mutation type ResourceEventType string diff --git a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go index 62fc9a79b2..11274de1fc 100644 --- a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go @@ -900,6 +900,13 @@ func (in *EventSourceSpec) DeepCopyInto(out *EventSourceSpec) { (*out)[key] = *val.DeepCopy() } } + if in.SFTP != nil { + in, out := &in.SFTP, &out.SFTP + *out = make(map[string]SFTPEventSource, len(*in)) + for key, val := range *in { + (*out)[key] = *val.DeepCopy() + } + } return } @@ -1675,6 +1682,50 @@ func (in *ResourceFilter) DeepCopy() *ResourceFilter { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *SFTPEventSource) DeepCopyInto(out *SFTPEventSource) { + *out = *in + out.WatchPathConfig = in.WatchPathConfig + if in.Username != nil { + in, out := &in.Username, &out.Username + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Password != nil { + in, out := &in.Password, &out.Password + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Address != nil { + in, out := &in.Address, &out.Address + *out = new(v1.SecretKeySelector) + (*in).DeepCopyInto(*out) + } + if in.Metadata != nil { + in, out := &in.Metadata, &out.Metadata + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Filter != nil { + in, out := &in.Filter, &out.Filter + *out = new(EventSourceFilter) + **out = **in + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new SFTPEventSource. +func (in *SFTPEventSource) DeepCopy() *SFTPEventSource { + if in == nil { + return nil + } + out := new(SFTPEventSource) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *SNSEventSource) DeepCopyInto(out *SNSEventSource) { *out = *in