From c3d6ea8d856dbf262b63dd4bb6120932e6cd1417 Mon Sep 17 00:00:00 2001 From: Anton Putra Date: Wed, 21 Sep 2022 00:32:01 -0700 Subject: [PATCH] AWS Lambda Go vs. Rust performance benchmark (#99) --- .gitignore | 5 +- docs/contents.md | 1 + lessons/128/README.md | 3 + lessons/128/functions/go/go.mod | 10 + lessons/128/functions/go/go.sum | 27 + lessons/128/functions/go/main.go | 84 + lessons/128/functions/rust/Cargo.lock | 1895 +++++++++++++++++++ lessons/128/functions/rust/Cargo.toml | 32 + lessons/128/functions/rust/src/main.rs | 82 + lessons/128/terraform/.terraform.lock.hcl | 59 + lessons/128/terraform/0-provider.tf | 14 + lessons/128/terraform/1-lambda-bucket.tf | 21 + lessons/128/terraform/2-images-bucket.tf | 30 + lessons/128/terraform/3-dynamodb.tf | 12 + lessons/128/terraform/4-rust-lambda.tf | 127 ++ lessons/128/terraform/5-go-lambda.tf | 127 ++ lessons/128/terraform/6-go-custom-lambda.tf | 127 ++ lessons/128/thumbnail.png | Bin 0 -> 82828 bytes 18 files changed, 2655 insertions(+), 1 deletion(-) create mode 100644 lessons/128/README.md create mode 100644 lessons/128/functions/go/go.mod create mode 100644 lessons/128/functions/go/go.sum create mode 100644 lessons/128/functions/go/main.go create mode 100644 lessons/128/functions/rust/Cargo.lock create mode 100644 lessons/128/functions/rust/Cargo.toml create mode 100644 lessons/128/functions/rust/src/main.rs create mode 100644 lessons/128/terraform/.terraform.lock.hcl create mode 100644 lessons/128/terraform/0-provider.tf create mode 100644 lessons/128/terraform/1-lambda-bucket.tf create mode 100644 lessons/128/terraform/2-images-bucket.tf create mode 100644 lessons/128/terraform/3-dynamodb.tf create mode 100644 lessons/128/terraform/4-rust-lambda.tf create mode 100644 lessons/128/terraform/5-go-lambda.tf create mode 100644 lessons/128/terraform/6-go-custom-lambda.tf create mode 100644 lessons/128/thumbnail.png diff --git a/.gitignore b/.gitignore index 0a69e1fd..054cdfb1 100644 --- a/.gitignore +++ b/.gitignore @@ -156,4 +156,7 @@ dist .DS_Store *.zip -*.lock \ No newline at end of file +*.lock +*target + +!Cargo.lock \ No newline at end of file diff --git a/docs/contents.md b/docs/contents.md index 5ff08c21..b71fc230 100644 --- a/docs/contents.md +++ b/docs/contents.md @@ -59,3 +59,4 @@ - [125 - How to create EKS Cluster using Terraform MODULES?](../lessons/125) - [126 - AWS Lambda Python vs. Node.js performance benchmark](../lessons/126) - [127 - How to create Application Load Balancer using Terraform?](../lessons/127) +- [128 - AWS Lambda Go vs. Rust performance benchmark](../lessons/128) diff --git a/lessons/128/README.md b/lessons/128/README.md new file mode 100644 index 00000000..c449b928 --- /dev/null +++ b/lessons/128/README.md @@ -0,0 +1,3 @@ +# AWS Lambda Go vs. Rust performance benchmark + +You can find tutorial [here](https://youtu.be/wyXIA3hfP88). diff --git a/lessons/128/functions/go/go.mod b/lessons/128/functions/go/go.mod new file mode 100644 index 00000000..1174481e --- /dev/null +++ b/lessons/128/functions/go/go.mod @@ -0,0 +1,10 @@ +module github.com/antonputra/tutorials/lessons/128/my-app + +go 1.19 + +require ( + github.com/aws/aws-lambda-go v1.34.1 + github.com/aws/aws-sdk-go v1.44.100 +) + +require github.com/jmespath/go-jmespath v0.4.0 // indirect diff --git a/lessons/128/functions/go/go.sum b/lessons/128/functions/go/go.sum new file mode 100644 index 00000000..2304b5aa --- /dev/null +++ b/lessons/128/functions/go/go.sum @@ -0,0 +1,27 @@ +github.com/aws/aws-lambda-go v1.34.1 h1:M3a/uFYBjii+tDcOJ0wL/WyFi2550FHoECdPf27zvOs= +github.com/aws/aws-lambda-go v1.34.1/go.mod h1:jwFe2KmMsHmffA1X2R09hH6lFzJQxzI8qK17ewzbQMM= +github.com/aws/aws-sdk-go v1.44.100 h1:7I86bWNQB+HGDT5z/dJy61J7qgbgLoZ7O51C9eL6hrA= +github.com/aws/aws-sdk-go v1.44.100/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/lessons/128/functions/go/main.go b/lessons/128/functions/go/main.go new file mode 100644 index 00000000..c1afea0b --- /dev/null +++ b/lessons/128/functions/go/main.go @@ -0,0 +1,84 @@ +package main + +import ( + "io/ioutil" + "math/rand" + "os" + "time" + + "github.com/aws/aws-lambda-go/lambda" + "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/dynamodb" + "github.com/aws/aws-sdk-go/service/s3" +) + +func main() { + lambda.Start(LambdaHandler) +} + +func LambdaHandler() (int, error) { + bucket := os.Getenv("BUCKET_NAME") + key := "thumbnail.png" + tableName := "images" + + sess := session.Must(session.NewSessionWithOptions(session.Options{ + SharedConfigState: session.SharedConfigEnable, + })) + + date, err := getS3Object(bucket, key, sess) + if err != nil { + return 500, err + } + newDate := getNewDate(date) + + err = saveLastModified(tableName, newDate, sess) + if err != nil { + return 500, err + } + return 200, nil +} + +// getS3Object downloads S3 object and returns last modified date in UTC format. +func getS3Object(bucket string, key string, sess *session.Session) (*time.Time, error) { + svc := s3.New(sess) + input := &s3.GetObjectInput{ + Bucket: aws.String(bucket), + Key: aws.String(key), + } + output, err := svc.GetObject(input) + if err != nil { + return nil, err + } + _, err = ioutil.ReadAll(output.Body) + if err != nil { + return nil, err + } + return output.LastModified, nil +} + +// saveLastModified saves the last modified date to the DynamoDB table. +func saveLastModified(tableName string, date string, sess *session.Session) error { + svc := dynamodb.New(sess) + input := &dynamodb.PutItemInput{ + Item: map[string]*dynamodb.AttributeValue{ + "last_modified_date": { + S: aws.String(date), + }, + }, + TableName: aws.String(tableName), + } + _, err := svc.PutItem(input) + if err != nil { + return err + } + return nil +} + +// getNewDate generates new random date. +func getNewDate(date *time.Time) string { + seed := rand.NewSource(time.Now().UnixNano()) + rand := rand.New(seed) + randomNumberOfDays := rand.Intn(10000) + return date.AddDate(0, 0, randomNumberOfDays).String() +} diff --git a/lessons/128/functions/rust/Cargo.lock b/lessons/128/functions/rust/Cargo.lock new file mode 100644 index 00000000..b397bbd0 --- /dev/null +++ b/lessons/128/functions/rust/Cargo.lock @@ -0,0 +1,1895 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "async-stream" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "aws-config" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d4cf4608abd7c8038a4c609a1270e61b73c86550f5655654ca28322e0a2e2c1" +dependencies = [ + "aws-http", + "aws-sdk-sso", + "aws-sdk-sts", + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-json", + "aws-smithy-types", + "aws-types", + "bytes", + "hex", + "http", + "hyper", + "ring", + "time 0.3.14", + "tokio", + "tower", + "tracing", + "zeroize", +] + +[[package]] +name = "aws-endpoint" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffaf1da7a11d38a5afe7cdd202ab2e25528de7cf38c47b571c0dde4008d98ae" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "aws-types", + "http", + "regex", + "tracing", +] + +[[package]] +name = "aws-http" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8309108743e2e74f249ff29a7c7be79c6343ea649dd8c31e4c0e07ca6946d8ed" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "aws-types", + "bytes", + "http", + "http-body", + "lazy_static", + "percent-encoding", + "pin-project-lite", + "tracing", +] + +[[package]] +name = "aws-sdk-dynamodb" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd64080eb5ef33254564f5995ec939e28a0157acafe5de05dc534e207a97c8e6" +dependencies = [ + "aws-endpoint", + "aws-http", + "aws-sig-auth", + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-json", + "aws-smithy-types", + "aws-types", + "bytes", + "fastrand", + "http", + "tokio-stream", + "tower", +] + +[[package]] +name = "aws-sdk-s3" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "323b9107094fc396a0116326b577af48d9cfb26ec7c09588584ec82cee057b81" +dependencies = [ + "aws-endpoint", + "aws-http", + "aws-sig-auth", + "aws-sigv4", + "aws-smithy-async", + "aws-smithy-checksums", + "aws-smithy-client", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "bytes-utils", + "http", + "http-body", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "aws-sdk-sso" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7a0659e5269f8c4bd06f362ec7e35b4f55956c4d60e0ca177b575db80584a45" +dependencies = [ + "aws-endpoint", + "aws-http", + "aws-sig-auth", + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-json", + "aws-smithy-types", + "aws-types", + "bytes", + "http", + "tokio-stream", + "tower", +] + +[[package]] +name = "aws-sdk-sts" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edc795c7851c0e9bcefde5e6bb610c16a9e03220e0336fc12f75bb80d9ce7e80" +dependencies = [ + "aws-endpoint", + "aws-http", + "aws-sig-auth", + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-query", + "aws-smithy-types", + "aws-smithy-xml", + "aws-types", + "bytes", + "http", + "tower", +] + +[[package]] +name = "aws-sig-auth" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee4bf20136757fd9f606bb4adafe6d19fb02bc48033a8d4f205f21d56fa783a" +dependencies = [ + "aws-sigv4", + "aws-smithy-eventstream", + "aws-smithy-http", + "aws-types", + "http", + "tracing", +] + +[[package]] +name = "aws-sigv4" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99b21b3aceaf224cccd693b353e1f38af4ede8c5fc618b97dd458bb63238efc" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-http", + "bytes", + "form_urlencoded", + "hex", + "http", + "once_cell", + "percent-encoding", + "regex", + "ring", + "time 0.3.14", + "tracing", +] + +[[package]] +name = "aws-smithy-async" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef79062cf5fa881dd156938ca438ec2de0f7ec9342c2f84fa6303274e1484b43" +dependencies = [ + "futures-util", + "pin-project-lite", + "tokio", + "tokio-stream", +] + +[[package]] +name = "aws-smithy-checksums" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6face4c12b335ba734a4416c15d5eeb0af88aa61182a84ff50db62bfa261183" +dependencies = [ + "aws-smithy-http", + "aws-smithy-types", + "bytes", + "crc32c", + "crc32fast", + "hex", + "http", + "http-body", + "md-5", + "pin-project-lite", + "sha1", + "sha2", + "tracing", +] + +[[package]] +name = "aws-smithy-client" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13f402fa9a45353f7f02f8046a6a568143844d201c5b4cc3bedb6442058538c8" +dependencies = [ + "aws-smithy-async", + "aws-smithy-http", + "aws-smithy-http-tower", + "aws-smithy-types", + "bytes", + "fastrand", + "http", + "http-body", + "hyper", + "hyper-rustls", + "lazy_static", + "pin-project-lite", + "tokio", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-eventstream" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b959c2c1752c2afbd863953046c06f7ee592f68d64719b7bab3193ac3b0fa77" +dependencies = [ + "aws-smithy-types", + "bytes", + "crc32fast", +] + +[[package]] +name = "aws-smithy-http" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23861d0b53a1369eab1e8d48c8bb3492eb3def1c2f2222dfb1bad58dd03914a5" +dependencies = [ + "aws-smithy-eventstream", + "aws-smithy-types", + "bytes", + "bytes-utils", + "futures-core", + "http", + "http-body", + "hyper", + "once_cell", + "percent-encoding", + "pin-project-lite", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "aws-smithy-http-tower" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f6b3ae42d5c52bbaadfdd31c09fd11c92b823d329915dedbb08c0e9525755c" +dependencies = [ + "aws-smithy-http", + "bytes", + "http", + "http-body", + "pin-project-lite", + "tower", + "tracing", +] + +[[package]] +name = "aws-smithy-json" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5048b693643803c001f88fad36c5a7aa1159e56b0025527fadc57e830aa48b11" +dependencies = [ + "aws-smithy-types", +] + +[[package]] +name = "aws-smithy-query" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b317cd3b326444e659a2f287f67e8c72903495c71a3473b0764880454b3aa25c" +dependencies = [ + "aws-smithy-types", + "urlencoding", +] + +[[package]] +name = "aws-smithy-types" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4149b09b9d8cf37f0afc390144f5d71b8f4daadfd9540ddf43ad27b54d407470" +dependencies = [ + "itoa", + "num-integer", + "ryu", + "time 0.3.14", +] + +[[package]] +name = "aws-smithy-types-convert" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb7e3108765ca78bc373f40c4a65aa520b6cf79e2fbe739d7213f6bb3d54568" +dependencies = [ + "aws-smithy-types", + "chrono", +] + +[[package]] +name = "aws-smithy-xml" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c6d8e7a15feb04f041cf0ede8f6c16e03fe5a4b03e164ae3a090e829404d925" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "aws-types" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bba03e59e1a0223a2bd3567da2b07a458b067ccf7846996b82406e80008ebc1" +dependencies = [ + "aws-smithy-async", + "aws-smithy-client", + "aws-smithy-http", + "aws-smithy-types", + "http", + "rustc_version", + "tracing", + "zeroize", +] + +[[package]] +name = "aws_lambda_events" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55d7e5deac5e49330042b4e174dafe84ebf71685bfcd94f285bac7aa31e0aeb1" +dependencies = [ + "base64", + "bytes", + "chrono", + "http", + "http-body", + "http-serde", + "query_map", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bumpalo" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" + +[[package]] +name = "bytes" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +dependencies = [ + "serde", +] + +[[package]] +name = "bytes-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47d3a8076e283f3acd27400535992edb3ba4b5bb72f8891ad8fbe7932a7d4b9" +dependencies = [ + "bytes", + "either", +] + +[[package]] +name = "cc" +version = "1.0.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfd4d1b31faaa3a89d7934dbded3111da0d2ef28e3ebccdb4f0179f5929d1ef1" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "serde", + "time 0.1.44", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32c" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfea2db42e9927a3845fb268a10a72faed6d416065f77873f05e411457c363e" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ct-logs" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1a816186fa68d9e426e3cb4ae4dff1fcd8e4a2c34b781bf7a822574a0d0aac8" +dependencies = [ + "sct", +] + +[[package]] +name = "digest" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "either" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" + +[[package]] +name = "encoding_rs" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" + +[[package]] +name = "futures-executor" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" + +[[package]] +name = "futures-macro" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" + +[[package]] +name = "futures-task" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" + +[[package]] +name = "futures-util" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "h2" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "http" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-serde" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e272971f774ba29341db2f686255ff8a979365a26fb9e4277f6b6d9ec0cdd5e" +dependencies = [ + "http", + "serde", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64" +dependencies = [ + "ct-logs", + "futures-util", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "webpki", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "237a0714f28b1ee39ccec0770ccb544eb02c9ef2c82bb096230eefcffa6468b0" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "js-sys", + "once_cell", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itoa" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754" + +[[package]] +name = "js-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lambda_http" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9542aeed47b5ac3484b290b78f0af4d35739886dfaaa85da3151327a8ce47a" +dependencies = [ + "aws_lambda_events", + "base64", + "bytes", + "encoding_rs", + "http", + "http-body", + "hyper", + "lambda_runtime", + "mime", + "query_map", + "serde", + "serde_json", + "serde_urlencoded", + "url", +] + +[[package]] +name = "lambda_runtime" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37a81840726d481d20b99a9ce87430f644e9590cb77715e1e66c5f4432c9b586" +dependencies = [ + "async-stream", + "bytes", + "futures", + "http", + "hyper", + "lambda_runtime_api_client", + "serde", + "serde_json", + "tokio", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "lambda_runtime_api_client" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54698c666ffe503cb51fa66e4567e53e806128a10359de7095999d925a771ed" +dependencies = [ + "http", + "hyper", + "tokio", + "tower-service", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.133" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0f80d65747a3e43d1596c7c5492d95d5edddaabd45a7fcdb02b95f644164966" + +[[package]] +name = "lock_api" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "md-5" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b48670c893079d3c2ed79114e3644b7004df1c361a4e0ad52e2e6940d07c3d" +dependencies = [ + "digest", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mio" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" +dependencies = [ + "libc", + "log", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_threads" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +dependencies = [ + "libc", +] + +[[package]] +name = "once_cell" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-sys", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pin-project" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "ppv-lite86" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" + +[[package]] +name = "proc-macro2" +version = "1.0.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "query_map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe3212d819cbdcce67f786cdaf3fe0c2e9d09a6dcd9c9367a1bd344135b8c809" +dependencies = [ + "form_urlencoded", + "serde", + "serde_derive", +] + +[[package]] +name = "quote" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "rust" +version = "0.1.0" +dependencies = [ + "aws-config", + "aws-sdk-dynamodb", + "aws-sdk-s3", + "aws-smithy-types-convert", + "chrono", + "lambda_http", + "lambda_runtime", + "rand", + "tokio", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustls" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7" +dependencies = [ + "base64", + "log", + "ring", + "sct", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a07b7c1885bd8ed3831c289b7870b13ef46fe0e856d288c30d9cc17d75a2092" +dependencies = [ + "openssl-probe", + "rustls", + "schannel", + "security-framework", +] + +[[package]] +name = "ryu" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "sct" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b362b83898e0e69f38515b82ee15aa80636befe47c3b6d3d89a911e78fc228ce" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "security-framework" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" + +[[package]] +name = "serde" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1" + +[[package]] +name = "socket2" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "syn" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52205623b1b0f064a4e71182c3b18ae902267282930c6d5462c91b859668426e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thread_local" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +dependencies = [ + "once_cell", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + +[[package]] +name = "time" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b" +dependencies = [ + "libc", + "num_threads", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0020c875007ad96677dcc890298f4b942882c5d4eb7cc8f439fc3bf813dc9c95" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-rustls" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc6844de72e57df1980054b38be3a9f4702aba4858be64dd700181a8a6d0e1b6" +dependencies = [ + "rustls", + "tokio", + "webpki", +] + +[[package]] +name = "tokio-stream" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6edf2d6bc038a43d31353570e27270603f4648d18f5ed10c0e179abe43255af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343bc9466d3fe6b0f960ef45960509f84480bf4fd96f92901afe7ff3df9d3a62" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307" +dependencies = [ + "cfg-if", + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11c75893af559bc8e10716548bdef5cb2b983f8e637db9d0e15126b61b484ee2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60db860322da191b40952ad9affe65ea23e7dd6a5c442c2c42865810c6ab8e6b" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "typenum" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-ident" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "urlencoding" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8db7427f936968176eaa7cdf81b7f98b980b18495ec28f1b5791ac3bfe3eea9" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" + +[[package]] +name = "web-sys" +version = "0.3.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki" +version = "0.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "xmlparser" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8" + +[[package]] +name = "zeroize" +version = "1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c394b5bd0c6f669e7275d9c20aa90ae064cb22e75a1cad54e1b34088034b149f" diff --git a/lessons/128/functions/rust/Cargo.toml b/lessons/128/functions/rust/Cargo.toml new file mode 100644 index 00000000..f1ebbf0c --- /dev/null +++ b/lessons/128/functions/rust/Cargo.toml @@ -0,0 +1,32 @@ +[package] +name = "rust" +version = "0.1.0" +edition = "2021" + +# Starting in Rust 1.62 you can use `cargo add` to add dependencies +# to your project. +# +# If you're using an older Rust version, +# download cargo-edit(https://github.com/killercup/cargo-edit#installation) +# to install the `add` subcommand. +# +# Running `cargo add DEPENDENCY_NAME` will +# add the latest version of a dependency to the list, +# and it will keep the alphabetic ordering for you. + +[dependencies] +aws-config = "0.48.0" +aws-sdk-s3 = "0.18.0" +aws-sdk-dynamodb = "0.18.0" +aws-smithy-types-convert = { version = "0.48.0", features = ["convert-chrono"] } +lambda_http = { version = "0.6.1", default-features = false, features = [ + "apigw_http", +] } +lambda_runtime = "0.6.1" +tokio = { version = "1", features = ["full"] } +tracing = { version = "0.1", features = ["log"] } +tracing-subscriber = { version = "0.3", default-features = false, features = [ + "fmt", +] } +chrono = "0.4.22" +rand = "0.8.5" diff --git a/lessons/128/functions/rust/src/main.rs b/lessons/128/functions/rust/src/main.rs new file mode 100644 index 00000000..073d8beb --- /dev/null +++ b/lessons/128/functions/rust/src/main.rs @@ -0,0 +1,82 @@ +use aws_config::SdkConfig; +use aws_sdk_dynamodb::model::AttributeValue; +use aws_sdk_s3::types::DateTime; +use aws_smithy_types_convert::date_time::DateTimeExt; +use chrono::Duration as OldDuration; +use chrono::Utc; +use lambda_http::{run, service_fn, Body, Error, Request, Response}; +use rand::Rng; +use std::env; +use std::time::Duration; + +async fn function_handler(_event: Request) -> Result, Error> { + let bucket = env::var("BUCKET_NAME").expect("failed to get env"); + let key = "thumbnail.png"; + let table_name = "images"; + let config = aws_config::load_from_env().await; + + let date = get_s3_object(&bucket, &key, &config).await; + let date = get_new_date(date); + + save_last_modified(&table_name, &date.to_string(), &config).await; + + let resp = Response::builder() + .status(200) + .header("content-type", "application/json") + .body("OK".into()) + .map_err(Box::new)?; + Ok(resp) +} + +#[tokio::main] +async fn main() -> Result<(), Error> { + tracing_subscriber::fmt() + .with_max_level(tracing::Level::INFO) + .with_target(false) + .without_time() + .init(); + + run(service_fn(function_handler)).await +} + +// Downloads S3 object and returns last modified date in UTC format. +async fn get_s3_object(bucket: &str, key: &str, config: &SdkConfig) -> chrono::DateTime { + let client = aws_sdk_s3::Client::new(config); + + let object = client + .get_object() + .bucket(bucket) + .key(key) + .send() + .await + .expect("failed to fetch S3 object"); + + let date = object.last_modified().expect("failed to get date"); + let date: DateTime = date.clone().into(); + + object.body.collect().await.expect("failed to read body"); + date.to_chrono_utc() +} + +// Saves the last modified date to the DynamoDB table. +async fn save_last_modified(table_name: &str, date: &str, config: &SdkConfig) { + let client = aws_sdk_dynamodb::Client::new(config); + let date = AttributeValue::S(date.into()); + + client + .put_item() + .table_name(table_name) + .item("last_modified_date", date) + .send() + .await + .expect("failed to sate item to dynamodb"); +} + +// Generates new random date. +fn get_new_date(date: chrono::DateTime) -> chrono::DateTime { + let random_number_of_days = rand::thread_rng().gen_range(1..=10000) * 60 * 60 * 24; + + let duration = Duration::new(random_number_of_days, 0); + let duration = OldDuration::from_std(duration).expect("failed"); + date.checked_add_signed(duration).expect("failed") +} diff --git a/lessons/128/terraform/.terraform.lock.hcl b/lessons/128/terraform/.terraform.lock.hcl new file mode 100644 index 00000000..e0288014 --- /dev/null +++ b/lessons/128/terraform/.terraform.lock.hcl @@ -0,0 +1,59 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/archive" { + version = "2.2.0" + hashes = [ + "h1:62mVchC1L6vOo5QS9uUf52uu0emsMM+LsPQJ1BEaTms=", + "zh:06bd875932288f235c16e2237142b493c2c2b6aba0e82e8c85068332a8d2a29e", + "zh:0c681b481372afcaefddacc7ccdf1d3bb3a0c0d4678a526bc8b02d0c331479bc", + "zh:100fc5b3fc01ea463533d7bbfb01cb7113947a969a4ec12e27f5b2be49884d6c", + "zh:55c0d7ddddbd0a46d57c51fcfa9b91f14eed081a45101dbfc7fd9d2278aa1403", + "zh:73a5dd68379119167934c48afa1101b09abad2deb436cd5c446733e705869d6b", + "zh:841fc4ac6dc3479981330974d44ad2341deada8a5ff9e3b1b4510702dfbdbed9", + "zh:91be62c9b41edb137f7f835491183628d484e9d6efa82fcb75cfa538c92791c5", + "zh:acd5f442bd88d67eb948b18dc2ed421c6c3faee62d3a12200e442bfff0aa7d8b", + "zh:ad5720da5524641ad718a565694821be5f61f68f1c3c5d2cfa24426b8e774bef", + "zh:e63f12ea938520b3f83634fc29da28d92eed5cfbc5cc8ca08281a6a9c36cca65", + "zh:f6542918faa115df46474a36aabb4c3899650bea036b5f8a5e296be6f8f25767", + ] +} + +provider "registry.terraform.io/hashicorp/aws" { + version = "4.31.0" + constraints = "~> 4.31.0" + hashes = [ + "h1:h/PywKme1EHT3cIIJhG7BJP6dYEIlFx3wcnI2eYi9Y4=", + "zh:14169119237a7ae174ea19f13edf34ed4de963ab97d937fee9d1f1ddd706f883", + "zh:24276942da2b858c2dd9eb0428cfd82b46e758fa00ae38685f05380f75034a8f", + "zh:378f1a9f603995bb76827b703ace8bf5212a9c7b96a106f4a87a9871249c885f", + "zh:38e992e1137d2e8dc203edd659432c21c87c7cbf99439b68253afdb82a079ead", + "zh:56ff847dd504d4098ff4ea7501c8d5ffae4e1ba0dacb85f658d992de474c8fec", + "zh:5b2ab38ba7d04e0d3c5bf0a0ab1aafe806faaa9be228480b772606bd32d41620", + "zh:6e6c6b10f05018691ef767efadc60fe3cd38adb2e66e65a74fa2be0ce3d7f49d", + "zh:90e9fb656d7c19cf702834d7da275b65fc40fbef10224f6f8295a40ca2acb43b", + "zh:92b5eaca47b3ab1829cf4cd96dc144f456bc023329f3e20cf3d5fdc913e6e5e3", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:ad782fb8ead528a0d8c7c77d1a417f4d8ceaaefbfc0a0c34993ba92e6dc5ff41", + "zh:b121595f53c85bdbb59504b255628d219c42586cb258f0d4cf8a532a98f766e5", + ] +} + +provider "registry.terraform.io/hashicorp/random" { + version = "3.4.3" + hashes = [ + "h1:saZR+mhthL0OZl4SyHXZraxyaBNVMxiZzks78nWcZ2o=", + "zh:41c53ba47085d8261590990f8633c8906696fa0a3c4b384ff6a7ecbf84339752", + "zh:59d98081c4475f2ad77d881c4412c5129c56214892f490adf11c7e7a5a47de9b", + "zh:686ad1ee40b812b9e016317e7f34c0d63ef837e084dea4a1f578f64a6314ad53", + "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", + "zh:84103eae7251384c0d995f5a257c72b0096605048f757b749b7b62107a5dccb3", + "zh:8ee974b110adb78c7cd18aae82b2729e5124d8f115d484215fd5199451053de5", + "zh:9dd4561e3c847e45de603f17fa0c01ae14cae8c4b7b4e6423c9ef3904b308dda", + "zh:bb07bb3c2c0296beba0beec629ebc6474c70732387477a65966483b5efabdbc6", + "zh:e891339e96c9e5a888727b45b2e1bb3fcbdfe0fd7c5b4396e4695459b38c8cb1", + "zh:ea4739860c24dfeaac6c100b2a2e357106a89d18751f7693f3c31ecf6a996f8d", + "zh:f0c76ac303fd0ab59146c39bc121c5d7d86f878e9a69294e29444d4c653786f8", + "zh:f143a9a5af42b38fed328a161279906759ff39ac428ebcfe55606e05e1518b93", + ] +} diff --git a/lessons/128/terraform/0-provider.tf b/lessons/128/terraform/0-provider.tf new file mode 100644 index 00000000..ebfd26a8 --- /dev/null +++ b/lessons/128/terraform/0-provider.tf @@ -0,0 +1,14 @@ +provider "aws" { + region = "us-east-1" +} + +terraform { + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 4.31.0" + } + } + + required_version = "~> 1.0" +} diff --git a/lessons/128/terraform/1-lambda-bucket.tf b/lessons/128/terraform/1-lambda-bucket.tf new file mode 100644 index 00000000..a4777784 --- /dev/null +++ b/lessons/128/terraform/1-lambda-bucket.tf @@ -0,0 +1,21 @@ +# Generate a random string to create a unique S3 bucket +resource "random_pet" "lambda_bucket_name" { + prefix = "lambda" + length = 2 +} + +# Create an S3 bucket to store lambda source code (zip archives) +resource "aws_s3_bucket" "lambda_bucket" { + bucket = random_pet.lambda_bucket_name.id + force_destroy = true +} + +# Disable all public access to the S3 bucket +resource "aws_s3_bucket_public_access_block" "lambda_bucket" { + bucket = aws_s3_bucket.lambda_bucket.id + + block_public_acls = true + block_public_policy = true + ignore_public_acls = true + restrict_public_buckets = true +} diff --git a/lessons/128/terraform/2-images-bucket.tf b/lessons/128/terraform/2-images-bucket.tf new file mode 100644 index 00000000..57ce1a11 --- /dev/null +++ b/lessons/128/terraform/2-images-bucket.tf @@ -0,0 +1,30 @@ +# Generate random id for S3 bucket. +resource "random_id" "server" { + byte_length = 4 +} + +# Create an S3 bucket to store images for benchmark test. +resource "aws_s3_bucket" "images_bucket" { + bucket = "images-${random_id.server.hex}" + force_destroy = true +} + +# Disable all public access to the S3 bucket. +resource "aws_s3_bucket_public_access_block" "images_bucket" { + bucket = aws_s3_bucket.images_bucket.id + + block_public_acls = true + block_public_policy = true + ignore_public_acls = true + restrict_public_buckets = true +} + +# Upload test image to S3 bucket. +resource "aws_s3_object" "image" { + bucket = aws_s3_bucket.images_bucket.id + + key = "thumbnail.png" + source = "../thumbnail.png" + + etag = filemd5("../thumbnail.png") +} diff --git a/lessons/128/terraform/3-dynamodb.tf b/lessons/128/terraform/3-dynamodb.tf new file mode 100644 index 00000000..8473d36f --- /dev/null +++ b/lessons/128/terraform/3-dynamodb.tf @@ -0,0 +1,12 @@ +resource "aws_dynamodb_table" "images" { + name = "images" + billing_mode = "PROVISIONED" + read_capacity = 5 + write_capacity = 100 + hash_key = "last_modified_date" + + attribute { + name = "last_modified_date" + type = "S" + } +} diff --git a/lessons/128/terraform/4-rust-lambda.tf b/lessons/128/terraform/4-rust-lambda.tf new file mode 100644 index 00000000..1e86ed8b --- /dev/null +++ b/lessons/128/terraform/4-rust-lambda.tf @@ -0,0 +1,127 @@ +resource "aws_iam_role" "rust_lambda_exec" { + name = "rust-lambda" + + assume_role_policy = <|zDk?!tBxRE&#wv{qKe3nJ4NFAW4YGO1@X~Oxs`bFq$;mcz#UR7j>vF$2*E|m9>wV zo&6^0dmTY`izs4R({D=C@Ojxxb1l^8OB_QGD(aI84_zyUCD$WeS^of1QtO|M22hX0 z#?9Mn=O|Y(Nl1E@De+)%0vI}7FfkXZTs&w6Yc-M`~T+v0RF$t zfxv%}g%kzz%8OXld@aSG4@TWF-cutm%HBx&yq_T=5PfcD3IrO30vO@m02(uk_Bp@R+QD-sZd{s4d(X!W6$J~_k? zJB<637pwB*)uqR`p^hE;mjJfjF)ucl7ZT@OPf~SRd$+|2t)GhEd`;gn1^`s2|MJ3Q z&6}fG)E29Ow8w4XHTdZ7k&p=g{S)@wqK7)G<&6Cq+fQ~t?2j0L0zT1?cLHG;;T!4P zPa?$GIKa<8{om&v>SYQy)vYvk*cw%l05FRDzpvN%QaG(jfJKFp;==U=-A6L6%r6Vg zzX<@^fq$a_Vg~VF(h{X|m7Y-FJOQ3Efb)q;TyYlbsjz#50t9v5QO4iS;OgmuXhZsh z9e7GVLREarMEwdmP_Vn;6SC=+V;h=gC-+m}4gF3$D*&{i4Hv~Q51a~FPQqO=N=*q< z^3T1=Mm|gDWKg}P?6NC=6<(oL5{z9ORjs96In~XMq1f2aBcmK2@#MqGGhir1H2wzR zJ$#aPuk&6xeqZV<%u7!U92_4UoL=^|w|2tRJ2lTjN};!JIjG(;3Ncerad9(!T{)*k@;dzz%m6Fs4zj zs{b>*=ShI4{V6I=hMSntXTL&kJ4{p?-iJDfjuL>c&+GK}|5hp!kZIcF``Gg-*0?)3 zsc?4Zd&yu6^;yMD0bS#Vde-1?#GT?%VJBnt!3t!FYdLa}^IPik zmds3*)YQ$X%g?2brfnM!Si)?$#8$tfQMy$8K0^PYRXIc?5efqUdBlk#I?T65#pK!Nl^>Qg;CH7#%F4x){-f=DuA6E1pvRxkWw`=RdiV&21&!rzWIoD0uKohQw| z{nAl>HlyvA2=fw_xCo0-fTyxMT(vEhL{4r#z1i&NA<)a$@L6`J6&5CxG1;Vj#A z|JevB*PEeqESBPu`_shg=PxOW9rwmx98le4J75Zb0~X~m)9-#DhBORF{m8rs!I}SW zk!OyDMn2oQN`BB$xzmo5R!HU2JIW1kT;1^WKQL_cf3SDaR!{Hi4=bu<4YK;4K`y|4 zUsDWw+a-lKml(o_*UHb7&Q%rXXAKR}T220G_d{)K_PAGpk4U9eU29IFMuJF){RcY` zsSVvTV`ePZ(RZ?!Qadr-!`s!YZk*;c<^G$D=*{8Gcz?soO2yYQG}XEy{33g0a8^PA z_DWue6^HKf)j5o%5q&}NqbLp$p->>O=mU@WeAZIi;D97e4Z_bG2>>O~z*w6{U~!g> z`{d_bLDb;DdJc|w9yhG;uJ3ynDQMEsp3!YP8! z@Urp_bgt!NQIz_^2J&S3qf<+nV8NAyzJsV5FeXn_GY$T3K`~~Shr11O>s}J5eUaP+^OZITrQ^*w+ZK%jM z9(Yh;f?~x)3m%+To`zyZgoS->mNhlqDARA`d8{vMu8v((hzq$mN+n#F7+G>#?Y%XG z@@eRgI0vH^)fiJYoDCDY9Q@_pZy6OQlXJOt{Y})v z$H7^f^ViYQ!DqXvIc__g{p7qo+b(Qhso&xb&&CVTnBrN`^~&zRKxY;5nNBtpW{R{G z8WBCa&gY0r@QR0xBN(&3?CUW*LJuL5!U;#Sn9DD_v6QEL`>oD-(I&vno)KG^{S`48EWb= z37V~^V^}Vh3TZr_bJ<>Ox1HT}vOPF1w7jzZOH4$#7z*sO1jIWN+#9)_5VHTj3+^iM zdq*C1PE)Pr;?u%vvYieRA~UKr&3pw zT|2ta6t@k$%JDed`|C000lzc&il0lj(D7*N#>U3|aTs{PhD8E;zWj6}soli<;9l7w zr#x9mIfwi_SNQsd;Pbm!Yd^nnX+>0HLT^up#|vFV%Am%aNhS{AVmyAkVSFc}e)y_1 z&bTo(m~N6~)FE5|ZrV>UnvlV0GCLLm)8=lk-g41z>DexW-`(9VredjK$*e!(YYc?P ztq3CO-Ss{8-Z`Y{Vc8Oy^Oblc3U6(ASU8{M-p-Mx-RvK?mCbh&zG^i|h2K-=LnQug z1^3S6#(w!T`19BbFt*Yg!2*WJ$zX(frXsXG@J!?O#~s9n$~*_vvtI(ipJv2)n^d2FmM z8(11sbp+Gy4Ssyd(go8Pr>wx80v18+Y2A;P;qkvgtw7jXeVPI5lyJqB*%b1hnaVkH zvC{dnH~)ni@0MwBy>B#6@@L%L440#lA@!cUU~#{M#hWaN^gstP0t9B zEr|-x!JnC0HB6W-mp`J82$m}4jG_I@)dYIv>MLwZL-#S9lvUrS0P0&XOT?{t~J`WS=fs)|&U{^uV*YfC6bR z1PteU)8Ej`N)`*vjdE&`qdp}zFRBNy`8=cL!z1br*LPcdJg3OErY?L21TwrHq@E4D zx#;S!q^LVO{PW3gC0Gkln@zu0a}9&eRh?xNEPJhGk+=$wQFd9FLi}&x)v4~)Rc=nC zGN{H@0<1hX)5#l$4GtN%6KwA=gssGMtj)<3CobRn_4SSUkwF{+o>kiekZjas$cRv5 z*p}C_e>d7A4V{ugPxAN5SHK%=BjUHf!Mc|S;TSFhX zaES41<`CxMDeoD3-eCwo2Xj?V%msNd-^0G(ijeODo)OY;ywYVhl8fL3CMhd zEOF|hV&Jo%PXbNKv%A^ydWhHxVDmlv3n;V(V>cVL9@i(fXthjzwdYj1ZMy1>a`Zo) z;6?~2wg&&G=-)_Oe&8B#b~to5daMeb{g46UkKTADSuAUa1RTk|D9A^MjuCX8K;y^% zJ_Q0*k1^N-w~vJqUlaJlg3h4z$97mc+|3TV4NHmo9t(j;$nmV-RkO0P%1>l%r%U?! zKJ4w*pfn%uGvwIprS>!0Dq0i_IoKbh<8ixLDiZH*JMbO}X&LCV*=*o(vl?G%|M+GZ z*v!-+=4a?+B5t(XYV{PvY%VJ#lu_&q7`1qkixSDnp{hqDiO7fDb!_nuZuYpizl6Nc z3G>j$qh#agQr+HNM6rW;6-XM4EXUN1)w z9G{r@crjxb@OY0{>kJhX5P0?KRW8GtOw-_Ts^Dc#TS-;iY zzhQrU7!0FcoclFrckg!Zez=)gG3>3MO~Cab3%zOv^Ly6vO5drZFY&AYZG}SMw0`3M z8cod4w=qQLknFb2mp4G=Uf6V!mJDOm3aqKAAu#Zy*(R{o5#b*RuQW(>2cc}$ zmLYaBIXT{yo|(!T8!X}ef_q~je$QvLu`GlEFQU(x{X!S!)Y#S!(U~5&gvOtPaK6m-ySzH z@9Og3t1c~uMH`=cOJ4jb z6pmJh=0sE-5-Yx^m*t%({2WeT>EjIHP z8%7HRs(>4an$*arjgZR#c$lsX){t@ob6Ls4=c@{)_}xc6Jw4w6mfCZxxTQu9(c`w? zSw+w$n}-H_sb)6W?_$z%EB?2~ zYn_){S67})Tj`KL!pJcsB0C@-l*a6H59ka}5gCA?1 zeCTV2E-TLi(b{PqE^sqyXjNC#k2572Y6Xzi=Z!I9Q=>^tE5YS?`P3*dlfc4^HBIEO z73|)p(e5~&T&ifk6QbdpJz=ua3 zA_Lhbmz0S2?d5?(SuzCjxa@P(d^vBctxdPh#K^*8Z^efrSXo&a!<*cs_2>KXXu+ZG z@o0ePA$xM8zSrE5E^*3Ict5bJB#@%VLii%0H)<#v29^Nv-vA8k5?2gv=TA4ON{a$c zfgHx;rXfF2^F(y`vSQKwZZDVWK5sMECp}7#JXf6LvP;>32!Xh0yekMUgDOLJp{wKVJ=;tRP-x^-+gUoKejDE}y{tuE^o zb&S_zrNtWZ_X+UW8=0SPF*;1_|L!$D5V#J8a1h4G+1Oghtz+GB5qds@KE9F~g(KmQ z(%ILFXlQ7MB^r8q%y*}~vDBB}y1FELBCLt-_fnfUUnYzOp0~^xIuCyx@!PTchG;cd z9-rP7fK#C%)Azo6ov`2f(vyb}5W@jEPkS(|uBxk0lf2&8)n82M3@+}cYOCX&uL2RV zn`QUVSO8~BRY};KBYA#d;i%>IFgu${{DZi-xQ$JbX?mnT@*Z)DpK>pbm-Ym0wC8T; z-|^aLbe{=3KB0Mw1P2sa&{{8#+!otEC1D~OXetuXQwH_r0N5#axMyL%|n#&DH zUjIl9%tROjT<1{irKY_Mpy_XmR>J@uatr$KBnT~c3BWDqzjz?U5b&PAYWjv?8HKyb zCFW@g4Ds}AR6iu9ruxiV7u45t3{-T4`a3qANUt@<#>SFa6!W6bOkpOD2)O3j!5*l3 zn3$&To1w>ru8MQ<5j*Iana{2#5B&eVOzFO4Q~vLDzu0~l>Y!D zLT8cBb%)aUUG^q_cW8EWc4|-8PECh8Hm^?{Y4UPazY^D(7ZADick?MoM%D37cl&~$ zZ}`?2c!X0(D9YuSk@!o+fibz0n9zZm!}0C?GP!P8SR^2`V_#O z(fgLcPg>)n5zgxVt={y?|4Y=M)Y^--y zQ=9xrBR@Xg701HM&HatgcR8Mn49_3tc2?H-`1jy8=EDk}$X3MjK%^)AX{5BQ!Pp94 zp90uMU@Sk;R7-jYYb+xd_*DKb&X01i(9z+tZ?*5xlyEzOt;KUQR>rC!)pqp&y%yJ3Kh(yY)-c zeSbDKHI=C`lv?T;xS5KuZle*T3!0xMQF1Nim1|ZpFFX>tP$SXzicqr04*I_p1XB~Z zl5xVKL(kMuHombu)cp}VUw~+=n43M_YdGCdRKF-?mQm&^o!MpKAyHK3lH!{tCeKz< zjO-5hir_vE%XPM`?aTlSZ#&LZ#0ItD__jNWi3V-(giP}=RFGFg8P!xV;BHIsfIR8JYkuEoO8~41~)XM9sK;Lk&$$Hp80% z3foI*;=12C71W)bLQG-k`Iq?78x4LBJU`~_cp~bTMkrF|dDr&P^PBJgj=zlit6j`y zGcsE0PV(~AW3u26FRRkhIq~4Jnb_dZ9Z!HO3NT6lH11Je1OMUUMI_;+AFyl1#_(`P z-H{A_%e5g`L!3|g?n3R+#iIu`Wo~x%dhv+p@6uUb(~i}yI{Fw7`d`0@Yi(!BlyjuL zK12L#%m)(MiNYQp7rkH#%QdyfF)X)tk7Jp{c`TEy50hBoTcls#rC%wr^Wai;olF)5 z$l(=HcgF4D$iDYAR7i-WOoY8VIyCF+t7BTgnU4(~L&X4AZPlcuL&nVkKpb_9bMh}I zox#}IwSVnCgNWLg^X{)1g(UVdc;4R5&ehIWM1KU}i0`xBfo>@IiGp0EeJ zp+)NXMGpt^JRgS?Q4~!?K?jQedI5e98k3Ov|7H&|?@;~ZDMR@2#%ZN@ihnVjSoCHW z>Q6oFdwt>I8|#loX>4rlvFJ9^O3>1DDArkl>BHx!7SP!#&Nv|N-AeInYAT-T=f6M8 z>TWD+ej}jLV%uQ#M;kz(6^uEDi1c09ko!2&H8zH*-q5X?BX1Oz_r<$%yv50jKm%h) z!PT`2oR(36=#7f;R~b!~{xJ@BY%6~XhKa9t;znMQa`k$cS8@_Z6+qsxh}1teQUs*` z#3mvlpC2I8pn%Hv6B1G!6<7y1*{-zsRm&h=emLtOT*{D@4QDGZ5!Ta@{g4`3EZDIvcq%$?1PsIIKDvZf0f15_Zkx{d2oM>134Yy0&H+;rOfUm55 zfGH59Ebh94>oMXH@Tu_fbF~F+BxpJAPI_nRr^Bu-kbW53 zL$1`9Ugddlxx7!uJURPGb$V`hCONn%yR@{la;r||9zurUy(BziNQj5S=>17`vVFW< zgmLc8TYDqdSpRRklQZ<;0@LCzr+*(fVUEQPoLcS1O^v^eRK)|@W=5Y8i^+2Rg$R4i zdQEgU*89tP9W*pgu{E7ad)9e$=bR3%E-vl_Zz{Fw37LFqsG>c{zuFnC4mcp<^$+qG z*tUf>->rAGhvBSIf>q$TVx+K+f#0SUcdV;Ft$w4J>W&&39U2z0WoYnu?+NnS^9wY( zIF%{)x_oIBilen$QLXU{It8bHxlO1Oi1fPi%vVQcKT31Z+2ww{Vng>O?*k%l=G^;R zDg_#4j!aDbRz~O};*2(Cfoc4fmQ)<|S(Zcf{+q|nhMa{L+p+H!ziQgWKu zTb2(M)bLDmv@{$PcH=m=7*cD5?eDIkixM_y|Xk1sr}$L@v;NLrF==!U?a0;$u?8AI_2AbOp2MS9*&jJ{)+}hKLwB7;noa` zcI`stkZRm|YEg82{8JehrT6c@)Yn%i`5G;837K{rHzECI-PVW|aY7}QaT{vLKDLHg zMdAr(!c{wzl+CG+zkN+YZ63U)x4Zo-`vOF&eyJ3(g&B01zT9Sn=%W4O<%s~nJa#R$W#vhW83@3j|Y3AuL zeZ%52FE~`uE=}zGnwjw_>X@;ZEb-g0#gh#s`~E#|`#gzwM%_oX|AZ$xJx#%6qt}(w& z447dbvd9Y%5cy-2G~DvW4@0YtcvuwxR?xcoNdp^BghcBC`v0`wFKJ(Esp~5^Uw+4- z_SGv~z8Q%dVZO01uw2-F`QbOiT%#Kt{|LV?f~UlAMMF0&ZcKAGh|jGP4`xA2H_J3Z z+LJ}ipp|J#u`ZE47IfAbvUW0*7vo~Y7P*` z_08z{Q8$~-Ghhwmqi=S^#K53^w-s8cM3V3NUT+NU3U-Vdl%cp&x!>TK8kkgHr`jVQywdua5#?uJIjKDI-%fU8{I#JopWK`D|&( z;T8Vm>)SJ-$2m)g@Xbz+xw&}-(_k9^Sze++|G)rlizlp!Jr;U-jKYsni81E$ot4E~1WFL144hB2=t6`M{s@(yc zJ8@UDo~Zb7i(CPlSGW#MyK=R(59ZosO=CqL zZtShClLb8vt7i=0%=fRvHOln(oi}?C%RWk1>*)xQy3-NA48KByf=2(tU>Wkd#;mON zN?}iZd;0@w#L7hsI_)#58=BxnuY<+jV{C$Z$Tu$(7WvgTO`=q{4J)XklV;Sm(a(B* z&rq*(F`7&1VRCo)b zVQ9VV&J1PA87dK9X=1}v$_}MXBYq+8j#NMg1jc~-*%jKz+5PydxK}1i+Fl;-cL(_i zZW=zQ$S1PiUoJTMG)#f@`z)vv84eE&6x&ps=VN%MABLbS={_vUQ1~4iAZ&d|M$V3! z?z@j#ef{sB#kmP|KR(;ZJKyYD`}%zLc@XW#lwYXXY){`>V;ufbh7U|>D{H?YdLcir z{nhn=3=;qhvW8ok0HhBxaq^Z*ZZ2Et-_*gf9%1ceCj4-UEA&#bZpK7m7l~$XG3l6x%ArQA7Z?N83K!r6nk#9hA#dpzOJ=VZG~DA zZ(QE4;nD1s6zZi61n-%V1GIchV1O#52WSFMK0)ewl_e^cv?uJ!yJ_=Bt6G&t?r#x} zD=kZv_M*4@oIR&Bi3XRj!}aAvI$ox&J(rNyvvFK#%U#fv&B6UkefHELHj&4{P$-KY zyX|J%U|agp3>n(zu}%~O!4QhVr{a(|l-`$~ibSRx@r)5zQiQ$VzW%G3o57md_c;<_ z8--Q^S#sjmcE8VyXhn!uhSC5v9I+DM5wHao5mPS#C?MT20La(j8h=Z)^`Dxr#( zO7;ym*0SFO9NMC% zyRh&u<<8B`&DMH#M~zte*)?h4@erIFObFfQ!3LXeLBvyT4-3B-$Iu1nC)OOqc+Y;s&@iiTQQY;1NjiO6y$ zJW_@zQILDeONNLE$TF7cyd|B*B{c%X7jMX?)+iD)8f%ZWY#YN|?G1lMwHKO6h~ebF z7w-+vIiGD|OvB;p|1d<-hEO_L-We!@4vc5Lo*U|MXV6 z$X%_=tnG&SojsbYj#32NY*bWK6crU~Z8bDB9$=!6I4#b7G>PA*$9AJK@N#lXykQTW z&#@?&7@%dgRt|7>ZTp(uKcg*v>nImWseFu%9ld(#!==mfPFsuC&m%-Rb+xQ#9m$i4LmISSLaw6*c9ZE{iK&W;G$9 zK9(=DGRAjZ!42~0E0)OY1ZI@<2ARhqrFZNYiFZ|8(0WClZOz>!EP8JqWw&vNd zZQ=5@|Ml6CAFiomqs3ubCGB}t8ZnoD*J|WuS4WPz#^(wOF2gn&sS0%^{_u}W;_((&ZgJ8EHyFL47NW^3U>w!}0LS+L$}ye~8I1@} zg^X@83;xRM9(^w_uVPK;M>#oX%Po-2J%Ue=m@e99Qym<_hj|t?REi~nSYvtgZ~l|p zv60>KIK`2wn66LNOy6bIJ1~qrm8)DEl4*1Vhwq#;W=mH8N_cinSC-x368B+PCM^R1 znhWMzX@D26rj6FKeeeUlrnghYFWSID(*0oGZA^-wUW<;AaqpL=!S!wdq@$z5Ow-ER z;RP0EtRMVH_*vp&&GF2|g17eY_VgvPR9^F982(`E@qXd)C+kw;F@hjeDP^XZqMC6I z%3s6bIFO_Y!zX|k+wV(9v_O?$x7VpdJa$g4?|Eq)#^}g7kXwvEs9|rckNPyvi9Vgg&yT`IuChoC*ovWzr-e4iPI~m*bfMQRfz&@`2ZBYPrsaa+1L}^e z{3+|V-7=VsZd%h{T`+~V=*G*V(fJ5cxt~_7_?71A}aWHn99F9NnT|F)@SiTx> zq=-#>otVgy;V%mo;QOGAkUW?G^*4xHqDCf$@$Q#q6ynsbjoiYX>bY2wZL1 z^ftF(r%iHwGn4?;8$IM*1XlU@T;P~0GSC+BuWe6vjzRQ;_z_CN=IyaY=E0oAlnN?O z-uf|gWn9GPicxOOteG8P@v)KfQC(R(!3Tte5+1ggBW`c2Xu*qC>>T6Es`B!&H8%f0 z-#7S<5-7i?1zbvg%~;!_*XIH>gH7MN2q~X@(u$kdL3$S-k@e@F2yvca^B4|Xp^mu7 zmajeDwR%BCyeEQVzv@HnxI8(2Lw^qmB1Q(ww86|jFuu|Fn3#a=C?Mwd zH54^)=G#s(s3$d_O&;LNY&TT4e1!EeBqYCXc3cs`;=v%53cUn<0WQARQ%bEq9*>|1 zJ)eF^#wvRxWYU6d$*8j|GH6L`2exgFsft%PdV8iAIQ zlHa2HQ`;+}*c;zq3gjH4QxmPjW|p*x>ST^qHV6Ld+zsbVzt^%*#@+U)m2q(y=df4p zNVWBg=I7A9IAVlT)3v_@nQ{|}x-DS>4?qN0G+?g)!Co(36RqNohlFVWE$Y)lNt zMx8*p^Hz8)avYfn` z1VsV$TD=)536=J#`+c2=w+%@7q=y2;fhL;8-bL@JeXzMDJYTfu>E|k$WC@vVb)1YQ z6BJs|_-q@X8_Q;uQC)68;=xGEcsG8QZy;i67-7NHRv^wHfS-0wXPvS6kI zCQ?Lpq1#rZcDf5Cj(G1Rh5)BrJ~~(XCoOP30|AUt%n;hjj}*dQ3Iw4WW_x1w7@cD)v$5|H4eivIcKBRayN)OQS% zg)&RTLD5dVh>s-KISNB~N!Qow|GMKOD*v=fZ^@wmQNTL}c3pDbbxn|Q&|brn%0eYH zSvkVJKK z3oS1ijruellrTuFc%5;_@M=ox>+8#yx|!A0Z6I15>LcAvI}Cn<`L~nlkG1G}vNU6e zO>A;5O@v0-WyM}qBO? z$l?k-Ge|h!7AyHiQbEY^ZOj(nU}vSMx4>t+I?*tRU)Cb15VRHuKSCclFE`!AT+Ob) zt^n4uZ{LQ8{#I#-;q$n;S47*!8%;0LguQa3v(oY9J7?rnq*gzVUA6x4V(BrA(^)d3{eVBMQA>DGd*s;9d4skzRBioU@GfJ6Q`5^6tUA{(5trT_`hPi(;O4YclfQ_^wy4$DT~N z^5^~yNE-sNW1jg<#`)8Ux0{&twnH{9jAS7#9<&2jb3aDsUnAX+@ zQ&ycQ%?{^nT}K3L4Lc?yjmEdndp;jEU!N)xC?@#TW;YymIwnGR?H9LP^6~K#9cSG$ zTgvmm;!~?ch>{XT!sh0@Gg>L|W-A}#ad z&rAVBc*RW7H>fK4h5qwn?(l4XCi9H6-1+uQ2Jvke=ZJ#|SwYsuTQ^@>)Xz;pm7sjA z2=;|etvU>yhI5zq!BOJj7m7E^_4gt-yNMI|8OsGq5QD@10t3J6Z^^hQeIh%$T6z!n z{TGQN{OMWN;=OH1)}XQSx;ZfDG+u2J>kw*$^rRhJLS1(P0iC%0YD>!tyTCTJrS}JA zc_DN~H7u?VpSD{A=J>>AbpvH*jLVULHou)Gm~Ys47+uY<=pL%)?I6q#7ZrjTBDZ_b zM;i9p1B8y93;GuCEtcv*U+$xjujl}ZgG3L6geQrl|E7ROZiSJd_-1VelK|qAB7DzS zmRD+OXuLZ((afHx@+nosTuni(ZbRO>Rc;Q3f%KYg?^(0Tl<9lAZ>lg1queoqf9mad zNXnx#;28gAZ7WUbr~a8l ztv=2_XMbAYk8!#TKH1hnX^B64&Te+ULh}+G!J5d4myhy^dzAAP9huz1f>ds|QdU${>)f#a6lo-%)rnDWU zy1yKjQx&qWsrF!fG+oFi3w3C6zTARAcIRBXintuE-ca$DF?(x@2gXG{E8R}Pkm{Y1 zAX?kqwd1o|Y<>bb#icyj0iGeS>rrgK)~dI>GXclfSn0xWTMpeOO;!$TNe%hy2M8`5__GFLHZ=u=k14b6GprEz7_K z+d6^EMXonjcXdf0Jaht;%R|KS4*><#WYPGnu)!gQe+J)-c93~;U@hm<_A`qWc;Cvn(9h%Cytc`rsz~U3Kb>p6E zo&ihMT~M?r?z2OCM{LJzTRjiT-b_U#DLR6RJP(nTBlk17yp9IfQI)^LxIy;F@s6h` zt6q`o1y@MmKRITy#k-*>UGAl(J+VSqZa$(QfCUGVk&O}gPiFs@t{he=`Aa0#b(y(~ zQk;$jn!14p(pwhYn$t^Oa7-nk`<1#nKIl=auIT+$XM$+LlGBrg9Ynm_v_PFT2YV;Y;KJwhIut&rfSpkI_D7*6zl(dsqO!XBRzwW;_2B~a(eLqKLWVYmf~V~wB{Z6JK;c(1 z?yPBObbRaCMN#<#>)l1nP$evFWpZ-!p(aNm&NQ?0<4Xkl~Y`m-kl&ayny}df0G*vT%YtGn|YK?>?)NiB`{}@u34;NLxMs zb`z`ireFpbx?T8+_j1qZoq<#zVMRBi7ck+Ndg+xX#5lpm!a&QI=32@camwC3|E2A% z-GQ0csqXK7IOl)Xy2U>S6)-jc;LAA`B?L0o_=blP7C`^krpQN%F8d?)U-9ZbP(6-F zl>5JyF~kciSNk~#k+aDSP}p0Z=NvgJ*0}c`Ip96iyS;aVMUnqZ-`)-Z@yme7dCtOA z^v+?*tybjtCiO_bATm6>V$P0?jO_5pae|K_tlqi0l%j2MR#j)*Kp!}@w6G(|5~cndN^Hhawd^G`U|5h_Lch>6C_IQ7ku@yU32UM^AT8c75Nau80g# z8wrmkBv_gp$0r^y#wiN8a@!DfxP{f7Y~(qDG9R?6Dt?2HS7whkcynvZZ*jPixre=| z?2V6^q`@?J{^wy5ZaB?d&EFkV!%M>-G8-F>Q)-ut^nLZ}ZE%uSMN3-7oYD}P@Gy}W zT}bTw%WJQJefa9)Q(y=GS8Qz7zt#DkBRKc{{Vw{E?&^aELiqlHBGtnst?q{Vv+J^; z($emhO2d#%C0>GB!W0*8b*gpxySH!Sx6q_Gz0-#+s*iz+kpxY4MAc~4R76** zc-P4JIMM4G0f9g;*jM)Y)kCuAxC{FIw*pqqVVCz%|0_Q)xAZxaEw2pYq@7;&xV~Fe zq(&v^1Xz0${@j?sQiP|Drn-ahC=*jVVd%TV1-71lb`L^1`4Rxa}#DmQmJXWT_r&7wTiSKxZ^HtsGVy-2UHEZWlaTLBTUf5Mb zL(X0UZO?>|G2V=r)nJe%jpg8vfrl>=Gdym%2^1lI+gG3=re$mI%%Nqk$?q9W{aiAr zezY*z0HAxD?;UIZ{cb#&I|VbpQ^|Fzl&D*yg@nXcuzRsk3%wOQf^Z+hAOS?P(C4XE z{YiIe2R`Vom@QNBM^=D@)G|X2ZtP znu)rdp1i{nQOD&b3jeDt8H(8S^d*xiZF|O}x4ZAcv&ma+{dH8*;AmgIoxQzo{0``c znUEKMkvN?66!MDefv)-}8fhgF`wh=G>O@ zIVPzWtOSEedOFHJRZXd0VIU6(xH*8Ds=HyWc$=GjHxLLMwDx0kMBZ zXjQHuyE*;Y$?@rd`zlD9vAV58dVs%_V&_r7K|<*lJhIZOwHd`{G{0&Mgc1E`1-q_; z$NM71nvdHL4>{S{c09T=GBPo8ZrhRC&m)+;tHP#*JSXyGPn0V#TgMr>i)OGxB!xL&05^oVIwLdxZHj)M! zW|Fhx+`2ClHL5+5bQT0-G)PzKkDT6rmhzSx$Adxmso3P9qVJepRD91zS|9lRwwV#4 zRMgZP1rUE?VehKj)Z79~W`ioL4;peKEkrD6=$O{_@L5eQ8|X(5!LFAm^GJW2y&KGp zN;K9D?NF=hgP82M^9m?KKt*T=KOY%sr$Yo1?4%KfEYq)fcY>(5jJ)uKY{+aM@~a71 zpJN~4aVCNA?SAyAZ&yAaouJNJ>xMy$9UD6@)9Sb^=zk}PK#-D?x46KD-+x7^Z|$Qf*4(~Oat`pr%(e#4eI4As zbXokp$aF^#)rS2h8{;l?f@O^uZXAavA5al`P?eq%r*Nqt2_7L0e4PP4MZdD6mDR5A z{x7z@R2`uOB}uIhpjn+)KHmVXTv-Mk3pDDVZ1gzJRpiN}CMgK}*lDE>i~5MSPCg~* zd~eFdjQSKSvYaNw=J0r8VzWZ1`{L|coKFG?AO%_AW>`jUk+s!5jFZAM?aL58dgx84 z&kZ7KvBh3DhKC4j^MhK>qMlbzG}--4_j#SxJlLH11%p_Rat>#+wOeUrR=x9^WkRtw z-)D-oJtev|WUxl*4nqT0pMVjc36+UuC|M$d=o7{dk{( zAYdX#aeF8gu@NKMP=A^T@#izvavvGUld@DG%!p;4KvmeZ&_z1tq?X7?HBoMO9o`q6 zN1Ny7C28m#vJUQKKfr^@PUup~T#7SXRU&um1%~$(H3g{JCQ8=EL%ss zH@#|kjkb6pQ6iTpZtUWmRQCgSU>qY7JXI!!FZ~5&Cxi>7l38w{8s zl)J6#4%kIffCvyvd~Tqo1kL$no^#`Qm_znnUJ}8TRC9JUkbs+$ z15HE13>*x%uR44t{xeKI^FmQ`jrA+knlCojx98RK&yV2i|T01a_^jU-K zKge^Z6#h24Se+!^y3{kL#%!`bN-73y(U!`10-5L`X=D8OR@haldh}}au&L?pw&B4M zljV8q965pf*J=IBtweJ25Xg)F)6T=w&2@+ca7Q>Wc8dkl_I$byjyy_CV6X7e01IU4 z2;Vgt5OsyFWZG80DpfztC4)tly**r4e!a{wKpC2%mPdcPjD~FJ$Bm2 zZ5HkNp5C@C&g76c11eFfNcso2X>iKXnL z>{jw^?6O>S&g?ZcYW5f>_8=>kn>HUJ3X3Db_+e$XtCnk(=)T*7qx=Q+Sa1l zT8{VQ%FRtnl?J_Z(kSEQ$6EZyC2220_+;>Rh4`vuWyZa6AUeWI8%clhb9J*2x_%DD z({A};bHJjE2+#NoLm)M9J|d7NTF+dm5P{vv_gz03>w*%lg0`-D60UwtqgTi0nKfnq zTDBa!D_}a}bNPHU!17_{&>TN>vk;&*9Z6K4x|D}RF|kR}F%oaIDSjB%;f-aE4)=s2 zo(ys{)od%5HsoRAN(#_57?d zg^czNP?Wjq)Ey9ct$6Cy7_S%I_Dh1*PnpTvgO-a63Rk=;y46)p2vC+jdf+zDbNKn} z%djQ;h&i(JEX&m?XY4qy9q7YDVHc=z$taqcQK!?CaNU!>&zSe8CqP8=(lw9YNldQT zio6^;obK><$UDZz#}_zjUpki?k(HJ@@tLbJ7IHt^3+LmL#lKG+@2}y*c;$YD@4IA? zuUTaw^iA_{GbG;4jpmPsS|ro@e&f8d*Hq%22UgrH84%5zq} zlycN)Fm+3y!)rGFCTDDRejduYsBL4yFk$4+uoavCK6_mz_EGxk1_CNc%CSS6zc zDgAcVhkXPFr!)!x+}nWo6eb0z?Re?L`Wiig8rNQvJR%OP^C$Z3i%mQ`7CtFoO?+nH30)7{W*$B=jCj)sP&)q)#v7b1e;1ctZ!%tG|XkC zq_BsZ7(>?^hEliyb*B0S1{r&j%oV|*N!0oxmUpl@?+;+~@=W#}23JcxYUDxN21@ZP;wZO<3kMnMe60rIe?8b<-H}DH4}20jrK;MonZN>ImsC){`SY{IeEHOMEB)5T4D5LuLt*kSRfHN@b2P- zM%wkrq4VCPJJ2B586u+#Y1&NCG);D%Mv{3GN$i`jBsiZ; z64BMp)QEi1_eSdK4R)F-1fmfHI!4GdvK>|0Iiv%qT?ey1YJbP!T;DQInsU@$+0!~~ z4N6K&0}qb%25UA})488-j`}+|!5)z*BksX$?4TDdUSouVFafE`NmK#-tU6T%JMsj( zw&KL-^m4HYJxtvD*QN4+er|Ks&ME`sNmP#^Us-oGSU!S>v&+!=Rzh7_Thqft z)U^Pc8eu1X$JT$ycw$%U5utIfs8|$~*fj@0<_I)`;o;#g&`F}K+_9(n6hF<-1W}I2 z)v@m6Y(-}UU;KDut~wMv${^J?E(q=$4S%yJNQ?X|fyT{CtVtf;p@a&|$5G)&TzU#2 zo0AVN4cT@#Cu{uk{if{3hK6B)XWAb}5BPcD62#(=l(g6w$9Yk++C)(o>cDyxzfJei zn`!IEInS-A3H~q(WE6K%7vY4$4Ar?sVq!31385bkt=(Zg2t(&#h=9yyxXMypJ?Z4t zAM4)SKd~Y6(fA!JeEr#u^nMFs{z+*)n{0T%Rm_O=c_6_i`N6zgM)9ij*u-$b&9GB8(h&ME#HuUe1rK_Gb0{e)u{ zxwGXw5!q(_r9uKi78;3eVPSEuCjwx=`<3Tp85)yX+sQw*2iYVGxrTDPp9?x_Z^P)0 zUbcN{a)dynK$3PsJ~p8O>Yo)KwJ~fMSJUyGMR~#7j2FZLfG>D|eN3Rzk=ICo=V&E` zx=BtH8lCamz!jUHGT3?SB=ij`BpK)yGf_RLY^P3t{WDOON<_%)4cay?)w*(s2Lw?9Z@#_@GtuYsh$^&F48$*SpdC@lNDB zx_YUKiGSDaC9yArjo+WYp1jzR{>x@e$6(HW3C-2yhxTkAWMd*Yh%EFgGw45dJsIiS z1rGJ>ITBtX_{qqK?u<_r9}avN>Fwze7Z)cA?>RZK%^8!JU>8$7JUj$)12i-=CMKrr zOa?y9pQbSEl;iD!0x(p99_j(#w77rV+6#VyA8HwI6OOpV3W5=$0*j1mP;NfSSzD@h zeGOPcblN1o>95!&%>ReKDL8=Pct$FBx%cMl2?=k*@P}6oVN2?#$f& z=Yq82*_+mbO@B*}v!;n(=6$D87za&MLq`zI4uSF33D+)8B=BYcJ-RpsEMHpef7$EV zRDtDvG@2pV2TNIE16K%Zn&W8kw>|BVVIcls^9tUNa&#F6b=q^TadxsoOkqF?5pz)c zAct~)8)*^8j3N{Xn)FoK$GZ|Ko`J!txbA_ws+^~kaK+1MR3%A@NZJC9fAx3+I@l#3 zkbJ1{BQm=HG#fz2MT!7E(*$6E+|s4YUn^Kqn_tgU6v*q4T>FT;J1w^ndsXP>|Np7w zeD{D7oz6Gr!mrH2`uTwt@F}8_KG2L5%wTN~wN+)!h@n(i^05|Ri^Q7HY7#!wdD(PS z;8de>cb0}ib&p>#0CcQ>MI_k8s_BAP!IuUW znu61KFPcg7%+<~NhD`N?4`GVTcFzE+pBO6;)0qPOq;E_>{C#pz!lp$%of@HU`g@`a zQ1@jY^;ZqGjbH5FN$PFrIPDYsS>b_A%Xl>DU?trpaxrpXf!5YcU?CKOYP?5IC#wYO z=sy!eBB{H@klW%8#~Fuyk5gnCX?kJ#D+g0<>`EF_aEox2NtsGn&JzR2f1b z-XQhL{O}1 zkL@vN43TdlQV$Lq=9^T2J=~1HkpWdoJ9#*_S9d@%t-%9GVNYEiN@mtnp@T|Y^s51- zkuHH#0Ddc-SDHi&Yk^G7Hy=+wvE9$6^P6t8VBelXSnXLL1!O=&mudUuaY*IAzx$U> zwWvO%PHSR@ji~HyT0%{MyCx<1j$$&^Qv9cDp5$yR%~w`P0U=oG&RlKr!|-;#s~kYM z?ee|YAe%}_bMi*SONkrQN%bEd>DOdE=#FyA-uBkM2t-C-&Ez&aRIV^5%o4Pg4;O@JCG_QpWRqm6%5iP-`AeR9z7XAvM5I@3rrb&%%FB ze^Fa-GAI+;PE2cm2Y-H+O|1lzLxUE8Nh+J3W|?KzOcm7~__Uuct^=QC-AVG)ZLFg}J|~2Cg69S&rNM zpiW9{aya}lC=LtV4X-PH5Pd7&(*Ukss(CNrj)c&n`)VOL?64L(D(o)3NX6rMkXK4< zJ5OV0^~KP$_rGO~vV#9bXWlja2w0jg@lmyK(0of|{j0}$jzmQ=EUB;&C&!3FqVj3g zQMq|wr~Jx9^m+J1?6zQi??C*4CsCxb)poew&v+{NqMxZrgEHR$?Z{_QAnG%zYuJdB zYABVFSQ5tu43B)<51|N4KeBgtY1Q_>Re}+%!}|GammlEM391ZgthV2Je0u_NY5sf) z2;^-QMbKEk3p&RL>*;QTVWNmjj{ox`sEsn_!+{z(EeE6k5p2TOpg62|R?~Tg4{!el zI9l*}A0-?OT?@v9MmJCbFh8cJ>LJfCXd~?mKX{7Qp|EFz%}WgaPS5V@%}I3Cy3ZkZ zre24T%G7DlMy@N!H8Ha(`4V?9?HHZ)>_s$!6BaMeaAsVBb67z7pk5U{YDgvxG-iCl1%^HSpNy;qKCP6toQ9}}B%n9lc%3h2B$P&kgv5B& z=j5#KjO74CYeCVmpzhbK@lj3E{5^FqDtTO1>jx4%tSvQhG4*P)R~Er2!YTTr4d!&` zi!{X2bo$+5iwF=Ws2E(d^DPq3D}SDJ-DbCAv2D5F$mmGTRUZ=l)I8mf5}?l0f&P#s z@tk+xk<^=vq))Xm7Z-k*rTy%3H`^iZFO?o27J-^*#ewZ@rYlscQ7R{Gv~2`@oLF~p z#D@mICXj6zPOuECLlmgN2^XRb>p){7W$`+BWV_bQcg*s|{5a1m(-U<bo{sKj<;8KX=tO?xtBu&RTh-@_RuC%0ywdUB65L4sOlM5}F+9?-o$Tqpt1rin zgzqj4=Nq!7|IydixZE7+Qx~souIK&{Y~BDu0Or|LjFYNvb^H3z3pApO#n5teGA@Ht zn}rs&w|N)R(&O*K94ARovvaVnBWiNRS6xUwe_a}kQyOgvQTo|c*y6+aCPR+^-CXkl zu2>S|frl=OiTd!f7;N<6y>waY-JZ^oVGj>m{&0)y&{ih-KfXqJ&wz~%NX2K@tZ`{B2&$$gl}=|l9zciE0J^BeLnaTSyJhO-OafwP`r0Glf#FuOW|K(q^MOJG`etr z=;G%~XLK4+vJ4yp%M=UGAQT%zED3E-Jt@oc3*q&Pl|ad3b0~}Dp2qxPayCa+Ay4JI zW{|qW*HK#PAJqTjso2ekSpd_&6Oj2KnRf0lSi*yX$@6JR>?OX;`pb}koUhnGV(`1R z3kD96y#~Pr1^C4xE~Rf$wkjCuPc;G$?rl zb6XQysTKvaX+XXWgNiV4v-N2+@=7k&&uHRTB>p3(#V`Uu1NfItfVB)L{zrhxp5Y1_ zO6ZQ$7%mN3`}h{sWY(17lios~z|KPnA})n0#^HP1gz6q0c33!}3gG>g6VD6>aTMVu zO0dnUUHYQ#^>A_8h0Bn16&I( z_T*&iUXmD67$&=bfeRYOi#Zg2nw(Vw-G5EDF>yb4-qzXKEp(p=xA)}jfC{XJ-GYy$CzQ0SXH3&lYyf2+$!Vi7nLCC7t z?sdI%J!=rj!O1Cb)9M1kb$3c8u%?X%LXIW><8`E= z1&Y1l=eGR?ClvJ&g;mJb)_G;=s}Tk%bDC2RcXH1oBM@mkrLiRFICa!ah+||A%G$I& zw@sr@0G9@SQ^YK~x3sj|CDp_KxQ`C&SD4?vCE~VSZBlOA*v`Gp-tbn^QmJ)v$#VS1 zJeHU}gU8J7YG|Es*pv11M%4-^sjm@IExFL<*a$$sAD#+Cf!9e%IsCJn20(J9)Lxlg2LVvVcMa!(H$v@C0BS$YVO^HfC(9v+a4}MOW7AzJzNlBQby!zcjHn=L1$aac|zn5FXj-uaQ?Qlzn zDLS<2M$mFGatKx~$C{7>wrzBAPy^A+0rg{3i0^Aas>SroMYAX+-AWX=Nnd9rDZU0e zj(UOT&9LCE^B0$i+WHdCcb5*dq6=@y8uoh7R-^{s5xf|_3Yl43`Rt!ls}AyXEuYT?&K8_t`H%nmID3rGq*Lcf-KzvwRkgTF z?h3dQVi|3M`|KR3n?vUhF&vt_GR6dv_y68?X5wdU3np7f016m-+k*1YQpIHVX#nO| z{lB+x$_vkY{SsE?TOlc~|LkW?fI*k&K#q8Q_n^O7nInKNb!1MTitZ z`K;}LvI9^>FD`fTgLyWPAKAP80#!t5S@kkL<&*?@DW^p=WA8#=SVjnOD zISxf#w|M0YOXN}lOM$4}w$V^*yir{K546ikKIQmd z;34rM27O?gE9qGIH=lFxNqd4tOflm~Uzx=BRfrZxfSVhGg`flJGcRAQogbW#EzqkV zNp(sES8R2hKJ;HMjPM)CtaNiDgc7tASrE@W)$XV7vwS6FiNqo#!+%ey>P-l=2}Iq6 z?RG!16G$eliH-k;OfM2jFd0A9;nC>4#~AH!_twPYqEWA<3fAF|b2BOq#{_8@a%PLPd9+O7D=A5(6tlGyU4sU>5#St<2K=SU^K}nd2`@yg$8jl0QiV+v0E*TMu3Ea) z4vvH~6`eTmLv0_yh2pKsOtzfD2{zL;txwrL@95Zp`S+JIh+n*;9(M0X;9=k*JwvZ0 zF#0BEO|+MCCf?vnnm>|AG$@DJU6o94^%oNFOR9DgvkNj_HacUNJfWill;Iskg(=aS zvA@tF`Sp(JF$R(E9@4(al@W38^V$7$&z6eV0D{JwLs+ZtcXlUDG$Wjh!VXk|T*)`h z-W+_baS`7Z^>e)G6wV_z7a3{Z$)wuk#lkVDivpTIG}m~y=C77bsI@SA)p;KZQXbPp zx$jxjU#OY<+HB%Lokq8Mq&viM*s}l1w{^CB>n1QXnfTqyrX| z3JpBP8Ds3fpKa®^_QNljpuc6fyUTYK9qBscdM9#L;>3y%AzsKZ{^le z?cTpnyd31?z}WAHR&05}A;C5W1fBpC!10*15G7orstR(?YHVeklYGpavC0E?Iz}W< z0^WlPe&`@8AB{akveIQP zw|=mj5~qHNKqMx;^-1`VTY@_13?owMl1^T3v2}cL)UD{eI%k9}`l2d}ZttG5KX-4f z@(`p^k_4vEY@h?!TMMD3I!zh4dG98dG8Q*-k|;=-0vZsdugeF{Wo)Zat@K;-46Ds( z=Cq7M!xSI0Wb0amfslBHvg4tCW9*NcL|u9&)4bIj z&NQTE+*o%Nxz_&CIYrjNNnJry)b+=S^bFNzW)I0v&?Lvfso_35w_=bfO~Cn-!#6f# zZNcHxpg8AuKmEUIFXl~&?HUB)jt;&af2vbJ8E9*-%?QQ=Y~rJusl+vdu%3r)Sgrie zEx(}`e5DqVRpY}W-QlbcPT!I(lt6~@cemyOMh_TFA$>M)HH0(8pK|KMPp55rY{bFC zJ@GI2p+I6LZ1qw1s_I)2*|embB+m6LZ)gp9cuFfvZfOyjnZB@hqRuEh;42HUg0xKm zPs&=v+dq-2iG{D@wg>f zu`3OPY7hC69&Bx}+ED~Z{1T>&0dO1y7C7_x@&@mjb4EP7T^i@1AV6Ra%dir{B!>R{ zF!2@hm}OGaI+Xt&VZ-_W$LOgV_nm-Xj8pj;i2#)kn6_2-`W}v=5dG)H z@5}pldTK9)&s(EbvE%bMeAX{qKI#f==HY$Umy$y!}4H_0JYb4Yls)m%Y|6(fDI zO2wBy=mK;=v&r=xh&5d{k`IzIgVKM@X8*l6lsI{kywq6txpc>?& zwdL*$jlz!+Kwv>_?t6z^?2=}@;4(1Hphl=r|D!@-H?#olMM<3P)6*E(R4t_;UT)Qa zF~p2f4VE|YLHc~Xp&znZ=@lG?%=H$7vnp~ygRK#Wv5w$`AfL~Th#9MtiQ(tPs-(p8{Ha{@JRB8vCBgV557K!zBE&r%5Q&oz**W{dIfwo zUPAy>YU)?fgr#5 zW8R|WeE1PA3KkKCjrJT+%buuRSXn6U0*}n0n*-z9#{pYSayhU!^b#NWOG%d@_HVx; zTfGpJHFDDY#^Dj4gvw*<`hI6`=dle7+IgvqCWEBU_X=thy!Ps3vhewwV4M1`W^Y-r zL%5YR)I+6^Z;)hN1d%Y&1^@7aAZIW+ZIjj2zf!e0cw2H_y}snM>1fnk^u4p+#4yDZ z0C^C2s0{lOM|p`Zq{za2!J|NQ?Bh3cr(`B60+^$x4@QwwDS)j)xBi;K&4k=tKuVTJTSwK@tf_4&Nm#+;$NOsPU5Qwl#cUZj-EH(d5#8A(ZF3huL( zRhcE9othL&P+1qNUGtP`gXYIRE`+ee5b_@%FE_>)nZw(M$^LT#|Ig0U%5HLFUUqsD zIJ^qzaaveguIcF;LOV>*O^|>$*E(n8kl$5Jca0qhHoc0bra1ZW$rcy3DgJ-E-SrOa zbZD?s`C)DYHYRQ&01P1~ZG1tRcc07{QYT%`T%P8s&zpA+Wj^dZFfLZxCT$klDD&e^ zkBS0s0-!j|wXk3X4Fvet9J)h#gUK7lL{jhtJlk?2(2~Y=|pn$2+;ZI6mr_c5pCaeG{>Rh#XuZ{WqTFmorrF(=vk3Ss9x%mdU#q z<(b}oIhXeV&AJv0YCfa{(^rt!LLe724J{C#T{PxZ_)=sVETk-Bf2|Z1faiGodf}#Z ze(ynRx&PTB{115RRu@nLsv^Cr_vG6B3HFtgl1hV(abR*cd}v8&m*o@PTpIt_UHBv`KuI;BfNqhk92u-{r!q71ci-QuE2mp zFxr{(A-;x+{qs8r9k8_!nxG3Y-)BGOQ7ZvEftpc86^8I(E7~rh0n^GTjO)41x-4q< zK_>N${;s*eK!gAW zJR`NylvEjcrwP#z}ZjCUnyo$Q64Zt>flNcA`GJE z)yQ(Bf4##2genUNM0PWu5dYZMqfV%7Z(AuJ>}ziF3C5NM&!`jDoiDsIdtNMm2~s)| zquecYL(#FsKD0oi@1O*Ff{uv_$Sz2zlgpEa5iSRQBEKhc9qDU+Wc4|K%r4<6*JZvB zO?s&0HGkvI!$Aoj`>D-cEej*VuZ1scP83CUk0=XL?PVr{yTf8#|J%mAs}}hW!A^5m@r&ZK>4=3TldUHSvjK^@PX|w zN%q-?DY2BmHlsjw*V?_h;_9ljjJyoj%=CHf;w^`@vk#y-N_5sg7bhWwj|E`|*0T^K zitew~9PD*KEQn-X>Ke0n%sgBvD>DsV`u7=)2o8sATj|tZz46+}ntv|(2Z6WZQzH6* z0u%_i$zMvp)F*^IfbJCZQw-~-COJUA9m$%Mrn=fO%XLp7uUp}1tr8r*mZG1Jj`a=a zY*_4-yaVl3`}eUsI6gcd>x=JHxqRrTUjD9v69#jte4oMIf=~p^s+IjJ193&j)`H-J z>ah-jPNjoEy*rIc))yz%Wk9lwX)iGc?KhPu@T^mD=$KVqT%(+80u z0$qqLx$H!IFNlx`@LZoD&Pz+UyE6>N##L#AuEwuDiNSVUi& zFN`AQlTUE$Z4_n@OuG&A1Y>?QO)e|7QE9@(>>k9o$p0(z<{cGe{rgMNS2w-11@7;pj?rfg`2?GXe~({2s#{Vhu3b+nzSy7g{H&GUOK7^5sd|P(MXx0V8HLjLWpPyc zc!%bTZG+2gwfcmasQeEWNhDFJzZ)zz>3yz=(4 zD*k;e?5L#|&7RXUSp@pScFWu-9D^K8W?oXO&8OL{1S~GTU zNrSUlc9XwJ&bZ3J(qGT>^q(7GEtx6RF}Bv~5q1p>c?SSTUm;;|1R<*kfqym`7mNhR zX3*NcB}n>-6+|$m7L*PXg`&@T)1w{@k5n0D(iJU%^n0@Rgoh4(XCf1M!@On%DFt{e6b;`F5x^=;m_}#6x|4H8by={r3ZL-af9X&x z_Tj9WZ;Y$mfh9Vw^sh`pd_kiCCx`zLIg>X;txgzRC>WET9pF(q*xFYs$3v16>Tt9( zjSMQPjci}YLV>Fb4PN1uC2MUTnO`6nbu-|KUVoLl@>980P(#@W>Wm4}fktn^(eVr= zh;8sD`(!hA%l_(`L7Fj2w1k&UI@ zX&HMIytb&~XlL*iw5xHFGgGJWRQ6%&HpxEcx!SZ=kK*n5wOE+))X>8Wx`EaQ!~-=n zP-J?dU1~#0V@pk8FC@H_5+Pv*e>Jy^=H#T6o!;*4>5*O!W@w9h(^zjWuUb9Tvalx? z;+d1bEY@YGUO>>O0Xs;^ymb<^fXQoIekN-eZVAN%;p{};U_M3L5$!!#uJ?rx$QXA7 z2=VXUlNdItcI%wkpnTC`NXhU4SHGe~g)Ij(NDJhhNizX2>3N_;D?Vo#faPUOLOYNfU!16GacV5lDBh^-8Qyk&Jj4Os!ixD_Q z8b&ccT$UskLtWzK~2<}Ob_~& zyfe2#86g)knA4=fb|59al!eZGSooG_M@?8A;uCf}pd--t3p|vG1H%2*${ENbDs6Tc z5nr&}*Pm<(bIc4CfLvQL#RuxCfAc+=1%T$O7AY@M=bXyKSJ%te7BPL2%fu(hY2VY`Wg_KJ7H!qMbBev(d4}-Xfms-bYoO5vIOlHs>wi09opO$&-wE zz#xf4?tY)z%S3F*7pb8{Rmcujg3{#%@hTj2I-kwK8KlCJCR!X9kcEz$^nY-$=!k5u z`dct=GPQ*E=n#x07TjT0`J}8AxPR0Oi7F222YxkZzoE9JEpq?+xa1xL7Wvw^nD)Rgi_`Om?&#~%RAYHjOe0}NBt{@hfXM|-L){aDWYNg;^ly@K&nFAbSrL2BH{)x&B{NKH$)SwTLByfKt|ildHk$g_n`(+H#xqRq zMS|mWA^(srt-d8Qn1Sgm7f&_S05XDJ=9-h9RtUc7S#;>XGdryKuJDzo(%d0x^USoU zJ>$RhY#ThIth98|(%hkGftetdans=mqZR!0@V5&qn4v=63vK?3Zf){8=x`7Oxr=yC zg`D3+uL(iE(oWAS6ikPxbmxuM_uM~!^A6JxHro415t$i+CQzpRMY)S5zCtM70K7Qgpj5@ zr6xdzrL*L$%b6g-!OLhryQ&k&G~>GkBGA6FjpO zV-sET-1BPxM~{a)Ob6p8^WJR}y7xYG=l}3k=3yD{@D_BVTaWmzVm7*MC)gUQ*=F^F zQ`h|$N;gtqlW6ftjH+#l19Na+OMtKE3-_eq-|S4z{aHs_KK09)!nwmliFaK!8)!YQ z3A&WNpK)p8J7bfbAUb$B_~CYidFk=WtHu8US*b})z+p;ZE02luUYFbhQs;9lWdsH? zy$T7F{P)YG!o;ZJRrLFz#&ZWNU6h_3=LC<(S2G}m09hAU_HCdtIhuicZFm}jc9>?Y z|9(tvBDKDo@b+0|bhK|o_pq9Y!G7vi{imyu2aZJIRCqRB0__Sut4r9IL+zL_y1fh3 zyGVol?3{|qnX$Cl{KD}kdZ2T1f9s)w$j6ix%Gt2jlSD%6=4@S>Ad&&_t_<=+YB1Z^jQJ z%L<&k2qAJ6YID<9|J5q1GiVDetq*&n6(_*TdU|>~Au(|V{F<6-)EyDYvz2=3p;&8n$wk~lmvP9NRkggSf8 z!=1p#;GdG-u|@0p{$f2$=BPBSj3_S;hU~u~QIJ$Hc~nFRu*iI0S3Dg*GR%0t@yr7r zY=Ath-t2q`Y%q(9ibR!uA~hqtBo_bC;}JDyu~g@8)e{gS z@$cyY)12qWaz3S`qzoCK_L+BjSBw)V+qhC* zU%UwwZ`DqZV(@0ge_CqiVg+a_0kBK*&0e8hfTPlF% zlD2eXdmi+I|C;9e`FYjcy|`vZswscDARk=8x$&U($Og2QAQzD`Uq+?*o?j2p7011{d_ja6Mpr*Au~&o+x| zBo1;syA|%9B2UxPr{0TbUiLK@Vw-GmM^yVT_oit$tLSCK!GT^DpdPH^hT`Q2`7>lZ zHf$vk=s5d4BID4Ms8#-h`W>%4KdCAz3QwG^|H2-+AZ(#tNyb_Ko5|NvkeLq9nuop- zC>DxUb03@#tTMqu{S*ENrhQG|yq1`(go@RVJ$)W%>s_FsaR?iCQX`ce-jyHF=@3n1 ziPs*2_>lsIu&>e}P%G0eKic2!+xU#$KQ6lOm%e-VPX5EGsFG5wWlL7mFkVRnQXKa1 zvqOyvub`%yeb?vMc&Z3p?fP9n+io@zWN8%;)fN0Qgi*A}nGEKWP|@P#eA|*ASv9%X zHo2hk>WpJfO`V&Yba~OdSe*ku!Wvr!a#aq4!#@`u)!JRi8E>mvy=B&!H;k@=Lg2uc05lDA} z#mAJ0neU|p1z{lHz_@PZDZtx#iNq-Fv+{nu1*NOg-B~lYtn3IJ$?N6c9%-c~fKO*^ zY}`aB*i&h&ASggU(E03<3SR&J&@+qjD8!=RWw`8tZBQ!d-NTT7m z_Ad<;O#OxdbOeZ;aw#vY8_&ZNu6@y;A5MVWc!nZsI3}Iu?#zevud}`XQ+1<{|%eyqDg+oMjy#qd~ z?t6vv8g|=$-{4+|fBLjg99)(!N-6v^fa>BQ7N=%hwRWg;rDgHW16m_!2#wx0eis!? zg}aaxaJGc`Z@8ck!BFWT=-8ZpVGLoumB+sP{y?za=H)07 ziIB0$1iM`^0=GoDG32d3fRnV@>z(KTW}W`m(rs_3+*D*1u>YP0SlS#NFRluZ(9j-d z+MX^K9Y&CKONxr#C&^Upa?NHuk*0KObEpl8T)r%QYb>}l0cz4Ts?BlsL%9nv)T4y; zPZ#G{P1+0w#R%VKG0mlTnOZy>j}S<66FDGLdjH46gvUKLL{reGIY&<+XSE|s}&67^-zw*s% z5)gQ+O%e6#)!EwIuUSmsa7hqO^OP-?cBpdO>qR=I+JqU_rj8JNgsa9AgY_3fRw&{n zu9eD}Ci15ZcOfKI9MUUDCQ=OqPKdyYbn9c7f1XwO<8g1>H9n8|G!VY#=57GPbf1%s z7qoJzu8)^9P`a@l0&pum)TRXaX!(S|5QUY{X0+2IPg=pLbjl z&1MDQ&^~|B({ya#DiIqHJE8_cXou{K^COKtJ$`TNZ`n579PfkeInfhrhca7RVG7{> zdj{6QN+}tH62;!~JszB@J!#a?il6i?fKRq(MeG3%n z{MU<0nwtBTs|;DMi|F6~M_L~1$(Wu;hoXPkB>Mv3F#Xnhe&wxM5H7+bp~Wg;%xF61 z-y!VC0jKazix)Wz4C$RuNopIs@J!jrK?2Tm|+lL)*y00=CyH=R+ z#wHm%aYs!Egb>{S8U>D}Vbff-&W_1=jHov&z;;3RMo$qKRM2JonD@@>x`j%zuVxLZ zO-7iRn4He5p?j?D`DwveNppywDyGdNPDOm{(Y?*eELvvU#N>O3El0OrWU%*SsfxKe z@>~0F*}ClU84`avZ$pkYvk2IIt5{#MLsGw%YbOm(mt5oyP6_~3(u3h2a!uXmi|zR! ze6u^J9xNLq3YFs8k`hah3;3W%*qV0{V2CcwZ~)h66kTHWWWE0E%nl-vB;a2JsFN0XhXa;t4=c>o&d z6alZhv(14#CSoAIj^w|Z1>{_nQVlRc@JH;cNRoX%O>{Ma?OB>P7S!Jtn-(W61uhw! zo!cdNrd118&0oKi(=0CRlD%<54B_Dc35)3g0+JAK9tx<13X19!0f$SlqcX{=U+^GVeRV%_k^+0TvaX&t01LeL z=+gTmsJ|1tg=7cJh_59&SFynQ`T)olyc9(aColq&R1r%bs5U+SSXK&L_2+9kOpv;rU!VhUR7Fwb&DgGw1sTV6 zv#S@V%Z}}YY-UHeKlWjW4f-3X^EX`}1o7|;GH9x=QIBCck|ql04IpJYHR!;6QX~_PVcPgFBLty5??!Sm*1KG*0vsy%MLsoh~X%EwUcTV zkPv0uI4nFZka;-huDzq=nyfbHP@l&8%@E$uiNNJheqeqzj_7I_^8Q3#ZW3IQ^-p!y zZ;!_TBQ9!*uj1tdKd*qs&((AB6sIgcTUHhm3*Y^Kjbh@c$Tl z>#(ZU=Y4nsN=Qq`rW6oKl|~vwKtMq0MnJkjX_Zz`Ktftlq(izx6p-%jMv!ja+2`~9 z{r|4(I_FZ{d$HCNGxvSZJTp#C{@l=aVy+L1{qxH>jtG;Eit`! zdyoD7Wr-`_m^pq&*ds!VA1!|Q#Op72H(%f)Q#1EUR`_)ehn${`m$tkulDKWq@uyjYjub(!3`?NDGU^11>eq6sG<+^&xk_cDk`Gimz)wD6c*GV z*|M4VKB`%+b*IXleg3@Ic22n8Y=;=yhe&z9JNbnEE}Uh>yiex-2yvDeI`*~y*JUu^ zU~RynEtCwp%Jx?Xh9`IrFRsv44sQpbs|*hEiR~QCK^)43%@?+?^`rS~SYUlC&!3l>|KMIAq?yqb#p})j?D^bmr zO0l|p{i2MG7dl-A|Dv9|l(?KtVj+&vswFTGzyJJ+h8FEa@mZx#K~MzoPv`G_=bThI z!Q`tK{|Y;Ou4>Y<40O^X|J1cEeQuD6Ohnd1`Utx^#i{qjPHC*kuwQ$1n#r~cS_*kT zH{)W+fw|==bGLmGQIqi_^xctch0oBw7aFLG{3!n*%#MNop+n?W6wZLQ@EDi0M5h5+ zA1-xcPw#U~i4Ev|BVd>Kp3K1eBEQF1XQN`*4+~B>!4yPaaq2+nn?nlycCwBo+FF@{ z>v1lzR{ke))mRqvw{_I3QyLxHBsSu1D*+95_~31k@O*!Qbqe{c*)^kc*7|U!c_gUJ zF^FZBipoiu{MH2W=e-BCh&$+9glDwCj?8HgR0(X4(!@Yy#@c$g@<}@m?lrBYo z^g-F((=3g#+I8V#7aEVL5A{;ve6sk>qT~FCOn*2hSq!0d->lRGqP_Xhl_rPE_XYh(vKwJbbq4S-^m!AkVV z^h4{8(Fp019e3f>ys^qX-}jnGwtS|@LxC}g4RZub-QxzS@Ea)!)|i#7ELzP63KY%U zbOzRJwr;1Zg~2Z=AKbj%p!6f{PUyn#itAm-TPPp;Vj00AW5HMIpJ;RJ%JD0i1=Sv% z9%6Z^u6QkZx)lWzLtK@M-&1_gItiE1+z0u1XO8wgd+N`o=KAk4tv%l4$gGT8)+Bu= zUpP=GU4e7=&Rs8O%p!{{YbMn^6rJFlIjNeML7Ehm(2DQb-*~xSh<^>G=0c8n{ozPv zU25Mg>c*6~)zz1%`kgndt*jK3mAhfdc~@j*Eq}2{);_;DsyU*MhjPuqeX}d`Z;0CW zQoODv*y%5d8dl?meyVjtLtaVET{)ZRuTYmP)i0^2y^9hIae2~ggOAfo$N#Oi>@$|`}9S?D$2*T$Ll-S_?<2WM3 z!C?apOcvTdrrbAEfDV_xUwr@mT?aJPh+A?5^kRD2+Va?_mTLE2_lP;vrO6JLHP7!} z)i->DE*~a8gx=T76cj5T%8rf4eN$fE-sWMbdli53mP3j6>T*VHz#Ypb4I>cy5iZ3e z!!_FOO8YbhW13q%dk@Zvw-e3OtDj25KRHiz|HFSdsDHcf^W!w!`%P;Yvz{P)#IvkN zw3Tr5>_Jr(=*aQne&2pby)JG07zI;{)Zco$zaMf;KXaC2y2f`EdhNGlA+gq}bu$lc zkMVB2-DF8ao*tdy>Sbq_&?^bB!`eKq>gB&;C1G}FZPT78bm(}=dziP5Pg1 zK~ZbaU40gY#pbqU@$i4mrH|r#khs?@i2NE*u)u}tePr65+#%>jUT4Mb!SmbZ2hh%;uY%iki`Q|fr_4lItXBzk;e!%|SEtIC zX>C~qxdRId)ZUpvL`_X3lt7tY-K3EEdHX9x*{-n7i|7AB)&}$pT^(^ioJ}hOTb&)u@#qhhuh&cSgn%90)^cNa3qwI#=BM zw!qI{f#l2;bDqaG>&U=|#w9)V7k}VH4?9wI*eK_B{P*m{d7 z-|w^l`i_b-TW;I(r}`7Acd8BzDC9_+7&CbLa;9v)vfOsIj0lav!NwU;_oX!jL^5~6 zB6h;yhKflzk1pwQf}_+nON8vVl~knTRufXdPUqO|SwpL;|7>A#O~D0_6= zIPLZpM!y3)jeCvlF&qaPEPF9^Z}NU=3QJ@QpLhbnu;b^>3HEMu9!bKtev8NYqyp-i zD1Wfh5hnfObr67k$bDLo-?BgUv0(tuyRVBa^s~BB z9{)tFc)os}qn!L}{Puq`H}CqB-LlY@J!Oi>RmJgb_-6i_nzD21{u2_Fsw?{nS0x-p z`Sr;Xc`Y}-KJ+`CKHhE|x=N)f26vH zk^T2h@MC?e86Jz%iS|D6ER>07eefhoeQ@Sncd$|EGNYxdn)+m{ZBS0;FXEjaQ>|DK z&-pMrX9Q+uXNFqlpUFrmw>4uo#p@fdKFA(M{=Gbrb#OvEhB7CJ#95{dVb6%zRT7Gm zkBa7rqGq2P6p*wW8WTMYwmLt2Jmp_2d1jCOtG<)k!J=gW`HGn){XgcJ&m?EN0>;X( zl#4-*O)-7#bV!jjk*l>PxukqOiQxhhqtCX3l~reDCFiO;Tzso=DTZ_`hP3!BJms`W zp|HBd;>$+JkIWi$#5O8+ss3W2;C+R1*~QIf$HZG0LDVkL6VP*YxRa@+vuPeVid zY>lu1d51$(L%+S`K3MZ!#YBOV4j;C&!qs<;KU$yqEIm{&lf3w-P+vK=yXb+-EYzj< z zQADerjA0*pnn5r0pLV2;jihw$>-xRd{Uz^@_+k>v9(S%l;Y3MIWnNa*kCuPcWy!bm zZ_86;7~YhBE>Epkb`o_ox?vG#aiD%>ROR{6*}`ksc%cSLdgR&OAlo-$tQNa^I3oN| z_2S6gtLbONLHj6kK>1S8*t%Qxg4r*FP&4jj!3M-gSltyF*YHvkP$?OwfJIJPk-1Ni0 z+UwirHpaipdPEL~ljB)6%GJWVd)67OuGO0mopq7o1q@*%frJ=hYe`(Qi#=fz(^J>q zS-Ahi(d{_}-}yW##tsdbi`77zn{HFso4*<#_5=k{JKc}6uRNcuO?=W2GtqEJd-w9+ zh*ALa5*gotd1sDJR@wK(JdfM@4&_gXyzB1vHx|}5ekRSj{8^mMuVrwoIC(OrjUdl5 zWD-2Y4lkZ%geALnoUf?^z%7<-7N8569BN!Z|43pjTuL*Y9wV!q=&bp)Dm#Wm|F8F% z1mUm4aJPszNO?h~u1`^4oR%gZv=h)|Jn8fHTRHI#$P~{%-E**fZl)xy8}$2MOzEVe z2eEgiZipDJD@zYY;)^P;)KlG`<7D5$uvJNh>Ld9nPO2!S^Rm6Rcm_dFCzJ6D}F zSa@CkEyHB#)Hdj&hQ{C^6eBJFjlcF}vf%db;V`|yP$F;dreBa;opaS^DD`V$?Ms{}BtRU;inv(KLmZ)0b1@`YmG3wx#v8ujxe9175m zuY+}Y^{W)`;mh7s`vzT7BywtO?4(Ow#p`q+8|R*JX%A(B08bP_k@z`n4?Sn@rRm;Z z={7U6p#wfBEcsTsyET1Maq{J{YjJ)l;q{(LzW#Ws%uAjf3#zl}a1!s@fa2kQnJ}pi zwK>5TBS%VT7p>3}){X1^!f(T+Jn!A<-55H;WsZxI>?+Me7*E6wo68$aKLg@}02Z#G z!0?YBuRxH^e)5HBQd&{5lbyS6XC%efpKA51(3<*B0wsmugFW}T-pT&@iqsbahZtmh zu0yU$2Vo$qLFF|Pim!u7>k%6xA$tmuWw&SFObY(Z7Gim{CH{+m{mV{6c>glV(RcqK zs(|huYKH3ja_c9sx~0kn&y9_L(`Rl*N=<~`vayvb#B~0<)X>juCQgm;Qc{eSKP zX{Sz}-1PyVrEmC_`^^nJj&WQQd>CH|arGT8X|QW+NEv=kzx-M>&T(GYwpqe-IAT)% z$7!9FL9hLQdE}38fNs@gxeO5s^eR$S;%>NNN)o3-NsDZ>y9KiY3UFOG7`Nx6|nA zOz4h_#OsQTj|)!-KY`rrjp}+4{Ohe|Q@@fZLNdA+O{hHVA3uzxHUEfK`-bJw@*rd9 zQ?I!29sd=fWY&k$5j;~lEeTAwzi)h{Fk@&oRQ7*!^U(&6Xy1Uok9));r}==WKdK&q z{%dUwGmkOWs*(42KA+jT<0qXvC**B!qcS!h_ZPl5PDw&W5xK~WEZ&o!goc-+(B{eJ8vgNQY9_7$T_-(Vs`^A=n zH7`eSL0PHI)wSKVHTn-(aD6BdU0V3{v-6?m>%?>A{dFgXpH;oQD5*?(Bfe`SFD(%& zyQA|&h;T4I4*C1IpnfzSnf^U{rc?I>Y$)W3Odp+uG@UC;R#&^@hbKbAl^h zjmQeSs`^HH7iU*hO!U9~`1I}TTA8ndW5n~(o9p?86&v^8rxgY}@J$A&GNS|xd={VA zIHCgVae>VxjxS89YBGM6=LP56?7iTznBTq0>6!a&LZ4WGYgX_h0v!%9Azr2MV9&Z!;F+A<8932rTY_G8YQ?ThSjf# z5$HGI{f>#CR%nQ?=;5Hc%FxJ&BD+M|4N*q}!w7HL)3o=bTRwN)ighWN(V%GUt?+K# zaEgFp$y43E%74QtSbic@S~(?eu2f0eNOlhxPYoB)t?%Tm^ZP(mgZ`GyQ?+4_5^tTu z*-f)kvVv_7&F&ivZ`Cmwf>8kv!nXGI8J7VigR!A%*9{OV7moY2@u!pUHaA_z%CC>< zS3UmKFIq#@EXg+YNDl%t0d^@we?_^&KP+)jK8`{}T!W%+eP8PGs_b z%Q$0dO|^g?-$B?8P2`-8P3x#u}39eL8P+&ti}VPm#8E< zJ{saVy{t5=Pn%+*kDLGI^=@qtJ=J?*WU*0GWnrkY!#?j*oOIpK&K>=(gzMJzy5h+H zbY(A}JRPl)IZD*t*yQo7MZOcl@QVZ@)~E^L^B{a0mNN}kSJ#<(@2Sa;LsnDewh3jj zn*5j|H5=Qbtp^qd_h-_+lYWrt8%d(vT(7 zy=b=~x=8WHnBn^|@>1QZk^k0bx7g=d6M|GxP>yCv9`?vRdX$xwr7&ZnJ#55N*^o=` zd)_B@RG4&UDKy?UlS=E?JH%vX1;d@E-8I5zbFmxwzqX!K9C*?;QZEWFH*ltI)3x;* zh+YGAs-y*FQRy>nvbP3VLvKjjUK=dkS4^}pnm>Ok_xJjLWf*s&fBkwqHUc(B@Wn5p zqoX~@9@F9=XBs(Y*IzY5xcMp#Mm_tPG`W%fNXM5>u}+9h0x47B8SdT>+Gy$h+MU}D zvg{3c|E&$mw-yA17a zp93Gdkq!!nXBa|b*qbkJ80bD4ad|3lEGkk9nf?vH{K$*1ABZNj23J0*m5KC;@I-5@ z`ELp2Y2=oU9C*|vh-lY)RTWhv^Pb+6$72zDd3l{dP)8yRC4=qiqj|Ug`Ww_d|EeS> z5llOms13XQKQA5&rr#BRuQog+4;9BW|5rD;@oY2VM`ot%p}vKFdZv}N_0~nol;tH^ zfkdL_2Lz(AyAS(Z3C;WL@$lG>{;o)Ig{n+h6!|(;K3Q4RulRHL?e|EVu*~j?gxlD` zd&JJwR-Hv0ne6G6zIXScF}l12(QVGuPCpLoYm%Q+U$|-`$*vQV%E~qsi91W&+l(La zdz*S&m6VwD0YlM^JMS2vN50Y^h{W??yn>Tk4xp-?ajCO=TASC|ymLH$}!2fyntMC49pZ(%H!!Fme zuHEmcmi-sai&qzgm}?J~J<$-wg#SG=58eVK+0-A7TVMEypNTOte$B|Z&Byor;>2}C zAJtw$$H0-iaKA}a6di7U&x$@E+PPKGS=B32JWls9x+EmS^q&~Ct@LAQmKQ8|6;2&z zEhr)oMJ*{25vn7O2n4Uz?%v+s?k*-ib!+`YkNuYnL@$TFN6)vQ>W}AFOn=YITin!5 z>0!NyE&YV^3`#%r2Hxn3ysP%qIF4^cFt|OL=5Q3pLQ%$oop&;2D1K^ z*I<~eT&}UOoAQMjct>f?{3V-0ApCU8+~&~`eiosjp~&)LTxJZ*4bR zakBWi`X~4g<-$0wh=qvBQtep7YB~)V7^VVwWRt+KAAGFVqEMK5*C7+PJtkL zRD?x|AaaBo#&GJEyKW3aCYEwMZw}N$ek0-MT=e31WW|h+=h@*F^xtkZ4~h%Ne`17* zfq)){@kxzVCv3tCbc0tnn-*ila#0j5Y)j2x^8bOP!iu9N%+uA3S(4QDzwx z6BCo1{CDrTp@@{R+|EDJO2LXMr{?lmc%gt|>vPgWs*qaKoHc4I3O5YJQ$K zQ@Ds=W*!VYL@+6)v;OV2?IQ|O(#4e(tap;CHEK`Tf)y7s)LXB`lR)R%=5Ioz@q?q) zc`i$TB}^Ka`1yGVR`x^DH{=fzna&1V{R-}c7%HqS@>zwjP?n@K;NirQV`h~ zw8M-Wou~`7IDoYgOv?jhS^A`nOU7+ENx}?rs6MP2A`m+tRL_)+tm)!9wEi)leLdb3 zoWa$`M|_k1Z}Fq&Dmzw(9|!7sWS74g%b9(di3!7SeO@bLwehdYlS6dG`t|>A`*UUQ z`a4OrbW7EJc#1-v3wUkgCcCT=yQ9K`=y{bkc!F>2|K0PwAdXFZR?kXlcYS1a@ifU< zX`#^(j5FoExUl+g^`=QU*n@^h?S6xX8lk+)j5z7p!{p-akS@&f%iGN^_h3Mu7MXkF z+|q1YC=9L}4B*8?vtM?-Saz6jHhF@$z8?eXrnsiEtQ9(Gd7} zsNoJ?Sbw7WPuj%vpA;ts+#i7`@IyW4O*eO&Z{o#gB*WbQ{nP;$wN3VkKGybEnYa9P zfX>dSOYgt?Kd;;?5L6%TqYGSvVS?)+20YkPtl)OB((SFu|J|492I`Gm178lW=LN%4 zz|}~D`q8~>Phj5QA`i2=v6;m$IQ%}m>?XAL@QUc4Um>*g6)dwd%HF37EeUAiA; z8NZJf!-K%5OZPrIbVXwQ@BYnQ4|*Ox0Mk}un46nhT3RY#H~F%zIL|Py3BhZGG6JZJ zm-lpkExiajg*!SreiXl~G^T7a>V3h`<UHUSM&7Jo-MJ3Ftb3{Eofyld$& zyxgTgT0n2AQ-K*TQ=Zl&^AL0g%>o5|~VbK&*cPLs~q{-46M;wMI>E zo8Dn*K6|FcZHyTdyT9*(w19i#UqcTxKK2qjy8Qg9nQ!JcEGD?a9r=d~W@Ai{=+9pKG5P`t{N^(%q-gze>5 zJqH}>Pj@$+u*lZw<`$a~{gFEK=-e28iY+ zD7;ATwIf+$h)NgUu0OLID=`~RxbtM=V13BCJ5i`VC7##P=_i#1hjvMZVS^78;e{NBl^GD+z_1n)BkNCH%C?$?3jlUgiNFV&{>YTlsiX`bV+xbUDIO z{@al&9dKSia|_;yQ$%FqGx66uZ`RkX9hnw5oMVfn-*w%zavT1%?rJG-hS@-_4kVM}*dec=D&bzSMc z{PgR_bC8t{a5<$gchLG)P*A^?l>mTYllB?3w(;EhF^D$8^yv!B2Of?7IeYL2@Jf1Qw5%0h`tAY0R8jc5>=qR z>m93oy$5>|)qLXbXmNT*hJSrtUfv|YCHMzrk*zW^c8%WHP02}wUm(8n8%&0`Prlq= zGQ2v~)Nh}^S^+y})0fr;D`(X9AY27CsZDxA@Vq8P`CqakOlf4yI7M5}3Aq`(w{DSQUKXq78Ny&XV zfz5ecQaOK~hfOC>H6ySPGU#0}Sj4DO$rJVsQ!PPRmUfVw{GPiW`rEbtovIyYuPn_j=$*u&Izue3%W^C(-dI6)LM9c8-Ya zdIo{X-tr&lf?7^4aWn7DHHNz%XawxwWCrxL`Rc2)#nplPRR|-lu_N?0r2mK8-N40F zy{6izGh}0nHk&nxWPJmO0fz(Tvdd+Ca4jc0+37$YGE^!Z7cMW48pQXy9^@T#y0y4< zmVqV$i#Q4nyQRbOMLj}-eSJ=EHJ$gqsx{SZ@+mYTCDg1nTwQFtzM9IVyhFhyBl#+) zpuo+=G{608stgm_gz2f(!qHj2?-&-!`@!PJAX2`0^QOV8xq!jJXG%xVgc3mS86?J3 zIV~w@j1Y_1SgzP!$k3zGo1xmV%htFn$QM9=^|anoa9@Im!HFMN=Wx@C91+1HCguaP z1!$TS>#Nk!r0}!`8as*6OIfre(Z*r>E zCNMn;rc0?^{CuZ{IaaTk)6#s!vkI#lKbJ?lC(DwYj7$^?9CO$0_d_Q61IKxpbyVL~ z=tW0evmSZD?}YU7@;YbBPV9$#Z18|?YyC@bCQwmXSy@pLyhZM}Z+Bo{b8wskXYv7x zX6SPQ9+DFd43gAH-)!aZX}HRWQeKB+dKGq4D1csK)(M2%;>8Qfz=*gwEjWyZ%?8%= z?%lh0?m)R?*rr&h`+!vvVr9*)tc>&MA62LV6H{1sI1URL;|+p1l3u~?DIqds+-kyO zYNrO)ZG*3`PDKKrHSmGuqchm~@T`Zh3${j!7vOzRhfwmRlegycO0nX~Nky8YY2d-Y zwf%+upxMev!f@aL@_e?;`Q^P?4v?dHJRNqtASg1Ms8-N zK0cRlh+qb67WB5Vh4qc{HkOubBO#CMx*37PfxHW)*#!><)z#J1GVCCE6~%MPZ9565 zXhqyMa|`P|pe2_0)w#19nsMFgrHIQa4@+=pv3|<}wkoPXw(r%EZ=iASnLYLcmgh6h46T6; zV5Pb1kJAdMeZaJEHJtDIo-feD4M=>Ia^@3qkXt zLLl((xvC%gA}c@Nk_+cBs6CF>G!Syzq!f8YZ?ezS0SUJcT~?pg7=pRwdD+Y0_B2I? zMfQPtR~)}>d^6B!+{=SP->M{^&3?#nkdOKqj!b}s7pQep3L9pwCsD|moKxqSzCI_x zzgCXn%=+Xnyq5g{>DX<(r~7^WwNZ$JwXzbJsIV8`DjRsI<%4NW6R^@NFKT~GMMVV& zb`PLb71}K%*poeIPJDj8*CP{bp`kI{5zRi70;^~5fkiiIMaJpH<768ZG+?l-&$1F%#l{1_VY%umGDQ|JI z%GYs1M$nB-G)#tv&0UxCI_zY{{8CkGj?JTb{}7%iG?mpJQX+*92!`x&>!s zXV1Vs0q5BUpOb#}7Kf2jr>t@=kY>2hP~7`;AHv;X_qbs(%9_`>E)WXsjm=mcn~^J z%0GFM2u(RrI|wXNkO}mA#%rO3fCO~IO7=d~u6C~zEANF~s_b?*Xn9}uLXUQm7{4?Q z)(w401d%$hD~5+CfFj&YKr84lW)`cB#i!fSwf;b;RbXBv5kJp?Exze1t1lQm;5WbF z>rruWl-2g+0Qo8=ojNU2yxjorwua{z$r%_Vk2j$VxOQ^*&urbxlOA8;^?xq1ep&br z!D<4r5(Gdx!6VCEZxg(q(h> zA3RRTs;nS|!K<(73HA*a!=dlSG3(dA=Pq|AO@LD=YE_bi()B2`lO~I+E|~IgSV2e+ z<@@2t5<~NrOh)pzQdR3?7+755zgz@UdoU#M#-@{%j$b`x*Jc{7Jh$sczCUMY|IXO` zw>tWF6pNBhxs5jP3~8LfZ~$Vj_m-z%I!W3+}>M0q3Z0~U>-nAjy)IMr=IeB3}| zm}^e%+8rr9J-x2OQ`i;(=?S2EVp28dN&=5mU(pHzWPTm}jS&wJO&QtY(5@j^m0;!0 zyj0g&`uqDYA zx=uV#XVfrr1!m;~HD5N zsq@RT?F4??8`scd@Hy&;J^qI#Rf7LHD#EtT3$A)DZ5j$kw4|I(=aBA`_h2&wbKM}q zaU79G@_VT_zO(=L?;qeBHDFvVbShH6LRgap?WZ3qJ`$?tW@E#t6TI9@xzckRGyD1~ ztp`l`Yp{CGn3N%NZtH@0s(N}hziHj{@h+Yx6$pQhnwPj6G6(*C80GK3eV`RmTWNit zo$T>FHPuhdd7wO$%7`tIRc%kp3dfmnQqzv)vR9fApXz?=mL}u<7r#EC_8UJd4#t~C zupxtXIzOyj*K@MRmC%FYZXhvU0SJfQp6k6I0gQrd^YC-rE9m4c^*!)sH)RkDSa*A1 z(BL3w^-sO(g`AgRzl3Lv?4|j=TvpNNI|qXi)5$!~HV1fHrNQTdiKzWb4v6D+?OwML zPh3jM_NvxODhD56h#8>s()+DsumcukDfC;zlLGG35nIwyq+wCE)-i?>ZfGd$5c3Dv z-s<~!6LCN=iGg}wss}&&{s5UU@cJiv%F#VGuJqf3My+K0#0%AKU!I0Xn54rk1HTOj@dVJ~$;k-}83dBRXaWfa z>M6a_oy0eSb-6#F@;%7Z4-knMFA6urGld37FU(o7Z^HV1o6?)nQoxwphyXb zGjJO!J_>Z*ms$E2H8~49Pm$|Ib04Ystl)kS(;(GNn&dwR5(uYRrk|gKx?cgf#D1o} zxw#q2Wx$y{IQD^(u|ib}VDr1rcpr@z`nr;R!s4o0yjk%Zy6vEN7>Mcy&z?O~RRyc+ zHtE>zx;~f#(#+|YAOJbAcA#~CmBnr>rRVavLO(-HL{bKYb{QJBn+BKejyGn{P;dT9t-tVG%jyF%7#M?3(7lKlt4M zyepiRI#61HW;&l`KP*T_aQwfoQ|P5qeVMSUv4x#&=zGC;cAs4M5}ssxtTY?sf*S(h zF>4Qob>B5HTs+Xrs_EX}M!jDPp?EJ*PD$Gz1Wll0GY%_Yy{le47m!ha!We++Oa@L;HC+@mP|eydna_SX3;8cUAJ4Ct~VFfJ_H7YxQ#uyjyBeY|)`EN8Tlh91IcYl)aR!@K(?y^iX~qj#m4!k4ar{`|~Xk z5nT(Wd6ZQFa}WsfE^r>;{?f!-ptOQ^2#eMG{P-Wtdc*8n+-a{pr41II_wYvQLwb4( z)VOWyVJMCOD5=-+OHz_Is%8Vu$0ok8ue@HCH*5LMp^ia=O^bW9B4FL8J(D^>ngo17 zb756Uh9DB=VV>Y=u4O#1nFQE=s44^AhOAarR)URGUOCKZ z2_jTUekjDwzERvx2cm7z)co|@w{L-6hEemagGHOD^Q=g(0GoFR2rgse&@|(xnvCi# zrcjf157)KKSgVfTAhM#&1Zsle1R`1g6LsYR-HPtWC=LIOZ98Jb`VACZY4tnqCha%;6q9>akBaJFH1wZ3Wt?!zLm@j0+Oc*rX_ zou4@n0LI{OIl9bdAl+_uI+g9jmIss8LQu)VmYOVA>SozuG&2WSR4zMfRMto4J! zY_O6G0KH5lMXVpAxH&*ScO(L{cx>muImddW0M>g|`U9z7Kr^~Uwrc_7MeHU1VW!@L z`bNqrV&40!eR3b^$S%H!`_`LkB_AQc)DG#_xVgF<_Q}y-Y}xzjmc3Mc{ybX$kz-pi zSTks3>J51m;mI?O?a28o?;lf?-n7nf8qX>sSAbZ!~^@Mn7 z5vUh?nAJse3}O%mRCH{dq=O!MpJPUEBhN~nzh_}AIXO8MQ*H_Ar6_*cn<@!@BGT

eD9%E1u+*A))Il11jQX zggNF|l6gUZ)?NNiYHz7XN;a9r>T5iG+W2VNXqfa)$B2jFvuFFQBr1t6{qm?nC$6ps zz9`QRd)wxYP4b{f8<&vKmp`9?-dUpx3K&9SPEUeBp?0Zxo~opY^bh>vIg&Yt`lr;F zpmK2Yd$sFT1H^O9+Jvq02c8s~mpf;1vsRBiLvbXSTV+zWbDc7qvE8f$J0}khp-RYNDkI(tE0&!gxv6GCX#Jp@O0tpUOd};eO3(NY4CPjQBf=N1Alr88^_GWWjEg%65b6Q=pTql zeFif`ESOt)w+gm>!6J)Y?5npIfpd?9bhvK3ts7s8N=@2sv!XzX7FYeT$zhQ+lJ*Gk{)M@@@bu{!*uwWQ4~yx8KZnl4-sjY>eunG? zZl}U6>c&Syuk>)S=+>!IWWJ&d8z)khnVr?UdHf#24;4P1MJBD4z?>(GZpYGK6c{2$ z!T8eRb9!(TvFUEKF(xs-NU`XOn|sM~o0++f4O?~NyEMKHXiYG`5g;?^=BCQO;J3*d890c)KhX4t_5M{T)5D}5{GJh_7IO8$MORAMW3vz4~q#(G8Re_Et z7f#FeJ z=lyE>Yx5d*-lYte{icL(`}Y>)#LUsZ(4^ydDxkgm1`w=Kgf;n9T6zKm2ygyuG!nU6 z-u|6Je*};oa_S+d6Nv}xL)GUcUnG?CyZ-!160lD;4Mx$YoD(dayaEl$_jl8M&hcY6 zQe+qW^Mi!t;&tze2*kHUr;c~ek%|BR~o|NFXNx7h8>|MkSsGvkS>5x*>98GmmX9ta(fW zY$PHS_!0Qn;4)uj10M~y8$G)%GjZ!}1g-#tM8V>PkN@cbd8v)UP|KH^KOw0#JaJk538&{?v7$c^MFJ*H)S%HB?@XS*dTlqGQ5sb}X z`{0)>l-yAgDWl4i#>|n`?RZZS29m7vV55*K?~{;lX$Q#Pi(XO74bKn??H^>?eHv!I ziIUL2$6-P%|U=<44UJfP^^NP9b$-SSuf#QxXzt zd@elNEBiL?D9s7C3J=x+0HZDBM~Zp9GBGg;9$*n3XnTMPZ}+c1l)G0K*L#> zA=_0yCuNKr4fD|2t{PS~)Cs*#@mk^e^P%UO`mT$=h}(Nmd<&d%!rTPj<`(;(Ko#~l zRnMOjMO5b|otj=MtZ!VYFK3(HStfsTN8ixXI07dS-?d*@W;cO9?9dH`f9PK?61Nl8 z&AmG72D4pj(L<-^$y%;OWTLYf|G+aSh16=z@w#yxj!KDi<5qzUa?~?qlV~Y}Hz;hJ zJg-`Me+;jw$Ru%4S`|lP-_f8A4N)X*fjN5Lk1cITlD9e+CLqOiSR2^daKcm4_Z=M_ zU`l)-YdTRiV;O?PPA+>*SoB&wYC{?kZkXzL^4)fZb?u4gj=k@Z zndoGsjq)nB4|IaS+k-Dsa$R+0HP6cNeSKmE);s5$YVB4_GR$X%N#96C(Ga7ke3tER zDokG?e~Bbv%}@!Gfc6-o9iCz7oUn$z+%v^IQX?(~6qh5)!ND znylp3U5g*=b{pUo0H6jtaHET48X^fmC6P%42Pa;MRlk-E{C9?Tgrwi++H*|OwD5dO z+WtQ0oJFx=`;ku6OL^qK2ySX>W2hh2zcz^PzipZ|g|axHD+#i^k=}9!5gXDOZU9>knctkB8=!aI+Zm515T*$T3JLjo}m zVVgNvlV<<`@dnt5lGYP?gKg+Sc;dhCy8H{9dZznMb#3$oDpgS!%jD!g*@qU`<)mnC zU(Q4_O}(n8gnua=8Gg!O9vh5Y$fpOWSc&OQEB=w&rSToYCOM_OQ$uCv zGna<~uDYXD&KA&dIF{V;Aj~H;_~%U%;h*g{xc+`6SaR?`h65m1#|wmV77!4gftV@C zja!9PTzy5vA2%NqQ$&l6{X|P=3{^ld;X{tfLzDO{52ue(DpDqAJWTs~Ft>a8Ji z2$>W$t{TQ32djN8eJv1WzA1^ZOb3;JO$LV}y~XI04Aq<=wj8oY7;Y$w&5i@P1DZ89 z{TVn@?T@Xtb%#}H@xu;!T=-aM*qIi2a`bV;PgigKNcjvN8kMaBm@G-y)e1sQc}J&X zTpBn5NJ59^%>2h~*SlZt}iz zZCRn+;Pq=qXxBdQcu1yl$73Pg3fIkNngCCT2hI3kP)@ z*-$p$$$DhFC!O-x#yBmmWY0DDiCJIYyZoWjwE4EX^}@ebJUo&P%y|RV1}X^niXc~{ z-!U*~`l(fRD|@f@)j7blQr%;jq!4VrJ&5l1_7oE!g&*$sN{hJv)ho9d^T#2nG@awU zn43?3rEOR=G1+NZ3@8$G%_V?eNYTxK?4HfB(){6$DKABA$o0h2T-4U%^GZt;8N!RW zXtix&y$aqawOz&zREN7r=j#d-aJZcRGvXeS(^^;urw3c> zMIqjg1rUpWb$9b8DL*9OE}*Wj4zIeaej1${XdlZ6?L#4b>l1!F_O3#yj?;_|NhjT> zz|49?2vKvG8?m;O)=|IL!Zfe#_%q}k5t&?ZAI%vYS!GnF5+o_bB)TvkvW3Y!Lnjh) zz$QmbgE@7iMXEe`^5SYg75CB0>lBO`wY7;uZTSz(Lx`l?z5V<@0Xp%QJ^I08)qUPO zW;+DohX6Es@4R2A1SuddIn8E(aR6ekz91H0H5yF`G<%un3yECBE2*@K?K~f#uA&13 zU%<9FD`fgZRtsET9#||x5Og01z4v|}B;lgJ@ry3_nOe-&ik@9c9rzC{7ApP*!A7_J z!+-7cGsUKI%F5wQw4`!YcXfjuW75WULW&v_29DU%8V&mq0?V+(oy8w z=TD^*;vypSZ4eBUgzyDZ}^$ODE@7#I=| zCO{7bd2+JC-tbgRSUuMD{ldkgjKeReAm_jscYItN%1eS9`m9?*T-7ybbDUO1so!*K!`+tvwYrGk zjXJ|J9-wnLoto$^(l%B9({$&jRysQI&HMT6$hXQ^LUz|_`E9gJOw!mSe4`(U?H}~W zXb2A{fO>~2fNU(JlLKx@Q_rytw4PGPVuPt4*X9VjF+7~czk|wfciqrvC!F|UeFSuz zGLX@>)VLiw+Va!TKlF#DLj^2q5`}u^G`Ipj84oCp<(>G;6Iex zj9Wx;3)e0n4=Pa)-ijY0q~qnbB9Qe6uUre*0)oS;cv^$*tKGh?_=_ArAzK5=8?Vv^ z^BFbzLDb}(b**rD8WtEdk@tP2*LrP^*L5|KsT`z^cl=|6wcy1f?6KySqiYySrN&M8cv|8l=0sLqrMb?o<$^ zO+Z5AU1z?(|LZf4GY;2#?>T4h6`xo;2}}3?0@XWFk$_z9dF%?%NEH^tphFMl1 zil~674y$=&bW}xMU0qq(dAdlkA_mfe>EWY?4_|z>p`9`wGzHjc_lN_}DSDi=5wx9F z)}FKNAL5geegofCwuV#@s}|if%YgcLi)A~2ebD=-m@%Q&%z`WBB3BGxvCy_7x**F@ z>F$p(b$bxN_Q&wDXP5itWJRuN@$q?|V=`|`fN}%Ey|-QtV1buV_rL0)tAqY0hamcn zSYG2rus|Ro2aJhiAs0{hAkaq_vgUU;NKloI3r5E~e4aKoXWN+M^#wo{QP72C1%hP4 zKzQkg3_Xg^Ey(I`dMVo-!#}rY=hM#d@`?I*G-xh2?!_cTN4fEBtAhr=|8(GGswA%^ zgg+;HA`|y(kEfiOW`Ix!Qb{@{>~kMyxoKROWpZ-zXgc?206WhhwNl*hkp(#5!Re=9 zm_nN?ezUWF*LO923Umuz3#N~E15W|HZw2LVT<0I@_k61QN!C7AKPIQR$GI$cWwu{3 zO-02$^mbi~mOwlp-^^%mR&E`}4jx`(P#Iz8;COr3vI3q9d}`sdcQ@|Ut=OQATA)bX z0G@K)Lu?g>S^pYhoVh(vn2J#XGXJ_m6>_!yF5Ty6rb%{XSuw24eW7fiF%1O z?^cC$0|4)o2B*(MD~BB`S+2U%cFhk$$n=U~d!)HfdtLKBT*burxCAIsh}aA?w6qHD zn%>Wy5cJsW1JRPt!D0eMcSOSG@0f8XUEhY;VS9h7c>pwaPoDt44Ddflh^2nBuyta~ z9+621{vz<746|%=I`t)xvqw!IU-asKXw~~P+BS|-T*UeV=B|2uk`K=E4V93j39Md( zPx=Cg@4TVCtdv@fSyx8fllPdYRNhF$$%fKRv||?}C2cQ1vzgub89TA<#rJ$yNqOw8 zwmo~n$M4$(!?I?KRLmmU_YWQ#a+hI)bjEf4jp3mk?1w5f>(V7qr8NWp<5XL`2?7i-RZrH>nnT)ys)!7iJ<;>qGF= z>RcO+=S@lYTa~8GQXN#1v)y~pogVlw$gz2!(A(MAXxQ={EWZjT`IP?BZV>kGBhy=S zi2MqcZXxr#FWV4_YVX!GG$2lIr(O7!MsIJrgCYZ4>QOb|C!8j2bpV0@tWL@A zqyuEDfgt7J=%`7Z#d~NRLBgg#e?pk_@rOl{BAFimbFfhnz;J}C(HeFGq(el>L(4Z- zy!4};b+YaDL`d-lGSb$gHxSmBsZ3?uBy;q9wXv~r1Du458@Gu~#BHc0h0ht=hxt{e z*cKg63WoBgff(9hssLUGL?w%f=P#&zh`Fu$K)K(x>WT@y4A)E0mcD6x{M{@Y%MMm? z-o4e?5Id$Ssi8Q&ixeR>TqiY>DL+b4-_a@C2z$q6OX9G&iA{+n;`c0XQ&{yY)PF<$ z`~|DGLN(E({-N+5Mhl@Ob``r4C8*yI=lJz=@l?7=Kj0IcR1Se0H+dM^PYj~ zjB+?79Vks;81z4HZuTj=?yvm~8$W!=WP4u0GFRxh=>X7d}_6lM+RXy)jzuVa6qI}BwPJ_FbY z5x*fH4RK`0(-VZ#zMc*1kxKvLc>GE`I{ZOB7B`LpqGQ)LIDdAQL7{*!JqRy6GQo~Q=>}~gDB;> zyhCd%h`8m`0DLYEuTp4!lC7pZYki=CQk!{UH4v|AuO^uLIaP?ff)z1v;z3nk8i2FfPDf)B{Bs&lvpWM+@?Q%VBx^BFp zjxXbIng{vS@~FC?pvQv;X{7qr&vh5=EE&B6Iw`4_-yNANt2Go%bHxA=cCOJ=_G2I461O%N3$?CB zzBeGqMp#8CMV`PzJZ2Q(;pK%eK!J91uh|MtPOM8``Jbi-NIbO1H+`lYPfa_#BQ_t}swnH}5$cD=ERTfFGRphCV-HNpD1JqX1RJj>>h|qN*gq1L_?cw~j^#*L7Nj=x z2{VvU$6W@;OrfIM?V!vHez+UZ^ z@R(!x=cUE z9+$%P<|lq=QCykL?;lXayajm)#SIv_A`8s;;T9c=B!VnSeF5{$wD8bxXkQLi+j#|t zu-7R^xG=jvJ_FQySE%Iii4!i`O(>R~2PSXdC1-kjPm>_^eCVONzCe29@M0eq<_sT& zyoy{LxnhXYG$;d)`Fj8k0cdpN<(*oI3cUkzc1tL-K@m1kScgsxJWfkf$9dU$=ocj} zj#fBLfH}MB4(EFdjna)=FrK;a-c#n@J@{P5(`R9~9zk^z*?RJ|a=FM`_pI#PQ}i?(cTT4mE30Bi-W1a`IkDf8YreJl!**^Fx%p9T8hp$c`7NCXP) zSEsAo6QaD3K|6y3BzA6;2J|Q6+R1+SY4Q;?gi*(c$Y*b>3W~#=CFjA^4MPvKHC#I% zlhCk7r5sm(y03gNX+UFb=IohI_O9TXb;egj!tPb#;Wy=SO1GNy8$c2?;~|Pieo_h` z=|R0mIT~4|p~dIADm3wNIUzUq3i|A_HI;NOY7UM#hpb!dq>h#^`qDpDOZSaV;irJm z9ta`tquivVgYp+BDEx>b;0EAY4RMX2yaii_TGOMRIcs`4y45G!+2`L(%b5W}0+lD2 z21-jx!loP?!8!dI^9S(A^-q4=aj;jh5IQd}f;f22$OWiiC@??hz5)eTc~>^b8jhv)oH4k<0nu!PQ=6?TPQ>vTd|LKuO{_96=MC zWOt7B@m$+7=+R-rXJ!v(+f2VQA$_NsO5{RIj68 z-9z%!3+VTdHxS`Kj;;VNf}&`}q-Ztb3E7!^I8!ebo9e^`6u1wcDQJ;6I}dpFCnmM| zEPHO|&OH4Jr!O?fhbhq3)+Wi4R$Q_fx2PP(xc+HoQ3S;u^jQSops((>8zbew*ObN* z^e7odDY==8X8LQb<$xkRSzmwSY)5(wO!`&*GH z$rzKAZ*Vz}=?j$4Xg9AHoy4?e4-@3{&B|$a{XPqXLd53?tR&X+ye0gLqre1#3+V|w zX|dCpB1JqmoF9`v3|9%WR>IVAjKz)TC~EH)j%M&jhnRfvKiUCOTHo(fBOGuM(RG*A z8dFgbB`e18eLXIK;()gp%@WqGmlxsY{+X!E@dQM@)o&C14ppVNpZ9Wj8BnuDDd`#Q z4Gz6|BPLL>F~@}Bu!vx(Iu73vvn<3bwSgcA?a&E;5SQ=+o+|(vrvUecx?W<4rnWSJ z-F|vntNAm?i^kHqgC)FnJu^Gt883KHuY!N=eRd3K<2>gGl(ujG{!$JNhWOP20NAh~ zh<37GlHDrQm&so@jLPjpPEPA@*f{;bY> zSL-tDeh1CBmW@XK)o+%7XvPf~;z^zV`JS7dt?Hs8pWOt1^%4{dQxi^|{#N0Z#BOiT zN(vicw>SGjmlNUlpDwmMGX5E2d@oxMnniflfv^qRFDKbSF$0{Sx3@3kwk%Mw70hq4 zRKaHU13gsScn+wLtQv>Lbls;yvT+zEXn zBN4~xqO$5kVBr951P@JE)7(Des&21+f}YPl>_?TgO|~5H0YC`AQBQqiNsP#pfb{ad zUf^fI+yy#53Ts4rM8v6cXNnHsvmoF+1>M#ILF?xK`vo@7lV3JL1E3FFS7gk#nU}cx zJVck&K=#x8#N-#c`uY%P!5CE1^Zs$2e4#_B$Am1?^8so?*czp~ZIGi8KL7+^`2g>e zzjFE%izN10^`K|DtnMa^(-zS(^WUYHZx#hj%)h^9P|xBVvyT-az&mW;xN#)cwf*Fu zXR~CLfW5BiT#s}bhL53+j{H;AP}i)Mjh@l&aR!+lq}GTd3!1(em@byBe(-6w6A0RR zh;e)BvtFO;pN|_^Wo)^R>DALKASP;PnTR?jG9K;={)O-B85Z^QZrh{N^TRc+7-#}^ z`XJ6SfFq!#O*!;m#gF&j{~+)Lj>tunl(xQ!$zQ;EMMc1{_7n(5V34VdUiBr_BbuoH z(;K{sjt+n<0DlU+=j(%rec`_AKYT^ZO@oc*o_6V{@RDL^XlPvmvoMRUnYGbgnB-*Y z+W!pVXg5+f!EI8tx@t033vPjS_YJA#$DSe~YPVr91>!>j?Q$6esm)r%<8WSP*=j#D z%?G7?E_~jb!p{&JYmA!rz%flQM>|jiN;*Jbo`^W3fzn%VL@@aE>6heB28}P6K@1A5 z^4p&Gpn2XcQ9AZ~54vMWHLu3PvBOb-Pl2jWE*IL6F4*X>y<4HXa^*L@n>+Csm}bPc z5XaH=$UT;S)|!yg;tm`noGbdcW*ldX8dd3P&g~TXfUl$ym(0^x=9-7Q2>*BBcS>Fi z?G^k)0y17-r|zM|(CBCuul?Ns+;j#&uw5Tehls&OIU47cpFqxW3p)3PktTN)9a^kl zgFya*F9FkFw5yGp8`crXZ@$LuQVVfg`dqi&g{dA#ImTmjGJ~YE$w{u#f|#E{D%bHP z)tKB=08GjKqChyMYftZMZaPy+^nik0%&Uk?g; zKfqUy{MF09?Z5vKO{#a)rX47xrKJT;q&yl4k4;3+QX;+bPW!M+VmrBe3iaj1AN#Z! z@a3vON&`U;Bm_wHUVooHD3#lv1WO_$<~@UM1d|%Cu8t+F2}4YT@OWa?+K?x2*Lww$ z<8P2Oo0|Akqepam&6^x>R(>cR?y;vB5dxdi^!1%N#P#me&1fiuq8p->p0vbA<0#?_-)o|vvZo1+6R}9w3;L(4FEx-*`oT}zp-ygf$R{1@fCD_old8KMK5>w zR1zFc0*EVI@^KHV_Y~+C#3$jrsiq2*k2$#7;R6xlF&KPgeSDhfJIjKh!^#FI0ZdYl zn|ITCzqN4+6t?M1q5-UDgQO;TdQHS(4~q$il~<6${vtJg!ZjHt94Q45Z-PgC0cI;W z!?l6f-N|him7JreAeW7jJM)&2ehBco%;oNku$=0ZF$8Hcmm@G1-;Otfm!a zjqVUS6dz=wP!CFJIuz8cupGdY8f*Lv3Kv**ufQpq`p-~P6KL4i>FMdfJbWJljKJ*K z<*^0V&citk>s>*_SO1@6-PR~1{^;lkN>}jD7sL5QfTw`!4PbdVC`egdePVDBCP`=m zMn$3PlqyNZW!V$*^5u0auZz1x#;rp!cloS<%LhKK^I#RQov(o7YWRT(_BRxZI1Kf^ zJMvXP(MOrjOi#|VxPsd6?Jx63PfGOli1a*vuPluTU z8JCc-(Y~RcC6pi#$m*Iwu--8IpJT}V{jDfX#yBXK#&aKZ!|`MwXaq_6W4KokH(-;N zRp~8^f|!{Nuxyy_pw*VYkom-*#5v%)00j==3fxYJlezP;8&uBl z%jv&g@C^~yG!V3xv{hgW651CL6kweds56F8^Vl)V7B%`|w2Xp(UtZQ0CCnW{jOPLd zv|FI;a)qf9(0P$Zg+meSI=2Ik3b?a?X;1U1PAoiC+KBlJ+Qm(9LC?P#dzqM=JPVQD ztjj-?ILX+p%Ljs*OP>_qS;4E6*N|OLz+7cn>H*JQFNlmTfG{o_YxG}5@V{AG;4$E> z$x9>o%FD{q`5bX8)f*KfeqJZg{J26+qvxt|;}--CGBLlp!XUCue#fS12>?nNv%R&z zvIK3cL4u}WU?+yQq2UwARP5$&S9PyJb)N%5v1!Ez$j}KW5Wj{~`YRlcI=R-kSY&j7 zIu;&?2dr?{Z~;iW@E;>cJu#cKz_hV4?G6m|s=hkF7J+1q8jy-&bM zbO9(#L%IS4XJt*t9u&duSvkjbTF)O*K)}m}Rlb6U)!UDt?3k$4v>EM%tVMI>Z{Dmv zV(RbjPu*VCG{|S5y1A#JhD454Wx&iiJrQXWGLs=>ZU}T!u*G1m!9&+Gy{*&ktBY>H zUJY4Zo|7B7MG>ux=;`R#*xLuRd=ztsErOI(CN?n{(jJDoi=KGRZBL%d`2bk6F7XWV zEgSu)yVS=OSnQ+5fl?bSE3R-*Ci8_{LP!U@o@#R^qJ@!|eGiz^*WYJQd2O8P!bX=u zAIGSNDA6#&5pCD|?9+?eluu7BUFRxmQKj8}M2|JeMiYY6)e9%;5f?Gy#Dzxx<@>zP zJmlk2^R;w(oLZ4%on{Q5WJ8Bmrh>NU}(mj!hng%N0P9!I)ON^kS1$W+uB0t zaA;3h=S*I)&Hp9-ehrie|7{l`{sb2L39;X!0MCP%27f9q`28pL*41Ay+N1vb#raDt z{fj8!s<$l#1)I~#oY}ngarU)*%&e@L(9MGQ%#OX6VK_2x@%w2t@l$}s&-Lx=C(*ez zNiewa*5NyOgi(9y=;@gOV~?bM5o&JT5)r4zaMq{HXNy@%oXL7tm}x?26+s9^9$>hD z7lXU=7*sk0bJEXH7kjv3z=hBSg@ENNcaVF6#=8+N#0hH}Z<)YPh~PEab$4h_fPsAv zD|D0oL(VBg6a=h`io$3O=QXYrGYORqY3y6lkm3vOS~EC-oGW9frj{dS=ucqC7OjM0 zMTkHVc#ir<5HUb+{vB>soJJmqtwD2v%pGv5#xDFmce~Pm1)HgagBTO8>kyfEyH#Ti zwK3wJh4M&de_`O=@#V1;dLGG+C65z)DI_;6_Qn^9#D}YtRaA6@9 zQ3h@9`Ll0uUbqJs$1`B>z}XaMizm`js3AwcNOuKLGBVBs#9y@H%tmHr{}!!Z zWdn#e9cd^}<_9%`h#+xeATayW%;ppUqMmS1K)x40JakUaaxKCTSsXY*zYic0LX0B? zS`B)oUNU5a1(;~PJBXr#?{GSM33*%q;3?Q5>_`t0xu;Y<{>9K-*XrCmi7yZt;2Q%+mD^f}?tll(Oa@0#i`TZ=e(WqJ8uxA3>E1*1 zX(~`K0MD3zO8X14Fd~bB8n(1mH;L3|zM%^9OW#wrADhvf;O=212aPR~tbMz~JibO% z|A>41s*^`-*0LU#ij(s@?5P-;-qsi=(a2#vT#m#j9e2b5hnU77M(7zC?XizTqk_y2 zfRS6T$c1~bWZr_UVNZ85uG4z`(}7g)R|@ywC)fnQ5z zc_=tlML?+!u77)w>A;wVI@eOz$jIO^5V)SfRU2?zKJA{^{(W(I^g>igDO)mw{DcXA zhA$~G5u94Q5bi-&-Py7A161tD!-7BoxfBoWW}A8YKQo<|``Ne_Uu-~NeQ^nOFw*Zp z9mJ6{Wol{~1ZrydkS(alT3`eri4_5jJwe+T7Abw@2h{5?K#K@E=;KBeR+O^9fG&YU_Y`LM`>Ze zfU0&JJ^=m_aNsbKp&nK!bTpuX;zjh$Meu{XyiZ^wy@VBv>=V$1D5;BZr<35eJZ|!T z$l>iv^?HWI8`FYDn@0FJ`rp={3s~JNrRuqmysy4+K0^>yF}cNBB4pmYpuc_BO}cP zJmeqHr7&2)7$QAL;1-~E1>rCZasWhre+5kG;06QQ9%gfVLd;q43aHuy08sn!>7ncp z?oywG@vxr1I344`VhWM54Jt2wzajtmd`ac0LA}*y>3r7%OmuxsTzayFz1{8vhf`ml zUg=)@LpjYr$lbrep$hE?-1j6SsMlaF(SK7)qoboi9^VR-4%F1Xp!kM9H-Y2t*CKA} ztr*_%Ht3;|N(5$8zzjxUxgi!J`3ov7D9#DL)WIQ2jRL;?$SAoZcprp0grO$@O+z)I zrG+bgRo>Cj0S^OaJwnTkSSCRV0v8UDZV4dBG{jvdr0oLESU(qs?hE7~B5HV8A3+HU z;c#*Th8cpU>^%t65Dz0jP=w;kvFt(f=eDfRX`azIp(HI!-%HIB11mS;<1bbwy5~8~ zF%el6O=K(+ba3-pgak4*5#LvU%b9!HzK6-C@9l3|fiBWgx5$%wrNoL@7A*@4P1y$Y z(@lcE+Gn4p3~=`%J=y)Dshz?=%HEC=s1>> z+u73g+jrv*aL5Qy%gj$j1Yw~Y;w$6r;AtpWH=eWw>uTP3@jRVfFG5dp+J|HBFTlw6 z)?};RWnNPW;Yo>li597(W<**qsDUQQ_W2930m}2cVKAV#ks|~F)4-omFRjp|^)t=r)BNIsGQ>e4;@knMudH%m=U-vjsfw@HSRod}C$J`sgAAC)gDy>D>p7ndh2B9R!M60e$gG%JcRU z{4#8JTcYbJWi(YxQX}|cwS-55=#MpwG>dZ;DE5guJ}dsNvlh%BUPJcn zLSo+7YR0c$Ek0zD5XHd-p&MShSD@pJTAWuJk`;ca)46aFXPU)fy{k9ivTK%Kh9AXe zWS4l1CwPxsX|M0?N6jY{@&@Qd?R0tsMjwqutHiW;rRYsF> zcYjL*Acpa^9g~ZiXKOy-J~YHH=L~g5Gpfx#r)(~F2{xRkUfxP=bZ5`tvcY>57HdPR zRL?MvEnAH(kJpoVlhxmZC8BG0lh}UW*!dc`W@6&?#fe{HsW`oAWf38jj{jg4>5dL4 zbYeIT>&WX_t1T0wv(NdJPAe_d%P+QPx+5(nE}S@n6Tb?R*~@D(R~uP{?c0l@JVypl zMp&0KXa#BNsLI%m*vRd(KZu-;vRJFD;KI>SuaUOBTu{j-P*mnFDCbHivCzABN8Bgt z`Ye}!P>bv2?HZ+sxFt;Vg(J@WZo>eM<@nb(wUXrIlNg$#7uCY!-uLi_7_yDeHZ?@6 zn)=-tCz$%D|8_h^xpb zx-sb4T_UC%>YUrP+#*#ok4-pGX)$I|>ofz(qtj*MEWwskP7(6usmqDFD|dwB$3HlS z4{x8eQ-Z$hzt%jekm0W7DT5zEBP+V%yMAU6uAhV(LtFlhws7;^veG_x$V1 zuJOGA7w-r8J|&u`1!X9fk+?V?`1_`hs^%gUKRw0Jm!i38Y+yBxec_}+lf)tWBw@K) zWqC_nFi_jhTQQW(W9CPsDi-5L4cRmuF@Nyms8cTwJ(=|5*CR~(`t=%ObnzE5rZh4P zv4?;0?}RFIPH_-P0~|9(NK;u~(@_B;mTNaq%hsT^8<@I3u%)p7D*cd7r9g`6#UzPz-$&3uS<=r6+|G?j}Tpgl0V#C$DBd*PjbkPoWT8eUhy zJ$fZjV|Y8zuxd};-haU=UvFUj#=X6#VI6yE)2w`)v^@gH(2}`8Mr!2IH{)i5JIcNH zxO=AQ(tC6Sux6+9@SPhv@~Us~Wa-O2GMJE7iR+Lliqv9^N2A{q=#d+ipUtz?<~Kjw-kzB@R^#p?nf&*J`BNqghI-Tgnt&jfeA-OxkrbF z`5EqOIcwe1>Jch}4V2zGQ5sr|3@pjB{DWp6)e;gJ^b+(Fq7$16lvK?fb&Bg#80b#8 zLtfu^{AqYkQz4BwwoF#hNS%gyo+ddq>j3xj_j&I$xw$%$bc+Y~lv&+Zrm*uhW*^Oe zQ*TXZvKq`jW9(>xbJw_FKE~rIS)yjhdL13-P}W|+S>V10$T`%Y=~;%XHQ?Z~+BWrQ zw3wT&A=GF-^8*|7dk@|3alyRj9;&8&hW5J?YPUABc4LmhyQG_ylh;lK6OJ$U!o#9W zpD1o)C^UJ>HFiWj6ZxQL^zHc8y%`5hNlRrJ5hYDLXB;VQcMqWthT<-LXV~inKPNp4 zXY7iFtGMnIzxD#o7zl$Y}bR`oqJHSSu7F4J(NLDgT+@6N)ww-qh$3p3%LAz zWCj`x<%D6L9`zU=C_Ue#)zp^TUCKZ`nvTFlKA0=aNm7Lw$XH1c%4Cl7258#!54ZhAu$##HCWozE@gL0cOKIduhWneU)9{@cw)RPp8<_N$0#lK5V;P!z z7!337mXl$3K4(Y^?K}_p^AC{|OX&a2sYa=n0Ytd<-s6KsZYa+IU)hh>#R!o)nc&@N}{7^@O)q4Z(H{y<(LDgGINgW1O>rlwsmkq3eT zf|w(NX}9LZde3j=B|H!Kf3NK28-ptO4=4noY6L+xQl^p_F7D>%&m$uv(1e4F z5un8Zz*7T(U4*I@hcoZwEKqKY{@uZG_mMc8B?>9s|NrT|Rn!L3RM>Sn<<%obZ&vG9 z=508eec1OGc!DfZZcJ*tXa3(@?z|VY;)k!Zua!*9tNW0^Q5AI15+E0Vvd6ty#F0%d zfGPdPZOL=guzR(^9(sH}9Y9TxpFcmp-RxHVjC~&ryhbIQmuby*O9bPoSTWLdC=Ozf za#8w34j4F?HS}QYyGM`O_OxKCBHN*8k-bFp#nY*3l*#AFM@6tN>+9d+WCyTmy|ICZ zmY6OC|1@v~54VMpZmVzLS$rbRQ<}R!ZlHK$v)^ngB)%wxqpwQ2 zoP<1RpQspJGW)r99vlE6H8DI4pz=jZ8tbY}t4liv_td%eEJ2<)3RQ!kU|K-ZTEmy~ zB0AAO4)Q*6D>SsR4YO6U<1|$_Fr06A*>U~h!PS%{yGiBy4wDOoilMEh?nm6;KzaKr zC}F+24-_82lz0PO&HIia(-X^=BmbDqp7#Z9p1QG3qABA&FGKvg8h^w*4-9-g>I)lJ z+l16g^Utp(`=E&BwP2&^{8+pp%h0p*uE@9B;tzVcIJL@N+3ot3VwcP1MJ2rFJIJgL zjR6}XqJ3o7c0GO2niI<(#BO>`=>|&vyB4aZ690#^oILZWU(atH>#s`3P#rG7NdU;w z%;Ru0H)S_Hd&9x~b8L1tWoSr;V6dWM56(kQ|LLhW@?!VS^V|51>anYNQHJ=u?_yV- zercFmQ%8F*ThOwp{?FI@x!XZzdV7v0Kg3?bN-=zIa_ zMaPt+H&C34F6fFsD^bbStt>}9luY$c4&0Shot~Ddzm9G8-{5@7LOVZ4=0A3}o;=M@ z+kcA{+XqCE=39LvLU|{(+|YI-WHQ4Ft7Z^CG_)a_xv2lWuf1<^q~}d4Tx9jklJqJo z_wRl*+}$l;$vd679(5f>>mUPF@S5#H1HQy_hl2P3;+C>fg%zq{oaYL`Flhd{NU-a^ zt>Nn|muzqPxf?167q_U$6;fR4ZS#ZX&@-$F38xdKmimRJr}0~<^XRW*`yz)#l<~^k z5Mq>Aca6PY$-2XKulI*Aic{Z*{#fxB=~BtzR!=N{aiMAwg&Smum|sJYy2cBq6o?d> zKN0@Jz$lT!l=i}-@Dnl4Z7TeOuX$DG+}8-4>s}^g)-z&99%I#K&UAl3NBKkolbccY zP$qw@Q5Y$v+)0#@UTKBmAvF#p`-*>rM<1~#h#Pz(9iRtqSdxGpUBAlq(qFs#6}bo)n9e!F6O2|hKh<1 zI&xA{NZx;fR~@9X&*dt7Y_zMJMQz~?f_U<$s;X#dZpR7qqj)y7!U-X7P_l#9k45Oh|AF%&8a|lS#vlz$IR}IsnUUsVD z!#wJ0M??gvW^QN&9{(#F8-vuu>|7E4DC|U26S3y92!2YLbrsbhI$G%_GyGdD#pX}W zeoSi(Fj&{~2%m*E@d*_BQin|w%et*qwCm`PueH7kxOz1@%ISR96g1bJ%1R$bTD~;8 zs4Mu<(e~D3l+%)!P05(cHPQ%weYQgoNuxC4p_=)Way|1bc?>+12NJ95TzO?XRE2RaI2<%fE`+?I?8A?!>um(1RlM5^`Jw?g9Z} z&BtzYdDcC1&H5idHbn1Wv}u}oJgQrp{N)oGy8rL5He*$c#gFlqFLlH3*6aULTA*fq zNgHxhRb>J*n~d5c$+e@S-io+?8h?46;xHWB(@+uJCzleb92CVf($Xl=+$q)AS*C~np3KeZb!pKhT{Z^!9A}2#trl~q>TEOMb-U2l zsRBm3qesf;(qnW5zQh=qYQ{#i$=HiZ_`=gtMf8k1u^o9nig_!1bf6B2VPbVQH?3An zcFb5H#1BDkuTMp>M2TY@C+F4IMQ-{1H0Dmb3T)6m}%gpUMv4t+=Onh?Ts-sRC6(3 z6{pL$uQQy8dbx&g|KB+vY)#MnVO9j(N0T6-<}!!5eCbpM%VRGmSzcOVlP90vQJkIC z^f;NDcI{2(A8cBM<~&5h2_G%b#H*+vq?B+e4RrtcCv2@1LPr6u{6AfTvhwpf6?PUQ z@2v>i(BcYd}Mr&`hiw?eH)mg>WJc zX2j6*l2JT`KizonoR`yr%@wN!Z%IV)@^{ z%H+PJ!djMvvCPwN+MDg?s+RI?#N(GQ-mi-Vre{jf@MoN_XRt>@oPgyMv9@;r)7hUs zuurP9Tsllhx~pj{Q^Pn8JXLnC+atZLJkhsoY170;!lM;JE;ZBJlX$Mga&KK$Y`TAW zR)p+&J#pMM>&~s=&C1Sw_WHu`&xo=zgd(lav5O0=QbfPdy(AzypPXOv4e+QYeQQe% zYY?a2h)u>nDNb*t@z&_=jragxAnVjm(>NsuRVMeouvvv} zqbpnEuXL&j>~Xz)^Y@#31Os8YcT~Is&9DlZzO2@r^*SB80(M3py^3fd0W2%d4Y)AB zRLv5{Fj=`soVbvf2G*Sj-#`reS44zST`PyLU%QnQ#V?yjCdLM!qPYJDS()e?3>tR3 z0rIY_Vv?5bU?@X7G6L^o!ZCx}P*DM^%+FXZ>^N+{Xo=D_KhKKrG!UZN@BCh5@M}E;3+*A(XBQK-ovh7P&mV>=H>sz;+@o?MLQcB!C z4aO{!fr(e_4SF9|XQfK;>8&Mg&PY-_SZFM&bzM1lJ z-r2R)Yl&gwOuHL6IzDlKzTj3SjpKF4omXGKERnDyX;iJDIbzY4`WA8t*kE1mO5Je9R7XzqL}sXI6L>z5`0fffB|MTI{z z=l9&PjHUkA*z^*IU#Vn$B^;rZG@1vAgeOsS$KlhJ9sZ;>RF-q^?sJ zJ*JWzsZ4XJZ|!iz4j}0_>aMYweYv&8Iy~G%Q;7fQb&BTwq9Tn(VSEz$6aSnq-RVq0 zu1w50jb9)kx_(Qep`f~f!t{>X03{@;tG)do7wQ6v>(`Wp2P0o~v(xsHhHZ-s-hJ^7 z?xFpiAQtK^_=bihg~ge;CDsC%pCQ)oW87J)MJfbl((xnu7|Iq1C^J{<3X1tB0{iX9 zoR2w1s*a9eJ1q64<|?b2zRvoa`JtW_9!)B_=!Y(ssW-x{$8Ppt? zlT~@jvnLF7b*C+lo6*tJ_}pC6oF>q>wJx{+T^{7#lE~E+Tvu1>h!w60%bp_|iNO9P zr!+kH%d>OB@LXT#O;#?aQ`x=JV)3*LB^&;zv6~%FJoWrLno)A**p^6P0A90>0i&XH z{qHO^l98{9FD4!v%YC>Q?ZIeaa)X;QXDBr|dgSe-S3cuoYMJkC_!Y_;=n3Ytiq?Mh zH?p$+Ilr8JZD0?ZL8#ex6+bpXqLQr8+OsdDE(dRk+TbkAlD+VfN8(@VtPbm3Q>39p zE{Gd+O~kYWekynwQwWAS&@@EJm_#w0=b0z8O&^&g>~xC|C>rhHJIWTgZ@#4e$mRNI zdTZ^}k6S6sQiYYhOW7`dpASn`phiV4=XDNcBhMaAzS}WXAzvds+ppYN@^6D(e3;gO zPtNe9vIA-9p^;Lt3eHw}&W-sTA5mdo&G5;x&uqpfC%+zzoLmi`|NS{MR6jYz<1WOc zQeJtCXmM{SM0J~Am2cs@YQAd4AFB<;V^D`Sy!IpK+>JIbHn`|{8CA8wzgwd!Y8$jC z6hD?yQVOoEzA@z03Lr|IJ*O}?`{(y4C1ZByw(tB~SvjuLRF^%2>R~U8c+;NhPklOM zVV0#+Q9i-3UUFP*kY+th%lcuhzTVx%kS(>h{bKy`Y5T(W2i3B7^wbkm{p7d?_o}RX ztbU)t-d6klwW8*0o6|tR$-?h%GDIKsfJTsnEBMGAPwor7>#D~Dj%tSj?M+HH=hEy3Bf&yEFHh1w5f{x$trKgI4>Uw=DuPWYZ^G8SHo$Vsb}L+)vj1E zJbz8&J;V1K>+}8Bug_i@xd*$e#n2r3qPI?u+r1R&n(lZn>lZdQMiUZG5E;okJw3bh zmYw6<(sF=@BNFiYY%-d4T){FB8|Po zaa>)=h?RU)&W)-0PMm~7=|S0)Ra!WWOHSRxzsg+2-yD|ty6qH;(pToaAkxRX*A9K* zmp`rGo#bGoc%7T<9ep54!5smY%^D&-!t?SygfRRm?Fa@AL81Exp1tE;_?0yEai+R- zdy5>#_ymfi>dbmAUiY+qVSV0=!JI#*Z}@Pk;@O}!6VIU3m#EoSBEC1mB+8wFcfU4O z(?zF!F^WfNlyHAT*seI3Aj(KCa%r>WbK?j}!d-!R&cn6ECWYMMGZ?J`2$5tT^N+Kd z^4+dBO3memW=RRu8TMM@=~9AL^>NU#Gi%q}>f_tn zxw&VKtVyB~RmWu=Qp(Eru z=Gf-2r3ldmhOnh%nqMiurP(OBabD^`ThGFluv<$rQCu>u8n!8PJ-mz$Pin`?)NvY( z`f_-rAJ4;XuIg^e*DyZsmb|4t&z$ar#2&+6T35`!lM?$rC^)4>tXOH)Eqo^$=w6iZ zpdMFICz8c;M)8_TiYm#<$aI-Av`izL-deHk@rt3_s<;+j86_j`p__o8pD87)mAu=? z%=~d~98dIKZUX<4jz@hpZw|x)h1gY9aJJ>N&?*?YrKVm8ks}xaY;o6f-5z>2%+?R4{rqVq>}yd&4P%U1Txv!lU)g8I5KDJ1M!EHQ zIh)1DYB2qsb%`m_P?;Xp`K{vVnUi$w!`sm$k|^(txIrZ)mW%@$&e-nC)lW=6&b~6z zD^f(4u_mS;mW)K%e97l)$*@gxBhE4$At2eGSPr?#Eo=47qn_Y~X=c3St6fjJ5}Rbx z7Hlk%Vzih2HJ`16Gy*x~0@N(2A3rx#3l!@#Q{=smf)a;RXq#0EDoy*p#+IXS>T~62 zLt-k*xNZgY^QnGwC-uj_y&X1#+cvHx79LFYIPIzJPnW~cLMzGhis#om(#rLHn%ibn zVxAL|I5xEl`W9klptrKB-ePrfmDJR~Cl%rC`=x6+s$8UJy7<@%$18y-sYFdP=LbWt z+?VFxhnGck&RYH4#t|*kD#3+Bhwk5Y-

Pa0qcYcs!$6ApQuojjGUII4tk~Va4D}Ud6Uu-wap{8B=zItleFpc#EVwpS+YZ*CV+>V%noyUP9e>;n8BoC9ATl)JA=W9*B zwPRfW-=Z2!)aI@Kw5Z$27)l@PZ!-{L9kMQ2d0UAoeBYPQRv4qj8tpwwXzCfR$=A_JjM>qLy*X z1Xg)_eV+2aunnz8E!EmKlm;GIC+oQl7*$9*4M#=hFB?8f3Lm}?wq?Q#KJ7AR24qO zh>tMwr;DQY&%{)-`}Qf`XuM9)Jc{|jf!oQveTce3KCY}(G$zBDxSGw%^e*dLH=vg>)#`aW zBp73y$u}g3xygsg_;%Jr6&Taoke3tswH_|!Xjxtu#u0SfscehzH_+2fDfX|JlaReX zM6%-Bfm1K2f8Z_ZGcd|*a}Xd(CY{l{CuH#LP>!TcXJxqtbJ}60Yf4_5*RGJ7B|_w5 zlv1Wt?7q3?6fh2e)-7M{vRFmEp&|9+B+RIwtXx*wfAw~%phmOn=CKI!bF(tFxXKTM z#c{KQ6dAg*mMF?ARVm>G4#QQC@TZ>56-0(`3LYdLq#yd)R=mSl_Sn*7)NrKLl?nDK zblu%6dEbI2ul!0idi$;{X~)V$`=XJ#qWBR*A)59?yZzmPxL1p5{L0~ypXQb`hoCqp zI6BH|6SAUZJm$r=<3jO8B8|Vpo@J3;hOGAzHFjO9spg-}Cxcgv#NuiW?r zGq7XJ?Np;>Em7?;9=h*O9!PC(N@~;9ER0qC9GLpGEnu`lFQalxIie(i^q%&$y~qq4 zTU)679Q3Sh!UtJk%O!sx@+-$cE%%Wu4D}>{&vm|$v zURC#Kl!h=Bwo&1~-}MfZq4nys&PAt97P>>uz=5)XaF7Y1+2gpH4(yu}^l*gBdn&;n zRl+S47<-O{0zBkd>s5t}k#a;A)k3{;E||mxv;5WeyLY8oW#jgmMF>o`#2r{%s^g!2 zBNo)(Yc7ZYxUl_g+oJ2W{J8(Gy{mkSY76&cf`lL~rSy;r3=M)XGy@FM-6dTjB}xw= z-8l^1NOK73h9L)3Koo%?6saSM-o-iRxqrj`aQCOpJexhU*4}Ha_x;7YrZJ~YX`0mo z)@k$<36D*tFeg#(gthi~lZyu_nuq9a73}k5W-dsgM-wNLBAJ4*?4pznj3QN(ESOfy zi{usR7~hGA@>-Py&vial!CQV5uf4SbIi@NN2x_8Vvx+yzd8PSr>;LNKD8{^~?AciF z*0G)Xz`=pm9)nF9#G(W=)F~B9nkr*IT(7o;i$pGZVZ zyuy_SZ)~CCZAVI9h_Km|(TLMqCg4RHT4yj7G;D>!euW8@+c8zs`-LI)*#Ly`h_$bU0h<^cj@Db$uBpB zwaV)lxc6wJv|v$m#|uw+wGS-}A_hY?|E^&%e6ScsAd@+7?v|maccNpS-?oxMuCspB zRgl`W^tFuGy2my_>XH9;VxPD2q)w58_g5xrH-(30d#~Q)xTfnDL8~%NZK#g4t8v+P zD97c`Suz$9>}Z3rpK07*EfE}urHb=;pHBI`gzocESiT~m5KI+H73nMccU#?)h<$D z{n3-9jrB%6_994qVNICog@YpH&qB8B=wQJeU9JdFT1}`)S%*r{wui`Off_hS)%h87 zLVYF%H9PQdlP&N55JDk&Ar!Bp!7lMYM#8d?Eceb12BSqxB+lUPrm9*H7Z+sL`APmx z4jDx5pM{7%x+_U{&^GYFPGXCH8TuG%;N(#EM~Dipr&O6<(dp1>v9Gz-a5Nwg$WJg^ zY}zhX+jOtOT;)A`)+DRqXX?lAcHX+_p@)fy2Y+Ry<^P_xpQOqz2?){nC>NjSRq;cD z^jPfUgm9l}5XXrH-;D;t8reaHI1GptJgnT~&Q*5Hny$W!;au@B)S5@fF!-^E0!UZP zRL`X$xc%fMjvawa!myy4qrE@fMQDi=xbf!ej+C<%k9_+!R<52cMr)U45TZ#@^Z;^6vSdlE(X{tgouR+U(MN9nr?^x-T{nZ=^dL zy=(#b_Z{$~TRKl}+4QyP@w(^Pt%s5xMN)Iw0fk^ahT7Q|Z!HLbGguN>?Xl(mnU4b6g65|x+=u0WhG zTj>fvQJ;s9^lx)RW1mK>CXM(U+1Y0}X`flz&4L#xLh zYeF9TCn8w^yib7<<1H3vz?mSteX5~Cd93~qMbd6FW9e24a`_T!-ka!)7FLeA+Cu(q zlM&`i)>LL|xt*G;a6``?|MvTQSIfzA3ND%6LvN-RP;@1K<>PECyX;bX&OqEXPJCf) z6D4wR3HyK=-&{qQS;|e{3*f;8XS=SMX|OND?(670f$_9DN67B$DO?2Db@x2llky_z zoR7JcmnjFNWZL?D?-ZwV8p@nFyxgiC1FKZv_5>Y`Tl+z=LZ-P)cB%HN?UkzuLZ}bH za>%8Q8R0qLPIc(EGUeb4=M10V=N^s2iL(Lz7JxqRbn}IUY=tj-1$W;TmfIP(+}r)G zP8y~iKd+l|x^W)dzI`ppDTJ9^Zy#KT@4UC)R6DMw)+PorR=v%W2K8ow=4rh`KTnT& zM9EiSyJt9%d9VvL>kJ?3!F&6oR!Nvqj;%g~*Kf|pg{e4v+cSQd*|1AN**>kvWEO8@ zliI>3K%bpuGdMYgPh89eBJy?kzyfe;8W(A=<&m!pWtY+BK-`s+tE z)bJEglrg8;1N1d6}F0dCQn-Y zhtFfE5k=$WGoB_yS{$4qEF^U^IWI+mLpex7*)ElB;$nn6#o2L|9?r-+XF8ScNORhd zjhAWP%V;%mjhJVz;l~UjoaAYBxX`%u{H>* zF-nJP>Yh^LWm?fOB?VgyLqSEqNy;l585Hh3BU`ypeXd~m*5AOh!G}GN{Ie0-8` z|09)@!gWyp8o3pIJ z#ot)u!zmowSoa*yb^3UV`*b?nzDO6@yFVP4DJk(&C-GqyhJ;@Fa_(#mWh?OUVcs|_ z7CfV&iY}v^n|oF=p{2GVIj%AH>sdS~*;Mz2hqLSv%9-P=O0oot{0n1r$ZlgV&T~bE zm-j0lbltobp+e|+;T`rkz}QQF@-ZLk?m9@mcEY(Fru`E#Tix61F#U|rGE(c~bzO31 z)i`QpgM>xWOo{+};OAG`? zekVHAUXgwzt~#d51Myfx)gqFvwZ4-~iX}ZyUg^#z4>i+WYMNt8sN}d9$)P^G{799e zVpi#OEC*0P&0ogK^b_2CshUWy;7q6N%SWRa30B`7L_R<hUgjICUqj`+#wx@TH(F5G>S?m#+ z!Muj6Cr`%7`_x2(aH|_+aLF}*bwqnV3r_?Q-(K}&;$f%ss|8=57qP}ymjC@sHRcl( z;;Z7Pvy8F!9dd<~^p`HGb4Ayk!#vR)ucRXKRd~9lR_4J%YAKI@* z@s@mKlA2M@{m_A~)(F57bIidqzHD;SpqKXPuF%dXAhM%Zg!6KLf%bp+ptyJRZFV+f zLYm^|90NDE^(J`wzx}LO-qE#3$MEZ7=}Ha;WvS~0!PU1qubSpQ`Il*B@w801t+=dr z3xORNd@tbZ*Z!DJ5E?HB$JVLvx!m@quDC*Zx>2730LGLP&SL5HnmVe^6^G=M!8eQ5 z7xc5Lmcw@>A&|@0ALNj)|AoL7Nm^9Mt_$#T|G@WN0bmJ>EkJvl%V+VpHi4Gjt(??+ zfl6zTlD2%_`cu~A)AZ2S#dU0fO~BP10B-xRPyPVsJlt*iOXM$9!n`p+nK&Kn zQDs&DI$O=ncm^8r?5+@tE!=1skiq7FaBd1&Q&GLMRe@IW7k+4(^}uZPhki)6&&m4V z-@n(rW+puxE7+Dh;#zw+B;v~B3mC;9Z}ZiZ!NFo4o|Pr&Tqq=D`jWEmQGN}y zBN@(sds%A+72MKNp2p>lDq~&Za)Y;vW@y>D-Vp!(%FTcA1J}SXK891o?7ZxaZfsos z@q^(ub85Z>OhPzijIpK0bJ3~W3JM3Ck*E#f3UaGc7?2DKNgx(?(r4FS=jEX=C>HOt z!@-Rml?kNo`bN0OzHk|XdO~6c-B^x6mSaSpQ%ML$-CmNZ83aPeHeHI*sFFB~AQvjE zbe7Yj=H>zXTE1UM)+vE8g}i-fS)Gc8?lYVD0`L<38JP&;m9;RvDGeG6xRR=Hm)KaF z6ECM3kdtl)t2b0r+>K14yeBIxa{>ArTiDf5y*Jd@*cH+va)J>*^>&r-i)(`IY6(=8 z9J!zjCAvK$es4uug`;<)3+9-xrrp^6Y9O%)zI*Ra&a?yF5FkjpDyx=xTK{3|UimT# zlqlRUG=wrp>@^NPi~~Oj0PgvTq!LNloW-ZPCS)#)Q{gW}pSHk7SNcSUf`&ro+~e{c zf{lPu#(n0mHAavWM$>&Q{K}`-37ZT&81OO8|dqXCo}kJ;&^q!xJ(CW zZ`|D!|C@LJfwbk89^gl=ff3Lj1XKndbEQ8TJrHx4?m=DQEB|gfYP(EBduHie=}(mK z!83tRcy6xdnmy)I=X)w`@ULy92r$Z)T_YCm{wWP8n@=ak4t)PrGtb-q5Rh;H%zFUz z0+S^2Dp7L1hv^w0K;2oiP(0`Aj+}%Cq73Qgf00{p6t|oP1~@RYImS&OMC^?eDGXA3ek?zT;T!pE}83U zu5phaPiaYb!wRmYt!>V@DUo>+J-U3#kjAu6+S%5wC^$SQ16b&SmA~3I5};Dxcl~i$ zoM;T$Q703vm;6#oXm&^xi?(?#pYaSo{k~R3gK?<|3;L_+8>q)l=M`_%opj&Kgr#M^x!e?m_yUTH=N~7l?SXJSOig>@y zdY9%!9|+=KYkjsHpMPW7`g6v!R_{Fjz%DvG4kcvTGvrqoX=Mrs3_KYa*QIIcJVWc& ze@R}^ZvAJ~0%-Z4)`vGs~Kl4v|S$0lDTY>x3U;gVb!jNZpmQCSI$&94Zh_Ow6w4HIUp zuzM?Iu?6qVbY`ngC2r{K(xyLzu>P;!?7HKXE zn6>=GUi@`Gda`#tlA2dM$sel&3X$nTr zT2MEjmn?>c-D6`v@sMOdI}dMk&a28M+1E+h?9bZKLThA!`Xx}$Aok}?;-GHOzwMr$ z;QPFuYC2Gl8%#LpJdqG#u+a<(a@(J?X!o+66L76WIT{-BPpSRf9#f+iL&9nhDux-E zDzjNOdqsoT9Ry2SrH+BbIN(+;N3%g_9-nveZRW`uJp5? z+g#}-m!ave3>i`4-UaHha&h$$d2yHO2q0|WEglHP++vp(5p@obbIOnAP8Pl5)RkGpv zsGM?2f^r;r49D}+s#di6jk1VJa0aJ`)P`lM&z7SO=SNkY4AES(LE0I`+Y)6zQDoM( zjKu@z6Eg3fGtl@5>AO78F?t&?LL<;1=rwTeM9X@{7n~R(aI&Vb(0l~Pr@;us8LJX) zig;grk;k4rP7=0$$rGf{*7AzHYvY&a#Ean-){|ku+bFSfl_y2y775UK;D5L@P+Vo| zk7L#2RU|CF3q4ntYJMl!M^qCXs9zO^Zq2pEs3hnjJxEl917i@J-aV+bl?$h{6hm8U z`;{Lq8CLk)j|6{MPn8GLq;Qw2m}%`bstkK$wXhDI8egng12+81Rg5z*0_{U1 zKitKBP|^UQWh68WIV(-oMNMo>kJe?zGjz?)?_iKmgra4ao8c9KOo8T%ZscqVwhOpB z71i}eaF*vjeO|w2^l}GjY|jd#%V0M9UcG`{_z9{o{lLD#wY0x={w9NvzZFq|z{%Jc z#crwUX|zbe(w3OZ*?NPYE_NdmcO7>MNCczBgMNU2{xo5Z`Xv7)!Bbp2Pyz z=YVS@+q#eR$NUnsD#`r00ev~tyRB|sVpQ*zwZ(z+ zoB=+@=93O4fp9j|yZV9fzU8$Av97(`h^4mVG3Qo2W1g%SaufGtHKf)1^i;{+y@3k! z*O{bVQyJZ1@=&GA(oT3tg?*g|TgT@(*iMx7^j6CQ-Rmsb97tk1NBxn_li~T#Xw}V|vtjlCzZ(T2R0LO6gX_JnY@umPp!-etM% zV{HasqACr%xle!hM;8Vu8=N5gB6ROBolM5+c54~O^U{P!)-GpC6((1|?0E%UBQd;$ zTr*eER%Ygr-ywz!Ej+zjFevM*1QpL9A~=`m4@UnUL*+=`^5dzn;a_ly%l(7@b#Jkw zd6WOF?pUkS5qI$!A=&V|9-H{cqb*r8m&e!ah~s7C!(VrZ`a3P}+El|7yx>^j&`8-Vv9?H$psap?QAD`eKys(~$kbI5<>{@_))(%lk-EV( zJWbuBCcD%it&la!9^k8x*Wj0rv#U1IYRfLRh&X15jcT`R{*w^UVgof5sECJ6o(*)D zhz}|IxHwp=zL^)if2zRRbQSSJ-iXLbEP3Ou+rx;Xxir#>ubJaYt=$y_q4LVrxP$}h zo`C40j{AKkoyR}bAdpMuWPbhFYwA3WzIQeo&RzIc@d<6 z%|#O7^rL9HzUkd;)=84lc4 zzu^2LTIE~+hVpor)6mpN#E*^E?@-r&7v+&0U;Kw{lVU`f9WE-%d`x$iQF15z3c(IVKMRF5zi#KSc1a3)!h)C2 zil%wO#YKuJ0{wy9DhKe0mz2w!}+jE%Y`HXWJWF$tik*U|xi*}MRDv;S|knFdw zeT!sZ!Hjz5^x`zKsfL}tZL_7hBX>_2Jv&)Hgne#UT`ERhmxBp{x+oS)o{&NoxlY&| zY?)vV7WVdj(#b&e2i}$5bO2epb;2(63|Fr%7)_RFZFh6e6EmeK$hLWKNDuhNuqY|~ zIjVo!RD1P%Vr#y)QW+6<(2*!{S%GtFMSXbkv4wB-9%Hybp6MtD+3zasAy+C3PwS1E zyBzLGo+Of9FCz`JKcYNvOCeP;KKqT{E@yQnYY@k8mN)4_AF|#4!`op#e#}A7l(uzy z!p)7#lx+i>yXL(aX7Y2`bp|^>X!Fr~ShcU7fQr@1T__<0FGk}&^c?pt+ecLe!;tW| zp34*@YNLl$eb?ir__@9|6HzO!S~rQ1aEKq`cKP1I$jkhgCM|agtm2e>N{#R|!^fg= zwo3N|*Q8x|YH7D&S>Li>eEe>Ke{J*=Z8LrZoqnzQiDr|$SR+i!l4N%M$h4AQ#USMh zMEsJa;AY$s6Bo|>$(@aTN&;&+R>~Sm>`GF%`CR&QZz#ArKH@y;s(+5wk&@5U+e(GL zPS@+(Gui|@(S;J*4|xBJI6eBNs&Kxo*0d2_l9135mNAab!D%Y@aSmzXTJoC5&7bNu z+@c(RMG3yNYRdh<$>VcP2!8Kamh4l&y+MPI#$tEUi#X`IAZ`CtO?#X8LB?^i0k_-> z?x#r%As5)=Ge0@uL8i;!Ar;`uU;3!Dh&$vtE-X%u$5!-Oz0V=9B`aBckV*vk$Be{{ z^NpOfSSIj6LPDci1=O8-W96?nN<$NFKc2fOce%p!#re<1<<(Z;fbR@qb;a)iB>uW1 z6~yr}c&@h^5s*thXznkyfXL00D^dm%{;a8ogl@Cxu@o9W3L#*+`xy1^S=m9Z<;`or zttWOi-hCYcW1p$L;&C|_euR6DR31<08TLRz%U`xz0BgexD`e(UL1CpN?Ya;!Es^r* z8bl8Basqf%XB;n|=-)`wt9-tUKj{8(twJEtb+v2|xqf)SaNWES73)7vPYC2bFe=|i ztB~ch)Cc~1VL9>T6ZEt^xC*SGK&VG-c?88C(_T>&lq?})z&R=58S`Wye*Q^DV` z%R+|#eeOsF^56f?XP{tp`tQ6Dd1;3H_mC^TZ2rH;|9`>%wJv(~hs^d+&aCE_3ik35 NsVZv1YvnCp{SQFwqbUFY literal 0 HcmV?d00001